From 990d368f0df943050916a437d23ef48f8beb6687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 14 Mar 2019 21:29:12 +0100 Subject: [PATCH] Prerequisites for `validate_block` in Cumulus (#1926) * Adds benchmark for direct/indirect wasm function calls * Store the benchmark function pointer in a `Cell` * Add some documentation * Make function implementations exchangeable * Add parachain stub * Add macro for registering the `validate_block` function * Make all functions replace-able by unimplemented * Some more refactoring * Adds tests for executing empty parachain block * Work on a new test with empty witness data * Don't exchange `ext_print_*` stuff * Some cleanup and one more function for `validate_block` * More tests and more functions * Fixes after merging master * Use `parity-codec` `derive` feature * CHange implementation of `wasm-nice-panic-message` * Move `parachain` stuff to cumulus * Updated wasm files * Integrate feedback * Switch to `ExchangeableFunction` struct * More fixes * Switch to Cell and panic on multiple replaces * Increase `impl_version` * Fix shifting * Make the API more verbose of `ExchangeableFunction` * Increase `impl_version` --- substrate/Cargo.lock | 35 +- substrate/core/executor/src/wasm_executor.rs | 100 ++++-- substrate/core/sr-api-macros/benches/bench.rs | 15 +- substrate/core/sr-io/Cargo.toml | 1 + substrate/core/sr-io/without_std.rs | 300 +++++++++++++++--- substrate/core/state-machine/src/lib.rs | 2 +- substrate/core/test-runtime/Cargo.toml | 2 + substrate/core/test-runtime/src/lib.rs | 44 ++- substrate/core/test-runtime/src/system.rs | 48 +-- substrate/core/test-runtime/wasm/Cargo.lock | 65 +++- .../substrate_test_runtime.compact.wasm | Bin 56878 -> 56647 bytes substrate/node/runtime/src/lib.rs | 2 +- substrate/node/runtime/wasm/Cargo.lock | 44 +-- .../release/node_runtime.compact.wasm | Bin 875322 -> 874401 bytes substrate/srml/executive/src/lib.rs | 85 +++-- substrate/srml/support/src/storage/mod.rs | 2 +- substrate/srml/system/src/lib.rs | 3 +- 17 files changed, 578 insertions(+), 170 deletions(-) diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 0da61066df..9eb942aae8 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -136,7 +136,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -194,7 +194,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "clang-sys 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -330,7 +330,7 @@ dependencies = [ [[package]] name = "cfg-if" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -453,7 +453,7 @@ name = "crossbeam" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -496,7 +496,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -510,7 +510,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -522,7 +522,7 @@ name = "crossbeam-utils" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -530,7 +530,7 @@ name = "crossbeam-utils" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1675,7 +1675,7 @@ name = "log" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1701,7 +1701,7 @@ name = "memchr" version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1838,7 +1838,7 @@ name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1850,7 +1850,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2095,7 +2095,7 @@ version = "0.10.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4176,7 +4176,7 @@ dependencies = [ name = "substrate-test-runtime" version = "0.1.0" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4186,6 +4186,7 @@ dependencies = [ "sr-primitives 0.1.0", "sr-std 0.1.0", "sr-version 0.1.0", + "srml-executive 0.1.0", "srml-support 0.1.0", "substrate-client 0.1.0", "substrate-consensus-aura-primitives 0.1.0", @@ -4282,7 +4283,7 @@ name = "sysinfo" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4312,7 +4313,7 @@ name = "tempfile" version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5034,7 +5035,7 @@ dependencies = [ "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427" "checksum cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "389803e36973d242e7fecb092b2de44a3d35ac62524b3b9339e51d577d668e02" "checksum cexpr 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "644d693ecfa91955ed32dcc7eda4914e1be97a641fb6f0645a37348e20b230da" -"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" +"checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clang-sys 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ef0c1bcf2e99c649104bd7a7012d8f8802684400e03db0ec0af48583c6fa0e4" "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" diff --git a/substrate/core/executor/src/wasm_executor.rs b/substrate/core/executor/src/wasm_executor.rs index 7e45982698..7e6833bb78 100644 --- a/substrate/core/executor/src/wasm_executor.rs +++ b/substrate/core/executor/src/wasm_executor.rs @@ -23,7 +23,7 @@ use secp256k1; use wasmi::{ Module, ModuleInstance, MemoryInstance, MemoryRef, TableRef, ImportsBuilder, ModuleRef, }; -use wasmi::RuntimeValue::{I32, I64}; +use wasmi::RuntimeValue::{I32, I64, self}; use wasmi::memory_units::{Pages}; use state_machine::Externalities; use crate::error::{Error, ErrorKind, Result}; @@ -393,10 +393,12 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, .map_err(|_| UserError("Invalid attempt to get parent_hash in ext_storage_changes_root"))?; parent_hash.as_mut().copy_from_slice(&raw_parent_hash[..]); let r = this.ext.storage_changes_root(parent_hash, parent_number); - if let Some(ref r) = r { + if let Some(r) = r { this.memory.set(result, &r[..]).map_err(|_| UserError("Invalid attempt to set memory in ext_storage_changes_root"))?; + Ok(1) + } else { + Ok(0) } - Ok(if r.is_some() { 1u32 } else { 0u32 }) }, ext_blake2_256_enumerated_trie_root(values_data: *const u8, lens_data: *const u32, lens_len: u32, result: *mut u8) => { let values = (0..lens_len) @@ -637,17 +639,19 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, /// /// Executes the provided code in a sandboxed wasm runtime. #[derive(Debug, Clone)] -pub struct WasmExecutor { -} +pub struct WasmExecutor; impl WasmExecutor { /// Create a new instance. pub fn new() -> Self { - WasmExecutor{} + WasmExecutor } /// Call a given method in the given code. + /// + /// Signature of this method needs to be `(I32, I32) -> I64`. + /// /// This should be used for tests only. pub fn call>( &self, @@ -656,12 +660,34 @@ impl WasmExecutor { code: &[u8], method: &str, data: &[u8], - ) -> Result> { + ) -> Result> { let module = ::wasmi::Module::from_buffer(code)?; let module = self.prepare_module(ext, heap_pages, &module)?; self.call_in_wasm_module(ext, &module, method, data) } + /// Call a given method with a custom signature in the given code. + /// + /// This should be used for tests only. + pub fn call_with_custom_signature< + E: Externalities, + F: FnOnce(&mut FnMut(&[u8]) -> Result) -> Result>, + FR: FnOnce(Option, &MemoryRef) -> Result>, + R, + >( + &self, + ext: &mut E, + heap_pages: usize, + code: &[u8], + method: &str, + create_parameters: F, + filter_result: FR, + ) -> Result { + let module = wasmi::Module::from_buffer(code)?; + let module = self.prepare_module(ext, heap_pages, &module)?; + self.call_in_wasm_module_with_custom_signature(ext, &module, method, create_parameters, filter_result) + } + fn get_mem_instance(module: &ModuleRef) -> Result { Ok(module .export_by_name("memory") @@ -679,6 +705,40 @@ impl WasmExecutor { method: &str, data: &[u8], ) -> Result> { + self.call_in_wasm_module_with_custom_signature( + ext, + module_instance, + method, + |alloc| { + let offset = alloc(data)?; + Ok(vec![I32(offset as i32), I32(data.len() as i32)]) + }, + |res, memory| { + if let Some(I64(r)) = res { + let offset = r as u32; + let length = (r as u64 >> 32) as usize; + memory.get(offset, length).map_err(|_| ErrorKind::Runtime.into()).map(Some) + } else { + Ok(None) + } + } + ) + } + + /// Call a given method in the given wasm-module runtime. + fn call_in_wasm_module_with_custom_signature< + E: Externalities, + F: FnOnce(&mut FnMut(&[u8]) -> Result) -> Result>, + FR: FnOnce(Option, &MemoryRef) -> Result>, + R, + >( + &self, + ext: &mut E, + module_instance: &ModuleRef, + method: &str, + create_parameters: F, + filter_result: FR, + ) -> Result { // extract a reference to a linear memory, optional reference to a table // and then initialize FunctionExecutor. let memory = Self::get_mem_instance(module_instance)?; @@ -689,26 +749,22 @@ impl WasmExecutor { let low = memory.lowest_used(); let used_mem = memory.used_size(); let mut fec = FunctionExecutor::new(memory.clone(), table, ext)?; - let size = data.len() as u32; - let offset = fec.heap.allocate(size).map_err(|_| ErrorKind::Runtime)?; - memory.set(offset, &data)?; + let parameters = create_parameters(&mut |data: &[u8]| { + let offset = fec.heap.allocate(data.len() as u32).map_err(|_| ErrorKind::Runtime)?; + memory.set(offset, &data)?; + Ok(offset) + })?; let result = module_instance.invoke_export( method, - &[ - I32(offset as i32), - I32(size as i32) - ], + ¶meters, &mut fec ); let result = match result { - Ok(Some(I64(r))) => { - let offset = r as u32; - let length = (r >> 32) as u32 as usize; - memory.get(offset, length) - .map_err(|_| ErrorKind::Runtime.into()) + Ok(val) => match filter_result(val, &memory)? { + Some(val) => Ok(val), + None => Err(ErrorKind::InvalidReturn.into()), }, - Ok(_) => Err(ErrorKind::InvalidReturn.into()), Err(e) => { trace!(target: "wasm-executor", "Failed to execute code with {} pages", memory.current_size().0); Err(e.into()) @@ -738,7 +794,7 @@ impl WasmExecutor { module, &ImportsBuilder::new() .with_resolver("env", FunctionExecutor::::resolver()) - )?; + )?; // extract a reference to a linear memory, optional reference to a table // and then initialize FunctionExecutor. @@ -759,7 +815,7 @@ impl WasmExecutor { #[cfg(test)] mod tests { use super::*; - + use parity_codec::Encode; use state_machine::TestExternalities; diff --git a/substrate/core/sr-api-macros/benches/bench.rs b/substrate/core/sr-api-macros/benches/bench.rs index 85ea3d6f88..f467721789 100644 --- a/substrate/core/sr-api-macros/benches/bench.rs +++ b/substrate/core/sr-api-macros/benches/bench.rs @@ -14,9 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use criterion::Criterion; +use criterion::{Criterion, criterion_group, criterion_main}; use test_client::runtime::TestAPI; use runtime_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; +use state_machine::ExecutionStrategy; fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("add one with same runtime api", |b| { @@ -50,6 +51,18 @@ fn sr_api_benchmark(c: &mut Criterion) { b.iter_with_large_drop(|| client.runtime_api().benchmark_vector_add_one(&block_id, &data)) }); + + c.bench_function("calling function by function pointer in wasm", |b| { + let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); + let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + b.iter(|| client.runtime_api().benchmark_indirect_call(&block_id).unwrap()) + }); + + c.bench_function("calling function in wasm", |b| { + let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); + let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + b.iter(|| client.runtime_api().benchmark_direct_call(&block_id).unwrap()) + }); } criterion_group!(benches, sr_api_benchmark); diff --git a/substrate/core/sr-io/Cargo.toml b/substrate/core/sr-io/Cargo.toml index 01907832f8..fa04c17e3f 100644 --- a/substrate/core/sr-io/Cargo.toml +++ b/substrate/core/sr-io/Cargo.toml @@ -35,3 +35,4 @@ std = [ ] nightly = [] strict = [] +wasm-nice-panic-message = [] \ No newline at end of file diff --git a/substrate/core/sr-io/without_std.rs b/substrate/core/sr-io/without_std.rs index 7763ddf04a..41dc530d56 100644 --- a/substrate/core/sr-io/without_std.rs +++ b/substrate/core/sr-io/without_std.rs @@ -20,19 +20,27 @@ pub use parity_codec as codec; pub use rstd; pub use rstd::{mem, slice}; -use core::intrinsics; -use rstd::vec::Vec; +use core::{intrinsics, panic::PanicInfo}; +use rstd::{vec::Vec, cell::Cell}; use hash_db::Hasher; use primitives::Blake2Hasher; #[panic_handler] #[no_mangle] -pub fn panic(info: &::core::panic::PanicInfo) -> ! { +pub fn panic(info: &PanicInfo) -> ! { unsafe { - if let Some(loc) = info.location() { - ext_print_utf8(loc.file().as_ptr() as *const u8, loc.file().len() as u32); - ext_print_num(loc.line() as u64); - ext_print_num(loc.column() as u64); + #[cfg(feature = "wasm-nice-panic-message")] + { + let message = rstd::alloc::format!("{}", info); + extern_functions_host_impl::ext_print_utf8(message.as_ptr() as *const u8, message.len() as u32); + } + #[cfg(not(feature = "wasm-nice-panic-message"))] + { + if let Some(loc) = info.location() { + extern_functions_host_impl::ext_print_utf8(loc.file().as_ptr() as *const u8, loc.file().len() as u32); + extern_functions_host_impl::ext_print_num(loc.line() as u64); + extern_functions_host_impl::ext_print_num(loc.column() as u64); + } } intrinsics::abort() } @@ -43,41 +51,223 @@ pub extern fn oom(_: ::core::alloc::Layout) -> ! { static OOM_MSG: &str = "Runtime memory exhausted. Aborting"; unsafe { - ext_print_utf8(OOM_MSG.as_ptr(), OOM_MSG.len() as u32); + extern_functions_host_impl::ext_print_utf8(OOM_MSG.as_ptr(), OOM_MSG.len() as u32); intrinsics::abort(); } } +/// The state of an exchangeable function. +#[derive(Clone, Copy)] +enum ExchangeableFunctionState { + Original, + Replaced, +} + +/// A function which implementation can be exchanged. +/// +/// Internally this works by swapping function pointers. +pub struct ExchangeableFunction(Cell<(T, ExchangeableFunctionState)>); + +impl ExchangeableFunction { + /// Create a new instance of `ExchangeableFunction`. + pub const fn new(impl_: T) -> Self { + Self(Cell::new((impl_, ExchangeableFunctionState::Original))) + } +} + +impl ExchangeableFunction { + /// Replace the implementation with `new_impl`. + /// + /// # Panics + /// + /// Panics when trying to replace an already replaced implementation. + /// + /// # Returns + /// + /// Returns the original implementation wrapped in [`RestoreImplementation`]. + pub fn replace_implementation(&'static self, new_impl: T) -> RestoreImplementation { + if let ExchangeableFunctionState::Replaced = self.0.get().1 { + panic!("Trying to replace an already replaced implementation!") + } + + let old = self.0.replace((new_impl, ExchangeableFunctionState::Replaced)); + + RestoreImplementation(self, Some(old.0)) + } + + /// Restore the original implementation. + fn restore_orig_implementation(&self, orig: T) { + self.0.set((orig, ExchangeableFunctionState::Original)); + } + + /// Returns the internal function pointer. + pub fn get(&self) -> T { + self.0.get().0 + } +} + +// WASM does not support threads, so this is safe; qed. +unsafe impl Sync for ExchangeableFunction {} + +/// Restores a function implementation on drop. +/// +/// Stores a static reference to the function object and the original implementation. +pub struct RestoreImplementation(&'static ExchangeableFunction, Option); + +impl Drop for RestoreImplementation { + fn drop(&mut self) { + self.0.restore_orig_implementation(self.1.take().expect("Value is only taken on drop; qed")); + } +} + +/// Declare extern functions +macro_rules! extern_functions { + ( + $( + $( #[$attr:meta] )* + fn $name:ident ( $( $arg:ident : $arg_ty:ty ),* ) $( -> $ret:ty )?; + )* + ) => { + $( + $( #[$attr] )* + #[allow(non_upper_case_globals)] + pub static $name: ExchangeableFunction $ret )?> = + ExchangeableFunction::new(extern_functions_host_impl::$name); + )* + + /// The exchangeable extern functions host implementations. + mod extern_functions_host_impl { + $( + pub unsafe fn $name ( $( $arg : $arg_ty ),* ) $( -> $ret )? { + implementation::$name ( $( $arg ),* ) + } + )* + + mod implementation { + extern "C" { + $( + pub fn $name ( $( $arg : $arg_ty ),* ) $( -> $ret )?; + )* + } + } + } + }; +} + /// Host functions, provided by the executor. /// A WebAssembly runtime module would "import" these to access the execution environment /// (most importantly, storage) or perform heavy hash calculations. /// See also "ext_" functions in sr-sandbox and sr-std -extern "C" { - /// Printing, useful for debugging +extern_functions! { + /// Host functions for printing, useful for debugging. fn ext_print_utf8(utf8_data: *const u8, utf8_len: u32); fn ext_print_hex(data: *const u8, len: u32); fn ext_print_num(value: u64); - /// Host storage access and verification + /// Set value for key in storage. fn ext_set_storage(key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); - fn ext_set_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); + /// Remove key and value from storage. fn ext_clear_storage(key_data: *const u8, key_len: u32); - fn ext_clear_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32); + /// Checks if the given key exists in the storage. + /// + /// # Returns + /// + /// - `1` if the value exists. + /// - `0` if the value does not exists. fn ext_exists_storage(key_data: *const u8, key_len: u32) -> u32; - fn ext_exists_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32) -> u32; + /// Remove storage entries which key starts with given prefix. fn ext_clear_prefix(prefix_data: *const u8, prefix_len: u32); - fn ext_kill_child_storage(storage_key_data: *const u8, storage_key_len: u32); - /// Host-side result allocation + /// Gets the value of the given key from storage. + /// + /// The host allocates the memory for storing the value. + /// + /// # Returns + /// + /// - `0` if no value exists to the given key. `written_out` is set to `u32::max_value()`. + /// + /// - Otherwise, pointer to the value in memory. `written_out` contains the length of the value. fn ext_get_allocated_storage(key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8; - /// Host-side result allocation - fn ext_get_allocated_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8; + /// Gets the value of the given key from storage. + /// + /// The value is written into `value` starting at `value_offset`. + /// + /// If the value length is greater than `value_len - value_offset`, the value is written partially. + /// + /// # Returns + /// + /// - `u32::max_value()` if the value does not exists. + /// + /// - Otherwise, the number of bytes written for value. fn ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32; - fn ext_get_child_storage_into(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32; + /// Gets the trie root of the storage. fn ext_storage_root(result: *mut u8); - /// Host-side result allocation - fn ext_child_storage_root(storage_key_data: *const u8, storage_key_len: u32, written_out: *mut u32) -> *mut u8; + /// Get the change trie root of the current storage overlay at a block with given parent. + /// + /// # Returns + /// + /// - `1` if the change trie root was found. + /// - `0` if the change trie root was not found. fn ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, parent_num: u64, result: *mut u8) -> u32; + /// A child storage function. + /// + /// See [`ext_set_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_set_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); + /// A child storage function. + /// + /// See [`ext_clear_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_clear_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32); + /// A child storage function. + /// + /// See [`ext_exists_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_exists_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32) -> u32; + /// A child storage function. + /// + /// See [`ext_kill_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_kill_child_storage(storage_key_data: *const u8, storage_key_len: u32); + /// A child storage function. + /// + /// See [`ext_get_allocated_storage`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_get_allocated_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32, + written_out: *mut u32 + ) -> *mut u8; + /// A child storage function. + /// + /// See [`ext_get_storage_into`] for details. + /// + /// A child storage is used e.g. by a contract. + fn ext_get_child_storage_into( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32, + value_data: *mut u8, + value_len: u32, + value_offset: u32 + ) -> u32; + /// Commits all changes and calculates the child-storage root. + /// + /// A child storage is used e.g. by a contract. + /// + /// # Returns + /// + /// - The pointer to the result vector and `written_out` contains its length. + fn ext_child_storage_root(storage_key_data: *const u8, storage_key_len: u32, written_out: *mut u32) -> *mut u8; + /// The current relay chain identifier. fn ext_chain_id() -> u64; @@ -107,7 +297,7 @@ impl ExternTrieCrypto for Blake2Hasher { let values = values.iter().fold(Vec::new(), |mut acc, sl| { acc.extend_from_slice(sl); acc }); let mut result: [u8; 32] = Default::default(); unsafe { - ext_blake2_256_enumerated_trie_root( + ext_blake2_256_enumerated_trie_root.get()( values.as_ptr(), lengths.as_ptr(), lengths.len() as u32, @@ -122,7 +312,7 @@ impl ExternTrieCrypto for Blake2Hasher { pub fn storage(key: &[u8]) -> Option> { let mut length: u32 = 0; unsafe { - let ptr = ext_get_allocated_storage(key.as_ptr(), key.len() as u32, &mut length); + let ptr = ext_get_allocated_storage.get()(key.as_ptr(), key.len() as u32, &mut length); if length == u32::max_value() { None } else { @@ -138,7 +328,13 @@ pub fn storage(key: &[u8]) -> Option> { pub fn child_storage(storage_key: &[u8], key: &[u8]) -> Option> { let mut length: u32 = 0; unsafe { - let ptr = ext_get_allocated_child_storage(storage_key.as_ptr(), storage_key.len() as u32, key.as_ptr(), key.len() as u32, &mut length); + let ptr = ext_get_allocated_child_storage.get()( + storage_key.as_ptr(), + storage_key.len() as u32, + key.as_ptr(), + key.len() as u32, + &mut length + ); if length == u32::max_value() { None } else { @@ -153,7 +349,7 @@ pub fn child_storage(storage_key: &[u8], key: &[u8]) -> Option> { /// Set the storage of some particular key to Some value. pub fn set_storage(key: &[u8], value: &[u8]) { unsafe { - ext_set_storage( + ext_set_storage.get()( key.as_ptr(), key.len() as u32, value.as_ptr(), value.len() as u32 ); @@ -163,7 +359,7 @@ pub fn set_storage(key: &[u8], value: &[u8]) { /// Set the child storage of some particular key to Some value. pub fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]) { unsafe { - ext_set_child_storage( + ext_set_child_storage.get()( storage_key.as_ptr(), key.len() as u32, key.as_ptr(), key.len() as u32, value.as_ptr(), value.len() as u32 @@ -174,7 +370,7 @@ pub fn set_child_storage(storage_key: &[u8], key: &[u8], value: &[u8]) { /// Clear the storage of some particular key. pub fn clear_storage(key: &[u8]) { unsafe { - ext_clear_storage( + ext_clear_storage.get()( key.as_ptr(), key.len() as u32 ); } @@ -183,7 +379,7 @@ pub fn clear_storage(key: &[u8]) { /// Clear the storage of some particular key. pub fn clear_child_storage(storage_key: &[u8], key: &[u8]) { unsafe { - ext_clear_child_storage( + ext_clear_child_storage.get()( storage_key.as_ptr(), storage_key.len() as u32, key.as_ptr(), key.len() as u32 ); @@ -193,7 +389,7 @@ pub fn clear_child_storage(storage_key: &[u8], key: &[u8]) { /// Determine whether a particular key exists in storage. pub fn exists_storage(key: &[u8]) -> bool { unsafe { - ext_exists_storage( + ext_exists_storage.get()( key.as_ptr(), key.len() as u32 ) != 0 } @@ -202,7 +398,7 @@ pub fn exists_storage(key: &[u8]) -> bool { /// Determine whether a particular key exists in storage. pub fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool { unsafe { - ext_exists_child_storage( + ext_exists_child_storage.get()( storage_key.as_ptr(), storage_key.len() as u32, key.as_ptr(), key.len() as u32 ) != 0 @@ -212,7 +408,7 @@ pub fn exists_child_storage(storage_key: &[u8], key: &[u8]) -> bool { /// Clear the storage entries key of which starts with the given prefix. pub fn clear_prefix(prefix: &[u8]) { unsafe { - ext_clear_prefix( + ext_clear_prefix.get()( prefix.as_ptr(), prefix.len() as u32 ); @@ -222,7 +418,7 @@ pub fn clear_prefix(prefix: &[u8]) { /// Clear an entire child storage. pub fn kill_child_storage(storage_key: &[u8]) { unsafe { - ext_kill_child_storage( + ext_kill_child_storage.get()( storage_key.as_ptr(), storage_key.len() as u32 ); @@ -233,10 +429,12 @@ pub fn kill_child_storage(storage_key: &[u8]) { /// the number of bytes that the key in storage was beyond the offset. pub fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { unsafe { - match ext_get_storage_into( - key.as_ptr(), key.len() as u32, - value_out.as_mut_ptr(), value_out.len() as u32, - value_offset as u32 + match ext_get_storage_into.get()( + key.as_ptr(), + key.len() as u32, + value_out.as_mut_ptr(), + value_out.len() as u32, + value_offset as u32, ) { none if none == u32::max_value() => None, length => Some(length as usize), @@ -248,7 +446,7 @@ pub fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> Op /// the number of bytes that the key in storage was beyond the offset. pub fn read_child_storage(storage_key: &[u8], key: &[u8], value_out: &mut [u8], value_offset: usize) -> Option { unsafe { - match ext_get_child_storage_into( + match ext_get_child_storage_into.get()( storage_key.as_ptr(), storage_key.len() as u32, key.as_ptr(), key.len() as u32, value_out.as_mut_ptr(), value_out.len() as u32, @@ -264,7 +462,7 @@ pub fn read_child_storage(storage_key: &[u8], key: &[u8], value_out: &mut [u8], pub fn storage_root() -> [u8; 32] { let mut result: [u8; 32] = Default::default(); unsafe { - ext_storage_root(result.as_mut_ptr()); + ext_storage_root.get()(result.as_mut_ptr()); } result } @@ -273,7 +471,7 @@ pub fn storage_root() -> [u8; 32] { pub fn child_storage_root(storage_key: &[u8]) -> Option> { let mut length: u32 = 0; unsafe { - let ptr = ext_child_storage_root(storage_key.as_ptr(), storage_key.len() as u32, &mut length); + let ptr = ext_child_storage_root.get()(storage_key.as_ptr(), storage_key.len() as u32, &mut length); if length == u32::max_value() { None } else { @@ -289,7 +487,7 @@ pub fn child_storage_root(storage_key: &[u8]) -> Option> { pub fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option<[u8; 32]> { let mut result: [u8; 32] = Default::default(); let is_set = unsafe { - ext_storage_changes_root(parent_hash.as_ptr(), parent_hash.len() as u32, parent_num, result.as_mut_ptr()) + ext_storage_changes_root.get()(parent_hash.as_ptr(), parent_hash.len() as u32, parent_num, result.as_mut_ptr()) }; if is_set != 0 { @@ -326,7 +524,7 @@ pub fn ordered_trie_root< /// The current relay chain identifier. pub fn chain_id() -> u64 { unsafe { - ext_chain_id() + ext_chain_id.get()() } } @@ -334,7 +532,7 @@ pub fn chain_id() -> u64 { pub fn blake2_256(data: &[u8]) -> [u8; 32] { let mut result: [u8; 32] = Default::default(); unsafe { - ext_blake2_256(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + ext_blake2_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); } result } @@ -343,7 +541,7 @@ pub fn blake2_256(data: &[u8]) -> [u8; 32] { pub fn keccak_256(data: &[u8]) -> [u8; 32] { let mut result: [u8; 32] = Default::default(); unsafe { - ext_keccak_256(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + ext_keccak_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); } result } @@ -352,7 +550,7 @@ pub fn keccak_256(data: &[u8]) -> [u8; 32] { pub fn twox_256(data: &[u8]) -> [u8; 32] { let mut result: [u8; 32] = Default::default(); unsafe { - ext_twox_256(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + ext_twox_256.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); } result } @@ -361,7 +559,7 @@ pub fn twox_256(data: &[u8]) -> [u8; 32] { pub fn twox_128(data: &[u8]) -> [u8; 16] { let mut result: [u8; 16] = Default::default(); unsafe { - ext_twox_128(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); + ext_twox_128.get()(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); } result } @@ -369,14 +567,14 @@ pub fn twox_128(data: &[u8]) -> [u8; 16] { /// Verify a ed25519 signature. pub fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { unsafe { - ext_ed25519_verify(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + ext_ed25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 } } /// Verify a sr25519 signature. pub fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { unsafe { - ext_sr25519_verify(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 + ext_sr25519_verify.get()(msg.as_ptr(), msg.len() as u32, sig.as_ptr(), pubkey.as_ref().as_ptr()) == 0 } } @@ -386,7 +584,7 @@ pub fn sr25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> pub fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { let mut pubkey = [0u8; 64]; match unsafe { - ext_secp256k1_ecdsa_recover(msg.as_ptr(), sig.as_ptr(), pubkey.as_mut_ptr()) + ext_secp256k1_ecdsa_recover.get()(msg.as_ptr(), sig.as_ptr(), pubkey.as_mut_ptr()) } { 0 => Ok(pubkey), 1 => Err(EcdsaVerifyError::BadRS), @@ -404,7 +602,7 @@ pub trait Printable { impl<'a> Printable for &'a [u8] { fn print(self) { unsafe { - ext_print_hex(self.as_ptr(), self.len() as u32); + ext_print_hex.get()(self.as_ptr(), self.len() as u32); } } } @@ -412,14 +610,14 @@ impl<'a> Printable for &'a [u8] { impl<'a> Printable for &'a str { fn print(self) { unsafe { - ext_print_utf8(self.as_ptr() as *const u8, self.len() as u32); + ext_print_utf8.get()(self.as_ptr() as *const u8, self.len() as u32); } } } impl Printable for u64 { fn print(self) { - unsafe { ext_print_num(self); } + unsafe { ext_print_num.get()(self); } } } diff --git a/substrate/core/state-machine/src/lib.rs b/substrate/core/state-machine/src/lib.rs index ede2bf40b0..135c1dfc6b 100644 --- a/substrate/core/state-machine/src/lib.rs +++ b/substrate/core/state-machine/src/lib.rs @@ -151,7 +151,7 @@ pub trait Externalities { /// Returns None if key provided is not a storage key. This can due to not being started with CHILD_STORAGE_KEY_PREFIX, or the trie implementation regards the key as invalid. fn child_storage_root(&mut self, storage_key: &[u8]) -> Option>; - /// Get the change trie root of the current storage overlay at a block wth given parent. + /// Get the change trie root of the current storage overlay at a block with given parent. fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option where H::Out: Ord; } diff --git a/substrate/core/test-runtime/Cargo.toml b/substrate/core/test-runtime/Cargo.toml index e4dda6a397..bddabbe928 100644 --- a/substrate/core/test-runtime/Cargo.toml +++ b/substrate/core/test-runtime/Cargo.toml @@ -20,6 +20,7 @@ runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } runtime_version = { package = "sr-version", path = "../sr-version", default-features = false } runtime_support = { package = "srml-support", path = "../../srml/support", default-features = false } +executive = { package = "srml-executive", path = "../../srml/executive", default-features = false } cfg-if = "0.1.6" [dev-dependencies] @@ -44,4 +45,5 @@ std = [ "runtime_primitives/std", "runtime_version/std", "consensus_aura/std", + "executive/std", ] diff --git a/substrate/core/test-runtime/src/lib.rs b/substrate/core/test-runtime/src/lib.rs index b345c06e6c..9c6f26e4a0 100644 --- a/substrate/core/test-runtime/src/lib.rs +++ b/substrate/core/test-runtime/src/lib.rs @@ -18,7 +18,8 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "std")] pub mod genesismap; +#[cfg(feature = "std")] +pub mod genesismap; pub mod system; use rstd::{prelude::*, marker::PhantomData}; @@ -77,6 +78,16 @@ pub struct Transfer { pub nonce: u64, } +impl Transfer { + /// Convert into a signed extrinsic. + #[cfg(feature = "std")] + pub fn into_signed_tx(self) -> Extrinsic { + let signature = keyring::AccountKeyring::from_public(&self.from) + .expect("Creates keyring from public key.").sign(&self.encode()).into(); + Extrinsic::Transfer(self, signature) + } +} + /// Extrinsic for test-runtime. #[derive(Clone, PartialEq, Eq, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug))] @@ -219,6 +230,8 @@ cfg_if! { fn function_signature_changed() -> u64; fn fail_on_native() -> u64; fn fail_on_wasm() -> u64; + fn benchmark_indirect_call() -> u64; + fn benchmark_direct_call() -> u64; } } } else { @@ -239,6 +252,8 @@ cfg_if! { fn function_signature_changed() -> Vec; fn fail_on_native() -> u64; fn fail_on_wasm() -> u64; + fn benchmark_indirect_call() -> u64; + fn benchmark_direct_call() -> u64; } } } @@ -254,6 +269,16 @@ impl GetRuntimeBlockType for Runtime { type RuntimeBlock = Block; } +/// Adds one to the given input and returns the final result. +#[inline(never)] +fn benchmark_add_one(i: u64) -> u64 { + i + 1 +} + +/// The `benchmark_add_one` function as function pointer. +#[cfg(not(feature = "std"))] +static BENCHMARK_ADD_ONE: runtime_io::ExchangeableFunction u64> = runtime_io::ExchangeableFunction::new(benchmark_add_one); + cfg_if! { if #[cfg(feature = "std")] { impl_runtime_apis! { @@ -340,6 +365,13 @@ cfg_if! { fn fail_on_wasm() -> u64 { 1 } + fn benchmark_indirect_call() -> u64 { + let function = benchmark_add_one; + (0..1000).fold(0, |p, i| p + function(i)) + } + fn benchmark_direct_call() -> u64 { + (0..1000).fold(0, |p, i| p + benchmark_add_one(i)) + } } impl consensus_aura::AuraApi for Runtime { @@ -435,6 +467,14 @@ cfg_if! { fn fail_on_wasm() -> u64 { panic!("Failing because we are on wasm") } + + fn benchmark_indirect_call() -> u64 { + (0..10000).fold(0, |p, i| p + BENCHMARK_ADD_ONE.get()(i)) + } + + fn benchmark_direct_call() -> u64 { + (0..10000).fold(0, |p, i| p + benchmark_add_one(i)) + } } impl consensus_aura::AuraApi for Runtime { @@ -442,4 +482,4 @@ cfg_if! { } } } -} +} \ No newline at end of file diff --git a/substrate/core/test-runtime/src/system.rs b/substrate/core/test-runtime/src/system.rs index f1e04473ec..a66eb58c1f 100644 --- a/substrate/core/test-runtime/src/system.rs +++ b/substrate/core/test-runtime/src/system.rs @@ -21,7 +21,7 @@ use rstd::prelude::*; use runtime_io::{storage_root, enumerated_trie_root, storage_changes_root, twox_128}; use runtime_support::storage::{self, StorageValue, StorageMap}; use runtime_support::storage_items; -use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Digest as DigestT}; +use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Digest as DigestT, NumberFor, Block as BlockT}; use runtime_primitives::generic; use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult, transaction_validity::TransactionValidity}; use parity_codec::{KeyedVec, Encode}; @@ -70,6 +70,15 @@ pub fn initialise_block(header: &Header) { storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32); } +fn execute_extrinsics_without_checks(extrinsics: Vec<::Extrinsic>) { + // execute transactions + extrinsics.into_iter().enumerate().for_each(|(i, e)| { + storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &(i as u32)); + execute_transaction_backend(&e).unwrap_or_else(|_| panic!("Invalid transaction")); + storage::unhashed::kill(well_known_keys::EXTRINSIC_INDEX); + }); +} + /// Actually execute all transitioning for `block`. pub fn polish_block(block: &mut Block) { let header = &mut block.header; @@ -111,12 +120,7 @@ pub fn execute_block(block: Block) { info_expect_equal_hash(&txs_root, &header.extrinsics_root); assert!(txs_root == header.extrinsics_root, "Transaction trie root must be valid."); - // execute transactions - block.extrinsics.iter().enumerate().for_each(|(i, e)| { - storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &(i as u32)); - execute_transaction_backend(e).unwrap_or_else(|_| panic!("Invalid transaction")); - storage::unhashed::kill(well_known_keys::EXTRINSIC_INDEX); - }); + execute_extrinsics_without_checks(block.extrinsics); // check storage root. let storage_root = storage_root().into(); @@ -134,6 +138,19 @@ pub fn execute_block(block: Block) { assert!(digest == header.digest, "Header digest items must match that calculated."); } +/// The block executor. +pub struct BlockExecutor; + +impl executive::ExecuteBlock for BlockExecutor { + fn execute_block(block: Block) { + execute_block(block); + } + + fn execute_extrinsics_without_checks(_: NumberFor, extrinsics: Vec<::Extrinsic>) { + execute_extrinsics_without_checks(extrinsics); + } +} + /// Execute a transaction outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { @@ -307,11 +324,6 @@ mod tests { ]) } - fn construct_signed_tx(tx: Transfer) -> Extrinsic { - let signature = AccountKeyring::from_public(&tx.from).unwrap().sign(&tx.encode()).into(); - Extrinsic::Transfer(tx, signature) - } - fn block_import_works(block_executor: F) where F: Fn(Block, &mut TestExternalities) { let h = Header { parent_hash: [69u8; 32].into(), @@ -356,12 +368,12 @@ mod tests { digest: Default::default(), }, extrinsics: vec![ - construct_signed_tx(Transfer { + Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Bob.into(), amount: 69, nonce: 0, - }) + }.into_signed_tx() ], }; @@ -377,18 +389,18 @@ mod tests { digest: Default::default(), }, extrinsics: vec![ - construct_signed_tx(Transfer { + Transfer { from: AccountKeyring::Bob.into(), to: AccountKeyring::Alice.into(), amount: 27, nonce: 0, - }), - construct_signed_tx(Transfer { + }.into_signed_tx(), + Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Charlie.into(), amount: 69, nonce: 1, - }), + }.into_signed_tx(), ], }; diff --git a/substrate/core/test-runtime/wasm/Cargo.lock b/substrate/core/test-runtime/wasm/Cargo.lock index a5b87b4436..0746e5aa81 100644 --- a/substrate/core/test-runtime/wasm/Cargo.lock +++ b/substrate/core/test-runtime/wasm/Cargo.lock @@ -61,7 +61,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bitmask" version = "0.5.0" -source = "git+https://github.com/paritytech/bitmask#c2d8d196e30b018d1385be8357fdca61b978facf" +source = "git+https://github.com/paritytech/bitmask#a84e147be602631617badd18b6b9af83391db4a9" [[package]] name = "blake2-rfc" @@ -378,7 +378,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -854,7 +854,7 @@ dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -903,7 +903,7 @@ dependencies = [ "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -960,7 +960,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1194,6 +1194,14 @@ name = "ryu" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "safe-mix" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "schnorrkel" version = "0.0.0" @@ -1241,7 +1249,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1353,7 +1361,7 @@ dependencies = [ "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1406,6 +1414,19 @@ dependencies = [ "sr-std 0.1.0", ] +[[package]] +name = "srml-executive" +version = "0.1.0" +dependencies = [ + "parity-codec 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 0.1.0", + "sr-primitives 0.1.0", + "sr-std 0.1.0", + "srml-support 0.1.0", + "srml-system 0.1.0", +] + [[package]] name = "srml-metadata" version = "0.1.0" @@ -1444,7 +1465,7 @@ dependencies = [ "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 0.1.0", "srml-support-procedural-tools 0.1.0", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1455,7 +1476,7 @@ dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", "srml-support-procedural-tools-derive 0.1.0", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1464,7 +1485,23 @@ version = "0.1.0" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "srml-system" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 0.1.0", + "sr-primitives 0.1.0", + "sr-std 0.1.0", + "srml-support 0.1.0", + "substrate-primitives 0.1.0", ] [[package]] @@ -1677,6 +1714,7 @@ dependencies = [ "sr-primitives 0.1.0", "sr-std 0.1.0", "sr-version 0.1.0", + "srml-executive 0.1.0", "srml-support 0.1.0", "substrate-client 0.1.0", "substrate-consensus-aura-primitives 0.1.0", @@ -1715,7 +1753,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.27" +version = "0.15.29" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1730,7 +1768,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2262,6 +2300,7 @@ dependencies = [ "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" +"checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" @@ -2285,7 +2324,7 @@ dependencies = [ "checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" "checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)" = "525bd55255f03c816e5d7f615587bd13030c7103354fadb104993dcee6a788ec" +"checksum syn 0.15.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1825685f977249735d510a242a6727b46efe914bb67e38d30c071b1b72b1d5c2" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" diff --git a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index e844c0124e12a5d874d3edf7f94c0c946c56a7fb..bff5d3c6fc95aab2ddefa81474a9c6111817dc45 100644 GIT binary patch delta 11749 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 S!|9+QgeBVip*DZG^?w24Z01e? delta 11790 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≺W4i6ttIc^^HKsze74QzLxl2T$+Fc>~ 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≷I(f8tc09$w*<5Y&vxE{fNz}% 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

H1NUHd}%AZqV{Ur8Y;FcPaQ{frLNZ@t&MJ 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 bW*sHfc0o+ur4uowAGr{tWNnn94Ez58px`Qu diff --git a/substrate/srml/executive/src/lib.rs b/substrate/srml/executive/src/lib.rs index d00c2693ff..b6cc498f79 100644 --- a/substrate/srml/executive/src/lib.rs +++ b/substrate/srml/executive/src/lib.rs @@ -18,12 +18,13 @@ #![cfg_attr(not(feature = "std"), no_std)] - use rstd::prelude::*; use rstd::marker::PhantomData; use rstd::result; -use primitives::traits::{self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalise, - OnInitialise, Hash, As, Digest}; +use primitives::traits::{ + self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalise, + OnInitialise, Hash, As, Digest, NumberFor, Block as BlockT +}; use srml_support::{Dispatchable, traits::ChargeBytesFee}; use parity_codec::{Codec, Encode}; use system::extrinsics_root; @@ -47,18 +48,43 @@ mod internal { } } -pub struct Executive< - System, - Block, - Context, - Payment, - AllModules, ->(PhantomData<(System, Block, Context, Payment, AllModules)>); +/// Something that can be used to execute a block. +pub trait ExecuteBlock { + /// Actually execute all transitioning for `block`. + fn execute_block(block: Block); + /// Execute all extrinsics like when executing a `block`, but with dropping intial and final checks. + fn execute_extrinsics_without_checks(block_number: NumberFor, extrinsics: Vec); +} + +pub struct Executive( + PhantomData<(System, Block, Context, Payment, AllModules)> +); impl< - Context: Default, System: system::Trait, Block: traits::Block, + Context: Default, + Payment: ChargeBytesFee, + AllModules: OnInitialise + OnFinalise, +> ExecuteBlock for Executive where + Block::Extrinsic: Checkable + Codec, + >::Checked: Applyable, + <>::Checked as Applyable>::Call: Dispatchable, + <<>::Checked as Applyable>::Call as Dispatchable>::Origin: From> +{ + fn execute_block(block: Block) { + Self::execute_block(block); + } + + fn execute_extrinsics_without_checks(block_number: NumberFor, extrinsics: Vec) { + Self::execute_extrinsics_without_checks(block_number, extrinsics); + } +} + +impl< + System: system::Trait, + Block: traits::Block, + Context: Default, Payment: ChargeBytesFee, AllModules: OnInitialise + OnFinalise, > Executive where @@ -69,8 +95,12 @@ impl< { /// Start the execution of a particular block. pub fn initialise_block(header: &System::Header) { - >::initialise(header.number(), header.parent_hash(), header.extrinsics_root()); - >::on_initialise(*header.number()); + Self::initialise_block_impl(header.number(), header.parent_hash(), header.extrinsics_root()); + } + + fn initialise_block_impl(block_number: &System::BlockNumber, parent_hash: &System::Hash, extrinsics_root: &System::Hash) { + >::initialise(block_number, parent_hash, extrinsics_root); + >::on_initialise(*block_number); } fn initial_checks(block: &Block) { @@ -96,18 +126,35 @@ impl< // any initial checks Self::initial_checks(&block); - // execute transactions + // execute extrinsics let (header, extrinsics) = block.deconstruct(); - extrinsics.into_iter().for_each(Self::apply_extrinsic_no_note); - - // post-transactional book-keeping. - >::note_finished_extrinsics(); - >::on_finalise(*header.number()); + Self::execute_extrinsics_with_book_keeping(extrinsics, *header.number()); // any final checks Self::final_checks(&header); } + /// Execute all extrinsics like when executing a `block`, but with dropping intial and final checks. + pub fn execute_extrinsics_without_checks(block_number: NumberFor, extrinsics: Vec) { + // Make the api happy, but maybe we should not set them at all. + let parent_hash = ::Hashing::hash(b"parent_hash"); + let extrinsics_root = ::Hashing::hash(b"extrinsics_root"); + + Self::initialise_block_impl(&block_number, &parent_hash, &extrinsics_root); + + // execute extrinsics + Self::execute_extrinsics_with_book_keeping(extrinsics, block_number); + } + + /// Execute given extrinsics and take care of post-extrinsics book-keeping + fn execute_extrinsics_with_book_keeping(extrinsics: Vec, block_number: NumberFor) { + extrinsics.into_iter().for_each(Self::apply_extrinsic_no_note); + + // post-extrinsics book-keeping. + >::note_finished_extrinsics(); + >::on_finalise(block_number); + } + /// Finalise the block - it is up the caller to ensure that all header fields are valid /// except state-root. pub fn finalise_block() -> System::Header { diff --git a/substrate/srml/support/src/storage/mod.rs b/substrate/srml/support/src/storage/mod.rs index dec8b2fec8..fde0762877 100644 --- a/substrate/srml/support/src/storage/mod.rs +++ b/substrate/srml/support/src/storage/mod.rs @@ -38,7 +38,7 @@ impl<'a> Input for IncrementalInput<'a> { } } - /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. +/// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. pub fn get(key: &[u8]) -> Option { let key = twox_128(key); runtime_io::read_storage(&key[..], &mut [0; 0][..], 0).map(|_| { diff --git a/substrate/srml/system/src/lib.rs b/substrate/srml/system/src/lib.rs index 384c4fb462..c5397345a1 100644 --- a/substrate/srml/system/src/lib.rs +++ b/substrate/srml/system/src/lib.rs @@ -324,8 +324,7 @@ impl Module { // > stays to be inspected by the client. - ::new(number, extrinsics_root, storage_root, - parent_hash, digest) + ::new(number, extrinsics_root, storage_root, parent_hash, digest) } /// Deposits a log and ensures it matches the blocks log data.