Implement key origin lookup in CWallet
This commit is contained in:
parent
3b01efa0d1
commit
03a99586a3
|
@ -4429,26 +4429,9 @@ void AddKeypathToMap(const CWallet* pwallet, const CKeyID& keyID, std::map<CPubK
|
||||||
if (!pwallet->GetPubKey(keyID, vchPubKey)) {
|
if (!pwallet->GetPubKey(keyID, vchPubKey)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CKeyMetadata meta;
|
|
||||||
auto it = pwallet->mapKeyMetadata.find(keyID);
|
|
||||||
if (it != pwallet->mapKeyMetadata.end()) {
|
|
||||||
meta = it->second;
|
|
||||||
}
|
|
||||||
KeyOriginInfo info;
|
KeyOriginInfo info;
|
||||||
if (!meta.hdKeypath.empty()) {
|
if (!pwallet->GetKeyOrigin(keyID, info)) {
|
||||||
if (!ParseHDKeypath(meta.hdKeypath, info.path)) {
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Internal keypath is broken");
|
||||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "Internal keypath is broken");
|
|
||||||
}
|
|
||||||
// Get the proper master key id
|
|
||||||
CKey key;
|
|
||||||
pwallet->GetKey(meta.hd_seed_id, key);
|
|
||||||
CExtKey masterKey;
|
|
||||||
masterKey.SetSeed(key.begin(), key.size());
|
|
||||||
// Compute identifier
|
|
||||||
CKeyID masterid = masterKey.key.GetPubKey().GetID();
|
|
||||||
std::copy(masterid.begin(), masterid.begin() + 4, info.fingerprint);
|
|
||||||
} else { // Single pubkeys get the master fingerprint of themselves
|
|
||||||
std::copy(keyID.begin(), keyID.begin() + 4, info.fingerprint);
|
|
||||||
}
|
}
|
||||||
hd_keypaths.emplace(vchPubKey, std::move(info));
|
hd_keypaths.emplace(vchPubKey, std::move(info));
|
||||||
}
|
}
|
||||||
|
|
|
@ -4466,3 +4466,29 @@ std::vector<OutputGroup> CWallet::GroupOutputs(const std::vector<COutput>& outpu
|
||||||
}
|
}
|
||||||
return groups;
|
return groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CWallet::GetKeyOrigin(const CKeyID& keyID, KeyOriginInfo& info) const
|
||||||
|
{
|
||||||
|
CKeyMetadata meta;
|
||||||
|
{
|
||||||
|
LOCK(cs_wallet);
|
||||||
|
auto it = mapKeyMetadata.find(keyID);
|
||||||
|
if (it != mapKeyMetadata.end()) {
|
||||||
|
meta = it->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!meta.hdKeypath.empty()) {
|
||||||
|
if (!ParseHDKeypath(meta.hdKeypath, info.path)) return false;
|
||||||
|
// Get the proper master key id
|
||||||
|
CKey key;
|
||||||
|
GetKey(meta.hd_seed_id, key);
|
||||||
|
CExtKey masterKey;
|
||||||
|
masterKey.SetSeed(key.begin(), key.size());
|
||||||
|
// Compute identifier
|
||||||
|
CKeyID masterid = masterKey.key.GetPubKey().GetID();
|
||||||
|
std::copy(masterid.begin(), masterid.begin() + 4, info.fingerprint);
|
||||||
|
} else { // Single pubkeys get the master fingerprint of themselves
|
||||||
|
std::copy(keyID.begin(), keyID.begin() + 4, info.fingerprint);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -1211,6 +1211,8 @@ public:
|
||||||
LogPrintf(("%s " + fmt).c_str(), GetDisplayName(), parameters...);
|
LogPrintf(("%s " + fmt).c_str(), GetDisplayName(), parameters...);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Implement lookup of key origin information through wallet key metadata. */
|
||||||
|
bool GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** A key allocated from the key pool. */
|
/** A key allocated from the key pool. */
|
||||||
|
|
Loading…
Reference in a new issue