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.
12 #include "scrypt_mine.h"
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;
39 static const unsigned int STAKE_SWITCH_TIME = 1371686400; // Thu, 20 Jun 2013 00:00:00 GMT
40 static const unsigned int TARGETS_SWITCH_TIME = 1374278400; // Sat, 20 Jul 2013 00:00:00 GMT
41 static const unsigned int LOCKS_SWITCH_TIME = 1376956800; // Tue, 20 Aug 2013 00:00:00 GMT
42 static const unsigned int CHAINCHECKS_SWITCH_TIME = 1379635200; // Fri, 20 Sep 2013 00:00:00 GMT
43 static const unsigned int STAKECURVE_SWITCH_TIME = 1382227200; // Sun, 20 Oct 2013 00:00:00 GMT
44 static const unsigned int STAKEWEIGHT_SWITCH_TIME = 1388534400; // Wed, 01 Jan 2014 00:00:00 GMT
47 inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
48 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
49 static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
52 static const int fHaveUPnP = true;
54 static const int fHaveUPnP = false;
57 static const uint256 hashGenesisBlock("0x00000a060336cbb72fe969666d337b87198b1add2abaa59cca226820b32933a4");
58 static const uint256 hashGenesisBlockTestNet("0x000c763e402f2436da9ed36c7286f62c3f6e5dbafce9ff289bd43d7459327eb");
60 static const int64 nMaxClockDrift = 2 * 60 * 60; // two hours
62 extern CScript COINBASE_FLAGS;
65 extern CCriticalSection cs_main;
66 extern std::map<uint256, CBlockIndex*> mapBlockIndex;
67 extern std::set<std::pair<COutPoint, unsigned int> > setStakeSeen;
68 extern CBlockIndex* pindexGenesisBlock;
69 extern unsigned int nStakeMinAge;
70 extern int nCoinbaseMaturity;
71 extern int nBestHeight;
72 extern uint256 nBestChainTrust;
73 extern uint256 nBestInvalidTrust;
74 extern uint256 hashBestChain;
75 extern CBlockIndex* pindexBest;
76 extern unsigned int nTransactionsUpdated;
77 extern uint64 nLastBlockTx;
78 extern uint64 nLastBlockSize;
79 extern int64 nLastCoinStakeSearchInterval;
80 extern const std::string strMessageMagic;
81 extern double dHashesPerSec;
82 extern int64 nHPSTimerStart;
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;
92 // Minimum disk space required - used in CheckDiskSpace()
93 static const uint64 nMinDiskSpace = 52428800;
100 void RegisterWallet(CWallet* pwalletIn);
101 void UnregisterWallet(CWallet* pwalletIn);
102 void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false, bool fConnect = true);
103 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
104 bool CheckDiskSpace(uint64 nAdditionalBytes=0);
105 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
106 FILE* AppendBlockFile(unsigned int& nFileRet);
107 bool LoadBlockIndex(bool fAllowNew=true);
108 void PrintBlockTree();
109 CBlockIndex* FindBlockByHeight(int nHeight);
110 bool ProcessMessages(CNode* pfrom);
111 bool SendMessages(CNode* pto, bool fSendTrickle);
112 bool LoadExternalBlockFile(FILE* fileIn);
113 CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake=false);
114 void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& nExtraNonce);
115 void FormatHashBuffers(CBlock* pblock, char* pmidstate, char* pdata, char* phash1);
116 bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey);
117 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
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 int GetNumBlocksOfPeers();
122 bool IsInitialBlockDownload();
123 std::string GetWarnings(std::string strFor);
124 bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock);
125 uint256 WantedByOrphan(const CBlock* pblockOrphan);
126 const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake);
127 void BitcoinMiner(CWallet *pwallet, bool fProofOfStake);
128 void ResendWalletTransactions();
139 bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
141 /** Position on disk for a particular transaction. */
146 unsigned int nBlockPos;
154 CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
157 nBlockPos = nBlockPosIn;
161 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
162 void SetNull() { nFile = (unsigned int) -1; nBlockPos = 0; nTxPos = 0; }
163 bool IsNull() const { return (nFile == (unsigned int) -1); }
165 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
167 return (a.nFile == b.nFile &&
168 a.nBlockPos == b.nBlockPos &&
169 a.nTxPos == b.nTxPos);
172 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
178 std::string ToString() const
183 return strprintf("(nFile=%u, nBlockPos=%u, nTxPos=%u)", nFile, nBlockPos, nTxPos);
188 printf("%s", ToString().c_str());
194 /** An inpoint - a combination of a transaction and an index n into its vin */
201 CInPoint() { SetNull(); }
202 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
203 void SetNull() { ptx = NULL; n = (unsigned int) -1; }
204 bool IsNull() const { return (ptx == NULL && n == (unsigned int) -1); }
209 /** An outpoint - a combination of a transaction hash and an index n into its vout */
216 COutPoint() { SetNull(); }
217 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
218 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
219 void SetNull() { hash = 0; n = (unsigned int) -1; }
220 bool IsNull() const { return (hash == 0 && n == (unsigned int) -1); }
222 friend bool operator<(const COutPoint& a, const COutPoint& b)
224 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
227 friend bool operator==(const COutPoint& a, const COutPoint& b)
229 return (a.hash == b.hash && a.n == b.n);
232 friend bool operator!=(const COutPoint& a, const COutPoint& b)
237 std::string ToString() const
239 return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10).c_str(), n);
244 printf("%s\n", ToString().c_str());
251 /** An input of a transaction. It contains the location of the previous
252 * transaction's output that it claims and a signature that matches the
253 * output's public key.
260 unsigned int nSequence;
264 nSequence = std::numeric_limits<unsigned int>::max();
267 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
270 scriptSig = scriptSigIn;
271 nSequence = nSequenceIn;
274 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
276 prevout = COutPoint(hashPrevTx, nOut);
277 scriptSig = scriptSigIn;
278 nSequence = nSequenceIn;
284 READWRITE(scriptSig);
285 READWRITE(nSequence);
290 return (nSequence == std::numeric_limits<unsigned int>::max());
293 friend bool operator==(const CTxIn& a, const CTxIn& b)
295 return (a.prevout == b.prevout &&
296 a.scriptSig == b.scriptSig &&
297 a.nSequence == b.nSequence);
300 friend bool operator!=(const CTxIn& a, const CTxIn& b)
305 std::string ToStringShort() const
307 return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n);
310 std::string ToString() const
314 str += prevout.ToString();
315 if (prevout.IsNull())
316 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
318 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
319 if (nSequence != std::numeric_limits<unsigned int>::max())
320 str += strprintf(", nSequence=%u", nSequence);
327 printf("%s\n", ToString().c_str());
334 /** An output of a transaction. It contains the public key that the next input
335 * must be able to sign with to claim it.
341 CScript scriptPubKey;
348 CTxOut(int64 nValueIn, CScript scriptPubKeyIn)
351 scriptPubKey = scriptPubKeyIn;
357 READWRITE(scriptPubKey);
363 scriptPubKey.clear();
368 return (nValue == -1);
374 scriptPubKey.clear();
379 return (nValue == 0 && scriptPubKey.empty());
382 uint256 GetHash() const
384 return SerializeHash(*this);
387 friend bool operator==(const CTxOut& a, const CTxOut& b)
389 return (a.nValue == b.nValue &&
390 a.scriptPubKey == b.scriptPubKey);
393 friend bool operator!=(const CTxOut& a, const CTxOut& b)
398 std::string ToStringShort() const
400 return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString(true).c_str());
403 std::string ToString() const
405 if (IsEmpty()) return "CTxOut(empty)";
406 if (scriptPubKey.size() < 6)
407 return "CTxOut(error)";
408 return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().c_str());
413 printf("%s\n", ToString().c_str());
427 typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
429 /** The basic transaction that is broadcasted on the network and contained in
430 * blocks. A transaction can contain multiple inputs and outputs.
435 static const int CURRENT_VERSION=1;
438 std::vector<CTxIn> vin;
439 std::vector<CTxOut> vout;
440 unsigned int nLockTime;
442 // Denial-of-service detection:
444 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
453 READWRITE(this->nVersion);
454 nVersion = this->nVersion;
458 READWRITE(nLockTime);
463 nVersion = CTransaction::CURRENT_VERSION;
464 nTime = GetAdjustedTime();
468 nDoS = 0; // Denial-of-service prevention
473 return (vin.empty() && vout.empty());
476 uint256 GetHash() const
478 return SerializeHash(*this);
481 bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const
483 // Time based nLockTime implemented in 0.1.6
486 if (nBlockHeight == 0)
487 nBlockHeight = nBestHeight;
489 nBlockTime = GetAdjustedTime();
490 if ((int64)nLockTime < ((int64)nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime))
492 BOOST_FOREACH(const CTxIn& txin, vin)
498 bool IsNewerThan(const CTransaction& old) const
500 if (vin.size() != old.vin.size())
502 for (unsigned int i = 0; i < vin.size(); i++)
503 if (vin[i].prevout != old.vin[i].prevout)
507 unsigned int nLowest = std::numeric_limits<unsigned int>::max();
508 for (unsigned int i = 0; i < vin.size(); i++)
510 if (vin[i].nSequence != old.vin[i].nSequence)
512 if (vin[i].nSequence <= nLowest)
515 nLowest = vin[i].nSequence;
517 if (old.vin[i].nSequence < nLowest)
520 nLowest = old.vin[i].nSequence;
527 bool IsCoinBase() const
529 return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() >= 1);
532 bool IsCoinStake() const
534 // ppcoin: the coin stake transaction is marked with the first output empty
535 return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty());
538 /** Check for standard transaction types
539 @return True if all outputs (scriptPubKeys) use only standard transaction forms
541 bool IsStandard() const;
543 /** Check for standard transaction types
544 @param[in] mapInputs Map of previous transactions that have outputs we're spending
545 @return True if all inputs (scriptSigs) use only standard transaction forms
546 @see CTransaction::FetchInputs
548 bool AreInputsStandard(const MapPrevTx& mapInputs) const;
550 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
551 @return number of sigops this transaction's outputs will produce when spent
552 @see CTransaction::FetchInputs
554 unsigned int GetLegacySigOpCount() const;
556 /** Count ECDSA signature operations in pay-to-script-hash inputs.
558 @param[in] mapInputs Map of previous transactions that have outputs we're spending
559 @return maximum number of sigops required to validate this transaction's inputs
560 @see CTransaction::FetchInputs
562 unsigned int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
564 /** Amount of bitcoins spent by this transaction.
565 @return sum of all outputs (note: does not include fees)
567 int64 GetValueOut() const
570 BOOST_FOREACH(const CTxOut& txout, vout)
572 nValueOut += txout.nValue;
573 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
574 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
579 /** Amount of bitcoins coming in to this transaction
580 Note that lightweight clients may not know anything besides the hash of previous transactions,
581 so may not be able to calculate this.
583 @param[in] mapInputs Map of previous transactions that have outputs we're spending
584 @return Sum of value of all inputs (scriptSigs)
585 @see CTransaction::FetchInputs
587 int64 GetValueIn(const MapPrevTx& mapInputs) const;
589 static bool AllowFree(double dPriority)
591 // Large (in bytes) low-priority (new, small-coin) transactions
593 return dPriority > COIN * 144 / 250;
596 int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=false, enum GetMinFee_mode mode=GMF_BLOCK) const;
598 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
600 CAutoFile filein = CAutoFile(OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb"), SER_DISK, CLIENT_VERSION);
602 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
605 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
606 return error("CTransaction::ReadFromDisk() : fseek failed");
611 catch (std::exception &e) {
612 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
615 // Return file pointer
618 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
619 return error("CTransaction::ReadFromDisk() : second fseek failed");
620 *pfileRet = filein.release();
625 friend bool operator==(const CTransaction& a, const CTransaction& b)
627 return (a.nVersion == b.nVersion &&
628 a.nTime == b.nTime &&
631 a.nLockTime == b.nLockTime);
634 friend bool operator!=(const CTransaction& a, const CTransaction& b)
639 std::string ToStringShort() const
642 str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user"));
646 std::string ToString() const
649 str += IsCoinBase()? "Coinbase" : (IsCoinStake()? "Coinstake" : "CTransaction");
650 str += strprintf("(hash=%s, nTime=%d, ver=%d, vin.size=%"PRIszu", vout.size=%"PRIszu", nLockTime=%d)\n",
651 GetHash().ToString().substr(0,10).c_str(),
657 for (unsigned int i = 0; i < vin.size(); i++)
658 str += " " + vin[i].ToString() + "\n";
659 for (unsigned int i = 0; i < vout.size(); i++)
660 str += " " + vout[i].ToString() + "\n";
666 printf("%s", ToString().c_str());
670 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
671 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
672 bool ReadFromDisk(COutPoint prevout);
673 bool DisconnectInputs(CTxDB& txdb);
675 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
677 @param[in] txdb Transaction database
678 @param[in] mapTestPool List of pending changes to the transaction index database
679 @param[in] fBlock True if being called to add a new best-block to the chain
680 @param[in] fMiner True if being called by CreateNewBlock
681 @param[out] inputsRet Pointers to this transaction's inputs
682 @param[out] fInvalid returns true if transaction is invalid
683 @return Returns true if all inputs are in txdb or mapTestPool
685 bool FetchInputs(CTxDB& txdb, const std::map<uint256, CTxIndex>& mapTestPool,
686 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
688 /** Sanity check previous transactions, then, if all checks succeed,
689 mark them as spent by this transaction.
691 @param[in] inputs Previous transactions (from FetchInputs)
692 @param[out] mapTestPool Keeps track of inputs that need to be updated on disk
693 @param[in] posThisTx Position of this transaction on disk
694 @param[in] pindexBlock
695 @param[in] fBlock true if called from ConnectBlock
696 @param[in] fMiner true if called from CreateNewBlock
697 @param[in] fStrictPayToScriptHash true if fully validating p2sh transactions
698 @return Returns true if all checks succeed
700 bool ConnectInputs(CTxDB& txdb, MapPrevTx inputs,
701 std::map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx,
702 const CBlockIndex* pindexBlock, bool fBlock, bool fMiner, bool fStrictPayToScriptHash=true);
703 bool ClientConnectInputs();
704 bool CheckTransaction() const;
705 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
706 bool GetCoinAge(CTxDB& txdb, uint64& nCoinAge) const; // ppcoin: get transaction coin age
709 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
716 /** A transaction with a merkle branch linking it to the block chain. */
717 class CMerkleTx : public CTransaction
721 std::vector<uint256> vMerkleBranch;
725 mutable bool fMerkleVerified;
733 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
742 fMerkleVerified = false;
748 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
749 nVersion = this->nVersion;
750 READWRITE(hashBlock);
751 READWRITE(vMerkleBranch);
756 int SetMerkleBranch(const CBlock* pblock=NULL);
757 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
758 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
759 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
760 int GetBlocksToMaturity() const;
761 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
762 bool AcceptToMemoryPool();
768 /** A txdb record that contains the disk location of a transaction and the
769 * locations of transactions that spend its outputs. vSpent is really only
770 * used as a flag, but having the location is very helpful for debugging.
776 std::vector<CDiskTxPos> vSpent;
783 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
786 vSpent.resize(nOutputs);
791 if (!(nType & SER_GETHASH))
808 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
810 return (a.pos == b.pos &&
811 a.vSpent == b.vSpent);
814 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
818 int GetDepthInMainChain() const;
826 /** Nodes collect new transactions into a block, hash them into a hash tree,
827 * and scan through nonce values to make the block's hash satisfy proof-of-work
828 * requirements. When they solve the proof-of-work, they broadcast the block
829 * to everyone and the block is added to the block chain. The first transaction
830 * in the block is a special one that creates a new coin owned by the creator
833 * Blocks are appended to blk0001.dat files on disk. Their location on disk
834 * is indexed by CBlockIndex objects in memory.
840 static const int CURRENT_VERSION=6;
842 uint256 hashPrevBlock;
843 uint256 hashMerkleRoot;
849 std::vector<CTransaction> vtx;
851 // ppcoin: block signature - signed by one of the coin base txout[N]'s owner
852 std::vector<unsigned char> vchBlockSig;
855 mutable std::vector<uint256> vMerkleTree;
857 // Denial-of-service detection:
859 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
868 READWRITE(this->nVersion);
869 nVersion = this->nVersion;
870 READWRITE(hashPrevBlock);
871 READWRITE(hashMerkleRoot);
876 // ConnectBlock depends on vtx following header to generate CDiskTxPos
877 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
880 READWRITE(vchBlockSig);
884 const_cast<CBlock*>(this)->vtx.clear();
885 const_cast<CBlock*>(this)->vchBlockSig.clear();
891 nVersion = CBlock::CURRENT_VERSION;
908 uint256 GetHash() const
911 void * scratchbuff = scrypt_buffer_alloc();
913 scrypt_hash(CVOIDBEGIN(nVersion), sizeof(block_header), UINTBEGIN(thash), scratchbuff);
915 scrypt_buffer_free(scratchbuff);
920 int64 GetBlockTime() const
925 void UpdateTime(const CBlockIndex* pindexPrev);
927 // ppcoin: entropy bit for stake modifier if chosen by modifier
928 unsigned int GetStakeEntropyBit(unsigned int nHeight) const
930 // Protocol switch to support p2pool at novacoin block #9689
931 if (nHeight >= 9689 || fTestNet)
933 // Take last bit of block hash as entropy bit
934 unsigned int nEntropyBit = ((GetHash().Get64()) & 1llu);
935 if (fDebug && GetBoolArg("-printstakemodifier"))
936 printf("GetStakeEntropyBit: nHeight=%u hashBlock=%s nEntropyBit=%u\n", nHeight, GetHash().ToString().c_str(), nEntropyBit);
939 // Before novacoin block #9689 - old protocol
940 uint160 hashSig = Hash160(vchBlockSig);
941 if (fDebug && GetBoolArg("-printstakemodifier"))
942 printf("GetStakeEntropyBit: hashSig=%s", hashSig.ToString().c_str());
943 hashSig >>= 159; // take the first bit of the hash
944 if (fDebug && GetBoolArg("-printstakemodifier"))
945 printf(" entropybit=%"PRI64d"\n", hashSig.Get64());
946 return hashSig.Get64();
949 // ppcoin: two types of block: proof-of-work or proof-of-stake
950 bool IsProofOfStake() const
952 return (vtx.size() > 1 && vtx[1].IsCoinStake());
955 bool IsProofOfWork() const
957 return !IsProofOfStake();
960 std::pair<COutPoint, unsigned int> GetProofOfStake() const
962 return IsProofOfStake()? std::make_pair(vtx[1].vin[0].prevout, vtx[1].nTime) : std::make_pair(COutPoint(), (unsigned int)0);
965 // ppcoin: get max transaction timestamp
966 int64 GetMaxTransactionTime() const
968 int64 maxTransactionTime = 0;
969 BOOST_FOREACH(const CTransaction& tx, vtx)
970 maxTransactionTime = std::max(maxTransactionTime, (int64)tx.nTime);
971 return maxTransactionTime;
974 uint256 BuildMerkleTree() const
977 BOOST_FOREACH(const CTransaction& tx, vtx)
978 vMerkleTree.push_back(tx.GetHash());
980 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
982 for (int i = 0; i < nSize; i += 2)
984 int i2 = std::min(i+1, nSize-1);
985 vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
986 BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
990 return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
993 std::vector<uint256> GetMerkleBranch(int nIndex) const
995 if (vMerkleTree.empty())
997 std::vector<uint256> vMerkleBranch;
999 for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
1001 int i = std::min(nIndex^1, nSize-1);
1002 vMerkleBranch.push_back(vMerkleTree[j+i]);
1006 return vMerkleBranch;
1009 static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex)
1013 BOOST_FOREACH(const uint256& otherside, vMerkleBranch)
1016 hash = Hash(BEGIN(otherside), END(otherside), BEGIN(hash), END(hash));
1018 hash = Hash(BEGIN(hash), END(hash), BEGIN(otherside), END(otherside));
1025 bool WriteToDisk(unsigned int& nFileRet, unsigned int& nBlockPosRet)
1027 // Open history file to append
1028 CAutoFile fileout = CAutoFile(AppendBlockFile(nFileRet), SER_DISK, CLIENT_VERSION);
1030 return error("CBlock::WriteToDisk() : AppendBlockFile failed");
1032 // Write index header
1033 unsigned int nSize = fileout.GetSerializeSize(*this);
1034 fileout << FLATDATA(pchMessageStart) << nSize;
1037 long fileOutPos = ftell(fileout);
1039 return error("CBlock::WriteToDisk() : ftell failed");
1040 nBlockPosRet = fileOutPos;
1043 // Flush stdio buffers and commit to disk before returning
1045 if (!IsInitialBlockDownload() || (nBestHeight+1) % 500 == 0)
1046 FileCommit(fileout);
1051 bool ReadFromDisk(unsigned int nFile, unsigned int nBlockPos, bool fReadTransactions=true)
1055 // Open history file to read
1056 CAutoFile filein = CAutoFile(OpenBlockFile(nFile, nBlockPos, "rb"), SER_DISK, CLIENT_VERSION);
1058 return error("CBlock::ReadFromDisk() : OpenBlockFile failed");
1059 if (!fReadTransactions)
1060 filein.nType |= SER_BLOCKHEADERONLY;
1066 catch (std::exception &e) {
1067 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
1071 if (fReadTransactions && IsProofOfWork() && !CheckProofOfWork(GetHash(), nBits))
1072 return error("CBlock::ReadFromDisk() : errors in block header");
1081 printf("CBlock(hash=%s, ver=%d, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%"PRIszu", vchBlockSig=%s)\n",
1082 GetHash().ToString().c_str(),
1084 hashPrevBlock.ToString().c_str(),
1085 hashMerkleRoot.ToString().c_str(),
1086 nTime, nBits, nNonce,
1088 HexStr(vchBlockSig.begin(), vchBlockSig.end()).c_str());
1089 for (unsigned int i = 0; i < vtx.size(); i++)
1094 printf(" vMerkleTree: ");
1095 for (unsigned int i = 0; i < vMerkleTree.size(); i++)
1096 printf("%s ", vMerkleTree[i].ToString().substr(0,10).c_str());
1101 bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
1102 bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck=false);
1103 bool ReadFromDisk(const CBlockIndex* pindex, bool fReadTransactions=true);
1104 bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
1105 bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
1106 bool CheckBlock(bool fCheckPOW=true, bool fCheckMerkleRoot=true) const;
1108 bool GetCoinAge(uint64& nCoinAge) const; // ppcoin: calculate total coin age spent in block
1109 bool SignBlock(const CKeyStore& keystore);
1110 bool CheckBlockSignature() const;
1113 bool SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew);
1121 /** The block chain is a tree shaped structure starting with the
1122 * genesis block at the root, with each block potentially having multiple
1123 * candidates to be the next block. pprev and pnext link a path through the
1124 * main/longest chain. A blockindex may have multiple pprev pointing back
1125 * to it, but pnext will only point forward to the longest branch, or will
1126 * be null if the block is not part of the longest chain.
1131 const uint256* phashBlock;
1135 unsigned int nBlockPos;
1136 uint256 nChainTrust; // ppcoin: trust score of block chain
1142 unsigned int nFlags; // ppcoin: block index flags
1145 BLOCK_PROOF_OF_STAKE = (1 << 0), // is proof-of-stake block
1146 BLOCK_STAKE_ENTROPY = (1 << 1), // entropy bit for stake modifier
1147 BLOCK_STAKE_MODIFIER = (1 << 2), // regenerated stake modifier
1150 uint64 nStakeModifier; // hash modifier for proof-of-stake
1151 unsigned int nStakeModifierChecksum; // checksum of index; in-memeory only
1153 // proof-of-stake specific fields
1154 COutPoint prevoutStake;
1155 unsigned int nStakeTime;
1156 uint256 hashProofOfStake;
1160 uint256 hashMerkleRoot;
1163 unsigned int nNonce;
1178 nStakeModifierChecksum = 0;
1179 hashProofOfStake = 0;
1180 prevoutStake.SetNull();
1190 CBlockIndex(unsigned int nFileIn, unsigned int nBlockPosIn, CBlock& block)
1196 nBlockPos = nBlockPosIn;
1203 nStakeModifierChecksum = 0;
1204 hashProofOfStake = 0;
1205 if (block.IsProofOfStake())
1208 prevoutStake = block.vtx[1].vin[0].prevout;
1209 nStakeTime = block.vtx[1].nTime;
1213 prevoutStake.SetNull();
1217 nVersion = block.nVersion;
1218 hashMerkleRoot = block.hashMerkleRoot;
1219 nTime = block.nTime;
1220 nBits = block.nBits;
1221 nNonce = block.nNonce;
1224 CBlock GetBlockHeader() const
1227 block.nVersion = nVersion;
1229 block.hashPrevBlock = pprev->GetBlockHash();
1230 block.hashMerkleRoot = hashMerkleRoot;
1231 block.nTime = nTime;
1232 block.nBits = nBits;
1233 block.nNonce = nNonce;
1237 uint256 GetBlockHash() const
1242 int64 GetBlockTime() const
1244 return (int64)nTime;
1247 uint256 GetBlockTrust() const;
1249 bool IsInMainChain() const
1251 return (pnext || this == pindexBest);
1254 bool CheckIndex() const
1259 enum { nMedianTimeSpan=11 };
1261 int64 GetMedianTimePast() const
1263 int64 pmedian[nMedianTimeSpan];
1264 int64* pbegin = &pmedian[nMedianTimeSpan];
1265 int64* pend = &pmedian[nMedianTimeSpan];
1267 const CBlockIndex* pindex = this;
1268 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1269 *(--pbegin) = pindex->GetBlockTime();
1271 std::sort(pbegin, pend);
1272 return pbegin[(pend - pbegin)/2];
1275 int64 GetMedianTime() const
1277 const CBlockIndex* pindex = this;
1278 for (int i = 0; i < nMedianTimeSpan/2; i++)
1281 return GetBlockTime();
1282 pindex = pindex->pnext;
1284 return pindex->GetMedianTimePast();
1288 * Returns true if there are nRequired or more blocks of minVersion or above
1289 * in the last nToCheck blocks, starting at pstart and going backwards.
1291 static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart,
1292 unsigned int nRequired, unsigned int nToCheck);
1295 bool IsProofOfWork() const
1297 return !(nFlags & BLOCK_PROOF_OF_STAKE);
1300 bool IsProofOfStake() const
1302 return (nFlags & BLOCK_PROOF_OF_STAKE);
1305 void SetProofOfStake()
1307 nFlags |= BLOCK_PROOF_OF_STAKE;
1310 unsigned int GetStakeEntropyBit() const
1312 return ((nFlags & BLOCK_STAKE_ENTROPY) >> 1);
1315 bool SetStakeEntropyBit(unsigned int nEntropyBit)
1317 if (nEntropyBit > 1)
1319 nFlags |= (nEntropyBit? BLOCK_STAKE_ENTROPY : 0);
1323 bool GeneratedStakeModifier() const
1325 return (nFlags & BLOCK_STAKE_MODIFIER);
1328 void SetStakeModifier(uint64 nModifier, bool fGeneratedStakeModifier)
1330 nStakeModifier = nModifier;
1331 if (fGeneratedStakeModifier)
1332 nFlags |= BLOCK_STAKE_MODIFIER;
1335 std::string ToString() const
1337 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)",
1338 pprev, pnext, nFile, nBlockPos, nHeight,
1339 FormatMoney(nMint).c_str(), FormatMoney(nMoneySupply).c_str(),
1340 GeneratedStakeModifier() ? "MOD" : "-", GetStakeEntropyBit(), IsProofOfStake()? "PoS" : "PoW",
1341 nStakeModifier, nStakeModifierChecksum,
1342 hashProofOfStake.ToString().c_str(),
1343 prevoutStake.ToString().c_str(), nStakeTime,
1344 hashMerkleRoot.ToString().c_str(),
1345 GetBlockHash().ToString().c_str());
1350 printf("%s\n", ToString().c_str());
1356 /** Used to marshal pointers into hashes for db storage. */
1357 class CDiskBlockIndex : public CBlockIndex
1369 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1371 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1372 hashNext = (pnext ? pnext->GetBlockHash() : 0);
1377 if (!(nType & SER_GETHASH))
1378 READWRITE(nVersion);
1380 READWRITE(hashNext);
1382 READWRITE(nBlockPos);
1385 READWRITE(nMoneySupply);
1387 READWRITE(nStakeModifier);
1388 if (IsProofOfStake())
1390 READWRITE(prevoutStake);
1391 READWRITE(nStakeTime);
1392 READWRITE(hashProofOfStake);
1396 const_cast<CDiskBlockIndex*>(this)->prevoutStake.SetNull();
1397 const_cast<CDiskBlockIndex*>(this)->nStakeTime = 0;
1398 const_cast<CDiskBlockIndex*>(this)->hashProofOfStake = 0;
1402 READWRITE(this->nVersion);
1403 READWRITE(hashPrev);
1404 READWRITE(hashMerkleRoot);
1410 uint256 GetBlockHash() const
1413 block.nVersion = nVersion;
1414 block.hashPrevBlock = hashPrev;
1415 block.hashMerkleRoot = hashMerkleRoot;
1416 block.nTime = nTime;
1417 block.nBits = nBits;
1418 block.nNonce = nNonce;
1419 return block.GetHash();
1423 std::string ToString() const
1425 std::string str = "CDiskBlockIndex(";
1426 str += CBlockIndex::ToString();
1427 str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
1428 GetBlockHash().ToString().c_str(),
1429 hashPrev.ToString().c_str(),
1430 hashNext.ToString().c_str());
1436 printf("%s\n", ToString().c_str());
1447 /** Describes a place in the block chain to another node such that if the
1448 * other node doesn't have the same branch, it can find a recent common trunk.
1449 * The further back it is, the further before the fork it may be.
1454 std::vector<uint256> vHave;
1461 explicit CBlockLocator(const CBlockIndex* pindex)
1466 explicit CBlockLocator(uint256 hashBlock)
1468 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1469 if (mi != mapBlockIndex.end())
1473 CBlockLocator(const std::vector<uint256>& vHaveIn)
1480 if (!(nType & SER_GETHASH))
1481 READWRITE(nVersion);
1492 return vHave.empty();
1495 void Set(const CBlockIndex* pindex)
1501 vHave.push_back(pindex->GetBlockHash());
1503 // Exponentially larger steps back
1504 for (int i = 0; pindex && i < nStep; i++)
1505 pindex = pindex->pprev;
1506 if (vHave.size() > 10)
1509 vHave.push_back((!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet));
1512 int GetDistanceBack()
1514 // Retrace how far back it was in the sender's branch
1517 BOOST_FOREACH(const uint256& hash, vHave)
1519 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1520 if (mi != mapBlockIndex.end())
1522 CBlockIndex* pindex = (*mi).second;
1523 if (pindex->IsInMainChain())
1533 CBlockIndex* GetBlockIndex()
1535 // Find the first block the caller has in the main chain
1536 BOOST_FOREACH(const uint256& hash, vHave)
1538 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1539 if (mi != mapBlockIndex.end())
1541 CBlockIndex* pindex = (*mi).second;
1542 if (pindex->IsInMainChain())
1546 return pindexGenesisBlock;
1549 uint256 GetBlockHash()
1551 // Find the first block the caller has in the main chain
1552 BOOST_FOREACH(const uint256& hash, vHave)
1554 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1555 if (mi != mapBlockIndex.end())
1557 CBlockIndex* pindex = (*mi).second;
1558 if (pindex->IsInMainChain())
1562 return (!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet);
1567 CBlockIndex* pindex = GetBlockIndex();
1570 return pindex->nHeight;
1584 mutable CCriticalSection cs;
1585 std::map<uint256, CTransaction> mapTx;
1586 std::map<COutPoint, CInPoint> mapNextTx;
1588 bool accept(CTxDB& txdb, CTransaction &tx,
1589 bool fCheckInputs, bool* pfMissingInputs);
1590 bool addUnchecked(const uint256& hash, CTransaction &tx);
1591 bool remove(CTransaction &tx);
1593 void queryHashes(std::vector<uint256>& vtxid);
1595 unsigned long size()
1598 return mapTx.size();
1601 bool exists(uint256 hash)
1603 return (mapTx.count(hash) != 0);
1606 CTransaction& lookup(uint256 hash)
1612 extern CTxMemPool mempool;