mirror of
https://github.com/ethereum/consensus-specs.git
synced 2026-01-14 11:17:56 -05:00
Add EIP-7691
This commit is contained in:
@@ -144,14 +144,26 @@ ATTESTATION_SUBNET_PREFIX_BITS: 6
|
||||
# Deneb
|
||||
# `2**7` (=128)
|
||||
MAX_REQUEST_BLOCKS_DENEB: 128
|
||||
# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK
|
||||
MAX_REQUEST_BLOB_SIDECARS: 768
|
||||
# `2**12` (= 4096 epochs, ~18 days)
|
||||
MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: 4096
|
||||
# `6`
|
||||
BLOB_SIDECAR_SUBNET_COUNT: 6
|
||||
## `uint64(6)`
|
||||
# `uint64(6)`
|
||||
MAX_BLOBS_PER_BLOCK: 6
|
||||
# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK
|
||||
MAX_REQUEST_BLOB_SIDECARS: 768
|
||||
|
||||
# Electra
|
||||
# 2**7 * 10**9 (= 128,000,000,000)
|
||||
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 128000000000
|
||||
# 2**8 * 10**9 (= 256,000,000,000)
|
||||
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: 256000000000
|
||||
# `9`
|
||||
BLOB_SIDECAR_SUBNET_COUNT_ELECTRA: 9
|
||||
# `uint64(9)`
|
||||
MAX_BLOBS_PER_BLOCK_ELECTRA: 9
|
||||
# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK_ELECTRA
|
||||
MAX_REQUEST_BLOB_SIDECARS_ELECTRA: 1152
|
||||
|
||||
# Whisk
|
||||
# `Epoch(2**8)`
|
||||
@@ -170,9 +182,5 @@ MAX_BLOBS_PER_BLOCK_EIP7594: 8
|
||||
# `MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK_EIP7594`
|
||||
MAX_REQUEST_BLOB_SIDECARS_EIP7594: 1024
|
||||
|
||||
# [New in Electra:EIP7251]
|
||||
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 128000000000 # 2**7 * 10**9 (= 128,000,000,000)
|
||||
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: 256000000000 # 2**8 * 10**9 (= 256,000,000,000)
|
||||
|
||||
# EIP7732
|
||||
MAX_REQUEST_PAYLOADS: 128
|
||||
|
||||
@@ -145,14 +145,26 @@ ATTESTATION_SUBNET_PREFIX_BITS: 6
|
||||
# Deneb
|
||||
# `2**7` (=128)
|
||||
MAX_REQUEST_BLOCKS_DENEB: 128
|
||||
# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK
|
||||
MAX_REQUEST_BLOB_SIDECARS: 768
|
||||
# `2**12` (= 4096 epochs, ~18 days)
|
||||
MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: 4096
|
||||
# `6`
|
||||
BLOB_SIDECAR_SUBNET_COUNT: 6
|
||||
## `uint64(6)`
|
||||
MAX_BLOBS_PER_BLOCK: 6
|
||||
# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK
|
||||
MAX_REQUEST_BLOB_SIDECARS: 768
|
||||
|
||||
# Electra
|
||||
# [customized] 2**6 * 10**9 (= 64,000,000,000)
|
||||
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 64000000000
|
||||
# [customized] 2**7 * 10**9 (= 128,000,000,000)
|
||||
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: 128000000000
|
||||
# `9`
|
||||
BLOB_SIDECAR_SUBNET_COUNT_ELECTRA: 9
|
||||
# `uint64(9)`
|
||||
MAX_BLOBS_PER_BLOCK_ELECTRA: 9
|
||||
# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK_ELECTRA
|
||||
MAX_REQUEST_BLOB_SIDECARS_ELECTRA: 1152
|
||||
|
||||
# Whisk
|
||||
WHISK_EPOCHS_PER_SHUFFLING_PHASE: 4
|
||||
@@ -169,9 +181,5 @@ MAX_BLOBS_PER_BLOCK_EIP7594: 8
|
||||
# `MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK_EIP7594`
|
||||
MAX_REQUEST_BLOB_SIDECARS_EIP7594: 1024
|
||||
|
||||
# [New in Electra:EIP7251]
|
||||
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 64000000000 # 2**6 * 10**9 (= 64,000,000,000)
|
||||
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: 128000000000 # 2**7 * 10**9 (= 128,000,000,000)
|
||||
|
||||
# EIP7732
|
||||
MAX_REQUEST_PAYLOADS: 128
|
||||
|
||||
@@ -28,8 +28,8 @@
|
||||
- [`data_column_sidecar_{subnet_id}`](#data_column_sidecar_subnet_id)
|
||||
- [The Req/Resp domain](#the-reqresp-domain)
|
||||
- [Messages](#messages)
|
||||
- [BlobSidecarsByRoot v2](#blobsidecarsbyroot-v2)
|
||||
- [BlobSidecarsByRange v2](#blobsidecarsbyrange-v2)
|
||||
- [BlobSidecarsByRoot v3](#blobsidecarsbyroot-v3)
|
||||
- [BlobSidecarsByRange v3](#blobsidecarsbyrange-v3)
|
||||
- [DataColumnSidecarsByRoot v1](#datacolumnsidecarsbyroot-v1)
|
||||
- [DataColumnSidecarsByRange v1](#datacolumnsidecarsbyrange-v1)
|
||||
- [GetMetaData v3](#getmetadata-v3)
|
||||
@@ -204,9 +204,9 @@ The following validations MUST pass before forwarding the `sidecar: DataColumnSi
|
||||
|
||||
#### Messages
|
||||
|
||||
##### BlobSidecarsByRoot v2
|
||||
##### BlobSidecarsByRoot v3
|
||||
|
||||
**Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_root/2/`
|
||||
**Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_root/3/`
|
||||
|
||||
*[Updated in EIP7594]*
|
||||
|
||||
@@ -238,9 +238,9 @@ Response Content:
|
||||
|
||||
No more than `MAX_REQUEST_BLOB_SIDECARS_EIP7594` may be requested at a time.
|
||||
|
||||
##### BlobSidecarsByRange v2
|
||||
##### BlobSidecarsByRange v3
|
||||
|
||||
**Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_range/2/`
|
||||
**Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_range/3/`
|
||||
|
||||
*[Updated in EIP7594]*
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
- [Withdrawals processing](#withdrawals-processing)
|
||||
- [Pending deposits processing](#pending-deposits-processing)
|
||||
- [Configuration](#configuration)
|
||||
- [Execution](#execution-1)
|
||||
- [Validator cycle](#validator-cycle)
|
||||
- [Containers](#containers)
|
||||
- [New containers](#new-containers)
|
||||
@@ -119,6 +120,7 @@ Electra is a consensus-layer upgrade containing a number of features. Including:
|
||||
* [EIP-7002](https://eips.ethereum.org/EIPS/eip-7002): Execution layer triggerable exits
|
||||
* [EIP-7251](https://eips.ethereum.org/EIPS/eip-7251): Increase the MAX_EFFECTIVE_BALANCE
|
||||
* [EIP-7549](https://eips.ethereum.org/EIPS/eip-7549): Move committee index outside Attestation
|
||||
* [EIP-7691](https://eips.ethereum.org/EIPS/eip-7691): Blob throughput increase
|
||||
|
||||
*Note:* This specification is built upon [Deneb](../deneb/beacon-chain.md) and is under active development.
|
||||
|
||||
@@ -200,6 +202,12 @@ The following values are (non-configurable) constants used throughout the specif
|
||||
|
||||
## Configuration
|
||||
|
||||
### Execution
|
||||
|
||||
| Name | Value | Description |
|
||||
| - | - | - |
|
||||
| `MAX_BLOBS_PER_BLOCK_ELECTRA` | `uint64(9)` | *[New in Electra:EIP-7691]* Maximum number of blobs in a single block limited by `MAX_BLOB_COMMITMENTS_PER_BLOCK` |
|
||||
|
||||
### Validator cycle
|
||||
|
||||
| Name | Value |
|
||||
@@ -1205,7 +1213,7 @@ def process_execution_payload(state: BeaconState, body: BeaconBlockBody, executi
|
||||
# Verify timestamp
|
||||
assert payload.timestamp == compute_timestamp_at_slot(state, state.slot)
|
||||
# Verify commitments are under limit
|
||||
assert len(body.blob_kzg_commitments) <= MAX_BLOBS_PER_BLOCK
|
||||
assert len(body.blob_kzg_commitments) <= MAX_BLOBS_PER_BLOCK_ELECTRA # [Modified in Electra:EIP7691]
|
||||
# Verify the execution payload is valid
|
||||
versioned_hashes = [kzg_commitment_to_versioned_hash(commitment) for commitment in body.blob_kzg_commitments]
|
||||
assert execution_engine.verify_and_notify_new_payload(
|
||||
|
||||
@@ -11,18 +11,33 @@ The specification of these changes continues in the same format as the network s
|
||||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||||
|
||||
- [Modifications in Electra](#modifications-in-electra)
|
||||
- [Configuration](#configuration)
|
||||
- [The gossip domain: gossipsub](#the-gossip-domain-gossipsub)
|
||||
- [Topics and messages](#topics-and-messages)
|
||||
- [Global topics](#global-topics)
|
||||
- [`beacon_aggregate_and_proof`](#beacon_aggregate_and_proof)
|
||||
- [Attestation subnets](#attestation-subnets)
|
||||
- [`beacon_attestation_{subnet_id}`](#beacon_attestation_subnet_id)
|
||||
- [Global topics](#global-topics)
|
||||
- [`beacon_block`](#beacon_block)
|
||||
- [`beacon_aggregate_and_proof`](#beacon_aggregate_and_proof)
|
||||
- [Attestation subnets](#attestation-subnets)
|
||||
- [`beacon_attestation_{subnet_id}`](#beacon_attestation_subnet_id)
|
||||
- [The Req/Resp domain](#the-reqresp-domain)
|
||||
- [Messages](#messages)
|
||||
- [BlobSidecarsByRoot v2](#blobsidecarsbyroot-v2)
|
||||
- [BlobSidecarsByRange v2](#blobsidecarsbyrange-v2)
|
||||
|
||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||
<!-- /TOC -->
|
||||
|
||||
## Modifications in Electra
|
||||
|
||||
### Configuration
|
||||
|
||||
*[New in Electra:EIP7691]*
|
||||
|
||||
| Name | Value | Description |
|
||||
|------------------------------------------------|----------------------------------------------------------|---------------------------------------------------------------------------|
|
||||
| `MAX_REQUEST_BLOB_SIDECARS_ELECTRA` | `MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK_ELECTRA` | Maximum number of blob sidecars in a single request |
|
||||
| `BLOB_SIDECAR_SUBNET_COUNT_ELECTRA` | `9` | The number of blob sidecar subnets used in the gossipsub protocol |
|
||||
|
||||
### The gossip domain: gossipsub
|
||||
|
||||
Some gossip meshes are upgraded in the fork of Electra to support upgraded types.
|
||||
@@ -41,9 +56,16 @@ The specification around the creation, validation, and dissemination of messages
|
||||
|
||||
The derivation of the `message-id` remains stable.
|
||||
|
||||
#### Global topics
|
||||
##### Global topics
|
||||
|
||||
##### `beacon_aggregate_and_proof`
|
||||
###### `beacon_block`
|
||||
|
||||
*Updated validation*
|
||||
|
||||
- _[REJECT]_ The length of KZG commitments is less than or equal to the limitation defined in Consensus Layer --
|
||||
i.e. validate that `len(body.signed_beacon_block.message.blob_kzg_commitments) <= MAX_BLOBS_PER_BLOCK_ELECTRA`
|
||||
|
||||
###### `beacon_aggregate_and_proof`
|
||||
|
||||
The following convenience variables are re-defined
|
||||
- `index = get_committee_indices(aggregate.committee_bits)[0]`
|
||||
@@ -52,9 +74,9 @@ The following validations are added:
|
||||
* [REJECT] `len(committee_indices) == 1`, where `committee_indices = get_committee_indices(aggregate)`.
|
||||
* [REJECT] `aggregate.data.index == 0`
|
||||
|
||||
#### Attestation subnets
|
||||
##### Attestation subnets
|
||||
|
||||
##### `beacon_attestation_{subnet_id}`
|
||||
###### `beacon_attestation_{subnet_id}`
|
||||
|
||||
The topic is updated to propagate `SingleAttestation` objects.
|
||||
|
||||
@@ -71,3 +93,76 @@ The following validations are removed:
|
||||
that is, it has exactly one participating validator (`len([bit for bit in aggregation_bits if bit]) == 1`, i.e. exactly 1 bit is set).
|
||||
- _[REJECT]_ The number of aggregation bits matches the committee size -- i.e.
|
||||
`len(aggregation_bits) == len(get_beacon_committee(state, attestation.data.slot, index))`.
|
||||
|
||||
### The Req/Resp domain
|
||||
|
||||
#### Messages
|
||||
|
||||
##### BlobSidecarsByRoot v2
|
||||
|
||||
**Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_root/2/`
|
||||
|
||||
*[Updated in ]*
|
||||
|
||||
The `<context-bytes>` field is calculated as `context = compute_fork_digest(fork_version, genesis_validators_root)`:
|
||||
|
||||
[1]: # (eth2spec: skip)
|
||||
|
||||
| `fork_version` | Chunk SSZ type |
|
||||
|------------------------|-----------------------|
|
||||
| `ELECTRA_FORK_VERSION` | `electra.BlobSidecar` |
|
||||
|
||||
Request Content:
|
||||
|
||||
```
|
||||
(
|
||||
List[BlobIdentifier, MAX_REQUEST_BLOB_SIDECARS_ELECTRA]
|
||||
)
|
||||
```
|
||||
|
||||
Response Content:
|
||||
|
||||
```
|
||||
(
|
||||
List[BlobSidecar, MAX_REQUEST_BLOB_SIDECARS_ELECTRA]
|
||||
)
|
||||
```
|
||||
|
||||
*Updated validation*
|
||||
|
||||
No more than `MAX_REQUEST_BLOB_SIDECARS_ELECTRA` may be requested at a time.
|
||||
|
||||
##### BlobSidecarsByRange v2
|
||||
|
||||
**Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_range/2/`
|
||||
|
||||
*[Updated in ]*
|
||||
|
||||
The `<context-bytes>` field is calculated as `context = compute_fork_digest(fork_version, genesis_validators_root)`:
|
||||
|
||||
[1]: # (eth2spec: skip)
|
||||
|
||||
| `fork_version` | Chunk SSZ type |
|
||||
|------------------------|-----------------------|
|
||||
| `ELECTRA_FORK_VERSION` | `electra.BlobSidecar` |
|
||||
|
||||
Request Content:
|
||||
|
||||
```
|
||||
(
|
||||
start_slot: Slot
|
||||
count: uint64
|
||||
)
|
||||
```
|
||||
|
||||
Response Content:
|
||||
|
||||
```
|
||||
(
|
||||
List[BlobSidecar, MAX_REQUEST_BLOB_SIDECARS_ELECTRA]
|
||||
)
|
||||
```
|
||||
|
||||
*Updated validation*
|
||||
|
||||
Clients MUST respond with at least the blob sidecars of the first blob-carrying block that exists in the range, if they have it, and no more than `MAX_REQUEST_BLOB_SIDECARS_ELECTRA` sidecars.
|
||||
|
||||
@@ -13,3 +13,16 @@ def test_processing_pending_partial_withdrawals(spec):
|
||||
spec.MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP
|
||||
< spec.MAX_WITHDRAWALS_PER_PAYLOAD
|
||||
)
|
||||
|
||||
|
||||
@with_electra_and_later
|
||||
@spec_test
|
||||
@single_phase
|
||||
def test_networking(spec):
|
||||
assert spec.config.MAX_BLOBS_PER_BLOCK_ELECTRA <= spec.MAX_BLOB_COMMITMENTS_PER_BLOCK
|
||||
assert (
|
||||
spec.config.MAX_REQUEST_BLOB_SIDECARS_ELECTRA ==
|
||||
spec.config.MAX_REQUEST_BLOCKS_DENEB * spec.config.MAX_BLOBS_PER_BLOCK_ELECTRA
|
||||
)
|
||||
# Start with the same size, but `BLOB_SIDECAR_SUBNET_COUNT` could potentially increase later.
|
||||
assert spec.config.BLOB_SIDECAR_SUBNET_COUNT_ELECTRA == spec.config.MAX_BLOBS_PER_BLOCK_ELECTRA
|
||||
|
||||
@@ -3,6 +3,7 @@ from rlp import encode, Serializable
|
||||
from rlp.sedes import Binary, CountableList, List as RLPList, big_endian_int, binary
|
||||
|
||||
from eth2spec.test.helpers.forks import (
|
||||
is_post_electra,
|
||||
is_post_eip7594,
|
||||
)
|
||||
|
||||
@@ -108,5 +109,7 @@ def get_sample_blob_tx(spec, blob_count=1, rng=random.Random(5566), is_valid_blo
|
||||
def get_max_blob_count(spec):
|
||||
if is_post_eip7594(spec):
|
||||
return spec.config.MAX_BLOBS_PER_BLOCK_EIP7594
|
||||
elif is_post_electra(spec):
|
||||
return spec.config.MAX_BLOBS_PER_BLOCK_ELECTRA
|
||||
else:
|
||||
return spec.config.MAX_BLOBS_PER_BLOCK
|
||||
|
||||
Reference in New Issue
Block a user