Skip to main content
Version: 1.0.1

@unirep/crypto

Github license NPM version Downloads Linter eslint Code style prettier

🛠 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 idNullifier = identity.identityNullifier

get identity trapdoor

const idTrapdoor = 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 a IncrementalMerkleTree

import { IncrementalMerkleTree } from '@unirep/crypto'

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

Get tree root

const root = 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 = BigInt(0)
// initialize sparse merkle tree with depth 4 and zeroHash 0
const tree = new SparseMerkleTree(
depth,
zeroHash
)

Get tree root

const root = 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(leafKey, 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

import { stringifyBigInts, unstringifyBigInts } from '@unirep/crypto'

const values = {
input1: BigInt(1),
input2: BigInt(2),
input3: BigInt(3),
}
// stringify BigInt elements with stringifyBigInts function
const stringifiedValues = stringifyBigInts(values)
// it can be recoverd by unstringifyBigInts function
const unstringifiedValues = unstringifyBigInts(stringifiedValues)