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;
29 static const unsigned int MAX_BLOCK_SIZE = 1000000;
30 static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2;
31 static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
32 static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100;
33 static const unsigned int MAX_INV_SZ = 50000;
34 static const int64 MIN_TX_FEE = CENT;
35 static const int64 MIN_RELAY_TX_FEE = CENT;
36 static const int64 MAX_MONEY = 2000000000 * COIN;
37 static const int64 MAX_MINT_PROOF_OF_WORK = 100 * COIN;
38 static const int64 MAX_MINT_PROOF_OF_STAKE = 1 * COIN;
39 static const int64 MIN_TXOUT_AMOUNT = MIN_TX_FEE;
41 static const unsigned int ENTROPY_SWITCH_TIME = 1362791041; // Sat, 09 Mar 2013 01:04:01 GMT
42 static const unsigned int STAKE_SWITCH_TIME = 1371686400; // Thu, 20 Jun 2013 00:00:00 GMT
43 static const unsigned int TARGETS_SWITCH_TIME = 1374278400; // Sat, 20 Jul 2013 00:00:00 GMT
44 static const unsigned int CHAINCHECKS_SWITCH_TIME = 1379635200; // Fri, 20 Sep 2013 00:00:00 GMT
45 static const unsigned int STAKECURVE_SWITCH_TIME = 1382227200; // Sun, 20 Oct 2013 00:00:00 GMT
46 static const unsigned int OUTPUT_SWITCH_TIME = 1398916800; // Thu, 01 May 2014 04:00:00 GMT
49 inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
50 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
51 static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
54 static const int fHaveUPnP = true;
56 static const int fHaveUPnP = false;
59 static const uint256 hashGenesisBlock("0x00000a060336cbb72fe969666d337b87198b1add2abaa59cca226820b32933a4");
60 static const uint256 hashGenesisBlockTestNet("0x000c763e402f2436da9ed36c7286f62c3f6e5dbafce9ff289bd43d7459327eb");
62 inline int64 PastDrift(int64 nTime) { return nTime - 2 * 60 * 60; } // up to 2 hours from the past
63 inline int64 FutureDrift(int64 nTime) { return nTime + 2 * 60 * 60; } // up to 2 hours from the future
65 extern libzerocoin::Params* ZCParams;
66 extern CScript COINBASE_FLAGS;
67 extern CCriticalSection cs_main;
68 extern std::map<uint256, CBlockIndex*> mapBlockIndex;
69 extern std::set<std::pair<COutPoint, unsigned int> > setStakeSeen;
70 extern CBlockIndex* pindexGenesisBlock;
71 extern unsigned int nStakeMinAge;
72 extern unsigned int nNodeLifespan;
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 nLastBlockTx;
81 extern uint64 nLastBlockSize;
82 extern int64 nLastCoinStakeSearchInterval;
83 extern const std::string strMessageMagic;
84 extern int64 nTimeBestReceived;
85 extern CCriticalSection cs_setpwalletRegistered;
86 extern std::set<CWallet*> setpwalletRegistered;
87 extern unsigned char pchMessageStart[4];
88 extern std::map<uint256, CBlock*> mapOrphanBlocks;
91 extern int64 nTransactionFee;
92 extern int64 nMinimumInputValue;
93 extern bool fUseFastIndex;
94 extern unsigned int nDerivationMethodIndex;
96 // Minimum disk space required - used in CheckDiskSpace()
97 static const uint64 nMinDiskSpace = 52428800;
104 void RegisterWallet(CWallet* pwalletIn);
105 void UnregisterWallet(CWallet* pwalletIn);
106 void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false, bool fConnect = true);
107 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
108 bool CheckDiskSpace(uint64 nAdditionalBytes=0);
109 FILE* OpenBlockFile(const CDiskBlockPos &pos, const char* pszMode="rb");
110 bool LoadBlockIndex(bool fAllowNew=true);
111 void PrintBlockTree();
112 CBlockIndex* FindBlockByHeight(int nHeight);
113 bool ProcessMessages(CNode* pfrom);
114 bool SendMessages(CNode* pto, bool fSendTrickle);
115 bool LoadExternalBlockFile(FILE* fileIn);
117 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
118 unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, bool fProofOfStake);
119 int64 GetProofOfWorkReward(unsigned int nBits);
120 int64 GetProofOfStakeReward(int64 nCoinAge, unsigned int nBits, unsigned int nTime, bool bCoinYearOnly=false);
121 unsigned int ComputeMinWork(unsigned int nBase, int64 nTime);
122 unsigned int ComputeMinStake(unsigned int nBase, int64 nTime, unsigned int nBlockTime);
123 int GetNumBlocksOfPeers();
124 bool IsInitialBlockDownload();
125 std::string GetWarnings(std::string strFor);
126 bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock);
127 uint256 WantedByOrphan(const CBlock* pblockOrphan);
128 const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake);
129 void StakeMiner(CWallet *pwallet);
130 void ResendWalletTransactions();
132 bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
144 CDiskBlockPos(int nHeightIn, int nAlternativeIn = 0) {
146 nAlternative = nAlternativeIn;
149 std::string GetAlternative() const {
150 char c[9]={0,0,0,0,0,0,0,0,0};
152 unsigned int n = nAlternative;
153 while (n > 0 && cp>c) {
155 *(--cp) = 'a' + (n % 26);
158 return std::string(cp);
161 boost::filesystem::path GetDirectory(const boost::filesystem::path &base) const {
162 assert(nHeight != -1);
163 return base / strprintf("era%02u", nHeight / 210000) /
164 strprintf("cycle%04u", nHeight / 2016);
167 boost::filesystem::path GetFileName(const boost::filesystem::path &base) const {
168 return GetDirectory(base) / strprintf("%08u%s.blk", nHeight, GetAlternative().c_str());
171 // TODO: make thread-safe (lockfile, atomic file creation, ...?)
172 void MakeUnique(const boost::filesystem::path &base) {
173 while (boost::filesystem::exists(GetFileName(base)))
177 IMPLEMENT_SERIALIZE(({
178 CDiskBlockPos *me = const_cast<CDiskBlockPos*>(this);
180 unsigned int nCode = (nHeight + 1) * 2 + (nAlternative > 0);
181 READWRITE(VARINT(nCode));
182 if (nAlternative > 0) {
183 unsigned int nAlt = nAlternative - 1;
184 READWRITE(VARINT(nAlt));
187 unsigned int nCode = 0;
188 READWRITE(VARINT(nCode));
189 me->nHeight = (nCode / 2) - 1;
191 unsigned int nAlt = 0;
192 READWRITE(VARINT(nAlt));
193 me->nAlternative = 1 + nAlt;
195 me->nAlternative = 0;
200 friend bool operator==(const CDiskBlockPos &a, const CDiskBlockPos &b) {
201 return ((a.nHeight == b.nHeight) && (a.nAlternative == b.nAlternative));
204 friend bool operator!=(const CDiskBlockPos &a, const CDiskBlockPos &b) {
208 void SetNull() { nHeight = -1; nAlternative = 0; }
209 bool IsNull() const { return ((nHeight == -1) && (nAlternative == 0)); }
211 void SetMemPool() { nHeight = -1; nAlternative = -1; }
212 bool IsMemPool() const { return ((nHeight == -1) && (nAlternative == -1)); }
216 /** Position on disk for a particular transaction. */
220 CDiskBlockPos blockPos;
223 CDiskTxPos(bool fInMemPool = false)
227 blockPos.SetMemPool();
231 CDiskTxPos(const CDiskBlockPos &block, unsigned int nTxPosIn) : blockPos(block), nTxPos(nTxPosIn) { }
235 READWRITE(VARINT(nTxPos));
238 void SetNull() { blockPos.SetNull(); nTxPos = 0; }
239 bool IsNull() const { return blockPos.IsNull(); }
240 bool IsMemPool() const { return blockPos.IsMemPool(); }
242 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
244 return (a.blockPos == b.blockPos &&
245 a.nTxPos == b.nTxPos);
248 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
254 std::string ToString() const
258 else if (blockPos.IsMemPool())
261 return strprintf("(%s, nTxPos=%u)", blockPos.GetFileName("").string().c_str(), nTxPos);
266 printf("%s", ToString().c_str());
272 /** An inpoint - a combination of a transaction and an index n into its vin */
279 CInPoint() { SetNull(); }
280 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
281 void SetNull() { ptx = NULL; n = (unsigned int) -1; }
282 bool IsNull() const { return (ptx == NULL && n == (unsigned int) -1); }
287 /** An outpoint - a combination of a transaction hash and an index n into its vout */
294 COutPoint() { SetNull(); }
295 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
296 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
297 void SetNull() { hash = 0; n = (unsigned int) -1; }
298 bool IsNull() const { return (hash == 0 && n == (unsigned int) -1); }
300 friend bool operator<(const COutPoint& a, const COutPoint& b)
302 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
305 friend bool operator==(const COutPoint& a, const COutPoint& b)
307 return (a.hash == b.hash && a.n == b.n);
310 friend bool operator!=(const COutPoint& a, const COutPoint& b)
315 std::string ToString() const
317 return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10).c_str(), n);
322 printf("%s\n", ToString().c_str());
329 /** An input of a transaction. It contains the location of the previous
330 * transaction's output that it claims and a signature that matches the
331 * output's public key.
338 unsigned int nSequence;
342 nSequence = std::numeric_limits<unsigned int>::max();
345 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
348 scriptSig = scriptSigIn;
349 nSequence = nSequenceIn;
352 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
354 prevout = COutPoint(hashPrevTx, nOut);
355 scriptSig = scriptSigIn;
356 nSequence = nSequenceIn;
362 READWRITE(scriptSig);
363 READWRITE(nSequence);
368 return (nSequence == std::numeric_limits<unsigned int>::max());
371 friend bool operator==(const CTxIn& a, const CTxIn& b)
373 return (a.prevout == b.prevout &&
374 a.scriptSig == b.scriptSig &&
375 a.nSequence == b.nSequence);
378 friend bool operator!=(const CTxIn& a, const CTxIn& b)
383 std::string ToStringShort() const
385 return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n);
388 std::string ToString() const
392 str += prevout.ToString();
393 if (prevout.IsNull())
394 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
396 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
397 if (nSequence != std::numeric_limits<unsigned int>::max())
398 str += strprintf(", nSequence=%u", nSequence);
405 printf("%s\n", ToString().c_str());
412 /** An output of a transaction. It contains the public key that the next input
413 * must be able to sign with to claim it.
419 CScript scriptPubKey;
426 CTxOut(int64 nValueIn, CScript scriptPubKeyIn)
429 scriptPubKey = scriptPubKeyIn;
435 READWRITE(scriptPubKey);
441 scriptPubKey.clear();
446 return (nValue == -1);
452 scriptPubKey.clear();
457 return (nValue == 0 && scriptPubKey.empty());
460 uint256 GetHash() const
462 return SerializeHash(*this);
465 friend bool operator==(const CTxOut& a, const CTxOut& b)
467 return (a.nValue == b.nValue &&
468 a.scriptPubKey == b.scriptPubKey);
471 friend bool operator!=(const CTxOut& a, const CTxOut& b)
476 std::string ToStringShort() const
478 return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString(true).c_str());
481 std::string ToString() const
483 if (IsEmpty()) return "CTxOut(empty)";
484 if (scriptPubKey.size() < 6)
485 return "CTxOut(error)";
486 return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().c_str());
491 printf("%s\n", ToString().c_str());
505 typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
507 /** The basic transaction that is broadcasted on the network and contained in
508 * blocks. A transaction can contain multiple inputs and outputs.
513 static const int CURRENT_VERSION=1;
516 std::vector<CTxIn> vin;
517 std::vector<CTxOut> vout;
518 unsigned int nLockTime;
520 // Denial-of-service detection:
522 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
531 READWRITE(this->nVersion);
532 nVersion = this->nVersion;
536 READWRITE(nLockTime);
541 nVersion = CTransaction::CURRENT_VERSION;
542 nTime = GetAdjustedTime();
546 nDoS = 0; // Denial-of-service prevention
551 return (vin.empty() && vout.empty());
554 uint256 GetHash() const
556 return SerializeHash(*this);
559 bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const
561 // Time based nLockTime implemented in 0.1.6
564 if (nBlockHeight == 0)
565 nBlockHeight = nBestHeight;
567 nBlockTime = GetAdjustedTime();
568 if ((int64)nLockTime < ((int64)nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime))
570 BOOST_FOREACH(const CTxIn& txin, vin)
576 bool IsNewerThan(const CTransaction& old) const
578 if (vin.size() != old.vin.size())
580 for (unsigned int i = 0; i < vin.size(); i++)
581 if (vin[i].prevout != old.vin[i].prevout)
585 unsigned int nLowest = std::numeric_limits<unsigned int>::max();
586 for (unsigned int i = 0; i < vin.size(); i++)
588 if (vin[i].nSequence != old.vin[i].nSequence)
590 if (vin[i].nSequence <= nLowest)
593 nLowest = vin[i].nSequence;
595 if (old.vin[i].nSequence < nLowest)
598 nLowest = old.vin[i].nSequence;
605 bool IsCoinBase() const
607 return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() >= 1);
610 bool IsCoinStake() const
612 // ppcoin: the coin stake transaction is marked with the first output empty
613 return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty());
616 /** Check for standard transaction types
617 @return True if all outputs (scriptPubKeys) use only standard transaction forms
619 bool IsStandard() const;
621 /** Check for standard transaction types
622 @param[in] mapInputs Map of previous transactions that have outputs we're spending
623 @return True if all inputs (scriptSigs) use only standard transaction forms
624 @see CTransaction::FetchInputs
626 bool AreInputsStandard(const MapPrevTx& mapInputs) const;
628 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
629 @return number of sigops this transaction's outputs will produce when spent
630 @see CTransaction::FetchInputs
632 unsigned int GetLegacySigOpCount() const;
634 /** Count ECDSA signature operations in pay-to-script-hash inputs.
636 @param[in] mapInputs Map of previous transactions that have outputs we're spending
637 @return maximum number of sigops required to validate this transaction's inputs
638 @see CTransaction::FetchInputs
640 unsigned int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
642 /** Amount of bitcoins spent by this transaction.
643 @return sum of all outputs (note: does not include fees)
645 int64 GetValueOut() const
648 BOOST_FOREACH(const CTxOut& txout, vout)
650 nValueOut += txout.nValue;
651 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
652 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
657 /** Amount of bitcoins coming in to this transaction
658 Note that lightweight clients may not know anything besides the hash of previous transactions,
659 so may not be able to calculate this.
661 @param[in] mapInputs Map of previous transactions that have outputs we're spending
662 @return Sum of value of all inputs (scriptSigs)
663 @see CTransaction::FetchInputs
665 int64 GetValueIn(const MapPrevTx& mapInputs) const;
667 static bool AllowFree(double dPriority)
669 // Large (in bytes) low-priority (new, small-coin) transactions
671 return dPriority > COIN * 144 / 250;
674 int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=false, enum GetMinFee_mode mode=GMF_BLOCK, unsigned int nBytes = 0) const;
676 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
678 CAutoFile filein = CAutoFile(OpenBlockFile(pos.blockPos, pfileRet ? "rb+" : "rb"), SER_DISK, CLIENT_VERSION);
680 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
683 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
684 return error("CTransaction::ReadFromDisk() : fseek failed");
689 catch (std::exception &e) {
690 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
693 // Return file pointer
696 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
697 return error("CTransaction::ReadFromDisk() : second fseek failed");
698 *pfileRet = filein.release();
703 friend bool operator==(const CTransaction& a, const CTransaction& b)
705 return (a.nVersion == b.nVersion &&
706 a.nTime == b.nTime &&
709 a.nLockTime == b.nLockTime);
712 friend bool operator!=(const CTransaction& a, const CTransaction& b)
717 std::string ToStringShort() const
720 str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user"));
724 std::string ToString() const
727 str += IsCoinBase()? "Coinbase" : (IsCoinStake()? "Coinstake" : "CTransaction");
728 str += strprintf("(hash=%s, nTime=%d, ver=%d, vin.size=%"PRIszu", vout.size=%"PRIszu", nLockTime=%d)\n",
729 GetHash().ToString().substr(0,10).c_str(),
735 for (unsigned int i = 0; i < vin.size(); i++)
736 str += " " + vin[i].ToString() + "\n";
737 for (unsigned int i = 0; i < vout.size(); i++)
738 str += " " + vout[i].ToString() + "\n";
744 printf("%s", ToString().c_str());
748 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
749 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
750 bool ReadFromDisk(COutPoint prevout);
751 bool DisconnectInputs(CTxDB& txdb);
753 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
755 @param[in] txdb Transaction database
756 @param[in] mapTestPool List of pending changes to the transaction index database
757 @param[in] fBlock True if being called to add a new best-block to the chain
758 @param[in] fMiner True if being called by CreateNewBlock
759 @param[out] inputsRet Pointers to this transaction's inputs
760 @param[out] fInvalid returns true if transaction is invalid
761 @return Returns true if all inputs are in txdb or mapTestPool
763 bool FetchInputs(CTxDB& txdb, const std::map<uint256, CTxIndex>& mapTestPool,
764 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
766 /** Sanity check previous transactions, then, if all checks succeed,
767 mark them as spent by this transaction.
769 @param[in] inputs Previous transactions (from FetchInputs)
770 @param[out] mapTestPool Keeps track of inputs that need to be updated on disk
771 @param[in] posThisTx Position of this transaction on disk
772 @param[in] pindexBlock
773 @param[in] fBlock true if called from ConnectBlock
774 @param[in] fMiner true if called from CreateNewBlock
775 @param[in] fStrictPayToScriptHash true if fully validating p2sh transactions
776 @return Returns true if all checks succeed
778 bool ConnectInputs(CTxDB& txdb, MapPrevTx inputs,
779 std::map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx,
780 const CBlockIndex* pindexBlock, bool fBlock, bool fMiner, bool fStrictPayToScriptHash=true);
781 bool ClientConnectInputs();
782 bool CheckTransaction() const;
783 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
784 bool GetCoinAge(CTxDB& txdb, uint64& nCoinAge) const; // ppcoin: get transaction coin age
787 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
791 /** wrapper for CTxOut that provides a more compact serialization */
792 class CTxOutCompressor
798 static uint64 CompressAmount(uint64 nAmount);
799 static uint64 DecompressAmount(uint64 nAmount);
801 CTxOutCompressor(CTxOut &txoutIn) : txout(txoutIn) { }
803 IMPLEMENT_SERIALIZE(({
805 uint64 nVal = CompressAmount(txout.nValue);
806 READWRITE(VARINT(nVal));
809 READWRITE(VARINT(nVal));
810 txout.nValue = DecompressAmount(nVal);
812 CScriptCompressor cscript(REF(txout.scriptPubKey));
817 /** Undo information for a CTxIn
819 * Contains the prevout's CTxOut being spent, and if this was the
820 * last output of the affected transaction, its metadata as well
821 * (coinbase or not, height, transaction version)
826 CTxOut txout; // the txout data before being spent
827 bool fCoinBase; // if the outpoint was the last unspent: whether it belonged to a coinbase
828 unsigned int nHeight; // if the outpoint was the last unspent: its height
829 int nVersion; // if the outpoint was the last unspent: its version
831 CTxInUndo() : txout(), fCoinBase(false), nHeight(0), nVersion(0) {}
832 CTxInUndo(const CTxOut &txoutIn, bool fCoinBaseIn = false, unsigned int nHeightIn = 0, int nVersionIn = 0) : txout(txoutIn), fCoinBase(fCoinBaseIn), nHeight(nHeightIn), nVersion(nVersionIn) { }
834 unsigned int GetSerializeSize(int nType, int nVersion) const {
835 return ::GetSerializeSize(VARINT(nHeight*2+(fCoinBase ? 1 : 0)), nType, nVersion) +
836 (nHeight > 0 ? ::GetSerializeSize(VARINT(this->nVersion), nType, nVersion) : 0) +
837 ::GetSerializeSize(CTxOutCompressor(REF(txout)), nType, nVersion);
840 template<typename Stream>
841 void Serialize(Stream &s, int nType, int nVersion) const {
842 ::Serialize(s, VARINT(nHeight*2+(fCoinBase ? 1 : 0)), nType, nVersion);
844 ::Serialize(s, VARINT(this->nVersion), nType, nVersion);
845 ::Serialize(s, CTxOutCompressor(REF(txout)), nType, nVersion);
848 template<typename Stream>
849 void Unserialize(Stream &s, int nType, int nVersion) {
850 unsigned int nCode = 0;
851 ::Unserialize(s, VARINT(nCode), nType, nVersion);
853 fCoinBase = nCode & 1;
855 ::Unserialize(s, VARINT(this->nVersion), nType, nVersion);
856 ::Unserialize(s, REF(CTxOutCompressor(REF(txout))), nType, nVersion);
860 /** Undo information for a CTransaction */
864 std::vector<CTxInUndo> vprevout;
872 /** pruned version of CTransaction: only retains metadata and unspent transaction outputs
877 * - unspentness bitvector, for vout[2] and further; least significant byte first
878 * - the non-spent CTxOuts (via CTxOutCompressor)
881 * The nCode value consists of:
882 * - bit 1: IsCoinBase()
883 * - bit 2: vout[0] is not spent
884 * - bit 4: vout[1] is not spent
885 * - The higher bits encode N, the number of non-zero bytes in the following bitvector.
886 * - In case both bit 2 and bit 4 are unset, they encode N-1, as there must be at
887 * least one non-spent output).
889 * Example: 0104835800816115944e077fe7c803cfa57f29b36bf87c1d358bb85e
890 * <><><--------------------------------------------><---->
892 * version code vout[1] height
895 * - code = 4 (vout[1] is not spent, and 0 non-zero bytes of bitvector follow)
896 * - unspentness bitvector: as 0 non-zero bytes follow, it has length 0
897 * - vout[1]: 835800816115944e077fe7c803cfa57f29b36bf87c1d35
898 * * 8358: compact amount representation for 60000000000 (600 BTC)
899 * * 00: special txout type pay-to-pubkey-hash
900 * * 816115944e077fe7c803cfa57f29b36bf87c1d35: address uint160
904 * Example: 0109044086ef97d5790061b01caab50f1b8e9c50a5057eb43c2d9563a4eebbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa486af3b
905 * <><><--><--------------------------------------------------><----------------------------------------------><---->
907 * version code unspentness vout[4] vout[16] height
910 * - code = 9 (coinbase, neither vout[0] or vout[1] are unspent,
911 * 2 (1, +1 because both bit 2 and bit 4 are unset) non-zero bitvector bytes follow)
912 * - unspentness bitvector: bits 2 (0x04) and 14 (0x4000) are set, so vout[2+2] and vout[14+2] are unspent
913 * - vout[4]: 86ef97d5790061b01caab50f1b8e9c50a5057eb43c2d9563a4ee
914 * * 86ef97d579: compact amount representation for 234925952 (2.35 BTC)
915 * * 00: special txout type pay-to-pubkey-hash
916 * * 61b01caab50f1b8e9c50a5057eb43c2d9563a4ee: address uint160
917 * - vout[16]: bbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa4
918 * * bbd123: compact amount representation for 110397 (0.001 BTC)
919 * * 00: special txout type pay-to-pubkey-hash
920 * * 8c988f1a4a4de2161e0f50aac7f17e7f9555caa4: address uint160
926 // whether transaction is a coinbase
929 // unspent transaction outputs; spent outputs are .IsNull(); spent outputs at the end of the array are dropped
930 std::vector<CTxOut> vout;
932 // at which height this transaction was included in the active blockchain
935 // version of the CTransaction; accesses to this value should probably check for nHeight as well,
936 // as new tx version will probably only be introduced at certain heights
939 // construct a CCoins from a CTransaction, at a given height
940 CCoins(const CTransaction &tx, int nHeightIn) : fCoinBase(tx.IsCoinBase()), vout(tx.vout), nHeight(nHeightIn), nVersion(tx.nVersion) { }
943 CCoins() : fCoinBase(false), vout(0), nHeight(0), nVersion(0) { }
945 // remove spent outputs at the end of vout
947 while (vout.size() > 0 && vout.back().IsNull())
952 friend bool operator==(const CCoins &a, const CCoins &b) {
953 return a.fCoinBase == b.fCoinBase &&
954 a.nHeight == b.nHeight &&
955 a.nVersion == b.nVersion &&
958 friend bool operator!=(const CCoins &a, const CCoins &b) {
962 // calculate number of bytes for the bitmask, and its number of non-zero bytes
963 // each bit in the bitmask represents the availability of one output, but the
964 // availabilities of the first two outputs are encoded separately
965 void CalcMaskSize(unsigned int &nBytes, unsigned int &nNonzeroBytes) const {
966 unsigned int nLastUsedByte = 0;
967 for (unsigned int b = 0; 2+b*8 < vout.size(); b++) {
969 for (unsigned int i = 0; i < 8 && 2+b*8+i < vout.size(); i++) {
970 if (!vout[2+b*8+i].IsNull()) {
976 nLastUsedByte = b + 1;
980 nBytes += nLastUsedByte;
983 bool IsCoinBase() const {
987 unsigned int GetSerializeSize(int nType, int nVersion) const {
988 unsigned int nSize = 0;
989 unsigned int nMaskSize = 0, nMaskCode = 0;
990 CalcMaskSize(nMaskSize, nMaskCode);
991 bool fFirst = vout.size() > 0 && !vout[0].IsNull();
992 bool fSecond = vout.size() > 1 && !vout[1].IsNull();
993 assert(fFirst || fSecond || nMaskCode);
994 unsigned int nCode = 8*(nMaskCode - (fFirst || fSecond ? 0 : 1)) + (fCoinBase ? 1 : 0) + (fFirst ? 2 : 0) + (fSecond ? 4 : 0);
996 nSize += ::GetSerializeSize(VARINT(this->nVersion), nType, nVersion);
997 // size of header code
998 nSize += ::GetSerializeSize(VARINT(nCode), nType, nVersion);
1002 for (unsigned int i = 0; i < vout.size(); i++)
1003 if (!vout[i].IsNull())
1004 nSize += ::GetSerializeSize(CTxOutCompressor(REF(vout[i])), nType, nVersion);
1006 nSize += ::GetSerializeSize(VARINT(nHeight), nType, nVersion);
1010 template<typename Stream>
1011 void Serialize(Stream &s, int nType, int nVersion) const {
1012 unsigned int nMaskSize = 0, nMaskCode = 0;
1013 CalcMaskSize(nMaskSize, nMaskCode);
1014 bool fFirst = vout.size() > 0 && !vout[0].IsNull();
1015 bool fSecond = vout.size() > 1 && !vout[1].IsNull();
1016 assert(fFirst || fSecond || nMaskCode);
1017 unsigned int nCode = 8*(nMaskCode - (fFirst || fSecond ? 0 : 1)) + (fCoinBase ? 1 : 0) + (fFirst ? 2 : 0) + (fSecond ? 4 : 0);
1019 ::Serialize(s, VARINT(this->nVersion), nType, nVersion);
1021 ::Serialize(s, VARINT(nCode), nType, nVersion);
1022 // spentness bitmask
1023 for (unsigned int b = 0; b<nMaskSize; b++) {
1024 unsigned char chAvail = 0;
1025 for (unsigned int i = 0; i < 8 && 2+b*8+i < vout.size(); i++)
1026 if (!vout[2+b*8+i].IsNull())
1027 chAvail |= (1 << i);
1028 ::Serialize(s, chAvail, nType, nVersion);
1031 for (unsigned int i = 0; i < vout.size(); i++) {
1032 if (!vout[i].IsNull())
1033 ::Serialize(s, CTxOutCompressor(REF(vout[i])), nType, nVersion);
1036 ::Serialize(s, VARINT(nHeight), nType, nVersion);
1039 template<typename Stream>
1040 void Unserialize(Stream &s, int nType, int nVersion) {
1041 unsigned int nCode = 0;
1043 ::Unserialize(s, VARINT(this->nVersion), nType, nVersion);
1045 ::Unserialize(s, VARINT(nCode), nType, nVersion);
1046 fCoinBase = nCode & 1;
1047 std::vector<bool> vAvail(2, false);
1048 vAvail[0] = nCode & 2;
1049 vAvail[1] = nCode & 4;
1050 unsigned int nMaskCode = (nCode / 8) + ((nCode & 6) != 0 ? 0 : 1);
1051 // spentness bitmask
1052 while (nMaskCode > 0) {
1053 unsigned char chAvail = 0;
1054 ::Unserialize(s, chAvail, nType, nVersion);
1055 for (unsigned int p = 0; p < 8; p++) {
1056 bool f = (chAvail & (1 << p)) != 0;
1057 vAvail.push_back(f);
1063 vout.assign(vAvail.size(), CTxOut());
1064 for (unsigned int i = 0; i < vAvail.size(); i++) {
1066 ::Unserialize(s, REF(CTxOutCompressor(vout[i])), nType, nVersion);
1069 ::Unserialize(s, VARINT(nHeight), nType, nVersion);
1073 // mark an outpoint spent, and construct undo information
1074 bool Spend(const COutPoint &out, CTxInUndo &undo) {
1075 if (out.n >= vout.size())
1077 if (vout[out.n].IsNull())
1079 undo = CTxInUndo(vout[out.n]);
1080 vout[out.n].SetNull();
1082 if (vout.size() == 0) {
1083 undo.nHeight = nHeight;
1084 undo.fCoinBase = fCoinBase;
1085 undo.nVersion = this->nVersion;
1090 // mark a vout spent
1091 bool Spend(int nPos) {
1093 COutPoint out(0, nPos);
1094 return Spend(out, undo);
1097 // check whether a particular output is still available
1098 bool IsAvailable(unsigned int nPos) const {
1099 return (nPos < vout.size() && !vout[nPos].IsNull());
1102 // check whether the entire CCoins is spent
1103 // note that only !IsPruned() CCoins can be serialized
1104 bool IsPruned() const {
1105 BOOST_FOREACH(const CTxOut &out, vout)
1115 /** A transaction with a merkle branch linking it to the block chain. */
1116 class CMerkleTx : public CTransaction
1120 std::vector<uint256> vMerkleBranch;
1124 mutable bool fMerkleVerified;
1132 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
1141 fMerkleVerified = false;
1147 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
1148 nVersion = this->nVersion;
1149 READWRITE(hashBlock);
1150 READWRITE(vMerkleBranch);
1155 int SetMerkleBranch(const CBlock* pblock=NULL);
1156 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
1157 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
1158 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
1159 int GetBlocksToMaturity() const;
1160 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
1161 bool AcceptToMemoryPool();
1167 /** A txdb record that contains the disk location of a transaction and the
1168 * locations of transactions that spend its outputs. vSpent is really only
1169 * used as a flag, but having the location is very helpful for debugging.
1175 std::vector<CDiskTxPos> vSpent;
1182 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
1185 vSpent.resize(nOutputs);
1190 if (!(nType & SER_GETHASH))
1191 READWRITE(nVersion);
1204 return pos.IsNull();
1207 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
1209 return (a.pos == b.pos &&
1210 a.vSpent == b.vSpent);
1213 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
1217 int GetDepthInMainChain() const;
1225 /** Nodes collect new transactions into a block, hash them into a hash tree,
1226 * and scan through nonce values to make the block's hash satisfy proof-of-work
1227 * requirements. When they solve the proof-of-work, they broadcast the block
1228 * to everyone and the block is added to the block chain. The first transaction
1229 * in the block is a special one that creates a new coin owned by the creator
1232 * Blocks are appended to blk0001.dat files on disk. Their location on disk
1233 * is indexed by CBlockIndex objects in memory.
1239 static const int CURRENT_VERSION=6;
1241 uint256 hashPrevBlock;
1242 uint256 hashMerkleRoot;
1245 unsigned int nNonce;
1248 std::vector<CTransaction> vtx;
1250 // ppcoin: block signature - signed by one of the coin base txout[N]'s owner
1251 std::vector<unsigned char> vchBlockSig;
1254 mutable std::vector<uint256> vMerkleTree;
1256 // Denial-of-service detection:
1258 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
1267 READWRITE(this->nVersion);
1268 nVersion = this->nVersion;
1269 READWRITE(hashPrevBlock);
1270 READWRITE(hashMerkleRoot);
1275 // ConnectBlock depends on vtx following header to generate CDiskTxPos
1276 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
1279 READWRITE(vchBlockSig);
1283 const_cast<CBlock*>(this)->vtx.clear();
1284 const_cast<CBlock*>(this)->vchBlockSig.clear();
1290 nVersion = CBlock::CURRENT_VERSION;
1297 vchBlockSig.clear();
1298 vMerkleTree.clear();
1304 return (nBits == 0);
1307 uint256 GetHash() const
1309 return scrypt_blockhash(CVOIDBEGIN(nVersion));
1312 int64 GetBlockTime() const
1314 return (int64)nTime;
1317 void UpdateTime(const CBlockIndex* pindexPrev);
1319 // ppcoin: entropy bit for stake modifier if chosen by modifier
1320 unsigned int GetStakeEntropyBit(unsigned int nTime) const
1322 // Protocol switch to support p2pool at novacoin block #9689
1323 if (nTime >= ENTROPY_SWITCH_TIME || fTestNet)
1325 // Take last bit of block hash as entropy bit
1326 unsigned int nEntropyBit = ((GetHash().Get64()) & 1llu);
1327 if (fDebug && GetBoolArg("-printstakemodifier"))
1328 printf("GetStakeEntropyBit: nTime=%u hashBlock=%s nEntropyBit=%u\n", nTime, GetHash().ToString().c_str(), nEntropyBit);
1331 // Before novacoin block #9689 - old protocol
1332 uint160 hashSig = Hash160(vchBlockSig);
1333 if (fDebug && GetBoolArg("-printstakemodifier"))
1334 printf("GetStakeEntropyBit: hashSig=%s", hashSig.ToString().c_str());
1335 hashSig >>= 159; // take the first bit of the hash
1336 if (fDebug && GetBoolArg("-printstakemodifier"))
1337 printf(" entropybit=%"PRI64d"\n", hashSig.Get64());
1338 return hashSig.Get64();
1341 // ppcoin: two types of block: proof-of-work or proof-of-stake
1342 bool IsProofOfStake() const
1344 return (vtx.size() > 1 && vtx[1].IsCoinStake());
1347 bool IsProofOfWork() const
1349 return !IsProofOfStake();
1352 std::pair<COutPoint, unsigned int> GetProofOfStake() const
1354 return IsProofOfStake()? std::make_pair(vtx[1].vin[0].prevout, vtx[1].nTime) : std::make_pair(COutPoint(), (unsigned int)0);
1357 // ppcoin: get max transaction timestamp
1358 int64 GetMaxTransactionTime() const
1360 int64 maxTransactionTime = 0;
1361 BOOST_FOREACH(const CTransaction& tx, vtx)
1362 maxTransactionTime = std::max(maxTransactionTime, (int64)tx.nTime);
1363 return maxTransactionTime;
1366 uint256 BuildMerkleTree() const
1368 vMerkleTree.clear();
1369 BOOST_FOREACH(const CTransaction& tx, vtx)
1370 vMerkleTree.push_back(tx.GetHash());
1372 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
1374 for (int i = 0; i < nSize; i += 2)
1376 int i2 = std::min(i+1, nSize-1);
1377 vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
1378 BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
1382 return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
1385 std::vector<uint256> GetMerkleBranch(int nIndex) const
1387 if (vMerkleTree.empty())
1389 std::vector<uint256> vMerkleBranch;
1391 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
1393 int i = std::min(nIndex^1, nSize-1);
1394 vMerkleBranch.push_back(vMerkleTree[j+i]);
1398 return vMerkleBranch;
1401 static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
1405 BOOST_FOREACH(const uint256& otherside, vMerkleBranch)
1408 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
1410 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
1417 bool WriteToDisk(CDiskBlockPos &pos)
1419 // Open history file to append
1420 pos.MakeUnique(GetDataDir());
1421 CAutoFile fileout = CAutoFile(OpenBlockFile(pos, "ab"), SER_DISK, CLIENT_VERSION);
1423 return error("CBlock::WriteToDisk() : AppendBlockFile failed");
1428 // Flush stdio buffers and commit to disk before returning
1430 if (!IsInitialBlockDownload() || (nBestHeight+1) % 500 == 0)
1431 FileCommit(fileout);
1436 bool ReadFromDisk(const CDiskBlockPos &pos, bool fReadTransactions = true)
1440 // Open history file to read
1441 CAutoFile filein = CAutoFile(OpenBlockFile(pos, "rb"), SER_DISK, CLIENT_VERSION);
1443 return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
1444 if (!fReadTransactions)
1445 filein.nType |= SER_BLOCKHEADERONLY;
1451 catch (std::exception &e) {
1452 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
1456 if (fReadTransactions && IsProofOfWork() && !CheckProofOfWork(GetHash(), nBits))
1457 return error("CBlock::ReadFromDisk() : errors in block header");
1466 printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%"PRIszu", vchBlockSig=%s)\n",
1467 GetHash().ToString().c_str(),
1469 hashPrevBlock.ToString().c_str(),
1470 hashMerkleRoot.ToString().c_str(),
1471 nTime, nBits, nNonce,
1473 HexStr(vchBlockSig.begin(), vchBlockSig.end()).c_str());
1474 for (unsigned int i = 0; i < vtx.size(); i++)
1479 printf(" vMerkleTree: ");
1480 for (unsigned int i = 0; i < vMerkleTree.size(); i++)
1481 printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
1486 bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1487 bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck=false);
1488 bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
1489 bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
1490 bool AddToBlockIndex(const CDiskBlockPos &pos);
1491 bool CheckBlock(bool fCheckPOW=true, bool fCheckMerkleRoot=true, bool fCheckSig=true) const;
1493 bool GetCoinAge(uint64& nCoinAge) const; // ppcoin: calculate total coin age spent in block
1494 bool SignBlock(CWallet& keystore);
1495 bool CheckBlockSignature(bool fProofOfStake) const;
1498 bool SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew);
1506 /** The block chain is a tree shaped structure starting with the
1507 * genesis block at the root, with each block potentially having multiple
1508 * candidates to be the next block. pprev and pnext link a path through the
1509 * main/longest chain. A blockindex may have multiple pprev pointing back
1510 * to it, but pnext will only point forward to the longest branch, or will
1511 * be null if the block is not part of the longest chain.
1516 const uint256* phashBlock;
1519 uint256 nChainTrust; // ppcoin: trust score of block chain
1521 unsigned int nAlternative;
1526 unsigned int nFlags;
1529 BLOCK_PROOF_OF_STAKE = (1 << 0), // is proof-of-stake block
1530 BLOCK_STAKE_ENTROPY = (1 << 1), // entropy bit for stake modifier
1531 BLOCK_STAKE_MODIFIER = (1 << 2), // regenerated stake modifier
1534 uint64 nStakeModifier; // hash modifier for proof-of-stake
1535 unsigned int nStakeModifierChecksum; // checksum of index; in-memeory only
1537 // proof-of-stake specific fields
1538 COutPoint prevoutStake;
1539 unsigned int nStakeTime;
1540 uint256 hashProofOfStake;
1544 uint256 hashMerkleRoot;
1547 unsigned int nNonce;
1560 nStakeModifierChecksum = 0;
1561 hashProofOfStake = 0;
1562 prevoutStake.SetNull();
1573 CBlockIndex(CBlock& block)
1584 nStakeModifierChecksum = 0;
1585 hashProofOfStake = 0;
1586 if (block.IsProofOfStake())
1589 prevoutStake = block.vtx[1].vin[0].prevout;
1590 nStakeTime = block.vtx[1].nTime;
1594 prevoutStake.SetNull();
1599 nVersion = block.nVersion;
1600 hashMerkleRoot = block.hashMerkleRoot;
1601 nTime = block.nTime;
1602 nBits = block.nBits;
1603 nNonce = block.nNonce;
1606 CDiskBlockPos GetBlockPos() const {
1607 return CDiskBlockPos(nHeight, nAlternative);
1610 CBlock GetBlockHeader() const
1613 block.nVersion = nVersion;
1615 block.hashPrevBlock = pprev->GetBlockHash();
1616 block.hashMerkleRoot = hashMerkleRoot;
1617 block.nTime = nTime;
1618 block.nBits = nBits;
1619 block.nNonce = nNonce;
1623 uint256 GetBlockHash() const
1628 int64 GetBlockTime() const
1630 return (int64)nTime;
1633 uint256 GetBlockTrust() const;
1635 bool IsInMainChain() const
1637 return (pnext || this == pindexBest);
1640 bool CheckIndex() const
1645 enum { nMedianTimeSpan=11 };
1647 int64 GetMedianTimePast() const
1649 int64 pmedian[nMedianTimeSpan];
1650 int64* pbegin = &pmedian[nMedianTimeSpan];
1651 int64* pend = &pmedian[nMedianTimeSpan];
1653 const CBlockIndex* pindex = this;
1654 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1655 *(--pbegin) = pindex->GetBlockTime();
1657 std::sort(pbegin, pend);
1658 return pbegin[(pend - pbegin)/2];
1661 int64 GetMedianTime() const
1663 const CBlockIndex* pindex = this;
1664 for (int i = 0; i < nMedianTimeSpan/2; i++)
1667 return GetBlockTime();
1668 pindex = pindex->pnext;
1670 return pindex->GetMedianTimePast();
1674 * Returns true if there are nRequired or more blocks of minVersion or above
1675 * in the last nToCheck blocks, starting at pstart and going backwards.
1677 static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart,
1678 unsigned int nRequired, unsigned int nToCheck);
1681 bool IsProofOfWork() const
1683 return !(nFlags & BLOCK_PROOF_OF_STAKE);
1686 bool IsProofOfStake() const
1688 return (nFlags & BLOCK_PROOF_OF_STAKE);
1691 void SetProofOfStake()
1693 nFlags |= BLOCK_PROOF_OF_STAKE;
1696 unsigned int GetStakeEntropyBit() const
1698 return ((nFlags & BLOCK_STAKE_ENTROPY) >> 1);
1701 bool SetStakeEntropyBit(unsigned int nEntropyBit)
1703 if (nEntropyBit > 1)
1705 nFlags |= (nEntropyBit? BLOCK_STAKE_ENTROPY : 0);
1709 bool GeneratedStakeModifier() const
1711 return (nFlags & BLOCK_STAKE_MODIFIER);
1714 void SetStakeModifier(uint64 nModifier, bool fGeneratedStakeModifier)
1716 nStakeModifier = nModifier;
1717 if (fGeneratedStakeModifier)
1718 nFlags |= BLOCK_STAKE_MODIFIER;
1721 std::string ToString() const
1723 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)",
1724 pprev, pnext, nHeight,
1725 FormatMoney(nMint).c_str(), FormatMoney(nMoneySupply).c_str(),
1726 GeneratedStakeModifier() ? "MOD" : "-", GetStakeEntropyBit(), IsProofOfStake()? "PoS" : "PoW",
1727 nStakeModifier, nStakeModifierChecksum,
1728 hashProofOfStake.ToString().c_str(),
1729 prevoutStake.ToString().c_str(), nStakeTime,
1730 hashMerkleRoot.ToString().c_str(),
1731 GetBlockHash().ToString().c_str());
1736 printf("%s\n", ToString().c_str());
1742 /** Used to marshal pointers into hashes for db storage. */
1743 class CDiskBlockIndex : public CBlockIndex
1759 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1761 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1762 hashNext = (pnext ? pnext->GetBlockHash() : 0);
1767 if (!(nType & SER_GETHASH))
1768 READWRITE(nVersion);
1770 READWRITE(hashNext);
1772 READWRITE(nAlternative);
1774 READWRITE(nMoneySupply);
1776 READWRITE(nStakeModifier);
1777 if (IsProofOfStake())
1779 READWRITE(prevoutStake);
1780 READWRITE(nStakeTime);
1781 READWRITE(hashProofOfStake);
1785 const_cast<CDiskBlockIndex*>(this)->prevoutStake.SetNull();
1786 const_cast<CDiskBlockIndex*>(this)->nStakeTime = 0;
1787 const_cast<CDiskBlockIndex*>(this)->hashProofOfStake = 0;
1791 READWRITE(this->nVersion);
1792 READWRITE(hashPrev);
1793 READWRITE(hashMerkleRoot);
1797 READWRITE(blockHash);
1800 uint256 GetBlockHash() const
1802 if (fUseFastIndex && (nTime < GetAdjustedTime() - 24 * 60 * 60) && blockHash != 0)
1806 block.nVersion = nVersion;
1807 block.hashPrevBlock = hashPrev;
1808 block.hashMerkleRoot = hashMerkleRoot;
1809 block.nTime = nTime;
1810 block.nBits = nBits;
1811 block.nNonce = nNonce;
1813 const_cast<CDiskBlockIndex*>(this)->blockHash = block.GetHash();
1818 std::string ToString() const
1820 std::string str = "CDiskBlockIndex(";
1821 str += CBlockIndex::ToString();
1822 str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
1823 GetBlockHash().ToString().c_str(),
1824 hashPrev.ToString().c_str(),
1825 hashNext.ToString().c_str());
1831 printf("%s\n", ToString().c_str());
1842 /** Describes a place in the block chain to another node such that if the
1843 * other node doesn't have the same branch, it can find a recent common trunk.
1844 * The further back it is, the further before the fork it may be.
1849 std::vector<uint256> vHave;
1856 explicit CBlockLocator(const CBlockIndex* pindex)
1861 explicit CBlockLocator(uint256 hashBlock)
1863 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1864 if (mi != mapBlockIndex.end())
1868 CBlockLocator(const std::vector<uint256>& vHaveIn)
1875 if (!(nType & SER_GETHASH))
1876 READWRITE(nVersion);
1887 return vHave.empty();
1890 void Set(const CBlockIndex* pindex)
1896 vHave.push_back(pindex->GetBlockHash());
1898 // Exponentially larger steps back
1899 for (int i = 0; pindex && i < nStep; i++)
1900 pindex = pindex->pprev;
1901 if (vHave.size() > 10)
1904 vHave.push_back((!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet));
1907 int GetDistanceBack()
1909 // Retrace how far back it was in the sender's branch
1912 BOOST_FOREACH(const uint256& hash, vHave)
1914 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1915 if (mi != mapBlockIndex.end())
1917 CBlockIndex* pindex = (*mi).second;
1918 if (pindex->IsInMainChain())
1928 CBlockIndex* GetBlockIndex()
1930 // Find the first block the caller has in the main chain
1931 BOOST_FOREACH(const uint256& hash, vHave)
1933 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1934 if (mi != mapBlockIndex.end())
1936 CBlockIndex* pindex = (*mi).second;
1937 if (pindex->IsInMainChain())
1941 return pindexGenesisBlock;
1944 uint256 GetBlockHash()
1946 // Find the first block the caller has in the main chain
1947 BOOST_FOREACH(const uint256& hash, vHave)
1949 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1950 if (mi != mapBlockIndex.end())
1952 CBlockIndex* pindex = (*mi).second;
1953 if (pindex->IsInMainChain())
1957 return (!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet);
1962 CBlockIndex* pindex = GetBlockIndex();
1965 return pindex->nHeight;
1979 mutable CCriticalSection cs;
1980 std::map<uint256, CTransaction> mapTx;
1981 std::map<COutPoint, CInPoint> mapNextTx;
1983 bool accept(CTxDB& txdb, CTransaction &tx,
1984 bool fCheckInputs, bool* pfMissingInputs);
1985 bool addUnchecked(const uint256& hash, CTransaction &tx);
1986 bool remove(CTransaction &tx);
1988 void queryHashes(std::vector<uint256>& vtxid);
1990 unsigned long size()
1993 return mapTx.size();
1996 bool exists(uint256 hash)
1998 return (mapTx.count(hash) != 0);
2001 CTransaction& lookup(uint256 hash)
2007 extern CTxMemPool mempool;