enable disputes for known chains, except for polkadot (#4464)

* enable disputes, for all known chains but polkadot

* chore: fmt

* don't propagate disputes either

* review

* remove disputes feature

* remove superfluous line

* Update node/service/src/lib.rs

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

* fixup

* allow being a dummy

* rialto

* add an enum, to make things work better

* overseer

* fix test

* comments

* move condition out

* excess arg

Co-authored-by: Andronik Ordian <write@reusable.software>
This commit is contained in:
Bernhard Schuster
2021-12-17 18:50:48 +01:00
committed by GitHub
parent fad55b95fa
commit 2457c26a08
26 changed files with 219 additions and 247 deletions
+9 -1
View File
@@ -29,7 +29,7 @@ pub mod overseer;
#[cfg(feature = "full-node")]
pub use self::overseer::{OverseerGen, OverseerGenArgs, RealOverseerGen};
#[cfg(all(test, feature = "disputes"))]
#[cfg(test)]
mod tests;
#[cfg(feature = "full-node")]
@@ -721,6 +721,12 @@ where
let auth_or_collator = role.is_authority() || is_collator.is_collator();
let requires_overseer_for_chain_sel = local_keystore.is_some() && auth_or_collator;
let disputes_enabled = chain_spec.is_rococo() ||
chain_spec.is_kusama() ||
chain_spec.is_westend() ||
chain_spec.is_versi() ||
chain_spec.is_wococo();
let select_chain = if requires_overseer_for_chain_sel {
let metrics =
polkadot_node_subsystem_util::metrics::Metrics::register(prometheus_registry.as_ref())?;
@@ -729,6 +735,7 @@ where
basics.backend.clone(),
overseer_handle.clone(),
metrics,
disputes_enabled,
)
} else {
SelectRelayChain::new_longest_chain(basics.backend.clone())
@@ -952,6 +959,7 @@ where
candidate_validation_config,
chain_selection_config,
dispute_coordinator_config,
disputes_enabled,
},
)
.map_err(|e| {
+29 -10
View File
@@ -22,6 +22,7 @@ use polkadot_node_core_av_store::Config as AvailabilityConfig;
use polkadot_node_core_candidate_validation::Config as CandidateValidationConfig;
use polkadot_node_core_chain_selection::Config as ChainSelectionConfig;
use polkadot_node_core_dispute_coordinator::Config as DisputeCoordinatorConfig;
use polkadot_node_core_provisioner::ProvisionerConfig;
use polkadot_node_network_protocol::request_response::{v1 as request_v1, IncomingRequestReceiver};
#[cfg(any(feature = "malus", test))]
pub use polkadot_overseer::{
@@ -106,6 +107,8 @@ where
pub chain_selection_config: ChainSelectionConfig,
/// Configuration for the dispute coordinator subsystem.
pub dispute_coordinator_config: DisputeCoordinatorConfig,
/// Enable to disputes.
pub disputes_enabled: bool,
}
/// Obtain a prepared `OverseerBuilder`, that is initialized
@@ -132,6 +135,7 @@ pub fn prepared_overseer_builder<'a, Spawner, RuntimeClient>(
candidate_validation_config,
chain_selection_config,
dispute_coordinator_config,
disputes_enabled,
}: OverseerGenArgs<'a, Spawner, RuntimeClient>,
) -> Result<
OverseerBuilder<
@@ -228,7 +232,11 @@ where
Box::new(network_service.clone()),
Metrics::register(registry)?,
))
.provisioner(ProvisionerSubsystem::new(spawner.clone(), (), Metrics::register(registry)?))
.provisioner(ProvisionerSubsystem::new(
spawner.clone(),
ProvisionerConfig { disputes_enabled },
Metrics::register(registry)?,
))
.runtime_api(RuntimeApiSubsystem::new(
runtime_client.clone(),
Metrics::register(registry)?,
@@ -251,12 +259,16 @@ where
keystore.clone(),
authority_discovery_service.clone(),
))
.dispute_coordinator(DisputeCoordinatorSubsystem::new(
parachains_db.clone(),
dispute_coordinator_config,
keystore.clone(),
Metrics::register(registry)?,
))
.dispute_coordinator(if disputes_enabled {
DisputeCoordinatorSubsystem::new(
parachains_db.clone(),
dispute_coordinator_config,
keystore.clone(),
Metrics::register(registry)?,
)
} else {
DisputeCoordinatorSubsystem::dummy()
})
.dispute_distribution(DisputeDistributionSubsystem::new(
keystore.clone(),
dispute_req_receiver,
@@ -319,8 +331,15 @@ impl OverseerGen for RealOverseerGen {
RuntimeClient::Api: ParachainHost<Block> + BabeApi<Block> + AuthorityDiscoveryApi<Block>,
Spawner: 'static + SpawnNamed + Clone + Unpin,
{
prepared_overseer_builder(args)?
.build_with_connector(connector)
.map_err(|e| e.into())
let disputes_enabled = args.disputes_enabled;
let builder = prepared_overseer_builder(args)?;
if disputes_enabled {
builder
.dispute_coordinator(DisputeCoordinatorSubsystem::dummy())
.build_with_connector(connector)
} else {
builder.build_with_connector(connector)
}
.map_err(|e| e.into())
}
}
@@ -161,11 +161,16 @@ where
/// Create a new [`SelectRelayChain`] wrapping the given chain backend
/// and a handle to the overseer.
pub fn new_disputes_aware(backend: Arc<B>, overseer: Handle, metrics: Metrics) -> Self {
pub fn new_disputes_aware(
backend: Arc<B>,
overseer: Handle,
metrics: Metrics,
disputes_enabled: bool,
) -> Self {
tracing::debug!(
target: LOG_TARGET,
"Using {} chain selection algorithm",
if cfg!(feature = "disputes") {
if disputes_enabled {
"dispute aware relay"
} else {
// no disputes are queried, that logic is disabled
@@ -176,7 +181,10 @@ where
SelectRelayChain {
longest_chain: sc_consensus::LongestChain::new(backend.clone()),
selection: IsDisputesAwareWithOverseer::Yes(SelectRelayChainInner::new(
backend, overseer, metrics,
backend,
overseer,
metrics,
disputes_enabled,
)),
}
}
@@ -233,6 +241,7 @@ where
pub struct SelectRelayChainInner<B, OH> {
backend: Arc<B>,
overseer: OH,
disputes_enabled: bool,
metrics: Metrics,
}
@@ -243,8 +252,8 @@ where
{
/// Create a new [`SelectRelayChainInner`] wrapping the given chain backend
/// and a handle to the overseer.
pub fn new(backend: Arc<B>, overseer: OH, metrics: Metrics) -> Self {
SelectRelayChainInner { backend, overseer, metrics }
pub fn new(backend: Arc<B>, overseer: OH, metrics: Metrics, disputes_enabled: bool) -> Self {
SelectRelayChainInner { backend, overseer, metrics, disputes_enabled }
}
fn block_header(&self, hash: Hash) -> Result<PolkadotHeader, ConsensusError> {
@@ -282,6 +291,7 @@ where
backend: self.backend.clone(),
overseer: self.overseer.clone(),
metrics: self.metrics.clone(),
disputes_enabled: self.disputes_enabled,
}
}
}
@@ -371,7 +381,7 @@ where
let mut overseer = self.overseer.clone();
tracing::trace!(target: LOG_TARGET, ?best_leaf, "Longest chain");
let subchain_head = if cfg!(feature = "disputes") {
let subchain_head = if self.disputes_enabled {
let (tx, rx) = oneshot::channel();
overseer
.send_msg(
@@ -476,7 +486,7 @@ where
let lag = initial_leaf_number.saturating_sub(subchain_number);
self.metrics.note_approval_checking_finality_lag(lag);
let (lag, subchain_head) = if cfg!(feature = "disputes") {
let (lag, subchain_head) = if self.disputes_enabled {
// Prevent sending flawed data to the dispute-coordinator.
if Some(subchain_block_descriptions.len() as _) !=
subchain_number.checked_sub(target_number)
+1
View File
@@ -83,6 +83,7 @@ fn test_harness<T: Future<Output = VirtualOverseer>>(
Arc::new(case_vars.chain.clone()),
context.sender().clone(),
Default::default(),
true,
);
let target_hash = case_vars.target_block.clone();