Expose method to find key for a single-key destination
This commit is contained in:
parent
985c79552c
commit
30a27dc5b1
2 changed files with 25 additions and 0 deletions
|
@ -136,3 +136,25 @@ bool CBasicKeyStore::HaveWatchOnly() const
|
||||||
LOCK(cs_KeyStore);
|
LOCK(cs_KeyStore);
|
||||||
return (!setWatchOnly.empty());
|
return (!setWatchOnly.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CKeyID GetKeyForDestination(const CKeyStore& store, const CTxDestination& dest)
|
||||||
|
{
|
||||||
|
// Only supports destinations which map to single public keys, i.e. P2PKH,
|
||||||
|
// P2WPKH, and P2SH-P2WPKH.
|
||||||
|
if (auto id = boost::get<CKeyID>(&dest)) {
|
||||||
|
return *id;
|
||||||
|
}
|
||||||
|
if (auto witness_id = boost::get<WitnessV0KeyHash>(&dest)) {
|
||||||
|
return CKeyID(*witness_id);
|
||||||
|
}
|
||||||
|
if (auto script_id = boost::get<CScriptID>(&dest)) {
|
||||||
|
CScript script;
|
||||||
|
CTxDestination inner_dest;
|
||||||
|
if (store.GetCScript(*script_id, script) && ExtractDestination(script, inner_dest)) {
|
||||||
|
if (auto inner_witness_id = boost::get<WitnessV0KeyHash>(&inner_dest)) {
|
||||||
|
return CKeyID(*inner_witness_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CKeyID();
|
||||||
|
}
|
||||||
|
|
|
@ -78,4 +78,7 @@ public:
|
||||||
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
|
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
|
||||||
typedef std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char> > > CryptedKeyMap;
|
typedef std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char> > > CryptedKeyMap;
|
||||||
|
|
||||||
|
/** Return the CKeyID of the key involved in a script (if there is a unique one). */
|
||||||
|
CKeyID GetKeyForDestination(const CKeyStore& store, const CTxDestination& dest);
|
||||||
|
|
||||||
#endif // BITCOIN_KEYSTORE_H
|
#endif // BITCOIN_KEYSTORE_H
|
||||||
|
|
Loading…
Reference in a new issue