diff --git a/demo/runtime/wasm/Cargo.toml b/demo/runtime/wasm/Cargo.toml index 436c482015cba..266b5e2d8175a 100644 --- a/demo/runtime/wasm/Cargo.toml +++ b/demo/runtime/wasm/Cargo.toml @@ -28,6 +28,7 @@ std = [ [profile.release] panic = "abort" +lto = true [workspace] members = [] diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index b94b5ddc9b64b..5cae06b23b4b1 100644 Binary files a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm and b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm differ diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm old mode 100644 new mode 100755 index 8ed27520fc72e..d1c274e15e414 Binary files a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm and b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm differ diff --git a/polkadot/runtime/wasm/Cargo.toml b/polkadot/runtime/wasm/Cargo.toml index 0e30ce9ee6857..dac9694b8b65a 100644 --- a/polkadot/runtime/wasm/Cargo.toml +++ b/polkadot/runtime/wasm/Cargo.toml @@ -29,6 +29,7 @@ std = [ [profile.release] panic = "abort" +lto = true [workspace] members = [] diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index 3b3fb8f78c34f..a752fb6e21971 100644 Binary files a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm and b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm differ diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm old mode 100644 new mode 100755 index cb08a3c72bf5e..2dd5cac8235c7 Binary files a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm and b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm differ diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index 4d525a5975387..d95951e76db83 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -35,10 +35,23 @@ struct Heap { } impl Heap { - fn new() -> Self { - Heap { - end: 262144, + fn new(memory: &MemoryInstance) -> Result { + const HEAP_SIZE_IN_PAGES: u32 = 8; + const PAGE_SIZE_IN_BYTES: u32 = 65536; + + let prev_page_count = memory.grow(HEAP_SIZE_IN_PAGES).map_err( + |_: ::parity_wasm::interpreter::Error| Error::from(ErrorKind::Runtime), + )?; + if prev_page_count == 0xFFFFFFFF { + // Wasm vm refuses to mount the specified amount of new pages. This + // could mean that wasm binary specifies memory limit and we are trying + // to allocate beyond that limit. + return Err(ErrorKind::Runtime.into()); } + let allocated_area_start = prev_page_count * PAGE_SIZE_IN_BYTES; + Ok(Heap { + end: allocated_area_start as u32, + }) } fn allocate(&mut self, size: u32) -> u32 { let r = self.end; @@ -57,13 +70,13 @@ struct FunctionExecutor<'e, E: Externalities + 'e> { } impl<'e, E: Externalities> FunctionExecutor<'e, E> { - fn new(m: &Arc, e: &'e mut E) -> Self { - FunctionExecutor { - heap: Heap::new(), + fn new(m: &Arc, e: &'e mut E) -> Result { + Ok(FunctionExecutor { + heap: Heap::new(&*m)?, memory: Arc::clone(m), ext: e, hash_lookup: HashMap::new(), - } + }) } } @@ -317,7 +330,7 @@ impl CodeExecutor for WasmExecutor { let module = program.add_module_by_sigs("test", module, map!["env" => FunctionExecutor::::SIGNATURES]).expect("runtime signatures always provided; qed"); let memory = module.memory(ItemIndex::Internal(0)).expect("all modules compiled with rustc include memory segments; qed"); - let mut fec = FunctionExecutor::new(&memory, ext); + let mut fec = FunctionExecutor::new(&memory, ext)?; let size = data.len() as u32; let offset = fec.heap.allocate(size); diff --git a/substrate/executor/wasm/Cargo.toml b/substrate/executor/wasm/Cargo.toml index d63e04d5fa673..89f27a61b957d 100644 --- a/substrate/executor/wasm/Cargo.toml +++ b/substrate/executor/wasm/Cargo.toml @@ -11,6 +11,7 @@ substrate-runtime-io = { path = "../../runtime-io", version = "0.1", default_fea [profile.release] panic = "abort" +lto = true [workspace] members = [] diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index cbc81694c0999..5be7858aaa131 100644 Binary files a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm and b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm differ diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm old mode 100644 new mode 100755 index ab23e9b4f7a2a..58ff23b9bd1fc Binary files a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm and b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm differ diff --git a/substrate/test-runtime/wasm/Cargo.toml b/substrate/test-runtime/wasm/Cargo.toml index 862d610a57c39..3d6a1de63ce41 100644 --- a/substrate/test-runtime/wasm/Cargo.toml +++ b/substrate/test-runtime/wasm/Cargo.toml @@ -31,6 +31,7 @@ crate-type = ["cdylib"] [profile.release] panic = "abort" +lto = true [workspace] members = [] diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 7c3dabf1880e0..997a70bdad4fa 100644 Binary files a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm and b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm differ diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm old mode 100644 new mode 100755 index 8ab4d6073ecb8..74df34491a094 Binary files a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm and b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm differ