diff --git a/libraries/chain/block_header_state_legacy.cpp b/libraries/chain/block_header_state_legacy.cpp index 89ccbe9562..a47ca2282f 100644 --- a/libraries/chain/block_header_state_legacy.cpp +++ b/libraries/chain/block_header_state_legacy.cpp @@ -216,7 +216,7 @@ namespace eosio::chain { } if (new_finalizer_policy) { - new_finalizer_policy->generation = 1; // only allowed to be set once + assert(new_finalizer_policy->generation == 1); // only allowed to be set once // set current block_num as qc_claim.last_qc_block_num in the IF extension qc_claim_t initial_if_claim { .block_num = block_num, .is_strong_qc = false }; diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 5645b2b6b3..f0beb42d4e 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -518,8 +518,17 @@ struct building_block { [&](building_block_if&) -> R { return {}; }}, v); } - void set_proposed_finalizer_policy(const finalizer_policy& fin_pol) { - std::visit([&](auto& bb) { bb.new_finalizer_policy = fin_pol; }, v); + void set_proposed_finalizer_policy(finalizer_policy&& fin_pol) + { + std::visit(overloaded{ [&](building_block_legacy& bb) { + fin_pol.generation = 1; // only allowed to be set once in legacy mode + bb.new_finalizer_policy = std::move(fin_pol); + }, + [&](building_block_if& bb) { + fin_pol.generation = bb.parent.active_finalizer_policy->generation + 1; + bb.new_finalizer_policy = std::move(fin_pol); + } }, + v); } deque extract_trx_metas() { @@ -3185,10 +3194,10 @@ struct controller_impl { pending->push(); } - void set_proposed_finalizers(const finalizer_policy& fin_pol) { + void set_proposed_finalizers(finalizer_policy&& fin_pol) { assert(pending); // has to exist and be building_block since called from host function auto& bb = std::get(pending->_block_stage); - bb.set_proposed_finalizer_policy(fin_pol); + bb.set_proposed_finalizer_policy(std::move(fin_pol)); 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 @@ -5155,8 +5164,8 @@ int64_t controller_impl::set_proposed_producers_legacy( vectorset_proposed_finalizers(fin_pol); +void controller::set_proposed_finalizers( finalizer_policy&& fin_pol ) { + my->set_proposed_finalizers(std::move(fin_pol)); } // called from net threads diff --git a/libraries/chain/include/eosio/chain/controller.hpp b/libraries/chain/include/eosio/chain/controller.hpp index 0eeed40015..ec86c32233 100644 --- a/libraries/chain/include/eosio/chain/controller.hpp +++ b/libraries/chain/include/eosio/chain/controller.hpp @@ -323,7 +323,7 @@ namespace eosio::chain { int64_t set_proposed_producers( vector producers ); // called by host function set_finalizers - void set_proposed_finalizers( const finalizer_policy& fin_set ); + void set_proposed_finalizers( finalizer_policy&& fin_pol ); // called from net threads vote_status process_vote_message( const vote_message& msg ); // thread safe, for testing diff --git a/libraries/chain/webassembly/privileged.cpp b/libraries/chain/webassembly/privileged.cpp index 23cfd4c475..134a27bdf5 100644 --- a/libraries/chain/webassembly/privileged.cpp +++ b/libraries/chain/webassembly/privileged.cpp @@ -195,7 +195,7 @@ namespace eosio { namespace chain { namespace webassembly { EOS_ASSERT( weight_sum >= finpol.threshold && finpol.threshold > weight_sum / 2, wasm_execution_error, "Finalizer policy threshold (${t}) must be greater than half of the sum of the weights (${w}), and less than or equal to the sum of the weights", ("t", finpol.threshold)("w", weight_sum) ); - context.control.set_proposed_finalizers( finpol ); + context.control.set_proposed_finalizers( std::move(finpol) ); } uint32_t interface::get_blockchain_parameters_packed( legacy_span packed_blockchain_parameters ) const {