Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(protocol): support smaller more frequent L2 blocks (replacing soft blocks) #18743

Draft
wants to merge 18 commits into
base: pacaya_fork
Choose a base branch
from

Conversation

dantaik
Copy link
Contributor

@dantaik dantaik commented Jan 9, 2025

Overview

This PR introduces support for smaller and more frequent L2 blocks, replacing the previously planned soft-blocks. The primary motivation for this change stems from @cyberhorsey's discovery that most existing Ethereum SDKs and tools (e.g., MetaMask) do not handle frequent block reorganizations gracefully. Instead of investing effort into improving these libraries and tools, adopting smaller and more frequent blocks appears to be the most pragmatic solution.

Key Changes

In this PR, we introduce the concept of a "batch", which represents a collection of Taiko blocks. A batch serves as the smallest unit for block proposal, block proving, and cross-chain data synchronization. Block header data are derived from the same batch metadata to minimize on-chain footprint per block. This means that, given the same set of transactions within a batch, splitting them into 10 blocks versus 20 blocks does not significantly impact L1 gas costs—though there are still minor differences.

However, creating more L2 blocks from the same set of transactions does increase gas costs for batch proposals (slightly) and proving costs (more noticeable). Specifically, proofs are now aggregated in two stages:

  1. From block proofs to batch proofs.
  2. From batch proofs to multi-batch proofs.

More L2 blocks result in higher costs for the first level of aggregation.

Additionally, the protocol does not support proposing multiple batches in a single transaction. Instead, it leverages multiple blobs within a single proposeBatch transaction. As a result, proposers are encouraged to propose fewer and larger batches whenever possible to optimize efficiency.

Review Tips

This is a large PR, but your primary focus should be on TaikoInbox.sol. The other changes are secondary and result from ripple effects.

Todos

Copy link

openzeppelin-code bot commented Jan 9, 2025

feat(protocol): support smaller more frequent L2 blocks (replacing soft blocks)

Generated at commit: 0e8cbe0d95bd0770cd6ec70036c51a8aa1138657

🚨 Report Summary

Severity Level Results
Contracts Critical
High
Medium
Low
Note
Total
3
3
0
9
40
55
Dependencies Critical
High
Medium
Low
Note
Total
0
0
0
0
0
0

For more details view the full report in OpenZeppelin Code Inspector

@dantaik dantaik changed the title Pacaya subblocks feat(protocol): support smaller more frequent L2 blocks (replacing soft blocks) Jan 10, 2025
// The metadata must be supplied as calldata prior to proving the batch, enabling the
// computation and verification of its integrity through the comparison of the metahash.
unchecked {
meta_ = BatchMetadata({
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shall we comment how to calculate block.difficulty here?

bytes32 txListHash;
bytes32 extraData;
address coinbase;
uint64 blockId;
uint64 batchId;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this design, when we propose blocks on L2, do we propose the batch or the blocks in the batch?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We propose a batch. We move holistically across the stack from block based to batch based in this design, from proposing to proving.


_debitBond(_proposer, config.livenessBond * _paramsArray.length);
emit BlocksProposedV3(metas_, calldataUsed, _txList);
_debitBond(_proposer, config.livenessBond);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So rn for each batch, we only charge config.livenessBond once, is it by design?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants