Skip to content

Commit 516251a

Browse files
authored
Replace INTERVALS_PER_SLOT with explicit slot component times (#4476)
This PR is an alternative to #3510. * Deprecate `SECONDS_PER_SLOT` in favor of `SLOT_DURATION_MS`. * Deprecate `INTERVALS_PER_SLOT` in favor of config vars in basis points. Instead of presets in millisecond units, this PR defines slot component durations (eg `ATTESTATION_DUE_BPS`) with config variables where the unit is basis points (a common way to describe percentages). This will make it easier to test different slot times and fine-tune slot component durations. To test a different slot time, change `SLOT_DURATION_MS` and the component times will automatically adjust since they are percentages of `SLOT_DURATION_MS`.
1 parent d00c9ae commit 516251a

File tree

21 files changed

+272
-116
lines changed

21 files changed

+272
-116
lines changed

configs/mainnet.yaml

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,10 @@ EIP7805_FORK_EPOCH: 18446744073709551615
6767

6868
# Time parameters
6969
# ---------------------------------------------------------------
70-
# 12 seconds
70+
# 12 seconds (*deprecated*)
7171
SECONDS_PER_SLOT: 12
72+
# 12000 milliseconds, 12 seconds
73+
SLOT_DURATION_MS: 12000
7274
# 14 (estimate from Eth1 mainnet)
7375
SECONDS_PER_ETH1_BLOCK: 14
7476
# 2**8 (= 256) epochs, ~27 hours
@@ -77,6 +79,38 @@ MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256
7779
SHARD_COMMITTEE_PERIOD: 256
7880
# 2**11 (= 2,048) Eth1 blocks, ~8 hours
7981
ETH1_FOLLOW_DISTANCE: 2048
82+
# 1667 basis points, ~17% of SLOT_DURATION_MS
83+
PROPOSER_REORG_CUTOFF_BPS: 1667
84+
# 3333 basis points, ~33% of SLOT_DURATION_MS
85+
ATTESTATION_DUE_BPS: 3333
86+
# 6667 basis points, ~67% of SLOT_DURATION_MS
87+
AGGREGRATE_DUE_BPS: 6667
88+
89+
# Altair
90+
# 3333 basis points, ~33% of SLOT_DURATION_MS
91+
SYNC_MESSAGE_DUE_BPS: 3333
92+
# 6667 basis points, ~67% of SLOT_DURATION_MS
93+
CONTRIBUTION_DUE_BPS: 6667
94+
95+
# EIP-7732
96+
# 2500 basis points, 25% of SLOT_DURATION_MS
97+
ATTESTATION_DUE_BPS_EIP7732: 2500
98+
# 5000 basis points, 50% of SLOT_DURATION_MS
99+
AGGREGRATE_DUE_BPS_EIP7732: 5000
100+
# 2500 basis points, 25% of SLOT_DURATION_MS
101+
SYNC_MESSAGE_DUE_BPS_EIP7732: 2500
102+
# 5000 basis points, 50% of SLOT_DURATION_MS
103+
CONTRIBUTION_DUE_BPS_EIP7732: 5000
104+
# 7500 basis points, 75% of SLOT_DURATION_MS
105+
PAYLOAD_ATTESTATION_DUE_BPS: 7500
106+
107+
# EIP-7805
108+
# 7500 basis points, 75% of SLOT_DURATION_MS
109+
VIEW_FREEZE_CUTOFF_BPS: 7500
110+
# 6667 basis points, ~67% of SLOT_DURATION_MS
111+
INCLUSION_LIST_SUBMISSION_DUE_BPS: 6667
112+
# 9167 basis points, ~92% of SLOT_DURATION_MS
113+
PROPOSER_INCLUSION_LIST_CUTOFF_BPS: 9167
80114

81115
# Validator cycle
82116
# ---------------------------------------------------------------
@@ -182,10 +216,6 @@ MAX_REQUEST_PAYLOADS: 128
182216
PROPOSER_SCORE_BOOST_EIP7732: 20
183217

184218
# EIP7805
185-
ATTESTATION_DEADLINE: 4
186-
INCLUSION_LIST_SUBMISSION_DEADLINE: 8
187-
VIEW_FREEZE_DEADLINE: 9
188-
PROPOSER_INCLUSION_LIST_CUTOFF: 11
189219
# 2**4 (= 16)
190220
MAX_REQUEST_INCLUSION_LIST: 16
191221
# 2**13 (= 8192)

configs/minimal.yaml

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,10 @@ EIP7805_FORK_EPOCH: 18446744073709551615
6363

6464
# Time parameters
6565
# ---------------------------------------------------------------
66-
# [customized] 6 seconds
66+
# [customized] 6 seconds (*deprecated*)
6767
SECONDS_PER_SLOT: 6
68+
# [customized] 6000 milliseconds, 6 seconds
69+
SLOT_DURATION_MS: 6000
6870
# 14 (estimate from Eth1 mainnet)
6971
SECONDS_PER_ETH1_BLOCK: 14
7072
# 2**8 (= 256) epochs, ~27 hours
@@ -73,6 +75,38 @@ MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256
7375
SHARD_COMMITTEE_PERIOD: 64
7476
# [customized] 2**4 (= 16) Eth1 blocks, ~4 minutes
7577
ETH1_FOLLOW_DISTANCE: 16
78+
# 1667 basis points, ~17% of SLOT_DURATION_MS
79+
PROPOSER_REORG_CUTOFF_BPS: 1667
80+
# 3333 basis points, ~33% of SLOT_DURATION_MS
81+
ATTESTATION_DUE_BPS: 3333
82+
# 6667 basis points, ~67% of SLOT_DURATION_MS
83+
AGGREGRATE_DUE_BPS: 6667
84+
85+
# Altair
86+
# 3333 basis points, ~33% of SLOT_DURATION_MS
87+
SYNC_MESSAGE_DUE_BPS: 3333
88+
# 6667 basis points, ~67% of SLOT_DURATION_MS
89+
CONTRIBUTION_DUE_BPS: 6667
90+
91+
# EIP-7732
92+
# 2500 basis points, 25% of SLOT_DURATION_MS
93+
ATTESTATION_DUE_BPS_EIP7732: 2500
94+
# 5000 basis points, 50% of SLOT_DURATION_MS
95+
AGGREGRATE_DUE_BPS_EIP7732: 5000
96+
# 2500 basis points, 25% of SLOT_DURATION_MS
97+
SYNC_MESSAGE_DUE_BPS_EIP7732: 2500
98+
# 5000 basis points, 50% of SLOT_DURATION_MS
99+
CONTRIBUTION_DUE_BPS_EIP7732: 5000
100+
# 7500 basis points, 75% of SLOT_DURATION_MS
101+
PAYLOAD_ATTESTATION_DUE_BPS: 7500
102+
103+
# EIP-7805
104+
# 7500 basis points, 75% of SLOT_DURATION_MS
105+
VIEW_FREEZE_CUTOFF_BPS: 7500
106+
# 6667 basis points, ~67% of SLOT_DURATION_MS
107+
INCLUSION_LIST_SUBMISSION_DUE_BPS: 6667
108+
# 9167 basis points, ~92% of SLOT_DURATION_MS
109+
PROPOSER_INCLUSION_LIST_CUTOFF_BPS: 9167
76110

77111
# Validator cycle
78112
# ---------------------------------------------------------------
@@ -179,10 +213,6 @@ MAX_REQUEST_PAYLOADS: 128
179213
PROPOSER_SCORE_BOOST_EIP7732: 20
180214

181215
# EIP7805
182-
ATTESTATION_DEADLINE: 2
183-
INCLUSION_LIST_SUBMISSION_DEADLINE: 2
184-
VIEW_FREEZE_DEADLINE: 3
185-
PROPOSER_INCLUSION_LIST_CUTOFF: 5
186216
# 2**4 (= 16)
187217
MAX_REQUEST_INCLUSION_LIST: 16
188218
# 2**13 (= 8192)

specs/_features/eip7732/fork-choice.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ This is the modification of the fork-choice accompanying the EIP-7732 upgrade.
5050
| Name | Value |
5151
| -------------------------- | ----------------------- |
5252
| `PAYLOAD_TIMELY_THRESHOLD` | `PTC_SIZE // 2` (= 256) |
53-
| `INTERVALS_PER_SLOT` | `4` |
5453
| `PAYLOAD_STATUS_PENDING` | `PayloadStatus(0)` |
5554
| `PAYLOAD_STATUS_EMPTY` | `PayloadStatus(1)` |
5655
| `PAYLOAD_STATUS_FULL` | `PayloadStatus(2)` |
@@ -485,8 +484,11 @@ def on_block(store: Store, signed_block: SignedBeaconBlock) -> None:
485484
# Notify the store about the payload_attestations in the block
486485
notify_ptc_messages(store, state, block.body.payload_attestations)
487486
# Add proposer score boost if the block is timely
488-
time_into_slot = (store.time - store.genesis_time) % SECONDS_PER_SLOT
489-
is_before_attesting_interval = time_into_slot < SECONDS_PER_SLOT // INTERVALS_PER_SLOT
487+
seconds_since_genesis = store.time - store.genesis_time
488+
time_into_slot_ms = seconds_to_milliseconds(seconds_since_genesis) % SLOT_DURATION_MS
489+
# [Modified in EIP7732]
490+
attestation_threshold_ms = get_slot_component_duration_ms(ATTESTATION_DUE_BPS_EIP7732)
491+
is_before_attesting_interval = time_into_slot_ms < attestation_threshold_ms
490492
is_timely = get_current_slot(store) == block.slot and is_before_attesting_interval
491493
store.block_timeliness[hash_tree_root(block)] = is_timely
492494

specs/_features/eip7732/validator.md

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
<!-- mdformat-toc start --slug=github --no-anchors --maxlevel=6 --minlevel=2 -->
66

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

31+
## Configuration
32+
33+
### Time parameters
34+
35+
| Name | Value | Unit | Duration |
36+
| ------------------------------ | -------------- | :----------: | :-----------------------: |
37+
| `ATTESTATION_DUE_BPS_EIP7732` | `uint64(2500)` | basis points | 25% of `SLOT_DURATION_MS` |
38+
| `AGGREGRATE_DUE_BPS_EIP7732` | `uint64(5000)` | basis points | 50% of `SLOT_DURATION_MS` |
39+
| `SYNC_MESSAGE_DUE_BPS_EIP7732` | `uint64(2500)` | basis points | 25% of `SLOT_DURATION_MS` |
40+
| `CONTRIBUTION_DUE_BPS_EIP7732` | `uint64(5000)` | basis points | 50% of `SLOT_DURATION_MS` |
41+
| `PAYLOAD_ATTESTATION_DUE_BPS` | `uint64(7500)` | basis points | 75% of `SLOT_DURATION_MS` |
42+
2943
## Validator assignment
3044

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

7590
### Attestation
7691

77-
The attestation deadline is implicitly changed by the change in
78-
`INTERVALS_PER_SLOT`. Moreover, the `attestation.data.index` field is now used
79-
to signal the payload status of the block being attested to
80-
(`attestation.data.beacon_block_root`). With the alias
81-
`data = attestation.data`, the validator should set this field as follows:
92+
The attestation deadline is changed with `ATTESTATION_DUE_BPS_EIP7732`.
93+
Moreover, the `attestation.data.index` field is now used to signal the payload
94+
status of the block being attested to (`attestation.data.beacon_block_root`).
95+
With the alias `data = attestation.data`, the validator should set this field as
96+
follows:
8297

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

94109
Sync committee duties are not changed for validators, however the submission
95-
deadline is implicitly changed by the change in `INTERVALS_PER_SLOT`.
110+
deadline is changed with `SYNC_MESSAGE_DUE_BPS_EIP7732`.
96111

97112
### Block proposal
98113

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

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

157173
#### Constructing a payload attestation
158174

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

166182
The validator creates `payload_attestation_message` as follows:
167183

specs/_features/eip7805/fork-choice.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ This is the modification of the fork choice accompanying the EIP-7805 upgrade.
3030

3131
### Time parameters
3232

33-
| Name | Value | Unit | Duration |
34-
| ---------------------- | ------------------------------- | :-----: | :-------: |
35-
| `VIEW_FREEZE_DEADLINE` | `SECONDS_PER_SLOT * 2 // 3 + 1` | seconds | 9 seconds |
33+
| Name | Value | Unit | Duration |
34+
| ------------------------ | -------------- | :----------: | :-----------------------: |
35+
| `VIEW_FREEZE_CUTOFF_BPS` | `uint64(7500)` | basis points | 75% of `SLOT_DURATION_MS` |
3636

3737
## Protocols
3838

@@ -270,12 +270,12 @@ def on_inclusion_list(store: Store, signed_inclusion_list: SignedInclusionList)
270270

271271
inclusion_list_store = get_inclusion_list_store()
272272

273-
time_into_slot = (store.time - store.genesis_time) % SECONDS_PER_SLOT
274-
is_before_view_freeze_deadline = (
275-
get_current_slot(store) == inclusion_list.slot and time_into_slot < VIEW_FREEZE_DEADLINE
276-
)
273+
seconds_since_genesis = store.time - store.genesis_time
274+
time_into_slot_ms = seconds_to_milliseconds(seconds_since_genesis) % SLOT_DURATION_MS
275+
view_freeze_cutoff_ms = get_slot_component_duration_ms(VIEW_FREEZE_CUTOFF_BPS)
276+
is_before_view_freeze_cutoff = time_into_slot_ms < view_freeze_cutoff_ms
277277

278-
process_inclusion_list(inclusion_list_store, inclusion_list, is_before_view_freeze_deadline)
278+
process_inclusion_list(inclusion_list_store, inclusion_list, is_before_view_freeze_cutoff)
279279
```
280280

281281
### Modified `on_block`
@@ -324,8 +324,10 @@ def on_block(store: Store, signed_block: SignedBeaconBlock) -> None:
324324
store.block_states[block_root] = state
325325

326326
# Add block timeliness to the store
327-
time_into_slot = (store.time - store.genesis_time) % SECONDS_PER_SLOT
328-
is_before_attesting_interval = time_into_slot < SECONDS_PER_SLOT // INTERVALS_PER_SLOT
327+
seconds_since_genesis = store.time - store.genesis_time
328+
time_into_slot_ms = seconds_to_milliseconds(seconds_since_genesis) % SLOT_DURATION_MS
329+
attestation_threshold_ms = get_slot_component_duration_ms(ATTESTATION_DUE_BPS)
330+
is_before_attesting_interval = time_into_slot_ms < attestation_threshold_ms
329331
is_timely = get_current_slot(store) == block.slot and is_before_attesting_interval
330332
store.block_timeliness[hash_tree_root(block)] = is_timely
331333

specs/_features/eip7805/p2p-interface.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ EIP-7805.
2121

2222
### Configuration
2323

24-
| Name | Value | Unit | Duration |
25-
| ---------------------- | ----------------------- | :-----: | :-------: |
26-
| `ATTESTATION_DEADLINE` | `SECONDS_PER_SLOT // 3` | seconds | 4 seconds |
27-
2824
| Name | Value | Description |
2925
| ------------------------------ | ---------------- | ---------------------------------------------------------- |
3026
| `MAX_REQUEST_INCLUSION_LIST` | `2**4` (= 16) | Maximum number of inclusion list in a single request |
@@ -56,7 +52,8 @@ the network, assuming the alias `message = signed_inclusion_list.message`:
5652
- _[REJECT]_ The slot `message.slot` is equal to the previous or current slot.
5753
- _[IGNORE]_ The slot `message.slot` is equal to the current slot, or it is
5854
equal to the previous slot and the current time is less than
59-
`ATTESTATION_DEADLINE` seconds into the slot.
55+
`get_slot_component_duration_ms(ATTESTATION_DUE_BPS)` milliseconds into the
56+
slot.
6057
- _[IGNORE]_ The `inclusion_list_committee` for slot `message.slot` on the
6158
current branch corresponds to `message.inclusion_list_committee_root`, as
6259
determined by

specs/_features/eip7805/validator.md

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ continuing and use them as a reference throughout.
5050

5151
### Time parameters
5252

53-
| Name | Value | Unit | Duration |
54-
| ------------------------------------ | --------------------------- | :-----: | :--------: |
55-
| `INCLUSION_LIST_SUBMISSION_DEADLINE` | `SECONDS_PER_SLOT * 2 // 3` | seconds | 8 seconds |
56-
| `PROPOSER_INCLUSION_LIST_CUTOFF` | `SECONDS_PER_SLOT - 1` | seconds | 11 seconds |
53+
| Name | Value | Unit | Duration |
54+
| ------------------------------------ | -------------- | :----------: | :------------------------: |
55+
| `INCLUSION_LIST_SUBMISSION_DUE_BPS` | `uint64(6667)` | basis points | ~67% of `SLOT_DURATION_MS` |
56+
| `PROPOSER_INCLUSION_LIST_CUTOFF_BPS` | `uint64(9167)` | basis points | ~92% of `SLOT_DURATION_MS` |
5757

5858
## Helpers
5959

@@ -150,7 +150,8 @@ processed through any empty slots up to the assigned slot using
150150

151151
*Note*: A proposer should produce an execution payload that satisfies the
152152
inclusion list constraints with respect to the inclusion lists gathered up to
153-
`PROPOSER_INCLUSION_LIST_CUTOFF` into the slot.
153+
`get_slot_component_duration_ms(PROPOSER_INCLUSION_LIST_CUTOFF_BPS)`
154+
milliseconds into the slot.
154155

155156
```python
156157
def prepare_execution_payload(
@@ -198,12 +199,14 @@ of any `slot` for which
198199

199200
If a validator is in the current inclusion list committee, the validator should
200201
create and broadcast the `signed_inclusion_list` to the global `inclusion_list`
201-
subnet by `INCLUSION_LIST_SUBMISSION_DEADLINE` seconds into the slot after
202-
processing the block for the current slot and confirming it as the head. If no
203-
block is received by `INCLUSION_LIST_SUBMISSION_DEADLINE - 1` seconds into the
204-
slot, the validator should run `get_head` to determine the local head and
205-
construct and broadcast the inclusion list based on this local head by
206-
`INCLUSION_LIST_SUBMISSION_DEADLINE` seconds into the slot.
202+
subnet by `get_slot_component_duration_ms(INCLUSION_LIST_SUBMISSION_DUE_BPS)`
203+
milliseconds into the slot after processing the block for the current slot and
204+
confirming it as the head. If no block is received by
205+
`get_slot_component_duration_ms(INCLUSION_LIST_SUBMISSION_DUE_BPS) - 1000`
206+
milliseconds into the slot, the validator should run `get_head` to determine the
207+
local head and construct and broadcast the inclusion list based on this local
208+
head by `get_slot_component_duration_ms(INCLUSION_LIST_SUBMISSION_DUE_BPS)`
209+
milliseconds into the slot.
207210

208211
#### Constructing the `SignedInclusionList`
209212

specs/altair/light-client/p2p-interface.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ the network.
6464
`finality_update` for that slot did not indicate supermajority
6565
- _[IGNORE]_ The `finality_update` is received after the block at
6666
`signature_slot` was given enough time to propagate through the network --
67-
i.e. validate that one-third of `finality_update.signature_slot` has
68-
transpired (`SECONDS_PER_SLOT / INTERVALS_PER_SLOT` seconds after the start of
69-
the slot, with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance)
67+
i.e. validatate that `get_slot_component_duration_ms(SYNC_MESSAGE_DUE_BPS)`
68+
milliseconds (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance) has
69+
transpired since the start of `signature_slot`.
7070

7171
For full nodes, the following validations MUST additionally pass before
7272
forwarding the `finality_update` on the network.
@@ -111,9 +111,9 @@ the network.
111111
previously forwarded `optimistic_update`s
112112
- _[IGNORE]_ The `optimistic_update` is received after the block at
113113
`signature_slot` was given enough time to propagate through the network --
114-
i.e. validate that one-third of `optimistic_update.signature_slot` has
115-
transpired (`SECONDS_PER_SLOT / INTERVALS_PER_SLOT` seconds after the start of
116-
the slot, with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance)
114+
i.e. validatate that `get_slot_component_duration_ms(SYNC_MESSAGE_DUE_BPS)`
115+
milliseconds (with a `MAXIMUM_GOSSIP_CLOCK_DISPARITY` allowance) has
116+
transpired since the start of `optimistic_update.signature_slot`.
117117

118118
For full nodes, the following validations MUST additionally pass before
119119
forwarding the `optimistic_update` on the network.
@@ -371,9 +371,9 @@ follows:
371371
SHOULD be broadcasted to the pubsub topic `light_client_optimistic_update` if
372372
no matching message has not yet been forwarded as part of gossip validation.
373373

374-
These messages SHOULD be broadcasted after one-third of `slot` has transpired
375-
(`SECONDS_PER_SLOT / INTERVALS_PER_SLOT` seconds after the start of the slot).
376-
To ensure that the corresponding block was given enough time to propagate
377-
through the network, they SHOULD NOT be sent earlier. Note that this is
378-
different from how other messages are handled, e.g., attestations, which may be
379-
sent early.
374+
These messages SHOULD be broadcasted
375+
`get_slot_component_duration_ms(SYNC_MESSAGE_DUE_BPS)` milliseconds after the
376+
start of the slot. To ensure that the corresponding block was given enough time
377+
to propagate through the network, they SHOULD NOT be sent earlier. Note that
378+
this is different from how other messages are handled, e.g., attestations, which
379+
may be sent early.

0 commit comments

Comments
 (0)