-
Notifications
You must be signed in to change notification settings - Fork 1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add ExecutionPayloadHeader
to LC data
#3151
Merged
Merged
Changes from all commits
Commits
Show all changes
33 commits
Select commit
Hold shift + click to select a range
0fb0b26
Add accessors for LC header
etan-status 14fd937
Fix
etan-status 364d106
Merge branch 'sf-epochoverrides' into lc-eph
etan-status 08a2080
Merge branch 'ci-phasesconfig' into lc-eph
etan-status c1a6b12
Merge branch 'lc-toheader' into lc-eph
etan-status 9ab22b3
Merge branch 'lc-accessors' into lc-eph
etan-status 2e97af2
Add `ExecutionPayloadHeader` to LC data
etan-status 7e6a990
Merge branch 'ci-phasesconfig' into lc-eph
etan-status 2df8a55
Fix LC references in main readme
etan-status 11d2a59
Flip `is_valid_light_client_header` logic for extensibility
etan-status d6da56c
Remove double mention of validator changes in readme
etan-status 5028a80
Implicit init during fork transition
etan-status 4df8663
Rename `legacy` --> `altair` in test name
etan-status e67ca3d
Compute epoch only once for better readability
etan-status 8ad6810
EIP4844 support (`excess_data_gas`), fork tests nyi
etan-status dc05a3f
Rename test back
etan-status 700bef7
Fix `is_valid_light_client_header`
etan-status a8dabc0
Add `test_eip4844_store_with_legacy_data` (fork test still nyi)
etan-status af78506
Merge branch 'el-rlp' into lc-eph
etan-status 3bfac0e
Merge branch 'lc-toheader' into lc-eph
etan-status f24365f
Merge branch 'ci-phasesconfig' into lc-eph
etan-status 02abdc3
Merge branch 'dev' into lc-eph
etan-status b047151
Merge branch 'dev' into lc-eph
etan-status e5cda17
Run fork test for EIP4844
etan-status ce7fd41
Add test for LC data spanning 3 forks
etan-status 3754360
Merge branch 'dev' into lc-eph
etan-status 53a95f0
Merge branch 'dev' into lc-eph
etan-status 82d6267
Merge branch 'dev' into lc-eph
etan-status b720581
Update sync test documentation
etan-status ca32fe8
Add docstrings to explain empty header
etan-status a580f82
Use `beacon` wrapper in `upgrade_lc_header_to_capella`
etan-status 514d443
Use `bellatrix` in `upgrade_x_to_capella` helpers
etan-status ffd047c
Consistent test step naming
etan-status File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,92 @@ | ||
# 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: bellatrix.LightClientHeader) -> LightClientHeader: | ||
return LightClientHeader( | ||
beacon=pre.beacon, | ||
) | ||
``` | ||
|
||
```python | ||
def upgrade_lc_bootstrap_to_capella(pre: bellatrix.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: bellatrix.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: bellatrix.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: bellatrix.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: bellatrix.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,78 @@ | ||
# 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: | ||
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), | ||
) | ||
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, | ||
) | ||
``` |
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.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it because
block
could bebellatrix.SignedBeaconBlock
here? What do you think about adding a docstring about it?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, exactly (or, in theory, even all the way back to Altair or Phase0, if bellatrix / altair never finalized, and finalized header is still back in those ancient forks).
Added a comment to clarify that.