Skip to content

Commit d01099e

Browse files
adr1anhclaude
andcommitted
refactor: replace custom symbolic types with upstream SymbolicAirBuilder
Replace ace-codegen's custom RecordingAirBuilder and SymExpr/SymVar types with plonky3's upstream SymbolicAirBuilder and SymbolicExpression types. This aligns constraint capture with the canonical representation and removes ~430 lines of duplicated symbolic algebra. Also updates miden-crypto imports for the reorganized module layout (AirBuilder trait changes, hasher/symmetric paths, prover/verifier submodules). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 9f8e571 commit d01099e

27 files changed

Lines changed: 518 additions & 785 deletions

Cargo.lock

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

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ miden-utils-testing = { path = "./crates/test-utils", package = "miden-test-util
6464
miden-verifier = { path = "./verifier", version = "0.22", default-features = false }
6565

6666
# Miden crates
67-
miden-crypto = { version = "0.23", default-features = false, git = "https://github.com/0xMiden/crypto", branch = "tracking-migration-work" }
67+
miden-crypto = { version = "0.23", default-features = false, git = "https://github.com/0xMiden/crypto.git", rev = "450a7bd116d24617526c1336000164f29d476ca0" }
6868
miden-formatting = { version = "0.1", default-features = false }
6969
midenc-hir-type = { version = "0.4", default-features = false }
7070

air/src/config/blake3.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,42 @@
66
use alloc::vec;
77

88
use miden_core::field::QuadFelt;
9-
use miden_crypto::stark::{
10-
GenericStarkConfig,
11-
challenger::{HashChallenger, SerializingChallenger64},
12-
crypto::{
13-
CompressionFunctionFromHasher, p3_blake3::Blake3, p3_miden_stateful_hasher::ChainingHasher,
9+
use miden_crypto::{
10+
hash::blake::Blake3Hasher,
11+
stark::{
12+
GenericStarkConfig,
13+
challenger::{HashChallenger, SerializingChallenger64},
14+
hasher::ChainingHasher,
15+
lmcs::LmcsConfig,
16+
symmetric::CompressionFunctionFromHasher,
1417
},
15-
lmcs::LmcsConfig,
1618
};
1719

1820
use super::{Dft, PCS_PARAMS};
1921
use crate::Felt;
2022

2123
/// Stateful hasher wrapping Blake3 for LMCS leaf hashing
22-
type Sponge = ChainingHasher<Blake3>;
24+
type Sponge = ChainingHasher<Blake3Hasher>;
2325

2426
/// Compression function for Merkle tree internal nodes (Blake3, 32-byte digest)
25-
type Compress = CompressionFunctionFromHasher<Blake3, 2, 32>;
27+
type Compress = CompressionFunctionFromHasher<Blake3Hasher, 2, 32>;
2628

2729
/// LMCS commitment scheme using Blake3
2830
type LmcsType = LmcsConfig<Felt, u8, Sponge, Compress, 32, 32>;
2931

3032
/// Challenger for Fiat-Shamir using Blake3
31-
type Challenger = SerializingChallenger64<Felt, HashChallenger<u8, Blake3, 32>>;
33+
type Challenger = SerializingChallenger64<Felt, HashChallenger<u8, Blake3Hasher, 32>>;
3234

3335
/// Complete STARK configuration type for Blake3_256.
3436
pub type Blake3Config = GenericStarkConfig<Felt, QuadFelt, LmcsType, Dft, Challenger>;
3537

3638
/// Creates a Blake3_256-based STARK configuration.
3739
pub fn create_blake3_256_config() -> Blake3Config {
38-
let sponge = Sponge::new(Blake3);
39-
let compress = Compress::new(Blake3);
40+
let sponge = Sponge::new(Blake3Hasher);
41+
let compress = Compress::new(Blake3Hasher);
4042
let lmcs = LmcsType::new(sponge, compress);
4143
let dft = Dft::default();
42-
let challenger = Challenger::from_hasher(vec![], Blake3);
44+
let challenger = Challenger::from_hasher(vec![], Blake3Hasher);
4345

4446
GenericStarkConfig::new(PCS_PARAMS, lmcs, dft, challenger)
4547
}

air/src/config/keccak.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
use alloc::vec;
44

55
use miden_core::field::QuadFelt;
6-
use miden_crypto::stark::{
7-
GenericStarkConfig,
8-
challenger::{HashChallenger, SerializingChallenger64},
9-
crypto::{
10-
CompressionFunctionFromHasher, p3_keccak::Keccak256Hash,
11-
p3_miden_stateful_hasher::ChainingHasher,
6+
use miden_crypto::{
7+
hash::keccak::Keccak256Hash,
8+
stark::{
9+
GenericStarkConfig,
10+
challenger::{HashChallenger, SerializingChallenger64},
11+
hasher::ChainingHasher,
12+
lmcs::LmcsConfig,
13+
symmetric::CompressionFunctionFromHasher,
1214
},
13-
lmcs::LmcsConfig,
1415
};
1516

1617
use super::{Dft, PCS_PARAMS};

air/src/config/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ use alloc::vec::Vec;
1212

1313
use miden_core::{Felt, field::QuadFelt, utils::RowMajorMatrix};
1414
use miden_crypto::stark::{
15-
AirInstance, StarkConfig, TranscriptData,
16-
air::{AuxBuilder, VarLenPublicInputs},
15+
StarkConfig,
16+
air::{AirInstance, AuxBuilder, VarLenPublicInputs},
1717
challenger::CanObserve,
1818
fri::{DeepParams, FriFold, FriParams, PcsParams},
1919
lmcs::Lmcs,
20-
transcript::{ProverTranscript, VerifierTranscript},
20+
transcript::{ProverTranscript, TranscriptData, VerifierTranscript},
2121
};
2222
use serde::{Serialize, de::DeserializeOwned};
2323

@@ -67,7 +67,7 @@ pub const PCS_PARAMS: PcsParams = PcsParams {
6767
#[derive(Debug, thiserror::Error)]
6868
pub enum ProvingError {
6969
#[error(transparent)]
70-
Prover(#[from] miden_crypto::stark::ProverError),
70+
Prover(#[from] miden_crypto::stark::prover::ProverError),
7171
#[error("failed to serialize proof: {0}")]
7272
Serialization(#[from] bincode::Error),
7373
}
@@ -78,7 +78,7 @@ pub enum VerificationError {
7878
#[error("failed to deserialize proof: {0}")]
7979
Deserialization(#[from] bincode::Error),
8080
#[error(transparent)]
81-
Verifier(#[from] miden_crypto::stark::VerifierError),
81+
Verifier(#[from] miden_crypto::stark::verifier::VerifierError),
8282
}
8383

8484
// PROVE / VERIFY
@@ -109,7 +109,7 @@ where
109109
// variable-length public inputs.
110110
// TODO: observe ACE commitment once ACE verification is integrated.
111111
let mut channel = ProverTranscript::new(challenger);
112-
miden_crypto::stark::prove_single(
112+
miden_crypto::stark::prover::prove_single(
113113
config,
114114
air,
115115
trace,
@@ -152,6 +152,6 @@ where
152152
public_values,
153153
var_len_public_inputs,
154154
};
155-
miden_crypto::stark::verify_multi(config, &[(air, instance)], &mut channel)?;
155+
miden_crypto::stark::verifier::verify_multi(config, &[(air, instance)], &mut channel)?;
156156
Ok(())
157157
}

air/src/config/poseidon2.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22
33
use miden_core::field::QuadFelt;
44
use miden_crypto::{
5+
field::Field,
56
hash::poseidon2::Poseidon2Permutation256,
67
stark::{
7-
GenericStarkConfig,
8-
challenger::DuplexChallenger,
9-
crypto::{StatefulSponge, TruncatedPermutation},
10-
field::Field,
11-
lmcs::LmcsConfig,
8+
GenericStarkConfig, challenger::DuplexChallenger, hasher::StatefulSponge, lmcs::LmcsConfig,
9+
symmetric::TruncatedPermutation,
1210
},
1311
};
1412

air/src/config/rpo.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22
33
use miden_core::field::QuadFelt;
44
use miden_crypto::{
5+
field::Field,
56
hash::rpo::RpoPermutation256,
67
stark::{
7-
GenericStarkConfig,
8-
challenger::DuplexChallenger,
9-
crypto::{StatefulSponge, TruncatedPermutation},
10-
field::Field,
11-
lmcs::LmcsConfig,
8+
GenericStarkConfig, challenger::DuplexChallenger, hasher::StatefulSponge, lmcs::LmcsConfig,
9+
symmetric::TruncatedPermutation,
1210
},
1311
};
1412

air/src/config/rpx.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22
33
use miden_core::field::QuadFelt;
44
use miden_crypto::{
5+
field::Field,
56
hash::rpx::RpxPermutation256,
67
stark::{
7-
GenericStarkConfig,
8-
challenger::DuplexChallenger,
9-
crypto::{StatefulSponge, TruncatedPermutation},
10-
field::Field,
11-
lmcs::LmcsConfig,
8+
GenericStarkConfig, challenger::DuplexChallenger, hasher::StatefulSponge, lmcs::LmcsConfig,
9+
symmetric::TruncatedPermutation,
1210
},
1311
};
1412

air/src/constraints/op_flags/tests.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ fn naive_flag(bits: &[Felt; 7], opcode: u8) -> Felt {
3737
acc
3838
}
3939

40+
#[allow(clippy::iter_skip_zero)]
4041
fn naive_op_flags(bits: [Felt; 7]) -> ([Felt; 64], [Felt; 8], [Felt; 16], [Felt; 8]) {
4142
let mut deg7 = [ZERO; 64];
4243
let mut deg6 = [ZERO; 8];

air/src/constraints/tagging/ood_eval.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use alloc::vec::Vec;
44

55
use miden_core::{Felt, field::QuadFelt};
66
use miden_crypto::stark::{
7-
air::{AirBuilder, ExtensionBuilder, PeriodicAirBuilder, PermutationAirBuilder},
7+
air::{AirBuilder, EmptyWindow, ExtensionBuilder, PeriodicAirBuilder, PermutationAirBuilder},
88
matrix::RowMajorMatrix,
99
};
1010

@@ -138,18 +138,16 @@ impl AirBuilder for OodEvalAirBuilder {
138138
type F = Felt;
139139
type Expr = Felt;
140140
type Var = Felt;
141-
type M = RowMajorMatrix<Felt>;
141+
type PreprocessedWindow = EmptyWindow<Felt>;
142+
type MainWindow = RowMajorMatrix<Felt>;
142143
type PublicVar = Felt;
143144

144-
fn main(&self) -> Self::M {
145+
fn main(&self) -> Self::MainWindow {
145146
self.main.clone()
146147
}
147148

148-
fn preprocessed(&self) -> &Self::M {
149-
use std::sync::LazyLock;
150-
static EMPTY: LazyLock<RowMajorMatrix<Felt>> =
151-
LazyLock::new(|| RowMajorMatrix::new(Vec::new(), 0));
152-
&EMPTY
149+
fn preprocessed(&self) -> &Self::PreprocessedWindow {
150+
EmptyWindow::empty_ref()
153151
}
154152

155153
fn is_first_row(&self) -> Self::Expr {

0 commit comments

Comments
 (0)