|
|
@ -14,6 +14,16 @@ class CWalletTx; |
|
|
|
class CReserveKey; |
|
|
|
class CReserveKey; |
|
|
|
class CWalletDB; |
|
|
|
class CWalletDB; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum WalletFeature |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
FEATURE_BASE = 10500, // the earliest version new wallets supports (only useful for getinfo's clientversion output)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FEATURE_WALLETCRYPT = 40000, // wallet encryption
|
|
|
|
|
|
|
|
FEATURE_COMPRPUBKEY = 60000, // compressed public keys
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FEATURE_LATEST = 60000 |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
// A CWallet is an extension of a keystore, which also maintains a set of
|
|
|
|
// A CWallet is an extension of a keystore, which also maintains a set of
|
|
|
|
// transactions and balances, and provides the ability to create new
|
|
|
|
// transactions and balances, and provides the ability to create new
|
|
|
|
// transactions
|
|
|
|
// transactions
|
|
|
@ -25,8 +35,12 @@ private: |
|
|
|
|
|
|
|
|
|
|
|
CWalletDB *pwalletdbEncryption; |
|
|
|
CWalletDB *pwalletdbEncryption; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// the current wallet version: clients below this version are not able to load the wallet
|
|
|
|
int nWalletVersion; |
|
|
|
int nWalletVersion; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// the maxmimum wallet format version: memory-only variable that specifies to what version this wallet may be upgraded
|
|
|
|
|
|
|
|
int nWalletMaxVersion; |
|
|
|
|
|
|
|
|
|
|
|
public: |
|
|
|
public: |
|
|
|
mutable CCriticalSection cs_wallet; |
|
|
|
mutable CCriticalSection cs_wallet; |
|
|
|
|
|
|
|
|
|
|
@ -42,14 +56,16 @@ public: |
|
|
|
|
|
|
|
|
|
|
|
CWallet() |
|
|
|
CWallet() |
|
|
|
{ |
|
|
|
{ |
|
|
|
nWalletVersion = 0; |
|
|
|
nWalletVersion = FEATURE_BASE; |
|
|
|
|
|
|
|
nWalletMaxVersion = FEATURE_BASE; |
|
|
|
fFileBacked = false; |
|
|
|
fFileBacked = false; |
|
|
|
nMasterKeyMaxID = 0; |
|
|
|
nMasterKeyMaxID = 0; |
|
|
|
pwalletdbEncryption = NULL; |
|
|
|
pwalletdbEncryption = NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
CWallet(std::string strWalletFileIn) |
|
|
|
CWallet(std::string strWalletFileIn) |
|
|
|
{ |
|
|
|
{ |
|
|
|
nWalletVersion = 0; |
|
|
|
nWalletVersion = FEATURE_BASE; |
|
|
|
|
|
|
|
nWalletMaxVersion = FEATURE_BASE; |
|
|
|
strWalletFile = strWalletFileIn; |
|
|
|
strWalletFile = strWalletFileIn; |
|
|
|
fFileBacked = true; |
|
|
|
fFileBacked = true; |
|
|
|
nMasterKeyMaxID = 0; |
|
|
|
nMasterKeyMaxID = 0; |
|
|
@ -65,6 +81,9 @@ public: |
|
|
|
|
|
|
|
|
|
|
|
std::vector<unsigned char> vchDefaultKey; |
|
|
|
std::vector<unsigned char> vchDefaultKey; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// check whether we are allowed to upgrade (or already support) to the named feature
|
|
|
|
|
|
|
|
bool CanSupportFeature(enum WalletFeature wf) { return nWalletMaxVersion >= wf; } |
|
|
|
|
|
|
|
|
|
|
|
// keystore implementation
|
|
|
|
// keystore implementation
|
|
|
|
// Generate a new key
|
|
|
|
// Generate a new key
|
|
|
|
std::vector<unsigned char> GenerateNewKey(); |
|
|
|
std::vector<unsigned char> GenerateNewKey(); |
|
|
@ -73,12 +92,12 @@ 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) { return CCryptoKeyStore::AddKey(key); } |
|
|
|
bool LoadKey(const CKey& key) { return CCryptoKeyStore::AddKey(key); } |
|
|
|
|
|
|
|
|
|
|
|
bool LoadMinVersion(int nVersion) { nWalletVersion = nVersion; return true; } |
|
|
|
bool LoadMinVersion(int nVersion) { nWalletVersion = nVersion; nWalletMaxVersion = std::max(nWalletMaxVersion, nVersion); return true; } |
|
|
|
|
|
|
|
|
|
|
|
// Adds an encrypted key to the store, and saves it to disk.
|
|
|
|
// Adds an encrypted key to the store, and saves it to disk.
|
|
|
|
bool AddCryptedKey(const std::vector<unsigned char> &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret); |
|
|
|
bool AddCryptedKey(const std::vector<unsigned char> &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret); |
|
|
|
// Adds an encrypted key to the store, without saving it to disk (used by LoadWallet)
|
|
|
|
// Adds an encrypted key to the store, without saving it to disk (used by LoadWallet)
|
|
|
|
bool LoadCryptedKey(const std::vector<unsigned char> &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret) { return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret); } |
|
|
|
bool LoadCryptedKey(const std::vector<unsigned char> &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret) { SetMinVersion(FEATURE_WALLETCRYPT); return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret); } |
|
|
|
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); } |
|
|
|
|
|
|
|
|
|
|
@ -216,7 +235,14 @@ public: |
|
|
|
|
|
|
|
|
|
|
|
bool SetDefaultKey(const std::vector<unsigned char> &vchPubKey); |
|
|
|
bool SetDefaultKey(const std::vector<unsigned char> &vchPubKey); |
|
|
|
|
|
|
|
|
|
|
|
bool SetMinVersion(int nVersion, CWalletDB* pwalletdbIn = NULL); |
|
|
|
// signify that a particular wallet feature is now used. this may change nWalletVersion and nWalletMaxVersion if those are lower
|
|
|
|
|
|
|
|
bool SetMinVersion(enum WalletFeature, CWalletDB* pwalletdbIn = NULL, bool fExplicit = false); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// change which version we're allowed to upgrade to (note that this does not immediately imply upgrading to that format)
|
|
|
|
|
|
|
|
bool SetMaxVersion(int nVersion); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// get the current wallet format (the oldest client version guaranteed to understand this wallet)
|
|
|
|
|
|
|
|
int GetVersion() { return nWalletVersion; } |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|