diff --git a/evm/src/cpu/kernel/asm/memory/metadata.asm b/evm/src/cpu/kernel/asm/memory/metadata.asm index f00fbce6..caa76051 100644 --- a/evm/src/cpu/kernel/asm/memory/metadata.asm +++ b/evm/src/cpu/kernel/asm/memory/metadata.asm @@ -249,7 +249,7 @@ global blockhash: // stack: cur_block_number, block_number, retdest DUP1 DUP3 %increment GT %jumpi(zero_hash) // if block_number >= cur_block_number // stack: cur_block_number, block_number, retdest - DUP2 PUSH 256 ADD + DUP2 PUSH 256 %add_or_fault // stack: block_number+256, cur_block_number, block_number, retdest DUP2 GT %jumpi(zero_hash) // if cur_block_number > block_number + 256 // If we are here, the provided block number is correct diff --git a/evm/src/cpu/kernel/tests/block_hash.rs b/evm/src/cpu/kernel/tests/block_hash.rs index 98d23108..bf1932a0 100644 --- a/evm/src/cpu/kernel/tests/block_hash.rs +++ b/evm/src/cpu/kernel/tests/block_hash.rs @@ -76,7 +76,7 @@ fn test_small_index_block_hash() -> Result<()> { let block_number = rng.gen::() as usize; let initial_stack = vec![retdest, block_number.into()]; - let hashes: Vec = (20..277).map(|elt| elt.into()).collect(); + let hashes: Vec = vec![U256::from_big_endian(&thread_rng().gen::().0); 257]; let mut interpreter = Interpreter::new_with_kernel(blockhash_label, initial_stack); interpreter.set_memory_segment(Segment::BlockHashes, hashes[0..256].to_vec()); @@ -95,3 +95,21 @@ fn test_small_index_block_hash() -> Result<()> { Ok(()) } + +#[test] +#[should_panic] +fn test_block_hash_with_overflow() { + let blockhash_label = KERNEL.global_labels["blockhash"]; + let retdest = 0xDEADBEEFu32.into(); + let cur_block_number = 1; + let block_number = U256::MAX; + let initial_stack = vec![retdest, block_number]; + + let hashes: Vec = vec![U256::from_big_endian(&thread_rng().gen::().0); 257]; + + let mut interpreter = Interpreter::new_with_kernel(blockhash_label, initial_stack); + interpreter.set_memory_segment(Segment::BlockHashes, hashes[0..256].to_vec()); + interpreter.set_global_metadata_field(GlobalMetadata::BlockCurrentHash, hashes[256]); + interpreter.set_global_metadata_field(GlobalMetadata::BlockNumber, cur_block_number.into()); + let _ = interpreter.run(); +} diff --git a/evm/src/generation/mod.rs b/evm/src/generation/mod.rs index 7c69b8dd..d495f342 100644 --- a/evm/src/generation/mod.rs +++ b/evm/src/generation/mod.rs @@ -104,7 +104,7 @@ fn apply_metadata_and_tries_memops, const D: usize> (GlobalMetadata::BlockBaseFee, metadata.block_base_fee), ( GlobalMetadata::BlockCurrentHash, - U256::from_big_endian(&inputs.block_hashes.cur_hash.0), + h2u(inputs.block_hashes.cur_hash), ), (GlobalMetadata::BlockGasUsed, metadata.block_gas_used), (GlobalMetadata::BlockGasUsedBefore, inputs.gas_used_before), diff --git a/evm/src/get_challenges.rs b/evm/src/get_challenges.rs index c32b8964..d2405b8b 100644 --- a/evm/src/get_challenges.rs +++ b/evm/src/get_challenges.rs @@ -13,7 +13,7 @@ use crate::permutation::{ get_n_grand_product_challenge_sets_target, }; use crate::proof::*; -use crate::util::u256_limbs; +use crate::util::{h256_limbs, u256_limbs}; fn observe_root, C: GenericConfig, const D: usize>( challenger: &mut Challenger, @@ -155,12 +155,9 @@ fn observe_block_hashes< block_hashes: &BlockHashes, ) { for i in 0..256 { - challenger.observe_elements( - &u256_limbs::(U256::from_big_endian(&block_hashes.prev_hashes[i].0))[0..8], - ); + challenger.observe_elements(&h256_limbs::(block_hashes.prev_hashes[i])[0..8]); } - challenger - .observe_elements(&u256_limbs::(U256::from_big_endian(&block_hashes.cur_hash.0))[0..8]) + challenger.observe_elements(&h256_limbs::(block_hashes.cur_hash)[0..8]) } fn observe_block_hashes_target< diff --git a/evm/src/recursive_verifier.rs b/evm/src/recursive_verifier.rs index 320b4341..66708318 100644 --- a/evm/src/recursive_verifier.rs +++ b/evm/src/recursive_verifier.rs @@ -43,7 +43,7 @@ use crate::proof::{ TrieRootsTarget, }; use crate::stark::Stark; -use crate::util::u256_limbs; +use crate::util::{h256_limbs, u256_limbs}; use crate::vanishing_poly::eval_vanishing_poly_circuit; use crate::vars::StarkEvaluationTargets; @@ -1057,19 +1057,17 @@ pub(crate) fn set_block_hashes_target( W: Witness, { for i in 0..256 { - let block_hash_limbs: [F; 8] = - u256_limbs::(U256::from_big_endian(&block_hashes.prev_hashes[i].0))[..8] - .try_into() - .unwrap(); + let block_hash_limbs: [F; 8] = h256_limbs::(block_hashes.prev_hashes[i])[..8] + .try_into() + .unwrap(); witness.set_target_arr( &block_hashes_target.prev_hashes[8 * i..8 * (i + 1)], &block_hash_limbs, ); } - let cur_block_hash_limbs: [F; 8] = - u256_limbs::(U256::from_big_endian(&block_hashes.cur_hash.0))[..8] - .try_into() - .unwrap(); + let cur_block_hash_limbs: [F; 8] = h256_limbs::(block_hashes.cur_hash)[..8] + .try_into() + .unwrap(); witness.set_target_arr(&block_hashes_target.cur_hash, &cur_block_hash_limbs); } diff --git a/evm/src/verifier.rs b/evm/src/verifier.rs index 1d93670a..ff3a246a 100644 --- a/evm/src/verifier.rs +++ b/evm/src/verifier.rs @@ -178,7 +178,7 @@ where ), ( GlobalMetadata::BlockCurrentHash, - U256::from_big_endian(&public_values.block_hashes.cur_hash.0), + h2u(public_values.block_hashes.cur_hash), ), ( GlobalMetadata::BlockGasUsed,