# Merkle Tree > Construct [Merkle Trees](https://en.wikipedia.org/wiki/Merkle_tree) and verify via proofs in JavaScript. # Install ```bash npm install m-tree ``` ## Classes
MerkleTree
## Objects
MerkleTree : object

Class reprensenting a Merkle Tree

## MerkleTree **Kind**: global class * [MerkleTree](#MerkleTree) * [new MerkleTree(leaves, hashAlgorithm, options)](#new_MerkleTree_new) * [.getLeaves()](#MerkleTree+getLeaves) ⇒ Array.<Buffer> * [.getLayers()](#MerkleTree+getLayers) ⇒ Array.<Buffer> * [.getRoot()](#MerkleTree+getRoot) ⇒ Buffer * [.getProof(leaf, [index])](#MerkleTree+getProof) ⇒ Array.<Buffer> * [.verify(proof, targetNode, root)](#MerkleTree+verify) ⇒ Boolean * * * ### new MerkleTree(leaves, hashAlgorithm, options) Constructs a Merkle Tree. All nodes and leaves are stored as Buffers. Lonely leaf nodes are promoted to the next level up without being hashed again. | Param | Type | Description | | --- | --- | --- | | leaves | Array.<Buffer> | Array of hashed leaves. Each leaf must be a Buffer. | | hashAlgorithm | function | Algorithm used for hashing leaves and nodes | | options | Object | Additional options | | options.isBitcoinTree | Boolean | If set to `true`, constructs the Merkle Tree using the [Bitcoin Merkle Tree implementation](http://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html). Enable it when you need to replicate Bitcoin constructed Merkle Trees. | **Example** ```js const MerkleTree = require('m-tree') const crypto = require('crypto') function sha256(data) { // returns Buffer return crypto.createHash('sha256').update(data).digest() } const leaves = ['a', 'b', 'c'].map(x => sha3(x)) const tree = new MerkleTree(leaves, sha256) ``` * * * ### merkleTree.getLeaves() ⇒ Array.<Buffer> Returns array of leaves of Merkle Tree. **Kind**: instance method of [MerkleTree](#MerkleTree) **Example** ```js const leaves = tree.getLeaves() ``` * * * ### merkleTree.getLayers() ⇒ Array.<Buffer> Returns array of all layers of Merkle Tree, including leaves and root. **Kind**: instance method of [MerkleTree](#MerkleTree) **Example** ```js const layers = tree.getLayers() ``` * * * ### merkleTree.getRoot() ⇒ Buffer Returns the Merkle root hash as a Buffer. **Kind**: instance method of [MerkleTree](#MerkleTree) **Example** ```js const root = tree.getRoot() ``` * * * ### merkleTree.getProof(leaf, [index]) ⇒ Array.<Buffer> Returns the proof for a target leaf. **Kind**: instance method of [MerkleTree](#MerkleTree) **Returns**: Array.<Buffer> - - Array of Buffer hashes. | Param | Type | Description | | --- | --- | --- | | leaf | Buffer | Target leaf | | [index] | Number | Target leaf index in leaves array. Use if there are leaves containing duplicate data in order to distinguish it. | **Example** ```js const proof = tree.getProof(leaves[2]) ``` **Example** ```js const leaves = ['a', 'b', 'a'].map(x => sha3(x)) const tree = new MerkleTree(leaves, sha3) const proof = tree.getProof(leaves[2], 2) ``` * * * ### merkleTree.verify(proof, targetNode, root) ⇒ Boolean Returns true if the proof path (array of hashes) can connect the target node to the Merkle root. **Kind**: instance method of [MerkleTree](#MerkleTree) | Param | Type | Description | | --- | --- | --- | | proof | Array.<Buffer> | Array of proof Buffer hashes that should connect target node to Merkle root. | | targetNode | Buffer | Target node Buffer | | root | Buffer | Merkle root Buffer | **Example** ```js const root = tree.getRoot() const proof = tree.getProof(leaves[2]) const verified = tree.verify(proof, leaves[2], root) ``` * * * ## MerkleTree : object Class reprensenting a Merkle Tree **Kind**: global namespace * [MerkleTree](#MerkleTree) : object * [new MerkleTree(leaves, hashAlgorithm, options)](#new_MerkleTree_new) * [.getLeaves()](#MerkleTree+getLeaves) ⇒ Array.<Buffer> * [.getLayers()](#MerkleTree+getLayers) ⇒ Array.<Buffer> * [.getRoot()](#MerkleTree+getRoot) ⇒ Buffer * [.getProof(leaf, [index])](#MerkleTree+getProof) ⇒ Array.<Buffer> * [.verify(proof, targetNode, root)](#MerkleTree+verify) ⇒ Boolean * * * ### new MerkleTree(leaves, hashAlgorithm, options) Constructs a Merkle Tree. All nodes and leaves are stored as Buffers. Lonely leaf nodes are promoted to the next level up without being hashed again. | Param | Type | Description | | --- | --- | --- | | leaves | Array.<Buffer> | Array of hashed leaves. Each leaf must be a Buffer. | | hashAlgorithm | function | Algorithm used for hashing leaves and nodes | | options | Object | Additional options | | options.isBitcoinTree | Boolean | If set to `true`, constructs the Merkle Tree using the [Bitcoin Merkle Tree implementation](http://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html). Enable it when you need to replicate Bitcoin constructed Merkle Trees. | **Example** ```js const MerkleTree = require('m-tree') const crypto = require('crypto') function sha256(data) { // returns Buffer return crypto.createHash('sha256').update(data).digest() } const leaves = ['a', 'b', 'c'].map(x => sha3(x)) const tree = new MerkleTree(leaves, sha256) ``` * * * ### merkleTree.getLeaves() ⇒ Array.<Buffer> Returns array of leaves of Merkle Tree. **Kind**: instance method of [MerkleTree](#MerkleTree) **Example** ```js const leaves = tree.getLeaves() ``` * * * ### merkleTree.getLayers() ⇒ Array.<Buffer> Returns array of all layers of Merkle Tree, including leaves and root. **Kind**: instance method of [MerkleTree](#MerkleTree) **Example** ```js const layers = tree.getLayers() ``` * * * ### merkleTree.getRoot() ⇒ Buffer Returns the Merkle root hash as a Buffer. **Kind**: instance method of [MerkleTree](#MerkleTree) **Example** ```js const root = tree.getRoot() ``` * * * ### merkleTree.getProof(leaf, [index]) ⇒ Array.<Buffer> Returns the proof for a target leaf. **Kind**: instance method of [MerkleTree](#MerkleTree) **Returns**: Array.<Buffer> - - Array of Buffer hashes. | Param | Type | Description | | --- | --- | --- | | leaf | Buffer | Target leaf | | [index] | Number | Target leaf index in leaves array. Use if there are leaves containing duplicate data in order to distinguish it. | **Example** ```js const proof = tree.getProof(leaves[2]) ``` **Example** ```js const leaves = ['a', 'b', 'a'].map(x => sha3(x)) const tree = new MerkleTree(leaves, sha3) const proof = tree.getProof(leaves[2], 2) ``` * * * ### merkleTree.verify(proof, targetNode, root) ⇒ Boolean Returns true if the proof path (array of hashes) can connect the target node to the Merkle root. **Kind**: instance method of [MerkleTree](#MerkleTree) | Param | Type | Description | | --- | --- | --- | | proof | Array.<Buffer> | Array of proof Buffer hashes that should connect target node to Merkle root. | | targetNode | Buffer | Target node Buffer | | root | Buffer | Merkle root Buffer | **Example** ```js const root = tree.getRoot() const proof = tree.getProof(leaves[2]) const verified = tree.verify(proof, leaves[2], root) ``` * * * # Test ```bash npm test ``` # Resources - [Bitcoin mining the hard way: the algorithms, protocols, and bytes](http://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html) - [Bitcoin Talk - Merkle Trees](https://bitcointalk.org/index.php?topic=403231.msg9054025#msg9054025) - [How Log Proofs Work](https://www.certificate-transparency.org/log-proofs-work) - [Raiden Merkle Tree Implemenation](https://github.com/raiden-network/raiden/blob/f9cf12571891cdf54feb4667cd2fffcb3d5daa89/raiden/mtree.py) - [Why aren't Solidity sha3 hashes not matching what other sha3 libraries produce?](https://ethereum.stackexchange.com/questions/559/why-arent-solidity-sha3-hashes-not-matching-what-other-sha3-libraries-produce) # License MIT