From 1adf60b0b5fac04e07ce687ef40f13353d02cc9a Mon Sep 17 00:00:00 2001 From: hotaplayer <15000810224@139.com> Date: Sat, 6 May 2023 01:35:45 +0800 Subject: [PATCH] fix gitignore --- basic/22-zk-snarkjs/.gitignore | 5 +- .../artifact/circuit_final.zkey | Bin 0 -> 115032 bytes .../artifact/verification_key.json | 99 +++++++ .../zk_dapp_tutorial/artifact/verifier.sol | 260 ++++++++++++++++++ .../zk_dapp_tutorial/contracts/verifier.sol | 260 ++++++++++++++++++ 5 files changed, 620 insertions(+), 4 deletions(-) create mode 100644 basic/22-zk-snarkjs/zk_dapp_tutorial/artifact/circuit_final.zkey create mode 100644 basic/22-zk-snarkjs/zk_dapp_tutorial/artifact/verification_key.json create mode 100644 basic/22-zk-snarkjs/zk_dapp_tutorial/artifact/verifier.sol create mode 100644 basic/22-zk-snarkjs/zk_dapp_tutorial/contracts/verifier.sol diff --git a/basic/22-zk-snarkjs/.gitignore b/basic/22-zk-snarkjs/.gitignore index 83f8a19e8..9a80525be 100644 --- a/basic/22-zk-snarkjs/.gitignore +++ b/basic/22-zk-snarkjs/.gitignore @@ -8,12 +8,9 @@ circuit.sym circuit.json powersOfTau28_hez_final_10.ptau circuit_0000.zkey -verification_key.json + input.json witness.wtns witness.json proof.json proving_key.json -public.json -verifier.sol -circuit_final.zkey \ No newline at end of file diff --git a/basic/22-zk-snarkjs/zk_dapp_tutorial/artifact/circuit_final.zkey b/basic/22-zk-snarkjs/zk_dapp_tutorial/artifact/circuit_final.zkey new file mode 100644 index 0000000000000000000000000000000000000000..2861577612d8f35f060ac39b530d2f7f2548dbf9 GIT binary patch literal 115032 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

r#&1nbuqxqu16 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 z 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 JVs&(BZ*IX~qJIDY literal 0 HcmV?d00001 diff --git a/basic/22-zk-snarkjs/zk_dapp_tutorial/artifact/verification_key.json b/basic/22-zk-snarkjs/zk_dapp_tutorial/artifact/verification_key.json new file mode 100644 index 000000000..ae163a08c --- /dev/null +++ b/basic/22-zk-snarkjs/zk_dapp_tutorial/artifact/verification_key.json @@ -0,0 +1,99 @@ +{ + "protocol": "groth16", + "curve": "bn128", + "nPublic": 2, + "vk_alpha_1": [ + "17214108544151213417539800433311176468512901693170800859465967215878446140699", + "11862085286861793542065489552791786495610747461417875217980598566505311572617", + "1" + ], + "vk_beta_2": [ + [ + "11765292256257449944630827586436992718384355421309498724679720262263133439689", + "8817005734806047651328420221936362338952437587694967389636922017482949248443" + ], + [ + "4349924026217009329116974985308107521319016471709083681353619349273225009412", + "17457137269561997965526893702223241809174588851474760059778367519650574391492" + ], + [ + "1", + "0" + ] + ], + "vk_gamma_2": [ + [ + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + "11559732032986387107991004021392285783925812861821192530917403151452391805634" + ], + [ + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + "4082367875863433681332203403145435568316851327593401208105741076214120093531" + ], + [ + "1", + "0" + ] + ], + "vk_delta_2": [ + [ + "4352419207383908612591144093161067101286110705009938549655857723283636916403", + "20412706185122310344066244173335594506299963460781123421614529132907351990301" + ], + [ + "21380976044186132464781962235582584112112813583824333421946135092434001582207", + "9301780865705241398734718914827228414907883107422516219437145494001609347546" + ], + [ + "1", + "0" + ] + ], + "vk_alphabeta_12": [ + [ + [ + "4527177821731351260139268606529528853486841916521948730339238789682014421414", + "10680458444486934435059969537020658006989643544909285005021075137484188592447" + ], + [ + "294251318653224730182979535510860526802445019687153028109248149965986731457", + "18083474279420489031169680057272426233458858331603435908332942915408048584129" + ], + [ + "10012788813657855532752727216371441751759580638997207868130863656106916506669", + "14383948543539927587503290878411502949369904269032625279871774478306088173160" + ] + ], + [ + [ + "19089716112539554511213663071854804318182169863981558149835435384332201439228", + "1084883016806441635827468400406003254762247306749009006844348825167562836810" + ], + [ + "2485095005418470398034860209104025585436897065604056460422049020618521515703", + "18246565760419800585557768693966527799359955226064189743073407874181340147488" + ], + [ + "3992555745754787561818846826573279524736442181489248471157048584545900922907", + "4340943926960429153364399407081052219126909893625444399341055485682168563806" + ] + ] + ], + "IC": [ + [ + "17700694339348253354822827962730450473221681859495623625674843793298145954342", + "13558961663814610341827151463625142887105825904837601511334344006819894901501", + "1" + ], + [ + "4200532436143665327688580440068408281282739523466552486286484774771625936538", + "14489994838413750348153151923655066254281055197605245495390977658921123630945", + "1" + ], + [ + "10650929157331389729477462437023936310495733853812484752202548091148300884789", + "20494304102713317372589918072256456471542618306215347411367383609933350168725", + "1" + ] + ] +} \ No newline at end of file diff --git a/basic/22-zk-snarkjs/zk_dapp_tutorial/artifact/verifier.sol b/basic/22-zk-snarkjs/zk_dapp_tutorial/artifact/verifier.sol new file mode 100644 index 000000000..7390da655 --- /dev/null +++ b/basic/22-zk-snarkjs/zk_dapp_tutorial/artifact/verifier.sol @@ -0,0 +1,260 @@ +// +// Copyright 2017 Christian Reitwiessner +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// 2019 OKIMS +// ported to solidity 0.6 +// fixed linter warnings +// added requiere error messages +// +// +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.6.11; +library Pairing { + struct G1Point { + uint X; + uint Y; + } + // Encoding of field elements is: X[0] * z + X[1] + struct G2Point { + uint[2] X; + uint[2] Y; + } + /// @return the generator of G1 + function P1() internal pure returns (G1Point memory) { + return G1Point(1, 2); + } + /// @return the generator of G2 + function P2() internal pure returns (G2Point memory) { + // Original code point + return G2Point( + [11559732032986387107991004021392285783925812861821192530917403151452391805634, + 10857046999023057135944570762232829481370756359578518086990519993285655852781], + [4082367875863433681332203403145435568316851327593401208105741076214120093531, + 8495653923123431417604973247489272438418190587263600148770280649306958101930] + ); + +/* + // Changed by Jordi point + return G2Point( + [10857046999023057135944570762232829481370756359578518086990519993285655852781, + 11559732032986387107991004021392285783925812861821192530917403151452391805634], + [8495653923123431417604973247489272438418190587263600148770280649306958101930, + 4082367875863433681332203403145435568316851327593401208105741076214120093531] + ); +*/ + } + /// @return r the negation of p, i.e. p.addition(p.negate()) should be zero. + function negate(G1Point memory p) internal pure returns (G1Point memory r) { + // The prime q in the base field F_q for G1 + uint q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + if (p.X == 0 && p.Y == 0) + return G1Point(0, 0); + return G1Point(p.X, q - (p.Y % q)); + } + /// @return r the sum of two points of G1 + function addition(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) { + uint[4] memory input; + input[0] = p1.X; + input[1] = p1.Y; + input[2] = p2.X; + input[3] = p2.Y; + bool success; + // solium-disable-next-line security/no-inline-assembly + assembly { + success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60) + // Use "invalid" to make gas estimation work + switch success case 0 { invalid() } + } + require(success,"pairing-add-failed"); + } + /// @return r the product of a point on G1 and a scalar, i.e. + /// p == p.scalar_mul(1) and p.addition(p) == p.scalar_mul(2) for all points p. + function scalar_mul(G1Point memory p, uint s) internal view returns (G1Point memory r) { + uint[3] memory input; + input[0] = p.X; + input[1] = p.Y; + input[2] = s; + bool success; + // solium-disable-next-line security/no-inline-assembly + assembly { + success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60) + // Use "invalid" to make gas estimation work + switch success case 0 { invalid() } + } + require (success,"pairing-mul-failed"); + } + /// @return the result of computing the pairing check + /// e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1 + /// For example pairing([P1(), P1().negate()], [P2(), P2()]) should + /// return true. + function pairing(G1Point[] memory p1, G2Point[] memory p2) internal view returns (bool) { + require(p1.length == p2.length,"pairing-lengths-failed"); + uint elements = p1.length; + uint inputSize = elements * 6; + uint[] memory input = new uint[](inputSize); + for (uint i = 0; i < elements; i++) + { + input[i * 6 + 0] = p1[i].X; + input[i * 6 + 1] = p1[i].Y; + input[i * 6 + 2] = p2[i].X[0]; + input[i * 6 + 3] = p2[i].X[1]; + input[i * 6 + 4] = p2[i].Y[0]; + input[i * 6 + 5] = p2[i].Y[1]; + } + uint[1] memory out; + bool success; + // solium-disable-next-line security/no-inline-assembly + assembly { + success := staticcall(sub(gas(), 2000), 8, add(input, 0x20), mul(inputSize, 0x20), out, 0x20) + // Use "invalid" to make gas estimation work + switch success case 0 { invalid() } + } + require(success,"pairing-opcode-failed"); + return out[0] != 0; + } + /// Convenience method for a pairing check for two pairs. + function pairingProd2(G1Point memory a1, G2Point memory a2, G1Point memory b1, G2Point memory b2) internal view returns (bool) { + G1Point[] memory p1 = new G1Point[](2); + G2Point[] memory p2 = new G2Point[](2); + p1[0] = a1; + p1[1] = b1; + p2[0] = a2; + p2[1] = b2; + return pairing(p1, p2); + } + /// Convenience method for a pairing check for three pairs. + function pairingProd3( + G1Point memory a1, G2Point memory a2, + G1Point memory b1, G2Point memory b2, + G1Point memory c1, G2Point memory c2 + ) internal view returns (bool) { + G1Point[] memory p1 = new G1Point[](3); + G2Point[] memory p2 = new G2Point[](3); + p1[0] = a1; + p1[1] = b1; + p1[2] = c1; + p2[0] = a2; + p2[1] = b2; + p2[2] = c2; + return pairing(p1, p2); + } + /// Convenience method for a pairing check for four pairs. + function pairingProd4( + G1Point memory a1, G2Point memory a2, + G1Point memory b1, G2Point memory b2, + G1Point memory c1, G2Point memory c2, + G1Point memory d1, G2Point memory d2 + ) internal view returns (bool) { + G1Point[] memory p1 = new G1Point[](4); + G2Point[] memory p2 = new G2Point[](4); + p1[0] = a1; + p1[1] = b1; + p1[2] = c1; + p1[3] = d1; + p2[0] = a2; + p2[1] = b2; + p2[2] = c2; + p2[3] = d2; + return pairing(p1, p2); + } +} +contract Verifier { + using Pairing for *; + struct VerifyingKey { + Pairing.G1Point alfa1; + Pairing.G2Point beta2; + Pairing.G2Point gamma2; + Pairing.G2Point delta2; + Pairing.G1Point[] IC; + } + struct Proof { + Pairing.G1Point A; + Pairing.G2Point B; + Pairing.G1Point C; + } + function verifyingKey() internal pure returns (VerifyingKey memory vk) { + vk.alfa1 = Pairing.G1Point( + 17214108544151213417539800433311176468512901693170800859465967215878446140699, + 11862085286861793542065489552791786495610747461417875217980598566505311572617 + ); + + vk.beta2 = Pairing.G2Point( + [8817005734806047651328420221936362338952437587694967389636922017482949248443, + 11765292256257449944630827586436992718384355421309498724679720262263133439689], + [17457137269561997965526893702223241809174588851474760059778367519650574391492, + 4349924026217009329116974985308107521319016471709083681353619349273225009412] + ); + vk.gamma2 = Pairing.G2Point( + [11559732032986387107991004021392285783925812861821192530917403151452391805634, + 10857046999023057135944570762232829481370756359578518086990519993285655852781], + [4082367875863433681332203403145435568316851327593401208105741076214120093531, + 8495653923123431417604973247489272438418190587263600148770280649306958101930] + ); + vk.delta2 = Pairing.G2Point( + [20412706185122310344066244173335594506299963460781123421614529132907351990301, + 4352419207383908612591144093161067101286110705009938549655857723283636916403], + [9301780865705241398734718914827228414907883107422516219437145494001609347546, + 21380976044186132464781962235582584112112813583824333421946135092434001582207] + ); + vk.IC = new Pairing.G1Point[](3); + + vk.IC[0] = Pairing.G1Point( + 17700694339348253354822827962730450473221681859495623625674843793298145954342, + 13558961663814610341827151463625142887105825904837601511334344006819894901501 + ); + + vk.IC[1] = Pairing.G1Point( + 4200532436143665327688580440068408281282739523466552486286484774771625936538, + 14489994838413750348153151923655066254281055197605245495390977658921123630945 + ); + + vk.IC[2] = Pairing.G1Point( + 10650929157331389729477462437023936310495733853812484752202548091148300884789, + 20494304102713317372589918072256456471542618306215347411367383609933350168725 + ); + + } + function verify(uint[] memory input, Proof memory proof) internal view returns (uint) { + uint256 snark_scalar_field = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + VerifyingKey memory vk = verifyingKey(); + require(input.length + 1 == vk.IC.length,"verifier-bad-input"); + // Compute the linear combination vk_x + Pairing.G1Point memory vk_x = Pairing.G1Point(0, 0); + for (uint i = 0; i < input.length; i++) { + require(input[i] < snark_scalar_field,"verifier-gte-snark-scalar-field"); + vk_x = Pairing.addition(vk_x, Pairing.scalar_mul(vk.IC[i + 1], input[i])); + } + vk_x = Pairing.addition(vk_x, vk.IC[0]); + if (!Pairing.pairingProd4( + Pairing.negate(proof.A), proof.B, + vk.alfa1, vk.beta2, + vk_x, vk.gamma2, + proof.C, vk.delta2 + )) return 1; + return 0; + } + /// @return r bool true if proof is valid + function verifyProof( + uint[2] memory a, + uint[2][2] memory b, + uint[2] memory c, + uint[2] memory input + ) public view returns (bool r) { + Proof memory proof; + proof.A = Pairing.G1Point(a[0], a[1]); + proof.B = Pairing.G2Point([b[0][0], b[0][1]], [b[1][0], b[1][1]]); + proof.C = Pairing.G1Point(c[0], c[1]); + uint[] memory inputValues = new uint[](input.length); + for(uint i = 0; i < input.length; i++){ + inputValues[i] = input[i]; + } + if (verify(inputValues, proof) == 0) { + return true; + } else { + return false; + } + } +} diff --git a/basic/22-zk-snarkjs/zk_dapp_tutorial/contracts/verifier.sol b/basic/22-zk-snarkjs/zk_dapp_tutorial/contracts/verifier.sol new file mode 100644 index 000000000..7390da655 --- /dev/null +++ b/basic/22-zk-snarkjs/zk_dapp_tutorial/contracts/verifier.sol @@ -0,0 +1,260 @@ +// +// Copyright 2017 Christian Reitwiessner +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// 2019 OKIMS +// ported to solidity 0.6 +// fixed linter warnings +// added requiere error messages +// +// +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.6.11; +library Pairing { + struct G1Point { + uint X; + uint Y; + } + // Encoding of field elements is: X[0] * z + X[1] + struct G2Point { + uint[2] X; + uint[2] Y; + } + /// @return the generator of G1 + function P1() internal pure returns (G1Point memory) { + return G1Point(1, 2); + } + /// @return the generator of G2 + function P2() internal pure returns (G2Point memory) { + // Original code point + return G2Point( + [11559732032986387107991004021392285783925812861821192530917403151452391805634, + 10857046999023057135944570762232829481370756359578518086990519993285655852781], + [4082367875863433681332203403145435568316851327593401208105741076214120093531, + 8495653923123431417604973247489272438418190587263600148770280649306958101930] + ); + +/* + // Changed by Jordi point + return G2Point( + [10857046999023057135944570762232829481370756359578518086990519993285655852781, + 11559732032986387107991004021392285783925812861821192530917403151452391805634], + [8495653923123431417604973247489272438418190587263600148770280649306958101930, + 4082367875863433681332203403145435568316851327593401208105741076214120093531] + ); +*/ + } + /// @return r the negation of p, i.e. p.addition(p.negate()) should be zero. + function negate(G1Point memory p) internal pure returns (G1Point memory r) { + // The prime q in the base field F_q for G1 + uint q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + if (p.X == 0 && p.Y == 0) + return G1Point(0, 0); + return G1Point(p.X, q - (p.Y % q)); + } + /// @return r the sum of two points of G1 + function addition(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) { + uint[4] memory input; + input[0] = p1.X; + input[1] = p1.Y; + input[2] = p2.X; + input[3] = p2.Y; + bool success; + // solium-disable-next-line security/no-inline-assembly + assembly { + success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60) + // Use "invalid" to make gas estimation work + switch success case 0 { invalid() } + } + require(success,"pairing-add-failed"); + } + /// @return r the product of a point on G1 and a scalar, i.e. + /// p == p.scalar_mul(1) and p.addition(p) == p.scalar_mul(2) for all points p. + function scalar_mul(G1Point memory p, uint s) internal view returns (G1Point memory r) { + uint[3] memory input; + input[0] = p.X; + input[1] = p.Y; + input[2] = s; + bool success; + // solium-disable-next-line security/no-inline-assembly + assembly { + success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60) + // Use "invalid" to make gas estimation work + switch success case 0 { invalid() } + } + require (success,"pairing-mul-failed"); + } + /// @return the result of computing the pairing check + /// e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1 + /// For example pairing([P1(), P1().negate()], [P2(), P2()]) should + /// return true. + function pairing(G1Point[] memory p1, G2Point[] memory p2) internal view returns (bool) { + require(p1.length == p2.length,"pairing-lengths-failed"); + uint elements = p1.length; + uint inputSize = elements * 6; + uint[] memory input = new uint[](inputSize); + for (uint i = 0; i < elements; i++) + { + input[i * 6 + 0] = p1[i].X; + input[i * 6 + 1] = p1[i].Y; + input[i * 6 + 2] = p2[i].X[0]; + input[i * 6 + 3] = p2[i].X[1]; + input[i * 6 + 4] = p2[i].Y[0]; + input[i * 6 + 5] = p2[i].Y[1]; + } + uint[1] memory out; + bool success; + // solium-disable-next-line security/no-inline-assembly + assembly { + success := staticcall(sub(gas(), 2000), 8, add(input, 0x20), mul(inputSize, 0x20), out, 0x20) + // Use "invalid" to make gas estimation work + switch success case 0 { invalid() } + } + require(success,"pairing-opcode-failed"); + return out[0] != 0; + } + /// Convenience method for a pairing check for two pairs. + function pairingProd2(G1Point memory a1, G2Point memory a2, G1Point memory b1, G2Point memory b2) internal view returns (bool) { + G1Point[] memory p1 = new G1Point[](2); + G2Point[] memory p2 = new G2Point[](2); + p1[0] = a1; + p1[1] = b1; + p2[0] = a2; + p2[1] = b2; + return pairing(p1, p2); + } + /// Convenience method for a pairing check for three pairs. + function pairingProd3( + G1Point memory a1, G2Point memory a2, + G1Point memory b1, G2Point memory b2, + G1Point memory c1, G2Point memory c2 + ) internal view returns (bool) { + G1Point[] memory p1 = new G1Point[](3); + G2Point[] memory p2 = new G2Point[](3); + p1[0] = a1; + p1[1] = b1; + p1[2] = c1; + p2[0] = a2; + p2[1] = b2; + p2[2] = c2; + return pairing(p1, p2); + } + /// Convenience method for a pairing check for four pairs. + function pairingProd4( + G1Point memory a1, G2Point memory a2, + G1Point memory b1, G2Point memory b2, + G1Point memory c1, G2Point memory c2, + G1Point memory d1, G2Point memory d2 + ) internal view returns (bool) { + G1Point[] memory p1 = new G1Point[](4); + G2Point[] memory p2 = new G2Point[](4); + p1[0] = a1; + p1[1] = b1; + p1[2] = c1; + p1[3] = d1; + p2[0] = a2; + p2[1] = b2; + p2[2] = c2; + p2[3] = d2; + return pairing(p1, p2); + } +} +contract Verifier { + using Pairing for *; + struct VerifyingKey { + Pairing.G1Point alfa1; + Pairing.G2Point beta2; + Pairing.G2Point gamma2; + Pairing.G2Point delta2; + Pairing.G1Point[] IC; + } + struct Proof { + Pairing.G1Point A; + Pairing.G2Point B; + Pairing.G1Point C; + } + function verifyingKey() internal pure returns (VerifyingKey memory vk) { + vk.alfa1 = Pairing.G1Point( + 17214108544151213417539800433311176468512901693170800859465967215878446140699, + 11862085286861793542065489552791786495610747461417875217980598566505311572617 + ); + + vk.beta2 = Pairing.G2Point( + [8817005734806047651328420221936362338952437587694967389636922017482949248443, + 11765292256257449944630827586436992718384355421309498724679720262263133439689], + [17457137269561997965526893702223241809174588851474760059778367519650574391492, + 4349924026217009329116974985308107521319016471709083681353619349273225009412] + ); + vk.gamma2 = Pairing.G2Point( + [11559732032986387107991004021392285783925812861821192530917403151452391805634, + 10857046999023057135944570762232829481370756359578518086990519993285655852781], + [4082367875863433681332203403145435568316851327593401208105741076214120093531, + 8495653923123431417604973247489272438418190587263600148770280649306958101930] + ); + vk.delta2 = Pairing.G2Point( + [20412706185122310344066244173335594506299963460781123421614529132907351990301, + 4352419207383908612591144093161067101286110705009938549655857723283636916403], + [9301780865705241398734718914827228414907883107422516219437145494001609347546, + 21380976044186132464781962235582584112112813583824333421946135092434001582207] + ); + vk.IC = new Pairing.G1Point[](3); + + vk.IC[0] = Pairing.G1Point( + 17700694339348253354822827962730450473221681859495623625674843793298145954342, + 13558961663814610341827151463625142887105825904837601511334344006819894901501 + ); + + vk.IC[1] = Pairing.G1Point( + 4200532436143665327688580440068408281282739523466552486286484774771625936538, + 14489994838413750348153151923655066254281055197605245495390977658921123630945 + ); + + vk.IC[2] = Pairing.G1Point( + 10650929157331389729477462437023936310495733853812484752202548091148300884789, + 20494304102713317372589918072256456471542618306215347411367383609933350168725 + ); + + } + function verify(uint[] memory input, Proof memory proof) internal view returns (uint) { + uint256 snark_scalar_field = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + VerifyingKey memory vk = verifyingKey(); + require(input.length + 1 == vk.IC.length,"verifier-bad-input"); + // Compute the linear combination vk_x + Pairing.G1Point memory vk_x = Pairing.G1Point(0, 0); + for (uint i = 0; i < input.length; i++) { + require(input[i] < snark_scalar_field,"verifier-gte-snark-scalar-field"); + vk_x = Pairing.addition(vk_x, Pairing.scalar_mul(vk.IC[i + 1], input[i])); + } + vk_x = Pairing.addition(vk_x, vk.IC[0]); + if (!Pairing.pairingProd4( + Pairing.negate(proof.A), proof.B, + vk.alfa1, vk.beta2, + vk_x, vk.gamma2, + proof.C, vk.delta2 + )) return 1; + return 0; + } + /// @return r bool true if proof is valid + function verifyProof( + uint[2] memory a, + uint[2][2] memory b, + uint[2] memory c, + uint[2] memory input + ) public view returns (bool r) { + Proof memory proof; + proof.A = Pairing.G1Point(a[0], a[1]); + proof.B = Pairing.G2Point([b[0][0], b[0][1]], [b[1][0], b[1][1]]); + proof.C = Pairing.G1Point(c[0], c[1]); + uint[] memory inputValues = new uint[](input.length); + for(uint i = 0; i < input.length; i++){ + inputValues[i] = input[i]; + } + if (verify(inputValues, proof) == 0) { + return true; + } else { + return false; + } + } +}