Zilch ist ein Framework, das skalierbare und transparente (kein vertrauenswürdiges Setup erforderlich) ARguments of Knowledge (STARKs) implementiert. Zilch besteht aus zwei Hauptkomponenten: einem Front-End und einem Back-End.
Das Frontend besteht aus der Programmiersprache ZeroJava, einer Teilmenge von Java, die für wissensfreie Argumente entwickelt wurde, und einem Compiler zum Übersetzen des ZeroJava-Codes in zMIPS-Assembly-Anweisungen; zMIPS ist unsere Erweiterung der MIPS ISA zur Unterstützung der Programmierung von ZKPs.
Das Back-End übersetzt die zMIPS-Assembly-Anweisungen in arithmetische Schaltkreise und generiert ZKPs zur Überprüfung der Auswertung dieser Schaltkreise. Das Backend baut auf den ZKP-Konstruktionen der zkSTARK-Bibliothek auf und erweitert das Programmiermodell von libSTARK auf die abstrakte Maschine zMIPS.
Haftungsausschluss: Der Code ist von akademischer Qualität und dient der akademischen Begutachtung und Bewertung durch Fachkollegen. Die Autoren haben den Code mit Ubuntu 20.04
getestet.
Wenn Sie unsere Arbeit nützlich finden, zitieren Sie bitte unsere Veröffentlichung (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
Informationen zu den ZeroJava-Compiler-Abhängigkeiten finden Sie im ZeroJava-Repository.
$ git clone --recursive https://github.com/TrustworthyComputing/Zilch
$ cd Zilch
$ make -j8
$ make zilch-tests -j8
Um die Installation zu überprüfen, geben Sie ./zilch-tests
ein.
$ 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)
Nachfolgend finden Sie Beispiele zur Verwendung der Flags.
Hinweis: Zilch erkennt die privaten und öffentlichen Bänder automatisch, wenn sie sich im selben Verzeichnis wie die zMIPS-Assembly-Datei befinden und die Namen pubtape.txt
und auxtape.txt
haben.
Im Verzeichnis „examples-zmips“ enthalten wir verschiedene zMIPS-Beispiele.
Auf Assembler-Ebene sind unsere Labels alphanumerische Tags, die mit einem doppelten Unterstrich beginnen und enden (z. B. __example_label__
), während diese Labels in Zilch in Anweisungsnummern umgewandelt werden.
Unten finden Sie beispielsweise den zMIPS-Code zur Berechnung der Fakultät von 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
In Macros.json definieren wir benutzerdefinierte Makroanweisungen basierend auf vorhandenen zMIPS-Anweisungen. Beispielsweise haben wir die Makroanweisungen inc
und min
wie folgt definiert:
"inc": {
"reg1": "$x",
"macro": "add $x, $x, 1"
}
Dies bedeutet, dass inc
ein Register verwendet. Ein zMIPS-Programm kann die Inc-Anweisung als verwenden
move $t0, 5
inc $t0
answer $t0
die Antwort wäre 6.
Der min
-Makrobefehl verwendet drei Register und auch Labels:
"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__"
}
Das Primärband ist mit 1, 2, 3, 4, ...
gefüllt, während das Aux-Band 101, 102, 103, 104, ...
enthält.
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
Um das obige Programm auszuführen, führen Sie einfach ./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
aus. ./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
.
Das Standardverhalten (ohne Flags --address
, --verifier
, --prover
) der ausführbaren zilch
Datei führt zu einer lokalen Ausführung. Um die Überprüfung über das Netzwerk zu ermöglichen, sollte zuerst der Verifizierer (Flag --verifier
) und dann der Prüfer (Flag --prover
) ausgeführt werden. Der Verifizierer fungiert als Server, der darauf wartet, dass der Prüfer eine Verbindung herstellt, führt ihn aus, druckt ihn aus und gibt seine Entscheidung an den Prüfer zurück.
Zum Beispiel ein einfaches Beispiel zum Lesen von Bändern über das Netzwerk:
Führen Sie zunächst den Prüfer aus, der Port 2324
überwacht:
./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
Und dann stellt der Prüfer eine Verbindung zu Port 2324
her:
./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