eth2.0-specs/specs/_features/eip7668/beacon_chain.md

3.0 KiB

Limit churn -- The Beacon Chain

Table of contents

Introduction

This is the beacon chain specification to limit the max inbound churn value, motivated to limit the validator active set growth rate.

Note: This specification is built upon Capella and is under active development.

Configuration

Validator cycle

Name Value
MAX_PER_EPOCH_INBOUND_CHURN_LIMIT uint64(12) (= 12)

Helper functions

Beacon state accessors

New get_validator_inbound_churn_limit

def get_validator_inbound_churn_limit(state: BeaconState) -> uint64:
    """
    Return the validator inbound churn limit for the current epoch.
    """
    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,
        ),
    )

Beacon chain state transition function

Epoch processing

Registry updates

def process_registry_updates(state: BeaconState) -> None:
    # Process activation eligibility and ejections
    for index, validator in enumerate(state.validators):
        if is_eligible_for_activation_queue(validator):
            validator.activation_eligibility_epoch = get_current_epoch(state) + 1

        if (
            is_active_validator(validator, get_current_epoch(state))
            and validator.effective_balance <= EJECTION_BALANCE
        ):
            initiate_validator_exit(state, ValidatorIndex(index))

    # Queue validators eligible for activation and not yet dequeued for activation
    activation_queue = sorted([
        index for index, validator in enumerate(state.validators)
        if is_eligible_for_activation(state, validator)
        # Order by the sequence of activation_eligibility_epoch setting and then index
    ], key=lambda index: (state.validators[index].activation_eligibility_epoch, index))
    # Dequeued validators for activation up to churn limit
    # [Modified in limit churn]
    for index in activation_queue[:get_validator_inbound_churn_limit(state)]:
        validator = state.validators[index]
        validator.activation_epoch = compute_activation_exit_epoch(get_current_epoch(state))