@unirep/circuits
Version:
Client library for circuit related functions which are used in UniRep protocol.
183 lines (142 loc) • 5.58 kB
Markdown
Client library for circuit related functions which are used in UniRep protocol.
<p align="center">
<a href="https://github.com/unirep/unirep">
<img src="https://img.shields.io/badge/project-unirep-blue.svg?style=flat-square" />
</a>
<a href="https://github.com/unirep/unirep/blob/master/LICENSE">
<img alt="Github license" src="https://img.shields.io/github/license/unirep/unirep.svg?style=flat-square" />
</a>
<a href="https://www.npmjs.com/package/@unirep/circuits">
<img alt="NPM version" src="https://img.shields.io/npm/v/@unirep/circuits?style=flat-square" />
</a>
<a href="https://npmjs.org/package/@unirep/circuits">
<img alt="Downloads" src="https://img.shields.io/npm/dm/@unirep/circuits.svg?style=flat-square" />
</a>
<a href="https://eslint.org/">
<img alt="Linter eslint" src="https://img.shields.io/badge/linter-eslint-8080f2?style=flat-square&logo=eslint" />
</a>
<a href="https://prettier.io/">
<img alt="Code style prettier" src="https://img.shields.io/badge/code%20style-prettier-f8bc45?style=flat-square&logo=prettier" />
</a>
</p>
<div align="center">
<h4>
<a href="https://discord.gg/VzMMDJmYc5">
🤖 Chat & Support
</a>
</h4>
</div>
---
**UniRep** is a *private* and *non-repudiable* **data system**. Users can receive attestations from attesters, and voluntarily prove facts about their data without revealing the data itself. Moreover, users cannot refuse to receive attestations from an attester.
Read the [medium article](https://medium.com/privacy-scaling-explorations/unirep-a-private-and-non-repudiable-reputation-system-7fb5c6478549) to know more about the concept of UniRep protocol.
For more information, refer to the [documentation](https://developer.unirep.io/)
Install the `@unirep/circuits` package with npm:
```bash
npm i @unirep/circuits
```
or yarn:
```bash
yarn add @unirep/circuits
```
**Use default nodejs prover**
```typescript
import { defaultProver } from '@unirep/circuits/provers/defaultProver'
```
**Use web prover**
```typescript
// default web prover from url: https://keys.unirep.io/${version}/.
import prover from '@unirep/circuits/provers/web'
// construct web prover from other url
import { WebProver } from '@unirep/circuits/provers/web'
const prover = new WebProver('https://YOUR/KEYS/URL')
```
**Generate proof and verify it with the above prover**
```typescript
import { Circuit } from '@unirep/circuits'
// See ./test/verifyEpochKey.test.ts for generating circuit inputs
const circuitInputs = {
state_tree_elements: ...,
state_tree_indices: ...,
...
}
const { proof, publicSignals } = await prover.genProofAndPublicSignals(
Circuit.epochKey,
circuitInputs
)
const isValid = await prover.verifyProof(
Circuit.epochKey,
publicSignals,
proof
)
```
Use the unirep [circom](https://docs.circom.io/) circuits like so:
```circom
pragma circom 2.1.0;
include "PATH/TO/node_modules/@unirep/circuits/circuits/epochKey.circom";
template DataProof(STATE_TREE_DEPTH, EPOCH_KEY_NONCE_PER_EPOCH, FIELD_COUNT) {
signal input state_tree_indices[STATE_TREE_DEPTH];
signal input state_tree_elements[STATE_TREE_DEPTH];
signal input identity_secret;
signal input data[FIELD_COUNT];
signal input sig_data;
signal input reveal_nonce;
signal input attester_id;
signal input epoch;
signal input nonce;
signal input chain_id;
signal output epoch_key;
signal output state_tree_root;
signal output control;
(epoch_key, state_tree_root, control) <== EpochKey(STATE_TREE_DEPTH, EPOCH_KEY_NONCE_PER_EPOCH, FIELD_COUNT)(
state_tree_indices,
state_tree_elements,
identity_secret,
reveal_nonce,
attester_id,
epoch,
nonce,
data,
sig_data,
chain_id
);
// add your customized circuits
...
}
```
Proof helpers can help users query the public signals in each proof.
**EpochKeyProof**
```ts
import { EpochKeyProof } from '@unirep/circuits'
const { proof, publicSignals } = await prover.genProofAndPublicSignals(
Circuit.epochKey,
circuitInputs
)
const data = new EpochKeyProof(publicSignals, proof)
const epk = data.epochKey
```
**SignupProof**
```ts
import { SignupProof } from '@unirep/circuits'
const { proof, publicSignals } = await prover.genProofAndPublicSignals(
Circuit.signup,
circuitInputs
)
const data = new SignupProof(publicSignals, proof)
const identityCommitment = data.identityCommitment
```
- Discord server: <a href="https://discord.gg/VzMMDJmYc5"><img src="https://img.shields.io/discord/931582072152281188?label=Discord&style=flat-square&logo=discord" /></a>
- Twitter account: <a href="https://twitter.com/UniRep_Protocol"><img src="https://img.shields.io/twitter/follow/UniRep_Protocol?style=flat-square&logo=twitter" /></a>
- Telegram group: <a href="https://t.me/unirep"><img src="https://img.shields.io/badge/telegram-@unirep-blue.svg?style=flat-square&logo=telegram" /></a>
This project is supported by [Privacy & Scaling Explorations](https://github.com/privacy-scaling-explorations) and the Ethereum Foundation.
See more projects on: https://pse.dev/.