Skip to content

EIP-8025 -- Networking

This document contains the networking specifications for EIP-8025.

Note: This specification is built upon Fulu and imports proof types from proof-engine.md.

Table of contents

Constants

Execution

Note: The execution values are not definitive.

Name Value
MAX_EXECUTION_PROOFS_PER_PAYLOAD uint64(4)

Containers

ProofByRootIdentifier

1
2
3
class ProofByRootIdentifier(Container):
    block_root: Root
    proof_types: List[ProofType, MAX_EXECUTION_PROOFS_PER_PAYLOAD]

Helpers

Modified compute_fork_version

def compute_fork_version(epoch: Epoch) -> Version:
    """
    Return the fork version at the given ``epoch``.
    """
    if epoch >= EIP8025_FORK_EPOCH:
        return EIP8025_FORK_VERSION
    if epoch >= FULU_FORK_EPOCH:
        return FULU_FORK_VERSION
    if epoch >= ELECTRA_FORK_EPOCH:
        return ELECTRA_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

New compute_max_request_execution_proofs

1
2
3
4
5
def compute_max_request_execution_proofs() -> uint64:
    """
    Return the maximum number of execution proofs in a single request.
    """
    return uint64(MAX_REQUEST_BLOCKS_DENEB * MAX_EXECUTION_PROOFS_PER_PAYLOAD)

MetaData

The MetaData stored locally by clients is updated with an additional field to communicate execution proof awareness.

1
2
3
4
5
6
7
(
  seq_number: uint64
  attnets: Bitvector[ATTESTATION_SUBNET_COUNT]
  syncnets: Bitvector[SYNC_COMMITTEE_SUBNET_COUNT]
  custody_group_count: uint64  # cgc
  execution_proof_aware: bool  # eproof
)

Where

  • seq_number, attnets, syncnets, and custody_group_count have the same meaning defined in the previous documents.
  • execution_proof_aware indicates whether the node is aware of optional execution proofs. A value of True signals that the node understands execution proof gossip topics and can participate in execution proof propagation.

The gossip domain: gossipsub

Topics and messages

Global topics

execution_proof

This topic is used to propagate SignedExecutionProof messages.

The following validations MUST pass before forwarding the signed_execution_proof on the network, assuming the alias proof = signed_execution_proof.message:

  • [IGNORE] The proof's corresponding new payload request (identified by proof.public_input.new_payload_request_root) has been seen (via gossip or non-gossip sources) (a client MAY queue proofs for processing once the new payload request is retrieved).
  • [IGNORE] No valid proof has already been received for the tuple (proof.public_input.new_payload_request_root, proof.proof_type) -- i.e. no valid proof for proof.proof_type from any prover has been received.
  • [IGNORE] The proof is the first proof received for the tuple (proof.public_input.new_payload_request_root, proof.proof_type, signed_execution_proof.validator_index) -- i.e. the first valid or invalid proof for proof.proof_type from signed_execution_proof.validator_index.
  • [REJECT] The validator with index signed_execution_proof.validator_index is an active validator -- i.e. is_active_validator(state.validators[signed_execution_proof.validator_index], get_current_epoch(state)) returns True.
  • [REJECT] signed_execution_proof.signature is valid with respect to the validator's public key.
  • [REJECT] proof.proof_data is non-empty.
  • [REJECT] proof.proof_data is not larger than MAX_PROOF_SIZE.
  • [REJECT] All of the conditions within process_execution_proof pass validation.
  • [IGNORE] No valid proof has already been received for the tuple (proof.public_input.new_payload_request_root, proof.proof_type) -- i.e. no valid proof for proof.proof_type from any prover has been received.

The Req/Resp domain

Messages

ExecutionProofsByRoot

Protocol ID: /eth2/beacon_chain/req/execution_proofs_by_root/1/

The <context-bytes> field is calculated as context = compute_fork_digest(fork_version, genesis_validators_root).

Request Content:

1
2
3
(
  List[ProofByRootIdentifier, MAX_REQUEST_BLOCKS_DENEB]
)

Response Content:

1
2
3
(
  List[SignedExecutionProof, compute_max_request_execution_proofs()]
)

Requests execution proofs by block root and proof types. The response is a list of SignedExecutionProof whose length is less than or equal to requested_proofs_count, where requested_proofs_count = sum(len(r.proof_types) for r in request). It may be less in the case that the responding peer is missing blocks or proofs.

No more than compute_max_request_execution_proofs() may be requested at a time.

The response MUST consist of zero or more response_chunk. Each successful response_chunk MUST contain a single SignedExecutionProof payload.

Clients MUST respond with at least one proof, if they have it. Clients MAY limit the number of proofs in the response.

GetMetaData v4

Protocol ID: /eth2/beacon_chain/req/metadata/4/

No Request Content.

Response Content:

1
2
3
(
  MetaData
)

Requests the MetaData of a peer, using the new MetaData definition given above that is extended from Altair. Other conditions for the GetMetaData protocol are unchanged from the Altair p2p networking document.

The discovery domain: discv5

ENR structure

Execution proof awareness

A new field is added to the ENR under the key eproof to facilitate discovery of nodes that are aware of optional execution proofs.

Key Value
eproof Execution layer proof awareness, uint8

A node is considered optional execution proof–aware if the eproof key is present and its value is not 0.