# EIP7594 -- 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 EIP7594](#fork-to-eip7594) - [Fork trigger](#fork-trigger) - [Upgrading the state](#upgrading-the-state) ## Introduction This document describes the process of EIP7594 upgrade. ## Configuration Warning: this configuration is not definitive. | Name | Value | | - | - | | `EIP7594_FORK_VERSION` | `Version('0x05000000')` | | `EIP7594_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 >= EIP7594_FORK_EPOCH: return EIP7594_FORK_VERSION if epoch >= DENEB_FORK_EPOCH: return DENEB_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 EIP7594 ### Fork trigger EIP7594 does not need a hard fork. We only add this fork doc for compiling this new feature in pyspec. For now, we assume the condition will be triggered at epoch `EIP7594_FORK_EPOCH`. Note that for the pure EIP7594 networks, we don't apply `upgrade_to_eip7594` since it starts with EIP7594 version logic. ### Upgrading the state If `state.slot % SLOTS_PER_EPOCH == 0` and `compute_epoch_at_slot(state.slot) == EIP7594_FORK_EPOCH`, an irregular state change is made to upgrade to EIP7594. ```python def upgrade_to_eip7594(pre: deneb.BeaconState) -> BeaconState: epoch = deneb.get_current_epoch(pre) 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=EIP7594_FORK_VERSION, # [Modified in EIP7594] 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=pre.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 ```