Skip to content

Commit d741ec6

Browse files
committed
Native Rust conversion for oracles
1 parent 0c0f8eb commit d741ec6

File tree

2 files changed

+127
-2
lines changed

2 files changed

+127
-2
lines changed

src/bindings/crypto/bindings.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { verifierIndexConversion } from './bindings/conversion-verifier-index.js
1414
import { PallasBindings, VestaBindings } from './bindings/curve.js';
1515
import { jsEnvironment } from './bindings/env.js';
1616
import { FpBindings, FqBindings } from './bindings/field.js';
17+
import { napiOraclesConversion } from './bindings/napi-conversion-oracles.js';
1718
import { srs } from './bindings/srs.js';
1819
import { FpVectorBindings, FqVectorBindings } from './bindings/vector.js';
1920
import { napiConversionCore } from './napi-conversion-core.js';
@@ -85,9 +86,10 @@ function buildWasmConversion(wasm: Wasm) {
8586
function createNativeRustConversion(napi: any) {
8687
let core = napiConversionCore(napi);
8788
let proof = napiProofConversion(napi, core);
89+
let oracles = napiOraclesConversion(napi);
8890
return {
89-
fp: { ...core.fp, ...proof.fp },
90-
fq: { ...core.fq, ...proof.fq },
91+
fp: { ...core.fp, ...proof.fp, ...oracles.fp },
92+
fq: { ...core.fq, ...proof.fq, ...oracles.fq },
9193
};
9294
}
9395

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
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

Comments
 (0)