From 69c9106f1c810b84556c4ead13cd3647f92d8ed3 Mon Sep 17 00:00:00 2001 From: JoeGruff Date: Thu, 30 Sep 2021 18:38:22 +0900 Subject: [PATCH] grpc: Return more info for ValidateAddress. 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. --- internal/rpc/rpcserver/server.go | 30 +++++++++++++++--------------- wallet/addresses.go | 2 +- wallet/udb/addressmanager.go | 4 ++++ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/internal/rpc/rpcserver/server.go b/internal/rpc/rpcserver/server.go index d13f8667b..7df807f89 100644 --- a/internal/rpc/rpcserver/server.go +++ b/internal/rpc/rpcserver/server.go @@ -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 { @@ -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() @@ -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 } diff --git a/wallet/addresses.go b/wallet/addresses.go index 27c410fb3..3a6485f18 100644 --- a/wallet/addresses.go +++ b/wallet/addresses.go @@ -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 diff --git a/wallet/udb/addressmanager.go b/wallet/udb/addressmanager.go index 977e9d2c6..8e83d6a64 100644 --- a/wallet/udb/addressmanager.go +++ b/wallet/udb/addressmanager.go @@ -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 }