From af6e26a2880256a667438566034a976ed6f9e230 Mon Sep 17 00:00:00 2001 From: lateminer Date: Mon, 4 Dec 2017 23:43:49 +0300 Subject: [PATCH 1/3] Get staking parameters from chainparams.cpp nStakeTimestampMask, nStakeMinConfirmations, nStakeMinAge --- src/chainparams.cpp | 4 +++- src/consensus/params.h | 2 ++ src/main.cpp | 4 ++-- src/miner.cpp | 4 ++-- src/pos.cpp | 2 +- src/pos.h | 6 ------ src/rpcmining.cpp | 2 +- src/wallet/wallet.cpp | 6 +++--- 8 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 2979a7502..e69b8c7a5 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -101,7 +101,9 @@ public: consensus.nProtocolV2Time = 1407053625; consensus.nProtocolV3Time = 1444028400; consensus.nLastPOWBlock = 10000; - consensus.nStakeTimestampMask = 0xf; + consensus.nStakeTimestampMask = 0xf; // 15 + consensus.nStakeMinConfirmations = 500; + consensus.nStakeMinAge = 8 * 60 * 60; // 8 hours /** * The message start string is designed to be unlikely to occur in normal data. diff --git a/src/consensus/params.h b/src/consensus/params.h index b9813a2ab..f2d916869 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -70,6 +70,8 @@ struct Params { unsigned int GetTargetSpacing(int nHeight) { return IsProtocolV2(nHeight) ? 64 : 60; } int nLastPOWBlock; int nStakeTimestampMask; + int nStakeMinConfirmations; + unsigned int nStakeMinAge; }; } // namespace Consensus diff --git a/src/main.cpp b/src/main.cpp index 8f1c08a83..166e1e8ba 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3437,7 +3437,7 @@ bool GetCoinAge(const CTransaction& tx, CBlockTreeDB& txdb, const CBlockIndex* p if (Params().GetConsensus().IsProtocolV3(tx.nTime)) { int nSpendDepth; - if (IsConfirmedInNPrevBlocks(txindex, pindexPrev, nStakeMinConfirmations - 1, nSpendDepth)) + if (IsConfirmedInNPrevBlocks(txindex, pindexPrev, Params().GetConsensus().nStakeMinConfirmations - 1, nSpendDepth)) { LogPrint("coinage", "coin age skip nSpendDepth=%d\n", nSpendDepth + 1); continue; // only count coins meeting min confirmations requirement @@ -3450,7 +3450,7 @@ bool GetCoinAge(const CTransaction& tx, CBlockTreeDB& txdb, const CBlockIndex* p const CDiskBlockPos& pos = CDiskBlockPos(txindex.nFile, txindex.nPos); if (!ReadBlockFromDisk(block, pos, Params().GetConsensus())) return false; // unable to read block of previous transaction - if (block.GetBlockTime() + nStakeMinAge > tx.nTime) + if (block.GetBlockTime() + Params().GetConsensus().nStakeMinAge > tx.nTime) continue; // only count coins meeting min age requirement } diff --git a/src/miner.cpp b/src/miner.cpp index 48f269d81..5d793e46f 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -417,7 +417,7 @@ void static BitcoinMiner(const CChainParams& chainparams) } //check the block height - if (chainActive.Tip()->nHeight > Params().LastPOWBlock() + nStakeMinConfirmations) + if (chainActive.Tip()->nHeight > Params().LastPOWBlock() + Params().GetConsensus().nStakeMinConfirmations) { // The stake is confirmed, stop the PoW miner throw boost::thread_interrupted(); @@ -568,7 +568,7 @@ bool SignBlock(CBlock& block, CWallet& wallet, int64_t& nFees) CMutableTransaction txCoinBase(block.vtx[0]); CMutableTransaction txCoinStake; txCoinStake.nTime = GetAdjustedTime(); - txCoinStake.nTime &= ~STAKE_TIMESTAMP_MASK; + txCoinStake.nTime &= ~Params().GetConsensus().nStakeTimestampMask; int64_t nSearchTime = txCoinStake.nTime; // search to current time diff --git a/src/pos.cpp b/src/pos.cpp index 4554db3a7..55957b7db 100644 --- a/src/pos.cpp +++ b/src/pos.cpp @@ -132,7 +132,7 @@ bool CheckProofOfStake(CBlockIndex* pindexPrev, const CTransaction& tx, unsigned // Min age requirement int nDepth; - if (IsConfirmedInNPrevBlocks(txindex, pindexPrev, nStakeMinConfirmations - 1, nDepth)) + if (IsConfirmedInNPrevBlocks(txindex, pindexPrev, Params().GetConsensus().nStakeMinConfirmations - 1, nDepth)) return state.DoS(100, error("CheckProofOfStake() : tried to stake at depth %d", nDepth + 1)); if (!CheckStakeKernelHash(pindexPrev, nBits, new CCoins(txPrev, pindexPrev->nHeight), txin.prevout, tx.nTime)) diff --git a/src/pos.h b/src/pos.h index eb3532b30..827c85bae 100644 --- a/src/pos.h +++ b/src/pos.h @@ -21,12 +21,6 @@ using namespace std; /** Compute the hash modifier for proof-of-stake */ uint256 ComputeStakeModifier(const CBlockIndex* pindexPrev, const uint256& kernel); -static const int nStakeMinConfirmations = 500; -static const unsigned int nStakeMinAge = 8 * 60 * 60; // 8 hours -// To decrease granularity of timestamp -// Supposed to be 2^n-1 -static const int STAKE_TIMESTAMP_MASK = 15; - // Check whether the coinstake timestamp meets protocol bool CheckCoinStakeTimestamp(int64_t nTimeBlock, int64_t nTimeTx); bool CheckStakeBlockTimestamp(int64_t nTimeBlock); diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index 50c4028e8..b7ee47c16 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -769,7 +769,7 @@ UniValue checkkernel(const UniValue& params, bool fHelp) CBlockHeader blockHeader = pindexPrev->GetBlockHeader(); unsigned int nBits = GetNextTargetRequired(pindexPrev, &blockHeader, true, Params().GetConsensus()); int64_t nTime = GetAdjustedTime(); - nTime &= ~STAKE_TIMESTAMP_MASK; + nTime &= ~Params().GetConsensus().nStakeTimestampMask; for (unsigned int idx = 0; idx < inputs.size(); idx++) { const UniValue& input = inputs[idx]; diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 255fe8610..1209c3fec 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -580,7 +580,7 @@ void CWallet::AvailableCoinsForStaking(std::vector& vCoins) const if (nDepth < 1) continue; - if (nDepth < nStakeMinConfirmations) + if (nDepth < Params().GetConsensus().nStakeMinConfirmations) continue; if (pcoin->GetBlocksToMaturity() > 0) @@ -654,7 +654,7 @@ bool CheckKernel(CBlockIndex* pindexPrev, unsigned int nBits, int64_t nTime, con return false; int nDepth; - if (IsConfirmedInNPrevBlocks(txindex, pindexPrev, nStakeMinConfirmations - 1, nDepth)) + if (IsConfirmedInNPrevBlocks(txindex, pindexPrev, Params().GetConsensus().nStakeMinConfirmations - 1, nDepth)) return false; if (pBlockTime) @@ -3315,7 +3315,7 @@ uint64_t CWallet::GetStakeWeight() const LOCK2(cs_main, cs_wallet); BOOST_FOREACH(PAIRTYPE(const CWalletTx*, unsigned int) pcoin, setCoins) { - if (pcoin.first->GetDepthInMainChain() >= nStakeMinConfirmations) + if (pcoin.first->GetDepthInMainChain() >= Params().GetConsensus().nStakeMinConfirmations) nWeight += pcoin.first->vout[pcoin.second].nValue; } From 0252c5cea3dcdd0b6abcab0dbbd2703da10067b2 Mon Sep 17 00:00:00 2001 From: lateminer Date: Sun, 17 Dec 2017 13:18:04 +0300 Subject: [PATCH 2/3] Replace STAKE_MIN_CONFIRMATIONS... ...with nStakeMinConfirmations --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 166e1e8ba..4bbc94f00 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2476,7 +2476,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin REJECT_INVALID, "bad-cs-kernel"); // Check proof-of-stake min confirmations - if (pindex->nHeight - coins->nHeight < STAKE_MIN_CONFIRMATIONS) + if (pindex->nHeight - coins->nHeight < Params().GetConsensus().nStakeMinConfirmations) return state.DoS(100, error("%s: tried to stake at depth %d", __func__, pindex->nHeight - coins->nHeight), REJECT_INVALID, "bad-cs-premature"); From f536a8126eaae7ac9e16e4166f6518242355ca70 Mon Sep 17 00:00:00 2001 From: lateminer Date: Sun, 17 Dec 2017 15:21:59 +0300 Subject: [PATCH 3/3] Replace COINBASE_MATURITY... ...with nCoinbaseMaturity --- src/chainparams.cpp | 1 + src/consensus/params.h | 1 + src/main.cpp | 4 ++-- src/qt/transactiondesc.cpp | 2 +- src/test/test_bitcoin.cpp | 2 +- src/txmempool.cpp | 2 +- src/wallet/wallet.cpp | 2 +- 7 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index e69b8c7a5..0cc6cc8e5 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -102,6 +102,7 @@ public: consensus.nProtocolV3Time = 1444028400; consensus.nLastPOWBlock = 10000; consensus.nStakeTimestampMask = 0xf; // 15 + consensus.nCoinbaseMaturity = 500; consensus.nStakeMinConfirmations = 500; consensus.nStakeMinAge = 8 * 60 * 60; // 8 hours diff --git a/src/consensus/params.h b/src/consensus/params.h index f2d916869..4921c7a5f 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -70,6 +70,7 @@ struct Params { unsigned int GetTargetSpacing(int nHeight) { return IsProtocolV2(nHeight) ? 64 : 60; } int nLastPOWBlock; int nStakeTimestampMask; + int nCoinbaseMaturity; int nStakeMinConfirmations; unsigned int nStakeMinAge; }; diff --git a/src/main.cpp b/src/main.cpp index 4bbc94f00..66a12d5ea 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1915,7 +1915,7 @@ bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoins // If prev is coinbase or coinstake, check that it's matured if (coins->IsCoinBase() || coins->IsCoinStake()) { - if (nSpendHeight - coins->nHeight < COINBASE_MATURITY) + if (nSpendHeight - coins->nHeight < Params().nCoinbaseMaturity) return state.Invalid( error("CheckInputs(): tried to spend %s at depth %d", coins->IsCoinBase() ? "coinbase" : "coinstake", nSpendHeight - coins->nHeight), REJECT_INVALID, "bad-txns-premature-spend-of-coinbase"); @@ -2476,7 +2476,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin REJECT_INVALID, "bad-cs-kernel"); // Check proof-of-stake min confirmations - if (pindex->nHeight - coins->nHeight < Params().GetConsensus().nStakeMinConfirmations) + if (pindex->nHeight - coins->nHeight < chainparams.GetConsensus().nStakeMinConfirmations) return state.DoS(100, error("%s: tried to stake at depth %d", __func__, pindex->nHeight - coins->nHeight), REJECT_INVALID, "bad-cs-premature"); diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp index 56ac2bffe..8d82e8305 100644 --- a/src/qt/transactiondesc.cpp +++ b/src/qt/transactiondesc.cpp @@ -262,7 +262,7 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx, TransactionReco if (wtx.IsCoinBase()) { - quint32 numBlocksToMaturity = COINBASE_MATURITY + 1; + quint32 numBlocksToMaturity = Params().GetConsensus().nCoinbaseMaturity + 1; strHTML += "
" + tr("Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to \"not accepted\" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.").arg(QString::number(numBlocksToMaturity)) + "
"; } diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp index eb7400cf5..ccce6e071 100644 --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -101,7 +101,7 @@ TestChain100Setup::TestChain100Setup() : TestingSetup(CBaseChainParams::REGTEST) // Generate a 100-block chain: coinbaseKey.MakeNewKey(true); CScript scriptPubKey = CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG; - for (int i = 0; i < COINBASE_MATURITY; i++) + for (int i = 0; i < Params().GetConsensus().nCoinbaseMaturity; i++) { std::vector noTxns; CBlock b = CreateAndProcessBlock(noTxns, scriptPubKey); diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 55356189a..97a335a99 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -665,7 +665,7 @@ void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMem continue; const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash); if (nCheckFrequency != 0) assert(coins); - if (!coins || (coins->IsCoinBase() || coins->IsCoinStake() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) { + if (!coins || (coins->IsCoinBase() || coins->IsCoinStake() && ((signed long)nMemPoolHeight) - coins->nHeight < Params().GetConsensus().nCoinbaseMaturity)) { transactionsToRemove.push_back(tx); break; } diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 1209c3fec..aef70773f 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3520,7 +3520,7 @@ int CMerkleTx::GetBlocksToMaturity() const { if (!(IsCoinBase() || IsCoinStake())) return 0; - return max(0, (COINBASE_MATURITY+1) - GetDepthInMainChain()); + return max(0, (Params().GetConsensus().nCoinbaseMaturity+1) - GetDepthInMainChain()); }