Skip to content

Commit 1283c3c

Browse files
committed
integration tests for chunk
1 parent e06e34c commit 1283c3c

File tree

4 files changed

+212
-62
lines changed

4 files changed

+212
-62
lines changed

common/libzkp/integration_test/src/lib.rs

Lines changed: 59 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
1-
use std::path::{Path, PathBuf};
2-
use scroll_zkvm_prover_euclid::{
3-
ProverConfig, Prover, ProverType,
4-
};
5-
use scroll_zkvm_types::task::ProvingTask;
61
use libzkp::{
7-
TaskType,
2+
proofs::{PersistableProof, ProofMetadata, WrappedProof},
83
tasks::ChunkInterpreter,
9-
proofs::{WrappedProof, ProofMetadata, PersistableProof},
4+
TaskType,
105
};
6+
use scroll_zkvm_prover_euclid::{Prover, ProverConfig, ProverType};
7+
use scroll_zkvm_types::task::ProvingTask;
8+
use serde::{Deserialize, Serialize};
9+
use std::path::{Path, PathBuf};
10+
use std::sync::OnceLock;
1111
use tracing::instrument;
1212
use tracing_subscriber::{fmt::format::FmtSpan, layer::SubscriberExt, util::SubscriberInitExt};
13-
use std::sync::OnceLock;
14-
use serde::{Deserialize, Serialize};
1513

1614
struct DummyInterpreter {}
17-
impl ChunkInterpreter for DummyInterpreter{}
15+
impl ChunkInterpreter for DummyInterpreter {}
1816

1917
pub mod specs;
2018
// pub mod testers;
@@ -41,7 +39,6 @@ const TEST_PHASE: &str = "euclidv2";
4139

4240
static LOGGER_INIT: OnceLock<eyre::Result<()>> = OnceLock::new();
4341

44-
4542
/// Every test run will write assets to a new directory.
4643
///
4744
/// Possibly one of the following:
@@ -56,7 +53,6 @@ pub struct ProverTester {
5653
}
5754

5855
impl ProverTester {
59-
6056
/// Setup test environment
6157
fn setup_logger() -> eyre::Result<()> {
6258
let fmt_layer = tracing_subscriber::fmt::layer()
@@ -89,7 +85,7 @@ impl ProverTester {
8985

9086
/// Setup directory structure for the test suite.
9187
pub fn setup(spec: &str) -> eyre::Result<Self> {
92-
if let Err(e) = LOGGER_INIT.get_or_init(||Self::setup_logger()){
88+
if let Err(e) = LOGGER_INIT.get_or_init(Self::setup_logger) {
9389
eyre::bail!("logger init fail: {e}");
9490
}
9591
let manifest_dir_str = std::env::var("CARGO_MANIFEST_DIR")?;
@@ -115,7 +111,7 @@ impl ProverTester {
115111
// TODO: enable setting from env
116112
let dir_workspace = manifest_dir.join("../../../zkvm-prover/.work");
117113

118-
Ok(ProverTester{
114+
Ok(ProverTester {
119115
dir_testrun,
120116
dir_workspace,
121117
dir_testdata: manifest_dir.join("testdata"),
@@ -146,11 +142,35 @@ impl ProverTester {
146142
})
147143
}
148144

145+
/// Simple test for executing task
146+
#[instrument(name = "execute_single", skip_all)]
147+
pub fn execute_single<Spec: ProvingTestSpec>(
148+
&self,
149+
task: Spec::ProvingTaskType,
150+
) -> eyre::Result<u64> {
151+
use scroll_zkvm_prover_euclid::task::ProvingTask as ProvingTaskT;
152+
153+
let cfg = self.config(&Spec::PHASE_SPEC.to_string())?;
154+
let prover = Prover::<Spec::ProverType>::setup(cfg)?;
155+
156+
let (_, _, utask_json) = libzkp::gen_universal_task(
157+
Spec::PHASE_SPEC as i32,
158+
&serde_json::to_string(&task)?,
159+
TEST_PHASE,
160+
None::<DummyInterpreter>,
161+
)?;
162+
163+
let u_task: ProvingTask = serde_json::from_str(&utask_json)?;
164+
let stdin = u_task.build_guest_input()?;
165+
166+
let cycles = prover.execute_and_check(&stdin, true)?;
167+
Ok(cycles)
168+
}
149169

150170
/// File descriptor for the proof saved to disc.
151171
#[instrument("fd_proof", skip_all, fields(task_id = task.identifier, path_proof))]
152172
fn fd_proof<Spec: ProvingTestSpec>(task: &ProvingTask) -> String {
153-
let path_proof = format!("{}-{}.json", Spec::PHASE_SPEC.to_string(), task.identifier);
173+
let path_proof = format!("{}-{}.json", Spec::PHASE_SPEC, task.identifier);
154174
path_proof
155175
}
156176

@@ -163,21 +183,27 @@ impl ProverTester {
163183
) -> eyre::Result<WrappedProof<Spec::MetadataType>>
164184
where
165185
WrappedProof<Spec::MetadataType>: for<'de> Deserialize<'de>,
166-
{
186+
{
167187
let (_, metadata_json, utask_json) = libzkp::gen_universal_task(
168-
Spec::PHASE_SPEC as i32,
169-
&serde_json::to_string(&task)?,
170-
TEST_PHASE,
188+
Spec::PHASE_SPEC as i32,
189+
&serde_json::to_string(&task)?,
190+
TEST_PHASE,
171191
None::<DummyInterpreter>,
172192
)?;
173193

174-
let u_task : ProvingTask = serde_json::from_str(&utask_json)?;
194+
let u_task: ProvingTask = serde_json::from_str(&utask_json)?;
175195

176196
// Try reading proof from cache if available, and early return in that case.
177-
let path_proof = prover.cache_dir.as_ref().expect("set in config").join(Self::fd_proof::<Spec>(&u_task));
197+
let path_proof = prover
198+
.cache_dir
199+
.as_ref()
200+
.expect("set in config")
201+
.join(Self::fd_proof::<Spec>(&u_task));
178202
tracing::debug!(name: "try_read_proof", ?path_proof);
179203

180-
if let Ok(proof) = <WrappedProof<Spec::MetadataType> as PersistableProof>::from_json(&path_proof){
204+
if let Ok(proof) =
205+
<WrappedProof<Spec::MetadataType> as PersistableProof>::from_json(&path_proof)
206+
{
181207
tracing::info!(name: "early_return_proof", ?path_proof);
182208
return Ok(proof);
183209
}
@@ -186,13 +212,11 @@ impl ProverTester {
186212
let proof = prover.gen_proof_universal(&u_task, with_snark)?;
187213
let vk = prover.get_app_vk();
188214

189-
let wrapped_proof_json = libzkp::gen_wrapped_proof(
190-
&serde_json::to_string(&proof)?,
191-
&metadata_json,
192-
&vk,
193-
)?;
215+
let wrapped_proof_json =
216+
libzkp::gen_wrapped_proof(&serde_json::to_string(&proof)?, &metadata_json, &vk)?;
194217

195-
let wrapped_proof : WrappedProof<Spec::MetadataType> = serde_json::from_str(&wrapped_proof_json)?;
218+
let wrapped_proof: WrappedProof<Spec::MetadataType> =
219+
serde_json::from_str(&wrapped_proof_json)?;
196220

197221
// dump proof
198222
tracing::debug!(name: "try_write_proof", ?path_proof);
@@ -202,7 +226,7 @@ impl ProverTester {
202226
}
203227

204228
/// Dump verifier staff to disk
205-
pub fn dump_verifier_staff<P: ProverType>(&self, spec: &str) -> eyre::Result<()>{
229+
pub fn dump_verifier_staff<P: ProverType>(&self, spec: &str) -> eyre::Result<()> {
206230
let cfg = self.config(spec)?;
207231
let prover = Prover::<P>::setup(cfg)?;
208232
prover.dump_universal_verifier(Some(self.dir_testrun.clone()))?;
@@ -213,7 +237,7 @@ impl ProverTester {
213237
/// End-to-end test for one or more proving tasks.
214238
pub fn prove_verify<Spec: ProvingTestSpec>(
215239
&self,
216-
tasks: impl Iterator<Item = Spec::ProvingTaskType>,
240+
tasks: impl IntoIterator<Item = Spec::ProvingTaskType>,
217241
) -> eyre::Result<Vec<WrappedProof<Spec::MetadataType>>>
218242
where
219243
WrappedProof<Spec::MetadataType>: for<'de> Deserialize<'de>,
@@ -237,7 +261,6 @@ impl ProverTester {
237261
Ok(out)
238262
}
239263

240-
241264
/// End-to-end test for a single proving task to generate an EVM-verifiable SNARK proof.
242265
pub fn prove_verify_single_evm<Spec: ProvingTestSpec>(
243266
&self,
@@ -251,16 +274,15 @@ impl ProverTester {
251274
let prover = Prover::<Spec::ProverType>::setup(cfg)?;
252275
let wrapped_proof = Self::prove_verify_single::<Spec>(&prover, task, true)?;
253276

254-
prover.dump_universal_verifier(None::<String>)?
277+
prover
278+
.dump_universal_verifier(None::<String>)?
255279
.verify_proof_evm(
256-
&wrapped_proof.proof.as_evm_proof().unwrap().clone().into(),
257-
&wrapped_proof.vk,
258-
)?;
280+
&wrapped_proof.proof.as_evm_proof().unwrap().clone().into(),
281+
&wrapped_proof.vk,
282+
)?;
259283

260284
Ok(wrapped_proof)
261285
}
262-
263-
264286
}
265287

266288
/// Spec for test phase (chunk/batch/bundle)
@@ -272,6 +294,4 @@ pub trait ProvingTestSpec {
272294

273295
//TODO: deprecated this spec later when the universal prover type is ready
274296
type ProverType: ProverType;
275-
276297
}
277-

common/libzkp/integration_test/src/specs.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,30 @@
11
use crate::ProvingTestSpec;
22
use libzkp::{
3+
proofs::{BatchProofMetadata, BundleProofMetadata, ChunkProofMetadata},
4+
tasks::{BatchProvingTask, BundleProvingTask, ChunkProvingTask},
35
TaskType,
4-
proofs::{ChunkProofMetadata, BatchProofMetadata, BundleProofMetadata},
5-
tasks::{ChunkProvingTask, BatchProvingTask, BundleProvingTask},
66
};
7-
use scroll_zkvm_prover_euclid::{ChunkProverType, BatchProverType, BundleProverTypeEuclidV2};
7+
use scroll_zkvm_prover_euclid::{BatchProverType, BundleProverTypeEuclidV2, ChunkProverType};
88

99
pub struct ChunkProverSpec;
1010
pub struct BatchProverSpec;
1111
pub struct BundleProverSpec;
1212

1313
impl ProvingTestSpec for ChunkProverSpec {
14-
1514
const PHASE_SPEC: TaskType = TaskType::Chunk;
1615
type MetadataType = ChunkProofMetadata;
1716
type ProvingTaskType = ChunkProvingTask;
1817
type ProverType = ChunkProverType;
1918
}
2019

21-
2220
impl ProvingTestSpec for BatchProverSpec {
23-
2421
const PHASE_SPEC: TaskType = TaskType::Batch;
2522
type MetadataType = BatchProofMetadata;
2623
type ProvingTaskType = BatchProvingTask;
2724
type ProverType = BatchProverType;
2825
}
2926

3027
impl ProvingTestSpec for BundleProverSpec {
31-
3228
const PHASE_SPEC: TaskType = TaskType::Bundle;
3329
type MetadataType = BundleProofMetadata;
3430
type ProvingTaskType = BundleProvingTask;

common/libzkp/integration_test/src/utils/mod.rs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,35 @@
11
use sbv_primitives::{
2+
types::{eips::Encodable2718, reth::TransactionSigned, BlockWitness, Transaction},
23
B256, U256,
3-
types::{BlockWitness, Transaction, eips::Encodable2718, reth::TransactionSigned},
44
};
55
use scroll_zkvm_prover_euclid::{
6-
ChunkProof,
76
task::{
87
batch::{BatchHeaderV, BatchProvingTask},
98
chunk::ChunkProvingTask,
109
},
1110
utils::point_eval,
11+
ChunkProof,
1212
};
1313
use scroll_zkvm_types::{
1414
batch::{BatchHeader, BatchHeaderV6, BatchHeaderV7},
1515
utils::keccak256,
1616
};
17+
use std::{fs::File, path::Path};
1718
use vm_zstd::zstd_encode;
1819

20+
/// Utility function to read and deserialize block witness given the block number.
21+
pub fn read_block_witness<P>(path_witness: P) -> eyre::Result<BlockWitness>
22+
where
23+
P: AsRef<Path>,
24+
{
25+
if !path_witness.as_ref().exists() {
26+
println!("File not found: {:?}", path_witness.as_ref());
27+
return Err(eyre::eyre!("File not found: {:?}", path_witness.as_ref()));
28+
}
29+
let witness = File::open(path_witness)?;
30+
Ok(serde_json::from_reader::<_, BlockWitness>(witness)?)
31+
}
32+
1933
fn is_l1_tx(tx: &Transaction) -> bool {
2034
// 0x7e is l1 tx
2135
tx.transaction_type == 0x7e
@@ -216,7 +230,6 @@ pub fn build_batch_task(
216230
let x = point_eval::get_x_from_challenge(challenge_digest);
217231
let (kzg_proof, z) = point_eval::get_kzg_proof(&kzg_blob, challenge_digest);
218232

219-
220233
let batch_header = {
221234
// avoid unused variant warning
222235
let _ = x + z;
@@ -248,13 +261,12 @@ fn test_build_and_parse_batch_task() -> eyre::Result<()> {
248261
let path_testdata = std::path::Path::new("testdata");
249262

250263
// read block witnesses.
251-
let paths_block_witnesses =
252-
[
253-
path_testdata.join("1.json"),
254-
path_testdata.join("2.json"),
255-
path_testdata.join("3.json"),
256-
path_testdata.join("4.json"),
257-
];
264+
let paths_block_witnesses = [
265+
path_testdata.join("1.json"),
266+
path_testdata.join("2.json"),
267+
path_testdata.join("3.json"),
268+
path_testdata.join("4.json"),
269+
];
258270
let read_block_witness = |path| Ok(read_json::<_, BlockWitness>(path)?);
259271
let chunk_task = ChunkProvingTask {
260272
block_witnesses: paths_block_witnesses
@@ -266,11 +278,7 @@ fn test_build_and_parse_batch_task() -> eyre::Result<()> {
266278
};
267279

268280
// read chunk proof.
269-
let path_chunk_proof = path_testdata
270-
.join("proofs")
271-
.join(
272-
"chunk-1-4.json"
273-
);
281+
let path_chunk_proof = path_testdata.join("proofs").join("chunk-1-4.json");
274282
let chunk_proof = read_json_deep::<_, ChunkProof>(&path_chunk_proof)?;
275283

276284
let task = build_batch_task(&[chunk_task], &[chunk_proof], Default::default());
@@ -283,7 +291,6 @@ fn test_build_and_parse_batch_task() -> eyre::Result<()> {
283291

284292
let enveloped = Envelope::from(task.blob_bytes.as_slice());
285293

286-
287294
let header = task.batch_header.must_v7_header();
288295
Payload::from(&enveloped).validate(header, &chunk_infos);
289296

0 commit comments

Comments
 (0)