X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=blobdiff_plain;f=src%2Fwalletdb.h;h=714b3ccf5c48b7b596121433f5e8f4965121abac;hp=46ba7967ca135a2455d7c30cc876273f4c5a1260;hb=9e58e0a8ca28b15a4bfa677f5b23891972db40fd;hpb=9eace6b1130ce7eb938476750159ec0baf752531 diff --git a/src/walletdb.h b/src/walletdb.h index 46ba796..714b3cc 100644 --- a/src/walletdb.h +++ b/src/walletdb.h @@ -1,11 +1,13 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying -// file license.txt or http://www.opensource.org/licenses/mit-license.php. +// file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_WALLETDB_H #define BITCOIN_WALLETDB_H #include "db.h" +//#include "base58.h" +#include "keystore.h" class CKeyPool; class CAccount; @@ -16,11 +18,44 @@ enum DBErrors { DB_LOAD_OK, DB_CORRUPT, + DB_NONCRITICAL_ERROR, DB_TOO_NEW, DB_LOAD_FAIL, DB_NEED_REWRITE }; +class CKeyMetadata +{ +public: + static const int CURRENT_VERSION=1; + int nVersion; + int64_t nCreateTime; // 0 means unknown + + CKeyMetadata() + { + SetNull(); + } + CKeyMetadata(int64_t nCreateTime_) + { + nVersion = CKeyMetadata::CURRENT_VERSION; + nCreateTime = nCreateTime_; + } + + IMPLEMENT_SERIALIZE + ( + READWRITE(this->nVersion); + nVersion = this->nVersion; + READWRITE(nCreateTime); + ) + + void SetNull() + { + nVersion = CKeyMetadata::CURRENT_VERSION; + nCreateTime = 0; + } +}; + + /** Access to the wallet database (wallet.dat) */ class CWalletDB : public CDB { @@ -32,21 +67,10 @@ private: CWalletDB(const CWalletDB&); void operator=(const CWalletDB&); public: - bool ReadName(const std::string& strAddress, std::string& strName) - { - strName = ""; - return Read(std::make_pair(std::string("name"), strAddress), strName); - } - bool WriteName(const std::string& strAddress, const std::string& strName); bool EraseName(const std::string& strAddress); - bool ReadTx(uint256 hash, CWalletTx& wtx) - { - return Read(std::make_pair(std::string("tx"), hash), wtx); - } - bool WriteTx(uint256 hash, const CWalletTx& wtx) { nWalletDBUpdated++; @@ -59,27 +83,59 @@ public: return Erase(std::make_pair(std::string("tx"), hash)); } - bool ReadKey(const std::vector& vchPubKey, CPrivKey& vchPrivKey) + bool WriteKey(const CPubKey& key, const CPrivKey& vchPrivKey, const CKeyMetadata &keyMeta) { - vchPrivKey.clear(); - return Read(std::make_pair(std::string("key"), vchPubKey), vchPrivKey); + nWalletDBUpdated++; + if(!Write(std::make_pair(std::string("keymeta"), key), keyMeta)) + return false; + + if(!Write(std::make_pair(std::string("key"), key), vchPrivKey, false)) + return false; + + return true; } - bool WriteKey(const std::vector& vchPubKey, const CPrivKey& vchPrivKey) + bool WriteMalleableKey(const CMalleableKeyView& keyView, const CSecret& vchSecretH, const CKeyMetadata &keyMeta) { nWalletDBUpdated++; - return Write(std::make_pair(std::string("key"), vchPubKey), vchPrivKey, false); + if(!Write(std::make_pair(std::string("malmeta"), keyView.ToString()), keyMeta)) + return false; + + if(!Write(std::make_pair(std::string("malpair"), keyView.ToString()), vchSecretH, false)) + return false; + + return true; } - bool WriteCryptedKey(const std::vector& vchPubKey, const std::vector& vchCryptedSecret, bool fEraseUnencryptedKey = true) + bool WriteCryptedMalleableKey(const CMalleableKeyView& keyView, const std::vector& vchCryptedSecretH, const CKeyMetadata &keyMeta) { nWalletDBUpdated++; - if (!Write(std::make_pair(std::string("ckey"), vchPubKey), vchCryptedSecret, false)) + if(!Write(std::make_pair(std::string("malmeta"), keyView.ToString()), keyMeta)) + return false; + + if(!Write(std::make_pair(std::string("malcpair"), keyView.ToString()), vchCryptedSecretH, false)) + return false; + + Erase(std::make_pair(std::string("malpair"), keyView.ToString())); + + return true; + } + + + bool WriteCryptedKey(const CPubKey& key, const std::vector& vchCryptedSecret, const CKeyMetadata &keyMeta) + { + nWalletDBUpdated++; + bool fEraseUnencryptedKey = true; + + if(!Write(std::make_pair(std::string("keymeta"), key), keyMeta)) + return false; + + if (!Write(std::make_pair(std::string("ckey"), key), vchCryptedSecret, false)) return false; if (fEraseUnencryptedKey) { - Erase(std::make_pair(std::string("key"), vchPubKey)); - Erase(std::make_pair(std::string("wkey"), vchPubKey)); + Erase(std::make_pair(std::string("key"), key)); + Erase(std::make_pair(std::string("wkey"), key)); } return true; } @@ -90,11 +146,20 @@ public: return Write(std::make_pair(std::string("mkey"), nID), kMasterKey, true); } - // Support for BIP 0013 : see https://en.bitcoin.it/wiki/BIP_0013 - bool ReadCScript(const uint160 &hash, CScript& redeemScript) + bool EraseMasterKey(unsigned int nID) + { + nWalletDBUpdated++; + return Erase(std::make_pair(std::string("mkey"), nID)); + } + + bool EraseCryptedKey(const CPubKey& key) { - redeemScript.clear(); - return Read(std::make_pair(std::string("cscript"), hash), redeemScript); + return Erase(std::make_pair(std::string("ckey"), key)); + } + + bool EraseCryptedMalleableKey(const CMalleableKeyView& keyView) + { + return Erase(std::make_pair(std::string("malcpair"), keyView.ToString())); } bool WriteCScript(const uint160& hash, const CScript& redeemScript) @@ -103,6 +168,18 @@ public: return Write(std::make_pair(std::string("cscript"), hash), redeemScript, false); } + bool WriteWatchOnly(const CScript &dest) + { + nWalletDBUpdated++; + return Write(std::make_pair(std::string("watchs"), dest), '1'); + } + + bool EraseWatchOnly(const CScript &dest) + { + nWalletDBUpdated++; + return Erase(std::make_pair(std::string("watchs"), dest)); + } + bool WriteBestBlock(const CBlockLocator& locator) { nWalletDBUpdated++; @@ -114,54 +191,35 @@ public: return Read(std::string("bestblock"), locator); } - bool ReadDefaultKey(std::vector& vchPubKey) + bool WriteOrderPosNext(int64_t nOrderPosNext) { - vchPubKey.clear(); - return Read(std::string("defaultkey"), vchPubKey); + nWalletDBUpdated++; + return Write(std::string("orderposnext"), nOrderPosNext); } - bool WriteDefaultKey(const std::vector& vchPubKey) + bool WriteDefaultKey(const CPubKey& key) { nWalletDBUpdated++; - return Write(std::string("defaultkey"), vchPubKey); + return Write(std::string("defaultkey"), key); } - bool ReadPool(int64 nPool, CKeyPool& keypool) + bool ReadPool(int64_t nPool, CKeyPool& keypool) { return Read(std::make_pair(std::string("pool"), nPool), keypool); } - bool WritePool(int64 nPool, const CKeyPool& keypool) + bool WritePool(int64_t nPool, const CKeyPool& keypool) { nWalletDBUpdated++; return Write(std::make_pair(std::string("pool"), nPool), keypool); } - bool ErasePool(int64 nPool) + bool ErasePool(int64_t nPool) { nWalletDBUpdated++; return Erase(std::make_pair(std::string("pool"), nPool)); } - // Settings are no longer stored in wallet.dat; these are - // used only for backwards compatibility: - template - bool ReadSetting(const std::string& strKey, T& value) - { - return Read(std::make_pair(std::string("setting"), strKey), value); - } - template - bool WriteSetting(const std::string& strKey, const T& value) - { - nWalletDBUpdated++; - return Write(std::make_pair(std::string("setting"), strKey), value); - } - bool EraseSetting(const std::string& strKey) - { - nWalletDBUpdated++; - return Erase(std::make_pair(std::string("setting"), strKey)); - } - bool WriteMinVersion(int nVersion) { return Write(std::string("minversion"), nVersion); @@ -169,11 +227,20 @@ public: bool ReadAccount(const std::string& strAccount, CAccount& account); bool WriteAccount(const std::string& strAccount, const CAccount& account); +private: + bool WriteAccountingEntry(const uint64_t nAccEntryNum, const CAccountingEntry& acentry); +public: bool WriteAccountingEntry(const CAccountingEntry& acentry); - int64 GetAccountCreditDebit(const std::string& strAccount); + int64_t GetAccountCreditDebit(const std::string& strAccount); void ListAccountCreditDebit(const std::string& strAccount, std::list& acentries); - int LoadWallet(CWallet* pwallet); + DBErrors ReorderTransactions(CWallet*); + DBErrors LoadWallet(CWallet* pwallet); + DBErrors FindWalletTx(CWallet* pwallet, std::vector& vTxHash); + DBErrors ZapWalletTx(CWallet* pwallet); + + static bool Recover(CDBEnv& dbenv, std::string filename, bool fOnlyKeys); + static bool Recover(CDBEnv& dbenv, std::string filename); }; #endif // BITCOIN_WALLETDB_H