feat/view: assure heads in a view are sorted (#2493)

* feat/view: assure heads in a view are sorted

Allows O(n) comparisons, adds an alternate equiv relation
which takes O(n^2) for integrity verification.

Ref #2133

* revert: remove custom PartialEq impl, there are no duplicates

* fix: do not sort the live_heads, that alters the local view

* refactor/view: heads should not be public

* chore/spellcheck: add unfinalized

* fix/view: add missing len() and is_empty() fns

* quirk

* vec is not view

* Update node/network/approval-distribution/src/tests.rs

Co-authored-by: Andronik Ordian <write@reusable.software>

* Update node/network/bridge/src/lib.rs

Co-authored-by: Andronik Ordian <write@reusable.software>

* Update node/network/protocol/src/lib.rs

Co-authored-by: Andronik Ordian <write@reusable.software>

* fixup comment

* fix botched test

Co-authored-by: Andronik Ordian <write@reusable.software>
This commit is contained in:
Bernhard Schuster
2021-02-23 16:39:57 +01:00
committed by GitHub
parent 571651e326
commit e3f776abed
11 changed files with 85 additions and 38 deletions
@@ -186,11 +186,11 @@ impl State {
self.blocks_by_number.entry(meta.number).or_default().push(meta.hash);
}
for (peer_id, view) in self.peer_views.iter() {
let intersection = view.heads.iter().filter(|h| new_hashes.contains(h));
let view_intersection = View {
heads: intersection.cloned().collect(),
finalized_number: view.finalized_number,
};
let intersection = view.iter().filter(|h| new_hashes.contains(h));
let view_intersection = View::new(
intersection.cloned(),
view.finalized_number,
);
Self::unify_with_peer(
&mut self.blocks,
ctx,
@@ -634,7 +634,7 @@ impl State {
let mut to_send = HashSet::new();
let view_finalized_number = view.finalized_number;
for head in view.heads.into_iter() {
for head in view.into_iter() {
let mut block = head;
let interesting_blocks = std::iter::from_fn(|| {
// step 2.
@@ -330,7 +330,7 @@ fn spam_attack_results_in_negative_reputation_change() {
overseer_send(
overseer,
ApprovalDistributionMessage::NetworkBridgeUpdateV1(
NetworkBridgeEvent::PeerViewChange(peer.clone(), View { heads: Default::default(), finalized_number: 2 })
NetworkBridgeEvent::PeerViewChange(peer.clone(), View::with_finalized(2))
)
).await;
@@ -666,7 +666,7 @@ fn update_peer_view() {
overseer_send(
overseer,
ApprovalDistributionMessage::NetworkBridgeUpdateV1(
NetworkBridgeEvent::PeerViewChange(peer.clone(), View { heads: vec![hash_b, hash_c, hash_d], finalized_number: 2 })
NetworkBridgeEvent::PeerViewChange(peer.clone(), View::new(vec![hash_b, hash_c, hash_d], 2))
)
).await;
@@ -713,7 +713,7 @@ fn update_peer_view() {
overseer_send(
overseer,
ApprovalDistributionMessage::NetworkBridgeUpdateV1(
NetworkBridgeEvent::PeerViewChange(peer.clone(), View { heads: vec![], finalized_number })
NetworkBridgeEvent::PeerViewChange(peer.clone(), View::with_finalized(finalized_number))
)
).await;
});