Merge pull request #864 from sipa/fix_856
Make compressed pubkeys require client >=0.5.99
This commit is contained in:
commit
3a4d81724e
@ -940,6 +940,7 @@ int CWalletDB::LoadWallet(CWallet* pwallet)
|
|||||||
ssValue >> nMinVersion;
|
ssValue >> nMinVersion;
|
||||||
if (nMinVersion > CLIENT_VERSION)
|
if (nMinVersion > CLIENT_VERSION)
|
||||||
return DB_TOO_NEW;
|
return DB_TOO_NEW;
|
||||||
|
pwallet->LoadMinVersion(nMinVersion);
|
||||||
}
|
}
|
||||||
else if (strType == "cscript")
|
else if (strType == "cscript")
|
||||||
{
|
{
|
||||||
|
5
src/db.h
5
src/db.h
@ -486,6 +486,11 @@ public:
|
|||||||
return Write(std::make_pair(std::string("setting"), strKey), value);
|
return Write(std::make_pair(std::string("setting"), strKey), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool WriteMinVersion(int nVersion)
|
||||||
|
{
|
||||||
|
return Write(std::string("minversion"), nVersion);
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
bool WriteAccountingEntry(const CAccountingEntry& acentry);
|
bool WriteAccountingEntry(const CAccountingEntry& acentry);
|
||||||
|
@ -114,7 +114,7 @@ public:
|
|||||||
return fCompressedPubKey;
|
return fCompressedPubKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MakeNewKey(bool fCompressed = true)
|
void MakeNewKey(bool fCompressed)
|
||||||
{
|
{
|
||||||
if (!EC_KEY_generate_key(pkey))
|
if (!EC_KEY_generate_key(pkey))
|
||||||
throw key_error("CKey::MakeNewKey() : EC_KEY_generate_key failed");
|
throw key_error("CKey::MakeNewKey() : EC_KEY_generate_key failed");
|
||||||
|
@ -8,16 +8,6 @@
|
|||||||
#include "db.h"
|
#include "db.h"
|
||||||
#include "script.h"
|
#include "script.h"
|
||||||
|
|
||||||
std::vector<unsigned char> CKeyStore::GenerateNewKey()
|
|
||||||
{
|
|
||||||
RandAddSeedPerfmon();
|
|
||||||
CKey key;
|
|
||||||
key.MakeNewKey();
|
|
||||||
if (!AddKey(key))
|
|
||||||
throw std::runtime_error("CKeyStore::GenerateNewKey() : AddKey failed");
|
|
||||||
return key.GetPubKey();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CKeyStore::GetPubKey(const CBitcoinAddress &address, std::vector<unsigned char> &vchPubKeyOut) const
|
bool CKeyStore::GetPubKey(const CBitcoinAddress &address, std::vector<unsigned char> &vchPubKeyOut) const
|
||||||
{
|
{
|
||||||
CKey key;
|
CKey key;
|
||||||
|
@ -29,8 +29,6 @@ public:
|
|||||||
virtual bool HaveCScript(const uint160 &hash) const =0;
|
virtual bool HaveCScript(const uint160 &hash) const =0;
|
||||||
virtual bool GetCScript(const uint160 &hash, CScript& redeemScriptOut) const =0;
|
virtual bool GetCScript(const uint160 &hash, CScript& redeemScriptOut) const =0;
|
||||||
|
|
||||||
// Generate a new key, and add it to the store
|
|
||||||
virtual std::vector<unsigned char> GenerateNewKey();
|
|
||||||
virtual bool GetSecret(const CBitcoinAddress &address, CSecret& vchSecret, bool &fCompressed) const
|
virtual bool GetSecret(const CBitcoinAddress &address, CSecret& vchSecret, bool &fCompressed) const
|
||||||
{
|
{
|
||||||
CKey key;
|
CKey key;
|
||||||
|
@ -15,6 +15,23 @@ using namespace std;
|
|||||||
// mapWallet
|
// mapWallet
|
||||||
//
|
//
|
||||||
|
|
||||||
|
std::vector<unsigned char> CWallet::GenerateNewKey()
|
||||||
|
{
|
||||||
|
bool fCompressed = true; // default to compressed public keys
|
||||||
|
|
||||||
|
RandAddSeedPerfmon();
|
||||||
|
CKey key;
|
||||||
|
key.MakeNewKey(fCompressed);
|
||||||
|
|
||||||
|
// Compressed public keys were introduced in version 0.6.0
|
||||||
|
if (fCompressed)
|
||||||
|
SetMinVersion(59900);
|
||||||
|
|
||||||
|
if (!AddKey(key))
|
||||||
|
throw std::runtime_error("CWallet::GenerateNewKey() : AddKey failed");
|
||||||
|
return key.GetPubKey();
|
||||||
|
}
|
||||||
|
|
||||||
bool CWallet::AddKey(const CKey& key)
|
bool CWallet::AddKey(const CKey& key)
|
||||||
{
|
{
|
||||||
if (!CCryptoKeyStore::AddKey(key))
|
if (!CCryptoKeyStore::AddKey(key))
|
||||||
@ -131,6 +148,32 @@ public:
|
|||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool CWallet::SetMinVersion(int nVersion, CWalletDB* pwalletdbIn)
|
||||||
|
{
|
||||||
|
if (nWalletVersion >= nVersion)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
nWalletVersion = nVersion;
|
||||||
|
|
||||||
|
if (fFileBacked)
|
||||||
|
{
|
||||||
|
CWalletDB* pwalletdb = pwalletdbIn ? pwalletdbIn : new CWalletDB(strWalletFile);
|
||||||
|
if (nWalletVersion >= 40000)
|
||||||
|
{
|
||||||
|
// Versions prior to 0.4.0 did not support the "minversion" record.
|
||||||
|
// Use a CCorruptAddress to make them crash instead.
|
||||||
|
CCorruptAddress corruptAddress;
|
||||||
|
pwalletdb->WriteSetting("addrIncoming", corruptAddress);
|
||||||
|
}
|
||||||
|
if (nWalletVersion > 40000)
|
||||||
|
pwalletdb->WriteMinVersion(nWalletVersion);
|
||||||
|
if (!pwalletdbIn)
|
||||||
|
delete pwalletdb;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
|
bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
|
||||||
{
|
{
|
||||||
if (IsCrypted())
|
if (IsCrypted())
|
||||||
@ -184,10 +227,11 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
|
|||||||
exit(1); //We now probably have half of our keys encrypted in memory, and half not...die and let the user reload their unencrypted wallet.
|
exit(1); //We now probably have half of our keys encrypted in memory, and half not...die and let the user reload their unencrypted wallet.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Encryption was introduced in version 0.4.0
|
||||||
|
SetMinVersion(40000, pwalletdbEncryption);
|
||||||
|
|
||||||
if (fFileBacked)
|
if (fFileBacked)
|
||||||
{
|
{
|
||||||
CCorruptAddress corruptAddress;
|
|
||||||
pwalletdbEncryption->WriteSetting("addrIncoming", corruptAddress);
|
|
||||||
if (!pwalletdbEncryption->TxnCommit())
|
if (!pwalletdbEncryption->TxnCommit())
|
||||||
exit(1); //We now have keys encrypted in memory, but no on disk...die to avoid confusion and let the user reload their unencrypted wallet.
|
exit(1); //We now have keys encrypted in memory, but no on disk...die to avoid confusion and let the user reload their unencrypted wallet.
|
||||||
|
|
||||||
|
11
src/wallet.h
11
src/wallet.h
@ -25,6 +25,8 @@ private:
|
|||||||
|
|
||||||
CWalletDB *pwalletdbEncryption;
|
CWalletDB *pwalletdbEncryption;
|
||||||
|
|
||||||
|
int nWalletVersion;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
mutable CCriticalSection cs_wallet;
|
mutable CCriticalSection cs_wallet;
|
||||||
|
|
||||||
@ -33,18 +35,21 @@ public:
|
|||||||
|
|
||||||
std::set<int64> setKeyPool;
|
std::set<int64> setKeyPool;
|
||||||
|
|
||||||
|
|
||||||
typedef std::map<unsigned int, CMasterKey> MasterKeyMap;
|
typedef std::map<unsigned int, CMasterKey> MasterKeyMap;
|
||||||
MasterKeyMap mapMasterKeys;
|
MasterKeyMap mapMasterKeys;
|
||||||
unsigned int nMasterKeyMaxID;
|
unsigned int nMasterKeyMaxID;
|
||||||
|
|
||||||
CWallet()
|
CWallet()
|
||||||
{
|
{
|
||||||
|
nWalletVersion = 0;
|
||||||
fFileBacked = false;
|
fFileBacked = false;
|
||||||
nMasterKeyMaxID = 0;
|
nMasterKeyMaxID = 0;
|
||||||
pwalletdbEncryption = NULL;
|
pwalletdbEncryption = NULL;
|
||||||
}
|
}
|
||||||
CWallet(std::string strWalletFileIn)
|
CWallet(std::string strWalletFileIn)
|
||||||
{
|
{
|
||||||
|
nWalletVersion = 0;
|
||||||
strWalletFile = strWalletFileIn;
|
strWalletFile = strWalletFileIn;
|
||||||
fFileBacked = true;
|
fFileBacked = true;
|
||||||
nMasterKeyMaxID = 0;
|
nMasterKeyMaxID = 0;
|
||||||
@ -61,11 +66,15 @@ public:
|
|||||||
std::vector<unsigned char> vchDefaultKey;
|
std::vector<unsigned char> vchDefaultKey;
|
||||||
|
|
||||||
// keystore implementation
|
// keystore implementation
|
||||||
|
// Generate a new key
|
||||||
|
std::vector<unsigned char> GenerateNewKey();
|
||||||
// Adds a key to the store, and saves it to disk.
|
// Adds a key to the store, and saves it to disk.
|
||||||
bool AddKey(const CKey& key);
|
bool AddKey(const CKey& key);
|
||||||
// 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; }
|
||||||
|
|
||||||
// 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)
|
||||||
@ -206,6 +215,8 @@ public:
|
|||||||
bool GetTransaction(const uint256 &hashTx, CWalletTx& wtx);
|
bool GetTransaction(const uint256 &hashTx, CWalletTx& wtx);
|
||||||
|
|
||||||
bool SetDefaultKey(const std::vector<unsigned char> &vchPubKey);
|
bool SetDefaultKey(const std::vector<unsigned char> &vchPubKey);
|
||||||
|
|
||||||
|
bool SetMinVersion(int nVersion, CWalletDB* pwalletdbIn = NULL);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user