-
Notifications
You must be signed in to change notification settings - Fork 996
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add
ExecutionPayloadHeader
to LC data
While the light client sync protocol currently provides access to the latest `BeaconBlockHeader`, obtaining the matching execution data needs workarounds such as downloading the full block. Having ready access to the EL state root simplifies use cases that need a way to cross-check `eth_getProof` responses against LC data. Access to `block_hash` unlocks scenarios where a CL light client drives an EL without `engine_newPayload`. As of Altair, only the CL beacon block root is available, but the EL block hash is needed for engine API. Other fields in the `ExecutionPayloadHeader` such as `logs_bloom` may allow light client applications to monitor blocks for local interest, e.g. for transfers affecting a certain wallet. This enables to download only the few relevant blocks instead of every single one. A new `LightClientStore` is proposed into the Capella spec that may be used to sync LC data that includes execution data. Existing pre-Capella LC data will remain as is, but can be locally upgraded before feeding it into the new `LightClientStore` so that light clients do not need to run a potentially expensive fork transition at a specific time. This enables the `LightClientStore` to be upgraded at a use case dependent timing at any time before Capella hits. Smart contract and embedded deployments benefit from reduced code size and do not need synchronization with the beacon chain clock to perform the Capella fork.
- Loading branch information
1 parent
9ab22b3
commit 2e97af2
Showing
12 changed files
with
974 additions
and
59 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
# Capella 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 [Altair specification](../../altair/light-client/sync-protocol.md) to Capella. This is necessary when processing pre-Capella data with a post-Capella `LightClientStore`. Note that the data being exchanged over the network protocols uses the original format. | ||
|
||
### Upgrading light client data | ||
|
||
A Capella `LightClientStore` can still process earlier light client data. In order to do so, that pre-Capella data needs to be locally upgraded to Capella before processing. | ||
|
||
```python | ||
def upgrade_lc_header_to_capella(pre: BeaconBlockHeader) -> LightClientHeader: | ||
return LightClientHeader( | ||
beacon=pre, | ||
execution=ExecutionPayloadHeader(), | ||
) | ||
``` | ||
|
||
```python | ||
def upgrade_lc_bootstrap_to_capella(pre: altair.LightClientBootstrap) -> LightClientBootstrap: | ||
return LightClientBootstrap( | ||
header=upgrade_lc_header_to_capella(pre.header), | ||
current_sync_committee=pre.current_sync_committee, | ||
current_sync_committee_branch=pre.current_sync_committee_branch, | ||
) | ||
``` | ||
|
||
```python | ||
def upgrade_lc_update_to_capella(pre: altair.LightClientUpdate) -> LightClientUpdate: | ||
return LightClientUpdate( | ||
attested_header=upgrade_lc_header_to_capella(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_capella(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_capella(pre: altair.LightClientFinalityUpdate) -> LightClientFinalityUpdate: | ||
return LightClientFinalityUpdate( | ||
attested_header=upgrade_lc_header_to_capella(pre.attested_header), | ||
finalized_header=upgrade_lc_header_to_capella(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_capella(pre: altair.LightClientOptimisticUpdate) -> LightClientOptimisticUpdate: | ||
return LightClientOptimisticUpdate( | ||
attested_header=upgrade_lc_header_to_capella(pre.attested_header), | ||
sync_aggregate=pre.sync_aggregate, | ||
signature_slot=pre.signature_slot, | ||
) | ||
``` | ||
|
||
### Upgrading the store | ||
|
||
Existing `LightClientStore` objects based on Altair MUST be upgraded to Capella before Capella based light client data can be processed. The `LightClientStore` upgrade MAY be performed before `CAPELLA_FORK_EPOCH`. | ||
|
||
```python | ||
def upgrade_lc_store_to_capella(pre: altair.LightClientStore) -> LightClientStore: | ||
if pre.best_valid_update is None: | ||
best_valid_update = None | ||
else: | ||
best_valid_update = upgrade_lc_update_to_capella(pre.best_valid_update) | ||
return LightClientStore( | ||
finalized_header=upgrade_lc_header_to_capella(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_capella(pre.optimistic_header), | ||
previous_max_active_participants=pre.previous_max_active_participants, | ||
current_max_active_participants=pre.current_max_active_participants, | ||
) | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
# Capella 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) | ||
- [`compute_merkle_proof_for_block_body`](#compute_merkle_proof_for_block_body) | ||
- [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 Capella upgrade. | ||
|
||
## Helper functions | ||
|
||
### `compute_merkle_proof_for_block_body` | ||
|
||
```python | ||
def compute_merkle_proof_for_block_body(body: BeaconBlockBody, | ||
index: GeneralizedIndex) -> Sequence[Bytes32]: | ||
... | ||
``` | ||
|
||
### Modified `block_to_light_client_header` | ||
|
||
```python | ||
def block_to_light_client_header(block: SignedBeaconBlock) -> LightClientHeader: | ||
if compute_epoch_at_slot(block.message.slot) >= 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), | ||
) | ||
execution_branch = compute_merkle_proof_for_block_body(block.message.body, EXECUTION_PAYLOAD_INDEX) | ||
else: | ||
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, | ||
) | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
# Capella 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 [Altair light client networking specification](../../altair/light-client/p2p-interface.md) is extended to exchange [Capella 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` and later | `capella.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` and later | `capella.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` and later | `capella.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` and later | `capella.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` and later | `capella.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` and later | `capella.LightClientOptimisticUpdate` | |
Oops, something went wrong.