mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 23:21:06 +00:00
Integrate pallet_contracts gas with the weight system (#5712)
Co-Authored-By: Tomasz Drwięga <tomusdrw@users.noreply.github.com> Co-Authored-By: Sergei Pepyakin <sergei@parity.io>
This commit is contained in:
committed by
GitHub
parent
e731817e24
commit
000c924b62
@@ -17,7 +17,7 @@
|
||||
use super::{CodeHash, Config, ContractAddressFor, Event, RawEvent, Trait,
|
||||
TrieId, BalanceOf, ContractInfo};
|
||||
use crate::account_db::{AccountDb, DirectAccountDb, OverlayAccountDb};
|
||||
use crate::gas::{Gas, GasMeter, Token, approx_gas_for_balance};
|
||||
use crate::gas::{Gas, GasMeter, Token};
|
||||
use crate::rent;
|
||||
|
||||
use sp_std::prelude::*;
|
||||
@@ -203,6 +203,9 @@ pub trait Ext {
|
||||
///
|
||||
/// Returns `None` if the value doesn't exist.
|
||||
fn get_runtime_storage(&self, key: &[u8]) -> Option<Vec<u8>>;
|
||||
|
||||
/// Returns the price of one weight unit.
|
||||
fn get_weight_price(&self) -> BalanceOf<Self::T>;
|
||||
}
|
||||
|
||||
/// Loader is a companion of the `Vm` trait. It loads an appropriate abstract
|
||||
@@ -605,21 +608,19 @@ pub enum TransferFeeKind {
|
||||
|
||||
#[cfg_attr(test, derive(Debug, PartialEq, Eq))]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct TransferFeeToken<Balance> {
|
||||
pub struct TransferFeeToken {
|
||||
kind: TransferFeeKind,
|
||||
gas_price: Balance,
|
||||
}
|
||||
|
||||
impl<T: Trait> Token<T> for TransferFeeToken<BalanceOf<T>> {
|
||||
impl<T: Trait> Token<T> for TransferFeeToken {
|
||||
type Metadata = Config<T>;
|
||||
|
||||
#[inline]
|
||||
fn calculate_amount(&self, metadata: &Config<T>) -> Gas {
|
||||
let balance_fee = match self.kind {
|
||||
TransferFeeKind::ContractInstantiate => metadata.contract_account_instantiate_fee,
|
||||
TransferFeeKind::Transfer => return metadata.schedule.transfer_cost,
|
||||
};
|
||||
approx_gas_for_balance(self.gas_price, balance_fee)
|
||||
match self.kind {
|
||||
TransferFeeKind::ContractInstantiate => metadata.schedule.instantiate_cost,
|
||||
TransferFeeKind::Transfer => metadata.schedule.transfer_cost,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -668,7 +669,6 @@ fn transfer<'a, T: Trait, V: Vm<T>, L: Loader<T>>(
|
||||
};
|
||||
TransferFeeToken {
|
||||
kind,
|
||||
gas_price: gas_meter.gas_price(),
|
||||
}
|
||||
};
|
||||
|
||||
@@ -868,6 +868,13 @@ where
|
||||
fn get_runtime_storage(&self, key: &[u8]) -> Option<Vec<u8>> {
|
||||
unhashed::get_raw(&key)
|
||||
}
|
||||
|
||||
fn get_weight_price(&self) -> BalanceOf<Self::T> {
|
||||
use pallet_transaction_payment::Module as Payment;
|
||||
use sp_runtime::SaturatedConversion;
|
||||
let price = Payment::<T>::weight_to_fee_with_adjustment::<u128>(1);
|
||||
price.saturated_into()
|
||||
}
|
||||
}
|
||||
|
||||
/// These tests exercise the executive layer.
|
||||
@@ -889,6 +896,7 @@ mod tests {
|
||||
use crate::{
|
||||
account_db::AccountDb, gas::GasMeter, tests::{ExtBuilder, Test},
|
||||
exec::{ExecReturnValue, ExecError, STATUS_SUCCESS}, CodeHash, Config,
|
||||
gas::Gas,
|
||||
};
|
||||
use std::{cell::RefCell, rc::Rc, collections::HashMap, marker::PhantomData};
|
||||
use assert_matches::assert_matches;
|
||||
@@ -898,6 +906,8 @@ mod tests {
|
||||
const BOB: u64 = 2;
|
||||
const CHARLIE: u64 = 3;
|
||||
|
||||
const GAS_LIMIT: Gas = 10_000_000_000;
|
||||
|
||||
impl<'a, T, V, L> ExecutionContext<'a, T, V, L>
|
||||
where T: crate::Trait
|
||||
{
|
||||
@@ -1003,7 +1013,7 @@ mod tests {
|
||||
#[test]
|
||||
fn it_works() {
|
||||
let value = Default::default();
|
||||
let mut gas_meter = GasMeter::<Test>::with_limit(10000, 1);
|
||||
let mut gas_meter = GasMeter::<Test>::new(GAS_LIMIT);
|
||||
let data = vec![];
|
||||
|
||||
let vm = MockVm::new();
|
||||
@@ -1044,7 +1054,7 @@ mod tests {
|
||||
ctx.overlay.set_balance(&origin, 100);
|
||||
ctx.overlay.set_balance(&dest, 0);
|
||||
|
||||
let mut gas_meter = GasMeter::<Test>::with_limit(1000, 1);
|
||||
let mut gas_meter = GasMeter::<Test>::new(GAS_LIMIT);
|
||||
|
||||
let result = ctx.call(dest, 0, &mut gas_meter, vec![]);
|
||||
assert_matches!(result, Ok(_));
|
||||
@@ -1064,7 +1074,7 @@ mod tests {
|
||||
|
||||
ctx.overlay.set_balance(&origin, 100);
|
||||
|
||||
let mut gas_meter = GasMeter::<Test>::with_limit(1000, 1);
|
||||
let mut gas_meter = GasMeter::<Test>::new(GAS_LIMIT);
|
||||
|
||||
let result = ctx.instantiate(1, &mut gas_meter, &code, vec![]);
|
||||
assert_matches!(result, Ok(_));
|
||||
@@ -1093,7 +1103,7 @@ mod tests {
|
||||
let output = ctx.call(
|
||||
dest,
|
||||
55,
|
||||
&mut GasMeter::<Test>::with_limit(1000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
vec![],
|
||||
).unwrap();
|
||||
|
||||
@@ -1126,7 +1136,7 @@ mod tests {
|
||||
let output = ctx.call(
|
||||
dest,
|
||||
55,
|
||||
&mut GasMeter::<Test>::with_limit(1000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
vec![],
|
||||
).unwrap();
|
||||
|
||||
@@ -1152,7 +1162,7 @@ mod tests {
|
||||
ctx.overlay.set_balance(&origin, 100);
|
||||
ctx.overlay.set_balance(&dest, 0);
|
||||
|
||||
let mut gas_meter = GasMeter::<Test>::with_limit(1000, 1);
|
||||
let mut gas_meter = GasMeter::<Test>::new(GAS_LIMIT);
|
||||
|
||||
let result = ctx.call(dest, 50, &mut gas_meter, vec![]);
|
||||
assert_matches!(result, Ok(_));
|
||||
@@ -1163,7 +1173,6 @@ mod tests {
|
||||
ExecFeeToken::Call,
|
||||
TransferFeeToken {
|
||||
kind: TransferFeeKind::Transfer,
|
||||
gas_price: 1u64
|
||||
},
|
||||
);
|
||||
});
|
||||
@@ -1178,7 +1187,7 @@ mod tests {
|
||||
ctx.overlay.set_balance(&origin, 100);
|
||||
ctx.overlay.set_balance(&dest, 15);
|
||||
|
||||
let mut gas_meter = GasMeter::<Test>::with_limit(1000, 1);
|
||||
let mut gas_meter = GasMeter::<Test>::new(GAS_LIMIT);
|
||||
|
||||
let result = ctx.call(dest, 50, &mut gas_meter, vec![]);
|
||||
assert_matches!(result, Ok(_));
|
||||
@@ -1189,7 +1198,6 @@ mod tests {
|
||||
ExecFeeToken::Call,
|
||||
TransferFeeToken {
|
||||
kind: TransferFeeKind::Transfer,
|
||||
gas_price: 1u64
|
||||
},
|
||||
);
|
||||
});
|
||||
@@ -1207,7 +1215,7 @@ mod tests {
|
||||
ctx.overlay.set_balance(&origin, 100);
|
||||
ctx.overlay.set_balance(&dest, 15);
|
||||
|
||||
let mut gas_meter = GasMeter::<Test>::with_limit(1000, 1);
|
||||
let mut gas_meter = GasMeter::<Test>::new(GAS_LIMIT);
|
||||
|
||||
let result = ctx.instantiate(50, &mut gas_meter, &code, vec![]);
|
||||
assert_matches!(result, Ok(_));
|
||||
@@ -1218,7 +1226,6 @@ mod tests {
|
||||
ExecFeeToken::Instantiate,
|
||||
TransferFeeToken {
|
||||
kind: TransferFeeKind::ContractInstantiate,
|
||||
gas_price: 1u64
|
||||
},
|
||||
);
|
||||
});
|
||||
@@ -1242,7 +1249,7 @@ mod tests {
|
||||
let result = ctx.call(
|
||||
dest,
|
||||
100,
|
||||
&mut GasMeter::<Test>::with_limit(1000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
vec![],
|
||||
);
|
||||
|
||||
@@ -1279,7 +1286,7 @@ mod tests {
|
||||
let result = ctx.call(
|
||||
dest,
|
||||
0,
|
||||
&mut GasMeter::<Test>::with_limit(1000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
vec![],
|
||||
);
|
||||
|
||||
@@ -1310,7 +1317,7 @@ mod tests {
|
||||
let result = ctx.call(
|
||||
dest,
|
||||
0,
|
||||
&mut GasMeter::<Test>::with_limit(1000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
vec![],
|
||||
);
|
||||
|
||||
@@ -1338,7 +1345,7 @@ mod tests {
|
||||
let result = ctx.call(
|
||||
BOB,
|
||||
0,
|
||||
&mut GasMeter::<Test>::with_limit(10000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
vec![1, 2, 3, 4],
|
||||
);
|
||||
assert_matches!(result, Ok(_));
|
||||
@@ -1363,7 +1370,7 @@ mod tests {
|
||||
|
||||
let result = ctx.instantiate(
|
||||
1,
|
||||
&mut GasMeter::<Test>::with_limit(10000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
&input_data_ch,
|
||||
vec![1, 2, 3, 4],
|
||||
);
|
||||
@@ -1413,7 +1420,7 @@ mod tests {
|
||||
let result = ctx.call(
|
||||
BOB,
|
||||
value,
|
||||
&mut GasMeter::<Test>::with_limit(100000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
vec![],
|
||||
);
|
||||
|
||||
@@ -1459,7 +1466,7 @@ mod tests {
|
||||
let result = ctx.call(
|
||||
dest,
|
||||
0,
|
||||
&mut GasMeter::<Test>::with_limit(10000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
vec![],
|
||||
);
|
||||
|
||||
@@ -1500,7 +1507,7 @@ mod tests {
|
||||
let result = ctx.call(
|
||||
BOB,
|
||||
0,
|
||||
&mut GasMeter::<Test>::with_limit(10000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
vec![],
|
||||
);
|
||||
|
||||
@@ -1522,7 +1529,7 @@ mod tests {
|
||||
assert_matches!(
|
||||
ctx.instantiate(
|
||||
0, // <- zero endowment
|
||||
&mut GasMeter::<Test>::with_limit(10000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
&dummy_ch,
|
||||
vec![],
|
||||
),
|
||||
@@ -1548,7 +1555,7 @@ mod tests {
|
||||
let instantiated_contract_address = assert_matches!(
|
||||
ctx.instantiate(
|
||||
100,
|
||||
&mut GasMeter::<Test>::with_limit(10000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
&dummy_ch,
|
||||
vec![],
|
||||
),
|
||||
@@ -1588,7 +1595,7 @@ mod tests {
|
||||
let instantiated_contract_address = assert_matches!(
|
||||
ctx.instantiate(
|
||||
100,
|
||||
&mut GasMeter::<Test>::with_limit(10000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
&dummy_ch,
|
||||
vec![],
|
||||
),
|
||||
@@ -1633,7 +1640,7 @@ mod tests {
|
||||
ctx.overlay.instantiate_contract(&BOB, instantiator_ch).unwrap();
|
||||
|
||||
assert_matches!(
|
||||
ctx.call(BOB, 20, &mut GasMeter::<Test>::with_limit(1000, 1), vec![]),
|
||||
ctx.call(BOB, 20, &mut GasMeter::<Test>::new(GAS_LIMIT), vec![]),
|
||||
Ok(_)
|
||||
);
|
||||
|
||||
@@ -1693,7 +1700,7 @@ mod tests {
|
||||
ctx.overlay.instantiate_contract(&BOB, instantiator_ch).unwrap();
|
||||
|
||||
assert_matches!(
|
||||
ctx.call(BOB, 20, &mut GasMeter::<Test>::with_limit(1000, 1), vec![]),
|
||||
ctx.call(BOB, 20, &mut GasMeter::<Test>::new(GAS_LIMIT), vec![]),
|
||||
Ok(_)
|
||||
);
|
||||
|
||||
@@ -1730,7 +1737,7 @@ mod tests {
|
||||
assert_matches!(
|
||||
ctx.instantiate(
|
||||
100,
|
||||
&mut GasMeter::<Test>::with_limit(10000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
&terminate_ch,
|
||||
vec![],
|
||||
),
|
||||
@@ -1766,7 +1773,7 @@ mod tests {
|
||||
|
||||
let result = ctx.instantiate(
|
||||
1,
|
||||
&mut GasMeter::<Test>::with_limit(10000, 1),
|
||||
&mut GasMeter::<Test>::new(GAS_LIMIT),
|
||||
&rent_allowance_ch,
|
||||
vec![],
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user