Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
- Support importing hierarchical modules (#507).
- In Plonky3 codegen, use AirScriptAir and AirScriptBuilder traits, and generate aux constraints (#508).
- In Plonky3 codegen, use MidenAir and MidenAirBuilder from 0xMiden's Plonky3 fork instead of AirScriptAir and AirScriptBuilder (#515).
- In Plonky3 codegen, use prove/verify workflow for tests (#523).

## 0.4.0 (2025-06-20)

Expand Down
34 changes: 18 additions & 16 deletions air-script/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,28 +28,30 @@ log = { version = "0.4", default-features = false }
miden-diagnostics = { workspace = true }
mir = { package = "air-mir", path = "../mir", version = "0.5" }

[dev-dependencies]
expect-test = "1.4"

# 0xMiden Plonky3 Fork
p3-air = { package = "p3-air", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-challenger = { package = "p3-challenger", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-commit = { package = "p3-commit", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-dft = { package = "p3-dft", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-field = { package = "p3-field", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-fri = { package = "p3-fri", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-matrix = { package = "p3-matrix", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-merkle-tree = { package = "p3-merkle-tree", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-miden-air = { package = "miden-air", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-goldilocks = { package = "p3-goldilocks", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-sha256 = { package = "p3-sha256", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-symmetric = { package = "p3-symmetric", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-uni-stark = { package = "p3-uni-stark", git="https://github.com/0xMiden/Plonky3", rev = "5352d47ee57bd1b5d6008a90b64cbb7fe00aa17e", default-features = false }
p3-matrix = { package = "p3-matrix", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }
p3-field = { package = "p3-field", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }
p3-miden-air = { package = "miden-air", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }

# MassaLabs fork
miden-processor = { package = "miden-processor", git="https://github.com/massalabs/miden-vm", rev = "bc553af69a2543a0789830e8508b019694528181", default-features = false }
miden-air = { package = "miden-air", git="https://github.com/massalabs/miden-vm", rev = "bc553af69a2543a0789830e8508b019694528181", default-features = false }

[dev-dependencies]
expect-test = "1.4"

# 0xMiden Plonky3 Fork
p3-air = { package = "p3-air", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }
p3-challenger = { package = "p3-challenger", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }
p3-commit = { package = "p3-commit", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }
p3-dft = { package = "p3-dft", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }
p3-fri = { package = "p3-fri", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }
p3-merkle-tree = { package = "p3-merkle-tree", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }
p3-miden-prover = { package = "miden-prover", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }
p3-goldilocks = { package = "p3-goldilocks", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }
p3-sha256 = { package = "p3-sha256", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }
p3-symmetric = { package = "p3-symmetric", git="https://github.com/0xMiden/Plonky3", rev = "632fb26a9141cc70f903e5378035ca8d5855c490", default-features = false }

winter-air = { package = "winter-air", version = "0.12", default-features = false }
winter-math = { package = "winter-math", version = "0.12", default-features = false }
winter-utils = { package = "winter-utils", version = "0.12", default-features = false }
Expand Down
3 changes: 3 additions & 0 deletions air-script/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ pub use air_codegen_winter::CodeGenerator as WinterfellCodeGenerator;
pub use air_ir::{Air, CompileError, compile};
pub use air_parser::{parse, parse_file, transforms};

/// Miden VM auxiliary trace generator
pub mod miden_vm_aux_trace_generator;

#[cfg(test)]
pub mod test_utils;
#[cfg(test)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ pub fn build_aux_trace_with_miden_vm<F, EF>(
main: &RowMajorMatrix<F>,
challenges: &[EF],
module: MidenModule,
) -> RowMajorMatrix<EF>
) -> RowMajorMatrix<F>
where
F: Field + PrimeField64,
EF: ExtensionField<F>,
Expand Down Expand Up @@ -112,5 +112,6 @@ where
}
}

aux_trace
let aux_trace_f = aux_trace.flatten_to_base();
aux_trace_f
}
30 changes: 21 additions & 9 deletions air-script/src/test_utils/air_tester_macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ macro_rules! generate_air_plonky3_test_with_airscript_traits {
>;
type Dft = p3_dft::Radix2DitParallel<Val>;
type Pcs = p3_fri::TwoAdicFriPcs<Val, Dft, ValMmcs, ChallengeMmcs>;
type MyConfig = p3_uni_stark::StarkConfig<Pcs, Challenge, Challenger>;
type MyConfig = p3_miden_prover::StarkConfig<Pcs, Challenge, Challenger>;

let byte_hash = ByteHash {};
let field_hash = FieldHash::new(p3_sha256::Sha256);
Expand All @@ -62,23 +62,35 @@ macro_rules! generate_air_plonky3_test_with_airscript_traits {
let challenge_mmcs = ChallengeMmcs::new(val_mmcs.clone());
let challenger = Challenger::from_hasher(vec![], byte_hash);
let dft = Dft::default();
let fri_params = p3_fri::create_benchmark_fri_params(challenge_mmcs);
let mut fri_params = p3_fri::create_recursive_miden_fri_params(challenge_mmcs);
let pcs = Pcs::new(dft, val_mmcs, fri_params);
let config = MyConfig::new(pcs, challenger);

// Generate public inputs and convert them to Goldilocks field elements
let inputs = generate_inputs();
let inputs_goldilocks: Vec<Val> = inputs
.iter()
.map(|&x| <Val as p3_field::PrimeCharacteristicRing>::from_u32(x))
.collect();
let inputs_goldilocks = crate::test_utils::pub_inputs_conversion_utils::convert_pub_inputs_to_goldilocks(&inputs);

// Generate variable-length public inputs as a `Vec<Vec<Vec<u64>>>`.
// The outer `Vec` represents multiple tables (one for each bus in the AIR)
// The middle `Vec` represents the rows of each table
// The innermost `Vec` represents the tuple values contained by the bus, that will be combined with randomness into a single field element.
let var_len_pub_inputs = generate_var_len_pub_inputs();
// Convert variable-length public inputs to Goldilocks field elements
let var_len_pub_inputs_goldilocks_vec = crate::test_utils::pub_inputs_conversion_utils::convert_var_len_pub_inputs_to_goldilocks(var_len_pub_inputs);
let var_len_pub_inputs_goldilocks_vec_slice = crate::test_utils::pub_inputs_conversion_utils::convert_inner_vec_to_slice(&var_len_pub_inputs_goldilocks_vec);
let var_len_pub_inputs_goldilocks = crate::test_utils::pub_inputs_conversion_utils::convert_mid_vec_to_slice(&var_len_pub_inputs_goldilocks_vec_slice);

let trace = generate_trace_rows::<Val>(inputs);

check_constraints_with_airscript_traits::<Val, Challenge, $air_name>(
let proof = p3_miden_prover::prove(&config, &$air_name {}, &trace, &inputs_goldilocks);
p3_miden_prover::verify(
&config,
&$air_name {},
&trace,
&proof,
&inputs_goldilocks,
);
&var_len_pub_inputs_goldilocks,
)
.expect("Verification failed");
}
};
}
6 changes: 2 additions & 4 deletions air-script/src/test_utils/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@
pub mod air_tester_macros;
/// Code generation for tests/**/*.air files.
pub mod codegen;
/// Miden VM auxiliary trace generator
pub mod miden_vm_aux_trace_generator;
/// Plonky3-specific Debug constraint builder implementation
pub mod plonky3_traits;
/// Conversion utilities for test inputs (both public inputs and variable-length public inputs).
pub mod pub_inputs_conversion_utils;
/// Winterfell-specific traits
pub mod winterfell_traits;
189 changes: 0 additions & 189 deletions air-script/src/test_utils/plonky3_traits.rs

This file was deleted.

46 changes: 46 additions & 0 deletions air-script/src/test_utils/pub_inputs_conversion_utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
type Val = p3_goldilocks::Goldilocks;

/// Converts public inputs from u64 to Goldilocks field elements.
pub(crate) fn convert_pub_inputs_to_goldilocks(pub_inputs: &[u64]) -> Vec<Val> {
pub_inputs
.iter()
.map(|&x| <Val as p3_field::PrimeCharacteristicRing>::from_u64(x))
.collect()
}

/// Converts variable-length public inputs from u64 to Goldilocks field elements.
/// The input should be a Vec of tables (Vec<Vec<u64>>) in a RowMajor format.
pub(crate) fn convert_var_len_pub_inputs_to_goldilocks(
var_len_pub_inputs: Vec<Vec<Vec<u64>>>,
) -> Vec<Vec<Vec<Val>>> {
let mut var_len_pub_inputs_goldilocks_vec: Vec<Vec<Vec<Val>>> = vec![];
for arr in var_len_pub_inputs.iter() {
let mut goldilocks_arr: Vec<Vec<Val>> = vec![];
for slice in arr.iter() {
let goldilocks_slice: Vec<Val> = slice
.iter()
.map(|&x| <Val as p3_field::PrimeCharacteristicRing>::from_u64(x))
.collect();
goldilocks_arr.push(goldilocks_slice);
}
var_len_pub_inputs_goldilocks_vec.push(goldilocks_arr);
}
var_len_pub_inputs_goldilocks_vec
}

/// Converts the innermost vectors of variable-length public inputs to slices.
pub(crate) fn convert_inner_vec_to_slice<'a>(
var_len_pub_inputs: &'a Vec<Vec<Vec<Val>>>,
) -> Vec<Vec<&'a [Val]>> {
var_len_pub_inputs
.iter()
.map(|outer| outer.iter().map(|inner| inner.as_slice()).collect())
.collect()
}

/// Converts the middle vectors of variable-length public inputs to slices.
pub(crate) fn convert_mid_vec_to_slice<'a>(
var_len_pub_inputs: &'a Vec<Vec<&'a [Val]>>,
) -> Vec<&'a [&'a [Val]]> {
var_len_pub_inputs.iter().map(|v| v.as_slice()).collect()
}
Loading