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"
32 class CRequestTracker;
39 static const unsigned int MAX_BLOCK_SIZE = 1000000;
40 static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2;
41 static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
42 static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100;
43 static const unsigned int MAX_INV_SZ = 50000;
45 static const int64_t MIN_TX_FEE = CENT/10;
46 static const int64_t MIN_RELAY_TX_FEE = CENT/50;
48 static const int64_t MAX_MONEY = numeric_limits<int64_t>::max();
49 static const int64_t MAX_MINT_PROOF_OF_WORK = 100 * COIN;
50 static const int64_t MAX_MINT_PROOF_OF_STAKE = 1 * COIN;
51 static const int64_t MIN_TXOUT_AMOUNT = CENT/100;
54 inline bool MoneyRange(int64_t nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
55 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
56 static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
57 // Maximum number of script-checking threads allowed
58 static const int MAX_SCRIPTCHECK_THREADS = 16;
60 static const uint256 hashGenesisBlock("0x00000a060336cbb72fe969666d337b87198b1add2abaa59cca226820b32933a4");
61 static const uint256 hashGenesisBlockTestNet("0x000c763e402f2436da9ed36c7286f62c3f6e5dbafce9ff289bd43d7459327eb");
63 inline int64_t PastDrift(int64_t nTime) { return nTime - 2 * nOneHour; } // up to 2 hours from the past
64 inline int64_t FutureDrift(int64_t nTime) { return nTime + 2 * nOneHour; } // up to 2 hours from the future
66 extern CScript COINBASE_FLAGS;
67 extern CCriticalSection cs_main;
68 extern map<uint256, CBlockIndex*> mapBlockIndex;
69 extern set<pair<COutPoint, unsigned int> > setStakeSeen;
70 extern CBlockIndex* pindexGenesisBlock;
71 extern unsigned int nNodeLifespan;
72 extern unsigned int nStakeMinAge;
73 extern int nCoinbaseMaturity;
74 extern int nBestHeight;
75 extern uint256 nBestChainTrust;
76 extern uint256 nBestInvalidTrust;
77 extern uint256 hashBestChain;
78 extern CBlockIndex* pindexBest;
79 extern unsigned int nTransactionsUpdated;
80 extern uint64_t nLastBlockTx;
81 extern uint64_t nLastBlockSize;
82 extern uint32_t nLastCoinStakeSearchInterval;
83 extern const string strMessageMagic;
84 extern int64_t nTimeBestReceived;
85 extern CCriticalSection cs_setpwalletRegistered;
86 extern set<CWallet*> setpwalletRegistered;
87 extern unsigned char pchMessageStart[4];
88 extern map<uint256, CBlock*> mapOrphanBlocks;
91 extern int64_t nTransactionFee;
92 extern int64_t nMinimumInputValue;
93 extern bool fUseFastIndex;
94 extern int nScriptCheckThreads;
95 extern const uint256 entropyStore[38];
97 // Minimum disk space required - used in CheckDiskSpace()
98 static const uint64_t nMinDiskSpace = 52428800;
105 void RegisterWallet(CWallet* pwalletIn);
106 void UnregisterWallet(CWallet* pwalletIn);
107 void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false, bool fConnect = true);
108 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
109 bool CheckDiskSpace(uint64_t nAdditionalBytes=0);
110 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
111 FILE* AppendBlockFile(unsigned int& nFileRet);
113 void UnloadBlockIndex();
114 bool LoadBlockIndex(bool fAllowNew=true);
115 void PrintBlockTree();
116 CBlockIndex* FindBlockByHeight(int nHeight);
117 bool ProcessMessages(CNode* pfrom);
118 bool SendMessages(CNode* pto);
119 bool LoadExternalBlockFile(FILE* fileIn);
121 // Run an instance of the script checking thread
122 void ThreadScriptCheck(void* parg);
123 // Stop the script checking threads
124 void ThreadScriptCheckQuit();
126 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
127 unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, bool fProofOfStake);
128 int64_t GetProofOfWorkReward(unsigned int nBits, int64_t nFees=0);
129 int64_t GetProofOfStakeReward(int64_t nCoinAge, unsigned int nBits, int64_t nTime, bool bCoinYearOnly=false);
130 unsigned int ComputeMinWork(unsigned int nBase, int64_t nTime);
131 unsigned int ComputeMinStake(unsigned int nBase, int64_t nTime, unsigned int nBlockTime);
132 int GetNumBlocksOfPeers();
133 bool IsInitialBlockDownload();
134 string GetWarnings(string strFor);
135 bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock);
136 uint256 WantedByOrphan(const CBlock* pblockOrphan);
137 const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake);
138 void ResendWalletTransactions(bool fForceResend=false);
140 bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, unsigned int flags, int nHashType);
148 bool GetWalletFile(CWallet* pwallet, string &strWalletFileOut);
150 /** Position on disk for a particular transaction. */
163 CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
166 nBlockPos = nBlockPosIn;
170 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
171 void SetNull() { nFile = numeric_limits<uint32_t>::max(); nBlockPos = 0; nTxPos = 0; }
172 bool IsNull() const { return (nFile == numeric_limits<uint32_t>::max()); }
174 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
176 return (a.nFile == b.nFile &&
177 a.nBlockPos == b.nBlockPos &&
178 a.nTxPos == b.nTxPos);
181 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
187 string ToString() const
192 return strprintf("(nFile=%u, nBlockPos=%u, nTxPos=%u)", nFile, nBlockPos, nTxPos);
197 printf("%s", ToString().c_str());
203 /** An inpoint - a combination of a transaction and an index n into its vin */
210 CInPoint() { SetNull(); }
211 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
212 void SetNull() { ptx = NULL; n = numeric_limits<uint32_t>::max(); }
213 bool IsNull() const { return (ptx == NULL && n == numeric_limits<uint32_t>::max()); }
218 /** An outpoint - a combination of a transaction hash and an index n into its vout */
225 COutPoint() { SetNull(); }
226 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
227 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
228 void SetNull() { hash = 0; n = numeric_limits<uint32_t>::max(); }
229 bool IsNull() const { return (hash == 0 && n == numeric_limits<uint32_t>::max()); }
231 friend bool operator<(const COutPoint& a, const COutPoint& b)
233 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
236 friend bool operator==(const COutPoint& a, const COutPoint& b)
238 return (a.hash == b.hash && a.n == b.n);
241 friend bool operator!=(const COutPoint& a, const COutPoint& b)
246 string ToString() const
248 return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10).c_str(), n);
253 printf("%s\n", ToString().c_str());
260 /** An input of a transaction. It contains the location of the previous
261 * transaction's output that it claims and a signature that matches the
262 * output's public key.
273 nSequence = numeric_limits<unsigned int>::max();
276 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=numeric_limits<unsigned int>::max())
279 scriptSig = scriptSigIn;
280 nSequence = nSequenceIn;
283 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=numeric_limits<unsigned int>::max())
285 prevout = COutPoint(hashPrevTx, nOut);
286 scriptSig = scriptSigIn;
287 nSequence = nSequenceIn;
293 READWRITE(scriptSig);
294 READWRITE(nSequence);
299 return (nSequence == numeric_limits<unsigned int>::max());
302 friend bool operator==(const CTxIn& a, const CTxIn& b)
304 return (a.prevout == b.prevout &&
305 a.scriptSig == b.scriptSig &&
306 a.nSequence == b.nSequence);
309 friend bool operator!=(const CTxIn& a, const CTxIn& b)
314 string ToStringShort() const
316 return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n);
319 string ToString() const
323 str += prevout.ToString();
324 if (prevout.IsNull())
325 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
327 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
328 if (nSequence != numeric_limits<unsigned int>::max())
329 str += strprintf(", nSequence=%u", nSequence);
336 printf("%s\n", ToString().c_str());
343 /** An output of a transaction. It contains the public key that the next input
344 * must be able to sign with to claim it.
350 CScript scriptPubKey;
357 CTxOut(int64_t nValueIn, CScript scriptPubKeyIn)
360 scriptPubKey = scriptPubKeyIn;
366 READWRITE(scriptPubKey);
372 scriptPubKey.clear();
377 return (nValue == -1);
383 scriptPubKey.clear();
388 return (nValue == 0 && scriptPubKey.empty());
391 uint256 GetHash() const
393 return SerializeHash(*this);
396 friend bool operator==(const CTxOut& a, const CTxOut& b)
398 return (a.nValue == b.nValue &&
399 a.scriptPubKey == b.scriptPubKey);
402 friend bool operator!=(const CTxOut& a, const CTxOut& b)
407 string ToStringShort() const
409 return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString(true).c_str());
412 string ToString() const
414 if (IsEmpty()) return "CTxOut(empty)";
415 if (scriptPubKey.size() < 6)
416 return "CTxOut(error)";
417 return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().c_str());
422 printf("%s\n", ToString().c_str());
436 typedef map<uint256, pair<CTxIndex, CTransaction> > MapPrevTx;
438 /** The basic transaction that is broadcasted on the network and contained in
439 * blocks. A transaction can contain multiple inputs and outputs.
444 static const int CURRENT_VERSION=1;
451 // Denial-of-service detection:
453 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
462 READWRITE(this->nVersion);
463 nVersion = this->nVersion;
467 READWRITE(nLockTime);
472 nVersion = CTransaction::CURRENT_VERSION;
473 nTime = (uint32_t) GetAdjustedTime();
477 nDoS = 0; // Denial-of-service prevention
482 return (vin.empty() && vout.empty());
485 uint256 GetHash() const
487 return SerializeHash(*this);
490 bool IsFinal(int nBlockHeight=0, int64_t nBlockTime=0) const
492 // Time based nLockTime implemented in 0.1.6
495 if (nBlockHeight == 0)
496 nBlockHeight = nBestHeight;
498 nBlockTime = GetAdjustedTime();
499 if ((int64_t)nLockTime < ((int64_t)nLockTime < LOCKTIME_THRESHOLD ? (int64_t)nBlockHeight : nBlockTime))
501 for(const CTxIn& txin : vin)
507 bool IsNewerThan(const CTransaction& old) const
509 if (vin.size() != old.vin.size())
511 for (unsigned int i = 0; i < vin.size(); i++)
512 if (vin[i].prevout != old.vin[i].prevout)
516 unsigned int nLowest = numeric_limits<unsigned int>::max();
517 for (unsigned int i = 0; i < vin.size(); i++)
519 if (vin[i].nSequence != old.vin[i].nSequence)
521 if (vin[i].nSequence <= nLowest)
524 nLowest = vin[i].nSequence;
526 if (old.vin[i].nSequence < nLowest)
529 nLowest = old.vin[i].nSequence;
536 bool IsCoinBase() const
538 return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() >= 1);
541 bool IsCoinStake() const
543 // ppcoin: the coin stake transaction is marked with the first output empty
544 return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty());
547 /** Check for standard transaction types
548 @return True if all outputs (scriptPubKeys) use only standard transaction forms
550 bool IsStandard(string& strReason) const;
551 bool IsStandard() const
554 return IsStandard(strReason);
557 /** Check for standard transaction types
558 @param[in] mapInputs Map of previous transactions that have outputs we're spending
559 @return True if all inputs (scriptSigs) use only standard transaction forms
560 @see CTransaction::FetchInputs
562 bool AreInputsStandard(const MapPrevTx& mapInputs) const;
564 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
565 @return number of sigops this transaction's outputs will produce when spent
566 @see CTransaction::FetchInputs
568 unsigned int GetLegacySigOpCount() const;
570 /** Count ECDSA signature operations in pay-to-script-hash inputs.
572 @param[in] mapInputs Map of previous transactions that have outputs we're spending
573 @return maximum number of sigops required to validate this transaction's inputs
574 @see CTransaction::FetchInputs
576 unsigned int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
578 /** Amount of bitcoins spent by this transaction.
579 @return sum of all outputs (note: does not include fees)
581 int64_t GetValueOut() const
583 int64_t nValueOut = 0;
584 for(const CTxOut& txout : vout)
586 nValueOut += txout.nValue;
587 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
588 throw runtime_error("CTransaction::GetValueOut() : value out of range");
593 /** Amount of bitcoins coming in to this transaction
594 Note that lightweight clients may not know anything besides the hash of previous transactions,
595 so may not be able to calculate this.
597 @param[in] mapInputs Map of previous transactions that have outputs we're spending
598 @return Sum of value of all inputs (scriptSigs)
599 @see CTransaction::FetchInputs
601 int64_t GetValueIn(const MapPrevTx& mapInputs) const;
603 static bool AllowFree(double dPriority)
605 // Large (in bytes) low-priority (new, small-coin) transactions
607 return dPriority > COIN * 144 / 250;
610 int64_t GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=false, enum GetMinFee_mode mode=GMF_BLOCK, unsigned int nBytes = 0) const;
612 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
614 auto filein = CAutoFile(OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb"), SER_DISK, CLIENT_VERSION);
616 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
619 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
620 return error("CTransaction::ReadFromDisk() : fseek failed");
625 catch (const exception&) {
626 return error("%s() : deserialize or I/O error", BOOST_CURRENT_FUNCTION);
629 // Return file pointer
632 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
633 return error("CTransaction::ReadFromDisk() : second fseek failed");
634 *pfileRet = filein.release();
639 friend bool operator==(const CTransaction& a, const CTransaction& b)
641 return (a.nVersion == b.nVersion &&
642 a.nTime == b.nTime &&
645 a.nLockTime == b.nLockTime);
648 friend bool operator!=(const CTransaction& a, const CTransaction& b)
653 string ToStringShort() const
656 str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user"));
660 string ToString() const
663 str += IsCoinBase()? "Coinbase" : (IsCoinStake()? "Coinstake" : "CTransaction");
664 str += strprintf("(hash=%s, nTime=%d, ver=%d, vin.size=%" PRIszu ", vout.size=%" PRIszu ", nLockTime=%d)\n",
665 GetHash().ToString().substr(0,10).c_str(),
671 for (unsigned int i = 0; i < vin.size(); i++)
672 str += " " + vin[i].ToString() + "\n";
673 for (unsigned int i = 0; i < vout.size(); i++)
674 str += " " + vout[i].ToString() + "\n";
680 printf("%s", ToString().c_str());
684 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
685 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
686 bool ReadFromDisk(COutPoint prevout);
687 bool DisconnectInputs(CTxDB& txdb);
689 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
691 @param[in] txdb Transaction database
692 @param[in] mapTestPool List of pending changes to the transaction index database
693 @param[in] fBlock True if being called to add a new best-block to the chain
694 @param[in] fMiner True if being called by CreateNewBlock
695 @param[out] inputsRet Pointers to this transaction's inputs
696 @param[out] fInvalid returns true if transaction is invalid
697 @return Returns true if all inputs are in txdb or mapTestPool
699 bool FetchInputs(CTxDB& txdb, const map<uint256, CTxIndex>& mapTestPool,
700 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
702 /** Sanity check previous transactions, then, if all checks succeed,
703 mark them as spent by this transaction.
705 @param[in] inputs Previous transactions (from FetchInputs)
706 @param[out] mapTestPool Keeps track of inputs that need to be updated on disk
707 @param[in] posThisTx Position of this transaction on disk
708 @param[in] pindexBlock
709 @param[in] fBlock true if called from ConnectBlock
710 @param[in] fMiner true if called from CreateNewBlock
711 @param[in] fScriptChecks enable scripts validation?
712 @param[in] flags STRICT_FLAGS script validation flags
713 @param[in] pvChecks NULL If pvChecks is not NULL, script checks are pushed onto it instead of being performed inline.
714 @return Returns true if all checks succeed
716 bool ConnectInputs(CTxDB& txdb, MapPrevTx inputs, map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx, const CBlockIndex* pindexBlock,
717 bool fBlock, bool fMiner, bool fScriptChecks=true,
718 unsigned int flags=STRICT_FLAGS, vector<CScriptCheck> *pvChecks = NULL);
719 bool ClientConnectInputs();
720 bool CheckTransaction() const;
721 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
722 bool GetCoinAge(CTxDB& txdb, uint64_t& nCoinAge) const; // ppcoin: get transaction coin age
725 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
728 /** Closure representing one script verification
729 * Note that this stores references to the spending transaction */
733 CScript scriptPubKey;
734 const CTransaction *ptxTo;
741 CScriptCheck(const CTransaction& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, int nHashTypeIn) :
742 scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey),
743 ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), nHashType(nHashTypeIn) { }
745 bool operator()() const;
747 void swap(CScriptCheck &check) {
748 scriptPubKey.swap(check.scriptPubKey);
749 std::swap(ptxTo, check.ptxTo);
750 std::swap(nIn, check.nIn);
751 std::swap(nFlags, check.nFlags);
752 std::swap(nHashType, check.nHashType);
759 /** A transaction with a merkle branch linking it to the block chain. */
760 class CMerkleTx : public CTransaction
764 vector<uint256> vMerkleBranch;
768 mutable bool fMerkleVerified;
776 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
785 fMerkleVerified = false;
791 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
792 nVersion = this->nVersion;
793 READWRITE(hashBlock);
794 READWRITE(vMerkleBranch);
799 int SetMerkleBranch(const CBlock* pblock=NULL);
800 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
801 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
802 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
803 int GetBlocksToMaturity() const;
804 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
805 bool AcceptToMemoryPool();
811 /** A txdb record that contains the disk location of a transaction and the
812 * locations of transactions that spend its outputs. vSpent is really only
813 * used as a flag, but having the location is very helpful for debugging.
819 vector<CDiskTxPos> vSpent;
826 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
829 vSpent.resize(nOutputs);
834 if (!(nType & SER_GETHASH))
851 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
853 return (a.pos == b.pos &&
854 a.vSpent == b.vSpent);
857 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
861 int GetDepthInMainChain() const;
866 /** Nodes collect new transactions into a block, hash them into a hash tree,
867 * and scan through nonce values to make the block's hash satisfy proof-of-work
868 * requirements. When they solve the proof-of-work, they broadcast the block
869 * to everyone and the block is added to the block chain. The first transaction
870 * in the block is a special one that creates a new coin owned by the creator
873 * Blocks are appended to blk0001.dat files on disk. Their location on disk
874 * is indexed by CBlockIndex objects in memory.
880 static const int CURRENT_VERSION=6;
882 uint256 hashPrevBlock;
883 uint256 hashMerkleRoot;
889 vector<CTransaction> vtx;
891 // ppcoin: block signature - signed by one of the coin base txout[N]'s owner
892 vector<unsigned char> vchBlockSig;
895 mutable vector<uint256> vMerkleTree;
897 // Denial-of-service detection:
899 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
908 READWRITE(this->nVersion);
909 nVersion = this->nVersion;
910 READWRITE(hashPrevBlock);
911 READWRITE(hashMerkleRoot);
916 // ConnectBlock depends on vtx following header to generate CDiskTxPos
917 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
920 READWRITE(vchBlockSig);
924 const_cast<CBlock*>(this)->vtx.clear();
925 const_cast<CBlock*>(this)->vchBlockSig.clear();
931 nVersion = CBlock::CURRENT_VERSION;
948 uint256 GetHash() const
950 return scrypt_blockhash((const uint8_t*)&nVersion);
953 int64_t GetBlockTime() const
955 return (int64_t)nTime;
958 void UpdateTime(const CBlockIndex* pindexPrev);
960 // ppcoin: entropy bit for stake modifier if chosen by modifier
961 unsigned int GetStakeEntropyBit(unsigned int nHeight) const
963 // Protocol switch to support p2pool at novacoin block #9689
964 if (nHeight >= 9689 || fTestNet)
966 // Take last bit of block hash as entropy bit
967 unsigned int nEntropyBit = (GetHash().Get64()) & (uint64_t)1;
968 if (fDebug && GetBoolArg("-printstakemodifier"))
969 printf("GetStakeEntropyBit: nTime=%u hashBlock=%s nEntropyBit=%u\n", nTime, GetHash().ToString().c_str(), nEntropyBit);
973 // Before novacoin block #9689 - get from pregenerated table
974 int nBitNum = nHeight & 0xFF;
975 int nItemNum = nHeight / 0xFF;
977 unsigned int nEntropyBit = (unsigned int) ((entropyStore[nItemNum] & (uint256(1) << nBitNum)) >> nBitNum).Get64();
978 if (fDebug && GetBoolArg("-printstakemodifier"))
979 printf("GetStakeEntropyBit: from pregenerated table, nHeight=%d nEntropyBit=%u\n", nHeight, nEntropyBit);
983 // ppcoin: two types of block: proof-of-work or proof-of-stake
984 bool IsProofOfStake() const
986 return (vtx.size() > 1 && vtx[1].IsCoinStake());
989 bool IsProofOfWork() const
991 return !IsProofOfStake();
994 pair<COutPoint, unsigned int> GetProofOfStake() const
996 if (IsProofOfStake())
997 return { vtx[1].vin[0].prevout, vtx[1].nTime };
999 return { COutPoint(), (unsigned int)0 };
1002 // ppcoin: get max transaction timestamp
1003 int64_t GetMaxTransactionTime() const
1005 int64_t maxTransactionTime = 0;
1006 for(const auto& tx : vtx)
1007 maxTransactionTime = max(maxTransactionTime, (int64_t)tx.nTime);
1008 return maxTransactionTime;
1011 uint256 BuildMerkleTree() const
1013 vMerkleTree.clear();
1014 for(const auto& tx : vtx)
1015 vMerkleTree.push_back(tx.GetHash());
1017 for (int nSize = (int)vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
1019 for (int i = 0; i < nSize; i += 2)
1021 int i2 = min(i+1, nSize-1);
1022 vMerkleTree.push_back(Hash(vMerkleTree[j+i].begin(), vMerkleTree[j+i].end(),
1023 vMerkleTree[j+i2].begin(), vMerkleTree[j+i2].end()));
1027 return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
1030 vector<uint256> GetMerkleBranch(int nIndex) const
1032 if (vMerkleTree.empty())
1034 vector<uint256> vMerkleBranch;
1036 for (int nSize = (int)vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
1038 int i = min(nIndex^1, nSize-1);
1039 vMerkleBranch.push_back(vMerkleTree[j+i]);
1043 return vMerkleBranch;
1046 static uint256 CheckMerkleBranch(uint256 hash, const vector<uint256>& vMerkleBranch, int nIndex)
1050 for(const uint256& otherside : vMerkleBranch)
1053 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
1055 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
1062 bool WriteToDisk(unsigned int& nFileRet, unsigned int& nBlockPosRet)
1064 // Open history file to append
1065 auto fileout = CAutoFile(AppendBlockFile(nFileRet), SER_DISK, CLIENT_VERSION);
1067 return error("CBlock::WriteToDisk() : AppendBlockFile failed");
1069 // Write index header
1070 unsigned int nSize = fileout.GetSerializeSize(*this);
1071 fileout << FLATDATA(pchMessageStart) << nSize;
1074 long fileOutPos = ftell(fileout);
1076 return error("CBlock::WriteToDisk() : ftell failed");
1077 nBlockPosRet = fileOutPos;
1080 // Flush stdio buffers and commit to disk before returning
1082 if (!IsInitialBlockDownload() || (nBestHeight+1) % 500 == 0)
1083 FileCommit(fileout);
1088 bool ReadFromDisk(unsigned int nFile, unsigned int nBlockPos, bool fReadTransactions=true)
1092 // Open history file to read
1093 auto filein = CAutoFile(OpenBlockFile(nFile, nBlockPos, "rb"), SER_DISK, CLIENT_VERSION);
1095 return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
1096 if (!fReadTransactions)
1097 filein.nType |= SER_BLOCKHEADERONLY;
1103 catch (const exception&) {
1104 return error("%s() : deserialize or I/O error", BOOST_CURRENT_FUNCTION);
1108 if (fReadTransactions && IsProofOfWork() && !CheckProofOfWork(GetHash(), nBits))
1109 return error("CBlock::ReadFromDisk() : errors in block header");
1118 printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%" PRIszu ", vchBlockSig=%s)\n",
1119 GetHash().ToString().c_str(),
1121 hashPrevBlock.ToString().c_str(),
1122 hashMerkleRoot.ToString().c_str(),
1123 nTime, nBits, nNonce,
1125 HexStr(vchBlockSig.begin(), vchBlockSig.end()).c_str());
1126 for (unsigned int i = 0; i < vtx.size(); i++)
1131 printf(" vMerkleTree: ");
1132 for (unsigned int i = 0; i < vMerkleTree.size(); i++)
1133 printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
1138 bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1139 bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck=false);
1140 bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
1141 bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
1142 bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
1143 bool CheckBlock(bool fCheckPOW=true, bool fCheckMerkleRoot=true, bool fCheckSig=true) const;
1145 bool GetCoinAge(uint64_t& nCoinAge) const; // ppcoin: calculate total coin age spent in block
1146 bool CheckBlockSignature() const;
1149 bool SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew);
1157 /** The block chain is a tree shaped structure starting with the
1158 * genesis block at the root, with each block potentially having multiple
1159 * candidates to be the next block. pprev and pnext link a path through the
1160 * main/longest chain. A blockindex may have multiple pprev pointing back
1161 * to it, but pnext will only point forward to the longest branch, or will
1162 * be null if the block is not part of the longest chain.
1167 const uint256* phashBlock;
1172 uint256 nChainTrust; // ppcoin: trust score of block chain
1176 int64_t nMoneySupply;
1178 uint32_t nFlags; // ppcoin: block index flags
1181 BLOCK_PROOF_OF_STAKE = (1 << 0), // is proof-of-stake block
1182 BLOCK_STAKE_ENTROPY = (1 << 1), // entropy bit for stake modifier
1183 BLOCK_STAKE_MODIFIER = (1 << 2) // regenerated stake modifier
1186 uint64_t nStakeModifier; // hash modifier for proof-of-stake
1187 uint32_t nStakeModifierChecksum; // checksum of index; in-memeory only
1189 // proof-of-stake specific fields
1190 COutPoint prevoutStake;
1191 uint32_t nStakeTime;
1192 uint256 hashProofOfStake;
1196 uint256 hashMerkleRoot;
1214 nStakeModifierChecksum = 0;
1215 hashProofOfStake = 0;
1216 prevoutStake.SetNull();
1226 CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block)
1232 nBlockPos = nBlockPosIn;
1239 nStakeModifierChecksum = 0;
1240 hashProofOfStake = 0;
1241 if (block.IsProofOfStake())
1244 prevoutStake = block.vtx[1].vin[0].prevout;
1245 nStakeTime = block.vtx[1].nTime;
1249 prevoutStake.SetNull();
1253 nVersion = block.nVersion;
1254 hashMerkleRoot = block.hashMerkleRoot;
1255 nTime = block.nTime;
1256 nBits = block.nBits;
1257 nNonce = block.nNonce;
1260 CBlock GetBlockHeader() const
1263 block.nVersion = nVersion;
1265 block.hashPrevBlock = pprev->GetBlockHash();
1266 block.hashMerkleRoot = hashMerkleRoot;
1267 block.nTime = nTime;
1268 block.nBits = nBits;
1269 block.nNonce = nNonce;
1273 uint256 GetBlockHash() const
1278 int64_t GetBlockTime() const
1280 return (int64_t)nTime;
1283 uint256 GetBlockTrust() const;
1285 bool IsInMainChain() const
1287 return (pnext || this == pindexBest);
1290 bool CheckIndex() const
1295 enum { nMedianTimeSpan=11 };
1297 int64_t GetMedianTimePast() const
1299 int64_t pmedian[nMedianTimeSpan];
1300 int64_t* pbegin = &pmedian[nMedianTimeSpan];
1301 int64_t* pend = &pmedian[nMedianTimeSpan];
1303 const CBlockIndex* pindex = this;
1304 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1305 *(--pbegin) = pindex->GetBlockTime();
1308 return pbegin[(pend - pbegin)/2];
1311 int64_t GetMedianTime() const
1313 const CBlockIndex* pindex = this;
1314 for (int i = 0; i < nMedianTimeSpan/2; i++)
1317 return GetBlockTime();
1318 pindex = pindex->pnext;
1320 return pindex->GetMedianTimePast();
1324 * Returns true if there are nRequired or more blocks of minVersion or above
1325 * in the last nToCheck blocks, starting at pstart and going backwards.
1327 static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart,
1328 unsigned int nRequired, unsigned int nToCheck);
1331 bool IsProofOfWork() const
1333 return !(nFlags & BLOCK_PROOF_OF_STAKE);
1336 bool IsProofOfStake() const
1338 return (nFlags & BLOCK_PROOF_OF_STAKE);
1341 void SetProofOfStake()
1343 nFlags |= BLOCK_PROOF_OF_STAKE;
1346 unsigned int GetStakeEntropyBit() const
1348 return ((nFlags & BLOCK_STAKE_ENTROPY) >> 1);
1351 bool SetStakeEntropyBit(unsigned int nEntropyBit)
1353 if (nEntropyBit > 1)
1355 nFlags |= (nEntropyBit? BLOCK_STAKE_ENTROPY : 0);
1359 bool GeneratedStakeModifier() const
1361 return (nFlags & BLOCK_STAKE_MODIFIER) != 0;
1364 void SetStakeModifier(uint64_t nModifier, bool fGeneratedStakeModifier)
1366 nStakeModifier = nModifier;
1367 if (fGeneratedStakeModifier)
1368 nFlags |= BLOCK_STAKE_MODIFIER;
1371 string ToString() const
1373 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)",
1374 (const void*)pprev, (const void*)pnext, nFile, nBlockPos, nHeight,
1375 FormatMoney(nMint).c_str(), FormatMoney(nMoneySupply).c_str(),
1376 GeneratedStakeModifier() ? "MOD" : "-", GetStakeEntropyBit(), IsProofOfStake()? "PoS" : "PoW",
1377 nStakeModifier, nStakeModifierChecksum,
1378 hashProofOfStake.ToString().c_str(),
1379 prevoutStake.ToString().c_str(), nStakeTime,
1380 hashMerkleRoot.ToString().c_str(),
1381 GetBlockHash().ToString().c_str());
1386 printf("%s\n", ToString().c_str());
1392 /** Used to marshal pointers into hashes for db storage. */
1393 class CDiskBlockIndex : public CBlockIndex
1409 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1411 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1412 hashNext = (pnext ? pnext->GetBlockHash() : 0);
1417 if (!(nType & SER_GETHASH))
1418 READWRITE(nVersion);
1420 READWRITE(hashNext);
1422 READWRITE(nBlockPos);
1425 READWRITE(nMoneySupply);
1427 READWRITE(nStakeModifier);
1428 if (IsProofOfStake())
1430 READWRITE(prevoutStake);
1431 READWRITE(nStakeTime);
1432 READWRITE(hashProofOfStake);
1436 const_cast<CDiskBlockIndex*>(this)->prevoutStake.SetNull();
1437 const_cast<CDiskBlockIndex*>(this)->nStakeTime = 0;
1438 const_cast<CDiskBlockIndex*>(this)->hashProofOfStake = 0;
1442 READWRITE(this->nVersion);
1443 READWRITE(hashPrev);
1444 READWRITE(hashMerkleRoot);
1448 READWRITE(blockHash);
1451 uint256 GetBlockHash() const
1453 if (fUseFastIndex && (nTime < GetAdjustedTime() - nOneDay) && blockHash != 0)
1457 block.nVersion = nVersion;
1458 block.hashPrevBlock = hashPrev;
1459 block.hashMerkleRoot = hashMerkleRoot;
1460 block.nTime = nTime;
1461 block.nBits = nBits;
1462 block.nNonce = nNonce;
1464 const_cast<CDiskBlockIndex*>(this)->blockHash = block.GetHash();
1469 string ToString() const
1471 string str = "CDiskBlockIndex(";
1472 str += CBlockIndex::ToString();
1473 str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
1474 GetBlockHash().ToString().c_str(),
1475 hashPrev.ToString().c_str(),
1476 hashNext.ToString().c_str());
1482 printf("%s\n", ToString().c_str());
1493 /** Describes a place in the block chain to another node such that if the
1494 * other node doesn't have the same branch, it can find a recent common trunk.
1495 * The further back it is, the further before the fork it may be.
1500 vector<uint256> vHave;
1507 explicit CBlockLocator(const CBlockIndex* pindex)
1512 explicit CBlockLocator(uint256 hashBlock)
1514 auto mi = mapBlockIndex.find(hashBlock);
1515 if (mi != mapBlockIndex.end())
1519 CBlockLocator(const vector<uint256>& vHaveIn)
1526 if (!(nType & SER_GETHASH))
1527 READWRITE(nVersion);
1538 return vHave.empty();
1541 void Set(const CBlockIndex* pindex)
1547 vHave.push_back(pindex->GetBlockHash());
1549 // Exponentially larger steps back
1550 for (int i = 0; pindex && i < nStep; i++)
1551 pindex = pindex->pprev;
1552 if (vHave.size() > 10)
1555 vHave.push_back((!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet));
1558 int GetDistanceBack()
1560 // Retrace how far back it was in the sender's branch
1563 for(const auto& hash : vHave)
1565 auto mi = mapBlockIndex.find(hash);
1566 if (mi != mapBlockIndex.end())
1568 auto pindex = (*mi).second;
1569 if (pindex->IsInMainChain())
1579 CBlockIndex* GetBlockIndex()
1581 // Find the first block the caller has in the main chain
1582 for(const auto& hash : vHave)
1584 auto mi = mapBlockIndex.find(hash);
1585 if (mi != mapBlockIndex.end())
1587 auto pindex = (*mi).second;
1588 if (pindex->IsInMainChain())
1592 return pindexGenesisBlock;
1595 uint256 GetBlockHash()
1597 // Find the first block the caller has in the main chain
1598 for(const uint256& hash : vHave)
1600 auto mi = mapBlockIndex.find(hash);
1601 if (mi != mapBlockIndex.end())
1603 auto pindex = (*mi).second;
1604 if (pindex->IsInMainChain())
1608 return (!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet);
1613 CBlockIndex* pindex = GetBlockIndex();
1616 return pindex->nHeight;
1630 mutable CCriticalSection cs;
1631 map<uint256, CTransaction> mapTx;
1632 map<COutPoint, CInPoint> mapNextTx;
1634 bool accept(CTxDB& txdb, CTransaction &tx,
1635 bool fCheckInputs, bool* pfMissingInputs);
1636 bool addUnchecked(const uint256& hash, CTransaction &tx);
1637 bool remove(CTransaction &tx);
1639 void queryHashes(vector<uint256>& vtxid);
1644 return mapTx.size();
1647 bool exists(uint256 hash)
1649 return (mapTx.count(hash) != 0);
1652 CTransaction& lookup(uint256 hash)
1658 extern CTxMemPool mempool;