Zilch هو إطار عمل يطبق حجج المعرفة (STARKs) القابلة للتطوير والشفافية (لا حاجة لإعداد موثوق به). يتكون Zilch من مكونين رئيسيين: الواجهة الأمامية والخلفية.
تتكون الواجهة الأمامية من لغة برمجة ZeroJava، وهي مجموعة فرعية من Java مصممة لوسيطات المعرفة الصفرية، ومترجم لترجمة كود ZeroJava إلى تعليمات تجميع zMIPS؛ zMIPS هو امتدادنا لـ MIPS ISA لدعم برمجة ZKPs.
تقوم الواجهة الخلفية بترجمة تعليمات تجميع zMIPS إلى دوائر حسابية وتولد ZKPs للتحقق من تقييم هذه الدوائر. تعتمد الواجهة الخلفية على إنشاءات ZKP لمكتبة zkSTARK، وتوسع نموذج برمجة libSTARK إلى آلة zMIPS التجريدية.
إخلاء المسؤولية: الرمز هو الدرجة الأكاديمية ، وهو مخصص لمراجعة وتقييم النظراء الأكاديميين. لقد اختبر المؤلفون الكود باستخدام Ubuntu 20.04
.
إذا وجدت أن عملنا مفيد، يرجى الاستشهاد بمنشورنا (IEEE Xplore، Cryptology ePrint Archive):
D. Mouris and N. G. Tsoutsos, "Zilch: A Framework for Deploying Transparent Zero-Knowledge Proofs,"
in IEEE Transactions on Information Forensics and Security (TIFS), 2021, DOI: 10.1109/TIFS.2021.3074869
apt install g++
apt install libssl-dev
apt install libboost-all-dev
apt install libjsoncpp-dev
apt-get install libgtest-dev
بالنسبة لتبعيات برنامج التحويل البرمجي ZeroJava، قم بالرجوع إلى مستودع ZeroJava.
$ git clone --recursive https://github.com/TrustworthyComputing/Zilch
$ cd Zilch
$ make -j8
$ make zilch-tests -j8
للتحقق من نوع التثبيت ./zilch-tests
.
$ cd ZeroJava-compiler
$ mvn initialize
$ mvn package
$ ./zilch --asm <zMIPS assembly file path> [--tsteps <trace length log_2>] [--security <security parameter]> [--pubtape <primaryTapeFile>] [--auxtape <auxTapeFile>] [--verifier | --prover] [--address <address:port_number>]
--help : Display this help message
--examples : Display some usage examples
--show-asm : Display zMIPS assembly input
--verbose : Verbose output, print BAIR, ACSP, APR and FRI specifications
--asm : Path to the zMIPS assembly code (required)
--tsteps : trace length log_2 (optional, default = 5)
--security : security parameter (optional, default = 60)
--pubtape : path to the primary tape file (optional, default = none)
--auxtape : path to the auxiliary tape file (optional, default = none)
The flags below enable verification over the network; if neither is enabled, the execution will be locally. Verifier acts as the server and thus should be executed first.
--address : verifier-address:port-number (optional, default = 'localhost:1234')
--verifier : enables execution of the verifier, listening on port-number (optional, default = false)
--prover : enables execution of the prover, transmitting to verifier-address:port-number (optional, default = false)
انظر الأمثلة أدناه حول كيفية استخدام الأعلام.
ملاحظة: يكتشف Zilch تلقائيًا الأشرطة الخاصة والعامة إذا كانت موجودة في نفس الدليل مثل ملف التجميع zMIPS ويتم تسميتها pubtape.txt
و auxtape.txt
.
في دليل example-zmips، قمنا بتضمين أمثلة zMIPS متنوعة.
على مستوى المجمّع، تكون تسمياتنا عبارة عن علامات أبجدية رقمية تبدأ وتنتهي بشرطة سفلية مزدوجة (على سبيل المثال، __example_label__
)، بينما يتم تحويل هذه التسميات داخل Zilch إلى أرقام تعليمات.
على سبيل المثال، يوجد أدناه رمز zMIPS لحساب مضروب 5:
move $t3, 5
move $t1, 1
move $t2, 1
__L1__:
mult $t1, $t1, $t2
add $t2, $t2, 1
bge $t3, $t2, __L1__
answer $t1
في macros.json، نحدد تعليمات ماكرو مخصصة بناءً على تعليمات zMIPS الموجودة. على سبيل المثال، قمنا بتعريف inc
و min
تعليمات الماكرو كما هو موضح أدناه:
"inc": {
"reg1": "$x",
"macro": "add $x, $x, 1"
}
هذا يعني أن inc
يستخدم سجلًا واحدًا. يمكن لبرنامج zMIPS استخدام تعليمات inc كـ
move $t0, 5
inc $t0
answer $t0
الجواب سيكون 6.
تستخدم تعليمات الماكرو min
ثلاثة سجلات وأيضًا تسميات:
"min": {
"reg1": "$x",
"reg2": "$y",
"reg3": "$z",
"uses_label" : "true",
"macro" : "blt $y, $z, __min_label__
move $x, $z
j __end_min_label__
__min_label__
move $x, $y
__end_min_label__"
}
الشريط الأساسي مملوء بـ 1, 2, 3, 4, ...
بينما يحتوي الشريط الإضافي على 101, 102, 103, 104, ...
.
pubread $t0 ; consume next word from public tape and store it to r0
print $t0
secread $t1 ; consume next word from auxiliary tape and store it to r1
print $t1
pubseek $t0, 3 ; read the 4th word from the public tape and store it to r0
print $t0
secseek $t1, 3 ; read the 4th word from the auxiliary tape and store it to r1
print $t1
answer $t0
من أجل تنفيذ البرنامج أعلاه، ما عليك سوى تشغيل ./zilch --asm ./examples-zmips/read_test/read_test.zmips --tsteps 5 --pubtape ./examples-zmips/read_test/read_test.pubtape --auxtape ./examples-zmips/read_test/read_test.auxtape
.
السلوك الافتراضي (بدون العلامات --address
, --verifier
, --prover
) للملف القابل للتنفيذ zilch
يؤدي إلى تنفيذ محلي. من أجل تمكين التحقق عبر الشبكة، يجب أولاً تنفيذ أداة التحقق (علامة --verifier
) ثم المثل (علامة --prover
). يعمل المدقق كخادم ينتظر اتصال المثبت، وينفذ ويطبع ويعيد قراره إلى المثبت.
على سبيل المثال، قراءة بسيطة من مثال الأشرطة عبر الشبكة:
قم أولاً بتشغيل أداة التحقق على المنفذ 2324
:
./zilch --asm ./examples-zmips/read_test/read_test.zmips --tsteps 10 --security 120 --pubtape ./examples-zmips/read_test/read_test.pubtape --auxtape ./examples-zmips/read_test/read_test.auxtape --verifier --address localhost:2324
ومن ثم إثبات الاتصال بالمنفذ 2324
:
./zilch --asm ./examples-zmips/read_test/read_test.zmips --tsteps 10 --security 120 --pubtape ./examples-zmips/read_test/read_test.pubtape --auxtape ./examples-zmips/read_test/read_test.auxtape --prover --address localhost:2324