# EIP-6800 -- Fork Logic ## Table of contents - [Introduction](#introduction) - [Configuration](#configuration) - [Helper functions](#helper-functions) - [Misc](#misc) - [Modified `compute_fork_version`](#modified-compute_fork_version) - [Fork to eip6800](#fork-to-eip6800) - [Fork trigger](#fork-trigger) - [Upgrading the state](#upgrading-the-state) ## Introduction This document describes the process of the eip6800 upgrade. ## Configuration Warning: this configuration is not definitive. | Name | Value | | - | - | | `EIP6800_FORK_VERSION` | `Version('0x05000000')` | | `EIP6800_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 >= EIP6800_FORK_EPOCH: return EIP6800_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 eip6800 ### Fork trigger The fork is triggered at epoch `EIP6800_FORK_EPOCH`. Note that for the pure eip6800 networks, we don't apply `upgrade_to_eip6800` since it starts with the eip6800 version logic. ### Upgrading the state If `state.slot % SLOTS_PER_EPOCH == 0` and `compute_epoch_at_slot(state.slot) == EIP6800_FORK_EPOCH`, an irregular state change is made to upgrade to eip6800. The upgrade occurs after the completion of the inner loop of `process_slots` that sets `state.slot` equal to `EIP6800_FORK_EPOCH * SLOTS_PER_EPOCH`. Care must be taken when transitioning through the fork boundary as implementations will need a modified [state transition function](../../phase0/beacon-chain.md#beacon-chain-state-transition-function) that deviates from the Phase 0 document. In particular, the outer `state_transition` function defined in the Phase 0 document will not expose the precise fork slot to execute the upgrade in the presence of skipped slots at the fork boundary. Instead, the logic must be within `process_slots`. ```python def upgrade_to_eip6800(pre: deneb.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, excess_data_gas=uint256(0), 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, execution_witness_root=hash_tree_root(ExecutionWitness([], [])) # New in eip6800 ) 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=EIP6800_FORK_VERSION, # [Modified in eip6800] 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 ```