Skip to content

Commit

Permalink
grpc: Return more info for ValidateAddress.
Browse files Browse the repository at this point in the history
Extract all possible data from unknown as well as known addresses. In
particular, always return the correct address type. Also allow creating
an address id for PubKeyEd25519V0 and PubKeySchnorrSecp256k1V0 types.

Extract addrs from redeem script when found in the db.
  • Loading branch information
JoeGruffins committed Dec 15, 2021
1 parent e2bce3d commit 69c9106
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 16 deletions.
30 changes: 15 additions & 15 deletions internal/rpc/rpcserver/server.go
Expand Up @@ -1990,11 +1990,17 @@ func (s *walletServer) ValidateAddress(ctx context.Context, req *pb.ValidateAddr

result.IsValid = true

// NOTE: ValidateAddress only sets script type for owned and P2SH, but
// perhaps it should regardless of address type and ownership:
// ver, scr := addr.PaymentScript()
// class, _ := stdscript.ExtractAddrs(ver, scr, s.wallet.ChainParams())
// result.ScriptType = pb.ValidateAddressResponse_ScriptType(scProto(class))
ver, scr := addr.PaymentScript()
class, _ := stdscript.ExtractAddrs(ver, scr, s.wallet.ChainParams())
result.ScriptType = pb.ValidateAddressResponse_ScriptType(scProto(class))
result.PayToAddrScript = scr
if pker, ok := addr.(stdaddr.SerializedPubKeyer); ok {
result.PubKey = pker.SerializedPubKey()
result.PubKeyAddr = addr.String()
}
if class == stdscript.STScriptHash {
result.IsScript = true
}

ka, err := s.wallet.KnownAddress(ctx, addr)
if err != nil {
Expand Down Expand Up @@ -2024,15 +2030,9 @@ func (s *walletServer) ValidateAddress(ctx context.Context, req *pb.ValidateAddr
}
result.PubKeyAddr = pubKeyAddr.String()
case wallet.P2SHAddress:
result.IsScript = true
version, script := ka.PaymentScript() // addr.PaymentScript()
result.PayToAddrScript = script

// BUG: ka.RedeemScript would only be relevant now since we know the
// PaymentScript class (P2SH), addresses, and required sigs.
class, addrs := stdscript.ExtractAddrs(version, script, s.wallet.ChainParams())
reqSigs := stdscript.DetermineRequiredSigs(version, script)

version, redeem := ka.RedeemScript()
class, addrs := stdscript.ExtractAddrs(version, redeem, s.wallet.ChainParams())
reqSigs := stdscript.DetermineRequiredSigs(version, redeem)
addrStrings := make([]string, len(addrs))
for i, a := range addrs {
addrStrings[i] = a.String()
Expand All @@ -2050,7 +2050,7 @@ func (s *walletServer) ValidateAddress(ctx context.Context, req *pb.ValidateAddr
switch ka := ka.(type) {
case wallet.BIP0044Address:
_, branch, child := ka.Path()
result.IsInternal = branch == 1
result.IsInternal = branch == udb.InternalBranch
result.Index = child
}

Expand Down
2 changes: 1 addition & 1 deletion wallet/addresses.go
Expand Up @@ -141,7 +141,7 @@ func (m *managedAddress) p2shScript() (uint16, []byte) {
s := []byte{
0: txscript.OP_HASH160,
1: txscript.OP_DATA_20,
22: txscript.OP_EQUALVERIFY,
22: txscript.OP_EQUAL,
}
copy(s[2:22], sh)
return 0, s
Expand Down
4 changes: 4 additions & 0 deletions wallet/udb/addressmanager.go
Expand Up @@ -106,6 +106,10 @@ func normalizeAddress(addr stdaddr.Address) stdaddr.Address {
switch addr := addr.(type) {
case *stdaddr.AddressPubKeyEcdsaSecp256k1V0:
return addr.AddressPubKeyHash()
case *stdaddr.AddressPubKeyEd25519V0:
return addr.AddressPubKeyHash()
case *stdaddr.AddressPubKeySchnorrSecp256k1V0:
return addr.AddressPubKeyHash()
default:
return addr
}
Expand Down

0 comments on commit 69c9106

Please sign in to comment.