Files
pezkuwi-subxt/polkadot/node/overseer/src/dummy.rs
T
Robert Klotzner 25974f2076 Dispute spam protection (#4134)
* Mostly notes.

* Better error messages.

* Introduce Fatal/NonFatal + drop back channel participation

- Fatal/NonFatal - in order to make it easier to use utility functions.
- We drop the back channel in dispute participation as it won't be
needed any more.

* Better error messages.

* Utility function for receiving `CandidateEvent`s.

* Ordering module typechecks.

* cargo fmt

* Prepare spam slots module.

* Implement SpamSlots mechanism.

* Implement queues.

* cargo fmt

* Participation.

* Participation taking shape.

* Finish participation.

* cargo fmt

* Cleanup.

* WIP: Cleanup + Integration.

* Make `RollingSessionWindow` initialized by default.

* Make approval voting typecheck.

* Get rid of lazy_static & fix approval voting tests

* Move `SessionWindowSize` to node primitives.

* Implement dispute coordinator initialization.

* cargo fmt

* Make queues return error instead of boolean.

* Initialized: WIP

* Introduce chain api for getting finalized block.

* Fix ordering to only prune candidates on finalized events.

* Pruning of old sessions in spam slots.

* New import logic.

* Make everything typecheck.

* Fix warnings.

* Get rid of obsolete dispute-participation.

* Fixes.

* Add back accidentelly deleted Cargo.lock

* Deliver disputes in an ordered fashion.

* Add module docs for errors

* Use type synonym.

* hidden docs.

* Fix overseer tests.

* Ordering provider taking `CandidateReceipt`.

... To be kicked on one next commit.

* Fix ordering to use relay_parent

as included block is not unique per candidate.

* Add comment in ordering.rs.

* Take care of duplicate entries in queues.

* Better spam slots.

* Review remarks + docs.

* Fix db tests.

* Participation tests.

* Also scrape votes on first leaf for good measure.

* Make tests typecheck.

* Spelling.

* Only participate in actual disputes, not on every import.

* Don't account backing votes to spam slots.

* Fix more tests.

* Don't participate if we don't have keys.

* Fix tests, typos and warnings.

* Fix merge error.

* Spelling fixes.

* Add missing docs.

* Queue tests.

* More tests.

* Add metrics + don't short circuit import.

* Basic test for ordering provider.

* Import fix.

* Remove dead link.

* One more dead link.

Co-authored-by: Lldenaurois <Ljdenaurois@gmail.com>
2021-11-19 17:08:21 +00:00

193 lines
6.2 KiB
Rust

// Copyright 2020 Parity Technologies (UK) Ltd.
// This file is part of Polkadot.
// Polkadot is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Polkadot is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
use crate::{
prometheus::Registry, AllMessages, HeadSupportsParachains, MetricsTrait, Overseer,
OverseerBuilder, OverseerMetrics, OverseerSignal, OverseerSubsystemContext, SpawnNamed,
KNOWN_LEAVES_CACHE_SIZE,
};
use lru::LruCache;
use polkadot_node_subsystem_types::{errors::SubsystemError, messages::*};
use polkadot_overseer_gen::{FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext};
/// A dummy subsystem that implements [`Subsystem`] for all
/// types of messages. Used for tests or as a placeholder.
#[derive(Clone, Copy, Debug)]
pub struct DummySubsystem;
impl<Context> Subsystem<Context, SubsystemError> for DummySubsystem
where
Context: SubsystemContext<
Signal = OverseerSignal,
Error = SubsystemError,
AllMessages = AllMessages,
>,
{
fn start(self, mut ctx: Context) -> SpawnedSubsystem<SubsystemError> {
let future = Box::pin(async move {
loop {
match ctx.recv().await {
Err(_) => return Ok(()),
Ok(FromOverseer::Signal(OverseerSignal::Conclude)) => return Ok(()),
Ok(overseer_msg) => {
tracing::debug!(
target: "dummy-subsystem",
"Discarding a message sent from overseer {:?}",
overseer_msg
);
continue
},
}
}
});
SpawnedSubsystem { name: "dummy-subsystem", future }
}
}
/// Create an overseer with all subsystem being `Sub`.
///
/// Preferred way of initializing a dummy overseer for subsystem tests.
pub fn dummy_overseer_builder<'a, Spawner, SupportsParachains>(
spawner: Spawner,
supports_parachains: SupportsParachains,
registry: Option<&'a Registry>,
) -> Result<
OverseerBuilder<
Spawner,
SupportsParachains,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
DummySubsystem,
>,
SubsystemError,
>
where
Spawner: SpawnNamed + Send + Sync + 'static,
SupportsParachains: HeadSupportsParachains,
{
one_for_all_overseer_builder(spawner, supports_parachains, DummySubsystem, registry)
}
/// Create an overseer with all subsystem being `Sub`.
pub fn one_for_all_overseer_builder<'a, Spawner, SupportsParachains, Sub>(
spawner: Spawner,
supports_parachains: SupportsParachains,
subsystem: Sub,
registry: Option<&'a Registry>,
) -> Result<
OverseerBuilder<
Spawner,
SupportsParachains,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
Sub,
>,
SubsystemError,
>
where
Spawner: SpawnNamed + Send + Sync + 'static,
SupportsParachains: HeadSupportsParachains,
Sub: Clone
+ Subsystem<OverseerSubsystemContext<AvailabilityDistributionMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<AvailabilityRecoveryMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<AvailabilityStoreMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<BitfieldDistributionMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<BitfieldSigningMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<CandidateBackingMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<CandidateValidationMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<ChainApiMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<CollationGenerationMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<CollatorProtocolMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<NetworkBridgeMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<ProvisionerMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<RuntimeApiMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<StatementDistributionMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<ApprovalDistributionMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<ApprovalVotingMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<GossipSupportMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<DisputeCoordinatorMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<DisputeDistributionMessage>, SubsystemError>
+ Subsystem<OverseerSubsystemContext<ChainSelectionMessage>, SubsystemError>,
{
let metrics = <OverseerMetrics as MetricsTrait>::register(registry)?;
let builder = Overseer::builder()
.availability_distribution(subsystem.clone())
.availability_recovery(subsystem.clone())
.availability_store(subsystem.clone())
.bitfield_distribution(subsystem.clone())
.bitfield_signing(subsystem.clone())
.candidate_backing(subsystem.clone())
.candidate_validation(subsystem.clone())
.chain_api(subsystem.clone())
.collation_generation(subsystem.clone())
.collator_protocol(subsystem.clone())
.network_bridge(subsystem.clone())
.provisioner(subsystem.clone())
.runtime_api(subsystem.clone())
.statement_distribution(subsystem.clone())
.approval_distribution(subsystem.clone())
.approval_voting(subsystem.clone())
.gossip_support(subsystem.clone())
.dispute_coordinator(subsystem.clone())
.dispute_distribution(subsystem.clone())
.chain_selection(subsystem)
.activation_external_listeners(Default::default())
.span_per_active_leaf(Default::default())
.active_leaves(Default::default())
.known_leaves(LruCache::new(KNOWN_LEAVES_CACHE_SIZE))
.leaves(Default::default())
.spawner(spawner)
.metrics(metrics)
.supports_parachains(supports_parachains);
Ok(builder)
}