From 2a50fc1f3170a2fdff78ae997f28eb55058794d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Thu, 15 Jul 2021 23:27:29 +0100 Subject: [PATCH] Revert "Compact proof. (#295)" This reverts commit d935b81e7010fcf5c5639e238c78d865c1d6ed67. --- Cargo.lock | 1 + client/collator/src/lib.rs | 22 +++---------------- pallets/parachain-system/Cargo.toml | 2 ++ .../src/validate_block/implementation.rs | 18 ++++++--------- primitives/core/src/lib.rs | 16 +++++--------- test/client/src/block_builder.rs | 18 +++++++-------- 6 files changed, 26 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a52a18ad4b5..5c0d2a97feb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1666,6 +1666,7 @@ dependencies = [ "environmental", "frame-support", "frame-system", + "hash-db", "hex-literal 0.2.1", "lazy_static", "log", diff --git a/client/collator/src/lib.rs b/client/collator/src/lib.rs index 17af9efa2a5..8b9d20ffa81 100644 --- a/client/collator/src/lib.rs +++ b/client/collator/src/lib.rs @@ -25,7 +25,7 @@ use sp_consensus::BlockStatus; use sp_core::traits::SpawnNamed; use sp_runtime::{ generic::BlockId, - traits::{Block as BlockT, HashFor, Header as HeaderT, Zero}, + traits::{Block as BlockT, Header as HeaderT, Zero}, }; use cumulus_client_consensus_common::ParachainConsensus; @@ -225,19 +225,8 @@ where let (header, extrinsics) = candidate.block.deconstruct(); - let compact_proof = match candidate - .proof - .into_compact_proof::>(last_head.state_root().clone()) - { - Ok(proof) => proof, - Err(e) => { - tracing::error!(target: "cumulus-collator", "Failed to compact proof: {:?}", e); - return None; - } - }; - // Create the parachain block data for the validators. - let b = ParachainBlockData::::new(header, extrinsics, compact_proof); + let b = ParachainBlockData::::new(header, extrinsics, candidate.proof); tracing::debug!( target: LOG_TARGET, @@ -454,12 +443,7 @@ mod tests { assert_eq!(1, *block.header().number()); // Ensure that we did not include `:code` in the proof. - let db = block - .storage_proof() - .to_storage_proof::(Some(header.state_root())) - .unwrap() - .0 - .into_memory_db(); + let db = block.storage_proof().clone().into_memory_db(); let backend = sp_state_machine::new_in_mem::().update_backend(*header.state_root(), db); diff --git a/pallets/parachain-system/Cargo.toml b/pallets/parachain-system/Cargo.toml index 994b4d2cae0..20a34069465 100644 --- a/pallets/parachain-system/Cargo.toml +++ b/pallets/parachain-system/Cargo.toml @@ -31,6 +31,7 @@ sp-externalities = { git = "https://github.com/paritytech/substrate", default-fe # Other Dependencies codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive"]} +hash-db = { version = "0.15.2", default-features = false } serde = { version = "1.0.101", optional = true, features = ["derive"] } log = { version = "0.4.14", default-features = false } environmental = { version = "1.1.2", default-features = false } @@ -55,6 +56,7 @@ default = [ "std" ] std = [ "serde", "codec/std", + "hash-db/std", "frame-support/std", "pallet-balances/std", "sp-core/std", diff --git a/pallets/parachain-system/src/validate_block/implementation.rs b/pallets/parachain-system/src/validate_block/implementation.rs index 439e1450db2..abab268fb25 100644 --- a/pallets/parachain-system/src/validate_block/implementation.rs +++ b/pallets/parachain-system/src/validate_block/implementation.rs @@ -22,6 +22,8 @@ use sp_runtime::traits::{Block as BlockT, Extrinsic, HashFor, Header as HeaderT, use sp_io::KillStorageResult; use sp_std::prelude::*; +use hash_db::{HashDB, EMPTY_PREFIX}; + use polkadot_parachain::primitives::{HeadData, ValidationParams, ValidationResult}; use codec::{Decode, Encode}; @@ -69,17 +71,11 @@ where "Invalid parent hash", ); - // Uncompress - let mut db = MemoryDB::default(); - let root = match sp_trie::decode_compact::>, _, _>( - &mut db, - storage_proof.iter_compact_encoded_nodes(), - Some(parent_head.state_root()), - ) { - Ok(root) => root, - Err(_) => panic!("Compact proof decoding failure."), - }; - sp_std::mem::drop(storage_proof); + let db = storage_proof.into_memory_db(); + let root = parent_head.state_root().clone(); + if !HashDB::, _>::contains(&db, &root, EMPTY_PREFIX) { + panic!("Witness data does not contain given storage root."); + } let backend = sp_state_machine::TrieBackend::new(db, root); diff --git a/primitives/core/src/lib.rs b/primitives/core/src/lib.rs index 5d49b892862..a622452942d 100644 --- a/primitives/core/src/lib.rs +++ b/primitives/core/src/lib.rs @@ -195,7 +195,7 @@ pub struct ParachainBlockData { /// The extrinsics of the parachain block. extrinsics: sp_std::vec::Vec, /// The data that is required to emulate the storage accesses executed by all extrinsics. - storage_proof: sp_trie::CompactProof, + storage_proof: sp_trie::StorageProof, } impl ParachainBlockData { @@ -203,7 +203,7 @@ impl ParachainBlockData { pub fn new( header: ::Header, extrinsics: sp_std::vec::Vec<::Extrinsic>, - storage_proof: sp_trie::CompactProof, + storage_proof: sp_trie::StorageProof, ) -> Self { Self { header, @@ -232,19 +232,13 @@ impl ParachainBlockData { &self.extrinsics } - /// Returns the [`CompactProof`](sp_trie::CompactProof). - pub fn storage_proof(&self) -> &sp_trie::CompactProof { + /// Returns the [`StorageProof`](sp_trie::StorageProof). + pub fn storage_proof(&self) -> &sp_trie::StorageProof { &self.storage_proof } /// Deconstruct into the inner parts. - pub fn deconstruct( - self, - ) -> ( - B::Header, - sp_std::vec::Vec, - sp_trie::CompactProof, - ) { + pub fn deconstruct(self) -> (B::Header, sp_std::vec::Vec, sp_trie::StorageProof) { (self.header, self.extrinsics, self.storage_proof) } } diff --git a/test/client/src/block_builder.rs b/test/client/src/block_builder.rs index 00a327c1097..716e68fe5e4 100644 --- a/test/client/src/block_builder.rs +++ b/test/client/src/block_builder.rs @@ -18,13 +18,13 @@ use crate::{Backend, Client}; use cumulus_primitives_core::{ParachainBlockData, PersistedValidationData}; use cumulus_primitives_parachain_inherent::{ParachainInherentData, INHERENT_IDENTIFIER}; use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; -use cumulus_test_runtime::{Block, GetLastTimestamp, Hash, Header}; +use cumulus_test_runtime::{Block, GetLastTimestamp, Hash}; use polkadot_primitives::v1::{BlockNumber as PBlockNumber, Hash as PHash}; use sc_block_builder::{BlockBuilder, BlockBuilderProvider}; use sp_api::ProvideRuntimeApi; use sp_runtime::{ generic::BlockId, - traits::{Block as BlockT, Header as HeaderT}, + traits::Block as BlockT, }; /// An extension for the Cumulus test client to init a block builder. @@ -167,16 +167,14 @@ pub trait BuildParachainBlockData { } impl<'a> BuildParachainBlockData for sc_block_builder::BlockBuilder<'a, Block, Client, Backend> { - fn build_parachain_block(self, parent_state_root: Hash) -> ParachainBlockData { + fn build_parachain_block(self, _parent_state_root: Hash) -> ParachainBlockData { let built_block = self.build().expect("Builds the block"); - let storage_proof = built_block - .proof - .expect("We enabled proof recording before.") - .into_compact_proof::<
::Hashing>(parent_state_root) - .expect("Creates the compact proof"); - let (header, extrinsics) = built_block.block.deconstruct(); - ParachainBlockData::new(header, extrinsics, storage_proof) + ParachainBlockData::new( + header, + extrinsics, + built_block.proof.expect("We enabled proof recording before."), + ) } }