Changeset View
Changeset View
Standalone View
Standalone View
src/test/pow_tests.cpp
Show First 20 Lines • Show All 73 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
BOOST_AUTO_TEST_CASE(GetBlockProofEquivalentTime_test) { | BOOST_AUTO_TEST_CASE(GetBlockProofEquivalentTime_test) { | ||||
SelectParams(CBaseChainParams::MAIN); | SelectParams(CBaseChainParams::MAIN); | ||||
const Consensus::Params ¶ms = Params().GetConsensus(); | const Consensus::Params ¶ms = Params().GetConsensus(); | ||||
std::vector<CBlockIndex> blocks(10000); | std::vector<CBlockIndex> blocks(10000); | ||||
for (int i = 0; i < 10000; i++) { | for (int i = 0; i < 10000; i++) { | ||||
blocks[i].pprev = i ? &blocks[i - 1] : NULL; | blocks[i].pprev = i ? &blocks[i - 1] : nullptr; | ||||
blocks[i].nHeight = i; | blocks[i].nHeight = i; | ||||
blocks[i].nTime = 1269211443 + i * params.nPowTargetSpacing; | blocks[i].nTime = 1269211443 + i * params.nPowTargetSpacing; | ||||
blocks[i].nBits = 0x207fffff; /* target 0x7fffff000... */ | blocks[i].nBits = 0x207fffff; /* target 0x7fffff000... */ | ||||
blocks[i].nChainWork = | blocks[i].nChainWork = | ||||
i ? blocks[i - 1].nChainWork + GetBlockProof(blocks[i - 1]) | i ? blocks[i - 1].nChainWork + GetBlockProof(blocks[i - 1]) | ||||
: arith_uint256(0); | : arith_uint256(0); | ||||
} | } | ||||
for (int j = 0; j < 1000; j++) { | for (int j = 0; j < 1000; j++) { | ||||
CBlockIndex *p1 = &blocks[GetRand(10000)]; | CBlockIndex *p1 = &blocks[GetRand(10000)]; | ||||
CBlockIndex *p2 = &blocks[GetRand(10000)]; | CBlockIndex *p2 = &blocks[GetRand(10000)]; | ||||
CBlockIndex *p3 = &blocks[GetRand(10000)]; | CBlockIndex *p3 = &blocks[GetRand(10000)]; | ||||
int64_t tdiff = GetBlockProofEquivalentTime(*p1, *p2, *p3, params); | int64_t tdiff = GetBlockProofEquivalentTime(*p1, *p2, *p3, params); | ||||
BOOST_CHECK_EQUAL(tdiff, p1->GetBlockTime() - p2->GetBlockTime()); | BOOST_CHECK_EQUAL(tdiff, p1->GetBlockTime() - p2->GetBlockTime()); | ||||
} | } | ||||
} | } | ||||
static CBlockIndex GetBlockIndex(CBlockIndex *pindexPrev, int64_t nTimeInterval, | |||||
uint32_t nBits) { | |||||
CBlockIndex block; | |||||
block.pprev = pindexPrev; | |||||
block.nHeight = pindexPrev->nHeight + 1; | |||||
block.nTime = pindexPrev->nTime + nTimeInterval; | |||||
block.nBits = nBits; | |||||
return block; | |||||
} | |||||
BOOST_AUTO_TEST_CASE(retargeting_test) { | |||||
SelectParams(CBaseChainParams::MAIN); | |||||
const Consensus::Params ¶ms = Params().GetConsensus(); | |||||
std::vector<CBlockIndex> blocks(1013); | |||||
// Genesis block? | |||||
blocks[0] = CBlockIndex(); | |||||
blocks[0].nHeight = 0; | |||||
blocks[0].nTime = 1269211443; | |||||
blocks[0].nBits = 0x207fffff; | |||||
// Pile up some blocks. | |||||
for (size_t i = 1; i < 1000; i++) { | |||||
blocks[i] = | |||||
GetBlockIndex(&blocks[i - 1], params.nPowTargetSpacing, 0x207fffff); | |||||
} | |||||
CBlockHeader blkHeaderDummy; | |||||
// We start getting 2h blocks time. For the first 5 blocks, it doesn't | |||||
// matter as the MTP is not affected. For the next 5 block, MTP difference | |||||
// increases but stays bellow 12h. | |||||
for (size_t i = 1000; i < 1010; i++) { | |||||
blocks[i] = GetBlockIndex(&blocks[i - 1], 2 * 3600, 0x207fffff); | |||||
BOOST_CHECK_EQUAL( | |||||
GetNextWorkRequired(&blocks[i], &blkHeaderDummy, params), | |||||
0x207fffff); | |||||
} | |||||
// Now we expect the difficulty to decrease. | |||||
blocks[1010] = GetBlockIndex(&blocks[1009], 2 * 3600, 0x207fffff); | |||||
BOOST_CHECK_EQUAL( | |||||
GetNextWorkRequired(&blocks[1010], &blkHeaderDummy, params), | |||||
0x1d00ffff); | |||||
} | |||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |