Changeset View
Changeset View
Standalone View
Standalone View
src/test/finalization_tests.cpp
Show All 17 Lines | BOOST_AUTO_TEST_CASE(finalizationDelay) { | ||||
CScript p2pk_scriptPubKey = | CScript p2pk_scriptPubKey = | ||||
CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG; | CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG; | ||||
CBlock block; | CBlock block; | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
// We should have no finalized block because the 100 blocks generated by | // We should have no finalized block because the 100 blocks generated by | ||||
// the test setup are too close to "now"; | // the test setup are too close to "now"; | ||||
BOOST_CHECK_MESSAGE(GetFinalizedBlock() == nullptr, | BOOST_CHECK_MESSAGE(::ChainstateActive().GetFinalizedBlock() == nullptr, | ||||
"No block finalized (tip at height " | "No block finalized (tip at height " | ||||
<< ::ChainActive().Tip()->nHeight << ")"); | << ::ChainActive().Tip()->nHeight << ")"); | ||||
} | } | ||||
// Create maxreorgdepth blocks. Auto-finalization will not occur because | // Create maxreorgdepth blocks. Auto-finalization will not occur because | ||||
// the delay is not expired | // the delay is not expired | ||||
int64_t mockedTime = GetTime(); | int64_t mockedTime = GetTime(); | ||||
for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | ||||
block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
// These blocks are too recent. | // These blocks are too recent. | ||||
BOOST_CHECK_MESSAGE(GetFinalizedBlock() == nullptr, | BOOST_CHECK_MESSAGE(::ChainstateActive().GetFinalizedBlock() == nullptr, | ||||
"No block finalized (tip at height " | "No block finalized (tip at height " | ||||
<< ::ChainActive().Tip()->nHeight << ")"); | << ::ChainActive().Tip()->nHeight << ")"); | ||||
} | } | ||||
// Make the finalization time to expire | // Make the finalization time to expire | ||||
mockedTime += DEFAULT_MIN_FINALIZATION_DELAY + 1; | mockedTime += DEFAULT_MIN_FINALIZATION_DELAY + 1; | ||||
SetMockTime(mockedTime); | SetMockTime(mockedTime); | ||||
// Next maxreorgdepth blocks should cause auto-finalization | // Next maxreorgdepth blocks should cause auto-finalization | ||||
CBlockIndex *blockToFinalize = ::ChainActive().Tip()->GetAncestor( | CBlockIndex *blockToFinalize = ::ChainActive().Tip()->GetAncestor( | ||||
::ChainActive().Tip()->nHeight - DEFAULT_MAX_REORG_DEPTH); | ::ChainActive().Tip()->nHeight - DEFAULT_MAX_REORG_DEPTH); | ||||
for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | ||||
blockToFinalize = ::ChainActive().Next(blockToFinalize); | blockToFinalize = ::ChainActive().Next(blockToFinalize); | ||||
block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
BOOST_CHECK_MESSAGE(GetFinalizedBlock() == blockToFinalize, | BOOST_CHECK_MESSAGE( | ||||
::ChainstateActive().GetFinalizedBlock() == blockToFinalize, | |||||
"Block finalized at height " | "Block finalized at height " | ||||
<< blockToFinalize->nHeight | << blockToFinalize->nHeight << " (tip at height " | ||||
<< " (tip at height " | |||||
<< ::ChainActive().Tip()->nHeight << ")"); | << ::ChainActive().Tip()->nHeight << ")"); | ||||
} | } | ||||
// Next blocks won't cause auto-finalization because the delay is not | // Next blocks won't cause auto-finalization because the delay is not | ||||
// expired | // expired | ||||
for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | ||||
block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
// These blocks are finalized. | // These blocks are finalized. | ||||
BOOST_CHECK_MESSAGE(GetFinalizedBlock() == blockToFinalize, | BOOST_CHECK_MESSAGE( | ||||
::ChainstateActive().GetFinalizedBlock() == blockToFinalize, | |||||
"Finalized block remains unchanged at height " | "Finalized block remains unchanged at height " | ||||
<< blockToFinalize->nHeight | << blockToFinalize->nHeight << " (tip at height " | ||||
<< " (tip at height " | |||||
<< ::ChainActive().Tip()->nHeight << ")"); | << ::ChainActive().Tip()->nHeight << ")"); | ||||
} | } | ||||
// Make the finalization time to expire | // Make the finalization time to expire | ||||
mockedTime += DEFAULT_MIN_FINALIZATION_DELAY + 1; | mockedTime += DEFAULT_MIN_FINALIZATION_DELAY + 1; | ||||
SetMockTime(mockedTime); | SetMockTime(mockedTime); | ||||
blockToFinalize = ::ChainActive().Tip()->GetAncestor( | blockToFinalize = ::ChainActive().Tip()->GetAncestor( | ||||
::ChainActive().Tip()->nHeight - DEFAULT_MAX_REORG_DEPTH); | ::ChainActive().Tip()->nHeight - DEFAULT_MAX_REORG_DEPTH); | ||||
// Create some more blocks. | // Create some more blocks. | ||||
// Finalization should start moving again. | // Finalization should start moving again. | ||||
for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | ||||
blockToFinalize = ::ChainActive().Next(blockToFinalize); | blockToFinalize = ::ChainActive().Next(blockToFinalize); | ||||
block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
BOOST_CHECK_MESSAGE(GetFinalizedBlock() == blockToFinalize, | BOOST_CHECK_MESSAGE( | ||||
::ChainstateActive().GetFinalizedBlock() == blockToFinalize, | |||||
"Block finalized at height " | "Block finalized at height " | ||||
<< blockToFinalize->nHeight | << blockToFinalize->nHeight << " (tip at height " | ||||
<< " (tip at height " | |||||
<< ::ChainActive().Tip()->nHeight << ")"); | << ::ChainActive().Tip()->nHeight << ")"); | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |