-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Dogecoin block subsidy calculations.
- Loading branch information
Ross Nicoll
committed
Jun 28, 2015
1 parent
a87d6f1
commit 2468489
Showing
7 changed files
with
159 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
// 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 "main.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() |