|
| 1 | +import { MlOption } from '../../../lib/ml/base.js'; |
| 2 | +import type * as napiNamespace from '../../compiled/node_bindings/plonk_wasm.cjs'; |
| 3 | +import type { |
| 4 | + WasmFpOracles, |
| 5 | + WasmFpRandomOracles, |
| 6 | + WasmFqOracles, |
| 7 | + WasmFqRandomOracles, |
| 8 | +} from '../../compiled/node_bindings/plonk_wasm.cjs'; |
| 9 | +import { |
| 10 | + fieldFromRust, |
| 11 | + fieldToRust, |
| 12 | + fieldsFromRustFlat, |
| 13 | + fieldsToRustFlat, |
| 14 | + maybeFieldToRust, |
| 15 | +} from './conversion-base.js'; |
| 16 | +import { Field, Oracles, RandomOracles, ScalarChallenge } from './kimchi-types.js'; |
| 17 | + |
| 18 | +export { napiOraclesConversion }; |
| 19 | + |
| 20 | +type napi = typeof napiNamespace; |
| 21 | + |
| 22 | +type NapiRandomOracles = WasmFpRandomOracles | WasmFqRandomOracles; |
| 23 | +type NapiOracles = WasmFpOracles | WasmFqOracles; |
| 24 | + |
| 25 | +type NapiClasses = { |
| 26 | + RandomOracles: typeof WasmFpRandomOracles | typeof WasmFqRandomOracles; |
| 27 | + Oracles: typeof WasmFpOracles | typeof WasmFqOracles; |
| 28 | +}; |
| 29 | + |
| 30 | +function napiOraclesConversion(napi: napi) { |
| 31 | + return { |
| 32 | + fp: oraclesConversionPerField({ |
| 33 | + RandomOracles: napi.WasmFpRandomOracles, |
| 34 | + Oracles: napi.WasmFpOracles, |
| 35 | + }), |
| 36 | + fq: oraclesConversionPerField({ |
| 37 | + RandomOracles: napi.WasmFqRandomOracles, |
| 38 | + Oracles: napi.WasmFqOracles, |
| 39 | + }), |
| 40 | + }; |
| 41 | +} |
| 42 | + |
| 43 | +function oraclesConversionPerField({ RandomOracles, Oracles }: NapiClasses) { |
| 44 | + function randomOraclesToRust(ro: RandomOracles): NapiRandomOracles { |
| 45 | + let jointCombinerMl = MlOption.from(ro[1]); |
| 46 | + let jointCombinerChal = maybeFieldToRust(jointCombinerMl?.[1][1]); |
| 47 | + let jointCombiner = maybeFieldToRust(jointCombinerMl?.[2]); |
| 48 | + let beta = fieldToRust(ro[2]); |
| 49 | + let gamma = fieldToRust(ro[3]); |
| 50 | + let alphaChal = fieldToRust(ro[4][1]); |
| 51 | + let alpha = fieldToRust(ro[5]); |
| 52 | + let zeta = fieldToRust(ro[6]); |
| 53 | + let v = fieldToRust(ro[7]); |
| 54 | + let u = fieldToRust(ro[8]); |
| 55 | + let zetaChal = fieldToRust(ro[9][1]); |
| 56 | + let vChal = fieldToRust(ro[10][1]); |
| 57 | + let uChal = fieldToRust(ro[11][1]); |
| 58 | + return new RandomOracles( |
| 59 | + jointCombinerChal, |
| 60 | + jointCombiner, |
| 61 | + beta, |
| 62 | + gamma, |
| 63 | + alphaChal, |
| 64 | + alpha, |
| 65 | + zeta, |
| 66 | + v, |
| 67 | + u, |
| 68 | + zetaChal, |
| 69 | + vChal, |
| 70 | + uChal |
| 71 | + ); |
| 72 | + } |
| 73 | + function randomOraclesFromRust(ro: NapiRandomOracles): RandomOracles { |
| 74 | + let jointCombinerChal = ro.joint_combiner_chal; |
| 75 | + let jointCombiner = ro.joint_combiner; |
| 76 | + let jointCombinerOption = MlOption<[0, ScalarChallenge, Field]>( |
| 77 | + jointCombinerChal && |
| 78 | + jointCombiner && [0, [0, fieldFromRust(jointCombinerChal)], fieldFromRust(jointCombiner)] |
| 79 | + ); |
| 80 | + let mlRo: RandomOracles = [ |
| 81 | + 0, |
| 82 | + jointCombinerOption, |
| 83 | + fieldFromRust(ro.beta), |
| 84 | + fieldFromRust(ro.gamma), |
| 85 | + [0, fieldFromRust(ro.alpha_chal)], |
| 86 | + fieldFromRust(ro.alpha), |
| 87 | + fieldFromRust(ro.zeta), |
| 88 | + fieldFromRust(ro.v), |
| 89 | + fieldFromRust(ro.u), |
| 90 | + [0, fieldFromRust(ro.zeta_chal)], |
| 91 | + [0, fieldFromRust(ro.v_chal)], |
| 92 | + [0, fieldFromRust(ro.u_chal)], |
| 93 | + ]; |
| 94 | + // TODO: do we not want to free? |
| 95 | + // ro.free(); |
| 96 | + return mlRo; |
| 97 | + } |
| 98 | + |
| 99 | + return { |
| 100 | + oraclesToRust(oracles: Oracles): NapiOracles { |
| 101 | + let [, o, pEval, openingPrechallenges, digestBeforeEvaluations] = oracles; |
| 102 | + return new Oracles( |
| 103 | + randomOraclesToRust(o), |
| 104 | + fieldToRust(pEval[1]), |
| 105 | + fieldToRust(pEval[2]), |
| 106 | + fieldsToRustFlat(openingPrechallenges), |
| 107 | + fieldToRust(digestBeforeEvaluations) |
| 108 | + ); |
| 109 | + }, |
| 110 | + oraclesFromRust(oracles: NapiOracles): Oracles { |
| 111 | + let mlOracles: Oracles = [ |
| 112 | + 0, |
| 113 | + randomOraclesFromRust(oracles.o), |
| 114 | + [0, fieldFromRust(oracles.p_eval0), fieldFromRust(oracles.p_eval1)], |
| 115 | + fieldsFromRustFlat(oracles.opening_prechallenges), |
| 116 | + fieldFromRust(oracles.digest_before_evaluations), |
| 117 | + ]; |
| 118 | + // TODO: do we not want to free? |
| 119 | + // oracles.free(); |
| 120 | + return mlOracles; |
| 121 | + }, |
| 122 | + }; |
| 123 | +} |
0 commit comments