mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 10:31:03 +00:00
Take storage root from parent header (#123)
This commit is contained in:
@@ -196,8 +196,6 @@ where
|
|||||||
let wait_to_announce = self.wait_to_announce.clone();
|
let wait_to_announce = self.wait_to_announce.clone();
|
||||||
|
|
||||||
Box::pin(async move {
|
Box::pin(async move {
|
||||||
let parent_state_root = *last_head.header.state_root();
|
|
||||||
|
|
||||||
let proposer = proposer_future.await.map_err(|e| {
|
let proposer = proposer_future.await.map_err(|e| {
|
||||||
error!(
|
error!(
|
||||||
target: "cumulus-collator",
|
target: "cumulus-collator",
|
||||||
@@ -251,7 +249,6 @@ where
|
|||||||
header.clone(),
|
header.clone(),
|
||||||
extrinsics,
|
extrinsics,
|
||||||
proof.iter_nodes().collect(),
|
proof.iter_nodes().collect(),
|
||||||
parent_state_root,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut block_import_params = BlockImportParams::new(BlockOrigin::Own, header);
|
let mut block_import_params = BlockImportParams::new(BlockOrigin::Own, header);
|
||||||
|
|||||||
@@ -41,8 +41,6 @@ pub struct ParachainBlockData<B: BlockT> {
|
|||||||
extrinsics: Vec<<B as BlockT>::Extrinsic>,
|
extrinsics: Vec<<B as BlockT>::Extrinsic>,
|
||||||
/// The data that is required to emulate the storage accesses executed by all extrinsics.
|
/// The data that is required to emulate the storage accesses executed by all extrinsics.
|
||||||
witness_data: WitnessData,
|
witness_data: WitnessData,
|
||||||
/// The storage root of the witness data.
|
|
||||||
witness_data_storage_root: <B as BlockT>::Hash,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B: BlockT> ParachainBlockData<B> {
|
impl<B: BlockT> ParachainBlockData<B> {
|
||||||
@@ -50,13 +48,11 @@ impl<B: BlockT> ParachainBlockData<B> {
|
|||||||
header: <B as BlockT>::Header,
|
header: <B as BlockT>::Header,
|
||||||
extrinsics: Vec<<B as BlockT>::Extrinsic>,
|
extrinsics: Vec<<B as BlockT>::Extrinsic>,
|
||||||
witness_data: WitnessData,
|
witness_data: WitnessData,
|
||||||
witness_data_storage_root: <B as BlockT>::Hash,
|
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
header,
|
header,
|
||||||
extrinsics,
|
extrinsics,
|
||||||
witness_data,
|
witness_data,
|
||||||
witness_data_storage_root,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ pub fn validate_block<B: BlockT, E: ExecuteBlock<B>>(params: ValidationParams) -
|
|||||||
|
|
||||||
let storage_inner = WitnessStorage::<B>::new(
|
let storage_inner = WitnessStorage::<B>::new(
|
||||||
block_data.witness_data,
|
block_data.witness_data,
|
||||||
block_data.witness_data_storage_root,
|
parent_head.state_root().clone(),
|
||||||
validation_function_params,
|
validation_function_params,
|
||||||
)
|
)
|
||||||
.expect("Witness data and storage root always match; qed");
|
.expect("Witness data and storage root always match; qed");
|
||||||
|
|||||||
@@ -17,10 +17,10 @@
|
|||||||
use crate::{ParachainBlockData, WitnessData};
|
use crate::{ParachainBlockData, WitnessData};
|
||||||
|
|
||||||
use parachain::primitives::{BlockData, HeadData, ValidationParams, ValidationResult};
|
use parachain::primitives::{BlockData, HeadData, ValidationParams, ValidationResult};
|
||||||
use sc_executor::{
|
|
||||||
error::Result, WasmExecutionMethod, WasmExecutor, sp_wasm_interface::HostFunctions,
|
|
||||||
};
|
|
||||||
use sc_block_builder::BlockBuilderProvider;
|
use sc_block_builder::BlockBuilderProvider;
|
||||||
|
use sc_executor::{
|
||||||
|
error::Result, sp_wasm_interface::HostFunctions, WasmExecutionMethod, WasmExecutor,
|
||||||
|
};
|
||||||
use sp_blockchain::HeaderBackend;
|
use sp_blockchain::HeaderBackend;
|
||||||
use sp_consensus::SelectChain;
|
use sp_consensus::SelectChain;
|
||||||
use sp_core::traits::CallInWasm;
|
use sp_core::traits::CallInWasm;
|
||||||
@@ -60,7 +60,8 @@ fn call_validate_block(
|
|||||||
1,
|
1,
|
||||||
);
|
);
|
||||||
|
|
||||||
executor.call_in_wasm(
|
executor
|
||||||
|
.call_in_wasm(
|
||||||
&WASM_BINARY,
|
&WASM_BINARY,
|
||||||
None,
|
None,
|
||||||
"validate_block",
|
"validate_block",
|
||||||
@@ -139,16 +140,10 @@ fn build_block_with_proof(
|
|||||||
fn validate_block_with_no_extrinsics() {
|
fn validate_block_with_no_extrinsics() {
|
||||||
let (client, longest_chain) = create_test_client();
|
let (client, longest_chain) = create_test_client();
|
||||||
let parent_head = longest_chain.best_chain().expect("Best block exists");
|
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 (block, witness_data) = build_block_with_proof(&client, Vec::new());
|
||||||
let (header, extrinsics) = block.deconstruct();
|
let (header, extrinsics) = block.deconstruct();
|
||||||
|
|
||||||
let block_data = ParachainBlockData::new(
|
let block_data = ParachainBlockData::new(header.clone(), extrinsics, witness_data);
|
||||||
header.clone(),
|
|
||||||
extrinsics,
|
|
||||||
witness_data,
|
|
||||||
witness_data_storage_root,
|
|
||||||
);
|
|
||||||
|
|
||||||
let res_header = call_validate_block(parent_head, block_data).expect("Calls `validate_block`");
|
let res_header = call_validate_block(parent_head, block_data).expect("Calls `validate_block`");
|
||||||
assert_eq!(header, res_header);
|
assert_eq!(header, res_header);
|
||||||
@@ -158,16 +153,10 @@ fn validate_block_with_no_extrinsics() {
|
|||||||
fn validate_block_with_extrinsics() {
|
fn validate_block_with_extrinsics() {
|
||||||
let (client, longest_chain) = create_test_client();
|
let (client, longest_chain) = create_test_client();
|
||||||
let parent_head = longest_chain.best_chain().expect("Best block exists");
|
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 (block, witness_data) = build_block_with_proof(&client, create_extrinsics());
|
||||||
let (header, extrinsics) = block.deconstruct();
|
let (header, extrinsics) = block.deconstruct();
|
||||||
|
|
||||||
let block_data = ParachainBlockData::new(
|
let block_data = ParachainBlockData::new(header.clone(), extrinsics, witness_data);
|
||||||
header.clone(),
|
|
||||||
extrinsics,
|
|
||||||
witness_data,
|
|
||||||
witness_data_storage_root,
|
|
||||||
);
|
|
||||||
|
|
||||||
let res_header = call_validate_block(parent_head, block_data).expect("Calls `validate_block`");
|
let res_header = call_validate_block(parent_head, block_data).expect("Calls `validate_block`");
|
||||||
assert_eq!(header, res_header);
|
assert_eq!(header, res_header);
|
||||||
@@ -178,12 +167,10 @@ fn validate_block_with_extrinsics() {
|
|||||||
fn validate_block_invalid_parent_hash() {
|
fn validate_block_invalid_parent_hash() {
|
||||||
let (client, longest_chain) = create_test_client();
|
let (client, longest_chain) = create_test_client();
|
||||||
let parent_head = longest_chain.best_chain().expect("Best block exists");
|
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 (block, witness_data) = build_block_with_proof(&client, Vec::new());
|
||||||
let (mut header, extrinsics) = block.deconstruct();
|
let (mut header, extrinsics) = block.deconstruct();
|
||||||
header.set_parent_hash(Hash::from_low_u64_be(1));
|
header.set_parent_hash(Hash::from_low_u64_be(1));
|
||||||
|
|
||||||
let block_data =
|
let block_data = ParachainBlockData::new(header, extrinsics, witness_data);
|
||||||
ParachainBlockData::new(header, extrinsics, witness_data, witness_data_storage_root);
|
|
||||||
call_validate_block(parent_head, block_data).expect("Calls `validate_block`");
|
call_validate_block(parent_head, block_data).expect("Calls `validate_block`");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user