Mercurial > hg > bitcoin
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 |
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 | 18 bool CWallet::AddKey(const CKey& key) |
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 | 33 if (!fFileBacked) |
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 | 194 } |
195 | |
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 | 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 | 205 map<uint256, CWalletTx>::iterator mi = mapWallet.find(txin.prevout.hash); |
206 if (mi != mapWallet.end()) | |
689
9df222fa1ef1
move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff
changeset
|
207 { |
690 | 208 CWalletTx& wtx = (*mi).second; |
209 if (!wtx.IsSpent(txin.prevout.n) && IsMine(wtx.vout[txin.prevout.n])) | |
210 { | |
211 printf("WalletUpdateSpent found spent coin %sbc %s\n", FormatMoney(wtx.GetCredit()).c_str(), wtx.GetHash().ToString().c_str()); | |
212 wtx.MarkSpent(txin.prevout.n); | |
213 wtx.WriteToDisk(); | |
214 vWalletUpdated.push_back(txin.prevout.hash); | |
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 | 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 | 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 | 279 |
280 // since AddToWallet is called directly for self-originating transactions, check for consumption of own coins | |
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 | 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 | 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 | 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 | 302 else |
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 | 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 | 309 if (!fFileBacked) |
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 | 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 | 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 | 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 | 328 if (txin.prevout.n < prev.vout.size()) |
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 | 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 | 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 | 344 if (txin.prevout.n < prev.vout.size()) |
345 if (IsMine(prev.vout[txin.prevout.n])) | |
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 | 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 | 381 map<uint256, int>::const_iterator mi = pwallet->mapRequestCount.find(hashBlock); |
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 | 389 map<uint256, int>::const_iterator mi = pwallet->mapRequestCount.find(GetHash()); |
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 | 397 map<uint256, int>::const_iterator mi = pwallet->mapRequestCount.find(hashBlock); |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 522 map<uint256, CWalletTx>::const_iterator mi = pwallet->mapWallet.find(hash); |
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 | 525 tx = (*mi).second; |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 921 wtxNew.pwallet = this; |
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 | 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 | 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 | 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 | 996 BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins) |
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 | 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 | 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 | 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 | 1058 CWalletTx &coin = mapWallet[txin.prevout.hash]; |
1059 coin.pwallet = this; | |
1060 coin.MarkSpent(txin.prevout.n); | |
1061 coin.WriteToDisk(); | |
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 | 1064 |
1065 if (fFileBacked) | |
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 | 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 | 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 | 1147 if (!fFileBacked) |
1148 return false; | |
689
9df222fa1ef1
move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff
changeset
|
1149 fFirstRunRet = false; |
746 | 1150 int nLoadWalletRet = CWalletDB(strWalletFile,"cr+").LoadWallet(this); |
1151 if (nLoadWalletRet != DB_LOAD_OK) | |
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 | 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 | 1187 void CWallet::PrintWallet(const CBlock& block) |
1188 { | |
1189 CRITICAL_BLOCK(cs_mapWallet) | |
1190 { | |
1191 if (mapWallet.count(block.vtx[0].GetHash())) | |
1192 { | |
1193 CWalletTx& wtx = mapWallet[block.vtx[0].GetHash()]; | |
1194 printf(" mine: %d %d %d", wtx.GetDepthInMainChain(), wtx.GetBlocksToMaturity(), wtx.GetCredit()); | |
1195 } | |
1196 } | |
1197 printf("\n"); | |
1198 } | |
1199 | |
1200 bool CWallet::GetTransaction(const uint256 &hashTx, CWalletTx& wtx) | |
1201 { | |
1202 CRITICAL_BLOCK(cs_mapWallet) | |
1203 { | |
1204 map<uint256, CWalletTx>::iterator mi = mapWallet.find(hashTx); | |
1205 if (mi != mapWallet.end()) | |
1206 { | |
1207 wtx = (*mi).second; | |
1208 return true; | |
1209 } | |
1210 } | |
698
bdd56c5adb38
Bugfixes walletclass
Pieter Wuille <pieter.wuille@gmail.com>
parents:
694
diff
changeset
|
1211 return false; |
690 | 1212 } |
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 | 1225 bool GetWalletFile(CWallet* pwallet, string &strWalletFileOut) |
1226 { | |
1227 if (!pwallet->fFileBacked) | |
1228 return false; | |
1229 strWalletFileOut = pwallet->strWalletFile; | |
1230 return true; | |
1231 } | |
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 | 1243 CWalletDB walletdb(strWalletFile); |
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 | 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 | 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 | 1276 CWalletDB walletdb(strWalletFile); |
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 | 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 | 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 | 1292 if (fFileBacked) |
689
9df222fa1ef1
move wallet code to separate file
Pieter Wuille <pieter.wuille@gmail.com>
parents:
diff
changeset
|
1293 { |
690 | 1294 CWalletDB walletdb(strWalletFile); |
1295 CRITICAL_BLOCK(cs_main) | |
1296 { | |
1297 walletdb.ErasePool(nIndex); | |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 |