Zilch は、スケーラブルかつ透過的(信頼できるセットアップの必要がない) ARguments of Knowledge (STARK) を実装するフレームワークです。 Zilch は、フロントエンドとバックエンドの 2 つの主要コンポーネントで構成されています。
フロントエンドは、ゼロ知識引数用に設計された Java のサブセットである ZeroJava プログラミング言語、および ZeroJava コードを zMIPS アセンブリ命令に変換するコンパイラーで構成されます。 zMIPS は、ZKP のプログラミングをサポートするための MIPS ISA の拡張機能です。
バックエンドは、zMIPS アセンブリ命令を演算回路に変換し、これらの回路の評価を検証するための ZKP を生成します。バックエンドは、zkSTARK ライブラリの ZKP 構造に基づいて構築され、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)
フラグの使用方法については、以下の例を参照してください。
注:プライベート テープとパブリック テープが zMIPS アセンブリ ファイルと同じディレクトリにあり、 pubtape.txt
およびauxtape.txt
という名前が付けられている場合、Zilch はそれらのテープを自動的に検出します。
Examples-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
1 つのレジスタを使用することを意味します。 zMIPS プログラムでは、inc 命令を次のように使用できます。
move $t0, 5
inc $t0
answer $t0
答えは6になります。
min
マクロ命令は 3 つのレジスタとラベルを使用します。
"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 --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