I have been through both @jbaylinaâs reference implementation and @mkoeppelmannâs POC. Some observations on the mechanism design and code.
1. On Execution Table Privacy and Builder MEV: Why commit-reveal doesnât help (yet)
@TimTinkers raises a critical concern that if the builder is the one generating proofs, doesnât synchronous composability become another private channel to the builder duopoly? @tbranntâs DOS question converges on the same structural issue.
My first instinct was that a commit-reveal scheme could help: force the execution table submitter to commit to a hash before revealing the content, preventing builders from inspecting and reordering user execution tables for MEV extraction.
But after tracing through both implementations, I realized this doesnât work in the current architecture, and the reason is instructive:
The builder is the execution table constructor. In Rollups.sol, loadL2Executions() takes pre-computed executions with a ZK proof. In koeppelmannâs NativeRollupCore.sol, registerIncomingCall() and processSingleTxOnL2() serve the same role. In both cases, constructing the execution table requires:
- Knowing the exact L1 state the transaction will execute against
- Simulating the full L2 execution
- Generating a validity proof
Only the block builder/proposer has (1) - they know their pending blockâs state because theyâre building it. So the builder must construct the table, which means they already know its contents. Commit-reveal would protect the submitter from the builder, but the submitter and the builder are the same entity.
This becomes a problem when synchronous composability enables cross-domain MEV that doesnât exist today. In single-chain MEV, the builderâs advantage is limited to transaction ordering within one domain. With execution tables, the builder can atomically arbitrage price discrepancies across rollups, something currently requiring multi-block bridge strategies with settlement risk. The execution table is strictly more valuable than a single-domain mempool.
Commit-reveal would help under a decentralized prover market where users or third parties can independently construct and submit proven execution tables. This is architecturally possible (loadL2Executions() is permissionless), but requires proving infrastructure to be widely available which brings us back to @jbaylinaâs point about the hardware requirements being non-trivial.
The open question is about what the path from âbuilder constructs everythingâ to âusers can submit their own proven execution tablesâ? Proof delegation protocols (where users can outsource proving without revealing execution intent) might be the missing primitive.
2. Execution Lookup Cost at Scale
In Rollups.sol, _findAndApplyExecution() does a linear backward scan over all executions stored under a given actionHash. In production, different builders would load speculative executions for the same action across different state snapshots. This makes lookup O(n) per execution.
Keying executions by keccak256(actionHash, currentStateRoots[]) would make lookup O(1) at the cost of more complex key construction during loadL2Executions(). The execution-time savings would dominate.
3. Stale Execution Cleanup
Pre-loaded executions that can no longer match (because rollup state has advanced past their currentState snapshots) persist in storage indefinitely. Without an expiry or cleanup mechanism, the _executions mapping accumulates dead entries. Adding a blockLoaded field and allowing permissionless cleanup after N blocks would mitigate this.
4. Failure Mode Granularity
Looking at _handleScopeRevert(), the revert propagation cleanly restores rollup state roots and continues via REVERT_CONTINUE. This gives all-or-nothing semantics at each scope boundary, which is correct for the general case.
For multi-domain settlement operations (oracle read on L1, compliance check on L1, payout on L2), strict atomicity means the entire operation fails if any single rollup is temporarily unavailable. A TRY_CALL action type where the caller gets (success, returnData) back and can branch rather than forcing a revert up the scope chain would enable graceful degradation. The execution table would need to encode both success and failure paths which increases proof complexity but hopefully enables partial atomicity boundaries.
5. Cross-domain Test Coverage
I found that the test suite thoroughly covers single-rollup execution flows, but the core value proposition atomic multi-rollup cross-domain calls isnât tested yet. A test like Rollup A calls L1, which calls Rollup B, result propagates back and influences Rollup A's state transition would be the canonical integration test. Happy to contribute one.
For context, I have been analyzing this from the perspective of cross-chain parametric settlement and risk assessment. So digging into specifics of how this would work for things like insurance, derivatives, etc. specifically atomic cross-chain settlement and real-time compliance verification. I shared some thoughts on this in a recent Gnosis forum response.