Add _features/eip7668 and make linter happy

This commit is contained in:
Hsiao-Wei Wang 2023-09-12 21:35:46 +08:00
parent e6f7c99b77
commit fd37ffcb61
No known key found for this signature in database
GPG Key ID: AE3D6B174F971DE4
7 changed files with 162 additions and 6 deletions

1
.gitignore vendored
View File

@ -23,6 +23,7 @@ tests/core/pyspec/eth2spec/capella/
tests/core/pyspec/eth2spec/deneb/ tests/core/pyspec/eth2spec/deneb/
tests/core/pyspec/eth2spec/eip6110/ tests/core/pyspec/eth2spec/eip6110/
tests/core/pyspec/eth2spec/eip7002/ tests/core/pyspec/eth2spec/eip7002/
tests/core/pyspec/eth2spec/eip7668/
tests/core/pyspec/eth2spec/whisk/ tests/core/pyspec/eth2spec/whisk/
# coverage reports # coverage reports

View File

@ -6,6 +6,7 @@ CAPELLA = 'capella'
DENEB = 'deneb' DENEB = 'deneb'
EIP6110 = 'eip6110' EIP6110 = 'eip6110'
EIP7002 = 'eip7002' EIP7002 = 'eip7002'
EIP7668 = 'eip7668'
WHISK = 'whisk' WHISK = 'whisk'

View File

@ -9,6 +9,7 @@ from .constants import (
EIP6110, EIP6110,
WHISK, WHISK,
EIP7002, EIP7002,
EIP7668,
) )
@ -21,6 +22,7 @@ PREVIOUS_FORK_OF = {
EIP6110: DENEB, EIP6110: DENEB,
WHISK: CAPELLA, WHISK: CAPELLA,
EIP7002: CAPELLA, EIP7002: CAPELLA,
EIP7668: CAPELLA,
} }
ALL_FORKS = list(PREVIOUS_FORK_OF.keys()) ALL_FORKS = list(PREVIOUS_FORK_OF.keys())

View File

@ -5,6 +5,7 @@ from .capella import CapellaSpecBuilder
from .deneb import DenebSpecBuilder from .deneb import DenebSpecBuilder
from .eip6110 import EIP6110SpecBuilder from .eip6110 import EIP6110SpecBuilder
from .eip7002 import EIP7002SpecBuilder from .eip7002 import EIP7002SpecBuilder
from .eip7668 import EIP7668SpecBuilder
from .whisk import WhiskSpecBuilder from .whisk import WhiskSpecBuilder
@ -12,6 +13,6 @@ spec_builders = {
builder.fork: builder builder.fork: builder
for builder in ( for builder in (
Phase0SpecBuilder, AltairSpecBuilder, BellatrixSpecBuilder, CapellaSpecBuilder, DenebSpecBuilder, Phase0SpecBuilder, AltairSpecBuilder, BellatrixSpecBuilder, CapellaSpecBuilder, DenebSpecBuilder,
EIP6110SpecBuilder, EIP7002SpecBuilder, WhiskSpecBuilder, EIP6110SpecBuilder, EIP7002SpecBuilder, EIP7668SpecBuilder, WhiskSpecBuilder,
) )
} }

View File

@ -0,0 +1,12 @@
from .base import BaseSpecBuilder
from ..constants import EIP7668
class EIP7668SpecBuilder(BaseSpecBuilder):
fork: str = EIP7668
@classmethod
def imports(cls, preset_name: str):
return super().imports(preset_name) + f'''
from eth2spec.capella import {preset_name} as capella
'''

View File

@ -46,11 +46,11 @@ def get_validator_inbound_churn_limit(state: BeaconState) -> uint64:
""" """
active_validator_indices = get_active_validator_indices(state, get_current_epoch(state)) active_validator_indices = get_active_validator_indices(state, get_current_epoch(state))
return min( return min(
MAX_PER_EPOCH_INBOUND_CHURN_LIMIT, MAX_PER_EPOCH_INBOUND_CHURN_LIMIT,
max( max(
MIN_PER_EPOCH_CHURN_LIMIT, MIN_PER_EPOCH_CHURN_LIMIT,
uint64(len(active_validator_indices)) // CHURN_LIMIT_QUOTIENT uint64(len(active_validator_indices)) // CHURN_LIMIT_QUOTIENT,
) ),
) )
``` ```

View File

@ -0,0 +1,139 @@
# EIP-7668 -- Fork Logic
**Notice**: This document is a work-in-progress for researchers and implementers.
## Table of contents
<!-- 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)
- [Helper functions](#helper-functions)
- [Misc](#misc)
- [Modified `compute_fork_version`](#modified-compute_fork_version)
- [Fork to EIP-7668](#fork-to-eip-7668)
- [Fork trigger](#fork-trigger)
- [Upgrading the state](#upgrading-the-state)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
## Introduction
This document describes the process of EIP-7668 upgrade.
## Configuration
Warning: this configuration is not definitive.
| Name | Value |
| - | - |
| `EIP7668_FORK_VERSION` | `Version('0x05000000')` |
| `EIP7668_FORK_EPOCH` | `Epoch(18446744073709551615)` **TBD** |
## Helper functions
### Misc
#### Modified `compute_fork_version`
```python
def compute_fork_version(epoch: Epoch) -> Version:
"""
Return the fork version at the given ``epoch``.
"""
if epoch >= EIP7668_FORK_EPOCH:
return EIP7668_FORK_VERSION
if epoch >= CAPELLA_FORK_EPOCH:
return CAPELLA_FORK_VERSION
if epoch >= BELLATRIX_FORK_EPOCH:
return BELLATRIX_FORK_VERSION
if epoch >= ALTAIR_FORK_EPOCH:
return ALTAIR_FORK_VERSION
return GENESIS_FORK_VERSION
```
## Fork to EIP-7668
### Fork trigger
TBD. This fork is defined for testing purposes, the EIP may be combined with other consensus-layer upgrade.
For now, we assume the condition will be triggered at epoch `EIP7668_FORK_EPOCH`.
Note that for the pure EIP-7668 networks, we don't apply `upgrade_to_eip7668` since it starts with EIP-7668 version logic.
### Upgrading the state
If `state.slot % SLOTS_PER_EPOCH == 0` and `compute_epoch_at_slot(state.slot) == EIP7668_FORK_EPOCH`,
an irregular state change is made to upgrade to EIP-7668.
```python
def upgrade_to_eip7668(pre: capella.BeaconState) -> BeaconState:
epoch = capella.get_current_epoch(pre)
latest_execution_payload_header = ExecutionPayloadHeader(
parent_hash=pre.latest_execution_payload_header.parent_hash,
fee_recipient=pre.latest_execution_payload_header.fee_recipient,
state_root=pre.latest_execution_payload_header.state_root,
receipts_root=pre.latest_execution_payload_header.receipts_root,
logs_bloom=pre.latest_execution_payload_header.logs_bloom,
prev_randao=pre.latest_execution_payload_header.prev_randao,
block_number=pre.latest_execution_payload_header.block_number,
gas_limit=pre.latest_execution_payload_header.gas_limit,
gas_used=pre.latest_execution_payload_header.gas_used,
timestamp=pre.latest_execution_payload_header.timestamp,
extra_data=pre.latest_execution_payload_header.extra_data,
base_fee_per_gas=pre.latest_execution_payload_header.base_fee_per_gas,
block_hash=pre.latest_execution_payload_header.block_hash,
transactions_root=pre.latest_execution_payload_header.transactions_root,
withdrawals_root=pre.latest_execution_payload_header.withdrawals_root,
)
post = BeaconState(
# Versioning
genesis_time=pre.genesis_time,
genesis_validators_root=pre.genesis_validators_root,
slot=pre.slot,
fork=Fork(
previous_version=pre.fork.current_version,
current_version=EIP7668_FORK_VERSION, # [Modified in EIP-7668]
epoch=epoch,
),
# History
latest_block_header=pre.latest_block_header,
block_roots=pre.block_roots,
state_roots=pre.state_roots,
historical_roots=pre.historical_roots,
# Eth1
eth1_data=pre.eth1_data,
eth1_data_votes=pre.eth1_data_votes,
eth1_deposit_index=pre.eth1_deposit_index,
# Registry
validators=pre.validators,
balances=pre.balances,
# Randomness
randao_mixes=pre.randao_mixes,
# Slashings
slashings=pre.slashings,
# Participation
previous_epoch_participation=pre.previous_epoch_participation,
current_epoch_participation=pre.current_epoch_participation,
# Finality
justification_bits=pre.justification_bits,
previous_justified_checkpoint=pre.previous_justified_checkpoint,
current_justified_checkpoint=pre.current_justified_checkpoint,
finalized_checkpoint=pre.finalized_checkpoint,
# Inactivity
inactivity_scores=pre.inactivity_scores,
# Sync
current_sync_committee=pre.current_sync_committee,
next_sync_committee=pre.next_sync_committee,
# Execution-layer
latest_execution_payload_header=latest_execution_payload_header,
# Withdrawals
next_withdrawal_index=pre.next_withdrawal_index,
next_withdrawal_validator_index=pre.next_withdrawal_validator_index,
# Deep history valid from Capella onwards
historical_summaries=pre.historical_summaries,
)
return post
```