From d13a335df6dac608734b9d03e21e40b1f491fb0a Mon Sep 17 00:00:00 2001 From: Peter Goodspeed-Niklaus Date: Thu, 19 Nov 2020 17:52:21 +0100 Subject: [PATCH] add max_pov_size to runtime config and PersistedValidationData (#1984) * add max_pov_size to runtime config and PersistedValidationData Closes #1572. * set default genesis max_pov_size * apply suggestions from code review * add default max_pov_size to polkadot_testnet_genesis --- polkadot/node/core/av-store/src/tests.rs | 1 + polkadot/node/core/backing/src/lib.rs | 1 + .../node/core/candidate-validation/src/lib.rs | 22 +++++++++---------- .../availability-distribution/src/tests.rs | 1 + polkadot/node/service/src/chain_spec.rs | 2 ++ polkadot/node/test/service/src/chain_spec.rs | 1 + polkadot/primitives/src/v1.rs | 2 ++ .../runtime/parachains/src/configuration.rs | 16 ++++++++++++++ polkadot/runtime/parachains/src/util.rs | 2 ++ 9 files changed, 36 insertions(+), 12 deletions(-) diff --git a/polkadot/node/core/av-store/src/tests.rs b/polkadot/node/core/av-store/src/tests.rs index 9493e910db..7cad86d43b 100644 --- a/polkadot/node/core/av-store/src/tests.rs +++ b/polkadot/node/core/av-store/src/tests.rs @@ -73,6 +73,7 @@ impl Default for TestState { block_number: 5, hrmp_mqc_heads: Vec::new(), dmq_mqc_head: Default::default(), + max_pov_size: 1024, }; let pruning_config = PruningConfig { diff --git a/polkadot/node/core/backing/src/lib.rs b/polkadot/node/core/backing/src/lib.rs index c3ab45c980..99104cb958 100644 --- a/polkadot/node/core/backing/src/lib.rs +++ b/polkadot/node/core/backing/src/lib.rs @@ -1031,6 +1031,7 @@ mod tests { block_number: Default::default(), hrmp_mqc_heads: Vec::new(), dmq_mqc_head: Default::default(), + max_pov_size: 1024, }, transient: TransientValidationData { max_code_size: 1000, diff --git a/polkadot/node/core/candidate-validation/src/lib.rs b/polkadot/node/core/candidate-validation/src/lib.rs index 2a03a0facf..121508e3c1 100644 --- a/polkadot/node/core/candidate-validation/src/lib.rs +++ b/polkadot/node/core/candidate-validation/src/lib.rs @@ -347,16 +347,14 @@ async fn spawn_validate_exhaustive( /// are passed, `Err` otherwise. fn perform_basic_checks( candidate: &CandidateDescriptor, - max_block_data_size: Option, + max_pov_size: u32, pov: &PoV, ) -> Result<(), InvalidCandidate> { let encoded_pov = pov.encode(); let hash = pov.hash(); - if let Some(max_size) = max_block_data_size { - if encoded_pov.len() as u64 > max_size { - return Err(InvalidCandidate::ParamsTooLarge(encoded_pov.len() as u64)); - } + if encoded_pov.len() > max_pov_size as usize { + return Err(InvalidCandidate::ParamsTooLarge(encoded_pov.len() as u64)); } if hash != candidate.pov_hash { @@ -412,7 +410,7 @@ fn validate_candidate_exhaustive( pov: Arc, spawn: S, ) -> Result { - if let Err(e) = perform_basic_checks(&descriptor, None, &*pov) { + if let Err(e) = perform_basic_checks(&descriptor, persisted_validation_data.max_pov_size, &*pov) { return Ok(ValidationResult::Invalid(e)) } @@ -819,7 +817,7 @@ mod tests { #[test] fn candidate_validation_ok_is_ok() { - let validation_data: PersistedValidationData = Default::default(); + let validation_data = PersistedValidationData { max_pov_size: 1024, ..Default::default() }; let pov = PoV { block_data: BlockData(vec![1; 32]) }; @@ -827,7 +825,7 @@ mod tests { descriptor.pov_hash = pov.hash(); collator_sign(&mut descriptor, Sr25519Keyring::Alice); - assert!(perform_basic_checks(&descriptor, Some(1024), &pov).is_ok()); + assert!(perform_basic_checks(&descriptor, validation_data.max_pov_size, &pov).is_ok()); let validation_result = WasmValidationResult { head_data: HeadData(vec![1, 1, 1]), @@ -859,7 +857,7 @@ mod tests { #[test] fn candidate_validation_bad_return_is_invalid() { - let validation_data: PersistedValidationData = Default::default(); + let validation_data = PersistedValidationData { max_pov_size: 1024, ..Default::default() }; let pov = PoV { block_data: BlockData(vec![1; 32]) }; @@ -867,7 +865,7 @@ mod tests { descriptor.pov_hash = pov.hash(); collator_sign(&mut descriptor, Sr25519Keyring::Alice); - assert!(perform_basic_checks(&descriptor, Some(1024), &pov).is_ok()); + assert!(perform_basic_checks(&descriptor, validation_data.max_pov_size, &pov).is_ok()); let v = validate_candidate_exhaustive::( MockValidationArg { @@ -887,7 +885,7 @@ mod tests { #[test] fn candidate_validation_timeout_is_internal_error() { - let validation_data: PersistedValidationData = Default::default(); + let validation_data = PersistedValidationData { max_pov_size: 1024, ..Default::default() }; let pov = PoV { block_data: BlockData(vec![1; 32]) }; @@ -895,7 +893,7 @@ mod tests { descriptor.pov_hash = pov.hash(); collator_sign(&mut descriptor, Sr25519Keyring::Alice); - assert!(perform_basic_checks(&descriptor, Some(1024), &pov).is_ok()); + assert!(perform_basic_checks(&descriptor, validation_data.max_pov_size, &pov).is_ok()); let v = validate_candidate_exhaustive::( MockValidationArg { diff --git a/polkadot/node/network/availability-distribution/src/tests.rs b/polkadot/node/network/availability-distribution/src/tests.rs index ba3988d583..5cc0ae91f6 100644 --- a/polkadot/node/network/availability-distribution/src/tests.rs +++ b/polkadot/node/network/availability-distribution/src/tests.rs @@ -218,6 +218,7 @@ impl Default for TestState { block_number: Default::default(), hrmp_mqc_heads: Vec::new(), dmq_mqc_head: Default::default(), + max_pov_size: 1024, }; let validator_index = Some((validators.len() - 1) as ValidatorIndex); diff --git a/polkadot/node/service/src/chain_spec.rs b/polkadot/node/service/src/chain_spec.rs index dc417ec16a..92ef30928c 100644 --- a/polkadot/node/service/src/chain_spec.rs +++ b/polkadot/node/service/src/chain_spec.rs @@ -777,6 +777,7 @@ fn rococo_staging_testnet_config_genesis(wasm_binary: &[u8]) -> rococo_runtime:: validation_upgrade_delay: 300, acceptance_period: 1200, max_code_size: 5 * 1024 * 1024, + max_pov_size: 50 * 1024 * 1024, max_head_data_size: 32 * 1024, group_rotation_frequency: 10, ..Default::default() @@ -1229,6 +1230,7 @@ pub fn rococo_testnet_genesis( validation_upgrade_delay: 300, acceptance_period: 1200, max_code_size: 5 * 1024 * 1024, + max_pov_size: 50 * 1024 * 1024, max_head_data_size: 32 * 1024, group_rotation_frequency: 10, ..Default::default() diff --git a/polkadot/node/test/service/src/chain_spec.rs b/polkadot/node/test/service/src/chain_spec.rs index 35d610a972..da0b4d844e 100644 --- a/polkadot/node/test/service/src/chain_spec.rs +++ b/polkadot/node/test/service/src/chain_spec.rs @@ -167,6 +167,7 @@ fn polkadot_testnet_genesis( validation_upgrade_delay: 5, acceptance_period: 1200, max_code_size: 5 * 1024 * 1024, + max_pov_size: 50 * 1024 * 1024, max_head_data_size: 32 * 1024, group_rotation_frequency: 10, ..Default::default() diff --git a/polkadot/primitives/src/v1.rs b/polkadot/primitives/src/v1.rs index b8190dff04..1314d140ae 100644 --- a/polkadot/primitives/src/v1.rs +++ b/polkadot/primitives/src/v1.rs @@ -271,6 +271,8 @@ pub struct PersistedValidationData { /// The DMQ MQC head will be used by the validation function to authorize the downward messages /// passed by the collator. pub dmq_mqc_head: Hash, + /// The maximum legal size of a POV block, in bytes. + pub max_pov_size: u32, } impl PersistedValidationData { diff --git a/polkadot/runtime/parachains/src/configuration.rs b/polkadot/runtime/parachains/src/configuration.rs index 3da61a5b43..98cb403c9a 100644 --- a/polkadot/runtime/parachains/src/configuration.rs +++ b/polkadot/runtime/parachains/src/configuration.rs @@ -43,6 +43,8 @@ pub struct HostConfiguration { pub max_code_size: u32, /// The maximum head-data size, in bytes. pub max_head_data_size: u32, + /// THe maximum POV block size, in bytes. + pub max_pov_size: u32, /// The amount of execution cores to dedicate to parathread execution. pub parathread_cores: u32, /// The number of retries that a parathread author has to submit their block. @@ -172,6 +174,16 @@ decl_module! { Ok(()) } + /// Set the max POV block size for incoming upgrades. + #[weight = (1_000, DispatchClass::Operational)] + pub fn set_max_pov_size(origin, new: u32) -> DispatchResult { + ensure_root(origin)?; + Self::update_config_member(|config| { + sp_std::mem::replace(&mut config.max_pov_size, new) != new + }); + Ok(()) + } + /// Set the max head data size for paras. #[weight = (1_000, DispatchClass::Operational)] pub fn set_max_head_data_size(origin, new: u32) -> DispatchResult { @@ -484,6 +496,7 @@ mod tests { validation_upgrade_delay: 10, acceptance_period: 5, max_code_size: 100_000, + max_pov_size: 1024, max_head_data_size: 1_000, parathread_cores: 2, parathread_retries: 5, @@ -524,6 +537,9 @@ mod tests { Configuration::set_max_code_size( Origin::root(), new_config.max_code_size, ).unwrap(); + Configuration::set_max_pov_size( + Origin::root(), new_config.max_pov_size, + ).unwrap(); Configuration::set_max_head_data_size( Origin::root(), new_config.max_head_data_size, ).unwrap(); diff --git a/polkadot/runtime/parachains/src/util.rs b/polkadot/runtime/parachains/src/util.rs index c827a86d65..d73f824c45 100644 --- a/polkadot/runtime/parachains/src/util.rs +++ b/polkadot/runtime/parachains/src/util.rs @@ -28,6 +28,7 @@ use crate::{configuration, paras, dmp, hrmp}; pub fn make_persisted_validation_data( para_id: ParaId, ) -> Option> { + let config = >::config(); let relay_parent_number = >::block_number() - One::one(); Some(PersistedValidationData { @@ -35,6 +36,7 @@ pub fn make_persisted_validation_data( block_number: relay_parent_number, hrmp_mqc_heads: >::hrmp_mqc_heads(para_id), dmq_mqc_head: >::dmq_mqc_head(para_id), + max_pov_size: config.max_pov_size, }) }