diff --git a/substrate/demo/runtime/wasm/Cargo.toml b/substrate/demo/runtime/wasm/Cargo.toml index 436c482015cba32e5d7c1d0303e7a47412b5dae7..266b5e2d8175a3eae39c7b9a4ddd2daff09e6e64 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 b94b5ddc9b64bf467dac7444f9050dcef50f92bd..5cae06b23b4b116d128c34f74799f667a2edcea2 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 8ed27520fc72e552939f7e72b49d004ac07a729d..d1c274e15e41401c9b6f412489689b713888b9ae 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 0e30ce9ee68570069d299cbb1d3559eb7d92e074..dac9694b8b65ab14b9c1f22e8d1ec7ab39eedf94 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 3b3fb8f78c34f3325307db47c3986ea9cca59203..a752fb6e219718c47f9bb6a40b636ddc8f7fb235 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 cb08a3c72bf5e04296d54ced6ad68b3184534674..2dd5cac8235c7f6c839e64afea12a2cbbfd97e8b 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 4d525a5975387dfd79285e5b8898e2a83a9988ab..d95951e76db83442775e9aea1f6ddc4e196a97d3 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<Self> { + 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<DummyUserError>| 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<MemoryInstance>, e: &'e mut E) -> Self { - FunctionExecutor { - heap: Heap::new(), + fn new(m: &Arc<MemoryInstance>, e: &'e mut E) -> Result<Self> { + 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::<E>::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 d63e04d5fa673595df2905dda8e182719cdec142..89f27a61b957d4670a204637acd3cb536abaaf5e 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 cbc81694c0999d1af58aaad064d227df8200e417..5be7858aaa1317913e799697cff9d2d4a4ebae24 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 ab23e9b4f7a2a110b637faa5c07e1bf18823a350..58ff23b9bd1fc234235c5b3cb024cf78f75a3c77 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 862d610a57c399f0c6bfe63476cc669c5006a790..3d6a1de63ce416fdb6d8d9ba5573366a55861091 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 7c3dabf1880e0073bf91f2edb05f842986644b07..997a70bdad4faa95d7b9a7096b4cf86a1b7c58d0 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 8ab4d6073ecb8587b8ce47693f4dc08a4d83fd64..74df34491a094a2b179810c1b14321c794a96182 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