Skip to content

Commit 53fef4f

Browse files
committed
conversions: attempt proof conversions
1 parent 73b8ac7 commit 53fef4f

File tree

1 file changed

+173
-3
lines changed

1 file changed

+173
-3
lines changed

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

Lines changed: 173 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,62 @@ import type {
77
WasmPastaFqRuntimeTableCfg,
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';
1220
import type {
1321
RuntimeTable,
1422
RuntimeTableCfg,
1523
LookupTable,
24+
ProofWithPublic,
25+
ProverProof,
26+
LookupCommitments,
27+
PolyComm, PointEvaluations, ProofEvaluations,
28+
RecursionChallenge,
29+
ProverCommitments,
30+
OpeningProof,
31+
OrInfinity,
1632
} from './bindings/kimchi-types.js';
17-
import { MlArray} from '../../lib/ml/base.js';
33+
import { MlArray, MlTuple, MlOption} from '../../lib/ml/base.js';
1834
import {
1935
fieldsToRustFlat,
36+
fieldToRust,
37+
fieldsFromRustFlat,
38+
fieldFromRust,
2039
} from './bindings/conversion-base.js';
2140
import { ConversionCore, ConversionCores } from './napi-conversion-core.js';
2241

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

2550
type napi = typeof napiNamespace;
2651

52+
type NapiProverCommitments = WasmFpProverCommitments | WasmFqProverCommitments;
53+
type NapiOpeningProof = WasmFpOpeningProof | WasmFqOpeningProof;
54+
type NapiProverProof = WasmFpProverProof | WasmFqProverProof;
55+
type NapiLookupCommitments = WasmFpLookupCommitments | WasmFqLookupCommitments;
2756
type NapiRuntimeTable = WasmFpRuntimeTable | WasmFqRuntimeTable;
2857
type NapiRuntimeTableCfg = WasmPastaFpRuntimeTableCfg | WasmPastaFqRuntimeTableCfg;
2958
type NapiLookupTable = WasmPastaFpLookupTable | WasmPastaFqLookupTable;
3059

3160
type NapiClasses = {
61+
ProverCommitments: typeof WasmFpProverCommitments | typeof WasmFqProverCommitments;
62+
OpeningProof: typeof WasmFpOpeningProof | typeof WasmFqOpeningProof;
3263
VecVec: typeof WasmVecVecFp | typeof WasmVecVecFq;
64+
ProverProof: typeof WasmFpProverProof | typeof WasmFqProverProof;
65+
LookupCommitments: typeof WasmFpLookupCommitments | typeof WasmFqLookupCommitments;
3366
RuntimeTable: typeof WasmFpRuntimeTable | typeof WasmFqRuntimeTable;
3467
RuntimeTableCfg: typeof WasmPastaFpRuntimeTableCfg | typeof WasmPastaFqRuntimeTableCfg;
3568
LookupTable: typeof WasmPastaFpLookupTable | typeof WasmPastaFqLookupTable;
@@ -38,13 +71,21 @@ type NapiClasses = {
3871
function napiProofConversion(napi: napi, core: ConversionCores) {
3972
return {
4073
fp: proofConversionPerField(core.fp, {
74+
ProverCommitments: napi.WasmFpProverCommitments,
75+
OpeningProof: napi.WasmFpOpeningProof,
4176
VecVec: napi.WasmVecVecFp,
77+
ProverProof: napi.WasmFpProverProof,
78+
LookupCommitments: napi.WasmFpLookupCommitments,
4279
RuntimeTable: napi.WasmFpRuntimeTable,
4380
RuntimeTableCfg: napi.WasmPastaFpRuntimeTableCfg,
4481
LookupTable: napi.WasmPastaFpLookupTable,
4582
}),
4683
fq: proofConversionPerField(core.fq, {
84+
ProverCommitments: napi.WasmFqProverCommitments,
85+
OpeningProof: napi.WasmFqOpeningProof,
4786
VecVec: napi.WasmVecVecFq,
87+
ProverProof: napi.WasmFqProverProof,
88+
LookupCommitments: napi.WasmFqLookupCommitments,
4889
RuntimeTable: napi.WasmFqRuntimeTable,
4990
RuntimeTableCfg: napi.WasmPastaFqRuntimeTableCfg,
5091
LookupTable: napi.WasmPastaFqLookupTable,
@@ -55,13 +96,78 @@ function napiProofConversion(napi: napi, core: ConversionCores) {
5596
function proofConversionPerField(
5697
core: ConversionCore,
5798
{
99+
ProverCommitments,
100+
OpeningProof,
58101
VecVec,
102+
ProverProof,
103+
LookupCommitments,
59104
RuntimeTable,
60105
RuntimeTableCfg,
61106
LookupTable,
62107
}: NapiClasses
63108
) {
64-
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+
65171
function runtimeTableToRust([, id, data]: RuntimeTable): NapiRuntimeTable {
66172
return new RuntimeTable(id, core.vectorToRust(data));
67173
}
@@ -78,8 +184,68 @@ function proofConversionPerField(
78184
}
79185
return new LookupTable(id, wasmData);
80186
}
187+
188+
81189

82190
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+
83249
runtimeTablesToRust([, ...tables]: MlArray<RuntimeTable>): NapiRuntimeTable[] {
84250
return tables.map(runtimeTableToRust);
85251
},
@@ -92,4 +258,8 @@ function proofConversionPerField(
92258
return tables.map(lookupTableToRust);
93259
},
94260
};
95-
}
261+
}
262+
263+
// helper
264+
265+
type RemoveLeadingZero<T extends [0, ...any]> = T extends [0, ...infer U] ? U : never;

0 commit comments

Comments
 (0)