{"_id":"@biut-block/biutjs-merkle-tree","_rev":"2-c4973191bdbd701ff037695a0282dfc5","name":"@biut-block/biutjs-merkle-tree","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@biut-block/biutjs-merkle-tree","version":"1.0.0","description":"biut blockchain merkle tree lib","main":"src/index.js","directories":{"test":"test"},"dependencies":{"chai":"^4.1.2","describe":"^1.2.0"},"devDependencies":{},"scripts":{"test":"mocha test/test.js"},"repository":{"type":"git","url":"git+https://github.com/BIUT-Block/biutjs-merkle-tree.git"},"keywords":["biutjs","merkle","tree"],"author":{"name":"Weihan"},"license":"ISC","bugs":{"url":"https://github.com/BIUT-block/biutjs-merkle-tree/issues"},"homepage":"https://github.com/BIUT-block/biutjs-merkle-tree#README","gitHead":"cc4d3056fad1cba0445293da4117a757f0e28d23","_id":"@biut-block/biutjs-merkle-tree@1.0.0","_npmVersion":"5.6.0","_nodeVersion":"8.11.4","_npmUser":{"name":"zuweihan1992","email":"zuweihan1992@gmail.com"},"dist":{"integrity":"sha512-9yIGaTpS6Q6WRFfLeUE2yTSvewiJf5RMI7jCUzEfu3ByVUe9Q+RPUIlqEw7lNGqMDV/bVmY1zp1OwoC2lswz8A==","shasum":"c51632193480fc655259368b07a47c868b1c2a76","tarball":"https://registry.npmjs.org/@biut-block/biutjs-merkle-tree/-/biutjs-merkle-tree-1.0.0.tgz","fileCount":4,"unpackedSize":12616,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc1UEtCRA9TVsSAnZWagAA48MP/RDv/cPEq9wd7rglDqBY\nUCr1Ru12isH1g6Xn+d4htslKVKzN+KKJ7j3d9BdNotOjKE9zhvxrcRnhiqvm\nA4BrSpH/RL6ey9Wz7AMdQhikdE8xC2tqivh/Fcum/vjCrLDv8IkJ1IWzxqn2\n28zJVUsVQKRc0WujVjJ8rZ+C+bq4023pIv3EBQqmx4L3s4vySwTVe+YU9EaW\nXQiM/vfDtF5tNBq/YyvBbQI3mZbk82V2NPPn6QHnXHD5ftPqayEY+9JwnbCI\nDCRJMc7FqNhuvA5f+izX0/hh5REwWvqXEnJki4cBflMYBhH7lVIbnUTG54z1\niQpNZh+VIgYKcSmNFJJ2OdrdXIYLPUR4CqwN1DM7omDwP2RDulHuOUJwOUix\nL93dli/eyNAc+N7XT8qm+vw4QdRccUp8rLF1to6tFZ5jYdEZ0yijjofUEr0i\ntWsSQqaQ+YXSROYkqNgHLHgUDPXZKQxiaVUbZjStYB0KDqFbEhjf/awYC3/T\nBlTTpdETJGMZQDlv6SH3dYzrAfsp4EBXZs7jTBK5QZ3L2ab441JhxYPPL4i4\nGf1V9l9edolHl6c4nIx9iDq4VdmJWssxkEEZBDhyB0Jg0rQWwvGUsO2KwsIk\nhIAFr0aWUW/fFeuZ19XOptqmRzx+pW+yv6yoks8CnuKo8rOlRytF9e6ga+0D\n/F/a\r\n=KB7+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIElOnywen5iyEpvoAz54SFUyNoqkqXkLaBvxdiTzr26qAiByt+sY963/K0lxQaZnloKP5T0C32w74RWFrPgOm6z0vw=="}]},"maintainers":[{"name":"zuweihan1992","email":"zuweihan1992@gmail.com"},{"name":"tornadoming","email":"ming1992liu@gmail.com"},{"name":"g277321","email":"g277321@gmail.com"},{"name":"feiminhao","email":"fei.minhao1990@gmail.com"},{"name":"abysmli","email":"abysmli@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/biutjs-merkle-tree_1.0.0_1557479724935_0.4766792978927221"},"_hasShrinkwrap":false},"1.0.1":{"name":"@biut-block/biutjs-merkle-tree","version":"1.0.1","description":"biut blockchain merkle tree lib","main":"src/index.js","directories":{"test":"test"},"dependencies":{"chai":"^4.1.2","describe":"^1.2.0"},"devDependencies":{},"scripts":{"test":"mocha test/test.js"},"repository":{"type":"git","url":"git+https://github.com/BIUT-Block/biutjs-merkle-tree.git"},"keywords":["biutjs","merkle","tree"],"author":{"name":"Weihan"},"license":"ISC","bugs":{"url":"https://github.com/BIUT-block/biutjs-merkle-tree/issues"},"homepage":"https://github.com/BIUT-block/biutjs-merkle-tree#README","gitHead":"5ce1a8c0d5e1395b58d21743a28616c13d46139f","_id":"@biut-block/biutjs-merkle-tree@1.0.1","_npmVersion":"5.6.0","_nodeVersion":"8.11.4","_npmUser":{"name":"zuweihan1992","email":"zuweihan1992@gmail.com"},"dist":{"integrity":"sha512-uL6fdKi2FV3kthRAYEdL8SXFos8L1BbLxyqUoT+vHPIvn5hB+F1KpF1Pv/fs80jcftJB5+001Tc48CabmC+gbg==","shasum":"4a7711a155f81b9b1fa877d3c6e62c0d2ef1e051","tarball":"https://registry.npmjs.org/@biut-block/biutjs-merkle-tree/-/biutjs-merkle-tree-1.0.1.tgz","fileCount":4,"unpackedSize":12616,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc1UGBCRA9TVsSAnZWagAA7lgP/RRHy5IyvZdVqo74r44r\nbHB+/hKWvlncEwl9pu/O0Qka74ioSfbN7g56Sb2L3XppHwP3ALwm3vDKG/fE\nlPQhtm/jWotqSsURGWVxGeBuHye804CguazNFZqtm6/h38Pm4KRuXmf5OZBz\nLqwyqLwXKA0+nWGXXeYsft79qbtR3Eqm0AR6w5mSdjdu0Qe9M9nZoMcbuFIZ\nf++tfCiB5mupyGWCDdUByuZGTH0EEEfO6mvOltdlH3tL6xxEKZZm9es/Zg8k\nWHYzSVETo61T68CjQiKlQOujRSszpWUe/pP5hIJKr1zGyT9QZ2KYBvKl95FQ\nIsUiVpniC8zavncPpLCcMTbdx2Hpsmf33PAODGcxM0wbbJVNAgHVFzbRjL0R\n471GbUFVXruqlkV7I75o6yODDb+rlNJh+ntKgpBzVsML/9PCHOMms6w07HxQ\nKs6MHSDaCFMpwcLyaz6wP78JLWIkxPtofZn3KGUqr0prFA2LpMLLCQEE39Ex\n7R2Fb+I9j2xadh4TUp1sORoKj9CcAK0jIwXqjDtAjQlz3oNYEJXNWxgRkMfH\nwWaausRbLtMhd1pRA7hzYcOO4dX9WYMfqvqIEElwcOwSOEp7uXwmHK/xlbfK\nqonpBfKtEz7AIrto/F9c+SQ8MqnFuO/MZCF3BGrrmoGV4krxFDAkcEZI4Igh\nXXY/\r\n=/bBa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC27iqHb0RjqRE5R4RFiTZrulclKnsY0lxDMXtxOz9lngIhAKjyc/dB8EwFoERyake8ZaqdSFqBXTmabpHVxh4Kxdc7"}]},"maintainers":[{"name":"abysmli","email":"abysmli@gmail.com"},{"name":"feiminhao","email":"fei.minhao1990@gmail.com"},{"name":"g277321","email":"g277321@gmail.com"},{"name":"tornadoming","email":"ming1992liu@gmail.com"},{"name":"zuweihan1992","email":"zuweihan1992@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/biutjs-merkle-tree_1.0.1_1557479809126_0.6343211021260009"},"_hasShrinkwrap":false}},"time":{"created":"2019-05-10T09:15:24.733Z","1.0.0":"2019-05-10T09:15:25.055Z","modified":"2022-04-04T19:14:52.264Z","1.0.1":"2019-05-10T09:16:49.245Z"},"maintainers":[{"name":"abysmli","email":"abysmli@gmail.com"},{"name":"feiminhao","email":"fei.minhao1990@gmail.com"},{"name":"g277321","email":"g277321@gmail.com"},{"name":"tornadoming","email":"ming1992liu@gmail.com"},{"name":"zuweihan1992","email":"zuweihan1992@gmail.com"}],"description":"biut blockchain merkle tree lib","homepage":"https://github.com/BIUT-block/biutjs-merkle-tree#README","keywords":["biutjs","merkle","tree"],"repository":{"type":"git","url":"git+https://github.com/BIUT-Block/biutjs-merkle-tree.git"},"author":{"name":"Weihan"},"bugs":{"url":"https://github.com/BIUT-block/biutjs-merkle-tree/issues"},"license":"ISC","readme":"<a name=\"MerkleTree\"></a>\r\n\r\n[![JavaScript Style Guide](https://cdn.rawgit.com/standard/standard/master/badge.svg)](https://github.com/standard/standard) \r\n\r\n[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)]\r\n\r\n* * *\r\n## MerkleTree\r\n\r\nThis package is used for SEC blockchain merkle tree.\r\n\r\n* [MerkleTree](#MerkleTree)\r\n    * [new MerkleTree(rawData, hashAlgo)](#new_MerkleTree_new)\r\n    * [.getLeaves()](#MerkleTree+getLeaves) ⇒ <code>Array.&lt;Buffer&gt;</code>\r\n    * [.getLayers()](#MerkleTree+getLayers) ⇒ <code>Array.&lt;Buffer&gt;</code>\r\n    * [.getRoot()](#MerkleTree+getRoot) ⇒ <code>Buffer</code>\r\n    * [.getProof(rawData, [index])](#MerkleTree+getProof) ⇒ <code>Array.&lt;Object&gt;</code>\r\n    * [.verify(proof, targetNode, root)](#MerkleTree+verify) ⇒ <code>Boolean</code>\r\n\r\n\r\n* * *\r\n<a name=\"new_MerkleTree_new\"></a>\r\n\r\n### new MerkleTree(rawData, hashAlgo)\r\nnew MerkleTree(rawData, hashAlgo)\r\nConstructs a Merkle Tree.\r\nAll rawData(will be converted to leaves and nodes after hash calculation) are stored as Buffers.\r\n\r\n\r\n| Param | Type | Description |\r\n| --- | --- | --- |\r\n| rawData | <code>Buffer[], Array[]</code> | Array of raw data, will be convert to leaves after hash calculation |\r\n| hashAlgo | <code>String</code> | Algorithm used to hash rawData, leaves and nodes, now the code only supports \"md5\", \"sha1\", \"sha256\", \"sha512\", \"ripemd160\" |\r\n\r\n\r\n**Example**\r\n```js\r\nconst crypto = require('crypto')\r\nconst MerkleTree = require('../src/index')\r\n\r\nconst rawData = ['a', 'b', 'c']\r\nconst tree = new MerkleTree(rawData, 'sha256')\r\n```\r\n\r\n* * *\r\n\r\n<a name=\"MerkleTree+getLeaves\"></a>\r\n\r\n### merkleTree.getLeaves() ⇒ <code>Array.&lt;Buffer&gt;</code>\r\nReturns array of leaves of Merkle Tree.\r\n\r\n**Kind**: instance method of [<code>MerkleTree</code>](#MerkleTree)\r\n**Example**\r\n```js\r\nconst leaves = tree.getLeaves()\r\n```\r\n\r\n* * *\r\n\r\n<a name=\"MerkleTree+getLayers\"></a>\r\n\r\n### merkleTree.getLayers() ⇒ <code>Array.&lt;Buffer&gt;</code>\r\nReturns array of all layers of Merkle Tree, including leaves and root.\r\n\r\n**Kind**: instance method of [<code>MerkleTree</code>](#MerkleTree)\r\n**Example**\r\n```js\r\nconst layers = tree.getLayers()\r\n```\r\n\r\n* * *\r\n\r\n<a name=\"MerkleTree+getRoot\"></a>\r\n\r\n### merkleTree.getRoot() ⇒ <code>Buffer</code>\r\nReturns the Merkle root hash as a Buffer.\r\n\r\n**Kind**: instance method of [<code>MerkleTree</code>](#MerkleTree)\r\n**Example**\r\n```js\r\nconst root = tree.getRoot()\r\n```\r\n\r\n* * *\r\n\r\n<a name=\"MerkleTree+getProof\"></a>\r\n\r\n### merkleTree.getProof(rawData, [index]) ⇒ <code>Array.&lt;Buffer&gt;</code>\r\nReturns the proof for a target leaf.\r\n\r\n**Kind**: instance method of [<code>MerkleTree</code>](#MerkleTree)\r\n**Returns**: <code>Array.&lt;Object&gt;</code> - - Array of json object\r\n\r\n| Param | Type | Description |\r\n| --- | --- | --- |\r\n| rawData | <code>Buffer, String</code> | Target leaf's raw data |\r\n| [index] | <code>Number</code> | Target leaf index in leaves array. Use if there are leaves containing duplicate data in order to distinguish it. |\r\n\r\nIf index is not defined, code will traverse the tree to find rawData's corresponding index. If index is defined, rawData is invalid and code will proceed with index only.\r\n\r\n**Example**\r\n```js\r\nconst proof = tree.getProof(rawData[2])\r\n```\r\n**Example**\r\n```js\r\nconst rawData = ['a', 'b', 'c']\r\nconst tree = new MerkleTree(rawData, \"sha256\")\r\nconst proof = tree.getProof(rawData[2], 2)\r\n```\r\n\r\n* * *\r\n\r\n<a name=\"MerkleTree+verify\"></a>\r\n\r\n### merkleTree.verify(proof, targetNode, root) ⇒ <code>Boolean</code>\r\nReturns true if the proof path (array of hashes) can connect the target node to the Merkle root.\r\n\r\n**Kind**: instance method of [<code>MerkleTree</code>](#MerkleTree)\r\n\r\n| Param | Type | Description |\r\n| --- | --- | --- |\r\n| proof | <code>Array.&lt;Object&gt;</code> | Array of json object |\r\n| targetNode | <code>Buffer, String</code> | Target node Buffer |\r\n| root | <code>Buffer</code> | Merkle root Buffer |\r\n\r\n**Example**\r\n```js\r\nconst root = tree.getRoot()\r\nconst proof = tree.getProof(rawData[2])\r\nconst verified = tree.verify(proof, rawData[2], root)\r\n```\t\r\n\r\n* * *\r\n# 中文简介\r\n\r\n代码用于SEC Merkle Tree Hash计算\r\n主要的函数：\r\n1.  定义MerkleTree:\tMerkleTree(rawData, hashAlgo)\r\n\t其中rawData是原始的数据，例如区块链上每个区块utf-8编码形式的数据\r\n\thashAlgo是Merkle树的hash运算算法，现在仅支持\"md5\", \"sha1\", \"sha256\", \"sha512\", \"ripemd160\"\r\n\r\n2.  getProof(rawData, [index]) => Array.<Buffer>\r\n\t该函数会返回目标节点在hash树每一层的配偶节点的位置（左/右）及其hash值，返回类型为带key键的Array\r\n\t该函数配套verify函数，用于确认目标节点的数据是否遭到篡改\r\n\t\r\n3.  verify(proof, targetNode, root) => Boolean\r\n\t该函数需要的输入为：getProof函数返回的目标节点每一层的配偶节点位置及hash值， 想测试的目标节点 raw data 以及 Merkle树根的值\r\n\t因此可以很容易的计算并确认数据没有遭到篡改\r\n\t\r\n第二次原像攻击：\r\n由于Merkle根值只是一个值，只能代表最后的值是否正确，而无法展示其他信息，如树的节点个数，树的层数等等，因此容易受到伪造者攻创建一个具有相同Merkle树根的虚假文档进行攻击\r\n解决方法：\r\n每一层的树在计算hash值之前加上所在层数对应的一个前缀值，例如第一层在data前面加0x00，以此类推","readmeFilename":"README.md"}