Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
4a31d14
napi: add plonk proof verify
querolita Nov 11, 2025
aac711f
napi: implement plonk proof batch verify
querolita Nov 11, 2025
5a2f685
napi: plonk proof deep copy with external
querolita Nov 11, 2025
ad8954c
napi: plonk proof dummy with external
querolita Nov 11, 2025
a5dc0f7
Napi conversions of proof-related types
Shigoto-dev19 Nov 13, 2025
c2464c9
Napi conversions for oracles
Shigoto-dev19 Nov 13, 2025
e5b7131
Merge pull request #3371 from o1-labs/shigoto/native/napi/proof-types…
querolita Nov 14, 2025
ecb6854
napi: export proof types
querolita Nov 14, 2025
4eac953
Merge branch 'florian/native-proof-2' into querolita/napi-proof
querolita Nov 14, 2025
31cc9fc
napi: add missing srs functions
querolita Nov 18, 2025
67b9a98
Merge branch 'native/napi' into querolita/napi-proof
querolita Nov 19, 2025
6fcc8ce
napi: go back to using externals with srs after testng
querolita Nov 20, 2025
14f111c
Merge branch 'querolita/napi-proof' into shigoto/native/napi/oracles
querolita Nov 20, 2025
261d047
Merge pull request #3364 from o1-labs/shigoto/native/napi/oracles
querolita Nov 20, 2025
709fad7
napi: first version of macro-styled vk
querolita Nov 25, 2025
1ae987e
napi: fix compilation of verifier index macro implementation
querolita Nov 25, 2025
f6e0328
Full napi conversion for verifier index
Shigoto-dev19 Dec 2, 2025
6f8c8f1
Export napi domain
Shigoto-dev19 Dec 3, 2025
64c7a76
export napi plonk-verifier-index
Shigoto-dev19 Dec 3, 2025
e47bad2
Revert napi shifts
Shigoto-dev19 Dec 3, 2025
4961429
small verifier index fix
Shigoto-dev19 Dec 3, 2025
c985d4f
another fix
Shigoto-dev19 Dec 3, 2025
51a65b2
add names to napi domain
Shigoto-dev19 Dec 3, 2025
f71f28e
napi: rename prover index serde functions
querolita Dec 3, 2025
da2f09f
napi: force snake case for struct fields
querolita Dec 3, 2025
202e2d0
napi: fix h function name
querolita Dec 3, 2025
96f481e
Fix property names of lookup verifier index
Shigoto-dev19 Dec 4, 2025
d363502
Update imports in napi proof.rs
Shigoto-dev19 Dec 4, 2025
e1e44ff
Add plonk verifier index deserialize function
Shigoto-dev19 Dec 4, 2025
77e147f
napi fixes for past plonk index
Shigoto-dev19 Dec 4, 2025
9241d26
Export napi pasta plonk index functions
Shigoto-dev19 Dec 4, 2025
01d188b
Add attribute to napi lookup verifier index
Shigoto-dev19 Dec 4, 2025
c22f062
Define NapiLookupVerifierIndex and PlonkVerifierIndex as napi objects
Shigoto-dev19 Dec 4, 2025
c5eb21d
Update napi exports
Shigoto-dev19 Dec 4, 2025
c5f0a6e
Unskip lookup_info property
Shigoto-dev19 Dec 4, 2025
4e55e52
Forgot name for lookup selectors and converted other napi classes to …
Shigoto-dev19 Dec 4, 2025
35123e4
Fix napi srs_maybe_lagrange_commitment
Shigoto-dev19 Dec 4, 2025
57e99b5
Revert plonk verifier index objects to classes
Shigoto-dev19 Dec 5, 2025
bd455b9
Convert all napi classes to objects for plonk verifier index
Shigoto-dev19 Dec 5, 2025
ef52c65
Rename NapiVecVec to WasmVecVec
Shigoto-dev19 Dec 5, 2025
84373a1
Fix NapiVecVec in napi proof.rs
Shigoto-dev19 Dec 5, 2025
a1addff
Another fix for vector.rs
Shigoto-dev19 Dec 5, 2025
5734152
Add println for napi vecvec
Shigoto-dev19 Dec 5, 2025
9214627
debugging napi vecvec
Shigoto-dev19 Dec 5, 2025
84440c4
Add napi conversion for runtime table
Shigoto-dev19 Dec 5, 2025
43756cf
Use napi runtime tables as object
Shigoto-dev19 Dec 7, 2025
e072aeb
export napi runtime tables
Shigoto-dev19 Dec 7, 2025
1af2adc
Code cleanings
Shigoto-dev19 Dec 7, 2025
75bd438
Merge branch 'querolita/napi-vindex' into shigoto/napi-proof/verifier…
querolita Dec 8, 2025
d52417a
napi: string typo
querolita Dec 8, 2025
1d1d524
napi: unify lookup table definition
querolita Dec 8, 2025
cdf94d4
Merge pull request #3383 from o1-labs/shigoto/napi-proof/verifier-index
querolita Dec 8, 2025
643e42e
Merge pull request #3381 from o1-labs/querolita/napi-vindex
querolita Dec 9, 2025
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
3 changes: 2 additions & 1 deletion Cargo.lock

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

3 changes: 2 additions & 1 deletion plonk-napi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ arkworks.workspace = true
mina-curves = { path = "../curves" }
mina-poseidon = { path = "../poseidon" }
o1-utils = { path = "../utils" }
poly-commitment = { path = "../poly-commitment" }
plonk_wasm.workspace = true
poly-commitment = { path = "../poly-commitment" }

base64.workspace = true
getrandom.workspace = true
kimchi.workspace = true
libc.workspace = true
Expand Down
62 changes: 51 additions & 11 deletions plonk-napi/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
mod build_info;
mod circuit;
mod gate_vector;
mod oracles;
mod pasta_fp_plonk_index;
mod pasta_fq_plonk_index;
mod plonk_verifier_index;
Expand Down Expand Up @@ -30,32 +31,71 @@ pub use gate_vector::{
NapiFpGateVector as WasmFpGateVector, NapiFqGate as WasmFqGate,
NapiFqGateVector as WasmFqGateVector,
};
pub use oracles::{
fp::{fp_oracles_create, fp_oracles_deep_copy, fp_oracles_dummy},
fq::{fq_oracles_create, fq_oracles_deep_copy, fq_oracles_dummy},
};
pub use pasta_fp_plonk_index::{
prover_index_fp_from_bytes, prover_index_fp_to_bytes, WasmPastaFpPlonkIndex,
caml_pasta_fp_plonk_index_create, caml_pasta_fp_plonk_index_decode,
caml_pasta_fp_plonk_index_domain_d1_size, caml_pasta_fp_plonk_index_domain_d4_size,
caml_pasta_fp_plonk_index_domain_d8_size, caml_pasta_fp_plonk_index_encode,
caml_pasta_fp_plonk_index_max_degree, caml_pasta_fp_plonk_index_public_inputs,
caml_pasta_fp_plonk_index_read, caml_pasta_fp_plonk_index_write, prover_index_fp_deserialize,
prover_index_fp_serialize, WasmPastaFpPlonkIndex,
};
pub use pasta_fq_plonk_index::{
prover_index_fq_from_bytes, prover_index_fq_to_bytes, WasmPastaFqPlonkIndex,
caml_pasta_fq_plonk_index_create, caml_pasta_fq_plonk_index_decode,
caml_pasta_fq_plonk_index_domain_d1_size, caml_pasta_fq_plonk_index_domain_d4_size,
caml_pasta_fq_plonk_index_domain_d8_size, caml_pasta_fq_plonk_index_encode,
caml_pasta_fq_plonk_index_max_degree, caml_pasta_fq_plonk_index_public_inputs,
caml_pasta_fq_plonk_index_read, caml_pasta_fq_plonk_index_write, prover_index_fq_deserialize,
prover_index_fq_serialize, WasmPastaFqPlonkIndex,
};
pub use plonk_verifier_index::{
caml_pasta_fp_plonk_verifier_index_shifts, caml_pasta_fq_plonk_verifier_index_shifts,
fp::{
caml_pasta_fp_plonk_verifier_index_create, caml_pasta_fp_plonk_verifier_index_deep_copy,
caml_pasta_fp_plonk_verifier_index_deserialize, caml_pasta_fp_plonk_verifier_index_dummy,
caml_pasta_fp_plonk_verifier_index_read, caml_pasta_fp_plonk_verifier_index_serialize,
caml_pasta_fp_plonk_verifier_index_shifts, caml_pasta_fp_plonk_verifier_index_write,
NapiFpLookupVerifierIndex, NapiFpPlonkVerifierIndex,
},
fq::{
caml_pasta_fq_plonk_verifier_index_create, caml_pasta_fq_plonk_verifier_index_deep_copy,
caml_pasta_fq_plonk_verifier_index_deserialize, caml_pasta_fq_plonk_verifier_index_dummy,
caml_pasta_fq_plonk_verifier_index_read, caml_pasta_fq_plonk_verifier_index_serialize,
caml_pasta_fq_plonk_verifier_index_shifts, caml_pasta_fq_plonk_verifier_index_write,
NapiFqLookupVerifierIndex, NapiFqPlonkVerifierIndex,
},
};

pub use poly_comm::{
pallas::NapiFqPolyComm as WasmFqPolyComm, vesta::NapiFpPolyComm as WasmFpPolyComm,
};
pub use poseidon::{caml_pasta_fp_poseidon_block_cipher, caml_pasta_fq_poseidon_block_cipher};
pub use proof::caml_pasta_fp_plonk_proof_create;
pub use proof::{
fp::{
caml_pasta_fp_plonk_proof_batch_verify, caml_pasta_fp_plonk_proof_create,
caml_pasta_fp_plonk_proof_deep_copy, caml_pasta_fp_plonk_proof_dummy,
caml_pasta_fp_plonk_proof_verify, NapiFpLookupCommitments, NapiFpOpeningProof,
NapiFpProofEvaluations, NapiFpProverCommitments, NapiFpProverProof,
},
fq::{
caml_pasta_fq_plonk_proof_batch_verify, caml_pasta_fq_plonk_proof_create,
caml_pasta_fq_plonk_proof_deep_copy, caml_pasta_fq_plonk_proof_dummy,
caml_pasta_fq_plonk_proof_verify, NapiFqLookupCommitments, NapiFqOpeningProof,
NapiFqProofEvaluations, NapiFqProverCommitments, NapiFqProverProof,
},
};
pub use srs::{
caml_fp_srs_from_bytes, caml_fp_srs_from_bytes_external, caml_fp_srs_to_bytes,
caml_fq_srs_from_bytes, caml_fq_srs_from_bytes_external, caml_fq_srs_to_bytes,
fp::NapiFpSrs as WasmFpSrs, fq::NapiFqSrs as WasmFqSrs, *,
caml_fp_srs_to_bytes_external, caml_fq_srs_from_bytes, caml_fq_srs_from_bytes_external,
caml_fq_srs_to_bytes, caml_fq_srs_to_bytes_external, fp::NapiFpSrs as WasmFpSrs,
fq::NapiFqSrs as WasmFqSrs, *,
};
pub use tables::{JsLookupTableFp, JsLookupTableFq, JsRuntimeTableCfgFp, JsRuntimeTableCfgFq};
pub use vector::{
fp::NapiVecVecFp as WasmVecVecFp, fq::NapiVecVecFq as WasmVecVecFq, NapiFlatVector,
};
pub use vector::{fp::WasmVecVecFp, fq::WasmVecVecFq, NapiFlatVector};
pub use wrappers::{
field::{NapiPastaFp as WasmPastaFp, NapiPastaFq as WasmPastaFq},
group::{NapiGPallas as WasmGPallas, NapiGVesta as WasmGVesta},
lookups::{NapiFpRuntimeTable, NapiFqRuntimeTable},
};

pub use plonk_verifier_index::{fp::*, fq::*};

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More changes to come from the child PR #3381.

Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use crate::{
poly_comm::vesta::NapiFpPolyComm,
srs::fp::NapiFpSrs,
wrappers::{field::NapiPastaFp, lookups::NapiLookupInfo},
WasmPastaFpPlonkIndex,
};
use ark_poly::{EvaluationDomain, Radix2EvaluationDomain as Domain};
use kimchi::{
Expand All @@ -16,15 +17,12 @@ use kimchi::{
},
},
linearization::expr_linearization,
verifier_index::{LookupVerifierIndex, VerifierIndex as DlogVerifierIndex},
verifier_index::{LookupVerifierIndex, VerifierIndex},
};
use mina_curves::pasta::{Fp, Pallas as GAffineOther, Vesta as GAffine};
use napi::bindgen_prelude::{Error, Status};
use napi::bindgen_prelude::{Error, External, Status};
use napi_derive::napi;
use poly_commitment::{
commitment::PolyComm,
ipa::{OpeningProof, SRS},
};
use poly_commitment::{commitment::PolyComm, ipa::OpeningProof, SRS};
use serde::{Deserialize, Serialize};
use std::sync::Arc;

Expand All @@ -35,6 +33,22 @@ pub struct NapiFpDomain {
pub group_gen: NapiPastaFp,
}

impl From<NapiFpDomain> for Domain<Fp> {
fn from(domain: NapiFpDomain) -> Self {
let size = 1 << domain.log_size_of_group;
Domain::<Fp>::new(size).expect("Failed to create evaluation domain")
}
}

impl From<&Domain<Fp>> for NapiFpDomain {
fn from(domain: &Domain<Fp>) -> Self {
Self {
log_size_of_group: domain.log_size_of_group as i32,
group_gen: domain.group_gen.into(),
}
}
}

#[napi(object, js_name = "WasmFpShifts")]
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct NapiFpShifts {
Expand All @@ -47,6 +61,20 @@ pub struct NapiFpShifts {
pub s6: NapiPastaFp,
}

impl From<&[Fp; 7]> for NapiFpShifts {
fn from(shifts: &[Fp; 7]) -> Self {
Self {
s0: shifts[0].into(),
s1: shifts[1].into(),
s2: shifts[2].into(),
s3: shifts[3].into(),
s4: shifts[4].into(),
s5: shifts[5].into(),
s6: shifts[6].into(),
}
}
}

#[napi(object, js_name = "WasmFpLookupSelectors")]
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct NapiFpLookupSelectors {
Expand Down Expand Up @@ -182,6 +210,27 @@ pub struct NapiFpPlonkVerificationEvals {
pub rot_comm: Option<NapiFpPolyComm>,
}

impl From<&VerifierIndex<GAffine, OpeningProof<GAffine>>> for NapiFpPlonkVerificationEvals {
fn from(index: &VerifierIndex<GAffine, OpeningProof<GAffine>>) -> Self {
Self {
sigma_comm: index.sigma_comm.iter().map(Into::into).collect(),
coefficients_comm: index.coefficients_comm.iter().map(Into::into).collect(),
generic_comm: index.generic_comm.clone().into(),
psm_comm: index.psm_comm.clone().into(),
complete_add_comm: index.complete_add_comm.clone().into(),
mul_comm: index.mul_comm.clone().into(),
emul_comm: index.emul_comm.clone().into(),
endomul_scalar_comm: index.endomul_scalar_comm.clone().into(),
xor_comm: index.xor_comm.clone().map(Into::into),
range_check0_comm: index.range_check0_comm.clone().map(Into::into),
range_check1_comm: index.range_check1_comm.clone().map(Into::into),
foreign_field_add_comm: index.foreign_field_add_comm.clone().map(Into::into),
foreign_field_mul_comm: index.foreign_field_mul_comm.clone().map(Into::into),
rot_comm: index.rot_comm.clone().map(Into::into),
}
}
}

#[napi(object, js_name = "WasmFpPlonkVerifierIndex")]
#[derive(Clone, Debug, Default)]
pub struct NapiFpPlonkVerifierIndex {
Expand All @@ -196,6 +245,28 @@ pub struct NapiFpPlonkVerifierIndex {
pub zk_rows: i32,
}

#[napi(js_name = "caml_pasta_fp_plonk_verifier_index_create")]
pub fn caml_pasta_fp_plonk_verifier_index_create(
index: &External<WasmPastaFpPlonkIndex>,
) -> NapiFpPlonkVerifierIndex {
index
.0
.srs
.get_lagrange_basis(index.0.as_ref().cs.domain.d1);
let verifier_index = index.0.as_ref().verifier_index();
NapiFpPlonkVerifierIndex::from(&verifier_index)
}

#[napi(js_name = "caml_pasta_fp_plonk_verifier_index_read")]
pub fn caml_pasta_fp_plonk_verifier_index_read(
offset: Option<i32>,
srs: &External<NapiFpSrs>,
path: String,
) -> NapiFpPlonkVerifierIndex {
let vi = read_raw(offset, srs, path)?;
Ok(to_wasm(srs, vi.into()))
}

#[napi(js_name = "caml_pasta_fp_plonk_verifier_index_shifts")]
pub fn caml_pasta_fp_plonk_verifier_index_shifts(
log2_size: i32,
Expand Down Expand Up @@ -223,7 +294,7 @@ pub fn caml_pasta_fp_plonk_verifier_index_shifts(
})
}

impl From<NapiFpPlonkVerifierIndex> for DlogVerifierIndex<GAffine, OpeningProof<GAffine>> {
impl From<NapiFpPlonkVerifierIndex> for VerifierIndex<GAffine, OpeningProof<GAffine>> {
fn from(index: NapiFpPlonkVerifierIndex) -> Self {
let max_poly_size = index.max_poly_size;
let public_ = index.public_;
Expand All @@ -242,7 +313,7 @@ impl From<NapiFpPlonkVerifierIndex> for DlogVerifierIndex<GAffine, OpeningProof<
let index = {
let zk_rows = index.zk_rows as u64;

DlogVerifierIndex {
VerifierIndex {
domain,

sigma_comm: core::array::from_fn(|i| (&evals.sigma_comm[i]).into()),
Expand Down Expand Up @@ -300,6 +371,22 @@ impl From<NapiFpPlonkVerifierIndex> for DlogVerifierIndex<GAffine, OpeningProof<
}
}

impl From<&VerifierIndex<GAffine, OpeningProof<GAffine>>> for NapiFpPlonkVerifierIndex {
fn from(index: &VerifierIndex<GAffine, OpeningProof<GAffine>>) -> Self {
Self {
domain: (&index.domain).into(),
max_poly_size: index.max_poly_size as i32,
public_: index.public as i32,
prev_challenges: index.prev_challenges as i32,
srs: (&index.srs).into(),
evals: index.into(),
shifts: (&index.shift).into(),
lookup_index: index.lookup_index.as_ref().map(Into::into),
zk_rows: index.zk_rows as i32,
}
}
}

fn compute_feature_flags(index: &NapiFpPlonkVerifierIndex) -> FeatureFlags {
let xor = index.evals.xor_comm.is_some();
let range_check0 = index.evals.range_check0_comm.is_some();
Expand Down
Loading
Loading