Skip to content

Commit

Permalink
Benchmark set_code_hash, update weights
Browse files Browse the repository at this point in the history
  • Loading branch information
yarikbratashchuk committed Jan 11, 2022
1 parent fd8a31f commit 524031a
Show file tree
Hide file tree
Showing 4 changed files with 694 additions and 625 deletions.
40 changes: 40 additions & 0 deletions frame/contracts/src/benchmarking/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -808,6 +808,46 @@ benchmarks! {
let origin = RawOrigin::Signed(instance.caller.clone());
}: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![])

seal_set_code_hash {
let r in 0 .. API_BENCHMARK_BATCHES;
let code_hashes = (0..r * API_BENCHMARK_BATCH_SIZE)
.map(|i| {
let new_code = WasmModule::<T>::dummy_with_bytes(i);
Contracts::<T>::store_code_raw(new_code.code, whitelisted_caller())?;
Ok(new_code.hash)
})
.collect::<Result<Vec<_>, &'static str>>()?;
let code_hash_len = code_hashes.get(0).map(|x| x.encode().len()).unwrap_or(0);
let code_hashes_bytes = code_hashes.iter().flat_map(|x| x.encode()).collect::<Vec<_>>();
let code_hashes_len = code_hashes_bytes.len();

let code = WasmModule::<T>::from(ModuleDefinition {
memory: Some(ImportedMemory::max::<T>()),
imported_functions: vec![ImportedFunction {
module: "__unstable__",
name: "seal_set_code_hash",
params: vec![
ValueType::I32,
],
return_type: Some(ValueType::I32),
}],
data_segments: vec![
DataSegment {
offset: 0 as u32,
value: code_hashes_bytes,
},
],
call_body: Some(body::repeated_dyn(r * API_BENCHMARK_BATCH_SIZE, vec![
Counter(0 as u32, code_hash_len as u32), // code_hash_ptr
Regular(Instruction::Call(0)),
Regular(Instruction::Drop),
])),
.. Default::default()
});
let instance = Contract::<T>::new(code, vec![])?;
let origin = RawOrigin::Signed(instance.caller.clone());
}: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![])

seal_set_storage_per_kb {
let n in 0 .. T::Schedule::get().limits.payload_len / 1024;
let key = T::Hashing::hash_of(&1u32).as_ref().to_vec();
Expand Down
4 changes: 4 additions & 0 deletions frame/contracts/src/schedule.rs
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,9 @@ pub struct HostFnWeights<T: Config> {
/// Weight per byte of an item stored with `seal_set_storage`.
pub set_storage_per_byte: Weight,

/// Weight of calling `seal_set_code_hash`.
pub set_code_hash: Weight,

/// Weight of calling `seal_clear_storage`.
pub clear_storage: Weight,

Expand Down Expand Up @@ -587,6 +590,7 @@ impl<T: Config> Default for HostFnWeights<T> {
debug_message: cost_batched!(seal_debug_message),
set_storage: cost_batched!(seal_set_storage),
set_storage_per_byte: cost_byte_batched!(seal_set_storage_per_kb),
//set_code_hash: cost_batched!(seal_set_code_hash),
clear_storage: cost_batched!(seal_clear_storage),
contains_storage: cost_batched!(seal_contains_storage),
get_storage: cost_batched!(seal_get_storage),
Expand Down
6 changes: 6 additions & 0 deletions frame/contracts/src/wasm/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,9 @@ pub enum RuntimeCosts {
DebugMessage,
/// Weight of calling `seal_set_storage` for the given storage item size.
SetStorage(u32),
/// Weight of calling `seal_set_code_hash`
#[cfg(feature = "unstable-interface")]
SetCodeHash,
/// Weight of calling `seal_clear_storage`.
ClearStorage,
/// Weight of calling `seal_contains_storage`.
Expand Down Expand Up @@ -251,6 +254,8 @@ impl RuntimeCosts {
DebugMessage => s.debug_message,
SetStorage(len) =>
s.set_storage.saturating_add(s.set_storage_per_byte.saturating_mul(len.into())),
#[cfg(feature = "unstable-interface")]
SetCodeHash => s.set_code_hash,
ClearStorage => s.clear_storage,
#[cfg(feature = "unstable-interface")]
ContainsStorage => s.contains_storage,
Expand Down Expand Up @@ -1859,6 +1864,7 @@ define_env!(Env, <E: Ext>,
// - requested buffer is not within the bounds of the sandbox memory.
// - the buffer contents cannot be decoded as the required type.
[__unstable__] seal_set_code_hash(ctx, code_hash_ptr: u32) -> ReturnCode => {
ctx.charge_gas(RuntimeCosts::SetCodeHash)?;
let code_hash: CodeHash<<E as Ext>::T> = ctx.read_sandbox_memory_as(code_hash_ptr)?;
ctx.ext.set_code_hash(code_hash);
Ok(ReturnCode::Success)
Expand Down
Loading

0 comments on commit 524031a

Please sign in to comment.