Skip to content
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
ff1036c
Replace INTERVALS_PER_SLOT with explicit slot component times
jtraglia Jul 30, 2025
130745c
Replace LATE_BLOCK_CUTOFF_BPS with ATTESTATION_DUE_BPS
jtraglia Jul 30, 2025
4d93844
Update eip7805 specs
jtraglia Jul 30, 2025
21e0ef4
Rename eip7805 time params for consistency
jtraglia Jul 30, 2025
d6fa5ea
Slot time update
dankrad Aug 4, 2025
2abb059
Typo
dankrad Aug 4, 2025
860479b
Slot subdivisions and configs
dankrad Aug 4, 2025
308b42a
Base reward update
dankrad Aug 4, 2025
2aa192d
Blob schedule
dankrad Aug 4, 2025
2e292be
Add churn limit updates
dankrad Aug 4, 2025
afc83f0
toc
dankrad Aug 4, 2025
8f22a08
Fix blob schedule
jtraglia Aug 4, 2025
f6f869b
Run make lint
jtraglia Aug 4, 2025
0d381c4
Remove fork check conditions
jtraglia Aug 4, 2025
1725283
Add backend support for eip7782
jtraglia Aug 4, 2025
4d24d40
Make some fixes
jtraglia Aug 4, 2025
e776aa5
Merge branch 'master' into dankrad-eip7782
jtraglia Aug 5, 2025
cfbff41
Update todo comment
jtraglia Aug 5, 2025
312bef5
Merge branch 'master' into dankrad-eip7782
jtraglia Aug 6, 2025
370840f
Add get_forkchoice_store
dankrad Aug 7, 2025
4a29a82
Merge branch 'master' into dankrad-eip7782
jtraglia Aug 11, 2025
490cf8c
Clean up config variables
jtraglia Aug 11, 2025
24f67e7
Remove duplicate function
jtraglia Aug 11, 2025
fc61023
Use pre.proposer_lookahead in upgrade
jtraglia Aug 11, 2025
fd1277c
Merge branch 'master' into dankrad-eip7782
jtraglia Aug 11, 2025
0214feb
Fix sync committee period
dankrad Aug 27, 2025
16e5872
Add sync period functions
dankrad Aug 28, 2025
ea877a8
Merge branch 'master' into dankrad-eip7782
dankrad Aug 28, 2025
3af084e
on_tick logic
dankrad Aug 28, 2025
6a36694
Simplify get_sync_committee_period_at_slot
dankrad Aug 28, 2025
67f7ad2
Merge branch 'master' into dankrad-eip7782
dankrad Sep 22, 2025
5516c49
Add slot subdivision variables and getters
dankrad Sep 22, 2025
704fa18
Update configs/minimal.yaml
dankrad Nov 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 68 additions & 6 deletions configs/mainnet.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,19 @@ EIP7732_FORK_EPOCH: 18446744073709551615
# EIP7805
EIP7805_FORK_VERSION: 0x0a000000 # temporary stub
EIP7805_FORK_EPOCH: 18446744073709551615
# EIP7782
EIP7782_FORK_VERSION: 0x0A000000 # temporary stub
EIP7782_FORK_EPOCH: 18446744073709551615
EIP7782_FORK_TIME: 1234567890 # temporary stub

# Time parameters
# ---------------------------------------------------------------
# 12 seconds
# 12 seconds (*deprecated*)
SECONDS_PER_SLOT: 12
# 12000 milliseconds, 12 seconds
SLOT_DURATION_MS: 12000
# 6000 milliseconds, 6 seconds (EIP-7782)
SLOT_DURATION_MS_EIP7782: 6000
# 14 (estimate from Eth1 mainnet)
SECONDS_PER_ETH1_BLOCK: 14
# 2**8 (= 256) epochs, ~27 hours
Expand All @@ -77,6 +85,58 @@ MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256
SHARD_COMMITTEE_PERIOD: 256
# 2**11 (= 2,048) Eth1 blocks, ~8 hours
ETH1_FOLLOW_DISTANCE: 2048
# 1667 basis points, ~17% of SLOT_DURATION_MS
PROPOSER_REORG_CUTOFF_BPS: 1667
# 3333 basis points, ~33% of SLOT_DURATION_MS
ATTESTATION_DUE_BPS: 3333
# 6667 basis points, ~67% of SLOT_DURATION_MS
AGGREGRATE_DUE_BPS: 6667

# Altair
# 3333 basis points, ~33% of SLOT_DURATION_MS
SYNC_MESSAGE_DUE_BPS: 3333
# 6667 basis points, ~67% of SLOT_DURATION_MS
CONTRIBUTION_DUE_BPS: 6667

# EIP-7732
# 2500 basis points, 25% of SLOT_DURATION_MS
ATTESTATION_DUE_BPS_EIP7732: 2500
# 5000 basis points, 50% of SLOT_DURATION_MS
AGGREGRATE_DUE_BPS_EIP7732: 5000
# 2500 basis points, 25% of SLOT_DURATION_MS
SYNC_MESSAGE_DUE_BPS_EIP7732: 2500
# 5000 basis points, 50% of SLOT_DURATION_MS
CONTRIBUTION_DUE_BPS_EIP7732: 5000
# 7500 basis points, 75% of SLOT_DURATION_MS
PAYLOAD_ATTESTATION_DUE_BPS: 7500

# EIP-7805
# 7500 basis points, 75% of SLOT_DURATION_MS
VIEW_FREEZE_CUTOFF_BPS: 7500
# 6667 basis points, ~67% of SLOT_DURATION_MS
INCLUSION_LIST_SUBMISSION_DUE_BPS: 6667
# 9167 basis points, ~92% of SLOT_DURATION_MS
PROPOSER_INCLUSION_LIST_DUE_BPS: 9167

# EIP-7782
# 5000 basis points, 50% of SLOT_DURATION_MS_EIP7782
ATTESTATION_DUE_BPS_EIP7782: 5000
# 7500 basis points, 75% of SLOT_DURATION_MS_EIP7782
AGGREGRATE_DUE_BPS_EIP7782: 7500
# 3333 basis points, ~33% of SLOT_DURATION_MS_EIP7782
SYNC_MESSAGE_DUE_BPS_EIP7782: 3333
# 6667 basis points, ~67% of SLOT_DURATION_MS_EIP7782
CONTRIBUTION_DUE_BPS_EIP7782: 6667

# EIP-7782 churn limits (halved for 6-second slots)
# 2 validators (half of 4)
MIN_PER_EPOCH_CHURN_LIMIT_EIP7782: 2
# 4 validators (half of 8)
MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT_EIP7782: 4
# 64,000,000,000 Gwei (half of 128B)
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA_EIP7782: 64000000000
# 128,000,000,000 Gwei (half of 256B)
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT_EIP7782: 128000000000

# Validator cycle
# ---------------------------------------------------------------
Expand Down Expand Up @@ -183,10 +243,6 @@ MAX_REQUEST_PAYLOADS: 128
PROPOSER_SCORE_BOOST_EIP7732: 20

# EIP7805
ATTESTATION_DEADLINE: 4
INCLUSION_LIST_SUBMISSION_DEADLINE: 8
VIEW_FREEZE_DEADLINE: 9
PROPOSER_INCLUSION_LIST_CUT_OFF: 11
# 2**4 (= 16)
MAX_REQUEST_INCLUSION_LIST: 16
# 2**13 (= 8192)
Expand All @@ -195,4 +251,10 @@ MAX_BYTES_PER_INCLUSION_LIST: 8192
# Blob Scheduling
# ---------------------------------------------------------------

BLOB_SCHEDULE: []
BLOB_SCHEDULE: [
{
"EPOCH": 18446744073709551615, # EIP7782_FORK_EPOCH (TBD)
"MAX_BLOBS_PER_BLOCK": 3, # Half of current 6 blobs for 6-second slots
"DESCRIPTION": "EIP-7782: Reduced blob count for 6-second slot timing"
}
]
74 changes: 68 additions & 6 deletions configs/minimal.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,19 @@ EIP7732_FORK_EPOCH: 18446744073709551615
# [customized] EIP7805
EIP7805_FORK_VERSION: 0x0a000001
EIP7805_FORK_EPOCH: 18446744073709551615
# [customized] EIP7782
EIP7782_FORK_VERSION: 0x0A000001
EIP7782_FORK_EPOCH: 18446744073709551615
EIP7782_FORK_TIME: 1234567890 # temporary stub

# Time parameters
# ---------------------------------------------------------------
# [customized] 6 seconds
# [customized] 6 seconds (*deprecated*)
SECONDS_PER_SLOT: 6
# [customized] 6000 milliseconds, 6 seconds
SLOT_DURATION_MS: 6000
# [customized] 6000 milliseconds, 6 seconds (EIP-7782)
SLOT_DURATION_MS_EIP7782: 6000
# 14 (estimate from Eth1 mainnet)
SECONDS_PER_ETH1_BLOCK: 14
# 2**8 (= 256) epochs, ~27 hours
Expand All @@ -73,6 +81,58 @@ MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256
SHARD_COMMITTEE_PERIOD: 64
# [customized] 2**4 (= 16) Eth1 blocks, ~4 minutes
ETH1_FOLLOW_DISTANCE: 16
# 1667 basis points, ~17% of SLOT_DURATION_MS
PROPOSER_REORG_CUTOFF_BPS: 1667
# 3333 basis points, ~33% of SLOT_DURATION_MS
ATTESTATION_DUE_BPS: 3333
# 6667 basis points, ~67% of SLOT_DURATION_MS
AGGREGRATE_DUE_BPS: 6667

# Altair
# 3333 basis points, ~33% of SLOT_DURATION_MS
SYNC_MESSAGE_DUE_BPS: 3333
# 6667 basis points, ~67% of SLOT_DURATION_MS
CONTRIBUTION_DUE_BPS: 6667

# EIP-7732
# 2500 basis points, 25% of SLOT_DURATION_MS
ATTESTATION_DUE_BPS_EIP7732: 2500
# 5000 basis points, 50% of SLOT_DURATION_MS
AGGREGRATE_DUE_BPS_EIP7732: 5000
# 2500 basis points, 25% of SLOT_DURATION_MS
SYNC_MESSAGE_DUE_BPS_EIP7732: 2500
# 5000 basis points, 50% of SLOT_DURATION_MS
CONTRIBUTION_DUE_BPS_EIP7732: 5000
# 7500 basis points, 75% of SLOT_DURATION_MS
PAYLOAD_ATTESTATION_DUE_BPS: 7500

# EIP-7805
# 7500 basis points, 75% of SLOT_DURATION_MS
VIEW_FREEZE_CUTOFF_BPS: 7500
# 6667 basis points, ~67% of SLOT_DURATION_MS
INCLUSION_LIST_SUBMISSION_DUE_BPS: 6667
# 9167 basis points, ~92% of SLOT_DURATION_MS
PROPOSER_INCLUSION_LIST_DUE_BPS: 9167

# EIP-7782
# 5000 basis points, 50% of SLOT_DURATION_MS_EIP7782
ATTESTATION_DUE_BPS_EIP7782: 5000
# 7500 basis points, 75% of SLOT_DURATION_MS_EIP7782
AGGREGRATE_DUE_BPS_EIP7782: 7500
# 3333 basis points, ~33% of SLOT_DURATION_MS_EIP7782
SYNC_MESSAGE_DUE_BPS_EIP7782: 3333
# 6667 basis points, ~67% of SLOT_DURATION_MS_EIP7782
CONTRIBUTION_DUE_BPS_EIP7782: 6667

# EIP-7782 churn limits (halved for 6-second slots)
# 1 validator (half of 2)
MIN_PER_EPOCH_CHURN_LIMIT_EIP7782: 1
# 2 validators (half of 4)
MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT_EIP7782: 2
# 32,000,000,000 Gwei (half of 64B)
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA_EIP7782: 32000000000
# 64,000,000,000 Gwei (half of 128B)
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT_EIP7782: 64000000000

# Validator cycle
# ---------------------------------------------------------------
Expand Down Expand Up @@ -180,10 +240,6 @@ MAX_REQUEST_PAYLOADS: 128
PROPOSER_SCORE_BOOST_EIP7732: 20

# EIP7805
ATTESTATION_DEADLINE: 2
INCLUSION_LIST_SUBMISSION_DEADLINE: 2
VIEW_FREEZE_DEADLINE: 3
PROPOSER_INCLUSION_LIST_CUT_OFF: 5
# 2**4 (= 16)
MAX_REQUEST_INCLUSION_LIST: 16
# 2**13 (= 8192)
Expand All @@ -192,4 +248,10 @@ MAX_BYTES_PER_INCLUSION_LIST: 8192
# Blob Scheduling
# ---------------------------------------------------------------

BLOB_SCHEDULE: []
BLOB_SCHEDULE: [
{
"EPOCH": 18446744073709551615, # EIP7782_FORK_EPOCH (TBD)
"MAX_BLOBS_PER_BLOCK": 3, # Half of current 6 blobs for 6-second slots
"DESCRIPTION": "EIP-7782: Reduced blob count for 6-second slot timing"
}
]
8 changes: 5 additions & 3 deletions specs/_features/eip7732/fork-choice.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ This is the modification of the fork-choice accompanying the EIP-7732 upgrade.
| Name | Value |
| -------------------------- | ----------------------- |
| `PAYLOAD_TIMELY_THRESHOLD` | `PTC_SIZE // 2` (= 256) |
| `INTERVALS_PER_SLOT` | `4` |
| `PAYLOAD_STATUS_PENDING` | `PayloadStatus(0)` |
| `PAYLOAD_STATUS_EMPTY` | `PayloadStatus(1)` |
| `PAYLOAD_STATUS_FULL` | `PayloadStatus(2)` |
Expand Down Expand Up @@ -499,8 +498,11 @@ def on_block(store: Store, signed_block: SignedBeaconBlock) -> None:
# Notify the store about the payload_attestations in the block
notify_ptc_messages(store, state, block.body.payload_attestations)
# Add proposer score boost if the block is timely
time_into_slot = (store.time - store.genesis_time) % SECONDS_PER_SLOT
is_before_attesting_interval = time_into_slot < SECONDS_PER_SLOT // INTERVALS_PER_SLOT
seconds_since_genesis = store.time - store.genesis_time
time_into_slot_ms = seconds_to_milliseconds(seconds_since_genesis) % SLOT_DURATION_MS
# [Modified in EIP7732]
attestation_threshold_ms = get_slot_component_duration_ms(ATTESTATION_DUE_BPS_EIP7732)
is_before_attesting_interval = time_into_slot_ms < attestation_threshold_ms
is_timely = get_current_slot(store) == block.slot and is_before_attesting_interval
store.block_timeliness[hash_tree_root(block)] = is_timely

Expand Down
36 changes: 26 additions & 10 deletions specs/_features/eip7732/validator.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<!-- mdformat-toc start --slug=github --no-anchors --maxlevel=6 --minlevel=2 -->

- [Introduction](#introduction)
- [Configuration](#configuration)
- [Time parameters](#time-parameters)
- [Validator assignment](#validator-assignment)
- [Lookahead](#lookahead)
- [Beacon chain responsibilities](#beacon-chain-responsibilities)
Expand All @@ -26,6 +28,18 @@
This document represents the changes and additions to the Honest validator guide
included in the EIP-7732 fork.

## Configuration

### Time parameters

| Name | Value | Unit | Duration |
| ------------------------------ | -------------- | :----------: | :-----------------------: |
| `ATTESTATION_DUE_BPS_EIP7732` | `uint64(2500)` | basis points | 25% of `SLOT_DURATION_MS` |
| `AGGREGRATE_DUE_BPS_EIP7732` | `uint64(5000)` | basis points | 50% of `SLOT_DURATION_MS` |
| `SYNC_MESSAGE_DUE_BPS_EIP7732` | `uint64(2500)` | basis points | 25% of `SLOT_DURATION_MS` |
| `CONTRIBUTION_DUE_BPS_EIP7732` | `uint64(5000)` | basis points | 50% of `SLOT_DURATION_MS` |
| `PAYLOAD_ATTESTATION_DUE_BPS` | `uint64(7500)` | basis points | 75% of `SLOT_DURATION_MS` |

## Validator assignment

A validator may be a member of the new Payload Timeliness Committee (PTC) for a
Expand Down Expand Up @@ -69,16 +83,17 @@ All validator responsibilities remain unchanged other than the following:
becomes a builder's duty.
- Some validators are selected per slot to become PTC members, these validators
must broadcast `PayloadAttestationMessage` objects during the assigned slot
before the deadline of `3 * SECONDS_PER_SLOT // INTERVALS_PER_SLOT` seconds
before the deadline of
`get_slot_component_duration_ms(PAYLOAD_ATTESTATION_DUE_BPS)` milliseconds
into the slot.

### Attestation

The attestation deadline is implicitly changed by the change in
`INTERVALS_PER_SLOT`. Moreover, the `attestation.data.index` field is now used
to signal the payload status of the block being attested to
(`attestation.data.beacon_block_root`). With the alias
`data = attestation.data`, the validator should set this field as follows:
The attestation deadline is changed with `ATTESTATION_DUE_BPS_EIP7732`.
Moreover, the `attestation.data.index` field is now used to signal the payload
status of the block being attested to (`attestation.data.beacon_block_root`).
With the alias `data = attestation.data`, the validator should set this field as
follows:

- If `block.slot == current_slot` (i.e., `data.slot`), then always set
`data.index = 0`.
Expand All @@ -92,7 +107,7 @@ to signal the payload status of the block being attested to
### Sync Committee participations

Sync committee duties are not changed for validators, however the submission
deadline is implicitly changed by the change in `INTERVALS_PER_SLOT`.
deadline is changed with `SYNC_MESSAGE_DUE_BPS_EIP7732`.

### Block proposal

Expand Down Expand Up @@ -152,16 +167,17 @@ prepared to submit their PTC attestations during the next epoch.

A validator should create and broadcast the `payload_attestation_message` to the
global execution attestation subnet not after
`SECONDS_PER_SLOT * 3 / INTERVALS_PER_SLOT` seconds since the start of `slot`
`get_slot_component_duration_ms(PAYLOAD_ATTESTATION_DUE_BPS)` milliseconds since
the start of `slot`.

#### Constructing a payload attestation

If a validator is in the payload attestation committee for the current slot (as
obtained from `get_ptc_assignment` above) then the validator should prepare a
`PayloadAttestationMessage` for the current slot, according to the logic in
`get_payload_attestation_message` below and broadcast it not after
`SECONDS_PER_SLOT * 3 / INTERVALS_PER_SLOT` seconds since the start of the slot,
to the global `payload_attestation_message` pubsub topic.
`get_slot_component_duration_ms(PAYLOAD_ATTESTATION_DUE_BPS)` milliseconds since
the start of the slot, to the global `payload_attestation_message` pubsub topic.

The validator creates `payload_attestation_message` as follows:

Expand Down
Loading
Loading