Due to the public first-price nature of the MEV-boost auction, searchers have become incentivized to vertically integrate, becoming "searcher-builders" to bid "more strategically". This verticalization aimed at gaining an edge in the MEV-Boost auction has had the unfortunate consequence of considerably raising the barriers to entry for statistical arbitrage, and as a follow on consequence, has created an unfavorable market structure where new "searcher-builders" are bulk purchasing orderflow from other builders and subsidizing blocks as an effective "advertisement spend" to reach orderflow parity with incumbent block builders. Attempts to remove this edge from "strategic bidding" have primarily been focused on modifying the auction into a sealed-bid format, all of which have fallen short as they introduce new collusion vectors in the absence of private and credible commitment technology such as MPC, FHE, and TEEs.
Greatly borrowing from distributed systems literature, this post sketches a proposal for enabling the ability to "lock state" in the mev-boost auction, with a follow-on feature of providing visibility into this "locked state". The ultimate outcome of this approach is that block builders are no longer effectively "pipeline stalled" via uncertainty in constructing the rest of the block, which opens the door for "Collaborative Block Building". In distributed systems terms, we are creating a "boot leg" decentralized multi-version concurrency control system for the ethereum distributed state machine by leveraging visibility.
The main advantages of this approach are that it maintains basic privacy and bid update-ability to searchers competing in these high-velocity arbitrages, supports more generic arbitrage compared to previous "laned" approaches, and is easily deployable into the current market. The main drawbacks are its creation of a "pseudo-enshrinement" of single transaction arbitrages at the top of the block and offering a new censorship and griefing vector. As this proposal is merely a sketch, there are still large unknowns around how to effectively price the cost to lock state, the effects on searcher's bidding strategies, and how to generalize the auction past the ability to lock a single set of states.
While not exhaustive, some immediately apparent favorable properties:
For most of this post we refer to the state to be locked as an "access list". In the context of EIP-2930, a state access list
Where:
An example access list for a swap is shown in Appendix A.
Representing searchers as
Open Auction:
Prior to the cutoff time
where
and upon submission
Winner Selection:
Bid Updating and Partial Block Submission:
Two main activites can occur post winner selection:
The winning searcher
where:
and the payment transaction
Partial block builders query
where:
and
getHeader
calls from validators.Below is an artist's rendition of the above auction process.
A rough sketch of the changes to the relay spec can be seen in Appendix B.
This approach meets most of our core objectives for a state lock system: ensuring Locker Safety, Bid Update-ability, Locked State Visibility, and Guaranteed Lock Payment, takes an initial stab at Squatting Resistance, and makes no attempt at being Contention Aware. Even further, Locked State Visibility lays the foundation for collaborative block building by allowing builders to append partial blocks to top-of-block arbitrages more confidently. The design deliberately avoids checks for conflicting transactions during
One area of concern is shifting towards a more relay-centric block building and normalizing builderelays. My biased and cautious initial reaction is that we should be okay with this trend as long as it does not create opinions on which blocks are built or give an unequal advantage to one party over another. From this POV, relays will continue to house more auction-related logic as a trusted third party amongst a network of builders, each additional piece of logic ideally helping to promote more collaborative block building.
This approach requires no protocol changes and can be run in parallel with the current mev-boost auction. Additionally, it creates a "laned" approach without restricting it to a single arbitrage type, but is not fully generalized as it restricts top-of-block arbitrages to a single transaction. Exploring bundle support is thus an ideal future exploration, but if done naively, could create additional complications via a new avenue to submit entire blocks.
There are, however, a few complexities with taking this approach live. One is that it suffers from a cold start problem. If, at launch, only one searcher has developed the capabilities to compete in this auction, they will likely dominate for a short period and very cheaply, depending on the lock reserve cost price. The dual of this is that it only takes one searcher's participation to snowball the rest. Another area for improvement is that this design only focused on the singular relay case, but in reality, there are many relays that all act independently. One thought is that maybe synchronization doesn't matter since bid cancellations are a similar cross-relay problem that is not guaranteed. In the multi-relay scenario, the best case is that each agrees on the state to be locked. In the worst case, each has a different state set and partial block builders construct for all potential paths. This creates more work, but at the very least it is parallelizable and still a significant improvement over the status quo. Another area for future exploration is how this approach plays with optimistic relaying given its more complicated validation logic.
Lastly, the most significant unknowns here are the lock pricing mechanism and effects on searcher strategies. The lock pricing mechanism is very undefined and most likely the place where things can go comically wrong, therefore follow up work should try to reason about this analytically and adversarially. Incorporation of historical state access into the pricing mechanism is also difficult because that is an extremely large vector to update if done naively, and cannot be plugged into the block like the base fee relies on. Progress on figuring out this mechanism will also help to assess how big of a censorship vector this auction is and tease out the incentives more concretely. The effects of creating a new upfront cost to doing statistical arbitrage also should be thought through, but in the worst case, a searcher can effectively cancel their trade and simply pay the fee, not requiring them to commit to trading large amounts at a price they no longer find attractive based on signals on other domains.
The challenge for integrating this approach with something like a futue "ePBS" is that we would need to shift the auction to the attester layer, which naively requires an additionaly synchrony period. The network must come to agreement on "what" the winning access list is. Not to mention the p2p games that this incentivies at the protocol layer.
One reason against moving this sort of thing into the protocol is that it doesn't affect the resources on the network from a validator's perspective, more or less locks wont affect the resource requirements needed to perform a validator's duties. Additionally, lock auctions dont represent liveliness risk to the network. If the auction goes down, then we degrade back to the current state of block building. An argument in support of moving it into the protocol is that the auction generates revenue from the protocol's state.
This proposal sketches out a design for a relatively crude mechanism to auction a top-of-block state lock on Ethereum and enables collaboration in the block builder market. While not an end game solution, it creates an ideal interface for experimentation with state locks and unlocks new aspects of the block building market which may help us out of our current local maxima. Assuming an ideal lock pricing mechanism, this approach can go live into the wild quickly and move us one step towards a better builder market structure.
Exmaple Access List for
Wrapped Ether
for Porktoshi Nakamoto
.Created via Created via these python scripts.
[
{
"address": "0xa65303cbe1186f58dda9cf96b29e1e89ae90b165",
"storageKeys": [
"0x0000000000000000000000000000000000000000000000000000000000000008"
]
},
{
"address": "0xb39bc86ac75118011f646276fca48d56e54c4854",
"storageKeys": [
"0x000000000000000000000000000000000000000000000000000000000000000d",
"0x7e3bb96fe9c3e8bf8baff39136a5e5778a1f21be90df3270983ce535ed884516",
"0x9db3014a7ecc5c8baca43505a03b4e7e24c2ec389a973d5605a299f04defc730"
]
},
{
"address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"storageKeys": [
"0x377eec8667584e30e85471441b46e69393e5f35d2b63a0b4c26a5b1f6d059aa5"
]
}
]
Here
- 0xC02aaA...3C756Cc2
is the WETH token contract
- 0xb39BC8...e54C4854
is the PORKTOSHI token contract
- 0xA65303...AE90B165
is the PORKTOSHI/WETH Uni V2 Pool
Based on the storage keys for the PORKTOSHI contract we can see there is some non-standard ERC20 behavior and the source code verifies that but is besides the point.
Validation rules and internal logic are explained in the previous sections.
relay_SubmitStateCommitment
Allows participants to submit a state commitment for a particular slot.
Accepts:
n
(Slot Number): Integer representing the slot number.A
(Access List): Array of objects detailing state keys (address
and storageKeys
) a transaction intends to interact with.statetx
(Signed Transaction): Hexadecimal string of the signed transaction.paymenttx
(Signed Transaction): Hexadecimal string of the signed transaction.b
(Bid Value): Integer representing the bid value in wei.Returns: Confirmation of submission.
relay_GetLockedState
Fetches the access list associated with the winning bid for the specified slot.
Accepts:
Returns:
A
): Array of objects detailing state keys (address
and storageKeys
) for the top bid of the specified slot.relay_SubmitPartialPayload
Enables partial block builders to submit a set of transactions as a partial block proposal.
Accepts:
TX_list
(List of Transactions): Array of hexadecimal strings representing transactions.b_PB
(Bid Value for Partial Block): Integer representing the bid value in wei for the partial block.Returns: Confirmation of partial payload submission.