diff --git a/bin/mpt-test/src/circuit/witness.rs b/bin/mpt-test/src/circuit/witness.rs index adfed5e56bc..c4e6a67aaea 100644 --- a/bin/mpt-test/src/circuit/witness.rs +++ b/bin/mpt-test/src/circuit/witness.rs @@ -308,26 +308,7 @@ impl Witness { &trns.trie_modifications, provider, ); - - let mut nodes: Vec = serde_json::from_str(&json).unwrap(); - - // Add the address and the key to the list of values in the Account and Storage nodes - for node in nodes.iter_mut() { - if node.account.is_some() { - let account = node.account.clone().unwrap(); - node.values - .push([vec![148], account.address.to_vec()].concat().into()); - node.values - .push([vec![160], account.key.to_vec()].concat().into()); - } - if node.storage.is_some() { - let storage = node.storage.clone().unwrap(); - node.values - .push([vec![160], storage.address.to_vec()].concat().into()); - node.values - .push([vec![160], storage.key.to_vec()].concat().into()); - } - } + let nodes = zkevm_circuits::mpt_circuit::load_proof(json.as_bytes())?; let witness_previous_state_root = H256::from_slice(&nodes[0].values[0][1..33]); let non_disabled_node = |n: &&Node| { diff --git a/geth-utils/gethutil/mpt/witness/leaf.go b/geth-utils/gethutil/mpt/witness/leaf.go index b34b6565231..308490d6c69 100644 --- a/geth-utils/gethutil/mpt/witness/leaf.go +++ b/geth-utils/gethutil/mpt/witness/leaf.go @@ -493,16 +493,7 @@ func prepareStorageLeafInfo(row []byte, valueIsZero, isPlaceholder bool) ([]byte } else { // [226,160,59,138,106,70,105,186,37,13,38[227,32,161,160,187,239,170,18,88,1,56,188,38,60,149,117,120,38,223,78,36,235,129,201,170,170,170,170,170,170,170,170,170,170,170,170] keyLen = row[1] - 128 - if keyLen+2 > valueLen { - // This happens for StorageDoesNotExist when the trie is empty. In this case, the key - // occupies 33 (33 = 161 - 128) bytes, as in the example below: - // [227 161 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] - // Currently, the length for the RLP items is set valueLen = 34, changing this to 35 would - // require significant changes in the circuit. - copy(key, row[keyRlpLen:valueLen]) - } else { - copy(key, row[keyRlpLen:keyLen+2]) - } + copy(key, row[keyRlpLen:keyLen+2]) offset = byte(2) } } diff --git a/geth-utils/src/mpt.rs b/geth-utils/src/mpt.rs index 014d76d4d17..bca30af0e73 100644 --- a/geth-utils/src/mpt.rs +++ b/geth-utils/src/mpt.rs @@ -95,28 +95,12 @@ pub fn get_witness(block_no: u64, mods: &[TrieModification], node_url: &str) -> unsafe { go::FreeString(c_str.as_ptr()) }; + // Note: previously this function returned a Vec of Nodes, but now returning a JSON string + // to avoid imporing zkEVM circuit here (that will create a circular dependency). + // TODO: consider defining Node types in another crate. + json - // let mut nodes: Vec = serde_json::from_str(json).unwrap(); - // - // Add the address and the key to the list of values in the Account and Storage nodes - // for node in nodes.iter_mut() { - // if node.account.is_some() { - // let account = node.account.clone().unwrap(); - // node.values - // .push([vec![148], account.address.to_vec()].concat().into()); - // node.values - // .push([vec![160], account.key.to_vec()].concat().into()); - // } - // if node.storage.is_some() { - // let storage = node.storage.clone().unwrap(); - // node.values - // .push([vec![160], storage.address.to_vec()].concat().into()); - // node.values - // .push([vec![160], storage.key.to_vec()].concat().into()); - // } - // } - // nodes } #[cfg(test)] diff --git a/zkevm-circuits/src/mpt_circuit.rs b/zkevm-circuits/src/mpt_circuit.rs index af527e123a8..c49f8988f60 100644 --- a/zkevm-circuits/src/mpt_circuit.rs +++ b/zkevm-circuits/src/mpt_circuit.rs @@ -10,7 +10,7 @@ use halo2_proofs::{ poly::Rotation, }; -use std::{convert::TryInto, env::var, marker::PhantomData}; +use std::{convert::TryInto, env::var, io::Read, marker::PhantomData}; mod account_leaf; mod branch; @@ -359,10 +359,10 @@ impl MPTConfig { } let cell_columns = [rlp_cm.columns(), state_cm.columns()].concat(); - // println!("max expression degree: {}", meta.degree()); - // println!("num lookups: {}", meta.lookups().len()); - // println!("num advices: {}", meta.num_advice_columns()); - // println!("num fixed: {}", meta.num_fixed_columns()); + log::info!("max expression degree: {}", meta.degree()); + log::info!("num lookups: {}", meta.lookups().len()); + log::info!("num advices: {}", meta.num_advice_columns()); + log::info!("num fixed: {}", meta.num_fixed_columns()); // cb.base.print_stats(); MPTConfig { @@ -733,10 +733,8 @@ impl Circuit for MPTCircuit { } } -/// Loads an MPT proof from disk -pub fn load_proof(path: &str) -> Vec { - let file = std::fs::File::open(path); - let reader = std::io::BufReader::new(file.unwrap()); +/// Loads an MPT proof from reader +pub fn load_proof(reader: R) -> Result, serde_json::Error> { let mut nodes: Vec = serde_json::from_reader(reader).unwrap(); // Add the address and the key to the list of values in the Account and Storage nodes @@ -754,7 +752,14 @@ pub fn load_proof(path: &str) -> Vec { .push([vec![160], storage.key.to_vec()].concat().into()); } } - nodes + Ok(nodes) +} + +/// Loads an MPT proof from disk +pub fn load_proof_from_file(path: &str) -> Vec { + let file = std::fs::File::open(path); + let reader = std::io::BufReader::new(file.unwrap()); + load_proof(reader).unwrap() } #[cfg(test)] @@ -782,7 +787,7 @@ mod tests { let mut parts = path.to_str().unwrap().split('-'); parts.next(); - let nodes = load_proof(path.to_str().unwrap()); + let nodes = load_proof_from_file(path.to_str().unwrap()); let num_rows: usize = nodes.iter().map(|node| node.values.len()).sum(); let mut keccak_data = vec![];