Skip to content

Commit

Permalink
Merge pull request #32 from AntelopeIO/fix_empty_action_mroot
Browse files Browse the repository at this point in the history
Fix how block_states are constructed for transition to contain correct validation tree data
  • Loading branch information
linh2931 authored Apr 16, 2024
2 parents bfbdcca + ded357d commit 78f42de
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 12 deletions.
14 changes: 14 additions & 0 deletions libraries/chain/block_state.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,18 @@ block_state_ptr block_state::create_if_genesis_block(const block_state_legacy& b
return result_ptr;
}

block_state_ptr block_state::create_transition_block(
const block_header_state& prev,
signed_block_ptr b,
const protocol_feature_set& pfs,
const validator_t& validator,
bool skip_validate_signee,
const std::optional<digest_type>& action_mroot_savanna) {
auto result_ptr = std::make_shared<block_state>(prev, b, pfs, validator, skip_validate_signee);
result_ptr->action_mroot = action_mroot_savanna.has_value() ? *action_mroot_savanna : digest_type();
return result_ptr;
}

block_state::block_state(snapshot_detail::snapshot_block_state_v7&& sbs)
: block_header_state {
.block_id = sbs.block_id,
Expand Down Expand Up @@ -250,6 +262,8 @@ void block_state::verify_qc(const valid_quorum_certificate& qc) const {
valid_t block_state::new_valid(const block_header_state& next_bhs, const digest_type& action_mroot, const digest_type& strong_digest) const {
assert(valid);
assert(next_bhs.core.last_final_block_num() >= core.last_final_block_num());
assert(!action_mroot.empty());
assert(!strong_digest.empty());

// Copy parent's validation_tree and validation_mroots.
auto start = next_bhs.core.last_final_block_num() - core.last_final_block_num();
Expand Down
25 changes: 13 additions & 12 deletions libraries/chain/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1348,12 +1348,14 @@ struct controller_impl {
block_state_ptr prev = forkdb.root();
assert(prev);
for (auto bitr = legacy_branch.rbegin(); bitr != legacy_branch.rend(); ++bitr) {
assert(read_mode == db_read_mode::IRREVERSIBLE || (*bitr)->action_mroot_savanna.has_value());
const bool skip_validate_signee = true; // validated already
auto new_bsp = std::make_shared<block_state>(
auto new_bsp = block_state::create_transition_block(
*prev,
(*bitr)->block,
protocol_features.get_protocol_feature_set(),
validator_t{}, skip_validate_signee);
validator_t{}, skip_validate_signee,
(*bitr)->action_mroot_savanna);
transition_add_to_savanna_fork_db(forkdb, *bitr, new_bsp, prev);
prev = new_bsp;
}
Expand Down Expand Up @@ -1529,11 +1531,14 @@ struct controller_impl {
prev = block_state::create_if_genesis_block(*legacy_branch[0]);
} else {
const auto& bspl = legacy_branch[i];
auto new_bsp = std::make_shared<block_state>(
assert(bspl->action_mroot_savanna.has_value());
assert(read_mode == db_read_mode::IRREVERSIBLE || bspl->action_mroot_savanna.has_value());
auto new_bsp = block_state::create_transition_block(
*prev,
bspl->block,
protocol_features.get_protocol_feature_set(),
validator_t{}, skip_validate_signee);
validator_t{}, skip_validate_signee,
bspl->action_mroot_savanna);
// legacy_branch is from head, all should be validated
assert(bspl->action_mroot_savanna);
// Create the valid structure for producing
Expand Down Expand Up @@ -4439,17 +4444,13 @@ struct controller_impl {
const bool skip_validate_signee = true; // validated already

for (; bitr != legacy_branch.rend(); ++bitr) {
auto new_bsp = std::make_shared<block_state>(
assert((*bitr)->action_mroot_savanna.has_value());
assert(read_mode == db_read_mode::IRREVERSIBLE || (*bitr)->action_mroot_savanna.has_value());
auto new_bsp = block_state::create_transition_block(
*prev,
(*bitr)->block,
protocol_features.get_protocol_feature_set(),
validator_t{}, skip_validate_signee);

// We only need action_mroot of the last block for finality_data
if ((bitr + 1) == legacy_branch.rend()) {
assert((*bitr)->action_mroot_savanna);
new_bsp->action_mroot = *((*bitr)->action_mroot_savanna);
}
validator_t{}, skip_validate_signee, (*bitr)->action_mroot_savanna);

prev = new_bsp;
}
Expand Down
9 changes: 9 additions & 0 deletions libraries/chain/include/eosio/chain/block_state.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,15 @@ struct block_state : public block_header_state { // block_header_state provi

static std::shared_ptr<block_state> create_if_genesis_block(const block_state_legacy& bsp);

// Constructs a Transition Savanna block state from a Legacy block state.
static std::shared_ptr<block_state> create_transition_block(
const block_header_state& prev,
signed_block_ptr b,
const protocol_feature_set& pfs,
const validator_t& validator,
bool skip_validate_signee,
const std::optional<digest_type>& action_mroot_savanna);

explicit block_state(snapshot_detail::snapshot_block_state_v7&& sbs);

void sign(const signer_callback_type& signer, const block_signing_authority& valid_block_signing_authority);
Expand Down

0 comments on commit 78f42de

Please sign in to comment.