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