### 7 releases (breaking)

Uses new Rust 2021

0.6.0 | May 27, 2022 |
---|---|

0.5.0 | Nov 5, 2021 |

0.4.1 | Oct 8, 2021 |

0.3.0 | Sep 27, 2021 |

0.1.0 | Sep 9, 2021 |

#**4** in #arkworks

**129** downloads per month

Used in **3** crates

**Apache-2.0**

45KB

856 lines

# schnorr_pok

Schnorr protocol to prove knowledge of 1 or more discrete logs in zero knowledge. Refer this for more details of Schnorr protocol.

We outline the steps here for your convenience, and to make this documentation more succinct.
Prover wants to prove knowledge of

in `x`

(`y = g * x`

`y`

and `g`

are public knowledge)
Step 1: Prover generates randomness `r`

, and sends `t ``=` g `*` r

to Verifier
Step 2: Verifier generates random challenge `c`

and send to Prover
Step 3: Prover produces `s ``=` r `+` x`*`c

, and sends s to Verifier
Step 4: Verifier checks that `g ``*` s `=` `(`y `*` c`)` `+` t

For proving knowledge of multiple messages like

and `x_1`

in `x_2`

:
Step 1: Prover generates randomness `y = g_1*x_1 + g_2*x_2`

`r_1`

and `r_2`

, and sends `t ``=` g_1`*`r_1 `+` g_2`*`r_2

to Verifier
Step 2: Verifier generates random challenge `c`

and send to Prover
Step 3: Prover produces `s_1 ``=` r_1 `+` x_1`*`c

and `s_2 ``=` r_2 `+` x_2`*`c

, and sends `s_1`

and `s_2`

to Verifier
Step 4: Verifier checks that `g_1``*`s_1 `+` g_2`*`s_2 `=` y`*`c `+` t

Above can be generalized to more than 2

s`x`

There is another variant of Schnorr which gives shorter proof but is not implemented yet:

- Prover creates

and then`r`

.`T``=`r`*`G - Prover computes challenge as

.`c``=`Hash`(`G`||`Y`||`T`)` - Prover creates response

and sends`s``=`r`+`c`*`x

and`c`

to the Verifier as proof.`s` - Verifier creates

as`T``'`

and computes`T``'``=`s`*`G`-`c`*`Y

as`c``'``c``'``=`Hash`(`G`||`Y`||`T`'``)` - Proof if valid if
`c``==`c`'`

License: Apache-2.0

#### Dependencies

~5MB

~100K SLoC