From fac4a791c4fdf5dd58a7c0ff2348c80d879d08d8 Mon Sep 17 00:00:00 2001 From: yosaphatprs Date: Thu, 13 Nov 2025 14:06:16 +0700 Subject: [PATCH] feat: add proof --- backend/api/package-lock.json | 410 +++++++++++++++++- backend/api/package.json | 4 +- backend/api/public/circuit.wasm | Bin 0 -> 36362 bytes backend/api/public/circuit_final.zkey | Bin 0 -> 13985 bytes backend/api/public/verification_key.json | 94 ++++ .../api/src/modules/proof/proof.service.ts | 54 ++- .../modules/rekammedis/rekammedis.service.ts | 23 +- 7 files changed, 566 insertions(+), 19 deletions(-) create mode 100644 backend/api/public/circuit.wasm create mode 100644 backend/api/public/circuit_final.zkey create mode 100644 backend/api/public/verification_key.json diff --git a/backend/api/package-lock.json b/backend/api/package-lock.json index a0113bd..7382657 100644 --- a/backend/api/package-lock.json +++ b/backend/api/package-lock.json @@ -23,7 +23,8 @@ "class-validator": "^0.14.2", "cookie-parser": "^1.4.7", "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.1" + "rxjs": "^7.8.1", + "snarkjs": "^0.7.5" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", @@ -36,6 +37,7 @@ "@types/express": "^5.0.0", "@types/jest": "^30.0.0", "@types/node": "^22.10.7", + "@types/snarkjs": "^0.7.9", "@types/supertest": "^6.0.2", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", @@ -1065,6 +1067,22 @@ "node": ">=16.13.0" } }, + "node_modules/@iden3/bigarray": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz", + "integrity": "sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==", + "license": "GPL-3.0" + }, + "node_modules/@iden3/binfileutils": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.12.tgz", + "integrity": "sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==", + "license": "GPL-3.0", + "dependencies": { + "fastfile": "0.0.20", + "ffjavascript": "^0.3.0" + } + }, "node_modules/@inquirer/ansi": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", @@ -3295,6 +3313,13 @@ "@types/node": "*" } }, + "node_modules/@types/snarkjs": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/@types/snarkjs/-/snarkjs-0.7.9.tgz", + "integrity": "sha512-pb4Bq3GI2YQOQOG0dR/YuQs/mqcuL6k/vnz68LIPtpA2frrUL3twf69a3AUK9eUmNNeW0RIKkq6scDlC75Is+g==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -4314,6 +4339,12 @@ "dev": true, "license": "MIT" }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4321,6 +4352,20 @@ "dev": true, "license": "MIT" }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/babel-jest": { "version": "30.2.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", @@ -4424,7 +4469,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -4472,6 +4516,22 @@ "node": ">= 18" } }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -4484,6 +4544,22 @@ "readable-stream": "^3.4.0" } }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "license": "MIT", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, "node_modules/body-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", @@ -4800,6 +4876,12 @@ "dev": true, "license": "MIT" }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "license": "MIT" + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -4842,6 +4924,18 @@ "node": ">=8" } }, + "node_modules/circom_runtime": { + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.28.tgz", + "integrity": "sha512-ACagpQ7zBRLKDl5xRZ4KpmYIcZDUjOiNRuxvXLqhnnlLSVY1Dbvh73TI853nqoR0oEbihtWmMSjgc5f+pXf/jQ==", + "license": "Apache-2.0", + "dependencies": { + "ffjavascript": "0.3.1" + }, + "bin": { + "calcwit": "calcwit.js" + } + }, "node_modules/citty": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", @@ -5289,7 +5383,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, "license": "MIT" }, "node_modules/deepmerge": { @@ -5463,6 +5556,21 @@ "fast-check": "^3.23.1" } }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.237", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz", @@ -5613,6 +5721,97 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/eslint": { "version": "9.38.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", @@ -5772,7 +5971,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -5822,7 +6020,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -6050,7 +6247,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, "license": "MIT" }, "node_modules/fast-safe-stringify": { @@ -6076,6 +6272,12 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fastfile": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz", + "integrity": "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==", + "license": "GPL-3.0" + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -6096,6 +6298,17 @@ "bser": "2.1.1" } }, + "node_modules/ffjavascript": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.1.tgz", + "integrity": "sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw==", + "license": "GPL-3.0", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "1.2.0" + } + }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", @@ -6133,6 +6346,36 @@ "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -6659,6 +6902,15 @@ "node": ">= 0.4" } }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -7025,6 +7277,23 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest": { "version": "30.2.0", "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", @@ -7810,6 +8079,12 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7904,6 +8179,29 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "license": "MIT", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -8128,6 +8426,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/logplease": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/logplease/-/logplease-1.2.15.tgz", + "integrity": "sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==", + "license": "MIT" + }, "node_modules/long": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", @@ -8449,6 +8753,12 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", + "license": "ISC" + }, "node_modules/napi-postinstall": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", @@ -9065,7 +9375,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -9390,6 +9699,29 @@ ], "license": "MIT" }, + "node_modules/r1csfile": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.48.tgz", + "integrity": "sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw==", + "license": "GPL-3.0", + "dependencies": { + "@iden3/bigarray": "0.0.2", + "@iden3/binfileutils": "0.0.12", + "fastfile": "0.0.20", + "ffjavascript": "0.3.0" + } + }, + "node_modules/r1csfile/node_modules/ffjavascript": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.0.tgz", + "integrity": "sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==", + "license": "GPL-3.0", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "1.2.0" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -9837,6 +10169,27 @@ "node": ">=8" } }, + "node_modules/snarkjs": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.5.tgz", + "integrity": "sha512-h+3c4rXZKLhLuHk4LHydZCk/h5GcNvk5GjVKRRkHmfb6Ntf8gHOA9zea3g656iclRuhqQ3iKDWFgiD9ypLrKiA==", + "license": "GPL-3.0", + "dependencies": { + "@iden3/binfileutils": "0.0.12", + "bfj": "^7.0.2", + "blake2b-wasm": "^2.4.0", + "circom_runtime": "0.1.28", + "ejs": "^3.1.6", + "fastfile": "0.0.20", + "ffjavascript": "0.3.1", + "js-sha3": "^0.8.0", + "logplease": "^1.2.15", + "r1csfile": "0.0.48" + }, + "bin": { + "snarkjs": "build/cli.cjs" + } + }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -9898,6 +10251,15 @@ "node": ">=8" } }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "license": "MIT", + "dependencies": { + "escodegen": "^1.8.1" + } + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -10480,6 +10842,12 @@ "tree-kill": "cli.js" } }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "license": "MIT" + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -10803,6 +11171,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "license": "MIT" + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -10960,6 +11334,21 @@ "makeerror": "1.0.12" } }, + "node_modules/wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==", + "license": "GPL-3.0" + }, + "node_modules/wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "license": "GPL-3.0", + "dependencies": { + "wasmbuilder": "0.0.16" + } + }, "node_modules/watchpack": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", @@ -10984,6 +11373,12 @@ "defaults": "^1.0.3" } }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "license": "Apache-2.0" + }, "node_modules/webpack": { "version": "5.102.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", @@ -11205,7 +11600,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" diff --git a/backend/api/package.json b/backend/api/package.json index 058a019..d7796d9 100644 --- a/backend/api/package.json +++ b/backend/api/package.json @@ -34,7 +34,8 @@ "class-validator": "^0.14.2", "cookie-parser": "^1.4.7", "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.1" + "rxjs": "^7.8.1", + "snarkjs": "^0.7.5" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", @@ -47,6 +48,7 @@ "@types/express": "^5.0.0", "@types/jest": "^30.0.0", "@types/node": "^22.10.7", + "@types/snarkjs": "^0.7.9", "@types/supertest": "^6.0.2", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", diff --git a/backend/api/public/circuit.wasm b/backend/api/public/circuit.wasm new file mode 100644 index 0000000000000000000000000000000000000000..34f1b930d502a2a07568ffa8acf9aa548b98b9db GIT binary patch literal 36362 zcmeHw36LDud0t<0_8h&l2WC(746y=062$IeaR??s^nw5h5f=g8q67?fXMtJFwKKE8 zu8IU!hA2vjTq>2Nm=((*6qSok73q`{S)uGo3|ke4DMtyDQl(HnDo{DG>{w1%71^d` zm67j%eN6Xszu5)Eg32x|Fx~IH|GoeH|M&mz^}D7=C^RdgAPC}o?-}XJ72%A?KH?RM z;VNHoZUQ2gL6xpt7S1S0r|{*=;$@cg@)2 z@@%o*D%Gk_6smLOVnayUq@H@CRBat>G-{2b#b&c`t|+KBEpw?+Y87Xe=I4t6#OC?h zrBmk%jpE$N=Z+RDwZ@8|%C)K>N}?>wiV_lpa3mTE;g0`;APHh98pSOnMMP1Q1W5{o zWEmOEKOq!~#p0omXeY3eA)zOMzm%3rrc;?772#wunb49c_NRozI;soFBEu|Nc)H+oI?;fEgtHoA zhf2lr+_9y~kz#enlrWn@(sQL&6=q>2iitKGFqk71ExIsInJohzfKh}}EG7yDEK;d0 z#y|IaV)cGO7jFcVxkOfjBKtL%@Iy!*Ak=&Jp@XjGSV zVW$MaaCtc=>yj?-LlkKWr717#@{ImDhoTS#dg0PRfysAD38ExAC<&qfEnGS%@Q
K7!BR^&D_FY`l?5{SE$5mmU2!8myW?1 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 Jg?iK#{{QH00xtjn literal 0 HcmV?d00001 diff --git a/backend/api/public/circuit_final.zkey b/backend/api/public/circuit_final.zkey new file mode 100644 index 0000000000000000000000000000000000000000..336882eb9b22c2bf77f9315ec4cb94854a9bf94d GIT binary patch literal 13985 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 z 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 literal 0 HcmV?d00001 diff --git a/backend/api/public/verification_key.json b/backend/api/public/verification_key.json new file mode 100644 index 0000000..07129ef --- /dev/null +++ b/backend/api/public/verification_key.json @@ -0,0 +1,94 @@ +{ + "protocol": "groth16", + "curve": "bn128", + "nPublic": 1, + "vk_alpha_1": [ + "11609403479684986297821122136849182347265518467393520634953937610837090068383", + "11959768802511739796563919829025799870232092927870306020291937903009101607475", + "1" + ], + "vk_beta_2": [ + [ + "17090447578251154026419914064962345430149475462868419947252543025241675949669", + "18408658598915443378893649005165159256030068053931139108248932571187351044007" + ], + [ + "16804579781075932042665188602119064412992466510271777940650515542732921127209", + "12006028720789082923772127014834627423622554848010187804952527513777181756481" + ], + [ + "1", + "0" + ] + ], + "vk_gamma_2": [ + [ + "10857046999023057135944570762232829481370756359578518086990519993285655852781", + "11559732032986387107991004021392285783925812861821192530917403151452391805634" + ], + [ + "8495653923123431417604973247489272438418190587263600148770280649306958101930", + "4082367875863433681332203403145435568316851327593401208105741076214120093531" + ], + [ + "1", + "0" + ] + ], + "vk_delta_2": [ + [ + "6120279401033139370483683327867251247572060847005718883273130129853439621983", + "6100370255035545895963173067251529799151147159376445285149549190894259201797" + ], + [ + "8767215359143892483874904293490476249857116073700714284874259624640825781178", + "4300826400335387497097541710613144607911603707510243763088143787486331739494" + ], + [ + "1", + "0" + ] + ], + "vk_alphabeta_12": [ + [ + [ + "11224510553877939197800171898557239258618313757896837317784367800152977536527", + "15565264600370980339332904200171276945948558815133766559013795755249622496056" + ], + [ + "14306105339653967560873615068778524236619030250278352520165433180242752102282", + "21839424446014350201276065288190000557486942266379740403623850213854228071376" + ], + [ + "11482197939142602292126981919519384334085545684951886813584391845162756633812", + "13654392979654317203844533967321770821445657279517593970164052327590949776004" + ] + ], + [ + [ + "12283761035595192239180202231090137752321975527424117355914409647734230721565", + "19854972761628667322521756529742516074953948441917813735700660567587615781723" + ], + [ + "18547903272877029171387798770308070458120867065288530646593413026527655982536", + "7952156481923488345239314340829334705808654100250940513935661764636213931701" + ], + [ + "10958095832273004121994391345975203028186437742386722540411042454730754283013", + "16022019810399516409723346327109113983111598135692166537003172966561061275314" + ] + ] + ], + "IC": [ + [ + "4909160938121226941691008018895052038813461360700444321644509887286638405150", + "15325237508615711865302454567288962780214968756852405719827027273722867041557", + "1" + ], + [ + "6789022921661388591319085906297368755634787611564597507826207323927052815061", + "17377994450165778938977298684635364640296014817348062491084076244590863064784", + "1" + ] + ] +} \ No newline at end of file diff --git a/backend/api/src/modules/proof/proof.service.ts b/backend/api/src/modules/proof/proof.service.ts index 8aa0e3c..cdde8c0 100644 --- a/backend/api/src/modules/proof/proof.service.ts +++ b/backend/api/src/modules/proof/proof.service.ts @@ -1,6 +1,12 @@ -import { Injectable } from '@nestjs/common'; +import { + Injectable, + InternalServerErrorException, + NotFoundException, +} from '@nestjs/common'; import { PrismaService } from '../prisma/prisma.service'; import { RekammedisService } from '../rekammedis/rekammedis.service'; +import { groth16, wtns } from 'snarkjs'; +import path from 'path'; @Injectable() export class ProofService { @@ -9,5 +15,49 @@ export class ProofService { private rekamMedisService: RekammedisService, ) {} - async getProof(id_visit: any) {} + buildDir = path.join(__dirname, '../../../', 'dist'); + publicDir = path.join(__dirname, '../../../../', '/api/public'); + wasmPath = path.join(this.publicDir, 'circuit.wasm'); + zkeyPath = path.join(this.publicDir, 'circuit_final.zkey'); + vkeyPath = path.join(this.publicDir, 'verification_key.json'); + witnessPath = path.join(this.buildDir, 'witness.wtns'); + + async calculateWitness(age: number) { + const inputs = { + age: age, + threshold: 18, + }; + await wtns.calculate(inputs, this.wasmPath, this.witnessPath); + } + + async generateProof() { + const { proof, publicSignals } = await groth16.prove( + this.zkeyPath, + this.witnessPath, + ); + return { proof, publicSignals }; + } + + async getProof(id_visit: any) { + const age = await this.rekamMedisService.getAgeByIdVisit(id_visit); + if (!age) { + throw new NotFoundException('ID Visit tidak ditemukan'); + } + + try { + await this.calculateWitness(age); + } catch (error) { + console.log('Error during witness calculation:', error); + throw new InternalServerErrorException( + "Can't generate proof from input based on constraint. Please check the input data and try again.", + ); + } + + const { proof, publicSignals } = await this.generateProof(); + + return { + proof: proof, + publicSignals: publicSignals, + }; + } } diff --git a/backend/api/src/modules/rekammedis/rekammedis.service.ts b/backend/api/src/modules/rekammedis/rekammedis.service.ts index da88dad..a95275d 100644 --- a/backend/api/src/modules/rekammedis/rekammedis.service.ts +++ b/backend/api/src/modules/rekammedis/rekammedis.service.ts @@ -395,14 +395,21 @@ export class RekammedisService { } async getAgeByIdVisit(id_visit: string) { - const age = await this.prisma.rekam_medis.findUnique({ - select: { - umur: true, - }, - where: { - id_visit: id_visit, - }, - }); + let age: number | null = null; + try { + const result = await this.prisma.rekam_medis.findUnique({ + select: { + umur: true, + }, + where: { + id_visit: id_visit, + }, + }); + age = result?.umur ?? null; + } catch (error) { + console.error('Error getting age by id_visit:', error); + throw error; + } return age; }