1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2011 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.
26 class CRequestTracker;
29 static const int CLIENT_VERSION = 59900;
30 static const bool VERSION_IS_BETA = true;
31 extern const std::string CLIENT_NAME;
33 static const unsigned int MAX_BLOCK_SIZE = 1000000;
34 static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2;
35 static const int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
36 static const int64 COIN = 100000000;
37 static const int64 CENT = 1000000;
38 static const int64 MIN_TX_FEE = 50000;
39 static const int64 MIN_RELAY_TX_FEE = 10000;
40 static const int64 MAX_MONEY = 21000000 * COIN;
41 inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
42 static const int COINBASE_MATURITY = 100;
43 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
44 static const int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
46 static const int fHaveUPnP = true;
48 static const int fHaveUPnP = false;
52 // Put "/P2SH/" in the coinbase so everybody can tell when
53 // a majority of miners support it
54 static const char* pszP2SH = "/P2SH/";
55 static const CScript COINBASE_FLAGS = CScript() << std::vector<unsigned char>(pszP2SH, pszP2SH+strlen(pszP2SH));
62 extern CCriticalSection cs_main;
63 extern std::map<uint256, CBlockIndex*> mapBlockIndex;
64 extern uint256 hashGenesisBlock;
65 extern CBlockIndex* pindexGenesisBlock;
66 extern int nBestHeight;
67 extern CBigNum bnBestChainWork;
68 extern CBigNum bnBestInvalidWork;
69 extern uint256 hashBestChain;
70 extern CBlockIndex* pindexBest;
71 extern uint64 nPooledTx;
72 extern unsigned int nTransactionsUpdated;
73 extern uint64 nLastBlockTx;
74 extern uint64 nLastBlockSize;
75 extern double dHashesPerSec;
76 extern int64 nHPSTimerStart;
77 extern int64 nTimeBestReceived;
78 extern CCriticalSection cs_setpwalletRegistered;
79 extern std::set<CWallet*> setpwalletRegistered;
82 extern int fGenerateBitcoins;
83 extern int64 nTransactionFee;
84 extern int fLimitProcessors;
85 extern int nLimitProcessors;
86 extern int fMinimizeToTray;
87 extern int fMinimizeOnClose;
98 void RegisterWallet(CWallet* pwalletIn);
99 void UnregisterWallet(CWallet* pwalletIn);
100 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
101 bool CheckDiskSpace(uint64 nAdditionalBytes=0);
102 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
103 FILE* AppendBlockFile(unsigned int& nFileRet);
104 bool LoadBlockIndex(bool fAllowNew=true);
105 void PrintBlockTree();
106 bool ProcessMessages(CNode* pfrom);
107 bool SendMessages(CNode* pto, bool fSendTrickle);
108 void GenerateBitcoins(bool fGenerate, CWallet* pwallet);
109 CBlock* CreateNewBlock(CReserveKey& reservekey);
110 void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& nExtraNonce);
111 void FormatHashBuffers(CBlock* pblock, char* pmidstate, char* pdata, char* phash1);
112 bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey);
113 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
114 unsigned int ComputeMinWork(unsigned int nBase, int64 nTime);
115 int GetNumBlocksOfPeers();
116 bool IsInitialBlockDownload();
117 std::string GetWarnings(std::string strFor);
130 bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
133 bool WriteSetting(const std::string& strKey, const T& value)
136 BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
138 std::string strWalletFile;
139 if (!GetWalletFile(pwallet, strWalletFile))
141 fOk |= CWalletDB(strWalletFile).WriteSetting(strKey, value);
151 unsigned int nBlockPos;
159 CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
162 nBlockPos = nBlockPosIn;
166 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
167 void SetNull() { nFile = -1; nBlockPos = 0; nTxPos = 0; }
168 bool IsNull() const { return (nFile == -1); }
170 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
172 return (a.nFile == b.nFile &&
173 a.nBlockPos == b.nBlockPos &&
174 a.nTxPos == b.nTxPos);
177 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
182 std::string ToString() const
185 return strprintf("null");
187 return strprintf("(nFile=%d, nBlockPos=%d, nTxPos=%d)", nFile, nBlockPos, nTxPos);
192 printf("%s", ToString().c_str());
205 CInPoint() { SetNull(); }
206 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
207 void SetNull() { ptx = NULL; n = -1; }
208 bool IsNull() const { return (ptx == NULL && n == -1); }
220 COutPoint() { SetNull(); }
221 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
222 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
223 void SetNull() { hash = 0; n = -1; }
224 bool IsNull() const { return (hash == 0 && n == -1); }
226 friend bool operator<(const COutPoint& a, const COutPoint& b)
228 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
231 friend bool operator==(const COutPoint& a, const COutPoint& b)
233 return (a.hash == b.hash && a.n == b.n);
236 friend bool operator!=(const COutPoint& a, const COutPoint& b)
241 std::string ToString() const
243 return strprintf("COutPoint(%s, %d)", hash.ToString().substr(0,10).c_str(), n);
248 printf("%s\n", ToString().c_str());
256 // An input of a transaction. It contains the location of the previous
257 // transaction's output that it claims and a signature that matches the
258 // output's public key.
265 unsigned int nSequence;
269 nSequence = std::numeric_limits<unsigned int>::max();
272 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
275 scriptSig = scriptSigIn;
276 nSequence = nSequenceIn;
279 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
281 prevout = COutPoint(hashPrevTx, nOut);
282 scriptSig = scriptSigIn;
283 nSequence = nSequenceIn;
289 READWRITE(scriptSig);
290 READWRITE(nSequence);
295 return (nSequence == std::numeric_limits<unsigned int>::max());
298 friend bool operator==(const CTxIn& a, const CTxIn& b)
300 return (a.prevout == b.prevout &&
301 a.scriptSig == b.scriptSig &&
302 a.nSequence == b.nSequence);
305 friend bool operator!=(const CTxIn& a, const CTxIn& b)
310 std::string ToString() const
313 str += strprintf("CTxIn(");
314 str += prevout.ToString();
315 if (prevout.IsNull())
316 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
318 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
319 if (nSequence != std::numeric_limits<unsigned int>::max())
320 str += strprintf(", nSequence=%u", nSequence);
327 printf("%s\n", ToString().c_str());
335 // An output of a transaction. It contains the public key that the next input
336 // must be able to sign with to claim it.
342 CScript scriptPubKey;
349 CTxOut(int64 nValueIn, CScript scriptPubKeyIn)
352 scriptPubKey = scriptPubKeyIn;
358 READWRITE(scriptPubKey);
364 scriptPubKey.clear();
369 return (nValue == -1);
372 uint256 GetHash() const
374 return SerializeHash(*this);
377 friend bool operator==(const CTxOut& a, const CTxOut& b)
379 return (a.nValue == b.nValue &&
380 a.scriptPubKey == b.scriptPubKey);
383 friend bool operator!=(const CTxOut& a, const CTxOut& b)
388 std::string ToString() const
390 if (scriptPubKey.size() < 6)
391 return "CTxOut(error)";
392 return strprintf("CTxOut(nValue=%"PRI64d".%08"PRI64d", scriptPubKey=%s)", nValue / COIN, nValue % COIN, scriptPubKey.ToString().substr(0,30).c_str());
397 printf("%s\n", ToString().c_str());
411 typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
414 // The basic transaction that is broadcasted on the network and contained in
415 // blocks. A transaction can contain multiple inputs and outputs.
421 std::vector<CTxIn> vin;
422 std::vector<CTxOut> vout;
423 unsigned int nLockTime;
425 // Denial-of-service detection:
427 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
436 READWRITE(this->nVersion);
437 nVersion = this->nVersion;
440 READWRITE(nLockTime);
449 nDoS = 0; // Denial-of-service prevention
454 return (vin.empty() && vout.empty());
457 uint256 GetHash() const
459 return SerializeHash(*this);
462 bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const
464 // Time based nLockTime implemented in 0.1.6
467 if (nBlockHeight == 0)
468 nBlockHeight = nBestHeight;
470 nBlockTime = GetAdjustedTime();
471 if ((int64)nLockTime < (nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime))
473 BOOST_FOREACH(const CTxIn& txin, vin)
479 bool IsNewerThan(const CTransaction& old) const
481 if (vin.size() != old.vin.size())
483 for (int i = 0; i < vin.size(); i++)
484 if (vin[i].prevout != old.vin[i].prevout)
488 unsigned int nLowest = std::numeric_limits<unsigned int>::max();
489 for (int i = 0; i < vin.size(); i++)
491 if (vin[i].nSequence != old.vin[i].nSequence)
493 if (vin[i].nSequence <= nLowest)
496 nLowest = vin[i].nSequence;
498 if (old.vin[i].nSequence < nLowest)
501 nLowest = old.vin[i].nSequence;
508 bool IsCoinBase() const
510 return (vin.size() == 1 && vin[0].prevout.IsNull());
513 /** Check for standard transaction types
514 @return True if all outputs (scriptPubKeys) use only standard transaction forms
516 bool IsStandard() const;
518 /** Check for standard transaction types
519 @param[in] mapInputs Map of previous transactions that have outputs we're spending
520 @return True if all inputs (scriptSigs) use only standard transaction forms
521 @see CTransaction::FetchInputs
523 bool AreInputsStandard(const MapPrevTx& mapInputs) const;
525 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
526 @return number of sigops this transaction's outputs will produce when spent
527 @see CTransaction::FetchInputs
529 int GetLegacySigOpCount() const;
531 /** Count ECDSA signature operations in pay-to-script-hash inputs.
533 @param[in] mapInputs Map of previous transactions that have outputs we're spending
534 @return maximum number of sigops required to validate this transaction's inputs
535 @see CTransaction::FetchInputs
537 int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
539 /** Amount of bitcoins spent by this transaction.
540 @return sum of all outputs (note: does not include fees)
542 int64 GetValueOut() const
545 BOOST_FOREACH(const CTxOut& txout, vout)
547 nValueOut += txout.nValue;
548 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
549 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
554 /** Amount of bitcoins coming in to this transaction
555 Note that lightweight clients may not know anything besides the hash of previous transactions,
556 so may not be able to calculate this.
558 @param[in] mapInputs Map of previous transactions that have outputs we're spending
559 @return Sum of value of all inputs (scriptSigs)
560 @see CTransaction::FetchInputs
562 int64 GetValueIn(const MapPrevTx& mapInputs) const;
564 static bool AllowFree(double dPriority)
566 // Large (in bytes) low-priority (new, small-coin) transactions
568 return dPriority > COIN * 144 / 250;
571 int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=true, enum GetMinFee_mode mode=GMF_BLOCK) const
573 // Base fee is either MIN_TX_FEE or MIN_RELAY_TX_FEE
574 int64 nBaseFee = (mode == GMF_RELAY) ? MIN_RELAY_TX_FEE : MIN_TX_FEE;
576 unsigned int nBytes = ::GetSerializeSize(*this, SER_NETWORK);
577 unsigned int nNewBlockSize = nBlockSize + nBytes;
578 int64 nMinFee = (1 + (int64)nBytes / 1000) * nBaseFee;
584 // Transactions under 10K are free
585 // (about 4500bc if made of 50bc inputs)
591 // Free transaction area
592 if (nNewBlockSize < 27000)
597 // To limit dust spam, require MIN_TX_FEE/MIN_RELAY_TX_FEE if any output is less than 0.01
598 if (nMinFee < nBaseFee)
599 BOOST_FOREACH(const CTxOut& txout, vout)
600 if (txout.nValue < CENT)
603 // Raise the price as the block approaches full
604 if (nBlockSize != 1 && nNewBlockSize >= MAX_BLOCK_SIZE_GEN/2)
606 if (nNewBlockSize >= MAX_BLOCK_SIZE_GEN)
608 nMinFee *= MAX_BLOCK_SIZE_GEN / (MAX_BLOCK_SIZE_GEN - nNewBlockSize);
611 if (!MoneyRange(nMinFee))
617 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
619 CAutoFile filein = OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb");
621 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
624 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
625 return error("CTransaction::ReadFromDisk() : fseek failed");
628 // Return file pointer
631 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
632 return error("CTransaction::ReadFromDisk() : second fseek failed");
633 *pfileRet = filein.release();
638 friend bool operator==(const CTransaction& a, const CTransaction& b)
640 return (a.nVersion == b.nVersion &&
643 a.nLockTime == b.nLockTime);
646 friend bool operator!=(const CTransaction& a, const CTransaction& b)
652 std::string ToString() const
655 str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%d, vout.size=%d, nLockTime=%d)\n",
656 GetHash().ToString().substr(0,10).c_str(),
661 for (int i = 0; i < vin.size(); i++)
662 str += " " + vin[i].ToString() + "\n";
663 for (int i = 0; i < vout.size(); i++)
664 str += " " + vout[i].ToString() + "\n";
670 printf("%s", ToString().c_str());
674 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
675 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
676 bool ReadFromDisk(COutPoint prevout);
677 bool DisconnectInputs(CTxDB& txdb);
679 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
681 @param[in] txdb Transaction database
682 @param[in] mapTestPool List of pending changes to the transaction index database
683 @param[in] fBlock True if being called to add a new best-block to the chain
684 @param[in] fMiner True if being called by CreateNewBlock
685 @param[out] inputsRet Pointers to this transaction's inputs
686 @param[out] fInvalid returns true if transaction is invalid
687 @return Returns true if all inputs are in txdb or mapTestPool
689 bool FetchInputs(CTxDB& txdb, const std::map<uint256, CTxIndex>& mapTestPool,
690 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
692 /** Sanity check previous transactions, then, if all checks succeed,
693 mark them as spent by this transaction.
695 @param[in] inputs Previous transactions (from FetchInputs)
696 @param[out] mapTestPool Keeps track of inputs that need to be updated on disk
697 @param[in] posThisTx Position of this transaction on disk
698 @param[in] pindexBlock
699 @param[in] fBlock true if called from ConnectBlock
700 @param[in] fMiner true if called from CreateNewBlock
701 @param[in] fStrictPayToScriptHash true if fully validating p2sh transactions
702 @return Returns true if all checks succeed
704 bool ConnectInputs(MapPrevTx inputs,
705 std::map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx,
706 const CBlockIndex* pindexBlock, bool fBlock, bool fMiner, bool fStrictPayToScriptHash=true);
707 bool ClientConnectInputs();
708 bool CheckTransaction() const;
709 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
710 bool AcceptToMemoryPool(bool fCheckInputs=true, bool* pfMissingInputs=NULL);
713 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
714 bool AddToMemoryPoolUnchecked();
716 bool RemoveFromMemoryPool();
724 // A transaction with a merkle branch linking it to the block chain
726 class CMerkleTx : public CTransaction
730 std::vector<uint256> vMerkleBranch;
734 mutable char fMerkleVerified;
742 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
751 fMerkleVerified = false;
757 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
758 nVersion = this->nVersion;
759 READWRITE(hashBlock);
760 READWRITE(vMerkleBranch);
765 int SetMerkleBranch(const CBlock* pblock=NULL);
766 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
767 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
768 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
769 int GetBlocksToMaturity() const;
770 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
771 bool AcceptToMemoryPool();
778 // A txdb record that contains the disk location of a transaction and the
779 // locations of transactions that spend its outputs. vSpent is really only
780 // used as a flag, but having the location is very helpful for debugging.
786 std::vector<CDiskTxPos> vSpent;
793 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
796 vSpent.resize(nOutputs);
801 if (!(nType & SER_GETHASH))
818 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
820 return (a.pos == b.pos &&
821 a.vSpent == b.vSpent);
824 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
828 int GetDepthInMainChain() const;
837 // Nodes collect new transactions into a block, hash them into a hash tree,
838 // and scan through nonce values to make the block's hash satisfy proof-of-work
839 // requirements. When they solve the proof-of-work, they broadcast the block
840 // to everyone and the block is added to the block chain. The first transaction
841 // in the block is a special one that creates a new coin owned by the creator
844 // Blocks are appended to blk0001.dat files on disk. Their location on disk
845 // is indexed by CBlockIndex objects in memory.
852 uint256 hashPrevBlock;
853 uint256 hashMerkleRoot;
859 std::vector<CTransaction> vtx;
862 mutable std::vector<uint256> vMerkleTree;
864 // Denial-of-service detection:
866 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
875 READWRITE(this->nVersion);
876 nVersion = this->nVersion;
877 READWRITE(hashPrevBlock);
878 READWRITE(hashMerkleRoot);
883 // ConnectBlock depends on vtx being last so it can calculate offset
884 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
887 const_cast<CBlock*>(this)->vtx.clear();
908 uint256 GetHash() const
910 return Hash(BEGIN(nVersion), END(nNonce));
913 int64 GetBlockTime() const
920 uint256 BuildMerkleTree() const
923 BOOST_FOREACH(const CTransaction& tx, vtx)
924 vMerkleTree.push_back(tx.GetHash());
926 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
928 for (int i = 0; i < nSize; i += 2)
930 int i2 = std::min(i+1, nSize-1);
931 vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
932 BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
936 return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
939 std::vector<uint256> GetMerkleBranch(int nIndex) const
941 if (vMerkleTree.empty())
943 std::vector<uint256> vMerkleBranch;
945 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
947 int i = std::min(nIndex^1, nSize-1);
948 vMerkleBranch.push_back(vMerkleTree[j+i]);
952 return vMerkleBranch;
955 static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
959 BOOST_FOREACH(const uint256& otherside, vMerkleBranch)
962 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
964 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
971 bool WriteToDisk(unsigned int& nFileRet, unsigned int& nBlockPosRet)
973 // Open history file to append
974 CAutoFile fileout = AppendBlockFile(nFileRet);
976 return error("CBlock::WriteToDisk() : AppendBlockFile failed");
978 // Write index header
979 unsigned int nSize = fileout.GetSerializeSize(*this);
980 fileout << FLATDATA(pchMessageStart) << nSize;
983 nBlockPosRet = ftell(fileout);
984 if (nBlockPosRet == -1)
985 return error("CBlock::WriteToDisk() : ftell failed");
988 // Flush stdio buffers and commit to disk before returning
990 if (!IsInitialBlockDownload() || (nBestHeight+1) % 500 == 0)
993 _commit(_fileno(fileout));
995 fsync(fileno(fileout));
1002 bool ReadFromDisk(unsigned int nFile, unsigned int nBlockPos, bool fReadTransactions=true)
1006 // Open history file to read
1007 CAutoFile filein = OpenBlockFile(nFile, nBlockPos, "rb");
1009 return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
1010 if (!fReadTransactions)
1011 filein.nType |= SER_BLOCKHEADERONLY;
1017 if (!CheckProofOfWork(GetHash(), nBits))
1018 return error("CBlock::ReadFromDisk() : errors in block header");
1027 printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%d)\n",
1028 GetHash().ToString().substr(0,20).c_str(),
1030 hashPrevBlock.ToString().substr(0,20).c_str(),
1031 hashMerkleRoot.ToString().substr(0,10).c_str(),
1032 nTime, nBits, nNonce,
1034 for (int i = 0; i < vtx.size(); i++)
1039 printf(" vMerkleTree: ");
1040 for (int i = 0; i < vMerkleTree.size(); i++)
1041 printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
1046 bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1047 bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1048 bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
1049 bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
1050 bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
1051 bool CheckBlock() const;
1061 // The block chain is a tree shaped structure starting with the
1062 // genesis block at the root, with each block potentially having multiple
1063 // candidates to be the next block. pprev and pnext link a path through the
1064 // main/longest chain. A blockindex may have multiple pprev pointing back
1065 // to it, but pnext will only point forward to the longest branch, or will
1066 // be null if the block is not part of the longest chain.
1071 const uint256* phashBlock;
1075 unsigned int nBlockPos;
1077 CBigNum bnChainWork;
1081 uint256 hashMerkleRoot;
1084 unsigned int nNonce;
1104 CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block)
1110 nBlockPos = nBlockPosIn;
1114 nVersion = block.nVersion;
1115 hashMerkleRoot = block.hashMerkleRoot;
1116 nTime = block.nTime;
1117 nBits = block.nBits;
1118 nNonce = block.nNonce;
1121 CBlock GetBlockHeader() const
1124 block.nVersion = nVersion;
1126 block.hashPrevBlock = pprev->GetBlockHash();
1127 block.hashMerkleRoot = hashMerkleRoot;
1128 block.nTime = nTime;
1129 block.nBits = nBits;
1130 block.nNonce = nNonce;
1134 uint256 GetBlockHash() const
1139 int64 GetBlockTime() const
1141 return (int64)nTime;
1144 CBigNum GetBlockWork() const
1147 bnTarget.SetCompact(nBits);
1150 return (CBigNum(1)<<256) / (bnTarget+1);
1153 bool IsInMainChain() const
1155 return (pnext || this == pindexBest);
1158 bool CheckIndex() const
1160 return CheckProofOfWork(GetBlockHash(), nBits);
1163 bool EraseBlockFromDisk()
1165 // Open history file
1166 CAutoFile fileout = OpenBlockFile(nFile, nBlockPos, "rb+");
1170 // Overwrite with empty null block
1178 enum { nMedianTimeSpan=11 };
1180 int64 GetMedianTimePast() const
1182 int64 pmedian[nMedianTimeSpan];
1183 int64* pbegin = &pmedian[nMedianTimeSpan];
1184 int64* pend = &pmedian[nMedianTimeSpan];
1186 const CBlockIndex* pindex = this;
1187 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1188 *(--pbegin) = pindex->GetBlockTime();
1190 std::sort(pbegin, pend);
1191 return pbegin[(pend - pbegin)/2];
1194 int64 GetMedianTime() const
1196 const CBlockIndex* pindex = this;
1197 for (int i = 0; i < nMedianTimeSpan/2; i++)
1200 return GetBlockTime();
1201 pindex = pindex->pnext;
1203 return pindex->GetMedianTimePast();
1208 std::string ToString() const
1210 return strprintf("CBlockIndex(nprev=%08x, pnext=%08x, nFile=%d, nBlockPos=%-6d nHeight=%d, merkle=%s, hashBlock=%s)",
1211 pprev, pnext, nFile, nBlockPos, nHeight,
1212 hashMerkleRoot.ToString().substr(0,10).c_str(),
1213 GetBlockHash().ToString().substr(0,20).c_str());
1218 printf("%s\n", ToString().c_str());
1225 // Used to marshal pointers into hashes for db storage.
1227 class CDiskBlockIndex : public CBlockIndex
1239 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1241 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1242 hashNext = (pnext ? pnext->GetBlockHash() : 0);
1247 if (!(nType & SER_GETHASH))
1248 READWRITE(nVersion);
1250 READWRITE(hashNext);
1252 READWRITE(nBlockPos);
1256 READWRITE(this->nVersion);
1257 READWRITE(hashPrev);
1258 READWRITE(hashMerkleRoot);
1264 uint256 GetBlockHash() const
1267 block.nVersion = nVersion;
1268 block.hashPrevBlock = hashPrev;
1269 block.hashMerkleRoot = hashMerkleRoot;
1270 block.nTime = nTime;
1271 block.nBits = nBits;
1272 block.nNonce = nNonce;
1273 return block.GetHash();
1277 std::string ToString() const
1279 std::string str = "CDiskBlockIndex(";
1280 str += CBlockIndex::ToString();
1281 str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
1282 GetBlockHash().ToString().c_str(),
1283 hashPrev.ToString().substr(0,20).c_str(),
1284 hashNext.ToString().substr(0,20).c_str());
1290 printf("%s\n", ToString().c_str());
1302 // Describes a place in the block chain to another node such that if the
1303 // other node doesn't have the same branch, it can find a recent common trunk.
1304 // The further back it is, the further before the fork it may be.
1309 std::vector<uint256> vHave;
1316 explicit CBlockLocator(const CBlockIndex* pindex)
1321 explicit CBlockLocator(uint256 hashBlock)
1323 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1324 if (mi != mapBlockIndex.end())
1328 CBlockLocator(const std::vector<uint256>& vHaveIn)
1335 if (!(nType & SER_GETHASH))
1336 READWRITE(nVersion);
1347 return vHave.empty();
1350 void Set(const CBlockIndex* pindex)
1356 vHave.push_back(pindex->GetBlockHash());
1358 // Exponentially larger steps back
1359 for (int i = 0; pindex && i < nStep; i++)
1360 pindex = pindex->pprev;
1361 if (vHave.size() > 10)
1364 vHave.push_back(hashGenesisBlock);
1367 int GetDistanceBack()
1369 // Retrace how far back it was in the sender's branch
1372 BOOST_FOREACH(const uint256& hash, vHave)
1374 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1375 if (mi != mapBlockIndex.end())
1377 CBlockIndex* pindex = (*mi).second;
1378 if (pindex->IsInMainChain())
1388 CBlockIndex* GetBlockIndex()
1390 // Find the first block the caller has in the main chain
1391 BOOST_FOREACH(const uint256& hash, vHave)
1393 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1394 if (mi != mapBlockIndex.end())
1396 CBlockIndex* pindex = (*mi).second;
1397 if (pindex->IsInMainChain())
1401 return pindexGenesisBlock;
1404 uint256 GetBlockHash()
1406 // Find the first block the caller has in the main chain
1407 BOOST_FOREACH(const uint256& hash, vHave)
1409 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1410 if (mi != mapBlockIndex.end())
1412 CBlockIndex* pindex = (*mi).second;
1413 if (pindex->IsInMainChain())
1417 return hashGenesisBlock;
1422 CBlockIndex* pindex = GetBlockIndex();
1425 return pindex->nHeight;
1438 // Alerts are for notifying old versions if they become too obsolete and
1439 // need to upgrade. The message is displayed in the status bar.
1440 // Alert messages are broadcast as a vector of signed data. Unserializing may
1441 // not read the entire buffer if the alert is for a newer version, but older
1442 // versions can still relay the original data.
1444 class CUnsignedAlert
1448 int64 nRelayUntil; // when newer nodes stop relaying to newer nodes
1452 std::set<int> setCancel;
1453 int nMinVer; // lowest version inclusive
1454 int nMaxVer; // highest version inclusive
1455 std::set<std::string> setSubVer; // empty matches all
1459 std::string strComment;
1460 std::string strStatusBar;
1461 std::string strReserved;
1465 READWRITE(this->nVersion);
1466 nVersion = this->nVersion;
1467 READWRITE(nRelayUntil);
1468 READWRITE(nExpiration);
1471 READWRITE(setCancel);
1474 READWRITE(setSubVer);
1475 READWRITE(nPriority);
1477 READWRITE(strComment);
1478 READWRITE(strStatusBar);
1479 READWRITE(strReserved);
1496 strStatusBar.clear();
1497 strReserved.clear();
1500 std::string ToString() const
1502 std::string strSetCancel;
1503 BOOST_FOREACH(int n, setCancel)
1504 strSetCancel += strprintf("%d ", n);
1505 std::string strSetSubVer;
1506 BOOST_FOREACH(std::string str, setSubVer)
1507 strSetSubVer += "\"" + str + "\" ";
1511 " nRelayUntil = %"PRI64d"\n"
1512 " nExpiration = %"PRI64d"\n"
1520 " strComment = \"%s\"\n"
1521 " strStatusBar = \"%s\"\n"
1528 strSetCancel.c_str(),
1531 strSetSubVer.c_str(),
1534 strStatusBar.c_str());
1539 printf("%s", ToString().c_str());
1543 class CAlert : public CUnsignedAlert
1546 std::vector<unsigned char> vchMsg;
1547 std::vector<unsigned char> vchSig;
1562 CUnsignedAlert::SetNull();
1569 return (nExpiration == 0);
1572 uint256 GetHash() const
1574 return SerializeHash(*this);
1577 bool IsInEffect() const
1579 return (GetAdjustedTime() < nExpiration);
1582 bool Cancels(const CAlert& alert) const
1585 return false; // this was a no-op before 31403
1586 return (alert.nID <= nCancel || setCancel.count(alert.nID));
1589 bool AppliesTo(int nVersion, std::string strSubVerIn) const
1591 // TODO: rework for client-version-embedded-in-strSubVer ?
1592 return (IsInEffect() &&
1593 nMinVer <= nVersion && nVersion <= nMaxVer &&
1594 (setSubVer.empty() || setSubVer.count(strSubVerIn)));
1597 bool AppliesToMe() const
1599 return AppliesTo(PROTOCOL_VERSION, FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector<std::string>()));
1602 bool RelayTo(CNode* pnode) const
1606 // returns true if wasn't already contained in the set
1607 if (pnode->setKnown.insert(GetHash()).second)
1609 if (AppliesTo(pnode->nVersion, pnode->strSubVer) ||
1611 GetAdjustedTime() < nRelayUntil)
1613 pnode->PushMessage("alert", *this);
1620 bool CheckSignature()
1623 if (!key.SetPubKey(ParseHex("04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284")))
1624 return error("CAlert::CheckSignature() : SetPubKey failed");
1625 if (!key.Verify(Hash(vchMsg.begin(), vchMsg.end()), vchSig))
1626 return error("CAlert::CheckSignature() : verify signature failed");
1628 // Now unserialize the data
1629 CDataStream sMsg(vchMsg);
1630 sMsg >> *(CUnsignedAlert*)this;
1634 bool ProcessAlert();