Gloas Partial Columns -- Networking¶
Note: This document is a work-in-progress for researchers and implementers.
Introduction¶
This document specifies the Gloas modifications to partial column dissemination via gossipsub's Partial Message Extension.
The specification of these changes continues in the same format as the network specifications of previous upgrades, and assumes them as pre-requisite. In particular, this document builds on the Fulu partial columns networking specification and the Gloas networking specification.
Modification in Gloas¶
Containers¶
Modified PartialDataColumnSidecar¶
New PartialDataColumnGroupID¶
The gossip domain: gossipsub¶
Partial Messages on data_column_sidecar_{subnet_id}¶
[Modified in Gloas:EIP7732]
Note: The Partial Message Group ID is the SSZ encoded
PartialDataColumnGroupID prefixed with the version byte 0x01.
Implementations MUST ignore unknown versions.
Added in Gloas:
Note: The added rules are similar to the changes in validation rules for full
messages on data_column_sidecar_{subnet_id} as defined above.
- [IGNORE] A valid block for the Group ID's
slothas been seen (via gossip or non-gossip sources). If not yet seen, a client SHOULD queue the sidecar for deferred validation and possible processing once the block is received or retrieved. A client SHOULD queue at least 1 sidecar per peer per subnet. - [REJECT] The Group ID's
slotmatches the slot of the block with rootbeacon_block_root. Thebeacon_block_rootis also identified by the Group ID.
Modified in Gloas:
Note: These modifications only replace the mention of the header with the bid, as the bid contains the KZG commitments.
- [REJECT] The cells present bitmap length is equal to the number of KZG
commitments in
bid.blob_kzg_commitments. - [REJECT] The sidecar's cell and proof data is valid as verified by
verify_partial_data_column_sidecar_kzg_proofs(sidecar, bid.blob_kzg_commitments, column_index).
Removed from Fulu:
- [REJECT] If a valid header was previously received, the received header MUST equal the previously valid header.
- [REJECT] The hash of the block header in
signed_block_headerMUST be the same one identified by the partial message's group id. - [REJECT] The header's
kzg_commitmentslist is non-empty. - [IGNORE] The header is not from a future slot (with a
MAXIMUM_GOSSIP_CLOCK_DISPARITYallowance) -- i.e. validate thatblock_header.slot <= current_slot(a client MAY queue future headers for processing at the appropriate slot). - [IGNORE] The header is from a slot greater than the latest finalized slot --
i.e. validate that
block_header.slot > compute_start_slot_at_epoch(state.finalized_checkpoint.epoch) - [REJECT] The proposer signature of
signed_block_headeris valid with respect to theblock_header.proposer_indexpubkey. - [IGNORE] The header's block's parent (defined by
block_header.parent_root) has been seen (via gossip or non-gossip sources) (a client MAY queue header for processing once the parent block is retrieved). - [REJECT] The header's block's parent (defined by
block_header.parent_root) passes validation. - [REJECT] The header is from a higher slot than the header's block's parent
(defined by
block_header.parent_root). - [REJECT] The current
finalized_checkpointis an ancestor of the header's block -- i.e.get_checkpoint_block(store, block_header.parent_root, store.finalized_checkpoint.epoch) == store.finalized_checkpoint.root. - [REJECT] The header's
kzg_commitmentsfield inclusion proof is valid as verified byverify_partial_data_column_header_inclusion_proof. - [REJECT] The header is proposed by the expected
proposer_indexfor the block's slot in the context of the current shuffling (defined byblock_header.parent_root/block_header.slot). If theproposer_indexcannot immediately be verified against the expected shuffling, the header MAY be queued for later processing while proposers for the block's branch are calculated -- in such a case do notREJECT, insteadIGNOREthis message. - [IGNORE] If the received partial message contains only cell and proof data,
the node has seen a valid corresponding
PartialDataColumnHeader. - [IGNORE] The corresponding header is not from a future slot. See related header check above for more details.
- [IGNORE] The corresponding header is from a slot greater than the latest finalized slot. See related header check above for more details.