11import 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' ;
1119import 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' ;
1540import { ConversionCore , ConversionCores } from './napi-conversion-core.js' ;
1641
1742export { napiProofConversion } ;
43+
44+ type NapiProofEvaluations = [
45+ 0 ,
46+ MlOption < PointEvaluations < Uint8Array > > ,
47+ ...RemoveLeadingZero < ProofEvaluations < Uint8Array > > ,
48+ ] ;
1849
1950type napi = typeof napiNamespace ;
2051
52+ type NapiProverCommitments = WasmFpProverCommitments | WasmFqProverCommitments ;
53+ type NapiOpeningProof = WasmFpOpeningProof | WasmFqOpeningProof ;
54+ type NapiProverProof = WasmFpProverProof | WasmFqProverProof ;
55+ type NapiLookupCommitments = WasmFpLookupCommitments | WasmFqLookupCommitments ;
2156type NapiRuntimeTable = WasmFpRuntimeTable | WasmFqRuntimeTable ;
2257type NapiRuntimeTableCfg = WasmPastaFpRuntimeTableCfg | WasmPastaFqRuntimeTableCfg ;
2358type NapiLookupTable = WasmPastaFpLookupTable | WasmPastaFqLookupTable ;
2459
2560type 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 = {
3271function 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
4996function 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