diff --git a/substrate/core/client/src/light/call_executor.rs b/substrate/core/client/src/light/call_executor.rs index 2367aaf806510c0f1365652a4c56fbd54398f2b1..746f36069d69e27c51e1fc4ab9b3f2b5cfe1cb8d 100644 --- a/substrate/core/client/src/light/call_executor.rs +++ b/substrate/core/client/src/light/call_executor.rs @@ -471,7 +471,7 @@ pub fn check_execution_proof<Header, E, H>( Default::default(), Default::default(), request.header.hash(), - request.header.digest().clone(), + Default::default(), ); execution_proof_check_on_trie_backend::<H, _>( &trie_backend, @@ -498,7 +498,7 @@ pub fn check_execution_proof<Header, E, H>( #[cfg(test)] mod tests { use consensus::BlockOrigin; - use test_client::{self, runtime::Header, ClientExt, TestClient}; + use test_client::{self, runtime::{Header, Digest}, ClientExt, TestClient}; use executor::NativeExecutor; use crate::backend::{Backend, NewBlockState}; use crate::in_mem::Backend as InMemBackend; @@ -509,8 +509,7 @@ mod tests { fn execution_proof_is_generated_and_checked() { fn execute(remote_client: &TestClient, at: u64, method: &'static str) -> (Vec<u8>, Vec<u8>) { let remote_block_id = BlockId::Number(at); - let remote_root = remote_client.state_at(&remote_block_id) - .unwrap().storage_root(::std::iter::empty()).0; + let remote_header = remote_client.header(&remote_block_id).unwrap().unwrap(); // 'fetch' execution proof from remote node let (remote_result, remote_execution_proof) = remote_client.execution_proof( @@ -523,13 +522,7 @@ mod tests { let local_executor = NativeExecutor::<test_client::LocalExecutor>::new(None); let local_result = check_execution_proof(&local_executor, &RemoteCallRequest { block: test_client::runtime::Hash::default(), - header: test_client::runtime::Header { - state_root: remote_root.into(), - parent_hash: Default::default(), - number: at, - extrinsics_root: Default::default(), - digest: Default::default(), - }, + header: remote_header, method: method.into(), call_data: vec![], retry_count: None, @@ -540,10 +533,12 @@ mod tests { // prepare remote client let remote_client = test_client::new(); - for _ in 1..3 { + for i in 1u32..3u32 { + let mut digest = Digest::default(); + digest.push(sr_primitives::generic::DigestItem::Other::<H256>(i.to_le_bytes().to_vec())); remote_client.import_justified( BlockOrigin::Own, - remote_client.new_block(Default::default()).unwrap().bake().unwrap(), + remote_client.new_block(digest).unwrap().bake().unwrap(), Default::default(), ).unwrap(); } diff --git a/substrate/core/test-runtime/src/system.rs b/substrate/core/test-runtime/src/system.rs index f3c890cf79f54f80b08d5690a09d0d65914f433a..63f9c0050b73c1776f1a6ef4d1bc112af5065fc9 100644 --- a/substrate/core/test-runtime/src/system.rs +++ b/substrate/core/test-runtime/src/system.rs @@ -62,6 +62,12 @@ pub fn initialize_block(header: &Header) { <ParentHash>::put(&header.parent_hash); <StorageDigest>::put(header.digest()); storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32); + + // try to read something that depends on current header digest + // so that it'll be included in execution proof + if let Some(generic::DigestItem::Other(v)) = header.digest().logs().iter().next() { + let _: Option<u32> = storage::unhashed::get(&v); + } } pub fn get_block_number() -> Option<BlockNumber> { @@ -104,6 +110,12 @@ fn execute_block_with_state_root_handler( assert!(txs_root == header.extrinsics_root, "Transaction trie root must be valid."); } + // try to read something that depends on current header digest + // so that it'll be included in execution proof + if let Some(generic::DigestItem::Other(v)) = header.digest().logs().iter().next() { + let _: Option<u32> = storage::unhashed::get(&v); + } + // execute transactions block.extrinsics.iter().enumerate().for_each(|(i, e)| { storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &(i as u32));