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.
25 class CRequestTracker;
28 static const unsigned int MAX_BLOCK_SIZE = 1000000;
29 static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2;
30 static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
31 static const unsigned int MAX_ORPHAN_TRANSACTIONS = MAX_BLOCK_SIZE/100;
32 static const unsigned int MAX_INV_SZ = 50000;
33 static const int64 MIN_TX_FEE = CENT;
34 static const int64 MIN_RELAY_TX_FEE = CENT;
35 static const int64 MAX_MONEY = 2000000000 * COIN;
36 static const int64 MAX_MINT_PROOF_OF_WORK = 100 * COIN;
37 static const int64 MAX_MINT_PROOF_OF_STAKE = 1 * COIN;
38 static const int64 MIN_TXOUT_AMOUNT = MIN_TX_FEE;
40 static const unsigned int ENTROPY_SWITCH_TIME = 1362791041; // Sat, 09 Mar 2013 01:04:01 GMT
41 static const unsigned int STAKE_SWITCH_TIME = 1371686400; // Thu, 20 Jun 2013 00:00:00 GMT
42 static const unsigned int TARGETS_SWITCH_TIME = 1374278400; // Sat, 20 Jul 2013 00:00:00 GMT
43 static const unsigned int CHAINCHECKS_SWITCH_TIME = 1379635200; // Fri, 20 Sep 2013 00:00:00 GMT
44 static const unsigned int STAKECURVE_SWITCH_TIME = 1382227200; // Sun, 20 Oct 2013 00:00:00 GMT
45 static const unsigned int STAKEWEIGHT_SWITCH_TIME = 1388534400; // Wed, 01 Jan 2014 00:00:00 GMT
48 inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
49 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
50 static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
53 static const int fHaveUPnP = true;
55 static const int fHaveUPnP = false;
58 static const uint256 hashGenesisBlock("0x00000a060336cbb72fe969666d337b87198b1add2abaa59cca226820b32933a4");
59 static const uint256 hashGenesisBlockTestNet("0x000c763e402f2436da9ed36c7286f62c3f6e5dbafce9ff289bd43d7459327eb");
61 static const int64 nMaxClockDrift = 2 * 60 * 60; // two hours
63 extern CScript COINBASE_FLAGS;
66 extern CCriticalSection cs_main;
67 extern std::map<uint256, CBlockIndex*> mapBlockIndex;
68 extern std::set<std::pair<COutPoint, unsigned int> > setStakeSeen;
69 extern CBlockIndex* pindexGenesisBlock;
70 extern unsigned int nStakeMinAge;
71 extern unsigned int nNodeLifespan;
72 extern int nCoinbaseMaturity;
73 extern int nBestHeight;
74 extern uint256 nBestChainTrust;
75 extern uint256 nBestInvalidTrust;
76 extern uint256 hashBestChain;
77 extern CBlockIndex* pindexBest;
78 extern unsigned int nTransactionsUpdated;
79 extern uint64 nLastBlockTx;
80 extern uint64 nLastBlockSize;
81 extern int64 nLastCoinStakeSearchInterval;
82 extern const std::string strMessageMagic;
83 extern int64 nTimeBestReceived;
84 extern CCriticalSection cs_setpwalletRegistered;
85 extern std::set<CWallet*> setpwalletRegistered;
86 extern unsigned char pchMessageStart[4];
87 extern std::map<uint256, CBlock*> mapOrphanBlocks;
90 extern int64 nTransactionFee;
91 extern bool fStakeUsePooledKeys;
92 extern unsigned int nDerivationMethodIndex;
94 // Minimum disk space required - used in CheckDiskSpace()
95 static const uint64 nMinDiskSpace = 52428800;
102 void RegisterWallet(CWallet* pwalletIn);
103 void UnregisterWallet(CWallet* pwalletIn);
104 void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false, bool fConnect = true);
105 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
106 bool CheckDiskSpace(uint64 nAdditionalBytes=0);
107 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
108 FILE* AppendBlockFile(unsigned int& nFileRet);
109 bool LoadBlockIndex(bool fAllowNew=true);
110 void PrintBlockTree();
111 CBlockIndex* FindBlockByHeight(int nHeight);
112 bool ProcessMessages(CNode* pfrom);
113 bool SendMessages(CNode* pto, bool fSendTrickle);
114 bool LoadExternalBlockFile(FILE* fileIn);
116 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
117 unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, bool fProofOfStake);
118 int64 GetProofOfWorkReward(unsigned int nBits);
119 int64 GetProofOfStakeReward(int64 nCoinAge, unsigned int nBits, unsigned int nTime, bool bCoinYearOnly=false);
120 unsigned int ComputeMinWork(unsigned int nBase, int64 nTime);
121 unsigned int ComputeMinStake(unsigned int nBase, int64 nTime, unsigned int nBlockTime);
122 int GetNumBlocksOfPeers();
123 bool IsInitialBlockDownload();
124 std::string GetWarnings(std::string strFor);
125 bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock);
126 uint256 WantedByOrphan(const CBlock* pblockOrphan);
127 const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake);
128 void StakeMiner(CWallet *pwallet);
129 void ResendWalletTransactions();
140 bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
142 /** Position on disk for a particular transaction. */
147 unsigned int nBlockPos;
155 CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
158 nBlockPos = nBlockPosIn;
162 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
163 void SetNull() { nFile = (unsigned int) -1; nBlockPos = 0; nTxPos = 0; }
164 bool IsNull() const { return (nFile == (unsigned int) -1); }
166 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
168 return (a.nFile == b.nFile &&
169 a.nBlockPos == b.nBlockPos &&
170 a.nTxPos == b.nTxPos);
173 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
179 std::string ToString() const
184 return strprintf("(nFile=%u, nBlockPos=%u, nTxPos=%u)", nFile, nBlockPos, nTxPos);
189 printf("%s", ToString().c_str());
195 /** An inpoint - a combination of a transaction and an index n into its vin */
202 CInPoint() { SetNull(); }
203 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
204 void SetNull() { ptx = NULL; n = (unsigned int) -1; }
205 bool IsNull() const { return (ptx == NULL && n == (unsigned int) -1); }
210 /** An outpoint - a combination of a transaction hash and an index n into its vout */
217 COutPoint() { SetNull(); }
218 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
219 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
220 void SetNull() { hash = 0; n = (unsigned int) -1; }
221 bool IsNull() const { return (hash == 0 && n == (unsigned int) -1); }
223 friend bool operator<(const COutPoint& a, const COutPoint& b)
225 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
228 friend bool operator==(const COutPoint& a, const COutPoint& b)
230 return (a.hash == b.hash && a.n == b.n);
233 friend bool operator!=(const COutPoint& a, const COutPoint& b)
238 std::string ToString() const
240 return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10).c_str(), n);
245 printf("%s\n", ToString().c_str());
252 /** An input of a transaction. It contains the location of the previous
253 * transaction's output that it claims and a signature that matches the
254 * output's public key.
261 unsigned int nSequence;
265 nSequence = std::numeric_limits<unsigned int>::max();
268 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
271 scriptSig = scriptSigIn;
272 nSequence = nSequenceIn;
275 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
277 prevout = COutPoint(hashPrevTx, nOut);
278 scriptSig = scriptSigIn;
279 nSequence = nSequenceIn;
285 READWRITE(scriptSig);
286 READWRITE(nSequence);
291 return (nSequence == std::numeric_limits<unsigned int>::max());
294 friend bool operator==(const CTxIn& a, const CTxIn& b)
296 return (a.prevout == b.prevout &&
297 a.scriptSig == b.scriptSig &&
298 a.nSequence == b.nSequence);
301 friend bool operator!=(const CTxIn& a, const CTxIn& b)
306 std::string ToStringShort() const
308 return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n);
311 std::string ToString() const
315 str += prevout.ToString();
316 if (prevout.IsNull())
317 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
319 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
320 if (nSequence != std::numeric_limits<unsigned int>::max())
321 str += strprintf(", nSequence=%u", nSequence);
328 printf("%s\n", ToString().c_str());
335 /** An output of a transaction. It contains the public key that the next input
336 * must be able to sign with to claim it.
342 CScript scriptPubKey;
349 CTxOut(int64 nValueIn, CScript scriptPubKeyIn)
352 scriptPubKey = scriptPubKeyIn;
358 READWRITE(scriptPubKey);
364 scriptPubKey.clear();
369 return (nValue == -1);
375 scriptPubKey.clear();
380 return (nValue == 0 && scriptPubKey.empty());
383 uint256 GetHash() const
385 return SerializeHash(*this);
388 friend bool operator==(const CTxOut& a, const CTxOut& b)
390 return (a.nValue == b.nValue &&
391 a.scriptPubKey == b.scriptPubKey);
394 friend bool operator!=(const CTxOut& a, const CTxOut& b)
399 std::string ToStringShort() const
401 return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString(true).c_str());
404 std::string ToString() const
406 if (IsEmpty()) return "CTxOut(empty)";
407 if (scriptPubKey.size() < 6)
408 return "CTxOut(error)";
409 return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().c_str());
414 printf("%s\n", ToString().c_str());
428 typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
430 /** The basic transaction that is broadcasted on the network and contained in
431 * blocks. A transaction can contain multiple inputs and outputs.
436 static const int CURRENT_VERSION=1;
439 std::vector<CTxIn> vin;
440 std::vector<CTxOut> vout;
441 unsigned int nLockTime;
443 // Denial-of-service detection:
445 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
454 READWRITE(this->nVersion);
455 nVersion = this->nVersion;
459 READWRITE(nLockTime);
464 nVersion = CTransaction::CURRENT_VERSION;
465 nTime = GetAdjustedTime();
469 nDoS = 0; // Denial-of-service prevention
474 return (vin.empty() && vout.empty());
477 uint256 GetHash() const
479 return SerializeHash(*this);
482 bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const
484 // Time based nLockTime implemented in 0.1.6
487 if (nBlockHeight == 0)
488 nBlockHeight = nBestHeight;
490 nBlockTime = GetAdjustedTime();
491 if ((int64)nLockTime < ((int64)nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime))
493 BOOST_FOREACH(const CTxIn& txin, vin)
499 bool IsNewerThan(const CTransaction& old) const
501 if (vin.size() != old.vin.size())
503 for (unsigned int i = 0; i < vin.size(); i++)
504 if (vin[i].prevout != old.vin[i].prevout)
508 unsigned int nLowest = std::numeric_limits<unsigned int>::max();
509 for (unsigned int i = 0; i < vin.size(); i++)
511 if (vin[i].nSequence != old.vin[i].nSequence)
513 if (vin[i].nSequence <= nLowest)
516 nLowest = vin[i].nSequence;
518 if (old.vin[i].nSequence < nLowest)
521 nLowest = old.vin[i].nSequence;
528 bool IsCoinBase() const
530 return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() >= 1);
533 bool IsCoinStake() const
535 // ppcoin: the coin stake transaction is marked with the first output empty
536 return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty());
539 /** Check for standard transaction types
540 @return True if all outputs (scriptPubKeys) use only standard transaction forms
542 bool IsStandard() const;
544 /** Check for standard transaction types
545 @param[in] mapInputs Map of previous transactions that have outputs we're spending
546 @return True if all inputs (scriptSigs) use only standard transaction forms
547 @see CTransaction::FetchInputs
549 bool AreInputsStandard(const MapPrevTx& mapInputs) const;
551 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
552 @return number of sigops this transaction's outputs will produce when spent
553 @see CTransaction::FetchInputs
555 unsigned int GetLegacySigOpCount() const;
557 /** Count ECDSA signature operations in pay-to-script-hash inputs.
559 @param[in] mapInputs Map of previous transactions that have outputs we're spending
560 @return maximum number of sigops required to validate this transaction's inputs
561 @see CTransaction::FetchInputs
563 unsigned int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
565 /** Amount of bitcoins spent by this transaction.
566 @return sum of all outputs (note: does not include fees)
568 int64 GetValueOut() const
571 BOOST_FOREACH(const CTxOut& txout, vout)
573 nValueOut += txout.nValue;
574 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
575 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
580 /** Amount of bitcoins coming in to this transaction
581 Note that lightweight clients may not know anything besides the hash of previous transactions,
582 so may not be able to calculate this.
584 @param[in] mapInputs Map of previous transactions that have outputs we're spending
585 @return Sum of value of all inputs (scriptSigs)
586 @see CTransaction::FetchInputs
588 int64 GetValueIn(const MapPrevTx& mapInputs) const;
590 static bool AllowFree(double dPriority)
592 // Large (in bytes) low-priority (new, small-coin) transactions
594 return dPriority > COIN * 144 / 250;
597 int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=false, enum GetMinFee_mode mode=GMF_BLOCK) const;
599 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
601 CAutoFile filein = CAutoFile(OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb"), SER_DISK, CLIENT_VERSION);
603 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
606 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
607 return error("CTransaction::ReadFromDisk() : fseek failed");
612 catch (std::exception &e) {
613 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
616 // Return file pointer
619 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
620 return error("CTransaction::ReadFromDisk() : second fseek failed");
621 *pfileRet = filein.release();
626 friend bool operator==(const CTransaction& a, const CTransaction& b)
628 return (a.nVersion == b.nVersion &&
629 a.nTime == b.nTime &&
632 a.nLockTime == b.nLockTime);
635 friend bool operator!=(const CTransaction& a, const CTransaction& b)
640 std::string ToStringShort() const
643 str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user"));
647 std::string ToString() const
650 str += IsCoinBase()? "Coinbase" : (IsCoinStake()? "Coinstake" : "CTransaction");
651 str += strprintf("(hash=%s, nTime=%d, ver=%d, vin.size=%"PRIszu", vout.size=%"PRIszu", nLockTime=%d)\n",
652 GetHash().ToString().substr(0,10).c_str(),
658 for (unsigned int i = 0; i < vin.size(); i++)
659 str += " " + vin[i].ToString() + "\n";
660 for (unsigned int i = 0; i < vout.size(); i++)
661 str += " " + vout[i].ToString() + "\n";
667 printf("%s", ToString().c_str());
671 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
672 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
673 bool ReadFromDisk(COutPoint prevout);
674 bool DisconnectInputs(CTxDB& txdb);
676 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
678 @param[in] txdb Transaction database
679 @param[in] mapTestPool List of pending changes to the transaction index database
680 @param[in] fBlock True if being called to add a new best-block to the chain
681 @param[in] fMiner True if being called by CreateNewBlock
682 @param[out] inputsRet Pointers to this transaction's inputs
683 @param[out] fInvalid returns true if transaction is invalid
684 @return Returns true if all inputs are in txdb or mapTestPool
686 bool FetchInputs(CTxDB& txdb, const std::map<uint256, CTxIndex>& mapTestPool,
687 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
689 /** Sanity check previous transactions, then, if all checks succeed,
690 mark them as spent by this transaction.
692 @param[in] inputs Previous transactions (from FetchInputs)
693 @param[out] mapTestPool Keeps track of inputs that need to be updated on disk
694 @param[in] posThisTx Position of this transaction on disk
695 @param[in] pindexBlock
696 @param[in] fBlock true if called from ConnectBlock
697 @param[in] fMiner true if called from CreateNewBlock
698 @param[in] fStrictPayToScriptHash true if fully validating p2sh transactions
699 @return Returns true if all checks succeed
701 bool ConnectInputs(CTxDB& txdb, MapPrevTx inputs,
702 std::map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx,
703 const CBlockIndex* pindexBlock, bool fBlock, bool fMiner, bool fStrictPayToScriptHash=true);
704 bool ClientConnectInputs();
705 bool CheckTransaction() const;
706 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
707 bool GetCoinAge(CTxDB& txdb, uint64& nCoinAge) const; // ppcoin: get transaction coin age
710 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
717 /** A transaction with a merkle branch linking it to the block chain. */
718 class CMerkleTx : public CTransaction
722 std::vector<uint256> vMerkleBranch;
726 mutable bool fMerkleVerified;
734 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
743 fMerkleVerified = false;
749 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
750 nVersion = this->nVersion;
751 READWRITE(hashBlock);
752 READWRITE(vMerkleBranch);
757 int SetMerkleBranch(const CBlock* pblock=NULL);
758 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
759 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
760 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
761 int GetBlocksToMaturity() const;
762 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
763 bool AcceptToMemoryPool();
769 /** A txdb record that contains the disk location of a transaction and the
770 * locations of transactions that spend its outputs. vSpent is really only
771 * used as a flag, but having the location is very helpful for debugging.
777 std::vector<CDiskTxPos> vSpent;
784 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
787 vSpent.resize(nOutputs);
792 if (!(nType & SER_GETHASH))
809 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
811 return (a.pos == b.pos &&
812 a.vSpent == b.vSpent);
815 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
819 int GetDepthInMainChain() const;
827 /** Nodes collect new transactions into a block, hash them into a hash tree,
828 * and scan through nonce values to make the block's hash satisfy proof-of-work
829 * requirements. When they solve the proof-of-work, they broadcast the block
830 * to everyone and the block is added to the block chain. The first transaction
831 * in the block is a special one that creates a new coin owned by the creator
834 * Blocks are appended to blk0001.dat files on disk. Their location on disk
835 * is indexed by CBlockIndex objects in memory.
841 static const int CURRENT_VERSION=6;
843 uint256 hashPrevBlock;
844 uint256 hashMerkleRoot;
850 std::vector<CTransaction> vtx;
852 // ppcoin: block signature - signed by one of the coin base txout[N]'s owner
853 std::vector<unsigned char> vchBlockSig;
856 mutable std::vector<uint256> vMerkleTree;
858 // Denial-of-service detection:
860 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
869 READWRITE(this->nVersion);
870 nVersion = this->nVersion;
871 READWRITE(hashPrevBlock);
872 READWRITE(hashMerkleRoot);
877 // ConnectBlock depends on vtx following header to generate CDiskTxPos
878 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
881 READWRITE(vchBlockSig);
885 const_cast<CBlock*>(this)->vtx.clear();
886 const_cast<CBlock*>(this)->vchBlockSig.clear();
892 nVersion = CBlock::CURRENT_VERSION;
909 uint256 GetHash() const
911 return scrypt_blockhash(CVOIDBEGIN(nVersion));
914 int64 GetBlockTime() const
919 void UpdateTime(const CBlockIndex* pindexPrev);
921 // ppcoin: entropy bit for stake modifier if chosen by modifier
922 unsigned int GetStakeEntropyBit(unsigned int nTime) const
924 // Protocol switch to support p2pool at novacoin block #9689
925 if (nTime >= ENTROPY_SWITCH_TIME || fTestNet)
927 // Take last bit of block hash as entropy bit
928 unsigned int nEntropyBit = ((GetHash().Get64()) & 1llu);
929 if (fDebug && GetBoolArg("-printstakemodifier"))
930 printf("GetStakeEntropyBit: nTime=%u hashBlock=%s nEntropyBit=%u\n", nTime, GetHash().ToString().c_str(), nEntropyBit);
933 // Before novacoin block #9689 - old protocol
934 uint160 hashSig = Hash160(vchBlockSig);
935 if (fDebug && GetBoolArg("-printstakemodifier"))
936 printf("GetStakeEntropyBit: hashSig=%s", hashSig.ToString().c_str());
937 hashSig >>= 159; // take the first bit of the hash
938 if (fDebug && GetBoolArg("-printstakemodifier"))
939 printf(" entropybit=%"PRI64d"\n", hashSig.Get64());
940 return hashSig.Get64();
943 // ppcoin: two types of block: proof-of-work or proof-of-stake
944 bool IsProofOfStake() const
946 return (vtx.size() > 1 && vtx[1].IsCoinStake());
949 bool IsProofOfWork() const
951 return !IsProofOfStake();
954 std::pair<COutPoint, unsigned int> GetProofOfStake() const
956 return IsProofOfStake()? std::make_pair(vtx[1].vin[0].prevout, vtx[1].nTime) : std::make_pair(COutPoint(), (unsigned int)0);
959 // ppcoin: get max transaction timestamp
960 int64 GetMaxTransactionTime() const
962 int64 maxTransactionTime = 0;
963 BOOST_FOREACH(const CTransaction& tx, vtx)
964 maxTransactionTime = std::max(maxTransactionTime, (int64)tx.nTime);
965 return maxTransactionTime;
968 uint256 BuildMerkleTree() const
971 BOOST_FOREACH(const CTransaction& tx, vtx)
972 vMerkleTree.push_back(tx.GetHash());
974 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
976 for (int i = 0; i < nSize; i += 2)
978 int i2 = std::min(i+1, nSize-1);
979 vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
980 BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
984 return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
987 std::vector<uint256> GetMerkleBranch(int nIndex) const
989 if (vMerkleTree.empty())
991 std::vector<uint256> vMerkleBranch;
993 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
995 int i = std::min(nIndex^1, nSize-1);
996 vMerkleBranch.push_back(vMerkleTree[j+i]);
1000 return vMerkleBranch;
1003 static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
1007 BOOST_FOREACH(const uint256& otherside, vMerkleBranch)
1010 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
1012 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
1019 bool WriteToDisk(unsigned int& nFileRet, unsigned int& nBlockPosRet)
1021 // Open history file to append
1022 CAutoFile fileout = CAutoFile(AppendBlockFile(nFileRet), SER_DISK, CLIENT_VERSION);
1024 return error("CBlock::WriteToDisk() : AppendBlockFile failed");
1026 // Write index header
1027 unsigned int nSize = fileout.GetSerializeSize(*this);
1028 fileout << FLATDATA(pchMessageStart) << nSize;
1031 long fileOutPos = ftell(fileout);
1033 return error("CBlock::WriteToDisk() : ftell failed");
1034 nBlockPosRet = fileOutPos;
1037 // Flush stdio buffers and commit to disk before returning
1039 if (!IsInitialBlockDownload() || (nBestHeight+1) % 500 == 0)
1040 FileCommit(fileout);
1045 bool ReadFromDisk(unsigned int nFile, unsigned int nBlockPos, bool fReadTransactions=true)
1049 // Open history file to read
1050 CAutoFile filein = CAutoFile(OpenBlockFile(nFile, nBlockPos, "rb"), SER_DISK, CLIENT_VERSION);
1052 return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
1053 if (!fReadTransactions)
1054 filein.nType |= SER_BLOCKHEADERONLY;
1060 catch (std::exception &e) {
1061 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
1065 if (fReadTransactions && IsProofOfWork() && !CheckProofOfWork(GetHash(), nBits))
1066 return error("CBlock::ReadFromDisk() : errors in block header");
1075 printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%"PRIszu", vchBlockSig=%s)\n",
1076 GetHash().ToString().c_str(),
1078 hashPrevBlock.ToString().c_str(),
1079 hashMerkleRoot.ToString().c_str(),
1080 nTime, nBits, nNonce,
1082 HexStr(vchBlockSig.begin(), vchBlockSig.end()).c_str());
1083 for (unsigned int i = 0; i < vtx.size(); i++)
1088 printf(" vMerkleTree: ");
1089 for (unsigned int i = 0; i < vMerkleTree.size(); i++)
1090 printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
1095 bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1096 bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck=false);
1097 bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
1098 bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
1099 bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
1100 bool CheckBlock(bool fCheckPOW=true, bool fCheckMerkleRoot=true, bool fCheckSig=true) const;
1102 bool GetCoinAge(uint64& nCoinAge) const; // ppcoin: calculate total coin age spent in block
1103 bool SignBlock(const CKeyStore& keystore);
1104 bool CheckBlockSignature(bool fProofOfStake) const;
1107 bool SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew);
1115 /** The block chain is a tree shaped structure starting with the
1116 * genesis block at the root, with each block potentially having multiple
1117 * candidates to be the next block. pprev and pnext link a path through the
1118 * main/longest chain. A blockindex may have multiple pprev pointing back
1119 * to it, but pnext will only point forward to the longest branch, or will
1120 * be null if the block is not part of the longest chain.
1125 const uint256* phashBlock;
1129 unsigned int nBlockPos;
1130 uint256 nChainTrust; // ppcoin: trust score of block chain
1136 unsigned int nFlags; // ppcoin: block index flags
1139 BLOCK_PROOF_OF_STAKE = (1 << 0), // is proof-of-stake block
1140 BLOCK_STAKE_ENTROPY = (1 << 1), // entropy bit for stake modifier
1141 BLOCK_STAKE_MODIFIER = (1 << 2), // regenerated stake modifier
1144 uint64 nStakeModifier; // hash modifier for proof-of-stake
1145 unsigned int nStakeModifierChecksum; // checksum of index; in-memeory only
1147 // proof-of-stake specific fields
1148 COutPoint prevoutStake;
1149 unsigned int nStakeTime;
1150 uint256 hashProofOfStake;
1154 uint256 hashMerkleRoot;
1157 unsigned int nNonce;
1172 nStakeModifierChecksum = 0;
1173 hashProofOfStake = 0;
1174 prevoutStake.SetNull();
1184 CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block)
1190 nBlockPos = nBlockPosIn;
1197 nStakeModifierChecksum = 0;
1198 hashProofOfStake = 0;
1199 if (block.IsProofOfStake())
1202 prevoutStake = block.vtx[1].vin[0].prevout;
1203 nStakeTime = block.vtx[1].nTime;
1207 prevoutStake.SetNull();
1211 nVersion = block.nVersion;
1212 hashMerkleRoot = block.hashMerkleRoot;
1213 nTime = block.nTime;
1214 nBits = block.nBits;
1215 nNonce = block.nNonce;
1218 CBlock GetBlockHeader() const
1221 block.nVersion = nVersion;
1223 block.hashPrevBlock = pprev->GetBlockHash();
1224 block.hashMerkleRoot = hashMerkleRoot;
1225 block.nTime = nTime;
1226 block.nBits = nBits;
1227 block.nNonce = nNonce;
1231 uint256 GetBlockHash() const
1236 int64 GetBlockTime() const
1238 return (int64)nTime;
1241 uint256 GetBlockTrust() const;
1243 bool IsInMainChain() const
1245 return (pnext || this == pindexBest);
1248 bool CheckIndex() const
1253 enum { nMedianTimeSpan=11 };
1255 int64 GetMedianTimePast() const
1257 int64 pmedian[nMedianTimeSpan];
1258 int64* pbegin = &pmedian[nMedianTimeSpan];
1259 int64* pend = &pmedian[nMedianTimeSpan];
1261 const CBlockIndex* pindex = this;
1262 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1263 *(--pbegin) = pindex->GetBlockTime();
1265 std::sort(pbegin, pend);
1266 return pbegin[(pend - pbegin)/2];
1269 int64 GetMedianTime() const
1271 const CBlockIndex* pindex = this;
1272 for (int i = 0; i < nMedianTimeSpan/2; i++)
1275 return GetBlockTime();
1276 pindex = pindex->pnext;
1278 return pindex->GetMedianTimePast();
1282 * Returns true if there are nRequired or more blocks of minVersion or above
1283 * in the last nToCheck blocks, starting at pstart and going backwards.
1285 static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart,
1286 unsigned int nRequired, unsigned int nToCheck);
1289 bool IsProofOfWork() const
1291 return !(nFlags & BLOCK_PROOF_OF_STAKE);
1294 bool IsProofOfStake() const
1296 return (nFlags & BLOCK_PROOF_OF_STAKE);
1299 void SetProofOfStake()
1301 nFlags |= BLOCK_PROOF_OF_STAKE;
1304 unsigned int GetStakeEntropyBit() const
1306 return ((nFlags & BLOCK_STAKE_ENTROPY) >> 1);
1309 bool SetStakeEntropyBit(unsigned int nEntropyBit)
1311 if (nEntropyBit > 1)
1313 nFlags |= (nEntropyBit? BLOCK_STAKE_ENTROPY : 0);
1317 bool GeneratedStakeModifier() const
1319 return (nFlags & BLOCK_STAKE_MODIFIER);
1322 void SetStakeModifier(uint64 nModifier, bool fGeneratedStakeModifier)
1324 nStakeModifier = nModifier;
1325 if (fGeneratedStakeModifier)
1326 nFlags |= BLOCK_STAKE_MODIFIER;
1329 std::string ToString() const
1331 return strprintf("CBlockIndex(nprev=%p, pnext=%p, nFile=%u, nBlockPos=%-6d 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)",
1332 pprev, pnext, nFile, nBlockPos, nHeight,
1333 FormatMoney(nMint).c_str(), FormatMoney(nMoneySupply).c_str(),
1334 GeneratedStakeModifier() ? "MOD" : "-", GetStakeEntropyBit(), IsProofOfStake()? "PoS" : "PoW",
1335 nStakeModifier, nStakeModifierChecksum,
1336 hashProofOfStake.ToString().c_str(),
1337 prevoutStake.ToString().c_str(), nStakeTime,
1338 hashMerkleRoot.ToString().c_str(),
1339 GetBlockHash().ToString().c_str());
1344 printf("%s\n", ToString().c_str());
1350 /** Used to marshal pointers into hashes for db storage. */
1351 class CDiskBlockIndex : public CBlockIndex
1363 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1365 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1366 hashNext = (pnext ? pnext->GetBlockHash() : 0);
1371 if (!(nType & SER_GETHASH))
1372 READWRITE(nVersion);
1374 READWRITE(hashNext);
1376 READWRITE(nBlockPos);
1379 READWRITE(nMoneySupply);
1381 READWRITE(nStakeModifier);
1382 if (IsProofOfStake())
1384 READWRITE(prevoutStake);
1385 READWRITE(nStakeTime);
1386 READWRITE(hashProofOfStake);
1390 const_cast<CDiskBlockIndex*>(this)->prevoutStake.SetNull();
1391 const_cast<CDiskBlockIndex*>(this)->nStakeTime = 0;
1392 const_cast<CDiskBlockIndex*>(this)->hashProofOfStake = 0;
1396 READWRITE(this->nVersion);
1397 READWRITE(hashPrev);
1398 READWRITE(hashMerkleRoot);
1404 uint256 GetBlockHash() const
1407 block.nVersion = nVersion;
1408 block.hashPrevBlock = hashPrev;
1409 block.hashMerkleRoot = hashMerkleRoot;
1410 block.nTime = nTime;
1411 block.nBits = nBits;
1412 block.nNonce = nNonce;
1413 return block.GetHash();
1417 std::string ToString() const
1419 std::string str = "CDiskBlockIndex(";
1420 str += CBlockIndex::ToString();
1421 str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
1422 GetBlockHash().ToString().c_str(),
1423 hashPrev.ToString().c_str(),
1424 hashNext.ToString().c_str());
1430 printf("%s\n", ToString().c_str());
1441 /** Describes a place in the block chain to another node such that if the
1442 * other node doesn't have the same branch, it can find a recent common trunk.
1443 * The further back it is, the further before the fork it may be.
1448 std::vector<uint256> vHave;
1455 explicit CBlockLocator(const CBlockIndex* pindex)
1460 explicit CBlockLocator(uint256 hashBlock)
1462 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1463 if (mi != mapBlockIndex.end())
1467 CBlockLocator(const std::vector<uint256>& vHaveIn)
1474 if (!(nType & SER_GETHASH))
1475 READWRITE(nVersion);
1486 return vHave.empty();
1489 void Set(const CBlockIndex* pindex)
1495 vHave.push_back(pindex->GetBlockHash());
1497 // Exponentially larger steps back
1498 for (int i = 0; pindex && i < nStep; i++)
1499 pindex = pindex->pprev;
1500 if (vHave.size() > 10)
1503 vHave.push_back((!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet));
1506 int GetDistanceBack()
1508 // Retrace how far back it was in the sender's branch
1511 BOOST_FOREACH(const uint256& hash, vHave)
1513 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1514 if (mi != mapBlockIndex.end())
1516 CBlockIndex* pindex = (*mi).second;
1517 if (pindex->IsInMainChain())
1527 CBlockIndex* GetBlockIndex()
1529 // Find the first block the caller has in the main chain
1530 BOOST_FOREACH(const uint256& hash, vHave)
1532 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1533 if (mi != mapBlockIndex.end())
1535 CBlockIndex* pindex = (*mi).second;
1536 if (pindex->IsInMainChain())
1540 return pindexGenesisBlock;
1543 uint256 GetBlockHash()
1545 // Find the first block the caller has in the main chain
1546 BOOST_FOREACH(const uint256& hash, vHave)
1548 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1549 if (mi != mapBlockIndex.end())
1551 CBlockIndex* pindex = (*mi).second;
1552 if (pindex->IsInMainChain())
1556 return (!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet);
1561 CBlockIndex* pindex = GetBlockIndex();
1564 return pindex->nHeight;
1578 mutable CCriticalSection cs;
1579 std::map<uint256, CTransaction> mapTx;
1580 std::map<COutPoint, CInPoint> mapNextTx;
1582 bool accept(CTxDB& txdb, CTransaction &tx,
1583 bool fCheckInputs, bool* pfMissingInputs);
1584 bool addUnchecked(const uint256& hash, CTransaction &tx);
1585 bool remove(CTransaction &tx);
1587 void queryHashes(std::vector<uint256>& vtxid);
1589 unsigned long size()
1592 return mapTx.size();
1595 bool exists(uint256 hash)
1597 return (mapTx.count(hash) != 0);
1600 CTransaction& lookup(uint256 hash)
1606 extern CTxMemPool mempool;