Zilch est un framework qui implémente des ARguments of Knowledge (STARK) évolutifs et transparents (pas besoin de configuration fiable). Zilch se compose de deux composants principaux : un front-end et un back-end.
Le frontal se compose du langage de programmation ZeroJava, un sous-ensemble de Java conçu pour les arguments sans connaissance, et d'un compilateur pour traduire le code ZeroJava en instructions d'assemblage zMIPS ; zMIPS est notre extension du MIPS ISA pour prendre en charge la programmation des ZKP.
Le back-end traduit les instructions d'assemblage zMIPS en circuits arithmétiques et génère des ZKP pour vérifier l'évaluation de ces circuits. Le back-end s'appuie sur les constructions ZKP de la bibliothèque zkSTARK et étend le modèle de programmation de libSTARK à la machine abstraite zMIPS.
Avis de non-responsabilité : le code est de qualité académique , destiné à l'examen et à l'évaluation par les pairs académiques. Les auteurs ont testé le code avec Ubuntu 20.04
.
Si vous trouvez notre travail utile, veuillez citer notre publication (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
Pour les dépendances du compilateur ZeroJava, reportez-vous au référentiel ZeroJava.
$ git clone --recursive https://github.com/TrustworthyComputing/Zilch
$ cd Zilch
$ make -j8
$ make zilch-tests -j8
Pour vérifier l'installation, tapez ./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)
voir les exemples ci-dessous sur la façon d'utiliser les drapeaux.
Remarque : Zilch détecte automatiquement les bandes privées et publiques si elles se trouvent dans le même répertoire que le fichier d'assemblage zMIPS et si elles sont nommées pubtape.txt
et auxtape.txt
.
Dans le répertoire examples-zmips, nous incluons divers exemples zMIPS.
Au niveau assembleur, nos étiquettes sont des balises alphanumériques qui commencent et se terminent par un double trait de soulignement (par exemple, __example_label__
), tandis qu'à l'intérieur de Zilch, ces étiquettes sont converties en numéros d'instructions.
Par exemple, vous trouverez ci-dessous le code zMIPS pour calculer la factorielle de 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
Dans macros.json, nous définissons des macro-instructions personnalisées basées sur les instructions zMIPS existantes. Par exemple, nous avons défini les macro-instructions inc
et min
comme indiqué ci-dessous :
"inc": {
"reg1": "$x",
"macro": "add $x, $x, 1"
}
Cela signifie que inc
utilise un seul registre. Un programme zMIPS peut utiliser l'instruction inc comme
move $t0, 5
inc $t0
answer $t0
la réponse serait 6.
La macro-instruction min
utilise trois registres et également des étiquettes :
"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__"
}
La bande primaire est remplie de 1, 2, 3, 4, ...
, tandis que la bande auxiliaire contient 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
Pour exécuter le programme ci-dessus, exécutez simplement ./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
.
Le comportement par défaut (sans les indicateurs --address
, --verifier
, --prover
) de l'exécutable zilch
entraîne une exécution locale. Afin d'activer la vérification sur le réseau, le vérificateur doit d'abord être exécuté (indicateur --verifier
), puis le prouveur (indicateur --prover
). Le vérificateur agit comme un serveur attendant que le prouveur se connecte, exécute, imprime et renvoie sa décision au prouveur.
Par exemple, un simple exemple de lecture à partir de bandes sur le réseau :
Exécutez d’abord le vérificateur en écoute sur le port 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
Et puis le prouveur pour se connecter au port 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