From 1309a4bdfd344d3dae8c9bf48f2a4d0742a2e25d Mon Sep 17 00:00:00 2001 From: AtHeartEngineer Date: Mon, 23 Oct 2023 21:18:16 -0400 Subject: [PATCH 1/2] the word vkey --- src/crypto/theWord/verifier.ts | 1 + src/crypto/theWord/vkey.ts | 99 ++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/crypto/theWord/verifier.ts create mode 100644 src/crypto/theWord/vkey.ts diff --git a/src/crypto/theWord/verifier.ts b/src/crypto/theWord/verifier.ts new file mode 100644 index 0000000..6cb04d8 --- /dev/null +++ b/src/crypto/theWord/verifier.ts @@ -0,0 +1 @@ +import {groth16 } from 'snarkjs' \ No newline at end of file diff --git a/src/crypto/theWord/vkey.ts b/src/crypto/theWord/vkey.ts new file mode 100644 index 0000000..541e1a3 --- /dev/null +++ b/src/crypto/theWord/vkey.ts @@ -0,0 +1,99 @@ +export const vkey = { + "protocol": "groth16", + "curve": "bn128", + "nPublic": 2, + "vk_alpha_1": [ + "9526385790532871687215529217220873884227928931149809248336571282923313396106", + "21514950079872959705810978772756325328244854949685521730808737769175706105020", + "1" + ], + "vk_beta_2": [ + [ + "20390368492886277093479380604774182574397340921248780260205596793295696674689", + "2716993543496060298796733064727635793292506509085152491379209538220117158382" + ], + [ + "12682167178280460625448986307109874161659067512125256426557601527559613505029", + "21764382463394824083591075546883615515682120102557591645420831661367465193367" + ], + [ + "1", + "0" + ] + ], + "vk_gamma_2": [ + [ + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + "11559732032986387107991004021392285783925812861821192530917403151452391805634" + ], + [ + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + "4082367875863433681332203403145435568316851327593401208105741076214120093531" + ], + [ + "1", + "0" + ] + ], + "vk_delta_2": [ + [ + "10906997380511376953049043930596140484928975373929750469282752765580878567599", + "4101997915818703989480745681395641243754430031549478442656633631473459377754" + ], + [ + "14148267251354792026140554064990543520838005031627642915066139480082886598994", + "21467614705199245308953952438252223903556487680113609709431051398494080793017" + ], + [ + "1", + "0" + ] + ], + "vk_alphabeta_12": [ + [ + [ + "19924953674037883896271428602575690323853623267990409040589831553237208262188", + "9321385585604328569146394173222424111899301556851408919706376422255002737936" + ], + [ + "1751896454046201622989931462958922166536631037207245141220963023196235803735", + "20292585785847888135031199901727640523960971840655348045898263139715649493860" + ], + [ + "5446781505488328642549520307745542362726434681032117705980159574064339913266", + "20665336076965191251070725469079726576750262538236769969035629514543990369554" + ] + ], + [ + [ + "18810991372291172338238710874030800126142777500516924965046600933233303482410", + "12062019029505540298724440861048717740962524199395385647479741209263862149617" + ], + [ + "1481203610798218482059801369834923818560843863835818188002762172113888121288", + "421373448704976261018012513997133393245111569758178899482271740551882937334" + ], + [ + "17939363194547838185675404780272588604986297817735919104774977386402883380975", + "11970795058328936879231284313869468162271625786608613880765645203894488402170" + ] + ] + ], + "IC": [ + [ + "1481576207721992903324306469202784205263698883633483801846749476639749907908", + "14079879823088619349409019686751314160916086276213976861320608433134023444236", + "1" + ], + [ + "7383731686009945241890027660424753486806019510710608577959624978038477330556", + "15989552492341906507948596904664651598249821034965897193817841304269401419658", + "1" + ], + [ + "14560868027354574229864667972499776606845480756169309217438610379539610036620", + "2229063762005447500484823201700247299911184494037799604681263211101013646192", + "1" + ] + ] +} \ No newline at end of file From becf9bc1b92a1012f8e7c798dad31f1b99e7861c Mon Sep 17 00:00:00 2001 From: Tanner Shaw Date: Tue, 24 Oct 2023 13:08:19 -0500 Subject: [PATCH 2/2] feat(theword): verifier and endpoint for the-word. changed endpoints for gateways --- package-lock.json | 90 ++++++------------------ package.json | 2 + prisma/seed.ts | 1 + src/crypto/idcVerifier/verifier.ts | 8 --- src/crypto/theWord/verifier.ts | 1 - src/endpoints/index.ts | 40 +++++++++-- src/gateways/theWord/verifier.ts | 12 ++++ src/{crypto => gateways}/theWord/vkey.ts | 6 +- src/types/index.ts | 6 ++ 9 files changed, 81 insertions(+), 85 deletions(-) delete mode 100644 src/crypto/theWord/verifier.ts create mode 100644 src/gateways/theWord/verifier.ts rename src/{crypto => gateways}/theWord/vkey.ts (98%) diff --git a/package-lock.json b/package-lock.json index 033c327..f024393 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "mongodb": "^5.8.0", "poseidon-lite": "^0.2.0", "rlnjs": "^3.2.0", + "snarkjs": "^0.7.1", "socket.io": "^4.6.2" }, "devDependencies": { @@ -43,6 +44,7 @@ "@types/express": "^4.17.17", "@types/jest": "^29.5.3", "@types/node": "^20.4.5", + "@types/snarkjs": "^0.7.6", "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^6.2.1", "@typescript-eslint/parser": "^6.2.1", @@ -2358,6 +2360,12 @@ "@types/node": "*" } }, + "node_modules/@types/snarkjs": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@types/snarkjs/-/snarkjs-0.7.6.tgz", + "integrity": "sha512-1GVira8XuoCqqOJTKT6UQVMrPRBtylA6OjRgRuwkZFUUy4R8ZrwchNn7yr+XjQ1aXPAv/Q/jua8e+HezKeZjyg==", + "dev": true + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -3470,34 +3478,16 @@ } }, "node_modules/circom_runtime": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.22.tgz", - "integrity": "sha512-V/XYZWBhbZY8SotkaGH4FbiDYAZ8a1Md++MBiKPDOuWS/NIJB+Q+XIiTC8zKMgoDaa9cd2OiTvsC9J6te7twNg==", + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.24.tgz", + "integrity": "sha512-H7/7I2J/cBmRnZm9docOCGhfxzS61BEm4TMCWcrZGsWNBQhePNfQq88Oj2XpUfzmBTCd8pRvRb3Mvazt3TMrJw==", "dependencies": { - "ffjavascript": "0.2.57" + "ffjavascript": "0.2.60" }, "bin": { "calcwit": "calcwit.js" } }, - "node_modules/circom_runtime/node_modules/ffjavascript": { - "version": "0.2.57", - "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.57.tgz", - "integrity": "sha512-V+vxZ/zPNcthrWmqfe/1YGgqdkTamJeXiED0tsk7B84g40DKlrTdx47IqZuiygqAVG6zMw4qYuvXftIJWsmfKQ==", - "dependencies": { - "wasmbuilder": "0.0.16", - "wasmcurves": "0.2.0", - "web-worker": "^1.2.0" - } - }, - "node_modules/circom_runtime/node_modules/wasmcurves": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz", - "integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==", - "dependencies": { - "wasmbuilder": "0.0.16" - } - }, "node_modules/circomlib": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/circomlib/-/circomlib-2.0.5.tgz", @@ -7327,32 +7317,14 @@ ] }, "node_modules/r1csfile": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.45.tgz", - "integrity": "sha512-YKIp4D441aZ6OoI9y+bfAyb2j4Cl+OFq/iiX6pPWDrL4ZO968h0dq0w07i65edvrTt7/G43mTnl0qEuLXyp/Yw==", + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.47.tgz", + "integrity": "sha512-oI4mAwuh1WwuFg95eJDNDDL8hCaZkwnPuNZrQdLBWvDoRU7EG+L/MOHL7SwPW2Y+ZuYcTLpj3rBkgllBQZN/JA==", "dependencies": { "@iden3/bigarray": "0.0.2", "@iden3/binfileutils": "0.0.11", "fastfile": "0.0.20", - "ffjavascript": "0.2.57" - } - }, - "node_modules/r1csfile/node_modules/ffjavascript": { - "version": "0.2.57", - "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.57.tgz", - "integrity": "sha512-V+vxZ/zPNcthrWmqfe/1YGgqdkTamJeXiED0tsk7B84g40DKlrTdx47IqZuiygqAVG6zMw4qYuvXftIJWsmfKQ==", - "dependencies": { - "wasmbuilder": "0.0.16", - "wasmcurves": "0.2.0", - "web-worker": "^1.2.0" - } - }, - "node_modules/r1csfile/node_modules/wasmcurves": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.0.tgz", - "integrity": "sha512-3e2rbxdujOwaod657gxgmdhZNn+i1qKdHO3Y/bK+8E7bV8ttV/fu5FO4/WLBACF375cK0QDLOP+65Na63qYuWA==", - "dependencies": { - "wasmbuilder": "0.0.16" + "ffjavascript": "0.2.60" } }, "node_modules/randombytes": { @@ -7942,43 +7914,25 @@ } }, "node_modules/snarkjs": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.0.tgz", - "integrity": "sha512-Vu5W+0Va6X1xvlCllpZ2r3/S7MafnL6IrAv09lk/F+VNDHuHEHx3xopR9Kr70p2KpbBBJ/HB9VCDZWism8WGlA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.1.tgz", + "integrity": "sha512-Qs1oxssa135WZkzfARgEp5SuKHKvKNtcspeJbE5je6MurUpBylD1rzcAzQSTGWA/EH/BV/TmUyTaTD64xScvbA==", "dependencies": { "@iden3/binfileutils": "0.0.11", "bfj": "^7.0.2", "blake2b-wasm": "^2.4.0", - "circom_runtime": "0.1.22", + "circom_runtime": "0.1.24", "ejs": "^3.1.6", "fastfile": "0.0.20", - "ffjavascript": "0.2.59", + "ffjavascript": "0.2.60", "js-sha3": "^0.8.0", "logplease": "^1.2.15", - "r1csfile": "0.0.45" + "r1csfile": "0.0.47" }, "bin": { "snarkjs": "build/cli.cjs" } }, - "node_modules/snarkjs/node_modules/ffjavascript": { - "version": "0.2.59", - "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.59.tgz", - "integrity": "sha512-QssOEUv+wilz9Sg7Zaj6KWAm7QceOAEsFuEBTltUsDo1cjn11rA/LGYvzFBPbzNfxRlZxwgJ7uxpCQcdDlrNfw==", - "dependencies": { - "wasmbuilder": "0.0.16", - "wasmcurves": "0.2.1", - "web-worker": "^1.2.0" - } - }, - "node_modules/snarkjs/node_modules/wasmcurves": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.1.tgz", - "integrity": "sha512-9ciO7bUE5bgpbOcdK7IO3enrSVIKHwrQmPibok4GLJWaCA7Wyqc9PRYnu5HbiFv9NDFNqVKPtU5R6Is5KujBLg==", - "dependencies": { - "wasmbuilder": "0.0.16" - } - }, "node_modules/socket.io": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.1.tgz", diff --git a/package.json b/package.json index bd5dc76..f9a5da8 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "mongodb": "^5.8.0", "poseidon-lite": "^0.2.0", "rlnjs": "^3.2.0", + "snarkjs": "^0.7.1", "socket.io": "^4.6.2" }, "devDependencies": { @@ -57,6 +58,7 @@ "@types/express": "^4.17.17", "@types/jest": "^29.5.3", "@types/node": "^20.4.5", + "@types/snarkjs": "^0.7.6", "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^6.2.1", "@typescript-eslint/parser": "^6.2.1", diff --git a/prisma/seed.ts b/prisma/seed.ts index 0944978..6154574 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -14,6 +14,7 @@ async function main() { await createRoom('PSE', 100000, 12, 80, 20, 'PUBLIC'); await createRoom('SBC Experiments', 100000, 12, 20, 20, 'PUBLIC'); await createRoom('Ban Appeals', 10000, 1, 0, 5, 'PUBLIC', [], '666'); + await createRoom('The Word', 10000, 12, 0, 0, 'PUBLIC', [], '007001'); const bcgd = await createRoom('Beacon Chain Genesis Depositors', 10000, 12, 0 ,20, 'PUBLIC'); const sgf = await createRoom('Stateful Genesis Funders', 10000, 12, 0, 20, 'PUBLIC'); await createEthGroup('Beacon Chain Genesis Depositors', bcgd!.roomId, addresses.bcgd); diff --git a/src/crypto/idcVerifier/verifier.ts b/src/crypto/idcVerifier/verifier.ts index d44be55..fc37ddb 100644 --- a/src/crypto/idcVerifier/verifier.ts +++ b/src/crypto/idcVerifier/verifier.ts @@ -3,14 +3,6 @@ import vkey from './vkey'; import { SNARKProof } from 'idc-nullifier/dist/types/types'; import { Identity } from '@semaphore-protocol/identity'; -// import fs from 'fs'; -// import path from 'path'; - -// const zKeyRoot = path.resolve(__dirname, '../../../node_modules/idc-nullifier/dist/zkeyFiles/idcNullifier/circuit_final.zkey') -// console.log(zKeyRoot) -// const zkey = fs.readFileSync(zKeyRoot); -// const zkeyBuffer = fs.readFileSync('../../../node_modules/idc-nullifier/dist/zkeyFiles/idcNullifier/circuit_final.zkey'); -// const wasmBuffer = fs.readFileSync('../../../node_modules/idc-nullifier/dist/zkeyFiles/idcNullifier/circuit.wasm'); export async function verifyIdentityProof (proof: SNARKProof): Promise { const verifier = new Verifier(vkey); diff --git a/src/crypto/theWord/verifier.ts b/src/crypto/theWord/verifier.ts deleted file mode 100644 index 6cb04d8..0000000 --- a/src/crypto/theWord/verifier.ts +++ /dev/null @@ -1 +0,0 @@ -import {groth16 } from 'snarkjs' \ No newline at end of file diff --git a/src/endpoints/index.ts b/src/endpoints/index.ts index a987f37..f97274a 100644 --- a/src/endpoints/index.ts +++ b/src/endpoints/index.ts @@ -12,7 +12,8 @@ import { createRoom, createSystemMessages, removeRoom, - removeMessage + removeMessage, + addIdentityToIdentityListRooms } from '../data/db/'; import { MessageI, RoomI } from 'discreetly-interfaces'; import { RLNFullProof } from 'rlnjs'; @@ -24,8 +25,10 @@ import { toBuffer, hashPersonalMessage } from 'ethereumjs-util'; -import { SNARKProof } from 'idc-nullifier/dist/types/types'; +import { SNARKProof as idcProof } from 'idc-nullifier/dist/types/types'; +import { SNARKProof } from '../types'; import { verifyIdentityProof } from '../crypto/idcVerifier/verifier'; +import { verifyTheWordProof } from '../gateways/theWord/verifier'; import { rateLimit } from 'express-rate-limit'; // import expressBasicAuth from 'express-basic-auth'; @@ -119,7 +122,7 @@ export function initEndpoints(app: Express, adminAuth: RequestHandler) { asyncHandler(async (req: Request, res: Response) => { // const { proof } = req.body as { proof: SNARKProof }; // console.log('PROOF', proof); - const isValid = await verifyIdentityProof(req.body as SNARKProof); + const isValid = await verifyIdentityProof(req.body as idcProof); console.log('VALID?', isValid) if (isValid) { try { @@ -151,7 +154,7 @@ export function initEndpoints(app: Express, adminAuth: RequestHandler) { * } */ app.post( - ['/join', '/api/join'], limiter, + ['/gateway/join', '/api/gateway/join'], limiter, asyncHandler(async (req: Request, res: Response) => { const parsedBody: JoinData = req.body as JoinData; @@ -618,7 +621,7 @@ export function initEndpoints(app: Express, adminAuth: RequestHandler) { }); app.post(['/change-identity', '/api/change-identity'], limiter, asyncHandler(async (req: Request, res: Response) => { - const { generatedProof } = req.body as { generatedProof: SNARKProof }; + const { generatedProof } = req.body as { generatedProof: idcProof }; const isValid = await verifyIdentityProof(generatedProof); @@ -926,7 +929,7 @@ app.post( * } */ app.post( - ['/eth/message/sign', '/api/eth/message/sign'], + ['/gateway/eth/message/sign', '/api/gateway/eth/message/sign'], limiter, asyncHandler(async (req: Request, res: Response) => { const { message, signature } = req.body as { @@ -988,6 +991,31 @@ app.post( }) ); + app.post(['/gateway/theword', '/api/gateway/theword'], limiter, asyncHandler(async (req: Request, res: Response) => { + const { proof, idc } = req.body as { proof: SNARKProof, idc: string }; + + const isValid = await verifyTheWordProof(proof); + if (isValid) { + const room = await prisma.rooms.findUnique({ + where: { + roomId: '007' + process.env.THEWORD_ITERATION + } + }) as RoomI; + const addedRoom = await addIdentityToIdentityListRooms([room], idc); + if (addedRoom.length === 0) { + res.status(500).json({ + status: "already-added", + message: 'Identity already added to room' }) + } else { + res.status(200).json({ + status: 'valid', + roomId: room.roomId + }); + } + } else { + res.status(500).json({ error: 'Invalid Proof' }); + } + })); /*---------------------DISCORD BOT APIS ---------------------*/ /** diff --git a/src/gateways/theWord/verifier.ts b/src/gateways/theWord/verifier.ts new file mode 100644 index 0000000..6c12520 --- /dev/null +++ b/src/gateways/theWord/verifier.ts @@ -0,0 +1,12 @@ +import { SNARKProof } from '../../types'; +import { groth16 } from 'snarkjs'; +import vkey from './vkey'; + + +export async function verifyTheWordProof(proof: SNARKProof): Promise { + + + const isValid = groth16.verify(vkey, proof.publicSignals, proof.proof); + + return isValid; +} diff --git a/src/crypto/theWord/vkey.ts b/src/gateways/theWord/vkey.ts similarity index 98% rename from src/crypto/theWord/vkey.ts rename to src/gateways/theWord/vkey.ts index 541e1a3..d0ac2c5 100644 --- a/src/crypto/theWord/vkey.ts +++ b/src/gateways/theWord/vkey.ts @@ -1,4 +1,4 @@ -export const vkey = { +const vkey = { "protocol": "groth16", "curve": "bn128", "nPublic": 2, @@ -96,4 +96,6 @@ export const vkey = { "1" ] ] -} \ No newline at end of file +} + +export default vkey; diff --git a/src/types/index.ts b/src/types/index.ts index b172142..a106df4 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,4 +1,5 @@ import { RoomI } from 'discreetly-interfaces'; +import { Groth16Proof, PublicSignals } from 'snarkjs'; export interface CodeStatus { claimed: boolean; @@ -26,4 +27,9 @@ export interface GateWayIdentityI { usedClaimCodes: string[]; } +export interface SNARKProof { + proof: Groth16Proof; + publicSignals: PublicSignals; +} + export type userCountI = Record;