1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2012 The Bitcoin developers
3 // Distributed under the MIT/X11 software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 #ifndef BITCOIN_WALLETDB_H
6 #define BITCOIN_WALLETDB_H
14 class CAccountingEntry;
16 /** Error statuses for the wallet database */
30 static const int CURRENT_VERSION=1;
32 int64_t nCreateTime; // 0 means unknown
38 CKeyMetadata(int64_t nCreateTime_)
40 nVersion = CKeyMetadata::CURRENT_VERSION;
41 nCreateTime = nCreateTime_;
46 READWRITE(this->nVersion);
47 nVersion = this->nVersion;
48 READWRITE(nCreateTime);
53 nVersion = CKeyMetadata::CURRENT_VERSION;
59 /** Access to the wallet database (wallet.dat) */
60 class CWalletDB : public CDB
63 CWalletDB(std::string strFilename, const char* pszMode="r+") : CDB(strFilename.c_str(), pszMode)
67 CWalletDB(const CWalletDB&);
68 void operator=(const CWalletDB&);
70 bool WriteName(const std::string& strAddress, const std::string& strName);
72 bool EraseName(const std::string& strAddress);
74 bool WriteTx(uint256 hash, const CWalletTx& wtx)
77 return Write(std::make_pair(std::string("tx"), hash), wtx);
80 bool EraseTx(uint256 hash)
83 return Erase(std::make_pair(std::string("tx"), hash));
86 bool WriteKey(const CPubKey& vchPubKey, const CPrivKey& vchPrivKey, const CKeyMetadata &keyMeta)
89 if(!Write(std::make_pair(std::string("keymeta"), vchPubKey), keyMeta))
92 if(!Write(std::make_pair(std::string("key"), vchPubKey.Raw()), vchPrivKey, false))
98 bool WriteMalleableKey(const CMalleableKeyView& keyView, const CMalleableKey& malleableKey, const CKeyMetadata &keyMeta)
101 if(!Write(std::make_pair(std::string("malmeta"), keyView.ToString()), keyMeta))
104 if(!Write(std::make_pair(std::string("malpair"), keyView.ToString()), malleableKey.ToString(), false))
111 bool WriteCryptedKey(const CPubKey& vchPubKey, const std::vector<unsigned char>& vchCryptedSecret, const CKeyMetadata &keyMeta)
114 bool fEraseUnencryptedKey = true;
116 if(!Write(std::make_pair(std::string("keymeta"), vchPubKey), keyMeta))
119 if (!Write(std::make_pair(std::string("ckey"), vchPubKey.Raw()), vchCryptedSecret, false))
121 if (fEraseUnencryptedKey)
123 Erase(std::make_pair(std::string("key"), vchPubKey.Raw()));
124 Erase(std::make_pair(std::string("wkey"), vchPubKey.Raw()));
129 bool WriteMasterKey(unsigned int nID, const CMasterKey& kMasterKey)
132 return Write(std::make_pair(std::string("mkey"), nID), kMasterKey, true);
135 bool EraseMasterKey(unsigned int nID)
138 return Erase(std::make_pair(std::string("mkey"), nID));
141 bool EraseCryptedKey(const CPubKey& vchPubKey)
143 return Erase(std::make_pair(std::string("ckey"), vchPubKey.Raw()));
146 bool WriteCScript(const uint160& hash, const CScript& redeemScript)
149 return Write(std::make_pair(std::string("cscript"), hash), redeemScript, false);
152 bool WriteWatchOnly(const CScript &dest)
155 return Write(std::make_pair(std::string("watchs"), dest), '1');
158 bool EraseWatchOnly(const CScript &dest)
161 return Erase(std::make_pair(std::string("watchs"), dest));
164 bool WriteBestBlock(const CBlockLocator& locator)
167 return Write(std::string("bestblock"), locator);
170 bool ReadBestBlock(CBlockLocator& locator)
172 return Read(std::string("bestblock"), locator);
175 bool WriteOrderPosNext(int64_t nOrderPosNext)
178 return Write(std::string("orderposnext"), nOrderPosNext);
181 bool WriteDefaultKey(const CPubKey& vchPubKey)
184 return Write(std::string("defaultkey"), vchPubKey.Raw());
187 bool ReadPool(int64_t nPool, CKeyPool& keypool)
189 return Read(std::make_pair(std::string("pool"), nPool), keypool);
192 bool WritePool(int64_t nPool, const CKeyPool& keypool)
195 return Write(std::make_pair(std::string("pool"), nPool), keypool);
198 bool ErasePool(int64_t nPool)
201 return Erase(std::make_pair(std::string("pool"), nPool));
204 bool WriteMinVersion(int nVersion)
206 return Write(std::string("minversion"), nVersion);
209 bool ReadAccount(const std::string& strAccount, CAccount& account);
210 bool WriteAccount(const std::string& strAccount, const CAccount& account);
212 bool WriteAccountingEntry(const uint64_t nAccEntryNum, const CAccountingEntry& acentry);
214 bool WriteAccountingEntry(const CAccountingEntry& acentry);
215 int64_t GetAccountCreditDebit(const std::string& strAccount);
216 void ListAccountCreditDebit(const std::string& strAccount, std::list<CAccountingEntry>& acentries);
218 DBErrors ReorderTransactions(CWallet*);
219 DBErrors LoadWallet(CWallet* pwallet);
220 DBErrors FindWalletTx(CWallet* pwallet, std::vector<uint256>& vTxHash);
221 DBErrors ZapWalletTx(CWallet* pwallet);
223 static bool Recover(CDBEnv& dbenv, std::string filename, bool fOnlyKeys);
224 static bool Recover(CDBEnv& dbenv, std::string filename);
227 #endif // BITCOIN_WALLETDB_H