From f2b3c8b912e351d568b0da68987d0c5a400302aa Mon Sep 17 00:00:00 2001 From: Aner Ben Efraim Date: Thu, 15 Aug 2024 09:08:05 +0300 Subject: [PATCH] build(blockifier): receive l2_gas_price from python --- crates/blockifier/src/blockifier/block.rs | 42 ++++++++++--------- crates/blockifier/src/fee/fee_test.rs | 8 ++++ .../blockifier/src/test_utils/struct_impls.rs | 8 ++++ crates/gateway/src/rpc_objects.rs | 2 + crates/native_blockifier/src/errors.rs | 4 ++ crates/native_blockifier/src/py_state_diff.rs | 22 ++++++++++ crates/papyrus_execution/src/lib.rs | 3 ++ 7 files changed, 69 insertions(+), 20 deletions(-) diff --git a/crates/blockifier/src/blockifier/block.rs b/crates/blockifier/src/blockifier/block.rs index 0ac14eecb6..7fdf2fb30a 100644 --- a/crates/blockifier/src/blockifier/block.rs +++ b/crates/blockifier/src/blockifier/block.rs @@ -1,5 +1,6 @@ use std::num::NonZeroU128; +use log::warn; use starknet_api::block::{BlockHash, BlockNumber, BlockTimestamp}; use starknet_api::core::ContractAddress; use starknet_api::state::StorageKey; @@ -9,7 +10,7 @@ use crate::abi::constants; use crate::state::errors::StateError; use crate::state::state_api::{State, StateResult}; use crate::transaction::objects::FeeType; -use crate::versioned_constants::{VersionedConstants, VersionedConstantsOverrides}; +use crate::versioned_constants::VersionedConstants; #[cfg(test)] #[path = "block_test.rs"] @@ -42,26 +43,27 @@ impl GasPrices { strk_l1_gas_price: NonZeroU128, eth_l1_data_gas_price: NonZeroU128, strk_l1_data_gas_price: NonZeroU128, + eth_l2_gas_price: NonZeroU128, + strk_l2_gas_price: NonZeroU128, ) -> Self { - // TODO(Aner): get gas prices from python. - let eth_l2_gas_price = NonZeroU128::new( - VersionedConstants::get_versioned_constants(VersionedConstantsOverrides { - validate_max_n_steps: 0, - max_recursion_depth: 0, - versioned_constants_base_overrides: None, - }) - .l1_to_l2_gas_price_conversion(eth_l1_gas_price.into()), - ) - .expect("L1 to L2 price conversion error (Rust side)."); - let strk_l2_gas_price = NonZeroU128::new( - VersionedConstants::get_versioned_constants(VersionedConstantsOverrides { - validate_max_n_steps: 0, - max_recursion_depth: 0, - versioned_constants_base_overrides: None, - }) - .l1_to_l2_gas_price_conversion(strk_l1_gas_price.into()), - ) - .expect("L1 to L2 price conversion error (Rust side)."); + // TODO(Aner): fix backwards compatibility. + let expected_eth_l2_gas_price = VersionedConstants::latest_constants() + .l1_to_l2_gas_price_conversion(eth_l1_gas_price.into()); + if u128::from(eth_l2_gas_price) != expected_eth_l2_gas_price { + warn!( + "eth_l2_gas_price does not match expected! eth_l2_gas_price:{eth_l2_gas_price}, \ + expected:{expected_eth_l2_gas_price}." + ) + } + let expected_strk_l2_gas_price = VersionedConstants::latest_constants() + .l1_to_l2_gas_price_conversion(strk_l1_gas_price.into()); + if u128::from(strk_l2_gas_price) != expected_strk_l2_gas_price { + warn!( + "strk_l2_gas_price does not match expected! \ + strk_l2_gas_price:{strk_l2_gas_price}, expected:{expected_strk_l2_gas_price}." + ) + } + GasPrices { eth_l1_gas_price, strk_l1_gas_price, diff --git a/crates/blockifier/src/fee/fee_test.rs b/crates/blockifier/src/fee/fee_test.rs index 52ce692290..9c86e5f9d3 100644 --- a/crates/blockifier/src/fee/fee_test.rs +++ b/crates/blockifier/src/fee/fee_test.rs @@ -133,6 +133,14 @@ fn test_discounted_gas_overdraft( gas_price.try_into().unwrap(), DEFAULT_ETH_L1_DATA_GAS_PRICE.try_into().unwrap(), data_gas_price.try_into().unwrap(), + VersionedConstants::latest_constants() + .l1_to_l2_gas_price_conversion(DEFAULT_ETH_L1_GAS_PRICE) + .try_into() + .unwrap(), + VersionedConstants::latest_constants() + .l1_to_l2_gas_price_conversion(gas_price) + .try_into() + .unwrap(), ); let account = FeatureContract::AccountWithoutValidations(CairoVersion::Cairo0); diff --git a/crates/blockifier/src/test_utils/struct_impls.rs b/crates/blockifier/src/test_utils/struct_impls.rs index 6b6e83b859..03e64465a1 100644 --- a/crates/blockifier/src/test_utils/struct_impls.rs +++ b/crates/blockifier/src/test_utils/struct_impls.rs @@ -163,6 +163,14 @@ impl BlockInfo { DEFAULT_STRK_L1_GAS_PRICE.try_into().unwrap(), DEFAULT_ETH_L1_DATA_GAS_PRICE.try_into().unwrap(), DEFAULT_STRK_L1_DATA_GAS_PRICE.try_into().unwrap(), + VersionedConstants::latest_constants() + .l1_to_l2_gas_price_conversion(DEFAULT_ETH_L1_GAS_PRICE) + .try_into() + .unwrap(), + VersionedConstants::latest_constants() + .l1_to_l2_gas_price_conversion(DEFAULT_STRK_L1_GAS_PRICE) + .try_into() + .unwrap(), ), use_kzg_da: false, } diff --git a/crates/gateway/src/rpc_objects.rs b/crates/gateway/src/rpc_objects.rs index d6898d024f..d5cdb3bf0e 100644 --- a/crates/gateway/src/rpc_objects.rs +++ b/crates/gateway/src/rpc_objects.rs @@ -90,6 +90,8 @@ impl TryInto for BlockHeader { parse_gas_price(self.l1_gas_price.price_in_fri)?, parse_gas_price(self.l1_data_gas_price.price_in_wei)?, parse_gas_price(self.l1_data_gas_price.price_in_fri)?, + NonZeroU128::MIN, + NonZeroU128::MIN, ), use_kzg_da: matches!(self.l1_da_mode, L1DataAvailabilityMode::Blob), }) diff --git a/crates/native_blockifier/src/errors.rs b/crates/native_blockifier/src/errors.rs index 8baaf272fe..bf5aef276e 100644 --- a/crates/native_blockifier/src/errors.rs +++ b/crates/native_blockifier/src/errors.rs @@ -113,6 +113,10 @@ pub enum InvalidNativeBlockifierInputError { InvalidDataGasPriceWei(u128), #[error("Invalid Fri data gas price: {0}.")] InvalidDataGasPriceFri(u128), + #[error("Invalid Wei l2 gas price: {0}.")] + InvalidL2GasPriceWei(u128), + #[error("Invalid Fri l2 gas price: {0}.")] + InvalidL2GasPriceFri(u128), } create_exception!(native_blockifier, UndeclaredClassHashError, PyException); diff --git a/crates/native_blockifier/src/py_state_diff.rs b/crates/native_blockifier/src/py_state_diff.rs index 634f6baac0..172784375d 100644 --- a/crates/native_blockifier/src/py_state_diff.rs +++ b/crates/native_blockifier/src/py_state_diff.rs @@ -9,6 +9,7 @@ use blockifier::test_utils::{ DEFAULT_STRK_L1_DATA_GAS_PRICE, DEFAULT_STRK_L1_GAS_PRICE, }; +use blockifier::versioned_constants::{VersionedConstants, VersionedConstantsOverrides}; use indexmap::IndexMap; use pyo3::prelude::*; use pyo3::FromPyObject; @@ -140,6 +141,7 @@ pub struct PyBlockInfo { pub block_timestamp: u64, pub l1_gas_price: PyResourcePrice, pub l1_data_gas_price: PyResourcePrice, + pub l2_gas_price: PyResourcePrice, pub sequencer_address: PyFelt, pub use_kzg_da: bool, } @@ -158,6 +160,12 @@ impl Default for PyBlockInfo { price_in_wei: DEFAULT_ETH_L1_DATA_GAS_PRICE, price_in_fri: DEFAULT_STRK_L1_DATA_GAS_PRICE, }, + l2_gas_price: PyResourcePrice { + price_in_wei: VersionedConstants::latest_constants() + .l1_to_l2_gas_price_conversion(DEFAULT_ETH_L1_GAS_PRICE), + price_in_fri: VersionedConstants::latest_constants() + .l1_to_l2_gas_price_conversion(DEFAULT_STRK_L1_GAS_PRICE), + }, sequencer_address: PyFelt::default(), use_kzg_da: bool::default(), } @@ -201,6 +209,20 @@ impl TryFrom for BlockInfo { ), ) })?, + block_info.l2_gas_price.price_in_wei.try_into().map_err(|_| { + NativeBlockifierInputError::InvalidNativeBlockifierInputError( + InvalidNativeBlockifierInputError::InvalidL2GasPriceWei( + block_info.l2_gas_price.price_in_wei, + ), + ) + })?, + block_info.l2_gas_price.price_in_fri.try_into().map_err(|_| { + NativeBlockifierInputError::InvalidNativeBlockifierInputError( + InvalidNativeBlockifierInputError::InvalidL2GasPriceFri( + block_info.l2_gas_price.price_in_fri, + ), + ) + })?, ), use_kzg_da: block_info.use_kzg_da, }) diff --git a/crates/papyrus_execution/src/lib.rs b/crates/papyrus_execution/src/lib.rs index 3094f81820..cc39f2cc2e 100644 --- a/crates/papyrus_execution/src/lib.rs +++ b/crates/papyrus_execution/src/lib.rs @@ -359,6 +359,9 @@ fn create_block_context( NonZeroU128::new(l1_gas_price.price_in_fri.0).unwrap_or(NonZeroU128::MIN), NonZeroU128::new(l1_data_gas_price.price_in_wei.0).unwrap_or(NonZeroU128::MIN), NonZeroU128::new(l1_data_gas_price.price_in_fri.0).unwrap_or(NonZeroU128::MIN), + // TODO(Aner - Shahak): fix to come from pending_data/block_header. + NonZeroU128::MIN, + NonZeroU128::MIN, ), }; let chain_info = ChainInfo {