diff --git a/crates/circuits/batch-circuit/src/circuit.rs b/crates/circuits/batch-circuit/src/circuit.rs index 66f65baa..83a24da4 100644 --- a/crates/circuits/batch-circuit/src/circuit.rs +++ b/crates/circuits/batch-circuit/src/circuit.rs @@ -5,8 +5,10 @@ use scroll_zkvm_types_circuit::{ io::read_witnesses, public_inputs::{ Version, - batch::{BatchInfo, VersionedBatchInfo}, - chunk::VersionedChunkInfo, + scroll::{ + batch::{BatchInfo, VersionedBatchInfo}, + chunk::VersionedChunkInfo, + }, }, }; diff --git a/crates/circuits/bundle-circuit/src/circuit.rs b/crates/circuits/bundle-circuit/src/circuit.rs index fb78e641..a7e8b4dc 100644 --- a/crates/circuits/bundle-circuit/src/circuit.rs +++ b/crates/circuits/bundle-circuit/src/circuit.rs @@ -5,8 +5,10 @@ use scroll_zkvm_types_circuit::{ io::read_witnesses, public_inputs::{ Version, - batch::VersionedBatchInfo, - bundle::{BundleInfo, VersionedBundleInfo}, + scroll::{ + batch::VersionedBatchInfo, + bundle::{BundleInfo, VersionedBundleInfo}, + }, }, }; diff --git a/crates/circuits/chunk-circuit/src/circuit.rs b/crates/circuits/chunk-circuit/src/circuit.rs index 75ddc48d..366ad5cb 100644 --- a/crates/circuits/chunk-circuit/src/circuit.rs +++ b/crates/circuits/chunk-circuit/src/circuit.rs @@ -1,11 +1,11 @@ use openvm::init; -use scroll_zkvm_types_chunk::ChunkWitness; +use scroll_zkvm_types_chunk::scroll::ChunkWitness; use scroll_zkvm_types_circuit::{ Circuit, io::read_witnesses, public_inputs::{ Version, - chunk::{ChunkInfo, VersionedChunkInfo}, + scroll::chunk::{ChunkInfo, VersionedChunkInfo}, }, }; diff --git a/crates/integration/src/bin/chunk-scanner.rs b/crates/integration/src/bin/chunk-scanner.rs index 3135fcc9..971ce400 100644 --- a/crates/integration/src/bin/chunk-scanner.rs +++ b/crates/integration/src/bin/chunk-scanner.rs @@ -10,7 +10,7 @@ use scroll_zkvm_integration::{ ProverTester, testers::chunk::{ChunkProverTester, exec_chunk}, }; -use scroll_zkvm_types::{chunk::ChunkWitness, version}; +use scroll_zkvm_types::{scroll::chunk::ChunkWitness, version}; use std::collections::HashMap; use std::{fs::File, path::PathBuf, slice}; use url::Url; diff --git a/crates/integration/src/testers/batch.rs b/crates/integration/src/testers/batch.rs index cc923883..3b5e0bc3 100644 --- a/crates/integration/src/testers/batch.rs +++ b/crates/integration/src/testers/batch.rs @@ -1,8 +1,10 @@ use scroll_zkvm_types::{ - batch::{BatchHeader, BatchInfo, BatchWitness, LegacyBatchWitness, ReferenceHeader}, - chunk::ChunkInfo, proof::ProofEnum, public_inputs::{ForkName, Version}, + scroll::{ + batch::{BatchHeader, BatchInfo, BatchWitness, LegacyBatchWitness, ReferenceHeader}, + chunk::ChunkInfo, + }, utils::serialize_vk, }; diff --git a/crates/integration/src/testers/bundle.rs b/crates/integration/src/testers/bundle.rs index c957410b..67bb9bf3 100644 --- a/crates/integration/src/testers/bundle.rs +++ b/crates/integration/src/testers/bundle.rs @@ -1,8 +1,10 @@ use scroll_zkvm_types::{ - batch::BatchInfo, - bundle::{BundleInfo, BundleWitness, LegacyBundleWitness}, proof::ProofEnum, public_inputs::ForkName, + scroll::{ + batch::BatchInfo, + bundle::{BundleInfo, BundleWitness, LegacyBundleWitness}, + }, }; // Only related to hardcoded commitments. Can be refactored later. diff --git a/crates/integration/src/testers/chunk.rs b/crates/integration/src/testers/chunk.rs index df84b6e2..e0e34170 100644 --- a/crates/integration/src/testers/chunk.rs +++ b/crates/integration/src/testers/chunk.rs @@ -8,11 +8,12 @@ use sbv_core::BlockWitness; use sbv_primitives::{B256, types::consensus::TxL1Message}; use scroll_zkvm_prover::utils::read_json; use scroll_zkvm_prover::utils::vm::ExecutionResult; -use scroll_zkvm_types::chunk::ChunkWitnessUpgradeCompact; use scroll_zkvm_types::{ - chunk::{ChunkInfo, ChunkWitness, LegacyChunkWitness, SecretKey}, proof::ProofEnum, public_inputs::{ForkName, Version}, + scroll::chunk::{ + ChunkInfo, ChunkWitness, ChunkWitnessUpgradeCompact, LegacyChunkWitness, SecretKey, + }, }; use std::{ fs::File, diff --git a/crates/integration/src/utils/mod.rs b/crates/integration/src/utils/mod.rs index a5745ec6..edb72841 100644 --- a/crates/integration/src/utils/mod.rs +++ b/crates/integration/src/utils/mod.rs @@ -3,15 +3,16 @@ use bytesize::ByteSize; use sbv_core::BlockWitness; use sbv_primitives::types::consensus::ScrollTransaction; use sbv_primitives::{B256, types::eips::Encodable2718}; -use scroll_zkvm_types::batch::{N_BLOB_BYTES, build_point_eval_witness}; use scroll_zkvm_types::{ - batch::{ - BatchHeader, BatchHeaderV6, BatchHeaderV7, BatchHeaderValidium, BatchHeaderValidiumV1, - BatchInfo, BatchWitness, ReferenceHeader, - }, - bundle::{BundleInfo, BundleWitness}, - chunk::{ChunkInfo, ChunkWitness}, public_inputs::{ForkName, MultiVersionPublicInputs}, + scroll::{ + batch::{ + BatchHeader, BatchHeaderV6, BatchHeaderV7, BatchHeaderValidium, BatchHeaderValidiumV1, + BatchInfo, BatchWitness, N_BLOB_BYTES, ReferenceHeader, build_point_eval_witness, + }, + bundle::{BundleInfo, BundleWitness}, + chunk::{ChunkInfo, ChunkWitness}, + }, types_agg::AggregationInput, utils::{keccak256, point_eval, serialize_vk}, }; @@ -299,7 +300,7 @@ pub fn build_batch_witnesses( }) } ForkName::EuclidV2 | ForkName::Feynman | ForkName::Galileo | ForkName::GalileoV2 => { - use scroll_zkvm_types::batch::BatchHeaderV7; + use scroll_zkvm_types::scroll::batch::BatchHeaderV7; ReferenceHeader::V7_V8_V9(BatchHeaderV7 { version: last_header.version, batch_index: last_header.batch_index + 1, @@ -412,7 +413,7 @@ pub fn build_batch_witnesses_validium( #[test] fn test_build_and_parse_batch_task() -> eyre::Result<()> { use crate::testers::chunk::ChunkTaskGenerator; - use scroll_zkvm_types::batch::{self, Envelope, Payload}; + use scroll_zkvm_types::scroll::batch::{self, Envelope, Payload}; let witness = match testing_hardfork() { ForkName::EuclidV2 => ChunkTaskGenerator { diff --git a/crates/integration/tests/bundle_circuit.rs b/crates/integration/tests/bundle_circuit.rs index a0e3caba..b829da53 100644 --- a/crates/integration/tests/bundle_circuit.rs +++ b/crates/integration/tests/bundle_circuit.rs @@ -11,9 +11,10 @@ use scroll_zkvm_integration::{ utils::metadata_from_bundle_witnesses, }; use scroll_zkvm_prover::{Prover, ProverConfig}; +use scroll_zkvm_types::version::Version; use scroll_zkvm_types::{ proof::OpenVmEvmProof, - public_inputs::{ForkName, MultiVersionPublicInputs}, + public_inputs::{ForkName, MultiVersionPublicInputs, PublicInputs}, }; use std::str::FromStr; @@ -84,7 +85,7 @@ fn setup_prove_verify_local_task() -> eyre::Result<()> { #[test] fn verify_bundle_info_pi() { - use scroll_zkvm_types::bundle::BundleInfo; + use scroll_zkvm_types::scroll::bundle::BundleInfo; let info = BundleInfo { chain_id: 534352, @@ -114,7 +115,7 @@ fn verify_bundle_info_pi() { }; assert_eq!( - info.pi_hash_euclidv1(), + (info, Version::euclid_v1()).pi_hash(), B256::from_str("0x5e49fc59ce02b42a2f693c738c582b36bd08e9cfe3acb8cee299216743869bd4") .unwrap() ); diff --git a/crates/integration/tests/chunk_circuit.rs b/crates/integration/tests/chunk_circuit.rs index 0646bc4d..0e11162d 100644 --- a/crates/integration/tests/chunk_circuit.rs +++ b/crates/integration/tests/chunk_circuit.rs @@ -14,8 +14,8 @@ use scroll_zkvm_integration::{ utils::metadata_from_chunk_witnesses, }; use scroll_zkvm_prover::utils::read_json; -use scroll_zkvm_types::chunk::{ChunkWitness, SecretKey}; use scroll_zkvm_types::public_inputs::Version; +use scroll_zkvm_types::scroll::chunk::{ChunkWitness, SecretKey}; use std::env; use std::path::Path; diff --git a/crates/types/base/src/public_inputs.rs b/crates/types/base/src/public_inputs.rs index d60d71a3..bd0f168e 100644 --- a/crates/types/base/src/public_inputs.rs +++ b/crates/types/base/src/public_inputs.rs @@ -1,16 +1,20 @@ +use crate::utils::keccak256; use alloy_primitives::B256; -pub mod batch; -pub mod bundle; -pub mod chunk; +pub mod scroll; pub use crate::{fork_name::ForkName, version::Version}; /// Defines behaviour to be implemented by types representing the public-input values of a circuit. pub trait PublicInputs { + /// Public inputs encoded. + fn pi(&self) -> Vec; + /// Keccak-256 digest of the public inputs. The public-input hash are revealed as public values /// via [`openvm::io::reveal`]. - fn pi_hash(&self) -> B256; + fn pi_hash(&self) -> B256 { + keccak256(self.pi()) + } /// Validation logic between public inputs of two contiguous instances. fn validate(&self, prev_pi: &Self); @@ -18,13 +22,18 @@ pub trait PublicInputs { /// helper trait to extend PublicInputs pub trait MultiVersionPublicInputs { - fn pi_hash_by_version(&self, version: Version) -> B256; + /// Public inputs encoded for a specific version. + fn pi_by_version(&self, version: Version) -> Vec; + /// Keccak-256 digest of the public inputs for a specific version. + fn pi_hash_by_version(&self, version: Version) -> B256 { + keccak256(self.pi_by_version(version)) + } fn validate(&self, prev_pi: &Self, version: Version); } impl PublicInputs for (T, Version) { - fn pi_hash(&self) -> B256 { - self.0.pi_hash_by_version(self.1) + fn pi(&self) -> Vec { + self.0.pi_by_version(self.1) } fn validate(&self, prev_pi: &Self) { diff --git a/crates/types/base/src/public_inputs/scroll.rs b/crates/types/base/src/public_inputs/scroll.rs new file mode 100644 index 00000000..988b7407 --- /dev/null +++ b/crates/types/base/src/public_inputs/scroll.rs @@ -0,0 +1,3 @@ +pub mod batch; +pub mod bundle; +pub mod chunk; diff --git a/crates/types/base/src/public_inputs/batch.rs b/crates/types/base/src/public_inputs/scroll/batch.rs similarity index 58% rename from crates/types/base/src/public_inputs/batch.rs rename to crates/types/base/src/public_inputs/scroll/batch.rs index 307e9d98..74f8ddd2 100644 --- a/crates/types/base/src/public_inputs/batch.rs +++ b/crates/types/base/src/public_inputs/scroll/batch.rs @@ -2,7 +2,6 @@ use alloy_primitives::B256; use crate::{ public_inputs::{ForkName, MultiVersionPublicInputs}, - utils::keccak256, version::{Domain, STFVersion, Version}, }; @@ -48,9 +47,9 @@ pub struct BatchInfo { } impl BatchInfo { - /// Public input hash for a batch (euclidv1 or da-codec@v6) is defined as + /// Public inputs encoded for a batch (euclidv1 or da-codec@v6) is defined as /// - /// keccak( + /// concat( /// parent state root || /// parent batch hash || /// state root || @@ -58,23 +57,21 @@ impl BatchInfo { /// chain id || /// withdraw root || /// ) - fn pi_hash_euclidv1(&self) -> B256 { - keccak256( - std::iter::empty() - .chain(self.parent_state_root.as_slice()) - .chain(self.parent_batch_hash.as_slice()) - .chain(self.state_root.as_slice()) - .chain(self.batch_hash.as_slice()) - .chain(self.chain_id.to_be_bytes().as_slice()) - .chain(self.withdraw_root.as_slice()) - .cloned() - .collect::>(), - ) + fn pi_euclidv1(&self) -> Vec { + std::iter::empty() + .chain(self.parent_state_root.as_slice()) + .chain(self.parent_batch_hash.as_slice()) + .chain(self.state_root.as_slice()) + .chain(self.batch_hash.as_slice()) + .chain(self.chain_id.to_be_bytes().as_slice()) + .chain(self.withdraw_root.as_slice()) + .copied() + .collect() } - /// Public input hash for a batch (euclidv2 or da-codec@v7) is defined as + /// Public inputs encoded for a batch (euclidv2 or da-codec@v7) is defined as /// - /// keccak( + /// concat( /// parent state root || /// parent batch hash || /// state root || @@ -84,32 +81,30 @@ impl BatchInfo { /// prev msg queue hash || /// post msg queue hash /// ) - fn pi_hash_euclidv2(&self) -> B256 { - keccak256( - std::iter::empty() - .chain(self.parent_state_root.as_slice()) - .chain(self.parent_batch_hash.as_slice()) - .chain(self.state_root.as_slice()) - .chain(self.batch_hash.as_slice()) - .chain(self.chain_id.to_be_bytes().as_slice()) - .chain(self.withdraw_root.as_slice()) - .chain(self.prev_msg_queue_hash.as_slice()) - .chain(self.post_msg_queue_hash.as_slice()) - .cloned() - .collect::>(), - ) + fn pi_euclidv2(&self) -> Vec { + std::iter::empty() + .chain(self.parent_state_root.as_slice()) + .chain(self.parent_batch_hash.as_slice()) + .chain(self.state_root.as_slice()) + .chain(self.batch_hash.as_slice()) + .chain(self.chain_id.to_be_bytes().as_slice()) + .chain(self.withdraw_root.as_slice()) + .chain(self.prev_msg_queue_hash.as_slice()) + .chain(self.post_msg_queue_hash.as_slice()) + .copied() + .collect() } - /// Public input hash for a batch (feynman or da-codec@v8). + /// Public inputs encoded for a batch (feynman or da-codec@v8). /// /// Unchanged from euclid-v2. - fn pi_hash_feynman(&self) -> B256 { - self.pi_hash_euclidv2() + fn pi_feynman(&self) -> Vec { + self.pi_euclidv2() } - /// Public input hash for a batch (galileo or da-codec@v9) is defined as + /// Public inputs encoded for a batch (galileo or da-codec@v9) is defined as /// - /// keccak( + /// concat( /// version || /// parent state root || /// parent batch hash || @@ -120,33 +115,31 @@ impl BatchInfo { /// prev msg queue hash || /// post msg queue hash /// ) - fn pi_hash_galileo(&self, version: Version) -> B256 { - keccak256( - std::iter::empty() - .chain(&[version.as_version_byte()]) - .chain(self.parent_state_root.as_slice()) - .chain(self.parent_batch_hash.as_slice()) - .chain(self.state_root.as_slice()) - .chain(self.batch_hash.as_slice()) - .chain(self.chain_id.to_be_bytes().as_slice()) - .chain(self.withdraw_root.as_slice()) - .chain(self.prev_msg_queue_hash.as_slice()) - .chain(self.post_msg_queue_hash.as_slice()) - .cloned() - .collect::>(), - ) + fn pi_galileo(&self, version: Version) -> Vec { + std::iter::empty() + .chain(&[version.as_version_byte()]) + .chain(self.parent_state_root.as_slice()) + .chain(self.parent_batch_hash.as_slice()) + .chain(self.state_root.as_slice()) + .chain(self.batch_hash.as_slice()) + .chain(self.chain_id.to_be_bytes().as_slice()) + .chain(self.withdraw_root.as_slice()) + .chain(self.prev_msg_queue_hash.as_slice()) + .chain(self.post_msg_queue_hash.as_slice()) + .copied() + .collect() } - /// Public input hash for a batch (galileo or da-codec@v9) is defined as + /// Public inputs encoded for a batch (galileo or da-codec@v9) is defined as /// /// Same as galileo. - pub fn pi_hash_galileo_v2(&self, version: Version) -> B256 { - self.pi_hash_galileo(version) + pub fn pi_galileo_v2(&self, version: Version) -> Vec { + self.pi_galileo(version) } - /// Public input hash for a L3 validium @ v1. + /// Public inputs encoded for a L3 validium @ v1. /// - /// keccak( + /// concat( /// version || /// parent state root || /// parent batch hash || @@ -158,36 +151,34 @@ impl BatchInfo { /// post msg queue hash /// encryption key /// ) - fn pi_hash_validium(&self, version: Version) -> B256 { - keccak256( - std::iter::empty() - .chain(&[version.as_version_byte()]) - .chain(self.parent_state_root.as_slice()) - .chain(self.parent_batch_hash.as_slice()) - .chain(self.state_root.as_slice()) - .chain(self.batch_hash.as_slice()) - .chain(self.chain_id.to_be_bytes().as_slice()) - .chain(self.withdraw_root.as_slice()) - .chain(self.prev_msg_queue_hash.as_slice()) - .chain(self.post_msg_queue_hash.as_slice()) - .chain(self.encryption_key.as_ref().expect("domain=Validium")) - .cloned() - .collect::>(), - ) + fn pi_validium(&self, version: Version) -> Vec { + std::iter::empty() + .chain(&[version.as_version_byte()]) + .chain(self.parent_state_root.as_slice()) + .chain(self.parent_batch_hash.as_slice()) + .chain(self.state_root.as_slice()) + .chain(self.batch_hash.as_slice()) + .chain(self.chain_id.to_be_bytes().as_slice()) + .chain(self.withdraw_root.as_slice()) + .chain(self.prev_msg_queue_hash.as_slice()) + .chain(self.post_msg_queue_hash.as_slice()) + .chain(self.encryption_key.as_ref().expect("domain=Validium")) + .copied() + .collect() } } pub type VersionedBatchInfo = (BatchInfo, Version); impl MultiVersionPublicInputs for BatchInfo { - fn pi_hash_by_version(&self, version: Version) -> B256 { + fn pi_by_version(&self, version: Version) -> Vec { match (version.domain, version.stf_version) { - (Domain::Scroll, STFVersion::V6) => self.pi_hash_euclidv1(), - (Domain::Scroll, STFVersion::V7) => self.pi_hash_euclidv2(), - (Domain::Scroll, STFVersion::V8) => self.pi_hash_feynman(), - (Domain::Scroll, STFVersion::V9) => self.pi_hash_galileo(version), - (Domain::Scroll, STFVersion::V10) => self.pi_hash_galileo_v2(version), - (Domain::Validium, STFVersion::V1) => self.pi_hash_validium(version), + (Domain::Scroll, STFVersion::V6) => self.pi_euclidv1(), + (Domain::Scroll, STFVersion::V7) => self.pi_euclidv2(), + (Domain::Scroll, STFVersion::V8) => self.pi_feynman(), + (Domain::Scroll, STFVersion::V9) => self.pi_galileo(version), + (Domain::Scroll, STFVersion::V10) => self.pi_galileo_v2(version), + (Domain::Validium, STFVersion::V1) => self.pi_validium(version), (domain, stf_version) => { unreachable!("unsupported version=({domain:?}, {stf_version:?})") } diff --git a/crates/types/base/src/public_inputs/bundle.rs b/crates/types/base/src/public_inputs/scroll/bundle.rs similarity index 71% rename from crates/types/base/src/public_inputs/bundle.rs rename to crates/types/base/src/public_inputs/scroll/bundle.rs index 1d1d8909..6ff6f3c1 100644 --- a/crates/types/base/src/public_inputs/bundle.rs +++ b/crates/types/base/src/public_inputs/scroll/bundle.rs @@ -2,7 +2,6 @@ use alloy_primitives::B256; use crate::{ public_inputs::MultiVersionPublicInputs, - utils::keccak256, version::{Domain, STFVersion, Version}, }; @@ -38,9 +37,9 @@ pub struct BundleInfo { } impl BundleInfo { - /// Public input hash for a bundle (euclidv1 or da-codec@v6) is defined as + /// Public inputs encoded for a bundle (euclidv1 or da-codec@v6) is defined as /// - /// keccak( + /// concat( /// chain id || /// num batches || /// prev state root || @@ -49,22 +48,20 @@ impl BundleInfo { /// batch hash || /// withdraw root /// ) - pub fn pi_hash_euclidv1(&self) -> B256 { - keccak256( - std::iter::empty() - .chain(self.chain_id.to_be_bytes().as_slice()) - .chain(self.num_batches.to_be_bytes().as_slice()) - .chain(self.prev_state_root.as_slice()) - .chain(self.prev_batch_hash.as_slice()) - .chain(self.post_state_root.as_slice()) - .chain(self.batch_hash.as_slice()) - .chain(self.withdraw_root.as_slice()) - .cloned() - .collect::>(), - ) + pub fn pi_euclidv1(&self) -> Vec { + std::iter::empty() + .chain(self.chain_id.to_be_bytes().as_slice()) + .chain(self.num_batches.to_be_bytes().as_slice()) + .chain(self.prev_state_root.as_slice()) + .chain(self.prev_batch_hash.as_slice()) + .chain(self.post_state_root.as_slice()) + .chain(self.batch_hash.as_slice()) + .chain(self.withdraw_root.as_slice()) + .copied() + .collect() } - /// Public input for a bundle (euclidv2 or da-codec@v7) is defined as + /// Public inputs encoded for a bundle (euclidv2 or da-codec@v7) is defined as /// /// concat( /// chain id || @@ -86,14 +83,10 @@ impl BundleInfo { .chain(self.post_state_root.as_slice()) .chain(self.batch_hash.as_slice()) .chain(self.withdraw_root.as_slice()) - .cloned() + .copied() .collect() } - pub fn pi_hash_euclidv2(&self) -> B256 { - keccak256(self.pi_euclidv2()) - } - pub fn pi_feynman(&self) -> Vec { self.pi_euclidv2() } @@ -106,17 +99,13 @@ impl BundleInfo { self.pi_euclidv2() } - pub fn pi_hash_versioned(&self, version: Version, pi: &[u8]) -> B256 { - keccak256( - std::iter::empty() - .chain( - B256::left_padding_from(version.as_version_byte().to_be_bytes().as_slice()) - .as_slice(), - ) - .chain(pi) - .cloned() - .collect::>(), - ) + pub fn pi_versioned(&self, version: Version, pi: impl IntoIterator) -> Vec { + std::iter::empty() + .chain(B256::left_padding_from( + version.as_version_byte().to_be_bytes().as_slice(), + )) + .chain(pi) + .collect() } pub fn pi_validium_v1(&self) -> Vec { @@ -131,22 +120,14 @@ impl BundleInfo { pub type VersionedBundleInfo = (BundleInfo, Version); impl MultiVersionPublicInputs for BundleInfo { - fn pi_hash_by_version(&self, version: Version) -> B256 { + fn pi_by_version(&self, version: Version) -> Vec { match (version.domain, version.stf_version) { - (Domain::Scroll, STFVersion::V6) => self.pi_hash_euclidv1(), - (Domain::Scroll, STFVersion::V7) => self.pi_hash_euclidv2(), - (Domain::Scroll, STFVersion::V8) => { - self.pi_hash_versioned(version, self.pi_feynman().as_slice()) - } - (Domain::Scroll, STFVersion::V9) => { - self.pi_hash_versioned(version, self.pi_galileo().as_slice()) - } - (Domain::Scroll, STFVersion::V10) => { - self.pi_hash_versioned(version, self.pi_galileo_v2().as_slice()) - } - (Domain::Validium, STFVersion::V1) => { - self.pi_hash_versioned(version, self.pi_validium_v1().as_slice()) - } + (Domain::Scroll, STFVersion::V6) => self.pi_euclidv1(), + (Domain::Scroll, STFVersion::V7) => self.pi_euclidv2(), + (Domain::Scroll, STFVersion::V8) => self.pi_versioned(version, self.pi_feynman()), + (Domain::Scroll, STFVersion::V9) => self.pi_versioned(version, self.pi_galileo()), + (Domain::Scroll, STFVersion::V10) => self.pi_versioned(version, self.pi_galileo_v2()), + (Domain::Validium, STFVersion::V1) => self.pi_versioned(version, self.pi_validium_v1()), (domain, stf_version) => { unreachable!("unsupported version=({domain:?}, {stf_version:?})") } diff --git a/crates/types/base/src/public_inputs/chunk.rs b/crates/types/base/src/public_inputs/scroll/chunk.rs similarity index 70% rename from crates/types/base/src/public_inputs/chunk.rs rename to crates/types/base/src/public_inputs/scroll/chunk.rs index c9a37036..4724e7a8 100644 --- a/crates/types/base/src/public_inputs/chunk.rs +++ b/crates/types/base/src/public_inputs/scroll/chunk.rs @@ -1,6 +1,5 @@ use crate::{ public_inputs::{ForkName, MultiVersionPublicInputs}, - utils::keccak256, version::{Domain, STFVersion, Version}, }; use alloy_primitives::{B256, U256}; @@ -212,9 +211,9 @@ impl From for LegacyChunkInfo { } impl ChunkInfo { - /// Public input hash for a given chunk (euclidv1 or da-codec@v6) is defined as + /// Public inputs encoded for a given chunk (euclidv1 or da-codec@v6) is defined as /// - /// keccak( + /// concat( /// chain id || /// prev state root || /// post state root || @@ -222,23 +221,21 @@ impl ChunkInfo { /// chunk data hash || /// tx data hash /// ) - pub fn pi_hash_euclidv1(&self) -> B256 { - keccak256( - std::iter::empty() - .chain(&self.chain_id.to_be_bytes()) - .chain(self.prev_state_root.as_slice()) - .chain(self.post_state_root.as_slice()) - .chain(self.withdraw_root.as_slice()) - .chain(self.data_hash.as_slice()) - .chain(self.tx_data_digest.as_slice()) - .cloned() - .collect::>(), - ) + pub fn pi_euclidv1(&self) -> Vec { + std::iter::empty() + .chain(&self.chain_id.to_be_bytes()) + .chain(self.prev_state_root.as_slice()) + .chain(self.post_state_root.as_slice()) + .chain(self.withdraw_root.as_slice()) + .chain(self.data_hash.as_slice()) + .chain(self.tx_data_digest.as_slice()) + .copied() + .collect() } - /// Public input hash for a given chunk (euclidv2 or da-codec@v7) is defined as + /// Public inputs encoded for a given chunk (euclidv2 or da-codec@v7) is defined as /// - /// keccak( + /// concat( /// chain id || /// prev state root || /// post state root || @@ -249,37 +246,35 @@ impl ChunkInfo { /// initial block number || /// block_ctx for block_ctx in block_ctxs /// ) - pub fn pi_hash_euclidv2(&self) -> B256 { - keccak256( - std::iter::empty() - .chain(&self.chain_id.to_be_bytes()) - .chain(self.prev_state_root.as_slice()) - .chain(self.post_state_root.as_slice()) - .chain(self.withdraw_root.as_slice()) - .chain(self.tx_data_digest.as_slice()) - .chain(self.prev_msg_queue_hash.as_slice()) - .chain(self.post_msg_queue_hash.as_slice()) - .chain(&self.initial_block_number.to_be_bytes()) - .chain( - self.block_ctxs - .iter() - .flat_map(|block_ctx| block_ctx.to_bytes()) - .collect::>() - .as_slice(), - ) - .cloned() - .collect::>(), - ) + pub fn pi_euclidv2(&self) -> Vec { + std::iter::empty() + .chain(&self.chain_id.to_be_bytes()) + .chain(self.prev_state_root.as_slice()) + .chain(self.post_state_root.as_slice()) + .chain(self.withdraw_root.as_slice()) + .chain(self.tx_data_digest.as_slice()) + .chain(self.prev_msg_queue_hash.as_slice()) + .chain(self.post_msg_queue_hash.as_slice()) + .chain(&self.initial_block_number.to_be_bytes()) + .chain( + self.block_ctxs + .iter() + .flat_map(|block_ctx| block_ctx.to_bytes()) + .collect::>() + .as_slice(), + ) + .copied() + .collect() } /// Feynman chunk public inputs are the same as EuclidV2. - pub fn pi_hash_feynman(&self) -> B256 { - self.pi_hash_euclidv2() + pub fn pi_feynman(&self) -> Vec { + self.pi_euclidv2() } - /// Public input hash for a given chunk (galileo or da-codec@v9) is defined as + /// Public inputs encoded for a given chunk (galileo or da-codec@v9) is defined as /// - /// keccak( + /// concat( /// version || /// chain id || /// prev state root || @@ -291,40 +286,38 @@ impl ChunkInfo { /// initial block number || /// block_ctx for block_ctx in block_ctxs /// ) - pub fn pi_hash_galileo(&self, version: Version) -> B256 { - keccak256( - std::iter::empty() - .chain(&[version.as_version_byte()]) - .chain(&self.chain_id.to_be_bytes()) - .chain(self.prev_state_root.as_slice()) - .chain(self.post_state_root.as_slice()) - .chain(self.withdraw_root.as_slice()) - .chain(self.tx_data_digest.as_slice()) - .chain(self.prev_msg_queue_hash.as_slice()) - .chain(self.post_msg_queue_hash.as_slice()) - .chain(&self.initial_block_number.to_be_bytes()) - .chain( - self.block_ctxs - .iter() - .flat_map(|block_ctx| block_ctx.to_bytes()) - .collect::>() - .as_slice(), - ) - .cloned() - .collect::>(), - ) + pub fn pi_galileo(&self, version: Version) -> Vec { + std::iter::empty() + .chain(&[version.as_version_byte()]) + .chain(&self.chain_id.to_be_bytes()) + .chain(self.prev_state_root.as_slice()) + .chain(self.post_state_root.as_slice()) + .chain(self.withdraw_root.as_slice()) + .chain(self.tx_data_digest.as_slice()) + .chain(self.prev_msg_queue_hash.as_slice()) + .chain(self.post_msg_queue_hash.as_slice()) + .chain(&self.initial_block_number.to_be_bytes()) + .chain( + self.block_ctxs + .iter() + .flat_map(|block_ctx| block_ctx.to_bytes()) + .collect::>() + .as_slice(), + ) + .copied() + .collect() } - /// Public input hash for a given chunk (galileo or da-codec@v9) is defined as + /// Public inputs encoded for a given chunk (galileo or da-codec@v9) is defined as /// /// The same as galileo. - pub fn pi_hash_galileo_v2(&self, version: Version) -> B256 { - self.pi_hash_galileo(version) + pub fn pi_galileo_v2(&self, version: Version) -> Vec { + self.pi_galileo(version) } - /// Public input hash for a given chunk for L3 validium @ v1: + /// Public inputs encoded for a given chunk for L3 validium @ v1: /// - /// keccak( + /// concat( /// version || /// chain id || /// prev state root || @@ -339,31 +332,29 @@ impl ChunkInfo { /// post blockhash || /// encryption key /// ) - pub fn pi_hash_validium(&self, version: Version) -> B256 { - keccak256( - std::iter::empty() - .chain(&[version.as_version_byte()]) - .chain(&self.chain_id.to_be_bytes()) - .chain(self.prev_state_root.as_slice()) - .chain(self.post_state_root.as_slice()) - .chain(self.withdraw_root.as_slice()) - .chain(self.tx_data_digest.as_slice()) - .chain(self.prev_msg_queue_hash.as_slice()) - .chain(self.post_msg_queue_hash.as_slice()) - .chain(&self.initial_block_number.to_be_bytes()) - .chain( - self.block_ctxs - .iter() - .flat_map(|block_ctx| block_ctx.to_bytes()) - .collect::>() - .as_slice(), - ) - .chain(self.prev_blockhash.as_slice()) - .chain(self.post_blockhash.as_slice()) - .chain(self.encryption_key.as_ref().expect("domain=Validium")) - .cloned() - .collect::>(), - ) + pub fn pi_validium(&self, version: Version) -> Vec { + std::iter::empty() + .chain(&[version.as_version_byte()]) + .chain(&self.chain_id.to_be_bytes()) + .chain(self.prev_state_root.as_slice()) + .chain(self.post_state_root.as_slice()) + .chain(self.withdraw_root.as_slice()) + .chain(self.tx_data_digest.as_slice()) + .chain(self.prev_msg_queue_hash.as_slice()) + .chain(self.post_msg_queue_hash.as_slice()) + .chain(&self.initial_block_number.to_be_bytes()) + .chain( + self.block_ctxs + .iter() + .flat_map(|block_ctx| block_ctx.to_bytes()) + .collect::>() + .as_slice(), + ) + .chain(self.prev_blockhash.as_slice()) + .chain(self.post_blockhash.as_slice()) + .chain(self.encryption_key.as_ref().expect("domain=Validium")) + .copied() + .collect() } } @@ -371,17 +362,17 @@ pub type VersionedChunkInfo = (ChunkInfo, Version); impl MultiVersionPublicInputs for ChunkInfo { /// Compute the public input hash for the chunk given the version tuple. - fn pi_hash_by_version(&self, version: Version) -> B256 { + fn pi_by_version(&self, version: Version) -> Vec { match (version.domain, version.stf_version) { (Domain::Scroll, STFVersion::V6) => { assert_ne!(self.data_hash, B256::ZERO, "v6 must have valid data_hash"); - self.pi_hash_euclidv1() + self.pi_euclidv1() } - (Domain::Scroll, STFVersion::V7) => self.pi_hash_euclidv2(), - (Domain::Scroll, STFVersion::V8) => self.pi_hash_feynman(), - (Domain::Scroll, STFVersion::V9) => self.pi_hash_galileo(version), - (Domain::Scroll, STFVersion::V10) => self.pi_hash_galileo_v2(version), - (Domain::Validium, STFVersion::V1) => self.pi_hash_validium(version), + (Domain::Scroll, STFVersion::V7) => self.pi_euclidv2(), + (Domain::Scroll, STFVersion::V8) => self.pi_feynman(), + (Domain::Scroll, STFVersion::V9) => self.pi_galileo(version), + (Domain::Scroll, STFVersion::V10) => self.pi_galileo_v2(version), + (Domain::Validium, STFVersion::V1) => self.pi_validium(version), (domain, stf_version) => { unreachable!("unsupported version=({domain:?}, {stf_version:?})") } diff --git a/crates/types/batch/src/builder/mod.rs b/crates/types/batch/src/builder/mod.rs index b575968c..d4b976a6 100644 --- a/crates/types/batch/src/builder/mod.rs +++ b/crates/types/batch/src/builder/mod.rs @@ -6,7 +6,7 @@ pub use v7::BatchInfoBuilderV7; pub mod validium; -use types_base::public_inputs::{batch::BatchInfo, chunk::ChunkInfo}; +use types_base::public_inputs::scroll::{batch::BatchInfo, chunk::ChunkInfo}; use crate::{BatchHeader, BatchHeaderV6, BatchHeaderV7, PointEvalWitness, payload::Payload}; diff --git a/crates/types/batch/src/builder/v6.rs b/crates/types/batch/src/builder/v6.rs index 3c59c3cd..becf0222 100644 --- a/crates/types/batch/src/builder/v6.rs +++ b/crates/types/batch/src/builder/v6.rs @@ -1,5 +1,5 @@ use alloy_primitives::B256; -use types_base::public_inputs::batch::BatchInfo; +use types_base::public_inputs::scroll::batch::BatchInfo; use crate::{ BatchHeader, PayloadV6, diff --git a/crates/types/batch/src/builder/v7.rs b/crates/types/batch/src/builder/v7.rs index adf1afc5..b2e69930 100644 --- a/crates/types/batch/src/builder/v7.rs +++ b/crates/types/batch/src/builder/v7.rs @@ -1,7 +1,7 @@ use std::marker::PhantomData; use alloy_primitives::B256; -use types_base::public_inputs::batch::BatchInfo; +use types_base::public_inputs::scroll::batch::BatchInfo; use types_base::version::Version; use crate::PointEvalWitness; diff --git a/crates/types/batch/src/builder/validium.rs b/crates/types/batch/src/builder/validium.rs index f3de0a48..8547016f 100644 --- a/crates/types/batch/src/builder/validium.rs +++ b/crates/types/batch/src/builder/validium.rs @@ -1,5 +1,5 @@ use types_base::{ - public_inputs::{batch::BatchInfo, chunk::ChunkInfo}, + public_inputs::scroll::{batch::BatchInfo, chunk::ChunkInfo}, version::Version, }; diff --git a/crates/types/batch/src/payload/mod.rs b/crates/types/batch/src/payload/mod.rs index 53e5d525..9e258e69 100644 --- a/crates/types/batch/src/payload/mod.rs +++ b/crates/types/batch/src/payload/mod.rs @@ -1,5 +1,5 @@ use alloy_primitives::B256; -use types_base::public_inputs::chunk::ChunkInfo; +use types_base::public_inputs::scroll::chunk::ChunkInfo; use crate::BatchHeader; diff --git a/crates/types/batch/src/payload/v6.rs b/crates/types/batch/src/payload/v6.rs index f3c882f3..0a3ad2f1 100644 --- a/crates/types/batch/src/payload/v6.rs +++ b/crates/types/batch/src/payload/v6.rs @@ -1,6 +1,6 @@ use alloy_primitives::B256; use itertools::Itertools; -use types_base::{public_inputs::chunk::ChunkInfo, utils::keccak256}; +use types_base::{public_inputs::scroll::chunk::ChunkInfo, utils::keccak256}; use crate::BatchHeaderV6; diff --git a/crates/types/batch/src/payload/v7.rs b/crates/types/batch/src/payload/v7.rs index 71652b95..80c78d6c 100644 --- a/crates/types/batch/src/payload/v7.rs +++ b/crates/types/batch/src/payload/v7.rs @@ -1,6 +1,6 @@ use alloy_primitives::B256; use types_base::{ - public_inputs::chunk::{BlockContextV2, ChunkInfo, SIZE_BLOCK_CTX}, + public_inputs::scroll::chunk::{BlockContextV2, ChunkInfo, SIZE_BLOCK_CTX}, utils::keccak256, }; diff --git a/crates/types/batch/src/witness.rs b/crates/types/batch/src/witness.rs index e8096df0..5ae4def7 100644 --- a/crates/types/batch/src/witness.rs +++ b/crates/types/batch/src/witness.rs @@ -3,8 +3,10 @@ use types_base::{ aggregation::{AggregationInput, ProofCarryingWitness}, public_inputs::{ ForkName, - batch::BatchInfo, - chunk::{ChunkInfo, LegacyChunkInfo}, + scroll::{ + batch::BatchInfo, + chunk::{ChunkInfo, LegacyChunkInfo}, + }, }, }; diff --git a/crates/types/bundle/src/witness.rs b/crates/types/bundle/src/witness.rs index 71417ac6..b731e1eb 100644 --- a/crates/types/bundle/src/witness.rs +++ b/crates/types/bundle/src/witness.rs @@ -1,7 +1,7 @@ use types_base::{ aggregation::{AggregationInput, ProofCarryingWitness}, fork_name::ForkName, - public_inputs::{ + public_inputs::scroll::{ batch::{BatchInfo, LegacyBatchInfo}, bundle::BundleInfo, }, diff --git a/crates/types/chunk/src/ethereum/execute.rs b/crates/types/chunk/src/ethereum/execute.rs index baf34f03..b984c528 100644 --- a/crates/types/chunk/src/ethereum/execute.rs +++ b/crates/types/chunk/src/ethereum/execute.rs @@ -1,4 +1,4 @@ -use crate::ChunkWitness; +use super::ChunkWitness; use sbv_core::verifier; use sbv_primitives::chainspec::{Chain, get_chain_spec}; diff --git a/crates/types/chunk/src/lib.rs b/crates/types/chunk/src/lib.rs index b47e7996..d65c2d33 100644 --- a/crates/types/chunk/src/lib.rs +++ b/crates/types/chunk/src/lib.rs @@ -1,13 +1,8 @@ mod crypto; pub use crypto::Crypto; -//pub use witness::{ChunkWitness, LegacyChunkWitness, ValidiumInputs}; #[cfg(feature = "scroll")] -mod scroll; -#[cfg(feature = "scroll")] -pub use scroll::*; +pub mod scroll; #[cfg(not(feature = "scroll"))] -mod ethereum; -#[cfg(not(feature = "scroll"))] -pub use ethereum::*; +pub mod ethereum; diff --git a/crates/types/chunk/src/scroll.rs b/crates/types/chunk/src/scroll.rs index 4e0ad631..443691e5 100644 --- a/crates/types/chunk/src/scroll.rs +++ b/crates/types/chunk/src/scroll.rs @@ -1,5 +1,5 @@ mod types; -pub use types::validium::SecretKey; +pub use types::{validium::SecretKey, relayMessageCall, finalizeDepositERC20Call, finalizeDepositERC20EncryptedCall}; mod execute; pub use execute::execute; diff --git a/crates/types/chunk/src/scroll/execute.rs b/crates/types/chunk/src/scroll/execute.rs index 7aeb9d00..f8ae3418 100644 --- a/crates/types/chunk/src/scroll/execute.rs +++ b/crates/types/chunk/src/scroll/execute.rs @@ -1,4 +1,4 @@ -use crate::{ChunkWitness, scroll::types::ChunkExt}; +use super::{ChunkWitness, types::ChunkExt}; use ecies::SecretKey; use sbv_core::verifier::{self, VerifyResult}; use sbv_helpers::manually_drop_on_zkvm; @@ -13,7 +13,7 @@ use sbv_primitives::{ }; use types_base::{ fork_name::ForkName, - public_inputs::chunk::{BlockContextV2, ChunkInfo}, + public_inputs::scroll::chunk::{BlockContextV2, ChunkInfo}, }; /// `compression_infos` can be `None` in host mode. diff --git a/crates/types/chunk/src/scroll/types.rs b/crates/types/chunk/src/scroll/types.rs index 63c7853c..c45f61c0 100644 --- a/crates/types/chunk/src/scroll/types.rs +++ b/crates/types/chunk/src/scroll/types.rs @@ -1,6 +1,6 @@ -use super::types::validium::SecretKey; -use super::witness::ValidiumInputs; +use super::{types::validium::SecretKey, witness::ValidiumInputs}; use alloy_primitives::keccak256; +use alloy_sol_types::sol; use itertools::Itertools; use sbv_helpers::manually_drop_on_zkvm; use sbv_primitives::{ @@ -15,6 +15,38 @@ use std::ops::Deref; pub mod validium; +sol! { + #[derive(Debug)] + function relayMessage( + address sender, + address target, + uint256 value, + uint256 messageNonce, + bytes message + ); + + #[derive(Debug)] + function finalizeDepositERC20( + address token, + address l2Token, + address from, + address to, + uint256 amount, + bytes l2Data + ); + + #[derive(Debug)] + function finalizeDepositERC20Encrypted( + address token, + address l2Token, + address from, + bytes to, + uint256 amount, + bytes l2Data + ); + +} + const LEGACY_DA_HEADER_LEN: usize = size_of::() // block number + size_of::() // timestamp + U256::BYTES // base fee per gas diff --git a/crates/types/chunk/src/scroll/types/validium.rs b/crates/types/chunk/src/scroll/types/validium.rs index 32b4e849..876ab9ae 100644 --- a/crates/types/chunk/src/scroll/types/validium.rs +++ b/crates/types/chunk/src/scroll/types/validium.rs @@ -1,43 +1,12 @@ #![allow(non_snake_case)] +use super::{finalizeDepositERC20Call, finalizeDepositERC20EncryptedCall, relayMessageCall}; use alloy_primitives::{Address, Bytes}; -use alloy_sol_types::{SolCall, sol}; +use alloy_sol_types::SolCall; use sbv_primitives::types::consensus::TxL1Message; pub use ecies::SecretKey; -sol! { - #[derive(Debug)] - function relayMessage( - address sender, - address target, - uint256 value, - uint256 messageNonce, - bytes message - ); - - #[derive(Debug)] - function finalizeDepositERC20( - address token, - address l2Token, - address from, - address to, - uint256 amount, - bytes l2Data - ); - - #[derive(Debug)] - function finalizeDepositERC20Encrypted( - address token, - address l2Token, - address from, - bytes to, - uint256 amount, - bytes l2Data - ); - -} - #[derive(Debug, thiserror::Error)] pub enum ValidiumError { #[error(transparent)] diff --git a/crates/types/chunk/src/scroll/witness.rs b/crates/types/chunk/src/scroll/witness.rs index dff158a5..e0851af4 100644 --- a/crates/types/chunk/src/scroll/witness.rs +++ b/crates/types/chunk/src/scroll/witness.rs @@ -6,7 +6,7 @@ use sbv_primitives::types::consensus::TxL1Message; use sbv_primitives::types::evm::ScrollTxCompressionInfos; use std::collections::HashSet; use types_base::version::Version; -use types_base::{fork_name::ForkName, public_inputs::chunk::ChunkInfo}; +use types_base::{fork_name::ForkName, public_inputs::scroll::chunk::ChunkInfo}; /// The witness type accepted by the chunk-circuit. #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] @@ -188,7 +188,7 @@ impl TryFrom for ChunkInfo { type Error = String; fn try_from(value: ChunkWitness) -> Result { - crate::execute(value) + super::execute(value) } } diff --git a/crates/types/src/lib.rs b/crates/types/src/lib.rs index 52ddbbfc..6abd706c 100644 --- a/crates/types/src/lib.rs +++ b/crates/types/src/lib.rs @@ -1,20 +1,22 @@ // re-export for a compatible interface with old circuit/types for prover -pub mod bundle { - pub use types_base::public_inputs::bundle::BundleInfo; - pub use types_bundle::*; -} - -pub mod batch { - pub use types_base::public_inputs::batch::{BatchInfo, VersionedBatchInfo}; - pub use types_batch::*; -} - -pub mod chunk { - pub use types_base::public_inputs::chunk::{ - BlockContextV2, ChunkInfo, SIZE_BLOCK_CTX, VersionedChunkInfo, - }; - pub use types_chunk::*; +pub mod scroll { + pub mod bundle { + pub use types_base::public_inputs::scroll::bundle::BundleInfo; + pub use types_bundle::*; + } + + pub mod batch { + pub use types_base::public_inputs::scroll::batch::{BatchInfo, VersionedBatchInfo}; + pub use types_batch::*; + } + + pub mod chunk { + pub use types_base::public_inputs::scroll::chunk::{ + BlockContextV2, ChunkInfo, SIZE_BLOCK_CTX, VersionedChunkInfo, + }; + pub use types_chunk::scroll::*; + } } pub use types_base::{aggregation as types_agg, public_inputs, version};