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 COPYING or http://www.opensource.org/licenses/mit-license.php.
13 #include <io.h> /* for _commit */
26 class CRequestTracker;
29 static const unsigned int MAX_BLOCK_SIZE = 1000000;
30 static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2;
31 static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
32 static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100;
33 static const int64 MIN_TX_FEE = 50000;
34 static const int64 MIN_RELAY_TX_FEE = 10000;
35 static const int64 MAX_MONEY = 21000000 * COIN;
36 inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
37 static const int COINBASE_MATURITY = 100;
38 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
39 static const int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
41 static const int fHaveUPnP = true;
43 static const int fHaveUPnP = false;
47 extern CScript COINBASE_FLAGS;
54 extern CCriticalSection cs_main;
55 extern std::map<uint256, CBlockIndex*> mapBlockIndex;
56 extern uint256 hashGenesisBlock;
57 extern CBlockIndex* pindexGenesisBlock;
58 extern int nBestHeight;
59 extern CBigNum bnBestChainWork;
60 extern CBigNum bnBestInvalidWork;
61 extern uint256 hashBestChain;
62 extern CBlockIndex* pindexBest;
63 extern unsigned int nTransactionsUpdated;
64 extern uint64 nLastBlockTx;
65 extern uint64 nLastBlockSize;
66 extern const std::string strMessageMagic;
67 extern double dHashesPerSec;
68 extern int64 nHPSTimerStart;
69 extern int64 nTimeBestReceived;
70 extern CCriticalSection cs_setpwalletRegistered;
71 extern std::set<CWallet*> setpwalletRegistered;
74 extern int64 nTransactionFee;
84 void RegisterWallet(CWallet* pwalletIn);
85 void UnregisterWallet(CWallet* pwalletIn);
86 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
87 bool CheckDiskSpace(uint64 nAdditionalBytes=0);
88 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
89 FILE* AppendBlockFile(unsigned int& nFileRet);
90 bool LoadBlockIndex(bool fAllowNew=true);
91 void PrintBlockTree();
92 bool ProcessMessages(CNode* pfrom);
93 bool SendMessages(CNode* pto, bool fSendTrickle);
94 void GenerateBitcoins(bool fGenerate, CWallet* pwallet);
95 CBlock* CreateNewBlock(CReserveKey& reservekey);
96 void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& nExtraNonce);
97 void FormatHashBuffers(CBlock* pblock, char* pmidstate, char* pdata, char* phash1);
98 bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey);
99 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
100 unsigned int ComputeMinWork(unsigned int nBase, int64 nTime);
101 int GetNumBlocksOfPeers();
102 bool IsInitialBlockDownload();
103 std::string GetWarnings(std::string strFor);
116 bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
118 /** Position on disk for a particular transaction. */
123 unsigned int nBlockPos;
131 CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
134 nBlockPos = nBlockPosIn;
138 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
139 void SetNull() { nFile = -1; nBlockPos = 0; nTxPos = 0; }
140 bool IsNull() const { return (nFile == -1); }
142 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
144 return (a.nFile == b.nFile &&
145 a.nBlockPos == b.nBlockPos &&
146 a.nTxPos == b.nTxPos);
149 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
154 std::string ToString() const
159 return strprintf("(nFile=%d, nBlockPos=%d, nTxPos=%d)", nFile, nBlockPos, nTxPos);
164 printf("%s", ToString().c_str());
170 /** An inpoint - a combination of a transaction and an index n into its vin */
177 CInPoint() { SetNull(); }
178 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
179 void SetNull() { ptx = NULL; n = -1; }
180 bool IsNull() const { return (ptx == NULL && n == -1); }
185 /** An outpoint - a combination of a transaction hash and an index n into its vout */
192 COutPoint() { SetNull(); }
193 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
194 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
195 void SetNull() { hash = 0; n = -1; }
196 bool IsNull() const { return (hash == 0 && n == -1); }
198 friend bool operator<(const COutPoint& a, const COutPoint& b)
200 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
203 friend bool operator==(const COutPoint& a, const COutPoint& b)
205 return (a.hash == b.hash && a.n == b.n);
208 friend bool operator!=(const COutPoint& a, const COutPoint& b)
213 std::string ToString() const
215 return strprintf("COutPoint(%s, %d)", hash.ToString().substr(0,10).c_str(), n);
220 printf("%s\n", ToString().c_str());
227 /** An input of a transaction. It contains the location of the previous
228 * transaction's output that it claims and a signature that matches the
229 * output's public key.
236 unsigned int nSequence;
240 nSequence = std::numeric_limits<unsigned int>::max();
243 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
246 scriptSig = scriptSigIn;
247 nSequence = nSequenceIn;
250 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
252 prevout = COutPoint(hashPrevTx, nOut);
253 scriptSig = scriptSigIn;
254 nSequence = nSequenceIn;
260 READWRITE(scriptSig);
261 READWRITE(nSequence);
266 return (nSequence == std::numeric_limits<unsigned int>::max());
269 friend bool operator==(const CTxIn& a, const CTxIn& b)
271 return (a.prevout == b.prevout &&
272 a.scriptSig == b.scriptSig &&
273 a.nSequence == b.nSequence);
276 friend bool operator!=(const CTxIn& a, const CTxIn& b)
281 std::string ToString() const
285 str += prevout.ToString();
286 if (prevout.IsNull())
287 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
289 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
290 if (nSequence != std::numeric_limits<unsigned int>::max())
291 str += strprintf(", nSequence=%u", nSequence);
298 printf("%s\n", ToString().c_str());
305 /** An output of a transaction. It contains the public key that the next input
306 * must be able to sign with to claim it.
312 CScript scriptPubKey;
319 CTxOut(int64 nValueIn, CScript scriptPubKeyIn)
322 scriptPubKey = scriptPubKeyIn;
328 READWRITE(scriptPubKey);
334 scriptPubKey.clear();
339 return (nValue == -1);
342 uint256 GetHash() const
344 return SerializeHash(*this);
347 friend bool operator==(const CTxOut& a, const CTxOut& b)
349 return (a.nValue == b.nValue &&
350 a.scriptPubKey == b.scriptPubKey);
353 friend bool operator!=(const CTxOut& a, const CTxOut& b)
358 std::string ToString() const
360 if (scriptPubKey.size() < 6)
361 return "CTxOut(error)";
362 return strprintf("CTxOut(nValue=%"PRI64d".%08"PRI64d", scriptPubKey=%s)", nValue / COIN, nValue % COIN, scriptPubKey.ToString().substr(0,30).c_str());
367 printf("%s\n", ToString().c_str());
381 typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
383 /** The basic transaction that is broadcasted on the network and contained in
384 * blocks. A transaction can contain multiple inputs and outputs.
390 std::vector<CTxIn> vin;
391 std::vector<CTxOut> vout;
392 unsigned int nLockTime;
394 // Denial-of-service detection:
396 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
405 READWRITE(this->nVersion);
406 nVersion = this->nVersion;
409 READWRITE(nLockTime);
418 nDoS = 0; // Denial-of-service prevention
423 return (vin.empty() && vout.empty());
426 uint256 GetHash() const
428 return SerializeHash(*this);
431 bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const
433 // Time based nLockTime implemented in 0.1.6
436 if (nBlockHeight == 0)
437 nBlockHeight = nBestHeight;
439 nBlockTime = GetAdjustedTime();
440 if ((int64)nLockTime < ((int64)nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime))
442 BOOST_FOREACH(const CTxIn& txin, vin)
448 bool IsNewerThan(const CTransaction& old) const
450 if (vin.size() != old.vin.size())
452 for (unsigned int i = 0; i < vin.size(); i++)
453 if (vin[i].prevout != old.vin[i].prevout)
457 unsigned int nLowest = std::numeric_limits<unsigned int>::max();
458 for (unsigned int i = 0; i < vin.size(); i++)
460 if (vin[i].nSequence != old.vin[i].nSequence)
462 if (vin[i].nSequence <= nLowest)
465 nLowest = vin[i].nSequence;
467 if (old.vin[i].nSequence < nLowest)
470 nLowest = old.vin[i].nSequence;
477 bool IsCoinBase() const
479 return (vin.size() == 1 && vin[0].prevout.IsNull());
482 /** Check for standard transaction types
483 @return True if all outputs (scriptPubKeys) use only standard transaction forms
485 bool IsStandard() const;
487 /** Check for standard transaction types
488 @param[in] mapInputs Map of previous transactions that have outputs we're spending
489 @return True if all inputs (scriptSigs) use only standard transaction forms
490 @see CTransaction::FetchInputs
492 bool AreInputsStandard(const MapPrevTx& mapInputs) const;
494 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
495 @return number of sigops this transaction's outputs will produce when spent
496 @see CTransaction::FetchInputs
498 unsigned int GetLegacySigOpCount() const;
500 /** Count ECDSA signature operations in pay-to-script-hash inputs.
502 @param[in] mapInputs Map of previous transactions that have outputs we're spending
503 @return maximum number of sigops required to validate this transaction's inputs
504 @see CTransaction::FetchInputs
506 unsigned int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
508 /** Amount of bitcoins spent by this transaction.
509 @return sum of all outputs (note: does not include fees)
511 int64 GetValueOut() const
514 BOOST_FOREACH(const CTxOut& txout, vout)
516 nValueOut += txout.nValue;
517 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
518 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
523 /** Amount of bitcoins coming in to this transaction
524 Note that lightweight clients may not know anything besides the hash of previous transactions,
525 so may not be able to calculate this.
527 @param[in] mapInputs Map of previous transactions that have outputs we're spending
528 @return Sum of value of all inputs (scriptSigs)
529 @see CTransaction::FetchInputs
531 int64 GetValueIn(const MapPrevTx& mapInputs) const;
533 static bool AllowFree(double dPriority)
535 // Large (in bytes) low-priority (new, small-coin) transactions
537 return dPriority > COIN * 144 / 250;
540 int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=true, enum GetMinFee_mode mode=GMF_BLOCK) const
542 // Base fee is either MIN_TX_FEE or MIN_RELAY_TX_FEE
543 int64 nBaseFee = (mode == GMF_RELAY) ? MIN_RELAY_TX_FEE : MIN_TX_FEE;
545 unsigned int nBytes = ::GetSerializeSize(*this, SER_NETWORK, PROTOCOL_VERSION);
546 unsigned int nNewBlockSize = nBlockSize + nBytes;
547 int64 nMinFee = (1 + (int64)nBytes / 1000) * nBaseFee;
553 // Transactions under 10K are free
554 // (about 4500bc if made of 50bc inputs)
560 // Free transaction area
561 if (nNewBlockSize < 27000)
566 // To limit dust spam, require MIN_TX_FEE/MIN_RELAY_TX_FEE if any output is less than 0.01
567 if (nMinFee < nBaseFee)
569 BOOST_FOREACH(const CTxOut& txout, vout)
570 if (txout.nValue < CENT)
574 // Raise the price as the block approaches full
575 if (nBlockSize != 1 && nNewBlockSize >= MAX_BLOCK_SIZE_GEN/2)
577 if (nNewBlockSize >= MAX_BLOCK_SIZE_GEN)
579 nMinFee *= MAX_BLOCK_SIZE_GEN / (MAX_BLOCK_SIZE_GEN - nNewBlockSize);
582 if (!MoneyRange(nMinFee))
588 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
590 CAutoFile filein = CAutoFile(OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb"), SER_DISK, CLIENT_VERSION);
592 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
595 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
596 return error("CTransaction::ReadFromDisk() : fseek failed");
601 catch (std::exception &e) {
602 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
605 // Return file pointer
608 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
609 return error("CTransaction::ReadFromDisk() : second fseek failed");
610 *pfileRet = filein.release();
615 friend bool operator==(const CTransaction& a, const CTransaction& b)
617 return (a.nVersion == b.nVersion &&
620 a.nLockTime == b.nLockTime);
623 friend bool operator!=(const CTransaction& a, const CTransaction& b)
629 std::string ToString() const
632 str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%d, vout.size=%d, nLockTime=%d)\n",
633 GetHash().ToString().substr(0,10).c_str(),
638 for (unsigned int i = 0; i < vin.size(); i++)
639 str += " " + vin[i].ToString() + "\n";
640 for (unsigned int i = 0; i < vout.size(); i++)
641 str += " " + vout[i].ToString() + "\n";
647 printf("%s", ToString().c_str());
651 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
652 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
653 bool ReadFromDisk(COutPoint prevout);
654 bool DisconnectInputs(CTxDB& txdb);
656 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
658 @param[in] txdb Transaction database
659 @param[in] mapTestPool List of pending changes to the transaction index database
660 @param[in] fBlock True if being called to add a new best-block to the chain
661 @param[in] fMiner True if being called by CreateNewBlock
662 @param[out] inputsRet Pointers to this transaction's inputs
663 @param[out] fInvalid returns true if transaction is invalid
664 @return Returns true if all inputs are in txdb or mapTestPool
666 bool FetchInputs(CTxDB& txdb, const std::map<uint256, CTxIndex>& mapTestPool,
667 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
669 /** Sanity check previous transactions, then, if all checks succeed,
670 mark them as spent by this transaction.
672 @param[in] inputs Previous transactions (from FetchInputs)
673 @param[out] mapTestPool Keeps track of inputs that need to be updated on disk
674 @param[in] posThisTx Position of this transaction on disk
675 @param[in] pindexBlock
676 @param[in] fBlock true if called from ConnectBlock
677 @param[in] fMiner true if called from CreateNewBlock
678 @param[in] fStrictPayToScriptHash true if fully validating p2sh transactions
679 @return Returns true if all checks succeed
681 bool ConnectInputs(MapPrevTx inputs,
682 std::map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx,
683 const CBlockIndex* pindexBlock, bool fBlock, bool fMiner, bool fStrictPayToScriptHash=true);
684 bool ClientConnectInputs();
685 bool CheckTransaction() const;
686 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
689 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
696 /** A transaction with a merkle branch linking it to the block chain. */
697 class CMerkleTx : public CTransaction
701 std::vector<uint256> vMerkleBranch;
705 mutable bool fMerkleVerified;
713 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
722 fMerkleVerified = false;
728 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
729 nVersion = this->nVersion;
730 READWRITE(hashBlock);
731 READWRITE(vMerkleBranch);
736 int SetMerkleBranch(const CBlock* pblock=NULL);
737 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
738 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
739 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
740 int GetBlocksToMaturity() const;
741 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
742 bool AcceptToMemoryPool();
748 /** A txdb record that contains the disk location of a transaction and the
749 * locations of transactions that spend its outputs. vSpent is really only
750 * used as a flag, but having the location is very helpful for debugging.
756 std::vector<CDiskTxPos> vSpent;
763 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
766 vSpent.resize(nOutputs);
771 if (!(nType & SER_GETHASH))
788 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
790 return (a.pos == b.pos &&
791 a.vSpent == b.vSpent);
794 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
798 int GetDepthInMainChain() const;
806 /** Nodes collect new transactions into a block, hash them into a hash tree,
807 * and scan through nonce values to make the block's hash satisfy proof-of-work
808 * requirements. When they solve the proof-of-work, they broadcast the block
809 * to everyone and the block is added to the block chain. The first transaction
810 * in the block is a special one that creates a new coin owned by the creator
813 * Blocks are appended to blk0001.dat files on disk. Their location on disk
814 * is indexed by CBlockIndex objects in memory.
821 uint256 hashPrevBlock;
822 uint256 hashMerkleRoot;
828 std::vector<CTransaction> vtx;
831 mutable std::vector<uint256> vMerkleTree;
833 // Denial-of-service detection:
835 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
844 READWRITE(this->nVersion);
845 nVersion = this->nVersion;
846 READWRITE(hashPrevBlock);
847 READWRITE(hashMerkleRoot);
852 // ConnectBlock depends on vtx being last so it can calculate offset
853 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
856 const_cast<CBlock*>(this)->vtx.clear();
877 uint256 GetHash() const
879 return Hash(BEGIN(nVersion), END(nNonce));
882 int64 GetBlockTime() const
887 void UpdateTime(const CBlockIndex* pindexPrev);
890 uint256 BuildMerkleTree() const
893 BOOST_FOREACH(const CTransaction& tx, vtx)
894 vMerkleTree.push_back(tx.GetHash());
896 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
898 for (int i = 0; i < nSize; i += 2)
900 int i2 = std::min(i+1, nSize-1);
901 vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
902 BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
906 return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
909 std::vector<uint256> GetMerkleBranch(int nIndex) const
911 if (vMerkleTree.empty())
913 std::vector<uint256> vMerkleBranch;
915 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
917 int i = std::min(nIndex^1, nSize-1);
918 vMerkleBranch.push_back(vMerkleTree[j+i]);
922 return vMerkleBranch;
925 static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
929 BOOST_FOREACH(const uint256& otherside, vMerkleBranch)
932 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
934 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
941 bool WriteToDisk(unsigned int& nFileRet, unsigned int& nBlockPosRet)
943 // Open history file to append
944 CAutoFile fileout = CAutoFile(AppendBlockFile(nFileRet), SER_DISK, CLIENT_VERSION);
946 return error("CBlock::WriteToDisk() : AppendBlockFile failed");
948 // Write index header
949 unsigned int nSize = fileout.GetSerializeSize(*this);
950 fileout << FLATDATA(pchMessageStart) << nSize;
953 long fileOutPos = ftell(fileout);
955 return error("CBlock::WriteToDisk() : ftell failed");
956 nBlockPosRet = fileOutPos;
959 // Flush stdio buffers and commit to disk before returning
961 if (!IsInitialBlockDownload() || (nBestHeight+1) % 500 == 0)
964 _commit(_fileno(fileout));
966 fsync(fileno(fileout));
973 bool ReadFromDisk(unsigned int nFile, unsigned int nBlockPos, bool fReadTransactions=true)
977 // Open history file to read
978 CAutoFile filein = CAutoFile(OpenBlockFile(nFile, nBlockPos, "rb"), SER_DISK, CLIENT_VERSION);
980 return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
981 if (!fReadTransactions)
982 filein.nType |= SER_BLOCKHEADERONLY;
988 catch (std::exception &e) {
989 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
993 if (!CheckProofOfWork(GetHash(), nBits))
994 return error("CBlock::ReadFromDisk() : errors in block header");
1003 printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%d)\n",
1004 GetHash().ToString().substr(0,20).c_str(),
1006 hashPrevBlock.ToString().substr(0,20).c_str(),
1007 hashMerkleRoot.ToString().substr(0,10).c_str(),
1008 nTime, nBits, nNonce,
1010 for (unsigned int i = 0; i < vtx.size(); i++)
1015 printf(" vMerkleTree: ");
1016 for (unsigned int i = 0; i < vMerkleTree.size(); i++)
1017 printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
1022 bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1023 bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1024 bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
1025 bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
1026 bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
1027 bool CheckBlock() const;
1031 bool SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew);
1039 /** The block chain is a tree shaped structure starting with the
1040 * genesis block at the root, with each block potentially having multiple
1041 * candidates to be the next block. pprev and pnext link a path through the
1042 * main/longest chain. A blockindex may have multiple pprev pointing back
1043 * to it, but pnext will only point forward to the longest branch, or will
1044 * be null if the block is not part of the longest chain.
1049 const uint256* phashBlock;
1053 unsigned int nBlockPos;
1055 CBigNum bnChainWork;
1059 uint256 hashMerkleRoot;
1062 unsigned int nNonce;
1082 CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block)
1088 nBlockPos = nBlockPosIn;
1092 nVersion = block.nVersion;
1093 hashMerkleRoot = block.hashMerkleRoot;
1094 nTime = block.nTime;
1095 nBits = block.nBits;
1096 nNonce = block.nNonce;
1099 CBlock GetBlockHeader() const
1102 block.nVersion = nVersion;
1104 block.hashPrevBlock = pprev->GetBlockHash();
1105 block.hashMerkleRoot = hashMerkleRoot;
1106 block.nTime = nTime;
1107 block.nBits = nBits;
1108 block.nNonce = nNonce;
1112 uint256 GetBlockHash() const
1117 int64 GetBlockTime() const
1119 return (int64)nTime;
1122 CBigNum GetBlockWork() const
1125 bnTarget.SetCompact(nBits);
1128 return (CBigNum(1)<<256) / (bnTarget+1);
1131 bool IsInMainChain() const
1133 return (pnext || this == pindexBest);
1136 bool CheckIndex() const
1138 return CheckProofOfWork(GetBlockHash(), nBits);
1141 bool EraseBlockFromDisk()
1143 // Open history file
1144 CAutoFile fileout = CAutoFile(OpenBlockFile(nFile, nBlockPos, "rb+"), SER_DISK, CLIENT_VERSION);
1148 // Overwrite with empty null block
1156 enum { nMedianTimeSpan=11 };
1158 int64 GetMedianTimePast() const
1160 int64 pmedian[nMedianTimeSpan];
1161 int64* pbegin = &pmedian[nMedianTimeSpan];
1162 int64* pend = &pmedian[nMedianTimeSpan];
1164 const CBlockIndex* pindex = this;
1165 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1166 *(--pbegin) = pindex->GetBlockTime();
1168 std::sort(pbegin, pend);
1169 return pbegin[(pend - pbegin)/2];
1172 int64 GetMedianTime() const
1174 const CBlockIndex* pindex = this;
1175 for (int i = 0; i < nMedianTimeSpan/2; i++)
1178 return GetBlockTime();
1179 pindex = pindex->pnext;
1181 return pindex->GetMedianTimePast();
1186 std::string ToString() const
1188 return strprintf("CBlockIndex(nprev=%08x, pnext=%08x, nFile=%d, nBlockPos=%-6d nHeight=%d, merkle=%s, hashBlock=%s)",
1189 pprev, pnext, nFile, nBlockPos, nHeight,
1190 hashMerkleRoot.ToString().substr(0,10).c_str(),
1191 GetBlockHash().ToString().substr(0,20).c_str());
1196 printf("%s\n", ToString().c_str());
1202 /** Used to marshal pointers into hashes for db storage. */
1203 class CDiskBlockIndex : public CBlockIndex
1215 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1217 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1218 hashNext = (pnext ? pnext->GetBlockHash() : 0);
1223 if (!(nType & SER_GETHASH))
1224 READWRITE(nVersion);
1226 READWRITE(hashNext);
1228 READWRITE(nBlockPos);
1232 READWRITE(this->nVersion);
1233 READWRITE(hashPrev);
1234 READWRITE(hashMerkleRoot);
1240 uint256 GetBlockHash() const
1243 block.nVersion = nVersion;
1244 block.hashPrevBlock = hashPrev;
1245 block.hashMerkleRoot = hashMerkleRoot;
1246 block.nTime = nTime;
1247 block.nBits = nBits;
1248 block.nNonce = nNonce;
1249 return block.GetHash();
1253 std::string ToString() const
1255 std::string str = "CDiskBlockIndex(";
1256 str += CBlockIndex::ToString();
1257 str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
1258 GetBlockHash().ToString().c_str(),
1259 hashPrev.ToString().substr(0,20).c_str(),
1260 hashNext.ToString().substr(0,20).c_str());
1266 printf("%s\n", ToString().c_str());
1277 /** Describes a place in the block chain to another node such that if the
1278 * other node doesn't have the same branch, it can find a recent common trunk.
1279 * The further back it is, the further before the fork it may be.
1284 std::vector<uint256> vHave;
1291 explicit CBlockLocator(const CBlockIndex* pindex)
1296 explicit CBlockLocator(uint256 hashBlock)
1298 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1299 if (mi != mapBlockIndex.end())
1303 CBlockLocator(const std::vector<uint256>& vHaveIn)
1310 if (!(nType & SER_GETHASH))
1311 READWRITE(nVersion);
1322 return vHave.empty();
1325 void Set(const CBlockIndex* pindex)
1331 vHave.push_back(pindex->GetBlockHash());
1333 // Exponentially larger steps back
1334 for (int i = 0; pindex && i < nStep; i++)
1335 pindex = pindex->pprev;
1336 if (vHave.size() > 10)
1339 vHave.push_back(hashGenesisBlock);
1342 int GetDistanceBack()
1344 // Retrace how far back it was in the sender's branch
1347 BOOST_FOREACH(const uint256& hash, vHave)
1349 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1350 if (mi != mapBlockIndex.end())
1352 CBlockIndex* pindex = (*mi).second;
1353 if (pindex->IsInMainChain())
1363 CBlockIndex* GetBlockIndex()
1365 // Find the first block the caller has in the main chain
1366 BOOST_FOREACH(const uint256& hash, vHave)
1368 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1369 if (mi != mapBlockIndex.end())
1371 CBlockIndex* pindex = (*mi).second;
1372 if (pindex->IsInMainChain())
1376 return pindexGenesisBlock;
1379 uint256 GetBlockHash()
1381 // Find the first block the caller has in the main chain
1382 BOOST_FOREACH(const uint256& hash, vHave)
1384 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1385 if (mi != mapBlockIndex.end())
1387 CBlockIndex* pindex = (*mi).second;
1388 if (pindex->IsInMainChain())
1392 return hashGenesisBlock;
1397 CBlockIndex* pindex = GetBlockIndex();
1400 return pindex->nHeight;
1412 /** Alerts are for notifying old versions if they become too obsolete and
1413 * need to upgrade. The message is displayed in the status bar.
1414 * Alert messages are broadcast as a vector of signed data. Unserializing may
1415 * not read the entire buffer if the alert is for a newer version, but older
1416 * versions can still relay the original data.
1418 class CUnsignedAlert
1422 int64 nRelayUntil; // when newer nodes stop relaying to newer nodes
1426 std::set<int> setCancel;
1427 int nMinVer; // lowest version inclusive
1428 int nMaxVer; // highest version inclusive
1429 std::set<std::string> setSubVer; // empty matches all
1433 std::string strComment;
1434 std::string strStatusBar;
1435 std::string strReserved;
1439 READWRITE(this->nVersion);
1440 nVersion = this->nVersion;
1441 READWRITE(nRelayUntil);
1442 READWRITE(nExpiration);
1445 READWRITE(setCancel);
1448 READWRITE(setSubVer);
1449 READWRITE(nPriority);
1451 READWRITE(strComment);
1452 READWRITE(strStatusBar);
1453 READWRITE(strReserved);
1470 strStatusBar.clear();
1471 strReserved.clear();
1474 std::string ToString() const
1476 std::string strSetCancel;
1477 BOOST_FOREACH(int n, setCancel)
1478 strSetCancel += strprintf("%d ", n);
1479 std::string strSetSubVer;
1480 BOOST_FOREACH(std::string str, setSubVer)
1481 strSetSubVer += "\"" + str + "\" ";
1485 " nRelayUntil = %"PRI64d"\n"
1486 " nExpiration = %"PRI64d"\n"
1494 " strComment = \"%s\"\n"
1495 " strStatusBar = \"%s\"\n"
1502 strSetCancel.c_str(),
1505 strSetSubVer.c_str(),
1508 strStatusBar.c_str());
1513 printf("%s", ToString().c_str());
1517 /** An alert is a combination of a serialized CUnsignedAlert and a signature. */
1518 class CAlert : public CUnsignedAlert
1521 std::vector<unsigned char> vchMsg;
1522 std::vector<unsigned char> vchSig;
1537 CUnsignedAlert::SetNull();
1544 return (nExpiration == 0);
1547 uint256 GetHash() const
1549 return SerializeHash(*this);
1552 bool IsInEffect() const
1554 return (GetAdjustedTime() < nExpiration);
1557 bool Cancels(const CAlert& alert) const
1560 return false; // this was a no-op before 31403
1561 return (alert.nID <= nCancel || setCancel.count(alert.nID));
1564 bool AppliesTo(int nVersion, std::string strSubVerIn) const
1566 // TODO: rework for client-version-embedded-in-strSubVer ?
1567 return (IsInEffect() &&
1568 nMinVer <= nVersion && nVersion <= nMaxVer &&
1569 (setSubVer.empty() || setSubVer.count(strSubVerIn)));
1572 bool AppliesToMe() const
1574 return AppliesTo(PROTOCOL_VERSION, FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector<std::string>()));
1577 bool RelayTo(CNode* pnode) const
1581 // returns true if wasn't already contained in the set
1582 if (pnode->setKnown.insert(GetHash()).second)
1584 if (AppliesTo(pnode->nVersion, pnode->strSubVer) ||
1586 GetAdjustedTime() < nRelayUntil)
1588 pnode->PushMessage("alert", *this);
1595 bool CheckSignature()
1598 if (!key.SetPubKey(ParseHex("04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284")))
1599 return error("CAlert::CheckSignature() : SetPubKey failed");
1600 if (!key.Verify(Hash(vchMsg.begin(), vchMsg.end()), vchSig))
1601 return error("CAlert::CheckSignature() : verify signature failed");
1603 // Now unserialize the data
1604 CDataStream sMsg(vchMsg, SER_NETWORK, PROTOCOL_VERSION);
1605 sMsg >> *(CUnsignedAlert*)this;
1609 bool ProcessAlert();
1615 mutable CCriticalSection cs;
1616 std::map<uint256, CTransaction> mapTx;
1617 std::map<COutPoint, CInPoint> mapNextTx;
1619 bool accept(CTxDB& txdb, CTransaction &tx,
1620 bool fCheckInputs, bool* pfMissingInputs);
1621 bool addUnchecked(CTransaction &tx);
1622 bool remove(CTransaction &tx);
1624 unsigned long size()
1627 return mapTx.size();
1630 bool exists(uint256 hash)
1632 return (mapTx.count(hash) != 0);
1635 CTransaction& lookup(uint256 hash)
1641 extern CTxMemPool mempool;