{"id":28316702,"url":"https://github.com/c-geek/merkle","last_synced_at":"2025-06-24T06:30:54.946Z","repository":{"id":9742572,"uuid":"11704615","full_name":"c-geek/merkle","owner":"c-geek","description":"Node.js module implementing Merkle tree algorithm","archived":false,"fork":false,"pushed_at":"2016-03-22T13:57:22.000Z","size":39,"stargazers_count":125,"open_issues_count":3,"forks_count":32,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-06-01T12:03:33.591Z","etag":null,"topics":["crypto","hash","md5","merkle","ripemd160","sha1","sha256","sha512","tree","whirlpool"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/c-geek.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-07-27T12:29:35.000Z","updated_at":"2024-10-07T06:39:42.000Z","dependencies_parsed_at":"2022-07-08T06:38:36.506Z","dependency_job_id":null,"html_url":"https://github.com/c-geek/merkle","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/c-geek/merkle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c-geek%2Fmerkle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c-geek%2Fmerkle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c-geek%2Fmerkle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c-geek%2Fmerkle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/c-geek","download_url":"https://codeload.github.com/c-geek/merkle/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c-geek%2Fmerkle/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261620085,"owners_count":23185456,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crypto","hash","md5","merkle","ripemd160","sha1","sha256","sha512","tree","whirlpool"],"created_at":"2025-05-25T02:12:42.529Z","updated_at":"2025-06-24T06:30:54.934Z","avatar_url":"https://github.com/c-geek.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Merkle [![Build Status](https://api.travis-ci.org/c-geek/merkle.png)](https://travis-ci.org/c-geek/merkle) [![NPM version](https://badge.fury.io/js/merkle.svg)](http://badge.fury.io/js/merkle) [![Licence](http://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/c-geek/merkle/blob/master/LICENSE)\n\nBuilds a Merkle tree using either sha512, sha256, ripemd160, whirlpool, sha1, md5 or none algorithms.\n\n## Usage\n\n### Build a Merkle tree\n```js\nvar merkle = require('merkle');\nvar abcde = ['a', 'b', 'c', 'd', 'e'];\n```\n\n#### Sync style\n\n```js\nvar tree = merkle('sha1').sync(abcde);\n```\n\n#### Async style\n```js\nmerkle('sha1').async(abcde, function(err, tree){\n  // ...\n});\n```\n\n#### Stream style\n```js\n// Stream style -- streams root hash\nvar merkleStreamRoot = merkle('sha1');\nmerkleStreamRoot.pipe(process.stdout);\n\n// Stream style -- streams json tree\nvar es = require('event-stream');\nvar merkleStreamJson = merkle('sha1').json();\nmerkleStreamJson\n  .pipe(es.stringify())\n  .pipe(process.stdout);\n\nabcde.forEach(function(letter){\n    merkleStreamJson.write(letter);\n});\n\nmerkleStreamJson.end();\n\n// out:\n// {\"root\":\"114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9\",\"depth\":3,\"levels\":4,\"nodes\":6}\n\n```\n\n### Working ONLY with lowercase\n\nFor historical reasons, hashes were systematically uppercased which could lead to wrong trees (see issue [#8](https://github.com/c-geek/merkle/issues/8)).\n\nWe've added an extra parameter to avoid this case alteration, so you can work exclusively with lowercase hashes:\n\n```\nvar use_uppercase = false;\nmerkle('sha256', use_uppercase);\n```\n\n\u003e We plan to remove this syntax for v1.0.0 and always use lowercase hashes.\n\n### Extract tree data\n\nYou can get tree root using:\n\n```js\n\u003e tree.root();\n'114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9'\n```\n\nGet tree depth:\n\n```js\n\u003e tree.depth();\n3\n```\n\nGet tree number of levels (depth + level of leaves):\n```js\n\u003e tree.levels();\n4\n```\n\nGet tree number of nodes\n\n```js\n\u003e tree.nodes();\n6\n```\n\nGet a tree level nodes:\n\n```js\n\u003e tree.level(0);\n['114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9']\n\n\u003e tree.level(1);\n[\n  '585DD1B0A3A55D9A36DE747EC37524D318E2EBEE',\n  '58E6B3A414A1E090DFC6029ADD0F3555CCBA127F'\n]\n\n\u003e tree.level(2);\n[\n  'F4D9EEA3797499E52CC2561F722F935F10365E40',\n  '734F7A56211B581395CB40129D307A0717538088',\n  '58E6B3A414A1E090DFC6029ADD0F3555CCBA127F'\n]\n\n...\n```\n\n### Using different hash algorithms\n\n```js\nvar sha256tree= merkle('sha256').sync(abcde);\nvar sha1tree  = merkle('sha1').sync(abcde);\nvar md5tree   = merkle('md5').sync(abcde);\nvar cleartree = merkle('none').sync(abcde);\n\n\u003e sha256tree.root();\n'16E6BEB3E080910740A2923D6091618CAA9968AEAD8A52D187D725D199548E2C'\n\n\u003e sha1tree.root();\n'114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9'\n\n\u003e md5tree.root();\n'064705BD78652C090975702C9E02E229'\n\n\u003e cleartree.root();\n'ABCDE'\n```\n\n### Install globally for merkle command\n\nInstalling it globally will introduce the `merkle` command (using sha1 as default):\n\n```bash\n$ sudo npm install -g merkle\n$ merkle a\n86F7E437FAA5A7FCE15D1DDCB9EAEAEA377667B8\n```\n\nBy default, `merkle` returns the root of the merkle tree:\n\n```bash\n$ merkle a b c d e\n114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9\n```\n\nBut it can be asked for some level:\n\n```bash\n$ merkle a b c d e -l 0\n114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9\n\n$ merkle a b c d e -l 1\n585DD1B0A3A55D9A36DE747EC37524D318E2EBEE\n58E6B3A414A1E090DFC6029ADD0F3555CCBA127F\n```\n\nOr even all levels:\n\n```bash\nmerkle a b c d e --all\n114B6E61CB5BB93D862CA3C1DFA8B99E313E66E9\n\n585DD1B0A3A55D9A36DE747EC37524D318E2EBEE\n58E6B3A414A1E090DFC6029ADD0F3555CCBA127F\n\nF4D9EEA3797499E52CC2561F722F935F10365E40\n734F7A56211B581395CB40129D307A0717538088\n58E6B3A414A1E090DFC6029ADD0F3555CCBA127F\n\n86F7E437FAA5A7FCE15D1DDCB9EAEAEA377667B8\nE9D71F5EE7C92D6DC9E92FFDAD17B8BD49418F98\n84A516841BA77A5B4648DE2CD0DFCB30EA46DBB4\n3C363836CF4E16666669A25DA280A1865C2D2874\n58E6B3A414A1E090DFC6029ADD0F3555CCBA127F\n```\n\nYou can also change of hash algorithm:\n\n```bash\n$ merkle a b c d e -h md5\n064705BD78652C090975702C9E02E229\n\n$ merkle a b c d e -h clear\nABCDE\n```\n\nAnd just extract some computation statistics:\n\n```bash\n$ merkle a b c d e --count\n4\n=\u003e Total number of levels\n\n$ merkle a b c d e --nodes\n6\n=\u003e Total number of nodes\n```\n\nFinally, you can ask for help:\n\n```bash\n$ merkle --help\nBuild a Merkle Tree and prints its values.\nUsage: merkle [leaf...]\n\nOptions:\n  --version    Prints version\n  --help       Prints help\n  -l, --level  Prints values of the given level. Defaults to 0 (root).\n  -n, --nodes  Prints the number of nodes for the given leaves.\n  -c, --count  Prints the number of levels for the given leaves.\n  -h, --hash   Hash algorithm to apply on leaves. Values are 'sha1', 'md5' or 'none'.\n  -a, --all    Prints all levels of Merkle tree, from leaves to root.\n  --level                                                                              [default: 0]\n  --hash                                                                               [default: \"sha1\"]\n```\n\n## Concepts\n\nHere is an example of Merkle tree with 5 leaves (taken from [Tree Hash EXchange format (THEX)](http://web.archive.org/web/20080316033726/http://www.open-content.net/specs/draft-jchapweske-thex-02.html)):\n\n                       ROOT=H(H+E)\n                        /        \\\n                       /          \\\n                 H=H(F+G)          E\n                /       \\           \\\n               /         \\           \\\n        F=H(A+B)         G=H(C+D)     E\n        /     \\           /     \\      \\\n       /       \\         /       \\      \\\n      A         B       C         D      E\n\n\n    Note: H() is some hash function\n\nWhere 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).\n\nWith 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.\n\nAdding a `Z` value would alter the `E` branch of the tree:\n\n                        ROOT'=H(H+E')\n                        /            \\\n                       /              \\\n                 H=H(F+G)              E'\n                /       \\               \\\n               /         \\               \\\n        F=H(A+B)          G=H(C+D)       E'=H(E+Z)\n        /     \\           /     \\         /     \\\n       /       \\         /       \\       /       \\\n      A         B       C         D     E         Z\n\n`ROOT` changed to `ROOT'`, `E` to `E'`, but `H` did not.\n\n# License\n\nThis software is provided under [MIT license](https://raw.github.com/c-geek/merkle/master/LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fc-geek%2Fmerkle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fc-geek%2Fmerkle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fc-geek%2Fmerkle/lists"}