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 PROTOCOL_SWITCH_TIME = 1371686400; // 20 Jun 2013 00:00:00
41 inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
42 // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp.
43 static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
46 static const int fHaveUPnP = true;
48 static const int fHaveUPnP = false;
51 static const uint256 hashGenesisBlock("0x00000a060336cbb72fe969666d337b87198b1add2abaa59cca226820b32933a4");
52 static const uint256 hashGenesisBlockTestNet("0x000c763e402f2436da9ed36c7286f62c3f6e5dbafce9ff289bd43d7459327eb");
54 static const int64 nMaxClockDrift = 2 * 60 * 60; // two hours
56 extern CScript COINBASE_FLAGS;
59 extern CCriticalSection cs_main;
60 extern std::map<uint256, CBlockIndex*> mapBlockIndex;
61 extern std::set<std::pair<COutPoint, unsigned int> > setStakeSeen;
62 extern CBlockIndex* pindexGenesisBlock;
63 extern unsigned int nStakeMinAge;
64 extern int nCoinbaseMaturity;
65 extern int nBestHeight;
66 extern CBigNum bnBestChainTrust;
67 extern CBigNum bnBestInvalidTrust;
68 extern uint256 hashBestChain;
69 extern CBlockIndex* pindexBest;
70 extern unsigned int nTransactionsUpdated;
71 extern uint64 nLastBlockTx;
72 extern uint64 nLastBlockSize;
73 extern int64 nLastCoinStakeSearchInterval;
74 extern const std::string strMessageMagic;
75 extern double dHashesPerSec;
76 extern int64 nHPSTimerStart;
77 extern int64 nTimeBestReceived;
78 extern CCriticalSection cs_setpwalletRegistered;
79 extern std::set<CWallet*> setpwalletRegistered;
80 extern unsigned char pchMessageStart[4];
81 extern std::map<uint256, CBlock*> mapOrphanBlocks;
84 extern int64 nTransactionFee;
86 // Minimum disk space required - used in CheckDiskSpace()
87 static const uint64 nMinDiskSpace = 52428800;
94 void RegisterWallet(CWallet* pwalletIn);
95 void UnregisterWallet(CWallet* pwalletIn);
96 void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false, bool fConnect = true);
97 bool ProcessBlock(CNode* pfrom, CBlock* pblock);
98 bool CheckDiskSpace(uint64 nAdditionalBytes=0);
99 FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
100 FILE* AppendBlockFile(unsigned int& nFileRet);
101 bool LoadBlockIndex(bool fAllowNew=true);
102 void PrintBlockTree();
103 CBlockIndex* FindBlockByHeight(int nHeight);
104 bool ProcessMessages(CNode* pfrom);
105 bool SendMessages(CNode* pto, bool fSendTrickle);
106 bool LoadExternalBlockFile(FILE* fileIn);
107 void GenerateBitcoins(bool fGenerate, CWallet* pwallet);
108 CBlock* CreateNewBlock(CWallet* pwallet, bool fProofOfStake=false);
109 void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& nExtraNonce);
110 void FormatHashBuffers(CBlock* pblock, char* pmidstate, char* pdata, char* phash1);
111 bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey);
112 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
113 int64 GetProofOfWorkReward(unsigned int nBits);
114 int64 GetProofOfStakeReward(int64 nCoinAge, unsigned int nBits, unsigned int nTime);
115 unsigned int ComputeMinWork(unsigned int nBase, int64 nTime);
116 int GetNumBlocksOfPeers();
117 bool IsInitialBlockDownload();
118 std::string GetWarnings(std::string strFor);
119 bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock);
120 uint256 WantedByOrphan(const CBlock* pblockOrphan);
121 const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake);
122 void BitcoinMiner(CWallet *pwallet, bool fProofOfStake);
123 void ResendWalletTransactions();
134 bool GetWalletFile(CWallet* pwallet, std::string &strWalletFileOut);
136 /** Position on disk for a particular transaction. */
141 unsigned int nBlockPos;
149 CDiskTxPos(unsigned int nFileIn, unsigned int nBlockPosIn, unsigned int nTxPosIn)
152 nBlockPos = nBlockPosIn;
156 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
157 void SetNull() { nFile = (unsigned int) -1; nBlockPos = 0; nTxPos = 0; }
158 bool IsNull() const { return (nFile == (unsigned int) -1); }
160 friend bool operator==(const CDiskTxPos& a, const CDiskTxPos& b)
162 return (a.nFile == b.nFile &&
163 a.nBlockPos == b.nBlockPos &&
164 a.nTxPos == b.nTxPos);
167 friend bool operator!=(const CDiskTxPos& a, const CDiskTxPos& b)
173 std::string ToString() const
178 return strprintf("(nFile=%u, nBlockPos=%u, nTxPos=%u)", nFile, nBlockPos, nTxPos);
183 printf("%s", ToString().c_str());
189 /** An inpoint - a combination of a transaction and an index n into its vin */
196 CInPoint() { SetNull(); }
197 CInPoint(CTransaction* ptxIn, unsigned int nIn) { ptx = ptxIn; n = nIn; }
198 void SetNull() { ptx = NULL; n = (unsigned int) -1; }
199 bool IsNull() const { return (ptx == NULL && n == (unsigned int) -1); }
204 /** An outpoint - a combination of a transaction hash and an index n into its vout */
211 COutPoint() { SetNull(); }
212 COutPoint(uint256 hashIn, unsigned int nIn) { hash = hashIn; n = nIn; }
213 IMPLEMENT_SERIALIZE( READWRITE(FLATDATA(*this)); )
214 void SetNull() { hash = 0; n = (unsigned int) -1; }
215 bool IsNull() const { return (hash == 0 && n == (unsigned int) -1); }
217 friend bool operator<(const COutPoint& a, const COutPoint& b)
219 return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n));
222 friend bool operator==(const COutPoint& a, const COutPoint& b)
224 return (a.hash == b.hash && a.n == b.n);
227 friend bool operator!=(const COutPoint& a, const COutPoint& b)
232 std::string ToString() const
234 return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10).c_str(), n);
239 printf("%s\n", ToString().c_str());
246 /** An input of a transaction. It contains the location of the previous
247 * transaction's output that it claims and a signature that matches the
248 * output's public key.
255 unsigned int nSequence;
259 nSequence = std::numeric_limits<unsigned int>::max();
262 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
265 scriptSig = scriptSigIn;
266 nSequence = nSequenceIn;
269 CTxIn(uint256 hashPrevTx, unsigned int nOut, CScript scriptSigIn=CScript(), unsigned int nSequenceIn=std::numeric_limits<unsigned int>::max())
271 prevout = COutPoint(hashPrevTx, nOut);
272 scriptSig = scriptSigIn;
273 nSequence = nSequenceIn;
279 READWRITE(scriptSig);
280 READWRITE(nSequence);
285 return (nSequence == std::numeric_limits<unsigned int>::max());
288 friend bool operator==(const CTxIn& a, const CTxIn& b)
290 return (a.prevout == b.prevout &&
291 a.scriptSig == b.scriptSig &&
292 a.nSequence == b.nSequence);
295 friend bool operator!=(const CTxIn& a, const CTxIn& b)
300 std::string ToStringShort() const
302 return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n);
305 std::string ToString() const
309 str += prevout.ToString();
310 if (prevout.IsNull())
311 str += strprintf(", coinbase %s", HexStr(scriptSig).c_str());
313 str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24).c_str());
314 if (nSequence != std::numeric_limits<unsigned int>::max())
315 str += strprintf(", nSequence=%u", nSequence);
322 printf("%s\n", ToString().c_str());
329 /** An output of a transaction. It contains the public key that the next input
330 * must be able to sign with to claim it.
336 CScript scriptPubKey;
343 CTxOut(int64 nValueIn, CScript scriptPubKeyIn)
346 scriptPubKey = scriptPubKeyIn;
352 READWRITE(scriptPubKey);
358 scriptPubKey.clear();
363 return (nValue == -1);
369 scriptPubKey.clear();
374 return (nValue == 0 && scriptPubKey.empty());
377 uint256 GetHash() const
379 return SerializeHash(*this);
382 friend bool operator==(const CTxOut& a, const CTxOut& b)
384 return (a.nValue == b.nValue &&
385 a.scriptPubKey == b.scriptPubKey);
388 friend bool operator!=(const CTxOut& a, const CTxOut& b)
393 std::string ToStringShort() const
395 return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString(true).c_str());
398 std::string ToString() const
400 if (IsEmpty()) return "CTxOut(empty)";
401 if (scriptPubKey.size() < 6)
402 return "CTxOut(error)";
403 return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().c_str());
408 printf("%s\n", ToString().c_str());
422 typedef std::map<uint256, std::pair<CTxIndex, CTransaction> > MapPrevTx;
424 /** The basic transaction that is broadcasted on the network and contained in
425 * blocks. A transaction can contain multiple inputs and outputs.
430 static const int CURRENT_VERSION=1;
433 std::vector<CTxIn> vin;
434 std::vector<CTxOut> vout;
435 unsigned int nLockTime;
437 // Denial-of-service detection:
439 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
448 READWRITE(this->nVersion);
449 nVersion = this->nVersion;
453 READWRITE(nLockTime);
458 nVersion = CTransaction::CURRENT_VERSION;
459 nTime = GetAdjustedTime();
463 nDoS = 0; // Denial-of-service prevention
468 return (vin.empty() && vout.empty());
471 uint256 GetHash() const
473 return SerializeHash(*this);
476 bool IsFinal(int nBlockHeight=0, int64 nBlockTime=0) const
478 // Time based nLockTime implemented in 0.1.6
481 if (nBlockHeight == 0)
482 nBlockHeight = nBestHeight;
484 nBlockTime = GetAdjustedTime();
485 if ((int64)nLockTime < ((int64)nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime))
487 BOOST_FOREACH(const CTxIn& txin, vin)
493 bool IsNewerThan(const CTransaction& old) const
495 if (vin.size() != old.vin.size())
497 for (unsigned int i = 0; i < vin.size(); i++)
498 if (vin[i].prevout != old.vin[i].prevout)
502 unsigned int nLowest = std::numeric_limits<unsigned int>::max();
503 for (unsigned int i = 0; i < vin.size(); i++)
505 if (vin[i].nSequence != old.vin[i].nSequence)
507 if (vin[i].nSequence <= nLowest)
510 nLowest = vin[i].nSequence;
512 if (old.vin[i].nSequence < nLowest)
515 nLowest = old.vin[i].nSequence;
522 bool IsCoinBase() const
524 return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() >= 1);
527 bool IsCoinStake() const
529 // ppcoin: the coin stake transaction is marked with the first output empty
530 return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty());
533 /** Check for standard transaction types
534 @return True if all outputs (scriptPubKeys) use only standard transaction forms
536 bool IsStandard() const;
538 /** Check for standard transaction types
539 @param[in] mapInputs Map of previous transactions that have outputs we're spending
540 @return True if all inputs (scriptSigs) use only standard transaction forms
541 @see CTransaction::FetchInputs
543 bool AreInputsStandard(const MapPrevTx& mapInputs) const;
545 /** Count ECDSA signature operations the old-fashioned (pre-0.6) way
546 @return number of sigops this transaction's outputs will produce when spent
547 @see CTransaction::FetchInputs
549 unsigned int GetLegacySigOpCount() const;
551 /** Count ECDSA signature operations in pay-to-script-hash inputs.
553 @param[in] mapInputs Map of previous transactions that have outputs we're spending
554 @return maximum number of sigops required to validate this transaction's inputs
555 @see CTransaction::FetchInputs
557 unsigned int GetP2SHSigOpCount(const MapPrevTx& mapInputs) const;
559 /** Amount of bitcoins spent by this transaction.
560 @return sum of all outputs (note: does not include fees)
562 int64 GetValueOut() const
565 BOOST_FOREACH(const CTxOut& txout, vout)
567 nValueOut += txout.nValue;
568 if (!MoneyRange(txout.nValue) || !MoneyRange(nValueOut))
569 throw std::runtime_error("CTransaction::GetValueOut() : value out of range");
574 /** Amount of bitcoins coming in to this transaction
575 Note that lightweight clients may not know anything besides the hash of previous transactions,
576 so may not be able to calculate this.
578 @param[in] mapInputs Map of previous transactions that have outputs we're spending
579 @return Sum of value of all inputs (scriptSigs)
580 @see CTransaction::FetchInputs
582 int64 GetValueIn(const MapPrevTx& mapInputs) const;
584 static bool AllowFree(double dPriority)
586 // Large (in bytes) low-priority (new, small-coin) transactions
588 return dPriority > COIN * 144 / 250;
591 int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=false, enum GetMinFee_mode mode=GMF_BLOCK) const;
593 bool ReadFromDisk(CDiskTxPos pos, FILE** pfileRet=NULL)
595 CAutoFile filein = CAutoFile(OpenBlockFile(pos.nFile, 0, pfileRet ? "rb+" : "rb"), SER_DISK, CLIENT_VERSION);
597 return error("CTransaction::ReadFromDisk() : OpenBlockFile failed");
600 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
601 return error("CTransaction::ReadFromDisk() : fseek failed");
606 catch (std::exception &e) {
607 return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
610 // Return file pointer
613 if (fseek(filein, pos.nTxPos, SEEK_SET) != 0)
614 return error("CTransaction::ReadFromDisk() : second fseek failed");
615 *pfileRet = filein.release();
620 friend bool operator==(const CTransaction& a, const CTransaction& b)
622 return (a.nVersion == b.nVersion &&
623 a.nTime == b.nTime &&
626 a.nLockTime == b.nLockTime);
629 friend bool operator!=(const CTransaction& a, const CTransaction& b)
634 std::string ToStringShort() const
637 str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user"));
641 std::string ToString() const
644 str += IsCoinBase()? "Coinbase" : (IsCoinStake()? "Coinstake" : "CTransaction");
645 str += strprintf("(hash=%s, nTime=%d, ver=%d, vin.size=%"PRIszu", vout.size=%"PRIszu", nLockTime=%d)\n",
646 GetHash().ToString().substr(0,10).c_str(),
652 for (unsigned int i = 0; i < vin.size(); i++)
653 str += " " + vin[i].ToString() + "\n";
654 for (unsigned int i = 0; i < vout.size(); i++)
655 str += " " + vout[i].ToString() + "\n";
661 printf("%s", ToString().c_str());
665 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout, CTxIndex& txindexRet);
666 bool ReadFromDisk(CTxDB& txdb, COutPoint prevout);
667 bool ReadFromDisk(COutPoint prevout);
668 bool DisconnectInputs(CTxDB& txdb);
670 /** Fetch from memory and/or disk. inputsRet keys are transaction hashes.
672 @param[in] txdb Transaction database
673 @param[in] mapTestPool List of pending changes to the transaction index database
674 @param[in] fBlock True if being called to add a new best-block to the chain
675 @param[in] fMiner True if being called by CreateNewBlock
676 @param[out] inputsRet Pointers to this transaction's inputs
677 @param[out] fInvalid returns true if transaction is invalid
678 @return Returns true if all inputs are in txdb or mapTestPool
680 bool FetchInputs(CTxDB& txdb, const std::map<uint256, CTxIndex>& mapTestPool,
681 bool fBlock, bool fMiner, MapPrevTx& inputsRet, bool& fInvalid);
683 /** Sanity check previous transactions, then, if all checks succeed,
684 mark them as spent by this transaction.
686 @param[in] inputs Previous transactions (from FetchInputs)
687 @param[out] mapTestPool Keeps track of inputs that need to be updated on disk
688 @param[in] posThisTx Position of this transaction on disk
689 @param[in] pindexBlock
690 @param[in] fBlock true if called from ConnectBlock
691 @param[in] fMiner true if called from CreateNewBlock
692 @param[in] fStrictPayToScriptHash true if fully validating p2sh transactions
693 @return Returns true if all checks succeed
695 bool ConnectInputs(CTxDB& txdb, MapPrevTx inputs,
696 std::map<uint256, CTxIndex>& mapTestPool, const CDiskTxPos& posThisTx,
697 const CBlockIndex* pindexBlock, bool fBlock, bool fMiner, bool fStrictPayToScriptHash=true);
698 bool ClientConnectInputs();
699 bool CheckTransaction() const;
700 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true, bool* pfMissingInputs=NULL);
701 bool GetCoinAge(CTxDB& txdb, uint64& nCoinAge) const; // ppcoin: get transaction coin age
704 const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const;
711 /** A transaction with a merkle branch linking it to the block chain. */
712 class CMerkleTx : public CTransaction
716 std::vector<uint256> vMerkleBranch;
720 mutable bool fMerkleVerified;
728 CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
737 fMerkleVerified = false;
743 nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
744 nVersion = this->nVersion;
745 READWRITE(hashBlock);
746 READWRITE(vMerkleBranch);
751 int SetMerkleBranch(const CBlock* pblock=NULL);
752 int GetDepthInMainChain(CBlockIndex* &pindexRet) const;
753 int GetDepthInMainChain() const { CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
754 bool IsInMainChain() const { return GetDepthInMainChain() > 0; }
755 int GetBlocksToMaturity() const;
756 bool AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs=true);
757 bool AcceptToMemoryPool();
763 /** A txdb record that contains the disk location of a transaction and the
764 * locations of transactions that spend its outputs. vSpent is really only
765 * used as a flag, but having the location is very helpful for debugging.
771 std::vector<CDiskTxPos> vSpent;
778 CTxIndex(const CDiskTxPos& posIn, unsigned int nOutputs)
781 vSpent.resize(nOutputs);
786 if (!(nType & SER_GETHASH))
803 friend bool operator==(const CTxIndex& a, const CTxIndex& b)
805 return (a.pos == b.pos &&
806 a.vSpent == b.vSpent);
809 friend bool operator!=(const CTxIndex& a, const CTxIndex& b)
813 int GetDepthInMainChain() const;
821 /** Nodes collect new transactions into a block, hash them into a hash tree,
822 * and scan through nonce values to make the block's hash satisfy proof-of-work
823 * requirements. When they solve the proof-of-work, they broadcast the block
824 * to everyone and the block is added to the block chain. The first transaction
825 * in the block is a special one that creates a new coin owned by the creator
828 * Blocks are appended to blk0001.dat files on disk. Their location on disk
829 * is indexed by CBlockIndex objects in memory.
835 static const int CURRENT_VERSION=4;
837 uint256 hashPrevBlock;
838 uint256 hashMerkleRoot;
844 std::vector<CTransaction> vtx;
846 // ppcoin: block signature - signed by one of the coin base txout[N]'s owner
847 std::vector<unsigned char> vchBlockSig;
850 mutable std::vector<uint256> vMerkleTree;
852 // Denial-of-service detection:
854 bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
863 READWRITE(this->nVersion);
864 nVersion = this->nVersion;
865 READWRITE(hashPrevBlock);
866 READWRITE(hashMerkleRoot);
871 // ConnectBlock depends on vtx following header to generate CDiskTxPos
872 if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
875 READWRITE(vchBlockSig);
879 const_cast<CBlock*>(this)->vtx.clear();
880 const_cast<CBlock*>(this)->vchBlockSig.clear();
886 nVersion = CBlock::CURRENT_VERSION;
903 uint256 GetHash() const
906 void * scratchbuff = scrypt_buffer_alloc();
908 scrypt_hash(CVOIDBEGIN(nVersion), sizeof(block_header), UINTBEGIN(thash), scratchbuff);
910 scrypt_buffer_free(scratchbuff);
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 nHeight) const
925 // Protocol switch to support p2pool at novacoin block #9689
926 if (nHeight >= 9689 || 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: nHeight=%u hashBlock=%s nEntropyBit=%u\n", nHeight, 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) const;
1103 bool GetCoinAge(uint64& nCoinAge) const; // ppcoin: calculate total coin age spent in block
1104 bool SignBlock(const CKeyStore& keystore);
1105 bool CheckBlockSignature() 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 CBigNum bnChainTrust; // 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 CBigNum GetBlockTrust() const
1245 bnTarget.SetCompact(nBits);
1248 return (IsProofOfStake()? (CBigNum(1)<<256) / (bnTarget+1) : 1);
1251 bool IsInMainChain() const
1253 return (pnext || this == pindexBest);
1256 bool CheckIndex() const
1261 enum { nMedianTimeSpan=11 };
1263 int64 GetMedianTimePast() const
1265 int64 pmedian[nMedianTimeSpan];
1266 int64* pbegin = &pmedian[nMedianTimeSpan];
1267 int64* pend = &pmedian[nMedianTimeSpan];
1269 const CBlockIndex* pindex = this;
1270 for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
1271 *(--pbegin) = pindex->GetBlockTime();
1273 std::sort(pbegin, pend);
1274 return pbegin[(pend - pbegin)/2];
1277 int64 GetMedianTime() const
1279 const CBlockIndex* pindex = this;
1280 for (int i = 0; i < nMedianTimeSpan/2; i++)
1283 return GetBlockTime();
1284 pindex = pindex->pnext;
1286 return pindex->GetMedianTimePast();
1290 * Returns true if there are nRequired or more blocks of minVersion or above
1291 * in the last nToCheck blocks, starting at pstart and going backwards.
1293 static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart,
1294 unsigned int nRequired, unsigned int nToCheck);
1297 bool IsProofOfWork() const
1299 return !(nFlags & BLOCK_PROOF_OF_STAKE);
1302 bool IsProofOfStake() const
1304 return (nFlags & BLOCK_PROOF_OF_STAKE);
1307 void SetProofOfStake()
1309 nFlags |= BLOCK_PROOF_OF_STAKE;
1312 unsigned int GetStakeEntropyBit() const
1314 return ((nFlags & BLOCK_STAKE_ENTROPY) >> 1);
1317 bool SetStakeEntropyBit(unsigned int nEntropyBit)
1319 if (nEntropyBit > 1)
1321 nFlags |= (nEntropyBit? BLOCK_STAKE_ENTROPY : 0);
1325 bool GeneratedStakeModifier() const
1327 return (nFlags & BLOCK_STAKE_MODIFIER);
1330 void SetStakeModifier(uint64 nModifier, bool fGeneratedStakeModifier)
1332 nStakeModifier = nModifier;
1333 if (fGeneratedStakeModifier)
1334 nFlags |= BLOCK_STAKE_MODIFIER;
1337 std::string ToString() const
1339 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)",
1340 pprev, pnext, nFile, nBlockPos, nHeight,
1341 FormatMoney(nMint).c_str(), FormatMoney(nMoneySupply).c_str(),
1342 GeneratedStakeModifier() ? "MOD" : "-", GetStakeEntropyBit(), IsProofOfStake()? "PoS" : "PoW",
1343 nStakeModifier, nStakeModifierChecksum,
1344 hashProofOfStake.ToString().c_str(),
1345 prevoutStake.ToString().c_str(), nStakeTime,
1346 hashMerkleRoot.ToString().c_str(),
1347 GetBlockHash().ToString().c_str());
1352 printf("%s\n", ToString().c_str());
1358 /** Used to marshal pointers into hashes for db storage. */
1359 class CDiskBlockIndex : public CBlockIndex
1371 explicit CDiskBlockIndex(CBlockIndex* pindex) : CBlockIndex(*pindex)
1373 hashPrev = (pprev ? pprev->GetBlockHash() : 0);
1374 hashNext = (pnext ? pnext->GetBlockHash() : 0);
1379 if (!(nType & SER_GETHASH))
1380 READWRITE(nVersion);
1382 READWRITE(hashNext);
1384 READWRITE(nBlockPos);
1387 READWRITE(nMoneySupply);
1389 READWRITE(nStakeModifier);
1390 if (IsProofOfStake())
1392 READWRITE(prevoutStake);
1393 READWRITE(nStakeTime);
1394 READWRITE(hashProofOfStake);
1398 const_cast<CDiskBlockIndex*>(this)->prevoutStake.SetNull();
1399 const_cast<CDiskBlockIndex*>(this)->nStakeTime = 0;
1400 const_cast<CDiskBlockIndex*>(this)->hashProofOfStake = 0;
1404 READWRITE(this->nVersion);
1405 READWRITE(hashPrev);
1406 READWRITE(hashMerkleRoot);
1412 uint256 GetBlockHash() const
1415 block.nVersion = nVersion;
1416 block.hashPrevBlock = hashPrev;
1417 block.hashMerkleRoot = hashMerkleRoot;
1418 block.nTime = nTime;
1419 block.nBits = nBits;
1420 block.nNonce = nNonce;
1421 return block.GetHash();
1425 std::string ToString() const
1427 std::string str = "CDiskBlockIndex(";
1428 str += CBlockIndex::ToString();
1429 str += strprintf("\n hashBlock=%s, hashPrev=%s, hashNext=%s)",
1430 GetBlockHash().ToString().c_str(),
1431 hashPrev.ToString().c_str(),
1432 hashNext.ToString().c_str());
1438 printf("%s\n", ToString().c_str());
1449 /** Describes a place in the block chain to another node such that if the
1450 * other node doesn't have the same branch, it can find a recent common trunk.
1451 * The further back it is, the further before the fork it may be.
1456 std::vector<uint256> vHave;
1463 explicit CBlockLocator(const CBlockIndex* pindex)
1468 explicit CBlockLocator(uint256 hashBlock)
1470 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hashBlock);
1471 if (mi != mapBlockIndex.end())
1475 CBlockLocator(const std::vector<uint256>& vHaveIn)
1482 if (!(nType & SER_GETHASH))
1483 READWRITE(nVersion);
1494 return vHave.empty();
1497 void Set(const CBlockIndex* pindex)
1503 vHave.push_back(pindex->GetBlockHash());
1505 // Exponentially larger steps back
1506 for (int i = 0; pindex && i < nStep; i++)
1507 pindex = pindex->pprev;
1508 if (vHave.size() > 10)
1511 vHave.push_back((!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet));
1514 int GetDistanceBack()
1516 // Retrace how far back it was in the sender's branch
1519 BOOST_FOREACH(const uint256& hash, vHave)
1521 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1522 if (mi != mapBlockIndex.end())
1524 CBlockIndex* pindex = (*mi).second;
1525 if (pindex->IsInMainChain())
1535 CBlockIndex* GetBlockIndex()
1537 // Find the first block the caller has in the main chain
1538 BOOST_FOREACH(const uint256& hash, vHave)
1540 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1541 if (mi != mapBlockIndex.end())
1543 CBlockIndex* pindex = (*mi).second;
1544 if (pindex->IsInMainChain())
1548 return pindexGenesisBlock;
1551 uint256 GetBlockHash()
1553 // Find the first block the caller has in the main chain
1554 BOOST_FOREACH(const uint256& hash, vHave)
1556 std::map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find(hash);
1557 if (mi != mapBlockIndex.end())
1559 CBlockIndex* pindex = (*mi).second;
1560 if (pindex->IsInMainChain())
1564 return (!fTestNet ? hashGenesisBlock : hashGenesisBlockTestNet);
1569 CBlockIndex* pindex = GetBlockIndex();
1572 return pindex->nHeight;
1586 mutable CCriticalSection cs;
1587 std::map<uint256, CTransaction> mapTx;
1588 std::map<COutPoint, CInPoint> mapNextTx;
1590 bool accept(CTxDB& txdb, CTransaction &tx,
1591 bool fCheckInputs, bool* pfMissingInputs);
1592 bool addUnchecked(const uint256& hash, CTransaction &tx);
1593 bool remove(CTransaction &tx);
1595 void queryHashes(std::vector<uint256>& vtxid);
1597 unsigned long size()
1600 return mapTx.size();
1603 bool exists(uint256 hash)
1605 return (mapTx.count(hash) != 0);
1608 CTransaction& lookup(uint256 hash)
1614 extern CTxMemPool mempool;