diff --git a/evm/src/fixed_recursive_verifier.rs b/evm/src/fixed_recursive_verifier.rs index 854e0517..4cb15639 100644 --- a/evm/src/fixed_recursive_verifier.rs +++ b/evm/src/fixed_recursive_verifier.rs @@ -36,8 +36,8 @@ use crate::cross_table_lookup::{ use crate::generation::GenerationInputs; use crate::get_challenges::observe_public_values_target; use crate::proof::{ - BlockHashesTarget, BlockMetadataTarget, ExtraBlockDataTarget, PublicValues, PublicValuesTarget, - StarkProofWithMetadata, TrieRootsTarget, + BlockHashesTarget, BlockMetadataTarget, ExtraBlockData, ExtraBlockDataTarget, PublicValues, + PublicValuesTarget, StarkProofWithMetadata, TrieRootsTarget, }; use crate::prover::prove; use crate::recursive_verifier::{ @@ -963,9 +963,10 @@ where &self, lhs_is_agg: bool, lhs_proof: &ProofWithPublicInputs, + lhs_public_values: PublicValues, rhs_is_agg: bool, rhs_proof: &ProofWithPublicInputs, - public_values: PublicValues, + rhs_public_values: PublicValues, ) -> anyhow::Result<(ProofWithPublicInputs, PublicValues)> { let mut agg_inputs = PartialWitness::new(); @@ -982,17 +983,34 @@ where &self.aggregation.circuit.verifier_only, ); + // Aggregates both `PublicValues` from the provided proofs into a single one. + let agg_public_values = PublicValues { + trie_roots_before: lhs_public_values.trie_roots_before, + trie_roots_after: rhs_public_values.trie_roots_after, + extra_block_data: ExtraBlockData { + genesis_state_trie_root: lhs_public_values.extra_block_data.genesis_state_trie_root, + txn_number_before: lhs_public_values.extra_block_data.txn_number_before, + txn_number_after: rhs_public_values.extra_block_data.txn_number_after, + gas_used_before: lhs_public_values.extra_block_data.gas_used_before, + gas_used_after: rhs_public_values.extra_block_data.gas_used_after, + block_bloom_before: lhs_public_values.extra_block_data.block_bloom_before, + block_bloom_after: rhs_public_values.extra_block_data.block_bloom_after, + }, + block_metadata: rhs_public_values.block_metadata, + block_hashes: rhs_public_values.block_hashes, + }; + set_public_value_targets( &mut agg_inputs, &self.aggregation.public_values, - &public_values, + &agg_public_values, ) .map_err(|_| { anyhow::Error::msg("Invalid conversion when setting public values targets.") })?; let aggregation_proof = self.aggregation.circuit.prove(agg_inputs)?; - Ok((aggregation_proof, public_values)) + Ok((aggregation_proof, agg_public_values)) } pub fn verify_aggregation( diff --git a/evm/tests/empty_txn_list.rs b/evm/tests/empty_txn_list.rs index 80b5beb0..0285286d 100644 --- a/evm/tests/empty_txn_list.rs +++ b/evm/tests/empty_txn_list.rs @@ -74,7 +74,7 @@ fn test_empty_txn_list() -> anyhow::Result<()> { let all_circuits = AllRecursiveCircuits::::new( &all_stark, - &[16..17, 11..12, 15..16, 14..15, 9..10, 12..13, 18..19], // Minimal ranges to prove an empty list + &[16..17, 11..12, 15..16, 14..15, 9..11, 12..13, 18..19], // Minimal ranges to prove an empty list &config, ); @@ -113,8 +113,14 @@ fn test_empty_txn_list() -> anyhow::Result<()> { all_circuits.verify_root(root_proof.clone())?; // We can duplicate the proofs here because the state hasn't mutated. - let (agg_proof, public_values) = - all_circuits.prove_aggregation(false, &root_proof, false, &root_proof, public_values)?; + let (agg_proof, public_values) = all_circuits.prove_aggregation( + false, + &root_proof, + public_values.clone(), + false, + &root_proof, + public_values, + )?; all_circuits.verify_aggregation(&agg_proof)?; let (block_proof, _) = all_circuits.prove_block(None, &agg_proof, public_values)?; diff --git a/evm/tests/log_opcode.rs b/evm/tests/log_opcode.rs index 309d357b..5b28eb9b 100644 --- a/evm/tests/log_opcode.rs +++ b/evm/tests/log_opcode.rs @@ -20,7 +20,7 @@ use plonky2_evm::fixed_recursive_verifier::AllRecursiveCircuits; use plonky2_evm::generation::mpt::transaction_testing::{AddressOption, LegacyTransactionRlp}; use plonky2_evm::generation::mpt::{AccountRlp, LegacyReceiptRlp, LogRlp}; use plonky2_evm::generation::{GenerationInputs, TrieInputs}; -use plonky2_evm::proof::{BlockHashes, BlockMetadata, ExtraBlockData, PublicValues, TrieRoots}; +use plonky2_evm::proof::{BlockHashes, BlockMetadata, TrieRoots}; use plonky2_evm::prover::prove; use plonky2_evm::verifier::verify_proof; use plonky2_evm::Node; @@ -464,15 +464,15 @@ fn test_log_with_aggreg() -> anyhow::Result<()> { ); let mut timing = TimingTree::new("prove root first", log::Level::Info); - let (root_proof_first, first_public_values) = + let (root_proof_first, public_values_first) = all_circuits.prove_root(&all_stark, &config, inputs_first, &mut timing)?; timing.filter(Duration::from_millis(100)).print(); all_circuits.verify_root(root_proof_first.clone())?; // The output bloom filter, gas used and transaction number are fed to the next transaction, so the two proofs can be correctly aggregated. - let block_bloom_second = first_public_values.extra_block_data.block_bloom_after; - let gas_used_second = first_public_values.extra_block_data.gas_used_after; + let block_bloom_second = public_values_first.extra_block_data.block_bloom_after; + let gas_used_second = public_values_first.extra_block_data.gas_used_after; // Prove second transaction. In this second transaction, the code with logs is executed. @@ -602,36 +602,19 @@ fn test_log_with_aggreg() -> anyhow::Result<()> { }; let mut timing = TimingTree::new("prove root second", log::Level::Info); - let (root_proof, public_values) = + let (root_proof_second, public_values_second) = all_circuits.prove_root(&all_stark, &config, inputs, &mut timing)?; timing.filter(Duration::from_millis(100)).print(); - all_circuits.verify_root(root_proof.clone())?; + all_circuits.verify_root(root_proof_second.clone())?; - // Update public values for the aggregation. - let agg_public_values = PublicValues { - trie_roots_before: first_public_values.trie_roots_before, - trie_roots_after: public_values.trie_roots_after, - extra_block_data: ExtraBlockData { - genesis_state_trie_root, - txn_number_before: first_public_values.extra_block_data.txn_number_before, - txn_number_after: public_values.extra_block_data.txn_number_after, - gas_used_before: first_public_values.extra_block_data.gas_used_before, - gas_used_after: public_values.extra_block_data.gas_used_after, - block_bloom_before: first_public_values.extra_block_data.block_bloom_before, - block_bloom_after: public_values.extra_block_data.block_bloom_after, - }, - block_metadata: public_values.block_metadata, - block_hashes: public_values.block_hashes, - }; - - // We can duplicate the proofs here because the state hasn't mutated. let (agg_proof, updated_agg_public_values) = all_circuits.prove_aggregation( false, &root_proof_first, + public_values_first, false, - &root_proof, - agg_public_values, + &root_proof_second, + public_values_second, )?; all_circuits.verify_aggregation(&agg_proof)?; let (block_proof, _block_public_values) =