SSZ withdrawals root
The EIP-6465 proposal suggests adding a new Withdrawals Root to the Ethereum protocol using the Simple Serialize (SSZ) data structure. This would allow for more efficient and secure withdrawals from smart contracts. The proposal outlines the technical details of how this would be implemented, including changes to the Ethereum Virtual Machine (EVM) and the addition of new opcodes. The proposal also discusses potential benefits, such as reducing gas costs and improving scalability. However, as of February 2023, the proposal is still in draft form and subject to further review and revision.
Video
Original
Abstract
This EIP defines a migration process of the existing Merkle-Patricia Trie (MPT) commitment for withdrawals to Simple Serialize (SSZ).
Motivation
While the consensus ExecutionPayloadHeader
and the execution block header map to each other conceptually, they are encoded differently. This EIP aims to align the encoding of the withdrawals_root
, taking advantage of the more modern SSZ format. This brings several advantages:
-
Reducing complexity: The proposed design reduces the number of use cases that require support for Merkle-Patricia Trie (MPT).
-
Reducing ambiguity: The name
withdrawals_root
is currently used to refer to different roots. While the execution block header refers to a Merkle Patricia Trie (MPT) root, the consensusExecutionPayloadHeader
instead refers to an SSZ root. With these changes,withdrawals_root
consistently refers to the same SSZ root.
Specification
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 and RFC 8174.
Existing definitions
Definitions from existing specifications that are used throughout this document are replicated here for reference.
Name | SSZ equivalent |
---|---|
ValidatorIndex | uint64 |
Gwei | uint64 |
ExecutionAddress | Bytes20 |
WithdrawalIndex | uint64 |
Withdrawals
New withdrawals use a normalized SSZ representation. The existing consensus Withdrawal
SSZ container is migrated to EIP-7495 ProgressiveContainer
.
class Withdrawal(ProgressiveContainer[active_fields=[1, 1, 1, 1]]): index: WithdrawalIndex validator_index: ValidatorIndex address: ExecutionAddress amount: Gwei
Execution block header changes
The execution block header's withdrawals-root
is transitioned from MPT to SSZ.
withdrawals = ProgressiveList[Withdrawal]( withdrawal_0, withdrawal_1, withdrawal_2, ...) block_header.withdrawals_root == withdrawals.hash_tree_root()
Consensus ExecutionPayload
changes
When building a consensus ExecutionPayload
, the withdrawals
list is based on the new progressive container type.
class ExecutionPayload(...): ... withdrawals: ProgressiveList[Withdrawal] ...
The state transition function is updated to limit withdrawals to MAX_WITHDRAWALS_PER_PAYLOAD
.
Rationale
This change was originally a candidate for inclusion in Shanghai, but was postponed to accelerate the rollout of withdrawals.
Backwards Compatibility
Applications that rely on the replaced MPT withdrawals_root
in the block header require migration to the SSZ withdrawals_root
.
RLP and SSZ withdrawals may clash when encoded. It is essential to use only a single format within one channel. The block header corresponding to the withdrawals can be consulted to identify the underlying fork.
Security Considerations
None
Copyright
Copyright and related rights waived via CC0.
Not miss a beat of EIPs' update?
Subscribe EIPs Fun to receive the latest updates of EIPs Good for Buidlers to follow up.
View all