Unirep
  • 👏Welcome
  • 🧩Introduction
  • 🎮Getting Started
    • Install & build 🛠
    • Start with cli commands 🔌
      • 0. Install and build
      • 1. Spin up the testing chain
      • 2. Deploy Unirep contract
      • 3. User generates semaphore identity
      • 4. User signs up
      • 5. Attester signs up
      • 6. User generates epoch key and epoch key proof
      • 7. Attesters/Users verify epoch key proof
      • 8. Submit epoch key proof to Unirep smart contract
      • 9. Attester attest to epoch key
      • 10. Epoch transition
      • 11. User state transition
      • 12. User generates reputation proof
      • 13. Attesters/ Users verify the reputation proof
      • 14. User generates sign up proof
      • 15. Attesters/ Users verify the sign up proof
    • Start with Typescript 📠
      • 0. Install packages
      • 1. deploy
      • 2. User signs up
      • 3. Attester signs up
      • 4. Epoch key proof
      • 5. Attest
      • 6. Epoch transition
      • 7. User state transition
      • 8. Reputation proof
    • Computation happens off-chain â„šī¸
  • â˜€ī¸Protocol
    • Glossary
      • Users and Attesters
      • Epoch
      • Epoch Key
      • Reputation
      • Trees
      • Nullifiers
      • Epoch Transition
      • User State Transition
    • Circuits
      • Epoch Key Proof
      • Reputation Proof
      • User Sign Up Proof
      • User State Transition Proof
    • Contract
      • Sign up
      • Attestations
      • Epoch transition
      • User state transition
      • Verify proofs
  • 🌈Package usage
    • @unirep/crypto
    • @unirep/circuits
    • @unirep/contracts
    • @unirep/core
    • @unirep/subgraph
    • cli
      • Deploy Unirep Contract
      • User Identity
      • User Sign Up
      • Epoch Key And Proof
      • Attestation
      • Epoch transition
      • User state transition
      • Reputation Proof
      • Airdrop Reputation
      • Spend Reputation
  • đŸŒģApplications
    • Unirep Social
Powered by GitBook
On this page
  • 🛠 Install
  • 📔 Usage

Was this helpful?

Edit on GitHub
  1. Package usage

@unirep/crypto

Client library for cryptography related functions which are used in UniRep protocol.

PreviousVerify proofsNext@unirep/circuits

Last updated 2 years ago

Was this helpful?

🛠 Install

npm or yarn

Install the @unirep/crypto package with npm:

npm i @unirep/crypto

or yarn:

yarn add @unirep/crypto

📔 Usage

ZkIdentity

Generate a random ZkIdentity

import { ZkIdentity } from '@unirep/crypto'
const identity = new ZkIdentity()

Generate identity commitment

const commitment = identity.genIdentityCommitment()

Get identity nullifier

const commitment = identity.identityNullifier

get identity trapdoor

const commitment = identity.trapdoor

Serialize/ unserialize identity

import { Strategy } from '@unirep/crypto'
// serialize identity
const serializedIdentity = identity.serializeIdentity()
// unserialize identity
const unserializedIdentity = new ZkIdentity(
    Strategy.SERIALIZED,
    serializedIdentity
)

IncrementalMerkleTree

Create an IncrementalMerkleTree

import { IncrementalMerkleTree } from '@unirep/crypto'

const depth = 4
// initialize incremental merkle tree with depth 4
const tree = new IncrementalMerkleTree(depth)

Get tree root

Insert leaf

const leaf = 1
tree.insert(leaf)

Generate merkle proof

const index = 0
const proof = tree.createProof(index)

Verify merkle proof

const isValid = tree.verifyProof(proof)

SparseMerkleTree

Create a SparseMerkleTree

import { SparseMerkleTree } from '@unirep/crypto'

const depth = 4
// initialize incremental merkle tree with depth 4
const zeroHash = 0
// initialize sparse merkle tree with depth 4 and zeroHash 0
const tree = new SparseMerkleTree(
    depth, 
    zeroHash
)

Get tree root

Update leaf

const leafKey = BigInt(3)
const leafValue = BigInt(4)
tree.update(leafKey, leafValue)

Generate merkle proof

const leafKey = Bigint(1)
const proof = tree.createProof(leafKey)

Verify merkle proof

const isValid = tree.verifyProof(proof)

Crypto utils

genRandomSalt

import { genRandomSalt } from '@unirep/crypto'

// generate random BigInt
const salt = genRandomSalt()

hash5

import { hash5 } from '@unirep/crypto'

// poseidon hash 5 BigInt elements
const values = [
    genRandomSalt(),
    genRandomSalt(),
    genRandomSalt(),
    genRandomSalt(),
    genRandomSalt(),
]
const hash5Value = hash5(values)

hashOne

import { hashOne } from '@unirep/crypto'

// poseidon hash 1 BigInt elements
const value = genRandomSalt()
const hashOneValue = hashOne(value)

hashLeftRight

import { hashLeftRight } from '@unirep/crypto'

// poseidon hash 2 BigInt elements
const leftValue = genRandomSalt()
const rightValue = genRandomSalt()
const hash = hashLeftRight(leftValue, rightValue)

stringifyBigInts/unstringifyBigInts

const values = {
    input1: genRandomSalt(),
    input2: genRandomSalt(),
    input3: genRandomSalt(),
}
// stringify BigInt elements with stringifyBigInts function
const stringifiedValues = stringifyBigInts(values)
// it can be recoverd by unstringifyBigInts function
const unstringifiedValues = unstringifyBigInts(stringifiedValues)
🌈
Github license
Downloads
Linter eslint
Code style prettier
NPM version