Coder Social home page Coder Social logo

trustworthycomputing / zilch Goto Github PK

View Code? Open in Web Editor NEW
48.0 5.0 11.0 27.3 MB

Zilch: A Framework for Developing Zero-Knowledge Proofs for Any Application

License: MIT License

Makefile 0.79% C++ 90.30% Cuda 7.02% Python 0.23% C 1.65%
zero-knowledge zero-knowledge-proofs framework twc trustworthy-computing

zilch's Introduction

The Zilch Framework

A Framework for Deploying Transparent Zero Knowledge Proofs

Overview

Zilch is a framework that implements Scalable and Transparent (no need for trusted setup) ARguments of Knowledge (STARKs). Zilch consists of two main components: a front-end and a back-end.

The front-end consists of the ZeroJava programming language, a subset of Java designed for zero-knowledge arguments, and a compiler for translating the ZeroJava code to zMIPS assembly instructions; zMIPS is our extension to the MIPS ISA to support programming ZKPs.

The back-end translates the zMIPS assembly instructions to arithmetic circuits and generates ZKPs for verifying the evaluation of these circuits. The back-end builds upon the ZKP constructions of the zkSTARK library, and extends the programming model of libSTARK to the zMIPS abstract machine.

Disclaimer: The code is academic grade, meant for academic peer review and evaluation. The authors have tested the code with Ubuntu 20.04.

Cite this work

If you find our work useful, please cite our 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

Compilation

Zilch Dependencies:

For the ZeroJava compiler dependencies refer to the ZeroJava repository.

Build Zilch

$ git clone --recursive https://github.com/TrustworthyComputing/Zilch
$ cd Zilch
$ make -j8
$ make zilch-tests -j8

To verify the installation type ./zilch-tests.

Build the ZeroJava Compiler

$ cd ZeroJava-compiler
$ mvn initialize
$ mvn package

Execution

$ ./zilch --asm <zMIPS assembly file path> [--tsteps <trace length log_2>] [--security <security parameter]> [--pubtape <primaryTapeFile>] [--auxtape <auxTapeFile>] [--verifier | --prover] [--address <address:port_number>]

Command line arguments

--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)

see examples below on how to use the flags.

Note: Zilch automatically detects the private and public tapes if they are in the same directory as the zMIPS assembly file and they are named pubtape.txt and auxtape.txt.

zMIPS examples

In the examples-zmips directory we include various zMIPS examples.

At the assembler level, our labels are alphanumeric tags that begin and end by a double underscore (e.g., __example_label__), while inside Zilch these labels are converted to instruction numbers.

For instance, below is the zMIPS code to compute the factorial of 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

User-defined Macros

In macros.json we define custom macro-instructions based on existing zMIPS instructions. For instance, we have defined inc and min macro-instructions as shown below :

"inc": {
    "reg1": "$x",
    "macro": "add $x, $x, 1"
}

This means that inc uses one register. A zMIPS program can use the inc instruction as

move $t0, 5
inc $t0
answer $t0

the answer would be 6.

The min macro-instruction uses three registers and also 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__"
    }

An example for read instructions:

Primary tape is filled with 1, 2, 3, 4, ..., while aux tape contains 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

In order to execute the above program, simply run ./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.

Over the Network Verification:

The default behavior (without flags --address, --verifier, --prover) of the zilch executable results in a local execution. In order to enable over the network verification first the verifier should be executed (--verifier flag) and then the prover (--prover flag). The verifier acts as a server waiting for the prover to connect, executes and prints and returns its decision to the prover.

For instance, a simple read from tapes example over the network:

First run the verifier listening on 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

And then the prover to connect to 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

Trustworthy Computing Group

zilch's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.