Skip to content

Commit 1b5972b

Browse files
authored
Merge pull request #84 from AntelopeIO/gh_79
Increment finalizer policy generation on each block that proposes a new finalizer policy; also log when finalizer policy changes
2 parents 22000e2 + 0a6f1f9 commit 1b5972b

File tree

5 files changed

+62
-26
lines changed

5 files changed

+62
-26
lines changed

libraries/chain/block_header_state.cpp

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
// -------------------------------------------------------------------------------------------------
8189
void 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

173202
block_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
}

libraries/chain/block_state.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@ block_state_ptr block_state::create_if_genesis_block(const block_state_legacy& b
7979
result.active_proposer_policy->proposer_schedule = bsp.active_schedule;
8080
result.proposer_policies = {}; // none pending at IF genesis block
8181
result.finalizer_policies = {}; // none pending at IF genesis block
82+
result.finalizer_policy_generation = 1;
8283
result.header_exts = bsp.header_exts;
8384

8485
// set block_state data ----
8586
result.block = bsp.block;
8687
result.strong_digest = result.compute_finality_digest(); // all block_header_state data populated in result at this point
8788
result.weak_digest = create_weak_digest(result.strong_digest);
8889

89-
// TODO: https://github.com/AntelopeIO/leap/issues/2057
90-
// TODO: Do not aggregate votes on blocks created from block_state_legacy. This can be removed when #2057 complete.
90+
// pending_qc will not be used in the genesis block as finalizers will not vote on it, but still create it for consistency.
9191
result.pending_qc = pending_quorum_certificate{result.active_finalizer_policy->finalizers.size(),
9292
result.active_finalizer_policy->threshold,
9393
result.active_finalizer_policy->max_weak_sum_before_weak_final()};
@@ -143,7 +143,8 @@ block_state::block_state(snapshot_detail::snapshot_block_state_v7&& sbs)
143143
.active_finalizer_policy = std::move(sbs.active_finalizer_policy),
144144
.active_proposer_policy = std::move(sbs.active_proposer_policy),
145145
.proposer_policies = std::move(sbs.proposer_policies),
146-
.finalizer_policies = std::move(sbs.finalizer_policies)
146+
.finalizer_policies = std::move(sbs.finalizer_policies),
147+
.finalizer_policy_generation = sbs.finalizer_policy_generation
147148
}
148149
, strong_digest(compute_finality_digest())
149150
, weak_digest(create_weak_digest(strong_digest))

libraries/chain/controller.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,8 +563,8 @@ struct building_block {
563563
}
564564
},
565565
[&](building_block_if& bb) {
566+
fin_pol.generation = bb.parent.finalizer_policy_generation + 1;
566567
bb.new_finalizer_policy = std::move(fin_pol);
567-
// generation will be updated when activated
568568
} },
569569
v);
570570
}

libraries/chain/include/eosio/chain/block_header_state.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ struct block_header_state {
7676
// `pending` becomes active, and the `proposed` becomes `pending` (for a different block number).
7777
flat_multimap<block_num_type, finalizer_policy_tracker> finalizer_policies;
7878

79+
// generation increases by one each time a new finalizer_policy is proposed in a block
80+
// It matches the finalizer policy generation most recently included in this block's `if_extension` or its ancestors
81+
uint32_t finalizer_policy_generation{1};
7982

8083
// ------ data members caching information available elsewhere ----------------------
8184
header_extension_multimap header_exts; // redundant with the data stored in header
@@ -123,4 +126,5 @@ FC_REFLECT( eosio::chain::finalizer_policy_tracker, (state)(policy))
123126

124127
FC_REFLECT( eosio::chain::block_header_state, (block_id)(header)
125128
(activated_protocol_features)(core)(active_finalizer_policy)
126-
(active_proposer_policy)(proposer_policies)(finalizer_policies)(header_exts))
129+
(active_proposer_policy)(proposer_policies)(finalizer_policies)
130+
(finalizer_policy_generation)(header_exts))

libraries/chain/include/eosio/chain/snapshot_detail.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ namespace eosio::chain::snapshot_detail {
118118
proposer_policy_ptr active_proposer_policy;
119119
flat_map<block_timestamp_type, proposer_policy_ptr> proposer_policies;
120120
flat_multimap<block_num_type, finalizer_policy_tracker> finalizer_policies;
121+
uint32_t finalizer_policy_generation;
121122

122123
// from block_state
123124
std::optional<valid_t> valid;
@@ -133,6 +134,7 @@ namespace eosio::chain::snapshot_detail {
133134
, active_proposer_policy(bs.active_proposer_policy)
134135
, proposer_policies(bs.proposer_policies)
135136
, finalizer_policies(bs.finalizer_policies)
137+
, finalizer_policy_generation(bs.finalizer_policy_generation)
136138
, valid(bs.valid)
137139
{}
138140
};
@@ -212,6 +214,7 @@ FC_REFLECT( eosio::chain::snapshot_detail::snapshot_block_state_v7,
212214
(active_proposer_policy)
213215
(proposer_policies)
214216
(finalizer_policies)
217+
(finalizer_policy_generation)
215218
(valid)
216219
)
217220

0 commit comments

Comments
 (0)