X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fmain.h;h=2cde696683e1915e0d1df2e18e07aa9f12d34c54;hb=4f6b3161b2dc18c9a3d4143d63fbbd0737296eb0;hp=6ea326922675890f0a493463f8668c80f6a9a2d8;hpb=5065be85c2dc1452e05c63d0017da0c096f68006;p=novacoin.git diff --git a/src/main.h b/src/main.h index 6ea3269..2cde696 100644 --- a/src/main.h +++ b/src/main.h @@ -38,7 +38,7 @@ static const int64 MAX_MONEY = 2000000000 * COIN; static const int64 MAX_MINT_PROOF_OF_WORK = 9999 * COIN; static const int64 MIN_TXOUT_AMOUNT = MIN_TX_FEE; inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); } -static const int COINBASE_MATURITY = 500; +static const int COINBASE_MATURITY_PPC = 500; // Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp. static const int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC #ifdef USE_UPNP @@ -61,15 +61,18 @@ extern CCriticalSection cs_main; extern std::map mapBlockIndex; extern std::set > setStakeSeen; extern uint256 hashGenesisBlock; +extern unsigned int nStakeMinAge; +extern int nCoinbaseMaturity; extern CBlockIndex* pindexGenesisBlock; extern int nBestHeight; -extern uint64 nBestChainTrust; -extern uint64 nBestInvalidTrust; +extern CBigNum bnBestChainTrust; +extern CBigNum bnBestInvalidTrust; extern uint256 hashBestChain; extern CBlockIndex* pindexBest; extern unsigned int nTransactionsUpdated; extern uint64 nLastBlockTx; extern uint64 nLastBlockSize; +extern int64 nLastCoinStakeSearchInterval; extern const std::string strMessageMagic; extern double dHashesPerSec; extern int64 nHPSTimerStart; @@ -105,6 +108,7 @@ void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& void FormatHashBuffers(CBlock* pblock, char* pmidstate, char* pdata, char* phash1); bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey); bool CheckProofOfWork(uint256 hash, unsigned int nBits); +int64 GetProofOfWorkReward(unsigned int nBits); int64 GetProofOfStakeReward(int64 nCoinAge); unsigned int ComputeMinWork(unsigned int nBase, int64 nTime); int GetNumBlocksOfPeers(); @@ -289,6 +293,11 @@ public: return !(a == b); } + std::string ToStringShort() const + { + return strprintf(" %s %d", prevout.hash.ToString().c_str(), prevout.n); + } + std::string ToString() const { std::string str; @@ -377,12 +386,17 @@ public: return !(a == b); } + std::string ToStringShort() const + { + return strprintf(" out %s %s", FormatMoney(nValue).c_str(), scriptPubKey.ToString(true).c_str()); + } + std::string ToString() const { if (IsEmpty()) return "CTxOut(empty)"; if (scriptPubKey.size() < 6) return "CTxOut(error)"; - return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().substr(0,30).c_str()); + return strprintf("CTxOut(nValue=%s, scriptPubKey=%s)", FormatMoney(nValue).c_str(), scriptPubKey.ToString().c_str()); } void print() const @@ -502,13 +516,13 @@ public: bool IsCoinBase() const { - return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() == 1); + return (vin.size() == 1 && vin[0].prevout.IsNull() && vout.size() >= 1); } bool IsCoinStake() const { // ppcoin: the coin stake transaction is marked with the first output empty - return (vin.size() > 0 && vout.size() == 2 && vout[0].IsEmpty()); + return (vin.size() > 0 && (!vin[0].prevout.IsNull()) && vout.size() >= 2 && vout[0].IsEmpty()); } /** Check for standard transaction types @@ -659,6 +673,13 @@ public: } + std::string ToStringShort() const + { + std::string str; + str += strprintf("%s %s", GetHash().ToString().c_str(), IsCoinBase()? "base" : (IsCoinStake()? "stake" : "user")); + return str; + } + std::string ToString() const { std::string str; @@ -1017,6 +1038,8 @@ public: return error("CBlock::WriteToDisk() : AppendBlockFile failed"); // Write index header + unsigned char pchMessageStart[4]; + GetMessageStart(pchMessageStart, true); unsigned int nSize = fileout.GetSerializeSize(*this); fileout << FLATDATA(pchMessageStart) << nSize; @@ -1126,8 +1149,10 @@ public: CBlockIndex* pnext; unsigned int nFile; unsigned int nBlockPos; - uint64 nChainTrust;// ppcoin: trust score of chain, in the unit of coin-days + CBigNum bnChainTrust; // ppcoin: trust score of block chain int nHeight; + int64 nMint; + int64 nMoneySupply; bool fProofOfStake; // ppcoin: is the block of proof-of-stake type COutPoint prevoutStake; unsigned int nStakeTime; @@ -1148,7 +1173,9 @@ public: nFile = 0; nBlockPos = 0; nHeight = 0; - nChainTrust = 0; + bnChainTrust = 0; + nMint = 0; + nMoneySupply = 0; fProofOfStake = true; prevoutStake.SetNull(); nStakeTime = 0; @@ -1168,7 +1195,9 @@ public: nFile = nFileIn; nBlockPos = nBlockPosIn; nHeight = 0; - nChainTrust = 0; + bnChainTrust = 0; + nMint = 0; + nMoneySupply = 0; fProofOfStake = block.IsProofOfStake(); if (fProofOfStake) { @@ -1211,9 +1240,13 @@ public: return (int64)nTime; } - int64 GetBlockTrust() const + CBigNum GetBlockTrust() const { - return (nChainTrust - (pprev? pprev->nChainTrust : 0)); + CBigNum bnTarget; + bnTarget.SetCompact(nBits); + if (bnTarget <= 0) + return 0; + return (fProofOfStake? (CBigNum(1)<<256) / (bnTarget+1) : 1); } bool IsInMainChain() const @@ -1281,8 +1314,9 @@ public: std::string ToString() const { - return strprintf("CBlockIndex(nprev=%08x, pnext=%08x, nFile=%d, nBlockPos=%-6d nChainTrust=%"PRI64d" nHeight=%d, fProofOfStake=%d prevoutStake=(%s), nStakeTime=%d merkle=%s, hashBlock=%s)", - pprev, pnext, nFile, nBlockPos, nChainTrust, nHeight, + return strprintf("CBlockIndex(nprev=%08x, pnext=%08x, nFile=%d, nBlockPos=%-6d nHeight=%d, nMint=%s, nMoneySupply=%s, fProofOfStake=%d prevoutStake=(%s), nStakeTime=%d merkle=%s, hashBlock=%s)", + pprev, pnext, nFile, nBlockPos, nHeight, + FormatMoney(nMint).c_str(), FormatMoney(nMoneySupply).c_str(), fProofOfStake, prevoutStake.ToString().c_str(), nStakeTime, hashMerkleRoot.ToString().substr(0,10).c_str(), GetBlockHash().ToString().substr(0,20).c_str()); @@ -1323,8 +1357,9 @@ public: READWRITE(hashNext); READWRITE(nFile); READWRITE(nBlockPos); - READWRITE(nChainTrust); READWRITE(nHeight); + READWRITE(nMint); + READWRITE(nMoneySupply); READWRITE(fProofOfStake); if (fProofOfStake) {