git.delta.rocks / unique-network / refs/commits / cbbf2e97dd31

difftreelog

feat make ethereum pricing based on reads, not writes

Yaroslav Bolyukin2023-05-22parent: #b12d771.patch.diff
in: master

2 files changed

modifiedprimitives/common/src/constants.rsdiffbeforeafterboth
--- a/primitives/common/src/constants.rs
+++ b/primitives/common/src/constants.rs
@@ -52,10 +52,10 @@
 pub const SESSION_LENGTH: BlockNumber = HOURS;
 
 // Targeting 0.1 UNQ per transfer
-pub const WEIGHT_TO_FEE_COEFF: u64 = /*<weight2fee>*/78_254_739_568_813_617/*</weight2fee>*/;
+pub const WEIGHT_TO_FEE_COEFF: u64 = /*<weight2fee>*/76_840_511_488_584_762/*</weight2fee>*/;
 
 // Targeting 0.15 UNQ per transfer via ETH
-pub const MIN_GAS_PRICE: u64 = /*<mingasprice>*/952_266_075_838/*</mingasprice>*/;
+pub const MIN_GAS_PRICE: u64 = /*<mingasprice>*/1_906_626_161_453/*</mingasprice>*/;
 
 /// We assume that ~10% of the block weight is consumed by `on_initalize` handlers.
 /// This is used to limit the maximal weight of a single extrinsic.
modifiedruntime/common/config/ethereum.rsdiffbeforeafterboth
before · runtime/common/config/ethereum.rs
1use sp_core::{U256, H160};2use frame_support::{3	weights::{Weight, constants::WEIGHT_REF_TIME_PER_SECOND},4	traits::{FindAuthor},5	parameter_types, ConsensusEngineId,6};7use sp_runtime::{RuntimeAppPublic, Perbill};8use crate::{9	runtime_common::{10		config::sponsoring::DefaultSponsoringRateLimit,11		DealWithFees,12		dispatch::CollectionDispatchT,13		ethereum::{precompiles::UniquePrecompiles, sponsoring::EvmSponsorshipHandler},14	},15	Runtime, Aura, Balances, RuntimeEvent, ChainId,16};17use pallet_evm::{EnsureAddressTruncated, HashedAddressMapping};18use pallet_ethereum::PostLogContent;19use up_common::constants::*;2021pub type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Runtime>;2223// Assuming slowest ethereum opcode is SSTORE, with gas price of 20000 as our worst case24// (contract, which only writes a lot of data),25// approximating on top of our real store write weight26parameter_types! {27	pub const WritesPerSecond: u64 = WEIGHT_REF_TIME_PER_SECOND / <Runtime as frame_system::Config>::DbWeight::get().write;28	pub const GasPerSecond: u64 = WritesPerSecond::get() * 20000;29	pub const WeightTimePerGas: u64 = WEIGHT_REF_TIME_PER_SECOND / GasPerSecond::get();3031	pub const WeightPerGas: Weight = Weight::from_parts(WeightTimePerGas::get(), 0);32}3334/// Limiting EVM execution to 50% of block for substrate users and management tasks35/// EVM transaction consumes more weight than substrate's, so we can't rely on them being36/// scheduled fairly37const EVM_DISPATCH_RATIO: Perbill = Perbill::from_percent(50);38parameter_types! {39	pub BlockGasLimit: U256 = U256::from((NORMAL_DISPATCH_RATIO * EVM_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT / WeightTimePerGas::get()).ref_time());40	pub PrecompilesValue: UniquePrecompiles<Runtime> = UniquePrecompiles::<_>::new();41}4243pub struct EthereumFindAuthor<F>(core::marker::PhantomData<F>);44impl<F: FindAuthor<u32>> FindAuthor<H160> for EthereumFindAuthor<F> {45	fn find_author<'a, I>(digests: I) -> Option<H160>46	where47		I: 'a + IntoIterator<Item = (ConsensusEngineId, &'a [u8])>,48	{49		if let Some(author_index) = F::find_author(digests) {50			let authority_id = Aura::authorities()[author_index as usize].clone();51			return Some(H160::from_slice(&authority_id.to_raw_vec()[4..24]));52		}53		None54	}55}5657impl pallet_evm::Config for Runtime {58	type CrossAccountId = CrossAccountId;59	type AddressMapping = HashedAddressMapping<Self::Hashing>;60	type BackwardsAddressMapping = HashedAddressMapping<Self::Hashing>;61	type BlockGasLimit = BlockGasLimit;62	type FeeCalculator = pallet_configuration::FeeCalculator<Self>;63	type GasWeightMapping = pallet_evm::FixedGasWeightMapping<Self>;64	type WeightPerGas = WeightPerGas;65	type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping<Self>;66	type CallOrigin = EnsureAddressTruncated<Self>;67	type WithdrawOrigin = EnsureAddressTruncated<Self>;68	type PrecompilesType = UniquePrecompiles<Self>;69	type PrecompilesValue = PrecompilesValue;70	type Currency = Balances;71	type RuntimeEvent = RuntimeEvent;72	type OnMethodCall = (73		pallet_evm_migration::OnMethodCall<Self>,74		pallet_evm_contract_helpers::HelpersOnMethodCall<Self>,75		CollectionDispatchT<Self>,76		pallet_unique::eth::CollectionHelpersOnMethodCall<Self>,77	);78	type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;79	type ChainId = ChainId;80	type Runner = pallet_evm::runner::stack::Runner<Self>;81	type OnChargeTransaction = pallet_evm::EVMCurrencyAdapter<Balances, DealWithFees>;82	type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;83	type FindAuthor = EthereumFindAuthor<Aura>;84}8586impl pallet_evm_migration::Config for Runtime {87	type RuntimeEvent = RuntimeEvent;88	type WeightInfo = pallet_evm_migration::weights::SubstrateWeight<Self>;89}9091parameter_types! {92	pub const PostBlockAndTxnHashes: PostLogContent = PostLogContent::BlockAndTxnHashes;93}9495impl pallet_ethereum::Config for Runtime {96	type RuntimeEvent = RuntimeEvent;97	type StateRoot = pallet_ethereum::IntermediateStateRoot<Self>;98	type PostLogContent = PostBlockAndTxnHashes;99}100101parameter_types! {102	// 0x842899ECF380553E8a4de75bF534cdf6fBF64049103	pub const HelpersContractAddress: H160 = H160([104		0x84, 0x28, 0x99, 0xec, 0xf3, 0x80, 0x55, 0x3e, 0x8a, 0x4d, 0xe7, 0x5b, 0xf5, 0x34, 0xcd, 0xf6, 0xfb, 0xf6, 0x40, 0x49,105	]);106107	// 0x6c4e9fe1ae37a41e93cee429e8e1881abdcbb54f108	pub const EvmCollectionHelpersAddress: H160 = H160([109		0x6c, 0x4e, 0x9f, 0xe1, 0xae, 0x37, 0xa4, 0x1e, 0x93, 0xce, 0xe4, 0x29, 0xe8, 0xe1, 0x88, 0x1a, 0xbd, 0xcb, 0xb5, 0x4f,110	]);111}112113impl pallet_evm_contract_helpers::Config for Runtime {114	type RuntimeEvent = RuntimeEvent;115	type ContractAddress = HelpersContractAddress;116	type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;117}118119impl pallet_evm_coder_substrate::Config for Runtime {}120121impl pallet_evm_transaction_payment::Config for Runtime {122	type EvmSponsorshipHandler = EvmSponsorshipHandler;123}
after · runtime/common/config/ethereum.rs
1use sp_core::{U256, H160};2use frame_support::{3	weights::{Weight, constants::WEIGHT_REF_TIME_PER_SECOND},4	traits::{FindAuthor},5	parameter_types, ConsensusEngineId,6};7use sp_runtime::{RuntimeAppPublic, Perbill};8use crate::{9	runtime_common::{10		config::sponsoring::DefaultSponsoringRateLimit,11		DealWithFees,12		dispatch::CollectionDispatchT,13		ethereum::{precompiles::UniquePrecompiles, sponsoring::EvmSponsorshipHandler},14	},15	Runtime, Aura, Balances, RuntimeEvent, ChainId,16};17use pallet_evm::{EnsureAddressTruncated, HashedAddressMapping};18use pallet_ethereum::PostLogContent;19use up_common::constants::*;2021pub type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Runtime>;2223// ~~Assuming slowest ethereum opcode is SSTORE, with gas price of 20000 as our worst case~~24// ~~(contract, which only writes a lot of data),~~25// ~~approximating on top of our real store write weight~~26//27// The above approach is very wrong, and the reason is described there:28// https://forum.polkadot.network/t/frontier-support-for-evm-weight-v2/2470/5#problem-229parameter_types! {30	pub const ReadsPerSecond: u64 = WEIGHT_REF_TIME_PER_SECOND / <Runtime as frame_system::Config>::DbWeight::get().read;31	pub const GasPerSecond: u64 = ReadsPerSecond::get() * 2100;32	pub const WeightTimePerGas: u64 = WEIGHT_REF_TIME_PER_SECOND / GasPerSecond::get();3334	pub const WeightPerGas: Weight = Weight::from_parts(WeightTimePerGas::get(), 0);35}3637/// Limiting EVM execution to 50% of block for substrate users and management tasks38/// EVM transaction consumes more weight than substrate's, so we can't rely on them being39/// scheduled fairly40const EVM_DISPATCH_RATIO: Perbill = Perbill::from_percent(50);41parameter_types! {42	pub BlockGasLimit: U256 = U256::from((NORMAL_DISPATCH_RATIO * EVM_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT / WeightTimePerGas::get()).ref_time());43	pub PrecompilesValue: UniquePrecompiles<Runtime> = UniquePrecompiles::<_>::new();44}4546pub struct EthereumFindAuthor<F>(core::marker::PhantomData<F>);47impl<F: FindAuthor<u32>> FindAuthor<H160> for EthereumFindAuthor<F> {48	fn find_author<'a, I>(digests: I) -> Option<H160>49	where50		I: 'a + IntoIterator<Item = (ConsensusEngineId, &'a [u8])>,51	{52		if let Some(author_index) = F::find_author(digests) {53			let authority_id = Aura::authorities()[author_index as usize].clone();54			return Some(H160::from_slice(&authority_id.to_raw_vec()[4..24]));55		}56		None57	}58}5960impl pallet_evm::Config for Runtime {61	type CrossAccountId = CrossAccountId;62	type AddressMapping = HashedAddressMapping<Self::Hashing>;63	type BackwardsAddressMapping = HashedAddressMapping<Self::Hashing>;64	type BlockGasLimit = BlockGasLimit;65	type FeeCalculator = pallet_configuration::FeeCalculator<Self>;66	type GasWeightMapping = pallet_evm::FixedGasWeightMapping<Self>;67	type WeightPerGas = WeightPerGas;68	type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping<Self>;69	type CallOrigin = EnsureAddressTruncated<Self>;70	type WithdrawOrigin = EnsureAddressTruncated<Self>;71	type PrecompilesType = UniquePrecompiles<Self>;72	type PrecompilesValue = PrecompilesValue;73	type Currency = Balances;74	type RuntimeEvent = RuntimeEvent;75	type OnMethodCall = (76		pallet_evm_migration::OnMethodCall<Self>,77		pallet_evm_contract_helpers::HelpersOnMethodCall<Self>,78		CollectionDispatchT<Self>,79		pallet_unique::eth::CollectionHelpersOnMethodCall<Self>,80	);81	type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;82	type ChainId = ChainId;83	type Runner = pallet_evm::runner::stack::Runner<Self>;84	type OnChargeTransaction = pallet_evm::EVMCurrencyAdapter<Balances, DealWithFees>;85	type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;86	type FindAuthor = EthereumFindAuthor<Aura>;87}8889impl pallet_evm_migration::Config for Runtime {90	type RuntimeEvent = RuntimeEvent;91	type WeightInfo = pallet_evm_migration::weights::SubstrateWeight<Self>;92}9394parameter_types! {95	pub const PostBlockAndTxnHashes: PostLogContent = PostLogContent::BlockAndTxnHashes;96}9798impl pallet_ethereum::Config for Runtime {99	type RuntimeEvent = RuntimeEvent;100	type StateRoot = pallet_ethereum::IntermediateStateRoot<Self>;101	type PostLogContent = PostBlockAndTxnHashes;102}103104parameter_types! {105	// 0x842899ECF380553E8a4de75bF534cdf6fBF64049106	pub const HelpersContractAddress: H160 = H160([107		0x84, 0x28, 0x99, 0xec, 0xf3, 0x80, 0x55, 0x3e, 0x8a, 0x4d, 0xe7, 0x5b, 0xf5, 0x34, 0xcd, 0xf6, 0xfb, 0xf6, 0x40, 0x49,108	]);109110	// 0x6c4e9fe1ae37a41e93cee429e8e1881abdcbb54f111	pub const EvmCollectionHelpersAddress: H160 = H160([112		0x6c, 0x4e, 0x9f, 0xe1, 0xae, 0x37, 0xa4, 0x1e, 0x93, 0xce, 0xe4, 0x29, 0xe8, 0xe1, 0x88, 0x1a, 0xbd, 0xcb, 0xb5, 0x4f,113	]);114}115116impl pallet_evm_contract_helpers::Config for Runtime {117	type RuntimeEvent = RuntimeEvent;118	type ContractAddress = HelpersContractAddress;119	type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;120}121122impl pallet_evm_coder_substrate::Config for Runtime {}123124impl pallet_evm_transaction_payment::Config for Runtime {125	type EvmSponsorshipHandler = EvmSponsorshipHandler;126}