aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2012-02-19 18:21:19 -0800
committerPieter Wuille <pieter.wuille@gmail.com>2012-02-19 18:21:19 -0800
commit3a4d81724e873f967b74759d539e05c73f95aeeb (patch)
tree64ccc448dbcaa00058538fd01e489a01a13cc41b
parent49355d999303cf93df68ee63ef6ee32bcf4890d2 (diff)
parent38067c18f8b54c7121643fa3291ffe81b6eefef1 (diff)
downloadbitcoin-3a4d81724e873f967b74759d539e05c73f95aeeb.tar.xz
Merge pull request #864 from sipa/fix_856
Make compressed pubkeys require client >=0.5.99
-rw-r--r--src/db.cpp1
-rw-r--r--src/db.h5
-rw-r--r--src/key.h2
-rw-r--r--src/keystore.cpp10
-rw-r--r--src/keystore.h2
-rw-r--r--src/wallet.cpp48
-rw-r--r--src/wallet.h11
7 files changed, 64 insertions, 15 deletions
diff --git a/src/db.cpp b/src/db.cpp
index 9a904ec2e0..ea6d46a6e5 100644
--- a/src/db.cpp
+++ b/src/db.cpp
@@ -940,6 +940,7 @@ int CWalletDB::LoadWallet(CWallet* pwallet)
ssValue >> nMinVersion;
if (nMinVersion > CLIENT_VERSION)
return DB_TOO_NEW;
+ pwallet->LoadMinVersion(nMinVersion);
}
else if (strType == "cscript")
{
diff --git a/src/db.h b/src/db.h
index 27479fef0e..2611faa461 100644
--- a/src/db.h
+++ b/src/db.h
@@ -486,6 +486,11 @@ public:
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 WriteAccount(const std::string& strAccount, const CAccount& account);
bool WriteAccountingEntry(const CAccountingEntry& acentry);
diff --git a/src/key.h b/src/key.h
index a57143b7d9..4058f115fd 100644
--- a/src/key.h
+++ b/src/key.h
@@ -114,7 +114,7 @@ public:
return fCompressedPubKey;
}
- void MakeNewKey(bool fCompressed = true)
+ void MakeNewKey(bool fCompressed)
{
if (!EC_KEY_generate_key(pkey))
throw key_error("CKey::MakeNewKey() : EC_KEY_generate_key failed");
diff --git a/src/keystore.cpp b/src/keystore.cpp
index 18e5c377dc..e76f7790f1 100644
--- a/src/keystore.cpp
+++ b/src/keystore.cpp
@@ -8,16 +8,6 @@
#include "db.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
{
CKey key;
diff --git a/src/keystore.h b/src/keystore.h
index 7eea02def3..6757834bd8 100644
--- a/src/keystore.h
+++ b/src/keystore.h
@@ -29,8 +29,6 @@ public:
virtual bool HaveCScript(const uint160 &hash) 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
{
CKey key;
diff --git a/src/wallet.cpp b/src/wallet.cpp
index 9d80f8afef..30590c80e6 100644
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -15,6 +15,23 @@ using namespace std;
// 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)
{
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)
{
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.
}
+ // Encryption was introduced in version 0.4.0
+ SetMinVersion(40000, pwalletdbEncryption);
+
if (fFileBacked)
{
- CCorruptAddress corruptAddress;
- pwalletdbEncryption->WriteSetting("addrIncoming", corruptAddress);
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.
diff --git a/src/wallet.h b/src/wallet.h
index 3fdef50c03..fea3297788 100644
--- a/src/wallet.h
+++ b/src/wallet.h
@@ -25,6 +25,8 @@ private:
CWalletDB *pwalletdbEncryption;
+ int nWalletVersion;
+
public:
mutable CCriticalSection cs_wallet;
@@ -33,18 +35,21 @@ public:
std::set<int64> setKeyPool;
+
typedef std::map<unsigned int, CMasterKey> MasterKeyMap;
MasterKeyMap mapMasterKeys;
unsigned int nMasterKeyMaxID;
CWallet()
{
+ nWalletVersion = 0;
fFileBacked = false;
nMasterKeyMaxID = 0;
pwalletdbEncryption = NULL;
}
CWallet(std::string strWalletFileIn)
{
+ nWalletVersion = 0;
strWalletFile = strWalletFileIn;
fFileBacked = true;
nMasterKeyMaxID = 0;
@@ -61,11 +66,15 @@ public:
std::vector<unsigned char> vchDefaultKey;
// keystore implementation
+ // Generate a new key
+ std::vector<unsigned char> GenerateNewKey();
// Adds a key to the store, and saves it to disk.
bool AddKey(const CKey& key);
// Adds a key to the store, without saving it to disk (used by LoadWallet)
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.
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)
@@ -206,6 +215,8 @@ public:
bool GetTransaction(const uint256 &hashTx, CWalletTx& wtx);
bool SetDefaultKey(const std::vector<unsigned char> &vchPubKey);
+
+ bool SetMinVersion(int nVersion, CWalletDB* pwalletdbIn = NULL);
};