Remove GPL'ed verifier, replace by MIT verifier

This commit is contained in:
Mark Spanbroek 2024-01-18 08:52:22 +01:00 committed by markspanbroek
parent 61be76da0e
commit 3e3f2307d8
9 changed files with 2 additions and 215 deletions

View File

@ -1,28 +0,0 @@
{
"pi_a": [
"12575931798333091286325232720222610208857693569302057808885252947429216447180",
"16549473200179311181194191095131663560815201508441791825123921223678935560766",
"1"
],
"pi_b": [
[
"10539735118221868154517125926361767140470515908908074935137601194792761800171",
"82933007286657251580767357783340888344421112063684410243727242770275681544"
],
[
"12783061468979995595204827460841361850250217151383589736164479836366818492603",
"14029329025815586221542089598302928160626432109838714917216872595944862705134"
],
[
"1",
"0"
]
],
"pi_c": [
"13431392674314693403054162903564691589030062102064045494372006369097976531644",
"14766632196294836790840495714548165339030519379498058874034063314395047727400",
"1"
],
"protocol": "groth16",
"curve": "bn128"
}

View File

@ -1,5 +0,0 @@
[
"7410779170",
"16074246370508166450132968585287196391860062495017081813239200574579640171677",
"3"
]

View File

@ -1,180 +0,0 @@
// SPDX-License-Identifier: GPL-3.0
/*
Copyright 2021 0KIMS association.
This file is generated with [snarkJS](https://github.com/iden3/snarkjs).
snarkJS is a free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
snarkJS is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
You should have received a copy of the GNU General Public License
along with snarkJS. If not, see <https://www.gnu.org/licenses/>.
*/
pragma solidity >=0.7.0 <0.9.0;
contract Groth16Verifier {
// Scalar field size
uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
// Base field size
uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
// Verification Key data
uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;
uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;
uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;
uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;
uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;
uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;
uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;
uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;
uint256 constant deltax1 = 13712868925708658085847556664366075488044104377560666483004097971457124593853;
uint256 constant deltax2 = 10641155327113821350709388160714981167756198765458730005846188297891779189493;
uint256 constant deltay1 = 17764386955997045623322956974738840392389044888308308825307170058332555991668;
uint256 constant deltay2 = 11545289596289529089490468468326982998415255475081847246298663415914281403462;
uint256 constant IC0x = 2685717341061384289974985759706305556965509240536260442727245444252129889599;
uint256 constant IC0y = 21827535600902499280458695057256182457185285685995970634461174274051979800815;
uint256 constant IC1x = 13158415194355348546090070151711085027834066488127676886518524272551654481129;
uint256 constant IC1y = 18831701962118195025265682681702066674741422770850028135520336928884612556978;
uint256 constant IC2x = 20882269691461568155321689204947751047717828445545223718893788782534717197527;
uint256 constant IC2y = 11996193054822748526485644723594571195813487505803351159052936325857690315211;
uint256 constant IC3x = 18155166643053044822201627105588517913195535693446564472247126736722594445000;
uint256 constant IC3y = 13816319482622393060406816684195314200198627617641073470088058848129378231754;
// Memory data
uint16 constant pVk = 0;
uint16 constant pPairing = 128;
uint16 constant pLastMem = 896;
function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[3] calldata _pubSignals) public view returns (bool) {
assembly {
function checkField(v) {
if iszero(lt(v, q)) {
mstore(0, 0)
return (0, 0x20)
}
}
// G1 function to multiply a G1 value(x,y) to value in an address
function g1_mulAccC(pR, x, y, s) {
let success
let mIn := mload(0x40)
mstore(mIn, x)
mstore(add(mIn, 32), y)
mstore(add(mIn, 64), s)
success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)
if iszero(success) {
mstore(0, 0)
return (0, 0x20)
}
mstore(add(mIn, 64), mload(pR))
mstore(add(mIn, 96), mload(add(pR, 32)))
success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)
if iszero(success) {
mstore(0, 0)
return (0, 0x20)
}
}
function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {
let _pPairing := add(pMem, pPairing)
let _pVk := add(pMem, pVk)
mstore(_pVk, IC0x)
mstore(add(_pVk, 32), IC0y)
// Compute the linear combination vk_x
g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))
g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))
g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))
// -A
mstore(_pPairing, calldataload(pA))
mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))
// B
mstore(add(_pPairing, 64), calldataload(pB))
mstore(add(_pPairing, 96), calldataload(add(pB, 32)))
mstore(add(_pPairing, 128), calldataload(add(pB, 64)))
mstore(add(_pPairing, 160), calldataload(add(pB, 96)))
// alpha1
mstore(add(_pPairing, 192), alphax)
mstore(add(_pPairing, 224), alphay)
// beta2
mstore(add(_pPairing, 256), betax1)
mstore(add(_pPairing, 288), betax2)
mstore(add(_pPairing, 320), betay1)
mstore(add(_pPairing, 352), betay2)
// vk_x
mstore(add(_pPairing, 384), mload(add(pMem, pVk)))
mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))
// gamma2
mstore(add(_pPairing, 448), gammax1)
mstore(add(_pPairing, 480), gammax2)
mstore(add(_pPairing, 512), gammay1)
mstore(add(_pPairing, 544), gammay2)
// C
mstore(add(_pPairing, 576), calldataload(pC))
mstore(add(_pPairing, 608), calldataload(add(pC, 32)))
// delta2
mstore(add(_pPairing, 640), deltax1)
mstore(add(_pPairing, 672), deltax2)
mstore(add(_pPairing, 704), deltay1)
mstore(add(_pPairing, 736), deltay2)
let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)
isOk := and(success, mload(_pPairing))
}
let pMem := mload(0x40)
mstore(0x40, add(pMem, pLastMem))
// Validate that all evaluations F
checkField(calldataload(add(_pubSignals, 0)))
checkField(calldataload(add(_pubSignals, 32)))
checkField(calldataload(add(_pubSignals, 64)))
checkField(calldataload(add(_pubSignals, 96)))
// Validate all evaluations
let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)
mstore(0, isValid)
return (0, 0x20)
}
}
}

View File

@ -30,7 +30,7 @@ describe("Proofs", function () {
await ensureMinimumBlockHeight(256)
const Proofs = await ethers.getContractFactory("TestProofs")
const Verifier = await ethers.getContractFactory(
"contracts/verifiers/testing/verifier.sol:Groth16Verifier"
"contracts/verifiers/local/verifier_groth.sol:Verifier"
)
const verifier = await Verifier.deploy()
proofs = await Proofs.deploy(

View File

@ -50,7 +50,7 @@ for (const network of await readdir(networksPath)) {
.replaceAll('<%vk_ic_pts%>', icParts)
.replaceAll('<%vk_input_length%>', inputLength)
const preprocessedPath = join(networksPath, network, 'preprocessed')
const preprocessedPath = join(__dirname, '..', 'contracts', 'verifiers', network)
await mkdir(preprocessedPath, { recursive: true })
const contractPath = join(preprocessedPath, contractFile)
await writeFile(contractPath, contract)