From fd37ffcb61325753edbd8ff56a4cd2e45b5f244f Mon Sep 17 00:00:00 2001 From: Hsiao-Wei Wang Date: Tue, 12 Sep 2023 21:35:46 +0800 Subject: [PATCH] Add _features/eip7668 and make linter happy --- .gitignore | 1 + pysetup/constants.py | 1 + pysetup/md_doc_paths.py | 2 + pysetup/spec_builders/__init__.py | 3 +- pysetup/spec_builders/eip7668.py | 12 ++ .../{limit_churn => eip7668}/beacon_chain.md | 10 +- specs/_features/eip7668/fork.md | 139 ++++++++++++++++++ 7 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 pysetup/spec_builders/eip7668.py rename specs/_features/{limit_churn => eip7668}/beacon_chain.md (94%) create mode 100644 specs/_features/eip7668/fork.md diff --git a/.gitignore b/.gitignore index cdfddfb0c..7eacf101c 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ tests/core/pyspec/eth2spec/capella/ tests/core/pyspec/eth2spec/deneb/ tests/core/pyspec/eth2spec/eip6110/ tests/core/pyspec/eth2spec/eip7002/ +tests/core/pyspec/eth2spec/eip7668/ tests/core/pyspec/eth2spec/whisk/ # coverage reports diff --git a/pysetup/constants.py b/pysetup/constants.py index 8d5345563..f6f8ed8e4 100644 --- a/pysetup/constants.py +++ b/pysetup/constants.py @@ -6,6 +6,7 @@ CAPELLA = 'capella' DENEB = 'deneb' EIP6110 = 'eip6110' EIP7002 = 'eip7002' +EIP7668 = 'eip7668' WHISK = 'whisk' diff --git a/pysetup/md_doc_paths.py b/pysetup/md_doc_paths.py index 781ae41db..8031b0936 100644 --- a/pysetup/md_doc_paths.py +++ b/pysetup/md_doc_paths.py @@ -9,6 +9,7 @@ from .constants import ( EIP6110, WHISK, EIP7002, + EIP7668, ) @@ -21,6 +22,7 @@ PREVIOUS_FORK_OF = { EIP6110: DENEB, WHISK: CAPELLA, EIP7002: CAPELLA, + EIP7668: CAPELLA, } ALL_FORKS = list(PREVIOUS_FORK_OF.keys()) diff --git a/pysetup/spec_builders/__init__.py b/pysetup/spec_builders/__init__.py index 794ae50d2..6f0f1d203 100644 --- a/pysetup/spec_builders/__init__.py +++ b/pysetup/spec_builders/__init__.py @@ -5,6 +5,7 @@ from .capella import CapellaSpecBuilder from .deneb import DenebSpecBuilder from .eip6110 import EIP6110SpecBuilder from .eip7002 import EIP7002SpecBuilder +from .eip7668 import EIP7668SpecBuilder from .whisk import WhiskSpecBuilder @@ -12,6 +13,6 @@ spec_builders = { builder.fork: builder for builder in ( Phase0SpecBuilder, AltairSpecBuilder, BellatrixSpecBuilder, CapellaSpecBuilder, DenebSpecBuilder, - EIP6110SpecBuilder, EIP7002SpecBuilder, WhiskSpecBuilder, + EIP6110SpecBuilder, EIP7002SpecBuilder, EIP7668SpecBuilder, WhiskSpecBuilder, ) } diff --git a/pysetup/spec_builders/eip7668.py b/pysetup/spec_builders/eip7668.py new file mode 100644 index 000000000..55332dd9e --- /dev/null +++ b/pysetup/spec_builders/eip7668.py @@ -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 +''' diff --git a/specs/_features/limit_churn/beacon_chain.md b/specs/_features/eip7668/beacon_chain.md similarity index 94% rename from specs/_features/limit_churn/beacon_chain.md rename to specs/_features/eip7668/beacon_chain.md index 7a7a98bf0..aeba214eb 100644 --- a/specs/_features/limit_churn/beacon_chain.md +++ b/specs/_features/eip7668/beacon_chain.md @@ -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)) return min( - MAX_PER_EPOCH_INBOUND_CHURN_LIMIT, - max( - MIN_PER_EPOCH_CHURN_LIMIT, - uint64(len(active_validator_indices)) // CHURN_LIMIT_QUOTIENT - ) + MAX_PER_EPOCH_INBOUND_CHURN_LIMIT, + max( + MIN_PER_EPOCH_CHURN_LIMIT, + uint64(len(active_validator_indices)) // CHURN_LIMIT_QUOTIENT, + ), ) ``` diff --git a/specs/_features/eip7668/fork.md b/specs/_features/eip7668/fork.md new file mode 100644 index 000000000..93d2a7d52 --- /dev/null +++ b/specs/_features/eip7668/fork.md @@ -0,0 +1,139 @@ +# EIP-7668 -- Fork Logic + +**Notice**: This document is a work-in-progress for researchers and implementers. + +## Table of contents + + + + +- [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) + + + +## 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 +```