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;
103 void RegisterWallet(CWallet* pwalletIn);
104 void UnregisterWallet(CWallet* pwalletIn);
105 void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false, bool fConnect = true);
106 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
107 bool CheckDiskSpace(uint64 nAdditionalBytes=0);
108 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
109 FILE* AppendBlockFile(unsigned int& nFileRet);
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();
141 bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
143 /** Position on disk for a particular transaction. */
148 unsigned int nBlockPos;
156 CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
159 nBlockPos = nBlockPosIn;
163 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
164 void SetNull() { nFile = (unsigned int) -1; nBlockPos = 0; nTxPos = 0; }
165 bool IsNull() const { return (nFile == (unsigned int) -1); }
167 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
169 return (a.nFile == b.nFile &&
170 a.nBlockPos == b.nBlockPos &&
171 a.nTxPos == b.nTxPos);
174 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
180 std::string ToString() const
185 return strprintf("(nFile=%u, nBlockPos=%u, nTxPos=%u)", nFile, nBlockPos, nTxPos);
190 printf("%s", ToString().c_str());
196 /** An inpoint - a combination of a transaction and an index n into its vin */
203 CInPoint() { SetNull(); }
204 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
205 void SetNull() { ptx = NULL; n = (unsigned int) -1; }
206 bool IsNull() const { return (ptx == NULL && n == (unsigned int) -1); }
211 /** An outpoint - a combination of a transaction hash and an index n into its vout */
218 COutPoint() { SetNull(); }
219 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
220 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
221 void SetNull() { hash = 0; n = (unsigned int) -1; }
222 bool IsNull() const { return (hash == 0 && n == (unsigned int) -1); }
224 friend bool operator<(const COutPoint& a, const COutPoint& b)
226 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
229 friend bool operator==(const COutPoint& a, const COutPoint& b)
231 return (a.hash == b.hash && a.n == b.n);
234 friend bool operator!=(const COutPoint& a, const COutPoint& b)
239 std::string ToString() const
241 return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10).c_str(), n);
246 printf("%s\n", ToString().c_str());
253 /** An input of a transaction. It contains the location of the previous
254 * transaction's output that it claims and a signature that matches the
255 * output's public key.
262 unsigned int nSequence;
266 nSequence = std::numeric_limits<unsigned int>::max();
269 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
272 scriptSig = scriptSigIn;
273 nSequence = nSequenceIn;
276 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
278 prevout = COutPoint(hashPrevTx, nOut);
279 scriptSig = scriptSigIn;
280 nSequence = nSequenceIn;
286 READWRITE(scriptSig);
287 READWRITE(nSequence);
292 return (nSequence == std::numeric_limits<unsigned int>::max());
295 friend bool operator==(const CTxIn& a, const CTxIn& b)
297 return (a.prevout == b.prevout &&
298 a.scriptSig == b.scriptSig &&
299 a.nSequence == b.nSequence);
302 friend bool operator!=(const CTxIn& a, const CTxIn& b)
307 std::string ToStringShort() const
309 return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n);
312 std::string ToString() const
316 str += prevout.ToString();
317 if (prevout.IsNull())
318 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
320 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
321 if (nSequence != std::numeric_limits<unsigned int>::max())
322 str += strprintf(", nSequence=%u", nSequence);
329 printf("%s\n", ToString().c_str());
336 /** An output of a transaction. It contains the public key that the next input
337 * must be able to sign with to claim it.
343 CScript scriptPubKey;
350 CTxOut(int64 nValueIn, CScript scriptPubKeyIn)
353 scriptPubKey = scriptPubKeyIn;
359 READWRITE(scriptPubKey);
365 scriptPubKey.clear();
370 return (nValue == -1);
376 scriptPubKey.clear();
381 return (nValue == 0 && scriptPubKey.empty());
384 uint256 GetHash() const
386 return SerializeHash(*this);
389 friend bool operator==(const CTxOut& a, const CTxOut& b)
391 return (a.nValue == b.nValue &&
392 a.scriptPubKey == b.scriptPubKey);
395 friend bool operator!=(const CTxOut& a, const CTxOut& b)
400 std::string ToStringShort() const
402 return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString(true).c_str());
405 std::string ToString() const
407 if (IsEmpty()) return "CTxOut(empty)";
408 if (scriptPubKey.size() < 6)
409 return "CTxOut(error)";
410 return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().c_str());
415 printf("%s\n", ToString().c_str());
429 typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
431 /** The basic transaction that is broadcasted on the network and contained in
432 * blocks. A transaction can contain multiple inputs and outputs.
437 static const int CURRENT_VERSION=1;
440 std::vector<CTxIn> vin;
441 std::vector<CTxOut> vout;
442 unsigned int nLockTime;
444 // Denial-of-service detection:
446 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
455 READWRITE(this->nVersion);
456 nVersion = this->nVersion;
460 READWRITE(nLockTime);
465 nVersion = CTransaction::CURRENT_VERSION;
466 nTime = GetAdjustedTime();
470 nDoS = 0; // Denial-of-service prevention
475 return (vin.empty() && vout.empty());
478 uint256 GetHash() const
480 return SerializeHash(*this);
483 bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const
485 // Time based nLockTime implemented in 0.1.6
488 if (nBlockHeight == 0)
489 nBlockHeight = nBestHeight;
491 nBlockTime = GetAdjustedTime();
492 if ((int64)nLockTime < ((int64)nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime))
494 BOOST_FOREACH(const CTxIn& txin, vin)
500 bool IsNewerThan(const CTransaction& old) const
502 if (vin.size() != old.vin.size())
504 for (unsigned int i = 0; i < vin.size(); i++)
505 if (vin[i].prevout != old.vin[i].prevout)
509 unsigned int nLowest = std::numeric_limits<unsigned int>::max();
510 for (unsigned int i = 0; i < vin.size(); i++)
512 if (vin[i].nSequence != old.vin[i].nSequence)
514 if (vin[i].nSequence <= nLowest)
517 nLowest = vin[i].nSequence;
519 if (old.vin[i].nSequence < nLowest)
522 nLowest = old.vin[i].nSequence;
529 bool IsCoinBase() const
531 return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() >= 1);
534 bool IsCoinStake() const
536 // ppcoin: the coin stake transaction is marked with the first output empty
537 return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty());
540 /** Check for standard transaction types
541 @return True if all outputs (scriptPubKeys) use only standard transaction forms
543 bool IsStandard() const;
545 /** Check for standard transaction types
546 @param[in] mapInputs Map of previous transactions that have outputs we're spending
547 @return True if all inputs (scriptSigs) use only standard transaction forms
548 @see CTransaction::FetchInputs
550 bool AreInputsStandard(const MapPrevTx& mapInputs) const;
552 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
553 @return number of sigops this transaction's outputs will produce when spent
554 @see CTransaction::FetchInputs
556 unsigned int GetLegacySigOpCount() const;
558 /** Count ECDSA signature operations in pay-to-script-hash inputs.
560 @param[in] mapInputs Map of previous transactions that have outputs we're spending
561 @return maximum number of sigops required to validate this transaction's inputs
562 @see CTransaction::FetchInputs
564 unsigned int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
566 /** Amount of bitcoins spent by this transaction.
567 @return sum of all outputs (note: does not include fees)
569 int64 GetValueOut() const
572 BOOST_FOREACH(const CTxOut& txout, vout)
574 nValueOut += txout.nValue;
575 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
576 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
581 /** Amount of bitcoins coming in to this transaction
582 Note that lightweight clients may not know anything besides the hash of previous transactions,
583 so may not be able to calculate this.
585 @param[in] mapInputs Map of previous transactions that have outputs we're spending
586 @return Sum of value of all inputs (scriptSigs)
587 @see CTransaction::FetchInputs
589 int64 GetValueIn(const MapPrevTx& mapInputs) const;
591 static bool AllowFree(double dPriority)
593 // Large (in bytes) low-priority (new, small-coin) transactions
595 return dPriority > COIN * 144 / 250;
598 int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=false, enum GetMinFee_mode mode=GMF_BLOCK, unsigned int nBytes = 0) const;
600 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
602 CAutoFile filein = CAutoFile(OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb"), SER_DISK, CLIENT_VERSION);
604 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
607 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
608 return error("CTransaction::ReadFromDisk() : fseek failed");
613 catch (std::exception &e) {
614 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
617 // Return file pointer
620 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
621 return error("CTransaction::ReadFromDisk() : second fseek failed");
622 *pfileRet = filein.release();
627 friend bool operator==(const CTransaction& a, const CTransaction& b)
629 return (a.nVersion == b.nVersion &&
630 a.nTime == b.nTime &&
633 a.nLockTime == b.nLockTime);
636 friend bool operator!=(const CTransaction& a, const CTransaction& b)
641 std::string ToStringShort() const
644 str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user"));
648 std::string ToString() const
651 str += IsCoinBase()? "Coinbase" : (IsCoinStake()? "Coinstake" : "CTransaction");
652 str += strprintf("(hash=%s, nTime=%d, ver=%d, vin.size=%"PRIszu", vout.size=%"PRIszu", nLockTime=%d)\n",
653 GetHash().ToString().substr(0,10).c_str(),
659 for (unsigned int i = 0; i < vin.size(); i++)
660 str += " " + vin[i].ToString() + "\n";
661 for (unsigned int i = 0; i < vout.size(); i++)
662 str += " " + vout[i].ToString() + "\n";
668 printf("%s", ToString().c_str());
672 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
673 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
674 bool ReadFromDisk(COutPoint prevout);
675 bool DisconnectInputs(CTxDB& txdb);
677 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
679 @param[in] txdb Transaction database
680 @param[in] mapTestPool List of pending changes to the transaction index database
681 @param[in] fBlock True if being called to add a new best-block to the chain
682 @param[in] fMiner True if being called by CreateNewBlock
683 @param[out] inputsRet Pointers to this transaction's inputs
684 @param[out] fInvalid returns true if transaction is invalid
685 @return Returns true if all inputs are in txdb or mapTestPool
687 bool FetchInputs(CTxDB& txdb, const std::map<uint256, CTxIndex>& mapTestPool,
688 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
690 /** Sanity check previous transactions, then, if all checks succeed,
691 mark them as spent by this transaction.
693 @param[in] inputs Previous transactions (from FetchInputs)
694 @param[out] mapTestPool Keeps track of inputs that need to be updated on disk
695 @param[in] posThisTx Position of this transaction on disk
696 @param[in] pindexBlock
697 @param[in] fBlock true if called from ConnectBlock
698 @param[in] fMiner true if called from CreateNewBlock
699 @param[in] fStrictPayToScriptHash true if fully validating p2sh transactions
700 @return Returns true if all checks succeed
702 bool ConnectInputs(CTxDB& txdb, MapPrevTx inputs,
703 std::map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx,
704 const CBlockIndex* pindexBlock, bool fBlock, bool fMiner, bool fStrictPayToScriptHash=true);
705 bool ClientConnectInputs();
706 bool CheckTransaction() const;
707 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
708 bool GetCoinAge(CTxDB& txdb, uint64& nCoinAge) const; // ppcoin: get transaction coin age
711 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
718 /** A transaction with a merkle branch linking it to the block chain. */
719 class CMerkleTx : public CTransaction
723 std::vector<uint256> vMerkleBranch;
727 mutable bool fMerkleVerified;
735 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
744 fMerkleVerified = false;
750 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
751 nVersion = this->nVersion;
752 READWRITE(hashBlock);
753 READWRITE(vMerkleBranch);
758 int SetMerkleBranch(const CBlock* pblock=NULL);
759 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
760 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
761 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
762 int GetBlocksToMaturity() const;
763 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
764 bool AcceptToMemoryPool();
770 /** A txdb record that contains the disk location of a transaction and the
771 * locations of transactions that spend its outputs. vSpent is really only
772 * used as a flag, but having the location is very helpful for debugging.
778 std::vector<CDiskTxPos> vSpent;
785 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
788 vSpent.resize(nOutputs);
793 if (!(nType & SER_GETHASH))
810 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
812 return (a.pos == b.pos &&
813 a.vSpent == b.vSpent);
816 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
820 int GetDepthInMainChain() const;
828 /** Nodes collect new transactions into a block, hash them into a hash tree,
829 * and scan through nonce values to make the block's hash satisfy proof-of-work
830 * requirements. When they solve the proof-of-work, they broadcast the block
831 * to everyone and the block is added to the block chain. The first transaction
832 * in the block is a special one that creates a new coin owned by the creator
835 * Blocks are appended to blk0001.dat files on disk. Their location on disk
836 * is indexed by CBlockIndex objects in memory.
842 static const int CURRENT_VERSION=6;
844 uint256 hashPrevBlock;
845 uint256 hashMerkleRoot;
851 std::vector<CTransaction> vtx;
853 // ppcoin: block signature - signed by one of the coin base txout[N]'s owner
854 std::vector<unsigned char> vchBlockSig;
857 mutable std::vector<uint256> vMerkleTree;
859 // Denial-of-service detection:
861 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
870 READWRITE(this->nVersion);
871 nVersion = this->nVersion;
872 READWRITE(hashPrevBlock);
873 READWRITE(hashMerkleRoot);
878 // ConnectBlock depends on vtx following header to generate CDiskTxPos
879 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
882 READWRITE(vchBlockSig);
886 const_cast<CBlock*>(this)->vtx.clear();
887 const_cast<CBlock*>(this)->vchBlockSig.clear();
893 nVersion = CBlock::CURRENT_VERSION;
910 uint256 GetHash() const
912 return scrypt_blockhash(CVOIDBEGIN(nVersion));
915 int64 GetBlockTime() const
920 void UpdateTime(const CBlockIndex* pindexPrev);
922 // ppcoin: entropy bit for stake modifier if chosen by modifier
923 unsigned int GetStakeEntropyBit(unsigned int nTime) const
925 // Protocol switch to support p2pool at novacoin block #9689
926 if (nTime >= ENTROPY_SWITCH_TIME || fTestNet)
928 // Take last bit of block hash as entropy bit
929 unsigned int nEntropyBit = ((GetHash().Get64()) & 1llu);
930 if (fDebug && GetBoolArg("-printstakemodifier"))
931 printf("GetStakeEntropyBit: nTime=%u hashBlock=%s nEntropyBit=%u\n", nTime, GetHash().ToString().c_str(), nEntropyBit);
934 // Before novacoin block #9689 - old protocol
935 uint160 hashSig = Hash160(vchBlockSig);
936 if (fDebug && GetBoolArg("-printstakemodifier"))
937 printf("GetStakeEntropyBit: hashSig=%s", hashSig.ToString().c_str());
938 hashSig >>= 159; // take the first bit of the hash
939 if (fDebug && GetBoolArg("-printstakemodifier"))
940 printf(" entropybit=%"PRI64d"\n", hashSig.Get64());
941 return hashSig.Get64();
944 // ppcoin: two types of block: proof-of-work or proof-of-stake
945 bool IsProofOfStake() const
947 return (vtx.size() > 1 && vtx[1].IsCoinStake());
950 bool IsProofOfWork() const
952 return !IsProofOfStake();
955 std::pair<COutPoint, unsigned int> GetProofOfStake() const
957 return IsProofOfStake()? std::make_pair(vtx[1].vin[0].prevout, vtx[1].nTime) : std::make_pair(COutPoint(), (unsigned int)0);
960 // ppcoin: get max transaction timestamp
961 int64 GetMaxTransactionTime() const
963 int64 maxTransactionTime = 0;
964 BOOST_FOREACH(const CTransaction& tx, vtx)
965 maxTransactionTime = std::max(maxTransactionTime, (int64)tx.nTime);
966 return maxTransactionTime;
969 uint256 BuildMerkleTree() const
972 BOOST_FOREACH(const CTransaction& tx, vtx)
973 vMerkleTree.push_back(tx.GetHash());
975 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
977 for (int i = 0; i < nSize; i += 2)
979 int i2 = std::min(i+1, nSize-1);
980 vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
981 BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
985 return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
988 std::vector<uint256> GetMerkleBranch(int nIndex) const
990 if (vMerkleTree.empty())
992 std::vector<uint256> vMerkleBranch;
994 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
996 int i = std::min(nIndex^1, nSize-1);
997 vMerkleBranch.push_back(vMerkleTree[j+i]);
1001 return vMerkleBranch;
1004 static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
1008 BOOST_FOREACH(const uint256& otherside, vMerkleBranch)
1011 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
1013 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
1020 bool WriteToDisk(unsigned int& nFileRet, unsigned int& nBlockPosRet)
1022 // Open history file to append
1023 CAutoFile fileout = CAutoFile(AppendBlockFile(nFileRet), SER_DISK, CLIENT_VERSION);
1025 return error("CBlock::WriteToDisk() : AppendBlockFile failed");
1027 // Write index header
1028 unsigned int nSize = fileout.GetSerializeSize(*this);
1029 fileout << FLATDATA(pchMessageStart) << nSize;
1032 long fileOutPos = ftell(fileout);
1034 return error("CBlock::WriteToDisk() : ftell failed");
1035 nBlockPosRet = fileOutPos;
1038 // Flush stdio buffers and commit to disk before returning
1040 if (!IsInitialBlockDownload() || (nBestHeight+1) % 500 == 0)
1041 FileCommit(fileout);
1046 bool ReadFromDisk(unsigned int nFile, unsigned int nBlockPos, bool fReadTransactions=true)
1050 // Open history file to read
1051 CAutoFile filein = CAutoFile(OpenBlockFile(nFile, nBlockPos, "rb"), SER_DISK, CLIENT_VERSION);
1053 return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
1054 if (!fReadTransactions)
1055 filein.nType |= SER_BLOCKHEADERONLY;
1061 catch (std::exception &e) {
1062 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
1066 if (fReadTransactions && IsProofOfWork() && !CheckProofOfWork(GetHash(), nBits))
1067 return error("CBlock::ReadFromDisk() : errors in block header");
1076 printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%"PRIszu", vchBlockSig=%s)\n",
1077 GetHash().ToString().c_str(),
1079 hashPrevBlock.ToString().c_str(),
1080 hashMerkleRoot.ToString().c_str(),
1081 nTime, nBits, nNonce,
1083 HexStr(vchBlockSig.begin(), vchBlockSig.end()).c_str());
1084 for (unsigned int i = 0; i < vtx.size(); i++)
1089 printf(" vMerkleTree: ");
1090 for (unsigned int i = 0; i < vMerkleTree.size(); i++)
1091 printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
1096 bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1097 bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck=false);
1098 bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
1099 bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
1100 bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
1101 bool CheckBlock(bool fCheckPOW=true, bool fCheckMerkleRoot=true, bool fCheckSig=true) const;
1103 bool GetCoinAge(uint64& nCoinAge) const; // ppcoin: calculate total coin age spent in block
1104 bool SignBlock(CWallet& keystore);
1105 bool CheckBlockSignature(bool fProofOfStake) const;
1108 bool SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew);
1116 /** The block chain is a tree shaped structure starting with the
1117 * genesis block at the root, with each block potentially having multiple
1118 * candidates to be the next block. pprev and pnext link a path through the
1119 * main/longest chain. A blockindex may have multiple pprev pointing back
1120 * to it, but pnext will only point forward to the longest branch, or will
1121 * be null if the block is not part of the longest chain.
1126 const uint256* phashBlock;
1130 unsigned int nBlockPos;
1131 uint256 nChainTrust; // ppcoin: trust score of block chain
1137 unsigned int nFlags; // ppcoin: block index flags
1140 BLOCK_PROOF_OF_STAKE = (1 << 0), // is proof-of-stake block
1141 BLOCK_STAKE_ENTROPY = (1 << 1), // entropy bit for stake modifier
1142 BLOCK_STAKE_MODIFIER = (1 << 2), // regenerated stake modifier
1145 uint64 nStakeModifier; // hash modifier for proof-of-stake
1146 unsigned int nStakeModifierChecksum; // checksum of index; in-memeory only
1148 // proof-of-stake specific fields
1149 COutPoint prevoutStake;
1150 unsigned int nStakeTime;
1151 uint256 hashProofOfStake;
1155 uint256 hashMerkleRoot;
1158 unsigned int nNonce;
1173 nStakeModifierChecksum = 0;
1174 hashProofOfStake = 0;
1175 prevoutStake.SetNull();
1185 CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block)
1191 nBlockPos = nBlockPosIn;
1198 nStakeModifierChecksum = 0;
1199 hashProofOfStake = 0;
1200 if (block.IsProofOfStake())
1203 prevoutStake = block.vtx[1].vin[0].prevout;
1204 nStakeTime = block.vtx[1].nTime;
1208 prevoutStake.SetNull();
1212 nVersion = block.nVersion;
1213 hashMerkleRoot = block.hashMerkleRoot;
1214 nTime = block.nTime;
1215 nBits = block.nBits;
1216 nNonce = block.nNonce;
1219 CBlock GetBlockHeader() const
1222 block.nVersion = nVersion;
1224 block.hashPrevBlock = pprev->GetBlockHash();
1225 block.hashMerkleRoot = hashMerkleRoot;
1226 block.nTime = nTime;
1227 block.nBits = nBits;
1228 block.nNonce = nNonce;
1232 uint256 GetBlockHash() const
1237 int64 GetBlockTime() const
1239 return (int64)nTime;
1242 uint256 GetBlockTrust() const;
1244 bool IsInMainChain() const
1246 return (pnext || this == pindexBest);
1249 bool CheckIndex() const
1254 enum { nMedianTimeSpan=11 };
1256 int64 GetMedianTimePast() const
1258 int64 pmedian[nMedianTimeSpan];
1259 int64* pbegin = &pmedian[nMedianTimeSpan];
1260 int64* pend = &pmedian[nMedianTimeSpan];
1262 const CBlockIndex* pindex = this;
1263 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1264 *(--pbegin) = pindex->GetBlockTime();
1266 std::sort(pbegin, pend);
1267 return pbegin[(pend - pbegin)/2];
1270 int64 GetMedianTime() const
1272 const CBlockIndex* pindex = this;
1273 for (int i = 0; i < nMedianTimeSpan/2; i++)
1276 return GetBlockTime();
1277 pindex = pindex->pnext;
1279 return pindex->GetMedianTimePast();
1283 * Returns true if there are nRequired or more blocks of minVersion or above
1284 * in the last nToCheck blocks, starting at pstart and going backwards.
1286 static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart,
1287 unsigned int nRequired, unsigned int nToCheck);
1290 bool IsProofOfWork() const
1292 return !(nFlags & BLOCK_PROOF_OF_STAKE);
1295 bool IsProofOfStake() const
1297 return (nFlags & BLOCK_PROOF_OF_STAKE);
1300 void SetProofOfStake()
1302 nFlags |= BLOCK_PROOF_OF_STAKE;
1305 unsigned int GetStakeEntropyBit() const
1307 return ((nFlags & BLOCK_STAKE_ENTROPY) >> 1);
1310 bool SetStakeEntropyBit(unsigned int nEntropyBit)
1312 if (nEntropyBit > 1)
1314 nFlags |= (nEntropyBit? BLOCK_STAKE_ENTROPY : 0);
1318 bool GeneratedStakeModifier() const
1320 return (nFlags & BLOCK_STAKE_MODIFIER);
1323 void SetStakeModifier(uint64 nModifier, bool fGeneratedStakeModifier)
1325 nStakeModifier = nModifier;
1326 if (fGeneratedStakeModifier)
1327 nFlags |= BLOCK_STAKE_MODIFIER;
1330 std::string ToString() const
1332 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)",
1333 pprev, pnext, nFile, nBlockPos, nHeight,
1334 FormatMoney(nMint).c_str(), FormatMoney(nMoneySupply).c_str(),
1335 GeneratedStakeModifier() ? "MOD" : "-", GetStakeEntropyBit(), IsProofOfStake()? "PoS" : "PoW",
1336 nStakeModifier, nStakeModifierChecksum,
1337 hashProofOfStake.ToString().c_str(),
1338 prevoutStake.ToString().c_str(), nStakeTime,
1339 hashMerkleRoot.ToString().c_str(),
1340 GetBlockHash().ToString().c_str());
1345 printf("%s\n", ToString().c_str());
1351 /** Used to marshal pointers into hashes for db storage. */
1352 class CDiskBlockIndex : public CBlockIndex
1368 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1370 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1371 hashNext = (pnext ? pnext->GetBlockHash() : 0);
1376 if (!(nType & SER_GETHASH))
1377 READWRITE(nVersion);
1379 READWRITE(hashNext);
1381 READWRITE(nBlockPos);
1384 READWRITE(nMoneySupply);
1386 READWRITE(nStakeModifier);
1387 if (IsProofOfStake())
1389 READWRITE(prevoutStake);
1390 READWRITE(nStakeTime);
1391 READWRITE(hashProofOfStake);
1395 const_cast<CDiskBlockIndex*>(this)->prevoutStake.SetNull();
1396 const_cast<CDiskBlockIndex*>(this)->nStakeTime = 0;
1397 const_cast<CDiskBlockIndex*>(this)->hashProofOfStake = 0;
1401 READWRITE(this->nVersion);
1402 READWRITE(hashPrev);
1403 READWRITE(hashMerkleRoot);
1407 READWRITE(blockHash);
1410 uint256 GetBlockHash() const
1412 if (fUseFastIndex && (nTime < GetAdjustedTime() - 24 * 60 * 60) && blockHash != 0)
1416 block.nVersion = nVersion;
1417 block.hashPrevBlock = hashPrev;
1418 block.hashMerkleRoot = hashMerkleRoot;
1419 block.nTime = nTime;
1420 block.nBits = nBits;
1421 block.nNonce = nNonce;
1423 const_cast<CDiskBlockIndex*>(this)->blockHash = block.GetHash();
1428 std::string ToString() const
1430 std::string str = "CDiskBlockIndex(";
1431 str += CBlockIndex::ToString();
1432 str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
1433 GetBlockHash().ToString().c_str(),
1434 hashPrev.ToString().c_str(),
1435 hashNext.ToString().c_str());
1441 printf("%s\n", ToString().c_str());
1452 /** Describes a place in the block chain to another node such that if the
1453 * other node doesn't have the same branch, it can find a recent common trunk.
1454 * The further back it is, the further before the fork it may be.
1459 std::vector<uint256> vHave;
1466 explicit CBlockLocator(const CBlockIndex* pindex)
1471 explicit CBlockLocator(uint256 hashBlock)
1473 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1474 if (mi != mapBlockIndex.end())
1478 CBlockLocator(const std::vector<uint256>& vHaveIn)
1485 if (!(nType & SER_GETHASH))
1486 READWRITE(nVersion);
1497 return vHave.empty();
1500 void Set(const CBlockIndex* pindex)
1506 vHave.push_back(pindex->GetBlockHash());
1508 // Exponentially larger steps back
1509 for (int i = 0; pindex && i < nStep; i++)
1510 pindex = pindex->pprev;
1511 if (vHave.size() > 10)
1514 vHave.push_back((!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet));
1517 int GetDistanceBack()
1519 // Retrace how far back it was in the sender's branch
1522 BOOST_FOREACH(const uint256& hash, vHave)
1524 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1525 if (mi != mapBlockIndex.end())
1527 CBlockIndex* pindex = (*mi).second;
1528 if (pindex->IsInMainChain())
1538 CBlockIndex* GetBlockIndex()
1540 // Find the first block the caller has in the main chain
1541 BOOST_FOREACH(const uint256& hash, vHave)
1543 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1544 if (mi != mapBlockIndex.end())
1546 CBlockIndex* pindex = (*mi).second;
1547 if (pindex->IsInMainChain())
1551 return pindexGenesisBlock;
1554 uint256 GetBlockHash()
1556 // Find the first block the caller has in the main chain
1557 BOOST_FOREACH(const uint256& hash, vHave)
1559 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1560 if (mi != mapBlockIndex.end())
1562 CBlockIndex* pindex = (*mi).second;
1563 if (pindex->IsInMainChain())
1567 return (!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet);
1572 CBlockIndex* pindex = GetBlockIndex();
1575 return pindex->nHeight;
1589 mutable CCriticalSection cs;
1590 std::map<uint256, CTransaction> mapTx;
1591 std::map<COutPoint, CInPoint> mapNextTx;
1593 bool accept(CTxDB& txdb, CTransaction &tx,
1594 bool fCheckInputs, bool* pfMissingInputs);
1595 bool addUnchecked(const uint256& hash, CTransaction &tx);
1596 bool remove(CTransaction &tx);
1598 void queryHashes(std::vector<uint256>& vtxid);
1600 unsigned long size()
1603 return mapTx.size();
1606 bool exists(uint256 hash)
1608 return (mapTx.count(hash) != 0);
1611 CTransaction& lookup(uint256 hash)
1617 extern CTxMemPool mempool;