Skip to content

Commit a9d152f

Browse files
committed
Add integration test
1 parent 70a005c commit a9d152f

File tree

13 files changed

+192
-18
lines changed

13 files changed

+192
-18
lines changed

Cargo.lock

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

crates/continuations/src/verifier/internal/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use openvm_stark_sdk::{
1515
},
1616
};
1717
use serde::{de::DeserializeOwned, Deserialize, Serialize};
18-
use static_assertions::assert_impl_all;
18+
use static_assertions::{assert_impl_all, const_assert_eq};
1919

2020
use crate::{verifier::common::types::VmVerifierPvs, SC};
2121

crates/sdk/Cargo.toml

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

61+
[dev-dependencies]
62+
cargo-openvm.workspace = true
63+
hex-literal = { version = "0.4.1", default-features = false }
64+
openvm-rv32im-guest.workspace = true
65+
66+
6167
[features]
6268
default = ["parallel", "jemalloc", "evm-verify"]
6369
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: 121 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
use std::{borrow::Borrow, path::PathBuf, sync::Arc};
1+
use std::{array, borrow::Borrow, path::PathBuf, sync::Arc};
22

3+
use alloy_sol_types::private::U256;
4+
use cargo_openvm::util::read_config_toml_or_default;
35
use eyre::Result;
6+
use itertools::Itertools;
47
use openvm_build::GuestOptions;
58
use openvm_circuit::{
69
arch::{
7-
hasher::poseidon2::vm_poseidon2_hasher, ContinuationVmProof, ExecutionError,
10+
hasher::poseidon2::vm_poseidon2_hasher,
11+
instructions::program::DEFAULT_MAX_NUM_PUBLIC_VALUES, ContinuationVmProof, ExecutionError,
812
GenerationError, SingleSegmentVmExecutor, SystemConfig, VmConfig, VmExecutor,
913
},
1014
system::{memory::tree::public_values::UserPublicValuesProof, program::trace::VmCommittedExe},
@@ -13,6 +17,7 @@ use openvm_continuations::{
1317
static_verifier::StaticVerifierPvHandler,
1418
verifier::{
1519
common::types::{SpecialAirIds, VmVerifierPvs},
20+
internal::types::E2eStarkProof,
1621
leaf::types::{LeafVmVerifierInput, UserPublicValuesRootProof},
1722
root::types::RootVmVerifierPvs,
1823
utils::compress_babybear_var_to_bn254,
@@ -27,21 +32,28 @@ use openvm_native_recursion::{
2732
wrapper::Halo2WrapperProvingKey,
2833
RawEvmProof,
2934
},
35+
hints::Hintable,
3036
types::InnerConfig,
3137
vars::StarkProofVariable,
3238
};
39+
use openvm_rv32im_guest::hint_load_by_key_encode;
3340
use openvm_rv32im_transpiler::{
3441
Rv32ITranspilerExtension, Rv32IoTranspilerExtension, Rv32MTranspilerExtension,
3542
};
3643
use openvm_sdk::{
3744
codec::{Decode, Encode},
3845
commit::AppExecutionCommit,
3946
config::{AggConfig, AggStarkConfig, AppConfig, Halo2Config, SdkSystemConfig, SdkVmConfig},
47+
fs::{decode_from_file, read_exe_from_file},
4048
keygen::{AggStarkProvingKey, AppProvingKey},
4149
types::{EvmHalo2Verifier, EvmProof},
4250
DefaultStaticVerifierPvHandler, Sdk, StdIn,
4351
};
44-
use openvm_stark_backend::{keygen::types::LinearConstraint, p3_matrix::Matrix};
52+
use openvm_stark_backend::{
53+
keygen::types::LinearConstraint,
54+
p3_field::{PrimeField32, PrimeField64},
55+
p3_matrix::Matrix,
56+
};
4557
use openvm_stark_sdk::{
4658
config::{
4759
baby_bear_poseidon2::{BabyBearPoseidon2Config, BabyBearPoseidon2Engine},
@@ -399,7 +411,7 @@ fn test_static_verifier_custom_pv_handler() {
399411
#[test]
400412
fn test_e2e_proof_generation_and_verification_with_pvs() {
401413
let mut pkg_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf();
402-
pkg_dir.push("guest");
414+
pkg_dir.push("guest/fib");
403415

404416
let vm_config = SdkVmConfig::builder()
405417
.system(SdkSystemConfig {
@@ -469,7 +481,7 @@ fn test_sdk_guest_build_and_transpile() {
469481
// .with_options(vec!["--release"]);
470482
;
471483
let mut pkg_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf();
472-
pkg_dir.push("guest");
484+
pkg_dir.push("guest/fib");
473485
let one = sdk
474486
.build(guest_opts.clone(), &pkg_dir, &Default::default())
475487
.unwrap();
@@ -490,7 +502,7 @@ fn test_inner_proof_codec_roundtrip() -> eyre::Result<()> {
490502
// generate a proof
491503
let sdk = Sdk::new();
492504
let mut pkg_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf();
493-
pkg_dir.push("guest");
505+
pkg_dir.push("guest/fib");
494506
let elf = sdk.build(Default::default(), pkg_dir, &Default::default())?;
495507

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

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)