mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 04:52:59 +01:00
Merge #11854: Split up key and script metadata for better type safety
9c8eca7
Split up key and script metadata for better type safety (Russell Yanofsky)
Pull request description:
Suggested by @TheBlueMatt
https://github.com/bitcoin/bitcoin/pull/11403#discussion_r155599383
Combining the maps was probably never a good arrangement but is more
problematic now in presence of WitnessV0ScriptHash and WitnessV0KeyHash types.
Tree-SHA512: 9263e9c01090fb49221e91d88a88241a9691dda3e92d86041c8e284306a64d3af5e2438249f9dcc3e6e4a5c11c1a89f975a86d55690adf95bf2636f15f99f92a
This commit is contained in:
parent
02ab2efe4a
commit
9d3c7c3ca6
@ -303,20 +303,28 @@ UniValue validateaddress(const JSONRPCRequest& request)
|
|||||||
ret.push_back(Pair("account", pwallet->mapAddressBook[dest].name));
|
ret.push_back(Pair("account", pwallet->mapAddressBook[dest].name));
|
||||||
}
|
}
|
||||||
if (pwallet) {
|
if (pwallet) {
|
||||||
const auto& meta = pwallet->mapKeyMetadata;
|
const CKeyMetadata* meta = nullptr;
|
||||||
const CKeyID *keyID = boost::get<CKeyID>(&dest);
|
const CKeyID *keyID = boost::get<CKeyID>(&dest);
|
||||||
auto it = keyID ? meta.find(*keyID) : meta.end();
|
if (const CKeyID* key_id = boost::get<CKeyID>(&dest)) {
|
||||||
if (it == meta.end()) {
|
auto it = pwallet->mapKeyMetadata.find(*key_id);
|
||||||
it = meta.find(CScriptID(scriptPubKey));
|
if (it != pwallet->mapKeyMetadata.end()) {
|
||||||
|
meta = &it->second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (it != meta.end()) {
|
if (!meta) {
|
||||||
ret.push_back(Pair("timestamp", it->second.nCreateTime));
|
auto it = pwallet->m_script_metadata.find(CScriptID(scriptPubKey));
|
||||||
|
if (it != pwallet->m_script_metadata.end()) {
|
||||||
|
meta = &it->second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (meta) {
|
||||||
|
ret.push_back(Pair("timestamp", meta->nCreateTime));
|
||||||
|
CHDChain hdChainCurrent;
|
||||||
|
if (pwallet->mapHdPubKeys.count(*keyID) && pwallet->GetHDChain(hdChainCurrent)) {
|
||||||
|
ret.push_back(Pair("hdkeypath", pwallet->mapHdPubKeys[*keyID].GetKeyPath()));
|
||||||
|
ret.push_back(Pair("hdchainid", hdChainCurrent.GetID().GetHex()));
|
||||||
|
}
|
||||||
|
|
||||||
CHDChain hdChainCurrent;
|
|
||||||
if (keyID && pwallet->mapHdPubKeys.count(*keyID) && pwallet->GetHDChain(hdChainCurrent)) {
|
|
||||||
ret.push_back(Pair("hdkeypath", pwallet->mapHdPubKeys[*keyID].GetKeyPath()));
|
|
||||||
ret.push_back(Pair("hdchainid", hdChainCurrent.GetID().GetHex()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -386,7 +386,7 @@ bool CWallet::AddCryptedKey(const CPubKey &vchPubKey,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::LoadKeyMetadata(const CTxDestination& keyID, const CKeyMetadata &meta)
|
bool CWallet::LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &meta)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_wallet); // mapKeyMetadata
|
AssertLockHeld(cs_wallet); // mapKeyMetadata
|
||||||
UpdateTimeFirstKey(meta.nCreateTime);
|
UpdateTimeFirstKey(meta.nCreateTime);
|
||||||
@ -394,6 +394,14 @@ bool CWallet::LoadKeyMetadata(const CTxDestination& keyID, const CKeyMetadata &m
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CWallet::LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &meta)
|
||||||
|
{
|
||||||
|
AssertLockHeld(cs_wallet); // m_script_metadata
|
||||||
|
UpdateTimeFirstKey(meta.nCreateTime);
|
||||||
|
m_script_metadata[script_id] = meta;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool CWallet::LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret)
|
bool CWallet::LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret)
|
||||||
{
|
{
|
||||||
return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret);
|
return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret);
|
||||||
@ -442,7 +450,7 @@ bool CWallet::AddWatchOnly(const CScript& dest)
|
|||||||
{
|
{
|
||||||
if (!CCryptoKeyStore::AddWatchOnly(dest))
|
if (!CCryptoKeyStore::AddWatchOnly(dest))
|
||||||
return false;
|
return false;
|
||||||
const CKeyMetadata& meta = mapKeyMetadata[CScriptID(dest)];
|
const CKeyMetadata& meta = m_script_metadata[CScriptID(dest)];
|
||||||
UpdateTimeFirstKey(meta.nCreateTime);
|
UpdateTimeFirstKey(meta.nCreateTime);
|
||||||
NotifyWatchonlyChanged(true);
|
NotifyWatchonlyChanged(true);
|
||||||
return CWalletDB(*dbw).WriteWatchOnly(dest, meta);
|
return CWalletDB(*dbw).WriteWatchOnly(dest, meta);
|
||||||
@ -450,7 +458,7 @@ bool CWallet::AddWatchOnly(const CScript& dest)
|
|||||||
|
|
||||||
bool CWallet::AddWatchOnly(const CScript& dest, int64_t nCreateTime)
|
bool CWallet::AddWatchOnly(const CScript& dest, int64_t nCreateTime)
|
||||||
{
|
{
|
||||||
mapKeyMetadata[CScriptID(dest)].nCreateTime = nCreateTime;
|
m_script_metadata[CScriptID(dest)].nCreateTime = nCreateTime;
|
||||||
return AddWatchOnly(dest);
|
return AddWatchOnly(dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -823,9 +823,11 @@ public:
|
|||||||
|
|
||||||
void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
|
void LoadKeyPool(int64_t nIndex, const CKeyPool &keypool);
|
||||||
|
|
||||||
// Map from Key ID (for regular keys) or Script ID (for watch-only keys) to
|
// Map from Key ID to key metadata.
|
||||||
// key metadata.
|
std::map<CKeyID, CKeyMetadata> mapKeyMetadata;
|
||||||
std::map<CTxDestination, CKeyMetadata> mapKeyMetadata;
|
|
||||||
|
// Map from Script ID to key metadata (for watch-only keys).
|
||||||
|
std::map<CScriptID, CKeyMetadata> m_script_metadata;
|
||||||
|
|
||||||
typedef std::map<unsigned int, CMasterKey> MasterKeyMap;
|
typedef std::map<unsigned int, CMasterKey> MasterKeyMap;
|
||||||
MasterKeyMap mapMasterKeys;
|
MasterKeyMap mapMasterKeys;
|
||||||
@ -977,7 +979,8 @@ public:
|
|||||||
//! Adds a key to the store, without saving it to disk (used by LoadWallet)
|
//! Adds a key to the store, without saving it to disk (used by LoadWallet)
|
||||||
bool LoadKey(const CKey& key, const CPubKey &pubkey) { return CCryptoKeyStore::AddKeyPubKey(key, pubkey); }
|
bool LoadKey(const CKey& key, const CPubKey &pubkey) { return CCryptoKeyStore::AddKeyPubKey(key, pubkey); }
|
||||||
//! Load metadata (used by LoadWallet)
|
//! Load metadata (used by LoadWallet)
|
||||||
bool LoadKeyMetadata(const CTxDestination& pubKey, const CKeyMetadata &metadata);
|
bool LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
|
||||||
|
bool LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
|
||||||
|
|
||||||
bool LoadMinVersion(int nVersion) { AssertLockHeld(cs_wallet); nWalletVersion = nVersion; nWalletMaxVersion = std::max(nWalletMaxVersion, nVersion); return true; }
|
bool LoadMinVersion(int nVersion) { AssertLockHeld(cs_wallet); nWalletVersion = nVersion; nWalletMaxVersion = std::max(nWalletMaxVersion, nVersion); return true; }
|
||||||
void UpdateTimeFirstKey(int64_t nCreateTime);
|
void UpdateTimeFirstKey(int64_t nCreateTime);
|
||||||
|
@ -425,27 +425,23 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
|
|||||||
}
|
}
|
||||||
wss.fIsEncrypted = true;
|
wss.fIsEncrypted = true;
|
||||||
}
|
}
|
||||||
else if (strType == "keymeta" || strType == "watchmeta")
|
else if (strType == "keymeta")
|
||||||
{
|
{
|
||||||
CTxDestination keyID;
|
CPubKey vchPubKey;
|
||||||
if (strType == "keymeta")
|
ssKey >> vchPubKey;
|
||||||
{
|
|
||||||
CPubKey vchPubKey;
|
|
||||||
ssKey >> vchPubKey;
|
|
||||||
keyID = vchPubKey.GetID();
|
|
||||||
}
|
|
||||||
else if (strType == "watchmeta")
|
|
||||||
{
|
|
||||||
CScript script;
|
|
||||||
ssKey >> script;
|
|
||||||
keyID = CScriptID(script);
|
|
||||||
}
|
|
||||||
|
|
||||||
CKeyMetadata keyMeta;
|
CKeyMetadata keyMeta;
|
||||||
ssValue >> keyMeta;
|
ssValue >> keyMeta;
|
||||||
wss.nKeyMeta++;
|
wss.nKeyMeta++;
|
||||||
|
pwallet->LoadKeyMetadata(vchPubKey.GetID(), keyMeta);
|
||||||
pwallet->LoadKeyMetadata(keyID, keyMeta);
|
}
|
||||||
|
else if (strType == "watchmeta")
|
||||||
|
{
|
||||||
|
CScript script;
|
||||||
|
ssKey >> script;
|
||||||
|
CKeyMetadata keyMeta;
|
||||||
|
ssValue >> keyMeta;
|
||||||
|
wss.nKeyMeta++;
|
||||||
|
pwallet->LoadScriptMetadata(CScriptID(script), keyMeta);
|
||||||
}
|
}
|
||||||
else if (strType == "defaultkey")
|
else if (strType == "defaultkey")
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user