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.
10 #include "timestamps.h"
29 class CRequestTracker;
36 static const unsigned int MAX_BLOCK_SIZE = 1000000;
37 static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2;
38 static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
39 static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100;
40 static const unsigned int MAX_INV_SZ = 50000;
42 static const int64_t MIN_TX_FEE = CENT/10;
43 static const int64_t MIN_RELAY_TX_FEE = CENT/50;
45 static const int64_t MAX_MONEY = std::numeric_limits<int64_t>::max();
46 static const int64_t MAX_MINT_PROOF_OF_WORK = 100 * COIN;
47 static const int64_t MAX_MINT_PROOF_OF_STAKE = 1 * COIN;
48 static const int64_t MIN_TXOUT_AMOUNT = CENT/100;
51 inline bool MoneyRange(int64_t nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
52 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
53 static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
54 // Maximum number of script-checking threads allowed
55 static const int MAX_SCRIPTCHECK_THREADS = 16;
57 static const uint256 hashGenesisBlock("0x00000a060336cbb72fe969666d337b87198b1add2abaa59cca226820b32933a4");
58 static const uint256 hashGenesisBlockTestNet("0x000c763e402f2436da9ed36c7286f62c3f6e5dbafce9ff289bd43d7459327eb");
60 inline int64_t PastDrift(int64_t nTime) { return nTime - 2 * nOneHour; } // up to 2 hours from the past
61 inline int64_t FutureDrift(int64_t nTime) { return nTime + 2 * nOneHour; } // up to 2 hours from the future
63 extern CScript COINBASE_FLAGS;
64 extern CCriticalSection cs_main;
65 extern std::map<uint256, CBlockIndex*> mapBlockIndex;
66 extern std::set<std::pair<COutPoint, unsigned int> > setStakeSeen;
67 extern CBlockIndex* pindexGenesisBlock;
68 extern unsigned int nNodeLifespan;
69 extern unsigned int nStakeMinAge;
70 extern int nCoinbaseMaturity;
71 extern int nBestHeight;
72 extern uint256 nBestChainTrust;
73 extern uint256 nBestInvalidTrust;
74 extern uint256 hashBestChain;
75 extern CBlockIndex* pindexBest;
76 extern unsigned int nTransactionsUpdated;
77 extern uint64_t nLastBlockTx;
78 extern uint64_t nLastBlockSize;
79 extern uint32_t nLastCoinStakeSearchInterval;
80 extern const std::string strMessageMagic;
81 extern int64_t nTimeBestReceived;
82 extern CCriticalSection cs_setpwalletRegistered;
83 extern std::set<CWallet*> setpwalletRegistered;
84 extern unsigned char pchMessageStart[4];
85 extern std::map<uint256, CBlock*> mapOrphanBlocks;
88 extern int64_t nTransactionFee;
89 extern int64_t nMinimumInputValue;
90 extern bool fUseFastIndex;
91 extern int nScriptCheckThreads;
92 extern const uint256 entropyStore[38];
94 // Minimum disk space required - used in CheckDiskSpace()
95 static const uint64_t nMinDiskSpace = 52428800;
102 void RegisterWallet(CWallet* pwalletIn);
103 void UnregisterWallet(CWallet* pwalletIn);
104 void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false, bool fConnect = true);
105 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
106 bool CheckDiskSpace(uint64_t nAdditionalBytes=0);
107 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
108 FILE* AppendBlockFile(unsigned int& nFileRet);
110 void UnloadBlockIndex();
111 bool LoadBlockIndex(bool fAllowNew=true);
112 void PrintBlockTree();
113 CBlockIndex* FindBlockByHeight(int nHeight);
114 bool ProcessMessages(CNode* pfrom);
115 bool SendMessages(CNode* pto);
116 bool LoadExternalBlockFile(FILE* fileIn);
118 // Run an instance of the script checking thread
119 void ThreadScriptCheck(void* parg);
120 // Stop the script checking threads
121 void ThreadScriptCheckQuit();
123 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
124 unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, bool fProofOfStake);
125 int64_t GetProofOfWorkReward(unsigned int nBits, int64_t nFees=0);
126 int64_t GetProofOfStakeReward(int64_t nCoinAge, unsigned int nBits, int64_t nTime, bool bCoinYearOnly=false);
127 unsigned int ComputeMinWork(unsigned int nBase, int64_t nTime);
128 unsigned int ComputeMinStake(unsigned int nBase, int64_t nTime, unsigned int nBlockTime);
129 int GetNumBlocksOfPeers();
130 bool IsInitialBlockDownload();
131 std::string GetWarnings(std::string strFor);
132 bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock);
133 uint256 WantedByOrphan(const CBlock* pblockOrphan);
134 const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake);
135 void ResendWalletTransactions(bool fForceResend=false);
137 bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, unsigned int flags, int nHashType);
142 /** Position on disk for a particular transaction. */
155 CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
158 nBlockPos = nBlockPosIn;
162 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
163 void SetNull() { nFile = std::numeric_limits<uint32_t>::max(); nBlockPos = 0; nTxPos = 0; }
164 bool IsNull() const { return (nFile == std::numeric_limits<uint32_t>::max()); }
166 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
168 return (a.nFile == b.nFile &&
169 a.nBlockPos == b.nBlockPos &&
170 a.nTxPos == b.nTxPos);
173 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
179 std::string ToString() const
184 return strprintf("(nFile=%u, nBlockPos=%u, nTxPos=%u)", nFile, nBlockPos, nTxPos);
189 printf("%s", ToString().c_str());
195 /** An inpoint - a combination of a transaction and an index n into its vin */
202 CInPoint() { SetNull(); }
203 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
204 void SetNull() { ptx = NULL; n = std::numeric_limits<uint32_t>::max(); }
205 bool IsNull() const { return (ptx == NULL && n == std::numeric_limits<uint32_t>::max()); }
210 /** An outpoint - a combination of a transaction hash and an index n into its vout */
217 COutPoint() { SetNull(); }
218 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
219 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
220 void SetNull() { hash = 0; n = std::numeric_limits<uint32_t>::max(); }
221 bool IsNull() const { return (hash == 0 && n == std::numeric_limits<uint32_t>::max()); }
223 friend bool operator<(const COutPoint& a, const COutPoint& b)
225 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
228 friend bool operator==(const COutPoint& a, const COutPoint& b)
230 return (a.hash == b.hash && a.n == b.n);
233 friend bool operator!=(const COutPoint& a, const COutPoint& b)
238 std::string ToString() const
240 return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10).c_str(), n);
245 printf("%s\n", ToString().c_str());
252 /** An input of a transaction. It contains the location of the previous
253 * transaction's output that it claims and a signature that matches the
254 * output's public key.
265 nSequence = std::numeric_limits<unsigned int>::max();
268 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
271 scriptSig = scriptSigIn;
272 nSequence = nSequenceIn;
275 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
277 prevout = COutPoint(hashPrevTx, nOut);
278 scriptSig = scriptSigIn;
279 nSequence = nSequenceIn;
285 READWRITE(scriptSig);
286 READWRITE(nSequence);
291 return (nSequence == std::numeric_limits<unsigned int>::max());
294 friend bool operator==(const CTxIn& a, const CTxIn& b)
296 return (a.prevout == b.prevout &&
297 a.scriptSig == b.scriptSig &&
298 a.nSequence == b.nSequence);
301 friend bool operator!=(const CTxIn& a, const CTxIn& b)
306 std::string ToStringShort() const
308 return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n);
311 std::string ToString() const
315 str += prevout.ToString();
316 if (prevout.IsNull())
317 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
319 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
320 if (nSequence != std::numeric_limits<unsigned int>::max())
321 str += strprintf(", nSequence=%u", nSequence);
328 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_t nValueIn, CScript scriptPubKeyIn)
352 scriptPubKey = scriptPubKeyIn;
358 READWRITE(scriptPubKey);
364 scriptPubKey.clear();
369 return (nValue == -1);
375 scriptPubKey.clear();
380 return (nValue == 0 && scriptPubKey.empty());
383 uint256 GetHash() const
385 return SerializeHash(*this);
388 friend bool operator==(const CTxOut& a, const CTxOut& b)
390 return (a.nValue == b.nValue &&
391 a.scriptPubKey == b.scriptPubKey);
394 friend bool operator!=(const CTxOut& a, const CTxOut& b)
399 std::string ToStringShort() const
401 return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString(true).c_str());
404 std::string ToString() const
406 if (IsEmpty()) return "CTxOut(empty)";
407 if (scriptPubKey.size() < 6)
408 return "CTxOut(error)";
409 return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().c_str());
414 printf("%s\n", ToString().c_str());
428 typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
430 /** The basic transaction that is broadcasted on the network and contained in
431 * blocks. A transaction can contain multiple inputs and outputs.
436 static const int CURRENT_VERSION=1;
439 std::vector<CTxIn> vin;
440 std::vector<CTxOut> vout;
443 // Denial-of-service detection:
445 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
454 READWRITE(this->nVersion);
455 nVersion = this->nVersion;
459 READWRITE(nLockTime);
464 nVersion = CTransaction::CURRENT_VERSION;
465 nTime = (uint32_t) GetAdjustedTime();
469 nDoS = 0; // Denial-of-service prevention
474 return (vin.empty() && vout.empty());
477 uint256 GetHash() const
479 return SerializeHash(*this);
482 bool IsFinal(int nBlockHeight=0, int64_t nBlockTime=0) const
484 // Time based nLockTime implemented in 0.1.6
487 if (nBlockHeight == 0)
488 nBlockHeight = nBestHeight;
490 nBlockTime = GetAdjustedTime();
491 if ((int64_t)nLockTime < ((int64_t)nLockTime < LOCKTIME_THRESHOLD ? (int64_t)nBlockHeight : nBlockTime))
493 for (const CTxIn& txin : vin)
499 bool IsNewerThan(const CTransaction& old) const
501 if (vin.size() != old.vin.size())
503 for (unsigned int i = 0; i < vin.size(); i++)
504 if (vin[i].prevout != old.vin[i].prevout)
508 unsigned int nLowest = std::numeric_limits<unsigned int>::max();
509 for (unsigned int i = 0; i < vin.size(); i++)
511 if (vin[i].nSequence != old.vin[i].nSequence)
513 if (vin[i].nSequence <= nLowest)
516 nLowest = vin[i].nSequence;
518 if (old.vin[i].nSequence < nLowest)
521 nLowest = old.vin[i].nSequence;
528 bool IsCoinBase() const
530 return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() >= 1);
533 bool IsCoinStake() const
535 // ppcoin: the coin stake transaction is marked with the first output empty
536 return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty());
539 /** Check for standard transaction types
540 @return True if all outputs (scriptPubKeys) use only standard transaction forms
542 bool IsStandard(std::string& strReason) const;
543 bool IsStandard() const
545 std::string strReason;
546 return IsStandard(strReason);
549 /** Check for standard transaction types
550 @param[in] mapInputs Map of previous transactions that have outputs we're spending
551 @return True if all inputs (scriptSigs) use only standard transaction forms
552 @see CTransaction::FetchInputs
554 bool AreInputsStandard(const MapPrevTx& mapInputs) const;
556 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
557 @return number of sigops this transaction's outputs will produce when spent
558 @see CTransaction::FetchInputs
560 unsigned int GetLegacySigOpCount() const;
562 /** Count ECDSA signature operations in pay-to-script-hash inputs.
564 @param[in] mapInputs Map of previous transactions that have outputs we're spending
565 @return maximum number of sigops required to validate this transaction's inputs
566 @see CTransaction::FetchInputs
568 unsigned int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
570 /** Amount of bitcoins spent by this transaction.
571 @return sum of all outputs (note: does not include fees)
573 int64_t GetValueOut() const
575 int64_t nValueOut = 0;
576 for (const CTxOut& txout : vout)
578 nValueOut += txout.nValue;
579 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
580 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
585 /** Amount of bitcoins coming in to this transaction
586 Note that lightweight clients may not know anything besides the hash of previous transactions,
587 so may not be able to calculate this.
589 @param[in] mapInputs Map of previous transactions that have outputs we're spending
590 @return Sum of value of all inputs (scriptSigs)
591 @see CTransaction::FetchInputs
593 int64_t GetValueIn(const MapPrevTx& mapInputs) const;
595 static bool AllowFree(double dPriority)
597 // Large (in bytes) low-priority (new, small-coin) transactions
599 return dPriority > COIN * 144 / 250;
602 int64_t GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=false, enum GetMinFee_mode mode=GMF_BLOCK, unsigned int nBytes = 0) const;
604 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
606 CAutoFile filein = CAutoFile(OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb"), SER_DISK, CLIENT_VERSION);
608 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
611 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
612 return error("CTransaction::ReadFromDisk() : fseek failed");
617 catch (const std::exception&) {
618 return error("%s() : deserialize or I/O error", BOOST_CURRENT_FUNCTION);
621 // Return file pointer
624 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
625 return error("CTransaction::ReadFromDisk() : second fseek failed");
626 *pfileRet = filein.release();
631 friend bool operator==(const CTransaction& a, const CTransaction& b)
633 return (a.nVersion == b.nVersion &&
634 a.nTime == b.nTime &&
637 a.nLockTime == b.nLockTime);
640 friend bool operator!=(const CTransaction& a, const CTransaction& b)
645 std::string ToStringShort() const
648 str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user"));
652 std::string ToString() const
655 str += IsCoinBase()? "Coinbase" : (IsCoinStake()? "Coinstake" : "CTransaction");
656 str += strprintf("(hash=%s, nTime=%d, ver=%d, vin.size=%" PRIszu ", vout.size=%" PRIszu ", nLockTime=%d)\n",
657 GetHash().ToString().substr(0,10).c_str(),
663 for (unsigned int i = 0; i < vin.size(); i++)
664 str += " " + vin[i].ToString() + "\n";
665 for (unsigned int i = 0; i < vout.size(); i++)
666 str += " " + vout[i].ToString() + "\n";
672 printf("%s", ToString().c_str());
676 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
677 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
678 bool ReadFromDisk(COutPoint prevout);
679 bool DisconnectInputs(CTxDB& txdb);
681 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
683 @param[in] txdb Transaction database
684 @param[in] mapTestPool List of pending changes to the transaction index database
685 @param[in] fBlock True if being called to add a new best-block to the chain
686 @param[in] fMiner True if being called by CreateNewBlock
687 @param[out] inputsRet Pointers to this transaction's inputs
688 @param[out] fInvalid returns true if transaction is invalid
689 @return Returns true if all inputs are in txdb or mapTestPool
691 bool FetchInputs(CTxDB& txdb, const std::map<uint256, CTxIndex>& mapTestPool,
692 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
694 /** Sanity check previous transactions, then, if all checks succeed,
695 mark them as spent by this transaction.
697 @param[in] inputs Previous transactions (from FetchInputs)
698 @param[out] mapTestPool Keeps track of inputs that need to be updated on disk
699 @param[in] posThisTx Position of this transaction on disk
700 @param[in] pindexBlock
701 @param[in] fBlock true if called from ConnectBlock
702 @param[in] fMiner true if called from CreateNewBlock
703 @param[in] fScriptChecks enable scripts validation?
704 @param[in] flags STRICT_FLAGS script validation flags
705 @param[in] pvChecks NULL If pvChecks is not NULL, script checks are pushed onto it instead of being performed inline.
706 @return Returns true if all checks succeed
708 bool ConnectInputs(CTxDB& txdb, MapPrevTx inputs, std::map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx, const CBlockIndex* pindexBlock,
709 bool fBlock, bool fMiner, bool fScriptChecks=true,
710 unsigned int flags=STRICT_FLAGS, std::vector<CScriptCheck> *pvChecks = NULL);
711 bool ClientConnectInputs();
712 bool CheckTransaction() const;
713 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
714 bool GetCoinAge(CTxDB& txdb, uint64_t& nCoinAge) const; // ppcoin: get transaction coin age
717 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
720 /** Closure representing one script verification
721 * Note that this stores references to the spending transaction */
725 CScript scriptPubKey;
726 const CTransaction *ptxTo;
733 CScriptCheck(const CTransaction& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, int nHashTypeIn) :
734 scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey),
735 ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), nHashType(nHashTypeIn) { }
737 bool operator()() const;
739 void swap(CScriptCheck &check) {
740 scriptPubKey.swap(check.scriptPubKey);
741 std::swap(ptxTo, check.ptxTo);
742 std::swap(nIn, check.nIn);
743 std::swap(nFlags, check.nFlags);
744 std::swap(nHashType, check.nHashType);
751 /** A transaction with a merkle branch linking it to the block chain. */
752 class CMerkleTx : public CTransaction
756 std::vector<uint256> vMerkleBranch;
760 mutable bool fMerkleVerified;
768 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
777 fMerkleVerified = false;
783 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
784 nVersion = this->nVersion;
785 READWRITE(hashBlock);
786 READWRITE(vMerkleBranch);
791 int SetMerkleBranch(const CBlock* pblock=NULL);
792 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
793 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
794 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
795 int GetBlocksToMaturity() const;
796 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
797 bool AcceptToMemoryPool();
803 /** A txdb record that contains the disk location of a transaction and the
804 * locations of transactions that spend its outputs. vSpent is really only
805 * used as a flag, but having the location is very helpful for debugging.
811 std::vector<CDiskTxPos> vSpent;
818 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
821 vSpent.resize(nOutputs);
826 if (!(nType & SER_GETHASH))
843 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
845 return (a.pos == b.pos &&
846 a.vSpent == b.vSpent);
849 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
853 int GetDepthInMainChain() const;
858 /** Nodes collect new transactions into a block, hash them into a hash tree,
859 * and scan through nonce values to make the block's hash satisfy proof-of-work
860 * requirements. When they solve the proof-of-work, they broadcast the block
861 * to everyone and the block is added to the block chain. The first transaction
862 * in the block is a special one that creates a new coin owned by the creator
865 * Blocks are appended to blk0001.dat files on disk. Their location on disk
866 * is indexed by CBlockIndex objects in memory.
872 static const int CURRENT_VERSION=6;
874 uint256 hashPrevBlock;
875 uint256 hashMerkleRoot;
881 std::vector<CTransaction> vtx;
883 // ppcoin: block signature - signed by one of the coin base txout[N]'s owner
884 std::vector<unsigned char> vchBlockSig;
887 mutable std::vector<uint256> vMerkleTree;
889 // Denial-of-service detection:
891 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
900 READWRITE(this->nVersion);
901 nVersion = this->nVersion;
902 READWRITE(hashPrevBlock);
903 READWRITE(hashMerkleRoot);
908 // ConnectBlock depends on vtx following header to generate CDiskTxPos
909 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
912 READWRITE(vchBlockSig);
916 const_cast<CBlock*>(this)->vtx.clear();
917 const_cast<CBlock*>(this)->vchBlockSig.clear();
923 nVersion = CBlock::CURRENT_VERSION;
940 uint256 GetHash() const
942 return scrypt_blockhash((const uint8_t*)&nVersion);
945 int64_t GetBlockTime() const
947 return (int64_t)nTime;
950 void UpdateTime(const CBlockIndex* pindexPrev);
952 // ppcoin: entropy bit for stake modifier if chosen by modifier
953 unsigned int GetStakeEntropyBit(unsigned int nHeight) const
955 // Protocol switch to support p2pool at novacoin block #9689
956 if (nHeight >= 9689 || fTestNet)
958 // Take last bit of block hash as entropy bit
959 unsigned int nEntropyBit = (GetHash().Get64()) & (uint64_t)1;
960 if (fDebug && GetBoolArg("-printstakemodifier"))
961 printf("GetStakeEntropyBit: nTime=%u hashBlock=%s nEntropyBit=%u\n", nTime, GetHash().ToString().c_str(), nEntropyBit);
965 // Before novacoin block #9689 - get from pregenerated table
966 int nBitNum = nHeight & 0xFF;
967 int nItemNum = nHeight / 0xFF;
969 unsigned int nEntropyBit = (unsigned int) ((entropyStore[nItemNum] & (uint256(1) << nBitNum)) >> nBitNum).Get64();
970 if (fDebug && GetBoolArg("-printstakemodifier"))
971 printf("GetStakeEntropyBit: from pregenerated table, nHeight=%d nEntropyBit=%u\n", nHeight, nEntropyBit);
975 // ppcoin: two types of block: proof-of-work or proof-of-stake
976 bool IsProofOfStake() const
978 return (vtx.size() > 1 && vtx[1].IsCoinStake());
981 bool IsProofOfWork() const
983 return !IsProofOfStake();
986 std::pair<COutPoint, unsigned int> GetProofOfStake() const
988 return IsProofOfStake()? std::make_pair(vtx[1].vin[0].prevout, vtx[1].nTime) : std::make_pair(COutPoint(), (unsigned int)0);
991 // ppcoin: get max transaction timestamp
992 int64_t GetMaxTransactionTime() const
994 int64_t maxTransactionTime = 0;
995 for (const CTransaction& tx : vtx)
996 maxTransactionTime = std::max(maxTransactionTime, (int64_t)tx.nTime);
997 return maxTransactionTime;
1000 uint256 BuildMerkleTree() const
1002 vMerkleTree.clear();
1003 for (const CTransaction& tx : vtx)
1004 vMerkleTree.push_back(tx.GetHash());
1006 for (int nSize = (int)vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
1008 for (int i = 0; i < nSize; i += 2)
1010 int i2 = std::min(i+1, nSize-1);
1011 vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
1012 BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
1016 return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
1019 std::vector<uint256> GetMerkleBranch(int nIndex) const
1021 if (vMerkleTree.empty())
1023 std::vector<uint256> vMerkleBranch;
1025 for (int nSize = (int)vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
1027 int i = std::min(nIndex^1, nSize-1);
1028 vMerkleBranch.push_back(vMerkleTree[j+i]);
1032 return vMerkleBranch;
1035 static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
1039 for (const uint256& otherside : vMerkleBranch)
1042 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
1044 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
1051 bool WriteToDisk(unsigned int& nFileRet, unsigned int& nBlockPosRet)
1053 // Open history file to append
1054 CAutoFile fileout = CAutoFile(AppendBlockFile(nFileRet), SER_DISK, CLIENT_VERSION);
1056 return error("CBlock::WriteToDisk() : AppendBlockFile failed");
1058 // Write index header
1059 unsigned int nSize = fileout.GetSerializeSize(*this);
1060 fileout << FLATDATA(pchMessageStart) << nSize;
1063 long fileOutPos = ftell(fileout);
1065 return error("CBlock::WriteToDisk() : ftell failed");
1066 nBlockPosRet = fileOutPos;
1069 // Flush stdio buffers and commit to disk before returning
1071 if (!IsInitialBlockDownload() || (nBestHeight+1) % 500 == 0)
1072 FileCommit(fileout);
1077 bool ReadFromDisk(unsigned int nFile, unsigned int nBlockPos, bool fReadTransactions=true)
1081 // Open history file to read
1082 CAutoFile filein = CAutoFile(OpenBlockFile(nFile, nBlockPos, "rb"), SER_DISK, CLIENT_VERSION);
1084 return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
1085 if (!fReadTransactions)
1086 filein.nType |= SER_BLOCKHEADERONLY;
1092 catch (const std::exception&) {
1093 return error("%s() : deserialize or I/O error", BOOST_CURRENT_FUNCTION);
1097 if (fReadTransactions && IsProofOfWork() && !CheckProofOfWork(GetHash(), nBits))
1098 return error("CBlock::ReadFromDisk() : errors in block header");
1107 printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%" PRIszu ", vchBlockSig=%s)\n",
1108 GetHash().ToString().c_str(),
1110 hashPrevBlock.ToString().c_str(),
1111 hashMerkleRoot.ToString().c_str(),
1112 nTime, nBits, nNonce,
1114 HexStr(vchBlockSig.begin(), vchBlockSig.end()).c_str());
1115 for (unsigned int i = 0; i < vtx.size(); i++)
1120 printf(" vMerkleTree: ");
1121 for (unsigned int i = 0; i < vMerkleTree.size(); i++)
1122 printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
1127 bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1128 bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck=false);
1129 bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
1130 bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
1131 bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
1132 bool CheckBlock(bool fCheckPOW=true, bool fCheckMerkleRoot=true, bool fCheckSig=true) const;
1134 bool GetCoinAge(uint64_t& nCoinAge) const; // ppcoin: calculate total coin age spent in block
1135 bool CheckBlockSignature() const;
1138 bool SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew);
1146 /** The block chain is a tree shaped structure starting with the
1147 * genesis block at the root, with each block potentially having multiple
1148 * candidates to be the next block. pprev and pnext link a path through the
1149 * main/longest chain. A blockindex may have multiple pprev pointing back
1150 * to it, but pnext will only point forward to the longest branch, or will
1151 * be null if the block is not part of the longest chain.
1156 const uint256* phashBlock;
1161 uint256 nChainTrust; // ppcoin: trust score of block chain
1165 int64_t nMoneySupply;
1167 uint32_t nFlags; // ppcoin: block index flags
1170 BLOCK_PROOF_OF_STAKE = (1 << 0), // is proof-of-stake block
1171 BLOCK_STAKE_ENTROPY = (1 << 1), // entropy bit for stake modifier
1172 BLOCK_STAKE_MODIFIER = (1 << 2) // regenerated stake modifier
1175 uint64_t nStakeModifier; // hash modifier for proof-of-stake
1176 uint32_t nStakeModifierChecksum; // checksum of index; in-memeory only
1178 // proof-of-stake specific fields
1179 COutPoint prevoutStake;
1180 uint32_t nStakeTime;
1181 uint256 hashProofOfStake;
1185 uint256 hashMerkleRoot;
1203 nStakeModifierChecksum = 0;
1204 hashProofOfStake = 0;
1205 prevoutStake.SetNull();
1215 CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block)
1221 nBlockPos = nBlockPosIn;
1228 nStakeModifierChecksum = 0;
1229 hashProofOfStake = 0;
1230 if (block.IsProofOfStake())
1233 prevoutStake = block.vtx[1].vin[0].prevout;
1234 nStakeTime = block.vtx[1].nTime;
1238 prevoutStake.SetNull();
1242 nVersion = block.nVersion;
1243 hashMerkleRoot = block.hashMerkleRoot;
1244 nTime = block.nTime;
1245 nBits = block.nBits;
1246 nNonce = block.nNonce;
1249 CBlock GetBlockHeader() const
1252 block.nVersion = nVersion;
1254 block.hashPrevBlock = pprev->GetBlockHash();
1255 block.hashMerkleRoot = hashMerkleRoot;
1256 block.nTime = nTime;
1257 block.nBits = nBits;
1258 block.nNonce = nNonce;
1262 uint256 GetBlockHash() const
1267 int64_t GetBlockTime() const
1269 return (int64_t)nTime;
1272 uint256 GetBlockTrust() const;
1274 bool IsInMainChain() const
1276 return (pnext || this == pindexBest);
1279 bool CheckIndex() const
1284 enum { nMedianTimeSpan=11 };
1286 int64_t GetMedianTimePast() const
1288 int64_t pmedian[nMedianTimeSpan];
1289 int64_t* pbegin = &pmedian[nMedianTimeSpan];
1290 int64_t* pend = &pmedian[nMedianTimeSpan];
1292 const CBlockIndex* pindex = this;
1293 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1294 *(--pbegin) = pindex->GetBlockTime();
1296 std::sort(pbegin, pend);
1297 return pbegin[(pend - pbegin)/2];
1300 int64_t GetMedianTime() const
1302 const CBlockIndex* pindex = this;
1303 for (int i = 0; i < nMedianTimeSpan/2; i++)
1306 return GetBlockTime();
1307 pindex = pindex->pnext;
1309 return pindex->GetMedianTimePast();
1313 * Returns true if there are nRequired or more blocks of minVersion or above
1314 * in the last nToCheck blocks, starting at pstart and going backwards.
1316 static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart,
1317 unsigned int nRequired, unsigned int nToCheck);
1320 bool IsProofOfWork() const
1322 return !(nFlags & BLOCK_PROOF_OF_STAKE);
1325 bool IsProofOfStake() const
1327 return (nFlags & BLOCK_PROOF_OF_STAKE);
1330 void SetProofOfStake()
1332 nFlags |= BLOCK_PROOF_OF_STAKE;
1335 unsigned int GetStakeEntropyBit() const
1337 return ((nFlags & BLOCK_STAKE_ENTROPY) >> 1);
1340 bool SetStakeEntropyBit(unsigned int nEntropyBit)
1342 if (nEntropyBit > 1)
1344 nFlags |= (nEntropyBit? BLOCK_STAKE_ENTROPY : 0);
1348 bool GeneratedStakeModifier() const
1350 return (nFlags & BLOCK_STAKE_MODIFIER) != 0;
1353 void SetStakeModifier(uint64_t nModifier, bool fGeneratedStakeModifier)
1355 nStakeModifier = nModifier;
1356 if (fGeneratedStakeModifier)
1357 nFlags |= BLOCK_STAKE_MODIFIER;
1360 std::string ToString() const
1362 return strprintf("CBlockIndex(nprev=%p, pnext=%p, nFile=%u, nBlockPos=%-6d nHeight=%d, nMint=%s, nMoneySupply=%s, nFlags=(%s)(%d)(%s), nStakeModifier=%016" PRIx64 ", nStakeModifierChecksum=%08x, hashProofOfStake=%s, prevoutStake=(%s), nStakeTime=%d merkle=%s, hashBlock=%s)",
1363 (const void*)pprev, (const void*)pnext, nFile, nBlockPos, nHeight,
1364 FormatMoney(nMint).c_str(), FormatMoney(nMoneySupply).c_str(),
1365 GeneratedStakeModifier() ? "MOD" : "-", GetStakeEntropyBit(), IsProofOfStake()? "PoS" : "PoW",
1366 nStakeModifier, nStakeModifierChecksum,
1367 hashProofOfStake.ToString().c_str(),
1368 prevoutStake.ToString().c_str(), nStakeTime,
1369 hashMerkleRoot.ToString().c_str(),
1370 GetBlockHash().ToString().c_str());
1375 printf("%s\n", ToString().c_str());
1381 /** Used to marshal pointers into hashes for db storage. */
1382 class CDiskBlockIndex : public CBlockIndex
1398 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1400 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1401 hashNext = (pnext ? pnext->GetBlockHash() : 0);
1406 if (!(nType & SER_GETHASH))
1407 READWRITE(nVersion);
1409 READWRITE(hashNext);
1411 READWRITE(nBlockPos);
1414 READWRITE(nMoneySupply);
1416 READWRITE(nStakeModifier);
1417 if (IsProofOfStake())
1419 READWRITE(prevoutStake);
1420 READWRITE(nStakeTime);
1421 READWRITE(hashProofOfStake);
1425 const_cast<CDiskBlockIndex*>(this)->prevoutStake.SetNull();
1426 const_cast<CDiskBlockIndex*>(this)->nStakeTime = 0;
1427 const_cast<CDiskBlockIndex*>(this)->hashProofOfStake = 0;
1431 READWRITE(this->nVersion);
1432 READWRITE(hashPrev);
1433 READWRITE(hashMerkleRoot);
1437 READWRITE(blockHash);
1440 uint256 GetBlockHash() const
1442 if (fUseFastIndex && (nTime < GetAdjustedTime() - nOneDay) && blockHash != 0)
1446 block.nVersion = nVersion;
1447 block.hashPrevBlock = hashPrev;
1448 block.hashMerkleRoot = hashMerkleRoot;
1449 block.nTime = nTime;
1450 block.nBits = nBits;
1451 block.nNonce = nNonce;
1453 const_cast<CDiskBlockIndex*>(this)->blockHash = block.GetHash();
1458 std::string ToString() const
1460 std::string str = "CDiskBlockIndex(";
1461 str += CBlockIndex::ToString();
1462 str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
1463 GetBlockHash().ToString().c_str(),
1464 hashPrev.ToString().c_str(),
1465 hashNext.ToString().c_str());
1471 printf("%s\n", ToString().c_str());
1482 /** Describes a place in the block chain to another node such that if the
1483 * other node doesn't have the same branch, it can find a recent common trunk.
1484 * The further back it is, the further before the fork it may be.
1489 std::vector<uint256> vHave;
1496 explicit CBlockLocator(const CBlockIndex* pindex)
1501 explicit CBlockLocator(uint256 hashBlock)
1503 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1504 if (mi != mapBlockIndex.end())
1508 CBlockLocator(const std::vector<uint256>& vHaveIn)
1515 if (!(nType & SER_GETHASH))
1516 READWRITE(nVersion);
1527 return vHave.empty();
1530 void Set(const CBlockIndex* pindex)
1536 vHave.push_back(pindex->GetBlockHash());
1538 // Exponentially larger steps back
1539 for (int i = 0; pindex && i < nStep; i++)
1540 pindex = pindex->pprev;
1541 if (vHave.size() > 10)
1544 vHave.push_back((!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet));
1547 int GetDistanceBack()
1549 // Retrace how far back it was in the sender's branch
1552 for (const uint256& hash : vHave)
1554 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1555 if (mi != mapBlockIndex.end())
1557 CBlockIndex* pindex = (*mi).second;
1558 if (pindex->IsInMainChain())
1568 CBlockIndex* GetBlockIndex()
1570 // Find the first block the caller has in the main chain
1571 for (const uint256& hash : vHave)
1573 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1574 if (mi != mapBlockIndex.end())
1576 CBlockIndex* pindex = (*mi).second;
1577 if (pindex->IsInMainChain())
1581 return pindexGenesisBlock;
1584 uint256 GetBlockHash()
1586 // Find the first block the caller has in the main chain
1587 for (const uint256& hash : vHave)
1589 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1590 if (mi != mapBlockIndex.end())
1592 CBlockIndex* pindex = (*mi).second;
1593 if (pindex->IsInMainChain())
1597 return (!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet);
1602 CBlockIndex* pindex = GetBlockIndex();
1605 return pindex->nHeight;
1619 mutable CCriticalSection cs;
1620 std::map<uint256, CTransaction> mapTx;
1621 std::map<COutPoint, CInPoint> mapNextTx;
1623 bool accept(CTxDB& txdb, CTransaction &tx,
1624 bool fCheckInputs, bool* pfMissingInputs);
1625 bool addUnchecked(const uint256& hash, CTransaction &tx);
1626 bool remove(CTransaction &tx);
1628 void queryHashes(std::vector<uint256>& vtxid);
1633 return mapTx.size();
1636 bool exists(uint256 hash)
1638 return (mapTx.count(hash) != 0);
1641 CTransaction& lookup(uint256 hash)
1647 extern CTxMemPool mempool;