Skip to content
This repository was archived by the owner on Feb 12, 2025. It is now read-only.

Commit 1d5caf0

Browse files
authored
feat: set prevrandao and block gaslimit (#670)
* feat: set randao and block_gaslimit in runner * use mixhash for prevrandao * use split_u256 * chore: fmt * chore: normalize block_gas_limit naming * fix: use u128 part from block gas limit * make clippy happy
1 parent 4e35d11 commit 1d5caf0

File tree

4 files changed

+56
-13
lines changed

4 files changed

+56
-13
lines changed

crates/ef-testing/src/evm_sequencer/evm_state/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ use super::account::KakarotAccount;
1717
pub trait Evm {
1818
// TODO enforce using a marker type that you can only proceed
1919
// with execution if the state is initialized.
20-
fn setup_state(&mut self, _base_fee: U256) -> StateResult<()> {
20+
fn setup_state(
21+
&mut self,
22+
_base_fee: U256,
23+
_prev_randao: U256,
24+
_block_gas_limit: U256,
25+
) -> StateResult<()> {
2126
panic!("Not implemented, use features flag \"v0\" or \"v1\"")
2227
}
2328

crates/ef-testing/src/evm_sequencer/evm_state/v0.rs

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ use crate::starknet_storage;
2121

2222
impl Evm for KakarotSequencer {
2323
/// Sets up the evm state (coinbase, block number, etc.)
24-
fn setup_state(&mut self, base_fee: U256) -> StateResult<()> {
24+
fn setup_state(
25+
&mut self,
26+
base_fee: U256,
27+
prev_randao: U256,
28+
block_gas_limit: U256,
29+
) -> StateResult<()> {
2530
let kakarot_address = self.environment.kakarot_address;
2631
let coinbase_address: FeltSequencer = (*self.address()).try_into().unwrap(); // infallible
2732

@@ -33,20 +38,40 @@ impl Evm for KakarotSequencer {
3338
);
3439

3540
// Set the base fee.
36-
let low_fee = base_fee & U256::from(u128::MAX);
37-
let low_fee: u128 = low_fee.try_into().unwrap(); // safe unwrap <= U128::MAX.
38-
let high_fee = base_fee >> U256::from(128);
39-
let high_fee: u128 = high_fee.try_into().unwrap(); // safe unwrap <= U128::MAX.
40-
41-
let base_address = get_storage_var_address("base_fee", &[]);
41+
let [low_fee, high_fee] = split_u256(base_fee);
42+
let basefee_address = get_storage_var_address("base_fee", &[]);
4243
self.state_mut()
43-
.set_storage_at(kakarot_address, base_address, StarkFelt::from(low_fee));
44+
.set_storage_at(kakarot_address, basefee_address, StarkFelt::from(low_fee));
4445
self.state_mut().set_storage_at(
4546
kakarot_address,
46-
next_storage_key(&base_address)?,
47+
next_storage_key(&basefee_address)?,
4748
StarkFelt::from(high_fee),
4849
);
4950

51+
// Set the previous randao.
52+
let [low_prev_randao, high_prev_randao] = split_u256(prev_randao);
53+
let prev_randao_address = get_storage_var_address("prev_randao", &[]);
54+
self.state_mut().set_storage_at(
55+
kakarot_address,
56+
prev_randao_address,
57+
StarkFelt::from(low_prev_randao),
58+
);
59+
self.state_mut().set_storage_at(
60+
kakarot_address,
61+
next_storage_key(&prev_randao_address)?,
62+
StarkFelt::from(high_prev_randao),
63+
);
64+
65+
// Set the block gas limit, considering it fits in a felt.
66+
let [block_gas_limit, _] = split_u256(block_gas_limit);
67+
let block_gas_limit = StarkFelt::from(block_gas_limit);
68+
let block_gas_limit_address = get_storage_var_address("block_gas_limit", &[]);
69+
self.state_mut().set_storage_at(
70+
kakarot_address,
71+
block_gas_limit_address,
72+
StarkFelt::from(block_gas_limit),
73+
);
74+
5075
Ok(())
5176
}
5277

crates/ef-testing/src/evm_sequencer/evm_state/v1.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@ use crate::{
3838

3939
impl Evm for KakarotSequencer {
4040
/// Sets up the evm state (coinbase, block number, etc.)
41-
fn setup_state(&mut self, _base_fee: U256) -> StateResult<()> {
41+
fn setup_state(
42+
&mut self,
43+
_base_fee: U256,
44+
_prev_randao: U256,
45+
_block_gas_limit: U256,
46+
) -> StateResult<()> {
4247
let coinbase_address = *self.address();
4348
let coinbase =
4449
KakarotAccount::new(&coinbase_address, &Bytes::default(), U256::ZERO, &[], true)?;
@@ -431,7 +436,9 @@ mod tests {
431436
transaction.signature = signature;
432437

433438
// When
434-
sequencer.setup_state(U256::ZERO).unwrap();
439+
sequencer
440+
.setup_state(U256::ZERO, U256::ZERO, U256::ZERO)
441+
.unwrap();
435442
let bytecode = Bytes::from(vec![
436443
0x60, 0x01, 0x60, 0x00, 0x55, 0x60, 0x02, 0x60, 0x00, 0x53, 0x60, 0x01, 0x60, 0x00,
437444
0xf3,

crates/ef-testing/src/models/case.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,12 @@ impl Case for BlockchainTestCase {
242242
let base_fee = maybe_block_header
243243
.and_then(|block_header| block_header.base_fee_per_gas)
244244
.unwrap_or_default();
245+
let prev_randao = maybe_block_header
246+
.map(|block_header| block_header.mix_hash)
247+
.unwrap_or_default();
248+
let block_gas_limit = maybe_block_header
249+
.map(|block_header| block_header.gas_limit)
250+
.unwrap_or_default();
245251

246252
let block_number = maybe_block_header.map(|b| b.number).unwrap_or_default();
247253
let block_number = TryInto::<u64>::try_into(block_number).unwrap_or_default();
@@ -264,7 +270,7 @@ impl Case for BlockchainTestCase {
264270
block_timestamp,
265271
);
266272

267-
sequencer.setup_state(base_fee)?;
273+
sequencer.setup_state(base_fee, prev_randao.into(), block_gas_limit)?;
268274

269275
self.handle_pre_state(&mut sequencer)?;
270276

0 commit comments

Comments
 (0)