mirror of
https://github.com/status-im/eth2.0-specs.git
synced 2025-02-09 09:14:32 +00:00
Add BLOB_SIDECAR_SUBNET_COUNT_EIP7594
, MAX_BLOBS_PER_BLOCK_EIP7594
, and MAX_REQUEST_BLOB_SIDECARS_EIP7594
This commit is contained in:
parent
a09d0c3215
commit
62e6a30ec1
@ -165,6 +165,10 @@ DATA_COLUMN_SIDECAR_SUBNET_COUNT: 128
|
|||||||
MAX_REQUEST_DATA_COLUMN_SIDECARS: 16384
|
MAX_REQUEST_DATA_COLUMN_SIDECARS: 16384
|
||||||
SAMPLES_PER_SLOT: 8
|
SAMPLES_PER_SLOT: 8
|
||||||
CUSTODY_REQUIREMENT: 4
|
CUSTODY_REQUIREMENT: 4
|
||||||
|
BLOB_SIDECAR_SUBNET_COUNT_EIP7594: 8
|
||||||
|
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]
|
# [New in Electra:EIP7251]
|
||||||
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 128000000000 # 2**7 * 10**9 (= 128,000,000,000)
|
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 128000000000 # 2**7 * 10**9 (= 128,000,000,000)
|
||||||
|
@ -164,6 +164,10 @@ DATA_COLUMN_SIDECAR_SUBNET_COUNT: 128
|
|||||||
MAX_REQUEST_DATA_COLUMN_SIDECARS: 16384
|
MAX_REQUEST_DATA_COLUMN_SIDECARS: 16384
|
||||||
SAMPLES_PER_SLOT: 8
|
SAMPLES_PER_SLOT: 8
|
||||||
CUSTODY_REQUIREMENT: 4
|
CUSTODY_REQUIREMENT: 4
|
||||||
|
BLOB_SIDECAR_SUBNET_COUNT_EIP7594: 8
|
||||||
|
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]
|
# [New in Electra:EIP7251]
|
||||||
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 64000000000 # 2**6 * 10**9 (= 64,000,000,000)
|
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 64000000000 # 2**6 * 10**9 (= 64,000,000,000)
|
||||||
|
141
specs/_features/eip7594/beacon-chain.md
Normal file
141
specs/_features/eip7594/beacon-chain.md
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
# EIP7594 -- The Beacon Chain
|
||||||
|
|
||||||
|
**Notice**: This document is a work-in-progress for researchers and implementers.
|
||||||
|
|
||||||
|
## Table of contents
|
||||||
|
|
||||||
|
<!-- TOC -->
|
||||||
|
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||||||
|
|
||||||
|
- [Introduction](#introduction)
|
||||||
|
- [Configuration](#configuration)
|
||||||
|
- [Execution](#execution)
|
||||||
|
- [Execution payload](#execution-payload)
|
||||||
|
- [Modified `process_execution_payload`](#modified-process_execution_payload)
|
||||||
|
- [Testing](#testing)
|
||||||
|
|
||||||
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
|
<!-- /TOC -->
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
*Note:* This specification is built upon [Electra](../electra/beacon-chain.md) and is under active development.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Execution
|
||||||
|
|
||||||
|
| Name | Value | Description |
|
||||||
|
| - | - | - |
|
||||||
|
| `MAX_BLOBS_PER_BLOCK_EIP7594` | `uint64(8)` | *[New in EIP7494]* maximum number of blobs in a single block limited by `MAX_BLOB_COMMITMENTS_PER_BLOCK` |
|
||||||
|
|
||||||
|
|
||||||
|
#### Execution payload
|
||||||
|
|
||||||
|
##### Modified `process_execution_payload`
|
||||||
|
|
||||||
|
```python
|
||||||
|
def process_execution_payload(state: BeaconState, body: BeaconBlockBody, execution_engine: ExecutionEngine) -> None:
|
||||||
|
payload = body.execution_payload
|
||||||
|
|
||||||
|
# Verify consistency of the parent hash with respect to the previous execution payload header
|
||||||
|
assert payload.parent_hash == state.latest_execution_payload_header.block_hash
|
||||||
|
# Verify prev_randao
|
||||||
|
assert payload.prev_randao == get_randao_mix(state, get_current_epoch(state))
|
||||||
|
# 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_EIP7594 # [Modified in EIP7594]
|
||||||
|
# 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(
|
||||||
|
NewPayloadRequest(
|
||||||
|
execution_payload=payload,
|
||||||
|
versioned_hashes=versioned_hashes,
|
||||||
|
parent_beacon_block_root=state.latest_block_header.parent_root,
|
||||||
|
execution_requests=body.execution_requests,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# Cache execution payload header
|
||||||
|
state.latest_execution_payload_header = ExecutionPayloadHeader(
|
||||||
|
parent_hash=payload.parent_hash,
|
||||||
|
fee_recipient=payload.fee_recipient,
|
||||||
|
state_root=payload.state_root,
|
||||||
|
receipts_root=payload.receipts_root,
|
||||||
|
logs_bloom=payload.logs_bloom,
|
||||||
|
prev_randao=payload.prev_randao,
|
||||||
|
block_number=payload.block_number,
|
||||||
|
gas_limit=payload.gas_limit,
|
||||||
|
gas_used=payload.gas_used,
|
||||||
|
timestamp=payload.timestamp,
|
||||||
|
extra_data=payload.extra_data,
|
||||||
|
base_fee_per_gas=payload.base_fee_per_gas,
|
||||||
|
block_hash=payload.block_hash,
|
||||||
|
transactions_root=hash_tree_root(payload.transactions),
|
||||||
|
withdrawals_root=hash_tree_root(payload.withdrawals),
|
||||||
|
blob_gas_used=payload.blob_gas_used,
|
||||||
|
excess_blob_gas=payload.excess_blob_gas,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
*Note*: The function `initialize_beacon_state_from_eth1` is modified for pure EIP7594 testing only.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def initialize_beacon_state_from_eth1(eth1_block_hash: Hash32,
|
||||||
|
eth1_timestamp: uint64,
|
||||||
|
deposits: Sequence[Deposit],
|
||||||
|
execution_payload_header: ExecutionPayloadHeader=ExecutionPayloadHeader()
|
||||||
|
) -> BeaconState:
|
||||||
|
fork = Fork(
|
||||||
|
previous_version=EIP7594_FORK_VERSION, # [Modified in EIP7594] for testing only
|
||||||
|
current_version=EIP7594_FORK_VERSION, # [Modified in EIP7594]
|
||||||
|
epoch=GENESIS_EPOCH,
|
||||||
|
)
|
||||||
|
state = BeaconState(
|
||||||
|
genesis_time=eth1_timestamp + GENESIS_DELAY,
|
||||||
|
fork=fork,
|
||||||
|
eth1_data=Eth1Data(block_hash=eth1_block_hash, deposit_count=uint64(len(deposits))),
|
||||||
|
latest_block_header=BeaconBlockHeader(body_root=hash_tree_root(BeaconBlockBody())),
|
||||||
|
randao_mixes=[eth1_block_hash] * EPOCHS_PER_HISTORICAL_VECTOR, # Seed RANDAO with Eth1 entropy
|
||||||
|
deposit_requests_start_index=UNSET_DEPOSIT_REQUESTS_START_INDEX,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Process deposits
|
||||||
|
leaves = list(map(lambda deposit: deposit.data, deposits))
|
||||||
|
for index, deposit in enumerate(deposits):
|
||||||
|
deposit_data_list = List[DepositData, 2**DEPOSIT_CONTRACT_TREE_DEPTH](*leaves[:index + 1])
|
||||||
|
state.eth1_data.deposit_root = hash_tree_root(deposit_data_list)
|
||||||
|
process_deposit(state, deposit)
|
||||||
|
|
||||||
|
# Process deposit balance updates
|
||||||
|
validator_pubkeys = [v.pubkey for v in state.validators]
|
||||||
|
for deposit in state.pending_deposits:
|
||||||
|
validator_index = ValidatorIndex(validator_pubkeys.index(deposit.pubkey))
|
||||||
|
increase_balance(state, validator_index, deposit.amount)
|
||||||
|
state.pending_deposits = []
|
||||||
|
|
||||||
|
# Process activations
|
||||||
|
for index, validator in enumerate(state.validators):
|
||||||
|
balance = state.balances[index]
|
||||||
|
validator.effective_balance = min(
|
||||||
|
balance - balance % EFFECTIVE_BALANCE_INCREMENT, get_max_effective_balance(validator))
|
||||||
|
if validator.effective_balance >= MIN_ACTIVATION_BALANCE:
|
||||||
|
validator.activation_eligibility_epoch = GENESIS_EPOCH
|
||||||
|
validator.activation_epoch = GENESIS_EPOCH
|
||||||
|
|
||||||
|
# Set genesis validators root for domain separation and chain versioning
|
||||||
|
state.genesis_validators_root = hash_tree_root(state.validators)
|
||||||
|
|
||||||
|
# Fill in sync committees
|
||||||
|
# Note: A duplicate committee is assigned for the current and next committee at genesis
|
||||||
|
state.current_sync_committee = get_next_sync_committee(state)
|
||||||
|
state.next_sync_committee = get_next_sync_committee(state)
|
||||||
|
|
||||||
|
# Initialize the execution payload header
|
||||||
|
state.latest_execution_payload_header = execution_payload_header
|
||||||
|
|
||||||
|
return state
|
||||||
|
```
|
@ -21,11 +21,15 @@
|
|||||||
- [MetaData](#metadata)
|
- [MetaData](#metadata)
|
||||||
- [The gossip domain: gossipsub](#the-gossip-domain-gossipsub)
|
- [The gossip domain: gossipsub](#the-gossip-domain-gossipsub)
|
||||||
- [Topics and messages](#topics-and-messages)
|
- [Topics and messages](#topics-and-messages)
|
||||||
|
- [Global topics](#global-topics)
|
||||||
|
- [`beacon_block`](#beacon_block)
|
||||||
- [Blob subnets](#blob-subnets)
|
- [Blob subnets](#blob-subnets)
|
||||||
- [Deprecated `blob_sidecar_{subnet_id}`](#deprecated-blob_sidecar_subnet_id)
|
- [Deprecated `blob_sidecar_{subnet_id}`](#deprecated-blob_sidecar_subnet_id)
|
||||||
- [`data_column_sidecar_{subnet_id}`](#data_column_sidecar_subnet_id)
|
- [`data_column_sidecar_{subnet_id}`](#data_column_sidecar_subnet_id)
|
||||||
- [The Req/Resp domain](#the-reqresp-domain)
|
- [The Req/Resp domain](#the-reqresp-domain)
|
||||||
- [Messages](#messages)
|
- [Messages](#messages)
|
||||||
|
- [BlobSidecarsByRoot v2](#blobsidecarsbyroot-v2)
|
||||||
|
- [BlobSidecarsByRange v2](#blobsidecarsbyrange-v2)
|
||||||
- [DataColumnSidecarsByRoot v1](#datacolumnsidecarsbyroot-v1)
|
- [DataColumnSidecarsByRoot v1](#datacolumnsidecarsbyroot-v1)
|
||||||
- [DataColumnSidecarsByRange v1](#datacolumnsidecarsbyrange-v1)
|
- [DataColumnSidecarsByRange v1](#datacolumnsidecarsbyrange-v1)
|
||||||
- [GetMetaData v3](#getmetadata-v3)
|
- [GetMetaData v3](#getmetadata-v3)
|
||||||
@ -52,6 +56,8 @@
|
|||||||
|------------------------------------------------|------------------------------------------------|---------------------------------------------------------------------------|
|
|------------------------------------------------|------------------------------------------------|---------------------------------------------------------------------------|
|
||||||
| `MAX_REQUEST_DATA_COLUMN_SIDECARS` | `MAX_REQUEST_BLOCKS_DENEB * NUMBER_OF_COLUMNS` | Maximum number of data column sidecars in a single request |
|
| `MAX_REQUEST_DATA_COLUMN_SIDECARS` | `MAX_REQUEST_BLOCKS_DENEB * NUMBER_OF_COLUMNS` | Maximum number of data column sidecars in a single request |
|
||||||
| `MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS` | `2**12` (= 4096 epochs, ~18 days) | The minimum epoch range over which a node must serve data column sidecars |
|
| `MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS` | `2**12` (= 4096 epochs, ~18 days) | The minimum epoch range over which a node must serve data column sidecars |
|
||||||
|
| `MAX_REQUEST_BLOB_SIDECARS_EIP7594` | `MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK_EIP7594` | Maximum number of blob sidecars in a single request |
|
||||||
|
| `BLOB_SIDECAR_SUBNET_COUNT_EIP7594` | `2**3` (= 8) | The number of blob sidecar subnets used in the gossipsub protocol. |
|
||||||
|
|
||||||
### Containers
|
### Containers
|
||||||
|
|
||||||
@ -154,6 +160,16 @@ Some gossip meshes are upgraded in the EIP-7594 fork to support upgraded types.
|
|||||||
|
|
||||||
#### Topics and messages
|
#### Topics and messages
|
||||||
|
|
||||||
|
|
||||||
|
##### Global topics
|
||||||
|
|
||||||
|
###### `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_EIP7594`
|
||||||
|
|
||||||
##### Blob subnets
|
##### Blob subnets
|
||||||
|
|
||||||
###### Deprecated `blob_sidecar_{subnet_id}`
|
###### Deprecated `blob_sidecar_{subnet_id}`
|
||||||
@ -189,6 +205,74 @@ The following validations MUST pass before forwarding the `sidecar: DataColumnSi
|
|||||||
|
|
||||||
#### Messages
|
#### Messages
|
||||||
|
|
||||||
|
##### BlobSidecarsByRoot v2
|
||||||
|
|
||||||
|
**Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_root/2/`
|
||||||
|
|
||||||
|
*[Updated in EIP7594]*
|
||||||
|
|
||||||
|
The `<context-bytes>` field is calculated as `context = compute_fork_digest(fork_version, genesis_validators_root)`:
|
||||||
|
|
||||||
|
[1]: # (eth2spec: skip)
|
||||||
|
|
||||||
|
| `fork_version` | Chunk SSZ type |
|
||||||
|
|--------------------------|-------------------------------|
|
||||||
|
| `EIP7594_FORK_VERSION` | `eip7594.BlobSidecar` |
|
||||||
|
|
||||||
|
Request Content:
|
||||||
|
|
||||||
|
```
|
||||||
|
(
|
||||||
|
List[BlobIdentifier, MAX_REQUEST_BLOB_SIDECARS_EIP7594]
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Response Content:
|
||||||
|
|
||||||
|
```
|
||||||
|
(
|
||||||
|
List[BlobSidecar, MAX_REQUEST_BLOB_SIDECARS_EIP7594]
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
*Updated validation*
|
||||||
|
|
||||||
|
No more than `MAX_REQUEST_BLOB_SIDECARS_EIP7594` may be requested at a time.
|
||||||
|
|
||||||
|
|
||||||
|
##### BlobSidecarsByRange v2
|
||||||
|
|
||||||
|
**Protocol ID:** `/eth2/beacon_chain/req/blob_sidecars_by_range/2/`
|
||||||
|
|
||||||
|
*[Updated in EIP7594]*
|
||||||
|
|
||||||
|
The `<context-bytes>` field is calculated as `context = compute_fork_digest(fork_version, genesis_validators_root)`:
|
||||||
|
|
||||||
|
[1]: # (eth2spec: skip)
|
||||||
|
|
||||||
|
| `fork_version` | Chunk SSZ type |
|
||||||
|
|--------------------------|-------------------------------|
|
||||||
|
| `EIP7594_FORK_VERSION` | `eip7594.BlobSidecar` |
|
||||||
|
|
||||||
|
Request Content:
|
||||||
|
```
|
||||||
|
(
|
||||||
|
start_slot: Slot
|
||||||
|
count: uint64
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Response Content:
|
||||||
|
```
|
||||||
|
(
|
||||||
|
List[BlobSidecar, MAX_REQUEST_BLOB_SIDECARS_EIP7594]
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
*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_EIP7594` sidecars.
|
||||||
|
|
||||||
##### DataColumnSidecarsByRoot v1
|
##### DataColumnSidecarsByRoot v1
|
||||||
|
|
||||||
**Protocol ID:** `/eth2/beacon_chain/req/data_column_sidecars_by_root/1/`
|
**Protocol ID:** `/eth2/beacon_chain/req/data_column_sidecars_by_root/1/`
|
||||||
|
@ -77,7 +77,7 @@ Deneb is a consensus-layer upgrade containing a number of features. Including:
|
|||||||
|
|
||||||
| Name | Value | Description |
|
| Name | Value | Description |
|
||||||
| - | - | - |
|
| - | - | - |
|
||||||
| `MAX_BLOB_COMMITMENTS_PER_BLOCK` | `uint64(2**12)` (= 4096) | *[New in Deneb:EIP4844]* hardfork independent fixed theoretical limit same as `LIMIT_BLOBS_PER_TX` (see EIP 4844) |
|
| `MAX_BLOB_COMMITMENTS_PER_BLOCK` | `uint64(2**12)` (= 4096) | *[New in Deneb:EIP4844]* hardfork independent fixed theoretical limit same as `TARGET_BLOB_GAS_PER_BLOCK` (see EIP 4844) |
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user