Skip to content

Commit 7b2dd5c

Browse files
committed
Add integration test
1 parent 70a005c commit 7b2dd5c

File tree

12 files changed

+179
-16
lines changed

12 files changed

+179
-16
lines changed

Cargo.lock

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

crates/sdk/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ hex.workspace = true
5858
forge-fmt = { workspace = true, optional = true }
5959
rrs-lib = { workspace = true }
6060

61+
[dev-dependencies]
62+
openvm-rv32im-guest.workspace = true
63+
64+
6165
[features]
6266
default = ["parallel", "jemalloc", "evm-verify"]
6367
evm-prove = ["openvm-native-recursion/evm-prove"]

crates/sdk/examples/sdk_app.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
4646
/// use std::path::PathBuf;
4747
///
4848
/// let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf();
49-
/// path.push("guest");
49+
/// path.push("guest/fib");
5050
/// let target_path = path.to_str().unwrap();
5151
/// ```
5252
// ANCHOR: build

crates/sdk/examples/sdk_evm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
4646
/// use std::path::PathBuf;
4747
///
4848
/// let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf();
49-
/// path.push("guest");
49+
/// path.push("guest/fib");
5050
/// let target_path = path.to_str().unwrap();
5151
/// ```
5252
// ANCHOR: build

crates/sdk/guest/Cargo.toml renamed to crates/sdk/guest/fib/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ version = "0.0.0"
55
edition = "2021"
66

77
[dependencies]
8-
openvm = { path = "../../toolchain/openvm" }
8+
openvm = { path = "../../../toolchain/openvm" }
File renamed without changes.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
*.asm
2+
Cargo.lock
3+
target/
4+
openvm/
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[workspace]
2+
[package]
3+
name = "openvm-verify-stark-program"
4+
version = "0.0.0"
5+
edition = "2021"
6+
7+
[dependencies]
8+
openvm = { path = "../../../toolchain/openvm", features = ["std"] }
9+
hex-literal = { version = "0.4.1", default-features = false }
10+
bytemuck = { version = "1.20.0", features = ["extern_crate_alloc"] }
11+
12+
[features]
13+
default = []
14+
15+
[profile.profiling]
16+
inherits = "release"
17+
debug = 2
18+
strip = false
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
extern crate alloc;
2+
use alloc::vec::Vec;
3+
4+
use openvm::{define_verify_openvm_stark, io::read};
5+
6+
define_verify_openvm_stark!(
7+
verify_openvm_stark,
8+
env!("CARGO_MANIFEST_DIR"),
9+
"root_verifier.asm"
10+
);
11+
12+
// const APP_EXE_COMMIT: [u32; 8] = [
13+
// 343014587, 230645511, 1447462186, 773379336, 1182270030, 1497892484, 461820702, 353704350,
14+
// ];
15+
// const APP_VM_COMMIT: [u32; 8] = [
16+
// 445134834, 1133596793, 530952192, 425228715, 1806903712, 1362083369, 295028151, 482389308,
17+
// ];
18+
19+
pub fn main() {
20+
let app_exe_commit: [u32; 8] = read();
21+
let app_vm_commit: [u32; 8] = read();
22+
let pvs: Vec<u32> = read();
23+
verify_openvm_stark(&app_exe_commit, &app_vm_commit, &pvs);
24+
}

crates/sdk/src/stdin.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use std::collections::VecDeque;
1+
use std::{
2+
collections::{HashMap, VecDeque},
3+
sync::Arc,
4+
};
25

36
use openvm_circuit::arch::Streams;
47
use openvm_stark_backend::p3_field::FieldAlgebra;
@@ -9,6 +12,7 @@ use crate::F;
912
#[derive(Clone, Default, Serialize, Deserialize)]
1013
pub struct StdIn {
1114
pub buffer: VecDeque<Vec<F>>,
15+
pub kv_store: HashMap<Vec<u8>, Vec<u8>>,
1216
}
1317

1418
impl StdIn {
@@ -36,6 +40,9 @@ impl StdIn {
3640
pub fn write_field(&mut self, data: &[F]) {
3741
self.buffer.push_back(data.to_vec());
3842
}
43+
pub fn add_key_value(&mut self, key: Vec<u8>, value: Vec<u8>) {
44+
self.kv_store.insert(key, value);
45+
}
3946
}
4047

4148
impl From<StdIn> for Streams<F> {
@@ -44,7 +51,9 @@ impl From<StdIn> for Streams<F> {
4451
while let Some(input) = std_in.read() {
4552
data.push(input);
4653
}
47-
Streams::new(data)
54+
let mut ret = Streams::new(data);
55+
ret.kv_store = Arc::new(std_in.kv_store);
56+
ret
4857
}
4958
}
5059

crates/sdk/tests/integration_test.rs

Lines changed: 113 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use eyre::Result;
44
use openvm_build::GuestOptions;
55
use openvm_circuit::{
66
arch::{
7-
hasher::poseidon2::vm_poseidon2_hasher, ContinuationVmProof, ExecutionError,
7+
hasher::poseidon2::vm_poseidon2_hasher,
8+
instructions::program::DEFAULT_MAX_NUM_PUBLIC_VALUES, ContinuationVmProof, ExecutionError,
89
GenerationError, SingleSegmentVmExecutor, SystemConfig, VmConfig, VmExecutor,
910
},
1011
system::{memory::tree::public_values::UserPublicValuesProof, program::trace::VmCommittedExe},
@@ -27,9 +28,11 @@ use openvm_native_recursion::{
2728
wrapper::Halo2WrapperProvingKey,
2829
RawEvmProof,
2930
},
31+
hints::Hintable,
3032
types::InnerConfig,
3133
vars::StarkProofVariable,
3234
};
35+
use openvm_rv32im_guest::hint_load_by_key_encode;
3336
use openvm_rv32im_transpiler::{
3437
Rv32ITranspilerExtension, Rv32IoTranspilerExtension, Rv32MTranspilerExtension,
3538
};
@@ -41,7 +44,9 @@ use openvm_sdk::{
4144
types::{EvmHalo2Verifier, EvmProof},
4245
DefaultStaticVerifierPvHandler, Sdk, StdIn,
4346
};
44-
use openvm_stark_backend::{keygen::types::LinearConstraint, p3_matrix::Matrix};
47+
use openvm_stark_backend::{
48+
keygen::types::LinearConstraint, p3_field::PrimeField32, p3_matrix::Matrix,
49+
};
4550
use openvm_stark_sdk::{
4651
config::{
4752
baby_bear_poseidon2::{BabyBearPoseidon2Config, BabyBearPoseidon2Engine},
@@ -399,7 +404,7 @@ fn test_static_verifier_custom_pv_handler() {
399404
#[test]
400405
fn test_e2e_proof_generation_and_verification_with_pvs() {
401406
let mut pkg_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf();
402-
pkg_dir.push("guest");
407+
pkg_dir.push("guest/fib");
403408

404409
let vm_config = SdkVmConfig::builder()
405410
.system(SdkSystemConfig {
@@ -469,7 +474,7 @@ fn test_sdk_guest_build_and_transpile() {
469474
// .with_options(vec!["--release"]);
470475
;
471476
let mut pkg_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf();
472-
pkg_dir.push("guest");
477+
pkg_dir.push("guest/fib");
473478
let one = sdk
474479
.build(guest_opts.clone(), &pkg_dir, &Default::default())
475480
.unwrap();
@@ -490,7 +495,7 @@ fn test_inner_proof_codec_roundtrip() -> eyre::Result<()> {
490495
// generate a proof
491496
let sdk = Sdk::new();
492497
let mut pkg_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf();
493-
pkg_dir.push("guest");
498+
pkg_dir.push("guest/fib");
494499
let elf = sdk.build(Default::default(), pkg_dir, &Default::default())?;
495500

496501
let vm_config = SdkVmConfig::builder()
@@ -580,11 +585,109 @@ fn test_segmentation_retry() {
580585
.sum();
581586
assert!(new_total_height < total_height);
582587
}
583-
584588
#[test]
585-
fn test_root_verifier_asm_generate() {
586-
let agg_stark_config = agg_stark_config_for_test();
587-
let agg_pk = AggStarkProvingKey::keygen(agg_stark_config);
589+
fn test_verify_openvm_stark_e2e() -> Result<()> {
590+
const ASM_FILENAME: &str = "root_verifier.asm";
588591
let sdk = Sdk::new();
589-
sdk.generate_root_verifier_asm(&agg_pk);
592+
let guest_opts = GuestOptions::default();
593+
let mut pkg_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf();
594+
pkg_dir.push("guest/fib");
595+
let elf = sdk.build(guest_opts.clone(), &pkg_dir, &Default::default())?;
596+
597+
let vm_config = SdkVmConfig::builder()
598+
.system(SdkSystemConfig {
599+
config: SystemConfig::default().with_continuations(),
600+
})
601+
.rv32i(Default::default())
602+
.rv32m(Default::default())
603+
.io(Default::default())
604+
.native(Default::default())
605+
.build();
606+
assert!(vm_config.system.config.continuation_enabled);
607+
608+
let app_exe = sdk.transpile(elf, vm_config.transpiler())?;
609+
let fri_params = FriParameters::new_for_testing(LEAF_LOG_BLOWUP);
610+
let app_config = AppConfig::new_with_leaf_fri_params(fri_params, vm_config.clone(), fri_params);
611+
612+
let app_pk = sdk.app_keygen(app_config.clone())?;
613+
let committed_app_exe = sdk.commit_app_exe(fri_params, app_exe.clone())?;
614+
615+
let commits =
616+
AppExecutionCommit::compute(&vm_config, &committed_app_exe, &app_pk.leaf_committed_exe);
617+
618+
let agg_pk = AggStarkProvingKey::keygen(AggStarkConfig {
619+
max_num_user_public_values: DEFAULT_MAX_NUM_PUBLIC_VALUES,
620+
leaf_fri_params: FriParameters::new_for_testing(LEAF_LOG_BLOWUP),
621+
internal_fri_params: FriParameters::new_for_testing(INTERNAL_LOG_BLOWUP),
622+
root_fri_params: FriParameters::new_for_testing(ROOT_LOG_BLOWUP),
623+
profiling: false,
624+
compiler_options: CompilerOptions {
625+
enable_cycle_tracker: true,
626+
..Default::default()
627+
},
628+
root_max_constraint_degree: (1 << ROOT_LOG_BLOWUP) + 1,
629+
});
630+
let asm = sdk.generate_root_verifier_asm(&agg_pk);
631+
let asm_path = format!(
632+
"{}/guest/verify_openvm_stark/{}",
633+
env!("CARGO_MANIFEST_DIR"),
634+
ASM_FILENAME
635+
);
636+
std::fs::write(asm_path, asm)?;
637+
638+
let e2e_stark_proof = sdk.generate_e2e_stark_proof(
639+
Arc::new(app_pk),
640+
committed_app_exe,
641+
agg_pk,
642+
StdIn::default(),
643+
)?;
644+
645+
let verify_exe = {
646+
let mut pkg_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf();
647+
pkg_dir.push("guest/verify_openvm_stark");
648+
let elf = sdk.build(guest_opts.clone(), &pkg_dir, &Default::default())?;
649+
sdk.transpile(elf, vm_config.transpiler())?
650+
};
651+
652+
let pvs = [13u32, 21, 0, 0, 0, 0, 0, 0];
653+
654+
let exe_commit_u32: Vec<_> = commits
655+
.exe_commit
656+
.iter()
657+
.map(|x| x.as_canonical_u32())
658+
.collect();
659+
let vm_commit_u32: Vec<_> = commits
660+
.leaf_vm_verifier_commit
661+
.iter()
662+
.map(|x| x.as_canonical_u32())
663+
.collect();
664+
let pvs_u32: Vec<_> = pvs
665+
.iter()
666+
.flat_map(|x| x.to_le_bytes())
667+
.map(|x| x as u32)
668+
.collect();
669+
670+
let key = ASM_FILENAME
671+
.as_bytes()
672+
.iter()
673+
.cloned()
674+
.chain(exe_commit_u32.iter().flat_map(|x| x.to_le_bytes()))
675+
.chain(vm_commit_u32.iter().flat_map(|x| x.to_le_bytes()))
676+
.chain(pvs_u32.iter().flat_map(|x| x.to_le_bytes()))
677+
.collect();
678+
let mut stdin = StdIn::default();
679+
let to_encode: Vec<Vec<F>> = e2e_stark_proof.proof.write();
680+
let value = hint_load_by_key_encode(&to_encode);
681+
stdin.add_key_value(key, value);
682+
683+
let exe_commit_u32_8: [u32; 8] = exe_commit_u32.try_into().unwrap();
684+
let vm_commit_u32_8: [u32; 8] = vm_commit_u32.try_into().unwrap();
685+
686+
stdin.write(&exe_commit_u32_8);
687+
stdin.write(&vm_commit_u32_8);
688+
stdin.write(&pvs_u32);
689+
690+
sdk.execute(verify_exe, vm_config, stdin)?;
691+
692+
Ok(())
590693
}

crates/toolchain/openvm/src/verify_stark.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
/// little-endian bytes.
1616
#[macro_export]
1717
macro_rules! define_verify_openvm_stark {
18-
($fn_name: ident, $asm_folder: literal, $asm_filename: literal) => {
18+
($fn_name: ident, $asm_folder: expr, $asm_filename: literal) => {
1919
pub fn $fn_name(app_exe_commit: &[u32; 8], app_vm_commit: &[u32; 8], user_pvs: &[u32]) {
2020
// The memory location for the start of the heap.
2121
const HEAP_START_ADDRESS: u32 = 1 << 24;

0 commit comments

Comments
 (0)