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
1 change: 1 addition & 0 deletions .config/cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@
"minascan",
"modul",
"Muls",
"napi",
"Nexts",
"nixbuild",
"nixfmt",
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
"build:jsoo": "npm run build:jsoo:web && npm run build:jsoo:node",
"build:jsoo:web": "./scripts/build/jsoo/build-web.sh",
"build:jsoo:node": "./scripts/build/jsoo/build-node.sh",
"build:native:node": "./scripts/build/native/build-node.sh",
"build:docs": "typedoc",
"prepublish:web": "./scripts/prepublish/prepublish-web.sh",
"prepublish:node": "./scripts/prepublish/prepublish-node.sh",
Expand Down
23 changes: 23 additions & 0 deletions scripts/build/native/build-node.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/usr/bin/env bash
set -Eeuo pipefail

source ./scripts/lib/ux.sh

setup_script "native-node-build" "native node build"

KIMCHI_PATH=./src/mina/src/lib/crypto/kimchi_bindings/js/native
BUILT_PATH=./_build/default/$KIMCHI_PATH
BINDINGS_PATH=./src/bindings/compiled/native

mkdir -p $BINDINGS_PATH

info "building native Kimchi bindings..."

dune build $KIMCHI_PATH

info "copying artifacts into the right place..."

cp $BUILT_PATH/plonk_napi.node $BINDINGS_PATH/plonk_napi.node
chmod 660 $BINDINGS_PATH/plonk_napi.node

success "Native build success!"
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 };

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;
},
},
};
}
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 { 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 };
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 @@ const tsBindings = {
...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 @@ const tsBindings = {

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 @@ function createRustConversion(wasm: Wasm) {
};
}

type RustConversion = ReturnType<typeof createRustConversion>;
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<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 };
}
*/
1 change: 1 addition & 0 deletions src/bindings/scripts/build-o1js-node-artifacts.sh
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ ok "Mina config files copied"

npm run build:wasm:node
npm run build:jsoo:node
npm run build:native:node

info "Building transaction layout TypeScript definitions..."
run_cmd dune b src/bindings/mina-transaction/gen/v1/js-layout.ts \
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
21 changes: 6 additions & 15 deletions src/examples/zkfunction/preimage.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Poseidon, Field, Experimental } from 'o1js';
import { Experimental, Field, Poseidon } from 'o1js';
const { ZkFunction } = Experimental;

/**
Expand All @@ -16,17 +16,8 @@ const main = ZkFunction({
},
});

console.log('compile...');
const { verificationKey } = await main.compile();

const preimage = Field(1);
const hash = Poseidon.hash([preimage]);

console.log('prove...');
const pi = await main.prove(hash, preimage);

console.log('verify...');
let ok = await main.verify(pi, verificationKey);
console.log('ok?', ok);

if (!ok) throw Error('verification failed');
await main.compile();
console.log('analyze');
let res = await main.analyzeMethod();
console.log('done');
console.log(res);