75090f50d3 | ||
---|---|---|
diagrams | ||
test | ||
.editorconfig | ||
.gitattributes | ||
.gitignore | ||
LICENSE.md | ||
README.md | ||
index.js | ||
jsdoc.js | ||
package.json |
README.md
Merkle Tree
Construct Merkle Trees and verify via proofs in JavaScript.
Install
npm install m-tree
Classes
Objects
- MerkleTree :
object
Class reprensenting a Merkle Tree
MerkleTree
Kind: global class
- MerkleTree
- new MerkleTree(leaves, hashAlgorithm, options)
- .getLeaves() ⇒
Array.<Buffer>
- .getLayers() ⇒
Array.<Buffer>
- .getRoot() ⇒
Buffer
- .getProof(leaf, [index]) ⇒
Array.<Buffer>
- .verify(proof, targetNode, root) ⇒
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. Enable it when you need to replicate Bitcoin constructed Merkle Trees. |
Example
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
Example
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
Example
const layers = tree.getLayers()
merkleTree.getRoot() ⇒ Buffer
Returns the Merkle root hash as a Buffer.
Kind: instance method of MerkleTree
Example
const root = tree.getRoot()
merkleTree.getProof(leaf, [index]) ⇒ Array.<Buffer>
Returns the proof for a target leaf.
Kind: instance method of 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
const proof = tree.getProof(leaves[2])
Example
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
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
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 :
object
- new MerkleTree(leaves, hashAlgorithm, options)
- .getLeaves() ⇒
Array.<Buffer>
- .getLayers() ⇒
Array.<Buffer>
- .getRoot() ⇒
Buffer
- .getProof(leaf, [index]) ⇒
Array.<Buffer>
- .verify(proof, targetNode, root) ⇒
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. Enable it when you need to replicate Bitcoin constructed Merkle Trees. |
Example
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
Example
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
Example
const layers = tree.getLayers()
merkleTree.getRoot() ⇒ Buffer
Returns the Merkle root hash as a Buffer.
Kind: instance method of MerkleTree
Example
const root = tree.getRoot()
merkleTree.getProof(leaf, [index]) ⇒ Array.<Buffer>
Returns the proof for a target leaf.
Kind: instance method of 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
const proof = tree.getProof(leaves[2])
Example
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
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
const root = tree.getRoot()
const proof = tree.getProof(leaves[2])
const verified = tree.verify(proof, leaves[2], root)
Test
npm test
Resources
-
Bitcoin mining the hard way: the algorithms, protocols, and bytes
-
Why aren't Solidity sha3 hashes not matching what other sha3 libraries produce?
License
MIT