Based rollups face high data availability costs because they cannot delay and aggregate L1 data submissions the way centralized sequencers can. As a result, they often underutilize blob space. For example, in this block proposal, Taiko leaves around half of its blob unused. As more rollups—especially low-traffic ones—appear, each having to post its own blobs or revert to call data only amplifies this inefficiency. This poses a significant barrier to widespread adoption of based rollups.
We introduce a protocol for based rollups to share blobs with each other so they can fill the blobs more efficiently and reduce L1 gas cost.
The goal of this document is to design a maximally simple on-chain component for sharing blobs between based rollups created by the same builder. The design should be as generic as possible, enabling its use across a wide range of based rollup stacks and potentially extending to non-based rollup use cases.
Note that in this document, we assume all L2-based rollup blocks are created and aggregated by a single entity. This simplifies the protocol as it eliminates the need for complex off-chain coordination. This is a natural simplification for the based-rollup setup, as the L1 builder (or L1/L2 preconfirmer) would likely emerge to fulfill this role. For discussion on how to generalize to a scenario where different entities build and aggregate L2 blocks, see the Future Work section.
Below is a high-level diagram of the blob-sharing protocol.
It works as follows:
firstBlobIndex
, numBlob
, addresses
, offsets
, lengths
, payloads
) on how the blobs are segmented and shared between rollups. The payload
here represent additional payload to pass to the inbox contract.Be aware that the blob splitter contract will now appear as the msg.sender
to the rollup inbox contract. This can cause issues if the inbox contract relies on msg.sender
for certain checks (for example, verifying the next preconfer in a lookahead). In such cases, the rollup must include the sender’s credential in the payload field rather than relying on msg.sender
.
Here is a diagram that illustrates the relationship between blobs and segments:
Below is a pseudo code of the splitter contract:
TBF
In the current protocol, we assume all L2-based rollup blocks are created and aggregated by a single entity. To generalize for a scenario where different entities build and aggregate L2 blocks, we must introduce a off-chain coordination protocol between the entities. One potential approach is to utilize the L1 builder as the aggregator like this:
This needs further consideration, such as:
To maximize compression we may want to introduce cross-segment compression where we compress the whole blob after concatenating the segments. One challenge is that segment offsets change when they are further compressed, which invalidates the submitter’s original signature which likely applies to the segment hash before the cross-segment compression.