From ba4289c0409de6dc1a51db8108f741ef04840679 Mon Sep 17 00:00:00 2001 From: leon chou Date: Mon, 27 Oct 2025 10:22:25 -0400 Subject: [PATCH 1/3] native prover build with proper types --- Cargo.lock | 103 +++++++++++++++++++++++++++------ Cargo.toml | 4 +- plonk-napi/src/circuit.rs | 2 +- plonk-napi/src/lib.rs | 4 +- plonk-napi/src/prover_index.rs | 21 +++++++ plonk-napi/src/types.rs | 26 ++------- 6 files changed, 116 insertions(+), 44 deletions(-) create mode 100644 plonk-napi/src/prover_index.rs diff --git a/Cargo.lock b/Cargo.lock index d7aaf3c947..c18856c343 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -905,6 +905,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "convert_case" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -1025,6 +1034,38 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "ctor" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67773048316103656a637612c4a62477603b777d91d9c62ff2290f9cde178fdb" +dependencies = [ + "ctor-proc-macro 0.0.6", + "dtor", +] + +[[package]] +name = "ctor" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c9b8bdf64ee849747c1b12eb861d21aa47fa161564f48332f1afe2373bf899" +dependencies = [ + "ctor-proc-macro 0.0.7", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + [[package]] name = "cty" version = "0.2.2" @@ -1148,6 +1189,21 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "dtor" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e58a0764cddb55ab28955347b45be00ade43d4d6f3ba4bf3dc354e4ec9432934" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + [[package]] name = "educe" version = "0.6.0" @@ -2388,15 +2444,16 @@ dependencies = [ [[package]] name = "napi" -version = "2.16.17" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55740c4ae1d8696773c78fdafd5d0e5fe9bc9f1b071c7ba493ba5c413a9184f3" +checksum = "f1b74e3dce5230795bb4d2821b941706dee733c7308752507254b0497f39cad7" dependencies = [ "bitflags 2.4.2", - "ctor", - "napi-derive", + "ctor 0.5.0", + "napi-build", "napi-sys", - "once_cell", + "nohash-hasher", + "rustc-hash", ] [[package]] @@ -2407,12 +2464,12 @@ checksum = "dcae8ad5609d14afb3a3b91dee88c757016261b151e9dcecabf1b2a31a6cab14" [[package]] name = "napi-derive" -version = "2.16.13" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cbe2585d8ac223f7d34f13701434b9d5f4eb9c332cccce8dee57ea18ab8ab0c" +checksum = "78665d6bdf10e9a4e6b38123efb0f66962e6197c1aea2f07cff3f159a374696d" dependencies = [ - "cfg-if 1.0.0", - "convert_case", + "convert_case 0.8.0", + "ctor 0.6.0", "napi-derive-backend", "proc-macro2", "quote", @@ -2421,24 +2478,22 @@ dependencies = [ [[package]] name = "napi-derive-backend" -version = "1.0.75" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1639aaa9eeb76e91c6ae66da8ce3e89e921cd3885e99ec85f4abacae72fc91bf" +checksum = "42d55d01423e7264de3acc13b258fa48ca7cf38a4d25db848908ec3c1304a85a" dependencies = [ - "convert_case", - "once_cell", + "convert_case 0.8.0", "proc-macro2", "quote", - "regex", "semver", "syn 2.0.100", ] [[package]] name = "napi-sys" -version = "2.4.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427802e8ec3a734331fec1035594a210ce1ff4dc5bc1950530920ab717964ea3" +checksum = "1ed8f0e23a62a3ce0fbb6527cdc056e9282ddd9916b068c46f8923e18eed5ee6" dependencies = [ "libloading", ] @@ -2491,6 +2546,12 @@ dependencies = [ "libc", ] +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + [[package]] name = "nom" version = "7.1.3" @@ -2696,7 +2757,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7543703a85e10e5fd49258c8c820bda6e909d0feaf02f6db25197fe4b5f36bac" dependencies = [ - "convert_case", + "convert_case 0.6.0", "proc-macro2", "quote", "syn 1.0.109", @@ -3378,6 +3439,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustix" version = "0.38.30" @@ -3478,7 +3545,7 @@ dependencies = [ "ark-std", "clap 4.4.18", "criterion", - "ctor", + "ctor 0.2.9", "hex", "kimchi", "mina-curves", diff --git a/Cargo.toml b/Cargo.toml index cbb7773e07..7c1874723c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,8 +62,8 @@ libflate = "2" log = "0.4.20" num-bigint = { version = "0.4.4", features = ["rand", "serde"] } num-integer = "0.1.45" -napi = { version = "2.16.8", default-features = false, features = ["napi7"] } -napi-derive = "2.16.8" +napi = { version = "3.3.0", default-features = false, features = ["napi7"] } +napi-derive = { version = "3.3.0", features = ["type-def"] } napi-build = "2.1.0" ocaml = { version = "0.22.2" } ocaml-gen = { version = "1.0.0" } diff --git a/plonk-napi/src/circuit.rs b/plonk-napi/src/circuit.rs index 0c2a850228..81a20456b6 100644 --- a/plonk-napi/src/circuit.rs +++ b/plonk-napi/src/circuit.rs @@ -30,7 +30,7 @@ where } #[napi] -pub fn prover_to_json(prover_index: External) -> String { +pub fn prover_to_json(prover_index: &External) -> String { let circuit: Circuit = prover_index.0.cs.as_ref().into(); serde_json::to_string(&circuit).expect("couldn't serialize constraints") } diff --git a/plonk-napi/src/lib.rs b/plonk-napi/src/lib.rs index f0c304a7b9..7bda3894ce 100644 --- a/plonk-napi/src/lib.rs +++ b/plonk-napi/src/lib.rs @@ -1,8 +1,10 @@ mod circuit; mod poseidon; mod types; +mod prover_index; pub use poseidon::{caml_pasta_fp_poseidon_block_cipher, caml_pasta_fq_poseidon_block_cipher}; pub use circuit::prover_to_json; -pub use types::{prover_index_from_bytes, prover_index_to_bytes, WasmPastaFpPlonkIndex}; +pub use prover_index::{prover_index_from_bytes, prover_index_to_bytes}; +pub use types::WasmPastaFpPlonkIndex; diff --git a/plonk-napi/src/prover_index.rs b/plonk-napi/src/prover_index.rs new file mode 100644 index 0000000000..c38c47c3e3 --- /dev/null +++ b/plonk-napi/src/prover_index.rs @@ -0,0 +1,21 @@ +use napi::bindgen_prelude::*; +use napi_derive::napi; + +use crate::types::WasmPastaFpPlonkIndex; + +// TOOD: remove incl all dependencies when no longer needed and we only pass napi objects around +#[napi] +pub fn prover_index_from_bytes(bytes: Uint8Array) -> Result> { + let index = WasmPastaFpPlonkIndex::deserialize_inner(bytes.as_ref()) + .map_err(|e| Error::new(Status::InvalidArg, e))?; + Ok(External::new(index)) +} + +// TOOD: remove incl all dependencies when no longer needed and we only pass napi objects around +#[napi] +pub fn prover_index_to_bytes(index: &External) -> Result { + let bytes = index + .serialize_inner() + .map_err(|e| Error::new(Status::GenericFailure, e))?; + Ok(Uint8Array::from(bytes)) +} diff --git a/plonk-napi/src/types.rs b/plonk-napi/src/types.rs index 985bf50d35..50091937f2 100644 --- a/plonk-napi/src/types.rs +++ b/plonk-napi/src/types.rs @@ -1,8 +1,7 @@ use kimchi::{linearization::expr_linearization, prover_index::ProverIndex}; use mina_curves::pasta::{Vesta as GAffine, VestaParameters}; use mina_poseidon::{constants::PlonkSpongeConstantsKimchi, sponge::DefaultFqSponge}; -use napi::bindgen_prelude::{Error, External, Result as NapiResult, Status, Uint8Array}; -use napi_derive::napi; + use poly_commitment::ipa::{OpeningProof, SRS}; use serde::{Deserialize, Serialize}; use std::{io::Cursor, sync::Arc}; @@ -18,7 +17,7 @@ struct SerializedProverIndex { // TOOD: remove incl all dependencies when no longer needed and we only pass napi objects around impl WasmPastaFpPlonkIndex { - fn serialize_inner(&self) -> Result, String> { + pub fn serialize_inner(&self) -> Result, String> { let prover_index = rmp_serde::to_vec(self.0.as_ref()).map_err(|e| e.to_string())?; let mut srs = Vec::new(); @@ -32,7 +31,7 @@ impl WasmPastaFpPlonkIndex { rmp_serde::to_vec(&serialized).map_err(|e| e.to_string()) } - fn deserialize_inner(bytes: &[u8]) -> Result { + pub fn deserialize_inner(bytes: &[u8]) -> Result { let serialized: SerializedProverIndex = rmp_serde::from_slice(bytes).map_err(|e| e.to_string())?; @@ -59,21 +58,4 @@ impl WasmPastaFpPlonkIndex { Ok(WasmPastaFpPlonkIndex(Box::new(index))) } -} - -// TOOD: remove incl all dependencies when no longer needed and we only pass napi objects around -#[napi] -pub fn prover_index_from_bytes(bytes: Uint8Array) -> NapiResult> { - let index = WasmPastaFpPlonkIndex::deserialize_inner(bytes.as_ref()) - .map_err(|e| Error::new(Status::InvalidArg, e))?; - Ok(External::new(index)) -} - -// TOOD: remove incl all dependencies when no longer needed and we only pass napi objects around -#[napi] -pub fn prover_index_to_bytes(index: External) -> NapiResult { - let bytes = index - .serialize_inner() - .map_err(|e| Error::new(Status::GenericFailure, e))?; - Ok(Uint8Array::from(bytes)) -} +} \ No newline at end of file From bcc5eb607b9ad42a56f6aa81afcb8a24d49bb996 Mon Sep 17 00:00:00 2001 From: leon chou Date: Tue, 28 Oct 2025 10:49:19 -0400 Subject: [PATCH 2/3] add build info --- plonk-napi/src/build_info.rs | 25 +++++++++++++++++++++++++ plonk-napi/src/lib.rs | 1 + 2 files changed, 26 insertions(+) create mode 100644 plonk-napi/src/build_info.rs diff --git a/plonk-napi/src/build_info.rs b/plonk-napi/src/build_info.rs new file mode 100644 index 0000000000..802a255dba --- /dev/null +++ b/plonk-napi/src/build_info.rs @@ -0,0 +1,25 @@ +use napi_derive::napi; + +#[cfg(target_os = "windows")] +#[napi] +pub const OS_NAME: &str = "Windows"; + +#[cfg(target_os = "linux")] +#[napi] +pub const OS_NAME: &str = "Linux"; + +#[cfg(target_os = "macos")] +#[napi] +pub const OS_NAME: &str = "macOS"; + +#[cfg(target_arch = "x86_64")] +#[napi] +pub const ARCH_NAME: &str = "x86_64"; + +#[cfg(target_arch = "arm")] +#[napi] +pub const ARCH_NAME: &str = "ARM"; + +#[cfg(target_arch = "aarch64")] +#[napi] +pub const ARCH_NAME: &str = "AArch64"; diff --git a/plonk-napi/src/lib.rs b/plonk-napi/src/lib.rs index 7bda3894ce..a9760208b0 100644 --- a/plonk-napi/src/lib.rs +++ b/plonk-napi/src/lib.rs @@ -2,6 +2,7 @@ mod circuit; mod poseidon; mod types; mod prover_index; +mod build_info; pub use poseidon::{caml_pasta_fp_poseidon_block_cipher, caml_pasta_fq_poseidon_block_cipher}; From ab2d728c46287f905bd6b08e2952297f735bccf7 Mon Sep 17 00:00:00 2001 From: leon chou Date: Thu, 30 Oct 2025 13:11:52 -0400 Subject: [PATCH 3/3] pub(crate) --- plonk-napi/src/types.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plonk-napi/src/types.rs b/plonk-napi/src/types.rs index 50091937f2..d80cf1495b 100644 --- a/plonk-napi/src/types.rs +++ b/plonk-napi/src/types.rs @@ -17,7 +17,7 @@ struct SerializedProverIndex { // TOOD: remove incl all dependencies when no longer needed and we only pass napi objects around impl WasmPastaFpPlonkIndex { - pub fn serialize_inner(&self) -> Result, String> { + pub(crate) fn serialize_inner(&self) -> Result, String> { let prover_index = rmp_serde::to_vec(self.0.as_ref()).map_err(|e| e.to_string())?; let mut srs = Vec::new(); @@ -31,7 +31,7 @@ impl WasmPastaFpPlonkIndex { rmp_serde::to_vec(&serialized).map_err(|e| e.to_string()) } - pub fn deserialize_inner(bytes: &[u8]) -> Result { + pub(crate) fn deserialize_inner(bytes: &[u8]) -> Result { let serialized: SerializedProverIndex = rmp_serde::from_slice(bytes).map_err(|e| e.to_string())?;