Heze -- The Beacon Chain
Note: This document is a work-in-progress for researchers and implementers.
Introduction
Heze is a consensus-layer upgrade containing a number of features. Including:
- EIP-7805:
Fork-choice enforced Inclusion Lists (FOCIL)
Note: These EIPs are in draft and may change or be removed. Each link above
points to the specific version targeted by this specification, which may differ
from the latest published version of the EIPs.
Constants
Domains
| Name |
Value |
DOMAIN_INCLUSION_LIST_COMMITTEE |
DomainType('0x10000000') |
Preset
Inclusion list committee
| Name |
Value |
INCLUSION_LIST_COMMITTEE_SIZE |
Uint64(2**4) (= 16) |
Containers
New containers
InclusionList
| class InclusionList(Container):
slot: Slot
validator_index: ValidatorIndex
inclusion_list_committee_root: Root
transactions: ProgressiveList[Transaction]
|
SignedInclusionList
| class SignedInclusionList(Container):
message: InclusionList
signature: BLSSignature
|
Modified containers
ExecutionPayloadBid
| class ExecutionPayloadBid(ProgressiveContainer(active_fields=[1] * 13)):
parent_block_hash: Hash32
parent_block_root: Root
block_hash: Hash32
prev_randao: Bytes32
fee_recipient: ExecutionAddress
gas_limit: Uint64
builder_index: BuilderIndex
slot: Slot
value: Gwei
execution_payment: Gwei
blob_kzg_commitments: ProgressiveList[KZGCommitment]
execution_requests_root: Root
# [New in Heze:EIP7805]
inclusion_list_bits: Bitvector[INCLUSION_LIST_COMMITTEE_SIZE]
|
SignedExecutionPayloadBid
| class SignedExecutionPayloadBid(Container):
# [Modified in Heze:EIP7805]
message: ExecutionPayloadBid
signature: BLSSignature
|
BeaconState
| class BeaconState(ProgressiveContainer(active_fields=[1] * 46)):
genesis_time: Uint64
genesis_validators_root: Root
slot: Slot
fork: Fork
latest_block_header: BeaconBlockHeader
block_roots: Vector[Root, SLOTS_PER_HISTORICAL_ROOT]
state_roots: Vector[Root, SLOTS_PER_HISTORICAL_ROOT]
historical_roots: List[Root, HISTORICAL_ROOTS_LIMIT]
eth1_data: Eth1Data
eth1_data_votes: List[Eth1Data, EPOCHS_PER_ETH1_VOTING_PERIOD * SLOTS_PER_EPOCH]
eth1_deposit_index: Uint64
validators: ProgressiveList[Validator]
balances: ProgressiveList[Gwei]
randao_mixes: Vector[Bytes32, EPOCHS_PER_HISTORICAL_VECTOR]
slashings: Vector[Gwei, EPOCHS_PER_SLASHINGS_VECTOR]
previous_epoch_participation: ProgressiveList[ParticipationFlags]
current_epoch_participation: ProgressiveList[ParticipationFlags]
justification_bits: Bitvector[JUSTIFICATION_BITS_LENGTH]
previous_justified_checkpoint: Checkpoint
current_justified_checkpoint: Checkpoint
finalized_checkpoint: Checkpoint
inactivity_scores: ProgressiveList[Uint64]
current_sync_committee: SyncCommittee
next_sync_committee: SyncCommittee
latest_block_hash: Hash32
next_withdrawal_index: WithdrawalIndex
next_withdrawal_validator_index: ValidatorIndex
historical_summaries: List[HistoricalSummary, HISTORICAL_ROOTS_LIMIT]
deposit_requests_start_index: Uint64
deposit_balance_to_consume: Gwei
exit_balance_to_consume: Gwei
earliest_exit_epoch: Epoch
consolidation_balance_to_consume: Gwei
earliest_consolidation_epoch: Epoch
pending_deposits: ProgressiveList[PendingDeposit]
pending_partial_withdrawals: ProgressiveList[PendingPartialWithdrawal]
pending_consolidations: ProgressiveList[PendingConsolidation]
proposer_lookahead: Vector[ValidatorIndex, (MIN_SEED_LOOKAHEAD + 1) * SLOTS_PER_EPOCH]
builders: ProgressiveList[Builder]
next_withdrawal_builder_index: BuilderIndex
execution_payload_availability: Bitvector[SLOTS_PER_HISTORICAL_ROOT]
builder_pending_payments: Vector[BuilderPendingPayment, 2 * SLOTS_PER_EPOCH]
builder_pending_withdrawals: ProgressiveList[BuilderPendingWithdrawal]
# [Modified in Heze:EIP7805]
latest_execution_payload_bid: ExecutionPayloadBid
payload_expected_withdrawals: ProgressiveList[Withdrawal]
ptc_window: Vector[Vector[ValidatorIndex, PTC_SIZE], (2 + MIN_SEED_LOOKAHEAD) * SLOTS_PER_EPOCH]
|
Helpers
Predicates
New is_valid_inclusion_list_signature
| def is_valid_inclusion_list_signature(
state: BeaconState, signed_inclusion_list: SignedInclusionList
) -> bool:
"""
Check if ``signed_inclusion_list`` has a valid signature.
"""
message = signed_inclusion_list.message
index = message.validator_index
pubkey = state.validators[index].pubkey
domain = get_domain(state, DOMAIN_INCLUSION_LIST_COMMITTEE, compute_epoch_at_slot(message.slot))
signing_root = compute_signing_root(message, domain)
return bls.Verify(pubkey, signing_root, signed_inclusion_list.signature)
|
Beacon state accessors
New get_inclusion_list_committee
| def get_inclusion_list_committee(
state: BeaconState, slot: Slot
) -> Vector[ValidatorIndex, INCLUSION_LIST_COMMITTEE_SIZE]:
"""
Get the inclusion list committee for the given ``slot``.
"""
epoch = compute_epoch_at_slot(slot)
indices: List[ValidatorIndex] = []
# Concatenate all committees for this slot in order
committees_per_slot = get_committee_count_per_slot(state, epoch)
for i in range(committees_per_slot):
committee = get_beacon_committee(state, slot, CommitteeIndex(i))
indices.extend(committee)
return Vector[ValidatorIndex, INCLUSION_LIST_COMMITTEE_SIZE]([
indices[i % len(indices)] for i in range(INCLUSION_LIST_COMMITTEE_SIZE)
])
|