Skip to content

Commit

Permalink
Hardfork and Checkpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
Crestington committed Jan 5, 2015
1 parent 8927e65 commit 0db0100
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 37 deletions.
3 changes: 2 additions & 1 deletion src/checkpoints.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace Checkpoints
( 0, hashGenesisBlock )
( 100, uint256("0x0000006f6d50428c4b20aed705454e59001d41526c2a0bec3baf9bc5c17df9c7"))
( 2500, uint256("0x000000102635b1390c240e0072001b752f7a3d793230d121054e7c3acb53bf66"))
( 8200, unit256("0x33968e2be1926a531fa39e8040d79274b2ae7448a6b6f6ec7827ca026c741f0f"))
;

// TestNet has no checkpoints
Expand Down Expand Up @@ -349,7 +350,7 @@ namespace Checkpoints
}

// ppcoin: sync-checkpoint master key
const std::string CSyncCheckpoint::strMasterPubKey = "049F2C10997604217E7238A4C5CF2843570ADA001D1A247B228A7C5583ACD0F762A3130D0C4331EB262E3D0EB516AE6F7B0B1ADA43275013F8552A83A7C621B1D9";
const std::string CSyncCheckpoint::strMasterPubKey = "04ba79eba91608decc02d41a64223b5ef5ac2045c8b1706f7603bcff1251228edb47bf140f009a9598345d9a3900b42ded70f6eddfa5bd601926685c218a0e4611";

std::string CSyncCheckpoint::strMasterPrivKey = "";

Expand Down
128 changes: 92 additions & 36 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -986,59 +986,115 @@ int64_t GetProofOfWorkReward(int64_t nFees)
// miner's coin stake reward based on coin age spent (coin-days)
int64_t GetProofOfStakeReward(int64_t nCoinAge, unsigned int nBits, unsigned int nTime, int64_t nFees)
{
int64_t nRewardCoinYear;
int64_t nSubsidy = 0;

CBigNum bnRewardCoinYearLimit;
int64_t nRewardCoinYearLimit;
if ( nTime > REWARD_SWITCH_TIME )
{
int64_t nRewardCoinYear;

bnRewardCoinYearLimit = MAX_MINT_PROOF_OF_STAKE; // Base stake mint rate, 8% year interest
nRewardCoinYearLimit = MAX_MINT_PROOF_OF_STAKE;
CBigNum bnRewardCoinYearLimit;
int64_t nRewardCoinYearLimit;

CBigNum bnTarget;
bnRewardCoinYearLimit = MAX_MINT_PROOF_OF_STAKE; // Base stake mint rate, 8% year interest
nRewardCoinYearLimit = MAX_MINT_PROOF_OF_STAKE;

bnTarget.SetCompact(nBits);
CBigNum bnTarget;
bnTarget.SetCompact(nBits);
CBigNum bnTargetLimit = bnProofOfStakeLimit;
bnTargetLimit.SetCompact(bnTargetLimit.GetCompact());
int64_t nSubsidyLimit = 4000 * COIN;

// ColossusCoin2: reward for coin-year is cut in half every 64x multiply of PoS difficulty
// A reasonably continuous curve is used to avoid shock to market
// (bnRewardCoinYearLimit / nRewardCoinYear) ** 4 == bnProofOfStakeLimit / bnTarget
//
// Human readable form:
//
// nRewardCoinYear = 1 / (posdiff ^ 1/4)

CBigNum bnTargetLimit = bnProofOfStakeLimit;
CBigNum bnLowerBound;
bnLowerBound = 4 * CENT; // Lower interest bound is 4% per year

CBigNum bnUpperBound = bnRewardCoinYearLimit;
while (bnLowerBound + CENT <= bnUpperBound)
{
CBigNum bnMidValue = (bnLowerBound + bnUpperBound) / 2;
if (fDebug && GetBoolArg("-printcreation"))
printf("GetProofOfStakeReward() : lower=%"PRId64" upper=%"PRId64" mid=%"PRId64"\n", bnLowerBound.getuint64(), bnUpperBound.getuint64(), bnMidValue.getuint64());

bnTargetLimit.SetCompact(bnTargetLimit.GetCompact());
if (bnMidValue * bnMidValue * bnMidValue * bnMidValue * bnTargetLimit > bnRewardCoinYearLimit * bnRewardCoinYearLimit * bnRewardCoinYearLimit * bnRewardCoinYearLimit * bnTarget)
bnUpperBound = bnMidValue;
else
bnLowerBound = bnMidValue;
}

int64_t nSubsidyLimit = 25000 * COIN;
nRewardCoinYear = bnUpperBound.getuint64();
nRewardCoinYear = min(nRewardCoinYear, nRewardCoinYearLimit);

// ColossusCoin2: reward for coin-year is cut in half every 64x multiply of PoS difficulty
// A reasonably continuous curve is used to avoid shock to market
// (bnRewardCoinYearLimit / nRewardCoinYear) ** 4 == bnProofOfStakeLimit / bnTarget
//
// Human readable form:
//
// nRewardCoinYear = 1 / (posdiff ^ 1/4)
int64_t nSubsidy = (nCoinAge * 33 * nRewardCoinYear) / (365 * 33 + 8);

CBigNum bnLowerBound;
bnLowerBound = 4 * CENT; // Lower interest bound is 4% per year
if (fDebug && GetBoolArg("-printcreation"))
printf("GetProofOfStakeReward(): create=%s nCoinAge=%"PRId64" nBits=%d\n", FormatMoney(nSubsidy).c_str(), nCoinAge, nBits);

CBigNum bnUpperBound = bnRewardCoinYearLimit;
while (bnLowerBound + CENT <= bnUpperBound)
{
CBigNum bnMidValue = (bnLowerBound + bnUpperBound) / 2;
if (fDebug && GetBoolArg("-printcreation"))
printf("GetProofOfStakeReward() : lower=%"PRId64" upper=%"PRId64" mid=%"PRId64"\n", bnLowerBound.getuint64(), bnUpperBound.getuint64(), bnMidValue.getuint64());
nSubsidy = min(nSubsidy, nSubsidyLimit) + (nFees / 10);

if (bnMidValue * bnMidValue * bnMidValue * bnMidValue * bnTargetLimit > bnRewardCoinYearLimit * bnRewardCoinYearLimit * bnRewardCoinYearLimit * bnRewardCoinYearLimit * bnTarget)
bnUpperBound = bnMidValue;
else
bnLowerBound = bnMidValue;
return nSubsidy + nFees;
}

nRewardCoinYear = bnUpperBound.getuint64();
nRewardCoinYear = min(nRewardCoinYear, nRewardCoinYearLimit);
else
{
int64_t nRewardCoinYear;

CBigNum bnRewardCoinYearLimit;
int64_t nRewardCoinYearLimit;

bnRewardCoinYearLimit = MAX_MINT_PROOF_OF_STAKE; // Base stake mint rate, 8% year interest
nRewardCoinYearLimit = MAX_MINT_PROOF_OF_STAKE;

CBigNum bnTarget;
bnTarget.SetCompact(nBits);
CBigNum bnTargetLimit = bnProofOfStakeLimit;
bnTargetLimit.SetCompact(bnTargetLimit.GetCompact());
int64_t nSubsidyLimit = 25000 * COIN;

int64_t nSubsidy = (nCoinAge * 33 * nRewardCoinYear) / (365 * 33 + 8);
// ColossusCoin2: reward for coin-year is cut in half every 64x multiply of PoS difficulty
// A reasonably continuous curve is used to avoid shock to market
// (bnRewardCoinYearLimit / nRewardCoinYear) ** 4 == bnProofOfStakeLimit / bnTarget
//
// Human readable form:
//
// nRewardCoinYear = 1 / (posdiff ^ 1/4)

if (fDebug && GetBoolArg("-printcreation"))
printf("GetProofOfStakeReward(): create=%s nCoinAge=%"PRId64" nBits=%d\n", FormatMoney(nSubsidy).c_str(), nCoinAge, nBits);
CBigNum bnLowerBound;
bnLowerBound = 4 * CENT; // Lower interest bound is 4% per year

nSubsidy = min(nSubsidy, nSubsidyLimit) + nFees;
CBigNum bnUpperBound = bnRewardCoinYearLimit;
while (bnLowerBound + CENT <= bnUpperBound)
{
CBigNum bnMidValue = (bnLowerBound + bnUpperBound) / 2;
if (fDebug && GetBoolArg("-printcreation"))
printf("GetProofOfStakeReward() : lower=%"PRId64" upper=%"PRId64" mid=%"PRId64"\n", bnLowerBound.getuint64(), bnUpperBound.getuint64(), bnMidValue.getuint64());

return nSubsidy + nFees;
if (bnMidValue * bnMidValue * bnMidValue * bnMidValue * bnTargetLimit > bnRewardCoinYearLimit * bnRewardCoinYearLimit * bnRewardCoinYearLimit * bnRewardCoinYearLimit * bnTarget)
bnUpperBound = bnMidValue;
else
bnLowerBound = bnMidValue;
}

nRewardCoinYear = bnUpperBound.getuint64();
nRewardCoinYear = min(nRewardCoinYear, nRewardCoinYearLimit);

int64_t nSubsidy = (nCoinAge * 33 * nRewardCoinYear) / (365 * 33 + 8);

if (fDebug && GetBoolArg("-printcreation"))
printf("GetProofOfStakeReward(): create=%s nCoinAge=%"PRId64" nBits=%d\n", FormatMoney(nSubsidy).c_str(), nCoinAge, nBits);

nSubsidy = min(nSubsidy, nSubsidyLimit) + nFees;

return nSubsidy + nFees;
}

return nSubsidy + nFees;
}

static const int64_t nTargetTimespan = 60 * 60; // 60 mins
Expand Down
1 change: 1 addition & 0 deletions src/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ static const int64_t MIN_RELAY_TX_FEE = MIN_TX_FEE;
static const int64_t MAX_MONEY = 50000000000 * COIN;
static const int64_t COIN_YEAR_REWARD = 8 * CENT; // 8% per year
static const int64_t MAX_MINT_PROOF_OF_STAKE = 0.08 * COIN; // 8% annual interest
static const unsigned int REWARD_SWITCH_TIME = 1420603000; //01/07/2015 @ 4:00am (UTC)
static const int MODIFIER_INTERVAL_SWITCH = 1;

inline bool MoneyRange(int64_t nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
Expand Down

0 comments on commit 0db0100

Please sign in to comment.