The ability to compose the behaviour of multiple zones. E.g. taking a flashloan in one zone and using that to liquidate in a second zone
The guarantee that composed behaviour across multiple zones settles atomically, i.e. either all state changes happen atomically, or none at all.
In the most general form, the output of an operation in one zone can be used as input to another zone, without knowing the exact output in advance:
a = ZoneA.operation_1()
b = ZoneB.operation_2(a) # The value of a is not known in advance.
A weaker form of composablity, where interactions between zones can happen across multiple distinct transactions. No guarantee is made up front about the final state of the system
We use Domain Separator Tags (DSTs) in hash functions to prevent hash collisions between different operations or data types: by appending a unique tag to the input before hashing, we ensure that the same data used in different contexts (e.g., commitments, signatures, or proofs) results in distinct hashes. It prevents an attacker from tricking a user into performing a hash that could be misused in a different context.
E.g. here the value $x$ is hashed in the Bedrock protocol. This ensures that if the same $x$ is hashed in Nomos-DA, it will not accidentally collide with the Bedrock Useage.
$$ \text{HASH}(\text{NOMOS\_BEDROCK}|| x) $$
The roots of each Mountain in an MMR, e.g. r1
, r2
, and r3
are the frontier nodes of the following MMR.
The root of the smallest full Merkle Tree that contains all Frontier nodes of an MMR. Leaves are padded with empty leaves until we achieve a full tree.