wallet: add interface for storing generic data on destinations
This commit is contained in:
parent
dd7c1cf534
commit
b10e147096
4 changed files with 92 additions and 0 deletions
|
@ -1534,7 +1534,19 @@ bool CWallet::SetAddressBook(const CTxDestination& address, const string& strNam
|
||||||
|
|
||||||
bool CWallet::DelAddressBook(const CTxDestination& address)
|
bool CWallet::DelAddressBook(const CTxDestination& address)
|
||||||
{
|
{
|
||||||
|
|
||||||
AssertLockHeld(cs_wallet); // mapAddressBook
|
AssertLockHeld(cs_wallet); // mapAddressBook
|
||||||
|
|
||||||
|
if(fFileBacked)
|
||||||
|
{
|
||||||
|
// Delete destdata tuples associated with address
|
||||||
|
std::string strAddress = CBitcoinAddress(address).ToString();
|
||||||
|
BOOST_FOREACH(const PAIRTYPE(string, string) &item, mapAddressBook[address].destdata)
|
||||||
|
{
|
||||||
|
CWalletDB(strWalletFile).EraseDestData(strAddress, item.first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mapAddressBook.erase(address);
|
mapAddressBook.erase(address);
|
||||||
NotifyAddressBookChanged(this, address, "", ::IsMine(*this, address), "", CT_DELETED);
|
NotifyAddressBookChanged(this, address, "", ::IsMine(*this, address), "", CT_DELETED);
|
||||||
if (!fFileBacked)
|
if (!fFileBacked)
|
||||||
|
@ -2008,3 +2020,42 @@ void CWallet::GetKeyBirthTimes(std::map<CKeyID, int64_t> &mapKeyBirth) const {
|
||||||
for (std::map<CKeyID, CBlockIndex*>::const_iterator it = mapKeyFirstBlock.begin(); it != mapKeyFirstBlock.end(); it++)
|
for (std::map<CKeyID, CBlockIndex*>::const_iterator it = mapKeyFirstBlock.begin(); it != mapKeyFirstBlock.end(); it++)
|
||||||
mapKeyBirth[it->first] = it->second->nTime - 7200; // block times can be 2h off
|
mapKeyBirth[it->first] = it->second->nTime - 7200; // block times can be 2h off
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CWallet::AddDestData(const CTxDestination &dest, const std::string &key, const std::string &value)
|
||||||
|
{
|
||||||
|
mapAddressBook[dest].destdata.insert(std::make_pair(key, value));
|
||||||
|
if (!fFileBacked)
|
||||||
|
return true;
|
||||||
|
return CWalletDB(strWalletFile).WriteDestData(CBitcoinAddress(dest).ToString(), key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWallet::EraseDestData(const CTxDestination &dest, const std::string &key)
|
||||||
|
{
|
||||||
|
if (!mapAddressBook[dest].destdata.erase(key))
|
||||||
|
return false;
|
||||||
|
if (!fFileBacked)
|
||||||
|
return true;
|
||||||
|
return CWalletDB(strWalletFile).EraseDestData(CBitcoinAddress(dest).ToString(), key);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWallet::LoadDestData(const CTxDestination &dest, const std::string &key, const std::string &value)
|
||||||
|
{
|
||||||
|
mapAddressBook[dest].destdata.insert(std::make_pair(key, value));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWallet::GetDestData(const CTxDestination &dest, const std::string &key, std::string *value) const
|
||||||
|
{
|
||||||
|
std::map<CTxDestination, CAddressBookData>::const_iterator i = mapAddressBook.find(dest);
|
||||||
|
if(i != mapAddressBook.end())
|
||||||
|
{
|
||||||
|
CAddressBookData::StringMap::const_iterator j = i->second.destdata.find(key);
|
||||||
|
if(j != i->second.destdata.end())
|
||||||
|
{
|
||||||
|
if(value)
|
||||||
|
*value = j->second;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
12
src/wallet.h
12
src/wallet.h
|
@ -83,6 +83,9 @@ public:
|
||||||
{
|
{
|
||||||
purpose = "unknown";
|
purpose = "unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef std::map<std::string, std::string> StringMap;
|
||||||
|
StringMap destdata;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** A CWallet is an extension of a keystore, which also maintains a set of transactions and balances,
|
/** A CWallet is an extension of a keystore, which also maintains a set of transactions and balances,
|
||||||
|
@ -189,6 +192,15 @@ public:
|
||||||
bool AddCScript(const CScript& redeemScript);
|
bool AddCScript(const CScript& redeemScript);
|
||||||
bool LoadCScript(const CScript& redeemScript) { return CCryptoKeyStore::AddCScript(redeemScript); }
|
bool LoadCScript(const CScript& redeemScript) { return CCryptoKeyStore::AddCScript(redeemScript); }
|
||||||
|
|
||||||
|
/// Adds a destination data tuple to the store, and saves it to disk
|
||||||
|
bool AddDestData(const CTxDestination &dest, const std::string &key, const std::string &value);
|
||||||
|
/// Erases a destination data tuple in the store and on disk
|
||||||
|
bool EraseDestData(const CTxDestination &dest, const std::string &key);
|
||||||
|
/// Adds a destination data tuple to the store, without saving it to disk
|
||||||
|
bool LoadDestData(const CTxDestination &dest, const std::string &key, const std::string &value);
|
||||||
|
/// Look up a destination data tuple in the store, return true if found false otherwise
|
||||||
|
bool GetDestData(const CTxDestination &dest, const std::string &key, std::string *value) const;
|
||||||
|
|
||||||
bool Unlock(const SecureString& strWalletPassphrase);
|
bool Unlock(const SecureString& strWalletPassphrase);
|
||||||
bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase);
|
bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase);
|
||||||
bool EncryptWallet(const SecureString& strWalletPassphrase);
|
bool EncryptWallet(const SecureString& strWalletPassphrase);
|
||||||
|
|
|
@ -564,6 +564,18 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
|
||||||
{
|
{
|
||||||
ssValue >> pwallet->nOrderPosNext;
|
ssValue >> pwallet->nOrderPosNext;
|
||||||
}
|
}
|
||||||
|
else if (strType == "destdata")
|
||||||
|
{
|
||||||
|
std::string strAddress, strKey, strValue;
|
||||||
|
ssKey >> strAddress;
|
||||||
|
ssKey >> strKey;
|
||||||
|
ssValue >> strValue;
|
||||||
|
if (!pwallet->LoadDestData(CBitcoinAddress(strAddress).Get(), strKey, strValue))
|
||||||
|
{
|
||||||
|
strErr = "Error reading wallet database: LoadDestData failed";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (...)
|
} catch (...)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -865,3 +877,15 @@ bool CWalletDB::Recover(CDBEnv& dbenv, std::string filename)
|
||||||
{
|
{
|
||||||
return CWalletDB::Recover(dbenv, filename, false);
|
return CWalletDB::Recover(dbenv, filename, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CWalletDB::WriteDestData(const std::string &address, const std::string &key, const std::string &value)
|
||||||
|
{
|
||||||
|
nWalletDBUpdated++;
|
||||||
|
return Write(boost::make_tuple(std::string("destdata"), address, key), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWalletDB::EraseDestData(const std::string &address, const std::string &key)
|
||||||
|
{
|
||||||
|
nWalletDBUpdated++;
|
||||||
|
return Erase(boost::make_tuple(string("destdata"), address, key));
|
||||||
|
}
|
||||||
|
|
|
@ -124,6 +124,11 @@ public:
|
||||||
|
|
||||||
bool ReadAccount(const std::string& strAccount, CAccount& account);
|
bool ReadAccount(const std::string& strAccount, CAccount& account);
|
||||||
bool WriteAccount(const std::string& strAccount, const CAccount& account);
|
bool WriteAccount(const std::string& strAccount, const CAccount& account);
|
||||||
|
|
||||||
|
/// Write destination data key,value tuple to database
|
||||||
|
bool WriteDestData(const std::string &address, const std::string &key, const std::string &value);
|
||||||
|
/// Erase destination data tuple from wallet database
|
||||||
|
bool EraseDestData(const std::string &address, const std::string &key);
|
||||||
private:
|
private:
|
||||||
bool WriteAccountingEntry(const uint64_t nAccEntryNum, const CAccountingEntry& acentry);
|
bool WriteAccountingEntry(const uint64_t nAccEntryNum, const CAccountingEntry& acentry);
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in a new issue