From 8e2b0a2dbca2f92dfb62a2a814f098b6731161b2 Mon Sep 17 00:00:00 2001 From: Sergei SMART Date: Thu, 10 Mar 2022 18:29:31 +1000 Subject: [PATCH] implementing tree slicing --- src/FixedMerkleTree.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/FixedMerkleTree.ts b/src/FixedMerkleTree.ts index 2af9a5e..93b4914 100644 --- a/src/FixedMerkleTree.ts +++ b/src/FixedMerkleTree.ts @@ -188,13 +188,26 @@ export default class MerkleTree { getTreeEdge(edgeIndex: number): TreeEdge { const edgeElement = this._layers[0][edgeIndex] - if (!edgeElement) { + if (edgeElement === undefined) { throw new Error('Element not found') } const edgePath = this.path(edgeIndex) return { edgePath, edgeElement, edgeIndex } } + getTreeSlices(count: number): { edge: TreeEdge, elements: Element[] }[] { + const length = this._layers[0].length + let size = Math.ceil(length / count) + size % 2 && size++ + const indexes = [] + for (let i = length - size - 1; i > -size; i -= size) { + const edgeLeft = i >= 0 ? i : 0 + const edgeRight = i + size + indexes.push({ edge: this.getTreeEdge(edgeLeft), elements: this.elements.slice(edgeLeft, edgeRight) }) + } + return indexes + } + /** * Serialize entire tree state including intermediate layers into a plain object * Deserializing it back will not require to recompute any hashes