-
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
TheVerge: spec draft #3230
Merged
Merged
TheVerge: spec draft #3230
Changes from 14 commits
Commits
Show all changes
15 commits
Select commit
Hold shift + click to select a range
3cebedb
Spec draft for the verge
gballet 832a799
Update specs/verge/beacon-chain.md
gballet 8fc37ca
fix some typos
gballet 698650c
add a comment to pinpoint the new, verge-related fields
gballet 3b362c6
Use Optional[Bytes32] instead of Union[Null, Bytes32] for value diffs
gballet d0c7bbc
rebase and move to _features
gballet 567e62f
Style feedback
gballet a5c955f
feedback from ACDC
gballet 509fbb2
style: remove confusing underscore
gballet 5c13f5c
fix depth+extension serialization type
gballet 7fbbb25
rebase on top of deneb
gballet 0fd49c1
fix spelling error
gballet fd246d8
Merge branch 'dev' into pr3230
hwwhww 744ae2e
Add EIP-6800 linter checks.
hwwhww 8737e69
use execution_witness_root in header
gballet 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
# Mainnet preset - EIP6800 | ||
|
||
# Misc | ||
# --------------------------------------------------------------- | ||
# `uint64(2**16)` (= 65,536) | ||
MAX_STEMS: 65536 | ||
# `uint64(33)` | ||
MAX_COMMITMENTS_PER_STEM: 33 | ||
# `uint64(2**8)` (= 256) | ||
VERKLE_WIDTH: 256 | ||
# `uint64(2**3)` (= 8) | ||
IPA_PROOF_DEPTH: 8 |
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,12 @@ | ||
# Minimal preset - EIP6800 | ||
|
||
# Execution | ||
# --------------------------------------------------------------- | ||
# `uint64(2**16)` (= 65,536) | ||
MAX_STEMS: 65536 | ||
# `uint64(33)` | ||
MAX_COMMITMENTS_PER_STEM: 33 | ||
# `uint64(2**8)` (= 256) | ||
VERKLE_WIDTH: 256 | ||
# `uint64(2**3)` (= 8) | ||
IPA_PROOF_DEPTH: 8 |
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
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,21 @@ | ||
from typing import Dict | ||
|
||
from .base import BaseSpecBuilder | ||
from ..constants import EIP6800 | ||
|
||
|
||
class EIP6800SpecBuilder(BaseSpecBuilder): | ||
fork: str = EIP6800 | ||
|
||
@classmethod | ||
def imports(cls, preset_name: str): | ||
return f''' | ||
from eth2spec.deneb import {preset_name} as deneb | ||
from eth2spec.utils.ssz.ssz_typing import Bytes31 | ||
''' | ||
|
||
@classmethod | ||
def hardcoded_custom_type_dep_constants(cls, spec_object) -> str: | ||
return { | ||
'MAX_STEMS': spec_object.preset_vars['MAX_STEMS'].value, | ||
} |
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,221 @@ | ||
# EIP6800 -- The Beacon Chain | ||
|
||
## 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) | ||
- [Custom types](#custom-types) | ||
- [Preset](#preset) | ||
- [Execution](#execution) | ||
- [Containers](#containers) | ||
- [Extended containers](#extended-containers) | ||
- [`ExecutionPayload`](#executionpayload) | ||
- [`ExecutionPayloadHeader`](#executionpayloadheader) | ||
- [New containers](#new-containers) | ||
- [`SuffixStateDiff`](#suffixstatediff) | ||
- [`StemStateDiff`](#stemstatediff) | ||
- [`IPAProof`](#ipaproof) | ||
- [`VerkleProof`](#verkleproof) | ||
- [`ExecutionWitness`](#executionwitness) | ||
- [Beacon chain state transition function](#beacon-chain-state-transition-function) | ||
- [Block processing](#block-processing) | ||
- [Execution payload](#execution-payload) | ||
- [`process_execution_payload`](#process_execution_payload) | ||
- [Testing](#testing) | ||
|
||
<!-- END doctoc generated TOC please keep comment here to allow auto update --> | ||
<!-- /TOC --> | ||
|
||
## Introduction | ||
|
||
This upgrade adds transaction execution to the beacon chain as part of the eip6800 upgrade. | ||
|
||
## Custom types | ||
|
||
| Name | SSZ equivalent | Description | | ||
| - | - | - | | ||
| `BanderwagonGroupElement` | `Bytes32` | | | ||
| `BanderwagonFieldElement` | `Bytes32` | | | ||
| `Stem` | `Bytes31` | | | ||
|
||
## Preset | ||
|
||
### Execution | ||
|
||
| Name | Value | | ||
| - | - | | ||
| `MAX_STEMS` | `uint64(2**16)` (= 65,536) | | ||
| `MAX_COMMITMENTS_PER_STEM` | `uint64(33)` | | ||
| `VERKLE_WIDTH` | `uint64(2**8)` (= 256) | | ||
| `IPA_PROOF_DEPTH` | `uint64(2**3)` (= 8) | | ||
|
||
## Containers | ||
|
||
### Extended containers | ||
|
||
#### `ExecutionPayload` | ||
|
||
```python | ||
class ExecutionPayload(Container): | ||
# Execution block header fields | ||
parent_hash: Hash32 | ||
fee_recipient: ExecutionAddress # 'beneficiary' in the yellow paper | ||
state_root: Bytes32 | ||
receipts_root: Bytes32 | ||
logs_bloom: ByteVector[BYTES_PER_LOGS_BLOOM] | ||
prev_randao: Bytes32 # 'difficulty' in the yellow paper | ||
block_number: uint64 # 'number' in the yellow paper | ||
gas_limit: uint64 | ||
gas_used: uint64 | ||
timestamp: uint64 | ||
extra_data: ByteList[MAX_EXTRA_DATA_BYTES] | ||
base_fee_per_gas: uint256 | ||
# Extra payload fields | ||
block_hash: Hash32 # Hash of execution block | ||
transactions: List[Transaction, MAX_TRANSACTIONS_PER_PAYLOAD] | ||
withdrawals: List[Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD] | ||
blob_gas_used: uint64 | ||
excess_blob_gas: uint64 | ||
execution_witness: ExecutionWitness # [New in EIP6800] | ||
``` | ||
|
||
#### `ExecutionPayloadHeader` | ||
|
||
```python | ||
class ExecutionPayloadHeader(Container): | ||
# Execution block header fields | ||
parent_hash: Hash32 | ||
fee_recipient: ExecutionAddress | ||
state_root: Bytes32 | ||
receipts_root: Bytes32 | ||
logs_bloom: ByteVector[BYTES_PER_LOGS_BLOOM] | ||
prev_randao: Bytes32 | ||
block_number: uint64 | ||
gas_limit: uint64 | ||
gas_used: uint64 | ||
timestamp: uint64 | ||
extra_data: ByteList[MAX_EXTRA_DATA_BYTES] | ||
base_fee_per_gas: uint256 | ||
# Extra payload fields | ||
block_hash: Hash32 # Hash of execution block | ||
transactions_root: Root | ||
withdrawals_root: Root | ||
blob_gas_used: uint64 | ||
excess_data_gas: uint64 | ||
execution_witness_root: Root # [New in EIP6800] | ||
``` | ||
|
||
### New containers | ||
|
||
#### `SuffixStateDiff` | ||
|
||
```python | ||
class SuffixStateDiff(Container): | ||
suffix: Bytes1 | ||
# Null means not currently present | ||
current_value: Optional[Bytes32] | ||
# Null means value not updated | ||
new_value: Optional[Bytes32] | ||
``` | ||
|
||
*Note*: on the Kaustinen testnet, `new_value` is omitted from the container. | ||
|
||
#### `StemStateDiff` | ||
|
||
```python | ||
class StemStateDiff(Container): | ||
stem: Stem | ||
# Valid only if list is sorted by suffixes | ||
suffix_diffs: List[SuffixStateDiff, VERKLE_WIDTH] | ||
``` | ||
|
||
#### `IPAProof` | ||
|
||
```python | ||
class IPAProof(Container): | ||
cl: Vector[BanderwagonGroupElement, IPA_PROOF_DEPTH] | ||
cr: Vector[BanderwagonGroupElement, IPA_PROOF_DEPTH] | ||
final_evaluation = BanderwagonFieldElement | ||
``` | ||
|
||
#### `VerkleProof` | ||
|
||
```python | ||
class VerkleProof(Container): | ||
other_stems: List[Bytes31, MAX_STEMS] | ||
depth_extension_present: ByteList[MAX_STEMS] | ||
commitments_by_path: List[BanderwagonGroupElement, MAX_STEMS * MAX_COMMITMENTS_PER_STEM] | ||
d: BanderwagonGroupElement | ||
ipa_proof: IPAProof | ||
``` | ||
|
||
#### `ExecutionWitness` | ||
|
||
```python | ||
class ExecutionWitness(Container): | ||
state_diff: List[StemStateDiff, MAX_STEMS] | ||
verkle_proof: VerkleProof | ||
``` | ||
|
||
## Beacon chain state transition function | ||
|
||
### Block processing | ||
|
||
#### Execution payload | ||
|
||
##### `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 | ||
|
||
# Verify the execution payload is valid | ||
# Pass `versioned_hashes` to Execution Engine | ||
# Pass `parent_beacon_block_root` to Execution Engine | ||
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, | ||
) | ||
) | ||
|
||
# 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), | ||
excess_data_gas=payload.excess_data_gas, | ||
execution_witness=payload.execution_witness, # [New in EIP6800] | ||
gballet marked this conversation as resolved.
Show resolved
Hide resolved
|
||
) | ||
``` | ||
|
||
## Testing | ||
|
||
TBD |
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.
These should either be updated for EIP-7495
StableContainer
/Profile
(onSuffixStateDiff
), or unwrapped so that e.g. a zero value is used instead ofNone
. Would like to withdraw EIP-6475 styleOptional
as the functionality is covered by the more advanced EIP-7495 as well.SSZ library implementation progress here: https://stabilitynow.box
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.
Oh right.
@gballet
The current
Optional
in pyspec is the Python typing.Optional. Our SSZ lib Remerkleable only implemented SSZUnion
, so technically we can useUnion[None, Bytes32]
here in the specs. However, other SSZ libs didn't implementUnion
and may go implement the newer SSZ types as @etan-status suggested.Is it possible to use
Bytes32()
, the empty0x00...00
, to represent null in this case so that we don't introduce new SSZ typing here?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.
no it is not possible to use
Bytes32()
and I was initially usingUnion[None, Byte32]
and was asked to replace it withOptional
. Precisely becauseUnion
didn't exist (except in the wonderful gballet/ssz.zig, of course 😇).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.
If you want to give StableContainer a shot, this is how it would look there:
Serialization of the
Profile
looks like this:Notably, no variable length offsets, this is 7-9 bytes more compact than the current EIP-6475 based impl, and requires one fewer hash as well.
Merkleization would look like this, with
htr == hash_tree_root
and based on 8 capacity. can lower to 4 if sufficient, should reflect theoretical design space, not actual space used today, for future extensibility without breaking merkleization of existing EIP-4788 based verifiers: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.
Needs custom remerkleable from here:
#3777