Skip to content
Open
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
e25af10
feat(field): add the Solinas backend to jolt-field
Acentelles Jul 16, 2026
86816df
test(field): add Solinas benchmark and fuzz target
Acentelles Jul 16, 2026
09b2f7b
ci: add shared field feature matrix and package identity check
Acentelles Jul 16, 2026
763e3f0
docs(specs): add consolidate-field-traits spec
Acentelles Jul 21, 2026
fec8255
refactor(field): delete dead trait surface (spec phase 1)
Acentelles Jul 21, 2026
029881f
refactor(field): merge accumulator traits into one Accumulator (spec …
Acentelles Jul 21, 2026
26b26e8
refactor(field): consolidate root traits, adopt serde+bincode wire fo…
Acentelles Jul 22, 2026
f9897fd
refactor(field): consolidate the extension-field trait cluster (spec …
Acentelles Jul 22, 2026
f88ee8f
refactor(field): bn254.rs-style layout and shared macros (spec phase 5)
Acentelles Jul 22, 2026
65f70be
docs(specs): tick verified acceptance criteria in consolidate-field-t…
Acentelles Jul 22, 2026
4f2f9dd
chore(field): remove committed fuzz build artifacts
Acentelles Jul 22, 2026
9aff1cd
fix(field): audit remediation for the trait consolidation
Acentelles Jul 22, 2026
fe1d5d4
docs(specs): record byte-for-byte proof comparison against main
Acentelles Jul 22, 2026
79944f2
fix(field): repair Fp64::reduce_u128 truncation and S160 mul overflow
Acentelles Jul 29, 2026
72b1e47
Merge remote-tracking branch 'origin/main' into feat/solinas-field-stack
Acentelles Jul 29, 2026
a80f0e5
docs(field): correct the S160 overflow failure-mode description
Acentelles Jul 29, 2026
ff5bf9c
refactor(field): split CanonicalBytes out of CanonicalRepr
Acentelles Jul 30, 2026
5635b98
feat(jolt-field-two): first-principles rebuild of jolt-field, checkpo…
markosg04 Jul 28, 2026
1502e01
test(jolt-field-two): un-gate baseline-parity tests after upstream fixes
Acentelles Jul 29, 2026
0961df4
test(jolt-field-two): close entry-audit gaps
Acentelles Jul 29, 2026
49f1621
test(jolt-field-two): reconcile differentials with the CanonicalBytes…
Acentelles Jul 30, 2026
e1cbc17
feat(jolt-field-two): fp128 two-limb Solinas field (checkpoint 5)
Acentelles Jul 30, 2026
ae313af
feat(jolt-field-two): cyclotomic extensions FpExt2/4/8 (checkpoint 6)
Acentelles Jul 30, 2026
d4959dd
feat(jolt-field-two): unreduced deferred-reduction surface (checkpoin…
Acentelles Jul 30, 2026
19e88a7
feat(jolt-field-two): packed SIMD backends (checkpoint 8)
Acentelles Jul 31, 2026
58785fa
feat(jolt-field-two): parallel helpers, crate docs, final audit (chec…
Acentelles Jul 31, 2026
5b3e39e
docs(specs): move jolt-field-two SPEC.md to specs/jolt-field-rebuild.md
Acentelles Jul 31, 2026
db8e650
feat(jolt-field-two): CanonicalBytes supertrait split + akita bootstr…
Acentelles Jul 31, 2026
2b800e1
test(jolt-field-two): oracle-free test suite (num-bigint oracles + go…
Acentelles Jul 31, 2026
cf8a66a
refactor(jolt-field): replace the crate with the jolt-field-two rebuild
Acentelles Jul 31, 2026
079356e
refactor(workspace): rebind all consumers to the rebuilt jolt-field s…
Acentelles Jul 31, 2026
b2e3086
docs(specs): record replacement validation evidence in jolt-field-reb…
Acentelles Aug 1, 2026
46e2ce8
Merge origin/main: rebind BlindFold modular-prover code (#1690) to th…
Acentelles Aug 1, 2026
505d8eb
Merge origin/main: rebind modular-prover profiling (#1712) to the reb…
Acentelles Aug 3, 2026
a79b894
fix(ci): repair the five lanes broken by the replacement
Acentelles Aug 4, 2026
7a6337c
fix(ci): taplo-format the restored fuzz manifest
Acentelles Aug 4, 2026
2e75e66
fix(ci): feature-gate golden-byte fixtures for the shared-field matri…
Acentelles Aug 4, 2026
d5ee0d5
fix(ci): gate the golden-bytes fixture file at file level for backend…
Acentelles Aug 4, 2026
a6bbd62
fix(ci): per-backend gates on golden-byte fixtures alongside the file…
Acentelles Aug 4, 2026
faefab8
fix(ci): structural shared-field identity check via cargo metadata
Acentelles Aug 4, 2026
eb93a03
fix(field): exact-uniform canonical rejection sampling
Acentelles Aug 6, 2026
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
19 changes: 19 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,25 @@ jobs:
- name: taplo fmt --check
run: taplo fmt --check

field-stack:
name: Shared field feature matrix
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Install nextest
uses: taiki-e/install-action@nextest
- name: Require one jolt-field identity (bootstrap akita-field pin allowed)
run: scripts/check-shared-field-identity.sh
- name: Check no backend
run: cargo check -p jolt-field --no-default-features
- name: Check BN254 backend
run: cargo check -p jolt-field --no-default-features --features bn254
- name: Test Solinas backend
run: cargo nextest run -p jolt-field --no-default-features --features solinas --cargo-quiet
- name: Check combined backends
run: cargo check -p jolt-field --no-default-features --features bn254,solinas

clippy:
runs-on: ubuntu-latest
steps:
Expand Down
73 changes: 68 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ members = [
"crates/jolt-kernels",
"crates/jolt-kernels-derive",
"crates/jolt-prover",
"crates/jolt-field-two",
"crates/jolt-prover-legacy",
"tracer",
"common",
Expand Down
11 changes: 2 additions & 9 deletions crates/jolt-blindfold/src/prove.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use jolt_crypto::{HomomorphicCommitment, VectorCommitment, VectorCommitmentOpening};
use jolt_field::{Field, RingAccumulator, WithAccumulator};
use jolt_field::Field;
use jolt_poly::{BindingOrder, EqPolynomial, Polynomial, UnivariatePoly};
use jolt_r1cs::{ConstraintMatrices, ConstraintMatrixEvalError, SparseRow};
use jolt_sumcheck::{CompressedSumcheckProof, SUMCHECK_ROUND_TRANSCRIPT_LABEL};
Expand Down Expand Up @@ -126,10 +126,7 @@ where
row_point: &[F],
entry_point: &[F],
name: &'static str,
) -> Result<(VectorCommitmentOpening<F>, F), ProverError<F>>
where
<F as WithAccumulator>::Accumulator: RingAccumulator<Element = F>,
{
) -> Result<(VectorCommitmentOpening<F>, F), ProverError<F>> {
open_committed_rows::<F, VC>(setup, rows, blindings, row_point, entry_point, name)
}
}
Expand Down Expand Up @@ -166,7 +163,6 @@ where
VC::Output: HomomorphicCommitment<F> + AppendToTranscript,
T: Transcript<Challenge = F>,
R: RngCore,
<F as WithAccumulator>::Accumulator: RingAccumulator<Element = F>,
{
let mut row_committer = DirectBlindFoldRowCommitter;
prove_with_row_committer::<F, VC, T, R, DirectBlindFoldRowCommitter>(
Expand Down Expand Up @@ -194,7 +190,6 @@ where
T: Transcript<Challenge = F>,
R: RngCore,
C: BlindFoldRowCommitter<F, VC>,
<F as WithAccumulator>::Accumulator: RingAccumulator<Element = F>,
{
validate_witness::<F, VC>(setup, protocol, witness)?;

Expand Down Expand Up @@ -696,7 +691,6 @@ fn open_committed_rows<F, VC>(
where
F: Field,
VC: VectorCommitment<Field = F>,
<F as WithAccumulator>::Accumulator: RingAccumulator<Element = F>,
{
let row_count = basis_len_from_point_len("row point", row_point.len())?;
ensure_len(name, row_count, rows.len())?;
Expand Down Expand Up @@ -1038,7 +1032,6 @@ where
F: Field,
VC: VectorCommitment<Field = F>,
C: BlindFoldRowCommitter<F, VC>,
<F as WithAccumulator>::Accumulator: RingAccumulator<Element = F>,
{
let row_vars = log2_power_of_two("witness row count", witness_rows.len())?;
let entry_vars = log2_power_of_two("witness row length", witness_rows[0].len())?;
Expand Down
7 changes: 1 addition & 6 deletions crates/jolt-blindfold/src/verify.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use jolt_crypto::{HomomorphicCommitment, VectorCommitment, VectorCommitmentOpening};
use jolt_field::{Field, FieldCore, RingAccumulator, WithAccumulator};
use jolt_field::{Field, FieldCore};
use jolt_poly::EqPolynomial;
use jolt_r1cs::{ConstraintMatrices, MatrixColumnContributions};
use jolt_sumcheck::{BooleanHypercube, SumcheckClaim, SUMCHECK_ROUND_TRANSCRIPT_LABEL};
Expand All @@ -18,7 +18,6 @@ impl<F, Com> BlindFoldProtocol<F, Com>
where
F: Field + AppendToTranscript,
Com: Copy + HomomorphicCommitment<F> + AppendToTranscript,
<F as WithAccumulator>::Accumulator: RingAccumulator<Element = F>,
{
pub fn verify<VC, T>(
&self,
Expand Down Expand Up @@ -126,7 +125,6 @@ impl<F, Com> BlindFoldProtocol<F, Com>
where
F: Field + AppendToTranscript,
Com: Copy + HomomorphicCommitment<F> + AppendToTranscript,
<F as WithAccumulator>::Accumulator: RingAccumulator<Element = F>,
{
fn verify_outer_folded_r1cs<VC, T>(
&self,
Expand Down Expand Up @@ -247,7 +245,6 @@ impl<F, Com> BlindFoldProtocol<F, Com>
where
F: Field + AppendToTranscript,
Com: Copy + HomomorphicCommitment<F> + AppendToTranscript,
<F as WithAccumulator>::Accumulator: RingAccumulator<Element = F>,
{
fn verify_folded_eval_witness_bindings<VC, T>(
&self,
Expand Down Expand Up @@ -365,7 +362,6 @@ impl WitnessCoordinate {
F: Field,
VC: VectorCommitment<Field = F>,
VC::Output: Copy + HomomorphicCommitment<F>,
<F as WithAccumulator>::Accumulator: RingAccumulator<Element = F>,
{
let witness_row_count = folded.witness_row_commitments.len();
if witness_row_count == 0 || !witness_row_count.is_power_of_two() {
Expand Down Expand Up @@ -400,7 +396,6 @@ impl<F, Com> BlindFoldProtocol<F, Com>
where
F: Field + AppendToTranscript,
Com: Copy + HomomorphicCommitment<F> + AppendToTranscript,
<F as WithAccumulator>::Accumulator: RingAccumulator<Element = F>,
{
fn verify_inner_folded_r1cs<VC, T>(
&self,
Expand Down
6 changes: 3 additions & 3 deletions crates/jolt-blindfold/tests/support/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use jolt_claims::{challenge, constant, derived, opening, Expr};
use jolt_crypto::{
Bn254, Bn254G1, JoltGroup, Pedersen, PedersenSetup, VectorCommitment, VectorCommitmentOpening,
};
use jolt_field::{FixedBytes, Fr, FromPrimitiveInt, Invertible};
use jolt_field::{CanonicalBytes, FieldCore, Fr, FromPrimitiveInt};
use jolt_poly::{CompressedPoly, EqPolynomial};
use jolt_r1cs::{ClaimSourceTable, ConstraintMatrices, R1csBuilder};
use jolt_sumcheck::{
Expand Down Expand Up @@ -108,7 +108,7 @@ pub fn f(value: u64) -> F {
pub fn rng_field(rng: &mut impl RngCore) -> F {
let mut bytes = [0u8; 32];
rng.fill_bytes(&mut bytes);
F::from_bytes_array(&bytes)
<F as jolt_field::CanonicalRepr>::from_le_bytes_mod_order(&bytes)
}

pub fn inverse(value: F) -> F {
Expand Down Expand Up @@ -145,7 +145,7 @@ impl StatisticalProjection {
}

pub fn field_low_u64(value: F) -> u64 {
let bytes = value.to_bytes_array();
let bytes = value.to_bytes_le_vec();
u64::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -561,7 +561,7 @@ mod tests {
use super::super::super::bytecode::{read_raf_public_values, BytecodeReadRafEvaluationInputs};
use super::*;
use crate::protocols::jolt::JoltPolynomialId;
use jolt_field::{Fr, FromPrimitiveInt, Invertible};
use jolt_field::{FieldCore, Fr, FromPrimitiveInt};
use jolt_lookup_tables::InstructionLookupTable;
use jolt_riscv::{
instructions::Noop, Flags, InterleavedBitsMarker, JoltInstruction, JoltInstructionKind,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ mod tests {

use super::*;
use crate::protocols::jolt::geometry::dimensions::TracePolynomialOrder;
use jolt_field::{Fr, FromPrimitiveInt, Invertible};
use jolt_field::{FieldCore, Fr, FromPrimitiveInt};

#[test]
fn cycle_skip_scale_counts_inactive_cycle_rounds() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,7 @@ mod tests {
PrecommittedClaimReduction, PrecommittedReductionLayout,
};
use super::*;
use jolt_field::{Fr, FromPrimitiveInt, Invertible};
use jolt_field::{FieldCore, Fr, FromPrimitiveInt};
use jolt_poly::EqPolynomial;

fn dimensions() -> JoltOneHotDimensions {
Expand Down
2 changes: 1 addition & 1 deletion crates/jolt-crypto/benches/crypto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
use jolt_crypto::{
Bn254, Bn254G1, Bn254G2, JoltGroup, PairingGroup, Pedersen, PedersenSetup, VectorCommitment,
};
use jolt_field::{Fr, FromPrimitiveInt, RandomSampling};
use jolt_field::{FieldCore, Fr, FromPrimitiveInt};
use rand_chacha::ChaCha20Rng;
use rand_core::SeedableRng;

Expand Down
6 changes: 3 additions & 3 deletions crates/jolt-crypto/fuzz/fuzz_targets/group_arith.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
#![no_main]
use jolt_crypto::{Bn254, Bn254G1, JoltGroup};
use jolt_field::{Fr, ReducingBytes};
use jolt_field::{Fr, CanonicalRepr};
use libfuzzer_sys::fuzz_target;

fn parse_input(data: &[u8]) -> Option<(Fr, Fr, Bn254G1)> {
if data.len() < 64 {
return None;
}
let s1 = <Fr as ReducingBytes>::from_le_bytes_mod_order(&data[..32]);
let s2 = <Fr as ReducingBytes>::from_le_bytes_mod_order(&data[32..64]);
let s1 = <Fr as CanonicalRepr>::from_le_bytes_mod_order(&data[..32]);
let s2 = <Fr as CanonicalRepr>::from_le_bytes_mod_order(&data[32..64]);
let g = Bn254::g1_generator();
let p = g.scalar_mul(&s1);
Some((s1, s2, p))
Expand Down
6 changes: 3 additions & 3 deletions crates/jolt-crypto/fuzz/fuzz_targets/pedersen_commit.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#![no_main]
use jolt_crypto::{Bn254, Bn254G1, VectorCommitment, JoltGroup, Pedersen, PedersenSetup};
use jolt_field::{Fr, FromPrimitiveInt, ReducingBytes};
use jolt_field::{Fr, FromPrimitiveInt, CanonicalRepr};
use libfuzzer_sys::fuzz_target;

/// Fixed small setup (4 generators) — deterministic so we don't waste fuzzer
Expand All @@ -23,9 +23,9 @@ fuzz_target!(|data: &[u8]| {
let setup = fixed_setup();

let values: Vec<Fr> = (0..4)
.map(|i| <Fr as ReducingBytes>::from_le_bytes_mod_order(&data[i * 32..(i + 1) * 32]))
.map(|i| <Fr as CanonicalRepr>::from_le_bytes_mod_order(&data[i * 32..(i + 1) * 32]))
.collect();
let blinding = <Fr as ReducingBytes>::from_le_bytes_mod_order(&data[128..160]);
let blinding = <Fr as CanonicalRepr>::from_le_bytes_mod_order(&data[128..160]);

// Commit-verify round-trip
let c = Pedersen::<Bn254G1>::commit(&setup, &values, &blinding);
Expand Down
Loading