diff --git a/substrate/demo/runtime/wasm/Cargo.toml b/substrate/demo/runtime/wasm/Cargo.toml index 436c482015..266b5e2d81 100644 --- a/substrate/demo/runtime/wasm/Cargo.toml +++ b/substrate/demo/runtime/wasm/Cargo.toml @@ -28,6 +28,7 @@ std = [ [profile.release] panic = "abort" +lto = true [workspace] members = [] diff --git a/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index b94b5ddc9b..5cae06b23b 100644 Binary files a/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm and b/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm differ diff --git a/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm old mode 100644 new mode 100755 index 8ed27520fc..d1c274e15e Binary files a/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm and b/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm differ diff --git a/substrate/polkadot/runtime/wasm/Cargo.toml b/substrate/polkadot/runtime/wasm/Cargo.toml index 0e30ce9ee6..dac9694b8b 100644 --- a/substrate/polkadot/runtime/wasm/Cargo.toml +++ b/substrate/polkadot/runtime/wasm/Cargo.toml @@ -29,6 +29,7 @@ std = [ [profile.release] panic = "abort" +lto = true [workspace] members = [] diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index 3b3fb8f78c..a752fb6e21 100644 Binary files a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm and b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm differ diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm old mode 100644 new mode 100755 index cb08a3c72b..2dd5cac823 Binary files a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm and b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm differ diff --git a/substrate/substrate/executor/src/wasm_executor.rs b/substrate/substrate/executor/src/wasm_executor.rs index 4d525a5975..d95951e76d 100644 --- a/substrate/substrate/executor/src/wasm_executor.rs +++ b/substrate/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/substrate/executor/wasm/Cargo.toml b/substrate/substrate/executor/wasm/Cargo.toml index d63e04d5fa..89f27a61b9 100644 --- a/substrate/substrate/executor/wasm/Cargo.toml +++ b/substrate/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/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index cbc81694c0..5be7858aaa 100644 Binary files a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm and b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm differ diff --git a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm old mode 100644 new mode 100755 index ab23e9b4f7..58ff23b9bd Binary files a/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm and b/substrate/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm differ diff --git a/substrate/substrate/test-runtime/wasm/Cargo.toml b/substrate/substrate/test-runtime/wasm/Cargo.toml index 862d610a57..3d6a1de63c 100644 --- a/substrate/substrate/test-runtime/wasm/Cargo.toml +++ b/substrate/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/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 7c3dabf188..997a70bdad 100644 Binary files a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm and b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm differ diff --git a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm old mode 100644 new mode 100755 index 8ab4d6073e..74df34491a Binary files a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm and b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm differ