Builds a Merkle tree using either sha512, sha256, ripemd160, whirlpool, sha1, md5 or none algorithms.
Usage
Build a Merkle tree
var merkle = ;var abcde = 'a' 'b' 'c' 'd' 'e';
Sync style
var tree = ;
Async style
;
Stream style
// Stream style -- streams root hashvar merkleStreamRoot = ;merkleStreamRoot; // Stream style -- streams json treevar es = ;var merkleStreamJson = ;merkleStreamJson ; abcde; merkleStreamJson; // out:// {"root":"114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9","depth":3,"levels":4,"nodes":6}
Working ONLY with lowercase
For historical reasons, hashes were systematically uppercased which could lead to wrong trees (see issue #8).
We've added an extra parameter to avoid this case alteration, so you can work exclusively with lowercase hashes:
var use_uppercase = false;
merkle('sha256', use_uppercase);
We plan to remove this syntax for v1.0.0 and always use lowercase hashes.
Extract tree data
You can get tree root using:
> tree;'114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9'
Get tree depth:
> tree;3
Get tree number of levels (depth + level of leaves):
> tree;4
Get tree number of nodes
> tree;6
Get a tree level nodes:
> tree;'114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9' > tree; '585DD1B0A3A55D9A36DE747EC37524D318E2EBEE' '58E6B3A414A1E090DFC6029ADD0F3555CCBA127F' > tree; 'F4D9EEA3797499E52CC2561F722F935F10365E40' '734F7A56211B581395CB40129D307A0717538088' '58E6B3A414A1E090DFC6029ADD0F3555CCBA127F' ...
Using different hash algorithms
var sha256tree= ;var sha1tree = ;var md5tree = ;var cleartree = ; > sha256tree;'16E6BEB3E080910740A2923D6091618CAA9968AEAD8A52D187D725D199548E2C' > sha1tree;'114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9' > md5tree;'064705BD78652C090975702C9E02E229' > cleartree;'ABCDE'
Install globally for merkle command
Installing it globally will introduce the merkle
command (using sha1 as default):
$ sudo npm install -g merkle$ merkle a86F7E437FAA5A7FCE15D1DDCB9EAEAEA377667B8
By default, merkle
returns the root of the merkle tree:
$ merkle a b c d e114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9
But it can be asked for some level:
$ merkle a b c d e -l 0114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9 $ merkle a b c d e -l 1585DD1B0A3A55D9A36DE747EC37524D318E2EBEE58E6B3A414A1E090DFC6029ADD0F3555CCBA127F
Or even all levels:
merkle a b c d e --all114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9 585DD1B0A3A55D9A36DE747EC37524D318E2EBEE58E6B3A414A1E090DFC6029ADD0F3555CCBA127F F4D9EEA3797499E52CC2561F722F935F10365E40734F7A56211B581395CB40129D307A071753808858E6B3A414A1E090DFC6029ADD0F3555CCBA127F 86F7E437FAA5A7FCE15D1DDCB9EAEAEA377667B8E9D71F5EE7C92D6DC9E92FFDAD17B8BD49418F9884A516841BA77A5B4648DE2CD0DFCB30EA46DBB43C363836CF4E16666669A25DA280A1865C2D287458E6B3A414A1E090DFC6029ADD0F3555CCBA127F
You can also change of hash algorithm:
$ merkle a b c d e -h md5064705BD78652C090975702C9E02E229 $ merkle a b c d e -h clearABCDE
And just extract some computation statistics:
$ merkle a b c d e --count4=> Total number of levels $ merkle a b c d e --nodes6=> Total number of nodes
Finally, you can ask for help:
$ merkle --helpBuild a Merkle Tree and prints its values.Usage: merkle [leaf...] Options: --version Prints version --help Prints help -l, --level Prints values of the given level. Defaults to 0 . -n, --nodes Prints the number of nodes
Concepts
Here is an example of Merkle tree with 5 leaves (taken from Tree Hash EXchange format (THEX)):
ROOT=H(H+E)
/ \
/ \
H=H(F+G) E
/ \ \
/ \ \
F=H(A+B) G=H(C+D) E
/ \ / \ \
/ \ / \ \
A B C D E
Note: H() is some hash function
Where A,B,C,D,E may be already hashed data. If not, those leaves are turned into hashed data (using either sha1, md5 or clear algorithm).
With such a tree structure, merkle considers the tree has exactly 6 nodes: [ROOT,H,E,F,G,E]
. For a given level, nodes are just an array.
Adding a Z
value would alter the E
branch of the tree:
ROOT'=H(H+E')
/ \
/ \
H=H(F+G) E'
/ \ \
/ \ \
F=H(A+B) G=H(C+D) E'=H(E+Z)
/ \ / \ / \
/ \ / \ / \
A B C D E Z
ROOT
changed to ROOT'
, E
to E'
, but H
did not.
License
This software is provided under MIT license.