Skip to content

Commit 1c351a1

Browse files
authored
Merge pull request #2675 from o1-labs/shigoto/napi-proof/verifier-index
(o1js) Native Prover with Napi - POC - Verifier Index
2 parents c8cbc54 + c6fc9d6 commit 1c351a1

File tree

11 files changed

+95
-86
lines changed

11 files changed

+95
-86
lines changed

src/bindings/crypto/bindings.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* It is exposed to JSOO by populating a global variable with an object.
44
* It gets imported as the first thing in ../../bindings.js so that the global variable is ready by the time JSOO code gets executed.
55
*/
6+
import type * as napiNamespace from '../compiled/node_bindings/plonk_wasm.cjs';
67
import type * as wasmNamespace from '../compiled/node_bindings/plonk_wasm.cjs';
78
import { prefixHashes, prefixHashesLegacy } from '../crypto/constants.js';
89
import { Bigint256Bindings } from './bindings/bigint256.js';
@@ -14,16 +15,15 @@ import { verifierIndexConversion } from './bindings/conversion-verifier-index.js
1415
import { PallasBindings, VestaBindings } from './bindings/curve.js';
1516
import { jsEnvironment } from './bindings/env.js';
1617
import { FpBindings, FqBindings } from './bindings/field.js';
18+
import { FpVectorBindings, FqVectorBindings } from './bindings/vector.js';
1719
import { srs } from './bindings/srs.js';
1820
import { srs as napiSrs } from './napi-srs.js';
19-
import { FpVectorBindings, FqVectorBindings } from './bindings/vector.js';
2021
import { napiConversionCore } from './napi-conversion-core.js';
2122
import { napiProofConversion } from './napi-conversion-proof.js';
22-
import { napiOraclesConversion } from './bindings/napi-conversion-oracles.js';
2323
import { napiVerifierIndexConversion } from './napi-conversion-verifier-index.js';
24-
import type * as napiNamespace from '../compiled/node_bindings/plonk_wasm.cjs';
24+
import { napiOraclesConversion } from './bindings/napi-conversion-oracles.js';
2525

26-
export { RustConversion, Wasm, Napi, createNativeRustConversion, getRustConversion };
26+
export { Napi, RustConversion, Wasm, createNativeRustConversion, getRustConversion };
2727

2828
/* TODO: Uncomment in phase 2 of conversion layer
2929
import { conversionCore as conversionCoreNative } from './native/conversion-core.js';

src/bindings/crypto/bindings/conversion-base.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
import { Field } from './field.js';
2-
import { bigintToBytes32, bytesToBigint32 } from '../bigint-helpers.js';
1+
import type { MlArray } from '../../../lib/ml/base.js';
32
import type {
43
WasmGPallas,
54
WasmGVesta,
65
WasmPallasGProjective,
76
WasmVestaGProjective,
87
} from '../../compiled/node_bindings/plonk_wasm.cjs';
9-
import type { MlArray } from '../../../lib/ml/base.js';
10-
import { OrInfinity, Infinity } from './curve.js';
8+
import { bigintToBytes32, bytesToBigint32 } from '../bigint-helpers.js';
9+
import { Infinity, OrInfinity } from './curve.js';
10+
import { Field } from './field.js';
1111

1212
export {
13-
fieldToRust,
13+
WasmAffine,
14+
WasmProjective,
15+
affineFromRust,
16+
affineToRust,
1417
fieldFromRust,
15-
fieldsToRustFlat,
18+
fieldToRust,
1619
fieldsFromRustFlat,
20+
fieldsToRustFlat,
1721
maybeFieldToRust,
18-
affineToRust,
19-
affineFromRust,
20-
WasmAffine,
21-
WasmProjective,
2222
};
2323

2424
// TODO: Hardcoding this is a little brittle

src/bindings/crypto/bindings/conversion-core.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,9 @@ function conversionCorePerField(
116116
return new PolyComm(rustUnshifted, rustShifted);
117117
},
118118
polyCommFromRust(polyComm: WasmPolyComm): PolyComm {
119-
console.log('polyComm', polyComm);
119+
console.log('polyComm old', polyComm);
120120
let rustUnshifted = polyComm.unshifted;
121-
console.log('polyCommFromRust', rustUnshifted);
121+
console.log('rustUnshifted', rustUnshifted);
122122
let mlUnshifted = mapFromUintArray(rustUnshifted, (ptr) => {
123123
return affineFromRust(wrap(ptr, CommitmentCurve));
124124
});

src/bindings/crypto/bindings/conversion-proof.ts

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,46 @@
1+
import { MlArray, MlOption, MlTuple } from '../../../lib/ml/base.js';
2+
import type * as wasmNamespace from '../../compiled/node_bindings/plonk_wasm.cjs';
13
import type {
24
WasmFpLookupCommitments,
3-
WasmPastaFpLookupTable,
45
WasmFpOpeningProof,
56
WasmFpProverCommitments,
67
WasmFpProverProof,
78
WasmFpRuntimeTable,
8-
WasmPastaFpRuntimeTableCfg,
99
WasmFqLookupCommitments,
1010
WasmFqOpeningProof,
1111
WasmFqProverCommitments,
12-
WasmPastaFqLookupTable,
1312
WasmFqProverProof,
1413
WasmFqRuntimeTable,
14+
WasmPastaFpLookupTable,
15+
WasmPastaFpRuntimeTableCfg,
16+
WasmPastaFqLookupTable,
1517
WasmPastaFqRuntimeTableCfg,
1618
WasmVecVecFp,
1719
WasmVecVecFq,
1820
} from '../../compiled/node_bindings/plonk_wasm.cjs';
19-
import type * as wasmNamespace from '../../compiled/node_bindings/plonk_wasm.cjs';
21+
import {
22+
fieldFromRust,
23+
fieldToRust,
24+
fieldsFromRustFlat,
25+
fieldsToRustFlat,
26+
} from './conversion-base.js';
27+
import { ConversionCore, ConversionCores, mapToUint32Array, unwrap } from './conversion-core.js';
2028
import type {
29+
Field,
30+
LookupCommitments,
31+
LookupTable,
32+
OpeningProof,
2133
OrInfinity,
2234
PointEvaluations,
2335
PolyComm,
24-
ProverProof,
25-
ProofWithPublic,
2636
ProofEvaluations,
37+
ProofWithPublic,
2738
ProverCommitments,
28-
OpeningProof,
39+
ProverProof,
2940
RecursionChallenge,
30-
LookupCommitments,
3141
RuntimeTable,
3242
RuntimeTableCfg,
33-
LookupTable,
34-
Field,
3543
} from './kimchi-types.js';
36-
import { MlArray, MlOption, MlTuple } from '../../../lib/ml/base.js';
37-
import {
38-
fieldToRust,
39-
fieldFromRust,
40-
fieldsToRustFlat,
41-
fieldsFromRustFlat,
42-
} from './conversion-base.js';
43-
import { ConversionCore, ConversionCores, mapToUint32Array, unwrap } from './conversion-core.js';
4444

4545
export { proofConversion };
4646

@@ -178,6 +178,7 @@ function proofConversionPerField(
178178
}
179179

180180
function runtimeTableToRust([, id, data]: RuntimeTable): WasmRuntimeTable {
181+
console.log('old runtime table to rust!');
181182
return new RuntimeTable(id, core.vectorToRust(data));
182183
}
183184

src/bindings/crypto/bindings/conversion-verifier-index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,6 @@ function verifierIndexConversionPerField(
117117
);
118118
}
119119
function verificationEvalsFromRust(evals: WasmVerificationEvals): VerificationEvals {
120-
console.log('evals', evals.coefficients_comm);
121-
122120
let mlEvals: VerificationEvals = [
123121
0,
124122
core.polyCommsFromRust(evals.sigma_comm),

src/bindings/crypto/napi-conversion-core.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
fieldsFromRustFlat,
77
fieldsToRustFlat,
88
} from './bindings/conversion-base.js';
9-
import { mapFromUintArray } from './bindings/conversion-core.js';
109
import { Field, Gate, LookupTable, OrInfinity, PolyComm, Wire } from './bindings/kimchi-types.js';
1110
import { mapTuple } from './bindings/util.js';
1211

@@ -75,8 +74,8 @@ function napiConversionCore(napi: any) {
7574
},
7675
fq: {
7776
...fqCore,
78-
},
79-
...shared,
77+
},
78+
...shared,
8079
};
8180
}
8281

@@ -154,9 +153,9 @@ function conversionCorePerField({ makeAffine, PolyComm }: NapiClasses) {
154153
};
155154
const affineFromRust = (pt: NapiAffine): OrInfinity => {
156155
if (pt.infinity) return 0;
157-
console.log('pt', pt);
158-
console.log('pt.x', pt.x);
159-
console.log('pt.y', pt.y);
156+
// console.log('pt', pt);
157+
// console.log('pt.x', pt.x);
158+
// console.log('pt.y', pt.y);
160159

161160
const xField = fieldFromRust(pt.x);
162161
const yField = fieldFromRust(pt.y);
@@ -182,9 +181,9 @@ function conversionCorePerField({ makeAffine, PolyComm }: NapiClasses) {
182181

183182
const polyCommFromRust = (polyComm: any): any => {
184183
if (polyComm == null) return undefined;
185-
console.log('polyComm', polyComm);
184+
// console.log('polyComm', polyComm);
186185
const rustUnshifted = asArrayLike<NapiAffine>(polyComm.unshifted, 'polyComm.unshifted');
187-
console.log('rustUnshifted', rustUnshifted);
186+
// console.log('rustUnshifted', rustUnshifted);
188187
const mlUnshifted = rustUnshifted.map(affineFromRust);
189188
return [0, [0, ...mlUnshifted]];
190189
};

src/bindings/crypto/napi-conversion-proof.ts

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,55 @@
1+
import { MlArray, MlOption, MlTuple } from '../../lib/ml/base.js';
2+
import type * as napiNamespace from '../compiled/node_bindings/plonk_wasm.cjs';
13
import type {
2-
WasmPastaFpLookupTable,
4+
WasmFpLookupCommitments,
5+
WasmFpOpeningProof,
6+
WasmFpProverCommitments,
7+
WasmFpProverProof,
38
WasmFpRuntimeTable,
9+
WasmFqLookupCommitments,
10+
WasmFqOpeningProof,
11+
WasmFqProverCommitments,
12+
WasmFqProverProof,
13+
WasmFqRuntimeTable,
14+
WasmPastaFpLookupTable,
415
WasmPastaFpRuntimeTableCfg,
516
WasmPastaFqLookupTable,
6-
WasmFqRuntimeTable,
717
WasmPastaFqRuntimeTableCfg,
818
WasmVecVecFp,
919
WasmVecVecFq,
10-
WasmFpProverCommitments,
11-
WasmFqProverCommitments,
12-
WasmFpOpeningProof,
13-
WasmFqOpeningProof,
14-
WasmFpProverProof,
15-
WasmFqProverProof,
16-
WasmFpLookupCommitments,
17-
WasmFqLookupCommitments,
1820
} from '../compiled/node_bindings/plonk_wasm.cjs';
19-
import type * as napiNamespace from '../compiled/node_bindings/plonk_wasm.cjs';
21+
import {
22+
fieldFromRust,
23+
fieldToRust,
24+
fieldsFromRustFlat,
25+
fieldsToRustFlat,
26+
} from './bindings/conversion-base.js';
27+
import type { Field } from './bindings/field.js';
2028
import type {
21-
RuntimeTable,
22-
RuntimeTableCfg,
29+
LookupCommitments,
2330
LookupTable,
31+
OpeningProof,
32+
OrInfinity,
33+
PointEvaluations,
34+
PolyComm,
35+
ProofEvaluations,
2436
ProofWithPublic,
37+
ProverCommitments,
2538
ProverProof,
26-
LookupCommitments,
27-
PolyComm, PointEvaluations, ProofEvaluations,
2839
RecursionChallenge,
29-
ProverCommitments,
30-
OpeningProof,
31-
OrInfinity,
40+
RuntimeTable,
41+
RuntimeTableCfg,
3242
} from './bindings/kimchi-types.js';
33-
import { MlArray, MlTuple, MlOption} from '../../lib/ml/base.js';
34-
import {
35-
fieldsToRustFlat,
36-
fieldToRust,
37-
fieldsFromRustFlat,
38-
fieldFromRust,
39-
} from './bindings/conversion-base.js';
4043
import { ConversionCore, ConversionCores } from './napi-conversion-core.js';
41-
import type { Field } from './bindings/field.js';
4244

4345
export { napiProofConversion };
44-
46+
4547
const fieldToRust_ = (x: Field) => fieldToRust(x);
4648
const proofEvaluationsToRust = mapProofEvaluations(fieldToRust_);
4749
const proofEvaluationsFromRust = mapProofEvaluations(fieldFromRust);
4850
const pointEvalsOptionToRust = mapPointEvalsOption(fieldToRust_);
4951
const pointEvalsOptionFromRust = mapPointEvalsOption(fieldFromRust);
5052

51-
5253
type NapiProofEvaluations = [
5354
0,
5455
MlOption<PointEvaluations<Uint8Array>>,
@@ -129,7 +130,7 @@ function proofConversionPerField(
129130
commitments.free();
130131
return [0, wComm as MlTuple<PolyComm, 15>, zComm, tComm, lookup];
131132
}
132-
133+
133134
function lookupCommitmentsToRust(lookup: LookupCommitments): NapiLookupCommitments {
134135
let sorted = core.polyCommsToRust(lookup[1]);
135136
let aggreg = core.polyCommToRust(lookup[2]);
@@ -143,7 +144,7 @@ function proofConversionPerField(
143144
lookup.free();
144145
return [0, sorted, aggreg, runtime];
145146
}
146-
147+
147148
function openingProofToRust(proof: OpeningProof): NapiOpeningProof {
148149
let [_, [, ...lr], delta, z1, z2, sg] = proof;
149150
// We pass l and r as separate vectors over the FFI
@@ -175,8 +176,9 @@ function proofConversionPerField(
175176
proof.free();
176177
return [0, [0, ...lr], delta, z1, z2, sg];
177178
}
178-
179+
179180
function runtimeTableToRust([, id, data]: RuntimeTable): NapiRuntimeTable {
181+
console.log('runtime table');
180182
return new RuntimeTable(id, core.vectorToRust(data));
181183
}
182184

@@ -251,7 +253,7 @@ function proofConversionPerField(
251253
];
252254
return [0, publicEvals, proof];
253255
},
254-
256+
255257
runtimeTablesToRust([, ...tables]: MlArray<RuntimeTable>): NapiRuntimeTable[] {
256258
return tables.map(runtimeTableToRust);
257259
},

src/bindings/crypto/napi-conversion-verifier-index.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,14 @@ import type {
1616
LookupInfo as WasmLookupInfo,
1717
} from '../compiled/node_bindings/plonk_wasm.cjs';
1818
import { fieldFromRust, fieldToRust } from './bindings/conversion-base.js';
19+
import {
20+
Domain,
21+
Field,
22+
PolyComm,
23+
VerificationEvals,
24+
VerifierIndex,
25+
} from './bindings/kimchi-types.js';
1926
import { ConversionCore, ConversionCores } from './napi-conversion-core.js';
20-
import { Domain, Field, PolyComm, VerificationEvals, VerifierIndex } from './bindings/kimchi-types.js';
2127
import { Lookup, LookupInfo, LookupSelectors } from './bindings/lookup.js';
2228

2329
export { napiVerifierIndexConversion };
@@ -153,6 +159,7 @@ function verifierIndexConversionPerField(
153159
);
154160
}
155161
function lookupVerifierIndexFromRust(lookup: NapiLookupVerifierIndex): Lookup<PolyComm> {
162+
console.log('lookup: ', lookup);
156163
let mlLookup: Lookup<PolyComm> = [
157164
0,
158165
MlBool(lookup.joint_lookup_used),
@@ -259,7 +266,7 @@ function verifierIndexConversionPerField(
259266
);
260267
},
261268
verifierIndexFromRust(vk: NapiVerifierIndex): VerifierIndex {
262-
console.log('vk from rust', vk);
269+
console.log('vk lookup index from rust', vk.lookup_index);
263270
let mlVk: VerifierIndex = [
264271
0,
265272
domainFromRust(vk.domain),

0 commit comments

Comments
 (0)