From 194784830c190f9b692c98d4b376fcab2869c8af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=C3=AFs=20Querol?= Date: Tue, 30 Sep 2025 17:07:09 +0200 Subject: [PATCH 1/6] scripts: update build to account for napi --- .../scripts/build-o1js-node-artifacts.sh | 17 +++++++++++++++++ src/build/copy-to-dist.js | 1 + 2 files changed, 18 insertions(+) diff --git a/src/bindings/scripts/build-o1js-node-artifacts.sh b/src/bindings/scripts/build-o1js-node-artifacts.sh index 045a8d9922..4c2698afe3 100755 --- a/src/bindings/scripts/build-o1js-node-artifacts.sh +++ b/src/bindings/scripts/build-o1js-node-artifacts.sh @@ -51,6 +51,10 @@ run_cmd cp "${MINA_PATH}"/src/config.mlh "src" run_cmd cp -r "${MINA_PATH}"/src/config "src/config" ok "Mina config files copied" +info "Building Kimchi native bindings for Node.js..." +run_cmd dune b "${KIMCHI_BINDINGS}"/js/native +ok "Kimchi native bindings built" + info "Building Kimchi bindings for Node.js..." run_cmd dune b "${KIMCHI_BINDINGS}"/js/node_js ok "Kimchi bindings built" @@ -96,6 +100,14 @@ run_cmd mkdir -p "${BINDINGS_PATH}" run_cmd chmod -R 777 "${BINDINGS_PATH}" ok "Output directory prepared" +info "Preparing native bindings directory..." +run_cmd mkdir -p src/bindings/compiled/native +ok "Native bindings directory prepared" + +info "Copying N-API bindings..." +run_cmd cp _build/default/"${KIMCHI_BINDINGS}"/js/native/plonk_napi* "${BINDINGS_PATH}" +ok "N-API bindings copied" + info "Copying WASM bindings..." run_cmd cp _build/default/"${KIMCHI_BINDINGS}"/js/node_js/plonk_wasm* "${BINDINGS_PATH}" run_cmd mv -f "${BINDINGS_PATH}"/plonk_wasm.js "${BINDINGS_PATH}"/plonk_wasm.cjs @@ -114,6 +126,11 @@ fi run_cmd mv -f "${BINDINGS_PATH}"/o1js_node.bc.js "${BINDINGS_PATH}"/o1js_node.bc.cjs ok "Node.js bindings copied" +info "Copying native bindings..." +run_cmd cp _build/default/"${KIMCHI_BINDINGS}"/js/native/plonk_napi.node src/bindings/compiled/native/ +run_cmd chmod 777 src/bindings/compiled/native/plonk_napi.node +ok "Native bindings copied" + info "Updating WASM references in bindings..." run_cmd sed -i 's/plonk_wasm.js/plonk_wasm.cjs/' "${BINDINGS_PATH}"/o1js_node.bc.cjs ok "WASM references updated" diff --git a/src/build/copy-to-dist.js b/src/build/copy-to-dist.js index d2786c8582..6a3db7a1bd 100644 --- a/src/build/copy-to-dist.js +++ b/src/build/copy-to-dist.js @@ -5,6 +5,7 @@ await copyFromTo( [ 'src/bindings.d.ts', 'src/bindings/compiled/_node_bindings', + 'src/bindings/compiled/native', 'src/bindings/compiled/node_bindings/plonk_wasm.d.cts', ], 'src/', From 3d7a180e7041f006d9d12f3e59e472a5f52e971c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=C3=AFs=20Querol?= Date: Thu, 2 Oct 2025 16:41:46 +0200 Subject: [PATCH 2/6] bindings: initialize native conversion --- src/bindings/crypto/bindings.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/bindings/crypto/bindings.ts b/src/bindings/crypto/bindings.ts index 8e9fcb35ff..f98c8dcc6f 100644 --- a/src/bindings/crypto/bindings.ts +++ b/src/bindings/crypto/bindings.ts @@ -17,7 +17,7 @@ import { oraclesConversion } from './bindings/conversion-oracles.js'; import { jsEnvironment } from './bindings/env.js'; import { srs } from './bindings/srs.js'; -export { getRustConversion, RustConversion, Wasm }; +export { getRustConversion, RustConversion, Wasm, createNativeRustConversion }; const tsBindings = { jsEnvironment, @@ -31,6 +31,7 @@ const tsBindings = { ...FpVectorBindings, ...FqVectorBindings, rustConversion: createRustConversion, + nativeRustConversion: createNativeRustConversion, srs: (wasm: Wasm) => srs(wasm, getRustConversion(wasm)), }; @@ -39,7 +40,15 @@ const tsBindings = { type Wasm = typeof wasmNamespace; +function createNativeRustConversion(wasm: Wasm) { + return buildConversion(wasm); +} + function createRustConversion(wasm: Wasm) { + return buildConversion(wasm); +} + +function buildConversion(wasm: Wasm) { let core = conversionCore(wasm); let verifierIndex = verifierIndexConversion(wasm, core); let oracles = oraclesConversion(wasm); @@ -55,7 +64,7 @@ function createRustConversion(wasm: Wasm) { }; } -type RustConversion = ReturnType; +type RustConversion = ReturnType; let rustConversion: RustConversion | undefined; From 9933ac2d42e15c770e51b677e10cdff5ac35a1ad Mon Sep 17 00:00:00 2001 From: Florian Date: Wed, 8 Oct 2025 15:47:46 +0700 Subject: [PATCH 3/6] proxy for napi conversion core --- src/bindings/crypto/bindings-napi.ts | 31 ++++++++++++++++++++++++++++ src/bindings/crypto/bindings.ts | 5 +++-- 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 src/bindings/crypto/bindings-napi.ts diff --git a/src/bindings/crypto/bindings-napi.ts b/src/bindings/crypto/bindings-napi.ts new file mode 100644 index 0000000000..824e31e187 --- /dev/null +++ b/src/bindings/crypto/bindings-napi.ts @@ -0,0 +1,31 @@ +import { fieldsFromRustFlat, fieldsToRustFlat } from './bindings/conversion-base.js'; + +export { bindingsNapi }; + +function bindingsNapi(napi: any) { + return { + fp: { + vectorToRust: (fields: any) => { + console.log('values going in ', fields); + let res = fieldsToRustFlat(fields); + console.log('values going out ', res); + return res; + }, + vectorFromRust: fieldsFromRustFlat, + }, + fq: { + vectorToRust: (fields: any) => { + console.log('values going in ', fields); + let res = fieldsToRustFlat(fields); + console.log('values going out ', res); + return res; + }, + vectorFromRust: (fieldBytes: any) => { + console.log('values going in ', fieldBytes); + let res = fieldsFromRustFlat(fieldBytes); + console.log('values going out ', res); + return res; + }, + }, + }; +} diff --git a/src/bindings/crypto/bindings.ts b/src/bindings/crypto/bindings.ts index f98c8dcc6f..abd3d879d9 100644 --- a/src/bindings/crypto/bindings.ts +++ b/src/bindings/crypto/bindings.ts @@ -16,6 +16,7 @@ import { verifierIndexConversion } from './bindings/conversion-verifier-index.js import { oraclesConversion } from './bindings/conversion-oracles.js'; import { jsEnvironment } from './bindings/env.js'; import { srs } from './bindings/srs.js'; +import { bindingsNapi } from './bindings-napi.js'; export { getRustConversion, RustConversion, Wasm, createNativeRustConversion }; @@ -40,8 +41,8 @@ const tsBindings = { type Wasm = typeof wasmNamespace; -function createNativeRustConversion(wasm: Wasm) { - return buildConversion(wasm); +function createNativeRustConversion(napi: any) { + return bindingsNapi(napi); } function createRustConversion(wasm: Wasm) { From f4d9de4c518acd45f419af2dc25c93dad530163d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=C3=AFs=20Querol?= Date: Tue, 30 Sep 2025 17:07:20 +0200 Subject: [PATCH 4/6] submodule: update mina --- src/mina | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mina b/src/mina index 569e99c958..c0e7f3e780 160000 --- a/src/mina +++ b/src/mina @@ -1 +1 @@ -Subproject commit 569e99c95834841d64858644c5d80ac7e63d0157 +Subproject commit c0e7f3e78050705ee2973991ecc704d6fba3160b From 936d9f0aa7227e313b7e250b330452f9f6091eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=C3=AFs=20Querol?= Date: Thu, 9 Oct 2025 16:44:01 +0200 Subject: [PATCH 5/6] bindings: comment out conversion bundle --- src/bindings/crypto/bindings.ts | 89 ++++++++++++++++++++++++++++++--- 1 file changed, 82 insertions(+), 7 deletions(-) diff --git a/src/bindings/crypto/bindings.ts b/src/bindings/crypto/bindings.ts index abd3d879d9..a616c8b3a8 100644 --- a/src/bindings/crypto/bindings.ts +++ b/src/bindings/crypto/bindings.ts @@ -20,6 +20,16 @@ import { bindingsNapi } from './bindings-napi.js'; export { getRustConversion, RustConversion, Wasm, createNativeRustConversion }; + +/* TODO: Uncomment in phase 2 of conversion layer +import { conversionCore as conversionCoreNative } from './native/conversion-core.js'; +import { fieldsFromRustFlat as fieldsFromRustFlatNative, fieldsToRustFlat as fieldsToRustFlatNative } from './native/conversion-base.js'; +import { proofConversion as proofConversionNative } from './native/conversion-proof.js'; +import { verifierIndexConversion as verifierIndexConversionNative } from './native/conversion-verifier-index.js'; +import { oraclesConversion as oraclesConversionNative } from './native/conversion-oracles.js'; + +export { getRustConversion, type RustConversion, type NativeConversion, type Wasm };*/ + const tsBindings = { jsEnvironment, prefixHashes, @@ -33,6 +43,11 @@ const tsBindings = { ...FqVectorBindings, rustConversion: createRustConversion, nativeRustConversion: createNativeRustConversion, + /* TODO: Uncomment in phase 2 of conversion layer + srs: (wasm: Wasm) => { + const bundle = getConversionBundle(wasm); + return bundle.srsFactory(wasm, bundle.conversion); + },*/ srs: (wasm: Wasm) => srs(wasm, getRustConversion(wasm)), }; @@ -41,15 +56,17 @@ const tsBindings = { type Wasm = typeof wasmNamespace; -function createNativeRustConversion(napi: any) { - return bindingsNapi(napi); +type RustConversion = ReturnType; + +function getRustConversion(wasm: Wasm): RustConversion { + return createRustConversion(wasm); } function createRustConversion(wasm: Wasm) { - return buildConversion(wasm); + return buildWasmConversion(wasm); } -function buildConversion(wasm: Wasm) { +function buildWasmConversion(wasm: Wasm) { let core = conversionCore(wasm); let verifierIndex = verifierIndexConversion(wasm, core); let oracles = oraclesConversion(wasm); @@ -65,10 +82,68 @@ function buildConversion(wasm: Wasm) { }; } +function createNativeRustConversion(napi: any) { + return bindingsNapi(napi); +} + +/* TODO: Uncomment in phase 2 of conversion layer + +function shouldUseNativeConversion(wasm: Wasm): boolean { + const marker = (wasm as any).__kimchi_use_native; + const globalMarker = + typeof globalThis !== 'undefined' && + (globalThis as any).__kimchi_use_native; + return Boolean(marker || globalMarker); +} + +function createRustConversion(wasm: Wasm): RustConversion { + return shouldUseNativeConversion(wasm) + ? createNativeConversion(wasm) + : createWasmConversion(wasm); +} + +function createWasmConversion(wasm: Wasm) { + const core = conversionCore(wasm); + const verifierIndex = verifierIndexConversion(wasm, core); + const oracles = oraclesConversion(wasm); + const proof = proofConversion(wasm, core); + + return { + fp: { ...core.fp, ...verifierIndex.fp, ...oracles.fp, ...proof.fp }, + fq: { ...core.fq, ...verifierIndex.fq, ...oracles.fq, ...proof.fq }, + fieldsToRustFlat, + fieldsFromRustFlat, + wireToRust: core.wireToRust, + mapMlArrayToRustVector: core.mapMlArrayToRustVector, + }; +} + type RustConversion = ReturnType; -let rustConversion: RustConversion | undefined; +function createNativeConversion(wasm: Wasm) { + const core = conversionCoreNative(wasm); + const verifierIndex = verifierIndexConversionNative(wasm, core); + const oracles = oraclesConversionNative(wasm); + const proof = proofConversionNative(wasm, core); + + return { + fp: { ...core.fp, ...verifierIndex.fp, ...oracles.fp, ...proof.fp }, + fq: { ...core.fq, ...verifierIndex.fq, ...oracles.fq, ...proof.fq }, + fieldsToRustFlatNative, + fieldsFromRustFlatNative, + wireToRust: core.wireToRust, + mapMlArrayToRustVector: core.mapMlArrayToRustVector, + }; +} + +type ConversionBundle = + | { conversion: WasmConversion; srsFactory: typeof srs } + | { conversion: NativeConversion; srsFactory: typeof srsNative }; -function getRustConversion(wasm: Wasm) { - return rustConversion ?? (rustConversion = createRustConversion(wasm)); +function getConversionBundle(wasm: Wasm): ConversionBundle { + if (shouldUseNativeConversion(wasm)) { + return { conversion: createNativeConversion(wasm), srsFactory: srsNative }; + } + return { conversion: createWasmConversion(wasm), srsFactory: srs }; } +*/ From b46036fd0622da095fff213951bb9aaecf03ff74 Mon Sep 17 00:00:00 2001 From: querolita Date: Thu, 16 Oct 2025 19:46:32 +0200 Subject: [PATCH 6/6] submodule: update mina --- src/mina | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mina b/src/mina index c0e7f3e780..fa807948b4 160000 --- a/src/mina +++ b/src/mina @@ -1 +1 @@ -Subproject commit c0e7f3e78050705ee2973991ecc704d6fba3160b +Subproject commit fa807948b4298eabff9ecf79418068e58415bc91