Skip to content

Latest commit

 

History

History

javascript

Semaphore icon. Semaphore V4 - Javascript Merkle tree

Install

Install the @semaphore-research/merkle-tree package with npm:

npm i @semaphore-research/merkle-tree --save

or yarn:

yarn add @semaphore-research/merkle-tree

Usage

# new IncrementalMerkleTree(hash: HashFunction, leaves?: Node[]): IncrementalMerkleTree

import { IncrementalMerkleTree } from "@semaphore-research/merkle-tree"
import { poseidon2 } from "poseidon-lite/poseidon2"

const hash = (a: Node, b: Node): Node => poseidon2([a, b])
const tree = new IncrementalMerkleTree(hash, [1, 2, 3])

# insert(leaf: Node)

tree.insert(1)

# update(index: number, newLeaf: Node)

tree.update(0, 2)

# delete(index: number)

tree.delete(0)

# indexOf(leaf: Node): number

tree.insert(2)

const index = tree.indexOf(BigInt(2))

console.log(index) // 1

# has(leaf: Node): boolean

console.log(tree.has(2)) // true

# generateProof(index: number): MerkleProof

const proof = tree.generateProof(1)

# verifyProof(proof: MerkleProof): boolean

console.log(tree.verifyProof(proof)) // true

Benchmarks

Benchmarks were run on a Intel Core i7-1165G7, 16 GB RAM machine.

Init (256) Insert (1) Insert (256)* InsertMany (256) Update (1)
Old Mekrle tree 57ms 3.6ms 956ms Not implemented 4ms
New Merkle tree 54ms 1ms 348ms 46ms 3ms

If you want to run the benchmarks yourself install the dependencies with yarn in the javascript folder and then run yarn benchmarks.

For more information about gas savings and Solidity benchmarks read the solidity README.md file.

*The insert function has been executed 256 times as it only takes 1 leaf as a parameter, whereas the insertMany function supports batch insertions and takes a list of leaves as a parameter.