Skip to content

Commit

Permalink
blockchaintest: Only check state root for 5 first/last blocks
Browse files Browse the repository at this point in the history
This is blockchain tests execution optimization: only check state root
hash of first 5 blocks (to detect early problems) and last 5 blocks
(to do the final check of the chain of blocks).

The current implementation of the MPT hash of the state builds
the trie from scratch (no updates to the trie of the previous block).
For the tests will a long chain of blocks the performance degrades
significantly with 99% time spent in the keccak hash function.

This improves testing of EIP-2935
implemented in #953.
  • Loading branch information
chfast committed Aug 19, 2024
1 parent 85ded61 commit 52e4530
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions test/blockchaintest/blockchaintest_runner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,9 @@ void run_blockchain_tests(std::span<const BlockchainTest> tests, evmc::VM& vm)
std::unordered_map<int64_t, hash256> known_block_hashes{
{c.genesis_block_header.block_number, c.genesis_block_header.hash}};

for (const auto& test_block : c.test_blocks)
for (size_t i = 0; i != c.test_blocks.size(); ++i)
{
const auto& test_block = c.test_blocks[i];
auto bi = test_block.block_info;
bi.known_block_hashes = known_block_hashes;

Expand All @@ -157,8 +158,17 @@ void run_blockchain_tests(std::span<const BlockchainTest> tests, evmc::VM& vm)
SCOPED_TRACE(std::string{evmc::to_string(rev)} + '/' + std::to_string(case_index) +
'/' + c.name + '/' + std::to_string(test_block.block_info.number));

EXPECT_EQ(
state::mpt_hash(TestState{state}), test_block.expected_block_header.state_root);
static constexpr size_t STATE_HASH_CHECK_MARGIN = 5;
if (i < STATE_HASH_CHECK_MARGIN || i >= c.test_blocks.size() - STATE_HASH_CHECK_MARGIN)
{
// Only check state hashes for first (early problems)
// and last (final check of the chain) blocks.
// Otherwise, for very long blockchain test we spend a lot of time in MPT hashing
// because the implementation of it is very simplistic: the trie is not updated
// along the state changes but a new trie is build from scratch for every block.
EXPECT_EQ(
state::mpt_hash(TestState{state}), test_block.expected_block_header.state_root);
}

if (rev >= EVMC_SHANGHAI)
{
Expand Down

0 comments on commit 52e4530

Please sign in to comment.