static bool CreateSig(const BaseSignatureCreator& creator, SignatureData& sigdata, const SigningProvider& provider, std::vector<unsigned char>& sig_out, const CPubKey& pubkey, const CScript& scriptcode, SigVersion sigversion) { CKeyID keyid = pubkey.GetID(); const auto it = sigdata.signatures.find(keyid); if (it != sigdata.signatures.end()) { sig_out = it->second.second; return true; } KeyOriginInfo info; if (provider.GetKeyOrigin(keyid, info)) { sigdata.misc_pubkeys.emplace(keyid, std::make_pair(pubkey, std::move(info))); } if (creator.CreateSig(provider, sig_out, keyid, scriptcode, sigversion)) { auto i = sigdata.signatures.emplace(keyid, SigPair(pubkey, sig_out)); assert(i.second); return true; } return false; }
static bool GetPubKey(const SigningProvider& provider, SignatureData& sigdata, const CKeyID& address, CPubKey& pubkey) { // Look for pubkey in all partial sigs const auto it = sigdata.signatures.find(address); if (it != sigdata.signatures.end()) { 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.first; return true; } // Query the underlying provider if (provider.GetPubKey(address, pubkey)) { KeyOriginInfo info; if (provider.GetKeyOrigin(address, info)) { sigdata.misc_pubkeys.emplace(address, std::make_pair(pubkey, std::move(info))); } return true; } return false; }