Browse Source

Expose method to find key for a single-key destination

0.16
Pieter Wuille 7 years ago
parent
commit
30a27dc5b1
  1. 22
      src/keystore.cpp
  2. 3
      src/keystore.h

22
src/keystore.cpp

@ -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();
}

3
src/keystore.h

@ -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…
Cancel
Save