@nori-zk/proof-conversion
Version:
Verifying zkVM proofs inside o1js circuits, to generate Mina compatible proof
56 lines • 1.63 kB
JavaScript
import { Field, Poseidon, Provable, Struct } from 'o1js';
import { ATE_LOOP_COUNT, Fp12, FrC } from '../towers/index.js';
import { G1Affine } from '../ec/index.js';
// e(A, [1])*e(negB, [x]) = 1
class KzgProof extends Struct({
A: G1Affine,
negB: G1Affine,
shift_power: Field,
c: Fp12,
c_inv: Fp12,
pi0: FrC.provable,
pi1: FrC.provable,
}) {
}
class KzgState extends Struct({
f: Fp12,
lines_hashes_digest: Field,
}) {
deepClone() {
return new KzgState({
f: new Fp12({ c0: this.f.c0, c1: this.f.c1 }),
lines_hashes_digest: Field.from(this.lines_hashes_digest.toBigInt()),
});
}
}
class KzgAccumulator extends Struct({
proof: KzgProof,
state: KzgState,
}) {
deepClone() {
return new KzgAccumulator({
proof: this.proof,
state: this.state.deepClone(),
});
}
}
class ArrayListHasher {
static empty() {
const a = new Array(this.n).fill(Field(0n));
return Poseidon.hashPacked(Provable.Array(Field, ATE_LOOP_COUNT.length), a);
}
static hash(arr) {
return Poseidon.hashPacked(Provable.Array(Field, ATE_LOOP_COUNT.length), arr);
}
static open(lhs, opening, rhs) {
const opening_hashes = opening.map((x) => Poseidon.hashPacked(Fp12, x));
let arr = [];
arr = arr.concat(lhs);
arr = arr.concat(opening_hashes);
arr = arr.concat(rhs);
return this.hash(arr);
}
}
ArrayListHasher.n = ATE_LOOP_COUNT.length;
export { KzgProof, KzgState, KzgAccumulator, ArrayListHasher };
//# sourceMappingURL=structs.js.map