Skip to content

Electra -- Weak Subjectivity Guide

Introduction

This document is an extension of the Phase 0 -- Weak Subjectivity Guide. All behaviors and definitions defined in this document, and documents it extends, carry over unless explicitly noted or overridden.

This document is a guide for implementing Weak Subjectivity protections in Electra. The Weak Subjectivity Period (WSP) calculations have changed in Electra due to EIP-7251, which increases the maximum effective balance for validators and allows validators to consolidate.

Weak Subjectivity Period

Calculating the Weak Subjectivity Period

Modified compute_weak_subjectivity_period

def compute_weak_subjectivity_period(state: BeaconState) -> uint64:
    """
    Returns the weak subjectivity period for the current ``state``.
    This computation takes into account the effect of:
        - validator set churn (bounded by ``get_balance_churn_limit()`` per epoch)
    A detailed calculation can be found at:
    https://notes.ethereum.org/@CarlBeek/electra_weak_subjectivity
    """
    t = get_total_active_balance(state)
    delta = get_balance_churn_limit(state)
    epochs_for_validator_set_churn = SAFETY_DECAY * t // (2 * delta * 100)
    return MIN_VALIDATOR_WITHDRAWABILITY_DELAY + epochs_for_validator_set_churn

A brief reference for what these values look like in practice (reference script):

Safety Decay Total Active Balance (ETH) Weak Sub. Period (Epochs)
10 1,048,576 665
10 2,097,152 1,075
10 4,194,304 1,894
10 8,388,608 3,532
10 16,777,216 3,532
10 33,554,432 3,532

Modified is_within_weak_subjectivity_period

1
2
3
4
5
6
7
8
9
def is_within_weak_subjectivity_period(store: Store, ws_state: BeaconState, ws_checkpoint: Checkpoint) -> bool:
    # Clients may choose to validate the input state against the input Weak Subjectivity Checkpoint
    assert ws_state.latest_block_header.state_root == ws_checkpoint.root
    assert compute_epoch_at_slot(ws_state.slot) == ws_checkpoint.epoch

    ws_period = compute_weak_subjectivity_period(ws_state)  # [Modified in Electra]
    ws_state_epoch = compute_epoch_at_slot(ws_state.slot)
    current_epoch = compute_epoch_at_slot(get_current_slot(store))
    return current_epoch <= ws_state_epoch + ws_period