mirror of
https://github.com/tornadocash/fixed-merkle-tree.git
synced 2024-11-21 17:27:08 +01:00
add proof leaf method
This commit is contained in:
parent
12f95d97ee
commit
e0817b8389
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@ lib
|
||||
yarn-error.log
|
||||
.idea
|
||||
.nyc_output
|
||||
.run
|
||||
|
@ -1,7 +1,6 @@
|
||||
import {
|
||||
Element,
|
||||
HashFunction,
|
||||
Index,
|
||||
MerkleTreeOptions,
|
||||
ProofPath,
|
||||
SerializedTreeState,
|
||||
@ -147,7 +146,7 @@ export default class MerkleTree {
|
||||
* @param {number} index Leaf index to generate path for
|
||||
* @returns {{pathElements: Object[], pathIndex: number[]}} An object containing adjacent elements and left-right index
|
||||
*/
|
||||
path(index: Index): ProofPath {
|
||||
path(index: number): ProofPath {
|
||||
if (isNaN(Number(index)) || index < 0 || index >= this._layers[0].length) {
|
||||
throw new Error('Index out of bounds: ' + index)
|
||||
}
|
||||
@ -194,8 +193,7 @@ export default class MerkleTree {
|
||||
}
|
||||
|
||||
getTreeEdge(edgeElement: Element): TreeEdge {
|
||||
const leaves = this._layers[0]
|
||||
const edgeIndex = leaves.indexOf(edgeElement)
|
||||
const edgeIndex = this.indexOf(edgeElement)
|
||||
if (edgeIndex <= -1) {
|
||||
throw new Error('Element not found')
|
||||
}
|
||||
|
@ -167,7 +167,7 @@ export class PartialMerkleTree {
|
||||
}
|
||||
}
|
||||
|
||||
path(index: Element): ProofPath {
|
||||
path(index: number): ProofPath {
|
||||
if (isNaN(Number(index)) || index < 0 || index >= this._layers[0].length) {
|
||||
throw new Error('Index out of bounds: ' + index)
|
||||
}
|
||||
@ -205,6 +205,11 @@ export class PartialMerkleTree {
|
||||
}
|
||||
}
|
||||
|
||||
proof(element: Element): ProofPath {
|
||||
const index = this.indexOf(element)
|
||||
return this.path(index)
|
||||
}
|
||||
|
||||
serialize(): SerializedPartialTreeState {
|
||||
const leaves = this.layers[0].slice(this._edgeLeaf.index)
|
||||
return {
|
||||
|
@ -38,6 +38,5 @@ export type TreeEdge = {
|
||||
edgePath: ProofPath;
|
||||
edgeIndex: number
|
||||
}
|
||||
export type Index = Element
|
||||
export type LeafWithIndex = { index: number, data: Element }
|
||||
|
||||
|
@ -163,6 +163,13 @@ describe('PartialMerkleTree', () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe('#proof', () => {
|
||||
it('should return proof for known leaf', () => {
|
||||
const { partialTree } = getTestTrees(10, [1, 2, 3, 4, 5], 3)
|
||||
assert.deepEqual(partialTree.proof(4), partialTree.path(3))
|
||||
})
|
||||
})
|
||||
|
||||
describe('#getters', () => {
|
||||
it('should return capacity', () => {
|
||||
const levels = 10
|
||||
@ -207,6 +214,7 @@ describe('PartialMerkleTree', () => {
|
||||
const { partialTree } = getTestTrees(10, [1, 2, 3, 4, 5, 6, 7, 8, 9], 5)
|
||||
should().throw((() => partialTree.path(-1)), 'Index out of bounds: -1')
|
||||
should().throw((() => partialTree.path(10)), 'Index out of bounds: 10')
|
||||
// @ts-ignore
|
||||
should().throw((() => partialTree.path('qwe')), 'Index out of bounds: qwe')
|
||||
})
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user