annotate src/wallet.cpp @ 1228:175b23373bd3 draft

Merge branch 'master' of https://github.com/bitcoin/bitcoin Conflicts: src/script.cpp
author Wladimir J. van der Laan <laanwj@gmail.com>
date Wed, 27 Jul 2011 21:44:55 +0200
parents e69e63528ec2 c418a20d8590
children eea709595ed2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1 // Copyright (c) 2009-2011 Satoshi Nakamoto & Bitcoin developers
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
2 // Distributed under the MIT/X11 software license, see the accompanying
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
3 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
4
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
5 #include "headers.h"
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
6 #include "db.h"
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
7 #include "cryptopp/sha.h"
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
8 #include "crypter.h"
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
9
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
10 using namespace std;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
11
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
12
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
13 //////////////////////////////////////////////////////////////////////////////
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
14 //
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
15 // mapWallet
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
16 //
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
17
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
18 bool CWallet::AddKey(const CKey& key)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
19 {
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
20 if (!CCryptoKeyStore::AddKey(key))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
21 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
22 if (!fFileBacked)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
23 return true;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
24 if (!IsCrypted())
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
25 return CWalletDB(strWalletFile).WriteKey(key.GetPubKey(), key.GetPrivKey());
790
0ee16077a30b fix warning: control reaches end of non-void function [-Wreturn-type]
Giel van Schijndel <me@mortis.eu>
parents: 783
diff changeset
26 return true;
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
27 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
28
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
29 bool CWallet::AddCryptedKey(const vector<unsigned char> &vchPubKey, const vector<unsigned char> &vchCryptedSecret)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
30 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
31 if (!CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret))
757
ee9183806240 Prepare codebase for Encrypted Keys.
Pieter Wuille <pieter.wuille@gmail.com>
parents: 743
diff changeset
32 return false;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
33 if (!fFileBacked)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
34 return true;
767
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
35 CRITICAL_BLOCK(cs_pwalletdbEncryption)
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
36 {
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
37 if (pwalletdbEncryption)
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
38 return pwalletdbEncryption->WriteCryptedKey(vchPubKey, vchCryptedSecret);
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
39 else
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
40 return CWalletDB(strWalletFile).WriteCryptedKey(vchPubKey, vchCryptedSecret);
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
41 }
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
42 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
43
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
44 bool CWallet::Unlock(const string& strWalletPassphrase)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
45 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
46 CRITICAL_BLOCK(cs_vMasterKey)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
47 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
48 if (!IsLocked())
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
49 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
50
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
51 CCrypter crypter;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
52 CKeyingMaterial vMasterKey;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
53
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
54 BOOST_FOREACH(const MasterKeyMap::value_type& pMasterKey, mapMasterKeys)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
55 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
56 if(!crypter.SetKeyFromPassphrase(strWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
57 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
58 if (!crypter.Decrypt(pMasterKey.second.vchCryptedKey, vMasterKey))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
59 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
60 if (CCryptoKeyStore::Unlock(vMasterKey))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
61 return true;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
62 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
63 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
64 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
65 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
66
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
67 bool CWallet::ChangeWalletPassphrase(const string& strOldWalletPassphrase, const string& strNewWalletPassphrase)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
68 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
69 CRITICAL_BLOCK(cs_vMasterKey)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
70 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
71 bool fWasLocked = IsLocked();
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
72
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
73 Lock();
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
74
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
75 CCrypter crypter;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
76 CKeyingMaterial vMasterKey;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
77 BOOST_FOREACH(MasterKeyMap::value_type& pMasterKey, mapMasterKeys)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
78 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
79 if(!crypter.SetKeyFromPassphrase(strOldWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
80 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
81 if(!crypter.Decrypt(pMasterKey.second.vchCryptedKey, vMasterKey))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
82 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
83 if (CCryptoKeyStore::Unlock(vMasterKey))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
84 {
761
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
85 int64 nStartTime = GetTimeMillis();
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
86 crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod);
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
87 pMasterKey.second.nDeriveIterations = pMasterKey.second.nDeriveIterations * (100 / ((double)(GetTimeMillis() - nStartTime)));
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
88
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
89 nStartTime = GetTimeMillis();
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
90 crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod);
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
91 pMasterKey.second.nDeriveIterations = (pMasterKey.second.nDeriveIterations + pMasterKey.second.nDeriveIterations * 100 / ((double)(GetTimeMillis() - nStartTime))) / 2;
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
92
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
93 if (pMasterKey.second.nDeriveIterations < 25000)
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
94 pMasterKey.second.nDeriveIterations = 25000;
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
95
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
96 printf("Wallet passphrase changed to an nDeriveIterations of %i\n", pMasterKey.second.nDeriveIterations);
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
97
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
98 if (!crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
99 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
100 if (!crypter.Encrypt(vMasterKey, pMasterKey.second.vchCryptedKey))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
101 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
102 CWalletDB(strWalletFile).WriteMasterKey(pMasterKey.first, pMasterKey.second);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
103 if (fWasLocked)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
104 Lock();
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
105 return true;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
106 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
107 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
108 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
109 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
110 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
111
768
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
112
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
113 // This class implements an addrIncoming entry that causes pre-0.4
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
114 // clients to crash on startup if reading a private-key-encrypted wallet.
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
115 class CCorruptAddress
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
116 {
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
117 public:
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
118 IMPLEMENT_SERIALIZE
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
119 (
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
120 if (nType & SER_DISK)
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
121 READWRITE(nVersion);
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
122 )
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
123 };
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
124
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
125 bool CWallet::EncryptWallet(const string& strWalletPassphrase)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
126 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
127 CRITICAL_BLOCK(cs_KeyStore)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
128 CRITICAL_BLOCK(cs_vMasterKey)
767
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
129 CRITICAL_BLOCK(cs_pwalletdbEncryption)
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
130 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
131 if (IsCrypted())
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
132 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
133
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
134 CKeyingMaterial vMasterKey;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
135 RandAddSeedPerfmon();
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
136
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
137 vMasterKey.resize(WALLET_CRYPTO_KEY_SIZE);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
138 RAND_bytes(&vMasterKey[0], WALLET_CRYPTO_KEY_SIZE);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
139
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
140 CMasterKey kMasterKey;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
141
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
142 RandAddSeedPerfmon();
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
143 kMasterKey.vchSalt.resize(WALLET_CRYPTO_SALT_SIZE);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
144 RAND_bytes(&kMasterKey.vchSalt[0], WALLET_CRYPTO_SALT_SIZE);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
145
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
146 CCrypter crypter;
761
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
147 int64 nStartTime = GetTimeMillis();
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
148 crypter.SetKeyFromPassphrase(strWalletPassphrase, kMasterKey.vchSalt, 25000, kMasterKey.nDerivationMethod);
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
149 kMasterKey.nDeriveIterations = 2500000 / ((double)(GetTimeMillis() - nStartTime));
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
150
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
151 nStartTime = GetTimeMillis();
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
152 crypter.SetKeyFromPassphrase(strWalletPassphrase, kMasterKey.vchSalt, kMasterKey.nDeriveIterations, kMasterKey.nDerivationMethod);
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
153 kMasterKey.nDeriveIterations = (kMasterKey.nDeriveIterations + kMasterKey.nDeriveIterations * 100 / ((double)(GetTimeMillis() - nStartTime))) / 2;
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
154
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
155 if (kMasterKey.nDeriveIterations < 25000)
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
156 kMasterKey.nDeriveIterations = 25000;
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
157
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
158 printf("Encrypting Wallet with an nDeriveIterations of %i\n", kMasterKey.nDeriveIterations);
0fe6de71faba Set the number of SHA512 rounds based on the speed of the computer.
Matt Corallo <matt@bluematt.me>
parents: 760
diff changeset
159
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
160 if (!crypter.SetKeyFromPassphrase(strWalletPassphrase, kMasterKey.vchSalt, kMasterKey.nDeriveIterations, kMasterKey.nDerivationMethod))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
161 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
162 if (!crypter.Encrypt(vMasterKey, kMasterKey.vchCryptedKey))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
163 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
164
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
165 mapMasterKeys[++nMasterKeyMaxID] = kMasterKey;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
166 if (fFileBacked)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
167 {
767
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
168 pwalletdbEncryption = new CWalletDB(strWalletFile);
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
169 pwalletdbEncryption->TxnBegin();
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
170 pwalletdbEncryption->WriteMasterKey(nMasterKeyMaxID, kMasterKey);
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
171 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
172
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
173 if (!EncryptKeys(vMasterKey))
767
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
174 {
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
175 if (fFileBacked)
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
176 pwalletdbEncryption->TxnAbort();
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
177 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.
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
178 }
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
179
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
180 if (fFileBacked)
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
181 {
768
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
182 CCorruptAddress corruptAddress;
84a79a23302f Make an invalid addrIncoming so that old clients crash.
Matt Corallo <matt@bluematt.me>
parents: 767
diff changeset
183 pwalletdbEncryption->WriteSetting("addrIncoming", corruptAddress);
767
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
184 if (!pwalletdbEncryption->TxnCommit())
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
185 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.
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
186
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
187 pwalletdbEncryption->Close();
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
188 pwalletdbEncryption = NULL;
9b2d0acaeee2 Use DB Transactions when encrypting wallet.
Matt Corallo <matt@bluematt.me>
parents: 761
diff changeset
189 }
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
190
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
191 Lock();
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
192 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
193 return true;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
194 }
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
195
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
196 void CWallet::WalletUpdateSpent(const CTransaction &tx)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
197 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
198 // Anytime a signature is successfully verified, it's proof the outpoint is spent.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
199 // Update the wallet spent flag if it doesn't know due to wallet.dat being
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
200 // restored from backup or the user making copies of wallet.dat.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
201 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
202 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
203 BOOST_FOREACH(const CTxIn& txin, tx.vin)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
204 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
205 map<uint256, CWalletTx>::iterator mi = mapWallet.find(txin.prevout.hash);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
206 if (mi != mapWallet.end())
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
207 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
208 CWalletTx& wtx = (*mi).second;
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
209 if (!wtx.IsSpent(txin.prevout.n) && IsMine(wtx.vout[txin.prevout.n]))
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
210 {
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
211 printf("WalletUpdateSpent found spent coin %sbc %s\n", FormatMoney(wtx.GetCredit()).c_str(), wtx.GetHash().ToString().c_str());
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
212 wtx.MarkSpent(txin.prevout.n);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
213 wtx.WriteToDisk();
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
214 vWalletUpdated.push_back(txin.prevout.hash);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
215 }
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
216 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
217 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
218 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
219 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
220
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
221 bool CWallet::AddToWallet(const CWalletTx& wtxIn)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
222 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
223 uint256 hash = wtxIn.GetHash();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
224 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
225 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
226 // Inserts only if not already there, returns tx inserted or tx found
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
227 pair<map<uint256, CWalletTx>::iterator, bool> ret = mapWallet.insert(make_pair(hash, wtxIn));
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
228 CWalletTx& wtx = (*ret.first).second;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
229 wtx.pwallet = this;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
230 bool fInsertedNew = ret.second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
231 if (fInsertedNew)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
232 wtx.nTimeReceived = GetAdjustedTime();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
233
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
234 bool fUpdated = false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
235 if (!fInsertedNew)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
236 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
237 // Merge
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
238 if (wtxIn.hashBlock != 0 && wtxIn.hashBlock != wtx.hashBlock)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
239 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
240 wtx.hashBlock = wtxIn.hashBlock;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
241 fUpdated = true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
242 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
243 if (wtxIn.nIndex != -1 && (wtxIn.vMerkleBranch != wtx.vMerkleBranch || wtxIn.nIndex != wtx.nIndex))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
244 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
245 wtx.vMerkleBranch = wtxIn.vMerkleBranch;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
246 wtx.nIndex = wtxIn.nIndex;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
247 fUpdated = true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
248 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
249 if (wtxIn.fFromMe && wtxIn.fFromMe != wtx.fFromMe)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
250 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
251 wtx.fFromMe = wtxIn.fFromMe;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
252 fUpdated = true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
253 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
254 fUpdated |= wtx.UpdateSpent(wtxIn.vfSpent);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
255 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
256
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
257 //// debug print
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
258 printf("AddToWallet %s %s%s\n", wtxIn.GetHash().ToString().substr(0,10).c_str(), (fInsertedNew ? "new" : ""), (fUpdated ? "update" : ""));
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
259
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
260 // Write to disk
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
261 if (fInsertedNew || fUpdated)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
262 if (!wtx.WriteToDisk())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
263 return false;
1181
855f1d50bed7 temp patch for qtui
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 743
diff changeset
264 #ifndef QT_GUI
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
265 // If default receiving address gets used, replace it with a new one
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
266 CScript scriptDefaultKey;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
267 scriptDefaultKey.SetBitcoinAddress(vchDefaultKey);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
268 BOOST_FOREACH(const CTxOut& txout, wtx.vout)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
269 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
270 if (txout.scriptPubKey == scriptDefaultKey)
786
90bdcdffb1dc Bugfix: add autogenerated addresses to address book
Pieter Wuille <pieter.wuille@gmail.com>
parents: 783
diff changeset
271 {
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
272 SetDefaultKey(GetOrReuseKeyFromPool());
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
273 SetAddressBookName(CBitcoinAddress(vchDefaultKey), "");
786
90bdcdffb1dc Bugfix: add autogenerated addresses to address book
Pieter Wuille <pieter.wuille@gmail.com>
parents: 783
diff changeset
274 }
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
275 }
1181
855f1d50bed7 temp patch for qtui
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 743
diff changeset
276 #endif
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
277 // Notify UI
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
278 vWalletUpdated.push_back(hash);
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
279
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
280 // since AddToWallet is called directly for self-originating transactions, check for consumption of own coins
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
281 WalletUpdateSpent(wtx);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
282 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
283
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
284 // Refresh UI
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
285 MainFrameRepaint();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
286 return true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
287 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
288
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
289 bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
290 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
291 uint256 hash = tx.GetHash();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
292 bool fExisted = mapWallet.count(hash);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
293 if (fExisted && !fUpdate) return false;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
294 if (fExisted || IsMine(tx) || IsFromMe(tx))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
295 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
296 CWalletTx wtx(this,tx);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
297 // Get merkle branch if transaction was found in a block
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
298 if (pblock)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
299 wtx.SetMerkleBranch(pblock);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
300 return AddToWallet(wtx);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
301 }
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
302 else
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
303 WalletUpdateSpent(tx);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
304 return false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
305 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
306
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
307 bool CWallet::EraseFromWallet(uint256 hash)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
308 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
309 if (!fFileBacked)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
310 return false;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
311 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
312 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
313 if (mapWallet.erase(hash))
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
314 CWalletDB(strWalletFile).EraseTx(hash);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
315 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
316 return true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
317 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
318
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
319
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
320 bool CWallet::IsMine(const CTxIn &txin) const
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
321 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
322 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
323 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
324 map<uint256, CWalletTx>::const_iterator mi = mapWallet.find(txin.prevout.hash);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
325 if (mi != mapWallet.end())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
326 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
327 const CWalletTx& prev = (*mi).second;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
328 if (txin.prevout.n < prev.vout.size())
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
329 if (IsMine(prev.vout[txin.prevout.n]))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
330 return true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
331 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
332 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
333 return false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
334 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
335
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
336 int64 CWallet::GetDebit(const CTxIn &txin) const
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
337 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
338 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
339 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
340 map<uint256, CWalletTx>::const_iterator mi = mapWallet.find(txin.prevout.hash);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
341 if (mi != mapWallet.end())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
342 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
343 const CWalletTx& prev = (*mi).second;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
344 if (txin.prevout.n < prev.vout.size())
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
345 if (IsMine(prev.vout[txin.prevout.n]))
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
346 return prev.vout[txin.prevout.n].nValue;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
347 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
348 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
349 return 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
350 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
351
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
352 int64 CWalletTx::GetTxTime() const
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
353 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
354 if (!fTimeReceivedIsTxTime && hashBlock != 0)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
355 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
356 // If we did not receive the transaction directly, we rely on the block's
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
357 // time to figure out when it happened. We use the median over a range
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
358 // of blocks to try to filter out inaccurate block times.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
359 map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
360 if (mi != mapBlockIndex.end())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
361 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
362 CBlockIndex* pindex = (*mi).second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
363 if (pindex)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
364 return pindex->GetMedianTime();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
365 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
366 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
367 return nTimeReceived;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
368 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
369
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
370 int CWalletTx::GetRequestCount() const
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
371 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
372 // Returns -1 if it wasn't being tracked
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
373 int nRequests = -1;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
374 CRITICAL_BLOCK(pwallet->cs_mapRequestCount)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
375 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
376 if (IsCoinBase())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
377 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
378 // Generated block
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
379 if (hashBlock != 0)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
380 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
381 map<uint256, int>::const_iterator mi = pwallet->mapRequestCount.find(hashBlock);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
382 if (mi != pwallet->mapRequestCount.end())
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
383 nRequests = (*mi).second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
384 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
385 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
386 else
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
387 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
388 // Did anyone request this transaction?
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
389 map<uint256, int>::const_iterator mi = pwallet->mapRequestCount.find(GetHash());
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
390 if (mi != pwallet->mapRequestCount.end())
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
391 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
392 nRequests = (*mi).second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
393
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
394 // How about the block it's in?
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
395 if (nRequests == 0 && hashBlock != 0)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
396 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
397 map<uint256, int>::const_iterator mi = pwallet->mapRequestCount.find(hashBlock);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
398 if (mi != pwallet->mapRequestCount.end())
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
399 nRequests = (*mi).second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
400 else
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
401 nRequests = 1; // If it's in someone else's block it must have got out
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
402 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
403 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
404 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
405 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
406 return nRequests;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
407 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
408
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
409 void CWalletTx::GetAmounts(int64& nGeneratedImmature, int64& nGeneratedMature, list<pair<CBitcoinAddress, int64> >& listReceived,
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
410 list<pair<CBitcoinAddress, int64> >& listSent, int64& nFee, string& strSentAccount) const
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
411 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
412 nGeneratedImmature = nGeneratedMature = nFee = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
413 listReceived.clear();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
414 listSent.clear();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
415 strSentAccount = strFromAccount;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
416
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
417 if (IsCoinBase())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
418 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
419 if (GetBlocksToMaturity() > 0)
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
420 nGeneratedImmature = pwallet->GetCredit(*this);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
421 else
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
422 nGeneratedMature = GetCredit();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
423 return;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
424 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
425
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
426 // Compute fee:
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
427 int64 nDebit = GetDebit();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
428 if (nDebit > 0) // debit>0 means we signed/sent this transaction
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
429 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
430 int64 nValueOut = GetValueOut();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
431 nFee = nDebit - nValueOut;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
432 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
433
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
434 // Sent/received. Standard client will never generate a send-to-multiple-recipients,
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
435 // but non-standard clients might (so return a list of address/amount pairs)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
436 BOOST_FOREACH(const CTxOut& txout, vout)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
437 {
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
438 CBitcoinAddress address;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
439 vector<unsigned char> vchPubKey;
827
c418a20d8590 Bugfix: don't overuse limited ExtractAddress
Pieter Wuille <pieter.wuille@gmail.com>
parents: 824
diff changeset
440 if (!ExtractAddress(txout.scriptPubKey, NULL, address))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
441 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
442 printf("CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n",
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
443 this->GetHash().ToString().c_str());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
444 address = " unknown ";
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
445 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
446
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
447 // Don't report 'change' txouts
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
448 if (nDebit > 0 && pwallet->IsChange(txout))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
449 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
450
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
451 if (nDebit > 0)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
452 listSent.push_back(make_pair(address, txout.nValue));
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
453
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
454 if (pwallet->IsMine(txout))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
455 listReceived.push_back(make_pair(address, txout.nValue));
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
456 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
457
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
458 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
459
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
460 void CWalletTx::GetAccountAmounts(const string& strAccount, int64& nGenerated, int64& nReceived,
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
461 int64& nSent, int64& nFee) const
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
462 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
463 nGenerated = nReceived = nSent = nFee = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
464
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
465 int64 allGeneratedImmature, allGeneratedMature, allFee;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
466 allGeneratedImmature = allGeneratedMature = allFee = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
467 string strSentAccount;
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
468 list<pair<CBitcoinAddress, int64> > listReceived;
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
469 list<pair<CBitcoinAddress, int64> > listSent;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
470 GetAmounts(allGeneratedImmature, allGeneratedMature, listReceived, listSent, allFee, strSentAccount);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
471
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
472 if (strAccount == "")
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
473 nGenerated = allGeneratedMature;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
474 if (strAccount == strSentAccount)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
475 {
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
476 BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64)& s, listSent)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
477 nSent += s.second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
478 nFee = allFee;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
479 }
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
480 CRITICAL_BLOCK(pwallet->cs_mapAddressBook)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
481 {
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
482 BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64)& r, listReceived)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
483 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
484 if (pwallet->mapAddressBook.count(r.first))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
485 {
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
486 map<CBitcoinAddress, string>::const_iterator mi = pwallet->mapAddressBook.find(r.first);
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
487 if (mi != pwallet->mapAddressBook.end() && (*mi).second == strAccount)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
488 nReceived += r.second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
489 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
490 else if (strAccount.empty())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
491 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
492 nReceived += r.second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
493 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
494 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
495 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
496 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
497
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
498 void CWalletTx::AddSupportingTransactions(CTxDB& txdb)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
499 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
500 vtxPrev.clear();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
501
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
502 const int COPY_DEPTH = 3;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
503 if (SetMerkleBranch() < COPY_DEPTH)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
504 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
505 vector<uint256> vWorkQueue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
506 BOOST_FOREACH(const CTxIn& txin, vin)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
507 vWorkQueue.push_back(txin.prevout.hash);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
508
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
509 // This critsect is OK because txdb is already open
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
510 CRITICAL_BLOCK(pwallet->cs_mapWallet)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
511 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
512 map<uint256, const CMerkleTx*> mapWalletPrev;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
513 set<uint256> setAlreadyDone;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
514 for (int i = 0; i < vWorkQueue.size(); i++)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
515 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
516 uint256 hash = vWorkQueue[i];
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
517 if (setAlreadyDone.count(hash))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
518 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
519 setAlreadyDone.insert(hash);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
520
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
521 CMerkleTx tx;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
522 map<uint256, CWalletTx>::const_iterator mi = pwallet->mapWallet.find(hash);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
523 if (mi != pwallet->mapWallet.end())
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
524 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
525 tx = (*mi).second;
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
526 BOOST_FOREACH(const CMerkleTx& txWalletPrev, (*mi).second.vtxPrev)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
527 mapWalletPrev[txWalletPrev.GetHash()] = &txWalletPrev;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
528 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
529 else if (mapWalletPrev.count(hash))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
530 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
531 tx = *mapWalletPrev[hash];
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
532 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
533 else if (!fClient && txdb.ReadDiskTx(hash, tx))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
534 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
535 ;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
536 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
537 else
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
538 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
539 printf("ERROR: AddSupportingTransactions() : unsupported transaction\n");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
540 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
541 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
542
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
543 int nDepth = tx.SetMerkleBranch();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
544 vtxPrev.push_back(tx);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
545
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
546 if (nDepth < COPY_DEPTH)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
547 BOOST_FOREACH(const CTxIn& txin, tx.vin)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
548 vWorkQueue.push_back(txin.prevout.hash);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
549 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
550 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
551 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
552
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
553 reverse(vtxPrev.begin(), vtxPrev.end());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
554 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
555
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
556 bool CWalletTx::WriteToDisk()
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
557 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
558 return CWalletDB(pwallet->strWalletFile).WriteTx(GetHash(), *this);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
559 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
560
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
561 int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
562 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
563 int ret = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
564
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
565 CBlockIndex* pindex = pindexStart;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
566 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
567 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
568 while (pindex)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
569 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
570 CBlock block;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
571 block.ReadFromDisk(pindex, true);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
572 BOOST_FOREACH(CTransaction& tx, block.vtx)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
573 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
574 if (AddToWalletIfInvolvingMe(tx, &block, fUpdate))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
575 ret++;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
576 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
577 pindex = pindex->pnext;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
578 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
579 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
580 return ret;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
581 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
582
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
583 void CWallet::ReacceptWalletTransactions()
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
584 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
585 CTxDB txdb("r");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
586 bool fRepeat = true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
587 while (fRepeat) CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
588 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
589 fRepeat = false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
590 vector<CDiskTxPos> vMissingTx;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
591 BOOST_FOREACH(PAIRTYPE(const uint256, CWalletTx)& item, mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
592 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
593 CWalletTx& wtx = item.second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
594 if (wtx.IsCoinBase() && wtx.IsSpent(0))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
595 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
596
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
597 CTxIndex txindex;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
598 bool fUpdated = false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
599 if (txdb.ReadTxIndex(wtx.GetHash(), txindex))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
600 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
601 // Update fSpent if a tx got spent somewhere else by a copy of wallet.dat
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
602 if (txindex.vSpent.size() != wtx.vout.size())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
603 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
604 printf("ERROR: ReacceptWalletTransactions() : txindex.vSpent.size() %d != wtx.vout.size() %d\n", txindex.vSpent.size(), wtx.vout.size());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
605 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
606 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
607 for (int i = 0; i < txindex.vSpent.size(); i++)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
608 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
609 if (wtx.IsSpent(i))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
610 continue;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
611 if (!txindex.vSpent[i].IsNull() && IsMine(wtx.vout[i]))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
612 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
613 wtx.MarkSpent(i);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
614 fUpdated = true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
615 vMissingTx.push_back(txindex.vSpent[i]);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
616 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
617 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
618 if (fUpdated)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
619 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
620 printf("ReacceptWalletTransactions found spent coin %sbc %s\n", FormatMoney(wtx.GetCredit()).c_str(), wtx.GetHash().ToString().c_str());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
621 wtx.MarkDirty();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
622 wtx.WriteToDisk();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
623 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
624 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
625 else
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
626 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
627 // Reaccept any txes of ours that aren't already in a block
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
628 if (!wtx.IsCoinBase())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
629 wtx.AcceptWalletTransaction(txdb, false);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
630 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
631 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
632 if (!vMissingTx.empty())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
633 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
634 // TODO: optimize this to scan just part of the block chain?
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
635 if (ScanForWalletTransactions(pindexGenesisBlock))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
636 fRepeat = true; // Found missing transactions: re-do Reaccept.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
637 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
638 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
639 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
640
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
641 void CWalletTx::RelayWalletTransaction(CTxDB& txdb)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
642 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
643 BOOST_FOREACH(const CMerkleTx& tx, vtxPrev)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
644 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
645 if (!tx.IsCoinBase())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
646 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
647 uint256 hash = tx.GetHash();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
648 if (!txdb.ContainsTx(hash))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
649 RelayMessage(CInv(MSG_TX, hash), (CTransaction)tx);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
650 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
651 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
652 if (!IsCoinBase())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
653 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
654 uint256 hash = GetHash();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
655 if (!txdb.ContainsTx(hash))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
656 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
657 printf("Relaying wtx %s\n", hash.ToString().substr(0,10).c_str());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
658 RelayMessage(CInv(MSG_TX, hash), (CTransaction)*this);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
659 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
660 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
661 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
662
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
663 void CWalletTx::RelayWalletTransaction()
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
664 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
665 CTxDB txdb("r");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
666 RelayWalletTransaction(txdb);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
667 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
668
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
669 void CWallet::ResendWalletTransactions()
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
670 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
671 // Do this infrequently and randomly to avoid giving away
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
672 // that these are our transactions.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
673 static int64 nNextTime;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
674 if (GetTime() < nNextTime)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
675 return;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
676 bool fFirst = (nNextTime == 0);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
677 nNextTime = GetTime() + GetRand(30 * 60);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
678 if (fFirst)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
679 return;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
680
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
681 // Only do it if there's been a new block since last time
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
682 static int64 nLastTime;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
683 if (nTimeBestReceived < nLastTime)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
684 return;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
685 nLastTime = GetTime();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
686
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
687 // Rebroadcast any of our txes that aren't in a block yet
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
688 printf("ResendWalletTransactions()\n");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
689 CTxDB txdb("r");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
690 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
691 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
692 // Sort them in chronological order
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
693 multimap<unsigned int, CWalletTx*> mapSorted;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
694 BOOST_FOREACH(PAIRTYPE(const uint256, CWalletTx)& item, mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
695 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
696 CWalletTx& wtx = item.second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
697 // Don't rebroadcast until it's had plenty of time that
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
698 // it should have gotten in already by now.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
699 if (nTimeBestReceived - (int64)wtx.nTimeReceived > 5 * 60)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
700 mapSorted.insert(make_pair(wtx.nTimeReceived, &wtx));
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
701 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
702 BOOST_FOREACH(PAIRTYPE(const unsigned int, CWalletTx*)& item, mapSorted)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
703 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
704 CWalletTx& wtx = *item.second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
705 wtx.RelayWalletTransaction(txdb);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
706 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
707 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
708 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
709
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
710
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
711
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
712
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
713
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
714
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
715 //////////////////////////////////////////////////////////////////////////////
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
716 //
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
717 // Actions
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
718 //
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
719
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
720
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
721 int64 CWallet::GetBalance() const
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
722 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
723 int64 nTotal = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
724 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
725 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
726 for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
727 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
728 const CWalletTx* pcoin = &(*it).second;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
729 if (!pcoin->IsFinal() || !pcoin->IsConfirmed())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
730 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
731 nTotal += pcoin->GetAvailableCredit();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
732 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
733 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
734
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
735 return nTotal;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
736 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
737
1183
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
738 int64 CWallet::GetUnconfirmedBalance() const
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
739 {
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
740 int64 nTotal = 0;
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
741 CRITICAL_BLOCK(cs_mapWallet)
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
742 {
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
743 for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
744 {
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
745 const CWalletTx* pcoin = &(*it).second;
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
746 if (pcoin->IsFinal() && pcoin->IsConfirmed())
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
747 continue;
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
748 nTotal += pcoin->GetAvailableCredit();
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
749 }
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
750 }
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
751 return nTotal;
6ba6990f398f Add call to request unconfirmed balance
Wladimir J. van der Laan <laanwj@gmail.com>
parents: 1181
diff changeset
752 }
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
753
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
754 bool CWallet::SelectCoinsMinConf(int64 nTargetValue, int nConfMine, int nConfTheirs, set<pair<const CWalletTx*,unsigned int> >& setCoinsRet, int64& nValueRet) const
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
755 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
756 setCoinsRet.clear();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
757 nValueRet = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
758
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
759 // List of values less than target
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
760 pair<int64, pair<const CWalletTx*,unsigned int> > coinLowestLarger;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
761 coinLowestLarger.first = INT64_MAX;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
762 coinLowestLarger.second.first = NULL;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
763 vector<pair<int64, pair<const CWalletTx*,unsigned int> > > vValue;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
764 int64 nTotalLower = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
765
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
766 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
767 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
768 vector<const CWalletTx*> vCoins;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
769 vCoins.reserve(mapWallet.size());
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
770 for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
771 vCoins.push_back(&(*it).second);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
772 random_shuffle(vCoins.begin(), vCoins.end(), GetRandInt);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
773
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
774 BOOST_FOREACH(const CWalletTx* pcoin, vCoins)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
775 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
776 if (!pcoin->IsFinal() || !pcoin->IsConfirmed())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
777 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
778
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
779 if (pcoin->IsCoinBase() && pcoin->GetBlocksToMaturity() > 0)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
780 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
781
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
782 int nDepth = pcoin->GetDepthInMainChain();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
783 if (nDepth < (pcoin->IsFromMe() ? nConfMine : nConfTheirs))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
784 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
785
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
786 for (int i = 0; i < pcoin->vout.size(); i++)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
787 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
788 if (pcoin->IsSpent(i) || !IsMine(pcoin->vout[i]))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
789 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
790
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
791 int64 n = pcoin->vout[i].nValue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
792
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
793 if (n <= 0)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
794 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
795
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
796 pair<int64,pair<const CWalletTx*,unsigned int> > coin = make_pair(n,make_pair(pcoin,i));
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
797
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
798 if (n == nTargetValue)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
799 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
800 setCoinsRet.insert(coin.second);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
801 nValueRet += coin.first;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
802 return true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
803 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
804 else if (n < nTargetValue + CENT)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
805 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
806 vValue.push_back(coin);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
807 nTotalLower += n;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
808 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
809 else if (n < coinLowestLarger.first)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
810 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
811 coinLowestLarger = coin;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
812 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
813 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
814 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
815 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
816
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
817 if (nTotalLower == nTargetValue || nTotalLower == nTargetValue + CENT)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
818 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
819 for (int i = 0; i < vValue.size(); ++i)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
820 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
821 setCoinsRet.insert(vValue[i].second);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
822 nValueRet += vValue[i].first;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
823 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
824 return true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
825 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
826
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
827 if (nTotalLower < nTargetValue + (coinLowestLarger.second.first ? CENT : 0))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
828 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
829 if (coinLowestLarger.second.first == NULL)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
830 return false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
831 setCoinsRet.insert(coinLowestLarger.second);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
832 nValueRet += coinLowestLarger.first;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
833 return true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
834 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
835
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
836 if (nTotalLower >= nTargetValue + CENT)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
837 nTargetValue += CENT;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
838
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
839 // Solve subset sum by stochastic approximation
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
840 sort(vValue.rbegin(), vValue.rend());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
841 vector<char> vfIncluded;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
842 vector<char> vfBest(vValue.size(), true);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
843 int64 nBest = nTotalLower;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
844
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
845 for (int nRep = 0; nRep < 1000 && nBest != nTargetValue; nRep++)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
846 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
847 vfIncluded.assign(vValue.size(), false);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
848 int64 nTotal = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
849 bool fReachedTarget = false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
850 for (int nPass = 0; nPass < 2 && !fReachedTarget; nPass++)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
851 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
852 for (int i = 0; i < vValue.size(); i++)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
853 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
854 if (nPass == 0 ? rand() % 2 : !vfIncluded[i])
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
855 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
856 nTotal += vValue[i].first;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
857 vfIncluded[i] = true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
858 if (nTotal >= nTargetValue)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
859 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
860 fReachedTarget = true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
861 if (nTotal < nBest)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
862 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
863 nBest = nTotal;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
864 vfBest = vfIncluded;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
865 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
866 nTotal -= vValue[i].first;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
867 vfIncluded[i] = false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
868 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
869 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
870 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
871 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
872 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
873
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
874 // If the next larger is still closer, return it
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
875 if (coinLowestLarger.second.first && coinLowestLarger.first - nTargetValue <= nBest - nTargetValue)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
876 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
877 setCoinsRet.insert(coinLowestLarger.second);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
878 nValueRet += coinLowestLarger.first;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
879 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
880 else {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
881 for (int i = 0; i < vValue.size(); i++)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
882 if (vfBest[i])
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
883 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
884 setCoinsRet.insert(vValue[i].second);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
885 nValueRet += vValue[i].first;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
886 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
887
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
888 //// debug print
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
889 printf("SelectCoins() best subset: ");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
890 for (int i = 0; i < vValue.size(); i++)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
891 if (vfBest[i])
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
892 printf("%s ", FormatMoney(vValue[i].first).c_str());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
893 printf("total %s\n", FormatMoney(nBest).c_str());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
894 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
895
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
896 return true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
897 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
898
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
899 bool CWallet::SelectCoins(int64 nTargetValue, set<pair<const CWalletTx*,unsigned int> >& setCoinsRet, int64& nValueRet) const
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
900 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
901 return (SelectCoinsMinConf(nTargetValue, 1, 6, setCoinsRet, nValueRet) ||
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
902 SelectCoinsMinConf(nTargetValue, 1, 1, setCoinsRet, nValueRet) ||
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
903 SelectCoinsMinConf(nTargetValue, 0, 1, setCoinsRet, nValueRet));
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
904 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
905
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
906
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
907
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
908
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
909 bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
910 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
911 int64 nValue = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
912 BOOST_FOREACH (const PAIRTYPE(CScript, int64)& s, vecSend)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
913 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
914 if (nValue < 0)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
915 return false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
916 nValue += s.second;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
917 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
918 if (vecSend.empty() || nValue < 0)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
919 return false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
920
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
921 wtxNew.pwallet = this;
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
922
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
923 CRITICAL_BLOCK(cs_main)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
924 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
925 // txdb must be opened before the mapWallet lock
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
926 CTxDB txdb("r");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
927 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
928 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
929 nFeeRet = nTransactionFee;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
930 loop
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
931 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
932 wtxNew.vin.clear();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
933 wtxNew.vout.clear();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
934 wtxNew.fFromMe = true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
935
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
936 int64 nTotalValue = nValue + nFeeRet;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
937 double dPriority = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
938 // vouts to the payees
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
939 BOOST_FOREACH (const PAIRTYPE(CScript, int64)& s, vecSend)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
940 wtxNew.vout.push_back(CTxOut(s.second, s.first));
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
941
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
942 // Choose coins to use
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
943 set<pair<const CWalletTx*,unsigned int> > setCoins;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
944 int64 nValueIn = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
945 if (!SelectCoins(nTotalValue, setCoins, nValueIn))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
946 return false;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
947 BOOST_FOREACH(PAIRTYPE(const CWalletTx*, unsigned int) pcoin, setCoins)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
948 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
949 int64 nCredit = pcoin.first->vout[pcoin.second].nValue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
950 dPriority += (double)nCredit * pcoin.first->GetDepthInMainChain();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
951 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
952
822
4a4834c2af86 Fix for small change outputs
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
953 int64 nChange = nValueIn - nValue - nFeeRet;
4a4834c2af86 Fix for small change outputs
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
954 // if sub-cent change is required, the fee must be raised to at least MIN_TX_FEE
4a4834c2af86 Fix for small change outputs
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
955 // or until nChange becomes zero
4a4834c2af86 Fix for small change outputs
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
956 if (nFeeRet < MIN_TX_FEE && nChange > 0 && nChange < CENT)
4a4834c2af86 Fix for small change outputs
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
957 {
4a4834c2af86 Fix for small change outputs
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
958 int64 nMoveToFee = min(nChange, MIN_TX_FEE - nFeeRet);
4a4834c2af86 Fix for small change outputs
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
959 nChange -= nMoveToFee;
4a4834c2af86 Fix for small change outputs
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
960 nFeeRet += nMoveToFee;
4a4834c2af86 Fix for small change outputs
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
961 }
4a4834c2af86 Fix for small change outputs
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
962
4a4834c2af86 Fix for small change outputs
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
963 if (nChange > 0)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
964 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
965 // Note: We use a new key here to keep it from being obvious which side is the change.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
966 // The drawback is that by not reusing a previous key, the change may be lost if a
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
967 // backup is restored, if the backup doesn't have the new private key for the change.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
968 // If we reused the old key, it would be possible to add code to look for and
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
969 // rediscover unknown transactions that were written with keys of ours to recover
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
970 // post-backup change.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
971
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
972 // Reserve a new key pair from key pool
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
973 vector<unsigned char> vchPubKey = reservekey.GetReservedKey();
757
ee9183806240 Prepare codebase for Encrypted Keys.
Pieter Wuille <pieter.wuille@gmail.com>
parents: 743
diff changeset
974 // assert(mapKeys.count(vchPubKey));
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
975
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
976 // Fill a vout to ourself, using same address type as the payment
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
977 CScript scriptChange;
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
978 if (vecSend[0].first.GetBitcoinAddress().IsValid())
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
979 scriptChange.SetBitcoinAddress(vchPubKey);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
980 else
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
981 scriptChange << vchPubKey << OP_CHECKSIG;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
982
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
983 // Insert change txn at random position:
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
984 vector<CTxOut>::iterator position = wtxNew.vout.begin()+GetRandInt(wtxNew.vout.size());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
985 wtxNew.vout.insert(position, CTxOut(nChange, scriptChange));
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
986 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
987 else
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
988 reservekey.ReturnKey();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
989
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
990 // Fill vin
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
991 BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
992 wtxNew.vin.push_back(CTxIn(coin.first->GetHash(),coin.second));
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
993
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
994 // Sign
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
995 int nIn = 0;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
996 BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
997 if (!SignSignature(*this, *coin.first, wtxNew, nIn++))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
998 return false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
999
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1000 // Limit size
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1001 unsigned int nBytes = ::GetSerializeSize(*(CTransaction*)&wtxNew, SER_NETWORK);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1002 if (nBytes >= MAX_BLOCK_SIZE_GEN/5)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1003 return false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1004 dPriority /= nBytes;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1005
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1006 // Check that enough fee is included
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1007 int64 nPayFee = nTransactionFee * (1 + (int64)nBytes / 1000);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1008 bool fAllowFree = CTransaction::AllowFree(dPriority);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1009 int64 nMinFee = wtxNew.GetMinFee(1, fAllowFree);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1010 if (nFeeRet < max(nPayFee, nMinFee))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1011 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1012 nFeeRet = max(nPayFee, nMinFee);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1013 continue;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1014 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1015
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1016 // Fill vtxPrev by copying from previous transactions vtxPrev
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1017 wtxNew.AddSupportingTransactions(txdb);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1018 wtxNew.fTimeReceivedIsTxTime = true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1019
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1020 break;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1021 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1022 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1023 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1024 return true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1025 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1026
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1027 bool CWallet::CreateTransaction(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1028 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1029 vector< pair<CScript, int64> > vecSend;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1030 vecSend.push_back(make_pair(scriptPubKey, nValue));
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1031 return CreateTransaction(vecSend, wtxNew, reservekey, nFeeRet);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1032 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1033
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1034 // Call after CreateTransaction unless you want to abort
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1035 bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1036 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1037 CRITICAL_BLOCK(cs_main)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1038 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1039 printf("CommitTransaction:\n%s", wtxNew.ToString().c_str());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1040 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1041 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1042 // This is only to keep the database open to defeat the auto-flush for the
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1043 // duration of this scope. This is the only place where this optimization
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1044 // maybe makes sense; please don't do it anywhere else.
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1045 CWalletDB* pwalletdb = fFileBacked ? new CWalletDB(strWalletFile,"r") : NULL;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1046
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1047 // Take key pair from key pool so it won't be used again
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1048 reservekey.KeepKey();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1049
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1050 // Add tx to wallet, because if it has change it's also ours,
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1051 // otherwise just for transaction history.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1052 AddToWallet(wtxNew);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1053
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1054 // Mark old coins as spent
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1055 set<CWalletTx*> setCoins;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1056 BOOST_FOREACH(const CTxIn& txin, wtxNew.vin)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1057 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1058 CWalletTx &coin = mapWallet[txin.prevout.hash];
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1059 coin.pwallet = this;
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1060 coin.MarkSpent(txin.prevout.n);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1061 coin.WriteToDisk();
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1062 vWalletUpdated.push_back(coin.GetHash());
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1063 }
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1064
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1065 if (fFileBacked)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1066 delete pwalletdb;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1067 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1068
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1069 // Track how many getdata requests our transaction gets
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1070 CRITICAL_BLOCK(cs_mapRequestCount)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1071 mapRequestCount[wtxNew.GetHash()] = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1072
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1073 // Broadcast
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1074 if (!wtxNew.AcceptToMemoryPool())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1075 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1076 // This must not fail. The transaction has already been signed and recorded.
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1077 printf("CommitTransaction() : Error: Transaction not valid");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1078 return false;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1079 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1080 wtxNew.RelayWalletTransaction();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1081 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1082 MainFrameRepaint();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1083 return true;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1084 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1085
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1086
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1087
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1088
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1089 // requires cs_main lock
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1090 string CWallet::SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, bool fAskFee)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1091 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1092 CReserveKey reservekey(this);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1093 int64 nFeeRequired;
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1094 CRITICAL_BLOCK(cs_vMasterKey)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1095 {
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1096 if (IsLocked())
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1097 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1098 string strError = _("Error: Wallet locked, unable to create transaction ");
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1099 printf("SendMoney() : %s", strError.c_str());
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1100 return strError;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1101 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1102 if (!CreateTransaction(scriptPubKey, nValue, wtxNew, reservekey, nFeeRequired))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1103 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1104 string strError;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1105 if (nValue + nFeeRequired > GetBalance())
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1106 strError = strprintf(_("Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds "), FormatMoney(nFeeRequired).c_str());
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1107 else
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1108 strError = _("Error: Transaction creation failed ");
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1109 printf("SendMoney() : %s", strError.c_str());
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1110 return strError;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1111 }
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1112 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1113
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1114 if (fAskFee && !ThreadSafeAskFee(nFeeRequired, _("Sending..."), NULL))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1115 return "ABORTED";
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1116
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1117 if (!CommitTransaction(wtxNew, reservekey))
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1118 return _("Error: The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1119
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1120 MainFrameRepaint();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1121 return "";
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1122 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1123
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1124
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1125
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1126 // requires cs_main lock
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
1127 string CWallet::SendMoneyToBitcoinAddress(const CBitcoinAddress& address, int64 nValue, CWalletTx& wtxNew, bool fAskFee)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1128 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1129 // Check amount
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1130 if (nValue <= 0)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1131 return _("Invalid amount");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1132 if (nValue + nTransactionFee > GetBalance())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1133 return _("Insufficient funds");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1134
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1135 // Parse bitcoin address
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1136 CScript scriptPubKey;
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
1137 scriptPubKey.SetBitcoinAddress(address);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1138
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1139 return SendMoney(scriptPubKey, nValue, wtxNew, fAskFee);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1140 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1141
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1142
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1143
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1144
783
3ba975d53947 Update CWallet::LoadWallet for proper return type.
Jeff Garzik <jeff@garzik.org>
parents: 780
diff changeset
1145 int CWallet::LoadWallet(bool& fFirstRunRet)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1146 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1147 if (!fFileBacked)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1148 return false;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1149 fFirstRunRet = false;
746
d6f6e68a9fa0 Add minversion to wallet.
Matt Corallo <matt@bluematt.me>
parents: 733
diff changeset
1150 int nLoadWalletRet = CWalletDB(strWalletFile,"cr+").LoadWallet(this);
d6f6e68a9fa0 Add minversion to wallet.
Matt Corallo <matt@bluematt.me>
parents: 733
diff changeset
1151 if (nLoadWalletRet != DB_LOAD_OK)
d6f6e68a9fa0 Add minversion to wallet.
Matt Corallo <matt@bluematt.me>
parents: 733
diff changeset
1152 return nLoadWalletRet;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1153 fFirstRunRet = vchDefaultKey.empty();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1154
813
62b46930aaa4 get rid of mapPubKeys
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
1155 if (!HaveKey(Hash160(vchDefaultKey)))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1156 {
757
ee9183806240 Prepare codebase for Encrypted Keys.
Pieter Wuille <pieter.wuille@gmail.com>
parents: 743
diff changeset
1157 // Create new keyUser and set as default key
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1158 RandAddSeedPerfmon();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1159
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1160 SetDefaultKey(GetOrReuseKeyFromPool());
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
1161 if (!SetAddressBookName(CBitcoinAddress(vchDefaultKey), ""))
783
3ba975d53947 Update CWallet::LoadWallet for proper return type.
Jeff Garzik <jeff@garzik.org>
parents: 780
diff changeset
1162 return DB_LOAD_FAIL;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1163 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1164
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1165 CreateThread(ThreadFlushWalletDB, &strWalletFile);
783
3ba975d53947 Update CWallet::LoadWallet for proper return type.
Jeff Garzik <jeff@garzik.org>
parents: 780
diff changeset
1166 return DB_LOAD_OK;
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1167 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1168
733
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1169
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
1170 bool CWallet::SetAddressBookName(const CBitcoinAddress& address, const string& strName)
733
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1171 {
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
1172 mapAddressBook[address] = strName;
733
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1173 if (!fFileBacked)
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1174 return false;
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
1175 return CWalletDB(strWalletFile).WriteName(address.ToString(), strName);
733
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1176 }
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1177
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
1178 bool CWallet::DelAddressBookName(const CBitcoinAddress& address)
733
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1179 {
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
1180 mapAddressBook.erase(address);
733
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1181 if (!fFileBacked)
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1182 return false;
814
346b6b1b54f3 Use CBitcoinAddress instead of string/uint160
Pieter Wuille <pieter.wuille@gmail.com>
parents: 813
diff changeset
1183 return CWalletDB(strWalletFile).EraseName(address.ToString());
733
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1184 }
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1185
099957ac6246 Fix AddressBook syncrhonization between a CWallet and CWalletDB
Stéphane Gimenez <dev@gim.name>
parents: 704
diff changeset
1186
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1187 void CWallet::PrintWallet(const CBlock& block)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1188 {
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1189 CRITICAL_BLOCK(cs_mapWallet)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1190 {
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1191 if (mapWallet.count(block.vtx[0].GetHash()))
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1192 {
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1193 CWalletTx& wtx = mapWallet[block.vtx[0].GetHash()];
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1194 printf(" mine: %d %d %d", wtx.GetDepthInMainChain(), wtx.GetBlocksToMaturity(), wtx.GetCredit());
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1195 }
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1196 }
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1197 printf("\n");
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1198 }
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1199
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1200 bool CWallet::GetTransaction(const uint256 &hashTx, CWalletTx& wtx)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1201 {
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1202 CRITICAL_BLOCK(cs_mapWallet)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1203 {
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1204 map<uint256, CWalletTx>::iterator mi = mapWallet.find(hashTx);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1205 if (mi != mapWallet.end())
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1206 {
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1207 wtx = (*mi).second;
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1208 return true;
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1209 }
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1210 }
698
bdd56c5adb38 Bugfixes walletclass
Pieter Wuille <pieter.wuille@gmail.com>
parents: 694
diff changeset
1211 return false;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1212 }
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1213
743
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1214 bool CWallet::SetDefaultKey(const std::vector<unsigned char> &vchPubKey)
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1215 {
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1216 if (fFileBacked)
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1217 {
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1218 if (!CWalletDB(strWalletFile).WriteDefaultKey(vchPubKey))
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1219 return false;
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1220 }
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1221 vchDefaultKey = vchPubKey;
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1222 return true;
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1223 }
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1224
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1225 bool GetWalletFile(CWallet* pwallet, string &strWalletFileOut)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1226 {
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1227 if (!pwallet->fFileBacked)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1228 return false;
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1229 strWalletFileOut = pwallet->strWalletFile;
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1230 return true;
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1231 }
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1232
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1233 bool CWallet::TopUpKeyPool()
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1234 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1235 CRITICAL_BLOCK(cs_main)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1236 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1237 CRITICAL_BLOCK(cs_setKeyPool)
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1238 CRITICAL_BLOCK(cs_vMasterKey)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1239 {
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1240 if (IsLocked())
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1241 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1242
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1243 CWalletDB walletdb(strWalletFile);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1244
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1245 // Top up key pool
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1246 int64 nTargetSize = max(GetArg("-keypool", 100), (int64)0);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1247 while (setKeyPool.size() < nTargetSize+1)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1248 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1249 int64 nEnd = 1;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1250 if (!setKeyPool.empty())
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1251 nEnd = *(--setKeyPool.end()) + 1;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1252 if (!walletdb.WritePool(nEnd, CKeyPool(GenerateNewKey())))
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1253 throw runtime_error("TopUpKeyPool() : writing generated key failed");
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1254 setKeyPool.insert(nEnd);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1255 printf("keypool added key %"PRI64d", size=%d\n", nEnd, setKeyPool.size());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1256 }
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1257 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1258 return true;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1259 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1260
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1261 void CWallet::ReserveKeyFromKeyPool(int64& nIndex, CKeyPool& keypool)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1262 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1263 nIndex = -1;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1264 keypool.vchPubKey.clear();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1265 CRITICAL_BLOCK(cs_main)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1266 CRITICAL_BLOCK(cs_mapWallet)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1267 CRITICAL_BLOCK(cs_setKeyPool)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1268 {
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1269 if (!IsLocked())
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1270 TopUpKeyPool();
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1271
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1272 // Get the oldest key
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1273 if(setKeyPool.empty())
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1274 return;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1275
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1276 CWalletDB walletdb(strWalletFile);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1277
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1278 nIndex = *(setKeyPool.begin());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1279 setKeyPool.erase(setKeyPool.begin());
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1280 if (!walletdb.ReadPool(nIndex, keypool))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1281 throw runtime_error("ReserveKeyFromKeyPool() : read failed");
813
62b46930aaa4 get rid of mapPubKeys
Pieter Wuille <pieter.wuille@gmail.com>
parents: 795
diff changeset
1282 if (!HaveKey(Hash160(keypool.vchPubKey)))
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1283 throw runtime_error("ReserveKeyFromKeyPool() : unknown key in key pool");
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1284 assert(!keypool.vchPubKey.empty());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1285 printf("keypool reserve %"PRI64d"\n", nIndex);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1286 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1287 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1288
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1289 void CWallet::KeepKey(int64 nIndex)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1290 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1291 // Remove from key pool
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1292 if (fFileBacked)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1293 {
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1294 CWalletDB walletdb(strWalletFile);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1295 CRITICAL_BLOCK(cs_main)
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1296 {
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1297 walletdb.ErasePool(nIndex);
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1298 }
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1299 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1300 printf("keypool keep %"PRI64d"\n", nIndex);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1301 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1302
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1303 void CWallet::ReturnKey(int64 nIndex)
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1304 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1305 // Return to key pool
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1306 CRITICAL_BLOCK(cs_setKeyPool)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1307 setKeyPool.insert(nIndex);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1308 printf("keypool return %"PRI64d"\n", nIndex);
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1309 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1310
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1311 vector<unsigned char> CWallet::GetOrReuseKeyFromPool()
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1312 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1313 int64 nIndex = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1314 CKeyPool keypool;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1315 ReserveKeyFromKeyPool(nIndex, keypool);
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1316 if(nIndex == -1)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1317 return vchDefaultKey;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1318 KeepKey(nIndex);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1319 return keypool.vchPubKey;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1320 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1321
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1322 int64 CWallet::GetOldestKeyPoolTime()
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1323 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1324 int64 nIndex = 0;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1325 CKeyPool keypool;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1326 ReserveKeyFromKeyPool(nIndex, keypool);
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1327 if (nIndex == -1)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents: 757
diff changeset
1328 return GetTime();
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1329 ReturnKey(nIndex);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1330 return keypool.nTime;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1331 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1332
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1333 vector<unsigned char> CReserveKey::GetReservedKey()
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1334 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1335 if (nIndex == -1)
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1336 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1337 CKeyPool keypool;
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1338 pwallet->ReserveKeyFromKeyPool(nIndex, keypool);
793
d9ff6173c6d8 Fix crashes when a wallet is locked and GetReservedKey() is called
Matt Corallo <matt@bluematt.me>
parents: 792
diff changeset
1339 if (nIndex != -1)
d9ff6173c6d8 Fix crashes when a wallet is locked and GetReservedKey() is called
Matt Corallo <matt@bluematt.me>
parents: 792
diff changeset
1340 vchPubKey = keypool.vchPubKey;
d9ff6173c6d8 Fix crashes when a wallet is locked and GetReservedKey() is called
Matt Corallo <matt@bluematt.me>
parents: 792
diff changeset
1341 else
794
8bbe72401a58 Generate Warning when using default key.
Matt Corallo <matt@bluematt.me>
parents: 793
diff changeset
1342 {
8bbe72401a58 Generate Warning when using default key.
Matt Corallo <matt@bluematt.me>
parents: 793
diff changeset
1343 printf("CReserveKey::GetReservedKey(): Warning: using default key instead of a new key, top up your keypool.");
795
77c895b7707b Fix Build in GetReservedKey() in wallet.cpp
Matt Corallo <matt@bluematt.me>
parents: 794
diff changeset
1344 vchPubKey = pwallet->vchDefaultKey;
794
8bbe72401a58 Generate Warning when using default key.
Matt Corallo <matt@bluematt.me>
parents: 793
diff changeset
1345 }
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1346 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1347 assert(!vchPubKey.empty());
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1348 return vchPubKey;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1349 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1350
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1351 void CReserveKey::KeepKey()
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1352 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1353 if (nIndex != -1)
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1354 pwallet->KeepKey(nIndex);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1355 nIndex = -1;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1356 vchPubKey.clear();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1357 }
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1358
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1359 void CReserveKey::ReturnKey()
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1360 {
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1361 if (nIndex != -1)
690
389b559a397f CWallet class
Pieter Wuille <pieter.wuille@gmail.com>
parents: 689
diff changeset
1362 pwallet->ReturnKey(nIndex);
689
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1363 nIndex = -1;
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1364 vchPubKey.clear();
9df222fa1ef1 move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff changeset
1365 }
743
379d94bf664e Fix synchronization of default key
Pieter Wuille <pieter.wuille@gmail.com>
parents: 733
diff changeset
1366