Skip to content

Commit 17027a8

Browse files
authored
dynamic handling of openvm1.3/1.4 (#219)
* fix * update * fix
1 parent 0d964cd commit 17027a8

File tree

12 files changed

+2058
-1501
lines changed

12 files changed

+2058
-1501
lines changed

Cargo.lock

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/build-guest/src/main.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ use openvm_sdk::{
5454
prover::AppProver,
5555
};
5656
use openvm_stark_sdk::p3_bn254_fr::Bn254Fr;
57+
use scroll_zkvm_types::zkvm::AGG_STARK_PROVING_KEY;
5758
use snark_verifier_sdk::snark_verifier::loader::evm::compile_solidity;
5859

5960
mod verifier;
@@ -311,11 +312,8 @@ fn generate_evm_verifier(
311312
let path_root_agg_pk = verifier_output_dir.join("root_verifier_vk");
312313

313314
if force_overwrite || !path_root_agg_pk.exists() {
314-
openvm_sdk::fs::write_object_to_file(
315-
&path_root_agg_pk,
316-
openvm_sdk::Sdk::riscv32().agg_pk().get_agg_vk(),
317-
)
318-
.expect("fail to write");
315+
openvm_sdk::fs::write_object_to_file(&path_root_agg_pk, AGG_STARK_PROVING_KEY.get_agg_vk())
316+
.expect("fail to write");
319317
}
320318

321319
// Check if files exist and skip if in auto mode

crates/build-guest/src/verifier.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,17 @@ pub fn generate_evm_verifier() -> Result<String> {
4848
}
4949

5050
pub fn download_evm_verifier() -> Result<String> {
51-
let verifier_url = "https://github.com/openvm-org/openvm-solidity-sdk/raw/refs/heads/main/src/v1.3/Halo2Verifier.sol";
51+
let openvm_version = "v1.4";
52+
let verifier_url = format!(
53+
"https://github.com/openvm-org/openvm-solidity-sdk/raw/refs/heads/main/src/{openvm_version}/Halo2Verifier.sol"
54+
);
5255
println!("{LOG_PREFIX} Downloading pre-built verifier from openvm-solidity-sdk...");
5356

5457
let output = std::process::Command::new("wget")
5558
.arg("-q")
5659
.arg("-O")
5760
.arg("-")
58-
.arg(verifier_url)
61+
.arg(&verifier_url)
5962
.output()?;
6063

6164
if !output.status.success() {

crates/integration/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ pub trait ProverTester {
180180
let config = scroll_zkvm_prover::ProverConfig {
181181
path_app_exe,
182182
path_app_config,
183+
is_openvm_v13: guest_version() == "0.5.2",
183184
..Default::default()
184185
};
185186
let prover = scroll_zkvm_prover::Prover::setup(config, Some(Self::NAME))?;

crates/prover/src/prover/mod.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ use openvm_native_circuit::NativeGpuBuilder as NativeBuilder;
1111
use openvm_circuit::arch::instructions::exe::VmExe;
1212
use openvm_sdk::{DefaultStarkEngine, config::SdkVmBuilder};
1313
use openvm_sdk::{F, Sdk, StdIn, prover::StarkProver};
14-
use scroll_zkvm_types::{proof::OpenVmEvmProof, types_agg::ProgramCommitment, utils::serialize_vk};
14+
use scroll_zkvm_types::{
15+
proof::OpenVmEvmProof, types_agg::ProgramCommitment, utils::serialize_vk,
16+
zkvm::AGG_STARK_PROVING_KEY_V13,
17+
};
1518
use scroll_zkvm_verifier::verifier::{AGG_STARK_PROVING_KEY, UniversalVerifier};
1619
use tracing::instrument;
1720

@@ -46,6 +49,8 @@ pub struct ProverConfig {
4649
pub path_app_config: PathBuf,
4750
/// The maximum length for a single OpenVM segment.
4851
pub segment_len: Option<usize>,
52+
/// Use v1.3 openvm
53+
pub is_openvm_v13: bool,
4954
}
5055

5156
const DEFAULT_SEGMENT_SIZE: usize = (1 << 22) - 1000;
@@ -81,9 +86,22 @@ impl Prover {
8186
segmentation_limits.max_trace_height = segment_len as u32;
8287
segmentation_limits.max_cells = 1_200_000_000_usize; // For 24G vram
8388

84-
let sdk = Sdk::new(app_config).expect("sdk init failed");
89+
let mut sdk = Sdk::new(app_config).expect("sdk init failed");
90+
91+
let verifier_k = if self.config.is_openvm_v13 { 24 } else { 23 };
92+
tracing::info!(
93+
"changing openvm_sdk.halo2_config.verifier_k from {} to {}",
94+
sdk.halo2_config().verifier_k,
95+
verifier_k
96+
);
97+
sdk.halo2_config_mut().verifier_k = verifier_k;
98+
8599
// 45s for first time
86-
let sdk = sdk.with_agg_pk(AGG_STARK_PROVING_KEY.clone());
100+
let sdk = sdk.with_agg_pk(if self.config.is_openvm_v13 {
101+
AGG_STARK_PROVING_KEY_V13.clone()
102+
} else {
103+
AGG_STARK_PROVING_KEY.clone()
104+
});
87105
Ok(sdk)
88106
})
89107
}

crates/types/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ openvm-native-recursion.workspace = true
1818
openvm-stark-sdk = { workspace = true, default-features = false }
1919

2020
alloy-primitives = { workspace = true, features = ["tiny-keccak"] }
21+
once_cell = "1.20"
2122
snark-verifier-sdk.workspace = true
2223
sbv-primitives.workspace = true
2324
serde.workspace = true

crates/types/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,5 @@ pub mod task;
2525
pub use task::ProvingTask;
2626

2727
pub mod utils;
28+
29+
pub mod zkvm;

crates/types/src/zkvm.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// This should be removed after we fully migrated to openvm 1.4 after protocol upgrade.
2+
use once_cell::sync::Lazy;
3+
use openvm_sdk::Sdk;
4+
use openvm_sdk::keygen::AggProvingKey;
5+
use std::sync::Arc;
6+
7+
mod openvm_private_patch {
8+
// copied from openvm/crates/sdk/src/keygen/perm.rs
9+
use std::cmp::Reverse;
10+
11+
/// Permutation of the AIR IDs to order them by forced trace heights.
12+
pub(crate) struct AirIdPermutation {
13+
pub perm: Vec<usize>,
14+
}
15+
16+
impl AirIdPermutation {
17+
pub fn compute(heights: &[u32]) -> AirIdPermutation {
18+
let mut height_with_air_id: Vec<_> = heights.iter().copied().enumerate().collect();
19+
height_with_air_id.sort_by_key(|(_, h)| Reverse(*h));
20+
AirIdPermutation {
21+
perm: height_with_air_id
22+
.into_iter()
23+
.map(|(a_id, _)| a_id)
24+
.collect(),
25+
}
26+
}
27+
/// arr[i] <- arr[perm[i]]
28+
pub(crate) fn permute<T>(&self, arr: &mut [T]) {
29+
debug_assert_eq!(arr.len(), self.perm.len());
30+
let mut perm = self.perm.clone();
31+
for i in 0..perm.len() {
32+
if perm[i] != i {
33+
let mut curr = i;
34+
loop {
35+
let target = perm[curr];
36+
perm[curr] = curr;
37+
if perm[target] == target {
38+
break;
39+
}
40+
arr.swap(curr, target);
41+
curr = target;
42+
}
43+
}
44+
}
45+
}
46+
}
47+
}
48+
49+
/// Proving key for STARK aggregation. Primarily used to aggregate
50+
/// [continuation proofs][openvm_sdk::prover::vm::ContinuationVmProof].
51+
pub static AGG_STARK_PROVING_KEY: Lazy<AggProvingKey> = Lazy::new(|| build_agg_pk(false));
52+
pub static AGG_STARK_PROVING_KEY_V13: Lazy<AggProvingKey> = Lazy::new(|| build_agg_pk(true));
53+
54+
fn build_agg_pk(legacy_v13: bool) -> AggProvingKey {
55+
let mut agg_pk = Sdk::riscv32().agg_pk().clone();
56+
if !legacy_v13 {
57+
// it is a bit confusing..
58+
// we plan to enable `feature = "legacy-v1-3-evm-verifier"`,
59+
// so here we need to mimic v14 behavior
60+
let root_air_perm =
61+
openvm_private_patch::AirIdPermutation::compute(&agg_pk.root_verifier_pk.air_heights);
62+
let vm_pk = Arc::get_mut(&mut agg_pk.root_verifier_pk.vm_pk).unwrap();
63+
for thc in &mut vm_pk.vm_pk.trace_height_constraints {
64+
root_air_perm.permute(&mut thc.coefficients);
65+
}
66+
}
67+
68+
agg_pk
69+
}

crates/verifier/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@ bincode_v1.workspace = true
1818
eyre.workspace = true
1919
serde.workspace = true
2020
serde_json.workspace = true
21+
sha256 = "1"
2122

2223
[dev-dependencies]

crates/verifier/src/verifier.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
1-
use once_cell::sync::Lazy;
21
use openvm_sdk::commit::AppExecutionCommit;
3-
use openvm_sdk::keygen::{AggProvingKey, AggVerifyingKey};
2+
use openvm_sdk::keygen::AggVerifyingKey;
43
use openvm_sdk::{Sdk, commit::CommitBytes};
54
use scroll_zkvm_types::proof::OpenVmEvmProof;
65
use scroll_zkvm_types::{proof::StarkProof, utils::serialize_vk};
76
use std::path::Path;
87

9-
/// Proving key for STARK aggregation. Primarily used to aggregate
10-
/// [continuation proofs][openvm_sdk::prover::vm::ContinuationVmProof].
11-
pub static AGG_STARK_PROVING_KEY: Lazy<AggProvingKey> =
12-
Lazy::new(|| Sdk::riscv32().agg_pk().clone());
8+
pub use scroll_zkvm_types::zkvm::{AGG_STARK_PROVING_KEY, AGG_STARK_PROVING_KEY_V13};
139

1410
pub struct UniversalVerifier {
1511
pub evm_verifier: Vec<u8>,
1612
pub loaded_agg_vk: AggVerifyingKey,
13+
pub is_openvm_v13: bool,
1714
}
1815

1916
impl UniversalVerifier {
@@ -51,16 +48,34 @@ impl UniversalVerifier {
5148
let path_verifier_code = path_verifier.as_ref().join("verifier.bin");
5249
let path_agg_vk = path_verifier.as_ref().join("root_verifier_vk");
5350
let evm_verifier = std::fs::read(path_verifier_code)?;
51+
52+
// TODO: clean this after we get rid of openvm v1.3.
53+
let is_openvm_v13 = {
54+
let hash = sha256::digest(&evm_verifier);
55+
// from 0.5.2 release files
56+
let is_openvm_v13 =
57+
hash == ("4f1b70db9fade2ce7425924dc662d75c5a315f3a611ed8cadd68b516407a4cf1");
58+
println!(
59+
"is_openvm_v13: {}, verifier.bin sha256sum: {}",
60+
is_openvm_v13, hash
61+
);
62+
is_openvm_v13
63+
};
5464
let loaded_agg_vk = openvm_sdk::fs::read_object_from_file(path_agg_vk).unwrap_or_else(
5565
|_|{
5666
tracing::warn!("root_Verifier_vk is not avaliable in disk, try to calculate it on-the-fly, which may be time consuming ...");
57-
AGG_STARK_PROVING_KEY.get_agg_vk()
67+
if is_openvm_v13 {
68+
AGG_STARK_PROVING_KEY_V13.get_agg_vk()
69+
} else {
70+
AGG_STARK_PROVING_KEY.get_agg_vk()
71+
}
5872
}
5973
);
6074

6175
Ok(Self {
6276
evm_verifier,
6377
loaded_agg_vk,
78+
is_openvm_v13,
6479
})
6580
}
6681

0 commit comments

Comments
 (0)