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.
8 #include "timestamps.h"
14 #include "zerocoin/Zerocoin.h"
27 class CRequestTracker;
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 int64 MIN_TX_FEE = CENT/10;
37 static const int64 MIN_RELAY_TX_FEE = CENT/50;
39 static const int64 MAX_MONEY = 2000000000 * COIN;
40 static const int64 MAX_MINT_PROOF_OF_WORK = 100 * COIN;
41 static const int64 MAX_MINT_PROOF_OF_STAKE = 1 * COIN;
42 static const int64 MIN_TXOUT_AMOUNT = CENT/100;
44 inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
45 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
46 static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
49 static const int fHaveUPnP = true;
51 static const int fHaveUPnP = false;
54 static const uint256 hashGenesisBlock("0x00000a060336cbb72fe969666d337b87198b1add2abaa59cca226820b32933a4");
55 static const uint256 hashGenesisBlockTestNet("0x000c763e402f2436da9ed36c7286f62c3f6e5dbafce9ff289bd43d7459327eb");
57 inline int64 PastDrift(int64 nTime) { return nTime - 2 * 60 * 60; } // up to 2 hours from the past
58 inline int64 FutureDrift(int64 nTime) { return nTime + 2 * 60 * 60; } // up to 2 hours from the future
60 extern libzerocoin::Params* ZCParams;
61 extern CScript COINBASE_FLAGS;
62 extern CCriticalSection cs_main;
63 extern std::map<uint256, CBlockIndex*> mapBlockIndex;
64 extern std::set<std::pair<COutPoint, unsigned int> > setStakeSeen;
65 extern CBlockIndex* pindexGenesisBlock;
66 extern unsigned int nStakeMinAge;
67 extern unsigned int nNodeLifespan;
68 extern int nCoinbaseMaturity;
69 extern int nBestHeight;
70 extern uint256 nBestChainTrust;
71 extern uint256 nBestInvalidTrust;
72 extern uint256 hashBestChain;
73 extern CBlockIndex* pindexBest;
74 extern unsigned int nTransactionsUpdated;
75 extern uint64 nLastBlockTx;
76 extern uint64 nLastBlockSize;
77 extern int64 nLastCoinStakeSearchInterval;
78 extern const std::string strMessageMagic;
79 extern int64 nTimeBestReceived;
80 extern CCriticalSection cs_setpwalletRegistered;
81 extern std::set<CWallet*> setpwalletRegistered;
82 extern unsigned char pchMessageStart[4];
83 extern std::map<uint256, CBlock*> mapOrphanBlocks;
86 extern int64 nTransactionFee;
87 extern int64 nMinimumInputValue;
88 extern bool fUseFastIndex;
89 extern unsigned int nDerivationMethodIndex;
91 // Minimum disk space required - used in CheckDiskSpace()
92 static const uint64 nMinDiskSpace = 52428800;
98 void RegisterWallet(CWallet* pwalletIn);
99 void UnregisterWallet(CWallet* pwalletIn);
100 void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false, bool fConnect = true);
101 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
102 bool CheckDiskSpace(uint64 nAdditionalBytes=0);
103 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
104 FILE* AppendBlockFile(unsigned int& nFileRet);
105 bool LoadBlockIndex(bool fAllowNew=true);
106 void PrintBlockTree();
107 CBlockIndex* FindBlockByHeight(int nHeight);
108 bool ProcessMessages(CNode* pfrom);
109 bool SendMessages(CNode* pto, bool fSendTrickle);
110 bool LoadExternalBlockFile(FILE* fileIn);
112 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
113 unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, bool fProofOfStake);
114 int64 GetProofOfWorkReward(unsigned int nBits, int64 nFees=0);
115 int64 GetProofOfStakeReward(int64 nCoinAge, unsigned int nBits, unsigned int nTime, bool bCoinYearOnly=false);
116 unsigned int ComputeMinWork(unsigned int nBase, int64 nTime);
117 unsigned int ComputeMinStake(unsigned int nBase, int64 nTime, unsigned int nBlockTime);
118 int GetNumBlocksOfPeers();
119 bool IsInitialBlockDownload();
120 std::string GetWarnings(std::string strFor);
121 bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock);
122 uint256 WantedByOrphan(const CBlock* pblockOrphan);
123 const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake);
124 void StakeMiner(CWallet *pwallet);
125 void ResendWalletTransactions();
127 bool VerifySignature(const CTransaction& txFrom, const CTransaction& txTo, unsigned int nIn, unsigned int flags, int nHashType);
137 bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
139 /** Position on disk for a particular transaction. */
144 unsigned int nBlockPos;
152 CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
155 nBlockPos = nBlockPosIn;
159 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
160 void SetNull() { nFile = (unsigned int) -1; nBlockPos = 0; nTxPos = 0; }
161 bool IsNull() const { return (nFile == (unsigned int) -1); }
163 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
165 return (a.nFile == b.nFile &&
166 a.nBlockPos == b.nBlockPos &&
167 a.nTxPos == b.nTxPos);
170 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
176 std::string ToString() const
181 return strprintf("(nFile=%u, nBlockPos=%u, nTxPos=%u)", nFile, nBlockPos, nTxPos);
186 printf("%s", ToString().c_str());
192 /** An inpoint - a combination of a transaction and an index n into its vin */
199 CInPoint() { SetNull(); }
200 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
201 void SetNull() { ptx = NULL; n = (unsigned int) -1; }
202 bool IsNull() const { return (ptx == NULL && n == (unsigned int) -1); }
207 /** An outpoint - a combination of a transaction hash and an index n into its vout */
214 COutPoint() { SetNull(); }
215 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
216 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
217 void SetNull() { hash = 0; n = (unsigned int) -1; }
218 bool IsNull() const { return (hash == 0 && n == (unsigned int) -1); }
220 friend bool operator<(const COutPoint& a, const COutPoint& b)
222 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
225 friend bool operator==(const COutPoint& a, const COutPoint& b)
227 return (a.hash == b.hash && a.n == b.n);
230 friend bool operator!=(const COutPoint& a, const COutPoint& b)
235 std::string ToString() const
237 return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10).c_str(), n);
242 printf("%s\n", ToString().c_str());
249 /** An input of a transaction. It contains the location of the previous
250 * transaction's output that it claims and a signature that matches the
251 * output's public key.
258 unsigned int nSequence;
262 nSequence = std::numeric_limits<unsigned int>::max();
265 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
268 scriptSig = scriptSigIn;
269 nSequence = nSequenceIn;
272 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
274 prevout = COutPoint(hashPrevTx, nOut);
275 scriptSig = scriptSigIn;
276 nSequence = nSequenceIn;
282 READWRITE(scriptSig);
283 READWRITE(nSequence);
288 return (nSequence == std::numeric_limits<unsigned int>::max());
291 friend bool operator==(const CTxIn& a, const CTxIn& b)
293 return (a.prevout == b.prevout &&
294 a.scriptSig == b.scriptSig &&
295 a.nSequence == b.nSequence);
298 friend bool operator!=(const CTxIn& a, const CTxIn& b)
303 std::string ToStringShort() const
305 return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n);
308 std::string ToString() const
312 str += prevout.ToString();
313 if (prevout.IsNull())
314 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
316 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
317 if (nSequence != std::numeric_limits<unsigned int>::max())
318 str += strprintf(", nSequence=%u", nSequence);
325 printf("%s\n", ToString().c_str());
332 /** An output of a transaction. It contains the public key that the next input
333 * must be able to sign with to claim it.
339 CScript scriptPubKey;
346 CTxOut(int64 nValueIn, CScript scriptPubKeyIn)
349 scriptPubKey = scriptPubKeyIn;
355 READWRITE(scriptPubKey);
361 scriptPubKey.clear();
366 return (nValue == -1);
372 scriptPubKey.clear();
377 return (nValue == 0 && scriptPubKey.empty());
380 uint256 GetHash() const
382 return SerializeHash(*this);
385 friend bool operator==(const CTxOut& a, const CTxOut& b)
387 return (a.nValue == b.nValue &&
388 a.scriptPubKey == b.scriptPubKey);
391 friend bool operator!=(const CTxOut& a, const CTxOut& b)
396 std::string ToStringShort() const
398 return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString(true).c_str());
401 std::string ToString() const
403 if (IsEmpty()) return "CTxOut(empty)";
404 if (scriptPubKey.size() < 6)
405 return "CTxOut(error)";
406 return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().c_str());
411 printf("%s\n", ToString().c_str());
425 typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
427 /** The basic transaction that is broadcasted on the network and contained in
428 * blocks. A transaction can contain multiple inputs and outputs.
433 static const int CURRENT_VERSION=1;
436 std::vector<CTxIn> vin;
437 std::vector<CTxOut> vout;
438 unsigned int nLockTime;
440 // Denial-of-service detection:
442 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
451 READWRITE(this->nVersion);
452 nVersion = this->nVersion;
456 READWRITE(nLockTime);
461 nVersion = CTransaction::CURRENT_VERSION;
462 nTime = GetAdjustedTime();
466 nDoS = 0; // Denial-of-service prevention
471 return (vin.empty() && vout.empty());
474 uint256 GetHash() const
476 return SerializeHash(*this);
479 bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const
481 // Time based nLockTime implemented in 0.1.6
484 if (nBlockHeight == 0)
485 nBlockHeight = nBestHeight;
487 nBlockTime = GetAdjustedTime();
488 if ((int64)nLockTime < ((int64)nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime))
490 BOOST_FOREACH(const CTxIn& txin, vin)
496 bool IsNewerThan(const CTransaction& old) const
498 if (vin.size() != old.vin.size())
500 for (unsigned int i = 0; i < vin.size(); i++)
501 if (vin[i].prevout != old.vin[i].prevout)
505 unsigned int nLowest = std::numeric_limits<unsigned int>::max();
506 for (unsigned int i = 0; i < vin.size(); i++)
508 if (vin[i].nSequence != old.vin[i].nSequence)
510 if (vin[i].nSequence <= nLowest)
513 nLowest = vin[i].nSequence;
515 if (old.vin[i].nSequence < nLowest)
518 nLowest = old.vin[i].nSequence;
525 bool IsCoinBase() const
527 return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() >= 1);
530 bool IsCoinStake() const
532 // ppcoin: the coin stake transaction is marked with the first output empty
533 return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty());
536 /** Check for standard transaction types
537 @return True if all outputs (scriptPubKeys) use only standard transaction forms
539 bool IsStandard() const;
541 /** Check for standard transaction types
542 @param[in] mapInputs Map of previous transactions that have outputs we're spending
543 @return True if all inputs (scriptSigs) use only standard transaction forms
544 @see CTransaction::FetchInputs
546 bool AreInputsStandard(const MapPrevTx& mapInputs) const;
548 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
549 @return number of sigops this transaction's outputs will produce when spent
550 @see CTransaction::FetchInputs
552 unsigned int GetLegacySigOpCount() const;
554 /** Count ECDSA signature operations in pay-to-script-hash inputs.
556 @param[in] mapInputs Map of previous transactions that have outputs we're spending
557 @return maximum number of sigops required to validate this transaction's inputs
558 @see CTransaction::FetchInputs
560 unsigned int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
562 /** Amount of bitcoins spent by this transaction.
563 @return sum of all outputs (note: does not include fees)
565 int64 GetValueOut() const
568 BOOST_FOREACH(const CTxOut& txout, vout)
570 nValueOut += txout.nValue;
571 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
572 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
577 /** Amount of bitcoins coming in to this transaction
578 Note that lightweight clients may not know anything besides the hash of previous transactions,
579 so may not be able to calculate this.
581 @param[in] mapInputs Map of previous transactions that have outputs we're spending
582 @return Sum of value of all inputs (scriptSigs)
583 @see CTransaction::FetchInputs
585 int64 GetValueIn(const MapPrevTx& mapInputs) const;
587 static bool AllowFree(double dPriority)
589 // Large (in bytes) low-priority (new, small-coin) transactions
591 return dPriority > COIN * 144 / 250;
594 int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=false, enum GetMinFee_mode mode=GMF_BLOCK, unsigned int nBytes = 0) const;
596 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
598 CAutoFile filein = CAutoFile(OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb"), SER_DISK, CLIENT_VERSION);
600 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
603 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
604 return error("CTransaction::ReadFromDisk() : fseek failed");
609 catch (std::exception &e) {
610 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
613 // Return file pointer
616 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
617 return error("CTransaction::ReadFromDisk() : second fseek failed");
618 *pfileRet = filein.release();
623 friend bool operator==(const CTransaction& a, const CTransaction& b)
625 return (a.nVersion == b.nVersion &&
626 a.nTime == b.nTime &&
629 a.nLockTime == b.nLockTime);
632 friend bool operator!=(const CTransaction& a, const CTransaction& b)
637 std::string ToStringShort() const
640 str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user"));
644 std::string ToString() const
647 str += IsCoinBase()? "Coinbase" : (IsCoinStake()? "Coinstake" : "CTransaction");
648 str += strprintf("(hash=%s, nTime=%d, ver=%d, vin.size=%"PRIszu", vout.size=%"PRIszu", nLockTime=%d)\n",
649 GetHash().ToString().substr(0,10).c_str(),
655 for (unsigned int i = 0; i < vin.size(); i++)
656 str += " " + vin[i].ToString() + "\n";
657 for (unsigned int i = 0; i < vout.size(); i++)
658 str += " " + vout[i].ToString() + "\n";
664 printf("%s", ToString().c_str());
668 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
669 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
670 bool ReadFromDisk(COutPoint prevout);
671 bool DisconnectInputs(CTxDB& txdb);
673 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
675 @param[in] txdb Transaction database
676 @param[in] mapTestPool List of pending changes to the transaction index database
677 @param[in] fBlock True if being called to add a new best-block to the chain
678 @param[in] fMiner True if being called by CreateNewBlock
679 @param[out] inputsRet Pointers to this transaction's inputs
680 @param[out] fInvalid returns true if transaction is invalid
681 @return Returns true if all inputs are in txdb or mapTestPool
683 bool FetchInputs(CTxDB& txdb, const std::map<uint256, CTxIndex>& mapTestPool,
684 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
686 /** Sanity check previous transactions, then, if all checks succeed,
687 mark them as spent by this transaction.
689 @param[in] inputs Previous transactions (from FetchInputs)
690 @param[out] mapTestPool Keeps track of inputs that need to be updated on disk
691 @param[in] posThisTx Position of this transaction on disk
692 @param[in] pindexBlock
693 @param[in] fBlock true if called from ConnectBlock
694 @param[in] fMiner true if called from CreateNewBlock
695 @param[in] fStrictPayToScriptHash true if fully validating p2sh transactions
696 @return Returns true if all checks succeed
698 bool ConnectInputs(CTxDB& txdb, MapPrevTx inputs,
699 std::map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx,
700 const CBlockIndex* pindexBlock, bool fBlock, bool fMiner, unsigned int flags=STANDARD_SCRIPT_VERIFY_FLAGS);
701 bool ClientConnectInputs();
702 bool CheckTransaction() const;
703 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
704 bool GetCoinAge(CTxDB& txdb, uint64& nCoinAge) const; // ppcoin: get transaction coin age
707 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
714 /** A transaction with a merkle branch linking it to the block chain. */
715 class CMerkleTx : public CTransaction
719 std::vector<uint256> vMerkleBranch;
723 mutable bool fMerkleVerified;
731 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
740 fMerkleVerified = false;
746 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
747 nVersion = this->nVersion;
748 READWRITE(hashBlock);
749 READWRITE(vMerkleBranch);
754 int SetMerkleBranch(const CBlock* pblock=NULL);
755 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
756 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
757 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
758 int GetBlocksToMaturity() const;
759 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
760 bool AcceptToMemoryPool();
766 /** A txdb record that contains the disk location of a transaction and the
767 * locations of transactions that spend its outputs. vSpent is really only
768 * used as a flag, but having the location is very helpful for debugging.
774 std::vector<CDiskTxPos> vSpent;
781 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
784 vSpent.resize(nOutputs);
789 if (!(nType & SER_GETHASH))
806 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
808 return (a.pos == b.pos &&
809 a.vSpent == b.vSpent);
812 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
816 int GetDepthInMainChain() const;
824 /** Nodes collect new transactions into a block, hash them into a hash tree,
825 * and scan through nonce values to make the block's hash satisfy proof-of-work
826 * requirements. When they solve the proof-of-work, they broadcast the block
827 * to everyone and the block is added to the block chain. The first transaction
828 * in the block is a special one that creates a new coin owned by the creator
831 * Blocks are appended to blk0001.dat files on disk. Their location on disk
832 * is indexed by CBlockIndex objects in memory.
838 static const int CURRENT_VERSION=6;
840 uint256 hashPrevBlock;
841 uint256 hashMerkleRoot;
847 std::vector<CTransaction> vtx;
849 // ppcoin: block signature - signed by one of the coin base txout[N]'s owner
850 std::vector<unsigned char> vchBlockSig;
853 mutable std::vector<uint256> vMerkleTree;
855 // Denial-of-service detection:
857 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
866 READWRITE(this->nVersion);
867 nVersion = this->nVersion;
868 READWRITE(hashPrevBlock);
869 READWRITE(hashMerkleRoot);
874 // ConnectBlock depends on vtx following header to generate CDiskTxPos
875 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
878 READWRITE(vchBlockSig);
882 const_cast<CBlock*>(this)->vtx.clear();
883 const_cast<CBlock*>(this)->vchBlockSig.clear();
889 nVersion = CBlock::CURRENT_VERSION;
906 uint256 GetHash() const
908 return scrypt_blockhash(CVOIDBEGIN(nVersion));
911 int64 GetBlockTime() const
916 void UpdateTime(const CBlockIndex* pindexPrev);
918 // ppcoin: entropy bit for stake modifier if chosen by modifier
919 unsigned int GetStakeEntropyBit(unsigned int nTime) const
921 // Protocol switch to support p2pool at novacoin block #9689
922 if (nTime >= ENTROPY_SWITCH_TIME || fTestNet)
924 // Take last bit of block hash as entropy bit
925 unsigned int nEntropyBit = ((GetHash().Get64()) & 1llu);
926 if (fDebug && GetBoolArg("-printstakemodifier"))
927 printf("GetStakeEntropyBit: nTime=%u hashBlock=%s nEntropyBit=%u\n", nTime, GetHash().ToString().c_str(), nEntropyBit);
930 // Before novacoin block #9689 - old protocol
931 uint160 hashSig = Hash160(vchBlockSig);
932 if (fDebug && GetBoolArg("-printstakemodifier"))
933 printf("GetStakeEntropyBit: hashSig=%s", hashSig.ToString().c_str());
934 hashSig >>= 159; // take the first bit of the hash
935 if (fDebug && GetBoolArg("-printstakemodifier"))
936 printf(" entropybit=%"PRI64d"\n", hashSig.Get64());
937 return hashSig.Get64();
940 // ppcoin: two types of block: proof-of-work or proof-of-stake
941 bool IsProofOfStake() const
943 return (vtx.size() > 1 && vtx[1].IsCoinStake());
946 bool IsProofOfWork() const
948 return !IsProofOfStake();
951 std::pair<COutPoint, unsigned int> GetProofOfStake() const
953 return IsProofOfStake()? std::make_pair(vtx[1].vin[0].prevout, vtx[1].nTime) : std::make_pair(COutPoint(), (unsigned int)0);
956 // ppcoin: get max transaction timestamp
957 int64 GetMaxTransactionTime() const
959 int64 maxTransactionTime = 0;
960 BOOST_FOREACH(const CTransaction& tx, vtx)
961 maxTransactionTime = std::max(maxTransactionTime, (int64)tx.nTime);
962 return maxTransactionTime;
965 uint256 BuildMerkleTree() const
968 BOOST_FOREACH(const CTransaction& tx, vtx)
969 vMerkleTree.push_back(tx.GetHash());
971 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
973 for (int i = 0; i < nSize; i += 2)
975 int i2 = std::min(i+1, nSize-1);
976 vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
977 BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
981 return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
984 std::vector<uint256> GetMerkleBranch(int nIndex) const
986 if (vMerkleTree.empty())
988 std::vector<uint256> vMerkleBranch;
990 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
992 int i = std::min(nIndex^1, nSize-1);
993 vMerkleBranch.push_back(vMerkleTree[j+i]);
997 return vMerkleBranch;
1000 static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
1004 BOOST_FOREACH(const uint256& otherside, vMerkleBranch)
1007 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
1009 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
1016 bool WriteToDisk(unsigned int& nFileRet, unsigned int& nBlockPosRet)
1018 // Open history file to append
1019 CAutoFile fileout = CAutoFile(AppendBlockFile(nFileRet), SER_DISK, CLIENT_VERSION);
1021 return error("CBlock::WriteToDisk() : AppendBlockFile failed");
1023 // Write index header
1024 unsigned int nSize = fileout.GetSerializeSize(*this);
1025 fileout << FLATDATA(pchMessageStart) << nSize;
1028 long fileOutPos = ftell(fileout);
1030 return error("CBlock::WriteToDisk() : ftell failed");
1031 nBlockPosRet = fileOutPos;
1034 // Flush stdio buffers and commit to disk before returning
1036 if (!IsInitialBlockDownload() || (nBestHeight+1) % 500 == 0)
1037 FileCommit(fileout);
1042 bool ReadFromDisk(unsigned int nFile, unsigned int nBlockPos, bool fReadTransactions=true)
1046 // Open history file to read
1047 CAutoFile filein = CAutoFile(OpenBlockFile(nFile, nBlockPos, "rb"), SER_DISK, CLIENT_VERSION);
1049 return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
1050 if (!fReadTransactions)
1051 filein.nType |= SER_BLOCKHEADERONLY;
1057 catch (std::exception &e) {
1058 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
1062 if (fReadTransactions && IsProofOfWork() && !CheckProofOfWork(GetHash(), nBits))
1063 return error("CBlock::ReadFromDisk() : errors in block header");
1072 printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%"PRIszu", vchBlockSig=%s)\n",
1073 GetHash().ToString().c_str(),
1075 hashPrevBlock.ToString().c_str(),
1076 hashMerkleRoot.ToString().c_str(),
1077 nTime, nBits, nNonce,
1079 HexStr(vchBlockSig.begin(), vchBlockSig.end()).c_str());
1080 for (unsigned int i = 0; i < vtx.size(); i++)
1085 printf(" vMerkleTree: ");
1086 for (unsigned int i = 0; i < vMerkleTree.size(); i++)
1087 printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
1092 bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1093 bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck=false);
1094 bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
1095 bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
1096 bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
1097 bool CheckBlock(bool fCheckPOW=true, bool fCheckMerkleRoot=true, bool fCheckSig=true) const;
1099 bool GetCoinAge(uint64& nCoinAge) const; // ppcoin: calculate total coin age spent in block
1100 bool SignBlock(CWallet& keystore);
1101 bool CheckBlockSignature(bool fProofOfStake) const;
1104 bool SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew);
1112 /** The block chain is a tree shaped structure starting with the
1113 * genesis block at the root, with each block potentially having multiple
1114 * candidates to be the next block. pprev and pnext link a path through the
1115 * main/longest chain. A blockindex may have multiple pprev pointing back
1116 * to it, but pnext will only point forward to the longest branch, or will
1117 * be null if the block is not part of the longest chain.
1122 const uint256* phashBlock;
1126 unsigned int nBlockPos;
1127 uint256 nChainTrust; // ppcoin: trust score of block chain
1133 unsigned int nFlags; // ppcoin: block index flags
1136 BLOCK_PROOF_OF_STAKE = (1 << 0), // is proof-of-stake block
1137 BLOCK_STAKE_ENTROPY = (1 << 1), // entropy bit for stake modifier
1138 BLOCK_STAKE_MODIFIER = (1 << 2), // regenerated stake modifier
1141 uint64 nStakeModifier; // hash modifier for proof-of-stake
1142 unsigned int nStakeModifierChecksum; // checksum of index; in-memeory only
1144 // proof-of-stake specific fields
1145 COutPoint prevoutStake;
1146 unsigned int nStakeTime;
1147 uint256 hashProofOfStake;
1151 uint256 hashMerkleRoot;
1154 unsigned int nNonce;
1169 nStakeModifierChecksum = 0;
1170 hashProofOfStake = 0;
1171 prevoutStake.SetNull();
1181 CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block)
1187 nBlockPos = nBlockPosIn;
1194 nStakeModifierChecksum = 0;
1195 hashProofOfStake = 0;
1196 if (block.IsProofOfStake())
1199 prevoutStake = block.vtx[1].vin[0].prevout;
1200 nStakeTime = block.vtx[1].nTime;
1204 prevoutStake.SetNull();
1208 nVersion = block.nVersion;
1209 hashMerkleRoot = block.hashMerkleRoot;
1210 nTime = block.nTime;
1211 nBits = block.nBits;
1212 nNonce = block.nNonce;
1215 CBlock GetBlockHeader() const
1218 block.nVersion = nVersion;
1220 block.hashPrevBlock = pprev->GetBlockHash();
1221 block.hashMerkleRoot = hashMerkleRoot;
1222 block.nTime = nTime;
1223 block.nBits = nBits;
1224 block.nNonce = nNonce;
1228 uint256 GetBlockHash() const
1233 int64 GetBlockTime() const
1235 return (int64)nTime;
1238 uint256 GetBlockTrust() const;
1240 bool IsInMainChain() const
1242 return (pnext || this == pindexBest);
1245 bool CheckIndex() const
1250 enum { nMedianTimeSpan=11 };
1252 int64 GetMedianTimePast() const
1254 int64 pmedian[nMedianTimeSpan];
1255 int64* pbegin = &pmedian[nMedianTimeSpan];
1256 int64* pend = &pmedian[nMedianTimeSpan];
1258 const CBlockIndex* pindex = this;
1259 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1260 *(--pbegin) = pindex->GetBlockTime();
1262 std::sort(pbegin, pend);
1263 return pbegin[(pend - pbegin)/2];
1266 int64 GetMedianTime() const
1268 const CBlockIndex* pindex = this;
1269 for (int i = 0; i < nMedianTimeSpan/2; i++)
1272 return GetBlockTime();
1273 pindex = pindex->pnext;
1275 return pindex->GetMedianTimePast();
1279 * Returns true if there are nRequired or more blocks of minVersion or above
1280 * in the last nToCheck blocks, starting at pstart and going backwards.
1282 static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart,
1283 unsigned int nRequired, unsigned int nToCheck);
1286 bool IsProofOfWork() const
1288 return !(nFlags & BLOCK_PROOF_OF_STAKE);
1291 bool IsProofOfStake() const
1293 return (nFlags & BLOCK_PROOF_OF_STAKE);
1296 void SetProofOfStake()
1298 nFlags |= BLOCK_PROOF_OF_STAKE;
1301 unsigned int GetStakeEntropyBit() const
1303 return ((nFlags & BLOCK_STAKE_ENTROPY) >> 1);
1306 bool SetStakeEntropyBit(unsigned int nEntropyBit)
1308 if (nEntropyBit > 1)
1310 nFlags |= (nEntropyBit? BLOCK_STAKE_ENTROPY : 0);
1314 bool GeneratedStakeModifier() const
1316 return (nFlags & BLOCK_STAKE_MODIFIER);
1319 void SetStakeModifier(uint64 nModifier, bool fGeneratedStakeModifier)
1321 nStakeModifier = nModifier;
1322 if (fGeneratedStakeModifier)
1323 nFlags |= BLOCK_STAKE_MODIFIER;
1326 std::string ToString() const
1328 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)",
1329 pprev, pnext, nFile, nBlockPos, nHeight,
1330 FormatMoney(nMint).c_str(), FormatMoney(nMoneySupply).c_str(),
1331 GeneratedStakeModifier() ? "MOD" : "-", GetStakeEntropyBit(), IsProofOfStake()? "PoS" : "PoW",
1332 nStakeModifier, nStakeModifierChecksum,
1333 hashProofOfStake.ToString().c_str(),
1334 prevoutStake.ToString().c_str(), nStakeTime,
1335 hashMerkleRoot.ToString().c_str(),
1336 GetBlockHash().ToString().c_str());
1341 printf("%s\n", ToString().c_str());
1347 /** Used to marshal pointers into hashes for db storage. */
1348 class CDiskBlockIndex : public CBlockIndex
1364 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1366 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1367 hashNext = (pnext ? pnext->GetBlockHash() : 0);
1372 if (!(nType & SER_GETHASH))
1373 READWRITE(nVersion);
1375 READWRITE(hashNext);
1377 READWRITE(nBlockPos);
1380 READWRITE(nMoneySupply);
1382 READWRITE(nStakeModifier);
1383 if (IsProofOfStake())
1385 READWRITE(prevoutStake);
1386 READWRITE(nStakeTime);
1387 READWRITE(hashProofOfStake);
1391 const_cast<CDiskBlockIndex*>(this)->prevoutStake.SetNull();
1392 const_cast<CDiskBlockIndex*>(this)->nStakeTime = 0;
1393 const_cast<CDiskBlockIndex*>(this)->hashProofOfStake = 0;
1397 READWRITE(this->nVersion);
1398 READWRITE(hashPrev);
1399 READWRITE(hashMerkleRoot);
1403 READWRITE(blockHash);
1406 uint256 GetBlockHash() const
1408 if (fUseFastIndex && (nTime < GetAdjustedTime() - 24 * 60 * 60) && blockHash != 0)
1412 block.nVersion = nVersion;
1413 block.hashPrevBlock = hashPrev;
1414 block.hashMerkleRoot = hashMerkleRoot;
1415 block.nTime = nTime;
1416 block.nBits = nBits;
1417 block.nNonce = nNonce;
1419 const_cast<CDiskBlockIndex*>(this)->blockHash = block.GetHash();
1424 std::string ToString() const
1426 std::string str = "CDiskBlockIndex(";
1427 str += CBlockIndex::ToString();
1428 str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
1429 GetBlockHash().ToString().c_str(),
1430 hashPrev.ToString().c_str(),
1431 hashNext.ToString().c_str());
1437 printf("%s\n", ToString().c_str());
1448 /** Describes a place in the block chain to another node such that if the
1449 * other node doesn't have the same branch, it can find a recent common trunk.
1450 * The further back it is, the further before the fork it may be.
1455 std::vector<uint256> vHave;
1462 explicit CBlockLocator(const CBlockIndex* pindex)
1467 explicit CBlockLocator(uint256 hashBlock)
1469 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1470 if (mi != mapBlockIndex.end())
1474 CBlockLocator(const std::vector<uint256>& vHaveIn)
1481 if (!(nType & SER_GETHASH))
1482 READWRITE(nVersion);
1493 return vHave.empty();
1496 void Set(const CBlockIndex* pindex)
1502 vHave.push_back(pindex->GetBlockHash());
1504 // Exponentially larger steps back
1505 for (int i = 0; pindex && i < nStep; i++)
1506 pindex = pindex->pprev;
1507 if (vHave.size() > 10)
1510 vHave.push_back((!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet));
1513 int GetDistanceBack()
1515 // Retrace how far back it was in the sender's branch
1518 BOOST_FOREACH(const uint256& hash, vHave)
1520 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1521 if (mi != mapBlockIndex.end())
1523 CBlockIndex* pindex = (*mi).second;
1524 if (pindex->IsInMainChain())
1534 CBlockIndex* GetBlockIndex()
1536 // Find the first block the caller has in the main chain
1537 BOOST_FOREACH(const uint256& hash, vHave)
1539 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1540 if (mi != mapBlockIndex.end())
1542 CBlockIndex* pindex = (*mi).second;
1543 if (pindex->IsInMainChain())
1547 return pindexGenesisBlock;
1550 uint256 GetBlockHash()
1552 // Find the first block the caller has in the main chain
1553 BOOST_FOREACH(const uint256& hash, vHave)
1555 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1556 if (mi != mapBlockIndex.end())
1558 CBlockIndex* pindex = (*mi).second;
1559 if (pindex->IsInMainChain())
1563 return (!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet);
1568 CBlockIndex* pindex = GetBlockIndex();
1571 return pindex->nHeight;
1585 mutable CCriticalSection cs;
1586 std::map<uint256, CTransaction> mapTx;
1587 std::map<COutPoint, CInPoint> mapNextTx;
1589 bool accept(CTxDB& txdb, CTransaction &tx,
1590 bool fCheckInputs, bool* pfMissingInputs);
1591 bool addUnchecked(const uint256& hash, CTransaction &tx);
1592 bool remove(CTransaction &tx);
1594 void queryHashes(std::vector<uint256>& vtxid);
1596 unsigned long size()
1599 return mapTx.size();
1602 bool exists(uint256 hash)
1604 return (mapTx.count(hash) != 0);
1607 CTransaction& lookup(uint256 hash)
1613 extern CTxMemPool mempool;