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.
26 class CRequestTracker;
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 int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100;
34 static const int64 COIN = 100000000;
35 static const int64 CENT = 1000000;
36 static const int64 MIN_TX_FEE = 50000;
37 static const int64 MIN_RELAY_TX_FEE = 10000;
38 static const int64 MAX_MONEY = 21000000 * COIN;
39 inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
40 static const int COINBASE_MATURITY = 100;
41 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
42 static const int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
44 static const int fHaveUPnP = true;
46 static const int fHaveUPnP = false;
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 double dHashesPerSec;
65 extern int64 nHPSTimerStart;
66 extern int64 nTimeBestReceived;
67 extern CCriticalSection cs_setpwalletRegistered;
68 extern std::set<CWallet*> setpwalletRegistered;
71 extern int fGenerateBitcoins;
72 extern int64 nTransactionFee;
73 extern int fLimitProcessors;
74 extern int nLimitProcessors;
75 extern int fMinimizeToTray;
76 extern int fMinimizeOnClose;
87 void RegisterWallet(CWallet* pwalletIn);
88 void UnregisterWallet(CWallet* pwalletIn);
89 bool CheckDiskSpace(uint64 nAdditionalBytes=0);
90 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
91 FILE* AppendBlockFile(unsigned int& nFileRet);
92 bool LoadBlockIndex(bool fAllowNew=true);
93 void PrintBlockTree();
94 bool ProcessMessages(CNode* pfrom);
95 bool SendMessages(CNode* pto, bool fSendTrickle);
96 void GenerateBitcoins(bool fGenerate, CWallet* pwallet);
97 CBlock* CreateNewBlock(CReserveKey& reservekey);
98 void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& nExtraNonce);
99 void FormatHashBuffers(CBlock* pblock, char* pmidstate, char* pdata, char* phash1);
100 bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey);
101 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
102 unsigned int ComputeMinWork(unsigned int nBase, int64 nTime);
103 bool IsInitialBlockDownload();
104 std::string GetWarnings(std::string strFor);
117 bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
120 bool WriteSetting(const std::string& strKey, const T& value)
123 BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
125 std::string strWalletFile;
126 if (!GetWalletFile(pwallet, strWalletFile))
128 fOk |= CWalletDB(strWalletFile).WriteSetting(strKey, value);
138 unsigned int nBlockPos;
146 CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
149 nBlockPos = nBlockPosIn;
153 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
154 void SetNull() { nFile = -1; nBlockPos = 0; nTxPos = 0; }
155 bool IsNull() const { return (nFile == -1); }
157 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
159 return (a.nFile == b.nFile &&
160 a.nBlockPos == b.nBlockPos &&
161 a.nTxPos == b.nTxPos);
164 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
169 std::string ToString() const
172 return strprintf("null");
174 return strprintf("(nFile=%d, nBlockPos=%d, nTxPos=%d)", nFile, nBlockPos, nTxPos);
179 printf("%s", ToString().c_str());
192 CInPoint() { SetNull(); }
193 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
194 void SetNull() { ptx = NULL; n = -1; }
195 bool IsNull() const { return (ptx == NULL && n == -1); }
207 COutPoint() { SetNull(); }
208 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
209 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
210 void SetNull() { hash = 0; n = -1; }
211 bool IsNull() const { return (hash == 0 && n == -1); }
213 friend bool operator<(const COutPoint& a, const COutPoint& b)
215 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
218 friend bool operator==(const COutPoint& a, const COutPoint& b)
220 return (a.hash == b.hash && a.n == b.n);
223 friend bool operator!=(const COutPoint& a, const COutPoint& b)
228 std::string ToString() const
230 return strprintf("COutPoint(%s, %d)", hash.ToString().substr(0,10).c_str(), n);
235 printf("%s\n", ToString().c_str());
243 // An input of a transaction. It contains the location of the previous
244 // transaction's output that it claims and a signature that matches the
245 // output's public key.
252 unsigned int nSequence;
256 nSequence = UINT_MAX;
259 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=UINT_MAX)
262 scriptSig = scriptSigIn;
263 nSequence = nSequenceIn;
266 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=UINT_MAX)
268 prevout = COutPoint(hashPrevTx, nOut);
269 scriptSig = scriptSigIn;
270 nSequence = nSequenceIn;
276 READWRITE(scriptSig);
277 READWRITE(nSequence);
282 return (nSequence == UINT_MAX);
285 friend bool operator==(const CTxIn& a, const CTxIn& b)
287 return (a.prevout == b.prevout &&
288 a.scriptSig == b.scriptSig &&
289 a.nSequence == b.nSequence);
292 friend bool operator!=(const CTxIn& a, const CTxIn& b)
297 std::string ToString() const
300 str += strprintf("CTxIn(");
301 str += prevout.ToString();
302 if (prevout.IsNull())
303 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
305 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
306 if (nSequence != UINT_MAX)
307 str += strprintf(", nSequence=%u", nSequence);
314 printf("%s\n", ToString().c_str());
322 // An output of a transaction. It contains the public key that the next input
323 // must be able to sign with to claim it.
329 CScript scriptPubKey;
336 CTxOut(int64 nValueIn, CScript scriptPubKeyIn)
339 scriptPubKey = scriptPubKeyIn;
345 READWRITE(scriptPubKey);
351 scriptPubKey.clear();
356 return (nValue == -1);
359 uint256 GetHash() const
361 return SerializeHash(*this);
364 friend bool operator==(const CTxOut& a, const CTxOut& b)
366 return (a.nValue == b.nValue &&
367 a.scriptPubKey == b.scriptPubKey);
370 friend bool operator!=(const CTxOut& a, const CTxOut& b)
375 std::string ToString() const
377 if (scriptPubKey.size() < 6)
378 return "CTxOut(error)";
379 return strprintf("CTxOut(nValue=%"PRI64d".%08"PRI64d", scriptPubKey=%s)", nValue / COIN, nValue % COIN, scriptPubKey.ToString().substr(0,30).c_str());
384 printf("%s\n", ToString().c_str());
389 typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
393 // The basic transaction that is broadcasted on the network and contained in
394 // blocks. A transaction can contain multiple inputs and outputs.
400 std::vector<CTxIn> vin;
401 std::vector<CTxOut> vout;
402 unsigned int nLockTime;
412 READWRITE(this->nVersion);
413 nVersion = this->nVersion;
416 READWRITE(nLockTime);
429 return (vin.empty() && vout.empty());
432 uint256 GetHash() const
434 return SerializeHash(*this);
437 bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const
439 // Time based nLockTime implemented in 0.1.6
442 if (nBlockHeight == 0)
443 nBlockHeight = nBestHeight;
445 nBlockTime = GetAdjustedTime();
446 if ((int64)nLockTime < (nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime))
448 BOOST_FOREACH(const CTxIn& txin, vin)
454 bool IsNewerThan(const CTransaction& old) const
456 if (vin.size() != old.vin.size())
458 for (int i = 0; i < vin.size(); i++)
459 if (vin[i].prevout != old.vin[i].prevout)
463 unsigned int nLowest = UINT_MAX;
464 for (int i = 0; i < vin.size(); i++)
466 if (vin[i].nSequence != old.vin[i].nSequence)
468 if (vin[i].nSequence <= nLowest)
471 nLowest = vin[i].nSequence;
473 if (old.vin[i].nSequence < nLowest)
476 nLowest = old.vin[i].nSequence;
483 bool IsCoinBase() const
485 return (vin.size() == 1 && vin[0].prevout.IsNull());
488 int GetSigOpCount() const
491 BOOST_FOREACH(const CTxIn& txin, vin)
492 n += txin.scriptSig.GetSigOpCount();
493 BOOST_FOREACH(const CTxOut& txout, vout)
494 n += txout.scriptPubKey.GetSigOpCount();
498 /** Count ECDSA signature operations in pay-to-script-hash inputs.
499 This is a better measure of how expensive it is to process this transaction.
501 @param[in] mapInputsMap of previous transactions that have outputs we're spending
502 @return maximum number of sigops required to validate this transaction's inputs
503 @see CTransaction::FetchInputs
505 int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
507 bool IsStandard() const
509 BOOST_FOREACH(const CTxIn& txin, vin)
510 if (!txin.scriptSig.IsPushOnly())
511 return error("nonstandard txin: %s", txin.scriptSig.ToString().c_str());
512 BOOST_FOREACH(const CTxOut& txout, vout)
513 if (!::IsStandard(txout.scriptPubKey))
514 return error("nonstandard txout: %s", txout.scriptPubKey.ToString().c_str());
518 int64 GetValueOut() const
521 BOOST_FOREACH(const CTxOut& txout, vout)
523 nValueOut += txout.nValue;
524 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
525 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
530 /** Amount of bitcoins coming in to this transaction
531 Note that lightweight clients may not know anything besides the hash of previous transactions,
532 so may not be able to calculate this.
534 @param[in] mapInputsMap of previous transactions that have outputs we're spending
535 @returnSum of value of all inputs (scriptSigs)
536 @see CTransaction::FetchInputs
538 int64 GetValueIn(const MapPrevTx& mapInputs) const;
540 static bool AllowFree(double dPriority)
542 // Large (in bytes) low-priority (new, small-coin) transactions
544 return dPriority > COIN * 144 / 250;
547 int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=true, bool fForRelay=false) const
549 // Base fee is either MIN_TX_FEE or MIN_RELAY_TX_FEE
550 int64 nBaseFee = fForRelay ? MIN_RELAY_TX_FEE : MIN_TX_FEE;
552 unsigned int nBytes = ::GetSerializeSize(*this, SER_NETWORK);
553 unsigned int nNewBlockSize = nBlockSize + nBytes;
554 int64 nMinFee = (1 + (int64)nBytes / 1000) * nBaseFee;
560 // Transactions under 10K are free
561 // (about 4500bc if made of 50bc inputs)
567 // Free transaction area
568 if (nNewBlockSize < 27000)
573 // To limit dust spam, require MIN_TX_FEE/MIN_RELAY_TX_FEE if any output is less than 0.01
574 if (nMinFee < nBaseFee)
575 BOOST_FOREACH(const CTxOut& txout, vout)
576 if (txout.nValue < CENT)
579 // Raise the price as the block approaches full
580 if (nBlockSize != 1 && nNewBlockSize >= MAX_BLOCK_SIZE_GEN/2)
582 if (nNewBlockSize >= MAX_BLOCK_SIZE_GEN)
584 nMinFee *= MAX_BLOCK_SIZE_GEN / (MAX_BLOCK_SIZE_GEN - nNewBlockSize);
587 if (!MoneyRange(nMinFee))
593 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
595 CAutoFile filein = OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb");
597 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
600 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
601 return error("CTransaction::ReadFromDisk() : fseek failed");
604 // Return file pointer
607 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
608 return error("CTransaction::ReadFromDisk() : second fseek failed");
609 *pfileRet = filein.release();
614 friend bool operator==(const CTransaction& a, const CTransaction& b)
616 return (a.nVersion == b.nVersion &&
619 a.nLockTime == b.nLockTime);
622 friend bool operator!=(const CTransaction& a, const CTransaction& b)
628 std::string ToString() const
631 str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%d, vout.size=%d, nLockTime=%d)\n",
632 GetHash().ToString().substr(0,10).c_str(),
637 for (int i = 0; i < vin.size(); i++)
638 str += " " + vin[i].ToString() + "\n";
639 for (int i = 0; i < vout.size(); i++)
640 str += " " + vout[i].ToString() + "\n";
646 printf("%s", ToString().c_str());
650 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
651 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
652 bool ReadFromDisk(COutPoint prevout);
653 bool DisconnectInputs(CTxDB& txdb);
655 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
657 @param[in] txdb Transaction database
658 @param[in] mapTestPool List of pending changes to the transaction index database
659 @param[in] fBlock True if being called to add a new best-block to the chain
660 @param[in] fMiner True if being called by CreateNewBlock
661 @param[out] inputsRet Pointers to this transaction's inputs
662 @param[out] fInvalid returns true if transaction is invalid
663 @return Returns true if all inputs are in txdb or mapTestPool
665 bool FetchInputs(CTxDB& txdb, const std::map<uint256, CTxIndex>& mapTestPool,
666 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
668 /** Sanity check previous transactions, then, if all checks succeed,
669 mark them as spent by this transaction.
671 @param[in] inputsPrevious transactions (from FetchInputs)
672 @param[out] mapTestPoolKeeps track of inputs that need to be updated on disk
673 @param[in] posThisTxPosition of this transaction on disk
674 @param[in] pindexBlock
675 @param[in] fBlock true if called from ConnectBlock
676 @param[in] fMiner true if called from CreateNewBlock
677 @param[in] fStrictPayToScriptHash true if fully validating p2sh transactions
678 @return Returns true if all checks succeed
680 bool ConnectInputs(MapPrevTx inputs,
681 std::map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx,
682 const CBlockIndex* pindexBlock, bool fBlock, bool fMiner, bool fStrictPayToScriptHash=true);
683 bool ClientConnectInputs();
684 bool CheckTransaction() const;
685 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
686 bool AcceptToMemoryPool(bool fCheckInputs=true, bool* pfMissingInputs=NULL);
688 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
689 bool AddToMemoryPoolUnchecked();
691 bool RemoveFromMemoryPool();
699 // A transaction with a merkle branch linking it to the block chain
701 class CMerkleTx : public CTransaction
705 std::vector<uint256> vMerkleBranch;
709 mutable char fMerkleVerified;
717 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
726 fMerkleVerified = false;
732 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
733 nVersion = this->nVersion;
734 READWRITE(hashBlock);
735 READWRITE(vMerkleBranch);
740 int SetMerkleBranch(const CBlock* pblock=NULL);
741 int GetDepthInMainChain(int& nHeightRet) const;
742 int GetDepthInMainChain() const { int nHeight; return GetDepthInMainChain(nHeight); }
743 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
744 int GetBlocksToMaturity() const;
745 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
746 bool AcceptToMemoryPool();
753 // A txdb record that contains the disk location of a transaction and the
754 // locations of transactions that spend its outputs. vSpent is really only
755 // used as a flag, but having the location is very helpful for debugging.
761 std::vector<CDiskTxPos> vSpent;
768 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
771 vSpent.resize(nOutputs);
776 if (!(nType & SER_GETHASH))
793 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
795 return (a.pos == b.pos &&
796 a.vSpent == b.vSpent);
799 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
803 int GetDepthInMainChain() const;
811 // Nodes collect new transactions into a block, hash them into a hash tree,
812 // and scan through nonce values to make the block's hash satisfy proof-of-work
813 // requirements. When they solve the proof-of-work, they broadcast the block
814 // to everyone and the block is added to the block chain. The first transaction
815 // in the block is a special one that creates a new coin owned by the creator
818 // Blocks are appended to blk0001.dat files on disk. Their location on disk
819 // is indexed by CBlockIndex objects in memory.
826 uint256 hashPrevBlock;
827 uint256 hashMerkleRoot;
833 std::vector<CTransaction> vtx;
836 mutable std::vector<uint256> vMerkleTree;
846 READWRITE(this->nVersion);
847 nVersion = this->nVersion;
848 READWRITE(hashPrevBlock);
849 READWRITE(hashMerkleRoot);
854 // ConnectBlock depends on vtx being last so it can calculate offset
855 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
858 const_cast<CBlock*>(this)->vtx.clear();
878 uint256 GetHash() const
880 return Hash(BEGIN(nVersion), END(nNonce));
883 int64 GetBlockTime() const
888 int GetSigOpCount() const
891 BOOST_FOREACH(const CTransaction& tx, vtx)
892 n += tx.GetSigOpCount();
896 void UpdateTime(const CBlockIndex* pindexPrev);
899 uint256 BuildMerkleTree() const
902 BOOST_FOREACH(const CTransaction& tx, vtx)
903 vMerkleTree.push_back(tx.GetHash());
905 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
907 for (int i = 0; i < nSize; i += 2)
909 int i2 = std::min(i+1, nSize-1);
910 vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
911 BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
915 return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
918 std::vector<uint256> GetMerkleBranch(int nIndex) const
920 if (vMerkleTree.empty())
922 std::vector<uint256> vMerkleBranch;
924 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
926 int i = std::min(nIndex^1, nSize-1);
927 vMerkleBranch.push_back(vMerkleTree[j+i]);
931 return vMerkleBranch;
934 static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
938 BOOST_FOREACH(const uint256& otherside, vMerkleBranch)
941 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
943 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
950 bool WriteToDisk(unsigned int& nFileRet, unsigned int& nBlockPosRet)
952 // Open history file to append
953 CAutoFile fileout = AppendBlockFile(nFileRet);
955 return error("CBlock::WriteToDisk() : AppendBlockFile failed");
957 // Write index header
958 unsigned int nSize = fileout.GetSerializeSize(*this);
959 fileout << FLATDATA(pchMessageStart) << nSize;
962 nBlockPosRet = ftell(fileout);
963 if (nBlockPosRet == -1)
964 return error("CBlock::WriteToDisk() : ftell failed");
967 // Flush stdio buffers and commit to disk before returning
969 if (!IsInitialBlockDownload() || (nBestHeight+1) % 500 == 0)
972 _commit(_fileno(fileout));
974 fsync(fileno(fileout));
981 bool ReadFromDisk(unsigned int nFile, unsigned int nBlockPos, bool fReadTransactions=true)
985 // Open history file to read
986 CAutoFile filein = OpenBlockFile(nFile, nBlockPos, "rb");
988 return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
989 if (!fReadTransactions)
990 filein.nType |= SER_BLOCKHEADERONLY;
996 if (!CheckProofOfWork(GetHash(), nBits))
997 return error("CBlock::ReadFromDisk() : errors in block header");
1006 printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%d)\n",
1007 GetHash().ToString().substr(0,20).c_str(),
1009 hashPrevBlock.ToString().substr(0,20).c_str(),
1010 hashMerkleRoot.ToString().substr(0,10).c_str(),
1011 nTime, nBits, nNonce,
1013 for (int i = 0; i < vtx.size(); i++)
1018 printf(" vMerkleTree: ");
1019 for (int i = 0; i < vMerkleTree.size(); i++)
1020 printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
1025 bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1026 bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1027 bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
1028 bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
1029 bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
1030 bool CheckBlock() const;
1040 // The block chain is a tree shaped structure starting with the
1041 // genesis block at the root, with each block potentially having multiple
1042 // candidates to be the next block. pprev and pnext link a path through the
1043 // main/longest chain. A blockindex may have multiple pprev pointing back
1044 // to it, but pnext will only point forward to the longest branch, or will
1045 // be null if the block is not part of the longest chain.
1050 const uint256* phashBlock;
1054 unsigned int nBlockPos;
1056 CBigNum bnChainWork;
1060 uint256 hashMerkleRoot;
1063 unsigned int nNonce;
1083 CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block)
1089 nBlockPos = nBlockPosIn;
1093 nVersion = block.nVersion;
1094 hashMerkleRoot = block.hashMerkleRoot;
1095 nTime = block.nTime;
1096 nBits = block.nBits;
1097 nNonce = block.nNonce;
1100 CBlock GetBlockHeader() const
1103 block.nVersion = nVersion;
1105 block.hashPrevBlock = pprev->GetBlockHash();
1106 block.hashMerkleRoot = hashMerkleRoot;
1107 block.nTime = nTime;
1108 block.nBits = nBits;
1109 block.nNonce = nNonce;
1113 uint256 GetBlockHash() const
1118 int64 GetBlockTime() const
1120 return (int64)nTime;
1123 CBigNum GetBlockWork() const
1126 bnTarget.SetCompact(nBits);
1129 return (CBigNum(1)<<256) / (bnTarget+1);
1132 bool IsInMainChain() const
1134 return (pnext || this == pindexBest);
1137 bool CheckIndex() const
1139 return CheckProofOfWork(GetBlockHash(), nBits);
1142 bool EraseBlockFromDisk()
1144 // Open history file
1145 CAutoFile fileout = OpenBlockFile(nFile, nBlockPos, "rb+");
1149 // Overwrite with empty null block
1157 enum { nMedianTimeSpan=11 };
1159 int64 GetMedianTimePast() const
1161 int64 pmedian[nMedianTimeSpan];
1162 int64* pbegin = &pmedian[nMedianTimeSpan];
1163 int64* pend = &pmedian[nMedianTimeSpan];
1165 const CBlockIndex* pindex = this;
1166 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1167 *(--pbegin) = pindex->GetBlockTime();
1169 std::sort(pbegin, pend);
1170 return pbegin[(pend - pbegin)/2];
1173 int64 GetMedianTime() const
1175 const CBlockIndex* pindex = this;
1176 for (int i = 0; i < nMedianTimeSpan/2; i++)
1179 return GetBlockTime();
1180 pindex = pindex->pnext;
1182 return pindex->GetMedianTimePast();
1187 std::string ToString() const
1189 return strprintf("CBlockIndex(nprev=%08x, pnext=%08x, nFile=%d, nBlockPos=%-6d nHeight=%d, merkle=%s, hashBlock=%s)",
1190 pprev, pnext, nFile, nBlockPos, nHeight,
1191 hashMerkleRoot.ToString().substr(0,10).c_str(),
1192 GetBlockHash().ToString().substr(0,20).c_str());
1197 printf("%s\n", ToString().c_str());
1204 // Used to marshal pointers into hashes for db storage.
1206 class CDiskBlockIndex : public CBlockIndex
1218 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1220 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1221 hashNext = (pnext ? pnext->GetBlockHash() : 0);
1226 if (!(nType & SER_GETHASH))
1227 READWRITE(nVersion);
1229 READWRITE(hashNext);
1231 READWRITE(nBlockPos);
1235 READWRITE(this->nVersion);
1236 READWRITE(hashPrev);
1237 READWRITE(hashMerkleRoot);
1243 uint256 GetBlockHash() const
1246 block.nVersion = nVersion;
1247 block.hashPrevBlock = hashPrev;
1248 block.hashMerkleRoot = hashMerkleRoot;
1249 block.nTime = nTime;
1250 block.nBits = nBits;
1251 block.nNonce = nNonce;
1252 return block.GetHash();
1256 std::string ToString() const
1258 std::string str = "CDiskBlockIndex(";
1259 str += CBlockIndex::ToString();
1260 str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
1261 GetBlockHash().ToString().c_str(),
1262 hashPrev.ToString().substr(0,20).c_str(),
1263 hashNext.ToString().substr(0,20).c_str());
1269 printf("%s\n", ToString().c_str());
1281 // Describes a place in the block chain to another node such that if the
1282 // other node doesn't have the same branch, it can find a recent common trunk.
1283 // The further back it is, the further before the fork it may be.
1288 std::vector<uint256> vHave;
1295 explicit CBlockLocator(const CBlockIndex* pindex)
1300 explicit CBlockLocator(uint256 hashBlock)
1302 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1303 if (mi != mapBlockIndex.end())
1309 if (!(nType & SER_GETHASH))
1310 READWRITE(nVersion);
1321 return vHave.empty();
1324 void Set(const CBlockIndex* pindex)
1330 vHave.push_back(pindex->GetBlockHash());
1332 // Exponentially larger steps back
1333 for (int i = 0; pindex && i < nStep; i++)
1334 pindex = pindex->pprev;
1335 if (vHave.size() > 10)
1338 vHave.push_back(hashGenesisBlock);
1341 int GetDistanceBack()
1343 // Retrace how far back it was in the sender's branch
1346 BOOST_FOREACH(const uint256& hash, vHave)
1348 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1349 if (mi != mapBlockIndex.end())
1351 CBlockIndex* pindex = (*mi).second;
1352 if (pindex->IsInMainChain())
1362 CBlockIndex* GetBlockIndex()
1364 // Find the first block the caller has in the main chain
1365 BOOST_FOREACH(const uint256& hash, vHave)
1367 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1368 if (mi != mapBlockIndex.end())
1370 CBlockIndex* pindex = (*mi).second;
1371 if (pindex->IsInMainChain())
1375 return pindexGenesisBlock;
1378 uint256 GetBlockHash()
1380 // Find the first block the caller has in the main chain
1381 BOOST_FOREACH(const uint256& hash, vHave)
1383 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1384 if (mi != mapBlockIndex.end())
1386 CBlockIndex* pindex = (*mi).second;
1387 if (pindex->IsInMainChain())
1391 return hashGenesisBlock;
1396 CBlockIndex* pindex = GetBlockIndex();
1399 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 class CAlert : public CUnsignedAlert
1520 std::vector<unsigned char> vchMsg;
1521 std::vector<unsigned char> vchSig;
1536 CUnsignedAlert::SetNull();
1543 return (nExpiration == 0);
1546 uint256 GetHash() const
1548 return SerializeHash(*this);
1551 bool IsInEffect() const
1553 return (GetAdjustedTime() < nExpiration);
1556 bool Cancels(const CAlert& alert) const
1559 return false; // this was a no-op before 31403
1560 return (alert.nID <= nCancel || setCancel.count(alert.nID));
1563 bool AppliesTo(int nVersion, std::string strSubVerIn) const
1565 return (IsInEffect() &&
1566 nMinVer <= nVersion && nVersion <= nMaxVer &&
1567 (setSubVer.empty() || setSubVer.count(strSubVerIn)));
1570 bool AppliesToMe() const
1572 return AppliesTo(VERSION, ::pszSubVer);
1575 bool RelayTo(CNode* pnode) const
1579 // returns true if wasn't already contained in the set
1580 if (pnode->setKnown.insert(GetHash()).second)
1582 if (AppliesTo(pnode->nVersion, pnode->strSubVer) ||
1584 GetAdjustedTime() < nRelayUntil)
1586 pnode->PushMessage("alert", *this);
1593 bool CheckSignature()
1596 if (!key.SetPubKey(ParseHex("04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284")))
1597 return error("CAlert::CheckSignature() : SetPubKey failed");
1598 if (!key.Verify(Hash(vchMsg.begin(), vchMsg.end()), vchSig))
1599 return error("CAlert::CheckSignature() : verify signature failed");
1601 // Now unserialize the data
1602 CDataStream sMsg(vchMsg);
1603 sMsg >> *(CUnsignedAlert*)this;
1607 bool ProcessAlert();