The Merge Test Plan

Spec documents

Standalone (Unit)

consensus-specs

  • is_merge_transition_complete
  • is_merge_transition_block
  • is_execution_enabled
  • compute_timestamp_at_slot
  • get_inactivity_penalty_deltas
  • slash_validator
  • process_block
  • process_execution_payload
  • process_slashings
  • initialize_beacon_state_from_eth1
  • is_valid_terminal_pow_block
  • validate_merge_block
  • upgrade_to_merge
  • get_pow_block_at_terminal_total_difficulty
  • get_terminal_pow_block
  • prepare_execution_payload
  • get_execution_payload

EIP-3675 + EIP-4399

  • Blockchain tests (client will have to switch to the PoS consensus engine to run these tests)
    • PoW block processing
      • decsendands of a terminal block are not processed
    • Block structure
      • blocks are discarded if the value of either of the following fields deviates from the corresponding constant: ommersHash, difficulty, nonce, ommers
      • mixHash can be set to a random value
      • extraData respects MAX_EXTRA_DATA_BYTES
      • other fields remain unchanged
    • Block validity
      • difficulty isn't verified against difficulty formula
      • nonce and mixHash aren't verified against Ethash rules
      • list of ommers and each ommer isn't verified (don't know how to check though as the list must be empty)
      • Transition block validity
        • a parent of TRANSITION_BLOCK satisfies terminal PoW block conditions
      • Other block validaty rules remain
    • Block and ommer rewards
      • coinbase account doesn't receive block rewards
      • coinbase account doesn't receive ommer rewards (seems infeasible to check)
      • transaction fees remain
    • EVM
      • RANDOM opcode returns expected value
  • Regression
    • check that 3675 and 4399 aren't taking effect before the TRANSITION_BLOCK
  • Fuzzing

Integration (Hive)

Engine API

  • CL mock + EL
    • eth_ namespace is also exposed
    • EL respects the order of forkchoiceUpdated calls
    • engine_executePayload
    • engine_forkchoiceUpdated
    • engine_getPayload
  • CL + EL mock
    • CL respects the order of method calls while assigning JSON-RPC request IDs
  • CL + EL
    • CL implementation of Engine API methods
      • engine_executePayload
      • engine_forkchoiceUpdated
      • engine_getPayload

EIP-3675 + EIP-4399

  • CL mock + EL
    • switches the fork choice rule upon the first POS_FORKCHOICE_UPDATED event
    • POS_FORKCHOICE_UPDATED updates the head
    • POS_FORKCHOICE_UPDATED updates finalized block
    • head isn't changed until POS_FORKCHOICE_UPDATED is received, even if the new payload is imported
    • descendants of a terminal block are not propagated
    • any block is not propagated after the first block gets finalized
    • does not sync beyond terminal block
    • block with transaction using RANDOM opcode is executed as expected starting with TRANSITION_BLOCK
    • block with transaction using DIFFICULTY opcode is executed as expected before the TRANSITION_BLOCK
    • Transition
      • block structure, block validity, block rewards, and fork choice changes takes effect starting with TRANSITION_BLOCK
      • payload is successfully created upon request before the transition, i.e. the transition block
      • switch between several transition PoW blocks happens successfully

consensus-specs + EIPs

  • CL + EL
    • consensus-specs
      • state transition happy case
      • state transition invalid payload wrt execution
      • fork choice (see the Transition below)
    • Transition
      • transition scenario with no overrides
        • payload is successfully created upon request before the transition, i.e. the transition block
        • CL passes transition block while syncing optimistically and must go back to verify TTD or TBH
        • list all other possible scenarios of the transition process
      • case when TERMINAL_BLOCK_HASH is set
        • TRANSITION_BLOCK must be a child of a block identified by TERMINAL_BLOCK_HASH
        • list all other possible scenarios of the transition process with TERMINAL_BLOCK_HASH override
      • block structure, block validity, block rewards, and fork choice changes takes effect starting with TRANSITION_BLOCK
        • PoS chain takes precedence
      • TRANSITION_BLOCK isn't a child of a terminal PoW block
        • in lock-step
        • after syncing optimistically
        • terminal PoW block is invalid wrt execution ruleset TRANSITION_BLOCK can't be verified at all
        • TRANSITION_BLOCK is invalid wrt execution ruleset
      • switch between several terminal PoW blocks happens successfully
      • switch between several transition blocks happens successfully
      • withheld transition PoW block is successfully processed network partitioning
      • transition block with the payload which parent is unavailable doesn't brick a node and it can proceed with building the chain and attesting, and can successfully complete the transition process

System (Testnets)

  • general purpose
  • stress testnets
  • production sized

Useful resources