diff --git a/src/script/sign.h b/src/script/sign.h --- a/src/script/sign.h +++ b/src/script/sign.h @@ -88,6 +88,7 @@ /// BIP 174 style partial signatures for the input. May contain all /// signatures necessary for producing a final scriptSig. std::map signatures; + std::map misc_pubkeys; 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 @@ -50,10 +50,10 @@ return false; } -static bool GetPubKey(const SigningProvider &provider, - const SignatureData &sigdata, const CKeyID &address, - CPubKey &pubkey) { +static bool GetPubKey(const SigningProvider &provider, SignatureData &sigdata, + const CKeyID &address, CPubKey &pubkey) { if (provider.GetPubKey(address, pubkey)) { + sigdata.misc_pubkeys.emplace(pubkey.GetID(), pubkey); return true; } // Look for pubkey in all partial sigs @@ -62,6 +62,12 @@ pubkey = it->second.first; return true; } + // Look for pubkey in pubkey list + const auto &pk_it = sigdata.misc_pubkeys.find(address); + if (pk_it != sigdata.misc_pubkeys.end()) { + pubkey = pk_it->second; + return true; + } return false; } @@ -74,9 +80,9 @@ sig_out = it->second.second; return true; } + CPubKey pubkey; + GetPubKey(provider, sigdata, keyid, pubkey); if (creator.CreateSig(provider, sig_out, keyid, scriptcode)) { - CPubKey pubkey; - GetPubKey(provider, sigdata, keyid, pubkey); auto i = sigdata.signatures.emplace(keyid, SigPair(pubkey, sig_out)); assert(i.second); return true;