Zilch 是一个实现可扩展且透明(无需可信设置)的知识论证(STARK) 的框架。 Zilch 由两个主要组件组成:前端和后端。
前端由 ZeroJava 编程语言(为零知识参数设计的 Java 子集)和用于将 ZeroJava 代码翻译为 zMIPS 汇编指令的编译器组成; zMIPS 是我们对 MIPS ISA 的扩展,用于支持 ZKP 编程。
后端将 zMIPS 汇编指令转换为算术电路,并生成 ZKP 以验证这些电路的评估。后端建立在 zkSTARK 库的 ZKP 结构之上,并将 libSTARK 的编程模型扩展到 zMIPS 抽象机。
免责声明:该代码是学术等级,用于学术同行评审和评估。作者已使用Ubuntu 20.04
测试了代码。
如果您发现我们的工作有用,请引用我们的出版物(IEEE Xplore,密码学 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)
有关如何使用标志的信息,请参阅下面的示例。
注意:如果私有磁带和公共磁带与 zMIPS 程序集文件位于同一目录中并且名为pubtape.txt
和auxtape.txt
,Zilch 会自动检测它们。
在 example-zmips 目录中,我们包含各种 zMIPS 示例。
在汇编器级别,我们的标签是字母数字标签,以双下划线开头和结尾(例如__example_label__
),而在 Zilch 内部,这些标签被转换为指令号。
例如,下面是计算 5 阶乘的 zMIPS 代码:
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
。
zilch
可执行文件的默认行为(不带标志--address
、 --verifier
、 --prover
)会导致本地执行。为了启用网络验证,首先应执行验证程序( --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