{"id":16742093,"url":"https://github.com/cedoor/sparse-merkle-tree","last_synced_at":"2025-03-21T22:31:36.581Z","repository":{"id":54971336,"uuid":"348653290","full_name":"cedoor/sparse-merkle-tree","owner":"cedoor","description":"Sparse Merkle tree implementation in TypeScript.","archived":false,"fork":false,"pushed_at":"2021-04-08T08:31:53.000Z","size":724,"stargazers_count":27,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-17T21:00:02.883Z","etag":null,"topics":["javascript","merkle-tree","smt","sparse-merkle-tree","typescript"],"latest_commit_sha":null,"homepage":"https://smt.cedoor.dev","language":"TypeScript","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/cedoor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"code-of-conduct.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-03-17T09:37:32.000Z","updated_at":"2025-03-13T14:34:34.000Z","dependencies_parsed_at":"2022-08-14T07:50:25.306Z","dependency_job_id":null,"html_url":"https://github.com/cedoor/sparse-merkle-tree","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedoor%2Fsparse-merkle-tree","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedoor%2Fsparse-merkle-tree/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedoor%2Fsparse-merkle-tree/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedoor%2Fsparse-merkle-tree/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cedoor","download_url":"https://codeload.github.com/cedoor/sparse-merkle-tree/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244880248,"owners_count":20525505,"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":["javascript","merkle-tree","smt","sparse-merkle-tree","typescript"],"created_at":"2024-10-13T01:22:36.845Z","updated_at":"2025-03-21T22:31:35.815Z","avatar_url":"https://github.com/cedoor.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003ch1 align=\"center\"\u003e\n        Sparse Merkle tree\n    \u003c/h1\u003e\n    \u003cp align=\"center\"\u003eSparse Merkle tree implementation in TypeScript.\u003c/p\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://www.npmjs.com/package/@cedoor/smt\" target=\"_blank\"\u003e\n        \u003cimg alt=\"NPM version\" src=\"https://img.shields.io/npm/v/@cedoor/smt?style=flat-square\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/cedoor/sparse-merkle-tree/blob/main/LICENSE\" target=\"_blank\"\u003e\n        \u003cimg alt=\"Github license\" src=\"https://img.shields.io/github/license/cedoor/sparse-merkle-tree.svg?style=flat-square\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/cedoor/sparse-merkle-tree/actions?query=workflow%3Atest\" target=\"_blank\"\u003e\n        \u003cimg alt=\"GitHub Workflow test\" src=\"https://img.shields.io/github/workflow/status/cedoor/sparse-merkle-tree/test?label=test\u0026style=flat-square\u0026logo=github\"\u003e\n    \u003c/a\u003e\n    \u003ca href='https://coveralls.io/github/cedoor/sparse-merkle-tree?branch=main' target=\"_blank\"\u003e\n        \u003cimg alt=\"Coveralls\" src=\"https://img.shields.io/coveralls/github/cedoor/sparse-merkle-tree/main?style=flat-square\u0026logo=coveralls\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://eslint.org/\" target=\"_blank\"\u003e\n        \u003cimg alt=\"Linter eslint\" src=\"https://img.shields.io/badge/linter-eslint-8080f2?style=flat-square\u0026logo=eslint\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://prettier.io/\" target=\"_blank\"\u003e\n        \u003cimg alt=\"Code style prettier\" src=\"https://img.shields.io/badge/code%20style-prettier-f8bc45?style=flat-square\u0026logo=prettier\"\u003e\n    \u003c/a\u003e\n    \u003cimg alt=\"Repository top language\" src=\"https://img.shields.io/github/languages/top/cedoor/network-flow-algorithms?style=flat-square\u0026logo=typescript\"\u003e\n    \u003cimg alt=\"NPM bundle size\" src=\"https://img.shields.io/bundlephobia/min/@cedoor/smt?style=flat-square\"\u003e\n\u003c/p\u003e\n\nA sparse Merkle tree (SMT) is a data structure useful for storing a key/value map where every leaf node of the tree contains the cryptographic hash of a key/value pair and every non leaf node contains the concatenated hashes of its child nodes. SMTs provides a secure and efficient verification of large data sets and they are often used in peer-to-peer technologies. This implementation is an optimized version of the traditional sparse Merkle tree and it is based on the concepts expressed in the papers and resources below.\n\n**Notice**: this library is still not stable and therefore it must be used with care.\n\n## References\n\n1. Rasmus Dahlberg, Tobias Pulls and Roel Peeters. _Efficient Sparse Merkle Trees: Caching Strategies and Secure (Non-)Membership Proofs_. Cryptology ePrint Archive: Report 2016/683, 2016. https://eprint.iacr.org/2016/683.\n2. Faraz Haider. _Compact sparse merkle trees_. Cryptology ePrint Archive: Report 2018/955, 2018. https://eprint.iacr.org/2018/955.\n3. Jordi Baylina and Marta Bellés. _Sparse Merkle Trees_. https://docs.iden3.io/publications/pdfs/Merkle-Tree.pdf.\n4. Vitalik Buterin Fichter. _Optimizing sparse Merkle trees_. https://ethresear.ch/t/optimizing-sparse-merkle-trees/3751.\n\n---\n\n## Table of Contents\n\n-   🛠 [Install](#install)\n-   📜 [API reference](#api-reference)\n-   🔬 [Development](#development)\n    -   [Rules](#scroll-rules)\n        -   [Commits](https://github.com/cedoor/cedoor/tree/main/git#commits-rules)\n        -   [Branches](https://github.com/cedoor/cedoor/tree/main/git#branch-rules)\n-   🧾 [MIT License](https://github.com/cedoor/sparse-merkle-tree/blob/master/LICENSE)\n-   ☎️ [Contacts](#contacts)\n    -   [Developers](#developers)\n\n## Install\n\n### npm or yarn\n\nYou can install utils package with npm:\n\n```bash\nnpm i @cedoor/smt --save\n```\n\nor with yarn:\n\n```bash\nyarn add @cedoor/smt\n```\n\n### CDN\n\nYou can also load it using a `script` tap using [unpkg](https://unpkg.com/):\n\n```html\n\u003cscript src=\"https://unpkg.com/@cedoor/smt/\"\u003e\u003c/script\u003e\n```\n\nor [JSDelivr](https://www.jsdelivr.com/):\n\n```html\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/@cedoor/smt/\"\u003e\u003c/script\u003e\n```\n\n## API reference\n\n-   [Creating trees](#smt-new)\n-   [Adding entries](#smt-add)\n-   [Getting values](#smt-get)\n-   [Updating values](#smt-update)\n-   [Deleting entries](#smt-delete)\n-   [Creating proofs](#smt-create-proof)\n-   [Verifying proofs](#smt-verify-proof)\n\n\u003ca name=\"smt-new\" href=\"#smt-new\"\u003e#\u003c/a\u003e **new SMT**(hash: _HashFunction_, bigNumbers?: _boolean_): _SMT_\n\n```typescript\nimport { SMT, hexToDec } from \"@cedoor/smt\"\nimport { sha256 } from \"js-sha256\"\nimport { poseidon } from \"circomlib\"\n\n// Hexadecimal hashes.\nconst hash = (childNodes: ChildNodes) =\u003e sha256(childNodes.join(\"\"))\nconst tree = new SMT(hash)\n\n// Big number hashes.\nconst hash2 = (childNodes: ChildNodes) =\u003e poseidon(childNodes)\nconst tree2 = new SMT(hash2, true)\n\nconsole.log(tree.root) // 0\nconsole.log(tree2.root) // 0n\n```\n\n\u003ca name=\"smt-add\" href=\"#smt-add\"\u003e#\u003c/a\u003e **add**(key: _string_ | _number_, value: _string_ | _number_): _void_\n\n```typescript\ntree.add(\"2b\", \"44\") // Hexadecimal key/value.\ntree.add(\"16\", \"78\")\ntree.add(\"d\", \"e7\")\ntree.add(\"10\", \"141\")\ntree.add(\"20\", \"340\")\n\nconsole.log(tree.root) // 31ee2a59741c9c32a32d8c7fafe461cca1ccaf5986c2d592586e3e6482a48645\n```\n\n\u003ca name=\"smt-get\" href=\"#smt-get\"\u003e#\u003c/a\u003e **get**(key: _string_ | _number_): _undefined_ | _string_\n\n```typescript\nconst value = tree.get(\"16\")\n\nconsole.log(value) // 78\n```\n\n\u003ca name=\"smt-update\" href=\"#smt-update\"\u003e#\u003c/a\u003e **update**(key: _string_ | _number_, value: _string_ | _number_): _void_\n\n```typescript\ntree.update(\"16\", \"79\")\n\nconst value = tree.get(\"16\")\n\nconsole.log(value) // 79\n```\n\n\u003ca name=\"smt-delete\" href=\"#smt-delete\"\u003e#\u003c/a\u003e **delete**(key: _string_ | _number_): _void_\n\n```typescript\ntree.delete(\"16\")\n\nconst value = tree.get(\"16\")\n\nconsole.log(value) // undefined\n```\n\n\u003ca name=\"smt-create-proof\" href=\"#smt-create-proof\"\u003e#\u003c/a\u003e **createProof**(key: _string_ | _number_): _Proof_\n\n```typescript\nconst membershipProof = tree.createProof(\"2b\")\nconst nonMembershipProof = tree.createProof(\"16\") // This key has been deleted.\n\nconsole.log(membershipProof)\n/*\n{\n    entry: [ '2b', '44', '1' ],\n    matchingEntry: undefined,\n    sidenodes: [\n        '006a0ab15a212e0e0126b81e056b11576628b1ad80792403dbb3a90be2e71d64',\n        'f786ce5a843614d7da216d95c0087c1eb29244927feeeeeb658aa60cf124cd5e'\n    ],\n    root: 'c3c023c84afc0a7bab1dbebcef5f7beaf3d6af4af98e8f481620dec052be7d0d',\n    membership: true\n}\n*/\n\nconsole.log(nonMembershipProof)\n/*\n{\n    entry: [ '16' ],\n    matchingEntry: undefined,\n    sidenodes: [\n        '960f23d9fbb44241be53efb7c4d69ac129bb1cb9482dcb6789d3cc7e6de2de2b',\n        '2a1aef839e68d1bdf43c1b3b1ed9ef16c27162e8a175898c9ac64a679b0fc825'\n    ],\n    root: 'c3c023c84afc0a7bab1dbebcef5f7beaf3d6af4af98e8f481620dec052be7d0d',\n    membership: false\n}\n*/\n```\n\n\u003ca name=\"smt-verify-proof\" href=\"#smt-verify-proof\"\u003e#\u003c/a\u003e **verifyProof**(proof: _Proof_): _boolean_\n\n```typescript\nconsole.log(tree.verifyProof(membershipProof)) // true\nconsole.log(tree.verifyProof(nonMembershipProof)) // true\n```\n\n## Contacts\n\n### Developers\n\n-   e-mail : me@cedoor.dev\n-   github : [@cedoor](https://github.com/cedoor)\n-   website : https://cedoor.dev\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcedoor%2Fsparse-merkle-tree","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcedoor%2Fsparse-merkle-tree","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcedoor%2Fsparse-merkle-tree/lists"}