diff --git a/evm/src/cpu/kernel/asm/account_code.asm b/evm/src/cpu/kernel/asm/account_code.asm index 211363fb..4563fa0a 100644 --- a/evm/src/cpu/kernel/asm/account_code.asm +++ b/evm/src/cpu/kernel/asm/account_code.asm @@ -14,6 +14,9 @@ %%after: %endmacro +global extcodesize: + %extcodesize + %macro codesize ADDRESS %extcodesize @@ -78,6 +81,7 @@ extcodecopy_end: load_code: // stack: address, retdest %extcodehash + STOP // stack: codehash, retdest PROVER_INPUT(account_code::length) // stack: code_length, codehash, retdest diff --git a/evm/src/cpu/kernel/tests/account_code.rs b/evm/src/cpu/kernel/tests/account_code.rs new file mode 100644 index 00000000..af1a37ab --- /dev/null +++ b/evm/src/cpu/kernel/tests/account_code.rs @@ -0,0 +1,49 @@ +use std::collections::HashMap; +use std::str::FromStr; + +use anyhow::Result; +use ethereum_types::{BigEndianHash, H256, U256}; + +use crate::cpu::kernel::aggregator::combined_kernel; +use crate::cpu::kernel::interpreter::Interpreter; +use crate::cpu::kernel::tests::mpt::extension_to_leaf; +use crate::generation::mpt::{all_mpt_prover_inputs_reversed, AccountRlp}; +use crate::generation::TrieInputs; + +fn test_account_1() -> AccountRlp { + AccountRlp { + nonce: U256::from(1111), + balance: U256::from(2222), + storage_root: H256::from_uint(&U256::from(3333)), + code_hash: H256::from_uint(&U256::from(4444)), + } +} + +pub(crate) fn test_account_1_rlp() -> Vec { + rlp::encode(&test_account_1()).to_vec() +} + +#[test] +fn test_extcodecopy() -> Result<()> { + let trie_inputs = TrieInputs { + state_trie: extension_to_leaf(test_account_1_rlp()), + transactions_trie: Default::default(), + receipts_trie: Default::default(), + storage_tries: vec![], + }; + let kernel = combined_kernel(); + let extcodecopy = kernel.global_labels["extcodecopy"]; + let extcodesize = kernel.global_labels["extcodesize"]; + + let initial_stack = vec![0.into()]; + let mut interpreter = Interpreter::new_with_kernel(extcodesize, initial_stack); + interpreter.generation_state.mpt_prover_inputs = all_mpt_prover_inputs_reversed(&trie_inputs); + interpreter.generation_state.inputs.contract_code = HashMap::from([( + H256::from_str("2636a8beb2c41b8ccafa9a55a5a5e333892a83b491df3a67d2768946a9f9c6dc")?, + vec![0x13, 0x37], + )]); + interpreter.run()?; + assert_eq!(interpreter.stack(), vec![2.into()]); + + Ok(()) +} diff --git a/evm/src/cpu/kernel/tests/mod.rs b/evm/src/cpu/kernel/tests/mod.rs index 9148d6a4..cfccb420 100644 --- a/evm/src/cpu/kernel/tests/mod.rs +++ b/evm/src/cpu/kernel/tests/mod.rs @@ -1,3 +1,4 @@ +mod account_code; mod core; mod curve_ops; mod ecrecover;