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.
13 #include "zerocoin/Zerocoin.h"
26 class CRequestTracker;
28 class CBlockIndexTrustComparator;
30 static const unsigned int MAX_BLOCK_SIZE = 1000000;
31 static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2;
32 static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
33 static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100;
34 static const unsigned int MAX_INV_SZ = 50000;
36 static const unsigned int MAX_BLOCKFILE_SIZE = 0x8000000; // 128 MiB
37 static const unsigned int BLOCKFILE_CHUNK_SIZE = 0x1000000; // 16 MiB
38 static const unsigned int UNDOFILE_CHUNK_SIZE = 0x100000; // 1 MiB
39 static const unsigned int MEMPOOL_HEIGHT = 0x7FFFFFFF;
41 static const int64 MIN_TX_FEE = CENT;
42 static const int64 MIN_RELAY_TX_FEE = CENT;
43 static const int64 MAX_MONEY = 2000000000 * COIN;
44 static const int64 MAX_MINT_PROOF_OF_WORK = 100 * COIN;
45 static const int64 MAX_MINT_PROOF_OF_STAKE = 1 * COIN;
46 static const int64 MIN_TXOUT_AMOUNT = MIN_TX_FEE;
48 static const unsigned int ENTROPY_SWITCH_TIME = 1362791041; // Sat, 09 Mar 2013 01:04:01 GMT
49 static const unsigned int STAKE_SWITCH_TIME = 1371686400; // Thu, 20 Jun 2013 00:00:00 GMT
50 static const unsigned int TARGETS_SWITCH_TIME = 1374278400; // Sat, 20 Jul 2013 00:00:00 GMT
51 static const unsigned int CHAINCHECKS_SWITCH_TIME = 1379635200; // Fri, 20 Sep 2013 00:00:00 GMT
52 static const unsigned int STAKECURVE_SWITCH_TIME = 1382227200; // Sun, 20 Oct 2013 00:00:00 GMT
53 static const unsigned int OUTPUT_SWITCH_TIME = 1398916800; // Thu, 01 May 2014 04:00:00 GMT
56 inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
57 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
58 static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
61 static const int fHaveUPnP = true;
63 static const int fHaveUPnP = false;
66 static const uint256 hashGenesisBlock("0x00000a060336cbb72fe969666d337b87198b1add2abaa59cca226820b32933a4");
67 static const uint256 hashGenesisBlockTestNet("0x000c763e402f2436da9ed36c7286f62c3f6e5dbafce9ff289bd43d7459327eb");
69 inline int64 PastDrift(int64 nTime) { return nTime - 2 * 60 * 60; } // up to 2 hours from the past
70 inline int64 FutureDrift(int64 nTime) { return nTime + 2 * 60 * 60; } // up to 2 hours from the future
72 extern libzerocoin::Params* ZCParams;
73 extern CScript COINBASE_FLAGS;
74 extern CCriticalSection cs_main;
75 extern std::map<uint256, CBlockIndex*> mapBlockIndex;
76 extern std::set<CBlockIndex*, CBlockIndexTrustComparator> setBlockIndexValid;
77 extern std::set<std::pair<COutPoint, unsigned int> > setStakeSeen;
78 extern CBlockIndex* pindexGenesisBlock;
79 extern unsigned int nStakeMinAge;
80 extern unsigned int nNodeLifespan;
81 extern int nCoinbaseMaturity;
82 extern int nBestHeight;
83 extern uint256 nBestChainTrust;
84 extern uint256 nBestInvalidTrust;
85 extern uint256 hashBestChain;
86 extern CBlockIndex* pindexBest;
87 extern unsigned int nTransactionsUpdated;
88 extern uint64 nLastBlockTx;
89 extern uint64 nLastBlockSize;
90 extern int64 nLastCoinStakeSearchInterval;
91 extern const std::string strMessageMagic;
92 extern int64 nTimeBestReceived;
93 extern CCriticalSection cs_setpwalletRegistered;
94 extern std::set<CWallet*> setpwalletRegistered;
95 extern unsigned char pchMessageStart[4];
96 extern std::map<uint256, CBlock*> mapOrphanBlocks;
99 extern int64 nTransactionFee;
100 extern int64 nMinimumInputValue;
101 extern bool fUseFastIndex;
102 extern unsigned int nDerivationMethodIndex;
104 // Minimum disk space required - used in CheckDiskSpace()
105 static const uint64 nMinDiskSpace = 52428800;
114 class CCoinsViewCache;
116 void RegisterWallet(CWallet* pwalletIn);
117 void UnregisterWallet(CWallet* pwalletIn);
118 void SyncWithWallets(const uint256 &hash, const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false, bool fConnect = true);
119 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
120 bool CheckDiskSpace(uint64 nAdditionalBytes=0);
121 FILE* OpenBlockFile(const CDiskBlockPos &pos, bool fReadOnly = false);
122 FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly = false);
123 bool LoadBlockIndex(bool fAllowNew=true);
124 void PrintBlockTree();
125 CBlockIndex* FindBlockByHeight(int nHeight);
126 bool ProcessMessages(CNode* pfrom);
127 bool SendMessages(CNode* pto, bool fSendTrickle);
128 bool LoadExternalBlockFile(FILE* fileIn);
130 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
131 unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, bool fProofOfStake);
132 int64 GetProofOfWorkReward(unsigned int nBits);
133 int64 GetProofOfStakeReward(int64 nCoinAge, unsigned int nBits, unsigned int nTime, bool bCoinYearOnly=false);
134 unsigned int ComputeMinWork(unsigned int nBase, int64 nTime);
135 unsigned int ComputeMinStake(unsigned int nBase, int64 nTime, unsigned int nBlockTime);
136 int GetNumBlocksOfPeers();
137 bool IsInitialBlockDownload();
138 std::string GetWarnings(std::string strFor);
139 bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock, bool fAllowSlow);
140 bool SetBestChain(CBlockIndex* pindexNew);
141 bool ConnectBestBlock();
142 CBlockIndex * InsertBlockIndex(uint256 hash);
143 uint256 WantedByOrphan(const CBlock* pblockOrphan);
144 const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake);
145 void StakeMiner(CWallet *pwallet);
146 void ResendWalletTransactions();
148 bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
157 READWRITE(VARINT(nFile));
158 READWRITE(VARINT(nPos));
161 friend bool operator==(const CDiskBlockPos &a, const CDiskBlockPos &b) {
162 return (a.nFile == b.nFile && a.nPos == b.nPos);
165 friend bool operator!=(const CDiskBlockPos &a, const CDiskBlockPos &b) {
169 void SetNull() { nFile = -1; nPos = 0; }
170 bool IsNull() const { return (nFile == -1); }
174 /** An inpoint - a combination of a transaction and an index n into its vin */
181 CInPoint() { SetNull(); }
182 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
183 void SetNull() { ptx = NULL; n = (unsigned int) -1; }
184 bool IsNull() const { return (ptx == NULL && n == (unsigned int) -1); }
189 /** An outpoint - a combination of a transaction hash and an index n into its vout */
196 COutPoint() { SetNull(); }
197 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
198 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
199 void SetNull() { hash = 0; n = (unsigned int) -1; }
200 bool IsNull() const { return (hash == 0 && n == (unsigned int) -1); }
202 friend bool operator<(const COutPoint& a, const COutPoint& b)
204 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
207 friend bool operator==(const COutPoint& a, const COutPoint& b)
209 return (a.hash == b.hash && a.n == b.n);
212 friend bool operator!=(const COutPoint& a, const COutPoint& b)
217 std::string ToString() const
219 return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10).c_str(), n);
224 printf("%s\n", ToString().c_str());
231 /** An input of a transaction. It contains the location of the previous
232 * transaction's output that it claims and a signature that matches the
233 * output's public key.
240 unsigned int nSequence;
244 nSequence = std::numeric_limits<unsigned int>::max();
247 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
250 scriptSig = scriptSigIn;
251 nSequence = nSequenceIn;
254 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
256 prevout = COutPoint(hashPrevTx, nOut);
257 scriptSig = scriptSigIn;
258 nSequence = nSequenceIn;
264 READWRITE(scriptSig);
265 READWRITE(nSequence);
270 return (nSequence == std::numeric_limits<unsigned int>::max());
273 friend bool operator==(const CTxIn& a, const CTxIn& b)
275 return (a.prevout == b.prevout &&
276 a.scriptSig == b.scriptSig &&
277 a.nSequence == b.nSequence);
280 friend bool operator!=(const CTxIn& a, const CTxIn& b)
285 std::string ToStringShort() const
287 return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n);
290 std::string ToString() const
294 str += prevout.ToString();
295 if (prevout.IsNull())
296 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
298 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
299 if (nSequence != std::numeric_limits<unsigned int>::max())
300 str += strprintf(", nSequence=%u", nSequence);
307 printf("%s\n", ToString().c_str());
314 /** An output of a transaction. It contains the public key that the next input
315 * must be able to sign with to claim it.
321 CScript scriptPubKey;
328 CTxOut(int64 nValueIn, CScript scriptPubKeyIn)
331 scriptPubKey = scriptPubKeyIn;
337 READWRITE(scriptPubKey);
343 scriptPubKey.clear();
348 return (nValue == -1);
354 scriptPubKey.clear();
359 return (nValue == 0 && scriptPubKey.empty());
362 uint256 GetHash() const
364 return SerializeHash(*this);
367 friend bool operator==(const CTxOut& a, const CTxOut& b)
369 return (a.nValue == b.nValue &&
370 a.scriptPubKey == b.scriptPubKey);
373 friend bool operator!=(const CTxOut& a, const CTxOut& b)
378 std::string ToStringShort() const
380 return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString().substr(0, 10).c_str());
383 std::string ToString() const
385 if (IsEmpty()) return "CTxOut(empty)";
386 if (scriptPubKey.size() < 6)
387 return "CTxOut(error)";
388 return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().c_str());
393 printf("%s\n", ToString().c_str());
407 // Modes for script/signature checking
410 CS_NEVER, // never validate scripts
411 CS_AFTER_CHECKPOINT, // validate scripts after the last checkpoint
412 CS_ALWAYS // always validate scripts
415 /** The basic transaction that is broadcasted on the network and contained in
416 * blocks. A transaction can contain multiple inputs and outputs.
421 static const int CURRENT_VERSION=1;
424 std::vector<CTxIn> vin;
425 std::vector<CTxOut> vout;
426 unsigned int nLockTime;
428 // Denial-of-service detection:
430 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
439 READWRITE(this->nVersion);
440 nVersion = this->nVersion;
444 READWRITE(nLockTime);
449 nVersion = CTransaction::CURRENT_VERSION;
450 nTime = GetAdjustedTime();
454 nDoS = 0; // Denial-of-service prevention
459 return (vin.empty() && vout.empty());
462 uint256 GetHash() const
464 return SerializeHash(*this);
467 bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const
469 // Time based nLockTime implemented in 0.1.6
472 if (nBlockHeight == 0)
473 nBlockHeight = nBestHeight;
475 nBlockTime = GetAdjustedTime();
476 if ((int64)nLockTime < ((int64)nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime))
478 BOOST_FOREACH(const CTxIn& txin, vin)
484 bool IsNewerThan(const CTransaction& old) const
486 if (vin.size() != old.vin.size())
488 for (unsigned int i = 0; i < vin.size(); i++)
489 if (vin[i].prevout != old.vin[i].prevout)
493 unsigned int nLowest = std::numeric_limits<unsigned int>::max();
494 for (unsigned int i = 0; i < vin.size(); i++)
496 if (vin[i].nSequence != old.vin[i].nSequence)
498 if (vin[i].nSequence <= nLowest)
501 nLowest = vin[i].nSequence;
503 if (old.vin[i].nSequence < nLowest)
506 nLowest = old.vin[i].nSequence;
513 bool IsCoinBase() const
515 return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() >= 1);
518 bool IsCoinStake() const
520 // ppcoin: the coin stake transaction is marked with the first output empty
521 return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty());
524 /** Check for standard transaction types
525 @return True if all outputs (scriptPubKeys) use only standard transaction forms
527 bool IsStandard() const;
529 /** Check for standard transaction types
530 @param[in] mapInputs Map of previous transactions that have outputs we're spending
531 @return True if all inputs (scriptSigs) use only standard transaction forms
532 @see CTransaction::FetchInputs
534 bool AreInputsStandard(CCoinsViewCache& mapInputs) const;
536 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
537 @return number of sigops this transaction's outputs will produce when spent
538 @see CTransaction::FetchInputs
540 unsigned int GetLegacySigOpCount() const;
542 /** Count ECDSA signature operations in pay-to-script-hash inputs.
544 @param[in] mapInputs Map of previous transactions that have outputs we're spending
545 @return maximum number of sigops required to validate this transaction's inputs
546 @see CTransaction::FetchInputs
548 unsigned int GetP2SHSigOpCount(CCoinsViewCache& mapInputs) const;
550 /** Amount of bitcoins spent by this transaction.
551 @return sum of all outputs (note: does not include fees)
553 int64 GetValueOut() const
556 BOOST_FOREACH(const CTxOut& txout, vout)
558 nValueOut += txout.nValue;
559 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
560 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
565 /** Amount of bitcoins coming in to this transaction
566 Note that lightweight clients may not know anything besides the hash of previous transactions,
567 so may not be able to calculate this.
569 @param[in] mapInputs Map of previous transactions that have outputs we're spending
570 @return Sum of value of all inputs (scriptSigs)
571 @see CTransaction::FetchInputs
573 int64 GetValueIn(CCoinsViewCache& mapInputs) const;
575 static bool AllowFree(double dPriority)
577 // Large (in bytes) low-priority (new, small-coin) transactions
579 return dPriority > COIN * 144 / 250;
582 int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=false, enum GetMinFee_mode mode=GMF_BLOCK, unsigned int nBytes = 0) const;
584 friend bool operator==(const CTransaction& a, const CTransaction& b)
586 return (a.nVersion == b.nVersion &&
587 a.nTime == b.nTime &&
590 a.nLockTime == b.nLockTime);
593 friend bool operator!=(const CTransaction& a, const CTransaction& b)
598 std::string ToStringShort() const
601 str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user"));
605 std::string ToString() const
608 str += IsCoinBase()? "Coinbase" : (IsCoinStake()? "Coinstake" : "CTransaction");
609 str += strprintf("(hash=%s, nTime=%d, ver=%d, vin.size=%"PRIszu", vout.size=%"PRIszu", nLockTime=%d)\n",
610 GetHash().ToString().substr(0,10).c_str(),
616 for (unsigned int i = 0; i < vin.size(); i++)
617 str += " " + vin[i].ToString() + "\n";
618 for (unsigned int i = 0; i < vout.size(); i++)
619 str += " " + vout[i].ToString() + "\n";
625 printf("%s", ToString().c_str());
629 // Do all possible client-mode checks
630 bool ClientCheckInputs() const;
632 // Check whether all prevouts of this transaction are present in the UTXO set represented by view
633 bool HaveInputs(CCoinsViewCache &view) const;
635 // Check whether all inputs of this transaction are valid (no double spends, scripts & sigs, amounts)
636 // This does not modify the UTXO set
637 bool CheckInputs(CCoinsViewCache &view, enum CheckSig_mode csmode, bool fStrictPayToScriptHash=true, bool fStrictEncodings=true, CBlock *pblock=NULL) const;
639 // Apply the effects of this transaction on the UTXO set represented by view
640 bool UpdateCoins(CCoinsViewCache &view, CTxUndo &txundo, int nHeight, unsigned int nBlockTime, const uint256 &txhash) const;
642 // Context-independent validity checks
643 bool CheckTransaction() const;
645 // Try to accept this transaction into the memory pool
646 bool AcceptToMemoryPool(bool fCheckInputs=true, bool* pfMissingInputs=NULL);
647 bool GetCoinAge(uint64& nCoinAge) const; // Get transaction coin age
649 static const CTxOut &GetOutputFor(const CTxIn& input, CCoinsViewCache& mapInputs);
653 /** wrapper for CTxOut that provides a more compact serialization */
654 class CTxOutCompressor
660 static uint64 CompressAmount(uint64 nAmount);
661 static uint64 DecompressAmount(uint64 nAmount);
663 CTxOutCompressor(CTxOut &txoutIn) : txout(txoutIn) { }
665 IMPLEMENT_SERIALIZE(({
667 uint64 nVal = CompressAmount(txout.nValue);
668 READWRITE(VARINT(nVal));
671 READWRITE(VARINT(nVal));
672 txout.nValue = DecompressAmount(nVal);
674 CScriptCompressor cscript(REF(txout.scriptPubKey));
679 /** Undo information for a CTxIn
681 * Contains the prevout's CTxOut being spent, and if this was the
682 * last output of the affected transaction, its metadata as well
683 * (coinbase or not, height, transaction version)
688 CTxOut txout; // the txout data before being spent
689 bool fCoinBase; // if the outpoint was the last unspent: whether it belonged to a coinbase
690 bool fCoinStake; // if the outpoint was the last unspent: whether it belonged to a coinstake
691 unsigned int nHeight; // if the outpoint was the last unspent: its height
692 int nVersion; // if the outpoint was the last unspent: its version
693 unsigned int nTime; // if the outpoint was the last unspent: its timestamp
694 unsigned int nBlockTime; // if the outpoint was the last unspent: its block timestamp
696 CTxInUndo() : txout(), fCoinBase(false), fCoinStake(false), nHeight(0), nVersion(0), nTime(0), nBlockTime(0) {}
697 CTxInUndo(const CTxOut &txoutIn, bool fCoinBaseIn = false, bool fCoinStakeIn = false, unsigned int nHeightIn = 0, int nVersionIn = 0, int nTimeIn = 0, int nBlockTimeIn = 0) : txout(txoutIn), fCoinBase(fCoinBaseIn), fCoinStake(fCoinStakeIn), nHeight(nHeightIn), nVersion(nVersionIn), nTime(nTimeIn), nBlockTime(nBlockTimeIn) { }
699 unsigned int GetSerializeSize(int nType, int nVersion) const {
700 return ::GetSerializeSize(VARINT(nHeight*2+(fCoinBase ? 1 : 0)), nType, nVersion) +
701 ::GetSerializeSize(VARINT(nTime*2+(fCoinStake ? 1 : 0)), nType, nVersion) +
702 ::GetSerializeSize(VARINT(nBlockTime), nType, nVersion) +
703 (nHeight > 0 ? ::GetSerializeSize(VARINT(this->nVersion), nType, nVersion) : 0) +
704 ::GetSerializeSize(CTxOutCompressor(REF(txout)), nType, nVersion);
707 template<typename Stream>
708 void Serialize(Stream &s, int nType, int nVersion) const {
709 ::Serialize(s, VARINT(nHeight*2+(fCoinBase ? 1 : 0)), nType, nVersion);
710 ::Serialize(s, VARINT(nTime*2+(fCoinStake ? 1 : 0)), nType, nVersion);
711 ::Serialize(s, VARINT(nBlockTime), nType, nVersion);
713 ::Serialize(s, VARINT(this->nVersion), nType, nVersion);
714 ::Serialize(s, CTxOutCompressor(REF(txout)), nType, nVersion);
717 template<typename Stream>
718 void Unserialize(Stream &s, int nType, int nVersion) {
719 unsigned int nCodeHeight = 0, nCodeTime = 0;
720 ::Unserialize(s, VARINT(nCodeHeight), nType, nVersion);
721 nHeight = nCodeHeight / 2;
722 fCoinBase = nCodeHeight & 1;
723 ::Unserialize(s, VARINT(nCodeTime), nType, nVersion);
724 nTime = nCodeTime / 2;
725 fCoinStake = nCodeTime & 1;
726 ::Unserialize(s, VARINT(nBlockTime), nType, nVersion);
728 ::Unserialize(s, VARINT(this->nVersion), nType, nVersion);
729 ::Unserialize(s, REF(CTxOutCompressor(REF(txout))), nType, nVersion);
733 /** Undo information for a CTransaction */
737 // undo information for all txins
738 std::vector<CTxInUndo> vprevout;
745 /** Undo information for a CBlock */
749 std::vector<CTxUndo> vtxundo; // for all but the coinbase
755 bool WriteToDisk(CDiskBlockPos &pos)
757 // Open history file to append
758 CAutoFile fileout = CAutoFile(OpenUndoFile(pos), SER_DISK, CLIENT_VERSION);
760 return error("CBlockUndo::WriteToDisk() : OpenUndoFile failed");
762 // Write index header
763 unsigned int nSize = fileout.GetSerializeSize(*this);
764 fileout << FLATDATA(pchMessageStart) << nSize;
767 long fileOutPos = ftell(fileout);
769 return error("CBlockUndo::WriteToDisk() : ftell failed");
770 pos.nPos = (unsigned int)fileOutPos;
773 // Flush stdio buffers and commit to disk before returning
775 if (!IsInitialBlockDownload())
783 /** pruned version of CTransaction: only retains metadata and unspent transaction outputs
788 * - unspentness bitvector, for vout[2] and further; least significant byte first
789 * - the non-spent CTxOuts (via CTxOutCompressor)
791 * - VARINT(nTime + is_coinstake)
792 * - VARINT(nBlockTime)
794 * The nCode value consists of:
795 * - bit 1: IsCoinBase()
796 * - bit 2: vout[0] is not spent
797 * - bit 4: vout[1] is not spent
798 * - The higher bits encode N, the number of non-zero bytes in the following bitvector.
799 * - In case both bit 2 and bit 4 are unset, they encode N-1, as there must be at
800 * least one non-spent output).
802 * Example: 0104835800816115944e077fe7c803cfa57f29b36bf87c1d358bb85e40f1d75240f1d752
803 * <><><--------------------------------------------><----><------><------>
805 * version code vout[1] height timestamp block timestamp
808 * - code = 4 (vout[1] is not spent, and 0 non-zero bytes of bitvector follow)
809 * - unspentness bitvector: as 0 non-zero bytes follow, it has length 0
810 * - vout[1]: 835800816115944e077fe7c803cfa57f29b36bf87c1d35
811 * * 8358: compact amount representation for 60000000000 (600 BTC)
812 * * 00: special txout type pay-to-pubkey-hash
813 * * 816115944e077fe7c803cfa57f29b36bf87c1d35: address uint160
815 * - time = 1389883712
817 * - block time = 1389883712
820 * Example: 0109044086ef97d5790061b01caab50f1b8e9c50a5057eb43c2d9563a4eebbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa486af3b40f1d75240f1d752
821 * <><><--><--------------------------------------------------><----------------------------------------------><----><------><------>
823 * version code unspentness vout[4] vout[16] height timestamp block timestamp
826 * - code = 9 (coinbase, neither vout[0] or vout[1] are unspent,
827 * 2 (1, +1 because both bit 2 and bit 4 are unset) non-zero bitvector bytes follow)
828 * - unspentness bitvector: bits 2 (0x04) and 14 (0x4000) are set, so vout[2+2] and vout[14+2] are unspent
829 * - vout[4]: 86ef97d5790061b01caab50f1b8e9c50a5057eb43c2d9563a4ee
830 * * 86ef97d579: compact amount representation for 234925952 (2.35 BTC)
831 * * 00: special txout type pay-to-pubkey-hash
832 * * 61b01caab50f1b8e9c50a5057eb43c2d9563a4ee: address uint160
833 * - vout[16]: bbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa4
834 * * bbd123: compact amount representation for 110397 (0.001 BTC)
835 * * 00: special txout type pay-to-pubkey-hash
836 * * 8c988f1a4a4de2161e0f50aac7f17e7f9555caa4: address uint160
838 * - time = 1389883712
840 * - block time = 1389883712
845 // whether transaction is a coinbase
848 // whether transaction is a coinstake
851 // unspent transaction outputs; spent outputs are .IsNull(); spent outputs at the end of the array are dropped
852 std::vector<CTxOut> vout;
854 // at which height this transaction was included in the active blockchain
857 // version of the CTransaction; accesses to this value should probably check for nHeight as well,
858 // as new tx version will probably only be introduced at certain heights
861 // transaction timestamp + coinstake flag
865 unsigned int nBlockTime;
867 // construct a CCoins from a CTransaction, at a given height/timestamp
868 CCoins(const CTransaction &tx, int nHeightIn, int nBlockTimeIn) : fCoinBase(tx.IsCoinBase()), fCoinStake(tx.IsCoinStake()), vout(tx.vout), nHeight(nHeightIn), nVersion(tx.nVersion), nTime(tx.nTime), nBlockTime(nBlockTimeIn) { }
871 CCoins() : fCoinBase(false), fCoinStake(false), vout(0), nHeight(0), nVersion(0), nTime(0), nBlockTime(0) { }
873 // remove spent outputs at the end of vout
875 while (vout.size() > 0 && vout.back().IsNull())
880 friend bool operator==(const CCoins &a, const CCoins &b) {
881 return a.fCoinBase == b.fCoinBase &&
882 a.fCoinStake == b.fCoinStake &&
883 a.nHeight == b.nHeight &&
884 a.nVersion == b.nVersion &&
885 a.nTime == b.nTime &&
886 a.nBlockTime == b.nBlockTime &&
889 friend bool operator!=(const CCoins &a, const CCoins &b) {
893 // calculate number of bytes for the bitmask, and its number of non-zero bytes
894 // each bit in the bitmask represents the availability of one output, but the
895 // availabilities of the first two outputs are encoded separately
896 void CalcMaskSize(unsigned int &nBytes, unsigned int &nNonzeroBytes) const {
897 unsigned int nLastUsedByte = 0;
898 for (unsigned int b = 0; 2+b*8 < vout.size(); b++) {
900 for (unsigned int i = 0; i < 8 && 2+b*8+i < vout.size(); i++) {
901 if (!vout[2+b*8+i].IsNull()) {
907 nLastUsedByte = b + 1;
911 nBytes += nLastUsedByte;
914 bool IsCoinBase() const {
918 bool IsCoinStake() const {
922 unsigned int GetSerializeSize(int nType, int nVersion) const {
923 unsigned int nSize = 0;
924 unsigned int nMaskSize = 0, nMaskCode = 0;
925 CalcMaskSize(nMaskSize, nMaskCode);
926 bool fFirst = vout.size() > 0 && !vout[0].IsNull();
927 bool fSecond = vout.size() > 1 && !vout[1].IsNull();
928 assert(fFirst || fSecond || nMaskCode);
929 unsigned int nCode = 8*(nMaskCode - (fFirst || fSecond ? 0 : 1)) + (fCoinBase ? 1 : 0) + (fFirst ? 2 : 0) + (fCoinStake ? 1 : 0) + (fSecond ? 4 : 0);
931 nSize += ::GetSerializeSize(VARINT(this->nVersion), nType, nVersion);
932 // size of header code
933 nSize += ::GetSerializeSize(VARINT(nCode), nType, nVersion);
937 for (unsigned int i = 0; i < vout.size(); i++)
938 if (!vout[i].IsNull())
939 nSize += ::GetSerializeSize(CTxOutCompressor(REF(vout[i])), nType, nVersion);
941 nSize += ::GetSerializeSize(VARINT(nHeight), nType, nVersion);
942 // timestamp and coinstake flag
943 nSize += ::GetSerializeSize(VARINT(nTime*2+(fCoinStake ? 1 : 0)), nType, nVersion);
945 nSize += ::GetSerializeSize(VARINT(nBlockTime), nType, nVersion);
949 template<typename Stream>
950 void Serialize(Stream &s, int nType, int nVersion) const {
951 unsigned int nMaskSize = 0, nMaskCode = 0;
952 CalcMaskSize(nMaskSize, nMaskCode);
953 bool fFirst = vout.size() > 0 && !vout[0].IsNull();
954 bool fSecond = vout.size() > 1 && !vout[1].IsNull();
955 assert(fFirst || fSecond || nMaskCode);
956 unsigned int nCode = 8*(nMaskCode - (fFirst || fSecond ? 0 : 1)) + (fCoinBase ? 1 : 0) + (fFirst ? 2 : 0) + (fSecond ? 4 : 0);
958 ::Serialize(s, VARINT(this->nVersion), nType, nVersion);
960 ::Serialize(s, VARINT(nCode), nType, nVersion);
962 for (unsigned int b = 0; b<nMaskSize; b++) {
963 unsigned char chAvail = 0;
964 for (unsigned int i = 0; i < 8 && 2+b*8+i < vout.size(); i++)
965 if (!vout[2+b*8+i].IsNull())
967 ::Serialize(s, chAvail, nType, nVersion);
970 for (unsigned int i = 0; i < vout.size(); i++) {
971 if (!vout[i].IsNull())
972 ::Serialize(s, CTxOutCompressor(REF(vout[i])), nType, nVersion);
975 ::Serialize(s, VARINT(nHeight), nType, nVersion);
976 // transaction timestamp and coinstake flag
977 ::Serialize(s, VARINT(nTime*2+(fCoinStake ? 1 : 0)), nType, nVersion);
979 ::Serialize(s, VARINT(nBlockTime), nType, nVersion);
982 template<typename Stream>
983 void Unserialize(Stream &s, int nType, int nVersion) {
984 unsigned int nCode = 0, nCodeTime = 0;
986 ::Unserialize(s, VARINT(this->nVersion), nType, nVersion);
988 ::Unserialize(s, VARINT(nCode), nType, nVersion);
989 fCoinBase = nCode & 1;
990 std::vector<bool> vAvail(2, false);
991 vAvail[0] = nCode & 2;
992 vAvail[1] = nCode & 4;
993 unsigned int nMaskCode = (nCode / 8) + ((nCode & 6) != 0 ? 0 : 1);
995 while (nMaskCode > 0) {
996 unsigned char chAvail = 0;
997 ::Unserialize(s, chAvail, nType, nVersion);
998 for (unsigned int p = 0; p < 8; p++) {
999 bool f = (chAvail & (1 << p)) != 0;
1000 vAvail.push_back(f);
1006 vout.assign(vAvail.size(), CTxOut());
1007 for (unsigned int i = 0; i < vAvail.size(); i++) {
1009 ::Unserialize(s, REF(CTxOutCompressor(vout[i])), nType, nVersion);
1012 ::Unserialize(s, VARINT(nHeight), nType, nVersion);
1013 // transaction timestamp
1014 ::Unserialize(s, VARINT(nCodeTime), nType, nVersion);
1015 nTime = nCodeTime / 2;
1016 fCoinStake = nCodeTime & 1;
1018 ::Unserialize(s, VARINT(nBlockTime), nType, nVersion);
1022 // mark an outpoint spent, and construct undo information
1023 bool Spend(const COutPoint &out, CTxInUndo &undo) {
1024 if (out.n >= vout.size())
1026 if (vout[out.n].IsNull())
1028 undo = CTxInUndo(vout[out.n]);
1029 vout[out.n].SetNull();
1031 if (vout.size() == 0) {
1032 undo.nHeight = nHeight;
1034 undo.nBlockTime = nBlockTime;
1035 undo.fCoinBase = fCoinBase;
1036 undo.fCoinStake = fCoinStake;
1037 undo.nVersion = this->nVersion;
1042 // mark a vout spent
1043 bool Spend(int nPos) {
1045 COutPoint out(0, nPos);
1046 return Spend(out, undo);
1049 // check whether a particular output is still available
1050 bool IsAvailable(unsigned int nPos) const {
1051 return (nPos < vout.size() && !vout[nPos].IsNull());
1054 // check whether the entire CCoins is spent
1055 // note that only !IsPruned() CCoins can be serialized
1056 bool IsPruned() const {
1057 BOOST_FOREACH(const CTxOut &out, vout)
1067 /** A transaction with a merkle branch linking it to the block chain. */
1068 class CMerkleTx : public CTransaction
1072 std::vector<uint256> vMerkleBranch;
1076 mutable bool fMerkleVerified;
1084 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
1093 fMerkleVerified = false;
1099 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
1100 nVersion = this->nVersion;
1101 READWRITE(hashBlock);
1102 READWRITE(vMerkleBranch);
1107 int SetMerkleBranch(const CBlock* pblock=NULL);
1108 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
1109 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
1110 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
1111 int GetBlocksToMaturity() const;
1112 bool AcceptToMemoryPool(bool fCheckInputs=true);
1117 /** Nodes collect new transactions into a block, hash them into a hash tree,
1118 * and scan through nonce values to make the block's hash satisfy proof-of-work
1119 * requirements. When they solve the proof-of-work, they broadcast the block
1120 * to everyone and the block is added to the block chain. The first transaction
1121 * in the block is a special one that creates a new coin owned by the creator
1128 static const int CURRENT_VERSION=6;
1130 uint256 hashPrevBlock;
1131 uint256 hashMerkleRoot;
1134 unsigned int nNonce;
1137 std::vector<CTransaction> vtx;
1139 // ppcoin: block signature - signed by one of the coin base txout[N]'s owner
1140 std::vector<unsigned char> vchBlockSig;
1143 mutable std::vector<uint256> vMerkleTree;
1145 // Denial-of-service detection:
1147 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
1156 READWRITE(this->nVersion);
1157 nVersion = this->nVersion;
1158 READWRITE(hashPrevBlock);
1159 READWRITE(hashMerkleRoot);
1164 // ConnectBlock depends on vtx following header to generate CDiskTxPos
1165 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
1168 READWRITE(vchBlockSig);
1172 const_cast<CBlock*>(this)->vtx.clear();
1173 const_cast<CBlock*>(this)->vchBlockSig.clear();
1179 nVersion = CBlock::CURRENT_VERSION;
1186 vchBlockSig.clear();
1187 vMerkleTree.clear();
1193 return (nBits == 0);
1196 uint256 GetHash() const
1198 return scrypt_blockhash(CVOIDBEGIN(nVersion));
1201 int64 GetBlockTime() const
1203 return (int64)nTime;
1206 void UpdateTime(const CBlockIndex* pindexPrev);
1208 // ppcoin: entropy bit for stake modifier if chosen by modifier
1209 unsigned int GetStakeEntropyBit(unsigned int nTime) const
1211 // Protocol switch to support p2pool at novacoin block #9689
1212 if (nTime >= ENTROPY_SWITCH_TIME || fTestNet)
1214 // Take last bit of block hash as entropy bit
1215 unsigned int nEntropyBit = ((GetHash().Get64()) & 1llu);
1216 if (fDebug && GetBoolArg("-printstakemodifier"))
1217 printf("GetStakeEntropyBit: nTime=%u hashBlock=%s nEntropyBit=%u\n", nTime, GetHash().ToString().c_str(), nEntropyBit);
1220 // Before novacoin block #9689 - old protocol
1221 uint160 hashSig = Hash160(vchBlockSig);
1222 if (fDebug && GetBoolArg("-printstakemodifier"))
1223 printf("GetStakeEntropyBit: hashSig=%s", hashSig.ToString().c_str());
1224 hashSig >>= 159; // take the first bit of the hash
1225 if (fDebug && GetBoolArg("-printstakemodifier"))
1226 printf(" entropybit=%"PRI64d"\n", hashSig.Get64());
1227 return hashSig.Get64();
1230 // ppcoin: two types of block: proof-of-work or proof-of-stake
1231 bool IsProofOfStake() const
1233 return (vtx.size() > 1 && vtx[1].IsCoinStake());
1236 bool IsProofOfWork() const
1238 return !IsProofOfStake();
1241 std::pair<COutPoint, unsigned int> GetProofOfStake() const
1243 return IsProofOfStake()? std::make_pair(vtx[1].vin[0].prevout, vtx[1].nTime) : std::make_pair(COutPoint(), (unsigned int)0);
1246 // ppcoin: get max transaction timestamp
1247 int64 GetMaxTransactionTime() const
1249 int64 maxTransactionTime = 0;
1250 BOOST_FOREACH(const CTransaction& tx, vtx)
1251 maxTransactionTime = std::max(maxTransactionTime, (int64)tx.nTime);
1252 return maxTransactionTime;
1255 uint256 BuildMerkleTree() const
1257 vMerkleTree.clear();
1258 BOOST_FOREACH(const CTransaction& tx, vtx)
1259 vMerkleTree.push_back(tx.GetHash());
1261 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
1263 for (int i = 0; i < nSize; i += 2)
1265 int i2 = std::min(i+1, nSize-1);
1266 vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
1267 BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
1271 return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
1274 const uint256 &GetTxHash(unsigned int nIndex) const {
1275 assert(vMerkleTree.size() > 0); // BuildMerkleTree must have been called first
1276 assert(nIndex < vtx.size());
1277 return vMerkleTree[nIndex];
1280 std::vector<uint256> GetMerkleBranch(int nIndex) const
1282 if (vMerkleTree.empty())
1284 std::vector<uint256> vMerkleBranch;
1286 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
1288 int i = std::min(nIndex^1, nSize-1);
1289 vMerkleBranch.push_back(vMerkleTree[j+i]);
1293 return vMerkleBranch;
1296 static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
1300 BOOST_FOREACH(const uint256& otherside, vMerkleBranch)
1303 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
1305 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
1311 bool WriteToDisk(CDiskBlockPos &pos)
1313 // Open history file to append
1314 CAutoFile fileout = CAutoFile(OpenBlockFile(pos), SER_DISK, CLIENT_VERSION);
1316 return error("CBlock::WriteToDisk() : OpenBlockFile failed");
1318 // Write index header
1319 unsigned int nSize = fileout.GetSerializeSize(*this);
1320 fileout << FLATDATA(pchMessageStart) << nSize;
1323 long fileOutPos = ftell(fileout);
1325 return error("CBlock::WriteToDisk() : ftell failed");
1326 pos.nPos = (unsigned int)fileOutPos;
1329 // Flush stdio buffers and commit to disk before returning
1331 if (!IsInitialBlockDownload())
1332 FileCommit(fileout);
1337 bool ReadFromDisk(const CDiskBlockPos &pos, bool fReadTransactions = true)
1341 // Open history file to read
1342 CAutoFile filein = CAutoFile(OpenBlockFile(pos, true), SER_DISK, CLIENT_VERSION);
1344 return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
1345 if (!fReadTransactions)
1346 filein.nType |= SER_BLOCKHEADERONLY;
1352 catch (std::exception &e) {
1353 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
1357 if (fReadTransactions && IsProofOfWork() && !CheckProofOfWork(GetHash(), nBits))
1358 return error("CBlock::ReadFromDisk() : errors in block header");
1365 printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%"PRIszu", vchBlockSig=%s)\n",
1366 GetHash().ToString().c_str(),
1368 hashPrevBlock.ToString().c_str(),
1369 hashMerkleRoot.ToString().c_str(),
1370 nTime, nBits, nNonce,
1372 HexStr(vchBlockSig.begin(), vchBlockSig.end()).c_str());
1373 for (unsigned int i = 0; i < vtx.size(); i++)
1378 printf(" vMerkleTree: ");
1379 for (unsigned int i = 0; i < vMerkleTree.size(); i++)
1380 printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
1384 // Undo the effects of this block (with given index) on the UTXO set represented by coins
1385 bool DisconnectBlock(CBlockIndex *pindex, CCoinsViewCache &coins);
1387 // Apply the effects of this block (with given index) on the UTXO set represented by coins
1388 bool ConnectBlock(CBlockIndex *pindex, CCoinsViewCache &coins, bool fJustCheck=false);
1390 // Read a block from disk
1391 bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
1393 // Add this block to the block index, and if necessary, switch the active block chain to this
1394 bool AddToBlockIndex(const CDiskBlockPos &pos);
1396 // Context-independent validity checks
1397 bool CheckBlock(bool fCheckPOW=true, bool fCheckMerkleRoot=true, bool fCheckSig=false) const;
1399 // Store block on disk
1402 // Get total coinage consumed
1403 bool GetCoinAge(uint64& nCoinAge) const;
1405 // Generate proof-of-stake block signature
1406 bool SignBlock(CWallet& keystore);
1408 // Get generator key
1409 bool GetGenerator(CKey& GeneratorKey) const;
1411 // Validate proof-of-stake block signature
1412 bool CheckSignature(bool& fFatal, uint256& hashProofOfStake) const;
1414 // Legacy proof-of-work signature
1415 bool CheckLegacySignature() const;
1419 class CBlockFileInfo
1422 unsigned int nBlocks; // number of blocks stored in file
1423 unsigned int nSize; // number of used bytes of block file
1424 unsigned int nUndoSize; // number of used bytes in the undo file
1425 unsigned int nHeightFirst; // lowest height of block in file
1426 unsigned int nHeightLast; // highest height of block in file
1427 uint64 nTimeFirst; // earliest time of block in file
1428 uint64 nTimeLast; // latest time of block in file
1430 IMPLEMENT_SERIALIZE(
1431 READWRITE(VARINT(nBlocks));
1432 READWRITE(VARINT(nSize));
1433 READWRITE(VARINT(nUndoSize));
1434 READWRITE(VARINT(nHeightFirst));
1435 READWRITE(VARINT(nHeightLast));
1436 READWRITE(VARINT(nTimeFirst));
1437 READWRITE(VARINT(nTimeLast));
1454 std::string ToString() const {
1455 return strprintf("CBlockFileInfo(blocks=%u, size=%u, heights=%u..%u, time=%s..%s)", nBlocks, nSize, nHeightFirst, nHeightLast, DateTimeStrFormat("%Y-%m-%d", nTimeFirst).c_str(), DateTimeStrFormat("%Y-%m-%d", nTimeLast).c_str());
1458 // update statistics (does not update nSize)
1459 void AddBlock(unsigned int nHeightIn, uint64 nTimeIn) {
1460 if (nBlocks==0 || nHeightFirst > nHeightIn)
1461 nHeightFirst = nHeightIn;
1462 if (nBlocks==0 || nTimeFirst > nTimeIn)
1463 nTimeFirst = nTimeIn;
1465 if (nHeightIn > nHeightFirst)
1466 nHeightLast = nHeightIn;
1467 if (nTimeIn > nTimeLast)
1468 nTimeLast = nTimeIn;
1473 extern CCriticalSection cs_LastBlockFile;
1474 extern CBlockFileInfo infoLastBlockFile;
1475 extern int nLastBlockFile;
1478 BLOCK_VALID_UNKNOWN = 0,
1479 BLOCK_VALID_HEADER = 1, // parsed, version ok, hash satisfies claimed PoW, 1 <= vtx count <= max, timestamp not in future
1480 BLOCK_VALID_TREE = 2, // parent found, difficulty matches, timestamp >= median previous, checkpoint
1481 BLOCK_VALID_TRANSACTIONS = 3, // only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid, no duplicate txids, sigops, size, merkle root
1482 BLOCK_VALID_CHAIN = 4, // outputs do not overspend inputs, no double spends, coinbase output ok, immature coinbase spends, BIP30
1483 BLOCK_VALID_SCRIPTS = 5, // scripts/signatures ok
1484 BLOCK_VALID_MASK = 7,
1486 BLOCK_HAVE_DATA = 8, // full block available in blk*.dat
1487 BLOCK_HAVE_UNDO = 16, // undo data available in rev*.dat
1488 BLOCK_HAVE_MASK = 24,
1490 BLOCK_FAILED_VALID = 32, // stage after last reached validness failed
1491 BLOCK_FAILED_CHILD = 64, // descends from failed block
1492 BLOCK_FAILED_MASK = 96
1495 /** The block chain is a tree shaped structure starting with the
1496 * genesis block at the root, with each block potentially having multiple
1497 * candidates to be the next block. pprev and pnext link a path through the
1498 * main/longest chain. A blockindex may have multiple pprev pointing back
1499 * to it, but pnext will only point forward to the longest branch, or will
1500 * be null if the block is not part of the longest chain.
1505 // pointer to the hash of the block, if any. memory is owned by this CBlockIndex
1506 const uint256* phashBlock;
1508 // pointer to the index of the predecessor of this block
1511 // (memory only) pointer to the index of the *active* successor of this block
1514 // height of the entry in the chain. The genesis block has height 0
1517 // Which # file this block is stored in (blk?????.dat)
1520 // Byte offset within blk?????.dat where this block's data is stored
1521 unsigned int nDataPos;
1523 // Byte offset within rev?????.dat where this block's undo data is stored
1524 unsigned int nUndoPos;
1526 // (memory only) Trust score of block chain up to and including this block
1527 uint256 nChainTrust;
1529 // Number of transactions in this block.
1532 // (memory only) Number of transactions in the chain up to and including this block
1533 unsigned int nChainTx;
1535 // Verification status of this block. See enum BlockStatus for detailed info
1536 unsigned int nStatus;
1538 // Coins amount created by this block
1541 // Total coins created in this block chain up to and including this block
1545 unsigned int nFlags;
1548 // is proof-of-stake block
1549 BLOCK_PROOF_OF_STAKE = (1 << 0),
1550 // entropy bit for stake modifier
1551 BLOCK_STAKE_ENTROPY = (1 << 1),
1552 // regenerated stake modifier
1553 BLOCK_STAKE_MODIFIER = (1 << 2),
1556 // Hash modifier for proof-of-stake kernel
1557 uint64 nStakeModifier;
1559 // Checksum of index in-memory only
1560 unsigned int nStakeModifierChecksum;
1562 // Predecessor of coinstake transaction
1563 COutPoint prevoutStake;
1565 // Timestamp of coinstake transaction
1566 unsigned int nStakeTime;
1569 uint256 hashProofOfStake;
1573 uint256 hashMerkleRoot;
1576 unsigned int nNonce;
1595 nStakeModifierChecksum = 0;
1596 hashProofOfStake = 0;
1597 prevoutStake.SetNull();
1607 CBlockIndex(CBlock& block)
1624 nStakeModifierChecksum = 0;
1625 hashProofOfStake = 0;
1626 if (block.IsProofOfStake())
1629 prevoutStake = block.vtx[1].vin[0].prevout;
1630 nStakeTime = block.vtx[1].nTime;
1634 prevoutStake.SetNull();
1638 nVersion = block.nVersion;
1639 hashMerkleRoot = block.hashMerkleRoot;
1640 nTime = block.nTime;
1641 nBits = block.nBits;
1642 nNonce = block.nNonce;
1645 CDiskBlockPos GetBlockPos() const {
1647 if (nStatus & BLOCK_HAVE_DATA) {
1649 ret.nPos = nDataPos;
1655 CDiskBlockPos GetUndoPos() const {
1657 if (nStatus & BLOCK_HAVE_UNDO) {
1659 ret.nPos = nUndoPos;
1665 CBlock GetBlockHeader() const
1668 block.nVersion = nVersion;
1670 block.hashPrevBlock = pprev->GetBlockHash();
1671 block.hashMerkleRoot = hashMerkleRoot;
1672 block.nTime = nTime;
1673 block.nBits = nBits;
1674 block.nNonce = nNonce;
1678 uint256 GetBlockHash() const
1683 int64 GetBlockTime() const
1685 return (int64)nTime;
1688 uint256 GetBlockTrust() const;
1690 bool IsInMainChain() const
1692 return (pnext || this == pindexBest);
1695 bool CheckIndex() const
1700 enum { nMedianTimeSpan=11 };
1702 int64 GetMedianTimePast() const
1704 int64 pmedian[nMedianTimeSpan];
1705 int64* pbegin = &pmedian[nMedianTimeSpan];
1706 int64* pend = &pmedian[nMedianTimeSpan];
1708 const CBlockIndex* pindex = this;
1709 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1710 *(--pbegin) = pindex->GetBlockTime();
1712 std::sort(pbegin, pend);
1713 return pbegin[(pend - pbegin)/2];
1716 int64 GetMedianTime() const
1718 const CBlockIndex* pindex = this;
1719 for (int i = 0; i < nMedianTimeSpan/2; i++)
1722 return GetBlockTime();
1723 pindex = pindex->pnext;
1725 return pindex->GetMedianTimePast();
1729 * Returns true if there are nRequired or more blocks of minVersion or above
1730 * in the last nToCheck blocks, starting at pstart and going backwards.
1732 static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart,
1733 unsigned int nRequired, unsigned int nToCheck);
1735 bool IsProofOfWork() const
1737 return !(nFlags & BLOCK_PROOF_OF_STAKE);
1740 bool IsProofOfStake() const
1742 return (nFlags & BLOCK_PROOF_OF_STAKE);
1745 void SetProofOfStake()
1747 nFlags |= BLOCK_PROOF_OF_STAKE;
1750 unsigned int GetStakeEntropyBit() const
1752 return ((nFlags & BLOCK_STAKE_ENTROPY) >> 1);
1755 bool SetStakeEntropyBit(unsigned int nEntropyBit)
1757 if (nEntropyBit > 1)
1759 nFlags |= (nEntropyBit? BLOCK_STAKE_ENTROPY : 0);
1763 bool GeneratedStakeModifier() const
1765 return (nFlags & BLOCK_STAKE_MODIFIER);
1768 void SetStakeModifier(uint64 nModifier, bool fGeneratedStakeModifier)
1770 nStakeModifier = nModifier;
1771 if (fGeneratedStakeModifier)
1772 nFlags |= BLOCK_STAKE_MODIFIER;
1775 std::string ToString() const
1777 return strprintf("CBlockIndex(nprev=%p, pnext=%p nHeight=%d, nMint=%s, nMoneySupply=%s, nFlags=(%s)(%d)(%s), nStakeModifier=%016"PRI64x", nStakeModifierChecksum=%08x, hashProofOfStake=%s, prevoutStake=(%s), nStakeTime=%d merkle=%s, hashBlock=%s)",
1778 pprev, pnext, nHeight,
1779 FormatMoney(nMint).c_str(), FormatMoney(nMoneySupply).c_str(),
1780 GeneratedStakeModifier() ? "MOD" : "-", GetStakeEntropyBit(), IsProofOfStake()? "PoS" : "PoW",
1781 nStakeModifier, nStakeModifierChecksum,
1782 hashProofOfStake.ToString().c_str(),
1783 prevoutStake.ToString().c_str(), nStakeTime,
1784 hashMerkleRoot.ToString().c_str(),
1785 GetBlockHash().ToString().c_str());
1791 printf("%s\n", ToString().c_str());
1795 struct CBlockIndexTrustComparator
1797 bool operator()(CBlockIndex *pa, CBlockIndex *pb) {
1798 if (pa->nChainTrust > pb->nChainTrust) return false;
1799 if (pa->nChainTrust < pb->nChainTrust) return true;
1801 return false; // identical blocks
1805 /** Used to marshal pointers into hashes for db storage. */
1806 class CDiskBlockIndex : public CBlockIndex
1818 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex) {
1819 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1824 if (!(nType & SER_GETHASH))
1825 READWRITE(VARINT(nVersion));
1827 READWRITE(VARINT(nHeight));
1828 READWRITE(VARINT(nStatus));
1829 READWRITE(VARINT(nTx));
1830 if (nStatus & (BLOCK_HAVE_DATA | BLOCK_HAVE_UNDO))
1831 READWRITE(VARINT(nFile));
1832 if (nStatus & BLOCK_HAVE_DATA)
1833 READWRITE(VARINT(nDataPos));
1834 if (nStatus & BLOCK_HAVE_UNDO)
1835 READWRITE(VARINT(nUndoPos));
1837 READWRITE(nMoneySupply);
1839 READWRITE(nStakeModifier);
1840 if (IsProofOfStake())
1842 READWRITE(prevoutStake);
1843 READWRITE(nStakeTime);
1844 READWRITE(hashProofOfStake);
1848 const_cast<CDiskBlockIndex*>(this)->prevoutStake.SetNull();
1849 const_cast<CDiskBlockIndex*>(this)->nStakeTime = 0;
1850 const_cast<CDiskBlockIndex*>(this)->hashProofOfStake = 0;
1852 READWRITE(blockHash);
1855 READWRITE(this->nVersion);
1856 READWRITE(hashPrev);
1857 READWRITE(hashMerkleRoot);
1863 uint256 GetBlockHash() const
1865 if (fUseFastIndex && (nTime < GetAdjustedTime() - 24 * 60 * 60) && blockHash != 0)
1869 block.nVersion = nVersion;
1870 block.hashPrevBlock = hashPrev;
1871 block.hashMerkleRoot = hashMerkleRoot;
1872 block.nTime = nTime;
1873 block.nBits = nBits;
1874 block.nNonce = nNonce;
1876 const_cast<CDiskBlockIndex*>(this)->blockHash = block.GetHash();
1882 std::string ToString() const
1884 std::string str = "CDiskBlockIndex(";
1885 str += CBlockIndex::ToString();
1886 str += strprintf("\n hashBlock=%s, hashPrev=%s)",
1887 GetBlockHash().ToString().c_str(),
1888 hashPrev.ToString().substr(0,20).c_str());
1894 printf("%s\n", ToString().c_str());
1899 /** Describes a place in the block chain to another node such that if the
1900 * other node doesn't have the same branch, it can find a recent common trunk.
1901 * The further back it is, the further before the fork it may be.
1906 std::vector<uint256> vHave;
1913 explicit CBlockLocator(const CBlockIndex* pindex)
1918 explicit CBlockLocator(uint256 hashBlock)
1920 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1921 if (mi != mapBlockIndex.end())
1925 CBlockLocator(const std::vector<uint256>& vHaveIn)
1932 if (!(nType & SER_GETHASH))
1933 READWRITE(nVersion);
1944 return vHave.empty();
1947 void Set(const CBlockIndex* pindex)
1953 vHave.push_back(pindex->GetBlockHash());
1955 // Exponentially larger steps back
1956 for (int i = 0; pindex && i < nStep; i++)
1957 pindex = pindex->pprev;
1958 if (vHave.size() > 10)
1961 vHave.push_back((!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet));
1964 int GetDistanceBack()
1966 // Retrace how far back it was in the sender's branch
1969 BOOST_FOREACH(const uint256& hash, vHave)
1971 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1972 if (mi != mapBlockIndex.end())
1974 CBlockIndex* pindex = (*mi).second;
1975 if (pindex->IsInMainChain())
1985 CBlockIndex* GetBlockIndex()
1987 // Find the first block the caller has in the main chain
1988 BOOST_FOREACH(const uint256& hash, vHave)
1990 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1991 if (mi != mapBlockIndex.end())
1993 CBlockIndex* pindex = (*mi).second;
1994 if (pindex->IsInMainChain())
1998 return pindexGenesisBlock;
2001 uint256 GetBlockHash()
2003 // Find the first block the caller has in the main chain
2004 BOOST_FOREACH(const uint256& hash, vHave)
2006 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
2007 if (mi != mapBlockIndex.end())
2009 CBlockIndex* pindex = (*mi).second;
2010 if (pindex->IsInMainChain())
2014 return (!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet);
2019 CBlockIndex* pindex = GetBlockIndex();
2022 return pindex->nHeight;
2033 mutable CCriticalSection cs;
2034 std::map<uint256, CTransaction> mapTx;
2035 std::map<COutPoint, CInPoint> mapNextTx;
2037 bool accept(CTransaction &tx, bool fCheckInputs, bool* pfMissingInputs);
2038 bool addUnchecked(const uint256& hash, CTransaction &tx);
2039 bool remove(CTransaction &tx);
2041 void queryHashes(std::vector<uint256>& vtxid);
2042 void pruneSpent(const uint256& hash, CCoins &coins);
2044 unsigned long size()
2047 return mapTx.size();
2050 bool exists(uint256 hash)
2052 return (mapTx.count(hash) != 0);
2055 CTransaction& lookup(uint256 hash)
2061 extern CTxMemPool mempool;
2066 uint64 nTransactions;
2067 uint64 nTransactionOutputs;
2068 uint64 nSerializedSize;
2070 CCoinsStats() : nHeight(0), nTransactions(0), nTransactionOutputs(0), nSerializedSize(0) {}
2073 /** Abstract view on the open txout dataset. */
2077 // Retrieve the CCoins (unspent transaction outputs) for a given txid
2078 virtual bool GetCoins(uint256 txid, CCoins &coins);
2080 // Modify the CCoins for a given txid
2081 virtual bool SetCoins(uint256 txid, const CCoins &coins);
2083 // Just check whether we have data for a given txid.
2084 // This may (but cannot always) return true for fully spent transactions
2085 virtual bool HaveCoins(uint256 txid);
2087 // Retrieve the block index whose state this CCoinsView currently represents
2088 virtual CBlockIndex *GetBestBlock();
2090 // Modify the currently active block index
2091 virtual bool SetBestBlock(CBlockIndex *pindex);
2092 virtual bool BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex);
2093 virtual bool GetStats(CCoinsStats &stats);
2096 /** CCoinsView backed by another CCoinsView */
2097 class CCoinsViewBacked : public CCoinsView
2103 CCoinsViewBacked(CCoinsView &viewIn);
2104 bool GetCoins(uint256 txid, CCoins &coins);
2105 bool SetCoins(uint256 txid, const CCoins &coins);
2106 bool HaveCoins(uint256 txid);
2107 CBlockIndex *GetBestBlock();
2108 bool SetBestBlock(CBlockIndex *pindex);
2109 void SetBackend(CCoinsView &viewIn);
2110 bool BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex);
2111 bool GetStats(CCoinsStats &stats);
2114 /** CCoinsView that adds a memory cache for transactions to another CCoinsView */
2115 class CCoinsViewCache : public CCoinsViewBacked
2118 CBlockIndex *pindexTip;
2119 std::map<uint256,CCoins> cacheCoins;
2120 std::map<uint256,CCoins> cacheCoinsReadOnly;
2123 CCoinsViewCache(CCoinsView &baseIn, bool fDummy = false);
2124 bool GetCoins(uint256 txid, CCoins &coins);
2125 bool GetCoinsReadOnly(uint256 txid, CCoins &coins);
2126 bool SetCoins(uint256 txid, const CCoins &coins);
2127 bool HaveCoins(uint256 txid);
2128 CCoins &GetCoins(uint256 txid);
2129 CBlockIndex *GetBestBlock();
2130 bool SetBestBlock(CBlockIndex *pindex);
2131 bool BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockIndex *pindex);
2133 unsigned int GetCacheSize();
2135 std::map<uint256,CCoins>::iterator FetchCoins(uint256 txid);
2138 /** CCoinsView that brings transactions from a memorypool into view.
2139 It does not check for spendings by memory pool transactions. */
2140 class CCoinsViewMemPool : public CCoinsViewBacked
2143 CTxMemPool &mempool;
2146 CCoinsViewMemPool(CCoinsView &baseIn, CTxMemPool &mempoolIn);
2147 bool GetCoins(uint256 txid, CCoins &coins);
2148 bool HaveCoins(uint256 txid);
2151 /** Global variable that points to the active CCoinsView (protected by cs_main) */
2152 extern CCoinsViewCache *pcoinsTip;
2154 /** Global variable that points to the active block tree (protected by cs_main) */
2155 extern CBlockTreeDB *pblocktree;