From dd82c0ec3b616dc46299def8fad66fc3c1c9d886 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 20 Aug 2013 01:49:44 +0400 Subject: [PATCH] Update block checkings * Checkpoints list updated, removed some legacy checkpoints and added the new one * Stake modifier checkpoint added * ComputeMinWork/ComputeMinStake functions --- src/checkpoints.cpp | 8 +------- src/kernel.cpp | 5 +---- src/main.cpp | 33 +++++++++++++++++++++++++++------ src/main.h | 1 + 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp index 798cfb8..7f3f3c8 100644 --- a/src/checkpoints.cpp +++ b/src/checkpoints.cpp @@ -36,16 +36,10 @@ namespace Checkpoints static MapCheckpoints mapCheckpoints = boost::assign::map_list_of ( 0, initCheckpoint(hashGenesisBlock, 1360105017) ) - ( 6000, initCheckpoint(uint256("0x000000000945e3c9d8e15df834e802521eb79f9ceb4191a27bdfadad4b777f4a"), 1360814368) ) ( 9690, initCheckpoint(uint256("0x00000000026561450859c46868099e0df6068a538f038cb18988fd8d47dcdaf5"), 1362791423) ) ( 13560, initCheckpoint(uint256("0xa1591a0fcbf11f282d671581edb9f0aadcd06fee69761081e0a3245914c13729"), 1364674052) ) - ( 14189, initCheckpoint(uint256("0x00000000020f76474d2522b19c7bfafc43ba6ecbabae54293bcd9546159c8c1d"), 1365215020) ) - ( 19600, initCheckpoint(uint256("0x252ae08d6df4bc7220c1dcdaed7b8a6e78bab05a60173511e8f565a3a38ce3c3"), 1367840555) ) - ( 21800, initCheckpoint(uint256("0x64bdeb35023f240ed01beaa082f840f2d4cc6defccbbcda1260de87e58296b37"), 1368888542) ) - ( 26174, initCheckpoint(uint256("0x00000000006cf1bfaa0d73caea92f6d2afa465651a76415b8d53b0bb0e01a8be"), 1371039324) ) - ( 27451, initCheckpoint(uint256("0xd65424c24041b9f2e531f8f275f1a3c8bb105f0b29005b0bd577ae1a73341080"), 1371687462) ) ( 37092, initCheckpoint(uint256("0x0000000000a38c2f98556f46793b453e92d8fab2d31c0b93fd08bcf78e56099d"), 1376677203) ) - ; + ; // TestNet has no checkpoints static MapCheckpoints mapCheckpointsTestnet = diff --git a/src/kernel.cpp b/src/kernel.cpp index 0a0ef9d..49e9fc7 100644 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -18,12 +18,9 @@ typedef std::map MapModifierCheckpoints; static std::map mapStakeModifierCheckpoints = boost::assign::map_list_of ( 0, 0x0e00670bu ) - ( 6000, 0xb7cbc5d3u ) ( 9690, 0x97dcdafau ) ( 12661, 0x5d84115du ) - ( 19600, 0xdded1b8du ) - ( 21800, 0x0daa1aaau ) - ( 26174, 0xaf9983dcu ) + ( 37092, 0xd230afccu ) ; // Hard checkpoints of stake modifiers to ensure they are deterministic (testNet) diff --git a/src/main.cpp b/src/main.cpp index 26e89f0..b3e7223 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1104,13 +1104,10 @@ int64 inline GetTargetSpacingWorkMax(int nHeight, unsigned int nTime) } // -// minimum amount of work that could possibly be required nTime after -// minimum work required was nBase +// maximum nBits value could possible be required nTime after // -unsigned int ComputeMinWork(unsigned int nBase, int64 nTime) +unsigned int ComputeMaxBits(CBigNum bnTargetLimit, unsigned int nBase, int64 nTime) { - CBigNum bnTargetLimit = bnProofOfWorkLimit; - CBigNum bnResult; bnResult.SetCompact(nBase); bnResult *= 2; @@ -1125,6 +1122,25 @@ unsigned int ComputeMinWork(unsigned int nBase, int64 nTime) return bnResult.GetCompact(); } +// +// minimum amount of work that could possibly be required nTime after +// minimum proof-of-work required was nBase +// +unsigned int ComputeMinWork(unsigned int nBase, int64 nTime) +{ + return ComputeMaxBits(bnProofOfWorkLimit, nBase, nTime); +} + +// +// minimum amount of stake that could possibly be required nTime after +// minimum proof-of-stake required was nBase +// +unsigned int ComputeMinStake(unsigned int nBase, int64 nTime, unsigned int nBlockTime) +{ + return ComputeMaxBits(GetProofOfStakeLimit(0, nBlockTime), nBase, nTime); +} + + // ppcoin: find last block index up to pindex const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfStake) { @@ -2443,7 +2459,12 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) CBigNum bnNewBlock; bnNewBlock.SetCompact(pblock->nBits); CBigNum bnRequired; - bnRequired.SetCompact(ComputeMinWork(GetLastBlockIndex(pcheckpoint, pblock->IsProofOfStake())->nBits, deltaTime)); + + if (pblock->IsProofOfStake()) + bnRequired.SetCompact(ComputeMinStake(GetLastBlockIndex(pcheckpoint, true)->nBits, deltaTime, pblock->nTime)); + else + bnRequired.SetCompact(ComputeMinWork(GetLastBlockIndex(pcheckpoint, false)->nBits, deltaTime)); + if (bnNewBlock > bnRequired) { if (pfrom) diff --git a/src/main.h b/src/main.h index 34913bf..7c90ad5 100644 --- a/src/main.h +++ b/src/main.h @@ -121,6 +121,7 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits); int64 GetProofOfWorkReward(unsigned int nBits); int64 GetProofOfStakeReward(int64 nCoinAge, unsigned int nBits, unsigned int nTime, bool bCoinYearOnly=false); unsigned int ComputeMinWork(unsigned int nBase, int64 nTime); +unsigned int ComputeMinStake(unsigned int nBase, int64 nTime, unsigned int nBlockTime); int GetNumBlocksOfPeers(); bool IsInitialBlockDownload(); std::string GetWarnings(std::string strFor); -- 1.7.1