From ba0746fd3c595de959122b5da30fa32af45df586 Mon Sep 17 00:00:00 2001 From: Gav Date: Sun, 4 Feb 2018 22:29:58 +0100 Subject: [PATCH] Make digest compilation work. --- substrate/client/src/genesis.rs | 10 ++++---- substrate/executor/src/native_executor.rs | 10 ++++---- substrate/executor/src/wasm_executor.rs | 6 ++--- substrate/wasm-runtime/polkadot/src/lib.rs | 10 ++++---- .../polkadot/src/primitives/digest.rs | 4 +-- .../polkadot/src/runtime/system.rs | 24 ++++++++++-------- .../polkadot/src/support/environment.rs | 2 -- .../release/runtime_polkadot.compact.wasm | Bin 69666 -> 71347 bytes .../release/runtime_polkadot.wasm | Bin 69716 -> 71397 bytes 9 files changed, 33 insertions(+), 33 deletions(-) diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index c774ff8601..cb6f5a6df3 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -71,7 +71,7 @@ mod tests { let transaction_root = ordered_trie_root(transactions.iter().map(Slicable::to_vec)).0; - let header = Header { + let mut header = Header { parent_hash, number, state_root, @@ -83,16 +83,16 @@ mod tests { let mut overlay = OverlayedChanges::default(); for tx in transactions.iter() { - let _ = execute( + header = Header::from_slice(&execute( backend, &mut overlay, &executor(), "execute_transaction", - &CallData(vec![].join(&number).join(tx)) - ).unwrap(); + &CallData(vec![].join(&header).join(tx)) + ).unwrap()).unwrap(); } - let header = Header::from_slice(&execute( + header = Header::from_slice(&execute( backend, &mut overlay, &executor(), diff --git a/substrate/executor/src/native_executor.rs b/substrate/executor/src/native_executor.rs index 78ae257603..d45efd9031 100644 --- a/substrate/executor/src/native_executor.rs +++ b/substrate/executor/src/native_executor.rs @@ -44,7 +44,7 @@ mod tests { use super::*; use runtime_std::TestExternalities; use native_runtime::codec::{KeyedVec, Joiner, Slicable}; - use native_runtime::support::{one, two, StaticHexInto, Hashable}; + use native_runtime::support::{one, two, Hashable}; use native_runtime::primitives::*; use native_runtime::runtime::staking::balance; use primitives::twox_128; @@ -71,7 +71,7 @@ mod tests { twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0] ], }; - let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &CallData(vec![].join(&1u64).join(&tx()))); + let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); assert!(r.is_err()); } @@ -82,7 +82,7 @@ mod tests { twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0] ], }; - let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &CallData(vec![].join(&1u64).join(&tx()))); + let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); assert!(r.is_err()); } @@ -95,7 +95,7 @@ mod tests { twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] ], }; - let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &CallData(vec![].join(&1u64).join(&tx()))); + let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); assert!(r.is_ok()); runtime_std::with_externalities(&mut t, || { @@ -113,7 +113,7 @@ mod tests { twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] ], }; - let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &CallData(vec![].join(&1u64).join(&tx()))); + let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); assert!(r.is_ok()); runtime_std::with_externalities(&mut t, || { diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index a9e8a85647..5ab95c3648 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -293,7 +293,7 @@ mod tests { use primitives::{blake2_256, twox_128}; use runtime_std::{self, TestExternalities}; use native_runtime::support::{one, two}; - use native_runtime::primitives::{UncheckedTransaction, AccountID}; + use native_runtime::primitives::{UncheckedTransaction, AccountID, Header}; use native_runtime::codec::{Joiner, KeyedVec}; use native_runtime::runtime::staking::balance; @@ -436,7 +436,7 @@ mod tests { ], }; let foreign_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm"); - let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &CallData(vec![].join(&1u64).join(&tx()))); + let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); assert!(r.is_err()); } @@ -450,7 +450,7 @@ mod tests { ], }; let foreign_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm"); - let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &CallData(vec![].join(&1u64).join(&tx()))); + let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); assert!(r.is_ok()); runtime_std::with_externalities(&mut t, || { diff --git a/substrate/wasm-runtime/polkadot/src/lib.rs b/substrate/wasm-runtime/polkadot/src/lib.rs index 2585c013b0..eefa6e44a8 100644 --- a/substrate/wasm-runtime/polkadot/src/lib.rs +++ b/substrate/wasm-runtime/polkadot/src/lib.rs @@ -38,7 +38,7 @@ pub mod runtime; use runtime_std::prelude::*; use codec::{Slicable, Joiner}; use runtime_std::print; -use primitives::{Block, Header, BlockNumber, UncheckedTransaction}; +use primitives::{Block, Header, UncheckedTransaction}; /// Execute a block, with `input` being the canonical serialisation of the block. Returns the /// empty vector. @@ -49,10 +49,10 @@ pub fn execute_block(input: &[u8]) -> Vec { /// Execute a given, serialised, transaction. Returns the empty vector. pub fn execute_transaction(input: &[u8]) -> Vec { - let number = BlockNumber::from_slice(&input[0..8]).unwrap(); - let utx = UncheckedTransaction::from_slice(&input[8..]).unwrap(); - runtime::system::internal::execute_transaction(&utx, Header::from_block_number(number)); - Vec::new() + let header = Header::from_slice(input).unwrap(); + let utx = UncheckedTransaction::from_slice(&input[Header::size_of(input).unwrap()..]).unwrap(); + let header = runtime::system::internal::execute_transaction(&utx, header); + Vec::new().join(&header) } /// Execute a given, serialised, transaction. Returns the empty vector. diff --git a/substrate/wasm-runtime/polkadot/src/primitives/digest.rs b/substrate/wasm-runtime/polkadot/src/primitives/digest.rs index 18107460b0..5ce9277420 100644 --- a/substrate/wasm-runtime/polkadot/src/primitives/digest.rs +++ b/substrate/wasm-runtime/polkadot/src/primitives/digest.rs @@ -18,8 +18,8 @@ use runtime_std::prelude::*; -#[derive(Clone, Default)] -#[cfg_attr(feature = "with-std", derive(PartialEq, Debug))] +#[derive(Clone, Default, PartialEq)] +#[cfg_attr(feature = "with-std", derive(Debug))] /// The digest of a block, useful for light-clients. pub struct Digest { /// All logs that have happened in the block. diff --git a/substrate/wasm-runtime/polkadot/src/runtime/system.rs b/substrate/wasm-runtime/polkadot/src/runtime/system.rs index e6d93e9492..5daf530cb4 100644 --- a/substrate/wasm-runtime/polkadot/src/runtime/system.rs +++ b/substrate/wasm-runtime/polkadot/src/runtime/system.rs @@ -51,11 +51,8 @@ pub mod internal { use super::*; /// Deposits a log and ensures it matches the blocks log data. - pub fn deposit_log(log: &[u8]) { - with_env(|e| { - assert_eq!(log, &e.digest.logs[e.next_log_index][..]); - e.next_log_index += 1; - }); + pub fn deposit_log(log: Vec) { + with_env(|e| e.digest.logs.push(log)); } /// Actually execute all transitioning for `block`. @@ -63,8 +60,6 @@ pub mod internal { // populate environment from header. with_env(|e| { e.block_number = block.header.number; - mem::swap(&mut e.digest, &mut block.header.digest); - e.next_log_index = 0; }); let ref header = block.header; @@ -104,15 +99,19 @@ pub mod internal { /// Execute a transaction outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. - pub fn execute_transaction(utx: &UncheckedTransaction, mut header: Header) { + pub fn execute_transaction(utx: &UncheckedTransaction, mut header: Header) -> Header { // populate environment from header. with_env(|e| { e.block_number = header.number; - mem::swap(&mut e.digest, &mut header.digest); - e.next_log_index = 0; + mem::swap(&mut header.digest, &mut e.digest); }); super::execute_transaction(utx); + + with_env(|e| { + mem::swap(&mut header.digest, &mut e.digest); + }); + header } /// Finalise the block - it is up the caller to ensure that all header fields are valid @@ -122,6 +121,9 @@ pub mod internal { session::internal::check_rotate_session(); header.state_root = storage_root(); + with_env(|e| { + mem::swap(&mut header.digest, &mut e.digest); + }); post_finalise(&header); @@ -160,7 +162,7 @@ fn execute_transaction(utx: &UncheckedTransaction) { fn final_checks(_block: &Block) { with_env(|e| { - assert_eq!(e.next_log_index, e.digest.logs.len()); + assert!(_block.header.digest == e.digest); }); } diff --git a/substrate/wasm-runtime/polkadot/src/support/environment.rs b/substrate/wasm-runtime/polkadot/src/support/environment.rs index 7670a4801f..3f652530a2 100644 --- a/substrate/wasm-runtime/polkadot/src/support/environment.rs +++ b/substrate/wasm-runtime/polkadot/src/support/environment.rs @@ -30,8 +30,6 @@ pub struct Environment { pub block_number: BlockNumber, /// The current block digest. pub digest: Digest, - /// The number of log items in this block that have been accounted for so far. - pub next_log_index: usize, } /// Do something with the environment and return its value. Keep the function short. diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm index e422068474f03a8d8b572bc08de121267e5ad904..c1b383b49ecabb9b591677c90db2cd2d68d63a4f 100644 GIT binary patch delta 18006 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 delta 16545 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