forked from bitcoin/bitcoin
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
merge bitcoin#24858: incorrect blk file size calculation during reind…
…ex results in recoverable blk file corruption
- Loading branch information
Showing
5 changed files
with
65 additions
and
5 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
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) 2022 The Bitcoin 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 <node/blockstorage.h> | ||
#include <node/context.h> | ||
#include <validation.h> | ||
|
||
#include <boost/test/unit_test.hpp> | ||
#include <test/util/setup_common.h> | ||
|
||
// use BasicTestingSetup here for the data directory configuration, setup, and cleanup | ||
BOOST_FIXTURE_TEST_SUITE(blockmanager_tests, BasicTestingSetup) | ||
|
||
BOOST_AUTO_TEST_CASE(blockmanager_find_block_pos) | ||
{ | ||
const auto params {CreateChainParams(ArgsManager{}, CBaseChainParams::MAIN)}; | ||
BlockManager blockman {}; | ||
CChain chain {}; | ||
// simulate adding a genesis block normally | ||
BOOST_CHECK_EQUAL(blockman.SaveBlockToDisk(params->GenesisBlock(), 0, chain, *params, nullptr).nPos, BLOCK_SERIALIZATION_HEADER_SIZE); | ||
// simulate what happens during reindex | ||
// simulate a well-formed genesis block being found at offset 8 in the blk00000.dat file | ||
// the block is found at offset 8 because there is an 8 byte serialization header | ||
// consisting of 4 magic bytes + 4 length bytes before each block in a well-formed blk file. | ||
FlatFilePos pos{0, BLOCK_SERIALIZATION_HEADER_SIZE}; | ||
BOOST_CHECK_EQUAL(blockman.SaveBlockToDisk(params->GenesisBlock(), 0, chain, *params, &pos).nPos, BLOCK_SERIALIZATION_HEADER_SIZE); | ||
// now simulate what happens after reindex for the first new block processed | ||
// the actual block contents don't matter, just that it's a block. | ||
// verify that the write position is at offset 0x12d. | ||
// this is a check to make sure that https://github.com/bitcoin/bitcoin/issues/21379 does not recur | ||
// 8 bytes (for serialization header) + 285 (for serialized genesis block) = 293 | ||
// add another 8 bytes for the second block's serialization header and we get 293 + 8 = 301 | ||
FlatFilePos actual{blockman.SaveBlockToDisk(params->GenesisBlock(), 1, chain, *params, nullptr)}; | ||
BOOST_CHECK_EQUAL(actual.nPos, BLOCK_SERIALIZATION_HEADER_SIZE + ::GetSerializeSize(params->GenesisBlock(), CLIENT_VERSION) + BLOCK_SERIALIZATION_HEADER_SIZE); | ||
} | ||
|
||
BOOST_AUTO_TEST_SUITE_END() |
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