diff --git a/roadmap/implementers-guide/src/disputes-flow.md b/roadmap/implementers-guide/src/disputes-flow.md index 053bcfd3f2a4..a325b2ce7272 100644 --- a/roadmap/implementers-guide/src/disputes-flow.md +++ b/roadmap/implementers-guide/src/disputes-flow.md @@ -8,7 +8,6 @@ stateDiagram-v2 [*] --> WaitForDisputeVote: backing Vote received WaitForBackingVote --> Open: negative Vote received WaitForDisputeVote --> Open: backing Vote received - Open --> Concluded: Timeout without supermajority Open --> Concluded: Incoming Vote via Gossip Open --> Open: No ⅔ supermajority Open --> [*] diff --git a/roadmap/implementers-guide/src/protocol-disputes.md b/roadmap/implementers-guide/src/protocol-disputes.md index 76791ac16a4e..ebbc534f1992 100644 --- a/roadmap/implementers-guide/src/protocol-disputes.md +++ b/roadmap/implementers-guide/src/protocol-disputes.md @@ -62,6 +62,6 @@ Validators are rewarded for providing statements to the chain as well as for par ## Dispute Conclusion -Disputes, roughly, are over when one side reaches a ⅔ supermajority. They may also conclude after a timeout, without either side witnessing supermajority, which will only happen if the majority of validators are unable to vote for some reason. Furthermore, disputes on-chain will stay open for some fixed amount of time even after concluding, to accept new votes. +Disputes, roughly, are over when one side reaches a ⅔ supermajority. They may also never conclude without either side witnessing supermajority, which will only happen if the majority of validators are unable to vote for some reason. Furthermore, disputes on-chain will stay open for some fixed amount of time even after concluding, to accept new votes. Late votes, after the dispute already reached a ⅔ supermajority, must be rewarded (albeit a smaller amount) as well. diff --git a/roadmap/implementers-guide/src/runtime/disputes.md b/roadmap/implementers-guide/src/runtime/disputes.md index b775bfbfcf0e..1d3e3f62dc01 100644 --- a/roadmap/implementers-guide/src/runtime/disputes.md +++ b/roadmap/implementers-guide/src/runtime/disputes.md @@ -56,7 +56,7 @@ Frozen: Option, ## Block Initialization -1. Iterate through all disputes. If any have not concluded and started more than `config.dispute_conclusion_by_timeout_period` blocks ago, set them to `Concluded` and mildly punish all validators associated, as they have failed to distribute available data. +This is currently a `no op`. ## Routines diff --git a/roadmap/implementers-guide/src/types/runtime.md b/roadmap/implementers-guide/src/types/runtime.md index d3d00d5163b3..e3fc3f0a6527 100644 --- a/roadmap/implementers-guide/src/types/runtime.md +++ b/roadmap/implementers-guide/src/types/runtime.md @@ -44,8 +44,6 @@ struct HostConfiguration { pub dispute_post_conclusion_acceptance_period: BlockNumber, /// The maximum number of dispute spam slots pub dispute_max_spam_slots: u32, - /// How long it takes for a dispute to conclude by time-out, if no supermajority is reached. - pub dispute_conclusion_by_time_out_period: BlockNumber, /// The amount of consensus slots that must pass between submitting an assignment and /// submitting an approval vote before a validator is considered a no-show. /// Must be at least 1. diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 626e439eb48c..d046b552b415 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -1481,6 +1481,7 @@ pub type Migrations = ( Runtime, NominationPoolsMigrationV4OldPallet, >, + parachains_configuration::migration::v5::MigrateToV5, ); /// Unchecked extrinsic type as expected by this runtime. diff --git a/runtime/parachains/src/configuration.rs b/runtime/parachains/src/configuration.rs index baeb31ef501a..0e8420f51374 100644 --- a/runtime/parachains/src/configuration.rs +++ b/runtime/parachains/src/configuration.rs @@ -193,8 +193,6 @@ pub struct HostConfiguration { pub dispute_period: SessionIndex, /// How long after dispute conclusion to accept statements. pub dispute_post_conclusion_acceptance_period: BlockNumber, - /// How long it takes for a dispute to conclude by time-out, if no supermajority is reached. - pub dispute_conclusion_by_time_out_period: BlockNumber, /// The amount of consensus slots that must pass between submitting an assignment and /// submitting an approval vote before a validator is considered a no-show. /// @@ -262,7 +260,6 @@ impl> Default for HostConfiguration, - new: T::BlockNumber, - ) -> DispatchResult { - ensure_root(origin)?; - Self::schedule_config_update(|config| { - config.dispute_conclusion_by_time_out_period = new; - }) - } - /// Set the no show slots, in number of number of consensus slots. /// Must be at least 1. #[pallet::call_index(18)] diff --git a/runtime/parachains/src/configuration/migration.rs b/runtime/parachains/src/configuration/migration.rs index 7b2092cfc2c1..f38450a70d40 100644 --- a/runtime/parachains/src/configuration/migration.rs +++ b/runtime/parachains/src/configuration/migration.rs @@ -16,9 +16,10 @@ //! A module that is responsible for migration of storage. -use crate::configuration::{self, ActiveConfig, Config, Pallet, MAX_POV_SIZE}; +use crate::configuration::{self, ActiveConfig, Config, Pallet, PendingConfigs, MAX_POV_SIZE}; use frame_support::{pallet_prelude::*, traits::StorageVersion, weights::Weight}; use frame_system::pallet_prelude::BlockNumberFor; +use sp_std::vec::Vec; /// The current storage version. /// @@ -26,9 +27,10 @@ use frame_system::pallet_prelude::BlockNumberFor; /// v1-v2: /// v2-v3: /// v3-v4: -pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(4); +/// v4-v5: +pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(5); -pub mod v4 { +pub mod v5 { use super::*; use frame_support::{traits::OnRuntimeUpgrade, weights::constants::WEIGHT_REF_TIME_PER_MILLIS}; use primitives::{Balance, SessionIndex}; @@ -37,7 +39,7 @@ pub mod v4 { // Copied over from configuration.rs @ de9e147695b9f1be8bd44e07861a31e483c8343a and removed // all the comments, and changed the Weight struct to OldWeight - #[derive(parity_scale_codec::Encode, parity_scale_codec::Decode, Debug)] + #[derive(parity_scale_codec::Encode, parity_scale_codec::Decode, Debug, Clone)] pub struct OldHostConfiguration { pub max_code_size: u32, pub max_head_data_size: u32, @@ -71,7 +73,6 @@ pub mod v4 { pub max_validators: Option, pub dispute_period: SessionIndex, pub dispute_post_conclusion_acceptance_period: BlockNumber, - pub dispute_max_spam_slots: u32, pub dispute_conclusion_by_time_out_period: BlockNumber, pub no_show_slots: u32, pub n_delay_tranches: u32, @@ -104,7 +105,6 @@ pub mod v4 { max_validators: None, dispute_period: 6, dispute_post_conclusion_acceptance_period: 100.into(), - dispute_max_spam_slots: 2, dispute_conclusion_by_time_out_period: 200.into(), n_delay_tranches: Default::default(), zeroth_delay_tranche_width: Default::default(), @@ -137,8 +137,8 @@ pub mod v4 { } } - pub struct MigrateToV4(sp_std::marker::PhantomData); - impl OnRuntimeUpgrade for MigrateToV4 { + pub struct MigrateToV5(sp_std::marker::PhantomData); + impl OnRuntimeUpgrade for MigrateToV5 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, &'static str> { log::trace!(target: crate::configuration::LOG_TARGET, "Running pre_upgrade()"); @@ -148,15 +148,15 @@ pub mod v4 { } fn on_runtime_upgrade() -> Weight { - if StorageVersion::get::>() == 3 { - let weight_consumed = migrate_to_v4::(); + if StorageVersion::get::>() == 4 { + let weight_consumed = migrate_to_v5::(); - log::info!(target: configuration::LOG_TARGET, "MigrateToV4 executed successfully"); + log::info!(target: configuration::LOG_TARGET, "MigrateToV5 executed successfully"); STORAGE_VERSION.put::>(); weight_consumed } else { - log::warn!(target: configuration::LOG_TARGET, "MigrateToV4 should be removed."); + log::warn!(target: configuration::LOG_TARGET, "MigrateToV5 should be removed."); T::DbWeight::get().reads(1) } } @@ -166,7 +166,7 @@ pub mod v4 { log::trace!(target: crate::configuration::LOG_TARGET, "Running post_upgrade()"); ensure!( StorageVersion::get::>() == STORAGE_VERSION, - "Storage version should be 4 after the migration" + "Storage version should be 5 after the migration" ); Ok(()) @@ -174,14 +174,14 @@ pub mod v4 { } } -fn migrate_to_v4() -> Weight { +fn migrate_to_v5() -> Weight { // Unusual formatting is justified: // - make it easier to verify that fields assign what they supposed to assign. // - this code is transient and will be removed after all migrations are done. // - this code is important enough to optimize for legibility sacrificing consistency. #[rustfmt::skip] let translate = - |pre: v4::OldHostConfiguration>| -> + |pre: v5::OldHostConfiguration>| -> configuration::HostConfiguration> { super::HostConfiguration { @@ -217,7 +217,6 @@ max_validators_per_core : pre.max_validators_per_core, max_validators : pre.max_validators, dispute_period : pre.dispute_period, dispute_post_conclusion_acceptance_period: pre.dispute_post_conclusion_acceptance_period, -dispute_conclusion_by_time_out_period : pre.dispute_conclusion_by_time_out_period, no_show_slots : pre.no_show_slots, n_delay_tranches : pre.n_delay_tranches, zeroth_delay_tranche_width : pre.zeroth_delay_tranche_width, @@ -238,11 +237,27 @@ minimum_validation_upgrade_delay : pre.minimum_validation_upgrade_delay, // to be unlikely to be caused by this. So we just log. Maybe it'll work out still? log::error!( target: configuration::LOG_TARGET, - "unexpected error when performing translation of the configuration type during storage upgrade to v4." + "unexpected error when performing translation of the active configuration during storage upgrade to v5." ); } - T::DbWeight::get().reads_writes(1, 1) + if let Err(_) = PendingConfigs::::translate(|pre| { + pre.map( + |v: Vec<(primitives::SessionIndex, v5::OldHostConfiguration>)>| { + v.into_iter() + .map(|(session, config)| (session, translate(config))) + .collect::>() + }, + ) + }) { + log::error!( + target: configuration::LOG_TARGET, + "unexpected error when performing translation of the pending configuration during storage upgrade to v5." + ); + } + + let num_configs = (PendingConfigs::::get().len() + 1) as u64; + T::DbWeight::get().reads_writes(num_configs, num_configs) } #[cfg(test)] @@ -251,10 +266,9 @@ mod tests { use crate::mock::{new_test_ext, Test}; #[test] - fn v3_deserialized_from_actual_data() { + fn v4_deserialized_from_actual_data() { // Example how to get new `raw_config`: - // We'll obtain the raw_config hes for block - // 15,772,152 (0xf89d3ab5312c5f70d396dc59612f0aa65806c798346f9db4b35278baed2e0e53) on Kusama. + // We'll obtain the raw_config at a specified a block // Steps: // 1. Go to Polkadot.js -> Developer -> Chain state -> Storage: https://polkadot.js.org/apps/#/chainstate // 2. Set these parameters: @@ -265,37 +279,35 @@ mod tests { // 3. Go to Polkadot.js -> Developer -> Chain state -> Raw storage // 3.1 Enter the encoded storage key and you get the raw config. - // Fetched at Kusama 15,772,152 (0xf89d3ab5312c5f70d396dc59612f0aa65806c798346f9db4b35278baed2e0e53) - // // This exceeds the maximal line width length, but that's fine, since this is not code and // doesn't need to be read and also leaving it as one line allows to easily copy it. - let raw_config = hex_literal::hex!["0000a000005000000a00000000c8000000c800000a0000000a000000100e0000580200000000500000c800000700e8764817020040011e00000000000000005039278c0400000000000000000000005039278c0400000000000000000000e8030000009001001e00000000000000009001008070000000000000000000000a0000000a0000000a00000001000000010500000001c8000000060000005802000002000000580200000200000059000000000000001e000000280000000700c817a80402004001000200000014000000"]; + let raw_config = hex_literal::hex!["0000a000005000000a00000000c8000000c800000a0000000a000000100e0000580200000000500000c800000700e8764817020040011e00000000000000005039278c0400000000000000000000005039278c0400000000000000000000e8030000009001001e00000000000000009001008070000000000000000000000a0000000a0000000a00000001000000010500000001c80000000600000058020000580200000200000059000000000000001e000000280000000700c817a80402004001010200000014000000"]; - let v3 = v4::OldHostConfiguration::::decode(&mut &raw_config[..]) + let v4 = v5::OldHostConfiguration::::decode(&mut &raw_config[..]) .unwrap(); // We check only a sample of the values here. If we missed any fields or messed up data types // that would skew all the fields coming after. - assert_eq!(v3.max_code_size, 10_485_760); - assert_eq!(v3.validation_upgrade_cooldown, 3600); - assert_eq!(v3.max_pov_size, 5_242_880); - assert_eq!(v3.hrmp_channel_max_message_size, 102_400); - assert_eq!(v3.n_delay_tranches, 89); - assert_eq!(v3.ump_max_individual_weight, Weight::from_parts(20_000_000_000, 5_242_880)); - assert_eq!(v3.minimum_validation_upgrade_delay, 20); + assert_eq!(v4.max_code_size, 10_485_760); + assert_eq!(v4.validation_upgrade_cooldown, 3600); + assert_eq!(v4.max_pov_size, 5_242_880); + assert_eq!(v4.hrmp_channel_max_message_size, 102_400); + assert_eq!(v4.n_delay_tranches, 89); + assert_eq!(v4.ump_max_individual_weight, Weight::from_parts(20_000_000_000, 5_242_880)); + assert_eq!(v4.minimum_validation_upgrade_delay, 20); } #[test] - fn test_migrate_to_v4() { - // Host configuration has lots of fields. However, in this migration we add only a couple of - // fields. The most important part to check are a couple of the last fields. We also pick + fn test_migrate_to_v5() { + // Host configuration has lots of fields. However, in this migration we only remove one field. + // The most important part to check are a couple of the last fields. We also pick // extra fields to check arbitrarily, e.g. depending on their position (i.e. the middle) and // also their type. // // We specify only the picked fields and the rest should be provided by the `Default` // implementation. That implementation is copied over between the two types and should work // fine. - let v3 = v4::OldHostConfiguration:: { + let v4 = v5::OldHostConfiguration:: { ump_max_individual_weight: Weight::from_parts(0x71616e6f6e0au64, 0x71616e6f6e0au64), needed_approvals: 69, thread_availability_period: 55, @@ -306,63 +318,72 @@ mod tests { ..Default::default() }; + let mut pending_configs = Vec::new(); + pending_configs.push((100, v4.clone())); + pending_configs.push((300, v4.clone())); + new_test_ext(Default::default()).execute_with(|| { - // Implant the v3 version in the state. + // Implant the v4 version in the state. frame_support::storage::unhashed::put_raw( &configuration::ActiveConfig::::hashed_key(), - &v3.encode(), + &v4.encode(), + ); + frame_support::storage::unhashed::put_raw( + &configuration::PendingConfigs::::hashed_key(), + &pending_configs.encode(), ); - migrate_to_v4::(); - - let v4 = configuration::ActiveConfig::::get(); + migrate_to_v5::(); - #[rustfmt::skip] - { - assert_eq!(v3.max_code_size , v4.max_code_size); - assert_eq!(v3.max_head_data_size , v4.max_head_data_size); - assert_eq!(v3.max_upward_queue_count , v4.max_upward_queue_count); - assert_eq!(v3.max_upward_queue_size , v4.max_upward_queue_size); - assert_eq!(v3.max_upward_message_size , v4.max_upward_message_size); - assert_eq!(v3.max_upward_message_num_per_candidate , v4.max_upward_message_num_per_candidate); - assert_eq!(v3.hrmp_max_message_num_per_candidate , v4.hrmp_max_message_num_per_candidate); - assert_eq!(v3.validation_upgrade_cooldown , v4.validation_upgrade_cooldown); - assert_eq!(v3.validation_upgrade_delay , v4.validation_upgrade_delay); - assert_eq!(v3.max_pov_size , v4.max_pov_size); - assert_eq!(v3.max_downward_message_size , v4.max_downward_message_size); - assert_eq!(v3.ump_service_total_weight , v4.ump_service_total_weight); - assert_eq!(v3.hrmp_max_parachain_outbound_channels , v4.hrmp_max_parachain_outbound_channels); - assert_eq!(v3.hrmp_max_parathread_outbound_channels , v4.hrmp_max_parathread_outbound_channels); - assert_eq!(v3.hrmp_sender_deposit , v4.hrmp_sender_deposit); - assert_eq!(v3.hrmp_recipient_deposit , v4.hrmp_recipient_deposit); - assert_eq!(v3.hrmp_channel_max_capacity , v4.hrmp_channel_max_capacity); - assert_eq!(v3.hrmp_channel_max_total_size , v4.hrmp_channel_max_total_size); - assert_eq!(v3.hrmp_max_parachain_inbound_channels , v4.hrmp_max_parachain_inbound_channels); - assert_eq!(v3.hrmp_max_parathread_inbound_channels , v4.hrmp_max_parathread_inbound_channels); - assert_eq!(v3.hrmp_channel_max_message_size , v4.hrmp_channel_max_message_size); - assert_eq!(v3.code_retention_period , v4.code_retention_period); - assert_eq!(v3.parathread_cores , v4.parathread_cores); - assert_eq!(v3.parathread_retries , v4.parathread_retries); - assert_eq!(v3.group_rotation_frequency , v4.group_rotation_frequency); - assert_eq!(v3.chain_availability_period , v4.chain_availability_period); - assert_eq!(v3.thread_availability_period , v4.thread_availability_period); - assert_eq!(v3.scheduling_lookahead , v4.scheduling_lookahead); - assert_eq!(v3.max_validators_per_core , v4.max_validators_per_core); - assert_eq!(v3.max_validators , v4.max_validators); - assert_eq!(v3.dispute_period , v4.dispute_period); - assert_eq!(v3.dispute_post_conclusion_acceptance_period, v4.dispute_post_conclusion_acceptance_period); - assert_eq!(v3.dispute_conclusion_by_time_out_period , v4.dispute_conclusion_by_time_out_period); - assert_eq!(v3.no_show_slots , v4.no_show_slots); - assert_eq!(v3.n_delay_tranches , v4.n_delay_tranches); - assert_eq!(v3.zeroth_delay_tranche_width , v4.zeroth_delay_tranche_width); - assert_eq!(v3.needed_approvals , v4.needed_approvals); - assert_eq!(v3.relay_vrf_modulo_samples , v4.relay_vrf_modulo_samples); - assert_eq!(v3.ump_max_individual_weight , v4.ump_max_individual_weight); - assert_eq!(v3.pvf_checking_enabled , v4.pvf_checking_enabled); - assert_eq!(v3.pvf_voting_ttl , v4.pvf_voting_ttl); - assert_eq!(v3.minimum_validation_upgrade_delay , v4.minimum_validation_upgrade_delay); + let v5 = configuration::ActiveConfig::::get(); + let mut configs_to_check = configuration::PendingConfigs::::get(); + configs_to_check.push((0, v5.clone())); - }; // ; makes this a statement. `rustfmt::skip` cannot be put on an expression. + for (_, v4) in configs_to_check { + #[rustfmt::skip] + { + assert_eq!(v4.max_code_size , v5.max_code_size); + assert_eq!(v4.max_head_data_size , v5.max_head_data_size); + assert_eq!(v4.max_upward_queue_count , v5.max_upward_queue_count); + assert_eq!(v4.max_upward_queue_size , v5.max_upward_queue_size); + assert_eq!(v4.max_upward_message_size , v5.max_upward_message_size); + assert_eq!(v4.max_upward_message_num_per_candidate , v5.max_upward_message_num_per_candidate); + assert_eq!(v4.hrmp_max_message_num_per_candidate , v5.hrmp_max_message_num_per_candidate); + assert_eq!(v4.validation_upgrade_cooldown , v5.validation_upgrade_cooldown); + assert_eq!(v4.validation_upgrade_delay , v5.validation_upgrade_delay); + assert_eq!(v4.max_pov_size , v5.max_pov_size); + assert_eq!(v4.max_downward_message_size , v5.max_downward_message_size); + assert_eq!(v4.ump_service_total_weight , v5.ump_service_total_weight); + assert_eq!(v4.hrmp_max_parachain_outbound_channels , v5.hrmp_max_parachain_outbound_channels); + assert_eq!(v4.hrmp_max_parathread_outbound_channels , v5.hrmp_max_parathread_outbound_channels); + assert_eq!(v4.hrmp_sender_deposit , v5.hrmp_sender_deposit); + assert_eq!(v4.hrmp_recipient_deposit , v5.hrmp_recipient_deposit); + assert_eq!(v4.hrmp_channel_max_capacity , v5.hrmp_channel_max_capacity); + assert_eq!(v4.hrmp_channel_max_total_size , v5.hrmp_channel_max_total_size); + assert_eq!(v4.hrmp_max_parachain_inbound_channels , v5.hrmp_max_parachain_inbound_channels); + assert_eq!(v4.hrmp_max_parathread_inbound_channels , v5.hrmp_max_parathread_inbound_channels); + assert_eq!(v4.hrmp_channel_max_message_size , v5.hrmp_channel_max_message_size); + assert_eq!(v4.code_retention_period , v5.code_retention_period); + assert_eq!(v4.parathread_cores , v5.parathread_cores); + assert_eq!(v4.parathread_retries , v5.parathread_retries); + assert_eq!(v4.group_rotation_frequency , v5.group_rotation_frequency); + assert_eq!(v4.chain_availability_period , v5.chain_availability_period); + assert_eq!(v4.thread_availability_period , v5.thread_availability_period); + assert_eq!(v4.scheduling_lookahead , v5.scheduling_lookahead); + assert_eq!(v4.max_validators_per_core , v5.max_validators_per_core); + assert_eq!(v4.max_validators , v5.max_validators); + assert_eq!(v4.dispute_period , v5.dispute_period); + assert_eq!(v4.no_show_slots , v5.no_show_slots); + assert_eq!(v4.n_delay_tranches , v5.n_delay_tranches); + assert_eq!(v4.zeroth_delay_tranche_width , v5.zeroth_delay_tranche_width); + assert_eq!(v4.needed_approvals , v5.needed_approvals); + assert_eq!(v4.relay_vrf_modulo_samples , v5.relay_vrf_modulo_samples); + assert_eq!(v4.ump_max_individual_weight , v5.ump_max_individual_weight); + assert_eq!(v4.pvf_checking_enabled , v5.pvf_checking_enabled); + assert_eq!(v4.pvf_voting_ttl , v5.pvf_voting_ttl); + assert_eq!(v4.minimum_validation_upgrade_delay , v5.minimum_validation_upgrade_delay); + }; // ; makes this a statement. `rustfmt::skip` cannot be put on an expression. + } }); } } diff --git a/runtime/parachains/src/configuration/tests.rs b/runtime/parachains/src/configuration/tests.rs index 2d89aebc19d3..eb29200a12c7 100644 --- a/runtime/parachains/src/configuration/tests.rs +++ b/runtime/parachains/src/configuration/tests.rs @@ -297,7 +297,6 @@ fn setting_pending_config_members() { max_validators: None, dispute_period: 239, dispute_post_conclusion_acceptance_period: 10, - dispute_conclusion_by_time_out_period: 512, no_show_slots: 240, n_delay_tranches: 241, zeroth_delay_tranche_width: 242, @@ -389,11 +388,6 @@ fn setting_pending_config_members() { new_config.dispute_post_conclusion_acceptance_period, ) .unwrap(); - Configuration::set_dispute_conclusion_by_time_out_period( - RuntimeOrigin::root(), - new_config.dispute_conclusion_by_time_out_period, - ) - .unwrap(); Configuration::set_no_show_slots(RuntimeOrigin::root(), new_config.no_show_slots).unwrap(); Configuration::set_n_delay_tranches(RuntimeOrigin::root(), new_config.n_delay_tranches) .unwrap(); diff --git a/runtime/parachains/src/disputes.rs b/runtime/parachains/src/disputes.rs index a0e4ff9e7a96..6350361816f6 100644 --- a/runtime/parachains/src/disputes.rs +++ b/runtime/parachains/src/disputes.rs @@ -18,7 +18,7 @@ use crate::{configuration, initializer::SessionChangeNotification, session_info}; use bitvec::{bitvec, order::Lsb0 as BitOrderLsb0}; -use frame_support::{ensure, traits::Get, weights::Weight}; +use frame_support::{ensure, weights::Weight}; use frame_system::pallet_prelude::*; use parity_scale_codec::{Decode, Encode}; use primitives::{ @@ -503,9 +503,6 @@ pub mod pallet { /// A dispute has concluded for or against a candidate. /// `\[para id, candidate hash, dispute result\]` DisputeConcluded(CandidateHash, DisputeResult), - /// A dispute has timed out due to insufficient participation. - /// `\[para id, candidate hash\]` - DisputeTimedOut(CandidateHash), /// A dispute has concluded with supermajority against a candidate. /// Block authors should no longer build on top of this head and should /// instead revert the block at the given height. This should be the @@ -911,26 +908,8 @@ impl StatementSetFilter { impl Pallet { /// Called by the initializer to initialize the disputes module. - pub(crate) fn initializer_initialize(now: T::BlockNumber) -> Weight { - let config = >::config(); - - let mut weight = Weight::zero(); - for (session_index, candidate_hash, mut dispute) in >::iter() { - weight += T::DbWeight::get().reads_writes(1, 0); - - if dispute.concluded_at.is_none() && - dispute.start + config.dispute_conclusion_by_time_out_period < now - { - Self::deposit_event(Event::DisputeTimedOut(candidate_hash)); - - dispute.concluded_at = Some(now); - >::insert(session_index, candidate_hash, &dispute); - - weight += T::DbWeight::get().writes(1); - } - } - - weight + pub(crate) fn initializer_initialize(_now: T::BlockNumber) -> Weight { + Weight::zero() } /// Called by the initializer to finalize the disputes pallet. diff --git a/runtime/parachains/src/disputes/tests.rs b/runtime/parachains/src/disputes/tests.rs index b12814fd72be..afbfa4bc603f 100644 --- a/runtime/parachains/src/disputes/tests.rs +++ b/runtime/parachains/src/disputes/tests.rs @@ -329,131 +329,6 @@ fn test_import_backing_votes() { ); } -// Test that dispute timeout is handled correctly. -#[test] -fn test_dispute_timeout() { - let dispute_conclusion_by_time_out_period = 3; - let start = 10; - - let mock_genesis_config = MockGenesisConfig { - configuration: crate::configuration::GenesisConfig { - config: HostConfiguration { - dispute_conclusion_by_time_out_period, - ..Default::default() - }, - ..Default::default() - }, - ..Default::default() - }; - - new_test_ext(mock_genesis_config).execute_with(|| { - // We need 7 validators for the byzantine threshold to be 2 - let v0 = ::Pair::generate().0; - let v1 = ::Pair::generate().0; - let v2 = ::Pair::generate().0; - let v3 = ::Pair::generate().0; - let v4 = ::Pair::generate().0; - let v5 = ::Pair::generate().0; - let v6 = ::Pair::generate().0; - - run_to_block(start, |b| { - // a new session at each block - Some(( - true, - b, - vec![ - (&0, v0.public()), - (&1, v1.public()), - (&2, v2.public()), - (&3, v3.public()), - (&4, v4.public()), - (&5, v5.public()), - (&6, v6.public()), - ], - Some(vec![ - (&0, v0.public()), - (&1, v1.public()), - (&2, v2.public()), - (&3, v3.public()), - (&4, v4.public()), - (&5, v5.public()), - (&6, v6.public()), - ]), - )) - }); - - let candidate_hash = CandidateHash(sp_core::H256::repeat_byte(1)); - let inclusion_parent = sp_core::H256::repeat_byte(0xff); - - // v0 and v1 vote for 3, v2 against. We need f+1 votes (3) so that the dispute is - // confirmed. Otherwise It will be filtered out. - let session = start - 1; - let stmts = vec![DisputeStatementSet { - candidate_hash: candidate_hash.clone(), - session, - statements: vec![ - ( - DisputeStatement::Valid(ValidDisputeStatementKind::BackingValid( - inclusion_parent, - )), - ValidatorIndex(0), - v0.sign(&CompactStatement::Valid(candidate_hash).signing_payload( - &SigningContext { session_index: start - 1, parent_hash: inclusion_parent }, - )), - ), - ( - DisputeStatement::Valid(ValidDisputeStatementKind::Explicit), - ValidatorIndex(1), - v1.sign( - &ExplicitDisputeStatement { - valid: true, - candidate_hash: candidate_hash.clone(), - session: start - 1, - } - .signing_payload(), - ), - ), - ( - DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit), - ValidatorIndex(6), - v2.sign( - &ExplicitDisputeStatement { - valid: false, - candidate_hash: candidate_hash.clone(), - session: start - 1, - } - .signing_payload(), - ), - ), - ], - }]; - - let stmts = filter_dispute_set(stmts); - - assert_ok!( - Pallet::::process_checked_multi_dispute_data(&stmts), - vec![(9, candidate_hash.clone())], - ); - - // Run to timeout period - run_to_block(start + dispute_conclusion_by_time_out_period, |_| None); - assert!(>::get(&session, &candidate_hash) - .expect("dispute should exist") - .concluded_at - .is_none()); - - // Run to timeout + 1 in order to executive on_finalize(timeout) - run_to_block(start + dispute_conclusion_by_time_out_period + 1, |_| None); - assert_eq!( - >::get(&session, &candidate_hash) - .expect("dispute should exist") - .concluded_at - .expect("dispute should have concluded"), - start + dispute_conclusion_by_time_out_period + 1 - ); - }); -} - // Test pruning works #[test] fn test_initializer_on_new_session() { diff --git a/runtime/polkadot/src/lib.rs b/runtime/polkadot/src/lib.rs index cf1bb606fcac..3b307e2d2da1 100644 --- a/runtime/polkadot/src/lib.rs +++ b/runtime/polkadot/src/lib.rs @@ -1418,6 +1418,7 @@ pub type Migrations = ( Runtime, NominationPoolsMigrationV4OldPallet, >, + parachains_configuration::migration::v5::MigrateToV5, ); /// Unchecked extrinsic type as expected by this runtime. diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index 2405af9cc1da..5a42349dbda3 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -1494,7 +1494,7 @@ pub type UncheckedExtrinsic = /// All migrations that will run on the next runtime upgrade. /// /// Should be cleared after every release. -pub type Migrations = (); +pub type Migrations = parachains_configuration::migration::v5::MigrateToV5; /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 37695dbcc633..59ca4c0bc931 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -1214,6 +1214,7 @@ pub type Migrations = ( Runtime, NominationPoolsMigrationV4OldPallet, >, + parachains_configuration::migration::v5::MigrateToV5, ); /// Unchecked extrinsic type as expected by this runtime.