# 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
object
Class reprensenting a Merkle Tree
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