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"
16 #include "ui_interface.h"
33 class CRequestTracker;
40 static const unsigned int MAX_BLOCK_SIZE = 1000000;
41 static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2;
42 static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
43 static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100;
44 static const unsigned int MAX_INV_SZ = 50000;
46 static const int64_t MIN_TX_FEE = CENT/10;
47 static const int64_t MIN_RELAY_TX_FEE = CENT/50;
49 static const int64_t MAX_MONEY = numeric_limits<int64_t>::max();
50 static const int64_t MAX_MINT_PROOF_OF_WORK = 100 * COIN;
51 static const int64_t MAX_MINT_PROOF_OF_STAKE = 1 * COIN;
52 static const int64_t MIN_TXOUT_AMOUNT = CENT/100;
55 inline bool MoneyRange(int64_t nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
56 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
57 static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
58 // Maximum number of script-checking threads allowed
59 static const int MAX_SCRIPTCHECK_THREADS = 16;
61 static const uint256 hashGenesisBlock("0x00000a060336cbb72fe969666d337b87198b1add2abaa59cca226820b32933a4");
62 static const uint256 hashGenesisBlockTestNet("0x000c763e402f2436da9ed36c7286f62c3f6e5dbafce9ff289bd43d7459327eb");
64 inline int64_t PastDrift(int64_t nTime) { return nTime - 2 * nOneHour; } // up to 2 hours from the past
65 inline int64_t FutureDrift(int64_t nTime) { return nTime + 2 * nOneHour; } // up to 2 hours from the future
67 extern CScript COINBASE_FLAGS;
68 extern CCriticalSection cs_main;
69 extern map<uint256, CBlockIndex*> mapBlockIndex;
70 extern set<pair<COutPoint, unsigned int> > setStakeSeen;
71 extern CBlockIndex* pindexGenesisBlock;
72 extern unsigned int nNodeLifespan;
73 extern unsigned int nStakeMinAge;
74 extern int nCoinbaseMaturity;
75 extern int nBestHeight;
76 extern uint256 nBestChainTrust;
77 extern uint256 nBestInvalidTrust;
78 extern uint256 hashBestChain;
79 extern CBlockIndex* pindexBest;
80 extern unsigned int nTransactionsUpdated;
81 extern uint64_t nLastBlockTx;
82 extern uint64_t nLastBlockSize;
83 extern uint32_t nLastCoinStakeSearchInterval;
84 extern const string strMessageMagic;
85 extern int64_t nTimeBestReceived;
86 extern CCriticalSection cs_setpwalletRegistered;
87 extern set<CWallet*> setpwalletRegistered;
88 extern uint32_t nNetworkID;
89 extern map<uint256, CBlock*> mapOrphanBlocks;
92 extern int64_t nTransactionFee;
93 extern int64_t nMinimumInputValue;
94 extern bool fUseFastIndex;
95 extern int nScriptCheckThreads;
96 extern const uint256 entropyStore[38];
98 // Minimum disk space required - used in CheckDiskSpace()
99 static const uint64_t nMinDiskSpace = 52428800;
106 void RegisterWallet(CWallet* pwalletIn);
107 void UnregisterWallet(CWallet* pwalletIn);
108 void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false, bool fConnect = true);
109 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
110 bool CheckDiskSpace(uint64_t nAdditionalBytes=0);
111 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
112 FILE* AppendBlockFile(unsigned int& nFileRet);
114 void UnloadBlockIndex();
115 bool LoadBlockIndex(bool fAllowNew=true);
116 void PrintBlockTree();
117 CBlockIndex* FindBlockByHeight(int nHeight);
118 bool ProcessMessages(CNode* pfrom);
119 bool SendMessages(CNode* pto);
120 bool LoadExternalBlockFile(FILE* fileIn, CClientUIInterface& uiInterface);
122 // Run an instance of the script checking thread
123 void ThreadScriptCheck(void* parg);
124 // Stop the script checking threads
125 void ThreadScriptCheckQuit();
127 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
128 unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, bool fProofOfStake);
129 int64_t GetProofOfWorkReward(unsigned int nBits, int64_t nFees=0);
130 int64_t GetProofOfStakeReward(int64_t nCoinAge, unsigned int nBits, int64_t nTime, bool bCoinYearOnly=false);
131 unsigned int ComputeMinWork(unsigned int nBase, int64_t nTime);
132 unsigned int ComputeMinStake(unsigned int nBase, int64_t nTime, unsigned int nBlockTime);
133 int GetNumBlocksOfPeers();
134 bool IsInitialBlockDownload();
135 string GetWarnings(string strFor);
136 bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock);
137 uint256 WantedByOrphan(const CBlock* pblockOrphan);
138 const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake);
139 void ResendWalletTransactions(bool fForceResend=false);
141 bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, unsigned int flags, int nHashType);
149 bool GetWalletFile(CWallet* pwallet, string &strWalletFileOut);
151 /** Position on disk for a particular transaction. */
164 CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
167 nBlockPos = nBlockPosIn;
171 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
172 void SetNull() { nFile = numeric_limits<uint32_t>::max(); nBlockPos = 0; nTxPos = 0; }
173 bool IsNull() const { return (nFile == numeric_limits<uint32_t>::max()); }
175 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
177 return (a.nFile == b.nFile &&
178 a.nBlockPos == b.nBlockPos &&
179 a.nTxPos == b.nTxPos);
182 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
188 string ToString() const
193 return strprintf("(nFile=%" PRIu32 ", nBlockPos=%" PRIu32 ", nTxPos=%" PRIu32 ")", nFile, nBlockPos, nTxPos);
198 printf("%s", ToString().c_str());
204 /** An inpoint - a combination of a transaction and an index n into its vin */
211 CInPoint() { SetNull(); }
212 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
213 void SetNull() { ptx = NULL; n = numeric_limits<uint32_t>::max(); }
214 bool IsNull() const { return (ptx == NULL && n == numeric_limits<uint32_t>::max()); }
219 /** An outpoint - a combination of a transaction hash and an index n into its vout */
226 COutPoint() { SetNull(); }
227 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
228 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
229 void SetNull() { hash = 0; n = numeric_limits<uint32_t>::max(); }
230 bool IsNull() const { return (hash == 0 && n == numeric_limits<uint32_t>::max()); }
232 friend bool operator<(const COutPoint& a, const COutPoint& b)
234 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
237 friend bool operator==(const COutPoint& a, const COutPoint& b)
239 return (a.hash == b.hash && a.n == b.n);
242 friend bool operator!=(const COutPoint& a, const COutPoint& b)
247 string ToString() const
249 return strprintf("COutPoint(%s, %" PRIu32 ")", hash.ToString().substr(0,10).c_str(), n);
254 printf("%s\n", ToString().c_str());
261 /** An input of a transaction. It contains the location of the previous
262 * transaction's output that it claims and a signature that matches the
263 * output's public key.
274 nSequence = numeric_limits<unsigned int>::max();
277 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=numeric_limits<unsigned int>::max())
280 scriptSig = scriptSigIn;
281 nSequence = nSequenceIn;
284 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=numeric_limits<unsigned int>::max())
286 prevout = COutPoint(hashPrevTx, nOut);
287 scriptSig = scriptSigIn;
288 nSequence = nSequenceIn;
294 READWRITE(scriptSig);
295 READWRITE(nSequence);
300 return (nSequence == numeric_limits<unsigned int>::max());
303 friend bool operator==(const CTxIn& a, const CTxIn& b)
305 return (a.prevout == b.prevout &&
306 a.scriptSig == b.scriptSig &&
307 a.nSequence == b.nSequence);
310 friend bool operator!=(const CTxIn& a, const CTxIn& b)
315 string ToStringShort() const
317 return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n);
320 string ToString() const
324 str += prevout.ToString();
325 if (prevout.IsNull())
326 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
328 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
329 if (nSequence != numeric_limits<unsigned int>::max())
330 str += strprintf(", nSequence=%" PRIu32, nSequence);
337 printf("%s\n", ToString().c_str());
344 /** An output of a transaction. It contains the public key that the next input
345 * must be able to sign with to claim it.
351 CScript scriptPubKey;
358 CTxOut(int64_t nValueIn, CScript scriptPubKeyIn)
361 scriptPubKey = scriptPubKeyIn;
367 READWRITE(scriptPubKey);
373 scriptPubKey.clear();
378 return (nValue == -1);
384 scriptPubKey.clear();
389 return (nValue == 0 && scriptPubKey.empty());
392 uint256 GetHash() const
394 return SerializeHash(*this);
397 friend bool operator==(const CTxOut& a, const CTxOut& b)
399 return (a.nValue == b.nValue &&
400 a.scriptPubKey == b.scriptPubKey);
403 friend bool operator!=(const CTxOut& a, const CTxOut& b)
408 string ToStringShort() const
410 return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString(true).c_str());
413 string ToString() const
415 if (IsEmpty()) return "CTxOut(empty)";
416 if (scriptPubKey.size() < 6)
417 return "CTxOut(error)";
418 return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().c_str());
423 printf("%s\n", ToString().c_str());
437 typedef map<uint256, pair<CTxIndex, CTransaction> > MapPrevTx;
439 /** The basic transaction that is broadcasted on the network and contained in
440 * blocks. A transaction can contain multiple inputs and outputs.
445 static const int CURRENT_VERSION=1;
452 // Denial-of-service detection:
454 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
463 READWRITE(this->nVersion);
464 nVersion = this->nVersion;
468 READWRITE(nLockTime);
473 nVersion = CTransaction::CURRENT_VERSION;
474 nTime = (uint32_t) GetAdjustedTime();
478 nDoS = 0; // Denial-of-service prevention
483 return (vin.empty() && vout.empty());
486 uint256 GetHash() const
488 return SerializeHash(*this);
491 bool IsFinal(int nBlockHeight=0, int64_t nBlockTime=0) const
493 // Time based nLockTime implemented in 0.1.6
496 if (nBlockHeight == 0)
497 nBlockHeight = nBestHeight;
499 nBlockTime = GetAdjustedTime();
500 if ((int64_t)nLockTime < ((int64_t)nLockTime < LOCKTIME_THRESHOLD ? (int64_t)nBlockHeight : nBlockTime))
502 for(const CTxIn& txin : vin)
508 bool IsNewerThan(const CTransaction& old) const
510 if (vin.size() != old.vin.size())
512 for (unsigned int i = 0; i < vin.size(); i++)
513 if (vin[i].prevout != old.vin[i].prevout)
517 unsigned int nLowest = numeric_limits<unsigned int>::max();
518 for (unsigned int i = 0; i < vin.size(); i++)
520 if (vin[i].nSequence != old.vin[i].nSequence)
522 if (vin[i].nSequence <= nLowest)
525 nLowest = vin[i].nSequence;
527 if (old.vin[i].nSequence < nLowest)
530 nLowest = old.vin[i].nSequence;
537 bool IsCoinBase() const
539 return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() >= 1);
542 bool IsCoinStake() const
544 // ppcoin: the coin stake transaction is marked with the first output empty
545 return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty());
548 /** Check for standard transaction types
549 @return True if all outputs (scriptPubKeys) use only standard transaction forms
551 bool IsStandard(string& strReason) const;
552 bool IsStandard() const
555 return IsStandard(strReason);
558 /** Check for standard transaction types
559 @param[in] mapInputs Map of previous transactions that have outputs we're spending
560 @return True if all inputs (scriptSigs) use only standard transaction forms
561 @see CTransaction::FetchInputs
563 bool AreInputsStandard(const MapPrevTx& mapInputs) const;
565 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
566 @return number of sigops this transaction's outputs will produce when spent
567 @see CTransaction::FetchInputs
569 unsigned int GetLegacySigOpCount() const;
571 /** Count ECDSA signature operations in pay-to-script-hash inputs.
573 @param[in] mapInputs Map of previous transactions that have outputs we're spending
574 @return maximum number of sigops required to validate this transaction's inputs
575 @see CTransaction::FetchInputs
577 unsigned int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
579 /** Amount of bitcoins spent by this transaction.
580 @return sum of all outputs (note: does not include fees)
582 int64_t GetValueOut() const
584 int64_t nValueOut = 0;
585 for(const CTxOut& txout : vout)
587 nValueOut += txout.nValue;
588 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
589 throw runtime_error("CTransaction::GetValueOut() : value out of range");
594 /** Amount of bitcoins coming in to this transaction
595 Note that lightweight clients may not know anything besides the hash of previous transactions,
596 so may not be able to calculate this.
598 @param[in] mapInputs Map of previous transactions that have outputs we're spending
599 @return Sum of value of all inputs (scriptSigs)
600 @see CTransaction::FetchInputs
602 int64_t GetValueIn(const MapPrevTx& mapInputs) const;
604 static bool AllowFree(double dPriority)
606 // Large (in bytes) low-priority (new, small-coin) transactions
608 return dPriority > COIN * 144 / 250;
611 int64_t GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=false, enum GetMinFee_mode mode=GMF_BLOCK, unsigned int nBytes = 0) const;
613 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
615 auto filein = CAutoFile(OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb"), SER_DISK, CLIENT_VERSION);
617 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
620 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
621 return error("CTransaction::ReadFromDisk() : fseek failed");
626 catch (const exception&) {
627 return error("%s() : deserialize or I/O error", BOOST_CURRENT_FUNCTION);
630 // Return file pointer
633 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
634 return error("CTransaction::ReadFromDisk() : second fseek failed");
635 *pfileRet = filein.release();
640 friend bool operator==(const CTransaction& a, const CTransaction& b)
642 return (a.nVersion == b.nVersion &&
643 a.nTime == b.nTime &&
646 a.nLockTime == b.nLockTime);
649 friend bool operator!=(const CTransaction& a, const CTransaction& b)
654 string ToStringShort() const
657 str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user"));
661 string ToString() const
664 str += IsCoinBase()? "Coinbase" : (IsCoinStake()? "Coinstake" : "CTransaction");
665 str += strprintf("(hash=%s, nTime=%d, ver=%d, vin.size=%" PRIszu ", vout.size=%" PRIszu ", nLockTime=%d)\n",
666 GetHash().ToString().substr(0,10).c_str(),
672 for (unsigned int i = 0; i < vin.size(); i++)
673 str += " " + vin[i].ToString() + "\n";
674 for (unsigned int i = 0; i < vout.size(); i++)
675 str += " " + vout[i].ToString() + "\n";
681 printf("%s", ToString().c_str());
685 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
686 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
687 bool ReadFromDisk(COutPoint prevout);
688 bool DisconnectInputs(CTxDB& txdb);
690 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
692 @param[in] txdb Transaction database
693 @param[in] mapTestPool List of pending changes to the transaction index database
694 @param[in] fBlock True if being called to add a new best-block to the chain
695 @param[in] fMiner True if being called by CreateNewBlock
696 @param[out] inputsRet Pointers to this transaction's inputs
697 @param[out] fInvalid returns true if transaction is invalid
698 @return Returns true if all inputs are in txdb or mapTestPool
700 bool FetchInputs(CTxDB& txdb, const map<uint256, CTxIndex>& mapTestPool,
701 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
703 /** Sanity check previous transactions, then, if all checks succeed,
704 mark them as spent by this transaction.
706 @param[in] inputs Previous transactions (from FetchInputs)
707 @param[out] mapTestPool Keeps track of inputs that need to be updated on disk
708 @param[in] posThisTx Position of this transaction on disk
709 @param[in] pindexBlock
710 @param[in] fBlock true if called from ConnectBlock
711 @param[in] fMiner true if called from CreateNewBlock
712 @param[in] fScriptChecks enable scripts validation?
713 @param[in] flags STRICT_FLAGS script validation flags
714 @param[in] pvChecks NULL If pvChecks is not NULL, script checks are pushed onto it instead of being performed inline.
715 @return Returns true if all checks succeed
717 bool ConnectInputs(CTxDB& txdb, MapPrevTx inputs, map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx, const CBlockIndex* pindexBlock,
718 bool fBlock, bool fMiner, bool fScriptChecks=true,
719 unsigned int flags=STRICT_FLAGS, vector<CScriptCheck> *pvChecks = NULL);
720 bool ClientConnectInputs();
721 bool CheckTransaction() const;
722 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
723 bool GetCoinAge(CTxDB& txdb, uint64_t& nCoinAge) const; // ppcoin: get transaction coin age
726 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
729 /** Closure representing one script verification
730 * Note that this stores references to the spending transaction */
734 CScript scriptPubKey;
735 const CTransaction *ptxTo = nullptr;
736 unsigned int nIn = 0;
737 unsigned int nFlags = 0;
742 CScriptCheck(const CTransaction& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, int nHashTypeIn) :
743 scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey),
744 ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), nHashType(nHashTypeIn) { }
746 bool operator()() const;
748 void swap(CScriptCheck &check) {
749 scriptPubKey.swap(check.scriptPubKey);
750 std::swap(ptxTo, check.ptxTo);
751 std::swap(nIn, check.nIn);
752 std::swap(nFlags, check.nFlags);
753 std::swap(nHashType, check.nHashType);
760 /** A transaction with a merkle branch linking it to the block chain. */
761 class CMerkleTx : public CTransaction
765 vector<uint256> vMerkleBranch;
769 mutable bool fMerkleVerified;
777 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
786 fMerkleVerified = false;
792 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
793 nVersion = this->nVersion;
794 READWRITE(hashBlock);
795 READWRITE(vMerkleBranch);
800 int SetMerkleBranch(const CBlock* pblock=NULL);
801 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
802 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
803 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
804 int GetBlocksToMaturity() const;
805 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
806 bool AcceptToMemoryPool();
812 /** A txdb record that contains the disk location of a transaction and the
813 * locations of transactions that spend its outputs. vSpent is really only
814 * used as a flag, but having the location is very helpful for debugging.
820 vector<CDiskTxPos> vSpent;
827 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
830 vSpent.resize(nOutputs);
835 if (!(nType & SER_GETHASH))
852 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
854 return (a.pos == b.pos &&
855 a.vSpent == b.vSpent);
858 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
862 int GetDepthInMainChain() const;
867 /** Nodes collect new transactions into a block, hash them into a hash tree,
868 * and scan through nonce values to make the block's hash satisfy proof-of-work
869 * requirements. When they solve the proof-of-work, they broadcast the block
870 * to everyone and the block is added to the block chain. The first transaction
871 * in the block is a special one that creates a new coin owned by the creator
874 * Blocks are appended to blk0001.dat files on disk. Their location on disk
875 * is indexed by CBlockIndex objects in memory.
881 static const int CURRENT_VERSION=6;
883 uint256 hashPrevBlock;
884 uint256 hashMerkleRoot;
890 vector<CTransaction> vtx;
892 // ppcoin: block signature - signed by one of the coin base txout[N]'s owner
893 vector<unsigned char> vchBlockSig;
896 mutable vector<uint256> vMerkleTree;
898 // Denial-of-service detection:
900 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
909 READWRITE(this->nVersion);
910 nVersion = this->nVersion;
911 READWRITE(hashPrevBlock);
912 READWRITE(hashMerkleRoot);
917 // ConnectBlock depends on vtx following header to generate CDiskTxPos
918 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
921 READWRITE(vchBlockSig);
925 const_cast<CBlock*>(this)->vtx.clear();
926 const_cast<CBlock*>(this)->vchBlockSig.clear();
932 nVersion = CBlock::CURRENT_VERSION;
949 uint256 GetHash() const
951 return scrypt_blockhash((const uint8_t*)&nVersion);
954 int64_t GetBlockTime() const
956 return (int64_t)nTime;
959 void UpdateTime(const CBlockIndex* pindexPrev);
961 // ppcoin: entropy bit for stake modifier if chosen by modifier
962 unsigned int GetStakeEntropyBit(unsigned int nHeight) const
964 // Protocol switch to support p2pool at novacoin block #9689
965 if (nHeight >= 9689 || fTestNet)
967 // Take last bit of block hash as entropy bit
968 auto nEntropyBit = (GetHash().Get32()) & (uint32_t)1;
969 if (fDebug && GetBoolArg("-printstakemodifier"))
970 printf("GetStakeEntropyBit: nTime=%" PRIu32 " hashBlock=%s nEntropyBit=%" PRIu32 "\n", nTime, GetHash().ToString().c_str(), nEntropyBit);
974 // Before novacoin block #9689 - get from pregenerated table
975 int nBitNum = nHeight & 0xFF;
976 int nItemNum = nHeight / 0xFF;
978 auto nEntropyBit = ((entropyStore[nItemNum] & (uint256(1) << nBitNum)) >> nBitNum).Get32();
979 if (fDebug && GetBoolArg("-printstakemodifier"))
980 printf("GetStakeEntropyBit: from pregenerated table, nHeight=%" PRIu32 " nEntropyBit=%" PRIu32 "\n", nHeight, nEntropyBit);
984 // ppcoin: two types of block: proof-of-work or proof-of-stake
985 bool IsProofOfStake() const
987 return (vtx.size() > 1 && vtx[1].IsCoinStake());
990 bool IsProofOfWork() const
992 return !IsProofOfStake();
995 pair<COutPoint, unsigned int> GetProofOfStake() const
997 if (IsProofOfStake())
998 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(otherside.begin(), otherside.end(), hash.begin(), hash.end());
1055 hash = Hash(hash.begin(), hash.end(), otherside.begin(), otherside.end());
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 << nNetworkID << 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=%" PRId32 ", hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%" PRIu32 ", nBits=%08x, nNonce=%" PRIu32 ", 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 && 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(const uint256 &hash)
1649 return (mapTx.count(hash) != 0);
1652 CTransaction& lookup(const uint256 &hash)
1658 extern CTxMemPool mempool;