From 6b8d86ddb803d50d8608d95f7e8f791511dec8b9 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Thu, 8 Nov 2018 10:08:46 -0500 Subject: [PATCH] Require a public key to be retrieved when signing a P2PKH input If we do not have the public key for a P2PKH input, we should not continue to attempt to sign for it. --- src/script/sign.cpp | 2 +- test/functional/rpc_psbt.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 89cc7c808c7..68ceea7e6f2 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -123,7 +123,7 @@ static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator case TX_PUBKEYHASH: { CKeyID keyID = CKeyID(uint160(vSolutions[0])); CPubKey pubkey; - GetPubKey(provider, sigdata, keyID, pubkey); + if (!GetPubKey(provider, sigdata, keyID, pubkey)) return false; if (!CreateSig(creator, sigdata, provider, sig, pubkey, scriptPubKey, sigversion)) return false; ret.push_back(std::move(sig)); ret.push_back(ToByteVector(pubkey)); diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py index fca910bf64c..30f84cff3c1 100755 --- a/test/functional/rpc_psbt.py +++ b/test/functional/rpc_psbt.py @@ -269,6 +269,10 @@ class PSBTTest(BitcoinTestFramework): self.test_utxo_conversion() + # Test that psbts with p2pkh outputs are created properly + p2pkh = self.nodes[0].getnewaddress(address_type='legacy') + psbt = self.nodes[1].walletcreatefundedpsbt([], [{p2pkh : 1}], 0, {"includeWatching" : True}, True) + self.nodes[0].decodepsbt(psbt['psbt']) if __name__ == '__main__': PSBTTest().main()