mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 09:21:05 +00:00
fda86dd501
* upgrade to wasmi 0.29 * prepare cleanup * sync ref_time w engine from the stack frame * proc_macro: sync gas in host funcs save: compiles, only gas pushing left to macro WIP proc macro proc macro: done * clean benchmarks & schedule: w_base = w_i64const * scale gas values btw engine and gas meter * (re)instrumentation & code_cache removed * remove gas() host fn, continue clean-up save * address review comments * move from CodeStorage&PrefabWasmModule to PristineCode&WasmBlob * refactor: no reftime_limit&schedule passes, no CodeStorage * bugs fixing * fix tests: expected deposit amount * fix prepare::tests * update tests and fix bugs tests::run_out_of_gas_engine, need 2 more save: 2 bugs with gas syncs: 1 of 2 tests done gas_syncs_no_overcharge bug fixed, test passes! cleaned out debug prints second bug is not a bug disabled_chain_extension test fix (err msg) tests run_out_of_fuel_host, chain_extension pass all tests pass * update docs * bump wasmi 0.30.0 * benchmarks updated, tests pass * refactoring * s/OwnerInfo/CodeInfo/g; * migration: draft, compiles * migration: draft, runs * migration: draft, runs (fixing) * deposits repaid non pro rata * deposits repaid pro rata * better try-runtime output * even better try-runtime output * benchmark migration * fix merge leftover * add forgotten fixtures, fix docs * address review comments * ci fixes * cleanup * benchmarks::prepare to return DispatchError * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_contracts * store memory limits to CodeInfo * ci: roll back weights * ".git/.scripts/commands/bench-vm/bench-vm.sh" pallet dev pallet_contracts * drive-by: update Readme and pallet rustdoc * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_contracts * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_contracts * use wasmi 0.29 * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_contracts * use wasmi 0.30 again * query memory limits from wasmi * better migration types * ci: pull weights from master * refactoring * ".git/.scripts/commands/bench-vm/bench-vm.sh" pallet dev pallet_contracts * addressing review comments * refactor * address review comments * optimize migration * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_contracts * another review round comments addressed * ci fix one * clippy fix * ci fix two --------- Co-authored-by: command-bot <>
75 lines
2.4 KiB
Rust
75 lines
2.4 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
/// ! For instruction benchmarking we do not instantiate a full contract but merely the
|
|
/// ! sandbox to execute the Wasm code. This is because we do not need the full
|
|
/// ! environment that provides the seal interface as imported functions.
|
|
use super::{code::WasmModule, Config};
|
|
use crate::wasm::{AllowDeprecatedInterface, AllowUnstableInterface, Environment, WasmBlob};
|
|
use sp_core::Get;
|
|
use wasmi::{errors::LinkerError, Func, Linker, StackLimits, Store};
|
|
|
|
/// Minimal execution environment without any imported functions.
|
|
pub struct Sandbox {
|
|
entry_point: Func,
|
|
store: Store<()>,
|
|
}
|
|
|
|
impl Sandbox {
|
|
/// Invoke the `call` function of a contract code and panic on any execution error.
|
|
pub fn invoke(&mut self) {
|
|
self.entry_point.call(&mut self.store, &[], &mut []).unwrap();
|
|
}
|
|
}
|
|
|
|
impl<T: Config> From<&WasmModule<T>> for Sandbox {
|
|
/// Creates an instance from the supplied module.
|
|
/// Sets the execution engine fuel level to `u64::MAX`.
|
|
fn from(module: &WasmModule<T>) -> Self {
|
|
let (mut store, _memory, instance) = WasmBlob::<T>::instantiate::<EmptyEnv, _>(
|
|
&module.code,
|
|
(),
|
|
&<T>::Schedule::get(),
|
|
StackLimits::default(),
|
|
// We are testing with an empty environment anyways
|
|
AllowDeprecatedInterface::No,
|
|
)
|
|
.expect("Failed to create benchmarking Sandbox instance");
|
|
|
|
// Set fuel for wasmi execution.
|
|
store
|
|
.add_fuel(u64::MAX)
|
|
.expect("We've set up engine to fuel consuming mode; qed");
|
|
|
|
let entry_point = instance.get_export(&store, "call").unwrap().into_func().unwrap();
|
|
Self { entry_point, store }
|
|
}
|
|
}
|
|
|
|
struct EmptyEnv;
|
|
|
|
impl Environment<()> for EmptyEnv {
|
|
fn define(
|
|
_: &mut Store<()>,
|
|
_: &mut Linker<()>,
|
|
_: AllowUnstableInterface,
|
|
_: AllowDeprecatedInterface,
|
|
) -> Result<(), LinkerError> {
|
|
Ok(())
|
|
}
|
|
}
|