31 lines
899 B
Plaintext
31 lines
899 B
Plaintext
include "BLS12_381.aes"
|
|
|
|
contract GrothVerify =
|
|
type fr = BLS12_381.fr
|
|
type g1 = BLS12_381.g1
|
|
type g2 = BLS12_381.g2
|
|
|
|
record proof = { a : g1, b : g2, c : g1 }
|
|
record verify_key = { a : g1, b : g2, c : g2, d : g2, ic : list(g1) }
|
|
|
|
record state = { vk : verify_key }
|
|
|
|
entrypoint init(vk0 : verify_key) = {vk = vk0}
|
|
|
|
entrypoint verify_proof(p : proof, input : list(fr)) =
|
|
let vk = state.vk
|
|
let vk_x = calc_vk_x(vk.ic, input)
|
|
|
|
BLS12_381.pairing_check([BLS12_381.g1_neg(p.a), vk.a, vk_x, p.c],
|
|
[p.b, vk.b, vk.c, vk.d])
|
|
|
|
function calc_vk_x(ics : list(g1), xs : list(fr)) =
|
|
switch(ics)
|
|
(ic :: ics) => calc_vk_x_(ic, ics, xs)
|
|
|
|
function calc_vk_x_(vk_x : g1, ics : list(g1), xs : list(fr)) =
|
|
switch((ics, xs))
|
|
([], []) => vk_x
|
|
(ic :: ics, x :: xs) => calc_vk_x_(BLS12_381.g1_add(vk_x, BLS12_381.g1_mul(x, ic)), ics, xs)
|
|
|