Skip to content

Commit 9e45ad1

Browse files
authored
feat: helper functions for verify_openvm_stark (#1631)
- `AppExecutionCommit` stores `u32` instead of `BabyBear`. - Rename `E2eStarkProof` to `VmStarkProof`. - Add `compute_hint_key_for_verify_openvm_stark`/`encode_rv32_public_values` for users to prepare inputs for `verify_openvm_stark`. But it still seems hard to understand what happens. - Improve docs about `Rv32HintLoadByKey`.
1 parent c942537 commit 9e45ad1

File tree

24 files changed

+299
-231
lines changed

24 files changed

+299
-231
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ members = [
6666
"extensions/pairing/transpiler",
6767
"extensions/pairing/guest",
6868
"extensions/pairing/tests",
69+
"guest-libs/verify_stark/guest",
6970
]
7071
exclude = ["crates/sdk/example"]
7172
resolver = "2"
@@ -162,6 +163,7 @@ openvm-ecc-sw-macros = { path = "extensions/ecc/sw-macros", default-features = f
162163
openvm-pairing-circuit = { path = "extensions/pairing/circuit", default-features = false }
163164
openvm-pairing-transpiler = { path = "extensions/pairing/transpiler", default-features = false }
164165
openvm-pairing-guest = { path = "extensions/pairing/guest", default-features = false }
166+
openvm-verify-stark = { path = "guest-libs/verify_stark/guest", default-features = false }
165167

166168
# Benchmarking
167169
openvm-benchmarks-utils = { path = "benchmarks/utils", default-features = false }

crates/cli/src/commands/prove.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,13 @@ impl ProveCmd {
103103
sdk.set_agg_tree_config(*agg_tree_config);
104104
let (app_pk, committed_exe, input) =
105105
Self::prepare_execution(&sdk, app_pk, exe, input)?;
106+
let commits = AppExecutionCommit::compute(
107+
&app_pk.app_vm_pk.vm_config,
108+
&committed_exe,
109+
&app_pk.leaf_committed_exe,
110+
);
111+
println!("exe commit: {:?}", commits.exe_commit);
112+
println!("vm commit: {:?}", commits.vm_commit);
106113
let agg_pk = read_agg_pk_from_file(DEFAULT_AGG_PK_PATH).map_err(|e| {
107114
eyre::eyre!("Failed to read aggregation proving key: {}\nPlease run 'cargo openvm setup' first", e)
108115
})?;
@@ -129,6 +136,14 @@ impl ProveCmd {
129136
let params_reader = CacheHalo2ParamsReader::new(DEFAULT_PARAMS_DIR);
130137
let (app_pk, committed_exe, input) =
131138
Self::prepare_execution(&sdk, app_pk, exe, input)?;
139+
let commits = AppExecutionCommit::compute(
140+
&app_pk.app_vm_pk.vm_config,
141+
&committed_exe,
142+
&app_pk.leaf_committed_exe,
143+
);
144+
println!("exe commit: {:?}", commits.exe_commit_to_bn254());
145+
println!("vm commit: {:?}", commits.vm_commit_to_bn254());
146+
132147
println!("Generating EVM proof, this may take a lot of compute and memory...");
133148
let agg_pk = read_agg_pk_from_file(DEFAULT_AGG_PK_PATH).map_err(|e| {
134149
eyre::eyre!("Failed to read aggregation proving key: {}\nPlease run 'cargo openvm setup' first", e)
@@ -155,14 +170,6 @@ impl ProveCmd {
155170
let app_exe = read_exe_from_file(exe)?;
156171
let committed_exe = sdk.commit_app_exe(app_pk.app_fri_params(), app_exe)?;
157172

158-
let commits = AppExecutionCommit::compute(
159-
&app_pk.app_vm_pk.vm_config,
160-
&committed_exe,
161-
&app_pk.leaf_committed_exe,
162-
);
163-
println!("app_pk commit: {:?}", commits.app_config_commit_to_bn254());
164-
println!("exe commit: {:?}", commits.exe_commit_to_bn254());
165-
166173
let input = read_to_stdin(input)?;
167174
Ok((app_pk, committed_exe, input))
168175
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ pub struct InternalVmVerifierInput<SC: StarkGenericConfig> {
3030
}
3131
assert_impl_all!(InternalVmVerifierInput<BabyBearPoseidon2Config>: Serialize, DeserializeOwned);
3232

33-
/// The final output of the internal VM verifier.
33+
/// A proof which can prove OpenVM program execution.
3434
#[derive(Deserialize, Serialize, Derivative)]
3535
#[serde(bound = "")]
3636
#[derivative(Clone(bound = "Com<SC>: Clone"))]
37-
pub struct E2eStarkProof<SC: StarkGenericConfig> {
37+
pub struct VmStarkProof<SC: StarkGenericConfig> {
3838
pub proof: Proof<SC>,
3939
pub user_public_values: Vec<Val<SC>>,
4040
}
41-
assert_impl_all!(E2eStarkProof<BabyBearPoseidon2Config>: Serialize, DeserializeOwned);
41+
assert_impl_all!(VmStarkProof<BabyBearPoseidon2Config>: Serialize, DeserializeOwned);
4242

4343
/// Aggregated state of all segments
4444
#[derive(Debug, Clone, Copy, AlignedBorrow)]

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use openvm_stark_sdk::openvm_stark_backend::proof::Proof;
66

77
use crate::{
88
verifier::{
9-
internal::types::{E2eStarkProof, InternalVmVerifierInput},
9+
internal::types::{InternalVmVerifierInput, VmStarkProof},
1010
utils::write_field_slice,
1111
},
1212
C, F, SC,
@@ -44,7 +44,7 @@ impl Hintable<C> for InternalVmVerifierInput<SC> {
4444
}
4545
}
4646

47-
impl Hintable<C> for E2eStarkProof<SC> {
47+
impl Hintable<C> for VmStarkProof<SC> {
4848
type HintVariable = E2eStarkProofVariable<C>;
4949

5050
fn read(builder: &mut Builder<C>) -> Self::HintVariable {

crates/sdk/Cargo.toml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,6 @@ 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-
6561
[features]
6662
default = ["parallel", "jemalloc", "evm-verify"]
6763
evm-prove = ["openvm-native-recursion/evm-prove"]

crates/sdk/guest/verify_openvm_stark/src/main.rs

Lines changed: 0 additions & 24 deletions
This file was deleted.

crates/sdk/src/codec.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use openvm_circuit::{
44
arch::ContinuationVmProof, system::memory::tree::public_values::UserPublicValuesProof,
55
};
66
use openvm_continuations::verifier::{
7-
internal::types::E2eStarkProof, root::types::RootVmVerifierInput,
7+
internal::types::VmStarkProof, root::types::RootVmVerifierInput,
88
};
99
use openvm_native_compiler::ir::DIGEST_SIZE;
1010
use openvm_native_recursion::hints::{InnerBatchOpening, InnerFriProof, InnerQueryProof};
@@ -61,7 +61,7 @@ impl Encode for ContinuationVmProof<SC> {
6161
}
6262
}
6363

64-
impl Encode for E2eStarkProof<SC> {
64+
impl Encode for VmStarkProof<SC> {
6565
fn encode<W: Write>(&self, writer: &mut W) -> Result<()> {
6666
self.proof.encode(writer)?;
6767
encode_slice(&self.user_public_values, writer)
@@ -332,7 +332,7 @@ impl Decode for ContinuationVmProof<SC> {
332332
}
333333
}
334334

335-
impl Decode for E2eStarkProof<SC> {
335+
impl Decode for VmStarkProof<SC> {
336336
fn decode<R: Read>(reader: &mut R) -> Result<Self> {
337337
let proof = Proof::decode(reader)?;
338338
let user_public_values = decode_vec(reader)?;

crates/sdk/src/commit.rs

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use openvm_circuit::{
44
arch::{instructions::exe::VmExe, VmConfig},
55
system::program::trace::VmCommittedExe,
66
};
7-
use openvm_continuations::verifier::leaf::LeafVmVerifierConfig;
8-
use openvm_native_compiler::{conversion::CompilerOptions, ir::DIGEST_SIZE};
7+
use openvm_native_compiler::ir::DIGEST_SIZE;
98
use openvm_stark_backend::{config::StarkGenericConfig, p3_field::PrimeField32};
109
use openvm_stark_sdk::{
1110
config::{baby_bear_poseidon2::BabyBearPoseidon2Engine, FriParameters},
@@ -14,14 +13,16 @@ use openvm_stark_sdk::{
1413
p3_baby_bear::BabyBear,
1514
p3_bn254_fr::Bn254Fr,
1615
};
16+
use serde::{Deserialize, Serialize};
1717

18-
use crate::{keygen::AppProvingKey, NonRootCommittedExe, F, SC};
18+
use crate::{NonRootCommittedExe, F, SC};
1919

2020
/// `AppExecutionCommit` has all the commitments users should check against the final proof.
21-
pub struct AppExecutionCommit<T> {
21+
#[derive(Clone, Debug, Serialize, Deserialize)]
22+
pub struct AppExecutionCommit {
2223
/// Commitment of the leaf VM verifier program which commits the VmConfig of App VM.
2324
/// Internal verifier will verify `leaf_vm_verifier_commit`.
24-
pub leaf_vm_verifier_commit: [T; DIGEST_SIZE],
25+
pub vm_commit: [u32; DIGEST_SIZE],
2526
/// Commitment of the executable. It's computed as
2627
/// compress(
2728
/// compress(
@@ -31,37 +32,39 @@ pub struct AppExecutionCommit<T> {
3132
/// hash(right_pad(pc_start, 0))
3233
/// )
3334
/// `right_pad` example, if pc_start = 123, right_pad(pc_start, 0) = \[123,0,0,0,0,0,0,0\]
34-
pub exe_commit: [T; DIGEST_SIZE],
35+
pub exe_commit: [u32; DIGEST_SIZE],
3536
}
3637

37-
impl AppExecutionCommit<F> {
38+
impl AppExecutionCommit {
3839
/// Users should use this function to compute `AppExecutionCommit` and check it against the
3940
/// final proof.
4041
pub fn compute<VC: VmConfig<F>>(
4142
app_vm_config: &VC,
4243
app_exe: &NonRootCommittedExe,
4344
leaf_vm_verifier_exe: &NonRootCommittedExe,
4445
) -> Self {
45-
let exe_commit = app_exe
46+
let exe_commit: [F; DIGEST_SIZE] = app_exe
4647
.compute_exe_commit(&app_vm_config.system().memory_config)
4748
.into();
48-
let leaf_vm_verifier_commit: [F; DIGEST_SIZE] =
49-
leaf_vm_verifier_exe.committed_program.commitment.into();
49+
let vm_commit: [F; DIGEST_SIZE] = leaf_vm_verifier_exe.committed_program.commitment.into();
5050

5151
Self {
52-
leaf_vm_verifier_commit,
53-
exe_commit,
52+
vm_commit: vm_commit.map(|x| x.as_canonical_u32()),
53+
exe_commit: exe_commit.map(|x| x.as_canonical_u32()),
5454
}
5555
}
5656

57-
pub fn app_config_commit_to_bn254(&self) -> Bn254Fr {
58-
babybear_digest_to_bn254(&self.leaf_vm_verifier_commit)
57+
pub fn vm_commit_to_bn254(&self) -> Bn254Fr {
58+
babybear_u32_digest_to_bn254(&self.vm_commit)
5959
}
6060

6161
pub fn exe_commit_to_bn254(&self) -> Bn254Fr {
62-
babybear_digest_to_bn254(&self.exe_commit)
62+
babybear_u32_digest_to_bn254(&self.exe_commit)
6363
}
6464
}
65+
fn babybear_u32_digest_to_bn254(digest: &[u32; DIGEST_SIZE]) -> Bn254Fr {
66+
babybear_digest_to_bn254(&digest.map(F::from_canonical_u32))
67+
}
6568

6669
pub(crate) fn babybear_digest_to_bn254(digest: &[F; DIGEST_SIZE]) -> Bn254Fr {
6770
let mut ret = Bn254Fr::ZERO;
@@ -74,25 +77,6 @@ pub(crate) fn babybear_digest_to_bn254(digest: &[F; DIGEST_SIZE]) -> Bn254Fr {
7477
ret
7578
}
7679

77-
pub fn generate_leaf_committed_exe<VC: VmConfig<F>>(
78-
leaf_fri_params: FriParameters,
79-
compiler_options: CompilerOptions,
80-
app_pk: &AppProvingKey<VC>,
81-
) -> Arc<NonRootCommittedExe> {
82-
let app_vm_vk = app_pk.app_vm_pk.vm_pk.get_vk();
83-
let leaf_engine = BabyBearPoseidon2Engine::new(leaf_fri_params);
84-
let leaf_program = LeafVmVerifierConfig {
85-
app_fri_params: app_pk.app_vm_pk.fri_params,
86-
app_system_config: app_pk.app_vm_pk.vm_config.system().clone(),
87-
compiler_options,
88-
}
89-
.build_program(&app_vm_vk);
90-
Arc::new(VmCommittedExe::commit(
91-
leaf_program.into(),
92-
leaf_engine.config.pcs(),
93-
))
94-
}
95-
9680
pub fn commit_app_exe(
9781
app_fri_params: FriParameters,
9882
app_exe: impl Into<VmExe<F>>,

crates/sdk/src/lib.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use openvm_circuit::{
2121
},
2222
};
2323
use openvm_continuations::verifier::{
24-
internal::types::E2eStarkProof,
24+
internal::types::VmStarkProof,
2525
root::{types::RootVmVerifierInput, RootVmVerifierConfig},
2626
};
2727
pub use openvm_continuations::{
@@ -61,7 +61,7 @@ pub mod prover;
6161
mod stdin;
6262
pub use stdin::*;
6363

64-
use crate::keygen::asm::program_to_asm;
64+
use crate::{config::AggStarkConfig, keygen::asm::program_to_asm};
6565

6666
pub mod fs;
6767
pub mod types;
@@ -261,6 +261,11 @@ impl<E: StarkFriEngine<SC>> GenericSdk<E> {
261261
Ok(agg_pk)
262262
}
263263

264+
pub fn agg_stark_keygen(&self, config: AggStarkConfig) -> Result<AggStarkProvingKey> {
265+
let agg_pk = AggStarkProvingKey::keygen(config);
266+
Ok(agg_pk)
267+
}
268+
264269
pub fn generate_root_verifier_asm(&self, agg_stark_pk: &AggStarkProvingKey) -> String {
265270
let kernel_asm = RootVmVerifierConfig {
266271
leaf_fri_params: agg_stark_pk.leaf_vm_pk.fri_params,
@@ -302,7 +307,7 @@ impl<E: StarkFriEngine<SC>> GenericSdk<E> {
302307
app_exe: Arc<NonRootCommittedExe>,
303308
agg_stark_pk: AggStarkProvingKey,
304309
inputs: StdIn,
305-
) -> Result<E2eStarkProof<SC>>
310+
) -> Result<VmStarkProof<SC>>
306311
where
307312
VC::Executor: Chip<SC>,
308313
VC::Periphery: Chip<SC>,

0 commit comments

Comments
 (0)