Skip to content

Commit 0c0f8eb

Browse files
committed
Revert "bindings: remove types conversions for proof"
This reverts commit f452808. Because we need access to the proof structure we cannot avoid the conversions.
1 parent f452808 commit 0c0f8eb

File tree

1 file changed

+188
-6
lines changed

1 file changed

+188
-6
lines changed

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

Lines changed: 188 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,68 @@
11
import type {
2+
WasmPastaFpLookupTable,
23
WasmFpRuntimeTable,
34
WasmPastaFpRuntimeTableCfg,
4-
WasmPastaFpLookupTable,
5+
WasmPastaFqLookupTable,
56
WasmFqRuntimeTable,
67
WasmPastaFqRuntimeTableCfg,
7-
WasmPastaFqLookupTable,
88
WasmVecVecFp,
99
WasmVecVecFq,
10+
WasmFpProverCommitments,
11+
WasmFqProverCommitments,
12+
WasmFpOpeningProof,
13+
WasmFqOpeningProof,
14+
WasmFpProverProof,
15+
WasmFqProverProof,
16+
WasmFpLookupCommitments,
17+
WasmFqLookupCommitments,
1018
} from '../compiled/node_bindings/plonk_wasm.cjs';
1119
import type * as napiNamespace from '../compiled/node_bindings/plonk_wasm.cjs';
12-
import type { RuntimeTable, RuntimeTableCfg, LookupTable } from './bindings/kimchi-types.js';
13-
import { MlArray } from '../../lib/ml/base.js';
14-
import { fieldsToRustFlat } from './bindings/conversion-base.js';
20+
import type {
21+
RuntimeTable,
22+
RuntimeTableCfg,
23+
LookupTable,
24+
ProofWithPublic,
25+
ProverProof,
26+
LookupCommitments,
27+
PolyComm, PointEvaluations, ProofEvaluations,
28+
RecursionChallenge,
29+
ProverCommitments,
30+
OpeningProof,
31+
OrInfinity,
32+
} 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';
1540
import { ConversionCore, ConversionCores } from './napi-conversion-core.js';
1641

1742
export { napiProofConversion };
43+
44+
type NapiProofEvaluations = [
45+
0,
46+
MlOption<PointEvaluations<Uint8Array>>,
47+
...RemoveLeadingZero<ProofEvaluations<Uint8Array>>,
48+
];
1849

1950
type napi = typeof napiNamespace;
2051

52+
type NapiProverCommitments = WasmFpProverCommitments | WasmFqProverCommitments;
53+
type NapiOpeningProof = WasmFpOpeningProof | WasmFqOpeningProof;
54+
type NapiProverProof = WasmFpProverProof | WasmFqProverProof;
55+
type NapiLookupCommitments = WasmFpLookupCommitments | WasmFqLookupCommitments;
2156
type NapiRuntimeTable = WasmFpRuntimeTable | WasmFqRuntimeTable;
2257
type NapiRuntimeTableCfg = WasmPastaFpRuntimeTableCfg | WasmPastaFqRuntimeTableCfg;
2358
type NapiLookupTable = WasmPastaFpLookupTable | WasmPastaFqLookupTable;
2459

2560
type NapiClasses = {
61+
ProverCommitments: typeof WasmFpProverCommitments | typeof WasmFqProverCommitments;
62+
OpeningProof: typeof WasmFpOpeningProof | typeof WasmFqOpeningProof;
2663
VecVec: typeof WasmVecVecFp | typeof WasmVecVecFq;
64+
ProverProof: typeof WasmFpProverProof | typeof WasmFqProverProof;
65+
LookupCommitments: typeof WasmFpLookupCommitments | typeof WasmFqLookupCommitments;
2766
RuntimeTable: typeof WasmFpRuntimeTable | typeof WasmFqRuntimeTable;
2867
RuntimeTableCfg: typeof WasmPastaFpRuntimeTableCfg | typeof WasmPastaFqRuntimeTableCfg;
2968
LookupTable: typeof WasmPastaFpLookupTable | typeof WasmPastaFqLookupTable;
@@ -32,13 +71,21 @@ type NapiClasses = {
3271
function napiProofConversion(napi: napi, core: ConversionCores) {
3372
return {
3473
fp: proofConversionPerField(core.fp, {
74+
ProverCommitments: napi.WasmFpProverCommitments,
75+
OpeningProof: napi.WasmFpOpeningProof,
3576
VecVec: napi.WasmVecVecFp,
77+
ProverProof: napi.WasmFpProverProof,
78+
LookupCommitments: napi.WasmFpLookupCommitments,
3679
RuntimeTable: napi.WasmFpRuntimeTable,
3780
RuntimeTableCfg: napi.WasmPastaFpRuntimeTableCfg,
3881
LookupTable: napi.WasmPastaFpLookupTable,
3982
}),
4083
fq: proofConversionPerField(core.fq, {
84+
ProverCommitments: napi.WasmFqProverCommitments,
85+
OpeningProof: napi.WasmFqOpeningProof,
4186
VecVec: napi.WasmVecVecFq,
87+
ProverProof: napi.WasmFqProverProof,
88+
LookupCommitments: napi.WasmFqLookupCommitments,
4289
RuntimeTable: napi.WasmFqRuntimeTable,
4390
RuntimeTableCfg: napi.WasmPastaFqRuntimeTableCfg,
4491
LookupTable: napi.WasmPastaFqLookupTable,
@@ -48,8 +95,79 @@ function napiProofConversion(napi: napi, core: ConversionCores) {
4895

4996
function proofConversionPerField(
5097
core: ConversionCore,
51-
{ VecVec, RuntimeTable, RuntimeTableCfg, LookupTable }: NapiClasses
98+
{
99+
ProverCommitments,
100+
OpeningProof,
101+
VecVec,
102+
ProverProof,
103+
LookupCommitments,
104+
RuntimeTable,
105+
RuntimeTableCfg,
106+
LookupTable,
107+
}: NapiClasses
52108
) {
109+
function commitmentsToRust(commitments: ProverCommitments): NapiProverCommitments {
110+
let wComm = core.polyCommsToRust(commitments[1]);
111+
let zComm = core.polyCommToRust(commitments[2]);
112+
let tComm = core.polyCommToRust(commitments[3]);
113+
let lookup = MlOption.mapFrom(commitments[4], lookupCommitmentsToRust);
114+
return new ProverCommitments(wComm, zComm, tComm, lookup);
115+
}
116+
function commitmentsFromRust(commitments: NapiProverCommitments): ProverCommitments {
117+
let wComm = core.polyCommsFromRust(commitments.w_comm);
118+
let zComm = core.polyCommFromRust(commitments.z_comm);
119+
let tComm = core.polyCommFromRust(commitments.t_comm);
120+
let lookup = MlOption.mapTo(commitments.lookup, lookupCommitmentsFromRust);
121+
commitments.free();
122+
return [0, wComm as MlTuple<PolyComm, 15>, zComm, tComm, lookup];
123+
}
124+
125+
function lookupCommitmentsToRust(lookup: LookupCommitments): NapiLookupCommitments {
126+
let sorted = core.polyCommsToRust(lookup[1]);
127+
let aggreg = core.polyCommToRust(lookup[2]);
128+
let runtime = MlOption.mapFrom(lookup[3], core.polyCommToRust);
129+
return new LookupCommitments(sorted, aggreg, runtime);
130+
}
131+
function lookupCommitmentsFromRust(lookup: NapiLookupCommitments): LookupCommitments {
132+
let sorted = core.polyCommsFromRust(lookup.sorted);
133+
let aggreg = core.polyCommFromRust(lookup.aggreg);
134+
let runtime = MlOption.mapTo(lookup.runtime, core.polyCommFromRust);
135+
lookup.free();
136+
return [0, sorted, aggreg, runtime];
137+
}
138+
139+
function openingProofToRust(proof: OpeningProof): NapiOpeningProof {
140+
let [_, [, ...lr], delta, z1, z2, sg] = proof;
141+
// We pass l and r as separate vectors over the FFI
142+
let l: MlArray<OrInfinity> = [0];
143+
let r: MlArray<OrInfinity> = [0];
144+
for (let [, li, ri] of lr) {
145+
l.push(li);
146+
r.push(ri);
147+
}
148+
return new OpeningProof(
149+
core.pointsToRust(l),
150+
core.pointsToRust(r),
151+
core.pointToRust(delta),
152+
fieldToRust(z1),
153+
fieldToRust(z2),
154+
core.pointToRust(sg)
155+
);
156+
}
157+
function openingProofFromRust(proof: NapiOpeningProof): OpeningProof {
158+
let [, ...l] = core.pointsFromRust(proof.lr_0);
159+
let [, ...r] = core.pointsFromRust(proof.lr_1);
160+
let n = l.length;
161+
if (n !== r.length) throw Error('openingProofFromRust: l and r length mismatch.');
162+
let lr = l.map<[0, OrInfinity, OrInfinity]>((li, i) => [0, li, r[i]]);
163+
let delta = core.pointFromRust(proof.delta);
164+
let z1 = fieldFromRust(proof.z1);
165+
let z2 = fieldFromRust(proof.z2);
166+
let sg = core.pointFromRust(proof.sg);
167+
proof.free();
168+
return [0, [0, ...lr], delta, z1, z2, sg];
169+
}
170+
53171
function runtimeTableToRust([, id, data]: RuntimeTable): NapiRuntimeTable {
54172
return new RuntimeTable(id, core.vectorToRust(data));
55173
}
@@ -66,8 +184,68 @@ function proofConversionPerField(
66184
}
67185
return new LookupTable(id, wasmData);
68186
}
187+
188+
69189

70190
return {
191+
proofToRust([, public_evals, proof]: ProofWithPublic): NapiProverProof {
192+
let commitments = commitmentsToRust(proof[1]);
193+
let openingProof = openingProofToRust(proof[2]);
194+
let [, ...evals] = proofEvaluationsToRust(proof[3]);
195+
let publicEvals = pointEvalsOptionToRust(public_evals);
196+
// TODO typed as `any` in wasm-bindgen, this has the correct type
197+
let evalsActual: NapiProofEvaluations = [0, publicEvals, ...evals];
198+
199+
let ftEval1 = fieldToRust(proof[4]);
200+
let public_ = fieldsToRustFlat(proof[5]);
201+
let [, ...prevChallenges] = proof[6];
202+
let n = prevChallenges.length;
203+
let prevChallengeScalars = new VecVec(n);
204+
let prevChallengeCommsMl: MlArray<PolyComm> = [0];
205+
for (let [, scalars, comms] of prevChallenges) {
206+
prevChallengeScalars.push(fieldsToRustFlat(scalars));
207+
prevChallengeCommsMl.push(comms);
208+
}
209+
let prevChallengeComms = core.polyCommsToRust(prevChallengeCommsMl);
210+
return new ProverProof(
211+
commitments,
212+
openingProof,
213+
evalsActual,
214+
ftEval1,
215+
public_,
216+
prevChallengeScalars,
217+
prevChallengeComms
218+
);
219+
},
220+
proofFromRust(wasmProof: NapiProverProof): ProofWithPublic {
221+
let commitments = commitmentsFromRust(wasmProof.commitments);
222+
let openingProof = openingProofFromRust(wasmProof.proof);
223+
// TODO typed as `any` in wasm-bindgen, this is the correct type
224+
let [, wasmPublicEvals, ...wasmEvals]: NapiProofEvaluations = wasmProof.evals;
225+
let publicEvals = pointEvalsOptionFromRust(wasmPublicEvals);
226+
let evals = proofEvaluationsFromRust([0, ...wasmEvals]);
227+
228+
let ftEval1 = fieldFromRust(wasmProof.ft_eval1);
229+
let public_ = fieldsFromRustFlat(wasmProof.public_);
230+
let prevChallengeScalars = wasmProof.prev_challenges_scalars;
231+
let [, ...prevChallengeComms] = core.polyCommsFromRust(wasmProof.prev_challenges_comms);
232+
let prevChallenges = prevChallengeComms.map<RecursionChallenge>((comms, i) => {
233+
let scalars = fieldsFromRustFlat(prevChallengeScalars.get(i));
234+
return [0, scalars, comms];
235+
});
236+
wasmProof.free();
237+
let proof: ProverProof = [
238+
0,
239+
commitments,
240+
openingProof,
241+
evals,
242+
ftEval1,
243+
public_,
244+
[0, ...prevChallenges],
245+
];
246+
return [0, publicEvals, proof];
247+
},
248+
71249
runtimeTablesToRust([, ...tables]: MlArray<RuntimeTable>): NapiRuntimeTable[] {
72250
return tables.map(runtimeTableToRust);
73251
},
@@ -81,3 +259,7 @@ function proofConversionPerField(
81259
},
82260
};
83261
}
262+
263+
// helper
264+
265+
type RemoveLeadingZero<T extends [0, ...any]> = T extends [0, ...infer U] ? U : never;

0 commit comments

Comments
 (0)