From b0c5da781b36fc55c733e3b0d6a9c6af9551a406 Mon Sep 17 00:00:00 2001 From: Xavier Pinsach <10213118+xavi-pinsach@users.noreply.github.com> Date: Mon, 8 Apr 2024 11:07:01 +0200 Subject: [PATCH 1/2] PI check and new tests --- templates/verifier_groth16.sol.ejs | 2 +- test/fullprocess.js | 14 ++++++++++---- test/groth16/circuit.circom | 16 ++++++++++++++++ test/groth16/circuit.r1cs | Bin 16536 -> 164136 bytes test/groth16/circuit.wasm | Bin 0 -> 38750 bytes test/groth16/circuit.zkey | Bin 50908 -> 0 bytes test/groth16/witness.json | 4 ---- test/groth16/witness.wtns | Bin 3372 -> 0 bytes 8 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 test/groth16/circuit.circom create mode 100644 test/groth16/circuit.wasm delete mode 100644 test/groth16/circuit.zkey delete mode 100644 test/groth16/witness.json delete mode 100644 test/groth16/witness.wtns diff --git a/templates/verifier_groth16.sol.ejs b/templates/verifier_groth16.sol.ejs index 32c260ed..2efe53ca 100644 --- a/templates/verifier_groth16.sol.ejs +++ b/templates/verifier_groth16.sol.ejs @@ -56,7 +56,7 @@ contract Groth16Verifier { function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[<%=IC.length-1%>] calldata _pubSignals) public view returns (bool) { assembly { function checkField(v) { - if iszero(lt(v, q)) { + if iszero(lt(v, r)) { mstore(0, 0) return(0, 0x20) } diff --git a/test/fullprocess.js b/test/fullprocess.js index 088ee92c..126cb5f8 100644 --- a/test/fullprocess.js +++ b/test/fullprocess.js @@ -25,6 +25,7 @@ describe("Full process", function () { const wtns = {type: "mem"}; let proof; let publicSignals; + let publicSignalsWithAlias; before( async () => { curve = await getCurveFromName("bn128"); @@ -70,7 +71,7 @@ describe("Full process", function () { }); it ("groth16 setup", async () => { - await snarkjs.zKey.newZKey(path.join("test", "circuit", "circuit.r1cs"), ptau_final, zkey_0); + await snarkjs.zKey.newZKey(path.join("test", "groth16", "circuit.r1cs"), ptau_final, zkey_0); }); it ("zkey contribute ", async () => { @@ -94,7 +95,7 @@ describe("Full process", function () { }); it ("zkey verify r1cs", async () => { - const res = await snarkjs.zKey.verifyFromR1cs(path.join("test", "circuit", "circuit.r1cs"), ptau_final, zkey_final); + const res = await snarkjs.zKey.verifyFromR1cs(path.join("test", "groth16", "circuit.r1cs"), ptau_final, zkey_final); assert(res); }); @@ -108,23 +109,28 @@ describe("Full process", function () { }); it ("witness calculate", async () => { - await snarkjs.wtns.calculate({a: 11, b:2}, path.join("test", "circuit", "circuit.wasm"), wtns); + await snarkjs.wtns.calculate({a: 11, b:2}, path.join("test", "groth16", "circuit.wasm"), wtns); }); it ("checks witness complies with r1cs", async () => { - await snarkjs.wtns.check(path.join("test", "circuit", "circuit.r1cs"), wtns); + await snarkjs.wtns.check(path.join("test", "groth16", "circuit.r1cs"), wtns); }); it ("groth16 proof", async () => { const res = await snarkjs.groth16.prove(zkey_final, wtns); proof = res.proof; publicSignals = res.publicSignals; + publicSignalsWithAlias = [...res.publicSignals]; + publicSignalsWithAlias[1] = BigInt(res.publicSignals[1]) + BigInt(21888242871839275222246405745257275088548364400416034343698204186575808495617n); }); it ("groth16 verify", async () => { const res = await snarkjs.groth16.verify(vKey, publicSignals, proof); assert(res == true); + + const res2 = await snarkjs.groth16.verify(vKey, publicSignalsWithAlias, proof); + assert(res2 == false); }); it ("plonk setup", async () => { diff --git a/test/groth16/circuit.circom b/test/groth16/circuit.circom new file mode 100644 index 00000000..4e8b5332 --- /dev/null +++ b/test/groth16/circuit.circom @@ -0,0 +1,16 @@ +template Multiplier(n) { + signal input a; + signal input b; + signal output c; + + signal int[n]; + + int[0] <== a*a + b; + for (var i=1; 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 literal 0 HcmV?d00001 diff --git a/test/groth16/circuit.zkey b/test/groth16/circuit.zkey deleted file mode 100644 index cb16219b405ac2343aadfe1617ac2bf06b3116da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50908 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 Q8#ilJ9e$Fu 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 Lxb~3lp~QaxHt)l9 From a9f22431ddc76a3a26e9f95e441f4d232ce13553 Mon Sep 17 00:00:00 2001 From: Xavier Pinsach <10213118+xavi-pinsach@users.noreply.github.com> Date: Mon, 8 Apr 2024 11:46:45 +0200 Subject: [PATCH 2/2] add smart contract tests --- .../test/smart_contracts.test.js | 38 + test/fullprocess.js | 3 +- test/groth16/circuit.sym | 1003 +++++++++++++++++ test/groth16/input.json | 1 + test/groth16/witness.wtns | Bin 0 -> 32172 bytes 5 files changed, 1043 insertions(+), 2 deletions(-) create mode 100644 test/groth16/circuit.sym create mode 100644 test/groth16/input.json create mode 100644 test/groth16/witness.wtns diff --git a/smart_contract_tests/test/smart_contracts.test.js b/smart_contract_tests/test/smart_contracts.test.js index ec0bc7cb..54619251 100644 --- a/smart_contract_tests/test/smart_contracts.test.js +++ b/smart_contract_tests/test/smart_contracts.test.js @@ -39,6 +39,15 @@ describe("Smart contracts test suite", function () { )).to.be.equal(true); }); + it("Groth16 smart contract 1 aliased input", async () => { + expect( + await groth16VerifyAliased( + path.join("../test", "groth16", "circuit.r1cs"), + path.join("../test", "groth16", "witness.wtns") + ) + ).to.be.equal(false); + }); + it("Groth16 smart contract 3 inputs", async () => { expect(await groth16Verify( path.join("../test", "circuit2", "circuit.r1cs"), @@ -100,6 +109,35 @@ describe("Smart contracts test suite", function () { return await verifierContract.verifyProof(proofA, proofB, proofC, publicInputs); } + async function groth16VerifyAliased(r1csFilename, wtnsFilename) { + const solidityVerifierFilename = path.join("contracts", "groth16.sol"); + + const zkeyFilename = { type: "mem" }; + + await snarkjs.zKey.newZKey(r1csFilename, ptauFilename, zkeyFilename); + const { proof: proof, publicSignals: publicInputs } = await snarkjs.groth16.prove(zkeyFilename, wtnsFilename); + + const proofA = [proof.pi_a[0], proof.pi_a[1]]; + const proofB = [[proof.pi_b[0][1], proof.pi_b[0][0]], [proof.pi_b[1][1], proof.pi_b[1][0]],]; + const proofC = [proof.pi_c[0], proof.pi_c[1]]; + + // Generate groth16 verifier solidity file from groth16 template + zkey + const verifierCode = await snarkjs.zKey.exportSolidityVerifier(zkeyFilename, templates); + fs.writeFileSync(solidityVerifierFilename, verifierCode, "utf-8"); + + // Compile the groth16 verifier smart contract + await run("compile"); + + let pi_with_alias = [...publicInputs]; + pi_with_alias[1] = BigInt(publicInputs[1]) + 21888242871839275222246405745257275088548364400416034343698204186575808495617n; + + // Deploy mock groth16 verifier + const VerifierFactory = await ethers.getContractFactory("Groth16Verifier"); + verifierContract = await VerifierFactory.deploy(); + + return await verifierContract.verifyProof(proofA, proofB, proofC, pi_with_alias); + } + async function plonkVerify(r1csFilename, wtnsFilename) { const solidityVerifierFilename = path.join("contracts", "plonk.sol"); diff --git a/test/fullprocess.js b/test/fullprocess.js index 126cb5f8..7ae8b199 100644 --- a/test/fullprocess.js +++ b/test/fullprocess.js @@ -121,10 +121,9 @@ describe("Full process", function () { proof = res.proof; publicSignals = res.publicSignals; publicSignalsWithAlias = [...res.publicSignals]; - publicSignalsWithAlias[1] = BigInt(res.publicSignals[1]) + BigInt(21888242871839275222246405745257275088548364400416034343698204186575808495617n); + publicSignalsWithAlias[1] = BigInt(res.publicSignals[1]) + 21888242871839275222246405745257275088548364400416034343698204186575808495617n; }); - it ("groth16 verify", async () => { const res = await snarkjs.groth16.verify(vKey, publicSignals, proof); assert(res == true); diff --git a/test/groth16/circuit.sym b/test/groth16/circuit.sym new file mode 100644 index 00000000..28c68cbb --- /dev/null +++ b/test/groth16/circuit.sym @@ -0,0 +1,1003 @@ +1,1,0,main.c +2,2,0,main.a +3,3,0,main.b +4,4,0,main.int[0] +5,5,0,main.int[1] +6,6,0,main.int[2] +7,7,0,main.int[3] +8,8,0,main.int[4] +9,9,0,main.int[5] +10,10,0,main.int[6] +11,11,0,main.int[7] +12,12,0,main.int[8] +13,13,0,main.int[9] +14,14,0,main.int[10] +15,15,0,main.int[11] +16,16,0,main.int[12] +17,17,0,main.int[13] +18,18,0,main.int[14] +19,19,0,main.int[15] +20,20,0,main.int[16] +21,21,0,main.int[17] +22,22,0,main.int[18] +23,23,0,main.int[19] +24,24,0,main.int[20] +25,25,0,main.int[21] +26,26,0,main.int[22] +27,27,0,main.int[23] +28,28,0,main.int[24] +29,29,0,main.int[25] +30,30,0,main.int[26] +31,31,0,main.int[27] +32,32,0,main.int[28] +33,33,0,main.int[29] +34,34,0,main.int[30] +35,35,0,main.int[31] +36,36,0,main.int[32] +37,37,0,main.int[33] +38,38,0,main.int[34] +39,39,0,main.int[35] +40,40,0,main.int[36] +41,41,0,main.int[37] +42,42,0,main.int[38] +43,43,0,main.int[39] +44,44,0,main.int[40] +45,45,0,main.int[41] +46,46,0,main.int[42] +47,47,0,main.int[43] +48,48,0,main.int[44] +49,49,0,main.int[45] +50,50,0,main.int[46] +51,51,0,main.int[47] +52,52,0,main.int[48] +53,53,0,main.int[49] +54,54,0,main.int[50] +55,55,0,main.int[51] +56,56,0,main.int[52] +57,57,0,main.int[53] +58,58,0,main.int[54] +59,59,0,main.int[55] +60,60,0,main.int[56] +61,61,0,main.int[57] +62,62,0,main.int[58] +63,63,0,main.int[59] +64,64,0,main.int[60] +65,65,0,main.int[61] +66,66,0,main.int[62] +67,67,0,main.int[63] +68,68,0,main.int[64] +69,69,0,main.int[65] +70,70,0,main.int[66] +71,71,0,main.int[67] +72,72,0,main.int[68] +73,73,0,main.int[69] +74,74,0,main.int[70] +75,75,0,main.int[71] +76,76,0,main.int[72] +77,77,0,main.int[73] +78,78,0,main.int[74] +79,79,0,main.int[75] +80,80,0,main.int[76] +81,81,0,main.int[77] +82,82,0,main.int[78] +83,83,0,main.int[79] +84,84,0,main.int[80] +85,85,0,main.int[81] +86,86,0,main.int[82] +87,87,0,main.int[83] +88,88,0,main.int[84] +89,89,0,main.int[85] +90,90,0,main.int[86] +91,91,0,main.int[87] +92,92,0,main.int[88] +93,93,0,main.int[89] +94,94,0,main.int[90] +95,95,0,main.int[91] +96,96,0,main.int[92] +97,97,0,main.int[93] +98,98,0,main.int[94] +99,99,0,main.int[95] +100,100,0,main.int[96] +101,101,0,main.int[97] +102,102,0,main.int[98] +103,103,0,main.int[99] +104,104,0,main.int[100] +105,105,0,main.int[101] +106,106,0,main.int[102] +107,107,0,main.int[103] +108,108,0,main.int[104] +109,109,0,main.int[105] +110,110,0,main.int[106] +111,111,0,main.int[107] +112,112,0,main.int[108] +113,113,0,main.int[109] +114,114,0,main.int[110] +115,115,0,main.int[111] +116,116,0,main.int[112] +117,117,0,main.int[113] +118,118,0,main.int[114] +119,119,0,main.int[115] +120,120,0,main.int[116] +121,121,0,main.int[117] +122,122,0,main.int[118] +123,123,0,main.int[119] +124,124,0,main.int[120] +125,125,0,main.int[121] +126,126,0,main.int[122] +127,127,0,main.int[123] +128,128,0,main.int[124] +129,129,0,main.int[125] +130,130,0,main.int[126] +131,131,0,main.int[127] +132,132,0,main.int[128] +133,133,0,main.int[129] +134,134,0,main.int[130] +135,135,0,main.int[131] +136,136,0,main.int[132] +137,137,0,main.int[133] +138,138,0,main.int[134] +139,139,0,main.int[135] +140,140,0,main.int[136] +141,141,0,main.int[137] +142,142,0,main.int[138] +143,143,0,main.int[139] +144,144,0,main.int[140] +145,145,0,main.int[141] +146,146,0,main.int[142] +147,147,0,main.int[143] +148,148,0,main.int[144] +149,149,0,main.int[145] +150,150,0,main.int[146] +151,151,0,main.int[147] +152,152,0,main.int[148] +153,153,0,main.int[149] +154,154,0,main.int[150] +155,155,0,main.int[151] +156,156,0,main.int[152] +157,157,0,main.int[153] +158,158,0,main.int[154] +159,159,0,main.int[155] +160,160,0,main.int[156] +161,161,0,main.int[157] +162,162,0,main.int[158] +163,163,0,main.int[159] +164,164,0,main.int[160] +165,165,0,main.int[161] +166,166,0,main.int[162] +167,167,0,main.int[163] +168,168,0,main.int[164] +169,169,0,main.int[165] +170,170,0,main.int[166] +171,171,0,main.int[167] +172,172,0,main.int[168] +173,173,0,main.int[169] +174,174,0,main.int[170] +175,175,0,main.int[171] +176,176,0,main.int[172] +177,177,0,main.int[173] +178,178,0,main.int[174] +179,179,0,main.int[175] +180,180,0,main.int[176] +181,181,0,main.int[177] +182,182,0,main.int[178] +183,183,0,main.int[179] +184,184,0,main.int[180] +185,185,0,main.int[181] +186,186,0,main.int[182] +187,187,0,main.int[183] +188,188,0,main.int[184] +189,189,0,main.int[185] +190,190,0,main.int[186] +191,191,0,main.int[187] +192,192,0,main.int[188] +193,193,0,main.int[189] +194,194,0,main.int[190] +195,195,0,main.int[191] +196,196,0,main.int[192] +197,197,0,main.int[193] +198,198,0,main.int[194] +199,199,0,main.int[195] +200,200,0,main.int[196] +201,201,0,main.int[197] +202,202,0,main.int[198] +203,203,0,main.int[199] +204,204,0,main.int[200] +205,205,0,main.int[201] +206,206,0,main.int[202] +207,207,0,main.int[203] +208,208,0,main.int[204] +209,209,0,main.int[205] +210,210,0,main.int[206] +211,211,0,main.int[207] +212,212,0,main.int[208] +213,213,0,main.int[209] +214,214,0,main.int[210] +215,215,0,main.int[211] +216,216,0,main.int[212] +217,217,0,main.int[213] +218,218,0,main.int[214] +219,219,0,main.int[215] +220,220,0,main.int[216] +221,221,0,main.int[217] +222,222,0,main.int[218] +223,223,0,main.int[219] +224,224,0,main.int[220] +225,225,0,main.int[221] +226,226,0,main.int[222] +227,227,0,main.int[223] +228,228,0,main.int[224] +229,229,0,main.int[225] +230,230,0,main.int[226] +231,231,0,main.int[227] +232,232,0,main.int[228] +233,233,0,main.int[229] +234,234,0,main.int[230] +235,235,0,main.int[231] +236,236,0,main.int[232] +237,237,0,main.int[233] +238,238,0,main.int[234] +239,239,0,main.int[235] +240,240,0,main.int[236] +241,241,0,main.int[237] +242,242,0,main.int[238] +243,243,0,main.int[239] +244,244,0,main.int[240] +245,245,0,main.int[241] +246,246,0,main.int[242] +247,247,0,main.int[243] +248,248,0,main.int[244] +249,249,0,main.int[245] +250,250,0,main.int[246] +251,251,0,main.int[247] +252,252,0,main.int[248] +253,253,0,main.int[249] +254,254,0,main.int[250] +255,255,0,main.int[251] +256,256,0,main.int[252] +257,257,0,main.int[253] +258,258,0,main.int[254] +259,259,0,main.int[255] +260,260,0,main.int[256] +261,261,0,main.int[257] +262,262,0,main.int[258] +263,263,0,main.int[259] +264,264,0,main.int[260] +265,265,0,main.int[261] +266,266,0,main.int[262] +267,267,0,main.int[263] +268,268,0,main.int[264] +269,269,0,main.int[265] +270,270,0,main.int[266] +271,271,0,main.int[267] +272,272,0,main.int[268] +273,273,0,main.int[269] +274,274,0,main.int[270] +275,275,0,main.int[271] +276,276,0,main.int[272] +277,277,0,main.int[273] +278,278,0,main.int[274] +279,279,0,main.int[275] +280,280,0,main.int[276] +281,281,0,main.int[277] +282,282,0,main.int[278] +283,283,0,main.int[279] +284,284,0,main.int[280] +285,285,0,main.int[281] +286,286,0,main.int[282] +287,287,0,main.int[283] +288,288,0,main.int[284] +289,289,0,main.int[285] +290,290,0,main.int[286] +291,291,0,main.int[287] +292,292,0,main.int[288] +293,293,0,main.int[289] +294,294,0,main.int[290] +295,295,0,main.int[291] +296,296,0,main.int[292] +297,297,0,main.int[293] +298,298,0,main.int[294] +299,299,0,main.int[295] +300,300,0,main.int[296] +301,301,0,main.int[297] +302,302,0,main.int[298] +303,303,0,main.int[299] +304,304,0,main.int[300] +305,305,0,main.int[301] +306,306,0,main.int[302] +307,307,0,main.int[303] +308,308,0,main.int[304] +309,309,0,main.int[305] +310,310,0,main.int[306] +311,311,0,main.int[307] +312,312,0,main.int[308] +313,313,0,main.int[309] +314,314,0,main.int[310] +315,315,0,main.int[311] +316,316,0,main.int[312] +317,317,0,main.int[313] +318,318,0,main.int[314] +319,319,0,main.int[315] +320,320,0,main.int[316] +321,321,0,main.int[317] +322,322,0,main.int[318] +323,323,0,main.int[319] +324,324,0,main.int[320] +325,325,0,main.int[321] +326,326,0,main.int[322] +327,327,0,main.int[323] +328,328,0,main.int[324] +329,329,0,main.int[325] +330,330,0,main.int[326] +331,331,0,main.int[327] +332,332,0,main.int[328] +333,333,0,main.int[329] +334,334,0,main.int[330] +335,335,0,main.int[331] +336,336,0,main.int[332] +337,337,0,main.int[333] +338,338,0,main.int[334] +339,339,0,main.int[335] +340,340,0,main.int[336] +341,341,0,main.int[337] +342,342,0,main.int[338] +343,343,0,main.int[339] +344,344,0,main.int[340] +345,345,0,main.int[341] +346,346,0,main.int[342] +347,347,0,main.int[343] +348,348,0,main.int[344] +349,349,0,main.int[345] +350,350,0,main.int[346] +351,351,0,main.int[347] +352,352,0,main.int[348] +353,353,0,main.int[349] +354,354,0,main.int[350] +355,355,0,main.int[351] +356,356,0,main.int[352] +357,357,0,main.int[353] +358,358,0,main.int[354] +359,359,0,main.int[355] +360,360,0,main.int[356] +361,361,0,main.int[357] +362,362,0,main.int[358] +363,363,0,main.int[359] +364,364,0,main.int[360] +365,365,0,main.int[361] +366,366,0,main.int[362] +367,367,0,main.int[363] +368,368,0,main.int[364] +369,369,0,main.int[365] +370,370,0,main.int[366] +371,371,0,main.int[367] +372,372,0,main.int[368] +373,373,0,main.int[369] +374,374,0,main.int[370] +375,375,0,main.int[371] +376,376,0,main.int[372] +377,377,0,main.int[373] +378,378,0,main.int[374] +379,379,0,main.int[375] +380,380,0,main.int[376] +381,381,0,main.int[377] +382,382,0,main.int[378] +383,383,0,main.int[379] +384,384,0,main.int[380] +385,385,0,main.int[381] +386,386,0,main.int[382] +387,387,0,main.int[383] +388,388,0,main.int[384] +389,389,0,main.int[385] +390,390,0,main.int[386] +391,391,0,main.int[387] +392,392,0,main.int[388] +393,393,0,main.int[389] +394,394,0,main.int[390] +395,395,0,main.int[391] +396,396,0,main.int[392] +397,397,0,main.int[393] +398,398,0,main.int[394] +399,399,0,main.int[395] +400,400,0,main.int[396] +401,401,0,main.int[397] +402,402,0,main.int[398] +403,403,0,main.int[399] +404,404,0,main.int[400] +405,405,0,main.int[401] +406,406,0,main.int[402] +407,407,0,main.int[403] +408,408,0,main.int[404] +409,409,0,main.int[405] +410,410,0,main.int[406] +411,411,0,main.int[407] +412,412,0,main.int[408] +413,413,0,main.int[409] +414,414,0,main.int[410] +415,415,0,main.int[411] +416,416,0,main.int[412] +417,417,0,main.int[413] +418,418,0,main.int[414] +419,419,0,main.int[415] +420,420,0,main.int[416] +421,421,0,main.int[417] +422,422,0,main.int[418] +423,423,0,main.int[419] +424,424,0,main.int[420] +425,425,0,main.int[421] +426,426,0,main.int[422] +427,427,0,main.int[423] +428,428,0,main.int[424] +429,429,0,main.int[425] +430,430,0,main.int[426] +431,431,0,main.int[427] +432,432,0,main.int[428] +433,433,0,main.int[429] +434,434,0,main.int[430] +435,435,0,main.int[431] +436,436,0,main.int[432] +437,437,0,main.int[433] +438,438,0,main.int[434] +439,439,0,main.int[435] +440,440,0,main.int[436] +441,441,0,main.int[437] +442,442,0,main.int[438] +443,443,0,main.int[439] +444,444,0,main.int[440] +445,445,0,main.int[441] +446,446,0,main.int[442] +447,447,0,main.int[443] +448,448,0,main.int[444] +449,449,0,main.int[445] +450,450,0,main.int[446] +451,451,0,main.int[447] +452,452,0,main.int[448] +453,453,0,main.int[449] +454,454,0,main.int[450] +455,455,0,main.int[451] +456,456,0,main.int[452] +457,457,0,main.int[453] +458,458,0,main.int[454] +459,459,0,main.int[455] +460,460,0,main.int[456] +461,461,0,main.int[457] +462,462,0,main.int[458] +463,463,0,main.int[459] +464,464,0,main.int[460] +465,465,0,main.int[461] +466,466,0,main.int[462] +467,467,0,main.int[463] +468,468,0,main.int[464] +469,469,0,main.int[465] +470,470,0,main.int[466] +471,471,0,main.int[467] +472,472,0,main.int[468] +473,473,0,main.int[469] +474,474,0,main.int[470] +475,475,0,main.int[471] +476,476,0,main.int[472] +477,477,0,main.int[473] +478,478,0,main.int[474] +479,479,0,main.int[475] +480,480,0,main.int[476] +481,481,0,main.int[477] +482,482,0,main.int[478] +483,483,0,main.int[479] +484,484,0,main.int[480] +485,485,0,main.int[481] +486,486,0,main.int[482] +487,487,0,main.int[483] +488,488,0,main.int[484] +489,489,0,main.int[485] +490,490,0,main.int[486] +491,491,0,main.int[487] +492,492,0,main.int[488] +493,493,0,main.int[489] +494,494,0,main.int[490] +495,495,0,main.int[491] +496,496,0,main.int[492] +497,497,0,main.int[493] +498,498,0,main.int[494] +499,499,0,main.int[495] +500,500,0,main.int[496] +501,501,0,main.int[497] +502,502,0,main.int[498] +503,503,0,main.int[499] +504,504,0,main.int[500] +505,505,0,main.int[501] +506,506,0,main.int[502] +507,507,0,main.int[503] +508,508,0,main.int[504] +509,509,0,main.int[505] +510,510,0,main.int[506] +511,511,0,main.int[507] +512,512,0,main.int[508] +513,513,0,main.int[509] +514,514,0,main.int[510] +515,515,0,main.int[511] +516,516,0,main.int[512] +517,517,0,main.int[513] +518,518,0,main.int[514] +519,519,0,main.int[515] +520,520,0,main.int[516] +521,521,0,main.int[517] +522,522,0,main.int[518] +523,523,0,main.int[519] +524,524,0,main.int[520] +525,525,0,main.int[521] +526,526,0,main.int[522] +527,527,0,main.int[523] +528,528,0,main.int[524] +529,529,0,main.int[525] +530,530,0,main.int[526] +531,531,0,main.int[527] +532,532,0,main.int[528] +533,533,0,main.int[529] +534,534,0,main.int[530] +535,535,0,main.int[531] +536,536,0,main.int[532] +537,537,0,main.int[533] +538,538,0,main.int[534] +539,539,0,main.int[535] +540,540,0,main.int[536] +541,541,0,main.int[537] +542,542,0,main.int[538] +543,543,0,main.int[539] +544,544,0,main.int[540] +545,545,0,main.int[541] +546,546,0,main.int[542] +547,547,0,main.int[543] +548,548,0,main.int[544] +549,549,0,main.int[545] +550,550,0,main.int[546] +551,551,0,main.int[547] +552,552,0,main.int[548] +553,553,0,main.int[549] +554,554,0,main.int[550] +555,555,0,main.int[551] +556,556,0,main.int[552] +557,557,0,main.int[553] +558,558,0,main.int[554] +559,559,0,main.int[555] +560,560,0,main.int[556] +561,561,0,main.int[557] +562,562,0,main.int[558] +563,563,0,main.int[559] +564,564,0,main.int[560] +565,565,0,main.int[561] +566,566,0,main.int[562] +567,567,0,main.int[563] +568,568,0,main.int[564] +569,569,0,main.int[565] +570,570,0,main.int[566] +571,571,0,main.int[567] +572,572,0,main.int[568] +573,573,0,main.int[569] +574,574,0,main.int[570] +575,575,0,main.int[571] +576,576,0,main.int[572] +577,577,0,main.int[573] +578,578,0,main.int[574] +579,579,0,main.int[575] +580,580,0,main.int[576] +581,581,0,main.int[577] +582,582,0,main.int[578] +583,583,0,main.int[579] +584,584,0,main.int[580] +585,585,0,main.int[581] +586,586,0,main.int[582] +587,587,0,main.int[583] +588,588,0,main.int[584] +589,589,0,main.int[585] +590,590,0,main.int[586] +591,591,0,main.int[587] +592,592,0,main.int[588] +593,593,0,main.int[589] +594,594,0,main.int[590] +595,595,0,main.int[591] +596,596,0,main.int[592] +597,597,0,main.int[593] +598,598,0,main.int[594] +599,599,0,main.int[595] +600,600,0,main.int[596] +601,601,0,main.int[597] +602,602,0,main.int[598] +603,603,0,main.int[599] +604,604,0,main.int[600] +605,605,0,main.int[601] +606,606,0,main.int[602] +607,607,0,main.int[603] +608,608,0,main.int[604] +609,609,0,main.int[605] +610,610,0,main.int[606] +611,611,0,main.int[607] +612,612,0,main.int[608] +613,613,0,main.int[609] +614,614,0,main.int[610] +615,615,0,main.int[611] +616,616,0,main.int[612] +617,617,0,main.int[613] +618,618,0,main.int[614] +619,619,0,main.int[615] +620,620,0,main.int[616] +621,621,0,main.int[617] +622,622,0,main.int[618] +623,623,0,main.int[619] +624,624,0,main.int[620] +625,625,0,main.int[621] +626,626,0,main.int[622] +627,627,0,main.int[623] +628,628,0,main.int[624] +629,629,0,main.int[625] +630,630,0,main.int[626] +631,631,0,main.int[627] +632,632,0,main.int[628] +633,633,0,main.int[629] +634,634,0,main.int[630] +635,635,0,main.int[631] +636,636,0,main.int[632] +637,637,0,main.int[633] +638,638,0,main.int[634] +639,639,0,main.int[635] +640,640,0,main.int[636] +641,641,0,main.int[637] +642,642,0,main.int[638] +643,643,0,main.int[639] +644,644,0,main.int[640] +645,645,0,main.int[641] +646,646,0,main.int[642] +647,647,0,main.int[643] +648,648,0,main.int[644] +649,649,0,main.int[645] +650,650,0,main.int[646] +651,651,0,main.int[647] +652,652,0,main.int[648] +653,653,0,main.int[649] +654,654,0,main.int[650] +655,655,0,main.int[651] +656,656,0,main.int[652] +657,657,0,main.int[653] +658,658,0,main.int[654] +659,659,0,main.int[655] +660,660,0,main.int[656] +661,661,0,main.int[657] +662,662,0,main.int[658] +663,663,0,main.int[659] +664,664,0,main.int[660] +665,665,0,main.int[661] +666,666,0,main.int[662] +667,667,0,main.int[663] +668,668,0,main.int[664] +669,669,0,main.int[665] +670,670,0,main.int[666] +671,671,0,main.int[667] +672,672,0,main.int[668] +673,673,0,main.int[669] +674,674,0,main.int[670] +675,675,0,main.int[671] +676,676,0,main.int[672] +677,677,0,main.int[673] +678,678,0,main.int[674] +679,679,0,main.int[675] +680,680,0,main.int[676] +681,681,0,main.int[677] +682,682,0,main.int[678] +683,683,0,main.int[679] +684,684,0,main.int[680] +685,685,0,main.int[681] +686,686,0,main.int[682] +687,687,0,main.int[683] +688,688,0,main.int[684] +689,689,0,main.int[685] +690,690,0,main.int[686] +691,691,0,main.int[687] +692,692,0,main.int[688] +693,693,0,main.int[689] +694,694,0,main.int[690] +695,695,0,main.int[691] +696,696,0,main.int[692] +697,697,0,main.int[693] +698,698,0,main.int[694] +699,699,0,main.int[695] +700,700,0,main.int[696] +701,701,0,main.int[697] +702,702,0,main.int[698] +703,703,0,main.int[699] +704,704,0,main.int[700] +705,705,0,main.int[701] +706,706,0,main.int[702] +707,707,0,main.int[703] +708,708,0,main.int[704] +709,709,0,main.int[705] +710,710,0,main.int[706] +711,711,0,main.int[707] +712,712,0,main.int[708] +713,713,0,main.int[709] +714,714,0,main.int[710] +715,715,0,main.int[711] +716,716,0,main.int[712] +717,717,0,main.int[713] +718,718,0,main.int[714] +719,719,0,main.int[715] +720,720,0,main.int[716] +721,721,0,main.int[717] +722,722,0,main.int[718] +723,723,0,main.int[719] +724,724,0,main.int[720] +725,725,0,main.int[721] +726,726,0,main.int[722] +727,727,0,main.int[723] +728,728,0,main.int[724] +729,729,0,main.int[725] +730,730,0,main.int[726] +731,731,0,main.int[727] +732,732,0,main.int[728] +733,733,0,main.int[729] +734,734,0,main.int[730] +735,735,0,main.int[731] +736,736,0,main.int[732] +737,737,0,main.int[733] +738,738,0,main.int[734] +739,739,0,main.int[735] +740,740,0,main.int[736] +741,741,0,main.int[737] +742,742,0,main.int[738] +743,743,0,main.int[739] +744,744,0,main.int[740] +745,745,0,main.int[741] +746,746,0,main.int[742] +747,747,0,main.int[743] +748,748,0,main.int[744] +749,749,0,main.int[745] +750,750,0,main.int[746] +751,751,0,main.int[747] +752,752,0,main.int[748] +753,753,0,main.int[749] +754,754,0,main.int[750] +755,755,0,main.int[751] +756,756,0,main.int[752] +757,757,0,main.int[753] +758,758,0,main.int[754] +759,759,0,main.int[755] +760,760,0,main.int[756] +761,761,0,main.int[757] +762,762,0,main.int[758] +763,763,0,main.int[759] +764,764,0,main.int[760] +765,765,0,main.int[761] +766,766,0,main.int[762] +767,767,0,main.int[763] +768,768,0,main.int[764] +769,769,0,main.int[765] +770,770,0,main.int[766] +771,771,0,main.int[767] +772,772,0,main.int[768] +773,773,0,main.int[769] +774,774,0,main.int[770] +775,775,0,main.int[771] +776,776,0,main.int[772] +777,777,0,main.int[773] +778,778,0,main.int[774] +779,779,0,main.int[775] +780,780,0,main.int[776] +781,781,0,main.int[777] +782,782,0,main.int[778] +783,783,0,main.int[779] +784,784,0,main.int[780] +785,785,0,main.int[781] +786,786,0,main.int[782] +787,787,0,main.int[783] +788,788,0,main.int[784] +789,789,0,main.int[785] +790,790,0,main.int[786] +791,791,0,main.int[787] +792,792,0,main.int[788] +793,793,0,main.int[789] +794,794,0,main.int[790] +795,795,0,main.int[791] +796,796,0,main.int[792] +797,797,0,main.int[793] +798,798,0,main.int[794] +799,799,0,main.int[795] +800,800,0,main.int[796] +801,801,0,main.int[797] +802,802,0,main.int[798] +803,803,0,main.int[799] +804,804,0,main.int[800] +805,805,0,main.int[801] +806,806,0,main.int[802] +807,807,0,main.int[803] +808,808,0,main.int[804] +809,809,0,main.int[805] +810,810,0,main.int[806] +811,811,0,main.int[807] +812,812,0,main.int[808] +813,813,0,main.int[809] +814,814,0,main.int[810] +815,815,0,main.int[811] +816,816,0,main.int[812] +817,817,0,main.int[813] +818,818,0,main.int[814] +819,819,0,main.int[815] +820,820,0,main.int[816] +821,821,0,main.int[817] +822,822,0,main.int[818] +823,823,0,main.int[819] +824,824,0,main.int[820] +825,825,0,main.int[821] +826,826,0,main.int[822] +827,827,0,main.int[823] +828,828,0,main.int[824] +829,829,0,main.int[825] +830,830,0,main.int[826] +831,831,0,main.int[827] +832,832,0,main.int[828] +833,833,0,main.int[829] +834,834,0,main.int[830] +835,835,0,main.int[831] +836,836,0,main.int[832] +837,837,0,main.int[833] +838,838,0,main.int[834] +839,839,0,main.int[835] +840,840,0,main.int[836] +841,841,0,main.int[837] +842,842,0,main.int[838] +843,843,0,main.int[839] +844,844,0,main.int[840] +845,845,0,main.int[841] +846,846,0,main.int[842] +847,847,0,main.int[843] +848,848,0,main.int[844] +849,849,0,main.int[845] +850,850,0,main.int[846] +851,851,0,main.int[847] +852,852,0,main.int[848] +853,853,0,main.int[849] +854,854,0,main.int[850] +855,855,0,main.int[851] +856,856,0,main.int[852] +857,857,0,main.int[853] +858,858,0,main.int[854] +859,859,0,main.int[855] +860,860,0,main.int[856] +861,861,0,main.int[857] +862,862,0,main.int[858] +863,863,0,main.int[859] +864,864,0,main.int[860] +865,865,0,main.int[861] +866,866,0,main.int[862] +867,867,0,main.int[863] +868,868,0,main.int[864] +869,869,0,main.int[865] +870,870,0,main.int[866] +871,871,0,main.int[867] +872,872,0,main.int[868] +873,873,0,main.int[869] +874,874,0,main.int[870] +875,875,0,main.int[871] +876,876,0,main.int[872] +877,877,0,main.int[873] +878,878,0,main.int[874] +879,879,0,main.int[875] +880,880,0,main.int[876] +881,881,0,main.int[877] +882,882,0,main.int[878] +883,883,0,main.int[879] +884,884,0,main.int[880] +885,885,0,main.int[881] +886,886,0,main.int[882] +887,887,0,main.int[883] +888,888,0,main.int[884] +889,889,0,main.int[885] +890,890,0,main.int[886] +891,891,0,main.int[887] +892,892,0,main.int[888] +893,893,0,main.int[889] +894,894,0,main.int[890] +895,895,0,main.int[891] +896,896,0,main.int[892] +897,897,0,main.int[893] +898,898,0,main.int[894] +899,899,0,main.int[895] +900,900,0,main.int[896] +901,901,0,main.int[897] +902,902,0,main.int[898] +903,903,0,main.int[899] +904,904,0,main.int[900] +905,905,0,main.int[901] +906,906,0,main.int[902] +907,907,0,main.int[903] +908,908,0,main.int[904] +909,909,0,main.int[905] +910,910,0,main.int[906] +911,911,0,main.int[907] +912,912,0,main.int[908] +913,913,0,main.int[909] +914,914,0,main.int[910] +915,915,0,main.int[911] +916,916,0,main.int[912] +917,917,0,main.int[913] +918,918,0,main.int[914] +919,919,0,main.int[915] +920,920,0,main.int[916] +921,921,0,main.int[917] +922,922,0,main.int[918] +923,923,0,main.int[919] +924,924,0,main.int[920] +925,925,0,main.int[921] +926,926,0,main.int[922] +927,927,0,main.int[923] +928,928,0,main.int[924] +929,929,0,main.int[925] +930,930,0,main.int[926] +931,931,0,main.int[927] +932,932,0,main.int[928] +933,933,0,main.int[929] +934,934,0,main.int[930] +935,935,0,main.int[931] +936,936,0,main.int[932] +937,937,0,main.int[933] +938,938,0,main.int[934] +939,939,0,main.int[935] +940,940,0,main.int[936] +941,941,0,main.int[937] +942,942,0,main.int[938] +943,943,0,main.int[939] +944,944,0,main.int[940] +945,945,0,main.int[941] +946,946,0,main.int[942] +947,947,0,main.int[943] +948,948,0,main.int[944] +949,949,0,main.int[945] +950,950,0,main.int[946] +951,951,0,main.int[947] +952,952,0,main.int[948] +953,953,0,main.int[949] +954,954,0,main.int[950] +955,955,0,main.int[951] +956,956,0,main.int[952] +957,957,0,main.int[953] +958,958,0,main.int[954] +959,959,0,main.int[955] +960,960,0,main.int[956] +961,961,0,main.int[957] +962,962,0,main.int[958] +963,963,0,main.int[959] +964,964,0,main.int[960] +965,965,0,main.int[961] +966,966,0,main.int[962] +967,967,0,main.int[963] +968,968,0,main.int[964] +969,969,0,main.int[965] +970,970,0,main.int[966] +971,971,0,main.int[967] +972,972,0,main.int[968] +973,973,0,main.int[969] +974,974,0,main.int[970] +975,975,0,main.int[971] +976,976,0,main.int[972] +977,977,0,main.int[973] +978,978,0,main.int[974] +979,979,0,main.int[975] +980,980,0,main.int[976] +981,981,0,main.int[977] +982,982,0,main.int[978] +983,983,0,main.int[979] +984,984,0,main.int[980] +985,985,0,main.int[981] +986,986,0,main.int[982] +987,987,0,main.int[983] +988,988,0,main.int[984] +989,989,0,main.int[985] +990,990,0,main.int[986] +991,991,0,main.int[987] +992,992,0,main.int[988] +993,993,0,main.int[989] +994,994,0,main.int[990] +995,995,0,main.int[991] +996,996,0,main.int[992] +997,997,0,main.int[993] +998,998,0,main.int[994] +999,999,0,main.int[995] +1000,1000,0,main.int[996] +1001,1001,0,main.int[997] +1002,1002,0,main.int[998] +1003,-1,0,main.int[999] diff --git a/test/groth16/input.json b/test/groth16/input.json new file mode 100644 index 00000000..85c31680 --- /dev/null +++ b/test/groth16/input.json @@ -0,0 +1 @@ +{ "a": 11, "b": 2 } diff --git a/test/groth16/witness.wtns b/test/groth16/witness.wtns new file mode 100644 index 0000000000000000000000000000000000000000..07a308f09d3bb38a7816ef69e99bad328f727d1e GIT binary patch literal 32172 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 literal 0 HcmV?d00001