Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
50a725c174 | ||
|
|
c4ce4cd946 | ||
|
|
5bf52cda57 | ||
|
|
95abdd06d5 | ||
|
|
9f69fab7c6 | ||
|
|
109cdf4056 | ||
|
|
97b870b725 |
17
README.md
17
README.md
@@ -1,4 +1,17 @@
|
|||||||
# cirpedersen
|
# CircomLib
|
||||||
|
|
||||||
Pedersen Hash and Exponentiation circuits using Baby Jub Curve in circom language
|
## Description
|
||||||
|
|
||||||
|
- This repository contains a library of circuit templates.
|
||||||
|
- All files are copyrighted under 2018 0KIMS association and part of the free software [circom](https://github.com/iden3/circom) (Zero Knowledge Circuit Compiler).
|
||||||
|
|
||||||
|
## Organisation
|
||||||
|
|
||||||
|
This respository contains 5 folders:
|
||||||
|
- `circuits`: it contains the implementation of different cryptographic primitives in circom language.
|
||||||
|
- `calcpedersenbases`: set of functions in JavaScript used to find a set of points in [Baby Jubjub](https://github.com/barryWhiteHat/baby_jubjub) elliptic curve that serve as basis for the [Pedersen Hash](https://github.com/zcash/zcash/issues/2234).
|
||||||
|
- `doc`: it contains some circuit schemes in ASCII (must be opened with Monodraw, an ASCII art editor for Mac).
|
||||||
|
- `src`: it contains similar implementation of circuits in JavaScript.
|
||||||
|
- `test`: tests.
|
||||||
|
|
||||||
|
A description of the specific circuit templates for the `circuit` folder will be soon updated.
|
||||||
@@ -1,3 +1,19 @@
|
|||||||
|
# CircomLib/Circuits
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
- This folder contains circuit templates for standard operations and many cryptographic primitives.
|
||||||
|
- Below you can find specifications of each function. In the representation of elements, there are three tyes:
|
||||||
|
- Binary
|
||||||
|
- String
|
||||||
|
- Field element (the field is specified in each case. We consider 2 possible fields: Fp and Fr, where p... and r... .)
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
[TOC]
|
||||||
|
|
||||||
|
## Jordi
|
||||||
|
|
||||||
* compconstant - Returns 1 if `in` (expanded to binary array) > `ct`
|
* compconstant - Returns 1 if `in` (expanded to binary array) > `ct`
|
||||||
* aliascheck - check if `in` (expanded to binary array) oveflowed its 254 bits (<= -1)
|
* aliascheck - check if `in` (expanded to binary array) oveflowed its 254 bits (<= -1)
|
||||||
* babyjub - twisted Edwards curve 168700.x^2 + y^2 = 1 + 168696.x^2.y^2
|
* babyjub - twisted Edwards curve 168700.x^2 + y^2 = 1 + 168696.x^2.y^2
|
||||||
@@ -11,4 +27,804 @@
|
|||||||
* zcash/zcash#2233
|
* zcash/zcash#2233
|
||||||
* smt - Sparse Merkle Tree
|
* smt - Sparse Merkle Tree
|
||||||
* https://ethresear.ch/t/optimizing-sparse-merkle-trees/3751
|
* https://ethresear.ch/t/optimizing-sparse-merkle-trees/3751
|
||||||
* montgomery https://en.wikipedia.org/wiki/Montgomery_curve
|
* montgomery https://en.wikipedia.org/wiki/Montgomery_curve
|
||||||
|
|
||||||
|
## Circuits
|
||||||
|
|
||||||
|
### sha256
|
||||||
|
|
||||||
|
Folder containing the implementation of sha256 hash circuit.
|
||||||
|
|
||||||
|
### smt
|
||||||
|
|
||||||
|
Folder containing the circuit implementation of Sparse Merkle Trees.
|
||||||
|
|
||||||
|
### aliascheck
|
||||||
|
|
||||||
|
- `AliasCheck()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### babyjub
|
||||||
|
|
||||||
|
Arithmetic on [Baby Jubjub elliptic curve](https://github.com/barryWhiteHat/baby_jubjub) in twisted Edwards form. (TODO: Expose here the characteristics of the curve?)
|
||||||
|
|
||||||
|
|
||||||
|
- `BabyAdd()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
|
||||||
|
It adds two points on the Baby Jubjub curve. More specifically, given two points P1 = (`x1`, `y1`) and P2 = (`x2`, `y2`) it returns a point P3 = (`xout`, `yout`) such that
|
||||||
|
|
||||||
|
(`xout`, `yout`) = (`x1`,`y1`) + (`x2`,`y2`)
|
||||||
|
= ((`x1y2`+`y1x2`)/(1+`dx1x2y1y2`)),(`y1y2`-`ax1x2`)/(1-`dx1x2y1y2`))
|
||||||
|
|
||||||
|
- SCHEMA
|
||||||
|
```
|
||||||
|
var a var d
|
||||||
|
| |
|
||||||
|
| |
|
||||||
|
______v_________v_______
|
||||||
|
input x1 ----> | |
|
||||||
|
input y1 ----> | BabyAdd() | ----> output xout
|
||||||
|
input x2 ----> | | ----> output yout
|
||||||
|
input y2 ----> |________________________|
|
||||||
|
```
|
||||||
|
|
||||||
|
- INPUTS
|
||||||
|
|
||||||
|
| Input | Representation | Description | |
|
||||||
|
| ------------- | ------------- | ------------- | ------------- |
|
||||||
|
| `x1` | Bigint | Field element of Fp | First coordinate of a point (x1, y1) on E. |
|
||||||
|
| `y1` | Bigint | Field element of Fp | Second coordinate of a point (x1, y1) on E. |
|
||||||
|
| `x2` | Bigint | Field element of Fp | First coordinate of a point (x2, y2) on E. |
|
||||||
|
| `y2` | Bigint | Field element of Fp | Second coordinate of a point (x2, y2) on E. |
|
||||||
|
|
||||||
|
Requirement: at least `x1`!=`x2` or `y1`!=`y2`.
|
||||||
|
|
||||||
|
- OUTPUT
|
||||||
|
|
||||||
|
| Input | Representation | Description | |
|
||||||
|
| ------------- | ------------- | ------------- | ------------- |
|
||||||
|
| `xout` | Bigint | Field element of Fp | First coordinate of the addition point (xout, yout) = (x1, y1) + (x2, y2). |
|
||||||
|
| `yout` | Bigint | Field element of Fp | Second coordinate of the addition point (xout, yout) = (x1, y1) + (x2, y2). |
|
||||||
|
|
||||||
|
- BENCHMARKS (constraints)
|
||||||
|
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `BabyDbl()`
|
||||||
|
- DESCRIPTION : doubles a point (`xout`,`yout`) = 2*(`x`,`y`).
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `BabyCheck()`
|
||||||
|
|
||||||
|
- DESCRIPTION : checks if a given point is in the curve.
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `BabyPbk()`
|
||||||
|
|
||||||
|
- DESCRIPTION: : given a private key, it returns the associated public key.
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
|
||||||
|
### binsub
|
||||||
|
|
||||||
|
- `BinSub(n)`
|
||||||
|
|
||||||
|
- DESCRIPTION: binary substraction.
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### binsum
|
||||||
|
|
||||||
|
- `nbits(a)`
|
||||||
|
|
||||||
|
- DESCRIPTION : binary sum.
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `BinSum(n, ops)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### bitify
|
||||||
|
|
||||||
|
- `Num2Bits()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Num2Bits_strict()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Bits2Num()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Bits2Num_strict()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Num2BitsNeg()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### comparators
|
||||||
|
|
||||||
|
- `IsZero() `
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `IsEqual()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `ForceEqualIfEnabled()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `LessThan()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `GreaterThan()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `GreaterEqThan()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### compconstant
|
||||||
|
|
||||||
|
- `CompConstant(ct)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### eddsa
|
||||||
|
|
||||||
|
Edwards Digital Signature Algorithm in Baby Jubjbub (link a eddsa)
|
||||||
|
|
||||||
|
- `EdDSAVerifier(n)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### eddsamimc
|
||||||
|
|
||||||
|
- `EdDSAMiMCVerifier()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### eddsamimcsponge
|
||||||
|
|
||||||
|
- `EdDSAMiMCSpongeVerifier()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### eddsaposeidon
|
||||||
|
|
||||||
|
- `EdDSAPoseidonVerifier()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### escalarmul
|
||||||
|
|
||||||
|
- `EscalarMulWindow(base, k)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `EscalarMul(n, base)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### escalarmulany
|
||||||
|
|
||||||
|
- `Multiplexor2()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `BitElementMulAny()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `SegmentMulAny(n)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `EscalarMulAny(n)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### escalarmulfix
|
||||||
|
|
||||||
|
- `WindowMulFix()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `SegmentMulFix(nWindows)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `EscalarMulFix(n, BASE)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### escalarmulw4table
|
||||||
|
|
||||||
|
- `pointAdd`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `EscalarMulW4Table`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### gates
|
||||||
|
|
||||||
|
- `XOR`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `AND`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `OR`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `NOT`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `NAND`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `NOR`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `MultiAND`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### mimc
|
||||||
|
|
||||||
|
Implementation of MiMC-7 hash in Fp being... (link to description of the hash)
|
||||||
|
|
||||||
|
- `MiMC7(nrounds)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `MultiMiMC7(nInputs, nRounds)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### mimcsponge
|
||||||
|
|
||||||
|
- `MiMCSponge(nInputs, nRounds, nOutputs)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `MiMCFeistel(nrounds)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### montgomery
|
||||||
|
|
||||||
|
- `Edwards2Montgomery()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Montgomery2Edwards()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `MontgomeryAdd()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `MontgomeryDouble()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### multiplexer
|
||||||
|
|
||||||
|
- `log2(a)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `EscalarProduct(w)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Decoder(w)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Multiplexer(wIn, nIn)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### mux1
|
||||||
|
|
||||||
|
- `MultiMux1(n)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Mux1()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### mux2
|
||||||
|
|
||||||
|
- `MultiMux2(n)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Mux2()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### mux3
|
||||||
|
|
||||||
|
- `MultiMux3(n)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Mux3()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### mux4
|
||||||
|
|
||||||
|
- `MultiMux4(n)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Mux4()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### pedersen_old
|
||||||
|
|
||||||
|
Old version of the Pedersen hash (do not use any
|
||||||
|
more?).
|
||||||
|
|
||||||
|
### pedersen
|
||||||
|
|
||||||
|
- `Window4()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Segment(nWindows)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Pedersen(n)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### pointbits
|
||||||
|
|
||||||
|
- `sqrt(n)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Bits2Point()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Bits2Point_Strict()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Point2Bits`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Point2Bits_Strict`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### poseidon
|
||||||
|
|
||||||
|
Implementation of Poseidon hash function (LINK)
|
||||||
|
|
||||||
|
- `Sigma()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Ark(t, C)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Mix(t, M)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
- `Poseidon(nInputs, t, nRoundsF, nRoundsP)`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### sign
|
||||||
|
|
||||||
|
- `Sign()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|
||||||
|
### switcher
|
||||||
|
|
||||||
|
- `Switcher()`
|
||||||
|
|
||||||
|
- DESCRIPTION
|
||||||
|
- SCHEMA
|
||||||
|
- INPUT
|
||||||
|
- OUTPUT
|
||||||
|
- BENCHMARKS
|
||||||
|
- EXAMPLE
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ template MiMCSponge(nInputs, nRounds, nOutputs) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
outs[0] = S[nInputs - 1].xL_out;
|
outs[0] <== S[nInputs - 1].xL_out;
|
||||||
|
|
||||||
for (var i = 0; i < nOutputs - 1; i++) {
|
for (var i = 0; i < nOutputs - 1; i++) {
|
||||||
S[nInputs + i] = MiMCFeistel(nRounds);
|
S[nInputs + i] = MiMCFeistel(nRounds);
|
||||||
|
|||||||
26
package-lock.json
generated
26
package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "circomlib",
|
"name": "circomlib",
|
||||||
"version": "0.0.17",
|
"version": "0.0.19",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -348,9 +348,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"big-integer": {
|
"big-integer": {
|
||||||
"version": "1.6.44",
|
"version": "1.6.46",
|
||||||
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.44.tgz",
|
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.46.tgz",
|
||||||
"integrity": "sha512-7MzElZPTyJ2fNvBkPxtFQ2fWIkVmuzw41+BZHSzpEq3ymB2MfeKp1+yXl/tS75xCx+WnyV+yb0kp+K1C3UNwmQ=="
|
"integrity": "sha512-Vj2TNtZ8Y0XaL6HCkzJiEqfykjtv/9wVCWIutMe+QVIXLPe2tCLEzULtYvcX9WRtmNIj3Jqi5tNjIsR0N4QOsg=="
|
||||||
},
|
},
|
||||||
"binary-extensions": {
|
"binary-extensions": {
|
||||||
"version": "1.13.1",
|
"version": "1.13.1",
|
||||||
@@ -601,9 +601,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"circom": {
|
"circom": {
|
||||||
"version": "0.0.28",
|
"version": "0.0.34",
|
||||||
"resolved": "https://registry.npmjs.org/circom/-/circom-0.0.28.tgz",
|
"resolved": "https://registry.npmjs.org/circom/-/circom-0.0.34.tgz",
|
||||||
"integrity": "sha512-cYivdFVPUAVsGFgx3/W3BQe50fwiu+w8Mq9rWA/UYLWwjAgY0Ctk+obpxGL5v9ZHJpO6pvmczLnOXmV/KqiB5g==",
|
"integrity": "sha512-R7yNW8PtX2xREtLYWZ/o5cfKHT/qa+CveXsGVAX1ej7mPrTat9mlEMXEy2vX//IuP9/cnYTY/KxJ2SN05PUeGA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"big-integer": "^1.6.32",
|
"big-integer": "^1.6.32",
|
||||||
@@ -3929,9 +3929,9 @@
|
|||||||
"integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
|
"integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
|
||||||
},
|
},
|
||||||
"p-limit": {
|
"p-limit": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
|
||||||
"integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
|
"integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"p-try": "^2.0.0"
|
"p-try": "^2.0.0"
|
||||||
}
|
}
|
||||||
@@ -4703,9 +4703,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"snarkjs": {
|
"snarkjs": {
|
||||||
"version": "0.1.18",
|
"version": "0.1.20",
|
||||||
"resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.1.18.tgz",
|
"resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.1.20.tgz",
|
||||||
"integrity": "sha512-JWZMBvPPIL424+QCY0PtreIiHTRoX4h4qYvKv3nqKPVZl0T7sw3B/ZeizrCVRz7Jr9vrwZxmzJ0XIg6D1yC8Mg==",
|
"integrity": "sha512-tYmWiVm1sZiB44aIh5w/3HUaTntTUC4fv+CWs4rR0gfkt2KbHTpArOqZW++/Lxujrn9IypXVhdKVUr/eE6Hxfg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"big-integer": "^1.6.43",
|
"big-integer": "^1.6.43",
|
||||||
"chai": "^4.2.0",
|
"chai": "^4.2.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "circomlib",
|
"name": "circomlib",
|
||||||
"version": "0.0.17",
|
"version": "0.0.19",
|
||||||
"description": "Basic circuits library for Circom",
|
"description": "Basic circuits library for Circom",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
"web3": "^1.0.0-beta.55"
|
"web3": "^1.0.0-beta.55"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"circom": "0.0.32",
|
"circom": "0.0.34",
|
||||||
"eslint-plugin-mocha": "^5.2.0",
|
"eslint-plugin-mocha": "^5.2.0",
|
||||||
"ganache-cli": "^6.4.4",
|
"ganache-cli": "^6.4.4",
|
||||||
"mocha": "^5.2.0"
|
"mocha": "^5.2.0"
|
||||||
|
|||||||
@@ -27,6 +27,14 @@ class SMTMemDb {
|
|||||||
return this.nodes[keyS];
|
return this.nodes[keyS];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async multiGet(keys) {
|
||||||
|
const promises = [];
|
||||||
|
for (let i=0; i<keys.length; i++) {
|
||||||
|
promises.push(this.get(keys[i]));
|
||||||
|
}
|
||||||
|
return await Promise.all(promises);
|
||||||
|
}
|
||||||
|
|
||||||
async setRoot(rt) {
|
async setRoot(rt) {
|
||||||
this.root = rt;
|
this.root = rt;
|
||||||
}
|
}
|
||||||
|
|||||||
23
test/rawsmt3.circom
Normal file
23
test/rawsmt3.circom
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
|
||||||
|
include "../circuits/smt/smtverifier.circom";
|
||||||
|
template SMT(nLevels) {
|
||||||
|
signal input root;
|
||||||
|
signal input mtp[nLevels];
|
||||||
|
signal input hi;
|
||||||
|
signal input hv;
|
||||||
|
|
||||||
|
component smtClaimExists = SMTVerifier(nLevels);
|
||||||
|
smtClaimExists.enabled <== 1;
|
||||||
|
smtClaimExists.fnc <== 0;
|
||||||
|
smtClaimExists.root <== root;
|
||||||
|
for (var i=0; i<nLevels; i++) {
|
||||||
|
smtClaimExists.siblings[i] <== mtp[i];
|
||||||
|
}
|
||||||
|
smtClaimExists.oldKey <== 0;
|
||||||
|
smtClaimExists.oldValue <== 0;
|
||||||
|
smtClaimExists.isOld0 <== 0;
|
||||||
|
|
||||||
|
smtClaimExists.key <== hi;
|
||||||
|
smtClaimExists.value <== hv;
|
||||||
|
}
|
||||||
|
component main = SMT(4);
|
||||||
@@ -111,5 +111,28 @@ describe("SMT test", function () {
|
|||||||
assert(circuit.checkWitness(w));
|
assert(circuit.checkWitness(w));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("Check inclussion Adria case", async () => {
|
||||||
|
const e1_hi= bigInt("17124152697573569611556136390143205198134245887034837071647643529178599000839");
|
||||||
|
const e1_hv= bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179");
|
||||||
|
|
||||||
|
const e2ok_hi= bigInt("16498254692537945203721083102154618658340563351558973077349594629411025251262");
|
||||||
|
const e2ok_hv= bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179");
|
||||||
|
|
||||||
|
const e2fail_hi= bigInt("17195092312975762537892237130737365903429674363577646686847513978084990105579");
|
||||||
|
const e2fail_hv= bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179");
|
||||||
|
|
||||||
|
const tree1 = await smt.newMemEmptyTrie();
|
||||||
|
await tree1.insert(e1_hi,e1_hv);
|
||||||
|
await tree1.insert(e2ok_hi,e2ok_hv);
|
||||||
|
|
||||||
|
await testInclusion(tree1, e2ok_hi, circuit);
|
||||||
|
|
||||||
|
const tree2 = await smt.newMemEmptyTrie();
|
||||||
|
await tree2.insert(e1_hi,e1_hv);
|
||||||
|
await tree2.insert(e2fail_hi,e2fail_hv);
|
||||||
|
|
||||||
|
await testInclusion(tree2, e2fail_hi, circuit);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
98
test/smtverifier_adria.js
Normal file
98
test/smtverifier_adria.js
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
const path = require("path");
|
||||||
|
const snarkjs = require("snarkjs");
|
||||||
|
const compiler = require("circom");
|
||||||
|
const fs = require("fs")
|
||||||
|
|
||||||
|
const bigInt = snarkjs.bigInt;
|
||||||
|
const smt = require("../src/smt.js");
|
||||||
|
|
||||||
|
const circuitSource = `
|
||||||
|
include "../circuits/smt/smtverifier.circom";
|
||||||
|
template SMT(nLevels) {
|
||||||
|
signal input root;
|
||||||
|
signal input mtp[nLevels];
|
||||||
|
signal input hi;
|
||||||
|
signal input hv;
|
||||||
|
|
||||||
|
component smtClaimExists = SMTVerifier(nLevels);
|
||||||
|
smtClaimExists.enabled <== 1;
|
||||||
|
smtClaimExists.fnc <== 0;
|
||||||
|
smtClaimExists.root <== root;
|
||||||
|
for (var i=0; i<nLevels; i++) {
|
||||||
|
smtClaimExists.siblings[i] <== mtp[i];
|
||||||
|
}
|
||||||
|
smtClaimExists.oldKey <== 0;
|
||||||
|
smtClaimExists.oldValue <== 0;
|
||||||
|
smtClaimExists.isOld0 <== 0;
|
||||||
|
|
||||||
|
smtClaimExists.key <== hi;
|
||||||
|
smtClaimExists.value <== hv;
|
||||||
|
}
|
||||||
|
component main = SMT(4);
|
||||||
|
`;
|
||||||
|
|
||||||
|
describe("smt3test", function () {
|
||||||
|
this.timeout(200000);
|
||||||
|
|
||||||
|
let circuitFileName;
|
||||||
|
|
||||||
|
before( async () => {
|
||||||
|
circuitFileName = path.join(__dirname, ".", "rawsmt3.circom");
|
||||||
|
fs.writeFileSync(circuitFileName,circuitSource);
|
||||||
|
});
|
||||||
|
|
||||||
|
const levels = 4;
|
||||||
|
async function testsmt3(e1, e2) {
|
||||||
|
let tree = await smt.newMemEmptyTrie();
|
||||||
|
|
||||||
|
// insert e1, e2
|
||||||
|
await tree.insert(e1.hi, e1.hv);
|
||||||
|
await tree.insert(e2.hi, e2.hv);
|
||||||
|
|
||||||
|
// generate proof for e1
|
||||||
|
const findInfo = await tree.find(e1.hi);
|
||||||
|
const siblings = findInfo.siblings;
|
||||||
|
while (siblings.length < levels) siblings.push(bigInt(0));
|
||||||
|
|
||||||
|
const input = {
|
||||||
|
root: tree.root,
|
||||||
|
mtp: siblings,
|
||||||
|
hi: e1.hi,
|
||||||
|
hv: e1.hv,
|
||||||
|
};
|
||||||
|
|
||||||
|
const compiledCircuit = await compiler(
|
||||||
|
circuitFileName,
|
||||||
|
{ reduceConstraints: false }
|
||||||
|
);
|
||||||
|
|
||||||
|
const circuit = new snarkjs.Circuit(compiledCircuit);
|
||||||
|
const witness = circuit.calculateWitness(input);
|
||||||
|
circuit.checkWitness(witness);
|
||||||
|
}
|
||||||
|
|
||||||
|
it("TestSmts", async () => {
|
||||||
|
|
||||||
|
const e1 = {
|
||||||
|
hi: bigInt("17124152697573569611556136390143205198134245887034837071647643529178599000839"),
|
||||||
|
hv: bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179"),
|
||||||
|
};
|
||||||
|
|
||||||
|
const e2ok = {
|
||||||
|
hi: bigInt("16498254692537945203721083102154618658340563351558973077349594629411025251262"),
|
||||||
|
hv: bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179"),
|
||||||
|
};
|
||||||
|
|
||||||
|
const e2fail = {
|
||||||
|
hi: bigInt("17195092312975762537892237130737365903429674363577646686847513978084990105579"),
|
||||||
|
hv: bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179"),
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log("test e1, e2ok");
|
||||||
|
await testsmt3(e1, e2ok);
|
||||||
|
|
||||||
|
console.log("test e1, e2fail");
|
||||||
|
await testsmt3(e1, e2fail);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
Reference in New Issue
Block a user