What is merkletreejs?
The merkletreejs package is a JavaScript library for constructing and verifying Merkle Trees. Merkle Trees are a fundamental component in blockchain technology and cryptographic applications, providing a way to efficiently and securely verify the integrity of data. This package allows you to create Merkle Trees, generate proofs, and verify proofs.
What are merkletreejs's main functionalities?
Creating a Merkle Tree
This feature allows you to create a Merkle Tree from an array of data. The example uses the keccak256 hashing algorithm to hash the data and then constructs the tree. The root of the tree is then printed.
const { MerkleTree } = require('merkletreejs');
const keccak256 = require('keccak256');
const leaves = ['a', 'b', 'c'].map(x => keccak256(x));
const tree = new MerkleTree(leaves, keccak256, { sortPairs: true });
const root = tree.getRoot().toString('hex');
console.log(root);
Generating a Proof
This feature allows you to generate a proof for a specific leaf in the Merkle Tree. The proof can be used to verify that the leaf is part of the tree.
const leaf = keccak256('a');
const proof = tree.getProof(leaf);
console.log(proof);
Verifying a Proof
This feature allows you to verify a proof against the root of the Merkle Tree. It checks if the provided leaf and proof match the root, ensuring the integrity of the data.
const isValid = tree.verify(proof, leaf, root);
console.log(isValid);
Other packages similar to merkletreejs
merkletree
The merkletree package is another library for creating and verifying Merkle Trees. It offers similar functionalities to merkletreejs but may have different API conventions and additional features.
merkle-tools
The merkle-tools package provides tools for creating and managing Merkle Trees. It includes functionalities for creating trees, generating proofs, and verifying proofs, similar to merkletreejs. It also offers additional utilities for working with Merkle Trees.
merkle-lib
The merkle-lib package is a lightweight library for creating and verifying Merkle Trees. It focuses on simplicity and ease of use, providing core functionalities similar to merkletreejs.
MerkleTree.js
Construct Merkle Trees and verify proofs in JavaScript.
Contents
Install
From NPM:
npm install merkletreejs
Import as ES6 module
import { MerkleTree } from 'merkletreejs'
Import as CommonJs
const { MerkleTree } = require('merkletreejs')
CDN
Available on jsDelivr CDN:
<script src="https://cdn.jsdelivr.net/npm/merkletreejs@latest/merkletree.js"></script>
The exported classes will be available on window
object, e.g. window.MerkleTree
Example
https://lab.miguelmota.com/merkletreejs
Getting started
Construct tree, generate proof, and verify proof:
const { MerkleTree } = require('merkletreejs')
const SHA256 = require('crypto-js/sha256')
const leaves = ['a', 'b', 'c'].map(x => SHA256(x))
const tree = new MerkleTree(leaves, SHA256)
const root = tree.getRoot().toString('hex')
const leaf = SHA256('a')
const proof = tree.getProof(leaf)
console.log(tree.verify(proof, leaf, root))
const badLeaves = ['a', 'x', 'c'].map(x => SHA256(x))
const badTree = new MerkleTree(badLeaves, SHA256)
const badLeaf = SHA256('x')
const badProof = badTree.getProof(badLeaf)
console.log(badTree.verify(badProof, badLeaf, root))
Print tree to console:
console.log(tree.toString())
Output:
└─ 7075152d03a5cd92104887b476862778ec0c87be5c2fa1c0a90f87c49fad6eff
├─ e5a01fee14e0ed5c48714f22180f25ad8365b53f9779f79dc4a3d7e93963f94a
│ ├─ ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb
│ └─ 3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d
└─ 2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6
└─ 2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6
Diagrams
▾ Visualization of Merkle Tree
▾ Visualization of Merkle Tree Proof
▾ Visualization of Invalid Merkle Tree Proofs
▾ Visualization of Bitcoin Merkle Tree
Documentation
See documentation (under docs/)
Test
npm test
FAQ
-
Q: How do you verify merkle proofs in Solidity?
- A: Check out the example repo merkletreejs-solidity on how to generate merkle proofs with this library and verify them in Solidity.
-
Q: How do you verify merkle multiproofs in Solidity?
-
Q: Is there an NFT whitelist example in Solidity?
- A: Check out the example repo merkletreejs-nft-whitelist on how to generate merkle root of whitelisted accounts and merkle proofs with this library and verify them in Solidity.
-
Q: What other types of merkle trees are supported?
- Besides standard
MerkleTree
, there's also MerkleMountainRange
, MerkleSumTree
, IncrementalMerkleTree
, and MerkleRadixTree
implemenation classes available. For Merkle Patricia Tree, see @ethereumjs/trie
.
-
Q: How do I hash a JSON object?
-
See https://www.npmjs.com/package/json-stable-stringify
for deterministic stringifying of JSON objects.
-
Q: Is there a CLI version of this library?
-
Q: Is there a way to visualize the merkle trees in the browser?
Notes
As is, this implemenation is vulnerable to a second pre-image attack. Use a difference hashing function for leaves and nodes, so that H(x) != H'(x)
.
Also, as is, this implementation is vulnerable to a forgery attack for an unbalanced tree, where the last leaf node can be duplicated to create an artificial balanced tree, resulting in the same Merkle root hash. Do not accept unbalanced tree to prevent this. More info here.
Please use the library @openzeppelin/merkle-tree
if you're integrating with OpenZeppelin contracts or using multiproofs. There are known issues with the current multiproof implementation as pointed out in issues.
Disclaimer
This library was created for my own purposes and is provided as-is. Use at your own risk.
Resources
Contributing
Pull requests are welcome!
For contributions please create a new branch and submit a pull request for review.
Many thanks to all the contributors that made this library better.
License
Released under the MIT license.
© Miguel Mota