From 8f9dcd95ee7a93944639f9fb32af7c9e8336eef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 19 Jun 2020 10:40:16 +0200 Subject: [PATCH] Take storage root from parent header --- collator/src/lib.rs | 3 -- runtime/src/lib.rs | 4 -- runtime/src/validate_block/implementation.rs | 2 +- runtime/src/validate_block/tests.rs | 47 +++++++------------- 4 files changed, 18 insertions(+), 38 deletions(-) diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 562076b8a8a..cb4feb4a64e 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -196,8 +196,6 @@ where let wait_to_announce = self.wait_to_announce.clone(); Box::pin(async move { - let parent_state_root = *last_head.header.state_root(); - let proposer = proposer_future.await.map_err(|e| { error!( target: "cumulus-collator", @@ -251,7 +249,6 @@ where header.clone(), extrinsics, proof.iter_nodes().collect(), - parent_state_root, ); let mut block_import_params = BlockImportParams::new(BlockOrigin::Own, header); diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index e48896ea029..5bcde2d071a 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -41,8 +41,6 @@ pub struct ParachainBlockData { extrinsics: Vec<::Extrinsic>, /// The data that is required to emulate the storage accesses executed by all extrinsics. witness_data: WitnessData, - /// The storage root of the witness data. - witness_data_storage_root: ::Hash, } impl ParachainBlockData { @@ -50,13 +48,11 @@ impl ParachainBlockData { header: ::Header, extrinsics: Vec<::Extrinsic>, witness_data: WitnessData, - witness_data_storage_root: ::Hash, ) -> Self { Self { header, extrinsics, witness_data, - witness_data_storage_root, } } diff --git a/runtime/src/validate_block/implementation.rs b/runtime/src/validate_block/implementation.rs index 17c5b1ad295..45a44cb0504 100644 --- a/runtime/src/validate_block/implementation.rs +++ b/runtime/src/validate_block/implementation.rs @@ -112,7 +112,7 @@ pub fn validate_block>(params: ValidationParams) - let storage_inner = WitnessStorage::::new( block_data.witness_data, - block_data.witness_data_storage_root, + parent_head.state_root().clone(), validation_function_params, ) .expect("Witness data and storage root always match; qed"); diff --git a/runtime/src/validate_block/tests.rs b/runtime/src/validate_block/tests.rs index 15664ef7997..15ff0c255c8 100644 --- a/runtime/src/validate_block/tests.rs +++ b/runtime/src/validate_block/tests.rs @@ -17,10 +17,10 @@ use crate::{ParachainBlockData, WitnessData}; use parachain::primitives::{BlockData, HeadData, ValidationParams, ValidationResult}; +use sc_block_builder::BlockBuilderProvider; use sc_executor::{ - error::Result, WasmExecutionMethod, WasmExecutor, sp_wasm_interface::HostFunctions, + error::Result, sp_wasm_interface::HostFunctions, WasmExecutionMethod, WasmExecutor, }; -use sc_block_builder::BlockBuilderProvider; use sp_blockchain::HeaderBackend; use sp_consensus::SelectChain; use sp_core::traits::CallInWasm; @@ -60,17 +60,18 @@ fn call_validate_block( 1, ); - executor.call_in_wasm( - &WASM_BINARY, - None, - "validate_block", - ¶ms, - &mut ext_ext, - sp_core::traits::MissingHostFunctions::Disallow, - ) - .map(|v| ValidationResult::decode(&mut &v[..]).expect("Decode `ValidationResult`.")) - .map(|v| Header::decode(&mut &v.head_data.0[..]).expect("Decode `Header`.")) - .map_err(|err| err.into()) + executor + .call_in_wasm( + &WASM_BINARY, + None, + "validate_block", + ¶ms, + &mut ext_ext, + sp_core::traits::MissingHostFunctions::Disallow, + ) + .map(|v| ValidationResult::decode(&mut &v[..]).expect("Decode `ValidationResult`.")) + .map(|v| Header::decode(&mut &v.head_data.0[..]).expect("Decode `Header`.")) + .map_err(|err| err.into()) } fn create_extrinsics() -> Vec<::Extrinsic> { @@ -139,16 +140,10 @@ fn build_block_with_proof( fn validate_block_with_no_extrinsics() { let (client, longest_chain) = create_test_client(); let parent_head = longest_chain.best_chain().expect("Best block exists"); - let witness_data_storage_root = *parent_head.state_root(); let (block, witness_data) = build_block_with_proof(&client, Vec::new()); let (header, extrinsics) = block.deconstruct(); - let block_data = ParachainBlockData::new( - header.clone(), - extrinsics, - witness_data, - witness_data_storage_root, - ); + let block_data = ParachainBlockData::new(header.clone(), extrinsics, witness_data); let res_header = call_validate_block(parent_head, block_data).expect("Calls `validate_block`"); assert_eq!(header, res_header); @@ -158,16 +153,10 @@ fn validate_block_with_no_extrinsics() { fn validate_block_with_extrinsics() { let (client, longest_chain) = create_test_client(); let parent_head = longest_chain.best_chain().expect("Best block exists"); - let witness_data_storage_root = *parent_head.state_root(); let (block, witness_data) = build_block_with_proof(&client, create_extrinsics()); let (header, extrinsics) = block.deconstruct(); - let block_data = ParachainBlockData::new( - header.clone(), - extrinsics, - witness_data, - witness_data_storage_root, - ); + let block_data = ParachainBlockData::new(header.clone(), extrinsics, witness_data); let res_header = call_validate_block(parent_head, block_data).expect("Calls `validate_block`"); assert_eq!(header, res_header); @@ -178,12 +167,10 @@ fn validate_block_with_extrinsics() { fn validate_block_invalid_parent_hash() { let (client, longest_chain) = create_test_client(); let parent_head = longest_chain.best_chain().expect("Best block exists"); - let witness_data_storage_root = *parent_head.state_root(); let (block, witness_data) = build_block_with_proof(&client, Vec::new()); let (mut header, extrinsics) = block.deconstruct(); header.set_parent_hash(Hash::from_low_u64_be(1)); - let block_data = - ParachainBlockData::new(header, extrinsics, witness_data, witness_data_storage_root); + let block_data = ParachainBlockData::new(header, extrinsics, witness_data); call_validate_block(parent_head, block_data).expect("Calls `validate_block`"); }