From b66388ca395941138f1b3b8ef7503d6b635d4013 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 8 Apr 2024 20:53:16 +0200 Subject: [PATCH] docs: add README file --- README.md | 173 +++++++++++++++++++++++++++++++++++++++++++-- circuit-layout.png | Bin 29848 -> 25921 bytes 2 files changed, 169 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e438dbd..c47df53 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,173 @@ This project is a very simple example implementation of a **zk-SNARK** circuit w ## Goal In simple words, **Alice** wants to _convince_ **Bob**: -- that she _knows_ a **number** (which can be represented with `8` digits). -- that the **sum of the digits** is equal to a public **number**. -- but she _does not reveal_ such a number to **Bob**. -- and the proof she provides is _succinct_. +- that she _knows_ a **number** she _does not want to reveal_ to **Bob** (and which can be represented with `8` digits). +- that the **sum of the digits** of this number is equal to another public **number** that **Bob** knows. + +```mermaid +sequenceDiagram + actor Alice + actor Bob + Bob->>Alice: Do you know a number which sum of digits is X? + Alice->>Bob: Yes! And here is a zero-knowledge proof (i.e. I will keep this number secret). + Bob->>Alice: Thanks! I am convinced by your proof (if proof is valid). + Bob-->>Alice: Sorry! I am not convinced by your proof (if proof is invalid) +``` + +## Pre-requisites + +- Have a [correctly configured](https://www.rust-lang.org/learn/get-started) Rust toolchain (latest stable version, at least `1.77`). + +## Build the CLI + +### Download source + +```bash +$ git clone https://github.com/jpraynaud/halo2-digitsum +$ cd halo2-digitsum +``` + +### Run the tests + +```bash +$ make test +``` + +### Build the documentation + +```bash +$ make doc +``` + +### Build the binary + +Compile the binary + +```bash +$ make build +``` + +### Available commands + +```bash +$ ./digitsum --help +This program proves and verifies the computation of the sum of the digits of a number. + +Usage: digitsum [OPTIONS] + +Commands: + prove Run the prover for the digit sum circuit + verify Run the verifier for the digit sum circuit + graph Run the graph exporter for the digit sum circuit + help Print this message or the help of the given subcommand(s) + +Options: + -v, --verbose... Verbosity level (-v=warning, -vv=info, -vvv=debug) + -h, --help Print help + -V, --version Print version +``` + +Here are the available commands: + +| Command | Performed action | +|------------|------------------| +| **prove** | Run the prover for the digit sum circuit | +| **verify** | Run the verifier for the digit sum circuit | +| **graph** | Run the graph exporter for the digit sum circuit | + +#### `prove` command + +```bash +$ ./digitsum prove --help +Run the prover for the digit sum circuit + +Usage: digitsum prove [OPTIONS] --witness --statement + +Options: + -w, --witness + Secret number that Alice knows (a.k.a. the witness) + -s, --statement + Public number that Bob knows and which represents the sum of the digits of the witness (a.k.a. the statement) + --proof-file-name + Proof export filename [default: proof.hex] + --proof-export-dir + Proof export directory [default: ./] + -h, --help + Print help +``` + +#### `verify` command + +```bash +$ ./digitsum verify --help +Run the verifier for the digit sum circuit + +Usage: digitsum verify [OPTIONS] --statement + +Options: + -s, --statement + Public number that Bob knows and which represents the sum of the digits of the witness (a.k.a. the statement) + --proof-file-name + Proof import filename [default: proof.hex] + --proof-import-dir + Proof import directory [default: ./] + -h, --help + Print help +``` + +#### `graph` command + +```bash +$ ./digitsum graph --help +Run the graph exporter for the digit sum circuit + +Usage: digitsum graph [OPTIONS] + +Options: + --graph-file-name + Circuit layout export filename [default: circuit-layout.png] + --graph-export-dir + Circuit layout export directory [default: ./] + --graph-with-labels + Circuit layout with labels + --graph-width + Circuit layout width [default: 1024] + --graph-height + Circuit layout height [default: 768] + -h, --help + Print help +``` + +### Run the protocol + +#### Create a proof + +Create a proof with the `prove` sub-command: + +```bash +$ ./digitsum prove --witness 123 --statement 6 --proof-file-name proof.hex +>> Proof generated to "./proof.hex" +``` + +#### Verify a proof + +Verify a proof with the `verify` sub-command: + +```bash +$ ./digitsum verify --statement 6 --proof-file-name proof.hex +>> Proof verified! +``` + +#### Generate the circuit layout + +Generate the layout of the circuit with the `graph` sub-command: + +```bash +$ ./digitsum graph --graph-file-name circuit-layout.png +>> Circuit layout generated to "./circuit-layout.png" +``` + +And visualize the rendered circuit layout: +[![Circuit Layout](circuit-layout.png)](circuit-layout.png) + diff --git a/circuit-layout.png b/circuit-layout.png index abd9922594443b755cf0264665f7c955e516f23c..10aeb7419fe9027884696ef48d19809fe8eae63c 100644 GIT binary patch literal 25921 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