diff --git a/zkevm-circuits/src/super_circuit/test.rs b/zkevm-circuits/src/super_circuit/test.rs index 97bd98c7ea..930afa5268 100644 --- a/zkevm-circuits/src/super_circuit/test.rs +++ b/zkevm-circuits/src/super_circuit/test.rs @@ -1,9 +1,10 @@ pub use super::*; -use bus_mapping::evm::OpcodeId; +use bus_mapping::{circuit_input_builder::keccak_inputs, evm::OpcodeId}; use ethers_signers::{LocalWallet, Signer}; use halo2_proofs::{dev::MockProver, halo2curves::bn256::Fr}; use log::error; use mock::{eth, TestContext, MOCK_CHAIN_ID, MOCK_DIFFICULTY}; +use mpt_zktrie::state::builder::HASH_SCHEME_DONE; use rand::SeedableRng; use rand_chacha::ChaCha20Rng; use std::{collections::HashMap, env::set_var}; @@ -25,7 +26,7 @@ fn test_super_circuit< const MAX_INNER_BLOCKS: usize, const MOCK_RANDOMNESS: u64, >( - block: GethData, + geth_data: GethData, circuits_params: CircuitsParams, ) { set_var("COINBASE", "0x0000000000000000000000000000000000000000"); @@ -34,12 +35,31 @@ fn test_super_circuit< MOCK_DIFFICULTY.to_big_endian(&mut difficulty_be_bytes); set_var("DIFFICULTY", hex::encode(difficulty_be_bytes)); - let (k, circuit, instance, _) = - SuperCircuit::::build( - block, - circuits_params, - ) - .unwrap(); + let block_data = BlockData::new_from_geth_data_with_params(geth_data, circuits_params); + let mut builder = block_data.new_circuit_input_builder(); + builder + .handle_block(&block_data.eth_block, &block_data.geth_traces) + .expect("could not handle block tx"); + let mut block = block_convert(&builder.block, &builder.code_db).unwrap(); + block.randomness = Fr::from(MOCK_RANDOMNESS); + + // Mock fill state roots + assert!(*HASH_SCHEME_DONE); + block.mpt_updates.mock_fill_state_roots(); + block.prev_state_root = block.mpt_updates.old_root(); + + // Recompute keccak inputs for updated prev_state_root. + builder.block.prev_state_root = block.mpt_updates.old_root(); + block.keccak_inputs = keccak_inputs(&builder.block, &builder.code_db).unwrap(); + + let (k, circuit, instance) = SuperCircuit::< + Fr, + MAX_TXS, + MAX_CALLDATA, + MAX_INNER_BLOCKS, + MOCK_RANDOMNESS, + >::build_from_witness_block(block) + .unwrap(); let prover = MockProver::run(k, &circuit, instance).unwrap(); prover.assert_satisfied_par(); let res = prover.verify_par(); diff --git a/zkevm-circuits/src/witness/block.rs b/zkevm-circuits/src/witness/block.rs index 98e40f9933..5d73fd1020 100644 --- a/zkevm-circuits/src/witness/block.rs +++ b/zkevm-circuits/src/witness/block.rs @@ -11,7 +11,6 @@ use bus_mapping::{ }; use eth_types::{sign_types::SignData, Address, Field, ToLittleEndian, ToScalar, Word, U256}; use halo2_proofs::circuit::Value; -use mpt_zktrie::state::builder::HASH_SCHEME_DONE; use super::{ mpt::ZktrieState as MptState, step::step_convert, tx::tx_convert, Bytecode, ExecStep, @@ -372,13 +371,11 @@ pub fn block_convert( block.circuits_params.max_rws }; - let mut mpt_updates = MptUpdates::mock_from(&rws.table_assignments()); - assert!(*HASH_SCHEME_DONE); - mpt_updates.mock_fill_state_roots(); - - let mut block = block.clone(); - block.prev_state_root = mpt_updates.old_root(); - let block = █ + let mpt_updates = MptUpdates::from_rws_with_mock_state_roots( + &rws.table_assignments(), + block.prev_state_root, + block.end_state_root(), + ); let _withdraw_root_check_rw = if end_block_last.rw_counter == 0 { 0