Skip to content

Commit 1793999

Browse files
authored
Merge pull request #2658 from o1-labs/querolita/napi-vindex
(`o1js`) Native Prover with Napi - Verifier Index
2 parents bd7613a + 1c351a1 commit 1793999

File tree

12 files changed

+398
-106
lines changed

12 files changed

+398
-106
lines changed

src/bindings/crypto/bindings.ts

Lines changed: 8 additions & 6 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,15 +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';
17-
import { napiOraclesConversion } from './bindings/napi-conversion-oracles.js';
18+
import { FpVectorBindings, FqVectorBindings } from './bindings/vector.js';
1819
import { srs } from './bindings/srs.js';
1920
import { srs as napiSrs } from './napi-srs.js';
20-
import { FpVectorBindings, FqVectorBindings } from './bindings/vector.js';
2121
import { napiConversionCore } from './napi-conversion-core.js';
2222
import { napiProofConversion } from './napi-conversion-proof.js';
23-
import type * as napiNamespace from '../compiled/node_bindings/plonk_wasm.cjs';
23+
import { napiVerifierIndexConversion } from './napi-conversion-verifier-index.js';
24+
import { napiOraclesConversion } from './bindings/napi-conversion-oracles.js';
2425

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

2728
/* TODO: Uncomment in phase 2 of conversion layer
2829
import { conversionCore as conversionCoreNative } from './native/conversion-core.js';
@@ -90,10 +91,11 @@ function buildWasmConversion(wasm: Wasm) {
9091
function createNativeRustConversion(napi: any) {
9192
let core = napiConversionCore(napi);
9293
let proof = napiProofConversion(napi, core);
94+
let verif = napiVerifierIndexConversion(napi, core);
9395
let oracles = napiOraclesConversion(napi);
9496
return {
95-
fp: { ...core.fp, ...proof.fp, ...oracles.fp },
96-
fq: { ...core.fq, ...proof.fq, ...oracles.fq },
97+
fp: { ...core.fp, ...proof.fp, ...verif.fp, ...oracles.fp },
98+
fq: { ...core.fq, ...proof.fq, ...verif.fq, ...oracles.fq },
9799
};
98100
}
99101

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/bindings/srs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ function srsPerField(f: 'fp' | 'fq', wasm: Wasm, conversion: RustConversion) {
104104
let maybeLagrangeCommitment = (srs: WasmSrs, domain_size: number, i: number) => {
105105
try {
106106
console.log(3);
107-
console.log('srs', srs);
107+
console.log('srs wasm', srs);
108108
let bytes = (wasm as any)[`caml_${f}_srs_to_bytes_external`](srs);
109109
console.log('bytes', bytes);
110110
let wasmSrs = undefined;

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

Lines changed: 10 additions & 22 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

@@ -70,13 +69,11 @@ function napiConversionCore(napi: any) {
7069
};
7170

7271
return {
73-
fp: { ...fpCore },
72+
fp: {
73+
...fpCore,
74+
},
7475
fq: {
7576
...fqCore,
76-
shiftsFromRust: (s: any) => {
77-
let shifts = [s.s0, s.s1, s.s2, s.s3, s.s4, s.s5, s.s6];
78-
return [0, ...shifts.map(fieldFromRust)];
79-
},
8077
},
8178
...shared,
8279
};
@@ -156,9 +153,9 @@ function conversionCorePerField({ makeAffine, PolyComm }: NapiClasses) {
156153
};
157154
const affineFromRust = (pt: NapiAffine): OrInfinity => {
158155
if (pt.infinity) return 0;
159-
console.log('pt', pt);
160-
console.log('pt.x', pt.x);
161-
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);
162159

163160
const xField = fieldFromRust(pt.x);
164161
const yField = fieldFromRust(pt.y);
@@ -182,22 +179,13 @@ function conversionCorePerField({ makeAffine, PolyComm }: NapiClasses) {
182179
return new PolyCommClass(unshifted as unknown, undefined);
183180
};
184181

185-
/* const polyCommFromRust = (polyComm: NapiPolyComm): PolyComm => {
186-
console.log('polyComm', polyComm);
182+
const polyCommFromRust = (polyComm: any): any => {
183+
if (polyComm == null) return undefined;
184+
// console.log('polyComm', polyComm);
187185
const rustUnshifted = asArrayLike<NapiAffine>(polyComm.unshifted, 'polyComm.unshifted');
188-
console.log('rustUnshifted', rustUnshifted);
186+
// console.log('rustUnshifted', rustUnshifted);
189187
const mlUnshifted = rustUnshifted.map(affineFromRust);
190188
return [0, [0, ...mlUnshifted]];
191-
}; */
192-
const polyCommFromRust = (polyComm: any): any => {
193-
let rustUnshifted = polyComm.unshifted;
194-
console.log('rustUnshifted', rustUnshifted);
195-
let mlUnshifted = mapFromUintArray(rustUnshifted, (ptr) => {
196-
console.log('ptr', ptr);
197-
/* return affineFromRust(wrap(ptr, CommitmentCurve));
198-
*/
199-
});
200-
return [0, [0, ...mlUnshifted]];
201189
};
202190

203191
const polyCommsToRust = ([, ...comms]: MlArray<PolyComm>): NapiPolyComm[] =>

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

Lines changed: 34 additions & 34 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

@@ -192,8 +194,6 @@ function proofConversionPerField(
192194
}
193195
return new LookupTable(id, wasmData);
194196
}
195-
196-
197197

198198
return {
199199
proofToRust([, public_evals, proof]: ProofWithPublic): NapiProverProof {
@@ -252,7 +252,7 @@ function proofConversionPerField(
252252
];
253253
return [0, publicEvals, proof];
254254
},
255-
255+
256256
runtimeTablesToRust([, ...tables]: MlArray<RuntimeTable>): NapiRuntimeTable[] {
257257
return tables.map(runtimeTableToRust);
258258
},

0 commit comments

Comments
 (0)