diff --git a/merkletree/collapsed_tree.go b/merkletree/collapsed_tree.go index 8f4537b..023073b 100644 --- a/merkletree/collapsed_tree.go +++ b/merkletree/collapsed_tree.go @@ -47,6 +47,18 @@ func (tree *CollapsedTree) Add(hash Hash) { tree.collapse() } +func (tree *CollapsedTree) Append(other *CollapsedTree) error { + maxSize := uint64(1) << bits.TrailingZeros64(tree.size) + if other.size > maxSize { + return fmt.Errorf("tree of size %d is too large to append to a tree of size %d (maximum size is %d)", other.size, tree.size, maxSize) + } + + tree.nodes = append(tree.nodes, other.nodes...) + tree.size += other.size + tree.collapse() + return nil +} + func (tree *CollapsedTree) collapse() { numNodes := calculateNumNodes(tree.size) for len(tree.nodes) > numNodes {