@@ -78,13 +78,18 @@ const vector<digest_type>& block_header_state::get_new_protocol_feature_activati
7878
7979#warning Add last_proposed_finalizer_policy_generation to snapshot_block_header_state_v3, see header file TODO
8080
81+ // -------------------------------------------------------------------------------------------------
82+ // `finish_next` updates the next `block_header_state` according to the contents of the
83+ // header extensions (either new protocol_features or instant_finality_extension) applicable to this
84+ // next block .
85+ //
86+ // These extensions either result from the execution of the previous block (in case this node
87+ // was the block producer) or were received from the network in a `signed_block`.
88+ // -------------------------------------------------------------------------------------------------
8189void finish_next (const block_header_state& prev,
8290 block_header_state& next_header_state,
8391 vector<digest_type> new_protocol_feature_activations,
84- std::shared_ptr<proposer_policy> new_proposer_policy,
85- std::optional<finalizer_policy> new_finalizer_policy,
86- qc_claim_t qc_claim) {
87-
92+ instant_finality_extension if_ext) {
8893 // activated protocol features
8994 // ---------------------------
9095 if (!new_protocol_feature_activations.empty ()) {
@@ -98,7 +103,7 @@ void finish_next(const block_header_state& prev,
98103 // ---------------
99104 next_header_state.active_proposer_policy = prev.active_proposer_policy ;
100105
101- if (!prev.proposer_policies .empty ()) {
106+ if (!prev.proposer_policies .empty ()) {
102107 auto it = prev.proposer_policies .begin ();
103108 // +1 since this is called after the block is built, this will be the active schedule for the next block
104109 if (it->first .slot <= next_header_state.header .timestamp .slot + 1 ) {
@@ -109,9 +114,10 @@ void finish_next(const block_header_state& prev,
109114 }
110115 }
111116
112- if (new_proposer_policy) {
117+ if (if_ext. new_proposer_policy ) {
113118 // called when assembling the block
114- next_header_state.proposer_policies [new_proposer_policy->active_time ] = std::move (new_proposer_policy);
119+ next_header_state.proposer_policies [if_ext.new_proposer_policy ->active_time ] =
120+ std::move (if_ext.new_proposer_policy );
115121 }
116122
117123 // finality_core
@@ -120,54 +126,77 @@ void finish_next(const block_header_state& prev,
120126 .block_id = prev.block_id ,
121127 .timestamp = prev.timestamp ()
122128 };
123- next_header_state.core = prev.core .next (parent_block, qc_claim);
129+ next_header_state.core = prev.core .next (parent_block, if_ext. qc_claim );
124130
125131 // finalizer policy
126132 // ----------------
127133 next_header_state.active_finalizer_policy = prev.active_finalizer_policy ;
128134
129- if (!prev.finalizer_policies .empty ()) {
135+ if (!prev.finalizer_policies .empty ()) {
130136 auto lib = next_header_state.core .last_final_block_num ();
131137 auto it = prev.finalizer_policies .begin ();
132138 if (it->first > lib) {
133139 // we have at least one `finalizer_policy` in our map, but none of these is
134140 // due to become active of this block because lib has not advanced enough, so
135141 // we just copy the multimap and keep using the same `active_finalizer_policy`
142+ // ---------------------------------------------------------------------------
136143 next_header_state.finalizer_policies = prev.finalizer_policies ;
137144 } else {
138145 while (it != prev.finalizer_policies .end () && it->first <= lib) {
139146 const finalizer_policy_tracker& tracker = it->second ;
140147 if (tracker.state == finalizer_policy_tracker::state_t ::pending) {
141148 // new finalizer_policy becones active
149+ // -----------------------------------
142150 next_header_state.active_finalizer_policy .reset (new finalizer_policy (*tracker.policy ));
143- next_header_state.active_finalizer_policy ->generation = prev.active_finalizer_policy ->generation + 1 ;
144151 } else {
145152 assert (tracker.state == finalizer_policy_tracker::state_t ::proposed);
146153 // block where finalizer_policy was proposed became final. The finalizer policy will
147154 // become active when next block becomes final.
155+ // ---------------------------------------------------------------------------------
148156 finalizer_policy_tracker t { finalizer_policy_tracker::state_t ::pending, tracker.policy };
149157 next_header_state.finalizer_policies .emplace (next_header_state.block_num (), std::move (t));
150158 }
151159 ++it;
152160 }
153161 if (it != prev.finalizer_policies .end ()) {
154162 // copy remainder of pending finalizer_policy changes
163+ // --------------------------------------------------
155164 next_header_state.finalizer_policies .insert (boost::container::ordered_unique_range_t (),
156165 it, prev.finalizer_policies .end ());
157166 }
158167 }
159168 }
160169
161- if (new_finalizer_policy) {
170+ if (if_ext.new_finalizer_policy ) {
171+ // a new `finalizer_policy` was proposed in the previous block, and is present in the previous
172+ // block's header extensions.
173+ // Add this new proposal to the `finalizer_policies` multimap which tracks the in-flight proposals,
174+ // increment the generation number, and log that proposal (debug level).
175+ // ------------------------------------------------------------------------------------------------
176+ dlog (" New finalizer policy proposed in block ${id}: ${pol}" ,
177+ (" id" , prev.block_id )(" pol" , *if_ext.new_finalizer_policy ));
178+ next_header_state.finalizer_policy_generation = if_ext.new_finalizer_policy ->generation ;
162179 next_header_state.finalizer_policies .emplace (
163180 next_header_state.block_num (),
164181 finalizer_policy_tracker{finalizer_policy_tracker::state_t ::proposed,
165- std::make_shared<finalizer_policy>(std::move (*new_finalizer_policy))});
182+ std::make_shared<finalizer_policy>(std::move (*if_ext.new_finalizer_policy ))});
183+
184+ } else {
185+ next_header_state.finalizer_policy_generation = prev.finalizer_policy_generation ;
166186 }
167187
168188 // Finally update block id from header
169189 // -----------------------------------
170190 next_header_state.block_id = next_header_state.header .calculate_id ();
191+
192+ // Now that we have the block id of the new block, log what changed.
193+ // -----------------------------------------------------------------
194+ if (next_header_state.active_finalizer_policy != prev.active_finalizer_policy ) {
195+ const auto & act = next_header_state.active_finalizer_policy ;
196+ ilog (" Finalizer policy generation change: ${old_gen} -> ${new_gen}" ,
197+ (" old_gen" , prev.active_finalizer_policy ->generation )(" new_gen" ,act->generation ));
198+ ilog (" New finalizer policy becoming active in block ${id}: ${pol}" ,(" id" , next_header_state.block_id )(" pol" , *act));
199+ }
171200}
172201
173202block_header_state block_header_state::next (block_header_state_input& input) const {
@@ -187,13 +216,13 @@ block_header_state block_header_state::next(block_header_state_input& input) con
187216
188217 // finality extension
189218 // ------------------
190- instant_finality_extension new_if_ext {input.most_recent_ancestor_with_qc ,
191- input.new_finalizer_policy ,
192- input.new_proposer_policy };
219+ instant_finality_extension new_if_ext { input.most_recent_ancestor_with_qc ,
220+ std::move ( input.new_finalizer_policy ) ,
221+ std::move ( input.new_proposer_policy ) };
193222
194223 uint16_t if_ext_id = instant_finality_extension::extension_id ();
195224 emplace_extension (next_header_state.header .header_extensions , if_ext_id, fc::raw::pack (new_if_ext));
196- next_header_state.header_exts .emplace (if_ext_id, std::move ( new_if_ext) );
225+ next_header_state.header_exts .emplace (if_ext_id, new_if_ext);
197226
198227 // add protocol_feature_activation extension
199228 // -----------------------------------------
@@ -205,9 +234,7 @@ block_header_state block_header_state::next(block_header_state_input& input) con
205234 next_header_state.header_exts .emplace (ext_id, std::move (pfa_ext));
206235 }
207236
208- finish_next (*this , next_header_state, std::move (input.new_protocol_feature_activations ),
209- std::move (input.new_proposer_policy ), std::move (input.new_finalizer_policy ),
210- input.most_recent_ancestor_with_qc );
237+ finish_next (*this , next_header_state, std::move (input.new_protocol_feature_activations ), std::move (new_if_ext));
211238
212239 return next_header_state;
213240}
@@ -230,6 +257,8 @@ block_header_state block_header_state::next(const signed_block_header& h, valida
230257 block_header_state next_header_state;
231258 next_header_state.header = static_cast <const block_header&>(h);
232259 next_header_state.header_exts = h.validate_and_extract_header_extensions ();
260+ next_header_state.finalizer_policy_generation = finalizer_policy_generation;
261+
233262 const auto & exts = next_header_state.header_exts ;
234263
235264 // retrieve protocol_feature_activation from incoming block header extension
@@ -262,8 +291,7 @@ block_header_state block_header_state::next(const signed_block_header& h, valida
262291 (" f" , next_core_metadata.final_on_strong_qc_block_num ));
263292 };
264293
265- finish_next (*this , next_header_state, std::move (new_protocol_feature_activations), if_ext.new_proposer_policy ,
266- if_ext.new_finalizer_policy , if_ext.qc_claim );
294+ finish_next (*this , next_header_state, std::move (new_protocol_feature_activations), if_ext);
267295
268296 return next_header_state;
269297}
0 commit comments