Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
31 changes: 31 additions & 0 deletions src/bindings/crypto/bindings-napi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { fieldsFromRustFlat, fieldsToRustFlat } from './bindings/conversion-base.js';

export { bindingsNapi };

Check warning on line 3 in src/bindings/crypto/bindings-napi.ts

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (Napi)

function bindingsNapi(napi: any) {

Check warning on line 5 in src/bindings/crypto/bindings-napi.ts

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (napi)

Check warning on line 5 in src/bindings/crypto/bindings-napi.ts

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (Napi)
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;
},
},
};
}
95 changes: 90 additions & 5 deletions src/bindings/crypto/bindings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,19 @@
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';

Check warning on line 19 in src/bindings/crypto/bindings.ts

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (napi)

Check warning on line 19 in src/bindings/crypto/bindings.ts

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (Napi)

export { getRustConversion, RustConversion, Wasm };
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,
Expand All @@ -31,6 +42,12 @@
...FpVectorBindings,
...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)),
};

Expand All @@ -39,7 +56,17 @@

type Wasm = typeof wasmNamespace;

type RustConversion = ReturnType<typeof buildWasmConversion>;

function getRustConversion(wasm: Wasm): RustConversion {
return createRustConversion(wasm);
}

function createRustConversion(wasm: Wasm) {
return buildWasmConversion(wasm);
}

function buildWasmConversion(wasm: Wasm) {
let core = conversionCore(wasm);
let verifierIndex = verifierIndexConversion(wasm, core);
let oracles = oraclesConversion(wasm);
Expand All @@ -55,10 +82,68 @@
};
}

type RustConversion = ReturnType<typeof createRustConversion>;
function createNativeRustConversion(napi: any) {

Check warning on line 85 in src/bindings/crypto/bindings.ts

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (napi)
return bindingsNapi(napi);

Check warning on line 86 in src/bindings/crypto/bindings.ts

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (napi)

Check warning on line 86 in src/bindings/crypto/bindings.ts

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (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<typeof buildConversion>;

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,
};
}

let rustConversion: RustConversion | undefined;
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 };
}
*/
17 changes: 17 additions & 0 deletions src/bindings/scripts/build-o1js-node-artifacts.sh
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@
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"
Expand Down Expand Up @@ -96,6 +100,14 @@
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}"

Check warning on line 108 in src/bindings/scripts/build-o1js-node-artifacts.sh

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (napi)
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
Expand All @@ -114,6 +126,11 @@
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/

Check warning on line 130 in src/bindings/scripts/build-o1js-node-artifacts.sh

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (napi)
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"
Expand Down
1 change: 1 addition & 0 deletions src/build/copy-to-dist.js
Original file line number Diff line number Diff line change
Expand Up @@ -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/',
Expand Down
Loading