From 3e3f2307d8b59ff80501cb91401d395cc33f17c2 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Thu, 18 Jan 2024 08:52:22 +0100 Subject: [PATCH] Remove GPL'ed verifier, replace by MIT verifier --- contracts/verifiers/dist-test/TODO | 0 contracts/verifiers/local/TODO | 0 .../verifiers/local}/verifier_groth.sol | 0 contracts/verifiers/testing/proof.json | 28 --- contracts/verifiers/testing/public.json | 5 - contracts/verifiers/testing/verifier.sol | 180 ------------------ contracts/verifiers/testnet/TODO | 0 test/Proofs.test.js | 2 +- verifier/preprocess.mjs | 2 +- 9 files changed, 2 insertions(+), 215 deletions(-) delete mode 100644 contracts/verifiers/dist-test/TODO delete mode 100644 contracts/verifiers/local/TODO rename {verifier/networks/local/preprocessed => contracts/verifiers/local}/verifier_groth.sol (100%) delete mode 100644 contracts/verifiers/testing/proof.json delete mode 100644 contracts/verifiers/testing/public.json delete mode 100644 contracts/verifiers/testing/verifier.sol delete mode 100644 contracts/verifiers/testnet/TODO diff --git a/contracts/verifiers/dist-test/TODO b/contracts/verifiers/dist-test/TODO deleted file mode 100644 index e69de29..0000000 diff --git a/contracts/verifiers/local/TODO b/contracts/verifiers/local/TODO deleted file mode 100644 index e69de29..0000000 diff --git a/verifier/networks/local/preprocessed/verifier_groth.sol b/contracts/verifiers/local/verifier_groth.sol similarity index 100% rename from verifier/networks/local/preprocessed/verifier_groth.sol rename to contracts/verifiers/local/verifier_groth.sol diff --git a/contracts/verifiers/testing/proof.json b/contracts/verifiers/testing/proof.json deleted file mode 100644 index 7fc8c8b..0000000 --- a/contracts/verifiers/testing/proof.json +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/contracts/verifiers/testing/public.json b/contracts/verifiers/testing/public.json deleted file mode 100644 index 1181cfb..0000000 --- a/contracts/verifiers/testing/public.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - "7410779170", - "16074246370508166450132968585287196391860062495017081813239200574579640171677", - "3" -] \ No newline at end of file diff --git a/contracts/verifiers/testing/verifier.sol b/contracts/verifiers/testing/verifier.sol deleted file mode 100644 index d909b27..0000000 --- a/contracts/verifiers/testing/verifier.sol +++ /dev/null @@ -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 . -*/ - -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) - } - } -} diff --git a/contracts/verifiers/testnet/TODO b/contracts/verifiers/testnet/TODO deleted file mode 100644 index e69de29..0000000 diff --git a/test/Proofs.test.js b/test/Proofs.test.js index f055b58..c8ab806 100644 --- a/test/Proofs.test.js +++ b/test/Proofs.test.js @@ -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( diff --git a/verifier/preprocess.mjs b/verifier/preprocess.mjs index 75fee5f..e2ee6bf 100644 --- a/verifier/preprocess.mjs +++ b/verifier/preprocess.mjs @@ -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)