mirror of
https://github.moeyy.xyz/https://github.com/trekhleb/javascript-algorithms.git
synced 2024-11-13 06:23:00 +08:00
added proof method with commented explanation
This commit is contained in:
parent
8a88cbc455
commit
64ac0fd259
@ -93,6 +93,59 @@ class MerkleTree {
|
|||||||
throw new Error('Input object only takes string, number, object')
|
throw new Error('Input object only takes string, number, object')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addNode(node) {
|
||||||
|
this.originalArray.push(node)
|
||||||
|
// Rebuild tree
|
||||||
|
this.buildTree()
|
||||||
|
}
|
||||||
|
|
||||||
|
getRoot() {
|
||||||
|
return this.root
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* getProof
|
||||||
|
* @desc Returns the proof for a node.
|
||||||
|
* @param {} node
|
||||||
|
* @param {Number} [index] - claimed node index of the input array.
|
||||||
|
* If not provided, getProof will set it default to first found index in the input array
|
||||||
|
* @return {Object} - An object provides the claim of the proof including:
|
||||||
|
* {
|
||||||
|
* node - the original input node,
|
||||||
|
* index - the original input index(if valid/applicable for the current tree), -1 otherwise,
|
||||||
|
* path - an array contains the coordinates of a bottom-up merkle path
|
||||||
|
* }
|
||||||
|
*@example
|
||||||
|
* ```js
|
||||||
|
*const tree = new MerkleTree(['a', 'b', 'c', 'd', 'e']);
|
||||||
|
*console.log(tree.getProof('b'))
|
||||||
|
* // {node: 'b', index: 1, path: [[3,0],[2,1],[1,1]]}
|
||||||
|
*```
|
||||||
|
*/
|
||||||
|
|
||||||
|
getProof(node, index) {
|
||||||
|
const result = {node, index: -1, path: []}
|
||||||
|
// Filter out invalid inputs
|
||||||
|
if (node === undefined || node === null) return result
|
||||||
|
if (index && (!Number.isInteger(index) || index < 0) || index >= this.originalArray.length) return result
|
||||||
|
// Set the index to real index if not provided
|
||||||
|
if (index === undefined || index === null) index = this.hashedArray.indexOf(this.inputHash(node))
|
||||||
|
if (index === -1) return result
|
||||||
|
result.index = index
|
||||||
|
|
||||||
|
// Build a path array bottom up based on the current full hash map by calculating indexes
|
||||||
|
for (let j=this.fullPath.length - 1; j>0;j--) {
|
||||||
|
// If the index indicates it is a left node, push right sibling to the path array, left otherwise.
|
||||||
|
if ((index % 2) == 0) {
|
||||||
|
result.path.push([j, index + 1])
|
||||||
|
} else {
|
||||||
|
result.path.push([j, index - 1])
|
||||||
|
}
|
||||||
|
index = Math.floor(index/2)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user