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:
Alexander Theißen
2020-04-24 10:48:13 +02:00
committed by GitHub
parent e731817e24
commit 000c924b62
20 changed files with 386 additions and 680 deletions
+43 -36
View File
@@ -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![],
);