From 9ffa683fe6d8f9fac263fda7bdab5808bb3d78f4 Mon Sep 17 00:00:00 2001 From: Guanqun Lu Date: Fri, 31 Aug 2018 07:12:31 +0800 Subject: [PATCH 1/8] move heap size on chain --- substrate/client/src/call_executor.rs | 5 ++++- substrate/executor/src/lib.rs | 1 + substrate/executor/src/native_executor.rs | 13 ++++++++----- substrate/executor/src/wasm_executor.rs | 8 +++++--- substrate/state-machine/src/lib.rs | 9 +++++++++ 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/substrate/client/src/call_executor.rs b/substrate/client/src/call_executor.rs index b7e092a05bf00..cd509b816c6aa 100644 --- a/substrate/client/src/call_executor.rs +++ b/substrate/client/src/call_executor.rs @@ -146,7 +146,10 @@ where let code = externalities.storage(b":code").ok_or(error::ErrorKind::VersionInvalid)? .to_vec(); - self.executor.runtime_version(&mut externalities, &code) + // TODO: +// let heap_pages = externalities.storage(b":heapsize").ok_or(); + let heap_pages = 8; + self.executor.runtime_version(&mut externalities, heap_pages, &code) .ok_or(error::ErrorKind::VersionInvalid.into()) } diff --git a/substrate/executor/src/lib.rs b/substrate/executor/src/lib.rs index f0605849d5fa1..2fc3b083a384c 100644 --- a/substrate/executor/src/lib.rs +++ b/substrate/executor/src/lib.rs @@ -87,6 +87,7 @@ pub trait RuntimeInfo { fn runtime_version> ( &self, ext: &mut E, + heap_pages: usize, code: &[u8] ) -> Option; } diff --git a/substrate/executor/src/native_executor.rs b/substrate/executor/src/native_executor.rs index 4da5d4e7d897d..286a2ac0fed2b 100644 --- a/substrate/executor/src/native_executor.rs +++ b/substrate/executor/src/native_executor.rs @@ -55,12 +55,13 @@ fn fetch_cached_runtime_version<'a, E: Externalities>( wasm_executor: &WasmExecutor, cache: &'a mut MutexGuard, ext: &mut E, + heap_pages: usize, code: &[u8] ) -> Result<(&'a WasmModule, &'a Option)> { let maybe_runtime_preproc = cache.entry(gen_cache_key(code)) .or_insert_with(|| match WasmModule::from_buffer(code) { Ok(module) => { - let version = wasm_executor.call_in_wasm_module(ext, &module, "version", &[]) + let version = wasm_executor.call_in_wasm_module(ext, heap_pages, &module, "version", &[]) .ok() .and_then(|v| RuntimeVersion::decode(&mut v.as_slice())); RuntimePreproc::ValidCode(module, version) @@ -149,9 +150,10 @@ impl RuntimeInfo for NativeExecutor { fn runtime_version>( &self, ext: &mut E, + heap_pages: usize, code: &[u8], ) -> Option { - fetch_cached_runtime_version(&self.fallback, &mut RUNTIMES_CACHE.lock(), ext, code).ok()?.1.clone() + fetch_cached_runtime_version(&self.fallback, &mut RUNTIMES_CACHE.lock(), ext, heap_pages, code).ok()?.1.clone() } } @@ -161,23 +163,24 @@ impl CodeExecutor for NativeExecutor>( &self, ext: &mut E, + heap_pages: usize, code: &[u8], method: &str, data: &[u8], use_native: bool, ) -> (Result>, bool) { let mut c = RUNTIMES_CACHE.lock(); - let (module, onchain_version) = match fetch_cached_runtime_version(&self.fallback, &mut c, ext, code) { + let (module, onchain_version) = match fetch_cached_runtime_version(&self.fallback, &mut c, ext, heap_pages, code) { Ok((module, onchain_version)) => (module, onchain_version), Err(_) => return (Err(ErrorKind::InvalidCode(code.into()).into()), false), }; match (use_native, onchain_version.as_ref().map_or(false, |v| v.can_call_with(&D::VERSION))) { (_, false) => { trace!(target: "executor", "Request for native execution failed (native: {}, chain: {})", D::VERSION, onchain_version.as_ref().map_or_else(||"".into(), |v| format!("{}", v))); - (self.fallback.call_in_wasm_module(ext, module, method, data), false) + (self.fallback.call_in_wasm_module(ext, heap_pages, module, method, data), false) } (false, _) => { - (self.fallback.call_in_wasm_module(ext, module, method, data), false) + (self.fallback.call_in_wasm_module(ext, heap_pages, module, method, data), false) } _ => { trace!(target: "executor", "Request for native execution succeeded (native: {}, chain: {})", D::VERSION, onchain_version.as_ref().map_or_else(||"".into(), |v| format!("{}", v))); diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index 2b222d3ac0ce8..99eb1ccb38887 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -525,18 +525,20 @@ impl WasmExecutor { pub fn call>( &self, ext: &mut E, + heap_pages: usize, code: &[u8], method: &str, data: &[u8], ) -> Result> { let module = ::wasmi::Module::from_buffer(code).expect("all modules compiled with rustc are valid wasm code; qed"); - self.call_in_wasm_module(ext, &module, method, data) + self.call_in_wasm_module(ext, heap_pages, &module, method, data) } /// Call a given method in the given wasm-module runtime. pub fn call_in_wasm_module>( &self, ext: &mut E, + heap_pages: usize, module: &Module, method: &str, data: &[u8], @@ -564,7 +566,7 @@ impl WasmExecutor { .export_by_name("__indirect_function_table") .and_then(|e| e.as_table().cloned()); - let mut fec = FunctionExecutor::new(memory.clone(), self.max_heap_pages, table, ext)?; + let mut fec = FunctionExecutor::new(memory.clone(), heap_pages, table, ext)?; // finish instantiation by running 'start' function (if any). let instance = intermediate_instance.run_start(&mut fec)?; @@ -585,7 +587,7 @@ impl WasmExecutor { let returned = match result { Ok(x) => x, Err(e) => { - trace!(target: "wasm-executor", "Failed to execute code with {} pages", self.max_heap_pages); + trace!(target: "wasm-executor", "Failed to execute code with {} pages", heap_pages); return Err(e.into()) }, }; diff --git a/substrate/state-machine/src/lib.rs b/substrate/state-machine/src/lib.rs index fac385061c0ed..c5f7d5911c46f 100644 --- a/substrate/state-machine/src/lib.rs +++ b/substrate/state-machine/src/lib.rs @@ -206,6 +206,7 @@ pub trait CodeExecutor: Sized + Send + Sync { fn call>( &self, ext: &mut E, + heap_pages: usize, code: &[u8], method: &str, data: &[u8], @@ -325,6 +326,12 @@ where .ok_or_else(|| Box::new(ExecutionError::CodeEntryDoesNotExist) as Box)? .to_vec(); + // TODO: +// let heap_pages = ext::Ext::new(overlay, backend).storage(b":heapsize") +// .ok_or_else(|| Box::new(ExecutionError::HeapsizeEntryDoesNotExist) as Box)? +// .to_vec(); + let heap_pages = 8; + let result = { let mut orig_prospective = overlay.prospective.clone(); @@ -334,6 +341,7 @@ where ( exec.call( &mut externalities, + heap_pages, &code, method, call_data, @@ -358,6 +366,7 @@ where ( exec.call( &mut externalities, + heap_pages, &code, method, call_data, From a459ded4ae860dbe2b99c75f2fd2ca26bac9e960 Mon Sep 17 00:00:00 2001 From: Guanqun Lu Date: Fri, 31 Aug 2018 17:31:31 +0800 Subject: [PATCH 2/8] fix the interface change --- demo/executor/src/lib.rs | 38 ++++++++++++------------- substrate/client/src/call_executor.rs | 5 ++-- substrate/executor/src/sandbox.rs | 10 +++---- substrate/executor/src/wasm_executor.rs | 30 +++++++++---------- substrate/state-machine/src/lib.rs | 1 + 5 files changed, 42 insertions(+), 42 deletions(-) diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 1eaf4125ded49..b8028909d3eed 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -114,9 +114,9 @@ mod tests { twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; - let r = executor().call(&mut t, BLOATY_CODE, "initialise_block", &vec![].and(&from_block_number(1u64)), true).0; + let r = executor().call(&mut t, 8, BLOATY_CODE, "initialise_block", &vec![].and(&from_block_number(1u64)), true).0; assert!(r.is_ok()); - let v = executor().call(&mut t, BLOATY_CODE, "apply_extrinsic", &vec![].and(&xt()), true).0.unwrap(); + let v = executor().call(&mut t, 8, BLOATY_CODE, "apply_extrinsic", &vec![].and(&xt()), true).0.unwrap(); let r = ApplyResult::decode(&mut &v[..]).unwrap(); assert_eq!(r, Err(ApplyError::CantPay)); } @@ -134,9 +134,9 @@ mod tests { twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; - let r = executor().call(&mut t, COMPACT_CODE, "initialise_block", &vec![].and(&from_block_number(1u64)), true).0; + let r = executor().call(&mut t, 8, COMPACT_CODE, "initialise_block", &vec![].and(&from_block_number(1u64)), true).0; assert!(r.is_ok()); - let v = executor().call(&mut t, COMPACT_CODE, "apply_extrinsic", &vec![].and(&xt()), true).0.unwrap(); + let v = executor().call(&mut t, 8, COMPACT_CODE, "apply_extrinsic", &vec![].and(&xt()), true).0.unwrap(); let r = ApplyResult::decode(&mut &v[..]).unwrap(); assert_eq!(r, Err(ApplyError::CantPay)); } @@ -154,9 +154,9 @@ mod tests { twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; - let r = executor().call(&mut t, COMPACT_CODE, "initialise_block", &vec![].and(&from_block_number(1u64)), true).0; + let r = executor().call(&mut t, 8, COMPACT_CODE, "initialise_block", &vec![].and(&from_block_number(1u64)), true).0; assert!(r.is_ok()); - let r = executor().call(&mut t, COMPACT_CODE, "apply_extrinsic", &vec![].and(&xt()), true).0; + let r = executor().call(&mut t, 8, COMPACT_CODE, "apply_extrinsic", &vec![].and(&xt()), true).0; assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { @@ -178,9 +178,9 @@ mod tests { twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; - let r = executor().call(&mut t, BLOATY_CODE, "initialise_block", &vec![].and(&from_block_number(1u64)), true).0; + let r = executor().call(&mut t, 8, BLOATY_CODE, "initialise_block", &vec![].and(&from_block_number(1u64)), true).0; assert!(r.is_ok()); - let r = executor().call(&mut t, BLOATY_CODE, "apply_extrinsic", &vec![].and(&xt()), true).0; + let r = executor().call(&mut t, 8, BLOATY_CODE, "apply_extrinsic", &vec![].and(&xt()), true).0; assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { @@ -312,7 +312,7 @@ mod tests { fn full_native_block_import_works() { let mut t = new_test_ext(); - executor().call(&mut t, COMPACT_CODE, "execute_block", &block1().0, true).0.unwrap(); + executor().call(&mut t, 8, COMPACT_CODE, "execute_block", &block1().0, true).0.unwrap(); runtime_io::with_externalities(&mut t, || { assert_eq!(Balances::total_balance(&alice()), 41); @@ -329,7 +329,7 @@ mod tests { ]); }); - executor().call(&mut t, COMPACT_CODE, "execute_block", &block2().0, true).0.unwrap(); + executor().call(&mut t, 8, COMPACT_CODE, "execute_block", &block2().0, true).0.unwrap(); runtime_io::with_externalities(&mut t, || { assert_eq!(Balances::total_balance(&alice()), 30); @@ -359,14 +359,14 @@ mod tests { fn full_wasm_block_import_works() { let mut t = new_test_ext(); - WasmExecutor::new(8).call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); + WasmExecutor::new(8).call(&mut t, 8, COMPACT_CODE, "execute_block", &block1().0).unwrap(); runtime_io::with_externalities(&mut t, || { assert_eq!(Balances::total_balance(&alice()), 41); assert_eq!(Balances::total_balance(&bob()), 69); }); - WasmExecutor::new(8).call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); + WasmExecutor::new(8).call(&mut t, 8, COMPACT_CODE, "execute_block", &block2().0).unwrap(); runtime_io::with_externalities(&mut t, || { assert_eq!(Balances::total_balance(&alice()), 30); @@ -378,7 +378,7 @@ mod tests { fn wasm_big_block_import_fails() { let mut t = new_test_ext(); - let r = WasmExecutor::new(8).call(&mut t, COMPACT_CODE, "execute_block", &block1big().0); + let r = WasmExecutor::new(8).call(&mut t, 8, COMPACT_CODE, "execute_block", &block1big().0); assert!(!r.is_ok()); } @@ -386,7 +386,7 @@ mod tests { fn native_big_block_import_succeeds() { let mut t = new_test_ext(); - let r = Executor::with_heap_pages(8).call(&mut t, COMPACT_CODE, "execute_block", &block1big().0, true).0; + let r = Executor::with_heap_pages(8).call(&mut t, 8, COMPACT_CODE, "execute_block", &block1big().0, true).0; assert!(r.is_ok()); } @@ -394,7 +394,7 @@ mod tests { fn native_big_block_import_fails_on_fallback() { let mut t = new_test_ext(); - let r = Executor::with_heap_pages(8).call(&mut t, COMPACT_CODE, "execute_block", &block1big().0, false).0; + let r = Executor::with_heap_pages(8).call(&mut t, 8, COMPACT_CODE, "execute_block", &block1big().0, false).0; assert!(!r.is_ok()); } @@ -412,9 +412,9 @@ mod tests { ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); - let r = WasmExecutor::new(8).call(&mut t, &foreign_code[..], "initialise_block", &vec![].and(&from_block_number(1u64))); + let r = WasmExecutor::new(8).call(&mut t, 8, &foreign_code[..], "initialise_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor::new(8).call(&mut t, &foreign_code[..], "apply_extrinsic", &vec![].and(&xt())).unwrap(); + let r = WasmExecutor::new(8).call(&mut t, 8, &foreign_code[..], "apply_extrinsic", &vec![].and(&xt())).unwrap(); let r = ApplyResult::decode(&mut &r[..]).unwrap(); assert_eq!(r, Err(ApplyError::CantPay)); } @@ -433,9 +433,9 @@ mod tests { ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm"); - let r = WasmExecutor::new(8).call(&mut t, &foreign_code[..], "initialise_block", &vec![].and(&from_block_number(1u64))); + let r = WasmExecutor::new(8).call(&mut t, 8, &foreign_code[..], "initialise_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor::new(8).call(&mut t, &foreign_code[..], "apply_extrinsic", &vec![].and(&xt())).unwrap(); + let r = WasmExecutor::new(8).call(&mut t, 8, &foreign_code[..], "apply_extrinsic", &vec![].and(&xt())).unwrap(); let r = ApplyResult::decode(&mut &r[..]).unwrap(); assert_eq!(r, Ok(ApplyOutcome::Success)); diff --git a/substrate/client/src/call_executor.rs b/substrate/client/src/call_executor.rs index cd509b816c6aa..03f465da01878 100644 --- a/substrate/client/src/call_executor.rs +++ b/substrate/client/src/call_executor.rs @@ -26,6 +26,7 @@ use patricia_trie::NodeCodec; use primitives::{KeccakHasher, RlpCodec}; use hashdb::Hasher; use rlp::Encodable; +use codec::Decode; use backend; use error; @@ -145,10 +146,8 @@ where let mut externalities = Ext::new(&mut overlay, &state); let code = externalities.storage(b":code").ok_or(error::ErrorKind::VersionInvalid)? .to_vec(); + let heap_pages = externalities.storage(b":heapsize").and_then(|v| usize::decode(&mut &v[..])).unwrap_or(8); - // TODO: -// let heap_pages = externalities.storage(b":heapsize").ok_or(); - let heap_pages = 8; self.executor.runtime_version(&mut externalities, heap_pages, &code) .ok_or(error::ErrorKind::VersionInvalid.into()) } diff --git a/substrate/executor/src/sandbox.rs b/substrate/executor/src/sandbox.rs index ac91f17433476..49c84d3679d45 100644 --- a/substrate/executor/src/sandbox.rs +++ b/substrate/executor/src/sandbox.rs @@ -554,7 +554,7 @@ mod tests { "#).unwrap(); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_sandbox", &code).unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_sandbox", &code).unwrap(), vec![1], ); } @@ -575,7 +575,7 @@ mod tests { "#).unwrap(); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_sandbox", &code).unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_sandbox", &code).unwrap(), vec![0], ); } @@ -613,7 +613,7 @@ mod tests { "#).unwrap(); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_sandbox", &code).unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_sandbox", &code).unwrap(), vec![1], ); } @@ -647,7 +647,7 @@ mod tests { "#).unwrap(); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_sandbox_args", &code).unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_sandbox_args", &code).unwrap(), vec![1], ); } @@ -669,7 +669,7 @@ mod tests { "#).unwrap(); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_sandbox_return_val", &code).unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_sandbox_return_val", &code).unwrap(), vec![1], ); } diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index 99eb1ccb38887..c16928d989448 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -538,7 +538,7 @@ impl WasmExecutor { pub fn call_in_wasm_module>( &self, ext: &mut E, - heap_pages: usize, + heap_pages: usize, module: &Module, method: &str, data: &[u8], @@ -622,7 +622,7 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let output = WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_empty_return", &[]).unwrap(); + let output = WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_empty_return", &[]).unwrap(); assert_eq!(output, vec![0u8; 0]); } @@ -631,10 +631,10 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let output = WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_panic", &[]); + let output = WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_panic", &[]); assert!(output.is_err()); - let output = WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_conditional_panic", &[2]); + let output = WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_conditional_panic", &[2]); assert!(output.is_err()); } @@ -644,7 +644,7 @@ mod tests { ext.set_storage(b"foo".to_vec(), b"bar".to_vec()); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let output = WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_data_in", b"Hello world").unwrap(); + let output = WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_data_in", b"Hello world").unwrap(); assert_eq!(output, b"all ok!".to_vec()); @@ -667,7 +667,7 @@ mod tests { let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); // This will clear all entries which prefix is "ab". - let output = WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_clear_prefix", b"ab").unwrap(); + let output = WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_clear_prefix", b"ab").unwrap(); assert_eq!(output, b"all ok!".to_vec()); @@ -684,11 +684,11 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_blake2_256", &[]).unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_blake2_256", &[]).unwrap(), blake2_256(&b""[..]).encode() ); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_blake2_256", b"Hello world!").unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_blake2_256", b"Hello world!").unwrap(), blake2_256(&b"Hello world!"[..]).encode() ); } @@ -698,11 +698,11 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_twox_256", &[]).unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_twox_256", &[]).unwrap(), hex!("99e9d85137db46ef4bbea33613baafd56f963c64b1f3685a4eb4abd67ff6203a") ); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_twox_256", b"Hello world!").unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_twox_256", b"Hello world!").unwrap(), hex!("b27dfd7f223f177f2a13647b533599af0c07f68bda23d96d059da2b451a35a74") ); } @@ -712,11 +712,11 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_twox_128", &[]).unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_twox_128", &[]).unwrap(), hex!("99e9d85137db46ef4bbea33613baafd5") ); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_twox_128", b"Hello world!").unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_twox_128", b"Hello world!").unwrap(), hex!("b27dfd7f223f177f2a13647b533599af") ); } @@ -732,7 +732,7 @@ mod tests { calldata.extend_from_slice(sig.as_ref()); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_ed25519_verify", &calldata).unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_ed25519_verify", &calldata).unwrap(), vec![1] ); @@ -742,7 +742,7 @@ mod tests { calldata.extend_from_slice(other_sig.as_ref()); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_ed25519_verify", &calldata).unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_ed25519_verify", &calldata).unwrap(), vec![0] ); } @@ -752,7 +752,7 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor::new(8).call(&mut ext, &test_code[..], "test_enumerated_trie_root", &[]).unwrap(), + WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_enumerated_trie_root", &[]).unwrap(), ordered_trie_root(vec![b"zero".to_vec(), b"one".to_vec(), b"two".to_vec()]).0.encode() ); } diff --git a/substrate/state-machine/src/lib.rs b/substrate/state-machine/src/lib.rs index c5f7d5911c46f..0cb6ec85d6db9 100644 --- a/substrate/state-machine/src/lib.rs +++ b/substrate/state-machine/src/lib.rs @@ -497,6 +497,7 @@ mod tests { fn call>( &self, ext: &mut E, + _heap_pages: usize, _code: &[u8], _method: &str, _data: &[u8], From ecb70864e7910b240e261936c4b3b14ab588394b Mon Sep 17 00:00:00 2001 From: Guanqun Lu Date: Fri, 31 Aug 2018 17:38:08 +0800 Subject: [PATCH 3/8] decode heap size --- Cargo.lock | 1 + substrate/state-machine/Cargo.toml | 1 + substrate/state-machine/src/lib.rs | 9 ++++----- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3e7386758f495..a33cd951311ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3002,6 +3002,7 @@ dependencies = [ "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie 0.2.1 (git+https://github.com/paritytech/parity-common)", "rlp 0.2.1 (git+https://github.com/paritytech/parity-common)", + "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "triehash 0.2.0 (git+https://github.com/paritytech/parity-common)", ] diff --git a/substrate/state-machine/Cargo.toml b/substrate/state-machine/Cargo.toml index 6e199f429b0be..a9e9dce8acc5b 100644 --- a/substrate/state-machine/Cargo.toml +++ b/substrate/state-machine/Cargo.toml @@ -12,6 +12,7 @@ parking_lot = "0.4" heapsize = "0.4" substrate-primitives = { path = "../primitives", version = "0.1.0" } +substrate-codec = { path = "../codec", default_features = false } hashdb = { git = "https://github.com/paritytech/parity-common" } memorydb = { git = "https://github.com/paritytech/parity-common" } diff --git a/substrate/state-machine/src/lib.rs b/substrate/state-machine/src/lib.rs index 0cb6ec85d6db9..83ae6c0d404f5 100644 --- a/substrate/state-machine/src/lib.rs +++ b/substrate/state-machine/src/lib.rs @@ -34,6 +34,7 @@ extern crate rlp; extern crate heapsize; #[cfg(test)] extern crate substrate_primitives as primitives; +extern crate substrate_codec as codec; use std::collections::HashMap; use std::fmt; @@ -41,6 +42,7 @@ use hashdb::Hasher; use patricia_trie::NodeCodec; use rlp::Encodable; use heapsize::HeapSizeOf; +use codec::Decode; pub mod backend; mod ext; @@ -326,11 +328,8 @@ where .ok_or_else(|| Box::new(ExecutionError::CodeEntryDoesNotExist) as Box)? .to_vec(); - // TODO: -// let heap_pages = ext::Ext::new(overlay, backend).storage(b":heapsize") -// .ok_or_else(|| Box::new(ExecutionError::HeapsizeEntryDoesNotExist) as Box)? -// .to_vec(); - let heap_pages = 8; + let heap_pages = ext::Ext::new(overlay, backend).storage(b":heapsize") + .and_then(|v| usize::decode(&mut &v[..])).unwrap_or(8); let result = { let mut orig_prospective = overlay.prospective.clone(); From a6f1cabdf378fb9204afd631bfa3ec0fd6a6098e Mon Sep 17 00:00:00 2001 From: Guanqun Lu Date: Sat, 1 Sep 2018 10:43:57 +0800 Subject: [PATCH 4/8] fix code comments --- demo/cli/src/lib.rs | 2 +- demo/executor/src/lib.rs | 20 ++++----- substrate/cli/src/cli.yml | 4 -- substrate/cli/src/lib.rs | 8 ---- substrate/client/src/call_executor.rs | 2 +- substrate/client/src/genesis.rs | 4 +- substrate/client/src/light/backend.rs | 2 +- substrate/client/src/light/call_executor.rs | 2 +- substrate/executor/src/lib.rs | 2 +- substrate/executor/src/native_executor.rs | 14 +++--- substrate/executor/src/sandbox.rs | 10 ++--- substrate/executor/src/wasm_executor.rs | 47 ++++++++------------- substrate/service/src/config.rs | 3 -- substrate/service/src/lib.rs | 4 +- substrate/state-machine/src/lib.rs | 2 +- substrate/test-client/src/client_ext.rs | 2 +- 16 files changed, 50 insertions(+), 78 deletions(-) diff --git a/demo/cli/src/lib.rs b/demo/cli/src/lib.rs index 4260f7d1cd0fe..3ab2701c8c079 100644 --- a/demo/cli/src/lib.rs +++ b/demo/cli/src/lib.rs @@ -155,7 +155,7 @@ pub fn run(args: I) -> error::Result<()> where init_logger(log_pattern); // Create client - let executor = NativeExecutor::with_heap_pages(8); + let executor = NativeExecutor::new(); let god_key = hex!["3d866ec8a9190c8343c2fc593d21d8a6d0c5c4763aaab2349de3a6111d64d124"]; let genesis_config = GenesisConfig { diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index b8028909d3eed..be80893f01cdf 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -98,7 +98,7 @@ mod tests { } fn executor() -> ::substrate_executor::NativeExecutor { - ::substrate_executor::NativeExecutor::with_heap_pages(8) + ::substrate_executor::NativeExecutor::new() } #[test] @@ -359,14 +359,14 @@ mod tests { fn full_wasm_block_import_works() { let mut t = new_test_ext(); - WasmExecutor::new(8).call(&mut t, 8, COMPACT_CODE, "execute_block", &block1().0).unwrap(); + WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "execute_block", &block1().0).unwrap(); runtime_io::with_externalities(&mut t, || { assert_eq!(Balances::total_balance(&alice()), 41); assert_eq!(Balances::total_balance(&bob()), 69); }); - WasmExecutor::new(8).call(&mut t, 8, COMPACT_CODE, "execute_block", &block2().0).unwrap(); + WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "execute_block", &block2().0).unwrap(); runtime_io::with_externalities(&mut t, || { assert_eq!(Balances::total_balance(&alice()), 30); @@ -378,7 +378,7 @@ mod tests { fn wasm_big_block_import_fails() { let mut t = new_test_ext(); - let r = WasmExecutor::new(8).call(&mut t, 8, COMPACT_CODE, "execute_block", &block1big().0); + let r = WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "execute_block", &block1big().0); assert!(!r.is_ok()); } @@ -386,7 +386,7 @@ mod tests { fn native_big_block_import_succeeds() { let mut t = new_test_ext(); - let r = Executor::with_heap_pages(8).call(&mut t, 8, COMPACT_CODE, "execute_block", &block1big().0, true).0; + let r = Executor::new().call(&mut t, 8, COMPACT_CODE, "execute_block", &block1big().0, true).0; assert!(r.is_ok()); } @@ -394,7 +394,7 @@ mod tests { fn native_big_block_import_fails_on_fallback() { let mut t = new_test_ext(); - let r = Executor::with_heap_pages(8).call(&mut t, 8, COMPACT_CODE, "execute_block", &block1big().0, false).0; + let r = Executor::new().call(&mut t, 8, COMPACT_CODE, "execute_block", &block1big().0, false).0; assert!(!r.is_ok()); } @@ -412,9 +412,9 @@ mod tests { ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); - let r = WasmExecutor::new(8).call(&mut t, 8, &foreign_code[..], "initialise_block", &vec![].and(&from_block_number(1u64))); + let r = WasmExecutor::new().call(&mut t, 8, &foreign_code[..], "initialise_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor::new(8).call(&mut t, 8, &foreign_code[..], "apply_extrinsic", &vec![].and(&xt())).unwrap(); + let r = WasmExecutor::new().call(&mut t, 8, &foreign_code[..], "apply_extrinsic", &vec![].and(&xt())).unwrap(); let r = ApplyResult::decode(&mut &r[..]).unwrap(); assert_eq!(r, Err(ApplyError::CantPay)); } @@ -433,9 +433,9 @@ mod tests { ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm"); - let r = WasmExecutor::new(8).call(&mut t, 8, &foreign_code[..], "initialise_block", &vec![].and(&from_block_number(1u64))); + let r = WasmExecutor::new().call(&mut t, 8, &foreign_code[..], "initialise_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor::new(8).call(&mut t, 8, &foreign_code[..], "apply_extrinsic", &vec![].and(&xt())).unwrap(); + let r = WasmExecutor::new().call(&mut t, 8, &foreign_code[..], "apply_extrinsic", &vec![].and(&xt())).unwrap(); let r = ApplyResult::decode(&mut &r[..]).unwrap(); assert_eq!(r, Ok(ApplyOutcome::Success)); diff --git a/substrate/cli/src/cli.yml b/substrate/cli/src/cli.yml index 03bbbf426f8dd..96c80e111c536 100644 --- a/substrate/cli/src/cli.yml +++ b/substrate/cli/src/cli.yml @@ -125,10 +125,6 @@ args: long: execution value_name: STRATEGY help: The means of execution used when calling into the runtime. Can be either wasm, native or both. - - max-heap-pages: - long: max-heap-pages - value_name: COUNT - help: The maximum number of 64KB pages to ever allocate for Wasm execution. Don't alter this unless you know what you're doing. subcommands: - build-spec: about: Build a spec.json file, outputing to stdout diff --git a/substrate/cli/src/lib.rs b/substrate/cli/src/lib.rs index 39f380096e466..6322bb22fe930 100644 --- a/substrate/cli/src/lib.rs +++ b/substrate/cli/src/lib.rs @@ -266,10 +266,6 @@ where service::Roles::FULL }; - if let Some(v) = matches.value_of("max-heap-pages") { - config.max_heap_pages = v.parse().map_err(|_| "Invalid --max-heap-pages argument")?; - } - if let Some(s) = matches.value_of("execution") { config.execution_strategy = match s { "both" => service::ExecutionStrategy::Both, @@ -398,10 +394,6 @@ fn import_blocks(matches: &clap::ArgMatches, spec: ChainSpec service::ExecutionStrategy::Both, diff --git a/substrate/client/src/call_executor.rs b/substrate/client/src/call_executor.rs index 03f465da01878..27ad1719d38e4 100644 --- a/substrate/client/src/call_executor.rs +++ b/substrate/client/src/call_executor.rs @@ -146,7 +146,7 @@ where let mut externalities = Ext::new(&mut overlay, &state); let code = externalities.storage(b":code").ok_or(error::ErrorKind::VersionInvalid)? .to_vec(); - let heap_pages = externalities.storage(b":heapsize").and_then(|v| usize::decode(&mut &v[..])).unwrap_or(8); + let heap_pages = externalities.storage(b":heapsize").and_then(|v| u64::decode(&mut &v[..])).unwrap_or(8) as usize; self.executor.runtime_version(&mut externalities, heap_pages, &code) .ok_or(error::ErrorKind::VersionInvalid.into()) diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index 88d99e88e4da9..bc5887eb38453 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -56,7 +56,7 @@ mod tests { native_executor_instance!(Executor, test_client::runtime::api::dispatch, test_client::runtime::VERSION, include_bytes!("../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm")); fn executor() -> ::executor::NativeExecutor { - NativeExecutionDispatch::with_heap_pages(8) + NativeExecutionDispatch::new() } fn construct_block(backend: &InMemory, number: BlockNumber, parent_hash: Hash, state_root: Hash, txs: Vec) -> (Vec, Hash) { @@ -194,7 +194,7 @@ mod tests { let _ = execute( &backend, &mut overlay, - &Executor::with_heap_pages(8), + &Executor::new(), "execute_block", &b1data, ExecutionStrategy::NativeWhenPossible, diff --git a/substrate/client/src/light/backend.rs b/substrate/client/src/light/backend.rs index 29943c9686280..569b5c1542f65 100644 --- a/substrate/client/src/light/backend.rs +++ b/substrate/client/src/light/backend.rs @@ -270,7 +270,7 @@ pub mod tests { let remote_read_proof = remote_client.read_proof(&remote_block_id, b":auth:len").unwrap(); // check remote read proof locally - let local_executor = test_client::LocalExecutor::with_heap_pages(8); + let local_executor = test_client::LocalExecutor::new(); let local_checker = new_fetch_checker::<_, KeccakHasher, RlpCodec>(local_executor); let request = RemoteReadRequest { block: remote_block_hash, diff --git a/substrate/client/src/light/call_executor.rs b/substrate/client/src/light/call_executor.rs index 68ccef105b68a..8d3cd98f9f84e 100644 --- a/substrate/client/src/light/call_executor.rs +++ b/substrate/client/src/light/call_executor.rs @@ -156,7 +156,7 @@ mod tests { let remote_execution_proof = remote_client.execution_proof(&remote_block_id, "authorities", &[]).unwrap().1; // check remote execution proof locally - let local_executor = test_client::LocalExecutor::with_heap_pages(8); + let local_executor = test_client::LocalExecutor::new(); check_execution_proof::<_, _, _, RlpCodec>(&local_executor, &RemoteCallRequest { block: test_client::runtime::Hash::default(), header: test_client::runtime::Header { diff --git a/substrate/executor/src/lib.rs b/substrate/executor/src/lib.rs index 2fc3b083a384c..57f48cd6ed063 100644 --- a/substrate/executor/src/lib.rs +++ b/substrate/executor/src/lib.rs @@ -87,7 +87,7 @@ pub trait RuntimeInfo { fn runtime_version> ( &self, ext: &mut E, - heap_pages: usize, + heap_pages: usize, code: &[u8] ) -> Option; } diff --git a/substrate/executor/src/native_executor.rs b/substrate/executor/src/native_executor.rs index 286a2ac0fed2b..d784c3bc19624 100644 --- a/substrate/executor/src/native_executor.rs +++ b/substrate/executor/src/native_executor.rs @@ -109,9 +109,9 @@ pub trait NativeExecutionDispatch: Send + Sync { /// Get native runtime version. const VERSION: RuntimeVersion; - /// Construct corresponding `NativeExecutor` with given `heap_pages`. - fn with_heap_pages(max_heap_pages: usize) -> NativeExecutor where Self: Sized { - NativeExecutor::with_heap_pages(max_heap_pages) + /// Construct corresponding `NativeExecutor` + fn new() -> NativeExecutor where Self: Sized { + NativeExecutor::new() } } @@ -127,10 +127,10 @@ pub struct NativeExecutor { impl NativeExecutor { /// Create new instance with specific number of pages for wasm fallback's heap. - pub fn with_heap_pages(max_heap_pages: usize) -> Self { + pub fn new() -> Self { NativeExecutor { _dummy: Default::default(), - fallback: WasmExecutor::new(max_heap_pages), + fallback: WasmExecutor::new(), } } } @@ -216,8 +216,8 @@ macro_rules! native_executor_instance { .ok_or_else(|| $crate::error::ErrorKind::MethodNotFound(method.to_owned()).into()) } - fn with_heap_pages(max_heap_pages: usize) -> $crate::NativeExecutor<$name> { - $crate::NativeExecutor::with_heap_pages(max_heap_pages) + fn new() -> $crate::NativeExecutor<$name> { + $crate::NativeExecutor::new() } } } diff --git a/substrate/executor/src/sandbox.rs b/substrate/executor/src/sandbox.rs index 49c84d3679d45..7bedde70dc367 100644 --- a/substrate/executor/src/sandbox.rs +++ b/substrate/executor/src/sandbox.rs @@ -554,7 +554,7 @@ mod tests { "#).unwrap(); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_sandbox", &code).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_sandbox", &code).unwrap(), vec![1], ); } @@ -575,7 +575,7 @@ mod tests { "#).unwrap(); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_sandbox", &code).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_sandbox", &code).unwrap(), vec![0], ); } @@ -613,7 +613,7 @@ mod tests { "#).unwrap(); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_sandbox", &code).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_sandbox", &code).unwrap(), vec![1], ); } @@ -647,7 +647,7 @@ mod tests { "#).unwrap(); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_sandbox_args", &code).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_sandbox_args", &code).unwrap(), vec![1], ); } @@ -669,7 +669,7 @@ mod tests { "#).unwrap(); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_sandbox_return_val", &code).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_sandbox_return_val", &code).unwrap(), vec![1], ); } diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index c16928d989448..9f40ce824398e 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -496,30 +496,17 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, /// Wasm rust executor for contracts. /// /// Executes the provided code in a sandboxed wasm runtime. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct WasmExecutor { - /// The max number of pages to allocate for the heap. - pub max_heap_pages: usize, -} - -impl Clone for WasmExecutor { - fn clone(&self) -> Self { - WasmExecutor { - max_heap_pages: self.max_heap_pages, - } - } } impl WasmExecutor { /// Create a new instance. - pub fn new(max_heap_pages: usize) -> Self { - WasmExecutor { - max_heap_pages, - } + pub fn new() -> Self { + WasmExecutor{} } - /// Call a given method in the given code. /// This should be used for tests only. pub fn call>( @@ -622,7 +609,7 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let output = WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_empty_return", &[]).unwrap(); + let output = WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_empty_return", &[]).unwrap(); assert_eq!(output, vec![0u8; 0]); } @@ -631,10 +618,10 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let output = WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_panic", &[]); + let output = WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_panic", &[]); assert!(output.is_err()); - let output = WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_conditional_panic", &[2]); + let output = WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_conditional_panic", &[2]); assert!(output.is_err()); } @@ -644,7 +631,7 @@ mod tests { ext.set_storage(b"foo".to_vec(), b"bar".to_vec()); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let output = WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_data_in", b"Hello world").unwrap(); + let output = WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_data_in", b"Hello world").unwrap(); assert_eq!(output, b"all ok!".to_vec()); @@ -667,7 +654,7 @@ mod tests { let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); // This will clear all entries which prefix is "ab". - let output = WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_clear_prefix", b"ab").unwrap(); + let output = WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_clear_prefix", b"ab").unwrap(); assert_eq!(output, b"all ok!".to_vec()); @@ -684,11 +671,11 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_blake2_256", &[]).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_blake2_256", &[]).unwrap(), blake2_256(&b""[..]).encode() ); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_blake2_256", b"Hello world!").unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_blake2_256", b"Hello world!").unwrap(), blake2_256(&b"Hello world!"[..]).encode() ); } @@ -698,11 +685,11 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_twox_256", &[]).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_twox_256", &[]).unwrap(), hex!("99e9d85137db46ef4bbea33613baafd56f963c64b1f3685a4eb4abd67ff6203a") ); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_twox_256", b"Hello world!").unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_twox_256", b"Hello world!").unwrap(), hex!("b27dfd7f223f177f2a13647b533599af0c07f68bda23d96d059da2b451a35a74") ); } @@ -712,11 +699,11 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_twox_128", &[]).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_twox_128", &[]).unwrap(), hex!("99e9d85137db46ef4bbea33613baafd5") ); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_twox_128", b"Hello world!").unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_twox_128", b"Hello world!").unwrap(), hex!("b27dfd7f223f177f2a13647b533599af") ); } @@ -732,7 +719,7 @@ mod tests { calldata.extend_from_slice(sig.as_ref()); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_ed25519_verify", &calldata).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_ed25519_verify", &calldata).unwrap(), vec![1] ); @@ -742,7 +729,7 @@ mod tests { calldata.extend_from_slice(other_sig.as_ref()); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_ed25519_verify", &calldata).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_ed25519_verify", &calldata).unwrap(), vec![0] ); } @@ -752,7 +739,7 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor::new(8).call(&mut ext, 8, &test_code[..], "test_enumerated_trie_root", &[]).unwrap(), + WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_enumerated_trie_root", &[]).unwrap(), ordered_trie_root(vec![b"zero".to_vec(), b"one".to_vec(), b"two".to_vec()]).0.encode() ); } diff --git a/substrate/service/src/config.rs b/substrate/service/src/config.rs index d6f0b074c0544..fd0db61f8dd9a 100644 --- a/substrate/service/src/config.rs +++ b/substrate/service/src/config.rs @@ -59,8 +59,6 @@ pub struct Configuration { pub name: String, /// Execution strategy. pub execution_strategy: ExecutionStrategy, - /// Maximum number of heap pages to allocate for Wasm execution. - pub max_heap_pages: usize, /// RPC over HTTP binding address. `None` if disabled. pub rpc_http: Option, /// RPC over Websockets binding address. `None` if disabled. @@ -88,7 +86,6 @@ impl Configuration { pub fn new_client(config: FactoryFullConfiguration) -> Result>>, error::Error> { - let executor = NativeExecutor::with_heap_pages(config.max_heap_pages); + let executor = NativeExecutor::new(); let (client, _) = components::FullComponents::::build_client( &config, executor, @@ -122,7 +122,7 @@ impl Service let (signal, exit) = ::exit_future::signal(); // Create client - let executor = NativeExecutor::with_heap_pages(config.max_heap_pages); + let executor = NativeExecutor::new(); let mut keystore = Keystore::open(config.keystore_path.as_str().into())?; for seed in &config.keys { diff --git a/substrate/state-machine/src/lib.rs b/substrate/state-machine/src/lib.rs index 83ae6c0d404f5..9b4bb5a5997d6 100644 --- a/substrate/state-machine/src/lib.rs +++ b/substrate/state-machine/src/lib.rs @@ -329,7 +329,7 @@ where .to_vec(); let heap_pages = ext::Ext::new(overlay, backend).storage(b":heapsize") - .and_then(|v| usize::decode(&mut &v[..])).unwrap_or(8); + .and_then(|v| u64::decode(&mut &v[..])).unwrap_or(8) as usize; let result = { let mut orig_prospective = overlay.prospective.clone(); diff --git a/substrate/test-client/src/client_ext.rs b/substrate/test-client/src/client_ext.rs index 10031f523f5e7..386df6915830e 100644 --- a/substrate/test-client/src/client_ext.rs +++ b/substrate/test-client/src/client_ext.rs @@ -39,7 +39,7 @@ pub trait TestClient { impl TestClient for Client { fn new_for_tests() -> Self { - client::new_in_mem(NativeExecutor::with_heap_pages(8), genesis_storage()).unwrap() + client::new_in_mem(NativeExecutor::new(), genesis_storage()).unwrap() } fn justify_and_import(&self, origin: client::BlockOrigin, block: runtime::Block) -> client::error::Result<()> { From 113dea56339c354b5fa035fdd6d592c592034885 Mon Sep 17 00:00:00 2001 From: Guanqun Lu Date: Sat, 1 Sep 2018 10:55:52 +0800 Subject: [PATCH 5/8] fix comment --- substrate/executor/src/native_executor.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/executor/src/native_executor.rs b/substrate/executor/src/native_executor.rs index d784c3bc19624..32cd44de973c8 100644 --- a/substrate/executor/src/native_executor.rs +++ b/substrate/executor/src/native_executor.rs @@ -126,7 +126,7 @@ pub struct NativeExecutor { } impl NativeExecutor { - /// Create new instance with specific number of pages for wasm fallback's heap. + /// Create new instance. pub fn new() -> Self { NativeExecutor { _dummy: Default::default(), From 2fcc4564ee03cfa843c05adb700f0821c26b4e83 Mon Sep 17 00:00:00 2001 From: Guanqun Lu Date: Sat, 1 Sep 2018 10:56:15 +0800 Subject: [PATCH 6/8] update Cargo.lock --- demo/runtime/wasm/Cargo.lock | 1 + substrate/test-runtime/wasm/Cargo.lock | 1 + 2 files changed, 2 insertions(+) diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index f5821a38635d3..69c9a94694d4f 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -903,6 +903,7 @@ dependencies = [ "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie 0.2.1 (git+https://github.com/paritytech/parity-common)", "rlp 0.2.1 (git+https://github.com/paritytech/parity-common)", + "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "triehash 0.2.0 (git+https://github.com/paritytech/parity-common)", ] diff --git a/substrate/test-runtime/wasm/Cargo.lock b/substrate/test-runtime/wasm/Cargo.lock index 131ca9af2a037..0e814ec21e092 100644 --- a/substrate/test-runtime/wasm/Cargo.lock +++ b/substrate/test-runtime/wasm/Cargo.lock @@ -661,6 +661,7 @@ dependencies = [ "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie 0.2.1 (git+https://github.com/paritytech/parity-common)", "rlp 0.2.1 (git+https://github.com/paritytech/parity-common)", + "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "triehash 0.2.0 (git+https://github.com/paritytech/parity-common)", ] From 16d6adb0dc56d9a517683a51b487b18e2b2f1b58 Mon Sep 17 00:00:00 2001 From: Guanqun Lu Date: Sat, 1 Sep 2018 11:51:24 +0800 Subject: [PATCH 7/8] rename to heappages --- substrate/client/src/call_executor.rs | 2 +- substrate/state-machine/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/substrate/client/src/call_executor.rs b/substrate/client/src/call_executor.rs index 27ad1719d38e4..ba1ba6ea79c46 100644 --- a/substrate/client/src/call_executor.rs +++ b/substrate/client/src/call_executor.rs @@ -146,7 +146,7 @@ where let mut externalities = Ext::new(&mut overlay, &state); let code = externalities.storage(b":code").ok_or(error::ErrorKind::VersionInvalid)? .to_vec(); - let heap_pages = externalities.storage(b":heapsize").and_then(|v| u64::decode(&mut &v[..])).unwrap_or(8) as usize; + let heap_pages = externalities.storage(b":heappages").and_then(|v| u64::decode(&mut &v[..])).unwrap_or(8) as usize; self.executor.runtime_version(&mut externalities, heap_pages, &code) .ok_or(error::ErrorKind::VersionInvalid.into()) diff --git a/substrate/state-machine/src/lib.rs b/substrate/state-machine/src/lib.rs index 9b4bb5a5997d6..4b4bc4fc4c687 100644 --- a/substrate/state-machine/src/lib.rs +++ b/substrate/state-machine/src/lib.rs @@ -328,7 +328,7 @@ where .ok_or_else(|| Box::new(ExecutionError::CodeEntryDoesNotExist) as Box)? .to_vec(); - let heap_pages = ext::Ext::new(overlay, backend).storage(b":heapsize") + let heap_pages = ext::Ext::new(overlay, backend).storage(b":heappages") .and_then(|v| u64::decode(&mut &v[..])).unwrap_or(8) as usize; let result = { From 976642a2a5e5e2e909fcd238725e05e47a316c08 Mon Sep 17 00:00:00 2001 From: Guanqun Lu Date: Sat, 1 Sep 2018 12:32:41 +0800 Subject: [PATCH 8/8] add one heap pages variable in runtime --- substrate/test-runtime/src/genesismap.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/substrate/test-runtime/src/genesismap.rs b/substrate/test-runtime/src/genesismap.rs index 2ded178c3fba1..fe5fd84acd014 100644 --- a/substrate/test-runtime/src/genesismap.rs +++ b/substrate/test-runtime/src/genesismap.rs @@ -43,6 +43,7 @@ impl GenesisConfig { .map(|(k, v)| (twox_128(&k[..])[..].to_vec(), v.to_vec())) .chain(vec![ (b":code"[..].into(), wasm_runtime), + (b":heappages"[..].into(), vec![].and(&(16 as u64))), (b":auth:len"[..].into(), vec![].and(&(self.authorities.len() as u32))), ].into_iter()) .chain(self.authorities.iter()