use crate::types::Gas;
use serde::{Deserialize, Serialize};
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
#[derive(Clone, Debug, Hash, Serialize, Deserialize)]
pub struct VMConfig {
pub ext_costs: ExtCostsConfig,
pub grow_mem_cost: u32,
pub regular_op_cost: u32,
pub limit_config: VMLimitConfig,
}
#[derive(Debug, Serialize, Deserialize, Clone, Hash, PartialEq, Eq)]
pub struct VMLimitConfig {
pub max_gas_burnt: Gas,
pub max_gas_burnt_view: Gas,
pub max_stack_height: u32,
pub initial_memory_pages: u32,
pub max_memory_pages: u32,
pub registers_memory_limit: u64,
pub max_register_size: u64,
pub max_number_registers: u64,
pub max_number_logs: u64,
pub max_total_log_length: u64,
pub max_total_prepaid_gas: Gas,
pub max_actions_per_receipt: u64,
pub max_number_bytes_method_names: u64,
pub max_length_method_name: u64,
pub max_arguments_length: u64,
pub max_length_returned_data: u64,
pub max_contract_size: u64,
pub max_length_storage_key: u64,
pub max_length_storage_value: u64,
pub max_promises_per_function_call_action: u64,
pub max_number_input_data_dependencies: u64,
}
impl Default for VMConfig {
fn default() -> VMConfig {
VMConfig {
ext_costs: ExtCostsConfig::default(),
grow_mem_cost: 1,
regular_op_cost: 3856371,
limit_config: VMLimitConfig::default(),
}
}
}
impl VMConfig {
pub fn non_crypto_hash(&self) -> u64 {
let mut s = DefaultHasher::new();
self.hash(&mut s);
s.finish()
}
pub fn free() -> Self {
Self {
ext_costs: ExtCostsConfig::free(),
grow_mem_cost: 0,
regular_op_cost: 0,
limit_config: VMLimitConfig {
max_gas_burnt: std::u64::MAX,
max_gas_burnt_view: std::u64::MAX,
..Default::default()
},
}
}
}
impl Default for VMLimitConfig {
fn default() -> Self {
Self {
max_gas_burnt: 2 * 10u64.pow(14),
max_gas_burnt_view: 2 * 10u64.pow(14),
max_stack_height: 16 * 1024,
initial_memory_pages: 2u32.pow(10),
max_memory_pages: 2u32.pow(11),
registers_memory_limit: 2u64.pow(30),
max_register_size: 2u64.pow(20) * 100,
max_number_registers: 100,
max_number_logs: 100,
max_total_log_length: 16 * 1024,
max_total_prepaid_gas: 10 * 10u64.pow(15),
max_actions_per_receipt: 100,
max_number_bytes_method_names: 2000,
max_length_method_name: 256,
max_arguments_length: 4 * 2u64.pow(20),
max_length_returned_data: 4 * 2u64.pow(20),
max_contract_size: 4 * 2u64.pow(20),
max_length_storage_key: 4 * 2u64.pow(20),
max_length_storage_value: 4 * 2u64.pow(20),
max_promises_per_function_call_action: 1024,
max_number_input_data_dependencies: 128,
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone, Hash, PartialEq, Eq)]
pub struct ExtCostsConfig {
pub base: Gas,
pub read_memory_base: Gas,
pub read_memory_byte: Gas,
pub write_memory_base: Gas,
pub write_memory_byte: Gas,
pub read_register_base: Gas,
pub read_register_byte: Gas,
pub write_register_base: Gas,
pub write_register_byte: Gas,
pub utf8_decoding_base: Gas,
pub utf8_decoding_byte: Gas,
pub utf16_decoding_base: Gas,
pub utf16_decoding_byte: Gas,
pub sha256_base: Gas,
pub sha256_byte: Gas,
pub keccak256_base: Gas,
pub keccak256_byte: Gas,
pub keccak512_base: Gas,
pub keccak512_byte: Gas,
pub log_base: Gas,
pub log_byte: Gas,
pub storage_write_base: Gas,
pub storage_write_key_byte: Gas,
pub storage_write_value_byte: Gas,
pub storage_write_evicted_byte: Gas,
pub storage_read_base: Gas,
pub storage_read_key_byte: Gas,
pub storage_read_value_byte: Gas,
pub storage_remove_base: Gas,
pub storage_remove_key_byte: Gas,
pub storage_remove_ret_value_byte: Gas,
pub storage_has_key_base: Gas,
pub storage_has_key_byte: Gas,
pub storage_iter_create_prefix_base: Gas,
pub storage_iter_create_prefix_byte: Gas,
pub storage_iter_create_range_base: Gas,
pub storage_iter_create_from_byte: Gas,
pub storage_iter_create_to_byte: Gas,
pub storage_iter_next_base: Gas,
pub storage_iter_next_key_byte: Gas,
pub storage_iter_next_value_byte: Gas,
pub touching_trie_node: Gas,
pub promise_and_base: Gas,
pub promise_and_per_promise: Gas,
pub promise_return: Gas,
}
impl Default for ExtCostsConfig {
fn default() -> ExtCostsConfig {
ExtCostsConfig {
base: 126224222,
read_memory_base: 1629369577,
read_memory_byte: 123816,
write_memory_base: 76445225,
write_memory_byte: 809907,
read_register_base: 639340699,
read_register_byte: 63637,
write_register_base: 0,
write_register_byte: 0,
utf8_decoding_base: 0,
utf8_decoding_byte: 591904,
utf16_decoding_base: 0,
utf16_decoding_byte: 9095538,
sha256_base: 710092630,
sha256_byte: 5536829,
keccak256_base: 710092630,
keccak256_byte: 5536829,
keccak512_base: 710092630 * 2,
keccak512_byte: 5536829 * 2,
log_base: 0,
log_byte: 0,
storage_write_base: 21058769282,
storage_write_key_byte: 23447086,
storage_write_value_byte: 9437547,
storage_write_evicted_byte: 0,
storage_read_base: 19352220621,
storage_read_key_byte: 4792496,
storage_read_value_byte: 139743,
storage_remove_base: 109578968621,
storage_remove_key_byte: 9512022,
storage_remove_ret_value_byte: 0,
storage_has_key_base: 20019912030,
storage_has_key_byte: 4647597,
storage_iter_create_prefix_base: 28443562030,
storage_iter_create_prefix_byte: 442354,
storage_iter_create_range_base: 25804628282,
storage_iter_create_from_byte: 429608,
storage_iter_create_to_byte: 1302886,
storage_iter_next_base: 24213271567,
storage_iter_next_key_byte: 0,
storage_iter_next_value_byte: 1343211668,
touching_trie_node: 1,
promise_and_base: 0,
promise_and_per_promise: 672136,
promise_return: 34854215,
}
}
}
impl ExtCostsConfig {
fn free() -> ExtCostsConfig {
ExtCostsConfig {
base: 0,
read_memory_base: 0,
read_memory_byte: 0,
write_memory_base: 0,
write_memory_byte: 0,
read_register_base: 0,
read_register_byte: 0,
write_register_base: 0,
write_register_byte: 0,
utf8_decoding_base: 0,
utf8_decoding_byte: 0,
utf16_decoding_base: 0,
utf16_decoding_byte: 0,
sha256_base: 0,
sha256_byte: 0,
keccak256_base: 0,
keccak256_byte: 0,
keccak512_base: 0,
keccak512_byte: 0,
log_base: 0,
log_byte: 0,
storage_write_base: 0,
storage_write_key_byte: 0,
storage_write_value_byte: 0,
storage_write_evicted_byte: 0,
storage_read_base: 0,
storage_read_key_byte: 0,
storage_read_value_byte: 0,
storage_remove_base: 0,
storage_remove_key_byte: 0,
storage_remove_ret_value_byte: 0,
storage_has_key_base: 0,
storage_has_key_byte: 0,
storage_iter_create_prefix_base: 0,
storage_iter_create_prefix_byte: 0,
storage_iter_create_range_base: 0,
storage_iter_create_from_byte: 0,
storage_iter_create_to_byte: 0,
storage_iter_next_base: 0,
storage_iter_next_key_byte: 0,
storage_iter_next_value_byte: 0,
touching_trie_node: 0,
promise_and_base: 0,
promise_and_per_promise: 0,
promise_return: 0,
}
}
}
#[derive(Copy, Clone, Hash, PartialEq, Eq, Debug, PartialOrd, Ord)]
#[allow(non_camel_case_types)]
pub enum ExtCosts {
base,
read_memory_base,
read_memory_byte,
write_memory_base,
write_memory_byte,
read_register_base,
read_register_byte,
write_register_base,
write_register_byte,
utf8_decoding_base,
utf8_decoding_byte,
utf16_decoding_base,
utf16_decoding_byte,
sha256_base,
sha256_byte,
keccak256_base,
keccak256_byte,
keccak512_base,
keccak512_byte,
log_base,
log_byte,
storage_write_base,
storage_write_key_byte,
storage_write_value_byte,
storage_write_evicted_byte,
storage_read_base,
storage_read_key_byte,
storage_read_value_byte,
storage_remove_base,
storage_remove_key_byte,
storage_remove_ret_value_byte,
storage_has_key_base,
storage_has_key_byte,
storage_iter_create_prefix_base,
storage_iter_create_prefix_byte,
storage_iter_create_range_base,
storage_iter_create_from_byte,
storage_iter_create_to_byte,
storage_iter_next_base,
storage_iter_next_key_byte,
storage_iter_next_value_byte,
touching_trie_node,
promise_and_base,
promise_and_per_promise,
promise_return,
}
impl ExtCosts {
pub fn value(&self, config: &ExtCostsConfig) -> Gas {
use ExtCosts::*;
match self {
base => config.base,
read_memory_base => config.read_memory_base,
read_memory_byte => config.read_memory_byte,
write_memory_base => config.write_memory_base,
write_memory_byte => config.write_memory_byte,
read_register_base => config.read_register_base,
read_register_byte => config.read_register_byte,
write_register_base => config.write_register_base,
write_register_byte => config.write_register_byte,
utf8_decoding_base => config.utf8_decoding_base,
utf8_decoding_byte => config.utf8_decoding_byte,
utf16_decoding_base => config.utf16_decoding_base,
utf16_decoding_byte => config.utf16_decoding_byte,
sha256_base => config.sha256_base,
sha256_byte => config.sha256_byte,
keccak256_base => config.keccak256_base,
keccak256_byte => config.keccak256_byte,
keccak512_base => config.keccak512_base,
keccak512_byte => config.keccak512_byte,
log_base => config.log_base,
log_byte => config.log_byte,
storage_write_base => config.storage_write_base,
storage_write_key_byte => config.storage_write_key_byte,
storage_write_value_byte => config.storage_write_value_byte,
storage_write_evicted_byte => config.storage_write_evicted_byte,
storage_read_base => config.storage_read_base,
storage_read_key_byte => config.storage_read_key_byte,
storage_read_value_byte => config.storage_read_value_byte,
storage_remove_base => config.storage_remove_base,
storage_remove_key_byte => config.storage_remove_key_byte,
storage_remove_ret_value_byte => config.storage_remove_ret_value_byte,
storage_has_key_base => config.storage_has_key_base,
storage_has_key_byte => config.storage_has_key_byte,
storage_iter_create_prefix_base => config.storage_iter_create_prefix_base,
storage_iter_create_prefix_byte => config.storage_iter_create_prefix_byte,
storage_iter_create_range_base => config.storage_iter_create_range_base,
storage_iter_create_from_byte => config.storage_iter_create_from_byte,
storage_iter_create_to_byte => config.storage_iter_create_to_byte,
storage_iter_next_base => config.storage_iter_next_base,
storage_iter_next_key_byte => config.storage_iter_next_key_byte,
storage_iter_next_value_byte => config.storage_iter_next_value_byte,
touching_trie_node => config.touching_trie_node,
promise_and_base => config.promise_and_base,
promise_and_per_promise => config.promise_and_per_promise,
promise_return => config.promise_return,
}
}
}