EIP-6110: Fix `compute_fork_version` and add light client specs
This commit is contained in:
parent
c1b16a2333
commit
cd7783e59d
4
setup.py
4
setup.py
|
@ -1037,6 +1037,10 @@ class PySpecCommand(Command):
|
||||||
"""
|
"""
|
||||||
if self.spec_fork == EIP6110:
|
if self.spec_fork == EIP6110:
|
||||||
self.md_doc_paths += """
|
self.md_doc_paths += """
|
||||||
|
specs/_features/eip6110/light-client/fork.md
|
||||||
|
specs/_features/eip6110/light-client/full-node.md
|
||||||
|
specs/deneb/light-client/p2p-interface.md
|
||||||
|
specs/_features/eip6110/light-client/sync-protocol.md
|
||||||
specs/_features/eip6110/beacon-chain.md
|
specs/_features/eip6110/beacon-chain.md
|
||||||
specs/_features/eip6110/fork.md
|
specs/_features/eip6110/fork.md
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -157,7 +157,7 @@ class BeaconState(Container):
|
||||||
current_sync_committee: SyncCommittee
|
current_sync_committee: SyncCommittee
|
||||||
next_sync_committee: SyncCommittee
|
next_sync_committee: SyncCommittee
|
||||||
# Execution
|
# Execution
|
||||||
latest_execution_payload_header: ExecutionPayloadHeader
|
latest_execution_payload_header: ExecutionPayloadHeader # [Modified in EIP-6110]
|
||||||
# Withdrawals
|
# Withdrawals
|
||||||
next_withdrawal_index: WithdrawalIndex
|
next_withdrawal_index: WithdrawalIndex
|
||||||
next_withdrawal_validator_index: ValidatorIndex
|
next_withdrawal_validator_index: ValidatorIndex
|
||||||
|
|
|
@ -43,7 +43,7 @@ def compute_fork_version(epoch: Epoch) -> Version:
|
||||||
Return the fork version at the given ``epoch``.
|
Return the fork version at the given ``epoch``.
|
||||||
"""
|
"""
|
||||||
if epoch >= EIP6110_FORK_EPOCH:
|
if epoch >= EIP6110_FORK_EPOCH:
|
||||||
return EIP6110_FORK_EPOCH
|
return EIP6110_FORK_VERSION
|
||||||
if epoch >= CAPELLA_FORK_EPOCH:
|
if epoch >= CAPELLA_FORK_EPOCH:
|
||||||
return CAPELLA_FORK_VERSION
|
return CAPELLA_FORK_VERSION
|
||||||
if epoch >= BELLATRIX_FORK_EPOCH:
|
if epoch >= BELLATRIX_FORK_EPOCH:
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
# eip6110 Light Client -- Fork Logic
|
||||||
|
|
||||||
|
## 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)
|
||||||
|
- [Upgrading light client data](#upgrading-light-client-data)
|
||||||
|
- [Upgrading the store](#upgrading-the-store)
|
||||||
|
|
||||||
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
|
<!-- /TOC -->
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This document describes how to upgrade existing light client objects based on the [Capella specification](../../capella/light-client/sync-protocol.md) to eip6110. This is necessary when processing pre-eip6110 data with a post-eip6110 `LightClientStore`. Note that the data being exchanged over the network protocols uses the original format.
|
||||||
|
|
||||||
|
### Upgrading light client data
|
||||||
|
|
||||||
|
A eip6110 `LightClientStore` can still process earlier light client data. In order to do so, that pre-eip6110 data needs to be locally upgraded to eip6110 before processing.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def upgrade_lc_header_to_eip6110(pre: capella.LightClientHeader) -> LightClientHeader:
|
||||||
|
return LightClientHeader(
|
||||||
|
beacon=pre.beacon,
|
||||||
|
execution=ExecutionPayloadHeader(
|
||||||
|
parent_hash=pre.execution.parent_hash,
|
||||||
|
fee_recipient=pre.execution.fee_recipient,
|
||||||
|
state_root=pre.execution.state_root,
|
||||||
|
receipts_root=pre.execution.receipts_root,
|
||||||
|
logs_bloom=pre.execution.logs_bloom,
|
||||||
|
prev_randao=pre.execution.prev_randao,
|
||||||
|
block_number=pre.execution.block_number,
|
||||||
|
gas_limit=pre.execution.gas_limit,
|
||||||
|
gas_used=pre.execution.gas_used,
|
||||||
|
timestamp=pre.execution.timestamp,
|
||||||
|
extra_data=pre.execution.extra_data,
|
||||||
|
base_fee_per_gas=pre.execution.base_fee_per_gas,
|
||||||
|
block_hash=pre.execution.block_hash,
|
||||||
|
transactions_root=pre.execution.transactions_root,
|
||||||
|
withdrawals_root=pre.execution.withdrawals_root,
|
||||||
|
deposit_receipts_root=Root(),
|
||||||
|
),
|
||||||
|
execution_branch=pre.execution_branch,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
def upgrade_lc_bootstrap_to_eip6110(pre: capella.LightClientBootstrap) -> LightClientBootstrap:
|
||||||
|
return LightClientBootstrap(
|
||||||
|
header=upgrade_lc_header_to_eip6110(pre.header),
|
||||||
|
current_sync_committee=pre.current_sync_committee,
|
||||||
|
current_sync_committee_branch=pre.current_sync_committee_branch,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
def upgrade_lc_update_to_eip6110(pre: capella.LightClientUpdate) -> LightClientUpdate:
|
||||||
|
return LightClientUpdate(
|
||||||
|
attested_header=upgrade_lc_header_to_eip6110(pre.attested_header),
|
||||||
|
next_sync_committee=pre.next_sync_committee,
|
||||||
|
next_sync_committee_branch=pre.next_sync_committee_branch,
|
||||||
|
finalized_header=upgrade_lc_header_to_eip6110(pre.finalized_header),
|
||||||
|
finality_branch=pre.finality_branch,
|
||||||
|
sync_aggregate=pre.sync_aggregate,
|
||||||
|
signature_slot=pre.signature_slot,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
def upgrade_lc_finality_update_to_eip6110(pre: capella.LightClientFinalityUpdate) -> LightClientFinalityUpdate:
|
||||||
|
return LightClientFinalityUpdate(
|
||||||
|
attested_header=upgrade_lc_header_to_eip6110(pre.attested_header),
|
||||||
|
finalized_header=upgrade_lc_header_to_eip6110(pre.finalized_header),
|
||||||
|
finality_branch=pre.finality_branch,
|
||||||
|
sync_aggregate=pre.sync_aggregate,
|
||||||
|
signature_slot=pre.signature_slot,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
def upgrade_lc_optimistic_update_to_eip6110(pre: capella.LightClientOptimisticUpdate) -> LightClientOptimisticUpdate:
|
||||||
|
return LightClientOptimisticUpdate(
|
||||||
|
attested_header=upgrade_lc_header_to_eip6110(pre.attested_header),
|
||||||
|
sync_aggregate=pre.sync_aggregate,
|
||||||
|
signature_slot=pre.signature_slot,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Upgrading the store
|
||||||
|
|
||||||
|
Existing `LightClientStore` objects based on Capella MUST be upgraded to eip6110 before eip6110 based light client data can be processed. The `LightClientStore` upgrade MAY be performed before `eip6110_FORK_EPOCH`.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def upgrade_lc_store_to_eip6110(pre: capella.LightClientStore) -> LightClientStore:
|
||||||
|
if pre.best_valid_update is None:
|
||||||
|
best_valid_update = None
|
||||||
|
else:
|
||||||
|
best_valid_update = upgrade_lc_update_to_eip6110(pre.best_valid_update)
|
||||||
|
return LightClientStore(
|
||||||
|
finalized_header=upgrade_lc_header_to_eip6110(pre.finalized_header),
|
||||||
|
current_sync_committee=pre.current_sync_committee,
|
||||||
|
next_sync_committee=pre.next_sync_committee,
|
||||||
|
best_valid_update=best_valid_update,
|
||||||
|
optimistic_header=upgrade_lc_header_to_eip6110(pre.optimistic_header),
|
||||||
|
previous_max_active_participants=pre.previous_max_active_participants,
|
||||||
|
current_max_active_participants=pre.current_max_active_participants,
|
||||||
|
)
|
||||||
|
```
|
|
@ -0,0 +1,74 @@
|
||||||
|
# Deneb Light Client -- Full Node
|
||||||
|
|
||||||
|
**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)
|
||||||
|
- [Helper functions](#helper-functions)
|
||||||
|
- [Modified `block_to_light_client_header`](#modified-block_to_light_client_header)
|
||||||
|
|
||||||
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
|
<!-- /TOC -->
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This upgrade adds information about the execution payload to light client data as part of the Deneb upgrade.
|
||||||
|
|
||||||
|
## Helper functions
|
||||||
|
|
||||||
|
### Modified `block_to_light_client_header`
|
||||||
|
|
||||||
|
```python
|
||||||
|
def block_to_light_client_header(block: SignedBeaconBlock) -> LightClientHeader:
|
||||||
|
epoch = compute_epoch_at_slot(block.message.slot)
|
||||||
|
|
||||||
|
if epoch >= CAPELLA_FORK_EPOCH:
|
||||||
|
payload = block.message.body.execution_payload
|
||||||
|
execution_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),
|
||||||
|
)
|
||||||
|
|
||||||
|
# [New in Deneb]
|
||||||
|
if epoch >= EIP6110_FORK_EPOCH:
|
||||||
|
execution_header.deposit_receipts_root = hash_tree_root(payload.deposit_receipts)
|
||||||
|
|
||||||
|
execution_branch = compute_merkle_proof_for_block_body(block.message.body, EXECUTION_PAYLOAD_INDEX)
|
||||||
|
else:
|
||||||
|
# Note that during fork transitions, `finalized_header` may still point to earlier forks.
|
||||||
|
# While Bellatrix blocks also contain an `ExecutionPayload` (minus `withdrawals_root`),
|
||||||
|
# it was not included in the corresponding light client data. To ensure compatibility
|
||||||
|
# with legacy data going through `upgrade_lc_header_to_capella`, leave out execution data.
|
||||||
|
execution_header = ExecutionPayloadHeader()
|
||||||
|
execution_branch = [Bytes32() for _ in range(floorlog2(EXECUTION_PAYLOAD_INDEX))]
|
||||||
|
|
||||||
|
return LightClientHeader(
|
||||||
|
beacon=BeaconBlockHeader(
|
||||||
|
slot=block.message.slot,
|
||||||
|
proposer_index=block.message.proposer_index,
|
||||||
|
parent_root=block.message.parent_root,
|
||||||
|
state_root=block.message.state_root,
|
||||||
|
body_root=hash_tree_root(block.message.body),
|
||||||
|
),
|
||||||
|
execution=execution_header,
|
||||||
|
execution_branch=execution_branch,
|
||||||
|
)
|
||||||
|
```
|
|
@ -0,0 +1,105 @@
|
||||||
|
# EIP-6110 Light Client -- Networking
|
||||||
|
|
||||||
|
**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 -->
|
||||||
|
|
||||||
|
- [Networking](#networking)
|
||||||
|
- [The gossip domain: gossipsub](#the-gossip-domain-gossipsub)
|
||||||
|
- [Topics and messages](#topics-and-messages)
|
||||||
|
- [Global topics](#global-topics)
|
||||||
|
- [`light_client_finality_update`](#light_client_finality_update)
|
||||||
|
- [`light_client_optimistic_update`](#light_client_optimistic_update)
|
||||||
|
- [The Req/Resp domain](#the-reqresp-domain)
|
||||||
|
- [Messages](#messages)
|
||||||
|
- [GetLightClientBootstrap](#getlightclientbootstrap)
|
||||||
|
- [LightClientUpdatesByRange](#lightclientupdatesbyrange)
|
||||||
|
- [GetLightClientFinalityUpdate](#getlightclientfinalityupdate)
|
||||||
|
- [GetLightClientOptimisticUpdate](#getlightclientoptimisticupdate)
|
||||||
|
|
||||||
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
|
<!-- /TOC -->
|
||||||
|
|
||||||
|
## Networking
|
||||||
|
|
||||||
|
The [Capella light client networking specification](../../capella/light-client/p2p-interface.md) is extended to exchange [EIP-6110 light client data](./sync-protocol.md).
|
||||||
|
|
||||||
|
### The gossip domain: gossipsub
|
||||||
|
|
||||||
|
#### Topics and messages
|
||||||
|
|
||||||
|
##### Global topics
|
||||||
|
|
||||||
|
###### `light_client_finality_update`
|
||||||
|
|
||||||
|
[0]: # (eth2spec: skip)
|
||||||
|
|
||||||
|
| `fork_version` | Message SSZ type |
|
||||||
|
|--------------------------------------------------------|-------------------------------------|
|
||||||
|
| `GENESIS_FORK_VERSION` | n/a |
|
||||||
|
| `ALTAIR_FORK_VERSION` through `BELLATRIX_FORK_VERSION` | `altair.LightClientFinalityUpdate` |
|
||||||
|
| `CAPELLA_FORK_VERSION` | `capella.LightClientFinalityUpdate` |
|
||||||
|
| `EIP6110_FORK_VERSION` and later | `eip6110.LightClientFinalityUpdate` |
|
||||||
|
|
||||||
|
###### `light_client_optimistic_update`
|
||||||
|
|
||||||
|
[0]: # (eth2spec: skip)
|
||||||
|
|
||||||
|
| `fork_version` | Message SSZ type |
|
||||||
|
|--------------------------------------------------------|---------------------------------------|
|
||||||
|
| `GENESIS_FORK_VERSION` | n/a |
|
||||||
|
| `ALTAIR_FORK_VERSION` through `BELLATRIX_FORK_VERSION` | `altair.LightClientOptimisticUpdate` |
|
||||||
|
| `CAPELLA_FORK_VERSION` | `capella.LightClientOptimisticUpdate` |
|
||||||
|
| `EIP6110_FORK_VERSION` and later | `eip6110.LightClientOptimisticUpdate` |
|
||||||
|
|
||||||
|
### The Req/Resp domain
|
||||||
|
|
||||||
|
#### Messages
|
||||||
|
|
||||||
|
##### GetLightClientBootstrap
|
||||||
|
|
||||||
|
[0]: # (eth2spec: skip)
|
||||||
|
|
||||||
|
| `fork_version` | Response SSZ type |
|
||||||
|
|--------------------------------------------------------|------------------------------------|
|
||||||
|
| `GENESIS_FORK_VERSION` | n/a |
|
||||||
|
| `ALTAIR_FORK_VERSION` through `BELLATRIX_FORK_VERSION` | `altair.LightClientBootstrap` |
|
||||||
|
| `CAPELLA_FORK_VERSION` | `capella.LightClientBootstrap` |
|
||||||
|
| `EIP6110_FORK_VERSION` and later | `eip6110.LightClientBootstrap` |
|
||||||
|
|
||||||
|
##### LightClientUpdatesByRange
|
||||||
|
|
||||||
|
[0]: # (eth2spec: skip)
|
||||||
|
|
||||||
|
| `fork_version` | Response chunk SSZ type |
|
||||||
|
|--------------------------------------------------------|----------------------------------|
|
||||||
|
| `GENESIS_FORK_VERSION` | n/a |
|
||||||
|
| `ALTAIR_FORK_VERSION` through `BELLATRIX_FORK_VERSION` | `altair.LightClientUpdate` |
|
||||||
|
| `CAPELLA_FORK_VERSION` | `capella.LightClientUpdate` |
|
||||||
|
| `EIP6110_FORK_VERSION` and later | `eip6110.LightClientUpdate` |
|
||||||
|
|
||||||
|
##### GetLightClientFinalityUpdate
|
||||||
|
|
||||||
|
[0]: # (eth2spec: skip)
|
||||||
|
|
||||||
|
| `fork_version` | Response SSZ type |
|
||||||
|
|--------------------------------------------------------|-------------------------------------|
|
||||||
|
| `GENESIS_FORK_VERSION` | n/a |
|
||||||
|
| `ALTAIR_FORK_VERSION` through `BELLATRIX_FORK_VERSION` | `altair.LightClientFinalityUpdate` |
|
||||||
|
| `CAPELLA_FORK_VERSION` | `capella.LightClientFinalityUpdate` |
|
||||||
|
| `EIP6110_FORK_VERSION` and later | `eip6110.LightClientFinalityUpdate` |
|
||||||
|
|
||||||
|
##### GetLightClientOptimisticUpdate
|
||||||
|
|
||||||
|
[0]: # (eth2spec: skip)
|
||||||
|
|
||||||
|
| `fork_version` | Response SSZ type |
|
||||||
|
|--------------------------------------------------------|---------------------------------------|
|
||||||
|
| `GENESIS_FORK_VERSION` | n/a |
|
||||||
|
| `ALTAIR_FORK_VERSION` through `BELLATRIX_FORK_VERSION` | `altair.LightClientOptimisticUpdate` |
|
||||||
|
| `CAPELLA_FORK_VERSION` | `capella.LightClientOptimisticUpdate` |
|
||||||
|
| `EIP6110_FORK_VERSION` and later | `eip6110.LightClientOptimisticUpdate` |
|
|
@ -0,0 +1,87 @@
|
||||||
|
# Deneb Light Client -- Sync Protocol
|
||||||
|
|
||||||
|
**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)
|
||||||
|
- [Helper functions](#helper-functions)
|
||||||
|
- [Modified `get_lc_execution_root`](#modified-get_lc_execution_root)
|
||||||
|
- [Modified `is_valid_light_client_header`](#modified-is_valid_light_client_header)
|
||||||
|
|
||||||
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
|
<!-- /TOC -->
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This upgrade updates light client data to include the EIP-6110 changes to the [`ExecutionPayload`](../beacon-chain.md) structure. It extends the [Capella Light Client specifications](../../capella/light-client/sync-protocol.md). The [fork document](./fork.md) explains how to upgrade existing Capella based deployments to EIP-6110.
|
||||||
|
|
||||||
|
Additional documents describes the impact of the upgrade on certain roles:
|
||||||
|
- [Full node](./full-node.md)
|
||||||
|
- [Networking](./p2p-interface.md)
|
||||||
|
|
||||||
|
## Helper functions
|
||||||
|
|
||||||
|
### Modified `get_lc_execution_root`
|
||||||
|
|
||||||
|
```python
|
||||||
|
def get_lc_execution_root(header: LightClientHeader) -> Root:
|
||||||
|
epoch = compute_epoch_at_slot(header.beacon.slot)
|
||||||
|
|
||||||
|
# [New in EIP-6110]
|
||||||
|
if epoch >= EIP6110_FORK_EPOCH:
|
||||||
|
return hash_tree_root(header.execution)
|
||||||
|
|
||||||
|
# [Modified in EIP-6110]
|
||||||
|
if epoch >= CAPELLA_FORK_EPOCH:
|
||||||
|
execution_header = capella.ExecutionPayloadHeader(
|
||||||
|
parent_hash=header.execution.parent_hash,
|
||||||
|
fee_recipient=header.execution.fee_recipient,
|
||||||
|
state_root=header.execution.state_root,
|
||||||
|
receipts_root=header.execution.receipts_root,
|
||||||
|
logs_bloom=header.execution.logs_bloom,
|
||||||
|
prev_randao=header.execution.prev_randao,
|
||||||
|
block_number=header.execution.block_number,
|
||||||
|
gas_limit=header.execution.gas_limit,
|
||||||
|
gas_used=header.execution.gas_used,
|
||||||
|
timestamp=header.execution.timestamp,
|
||||||
|
extra_data=header.execution.extra_data,
|
||||||
|
base_fee_per_gas=header.execution.base_fee_per_gas,
|
||||||
|
block_hash=header.execution.block_hash,
|
||||||
|
transactions_root=header.execution.transactions_root,
|
||||||
|
withdrawals_root=header.execution.withdrawals_root,
|
||||||
|
)
|
||||||
|
return hash_tree_root(execution_header)
|
||||||
|
|
||||||
|
return Root()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Modified `is_valid_light_client_header`
|
||||||
|
|
||||||
|
```python
|
||||||
|
def is_valid_light_client_header(header: LightClientHeader) -> bool:
|
||||||
|
epoch = compute_epoch_at_slot(header.beacon.slot)
|
||||||
|
|
||||||
|
# [New in EIP-6110]
|
||||||
|
if epoch < EIP6110_FORK_EPOCH:
|
||||||
|
if header.execution.withdrawals_root != Root():
|
||||||
|
return False
|
||||||
|
|
||||||
|
if epoch < CAPELLA_FORK_EPOCH:
|
||||||
|
return (
|
||||||
|
header.execution == ExecutionPayloadHeader()
|
||||||
|
and header.execution_branch == [Bytes32() for _ in range(floorlog2(EXECUTION_PAYLOAD_INDEX))]
|
||||||
|
)
|
||||||
|
|
||||||
|
return is_valid_merkle_branch(
|
||||||
|
leaf=get_lc_execution_root(header),
|
||||||
|
branch=header.execution_branch,
|
||||||
|
depth=floorlog2(EXECUTION_PAYLOAD_INDEX),
|
||||||
|
index=get_subtree_index(EXECUTION_PAYLOAD_INDEX),
|
||||||
|
root=header.beacon.body_root,
|
||||||
|
)
|
||||||
|
```
|
|
@ -26,6 +26,7 @@ from eth2spec.test.helpers.fork_transition import (
|
||||||
from eth2spec.test.helpers.forks import (
|
from eth2spec.test.helpers.forks import (
|
||||||
is_post_capella, is_post_deneb,
|
is_post_capella, is_post_deneb,
|
||||||
is_post_fork,
|
is_post_fork,
|
||||||
|
is_post_eip6110,
|
||||||
)
|
)
|
||||||
from eth2spec.test.helpers.light_client import (
|
from eth2spec.test.helpers.light_client import (
|
||||||
get_sync_aggregate,
|
get_sync_aggregate,
|
||||||
|
@ -57,6 +58,10 @@ def needs_upgrade_to_deneb(d_spec, s_spec):
|
||||||
return is_post_deneb(s_spec) and not is_post_deneb(d_spec)
|
return is_post_deneb(s_spec) and not is_post_deneb(d_spec)
|
||||||
|
|
||||||
|
|
||||||
|
def needs_upgrade_to_eip6110(d_spec, s_spec):
|
||||||
|
return is_post_eip6110(s_spec) and not is_post_eip6110(d_spec)
|
||||||
|
|
||||||
|
|
||||||
def check_lc_header_equal(d_spec, s_spec, data, upgraded):
|
def check_lc_header_equal(d_spec, s_spec, data, upgraded):
|
||||||
assert upgraded.beacon.slot == data.beacon.slot
|
assert upgraded.beacon.slot == data.beacon.slot
|
||||||
assert upgraded.beacon.hash_tree_root() == data.beacon.hash_tree_root()
|
assert upgraded.beacon.hash_tree_root() == data.beacon.hash_tree_root()
|
||||||
|
@ -84,6 +89,10 @@ def upgrade_lc_bootstrap_to_store(d_spec, s_spec, data):
|
||||||
upgraded = s_spec.upgrade_lc_bootstrap_to_deneb(upgraded)
|
upgraded = s_spec.upgrade_lc_bootstrap_to_deneb(upgraded)
|
||||||
check_lc_bootstrap_equal(d_spec, s_spec, data, upgraded)
|
check_lc_bootstrap_equal(d_spec, s_spec, data, upgraded)
|
||||||
|
|
||||||
|
if needs_upgrade_to_eip6110(d_spec, s_spec):
|
||||||
|
upgraded = s_spec.upgrade_lc_bootstrap_to_eip6110(upgraded)
|
||||||
|
check_lc_bootstrap_equal(d_spec, s_spec, data, upgraded)
|
||||||
|
|
||||||
return upgraded
|
return upgraded
|
||||||
|
|
||||||
|
|
||||||
|
@ -145,6 +154,8 @@ class LightClientSyncTest(object):
|
||||||
|
|
||||||
|
|
||||||
def get_store_fork_version(s_spec):
|
def get_store_fork_version(s_spec):
|
||||||
|
if is_post_eip6110(s_spec):
|
||||||
|
return s_spec.config.EIP6110_FORK_VERSION
|
||||||
if is_post_deneb(s_spec):
|
if is_post_deneb(s_spec):
|
||||||
return s_spec.config.DENEB_FORK_VERSION
|
return s_spec.config.DENEB_FORK_VERSION
|
||||||
if is_post_capella(s_spec):
|
if is_post_capella(s_spec):
|
||||||
|
|
|
@ -15,6 +15,7 @@ from eth2spec.test.helpers.constants import (
|
||||||
BELLATRIX,
|
BELLATRIX,
|
||||||
CAPELLA,
|
CAPELLA,
|
||||||
DENEB,
|
DENEB,
|
||||||
|
EIP6110,
|
||||||
)
|
)
|
||||||
from eth2spec.test.helpers.deposits import (
|
from eth2spec.test.helpers.deposits import (
|
||||||
prepare_state_and_deposit,
|
prepare_state_and_deposit,
|
||||||
|
@ -173,6 +174,9 @@ def do_fork(state, spec, post_spec, fork_epoch, with_block=True, sync_aggregate=
|
||||||
elif post_spec.fork == DENEB:
|
elif post_spec.fork == DENEB:
|
||||||
assert state.fork.previous_version == post_spec.config.CAPELLA_FORK_VERSION
|
assert state.fork.previous_version == post_spec.config.CAPELLA_FORK_VERSION
|
||||||
assert state.fork.current_version == post_spec.config.DENEB_FORK_VERSION
|
assert state.fork.current_version == post_spec.config.DENEB_FORK_VERSION
|
||||||
|
elif post_spec.fork == EIP6110:
|
||||||
|
assert state.fork.previous_version == post_spec.config.CAPELLA_FORK_VERSION
|
||||||
|
assert state.fork.current_version == post_spec.config.EIP6110_FORK_VERSION
|
||||||
|
|
||||||
if with_block:
|
if with_block:
|
||||||
return state, _state_transition_and_sign_block_at_slot(
|
return state, _state_transition_and_sign_block_at_slot(
|
||||||
|
|
Loading…
Reference in New Issue