diff --git a/src/psbt.h b/src/psbt.h --- a/src/psbt.h +++ b/src/psbt.h @@ -490,7 +490,9 @@ */ bool SignPSBTInput(const SigningProvider &provider, PartiallySignedTransaction &psbt, int index, - SigHashType sighash = SigHashType()); + SigHashType sighash = SigHashType(), + SignatureData *out_sigdata = nullptr, + bool use_dummy = false); /** * Finalizes a PSBT if possible, combining partial signatures. diff --git a/src/psbt.cpp b/src/psbt.cpp --- a/src/psbt.cpp +++ b/src/psbt.cpp @@ -173,7 +173,8 @@ bool SignPSBTInput(const SigningProvider &provider, PartiallySignedTransaction &psbt, int index, - SigHashType sighash) { + SigHashType sighash, SignatureData *out_sigdata, + bool use_dummy) { PSBTInput &input = psbt.inputs.at(index); const CMutableTransaction &tx = *psbt.tx; @@ -198,12 +199,26 @@ } utxo = input.utxo; - MutableTransactionSignatureCreator creator(&tx, index, utxo.nValue, - sighash); - bool sig_complete = - ProduceSignature(provider, creator, utxo.scriptPubKey, sigdata); + + bool sig_complete{false}; + if (use_dummy) { + sig_complete = ProduceSignature(provider, DUMMY_SIGNATURE_CREATOR, + utxo.scriptPubKey, sigdata); + } else { + MutableTransactionSignatureCreator creator(&tx, index, utxo.nValue, + sighash); + sig_complete = + ProduceSignature(provider, creator, utxo.scriptPubKey, sigdata); + } input.FromSignatureData(sigdata); + // Fill in the missing info + if (out_sigdata != nullptr) { + out_sigdata->missing_pubkeys = sigdata.missing_pubkeys; + out_sigdata->missing_sigs = sigdata.missing_sigs; + out_sigdata->missing_redeem_script = sigdata.missing_redeem_script; + } + return sig_complete; } diff --git a/src/script/sign.h b/src/script/sign.h --- a/src/script/sign.h +++ b/src/script/sign.h @@ -131,6 +131,12 @@ /// signatures necessary for producing a final scriptSig. std::map signatures; std::map> misc_pubkeys; + /// KeyIDs of pubkeys which could not be found + std::vector missing_pubkeys; + /// KeyIDs of pubkeys for signatures which could not be found + std::vector missing_sigs; + /// ScriptID of the missing redeemScript (if any) + uint160 missing_redeem_script; SignatureData() {} explicit SignatureData(const CScript &script) : scriptSig(script) {} diff --git a/src/script/sign.cpp b/src/script/sign.cpp --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -96,6 +96,8 @@ assert(i.second); return true; } + // Could not make signature or signature not found, add keyid to missing + sigdata.missing_sigs.push_back(keyid); return false; } @@ -133,6 +135,8 @@ CKeyID keyID = CKeyID(uint160(vSolutions[0])); CPubKey pubkey; if (!provider.GetPubKey(keyID, pubkey)) { + // Pubkey could not be found, add to missing + sigdata.missing_pubkeys.push_back(keyID); return false; } if (!CreateSig(creator, sigdata, provider, sig, pubkey, @@ -144,12 +148,14 @@ return true; } case TX_SCRIPTHASH: - if (GetCScript(provider, sigdata, uint160(vSolutions[0]), - scriptRet)) { + h160 = uint160(vSolutions[0]); + if (GetCScript(provider, sigdata, h160, scriptRet)) { ret.push_back( std::vector(scriptRet.begin(), scriptRet.end())); return true; } + // Could not find redeemScript, add to missing + sigdata.missing_redeem_script = h160; return false; case TX_MULTISIG: { size_t required = vSolutions.front()[0];