Files
zk-stats-lib/examples/median/median.ipynb
2024-02-19 22:17:08 +08:00

402 lines
29 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: ezkl==7.0.0 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from -r ../../requirements.txt (line 1)) (7.0.0)\n",
"Requirement already satisfied: torch in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from -r ../../requirements.txt (line 2)) (2.2.0)\n",
"Requirement already satisfied: requests in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from -r ../../requirements.txt (line 3)) (2.31.0)\n",
"Requirement already satisfied: scipy in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from -r ../../requirements.txt (line 4)) (1.12.0)\n",
"Requirement already satisfied: numpy in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from -r ../../requirements.txt (line 5)) (1.26.3)\n",
"Requirement already satisfied: matplotlib in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from -r ../../requirements.txt (line 6)) (3.8.2)\n",
"Requirement already satisfied: statistics in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from -r ../../requirements.txt (line 7)) (1.0.3.5)\n",
"Requirement already satisfied: onnx in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from -r ../../requirements.txt (line 8)) (1.15.0)\n",
"Requirement already satisfied: filelock in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from torch->-r ../../requirements.txt (line 2)) (3.13.1)\n",
"Requirement already satisfied: typing-extensions>=4.8.0 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from torch->-r ../../requirements.txt (line 2)) (4.9.0)\n",
"Requirement already satisfied: sympy in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from torch->-r ../../requirements.txt (line 2)) (1.12)\n",
"Requirement already satisfied: networkx in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from torch->-r ../../requirements.txt (line 2)) (3.2.1)\n",
"Requirement already satisfied: jinja2 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from torch->-r ../../requirements.txt (line 2)) (3.1.3)\n",
"Requirement already satisfied: fsspec in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from torch->-r ../../requirements.txt (line 2)) (2023.12.2)\n",
"Requirement already satisfied: charset-normalizer<4,>=2 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from requests->-r ../../requirements.txt (line 3)) (3.3.2)\n",
"Requirement already satisfied: idna<4,>=2.5 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from requests->-r ../../requirements.txt (line 3)) (3.6)\n",
"Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from requests->-r ../../requirements.txt (line 3)) (2.2.0)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from requests->-r ../../requirements.txt (line 3)) (2024.2.2)\n",
"Requirement already satisfied: contourpy>=1.0.1 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (1.2.0)\n",
"Requirement already satisfied: cycler>=0.10 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (0.12.1)\n",
"Requirement already satisfied: fonttools>=4.22.0 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (4.47.2)\n",
"Requirement already satisfied: kiwisolver>=1.3.1 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (1.4.5)\n",
"Requirement already satisfied: packaging>=20.0 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (23.2)\n",
"Requirement already satisfied: pillow>=8 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (10.2.0)\n",
"Requirement already satisfied: pyparsing>=2.3.1 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (3.1.1)\n",
"Requirement already satisfied: python-dateutil>=2.7 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (2.8.2)\n",
"Requirement already satisfied: docutils>=0.3 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from statistics->-r ../../requirements.txt (line 7)) (0.20.1)\n",
"Requirement already satisfied: protobuf>=3.20.2 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from onnx->-r ../../requirements.txt (line 8)) (4.25.2)\n",
"Requirement already satisfied: six>=1.5 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib->-r ../../requirements.txt (line 6)) (1.16.0)\n",
"Requirement already satisfied: MarkupSafe>=2.0 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from jinja2->torch->-r ../../requirements.txt (line 2)) (2.1.4)\n",
"Requirement already satisfied: mpmath>=0.19 in /Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages (from sympy->torch->-r ../../requirements.txt (line 2)) (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.2.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 -r ../../requirements.txt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import ezkl\n",
"import torch\n",
"from torch import nn\n",
"import json\n",
"import os\n",
"import time\n",
"import scipy\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import statistics\n",
"import math"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"%run -i ../../zkstats/core.py"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# init path\n",
"os.makedirs(os.path.dirname('shared/'), exist_ok=True)\n",
"os.makedirs(os.path.dirname('prover/'), exist_ok=True)\n",
"verifier_model_path = os.path.join('shared/verifier.onnx')\n",
"prover_model_path = os.path.join('prover/prover.onnx')\n",
"verifier_compiled_model_path = os.path.join('shared/verifier.compiled')\n",
"prover_compiled_model_path = os.path.join('prover/prover.compiled')\n",
"pk_path = os.path.join('shared/test.pk')\n",
"vk_path = os.path.join('shared/test.vk')\n",
"proof_path = os.path.join('shared/test.pf')\n",
"settings_path = os.path.join('shared/settings.json')\n",
"srs_path = os.path.join('shared/kzg.srs')\n",
"witness_path = os.path.join('prover/witness.json')\n",
"# this is private to prover since it contains actual data\n",
"sel_data_path = os.path.join('prover/sel_data.json')\n",
"# this is just dummy random value\n",
"sel_dummy_data_path = os.path.join('shared/sel_dummy_data.json')"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"======================= ZK-STATS FLOW ======================="
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"data_path = os.path.join('data.json')\n",
"dummy_data_path = os.path.join('shared/dummy_data.json')\n",
"\n",
"data = json.loads(open(data_path, \"r\").read())['col_name']\n",
"\n",
"create_dummy(data_path, dummy_data_path)\n",
"dummy_data = json.loads(open(dummy_data_path, \"r\").read())['col_name']\n",
"\n",
"dummy_theory_output = torch.tensor(np.median(dummy_data))\n",
"dummy_lower_to_median = torch.tensor(np.sort(dummy_data)[int(len(dummy_data)/2)-1])\n",
"dummy_upper_to_median = torch.tensor(np.sort(dummy_data)[int(len(dummy_data)/2)])\n",
"\n",
"theory_output = torch.tensor(np.median(data))\n",
"lower_to_median = torch.tensor(np.sort(data)[int(len(data)/2)-1])\n",
"upper_to_median = torch.tensor(np.sort(data)[int(len(data)/2)])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"scales = [8]\n",
"selected_columns = ['col_name']\n",
"commitment_maps = get_data_commitment_maps(data_path, scales)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dummy output: tensor(15.8000, dtype=torch.float64)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/jernkun/Library/Caches/pypoetry/virtualenvs/zkstats-OJpceffF-py3.11/lib/python3.11/site-packages/torch/onnx/symbolic_opset9.py:2174: FutureWarning: 'torch.onnx.symbolic_opset9._cast_Bool' is deprecated in version 2.0 and will be removed in the future. Please Avoid using this function and create a Cast node instead.\n",
" return fn(g, to_cast_func(g, input, False), to_cast_func(g, other, False))\n"
]
}
],
"source": [
"print(\"dummy output: \", dummy_theory_output)\n",
"# Verifier/ data consumer side: send desired calculation\n",
"class verifier_model(nn.Module):\n",
" def __init__(self):\n",
" super(verifier_model, self).__init__()\n",
" # w represents mean in this case\n",
" self.w = nn.Parameter(data = dummy_theory_output, requires_grad = False)\n",
" self.lower = nn.Parameter(data = dummy_lower_to_median, requires_grad = False)\n",
" self.upper = nn.Parameter(data = dummy_upper_to_median, requires_grad = False)\n",
" def forward(self,X):\n",
" # since within 1%, we regard as same value\n",
" count_less = torch.sum((X < 0.99*self.w).double())\n",
" count_equal = torch.sum((torch.abs(X-self.w)<=torch.abs(0.01*self.w)).double())\n",
" len = X.size()[1]\n",
" half_len = torch.floor(torch.div(len, 2))\n",
" \n",
" # not support modulo yet\n",
" less_cons = count_less<half_len+2*(len/2 - torch.floor(len/2))\n",
" more_cons = count_less+count_equal>half_len\n",
"\n",
" # For count_equal == 0\n",
" lower_exist = torch.sum((torch.abs(X-self.lower)<=torch.abs(0.01*self.lower)).double())>0\n",
" lower_cons = torch.sum((X>1.01*self.lower).double())==half_len\n",
" upper_exist = torch.sum((torch.abs(X-self.upper)<=torch.abs(0.01*self.upper)).double())>0\n",
" upper_cons = torch.sum((X<0.99*self.upper).double())==half_len\n",
" bound = 2*count_less== 2*half_len\n",
" # 0.02 since 2*0.01\n",
" bound_avg = (torch.abs(self.lower+self.upper-2*self.w)<=torch.abs(0.02*self.w))\n",
"\n",
" median_in_cons = torch.logical_and(less_cons, more_cons)\n",
" median_out_cons = torch.logical_and(torch.logical_and(bound, bound_avg), torch.logical_and(torch.logical_and(lower_cons, upper_cons), torch.logical_and(lower_exist, upper_exist)))\n",
"\n",
" return(torch.where(count_equal==0, median_out_cons, median_in_cons), self.w)\n",
"\n",
" \n",
"verifier_define_calculation(dummy_data_path, selected_columns,sel_dummy_data_path,verifier_model, verifier_model_path)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Theory_output: tensor(49.5500, dtype=torch.float64)\n",
"lower: tensor(49.3000, dtype=torch.float64)\n",
"upper: tensor(49.8000, dtype=torch.float64)\n",
"==== Generate & Calibrate Setting ====\n",
"scale: [8]\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\":12052,\"total_const_size\":1815,\"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"
]
}
],
"source": [
"# prover calculates settings, send to verifier\n",
"print(\"Theory_output: \", theory_output)\n",
"print(\"lower: \", lower_to_median)\n",
"print(\"upper: \", upper_to_median)\n",
"class prover_model(nn.Module):\n",
" def __init__(self):\n",
" super(prover_model, self).__init__()\n",
" # w represents mean in this case\n",
" self.w = nn.Parameter(data = theory_output, requires_grad = False)\n",
" self.lower = nn.Parameter(data = lower_to_median, requires_grad = False)\n",
" self.upper = nn.Parameter(data = upper_to_median, requires_grad = False)\n",
" def forward(self,X):\n",
" # since within 1%, we regard as same value\n",
" count_less = torch.sum((X < 0.99*self.w).double())\n",
" count_equal = torch.sum((torch.abs(X-self.w)<=torch.abs(0.01*self.w)).double())\n",
" len = X.size()[1]\n",
" half_len = torch.floor(torch.div(len, 2))\n",
" \n",
" # not support modulo yet\n",
" less_cons = count_less<half_len+2*(len/2 - torch.floor(len/2))\n",
" more_cons = count_less+count_equal>half_len\n",
"\n",
" # For count_equal == 0\n",
" lower_exist = torch.sum((torch.abs(X-self.lower)<=torch.abs(0.01*self.lower)).double())>0\n",
" lower_cons = torch.sum((X>1.01*self.lower).double())==half_len\n",
" upper_exist = torch.sum((torch.abs(X-self.upper)<=torch.abs(0.01*self.upper)).double())>0\n",
" upper_cons = torch.sum((X<0.99*self.upper).double())==half_len\n",
" bound = 2*count_less == 2*half_len\n",
" # 0.02 since 2*0.01\n",
" bound_avg = (torch.abs(self.lower+self.upper-2*self.w)<=torch.abs(0.02*self.w))\n",
"\n",
" median_in_cons = torch.logical_and(less_cons, more_cons)\n",
" median_out_cons = torch.logical_and(torch.logical_and(bound, bound_avg), torch.logical_and(torch.logical_and(lower_cons, upper_cons), torch.logical_and(lower_exist, upper_exist)))\n",
" return(torch.where(count_equal==0, median_out_cons, median_in_cons), self.w)\n",
"\n",
"\n",
" \n",
"prover_gen_settings(data_path, selected_columns, sel_data_path, prover_model,prover_model_path, scales, \"resources\", settings_path)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"spawning module 0\n",
"spawning module 2\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"==== 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: 6.857371807098389 seconds\n",
"=======================================\n",
"Theory output: tensor(49.5500, dtype=torch.float64)\n",
"==== 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': '25cc712d6d34992fbead930e1e840a614b218f926129ecb7dadee79bf121f7d82d1a8de3b0e152d216a55a3e7a5bc6f5d7ece6e6917c7c29cc18ffd92f1df8db227f121c52ef77da33ed879fbc571ef6f26a50487695bdfbad32a239228869261b857ec74a2479102488d68f846b42b7f21f72ca9e5ffffadba545925f85fc89110867600929d17ca8d7cb962a4b13617cd27ef90b6ceed6e5f9fc42c4b7362a19f746c6e0d9eae85c892a22669a84fcb4532dde9f55b7060e6ff659ff7e349612183b4f220cdbe93468409fcbce06d10bed6c50ea22478618d9e8d5f9f6615c2272df2ea708fe6ef50f4048e8544b9a8cb7c395457a6381aad3a24dfdba21bd121efafedfdb00cf89d02c732e9e66cc22d202be49dabf6ff6d9f4018619d57218034f2a80e9639f3fea01826ec551aa3b705994e907b366cdbd6de2a3a26c1514c7143013a3eb4531d82d21f1ced6af190d4dc6b54cb26ffbe96ecde578dd44154fa5b6445caaaeda6e22601b802bd1d0d5d2a08922095cf82d528b72dc6b7e05674ff1db3ff3bac819b77ab8f85f32958f2dd2c057a9c4d4170bfb99278ae3202a1e031e55a208aec89f49e5d7dd0669dd3ac1162fae682a11b766f290eda3160183f6bf678dc48cbe1ee5413cdffcc70e37ddb055351be91afdc9ad5e342611897b249f55a9fdaeb41c71ab9d105998a6d8cf685e4c233bf52d3755845a382e814e5c386f5fa08be407cf74a85de6686b26cefbacbb85d8f46755659bbc4f28ae6be75c62ab88f3d5260014324e44841892fbd6ad05e1175500ef381605c10bd4a25023bdc8ef5a969ca1c34d9be11a35bc1d48476bedaec4f0e798b8310013d0a0f699c8a5c654055b7d4a8fb219159650f52c7074cb8ccde6cb1a9f30cd2990f8b6126138656ef3b88f173e4dbf67d8d25fe2f4f4144e9737a6d27dd28c25249e0474681e7a64b861ea6641c04fb4c025744a17bdc443d8e1ec8c15da8417e8b2b254854fbed70a1c27057309925c74754d269cb136055db07a20fa930d111850770ec674aff132d600bcb4551c49359c06a02ee1312338620891856e4e1cda7159c1123918406f96df8d384fc07f26c0a4dedba490a713a4f8b8c11b9207427114eb97b638a5996484c1944770c3235e4d80b147801e42416a0ae28f300c73379122017a19ea25a88b4d6bb9119c5063df1821962dfe7291c890e244d52092ad3464c8e0d92267e5d6c173738d136e5b8ad0976d379ce258884c10bda410923fc17f250f67ea7d803fbab9e04874f72097b6846c22a3c3f63e8991af6e29fc13f6d413264d51b687e311ca85a42d45c84aa11ae401a823f20ff9c6ec411244362ea1f033566caddc308c1e9d77d7b63624f5898a72a52551e5f31cb5081e7277b1c7f52d9b077fdf688c5cfd2d1ed963319ffc11162f6bcf69809e2cb40475c6af2a65ac9be6aae612edb487fc501d6e17dba5547e43d65e8468ce0c6120aaddcae739062b1e2169d2d5db47c6e657d03b78a9d0dddd5017d259d8527d00a0e72cf24c70af38323dffb5c4f55984ab4a6798a7f7bd1eb2e44bfdce02392419a132aef8d913810f6ca56b8cb3bc879d7564eaab982b4c89aa82c98919d9245eb22614a24ad7ab4fa19c2e7fc62e0ac31a2dcb4d853859f688a3c37bbf760a2c42c0551099a07b2350a4670e855dde648f4cef2c4ca551c44fff64284bbd0c04df7b32f6419c9e0014cd84edc8291521039d3634a770a936d20b29ac740a278f8bf3f7cc576b6fbb77504df799c553b8c6d3f915fb597534366af1ed493513745cc84c966b156220c5a927169267137fcfa3df1f30a4970edd868973651b236562d71ccdbe41207b6bd9a3d330d11c028e98130c2447a33e64f5d618d69709598c8cc4ac76b6934aa1acdad53d62c79edd6e8d543bacb35c3cdb5fd8d2192d185ceca552f849f9ad991fa61d57ecbaccea7a4d12bf5a9125f92894a8a5860777f671c5f329fd7d6573a8b5d2d0b2b088797d00bd793c406e293356e5a90305b6a028b8c2916d769496fb5f2a62e7894da0bd78959c3d653bfc49d4f6b9852afa768aa9d4c7e3cfb0cd38c13961448f6438f3590960ebd9d4335d26959cc709bfb72d8786ca406ef8b51c28943cf1d98e284f249a7d5d4a68c6923d47c27b019f3326993687fef90f69260bba0f3b8f6111bec5b8816f2cf7f79da9a67add2b09b1d661954bfccf20e67b9a270c813bcb3ded1eeea3f4990dacd05a72f94a1c8bcf1e8dcca83873b2eed8bca5f36e25bc34cd8c9357c0d91804732beb65be08dd11e73ab098be6733b58ddc69e72ad384fdb925b4c601a8fe5e1faee1bd110d0f571bb4c7f6864a5a2ea635a7b99826dbd1bdf9dec28a5e202178676b94822d7f8310f8cc5ff00a214fc065193063b42b70bd7148dbda0e258e76c39be52313dbfc4dc33a4b9dfd4f49e8a1a7fb21a20514aadcea67e26500b20358459ab608a798b5a9725b7289575b4c9b8bd441b13aee010a50c4540bc9e42a12e3d641218f04bc912c5aba0f9bc133181536edb535c991255192f79638c13ac574624e0b63693284dbe2072b2f34dd80b87d744b01385fc2ff50b689e7947617e607ce00a2f80769180195be25f36472710e7acb769d573fe78ca573ffa4bd54330c2525d9d48799b56a558976131ee5cb59680c23bfe6fe3c5cfe1e5fab3431634c681639c84e1cbb2c35a93b87a66f45847bc5dd30a502557ec617b927b1ad63b37e0e0e8b1a00c396d2ea23067956560d360d76c4fb69acae6be743b3e9108fba972a2c18cfaca44152e8c2dca0d5fc99442abd1c2356159454e3242948c6c4c0aa0ddb5438ab093012f970a2b341345e4204e6c3ac1dec1684d3ab39d97204936804bf8200293ee766df0e372bd2d902cde3a64fa879c36747184dee2897b0b7b61257ae2286e08df2db907e6ca66426e227c837c104688d9be3f5cd2f18ed6d261343fa0887d1fa73b694cd52c50967c36ecfd53b650b2d273b7c5147211561cf072f7fe1599c04d23c60f64b490b8ba98a95f813f37cea0f6e17ec23e0b5b3c80d1accd7d6b242a76394a97f10b0f6b9210f2dc341678796f0adfc84fbe48d421d07119d137f3874ce067f01000900808c62fe11a94023fd17a2b8267152a545222c81ca51e3fde4a2926ac4caf5f939935c28864c4864a8cb16a1fe8e69a9ea019105ce1d9a9388600b53b2378f2dd873e91e2b8c27bcfe40ccf58ad8904a5e2de7c9c23ff3ab9ce3dd15b14a867cff727d18370329dbf8ef34d7faf3461b1c0a1896f80912618d3ea8f6c22cb9647450e2d6883316016167122555f013fce314dca3de2e6999553ee973017be28292236f3ca8d53e36c3d21c0bda78d142cf032c67ca5f3b544f8ed21e16e777325f1d2a507273db730b781b61453610d3b50526563cf75fc641bd209773234a56f91e9769a35ea6a2b145af8be96ad56c3b16c2a74a846d3e60cba7f729a1aed6946e281851070e2900958e0f0c10b45ab9251cdca85fc099074ab3a8ddd9b7722b3a2d82aaecd450ffe1ee735e6bbe4174055a589c1c6eb7e03d7a31972f72f1f9f002707ab659bec8b0bd9fa7553a2b091acc646042d76c231825312d84d9db29171e80673eb92551238dfc49c958a8f025f8910565477df8b031f57568047e36c74895477cdce4095ff8b7693660fc6c0375f954f7a3afbb2a9f1ed6c68989ec50eaad3f9f3ad47274eee62ef5aafabb289513f99ea79c33bae317ba98018fa63ee0f5eb786c2e4a4cce507632afc0252830b8c491c57e5c673eac18b21bec271dbd5689d1bb1d3029c80205d60a2bf802d40b6f2092bd2e721dae9a54030953ded5d3aa0af11a9ab6eb6cab02be13f0136947f0a2dec98e91627e6f568f64f8db9fa133aae9cabf08e335896f28a97200fb6322935c4c848a9e5077f48093051349da44b4ec4434b0aee22d674cb71900000000000000000000000000000000000000000000000000000000000000000dd97277754dd3fac952c9aa9ce86f21fe482e464384f3eec2ff27bf814dbf9e1454cd093d615c9e73d862b69cc38ea51a6094d7cf1ebc790f75053c6351528e04dae904e0a06a7cc9d0f142d32e6282e483a7fb0a16357eceaa0e81300758b62c02fed8e0d3967dc285303c4133bac5b0cd4eedddd6ab54c304bf49908209420566bfaf9a247cabea3c0b34310be68f5b8bcdb9c41be1c9483574235fcbc91e00aba19f9f1b36615001053ed85594627a4b39b9753b92439953744f48dad48f1c5617d638d375b552ee523fe5d21324851c63f79398a94668634146339c227020c20e3a6162db2ae6f4bf190b678af1c5706b46cac3d02726db4c5f139e913e28dc26f218ac5ec7f05586fbe42c09fa8665f4e9229f4aa7717d831786abdbfe1c8f22a90f875b284e71a93b3dfdc18fc923aa4650b901a850ae0344ec0ccccd2f361042e289b7f68ddecce1d54d4462405881c557aa444e1715a8707271e855108b6639003a3a18a4afd5632d85876fda9b836bb6ed55de4a84c2322281a7ef2c1a2a05a033d7f3c52fab465ee69ffa7e7e28b1a67642baf3291e9ac214cbc029af1c8bfd8c808b65f360747d9c055748ada9c780806778e803d41f5bacc0f717480e3b597c88da9e62c057f021568d59c086a0e88d0ab9452a00de0f7079c81149ebb5717bfe51ae985952b97aab012f53f6d70486fd11e57325f357381c722f0d7bcdf157a462591df68fdeae451c1652d41d0b7c7cee6bbb7aa79359c4920afeea98407342f4f9504dfe598ba868c66943822779d7d8b401cc1ee7a8227316a91b4fe9ef6e73ce6eaf975c2a22b69cec9971bd00191e290999076e2b262924a2696c21d3ba38582f3c05443d94be3311d17ea15364bbd917e661d99b4cd71b3b1373d14f8cdbb2d51a1d9388f7e661f069b46739f44c997c4134c62356bb092ee3decf8aed3a24a75ffe7c28627b6c70a8459856a0d493c701b047d3902f1036731ac250350774d783046a5fb5bcabdfa74cdae558ba5849e7d01b56ea9916b474e81f5f823222c409cc10a3f62e4739b805af1a92d26ca1e5158767b3ea16405e7b8e8f064b61f7804a279a8cdf70576dc3ba5889e85022b500616e7b6b1cd2bbfb408cdc7b6770029c3b8501e29c975f7aa18f6d170a66a84465c9c64c2b19f2f47c08d6f1052bdef1d3ca857a6c6a2f6e95791a8891948c63eed7ee0725aa9d1657302ff56a424e49bf580380499120f772d662ae2e417392549b19bc126186f5ad9d3ede7692bbbe7bd511b51835627ec895cb6515ddcb5b7e22465b0145abc9d0efab80bfef3485f08267e1755bd704170d782064061f492f257e0a2c40825aaffc98e974548b963541a16889f6bbb80695be2ac7d1cbff3a698f9d136b6ee4e4514e7b3d1e5580ffa59694a7a0596695abdec3e0b1018c0fef7b6c028feef6763f51ae7c5baea23ff430b3266ca45eab3921e69b072b0d4fd4f9010c1c85cb41125700220276e2e92b4de32bf474949c2a126e7eb7076866c80e7012667ccf009831fa5eaea3d7e67b9a82359b1c80cdc4482ef3775da6b713bdbf1a9c11209f7b996b6d4765e980db3cd066c35a48ee614cd57a90c4e3744a62712c16c9c53f7065cff5fae5a4fb97ebf174f75f7c5cbb5cc44dfcd694be50d66b034a2a187a44b16740b5b7f126dbe50d256501e9b59b390dacd4dd32a4bf1c8017a08de9afcb96d398859ff8c8c5931f3e418ef57986790022a6e1dec0b5b8102c0a0ab442b84147a24149d5f4b6eef67228fb0f379b827fe04b7afdc3c07f4c240736a0c26fdcda516953914a20f5eba0e61f3dfe1e9a6840eff97729e21bfa2c503aaae8045069967f109f7f4bbd2edc7ab21ff88d93ccb2d2224f3ef28a9f19fe4ba7a1b2d9606d361bb619427f3ff4778ae954db1915b7386a320a3c322306e01f92e040c0da253197ee4ba1bbc5a7d7fa71e6c48d66315bba03a3a81a961d1e5c4778e989d653c3a7d8a78ccc7c70a7bf9df111a21645500b840be1accd07eba22e695c27b4944f9829e789ae5d4e770728318ef077e1ecf83a4d7d22b21812f0f19dadc48209615429238be915256263f7d2cb1fc39b535a746229439d1865e6d16c4d7f2945fd5b29ea90c4254f3dcc0bded66261c0215e32a77d01e03049c16fe89564103ac64870f29e0e18d310bf1bf7905601c3930c67cea36e802b414aa2367f95c4cdc70f905fcbbd1dc7acf286e7f5a0c0a559ae0525eff05d0feb54d81251aa4f46088ef97dd72ef39c1d87bceaa194c9478066c9ba78e07c', 'transcript_type': 'EVM'}\n",
"Time gen prf: 9.461018085479736 seconds\n"
]
}
],
"source": [
"# Here verifier & prover can concurrently call setup since all params are public to get pk.\n",
"# Here write as verifier function to emphasize that verifier must calculate its own vk to be sure\n",
"setup(verifier_model_path, verifier_compiled_model_path, settings_path,vk_path, pk_path )\n",
"\n",
"print(\"=======================================\")\n",
"# Prover generates proof\n",
"print(\"Theory output: \", theory_output)\n",
"prover_gen_proof(prover_model_path, sel_data_path, witness_path, prover_compiled_model_path, settings_path, proof_path, pk_path)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"49.55078125"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Verifier verifies\n",
"verifier_verify(proof_path, settings_path, vk_path, selected_columns, commitment_maps)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.11.4"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}