mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-16 23:41:02 +00:00
contracts: Fix double charge of gas for host functions (#3361)
This PR is fixing a bug in the sync mechanism between wasmi and pallet-contracts. This bug leads to essentially double charging all the gas that was used during the execution of the host function. When the `call` host function is used for recursion this will lead to a quadratic amount of gas consumption with regard to the nesting depth.We also took the chance to refactor the code in question and improve the rust docs. The bug was caused by not updating `GasMeter::executor_consumed` (previously `engine_consumed`) when leaving the host function. This lead to the value being stale (too low) when entering another host function. --------- Co-authored-by: PG Herveou <pgherveou@gmail.com>
This commit is contained in:
committed by
GitHub
parent
579ef32ddd
commit
f3a6b6dcea
@@ -0,0 +1,53 @@
|
||||
// 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.
|
||||
|
||||
//! This fixture calls itself as many times as passed as argument.
|
||||
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
use common::{input, output};
|
||||
use uapi::{HostFn, HostFnImpl as api};
|
||||
|
||||
#[no_mangle]
|
||||
#[polkavm_derive::polkavm_export]
|
||||
pub extern "C" fn deploy() {}
|
||||
|
||||
#[no_mangle]
|
||||
#[polkavm_derive::polkavm_export]
|
||||
pub extern "C" fn call() {
|
||||
input!(calls_left: u32, );
|
||||
|
||||
// own address
|
||||
output!(addr, [0u8; 32], api::address,);
|
||||
|
||||
if calls_left == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
api::call_v2(
|
||||
uapi::CallFlags::ALLOW_REENTRY,
|
||||
addr,
|
||||
0u64, // How much ref_time to devote for the execution. 0 = all.
|
||||
0u64, // How much deposit_limit to devote for the execution. 0 = all.
|
||||
None, // No deposit limit.
|
||||
&0u64.to_le_bytes(), // Value transferred to the contract.
|
||||
&(calls_left - 1).to_le_bytes(),
|
||||
None,
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
Reference in New Issue
Block a user