Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
The table of contents is too big for display.
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
6 changes: 4 additions & 2 deletions Cargo.lock

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

15 changes: 9 additions & 6 deletions crates/jolt-akita/benches/akita_paths.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ use jolt_akita::{
AkitaScheme, AkitaSetupParams, AKITA_ONE_HOT_K256,
};
use jolt_dory::{DoryCommitment, DoryHint, DoryScheme};
use jolt_field::{Field, Fr, FromPrimitiveInt};
use jolt_field::{Fr, JoltField, Ring};
use jolt_openings::{
prove_packed_openings, BatchOpeningScheme, CommitmentScheme, EvaluationClaim,
PackedOpeningProof, PackedProverGroup, PackedProverObject, PrefixPackedStatement,
Expand Down Expand Up @@ -233,23 +233,26 @@ fn criterion_filter_matches(group_name: &str) -> bool {
})
}

fn field<F: FromPrimitiveInt>(value: u64) -> F {
fn field<F: Ring>(value: u64) -> F {
F::from_u64(value)
}

fn deterministic_dense_poly<F: Field>(num_vars: usize) -> Polynomial<F> {
fn deterministic_dense_poly<F: JoltField>(num_vars: usize) -> Polynomial<F> {
deterministic_dense_poly_with_offset(num_vars, 0)
}

fn deterministic_dense_poly_with_offset<F: Field>(num_vars: usize, offset: u64) -> Polynomial<F> {
fn deterministic_dense_poly_with_offset<F: JoltField>(
num_vars: usize,
offset: u64,
) -> Polynomial<F> {
let len = 1usize << num_vars;
let evals = (0..len)
.map(|i| field::<F>(((i as u64 * 17 + offset * 19 + 5) % 31) + 1))
.collect();
Polynomial::new(evals)
}

fn deterministic_point<F: Field>(num_vars: usize) -> Vec<F> {
fn deterministic_point<F: JoltField>(num_vars: usize) -> Vec<F> {
(0..num_vars)
.map(|i| field::<F>(((i as u64 * 7 + 11) % 97) + 2))
.collect()
Expand All @@ -263,7 +266,7 @@ fn sparse_one_hot(num_vars: usize) -> OneHotPolynomial {
OneHotPolynomial::new(AKITA_ONE_HOT_K256, indices)
}

fn materialize_sparse<F: Field>(poly: &OneHotPolynomial) -> Polynomial<F> {
fn materialize_sparse<F: JoltField>(poly: &OneHotPolynomial) -> Polynomial<F> {
let mut evals = vec![F::zero(); 1usize << poly.num_vars()];
<OneHotPolynomial as MultilinearPoly<F>>::for_each_one(poly, &mut |index| {
evals[index] = F::one();
Expand Down
4 changes: 2 additions & 2 deletions crates/jolt-akita/tests/pathologies.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use jolt_akita::{
AkitaBackendFlavor, AkitaBatchProof, AkitaCommitment, AkitaField, AkitaNativeBatchStatement,
AkitaNativeBatching, AkitaScheme,
};
use jolt_field::Field;
use jolt_field::JoltField;
use jolt_openings::{
BatchOpeningScheme, CommitmentScheme, OpeningsError, ZkBatchOpeningScheme, ZkOpeningScheme,
};
Expand All @@ -24,7 +24,7 @@ use support::{batch_polynomials, f, layout, native_setup, polynomial, setup_for}

type VerifierSetup = <AkitaScheme as CommitmentScheme>::VerifierSetup;

fn require_jolt_field<F: Field>() {}
fn require_jolt_field<F: JoltField>() {}

#[test]
fn akita_field_satisfies_jolt_field_bundle() {
Expand Down
12 changes: 6 additions & 6 deletions crates/jolt-blindfold/src/assignment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
//! forward pass over the constraint matrices solves them in emission order.
//! Unconstrained slots are the layout's zero padding.

use jolt_field::Field;
use jolt_field::JoltField;
use jolt_r1cs::SparseRow;
use jolt_sumcheck::{CommittedSumcheckWitness, SumcheckDomain, SumcheckDomainSpec};
use rand_core::RngCore;
Expand All @@ -31,7 +31,7 @@ pub struct AssignedBlindFoldWitness<F> {
pub blindings: Vec<F>,
}

impl<F: Field, Com> BlindFoldProtocol<F, Com> {
impl<F: JoltField, Com> BlindFoldProtocol<F, Com> {
/// Assemble the witness rows and blinds for [`crate::prove`] from the
/// per-stage committed sumcheck witnesses and domains (in protocol stage
/// order) and the final-opening evaluation scalars/blinds (in
Expand Down Expand Up @@ -301,7 +301,7 @@ impl<F: Field, Com> BlindFoldProtocol<F, Com> {
}
}

fn assign<F: Field>(
fn assign<F: JoltField>(
witness: &mut [Option<F>],
index: usize,
value: F,
Expand All @@ -321,7 +321,7 @@ fn assign<F: Field>(
/// *after* its operands, so a single forward pass assigns each in turn; the
/// equality constraints (round sums, claim bindings, final openings) have a
/// zero C side and are skipped — they are checks, not definitions.
fn solve_products<F: Field>(
fn solve_products<F: JoltField>(
a: &[SparseRow<F>],
b: &[SparseRow<F>],
c: &[SparseRow<F>],
Expand Down Expand Up @@ -357,7 +357,7 @@ fn solve_products<F: Field>(
Ok(())
}

fn evaluate_sparse<F: Field>(row: &SparseRow<F>, witness: &[Option<F>]) -> Option<F> {
fn evaluate_sparse<F: JoltField>(row: &SparseRow<F>, witness: &[Option<F>]) -> Option<F> {
row.iter()
.map(|&(index, coefficient)| {
witness
Expand All @@ -369,7 +369,7 @@ fn evaluate_sparse<F: Field>(row: &SparseRow<F>, witness: &[Option<F>]) -> Optio
.sum()
}

fn evaluate_at<F: Field>(coefficients: &[F], point: F) -> F {
fn evaluate_at<F: JoltField>(coefficients: &[F], point: F) -> F {
coefficients
.iter()
.rev()
Expand Down
4 changes: 2 additions & 2 deletions crates/jolt-blindfold/src/builder.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use jolt_claims::Expr;
use jolt_field::Field;
use jolt_field::JoltField;
use jolt_sumcheck::{
CommittedOutputClaims, CommittedSumcheckConsistency, SumcheckDomainSpec, SumcheckStatement,
};
Expand Down Expand Up @@ -64,7 +64,7 @@ impl<F, O, Com, P, Ch> Default for BlindFoldProtocolBuilder<F, O, Com, P, Ch> {

impl<F, O, Com, P, Ch> BlindFoldProtocolBuilder<F, O, Com, P, Ch>
where
F: Field + Clone,
F: JoltField + Clone,
O: Clone + PartialEq,
Com: Clone,
P: Clone + PartialEq,
Expand Down
6 changes: 3 additions & 3 deletions crates/jolt-blindfold/src/error.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use jolt_crypto::VectorOpeningError;
use jolt_field::FieldCore;
use jolt_field::JoltField;
use jolt_r1cs::{ClaimLoweringError, ConstraintMatrixEvalError};
use jolt_sumcheck::{SumcheckError, SumcheckR1csError};
use thiserror::Error as ThisError;
Expand Down Expand Up @@ -85,7 +85,7 @@ pub enum RelaxedError {
}

#[derive(Debug, ThisError)]
pub enum ProverError<F: FieldCore> {
pub enum ProverError<F: JoltField> {
#[error(transparent)]
Relaxed(#[from] RelaxedError),
#[error(transparent)]
Expand Down Expand Up @@ -153,7 +153,7 @@ pub enum ProverError<F: FieldCore> {
}

#[derive(Debug, ThisError)]
pub enum VerificationError<F: FieldCore> {
pub enum VerificationError<F: JoltField> {
#[error("claims have {claim_stages} stages but proof has {proof_stages}")]
StageCountMismatch {
claim_stages: usize,
Expand Down
4 changes: 2 additions & 2 deletions crates/jolt-blindfold/src/proof.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use jolt_crypto::VectorCommitmentOpening;
use jolt_field::Field;
use jolt_field::JoltField;
use jolt_sumcheck::CompressedSumcheckProof;
use serde::{Deserialize, Serialize};

Expand All @@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize};
serialize = "F: Serialize, Com: Serialize",
deserialize = "F: for<'a> Deserialize<'a>, Com: Deserialize<'de>"
))]
pub struct BlindFoldProof<F: Field, Com> {
pub struct BlindFoldProof<F: JoltField, Com> {
pub auxiliary_row_commitments: Vec<Com>,
pub random_round_commitments: Vec<Com>,
pub random_output_claim_row_commitments: Vec<Com>,
Expand Down
22 changes: 11 additions & 11 deletions crates/jolt-blindfold/src/protocol.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::ops::Range;

use jolt_crypto::HomomorphicCommitment;
use jolt_field::Field;
use jolt_field::JoltField;
use jolt_r1cs::{ConstraintMatrices, R1csBuilder, Variable};
use jolt_sumcheck::{CommittedOutputClaims, CommittedSumcheckConsistency};

Expand All @@ -11,7 +11,7 @@ use crate::{
};

#[derive(Clone, Debug)]
pub struct BlindFoldProtocol<F: Field, Com> {
pub struct BlindFoldProtocol<F: JoltField, Com> {
pub sumcheck_consistency: Vec<CommittedSumcheckConsistency<F, Com>>,
pub committed_output_claims: Vec<CommittedOutputClaims<Com>>,
pub r1cs: ConstraintMatrices<F>,
Expand Down Expand Up @@ -60,7 +60,7 @@ pub struct FinalOpeningWitnessCoordinates {

impl<F, Com> BlindFoldProtocol<F, Com>
where
F: Field,
F: JoltField,
{
pub fn builder<O, P, Ch>() -> BlindFoldProtocolBuilder<F, O, Com, P, Ch> {
BlindFoldProtocolBuilder::new()
Expand All @@ -69,7 +69,7 @@ where

impl<F, Com> BlindFoldProtocol<F, Com>
where
F: Field + Clone,
F: JoltField + Clone,
Com: Clone,
{
pub(crate) fn from_parts<O, P, Ch>(
Expand Down Expand Up @@ -103,7 +103,7 @@ where

impl<F, Com> BlindFoldProtocol<F, Com>
where
F: Field,
F: JoltField,
Com: Clone + HomomorphicCommitment<F>,
{
pub fn committed_relaxed_instance(
Expand Down Expand Up @@ -166,7 +166,7 @@ where

impl<F, Com> BlindFoldProtocol<F, Com>
where
F: Field,
F: JoltField,
{
pub fn validate_cross_term_error_rows(
&self,
Expand Down Expand Up @@ -236,7 +236,7 @@ where

impl<F, Com> BlindFoldProtocol<F, Com>
where
F: Field,
F: JoltField,
Com: Clone + HomomorphicCommitment<F>,
{
pub fn random_relaxed_instance(
Expand Down Expand Up @@ -310,7 +310,7 @@ where

impl<F, O, Com, P, Ch> BlindFoldStatement<F, O, Com, P, Ch>
where
F: Field + Clone,
F: JoltField + Clone,
O: Clone + PartialEq,
Com: Clone,
P: Clone + PartialEq,
Expand Down Expand Up @@ -443,7 +443,7 @@ where
}

impl Layout {
fn dimensions<F: Field, Com>(
fn dimensions<F: JoltField, Com>(
&self,
r1cs: &ConstraintMatrices<F>,
sumcheck_consistency: &[CommittedSumcheckConsistency<F, Com>],
Expand Down Expand Up @@ -563,7 +563,7 @@ fn pad_rows<F, Com>(
name: &'static str,
) -> Result<(), RelaxedError>
where
F: Field,
F: JoltField,
Com: Clone + HomomorphicCommitment<F>,
{
if rows.len() > target_len {
Expand Down Expand Up @@ -613,7 +613,7 @@ mod tests {
};
use jolt_claims::{constant, opening, Expr};
use jolt_crypto::{Bn254, Bn254G1, JoltGroup, Pedersen, PedersenSetup, VectorCommitment};
use jolt_field::{Fr, FromPrimitiveInt};
use jolt_field::{Fr, Ring};
use jolt_sumcheck::{
CommittedOutputClaims, CommittedRound, CommittedSumcheckProof, SumcheckDomainSpec,
SumcheckError, SumcheckStatement,
Expand Down
Loading