diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index df882f3f68..a5ead00337 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -512,10 +512,10 @@ struct building_block { R apply_l(F&& f) { if constexpr (std::is_same_v) std::visit(overloaded{[&](building_block_legacy& bb) { std::forward(f)(bb); }, - [&](building_block_if& bb) {}}, v); + [&](building_block_if&) {}}, v); else return std::visit(overloaded{[&](building_block_legacy& bb) -> R { return std::forward(f)(bb); }, - [&](building_block_if& bb) -> R { return {}; }}, v); + [&](building_block_if&) -> R { return {}; }}, v); } void set_proposed_finalizer_policy(const finalizer_policy& fin_pol) { @@ -3195,7 +3195,7 @@ struct controller_impl { auto& bb = std::get(pending->_block_stage); bb.set_proposed_finalizer_policy(fin_pol); - apply_l(chain_head, [&](auto&) { + bb.apply_l([&](building_block::building_block_legacy& bl) { // Savanna uses new algorithm for proposer schedule change, prevent any in-flight legacy proposer schedule changes const auto& gpo = db.get(); if (gpo.proposed_schedule_block_num) { @@ -3205,6 +3205,8 @@ struct controller_impl { gp.proposed_schedule.producers.clear(); }); } + bl.new_pending_producer_schedule = {}; + bl.pending_block_header_state.prev_pending_schedule.schedule.producers.clear(); }); } @@ -5046,6 +5048,15 @@ int64_t controller_impl::set_proposed_producers_legacy( vector(pending->_block_stage); + bool transition_block = bb.apply_l([](building_block::building_block_legacy& bl) { + return bl.pending_block_header_state.is_if_transition_block() || bl.new_finalizer_policy; + }); + if (transition_block) + return -1; + sch.producers = std::move(producers); int64_t version = sch.version; diff --git a/libraries/chain/include/eosio/chain/block_header_state_legacy.hpp b/libraries/chain/include/eosio/chain/block_header_state_legacy.hpp index 049947f536..7e9e8abb6a 100644 --- a/libraries/chain/include/eosio/chain/block_header_state_legacy.hpp +++ b/libraries/chain/include/eosio/chain/block_header_state_legacy.hpp @@ -53,6 +53,8 @@ struct pending_block_header_state_legacy : public detail::block_header_state_leg uint16_t confirmed = 1; std::optional qc_claim; // transition to savanna has begun + bool is_if_transition_block() const { return !!qc_claim; } + signed_block_header make_block_header( const checksum256_type& transaction_mroot, const checksum256_type& action_mroot, const std::optional& new_producers, diff --git a/unittests/producer_schedule_if_tests.cpp b/unittests/producer_schedule_if_tests.cpp index b87bcd2477..dd24d501dd 100644 --- a/unittests/producer_schedule_if_tests.cpp +++ b/unittests/producer_schedule_if_tests.cpp @@ -67,6 +67,7 @@ BOOST_FIXTURE_TEST_CASE( verify_producer_schedule_after_instant_finality_activat auto setfin_block = produce_block(); // this block contains the header extension of the finalizer set for (block_num_type active_block_num = setfin_block->block_num(); active_block_num > lib; produce_block()) { + set_producers({"initc"_n, "inite"_n}); // should be ignored since in transition (void)active_block_num; // avoid warning };