-
Notifications
You must be signed in to change notification settings - Fork 2
/
Verifier.sol.template
85 lines (73 loc) · 2.3 KB
/
Verifier.sol.template
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;
contract PairingTest {
// -A
uint256 constant aG1_x =
$aG1_x;
uint256 constant aG1_y =
$aG1_y;
// B
uint256 constant bG2_x1 =
$bG2_x1;
uint256 constant bG2_x2 =
$bG2_x2;
uint256 constant bG2_y1 =
$bG2_y1;
uint256 constant bG2_y2 =
$bG2_y2;
// alpha
uint256 constant alphaG1_x =
$alphaG1_x;
uint256 constant alphaG1_y =
$alphaG1_y;
// beta
uint256 constant betaG2_x1 =
$betaG2_x1;
uint256 constant betaG2_x2 =
$betaG2_x2;
uint256 constant betaG2_y1 =
$betaG2_y1;
uint256 constant betaG2_y2 =
$betaG2_y2;
uint256 constant cG1_x =
$cG1_x;
uint256 constant cG1_y =
$cG1_y;
uint256 constant Q =
21888242871839275222246405745257275088696311157297823662689037894645226208583;
function run(bytes memory input) public view returns (bool) {
// optional, the precompile checks this too and reverts (with no error) if false, this helps narrow down possible errors
if (input.length % 192 != 0) revert("Points must be a multiple of 6");
(bool success, bytes memory data) = address(0x08).staticcall(input);
if (success) return abi.decode(data, (bool));
revert("Wrong pairing");
}
function verify() public view returns (bool) {
// -A * B + alpha * betta + C = 0
bytes memory points1 = abi.encode(
aG1_x,
aG1_y,
bG2_x2,
bG2_x1,
bG2_y2,
bG2_y1,
alphaG1_x,
alphaG1_y,
betaG2_x2,
betaG2_x1,
betaG2_y2,
betaG2_y1
);
bytes memory points2 = abi.encode(
cG1_x,
cG1_y,
11559732032986387107991004021392285783925812861821192530917403151452391805634,
10857046999023057135944570762232829481370756359578518086990519993285655852781,
4082367875863433681332203403145435568316851327593401208105741076214120093531,
8495653923123431417604973247489272438418190587263600148770280649306958101930
);
bytes memory points = abi.encodePacked(points1, points2);
bool x = run(points);
return x;
}
}