Update copyrights to 2012 for files modified this year
[novacoin.git] / src / main.h
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2012 The Bitcoin developers
3 // Distributed under the MIT/X11 software license, see the accompanying
4 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
5 #ifndef BITCOIN_MAIN_H
6 #define BITCOIN_MAIN_H
7
8 #include "bignum.h"
9 #include "net.h"
10 #include "key.h"
11 #include "script.h"
12 #include "db.h"
13
14 #include <list>
15
16 class CBlock;
17 class CBlockIndex;
18 class CWalletTx;
19 class CWallet;
20 class CKeyItem;
21 class CReserveKey;
22 class CWalletDB;
23
24 class CAddress;
25 class CInv;
26 class CRequestTracker;
27 class CNode;
28 class CBlockIndex;
29
30 static const unsigned int MAX_BLOCK_SIZE = 1000000;
31 static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2;
32 static const int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
33 static const int64 COIN = 100000000;
34 static const int64 CENT = 1000000;
35 static const int64 MIN_TX_FEE = 50000;
36 static const int64 MIN_RELAY_TX_FEE = 10000;
37 static const int64 MAX_MONEY = 21000000 * COIN;
38 inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
39 static const int COINBASE_MATURITY = 100;
40 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
41 static const int LOCKTIME_THRESHOLD = 500000000; // Tue Nov  5 00:53:20 1985 UTC
42 #ifdef USE_UPNP
43 static const int fHaveUPnP = true;
44 #else
45 static const int fHaveUPnP = false;
46 #endif
47
48
49
50
51
52
53 extern CCriticalSection cs_main;
54 extern std::map<uint256, CBlockIndex*> mapBlockIndex;
55 extern uint256 hashGenesisBlock;
56 extern CBlockIndex* pindexGenesisBlock;
57 extern int nBestHeight;
58 extern CBigNum bnBestChainWork;
59 extern CBigNum bnBestInvalidWork;
60 extern uint256 hashBestChain;
61 extern CBlockIndex* pindexBest;
62 extern unsigned int nTransactionsUpdated;
63 extern double dHashesPerSec;
64 extern int64 nHPSTimerStart;
65 extern int64 nTimeBestReceived;
66 extern CCriticalSection cs_setpwalletRegistered;
67 extern std::set<CWallet*> setpwalletRegistered;
68
69 // Settings
70 extern int fGenerateBitcoins;
71 extern int64 nTransactionFee;
72 extern int fLimitProcessors;
73 extern int nLimitProcessors;
74 extern int fMinimizeToTray;
75 extern int fMinimizeOnClose;
76 extern int fUseUPnP;
77
78
79
80
81
82 class CReserveKey;
83 class CTxDB;
84 class CTxIndex;
85
86 void RegisterWallet(CWallet* pwalletIn);
87 void UnregisterWallet(CWallet* pwalletIn);
88 bool CheckDiskSpace(uint64 nAdditionalBytes=0);
89 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
90 FILE* AppendBlockFile(unsigned int& nFileRet);
91 bool LoadBlockIndex(bool fAllowNew=true);
92 void PrintBlockTree();
93 bool ProcessMessages(CNode* pfrom);
94 bool SendMessages(CNode* pto, bool fSendTrickle);
95 void GenerateBitcoins(bool fGenerate, CWallet* pwallet);
96 CBlock* CreateNewBlock(CReserveKey& reservekey);
97 void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& nExtraNonce);
98 void FormatHashBuffers(CBlock* pblock, char* pmidstate, char* pdata, char* phash1);
99 bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey);
100 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
101 unsigned int ComputeMinWork(unsigned int nBase, int64 nTime);
102 bool IsInitialBlockDownload();
103 std::string GetWarnings(std::string strFor);
104
105
106
107
108
109
110
111
112
113
114
115
116 bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
117
118 template<typename T>
119 bool WriteSetting(const std::string& strKey, const T& value)
120 {
121     bool fOk = false;
122     BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
123     {
124         std::string strWalletFile;
125         if (!GetWalletFile(pwallet, strWalletFile))
126             continue;
127         fOk |= CWalletDB(strWalletFile).WriteSetting(strKey, value);
128     }
129     return fOk;
130 }
131
132
133 class CDiskTxPos
134 {
135 public:
136     unsigned int nFile;
137     unsigned int nBlockPos;
138     unsigned int nTxPos;
139
140     CDiskTxPos()
141     {
142         SetNull();
143     }
144
145     CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
146     {
147         nFile = nFileIn;
148         nBlockPos = nBlockPosIn;
149         nTxPos = nTxPosIn;
150     }
151
152     IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
153     void SetNull() { nFile = -1; nBlockPos = 0; nTxPos = 0; }
154     bool IsNull() const { return (nFile == -1); }
155
156     friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
157     {
158         return (a.nFile     == b.nFile &&
159                 a.nBlockPos == b.nBlockPos &&
160                 a.nTxPos    == b.nTxPos);
161     }
162
163     friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
164     {
165         return !(a == b);
166     }
167
168     std::string ToString() const
169     {
170         if (IsNull())
171             return strprintf("null");
172         else
173             return strprintf("(nFile=%d, nBlockPos=%d, nTxPos=%d)", nFile, nBlockPos, nTxPos);
174     }
175
176     void print() const
177     {
178         printf("%s", ToString().c_str());
179     }
180 };
181
182
183
184
185 class CInPoint
186 {
187 public:
188     CTransaction* ptx;
189     unsigned int n;
190
191     CInPoint() { SetNull(); }
192     CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
193     void SetNull() { ptx = NULL; n = -1; }
194     bool IsNull() const { return (ptx == NULL && n == -1); }
195 };
196
197
198
199
200 class COutPoint
201 {
202 public:
203     uint256 hash;
204     unsigned int n;
205
206     COutPoint() { SetNull(); }
207     COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
208     IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
209     void SetNull() { hash = 0; n = -1; }
210     bool IsNull() const { return (hash == 0 && n == -1); }
211
212     friend bool operator<(const COutPoint& a, const COutPoint& b)
213     {
214         return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
215     }
216
217     friend bool operator==(const COutPoint& a, const COutPoint& b)
218     {
219         return (a.hash == b.hash && a.n == b.n);
220     }
221
222     friend bool operator!=(const COutPoint& a, const COutPoint& b)
223     {
224         return !(a == b);
225     }
226
227     std::string ToString() const
228     {
229         return strprintf("COutPoint(%s, %d)", hash.ToString().substr(0,10).c_str(), n);
230     }
231
232     void print() const
233     {
234         printf("%s\n", ToString().c_str());
235     }
236 };
237
238
239
240
241 //
242 // An input of a transaction.  It contains the location of the previous
243 // transaction's output that it claims and a signature that matches the
244 // output's public key.
245 //
246 class CTxIn
247 {
248 public:
249     COutPoint prevout;
250     CScript scriptSig;
251     unsigned int nSequence;
252
253     CTxIn()
254     {
255         nSequence = UINT_MAX;
256     }
257
258     explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=UINT_MAX)
259     {
260         prevout = prevoutIn;
261         scriptSig = scriptSigIn;
262         nSequence = nSequenceIn;
263     }
264
265     CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=UINT_MAX)
266     {
267         prevout = COutPoint(hashPrevTx, nOut);
268         scriptSig = scriptSigIn;
269         nSequence = nSequenceIn;
270     }
271
272     IMPLEMENT_SERIALIZE
273     (
274         READWRITE(prevout);
275         READWRITE(scriptSig);
276         READWRITE(nSequence);
277     )
278
279     bool IsFinal() const
280     {
281         return (nSequence == UINT_MAX);
282     }
283
284     friend bool operator==(const CTxIn& a, const CTxIn& b)
285     {
286         return (a.prevout   == b.prevout &&
287                 a.scriptSig == b.scriptSig &&
288                 a.nSequence == b.nSequence);
289     }
290
291     friend bool operator!=(const CTxIn& a, const CTxIn& b)
292     {
293         return !(a == b);
294     }
295
296     std::string ToString() const
297     {
298         std::string str;
299         str += strprintf("CTxIn(");
300         str += prevout.ToString();
301         if (prevout.IsNull())
302             str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
303         else
304             str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
305         if (nSequence != UINT_MAX)
306             str += strprintf(", nSequence=%u", nSequence);
307         str += ")";
308         return str;
309     }
310
311     void print() const
312     {
313         printf("%s\n", ToString().c_str());
314     }
315 };
316
317
318
319
320 //
321 // An output of a transaction.  It contains the public key that the next input
322 // must be able to sign with to claim it.
323 //
324 class CTxOut
325 {
326 public:
327     int64 nValue;
328     CScript scriptPubKey;
329
330     CTxOut()
331     {
332         SetNull();
333     }
334
335     CTxOut(int64 nValueIn, CScript scriptPubKeyIn)
336     {
337         nValue = nValueIn;
338         scriptPubKey = scriptPubKeyIn;
339     }
340
341     IMPLEMENT_SERIALIZE
342     (
343         READWRITE(nValue);
344         READWRITE(scriptPubKey);
345     )
346
347     void SetNull()
348     {
349         nValue = -1;
350         scriptPubKey.clear();
351     }
352
353     bool IsNull()
354     {
355         return (nValue == -1);
356     }
357
358     uint256 GetHash() const
359     {
360         return SerializeHash(*this);
361     }
362
363     friend bool operator==(const CTxOut& a, const CTxOut& b)
364     {
365         return (a.nValue       == b.nValue &&
366                 a.scriptPubKey == b.scriptPubKey);
367     }
368
369     friend bool operator!=(const CTxOut& a, const CTxOut& b)
370     {
371         return !(a == b);
372     }
373
374     std::string ToString() const
375     {
376         if (scriptPubKey.size() < 6)
377             return "CTxOut(error)";
378         return strprintf("CTxOut(nValue=%"PRI64d".%08"PRI64d", scriptPubKey=%s)", nValue / COIN, nValue % COIN, scriptPubKey.ToString().substr(0,30).c_str());
379     }
380
381     void print() const
382     {
383         printf("%s\n", ToString().c_str());
384     }
385 };
386
387
388
389
390 //
391 // The basic transaction that is broadcasted on the network and contained in
392 // blocks.  A transaction can contain multiple inputs and outputs.
393 //
394 class CTransaction
395 {
396 public:
397     int nVersion;
398     std::vector<CTxIn> vin;
399     std::vector<CTxOut> vout;
400     unsigned int nLockTime;
401
402
403     CTransaction()
404     {
405         SetNull();
406     }
407
408     IMPLEMENT_SERIALIZE
409     (
410         READWRITE(this->nVersion);
411         nVersion = this->nVersion;
412         READWRITE(vin);
413         READWRITE(vout);
414         READWRITE(nLockTime);
415     )
416
417     void SetNull()
418     {
419         nVersion = 1;
420         vin.clear();
421         vout.clear();
422         nLockTime = 0;
423     }
424
425     bool IsNull() const
426     {
427         return (vin.empty() && vout.empty());
428     }
429
430     uint256 GetHash() const
431     {
432         return SerializeHash(*this);
433     }
434
435     bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const
436     {
437         // Time based nLockTime implemented in 0.1.6
438         if (nLockTime == 0)
439             return true;
440         if (nBlockHeight == 0)
441             nBlockHeight = nBestHeight;
442         if (nBlockTime == 0)
443             nBlockTime = GetAdjustedTime();
444         if ((int64)nLockTime < (nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime))
445             return true;
446         BOOST_FOREACH(const CTxIn& txin, vin)
447             if (!txin.IsFinal())
448                 return false;
449         return true;
450     }
451
452     bool IsNewerThan(const CTransaction& old) const
453     {
454         if (vin.size() != old.vin.size())
455             return false;
456         for (int i = 0; i < vin.size(); i++)
457             if (vin[i].prevout != old.vin[i].prevout)
458                 return false;
459
460         bool fNewer = false;
461         unsigned int nLowest = UINT_MAX;
462         for (int i = 0; i < vin.size(); i++)
463         {
464             if (vin[i].nSequence != old.vin[i].nSequence)
465             {
466                 if (vin[i].nSequence <= nLowest)
467                 {
468                     fNewer = false;
469                     nLowest = vin[i].nSequence;
470                 }
471                 if (old.vin[i].nSequence < nLowest)
472                 {
473                     fNewer = true;
474                     nLowest = old.vin[i].nSequence;
475                 }
476             }
477         }
478         return fNewer;
479     }
480
481     bool IsCoinBase() const
482     {
483         return (vin.size() == 1 && vin[0].prevout.IsNull());
484     }
485
486     int GetSigOpCount() const
487     {
488         int n = 0;
489         BOOST_FOREACH(const CTxIn& txin, vin)
490             n += txin.scriptSig.GetSigOpCount();
491         BOOST_FOREACH(const CTxOut& txout, vout)
492             n += txout.scriptPubKey.GetSigOpCount();
493         return n;
494     }
495
496     bool IsStandard() const
497     {
498         BOOST_FOREACH(const CTxIn& txin, vin)
499             if (!txin.scriptSig.IsPushOnly())
500                 return error("nonstandard txin: %s", txin.scriptSig.ToString().c_str());
501         BOOST_FOREACH(const CTxOut& txout, vout)
502             if (!::IsStandard(txout.scriptPubKey))
503                 return error("nonstandard txout: %s", txout.scriptPubKey.ToString().c_str());
504         return true;
505     }
506
507     int64 GetValueOut() const
508     {
509         int64 nValueOut = 0;
510         BOOST_FOREACH(const CTxOut& txout, vout)
511         {
512             nValueOut += txout.nValue;
513             if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
514                 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
515         }
516         return nValueOut;
517     }
518
519     static bool AllowFree(double dPriority)
520     {
521         // Large (in bytes) low-priority (new, small-coin) transactions
522         // need a fee.
523         return dPriority > COIN * 144 / 250;
524     }
525
526     int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=true, bool fForRelay=false) const
527     {
528         // Base fee is either MIN_TX_FEE or MIN_RELAY_TX_FEE
529         int64 nBaseFee = fForRelay ? MIN_RELAY_TX_FEE : MIN_TX_FEE;
530
531         unsigned int nBytes = ::GetSerializeSize(*this, SER_NETWORK);
532         unsigned int nNewBlockSize = nBlockSize + nBytes;
533         int64 nMinFee = (1 + (int64)nBytes / 1000) * nBaseFee;
534
535         if (fAllowFree)
536         {
537             if (nBlockSize == 1)
538             {
539                 // Transactions under 10K are free
540                 // (about 4500bc if made of 50bc inputs)
541                 if (nBytes < 10000)
542                     nMinFee = 0;
543             }
544             else
545             {
546                 // Free transaction area
547                 if (nNewBlockSize < 27000)
548                     nMinFee = 0;
549             }
550         }
551
552         // To limit dust spam, require MIN_TX_FEE/MIN_RELAY_TX_FEE if any output is less than 0.01
553         if (nMinFee < nBaseFee)
554             BOOST_FOREACH(const CTxOut& txout, vout)
555                 if (txout.nValue < CENT)
556                     nMinFee = nBaseFee;
557
558         // Raise the price as the block approaches full
559         if (nBlockSize != 1 && nNewBlockSize >= MAX_BLOCK_SIZE_GEN/2)
560         {
561             if (nNewBlockSize >= MAX_BLOCK_SIZE_GEN)
562                 return MAX_MONEY;
563             nMinFee *= MAX_BLOCK_SIZE_GEN / (MAX_BLOCK_SIZE_GEN - nNewBlockSize);
564         }
565
566         if (!MoneyRange(nMinFee))
567             nMinFee = MAX_MONEY;
568         return nMinFee;
569     }
570
571
572     bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
573     {
574         CAutoFile filein = OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb");
575         if (!filein)
576             return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
577
578         // Read transaction
579         if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
580             return error("CTransaction::ReadFromDisk() : fseek failed");
581         filein >> *this;
582
583         // Return file pointer
584         if (pfileRet)
585         {
586             if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
587                 return error("CTransaction::ReadFromDisk() : second fseek failed");
588             *pfileRet = filein.release();
589         }
590         return true;
591     }
592
593     friend bool operator==(const CTransaction& a, const CTransaction& b)
594     {
595         return (a.nVersion  == b.nVersion &&
596                 a.vin       == b.vin &&
597                 a.vout      == b.vout &&
598                 a.nLockTime == b.nLockTime);
599     }
600
601     friend bool operator!=(const CTransaction& a, const CTransaction& b)
602     {
603         return !(a == b);
604     }
605
606
607     std::string ToString() const
608     {
609         std::string str;
610         str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%d, vout.size=%d, nLockTime=%d)\n",
611             GetHash().ToString().substr(0,10).c_str(),
612             nVersion,
613             vin.size(),
614             vout.size(),
615             nLockTime);
616         for (int i = 0; i < vin.size(); i++)
617             str += "    " + vin[i].ToString() + "\n";
618         for (int i = 0; i < vout.size(); i++)
619             str += "    " + vout[i].ToString() + "\n";
620         return str;
621     }
622
623     void print() const
624     {
625         printf("%s", ToString().c_str());
626     }
627
628
629     bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
630     bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
631     bool ReadFromDisk(COutPoint prevout);
632     bool DisconnectInputs(CTxDB& txdb);
633     bool ConnectInputs(CTxDB& txdb, std::map<uint256, CTxIndex>& mapTestPool, CDiskTxPos posThisTx,
634                        CBlockIndex* pindexBlock, int64& nFees, bool fBlock, bool fMiner, int64 nMinFee,
635                        bool& fInvalid);
636     bool ClientConnectInputs();
637     bool CheckTransaction() const;
638     bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
639     bool AcceptToMemoryPool(bool fCheckInputs=true, bool* pfMissingInputs=NULL);
640 protected:
641     bool AddToMemoryPoolUnchecked();
642 public:
643     bool RemoveFromMemoryPool();
644 };
645
646
647
648
649
650 //
651 // A transaction with a merkle branch linking it to the block chain
652 //
653 class CMerkleTx : public CTransaction
654 {
655 public:
656     uint256 hashBlock;
657     std::vector<uint256> vMerkleBranch;
658     int nIndex;
659
660     // memory only
661     mutable char fMerkleVerified;
662
663
664     CMerkleTx()
665     {
666         Init();
667     }
668
669     CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
670     {
671         Init();
672     }
673
674     void Init()
675     {
676         hashBlock = 0;
677         nIndex = -1;
678         fMerkleVerified = false;
679     }
680
681
682     IMPLEMENT_SERIALIZE
683     (
684         nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
685         nVersion = this->nVersion;
686         READWRITE(hashBlock);
687         READWRITE(vMerkleBranch);
688         READWRITE(nIndex);
689     )
690
691
692     int SetMerkleBranch(const CBlock* pblock=NULL);
693     int GetDepthInMainChain(int& nHeightRet) const;
694     int GetDepthInMainChain() const { int nHeight; return GetDepthInMainChain(nHeight); }
695     bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
696     int GetBlocksToMaturity() const;
697     bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
698     bool AcceptToMemoryPool();
699 };
700
701
702
703
704 //
705 // A txdb record that contains the disk location of a transaction and the
706 // locations of transactions that spend its outputs.  vSpent is really only
707 // used as a flag, but having the location is very helpful for debugging.
708 //
709 class CTxIndex
710 {
711 public:
712     CDiskTxPos pos;
713     std::vector<CDiskTxPos> vSpent;
714
715     CTxIndex()
716     {
717         SetNull();
718     }
719
720     CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
721     {
722         pos = posIn;
723         vSpent.resize(nOutputs);
724     }
725
726     IMPLEMENT_SERIALIZE
727     (
728         if (!(nType & SER_GETHASH))
729             READWRITE(nVersion);
730         READWRITE(pos);
731         READWRITE(vSpent);
732     )
733
734     void SetNull()
735     {
736         pos.SetNull();
737         vSpent.clear();
738     }
739
740     bool IsNull()
741     {
742         return pos.IsNull();
743     }
744
745     friend bool operator==(const CTxIndex& a, const CTxIndex& b)
746     {
747         return (a.pos    == b.pos &&
748                 a.vSpent == b.vSpent);
749     }
750
751     friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
752     {
753         return !(a == b);
754     }
755     int GetDepthInMainChain() const;
756 };
757
758
759
760
761
762 //
763 // Nodes collect new transactions into a block, hash them into a hash tree,
764 // and scan through nonce values to make the block's hash satisfy proof-of-work
765 // requirements.  When they solve the proof-of-work, they broadcast the block
766 // to everyone and the block is added to the block chain.  The first transaction
767 // in the block is a special one that creates a new coin owned by the creator
768 // of the block.
769 //
770 // Blocks are appended to blk0001.dat files on disk.  Their location on disk
771 // is indexed by CBlockIndex objects in memory.
772 //
773 class CBlock
774 {
775 public:
776     // header
777     int nVersion;
778     uint256 hashPrevBlock;
779     uint256 hashMerkleRoot;
780     unsigned int nTime;
781     unsigned int nBits;
782     unsigned int nNonce;
783
784     // network and disk
785     std::vector<CTransaction> vtx;
786
787     // memory only
788     mutable std::vector<uint256> vMerkleTree;
789
790
791     CBlock()
792     {
793         SetNull();
794     }
795
796     IMPLEMENT_SERIALIZE
797     (
798         READWRITE(this->nVersion);
799         nVersion = this->nVersion;
800         READWRITE(hashPrevBlock);
801         READWRITE(hashMerkleRoot);
802         READWRITE(nTime);
803         READWRITE(nBits);
804         READWRITE(nNonce);
805
806         // ConnectBlock depends on vtx being last so it can calculate offset
807         if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
808             READWRITE(vtx);
809         else if (fRead)
810             const_cast<CBlock*>(this)->vtx.clear();
811     )
812
813     void SetNull()
814     {
815         nVersion = 1;
816         hashPrevBlock = 0;
817         hashMerkleRoot = 0;
818         nTime = 0;
819         nBits = 0;
820         nNonce = 0;
821         vtx.clear();
822         vMerkleTree.clear();
823     }
824
825     bool IsNull() const
826     {
827         return (nBits == 0);
828     }
829
830     uint256 GetHash() const
831     {
832         return Hash(BEGIN(nVersion), END(nNonce));
833     }
834
835     int64 GetBlockTime() const
836     {
837         return (int64)nTime;
838     }
839
840     int GetSigOpCount() const
841     {
842         int n = 0;
843         BOOST_FOREACH(const CTransaction& tx, vtx)
844             n += tx.GetSigOpCount();
845         return n;
846     }
847
848
849     uint256 BuildMerkleTree() const
850     {
851         vMerkleTree.clear();
852         BOOST_FOREACH(const CTransaction& tx, vtx)
853             vMerkleTree.push_back(tx.GetHash());
854         int j = 0;
855         for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
856         {
857             for (int i = 0; i < nSize; i += 2)
858             {
859                 int i2 = std::min(i+1, nSize-1);
860                 vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]),  END(vMerkleTree[j+i]),
861                                            BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
862             }
863             j += nSize;
864         }
865         return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
866     }
867
868     std::vector<uint256> GetMerkleBranch(int nIndex) const
869     {
870         if (vMerkleTree.empty())
871             BuildMerkleTree();
872         std::vector<uint256> vMerkleBranch;
873         int j = 0;
874         for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
875         {
876             int i = std::min(nIndex^1, nSize-1);
877             vMerkleBranch.push_back(vMerkleTree[j+i]);
878             nIndex >>= 1;
879             j += nSize;
880         }
881         return vMerkleBranch;
882     }
883
884     static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
885     {
886         if (nIndex == -1)
887             return 0;
888         BOOST_FOREACH(const uint256& otherside, vMerkleBranch)
889         {
890             if (nIndex & 1)
891                 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
892             else
893                 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
894             nIndex >>= 1;
895         }
896         return hash;
897     }
898
899
900     bool WriteToDisk(unsigned int& nFileRet, unsigned int& nBlockPosRet)
901     {
902         // Open history file to append
903         CAutoFile fileout = AppendBlockFile(nFileRet);
904         if (!fileout)
905             return error("CBlock::WriteToDisk() : AppendBlockFile failed");
906
907         // Write index header
908         unsigned int nSize = fileout.GetSerializeSize(*this);
909         fileout << FLATDATA(pchMessageStart) << nSize;
910
911         // Write block
912         nBlockPosRet = ftell(fileout);
913         if (nBlockPosRet == -1)
914             return error("CBlock::WriteToDisk() : ftell failed");
915         fileout << *this;
916
917         // Flush stdio buffers and commit to disk before returning
918         fflush(fileout);
919         if (!IsInitialBlockDownload() || (nBestHeight+1) % 500 == 0)
920         {
921 #ifdef __WXMSW__
922             _commit(_fileno(fileout));
923 #else
924             fsync(fileno(fileout));
925 #endif
926         }
927
928         return true;
929     }
930
931     bool ReadFromDisk(unsigned int nFile, unsigned int nBlockPos, bool fReadTransactions=true)
932     {
933         SetNull();
934
935         // Open history file to read
936         CAutoFile filein = OpenBlockFile(nFile, nBlockPos, "rb");
937         if (!filein)
938             return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
939         if (!fReadTransactions)
940             filein.nType |= SER_BLOCKHEADERONLY;
941
942         // Read block
943         filein >> *this;
944
945         // Check the header
946         if (!CheckProofOfWork(GetHash(), nBits))
947             return error("CBlock::ReadFromDisk() : errors in block header");
948
949         return true;
950     }
951
952
953
954     void print() const
955     {
956         printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%d)\n",
957             GetHash().ToString().substr(0,20).c_str(),
958             nVersion,
959             hashPrevBlock.ToString().substr(0,20).c_str(),
960             hashMerkleRoot.ToString().substr(0,10).c_str(),
961             nTime, nBits, nNonce,
962             vtx.size());
963         for (int i = 0; i < vtx.size(); i++)
964         {
965             printf("  ");
966             vtx[i].print();
967         }
968         printf("  vMerkleTree: ");
969         for (int i = 0; i < vMerkleTree.size(); i++)
970             printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
971         printf("\n");
972     }
973
974
975     bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
976     bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex);
977     bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
978     bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
979     bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
980     bool CheckBlock() const;
981     bool AcceptBlock();
982 };
983
984
985
986
987
988
989 //
990 // The block chain is a tree shaped structure starting with the
991 // genesis block at the root, with each block potentially having multiple
992 // candidates to be the next block.  pprev and pnext link a path through the
993 // main/longest chain.  A blockindex may have multiple pprev pointing back
994 // to it, but pnext will only point forward to the longest branch, or will
995 // be null if the block is not part of the longest chain.
996 //
997 class CBlockIndex
998 {
999 public:
1000     const uint256* phashBlock;
1001     CBlockIndex* pprev;
1002     CBlockIndex* pnext;
1003     unsigned int nFile;
1004     unsigned int nBlockPos;
1005     int nHeight;
1006     CBigNum bnChainWork;
1007
1008     // block header
1009     int nVersion;
1010     uint256 hashMerkleRoot;
1011     unsigned int nTime;
1012     unsigned int nBits;
1013     unsigned int nNonce;
1014
1015
1016     CBlockIndex()
1017     {
1018         phashBlock = NULL;
1019         pprev = NULL;
1020         pnext = NULL;
1021         nFile = 0;
1022         nBlockPos = 0;
1023         nHeight = 0;
1024         bnChainWork = 0;
1025
1026         nVersion       = 0;
1027         hashMerkleRoot = 0;
1028         nTime          = 0;
1029         nBits          = 0;
1030         nNonce         = 0;
1031     }
1032
1033     CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block)
1034     {
1035         phashBlock = NULL;
1036         pprev = NULL;
1037         pnext = NULL;
1038         nFile = nFileIn;
1039         nBlockPos = nBlockPosIn;
1040         nHeight = 0;
1041         bnChainWork = 0;
1042
1043         nVersion       = block.nVersion;
1044         hashMerkleRoot = block.hashMerkleRoot;
1045         nTime          = block.nTime;
1046         nBits          = block.nBits;
1047         nNonce         = block.nNonce;
1048     }
1049
1050     CBlock GetBlockHeader() const
1051     {
1052         CBlock block;
1053         block.nVersion       = nVersion;
1054         if (pprev)
1055             block.hashPrevBlock = pprev->GetBlockHash();
1056         block.hashMerkleRoot = hashMerkleRoot;
1057         block.nTime          = nTime;
1058         block.nBits          = nBits;
1059         block.nNonce         = nNonce;
1060         return block;
1061     }
1062
1063     uint256 GetBlockHash() const
1064     {
1065         return *phashBlock;
1066     }
1067
1068     int64 GetBlockTime() const
1069     {
1070         return (int64)nTime;
1071     }
1072
1073     CBigNum GetBlockWork() const
1074     {
1075         CBigNum bnTarget;
1076         bnTarget.SetCompact(nBits);
1077         if (bnTarget <= 0)
1078             return 0;
1079         return (CBigNum(1)<<256) / (bnTarget+1);
1080     }
1081
1082     bool IsInMainChain() const
1083     {
1084         return (pnext || this == pindexBest);
1085     }
1086
1087     bool CheckIndex() const
1088     {
1089         return CheckProofOfWork(GetBlockHash(), nBits);
1090     }
1091
1092     bool EraseBlockFromDisk()
1093     {
1094         // Open history file
1095         CAutoFile fileout = OpenBlockFile(nFile, nBlockPos, "rb+");
1096         if (!fileout)
1097             return false;
1098
1099         // Overwrite with empty null block
1100         CBlock block;
1101         block.SetNull();
1102         fileout << block;
1103
1104         return true;
1105     }
1106
1107     enum { nMedianTimeSpan=11 };
1108
1109     int64 GetMedianTimePast() const
1110     {
1111         int64 pmedian[nMedianTimeSpan];
1112         int64* pbegin = &pmedian[nMedianTimeSpan];
1113         int64* pend = &pmedian[nMedianTimeSpan];
1114
1115         const CBlockIndex* pindex = this;
1116         for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1117             *(--pbegin) = pindex->GetBlockTime();
1118
1119         std::sort(pbegin, pend);
1120         return pbegin[(pend - pbegin)/2];
1121     }
1122
1123     int64 GetMedianTime() const
1124     {
1125         const CBlockIndex* pindex = this;
1126         for (int i = 0; i < nMedianTimeSpan/2; i++)
1127         {
1128             if (!pindex->pnext)
1129                 return GetBlockTime();
1130             pindex = pindex->pnext;
1131         }
1132         return pindex->GetMedianTimePast();
1133     }
1134
1135
1136
1137     std::string ToString() const
1138     {
1139         return strprintf("CBlockIndex(nprev=%08x, pnext=%08x, nFile=%d, nBlockPos=%-6d nHeight=%d, merkle=%s, hashBlock=%s)",
1140             pprev, pnext, nFile, nBlockPos, nHeight,
1141             hashMerkleRoot.ToString().substr(0,10).c_str(),
1142             GetBlockHash().ToString().substr(0,20).c_str());
1143     }
1144
1145     void print() const
1146     {
1147         printf("%s\n", ToString().c_str());
1148     }
1149 };
1150
1151
1152
1153 //
1154 // Used to marshal pointers into hashes for db storage.
1155 //
1156 class CDiskBlockIndex : public CBlockIndex
1157 {
1158 public:
1159     uint256 hashPrev;
1160     uint256 hashNext;
1161
1162     CDiskBlockIndex()
1163     {
1164         hashPrev = 0;
1165         hashNext = 0;
1166     }
1167
1168     explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1169     {
1170         hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1171         hashNext = (pnext ? pnext->GetBlockHash() : 0);
1172     }
1173
1174     IMPLEMENT_SERIALIZE
1175     (
1176         if (!(nType & SER_GETHASH))
1177             READWRITE(nVersion);
1178
1179         READWRITE(hashNext);
1180         READWRITE(nFile);
1181         READWRITE(nBlockPos);
1182         READWRITE(nHeight);
1183
1184         // block header
1185         READWRITE(this->nVersion);
1186         READWRITE(hashPrev);
1187         READWRITE(hashMerkleRoot);
1188         READWRITE(nTime);
1189         READWRITE(nBits);
1190         READWRITE(nNonce);
1191     )
1192
1193     uint256 GetBlockHash() const
1194     {
1195         CBlock block;
1196         block.nVersion        = nVersion;
1197         block.hashPrevBlock   = hashPrev;
1198         block.hashMerkleRoot  = hashMerkleRoot;
1199         block.nTime           = nTime;
1200         block.nBits           = nBits;
1201         block.nNonce          = nNonce;
1202         return block.GetHash();
1203     }
1204
1205
1206     std::string ToString() const
1207     {
1208         std::string str = "CDiskBlockIndex(";
1209         str += CBlockIndex::ToString();
1210         str += strprintf("\n                hashBlock=%s, hashPrev=%s, hashNext=%s)",
1211             GetBlockHash().ToString().c_str(),
1212             hashPrev.ToString().substr(0,20).c_str(),
1213             hashNext.ToString().substr(0,20).c_str());
1214         return str;
1215     }
1216
1217     void print() const
1218     {
1219         printf("%s\n", ToString().c_str());
1220     }
1221 };
1222
1223
1224
1225
1226
1227
1228
1229
1230 //
1231 // Describes a place in the block chain to another node such that if the
1232 // other node doesn't have the same branch, it can find a recent common trunk.
1233 // The further back it is, the further before the fork it may be.
1234 //
1235 class CBlockLocator
1236 {
1237 protected:
1238     std::vector<uint256> vHave;
1239 public:
1240
1241     CBlockLocator()
1242     {
1243     }
1244
1245     explicit CBlockLocator(const CBlockIndex* pindex)
1246     {
1247         Set(pindex);
1248     }
1249
1250     explicit CBlockLocator(uint256 hashBlock)
1251     {
1252         std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1253         if (mi != mapBlockIndex.end())
1254             Set((*mi).second);
1255     }
1256
1257     IMPLEMENT_SERIALIZE
1258     (
1259         if (!(nType & SER_GETHASH))
1260             READWRITE(nVersion);
1261         READWRITE(vHave);
1262     )
1263
1264     void SetNull()
1265     {
1266         vHave.clear();
1267     }
1268
1269     bool IsNull()
1270     {
1271         return vHave.empty();
1272     }
1273
1274     void Set(const CBlockIndex* pindex)
1275     {
1276         vHave.clear();
1277         int nStep = 1;
1278         while (pindex)
1279         {
1280             vHave.push_back(pindex->GetBlockHash());
1281
1282             // Exponentially larger steps back
1283             for (int i = 0; pindex && i < nStep; i++)
1284                 pindex = pindex->pprev;
1285             if (vHave.size() > 10)
1286                 nStep *= 2;
1287         }
1288         vHave.push_back(hashGenesisBlock);
1289     }
1290
1291     int GetDistanceBack()
1292     {
1293         // Retrace how far back it was in the sender's branch
1294         int nDistance = 0;
1295         int nStep = 1;
1296         BOOST_FOREACH(const uint256& hash, vHave)
1297         {
1298             std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1299             if (mi != mapBlockIndex.end())
1300             {
1301                 CBlockIndex* pindex = (*mi).second;
1302                 if (pindex->IsInMainChain())
1303                     return nDistance;
1304             }
1305             nDistance += nStep;
1306             if (nDistance > 10)
1307                 nStep *= 2;
1308         }
1309         return nDistance;
1310     }
1311
1312     CBlockIndex* GetBlockIndex()
1313     {
1314         // Find the first block the caller has in the main chain
1315         BOOST_FOREACH(const uint256& hash, vHave)
1316         {
1317             std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1318             if (mi != mapBlockIndex.end())
1319             {
1320                 CBlockIndex* pindex = (*mi).second;
1321                 if (pindex->IsInMainChain())
1322                     return pindex;
1323             }
1324         }
1325         return pindexGenesisBlock;
1326     }
1327
1328     uint256 GetBlockHash()
1329     {
1330         // Find the first block the caller has in the main chain
1331         BOOST_FOREACH(const uint256& hash, vHave)
1332         {
1333             std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1334             if (mi != mapBlockIndex.end())
1335             {
1336                 CBlockIndex* pindex = (*mi).second;
1337                 if (pindex->IsInMainChain())
1338                     return hash;
1339             }
1340         }
1341         return hashGenesisBlock;
1342     }
1343
1344     int GetHeight()
1345     {
1346         CBlockIndex* pindex = GetBlockIndex();
1347         if (!pindex)
1348             return 0;
1349         return pindex->nHeight;
1350     }
1351 };
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361 //
1362 // Alerts are for notifying old versions if they become too obsolete and
1363 // need to upgrade.  The message is displayed in the status bar.
1364 // Alert messages are broadcast as a vector of signed data.  Unserializing may
1365 // not read the entire buffer if the alert is for a newer version, but older
1366 // versions can still relay the original data.
1367 //
1368 class CUnsignedAlert
1369 {
1370 public:
1371     int nVersion;
1372     int64 nRelayUntil;      // when newer nodes stop relaying to newer nodes
1373     int64 nExpiration;
1374     int nID;
1375     int nCancel;
1376     std::set<int> setCancel;
1377     int nMinVer;            // lowest version inclusive
1378     int nMaxVer;            // highest version inclusive
1379     std::set<std::string> setSubVer;  // empty matches all
1380     int nPriority;
1381
1382     // Actions
1383     std::string strComment;
1384     std::string strStatusBar;
1385     std::string strReserved;
1386
1387     IMPLEMENT_SERIALIZE
1388     (
1389         READWRITE(this->nVersion);
1390         nVersion = this->nVersion;
1391         READWRITE(nRelayUntil);
1392         READWRITE(nExpiration);
1393         READWRITE(nID);
1394         READWRITE(nCancel);
1395         READWRITE(setCancel);
1396         READWRITE(nMinVer);
1397         READWRITE(nMaxVer);
1398         READWRITE(setSubVer);
1399         READWRITE(nPriority);
1400
1401         READWRITE(strComment);
1402         READWRITE(strStatusBar);
1403         READWRITE(strReserved);
1404     )
1405
1406     void SetNull()
1407     {
1408         nVersion = 1;
1409         nRelayUntil = 0;
1410         nExpiration = 0;
1411         nID = 0;
1412         nCancel = 0;
1413         setCancel.clear();
1414         nMinVer = 0;
1415         nMaxVer = 0;
1416         setSubVer.clear();
1417         nPriority = 0;
1418
1419         strComment.clear();
1420         strStatusBar.clear();
1421         strReserved.clear();
1422     }
1423
1424     std::string ToString() const
1425     {
1426         std::string strSetCancel;
1427         BOOST_FOREACH(int n, setCancel)
1428             strSetCancel += strprintf("%d ", n);
1429         std::string strSetSubVer;
1430         BOOST_FOREACH(std::string str, setSubVer)
1431             strSetSubVer += "\"" + str + "\" ";
1432         return strprintf(
1433                 "CAlert(\n"
1434                 "    nVersion     = %d\n"
1435                 "    nRelayUntil  = %"PRI64d"\n"
1436                 "    nExpiration  = %"PRI64d"\n"
1437                 "    nID          = %d\n"
1438                 "    nCancel      = %d\n"
1439                 "    setCancel    = %s\n"
1440                 "    nMinVer      = %d\n"
1441                 "    nMaxVer      = %d\n"
1442                 "    setSubVer    = %s\n"
1443                 "    nPriority    = %d\n"
1444                 "    strComment   = \"%s\"\n"
1445                 "    strStatusBar = \"%s\"\n"
1446                 ")\n",
1447             nVersion,
1448             nRelayUntil,
1449             nExpiration,
1450             nID,
1451             nCancel,
1452             strSetCancel.c_str(),
1453             nMinVer,
1454             nMaxVer,
1455             strSetSubVer.c_str(),
1456             nPriority,
1457             strComment.c_str(),
1458             strStatusBar.c_str());
1459     }
1460
1461     void print() const
1462     {
1463         printf("%s", ToString().c_str());
1464     }
1465 };
1466
1467 class CAlert : public CUnsignedAlert
1468 {
1469 public:
1470     std::vector<unsigned char> vchMsg;
1471     std::vector<unsigned char> vchSig;
1472
1473     CAlert()
1474     {
1475         SetNull();
1476     }
1477
1478     IMPLEMENT_SERIALIZE
1479     (
1480         READWRITE(vchMsg);
1481         READWRITE(vchSig);
1482     )
1483
1484     void SetNull()
1485     {
1486         CUnsignedAlert::SetNull();
1487         vchMsg.clear();
1488         vchSig.clear();
1489     }
1490
1491     bool IsNull() const
1492     {
1493         return (nExpiration == 0);
1494     }
1495
1496     uint256 GetHash() const
1497     {
1498         return SerializeHash(*this);
1499     }
1500
1501     bool IsInEffect() const
1502     {
1503         return (GetAdjustedTime() < nExpiration);
1504     }
1505
1506     bool Cancels(const CAlert& alert) const
1507     {
1508         if (!IsInEffect())
1509             return false; // this was a no-op before 31403
1510         return (alert.nID <= nCancel || setCancel.count(alert.nID));
1511     }
1512
1513     bool AppliesTo(int nVersion, std::string strSubVerIn) const
1514     {
1515         return (IsInEffect() &&
1516                 nMinVer <= nVersion && nVersion <= nMaxVer &&
1517                 (setSubVer.empty() || setSubVer.count(strSubVerIn)));
1518     }
1519
1520     bool AppliesToMe() const
1521     {
1522         return AppliesTo(VERSION, ::pszSubVer);
1523     }
1524
1525     bool RelayTo(CNode* pnode) const
1526     {
1527         if (!IsInEffect())
1528             return false;
1529         // returns true if wasn't already contained in the set
1530         if (pnode->setKnown.insert(GetHash()).second)
1531         {
1532             if (AppliesTo(pnode->nVersion, pnode->strSubVer) ||
1533                 AppliesToMe() ||
1534                 GetAdjustedTime() < nRelayUntil)
1535             {
1536                 pnode->PushMessage("alert", *this);
1537                 return true;
1538             }
1539         }
1540         return false;
1541     }
1542
1543     bool CheckSignature()
1544     {
1545         CKey key;
1546         if (!key.SetPubKey(ParseHex("04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284")))
1547             return error("CAlert::CheckSignature() : SetPubKey failed");
1548         if (!key.Verify(Hash(vchMsg.begin(), vchMsg.end()), vchSig))
1549             return error("CAlert::CheckSignature() : verify signature failed");
1550
1551         // Now unserialize the data
1552         CDataStream sMsg(vchMsg);
1553         sMsg >> *(CUnsignedAlert*)this;
1554         return true;
1555     }
1556
1557     bool ProcessAlert();
1558 };
1559
1560 #endif