grandpa: voting rules shouldn't restrict past round base (#4155)

* grandpa: voting rules shouldn't restrict past round base

* grandpa: fix lower bound on vote restriction. add test
This commit is contained in:
Gavin Wood
2019-11-22 13:05:52 +01:00
committed by GitHub
parent 7769554af6
commit 795701608c
2 changed files with 24 additions and 1 deletions
@@ -497,8 +497,18 @@ where
// note that we pass the original `best_header`, i.e. before the
// authority set limit filter, which can be considered a
// mandatory/implicit voting rule.
//
// we also make sure that the restricted vote is higher than the
// round base (i.e. last finalized), otherwise the value
// returned by the given voting rule is ignored and the original
// target is used instead.
self.voting_rule
.restrict_vote(&*self.client, &base_header, &best_header, target_header)
.filter(|(_, restricted_number)| {
// we can only restrict votes within the interval [base, target]
restricted_number >= base_header.number() &&
restricted_number < target_header.number()
})
.or(Some((target_header.hash(), *target_header.number())))
},
Ok(None) => {
@@ -1660,6 +1660,19 @@ fn grandpa_environment_respects_voting_rules() {
).unwrap().1,
19,
);
// we finalize block 20 with block 20 being the best block
peer.client().finalize_block(BlockId::Number(20), None, false).unwrap();
// even though the default environment will always try to not vote on the
// best block, there's a hard rule that we can't cast any votes lower than
// the given base (#20).
assert_eq!(
default_env.best_chain_containing(
peer.client().info().chain.finalized_hash
).unwrap().1,
20,
);
}
#[test]