Zilch เป็นเฟรมเวิร์กที่ใช้ Scalable และ Transparent (ไม่จำเป็นต้องตั้งค่าที่เชื่อถือได้) ARguments of Knowledge (STARK) Zilch ประกอบด้วยสององค์ประกอบหลัก: ส่วนหน้าและส่วนหลัง
ส่วนหน้าประกอบด้วยภาษาการเขียนโปรแกรม ZeroJava ชุดย่อยของ Java ที่ออกแบบมาสำหรับอาร์กิวเมนต์ที่ไม่มีความรู้ และคอมไพเลอร์สำหรับการแปลโค้ด ZeroJava เป็นคำสั่งแอสเซมบลี zMIPS zMIPS เป็นส่วนขยายของเราสำหรับ MIPS ISA เพื่อรองรับการเขียนโปรแกรม ZKP
ส่วนแบ็คเอนด์แปลคำสั่งการประกอบ zMIPS ไปเป็นวงจรเลขคณิต และสร้าง ZKP เพื่อตรวจสอบการประเมินวงจรเหล่านี้ ส่วนแบ็คเอนด์สร้างขึ้นตามโครงสร้าง 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
ในไดเร็กทอรี examples-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, ...
ในขณะที่เทป aux มี 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
flag) จากนั้นจึงดำเนินการตรวจสอบ ( --prover
flag) ผู้ตรวจสอบทำหน้าที่เป็นเซิร์ฟเวอร์รอให้ผู้พิสูจน์อักษรเชื่อมต่อ ดำเนินการ และพิมพ์ และส่งคืนการตัดสินใจให้กับผู้พิสูจน์อักษร
ตัวอย่างเช่น การอ่านอย่างง่ายจากตัวอย่างเทปบนเครือข่าย:
ขั้นแรกให้เรียกใช้ตัวตรวจสอบการฟังบนพอร์ต 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