From d32299bf5d5632ae9832d206e316be7a9ea8f720 Mon Sep 17 00:00:00 2001 From: mhchia Date: Thu, 11 Apr 2024 00:19:32 +0800 Subject: [PATCH] feat: align latest zkstats lib and print srs path - add generate_data_commitment.ipynb for data providers to commit to data - change template.ipynb - support commitment and selected columns - print srs path. need to copy the srs from the path under `assets/out` to make verifyProof work - modify page.tsx to work with generated data --- package-lock.json | 14 +- package.json | 2 +- public/assets/data.json | 4 + public/assets/generate_data_commitment.ipynb | 109 +++++++++ public/assets/template.ipynb | 219 +++++++++++++------ src/app/ezkl.ts | 32 ++- src/app/page.tsx | 35 ++- 7 files changed, 316 insertions(+), 99 deletions(-) create mode 100644 public/assets/data.json create mode 100644 public/assets/generate_data_commitment.ipynb diff --git a/package-lock.json b/package-lock.json index 483e44b..a2d47ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "demo-next", "version": "0.1.0", "dependencies": { - "@ezkljs/engine": "7.0.0", + "@ezkljs/engine": "9.1.0", "next": "14.0.4", "react": "^18", "react-dom": "^18" @@ -115,9 +115,9 @@ } }, "node_modules/@ezkljs/engine": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@ezkljs/engine/-/engine-7.0.0.tgz", - "integrity": "sha512-mn1TFsNCwkpJTfTEX/YjLMCMRBvhwtnN7CGha+zLBqvM4mDelw0HmZHXsUlypnISdxBF5V8WIdb75z0WC/s+1w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ezkljs/engine/-/engine-9.1.0.tgz", + "integrity": "sha512-Uh2SzH8ky+9x1254qMJLUULNJ1Zp/idFKbOmJCH+RZqqryKRaMwISOm2JrGpobk0F6jyArRfECZBuiJBQs2TQw==", "dependencies": { "@types/json-bigint": "^1.0.1", "json-bigint": "^1.0.0" @@ -4474,9 +4474,9 @@ "dev": true }, "@ezkljs/engine": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@ezkljs/engine/-/engine-7.0.0.tgz", - "integrity": "sha512-mn1TFsNCwkpJTfTEX/YjLMCMRBvhwtnN7CGha+zLBqvM4mDelw0HmZHXsUlypnISdxBF5V8WIdb75z0WC/s+1w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ezkljs/engine/-/engine-9.1.0.tgz", + "integrity": "sha512-Uh2SzH8ky+9x1254qMJLUULNJ1Zp/idFKbOmJCH+RZqqryKRaMwISOm2JrGpobk0F6jyArRfECZBuiJBQs2TQw==", "requires": { "@types/json-bigint": "^1.0.1", "json-bigint": "^1.0.0" diff --git a/package.json b/package.json index e4a730a..50cff89 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "lint": "next lint" }, "dependencies": { - "@ezkljs/engine": "7.0.0", + "@ezkljs/engine": "9.1.0", "next": "14.0.4", "react": "^18", "react-dom": "^18" diff --git a/public/assets/data.json b/public/assets/data.json new file mode 100644 index 0000000..ac41a72 --- /dev/null +++ b/public/assets/data.json @@ -0,0 +1,4 @@ +{ + "x": [46.2, 40.4, 44.8, 48.1, 51.2, 91.9, 38.2], + "y": [3.5, 3.0, 3.3, 3.6, 3.8, 8.3, 3.1] +} diff --git a/public/assets/generate_data_commitment.ipynb b/public/assets/generate_data_commitment.ipynb new file mode 100644 index 0000000..3b8462c --- /dev/null +++ b/public/assets/generate_data_commitment.ipynb @@ -0,0 +1,109 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: zkstats==0.1.5 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (0.1.5)\n", + "Requirement already satisfied: click<9.0.0,>=8.1.7 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (8.1.7)\n", + "Requirement already satisfied: ezkl==9.1.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (9.1.0)\n", + "Requirement already satisfied: matplotlib<4.0.0,>=3.8.2 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (3.8.3)\n", + "Requirement already satisfied: numpy<2.0.0,>=1.26.2 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (1.26.4)\n", + "Requirement already satisfied: onnx<2.0.0,>=1.15.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (1.15.0)\n", + "Requirement already satisfied: requests<3.0.0,>=2.31.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (2.31.0)\n", + "Requirement already satisfied: scipy<2.0.0,>=1.11.4 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (1.12.0)\n", + "Requirement already satisfied: statistics<2.0.0,>=1.0.3 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (1.0.3.5)\n", + "Requirement already satisfied: torch<3.0.0,>=2.1.1 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (2.2.2)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (4.49.0)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (23.2)\n", + "Requirement already satisfied: pillow>=8 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (10.2.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (2.9.0.post0)\n", + "Requirement already satisfied: protobuf>=3.20.2 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from onnx<2.0.0,>=1.15.0->zkstats==0.1.5) (4.25.3)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from requests<3.0.0,>=2.31.0->zkstats==0.1.5) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from requests<3.0.0,>=2.31.0->zkstats==0.1.5) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from requests<3.0.0,>=2.31.0->zkstats==0.1.5) (2.2.1)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from requests<3.0.0,>=2.31.0->zkstats==0.1.5) (2024.2.2)\n", + "Requirement already satisfied: docutils>=0.3 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from statistics<2.0.0,>=1.0.3->zkstats==0.1.5) (0.20.1)\n", + "Requirement already satisfied: filelock in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch<3.0.0,>=2.1.1->zkstats==0.1.5) (3.13.1)\n", + "Requirement already satisfied: typing-extensions>=4.8.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch<3.0.0,>=2.1.1->zkstats==0.1.5) (4.10.0)\n", + "Requirement already satisfied: sympy in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch<3.0.0,>=2.1.1->zkstats==0.1.5) (1.12)\n", + "Requirement already satisfied: networkx in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch<3.0.0,>=2.1.1->zkstats==0.1.5) (3.2.1)\n", + "Requirement already satisfied: jinja2 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch<3.0.0,>=2.1.1->zkstats==0.1.5) (3.1.3)\n", + "Requirement already satisfied: fsspec in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch<3.0.0,>=2.1.1->zkstats==0.1.5) (2024.2.0)\n", + "Requirement already satisfied: six>=1.5 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from python-dateutil>=2.7->matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (1.16.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from jinja2->torch<3.0.0,>=2.1.1->zkstats==0.1.5) (2.1.5)\n", + "Requirement already satisfied: mpmath>=0.19 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from sympy->torch<3.0.0,>=2.1.1->zkstats==0.1.5) (1.3.0)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.0\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install zkstats==0.1.5" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "cwd = os.getcwd()\n", + "\n", + "# FIXME: fill this in with the path to your data\n", + "data_path = f\"{cwd}/data.json\"\n", + "# Paths to the output files\n", + "output_dir = f\"{cwd}/out\"\n", + "os.makedirs(output_dir, exist_ok=True)\n", + "\n", + "data_commitment_path = f\"{output_dir}/data_commitment.json\"\n", + "# [0, 20) should be enough for most cases\n", + "possible_scales = list(range(20))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from zkstats.core import generate_data_commitment\n", + "\n", + "generate_data_commitment(data_path, possible_scales, data_commitment_path)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/public/assets/template.ipynb b/public/assets/template.ipynb index d73cbef..536e487 100644 --- a/public/assets/template.ipynb +++ b/public/assets/template.ipynb @@ -2,15 +2,69 @@ "cells": [ { "cell_type": "code", - "execution_count": 39, + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: torch in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (2.2.2)\n", + "Requirement already satisfied: zkstats==0.1.5 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (0.1.5)\n", + "Requirement already satisfied: click<9.0.0,>=8.1.7 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (8.1.7)\n", + "Requirement already satisfied: ezkl==9.1.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (9.1.0)\n", + "Requirement already satisfied: matplotlib<4.0.0,>=3.8.2 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (3.8.3)\n", + "Requirement already satisfied: numpy<2.0.0,>=1.26.2 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (1.26.4)\n", + "Requirement already satisfied: onnx<2.0.0,>=1.15.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (1.15.0)\n", + "Requirement already satisfied: requests<3.0.0,>=2.31.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (2.31.0)\n", + "Requirement already satisfied: scipy<2.0.0,>=1.11.4 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (1.12.0)\n", + "Requirement already satisfied: statistics<2.0.0,>=1.0.3 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from zkstats==0.1.5) (1.0.3.5)\n", + "Requirement already satisfied: filelock in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch) (3.13.1)\n", + "Requirement already satisfied: typing-extensions>=4.8.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch) (4.10.0)\n", + "Requirement already satisfied: sympy in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch) (1.12)\n", + "Requirement already satisfied: networkx in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch) (3.2.1)\n", + "Requirement already satisfied: jinja2 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch) (3.1.3)\n", + "Requirement already satisfied: fsspec in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from torch) (2024.2.0)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (4.49.0)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (23.2)\n", + "Requirement already satisfied: pillow>=8 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (10.2.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (2.9.0.post0)\n", + "Requirement already satisfied: protobuf>=3.20.2 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from onnx<2.0.0,>=1.15.0->zkstats==0.1.5) (4.25.3)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from requests<3.0.0,>=2.31.0->zkstats==0.1.5) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from requests<3.0.0,>=2.31.0->zkstats==0.1.5) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from requests<3.0.0,>=2.31.0->zkstats==0.1.5) (2.2.1)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from requests<3.0.0,>=2.31.0->zkstats==0.1.5) (2024.2.2)\n", + "Requirement already satisfied: docutils>=0.3 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from statistics<2.0.0,>=1.0.3->zkstats==0.1.5) (0.20.1)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from jinja2->torch) (2.1.5)\n", + "Requirement already satisfied: mpmath>=0.19 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from sympy->torch) (1.3.0)\n", + "Requirement already satisfied: six>=1.5 in /Users/mhchia/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages (from python-dateutil>=2.7->matplotlib<4.0.0,>=3.8.2->zkstats==0.1.5) (1.16.0)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.0\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install torch zkstats==0.1.5" + ] + }, + { + "cell_type": "code", + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ + "import json\n", "import os\n", "from zkstats.core import (\n", " prover_gen_settings,\n", " prover_gen_proof,\n", - " verifier_setup,\n", + " setup,\n", " verifier_verify,\n", ")\n", "from zkstats.computation import computation_to_model\n", @@ -31,7 +85,25 @@ "proof_path = f\"{output_dir}/model.pf\"\n", "settings_path = f\"{output_dir}/settings.json\"\n", "witness_path = f\"{output_dir}/witness.json\"\n", - "comb_data_path = f\"{output_dir}/comb_data.json\"" + "comb_data_path = f\"{output_dir}/comb_data.json\"\n", + "data_commitment_path = f\"{output_dir}/data_commitment.json\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Columns selected by the user" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# FIXME: this should be provided by users\n", + "selected_columns = [\"x\", \"y\"]" ] }, { @@ -56,20 +128,18 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# This is just a dummy computation. Replace it with user's computation\n", - "#\n", - "# import torch\n", - "# from zkstats.computation import State\n", - "#\n", - "# def computation(state: State, x: list[torch.Tensor]):\n", - "# x_0 = x[0]\n", - "# out_0 = state.median(x_0)\n", - "# out_1 = state.median(x_0)\n", - "# return state.mean(torch.tensor([out_0, out_1]).reshape(1,-1,1))" + "import torch\n", + "from zkstats.computation import State\n", + "\n", + "def computation(state: State, x: list[torch.Tensor]):\n", + " out_0 = state.median(x[0])\n", + " out_1 = state.median(x[1])\n", + " return state.mean(torch.tensor([out_0, out_1]).reshape(1,-1,1))" ] }, { @@ -81,16 +151,16 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/var/folders/t3/5psrvr1x0w1_6n9kx2n7d9700000gn/T/ipykernel_97835/3906390486.py:5: TracerWarning: torch.tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect.\n", + "/var/folders/t3/5psrvr1x0w1_6n9kx2n7d9700000gn/T/ipykernel_22219/2234676788.py:8: TracerWarning: torch.tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect.\n", " return state.mean(torch.tensor([out_0, out_1]).reshape(1,-1,1))\n", - "/var/folders/t3/5psrvr1x0w1_6n9kx2n7d9700000gn/T/ipykernel_97835/3906390486.py:5: TracerWarning: Converting a tensor to a Python float might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n", + "/var/folders/t3/5psrvr1x0w1_6n9kx2n7d9700000gn/T/ipykernel_22219/2234676788.py:8: TracerWarning: Converting a tensor to a Python float might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n", " return state.mean(torch.tensor([out_0, out_1]).reshape(1,-1,1))\n" ] }, @@ -105,8 +175,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "spawning module 0\n", - "spawning module 2\n" + "\n", + "\n", + " <------------- Numerical Fidelity Report (input_scale: 11, param_scale: 11, scale_input_multiplier: 10) ------------->\n", + "\n", + "+----------------+----------------+-----------+----------------+----------------+------------------+---------------+---------------+--------------------+--------------------+------------------------+\n", + "| mean_error | median_error | max_error | min_error | mean_abs_error | median_abs_error | max_abs_error | min_abs_error | mean_squared_error | mean_percent_error | mean_abs_percent_error |\n", + "+----------------+----------------+-----------+----------------+----------------+------------------+---------------+---------------+--------------------+--------------------+------------------------+\n", + "| -0.00004863739 | -0.00009727478 | 0 | -0.00009727478 | 0.00004863739 | 0.00009727478 | 0.00009727478 | 0 | 0.0000000047311914 | -0.000001957239 | 0.000001957239 |\n", + "+----------------+----------------+-----------+----------------+----------------+------------------+---------------+---------------+--------------------+--------------------+------------------------+\n", + "\n", + "\n" ] }, { @@ -114,30 +193,15 @@ "output_type": "stream", "text": [ "scale: default\n", - "setting: {\"run_args\":{\"tolerance\":{\"val\":0.0,\"scale\":1.0},\"input_scale\":8,\"param_scale\":8,\"scale_rebase_multiplier\":10,\"lookup_range\":[-25112,24986],\"logrows\":16,\"num_inner_cols\":2,\"variables\":[[\"batch_size\",1]],\"input_visibility\":{\"Hashed\":{\"hash_is_public\":true,\"outlets\":[]}},\"output_visibility\":\"Public\",\"param_visibility\":\"Private\"},\"num_rows\":14432,\"total_assignments\":12049,\"total_const_size\":1816,\"model_instance_shapes\":[[1],[1]],\"model_output_scales\":[0,8],\"model_input_scales\":[8],\"module_sizes\":{\"kzg\":[],\"poseidon\":[14432,[1]],\"elgamal\":[0,[0]]},\"required_lookups\":[\"Abs\",{\"GreaterThan\":{\"a\":0.0}},\"KroneckerDelta\"],\"check_mode\":\"UNSAFE\",\"version\":\"7.0.0\",\"num_blinding_factors\":null}\n", - "==== setting up ezkl ====\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "spawning module 0\n", - "spawning module 2\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Time setup: 12.489933013916016 seconds\n" + "setting: {\"run_args\":{\"tolerance\":{\"val\":0.0,\"scale\":1.0},\"input_scale\":11,\"param_scale\":11,\"scale_rebase_multiplier\":10,\"lookup_range\":[-219952,192922],\"logrows\":19,\"num_inner_cols\":2,\"variables\":[[\"batch_size\",1]],\"input_visibility\":{\"Hashed\":{\"hash_is_public\":true,\"outlets\":[]}},\"output_visibility\":\"Public\",\"param_visibility\":\"Private\",\"div_rebasing\":false,\"rebase_frac_zero_constants\":false,\"check_mode\":\"UNSAFE\"},\"num_rows\":2624,\"total_assignments\":735,\"total_const_size\":152,\"model_instance_shapes\":[[1],[1]],\"model_output_scales\":[0,11],\"model_input_scales\":[11,11],\"module_sizes\":{\"kzg\":[],\"poseidon\":[2624,[2]]},\"required_lookups\":[{\"Floor\":{\"scale\":2.0}},\"ReLU\",{\"GreaterThan\":{\"a\":0.0}}],\"required_range_checks\":[],\"check_mode\":\"UNSAFE\",\"version\":\"9.1.0\",\"num_blinding_factors\":null,\"timestamp\":1712764579432}\n" ] } ], "source": [ "_, model = computation_to_model(computation)\n", "prover_gen_settings(\n", - " [data_path],\n", + " data_path,\n", + " selected_columns,\n", " comb_data_path,\n", " model,\n", " model_onnx_path,\n", @@ -145,7 +209,30 @@ " \"resources\",\n", " settings_path,\n", ")\n", - "verifier_setup(model_onnx_path, compiled_model_path, settings_path, vk_path, pk_path)" + "\n", + "# Determine which srs to use with the logrows in the settings.json\n", + "with open(settings_path, \"r\") as f:\n", + " settings = json.load(f)\n", + "logrows = int(settings[\"run_args\"][\"logrows\"])\n", + "srs_path = f'~/.ezkl/srs/kzg{logrows}.srs'" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==== setting up ezkl ====\n", + "Time setup: 89.43912076950073 seconds\n" + ] + } + ], + "source": [ + "setup(model_onnx_path, compiled_model_path, settings_path, vk_path, pk_path)" ] }, { @@ -157,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -166,24 +253,10 @@ "text": [ "==== Generating Witness ====\n", "witness boolean: 1.0\n", - "witness result 1 : 49.55078125\n", - "==== Generating Proof ====\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "spawning module 0\n", - "spawning module 2\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "proof: {'instances': [[[3042937791208075219, 8157070662846698822, 3804781648660056856, 172406108020799675], [12436184717236109307, 3962172157175319849, 7381016538464732718, 1011752739694698287], [18341455175509539295, 12796101019039945164, 1607286914885633240, 1929881192315725821]]], 'proof': '01f9485e3484e27de162622863fdcf29cf81993a023d600b20173b37ca6d73392a2d6bee21aa3a00a12be030f57cf2fd67c3ba0182f1a879b53945993c2f20802eed1eeed24763f1d1070619ecbe97b47c3edab1d6f89a066dd6f6c6bfe0d3f60c26e2693859fb2be751d382d352ddb24570cba629a07bc55a58b33171825af1106e65e8bfb15161ac537b5a1463c993e8dbfb38dd3c410c64079587f6fe55c024f578ca70dd7700800e25cf651174e43fa3ddebd4e8036dbb4c8c2616fd2641084ea317141ecfab83be803e12254a766e35d526a9b6e1035d9c71b068ea8b4d125d355246396448552aaad9cd82c40568269f96acb66947c5d5b28c77331c420f816f2529b1b0d88b09c39a301c6665b04bdbeb406ffc42406017699ee7c2c42efc07fec604149bf8c787d91aca634ac1ae94b42655bcb480535ced9610e5311b28db6704f18b573cf2161321f75934a0e5ac7e51b1840543cbd4027471a391036bf7609d4068c2793f2bbb24b830bf8cac4518b53fc3288a598837bb07d60f2055334e7c906014440dd944368d39ee4511f27b8317c95b0decfc1f40d7b1282454499d2e9db5c8d8657bb7094c2eda4d9f2ecc58d59945f613829a826627671efdf9d998b59aa5e73e41c93d313ff2de88dd84d63efa56b6cabfe7225d30cd20aff7ef07e14b82d000ddcbc7f1e4bb0e9e916a8fdf19237d16e1541f93ca550c6116188b63393aa411cf08a8566453a6afdf19cb55f2f106b69589f8c21b2d0d4fe9c7cec2403a6bbae8221602e7a3ee452c9a2a20ae5af3edaa025b9d8b260bd4a25023bdc8ef5a969ca1c34d9be11a35bc1d48476bedaec4f0e798b8310013d0a0f699c8a5c654055b7d4a8fb219159650f52c7074cb8ccde6cb1a9f30cd2990f8b6126138656ef3b88f173e4dbf67d8d25fe2f4f4144e9737a6d27dd28c25249e0474681e7a64b861ea6641c04fb4c025744a17bdc443d8e1ec8c15da8417e8b2b254854fbed70a1c27057309925c74754d269cb136055db07a20fa930d111850770ec674aff132d600bcb4551c49359c06a02ee1312338620891856e4e1cda7159c1123918406f96df8d384fc07f26c0a4dedba490a713a4f8b8c11b9207427114eb97b638a5996484c1944770c3235e4d80b147801e42416a0ae28f30106e2dc75299499c0da0597a0e3f4871bb519061466a8667457b756f60735d8320fd67c09764871cdab5e843eeda1d2575f464be0d1e6ff7cf0186efa63c572810923fc17f250f67ea7d803fbab9e04874f72097b6846c22a3c3f63e8991af6e29fc13f6d413264d51b687e311ca85a42d45c84aa11ae401a823f20ff9c6ec410ecb534affac7032b4e5b46913f6d8154351020526298a2ad02e190d5ba01a2e18f7171e6f69d0564373e1e2b326c37d17478fe5658ca8e121a711f501caf7c7163bea69941180de33b5bfc9a888521caa9413e25e2b04f4ca8d2b3ef7d91647095976a3526e3fea2e0fb1e9921f0f002e6d2c66a27b72fb812963be6d1aa10f2bdd1f9b53adbd383ae5cbe59311d10813962bb9c06f1b3a9483574e90fad7250948a36c107042e29d26cc823f95c8b0c994ac45a6c5ae3f85f6c04e3e14516612da062979be4f3cb1ce506f1dcde1b2292ae8562e9a2cf02c806cafc8d5d3871728c175f1d1b1b37b108d7ab7a085b24661ec2d6de3c2e25dc3d9eb67fe09b422a7a76c39a637cdfcb9d7a8873f51e97b06d24b9dc8c19329c90e94f5bc54ea091a7db822e540f84edacad80bd8e5a3a34f09ed5eabadfa3e2d141c5c9e2f392a73fa961b6e23e7537874039c42b55472bef1115155fc34767d1bd04591b9fa15cc00fb52dda98c656a4ad522aab106bd04fa64161703026fe563489d48d71017c8a37a3158371157000dbdf6cf64fef8fd7727070f1aafcf531a1cc72256801252b4f05d499e2491a9bf0c42aff0f8c8b946187e7d81ef00e734976893910c0aefc8c4c7246a2857809fdce4b7b421c08b6e6cac8a26d0e73a3d57dbdd3a151d404bbe71993ad4497e971770dabc5edc5b6432cb4c4bdf23f8bce4291c85f21a95511e6639feb5f0428d2995092d1c1cd367adca4a7536d7f6f483a9777cca1b5652ea9e10ee913f6f32021437558ffbf23a04c7da46dca79e19430dd271df24d37ca4fe0206e18e27b764a09a6b588e5969227ec7300a76068a11f2a5960b2d14f10a7389de2d7a5ef1de9545726bc59a5405b5030e0966f55e40e5718ba1184bbdb832bc654d720f283ab875457db1bcafd13c75e581e3290d66324e0c80209621cf144340f025d0ce42a3b53843f2e619ca78dba74b785d3ec0a79ac7c015f723f286b9f37a24229eb621e87f30ec4ebba2081f1c9eca18fdcc22dd30182edbad86f8c81aeabb4ab9eee6464d8209c218ebe3b73160d176eb30ac3d34ad0235c6fad2f0507c4fec37bfa35d79539c819927402069b182f161a9392e3d6b134f6b105e4719028eac2d3e8a2ec9fd0bbbf63b03061ccd26667b4ce8aa10761eac4074cf58a67761bafdc29bf36880d54b0d54a13d2a5c6decd18a45d4e01c2aefee15491507bcb34d3eeeed40d3af0ae176e42aefa9a7e4f62733580fe3cb2da9528b7f865acb6dd9025f5305d2022247ebd911c2de81c4794b06bf04069117d11551ccfb4580722549bfafe77c50bf0a3890a5ea14f03ef7d7bbe46c3d620ef50df30ba57a3bfabd5463100e4776f1de35d78a71c6ee862ac52e8b9377a30d942a978c5a7c7891da51bf2713c87bfb171491af21b289b0c8d3c1f21a7ab80ceda6a0b2ed6c6568cbe76bccf8b26135725218106ac4562af6653235dd78cd007a378f1bd3370e5a4175bc612ad77a084b1dbb1a1afba8a4bd3fc38823d5d713d34a8e56c1024c6ef60de73adb8ad4a016e59238bb02fb24f001f8409af0c601bf11044f42f97eeb029e369cfebc55952e66cb4ab1d78d1336f4c3b151f84e1c894e08af0970e37f14f8f970b2e9454e6ea0d1ccd709b4935a8055e9b4764b3028ad81411ff42b0667cdabc00d83bea3d9c6927ed3e55e5db2273477b5da1f0b46c623e7c1866e12cc00e515edef6772d3c01036a1622eb2fb0b755b002a2714ede8d26266849311217becf72a733a80026144eccf3c7b3477fa2fe16f721707e955d55f12c7dc27f17314415eb5e687bf8c5b4ef40faedb54d94adefcea6b1a06a46a425a1305d3ef08482a0053a3cba33360213b517df1ed227f27bcb89f2550acc6af21b77d65053d0c9b52bbb7f8c069b47d1d77e8690c3507e84dee5f07e557a12b095c198226ef13c137fd3310aad82634a2df2660a9e0813b0e1bae0bf5055eb04e128111d8d4a55fdd7bd65596de50948631183f13b60ff06abef51fef50069a0a5da36a2c9783664514c3b8263e80c137ae406e8edf556d6e18d50669f249cf42873c78f482728248c7d89d3609814af56b46ed9657857191796003cecfd899b0646147dd4a2f8c0c7c5bb5123fb40706881eb7797453a092e9b126de7cf344da6fa02c7097680be9c1cc45f77ebee26427ea89403745fcf79a2118dba06b97f3b706697f9199a4ba1af68fa8b3cbc5038d25521bdb4b3889cea31cce576ae793d240105d9bb401ff3fbe8254fc3f0d43d21e2e1b5f9fb28090260a574e402286cca58f4891a3ad19923518a9b01f2abeb4bc526559245de10864174bb1fd1f62c28cb4385b0d2d7d7bc6d077cb3bccdb9b65689995271a460663093e54a8e40ecb5f2eb346d8f2649286d08ca4f4c15449621e02c16ec653dc450c6600562be79bd4f0630ab6c89da82808d4bff21dbc288b2e38a23b14aa35a72e9430a9f257dda54f79c64beb282edb02c3832b251459c4ca12548089e010de1a513341f4a49f8db6de79d12dfaa156e287cd714c88719c4fdef403cf2a80801822d1428a913f359e0f2614f04f7d41d9c251de03b24142daa6d389ae70cebf00000000000000000000000000000000000000000000000000000000000000002080e137f83dcd23d9f1a206c893964e11ff0f7cdac128cc3dae4a71a20ff849149d2d3a24bae872fbb8476cb5e60d55c1173a4deec7bb0b702d50e5e03f6a37273b47a811a7643fcda5641e6a061ced383d806a1db649288dfc315fa09698380044ec9b436e250a9b342410a337d01239ff83fb0c5f54fd8a85e7e443bbdec412ce90496a14557d9e91b00ef41f31b9839662b628ba3ef2e5a2431e836604371470b73bddc4b185b83cf60658bc160faa58c66ece5e7b237868cbb634b4bdab125a59743fd2b98d051d3b97f2c73b53b87c84f69244aa6d80684d34ec53ee5e2670f1ac56ae2931cc67b53f0adb763e831c2fbf1cee0f7e3a7c2d35608e612b29b18fe11bea774cb5a873f8015756e7fa28c8f91057ff3df9f7434c8f29e23906e3f8c2b78a28d54df6bc3dff17dc7cbc1702618a986265fdf89302a3978dbb155baa002fc62bb1fa6d6efa48a302a92b68e3e746893634816bd4e0e1d587f30d47279a4e47fba74a3e41b8092831721882fe6c2765225628c109fbaaf908b81abf501b83f72222562d78c7777008d7aa1f55e247d7a44fccc89e8f34951022270fda77667aea5570defe53f26ac9f24f5e3cc60c5f0c925cca339fe32d84e729c798b14f7ef41d29f082c71b59786eebed3ea92d6216278c2d9b58776d53431f5ceb40a19458c1c6e0c80a246fc8cdd954fa99c0eac250545792b7e691d9c20013b8352e6216156299754fbea34c889c99a7a7ad5ea64b963aabf14f4590361410cf1958be63724d4b5607e60249aa06e96c1ad4f684d20ef48b97b70dd9070624d67e1e66932b62e51e6302b97d6cd4208263d8b0028190a5a1103c40fad52f5a2a1479953313381839fe68e19e50f30c9f82f41166f3ac7402fe3b2a85152282ceb3af2e2f9578b85cbcc6e15b82cd0d85b468e8b6794886ef6e6c7fbe1c2ec83b1763532b8cf1f95a7e74e0fa997cfe6e69a4004a088e7b33002fee52fd0534c1ba9255f9715fdc1a12932c8cf8f9dfc1300e64d553137d21cf2a388f5d0f62f41edf3aca2f7619914b3f4c44eef67db71aa22897fd359142201f202fa424ea4bd8100e465e9003884b94e75d9126c7f7022177c6947c759e651d87ae561536a90ffce9c7577215219e4144df1a85f50f076097a96c3f5dffc1a53bda422739e58cf7dd03207bfa7a7edc6782b4924c0d873cd2e471ee1414154d5c3b8a2963e2cb999586b79338bcc69a9ed9b3ef8444f54e05037e042650638b70bbea2be754ed8c55f47b83c15e67feb1ddb7c7e076c4786e5f62219a201f441987c91c76c42e7981728a71cfbb4530bff633855c9172b776371576eaed18a972756408823ea37e7e325b3fe22719999ed6dd42cf4f4c61990ae5bdb66a9aa0833e22185854c50fd456f853a1ebebf00f6027e33ba40b9f4129aabfee0043edb1cde21ae11b7718df6fbe26e70780fc6d0f74e022efea795528c888d787733906358c12d0622618b47c565f924ce3f3e0ebaeab4c287f1cd29575f67710db99cb9df32162b1cfc0b99db356dc200b2cb1667437300b6e2eb58d670acdc3800526c35d09a74bce8602d9531bd9fb6101d48561f2d9bbd6a592cd4a5ec01256adc6fcdb019f4f781af8889260e6bb56b56ed3016783f7442ea334bc3042198d5269628008aba69fd8f9c46ce4688c21be3981dfa1c91f1382066e276a3995eca3c4ea153044a580ef1a738002e90c45a6e8a6908c57ef5a2dde2c95cbe411bab0ce1a0c01111cb6b3aa8fedec159e6f6e3dedcaf83afa3137086c9f795cab0c286f6d4e29a710e02b02ef1730c11202046af989ebbd5e945a211eacbafa2102856ac9340ab527886b834790897fdd47d4060dc48899721177aa3e7e92e5c9a6ad2474e7118db1484878c60fd2ed8775f59e889cea780819be13ace3a6d9e1034b60fbfa048e61c47023605fb6e11085a12df0ffe5480960054efa15d6bb1de71b8bd3cf1ec58ae65b52b9441043933a89311f9319fa4fb6251e82cf6d3c799c7301b241026e97345fd3c95ea63924423c249cea9fd87aabe12a8e5877ed47ff5b240e2b1310b06f6a147c2dd8043377325f9410f3dc1eb733d2a464ae283e8ea06baeb03025c763c0ea92a669f33747fdbdd2ba4fa1f8e51db27417b3a4794d33015c2b288831e539c75a458253a3212888b571e035c88f671c1b17bf7a2ceb088d6c432162e84a821c23828806bfb5e934521363ec93152cefde77e7f62442781abf00213fe3263f4527449cbcd267bfdc249c2fc6ff19039ac4e648a35fa53912677c', 'transcript_type': 'EVM'}\n", - "Time gen prf: 17.092010021209717 seconds\n" + "witness result 1 : 24.85009765625\n", + "==== Generating Proof ====\n", + "proof: {'instances': [['4e29ced39e0837ccc54303617bee3278416698caa1099040db7586054c726819', '376d1c5357b7dca3dd77e4cd0cf36c71138900d41c115776af27ccb92d2f742e', '0100000000000000000000000000000000000000000000000000000000000000', 'cdc6000000000000000000000000000000000000000000000000000000000000']], 'proof': '0x027b20205bcca52008ce7af7dbc9c1e0828a3a1a84f7cc330e78a074176100732202e716004915bb4a17d143678fc821dad3d642d0971074016fbde229f77f20157b2b28784f04fba0f796ebe0e51d6de1c6780077d69509d0821d875cc9bd6322ac237ee28a4c289476a4ca1e1c662fbdd4ec166c82a4ef305d18d4c0ce7f9529e988d0efb45efec5f723bdeb9df37f9cc6249d88d35c1ac335b41f855426a6225026ba19763918961cc971bc334d3d230f7a597edc6ecb97fa9803a12da34e2247cdd4e037b029a338562b5c1f38c87104f1007d8ffd3b69eb840dd124ea0803567a5804195c19927d448b269179300893fc7c0c04c69820e5550d9ee89622049a45a972e6d509314746c8beff7f55c7b16b31076ef48190e70d63b9f66f3826006698a06de570c3ad5d41049d909a95db0515e9d4c41f5b608f0b290ff19d0081afe3078844c58e5418ea0da521ee2ce9f64bd4a29ad6fad04ae441009663298ef6a76bcfac87601c60212d5c287fcc6aace4b0b76ed2625e25a3d73c643611d98b3380ab567fcb701b34abd6b867bbe6863db5e61b6f0884c76b78001f7d10ac1e8842409732b541bdab8fee2288ff2c2a9a3950c7eef934bdc496b0783a03ffbaa4ebbe808b8e73677a094a33706226da76c6d245a7fc24094c6b6ecbd621ce8513e3049fd596aabd434df8f3374a7ab6c9a67ab485f91d821c102eac7d2e9c7e11679b4a55f6683c85db7b49c39bf4a613a37f6838c5472f639385ca831d22f2d86b76382cff4c915900e12c7b88d39d7858d19c4a84e7afa780d536e20acb3311d700e56a0c9d7c3676a8b5b132bf8a8ebec305b0e2d6939cb41b3e1d1aeb7ca8c075cf71b1517d79e51e26b747438509d80cf4bd7bac5f668da4605f0acb3311d700e56a0c9d7c3676a8b5b132bf8a8ebec305b0e2d6939cb41b3e1d1aeb7ca8c075cf71b1517d79e51e26b747438509d80cf4bd7bac5f668da4605f0932d9094ea9fd53bb51f8cb645fef7b61b61d5d218d20b015e35903e89f6705171eb73ea5ad64c03652e0e4540e57f1c93f740ee5b926109182908e786dd4490b41e1744d8cd85d168a21256b23a7c91ab8bc4d31126e16559f2e1dddebd751019dc0f416bb0a845834db997583dbec482fe24fae214f7275e7dcd06ae067461606294b37cb5b04efba1a04885fa1c291dad0c5a839b346662412634329d5190933caab4beddbeb22bf6415d4eccb2f1abba1e7c8e5600d4d394f3bad7ee830197468585d8f46981beedf9cc068c44f5f2f6f75e5f6aeec3cc57c753213838f1a1da563b21fedbde6d7bd3e5fa9ee7abccdbf6e2eb3fcfb451453e4d333832914fbf1ac65923179f4987e9b439be89accd4ad289f94996ee826c4d029360dd41bd41790c5a660fad04ae4567d1f28af19d2d974e442821d9a1c610b1e4948741c0caf21167d6f0bd19cde0056098ae35bac4acf256a5227777ae9ec539e519d249ba19551e6e6297a4a8b2af2257241f65e99cc20ecfb39ca1c909447de8e3e28e1cacba1774214eeb184c1582756de71caae267752bb57bae67bb35cfeeb182f43e03770bd8c96f6c069e6b20805ee6f8dd6031e217aba116aad6e9a396f1f12306490f1e9c84350eb51e608f677497e18da07682db71eb6de75a29ecb97a8003394185d54450df8e12a54264db246bb1945df2d31b3709ddcaf98f5a54e72177102348bed0cd9ad05057c2c164ddaf43066a72bd1d6f1ea6698d692f922762c0b46086214e58c161fc9f8ce17c488354f4880b7e85a23e4e2e89193c7ef4015dc31f856e000ef0a3ff39681656d1ae6fe0c449d1ad8e99e68432f14e050560d9ba7b4940cff4208f36bb6459aa35725919b48d5c57f0593bedbb7a53237cf16d799412b9d3bb1baf7194698faaaea851ad212c6503d9e6f33dbd3576a3033202162ed785e3439d6a9fc9ff4e15f1bf8b7abdce153effb52e38ac40794d5cf054a6750505b33a8635f87085deeee89ab3d2dad8a1c355a322fa9c3fe0edc650d71eba177dfb05fdf2385746fa77b57ec4dd6d5711c2d569493b5a73c1c5c00116492ae62f3fa57923e883e6728110ef206288c9a9934aa7a8ebc3fbe782bfe101ac33296bb227ac7f3082f526a10de101dc80846dc42fcd3a01dc5ea421716203262efc1ae61bbcfc96974243198f100b2df5c7a061c3c83a42f14f2719a823014a15b6b8d4acf1ad7cc1d1ec259820bbcad0cb2467c0dc2080e81561bcc900bdba41276d4f63625772a45b779ca94d48fe99e5c0a837c6a43e02dd32ed3ae0750151ee632d01bc6a6a1f0f1725b8b44baf16910d9f690f39520259a27ae031e2f64b3cafa957bf17748422d5f21ea7c6efbe029539c36aa6b58cbb84b0b9519c037cf5850f141dc8ef877ce912db3fdecf56549d0ad35cc8d9226c4cc54700953aad4268154d99f274061ac1c29a823d903cf7defc473b07ecfbda50fb04814e56a31966b89b210cbabef171315d23035c0c279a6f0d52bbbe1bb2ff3033d1d6c2d18ba63160808f436d5b0f5afe1898292d51b6af14a43e2d82d38ea542f1e06b47d7f7947502821152b0bd92ee36129a8ed5210053083e4bc01f0eedb211f7cb96ecf306308ed8c1aefa5bbf677099be4516194b59b5f26542dc774e7c90e63c8eae4fcaabd2fe5203456d82c538381173747fd5791b80341139a4191f92bb805c794aa1bfd5da17951b1168121fd57734a2cbda10685831752d53d7e5326340c95ad3b5dcd8155505f924ee1759245aaf8f274e9348e87f4a1bc4be5250d433a9885b7a1a919ceda4cdda05bdccd5a3c5fb6a8fe553ad8ef741277c7060ae491542cd0db1058bec100d873a915c821bc3593806cce4d58c5e5d1ab64a8150611e23af3734f14838f1f6620c68e3620439e4de65bf825b078cb094f76db2f7d8066c6e597b89a6b41865f7d7890c61278f4fda174f7d91cf97ada1f168b2c2dec553492fc725668a494df18fc94feac05a6280f0d7750945a92178e4a6c0adc69e1e7fbfe899e3daa3c8d3ff1903e615fb89967fe4e760acbe4e4a7bb2510bb4ba4b15b382dc2a3b41d3eb0508dd1821c3926c0ad67c48d371423a747dd2f80ae9ac691201ef41a30eed940a716a9ec5c51927c32f5591c9c31336493772bd302e9cad22a7f00d2695a06b1893719dfbaede4fc3a842725bf0e624e2c2e1a2393533e8902a2d4f0658720aabdce09eaf54a1d30718b4bbb01f25f8443e12a63bf7e0158146e51473bc5d6ae3780ed829ffa070776422f94b84cbe0b1dd62627cdde5888001671099147c59e68893d493808f8a8db5be6135f45fc3140b41cbdc1cfa4006d6e357b2ae9786769f618f6dce06fdec358a85bb6ce59d80a632d4ecf338e4db38cf6ab0367e2d268746acf351262aee57499d9e4d841f96d0e10787c0b31b6b505a9e641f3bc2abe1bc4e95b0d3ab67ad162dea1a9bfecb1901665a23aa17ea9958ca3fd1f6670e0df04c217d58ce4125a82b840bd0ad118e31e98cf9a07c872c4c46370f69a430460d84823cdaf52a60186c2e4b94a2e05250bb4103a09129d4d9d2c8580553b5f9d28e6dbbdf8e3ff601ce04ce61fe9c39915636383a26b2596030ef6f990bf098b3bf3d378ea9361e33330213a7538a4f8267820f1b2afeaf0937a8af39be518e184cbce201e000fb4f2eab6ed6fd5eb72217e69a9fd748ea359fd243183a423e29972c35e7047e343f7692b034fd5f3c300e895457e36d3811886621c04ca9556943ad3eb6ba3ccf73f37efcb48d11b5805c77562e0f0f3c5ba6bf02f6f6c57b1b8bf9316b0afe41268531ba1a13c30020856e4560b43ef77c8d714dc9da31422e5c425896c76b467ef77d73304b7fbb31b6a3ddea9d96de50553d4aef6d4a328649a9e6874996dc5f59c57e9c00ab16d0285e78e4377d89c569e54f2184bb70c5bf97727aa1176db86998c4f6a4fd753000000000000000000000000000000000000000000000000000000000000000028b631501d61324753b83ff408e9c7214cbbb2f74e2667ba307c38cbb7c3e5651815a819eef041f5c4f200d273629a2330b5c05efbe03a5de5db7333f8582c7900000000000000000000000000000000000000000000000000000000000000000e78f94fc8fa8469e112f0910aea479713ec67a10be4f5b96fcfc9c5367e6ed91907555615c4c283c7f844d62b39a502d0743801a6efbb26db52226cabe5267226c581c19c5f247a53be1433f92214ab51604df9ba53a39915bd65e76bebe4f70000000000000000000000000000000000000000000000000000000000000000264f9787caefca476f19458eecd1866a3d9ce23cfd8acb9bee6fa4e2c9256d05069f8dad657f296540d3ba34c72e6a8ec8f5501b1bbe196903274a673ae39a2d000000000000000000000000000000000000000000000000000000000000000011e5b95bc0a10106489892b3a426d294909d3217ecc468dfee22632ae1460eda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000372d0281b9e8c0c7fa5a7560f7e760c15436b55e7119b3f17a57656984d6b3522754e4d774a732516726ccc3e528080bdfa4bceef1ea200c8e2ef7fddb23745215db6d338c7d4be0353780ea738f235e97406a55faa007543d5f562f7ecf1322b18a847428152c284f9dff57c93b2f2694a351df297fd3557c440b861979b420e7f9a9a33b964330a3bd9dabc8f16d0743e8e4ef5d4b490aa2a1261348c22ef05b5089776b6fcae5a3aaef53b850abf806ae702ecfd2f8221fbca2bf7c8d9501621a0519b4218558c1ea18ab64595532bdda4406a8d408f844349f7c5364a7e08ac3f94f1c4efb9da15586924985534651aa2a95ecc0462b79a1cb6d5706ee22bd0e036788541012a24ecb75425a968dcf4066ea560d8ab6100c2176eb939292f7464fccea486cfb06bc2e6c0b5f6b944b7088fcfdc290b0a43a45864c9f06129450d8c86b7cb8bc8bbf545d13398a15bd3de5846c148e8975826036155f96812fa06483477c73635e5acf50ba4446de2f68ccae4907c1ed675d07f4ff75c5d20a734dbefe05d689f7374dcbe0a2fd45b586b239a4a3ff1e3d59d4c57849bcb20b9b8628d264a97fd8ef06d31f9a473f9e1514695a006ebb058f1c032e703920f428055a7e4b55268043b78156036d5e12692712e3f28ab26906e57917761c01bf7a5e7ad7873a9bc667f3f056a8d769a791ac61bab3824a452deeb26e6d7a12e21d65bc0da68ddbd9b86fa05ffa797ab6fed031ee6bbab596a3f08a7f414c6039df3aaf143491d7e3664cb20ae4d104c3ddf63fc22963216c0652d3cfb6d3e129d3bc42d7eed22d05e7ce3542b27a0b4c0a0ccdfa457fba2f371f9dcbd26430ac864b327a630400d55ae91536fb7d04d21a8790f1c2a9f02aacd9820d6272f19045de066f8d6cfeee226b9e2d1e3fa6b6af0a65da022b0786904f089f5a03106bd2a318f9d0479832e66b27fbcd7057179d3e22f585b63e5ed123bbdc03bbe12d1f9129d5c656b4dba9f14d803d6638f78737acb4d95ddbfc65e5675f082d7188b9c88bfba09bc1f765d1b475a31e47cf6accdd5ba701c90ec078aaa00f296222f794cc1a062f7782ad5636c87e878ce205b8e06422c7693670b127cdf030411d7d42bacfd291cf719759dc7334791afbb8ab291357052840e5d0eeebac11f0751dd6fdaa39ee2f95ad58c6832ee0955f9347707e671291adff585d811cfb70ae58e2924c1f6bcb1468302bcfbd9e6fed363b138d5d62453763397b88fdde3245e347ddf1fcdd03a81acaaba7573096d488d3249c1302cb2b17384b0e1ee952403b7f370074cc17e9ae6c23e88fe66c13fe14d77cf1376b195ed70255f7d251f8400985728d1819b071945d9a9e15aae6fda0cb3225a7deec2344edcfc035d0ca3f345e22916401740f5775cd4c9b0db2a314a0776da6712692f1d3abd5cd12cf8e750386dbb59d149973acc81135d2af07711db5b76a8e1a1085e8484339629e55f172a4ca32650af8d3df480fa5d490be9fc6f62f0fb4253342c7e71d2650ca3f345e22916401740f5775cd4c9b0db2a314a0776da6712692f1d3abd5cd11408609c840d8286eb65a2f3dfe5599ef6c52c6303222aa8e72696dd79c63b4624e66f3ffa30aa6b83c3ae44c822a4a8ee2f2798b6b0b7d1575d6eec111cafba2de7b1e232ab8fbe22abcc9fc1dc03e445c25ed08ffbecca6c3a086222905c03077c9304dc64033c137b72ce39643a5a2dcc1e52e685bcf220891ab8ac297bb513678cbfeab35f04dea11d4df3e9c353f3a4fc08bfebc71c05079770b5ffde4603ea8e23200aa3660eb704d653e3d426fd3e8786c8850fc7fe3b38f113a5895f28de3583ce80e82a1bb1f64e1be28e412f7c6767d4590c0556be287228943c5f0c6af448bb3a704571397efeb1533de33ccbf5f9ca0566731e9d3067f1d9a38e1cbaeb735a60515ecaceb5684917a8e1994dd990dce59d41f291dcf24d52015b0bce1e9f5a41b6c8366a3164a1ce43471212780f99dc979ed6cd095ad302815c1194cf054bd787c9f5c90d8471440242eb27231af94661cf59855a550188dd7203859b37bcd5c587803912039d7aab729444cba2d6132b5f561f659ce2fe308c11eda649a21b525d94146b2fa834a1caf72481c839c47cf57ff4e61f044c164e101447b20ea2d5a6124909cb546a1d70e94f6cb2c4543429d72b7b76b748b5330ad8c05d3d4874690fe57d996bf4c770fa18885b5edcdf655a17b49dfb1d074f27b63e196b97d9d9be2828595460aaf257345aee2a94154d1c5b5d2941db9c35', 'transcript_type': 'EVM'}\n", + "Time gen prf: 105.25368404388428 seconds\n" ] } ], @@ -196,7 +269,7 @@ " settings_path,\n", " proof_path,\n", " pk_path,\n", - ")\n" + ")" ] }, { @@ -208,23 +281,24 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 17, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "!@# res: True\n", - "prf instances: [[[3042937791208075219, 8157070662846698822, 3804781648660056856, 172406108020799675], [12436184717236109307, 3962172157175319849, 7381016538464732718, 1011752739694698287], [18341455175509539295, 12796101019039945164, 1607286914885633240, 1929881192315725821]]]\n", - "num_inputs: 1\n", - "proof boolean: 1.0\n", - "proof result 0 : 49.55078125\n" + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: '/Users/mhchia/projects/work/pse/demo-next/public/assets/out/data_commitment.json'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[17], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mverifier_verify\u001b[49m\u001b[43m(\u001b[49m\u001b[43mproof_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msettings_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvk_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mselected_columns\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata_commitment_path\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/zkstats-brXmXluj-py3.12/lib/python3.12/site-packages/zkstats/core.py:240\u001b[0m, in \u001b[0;36mverifier_verify\u001b[0;34m(proof_path, settings_path, vk_path, selected_columns, data_commitment_path)\u001b[0m\n\u001b[1;32m 237\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(proof_instance) \u001b[38;5;241m==\u001b[39m len_inputs \u001b[38;5;241m+\u001b[39m len_outputs, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlengths mismatch: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(proof_instance)\u001b[38;5;132;01m=}\u001b[39;00m\u001b[38;5;124m, \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mlen_inputs\u001b[38;5;132;01m=}\u001b[39;00m\u001b[38;5;124m, \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mlen_outputs\u001b[38;5;132;01m=}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 239\u001b[0m \u001b[38;5;66;03m# 2.1 Check input commitments\u001b[39;00m\n\u001b[0;32m--> 240\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mdata_commitment_path\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m f:\n\u001b[1;32m 241\u001b[0m data_commitment \u001b[38;5;241m=\u001b[39m json\u001b[38;5;241m.\u001b[39mload(f)\n\u001b[1;32m 242\u001b[0m \u001b[38;5;66;03m# All inputs are hashed so are commitments\u001b[39;00m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/Users/mhchia/projects/work/pse/demo-next/public/assets/out/data_commitment.json'" ] } ], "source": [ - "verifier_verify(proof_path, settings_path, vk_path)" + "verifier_verify(proof_path, settings_path, vk_path, selected_columns, data_commitment_path)" ] }, { @@ -236,7 +310,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -246,16 +320,17 @@ "Model onnx:\t\t /Users/mhchia/projects/work/pse/demo-next/public/assets/out/model.onnx\n", "Settings:\t\t /Users/mhchia/projects/work/pse/demo-next/public/assets/out/settings.json\n", "Proof:\t\t\t /Users/mhchia/projects/work/pse/demo-next/public/assets/out/model.pf\n", - "Verification key:\t /Users/mhchia/projects/work/pse/demo-next/public/assets/out/model.vk\n" + "Verification key:\t /Users/mhchia/projects/work/pse/demo-next/public/assets/out/model.vk\n", + "Srs path:\t\t ~/.ezkl/srs/kzg19.srs\n" ] } ], "source": [ - "model_onnx_path, settings_path, proof_path, vk_path\n", "print(\"Model onnx:\\t\\t\", model_onnx_path)\n", "print(\"Settings:\\t\\t\", settings_path)\n", "print(\"Proof:\\t\\t\\t\", proof_path)\n", - "print(\"Verification key:\\t\", vk_path)" + "print(\"Verification key:\\t\", vk_path)\n", + "print(\"Srs path:\\t\\t\", srs_path)" ] } ], @@ -275,7 +350,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.12.1" } }, "nbformat": 4, diff --git a/src/app/ezkl.ts b/src/app/ezkl.ts index 31a3cd1..451bf8c 100644 --- a/src/app/ezkl.ts +++ b/src/app/ezkl.ts @@ -21,17 +21,35 @@ export async function verifyProof( verificationKeyPath: string, srsPath: string, ) { - const [proof, settings, verificationKey, srs] = await Promise.all([ - loadFileToBuffer(proofPath), - loadFileToBuffer(settingsPath), - loadFileToBuffer(verificationKeyPath), - loadFileToBuffer(srsPath), - ]); + const proof = await loadFileToBuffer(proofPath) + const settings = await loadFileToBuffer(settingsPath) + const verificationKey = await loadFileToBuffer(verificationKeyPath) + const srs = await loadFileToBuffer(srsPath) const output = verify( new Uint8ClampedArray(proof), new Uint8ClampedArray(verificationKey), new Uint8ClampedArray(settings), new Uint8ClampedArray(srs), - ); + ) + // const [proof, settings, verificationKey, srs] = await Promise.all([ + // loadFileToBuffer(proofPath), + // loadFileToBuffer(settingsPath), + // loadFileToBuffer(verificationKeyPath), + // loadFileToBuffer(srsPath), + // ]); + // // * @param {Uint8ClampedArray} proof_js + // // * @param {Uint8ClampedArray} vk + // // * @param {Uint8ClampedArray} settings + // // * @param {Uint8ClampedArray} srs + // console.log("!@# proof=", proof) + // console.log("!@# settings=", settings) + // console.log("!@# verificationKey=", verificationKey) + // console.log("!@# srs=", srs) + // const output = verify( + // new Uint8ClampedArray(proof), + // new Uint8ClampedArray(verificationKey), + // new Uint8ClampedArray(settings), + // new Uint8ClampedArray(srs), + // ); return output } diff --git a/src/app/page.tsx b/src/app/page.tsx index 02f3f53..b5f377d 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -5,24 +5,36 @@ import { initialize, verifyProof } from "./ezkl"; const host = "http://localhost:3000"; const assetsURL = `${host}/assets`; -const proofPath = `${assetsURL}/model.pf`; -const settingsPath = `${assetsURL}/settings.json`; -const verificationKeyPath = `${assetsURL}/model.vk`; -const srsPath = `${assetsURL}/kzg.srs`; +const outDir = `${assetsURL}/out`; +const proofPath = `${outDir}/model.pf`; +const settingsPath = `${outDir}/settings.json`; +const verificationKeyPath = `${outDir}/model.vk`; +// NOTE: kzg.srs is printed from the jupyter notebook +const srsPath = `${outDir}/kzg.srs`; // template notebook settings const templateNotebook = `${assetsURL}/template.ipynb`; -const codeInCell = 2; +const cellForSelectedColumns = 3; +const cellForUserComputation = 5; /** * Generate the notebook for the computation * */ -export async function generateJupyterNotebookForComputation(computation: string, templateURL: string) { +export async function generateJupyterNotebookForComputation( + computation: string, + selectedColumns: string[], + templateURL: string, +) { const splitCode = computation.split("\n").map((line) => `${line}\n`); const response = await fetch(templateURL); const template = await response.json(); - const codeCell = template.cells[codeInCell]; + // Fill the selected columns in the notebook + const selectedColumnsCell = template.cells[cellForSelectedColumns]; + // Put `selected_columns = ["col1", "col2", ...]` in the notebook + selectedColumnsCell.source = `selected_columns = ${JSON.stringify(selectedColumns)}`; + // Fill the user computation in the notebook + const codeCell = template.cells[cellForUserComputation]; codeCell.source = splitCode; return JSON.stringify(template); } @@ -30,15 +42,15 @@ export async function generateJupyterNotebookForComputation(computation: string, async function exampleDownloadNotebook() { const name = "mean"; const date = Date.now(); + const selectedColumns = ["x", "y"]; const computation = `import torch from zkstats.computation import State def computation(state: State, x: list[torch.Tensor]): - x_0 = x[0] - out_0 = state.median(x_0) - out_1 = state.median(x_0) + out_0 = state.median(x[0]) + out_1 = state.median(x[1]) return state.mean(torch.tensor([out_0, out_1]).reshape(1,-1,1))` - const notebook = await generateJupyterNotebookForComputation(computation, templateNotebook) + const notebook = await generateJupyterNotebookForComputation(computation, selectedColumns, templateNotebook) // Download for testing const element = document.createElement("a"); const file = new Blob([notebook], {type: 'text/plain'}); @@ -61,7 +73,6 @@ const Page = () => { console.log("!@# proofPath=", proofPath) console.log("!@# settingsPath=", settingsPath) console.log("!@# verificationKeyPath=", verificationKeyPath) - console.log("!@# srsPath=", srsPath) const result = await verifyProof( proofPath, settingsPath,