Add Dogecoin block subsidy calculations.
This commit is contained in:
parent
64af132fdb
commit
8c0468c2d2
|
@ -98,6 +98,8 @@ BITCOIN_CORE_H = \
|
|||
core_io.h \
|
||||
core_memusage.h \
|
||||
cuckoocache.h \
|
||||
dogecoin.cpp \
|
||||
dogecoin.h \
|
||||
httprpc.h \
|
||||
httpserver.h \
|
||||
indirectmap.h \
|
||||
|
|
|
@ -95,6 +95,7 @@ BITCOIN_TESTS =\
|
|||
test/crypto_tests.cpp \
|
||||
test/cuckoocache_tests.cpp \
|
||||
test/DoS_tests.cpp \
|
||||
test/dogecoin_tests.cpp \
|
||||
test/getarg_tests.cpp \
|
||||
test/hash_tests.cpp \
|
||||
test/key_tests.cpp \
|
||||
|
|
39
src/dogecoin.cpp
Normal file
39
src/dogecoin.cpp
Normal file
|
@ -0,0 +1,39 @@
|
|||
// Copyright (c) 2015 The Dogecoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <boost/random/uniform_int.hpp>
|
||||
#include <boost/random/mersenne_twister.hpp>
|
||||
|
||||
#include "dogecoin.h"
|
||||
|
||||
int static generateMTRandom(unsigned int s, int range)
|
||||
{
|
||||
boost::mt19937 gen(s);
|
||||
boost::uniform_int<> dist(1, range);
|
||||
return dist(gen);
|
||||
}
|
||||
|
||||
CAmount GetDogecoinBlockSubsidy(int nHeight, const Consensus::Params& consensusParams, uint256 prevHash)
|
||||
{
|
||||
int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
|
||||
|
||||
if (nHeight < 145000) // && !consensusParams.SimplifiedRewards())
|
||||
{
|
||||
// Old-style rewards derived from the previous block hash
|
||||
const std::string cseed_str = prevHash.ToString().substr(7, 7);
|
||||
const char* cseed = cseed_str.c_str();
|
||||
char* endp = NULL;
|
||||
long seed = strtol(cseed, &endp, 16);
|
||||
CAmount maxReward = (1000000 >> halvings) - 1;
|
||||
int rand = generateMTRandom(seed, maxReward);
|
||||
|
||||
return (1 + rand) * COIN;
|
||||
} else if (nHeight < (6 * consensusParams.nSubsidyHalvingInterval)) {
|
||||
// New-style constant rewards for each halving interval
|
||||
return (500000 * COIN) >> halvings;
|
||||
} else {
|
||||
// Constant inflation
|
||||
return 10000 * COIN;
|
||||
}
|
||||
}
|
8
src/dogecoin.h
Normal file
8
src/dogecoin.h
Normal file
|
@ -0,0 +1,8 @@
|
|||
// Copyright (c) 2015 The Dogecoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include "chainparams.h"
|
||||
#include "amount.h"
|
||||
|
||||
CAmount GetDogecoinBlockSubsidy(int nHeight, const Consensus::Params& consensusParams, uint256 prevHash);
|
|
@ -12,6 +12,7 @@
|
|||
#include "consensus/consensus.h"
|
||||
#include "consensus/merkle.h"
|
||||
#include "consensus/validation.h"
|
||||
#include "dogecoin.h"
|
||||
#include "hash.h"
|
||||
#include "validation.h"
|
||||
#include "net.h"
|
||||
|
@ -186,7 +187,8 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
|
|||
coinbaseTx.vin[0].prevout.SetNull();
|
||||
coinbaseTx.vout.resize(1);
|
||||
coinbaseTx.vout[0].scriptPubKey = scriptPubKeyIn;
|
||||
coinbaseTx.vout[0].nValue = nFees + GetBlockSubsidy(nHeight, chainparams.GetConsensus());
|
||||
coinbaseTx.vout[0].nValue = nFees + GetDogecoinBlockSubsidy(nHeight, chainparams.GetConsensus(), pindexPrev->GetBlockHash(
|
||||
));
|
||||
coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0;
|
||||
pblock->vtx[0] = MakeTransactionRef(std::move(coinbaseTx));
|
||||
pblocktemplate->vchCoinbaseCommitment = GenerateCoinbaseCommitment(*pblock, pindexPrev, chainparams.GetConsensus());
|
||||
|
|
104
src/test/dogecoin_tests.cpp
Normal file
104
src/test/dogecoin_tests.cpp
Normal file
|
@ -0,0 +1,104 @@
|
|||
// Copyright (c) 2015 The Dogecoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include "arith_uint256.h"
|
||||
#include "chainparams.h"
|
||||
#include "dogecoin.h"
|
||||
#include "test/test_bitcoin.h"
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
BOOST_FIXTURE_TEST_SUITE(dogecoin_tests, TestingSetup)
|
||||
|
||||
/**
|
||||
* the maximum block reward at a given height for a block without fees
|
||||
*/
|
||||
uint64_t expectedMaxSubsidy(int height) {
|
||||
if (height < 100000) {
|
||||
return 1000000 * COIN;
|
||||
} else if (height < 145000) {
|
||||
return 500000 * COIN;
|
||||
} else if (height < 200000) {
|
||||
return 250000 * COIN;
|
||||
} else if (height < 300000) {
|
||||
return 125000 * COIN;
|
||||
} else if (height < 400000) {
|
||||
return 62500 * COIN;
|
||||
} else if (height < 500000) {
|
||||
return 31250 * COIN;
|
||||
} else if (height < 600000) {
|
||||
return 15625 * COIN;
|
||||
} else {
|
||||
return 10000 * COIN;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* the minimum possible value for the maximum block reward at a given height
|
||||
* for a block without fees
|
||||
*/
|
||||
uint64_t expectedMinSubsidy(int height) {
|
||||
if (height < 100000) {
|
||||
return 0;
|
||||
} else if (height < 145000) {
|
||||
return 0;
|
||||
} else if (height < 200000) {
|
||||
return 250000 * COIN;
|
||||
} else if (height < 300000) {
|
||||
return 125000 * COIN;
|
||||
} else if (height < 400000) {
|
||||
return 62500 * COIN;
|
||||
} else if (height < 500000) {
|
||||
return 31250 * COIN;
|
||||
} else if (height < 600000) {
|
||||
return 15625 * COIN;
|
||||
} else {
|
||||
return 10000 * COIN;
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(subsidy_limit_test)
|
||||
{
|
||||
int nHeight = 0;
|
||||
int nStepSize= 1;
|
||||
const Consensus::Params& params = Params(CBaseChainParams::MAIN).GetConsensus();
|
||||
CAmount nSum = 0;
|
||||
uint256 prevHash = uint256S("0");
|
||||
|
||||
for (nHeight = 0; nHeight <= 100000; nHeight++) {
|
||||
CAmount nSubsidy = GetDogecoinBlockSubsidy(nHeight, params, prevHash);
|
||||
BOOST_CHECK(MoneyRange(nSubsidy));
|
||||
BOOST_CHECK(nSubsidy <= 1000000 * COIN);
|
||||
nSum += nSubsidy * nStepSize;
|
||||
}
|
||||
for (; nHeight <= 145000; nHeight++) {
|
||||
CAmount nSubsidy = GetDogecoinBlockSubsidy(nHeight, params, prevHash);
|
||||
BOOST_CHECK(MoneyRange(nSubsidy));
|
||||
BOOST_CHECK(nSubsidy <= 500000 * COIN);
|
||||
nSum += nSubsidy * nStepSize;
|
||||
}
|
||||
for (; nHeight < 600000; nHeight++) {
|
||||
CAmount nSubsidy = GetDogecoinBlockSubsidy(nHeight, params, prevHash);
|
||||
CAmount nExpectedSubsidy = (500000 >> (nHeight / 100000)) * COIN;
|
||||
BOOST_CHECK(MoneyRange(nSubsidy));
|
||||
BOOST_CHECK(nSubsidy == nExpectedSubsidy);
|
||||
nSum += nSubsidy * nStepSize;
|
||||
}
|
||||
|
||||
//test sum +- ~10billion
|
||||
arith_uint256 upperlimit = arith_uint256("95e14ec776380000"); //108 billion doge
|
||||
BOOST_CHECK(nSum <= upperlimit);
|
||||
|
||||
arith_uint256 lowerlimit = arith_uint256("7a1fe16027700000"); //88 billion doge
|
||||
BOOST_CHECK(nSum >= lowerlimit);
|
||||
|
||||
// Test reward at 600k+ is constant
|
||||
CAmount nConstantSubsidy = GetDogecoinBlockSubsidy(600000, params, prevHash);
|
||||
BOOST_CHECK(nConstantSubsidy == 10000 * COIN);
|
||||
|
||||
nConstantSubsidy = GetDogecoinBlockSubsidy(700000, params, prevHash);
|
||||
BOOST_CHECK(nConstantSubsidy == 10000 * COIN);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
|
@ -12,6 +12,7 @@
|
|||
#include "consensus/consensus.h"
|
||||
#include "consensus/merkle.h"
|
||||
#include "consensus/validation.h"
|
||||
#include "dogecoin.h"
|
||||
#include "hash.h"
|
||||
#include "init.h"
|
||||
#include "policy/fees.h"
|
||||
|
@ -1932,7 +1933,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||
int64_t nTime3 = GetTimeMicros(); nTimeConnect += nTime3 - nTime2;
|
||||
LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime3 - nTime2), 0.001 * (nTime3 - nTime2) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime3 - nTime2) / (nInputs-1), nTimeConnect * 0.000001);
|
||||
|
||||
CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus());
|
||||
CAmount blockReward = nFees + GetDogecoinBlockSubsidy(pindex->nHeight, chainparams.GetConsensus(), hashPrevBlock);
|
||||
if (block.vtx[0]->GetValueOut() > blockReward)
|
||||
return state.DoS(100,
|
||||
error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)",
|
||||
|
|
Loading…
Reference in a new issue