برنامه نویسی

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
اکنون مدار شما امن و آماده برای تولید است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا