Niftyzk tutorial 4 – تشریفات

در این آموزش، یک مدار ایجاد می کنیم، آن را کامپایل می کنیم و سپس سرور مراسم خود را بر روی VPS مستقر می کنیم تا مشارکت های ناشناس را بپذیرد. پس از این، مدار را نهایی کرده و کلید تأیید نهایی را صادر می کنیم
بدویم niftyzk init projectname
برای ایجاد یک پروژه جدید
Creating a new directory with name projectname
? What project do you want to scaffold? Commit-Reveal Scheme
? Choose the hashing algorithm to use: poseidon
? Do you wish to add tamperproof public inputs? (E.g: walletaddress): no
Generating circuits
Generating javascript
Done
Run npm install in your project folder
پس بدو npm install
و بیایید فایل های ptau را دانلود کنیم
niftyzk ptaufiles
، ما یک فایل کوچکتر را برای طرح commit-reveal خود می گیریم
? Select a ptau file to download powersOfTau28_hez_final_14.ptau
Connecting to download powersOfTau28_hez_final_14.ptau
Starting to download 18.08 MiB
downloading [====================] 100% 0.0s
حالا فقط بدو niftyzk compile
و فایل ptau را انتخاب کنید، تا اینجا خوب است.
حالا اجرا کنید git init
و انجام دهید git add .
اگر بررسی کنید git status
باید ببینید:
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached ..." to unstage)
new file: .gitignore
new file: circuits/circuit.circom
new file: circuits/commitment_hasher.circom
new file: circuits/compiled/circuit.r1cs
new file: circuits/compiled/circuit.sym
new file: circuits/compiled/circuit_js/circuit.wasm
new file: circuits/compiled/circuit_js/generate_witness.js
new file: circuits/compiled/circuit_js/witness_calculator.js
new file: circuits/compiled/zkeys/circuit_0000.zkey
new file: lib/index.js
new file: package-lock.json
new file: package.json
new file: readme.md
new file: test/index.test.js
new file: test/input.js
اینها فایل هایی هستند که در حین داربست و کامپایل ایجاد شده اند. می توانید ببینید circuits/compiled
دایرکتوری شامل تمام مصنوعات خروجی توسط کامپایلر است و zkey وجود دارد که برای مشارکت در مراسم استفاده می شود. فایلهای ptau به دلیل اندازهشان commit نمیشوند، اما همیشه میتوانید آنها را دوباره دانلود کنید.
بیایید فایل ها را commit کنیم
$ git commit -m "initial commit"
[master (root-commit) 946c8e7] initial commit
15 files changed, 7212 insertions(+)
create mode 100644 .gitignore
create mode 100644 circuits/circuit.circom
create mode 100644 circuits/commitment_hasher.circom
create mode 100644 circuits/compiled/circuit.r1cs
create mode 100644 circuits/compiled/circuit.sym
create mode 100644 circuits/compiled/circuit_js/circuit.wasm
create mode 100644 circuits/compiled/circuit_js/generate_witness.js
create mode 100644 circuits/compiled/circuit_js/witness_calculator.js
create mode 100644 circuits/compiled/zkeys/circuit_0000.zkey
create mode 100644 lib/index.js
create mode 100644 package-lock.json
create mode 100644 package.json
create mode 100644 readme.md
create mode 100644 test/index.test.js
create mode 100644 test/input.js
به راه حل میزبانی گیت مورد علاقه خود بروید، من از github استفاده می کنم اما شما می توانید از هر چیزی که می خواهید استفاده کنید و مخزن را فشار دهید. ما بعداً آن را به یک VPS کلون می کنیم، اما می توانید کل دایرکتوری را نیز به صورت دستی در آنجا کپی کنید، این به شما بستگی دارد.
مخزن اینجا برای مرجع است:
https://github.com/NiftyZk/projectname
استقرار دستی
برای VPS، من یک سرور Hetzner ایجاد می کنم. شما می توانید از هر راه حل میزبانی یا حتی خود میزبانی در Raspberry Pi استفاده کنید. برای ورود به SSH نیاز دارید. ما Nginx را پیکربندی می کنیم و حتی یک دامنه را با استفاده از namecheap پیکربندی می کنیم.
در console.hetzner.cloud یک 2VCPU، 4 گیگابایت Ram X86 VPS به قیمت 4.11 یورو در ماه در حال اجرا اوبونتو ایجاد کردم و آن را با کلیدهای SSH خود پیکربندی کردم. اگر در SSH تازه کار هستید، باید کمی وقت بگذارید تا در مورد آن بیاموزید.
ssh root@serverip
بنابراین من به VPS راه دوری که با کلاینت SSH ایجاد کردم وصل میشوم، بهعنوان روت وصل میشوم زیرا هیچ کاربر دیگری پیکربندی نشده است. می توانید آن را برای خودتان پیکربندی کنید، فعلاً برای نمایش مراسم خارج از محدوده است.
sudo apt update
sudo apt upgrade
sudo apt install nginx
ما snap را برای certbot نصب می کنیم
sudo apt install snapd
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx
باید دامنه خود را طوری پیکربندی کنید که یک رکورد A با میزبان داشته باشد @
با اشاره به IP VPS شما برای certbot برای صدور گواهی. انتشار تغییرات DNS شما زمان می برد، اما اگر همه چیز را به خوبی انجام داده باشید، آدرس IP باید نشان دهد که NGINX در حال اجرا است.
در مرحله بعد، میخواهیم nodejs را با استفاده از اسناد رسمی نصب کنیم
https://nodejs.org/en/download
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
این nvm را نصب میکند و ممکن است لازم باشد جلسه ssh را پس از نصب مجدد راهاندازی کنید. یک نسخه نود جدید با استفاده از nvm نصب کنید
nvm install 22
ما قصد داریم pm2 را نصب کنیم، این به باز نگه داشتن سرور مراسم در هنگام بسته شدن جلسه ssh کمک می کند.
npm install -g pm2
pm2 startup systemd
مخزنی را که قبلاً با استفاده از Git ایجاد کردیم در فهرست اصلی خود کلون کنید و فراموش نکنید که niftyzk را نصب کنید.
npm install -g git+https://github.com/NiftyZk/niftyzk.git
مرحله بعدی پیکربندی nginx برای پراکسی پورت 3000 به 443 SSL و ارتقاء تمام اتصالات غیر SSL برای استفاده از آن است. شما باید این فایل را کپی کنید /etc/nginx/sites-available/default
و مطمئن شوید که قسمت های YOURDOMAIN را برای استفاده از نام دامنه پیکربندی شده خود ویرایش کنید!
server {
#SSL only
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
client_max_body_size 200M;
ssl_certificate /etc/letsencrypt/live/YOURDOMAIN/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/YOURDOMAIN/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
server_name YOURDOMAIN;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Connection ‘upgrade’;
proxy_pass http://127.0.0.1:3000; #port where you are serving your express app.
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_ssl_server_name on;
proxy_pass_header Server;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
}
}
server {
listen 80;
listen [::]:80;
server_name _;
return 301 https://$host$request_uri;
}
سپس پس از ویرایش فایل، nginx را دوباره بارگذاری کنید
sudo systemctl reload nginx
حال میخواهیم یک اسکریپت پوسته برای اجرای مراسم niftyzk ایجاد کنیم که تا pm2 قابل اجرا باشد.
cd را وارد فهرست راهنمای پروژه کلون شده خود کنید و npm install
سپس touch run.sh
و با یک ویرایشگر بازش کنید.
#!/usr/bin/bash
niftyzk ceremony
دانلود فایل ptau استفاده شده با niftyzk ptaufiles
، برای کامپایل از 14 استفاده کردیم، باید همان را انتخاب کنید. برای اجرای مراسم در نهایت، pm2 start run.sh
تبریک میگوییم، سرور مراسم را روی دامنهتان اجرا میکنید. وقتی از آن بازدید میکنید باید این را ببینید:
چگونه کار می کند؟
هر کسی می تواند از مراسم شما بازدید کند، شرکت عمومی است. آنها یک نام وارد می کنند و سپس در یک صف قرار می گیرند. وقتی نوبت آنها باشد که مشارکت کنند، از آنها خواسته می شود تا مقداری آنتروپی را وارد کنند و در سمت مشتری SnarkJS را اجرا می کنند تا در آخرین zkey مشارکت کنند.
با دانلود فایل لاگ و مقایسه ورودی های فایل لاگ با هش sha256 نام خود می توان شرکت در مراسم را تایید کرد.
دایرکتوری به مخزن شما اضافه شده است به نام مشارکت، که حاوی فایل log.csv است.
پس بیایید نام را وارد کنیم: helloworld
و مقداری آنتروپی تصادفی اضافه کنید. چه اتفاقی افتاد؟ سهمی به آن اضافه شد /circuits/compiled/zkeys/
دایرکتوری فراخوانی شد circuit_0001.zkey
و فایل log دارای یک ورودی csv اضافه شده است
Contribution,936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af,087ec9f31cc05fa8db3c46ed360a5294fd6c99aaa97e244044ca936c3e302e35cd34080e86eaa4a67d1e2c717d25b90759f46cb4af692ac5b3e2d17f04bacbfa,circuit_0001.zkey
هش اول یک هش sha256 از نام وارد شده است، دومی هش blake2b مدار است که بعداً در نهایی شدن مدار وارد می شود.
echo -n helloworld | sha256sum
936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af -
این مراسم می تواند به طور نامحدود آنلاین باشد و تا زمانی که یکی از مشارکت کنندگان تقلب نکند، ایمن است. بزرگترین فایل PTAU که سرور مراسم پشتیبانی می کند را می توان با آن وارد کرد niftyzk ptaufiles
powersOfTau28_hez_final_15.ptau blake2b hash: 982372c867d229c236091f767e703253249a9b432c1710b4f326306bfa2428a17b06240359606cfe4d580b10a5a1f63fbed499527069c18ae17060472969ae6e Power: 15, Max Constraints: 32K Size: 36.08 MiB Supports built in ceremony server: YES
دلیل این امر تنگنای شبکه است. Any circuits that require more than max 32k constraints will need to do a ceremony manually using snarkjs.
بنابراین پس از چند مشارکت، می توانید سرور را حذف کنید. برای آزمایش اکنون می توانیم مشارکت ها را به صورت دستی اضافه کنیم.
سپس یک را انجام دهید git add .
root@niftyzk-ceremony:/home/nifty/projectname# git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged ..." to unstage)
new file: circuits/compiled/contributions/log.csv
new file: circuits/compiled/zkeys/circuit_0001.zkey
new file: circuits/compiled/zkeys/circuit_0002.zkey
new file: circuits/compiled/zkeys/circuit_0003.zkey
new file: run.sh
و این zkey ها را انجام دهید و به مخزن خود فشار دهید. اکنون می توانید وب سرور خود را خاموش کنید.
مدار را نهایی کنید
می توانید مراسم را به صورت محلی نهایی کنید، فقط تغییرات را بکشید و یک چراغ رندوم برای استفاده انتخاب کنید.
niftyzk finalize --beacon 0000000000000000000102b8a74a6e9b9344f0abb3ba25dea7f847c7296fb21d
Niftyzk finalize مراسم را کامل می کند، من از هش بلاک بیت کوین برای یک چراغ دریایی استفاده کردم. باید یک عدد هگزادسیمال قابل تایید باشد.
وقتی نهاییسازی به پایان رسید، باید مشاهده کنید که مشارکتها ثبت شدهاند. تا زمانی که نامی را که وارد کردهاید بدانید، همیشه قابل تأیید است که مشارکت شما در zkey نهایی باشد.
[INFO] niftyzk: contribution #1 936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af:
087ec9f3 1cc05fa8 db3c46ed 360a5294
fd6c99aa a97e2440 44ca936c 3e302e35
cd34080e 86eaa4a6 7d1e2c71 7d25b907
59f46cb4 af692ac5 b3e2d17f 04bacbfa
[INFO] niftyzk: ZKey Ok!
این ایجاد می کند circuit.final.zkey
حالا می توانید بدوید niftyzk vkey --final
و نهایی را ایجاد کنید verification_key.json
اکنون مدار شما امن و آماده برای تولید است.