diff --git a/collator/src/lib.rs b/collator/src/lib.rs index 515361f5bc..e93f1b187d 100644 --- a/collator/src/lib.rs +++ b/collator/src/lib.rs @@ -324,7 +324,7 @@ where let b = ParachainBlockData::::new( header.clone(), extrinsics, - proof.iter_nodes().collect(), + proof, ); let mut block_import_params = BlockImportParams::new(BlockOrigin::Own, header); diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 5bcde2d071..753afaac68 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -21,6 +21,7 @@ use codec::{Decode, Encode}; use sp_runtime::traits::Block as BlockT; use sp_std::vec::Vec; +use sp_trie::StorageProof; #[cfg(not(feature = "std"))] #[doc(hidden)] @@ -29,9 +30,6 @@ pub use sp_std::slice; #[macro_use] pub mod validate_block; -/// The witness data type. -type WitnessData = Vec>; - /// The parachain block that is created on a collator and validated by a validator. #[derive(Encode, Decode)] pub struct ParachainBlockData { @@ -40,19 +38,19 @@ pub struct ParachainBlockData { /// The extrinsics of the parachain block without the `PolkadotInherent`. extrinsics: Vec<::Extrinsic>, /// The data that is required to emulate the storage accesses executed by all extrinsics. - witness_data: WitnessData, + storage_proof: StorageProof, } impl ParachainBlockData { pub fn new( header: ::Header, extrinsics: Vec<::Extrinsic>, - witness_data: WitnessData, + storage_proof: StorageProof, ) -> Self { Self { header, extrinsics, - witness_data, + storage_proof, } } diff --git a/runtime/src/validate_block/implementation.rs b/runtime/src/validate_block/implementation.rs index 1f66b6279f..d891017739 100644 --- a/runtime/src/validate_block/implementation.rs +++ b/runtime/src/validate_block/implementation.rs @@ -16,12 +16,11 @@ //! The actual implementation of the validate block functionality. -use crate::WitnessData; use frame_executive::ExecuteBlock; use sp_runtime::traits::{Block as BlockT, HashFor, Header as HeaderT}; use sp_std::{boxed::Box, vec::Vec}; -use sp_trie::{delta_trie_root, read_trie_value, Layout, MemoryDB}; +use sp_trie::{delta_trie_root, read_trie_value, Layout, MemoryDB, StorageProof}; use hash_db::{HashDB, EMPTY_PREFIX}; @@ -117,7 +116,7 @@ pub fn validate_block>(params: ValidationParams) - let validation_function_params = (¶ms).into(); let storage_inner = WitnessStorage::::new( - block_data.witness_data, + block_data.storage_proof, parent_head.state_root().clone(), validation_function_params, ) @@ -181,14 +180,11 @@ impl WitnessStorage { /// /// Returns an error if given storage root was not found in the witness data. fn new( - data: WitnessData, + storage_proof: StorageProof, storage_root: B::Hash, params: ValidationFunctionParams, ) -> Result { - let mut db = MemoryDB::default(); - data.into_iter().for_each(|i| { - db.insert(EMPTY_PREFIX, &i); - }); + let mut db = storage_proof.into_memory_db(); if !HashDB::contains(&db, &storage_root, EMPTY_PREFIX) { return Err("Witness data does not contain given storage root."); diff --git a/runtime/src/validate_block/tests.rs b/runtime/src/validate_block/tests.rs index 15ff0c255c..5265fa7858 100644 --- a/runtime/src/validate_block/tests.rs +++ b/runtime/src/validate_block/tests.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use crate::{ParachainBlockData, WitnessData}; +use crate::ParachainBlockData; use parachain::primitives::{BlockData, HeadData, ValidationParams, ValidationResult}; use sc_block_builder::BlockBuilderProvider; @@ -114,7 +114,7 @@ fn create_test_client() -> (Client, LongestChain) { fn build_block_with_proof( client: &Client, extrinsics: Vec<::Extrinsic>, -) -> (Block, WitnessData) { +) -> (Block, sp_trie::StorageProof) { let block_id = BlockId::Hash(client.info().best_hash); let mut builder = client .new_block_at(&block_id, Default::default(), true) @@ -131,8 +131,6 @@ fn build_block_with_proof( built_block .proof .expect("We enabled proof recording before.") - .iter_nodes() - .collect(), ) }