# Merkle Expansions in BOLD In the BOLD implementation, we have a data structure called a "Merkle expansion" that is quite confusing but used for the purpose of representing commitments to some list of hashes in a compact way, and for verifying that some commitment of hashes is a **prefix** of another commitment. This can be done by providing a Merkle expansion to some list of hashes A, and another B, and proving that A is a prefix of B. Some terminology: - **level**: Refers to the distance from the leaves layer to a node in the tree. The leaves are at level 0, their parents at level 1, and so on - **complete subtree**: no nodes with one child The tree below is a complete tree because every level, is fully filled. All nodes are as far left as possible. ``` ROOT / \ AB CD / \ / \ A B C D ``` ### Merkle Expansion A Merkle expansion is a data structure that represents trees above in a compact manner. It represents the tree in an array where each **index** corresponds to a **level** in the tree. For the tree above, we will compute the root of the complete tree, and represent it as compactly as possible. We can represent it as `ROOT`, because it is complete. We do not need to store A, B, C, or D, or its parents, because they give us all the information we need to compute a complete root. ``` expansion = [] append(expansion, A) -> [hash(A)] append(expansion, B) -> [0, hash(A, B)] append(expansion, C) -> [hash(C), hash(A, B)] append(expansion, D) -> [0, 0, hash(hash(A, B), hash(C, D))] ``` ### Lopsided Trees Now, let's say we want to add `E` into our expansion. We will end up with something like this: ``` NEWROOT / \ ABCD E000 / \ / \ AB CD ..E0. 00 / \ / \ / \ A B C D E 0 0 0 ``` ABCD is a complete subtree, but whatever is on E's side is not, so our merkle expansion looks something like this: ``[hash(E), 0, hash(ABCD, E000)]`` as E is a complete subtree by itself at lvl 0, at lvl 1 we have no complete subtree, and at lvl 2 we have a complete subtree in ABCD