Commit 4d1705f
authored
fix(sequencer): enforce build-frame deadlines and align attestation/publish windows (#23776)
## Summary
Fixes timing bugs in block building and validation, now that proposer
pipelining is the only production mode. Found via an audit of the
sequencer timetable, checkpoint proposal job, validator client, proposal
handler, and p2p proposal/attestation validators.
### The frame bug (main fix)
Under pipelining the proposer job runs with `slotNow = N-1` (build slot)
and `targetSlot = N`. The job passed `targetSlot` to `setState` for
build-frame states, so `Sequencer.setState` measured the
`assertTimeLeft` deadlines against
`getSlotStartBuildTimestamp(targetSlot)` — one full Aztec slot (72s)
later than the build frame. The build-frame deadlines
(`INITIALIZING_CHECKPOINT`, `CREATING_BLOCK`, `ASSEMBLING_CHECKPOINT`,
`COLLECTING_ATTESTATIONS`, `PUBLISHING_CHECKPOINT`, …) were therefore
checked ~72s too late and never fired. Now these states are measured
against `slotNow`. `targetSlot` is still used for headers, signing, and
`sendRequestsAt`.
### Aligning the attestation / publish windows around L1 geometry
- The checkpoint attestation/publish deadline and the p2p attestation
acceptance window are now derived from `ethereumSlotDuration` — **one
Ethereum slot (12s) before the last L1 block of the target slot**, the
latest a checkpoint can be submitted and still land on L1 in its slot.
Previously the deadline used the configurable `l1PublishingTime` and the
p2p window was only `2 * p2pPropagationTime` (~4.5s into the target
slot). This also unifies the deadline with the publisher's send lead
(`sendRequestsAt` already targets one Ethereum slot before the target
slot start).
- Validators (in `validateCheckpointProposal`) keep validating/attesting
checkpoint proposals until that L1 publish deadline instead of the
target-slot start, so attestations stay useful right up to the
proposer's real publish cutoff. Block-proposal re-execution deadlines
are intentionally left at the target-slot start.
### Why no test caught the frame bug
The job timing test built the job with `slotNow === targetSlot` (so the
two frames coincided) and stubbed `setStateFn` with a no-op, mocking
away the very `assertTimeLeft` enforcement where the frame matters. This
PR adds:
- A contract test asserting every build-frame state is set against the
build slot (`slotNow`), not the target slot.
- A behavioral test with a real enforcing `setStateFn`: a checkpoint
whose assembly crosses the build-frame deadline is now correctly
abandoned. Both fail on the pre-fix code and pass after the fix.
- Updated stdlib/timetable, clock-tolerance, attestation-validator,
proposal-handler, and validator tests for the realigned windows
(including an `l1PublishingTime != ethereumSlotDuration` case proving
the deadline is now Ethereum-slot-based).
No constants were removed and no broader cleanup was done; that is
deferred.
## Test plan
- `yarn build` green; touched packages lint/format clean.
- `@aztec/stdlib` timetable, `@aztec/sequencer-client` (incl.
`timetable`, `checkpoint_proposal_job.timing`, `sequencer-publisher`),
`@aztec/validator-client` (incl. `proposal_handler`, `validator`), and
`@aztec/p2p` `msg_validators` suites pass.1 parent cd1d459 commit 4d1705f
14 files changed
Lines changed: 309 additions & 63 deletions
File tree
- yarn-project
- p2p/src/msg_validators
- attestation_validator
- sequencer-client/src/sequencer
- stdlib/src/timetable
- validator-client/src
Lines changed: 36 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
100 | | - | |
| 100 | + | |
| 101 | + | |
101 | 102 | | |
102 | 103 | | |
103 | 104 | | |
| |||
119 | 120 | | |
120 | 121 | | |
121 | 122 | | |
122 | | - | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
123 | 156 | | |
124 | 157 | | |
125 | 158 | | |
| |||
151 | 184 | | |
152 | 185 | | |
153 | 186 | | |
154 | | - | |
| 187 | + | |
155 | 188 | | |
156 | 189 | | |
157 | 190 | | |
| |||
Lines changed: 11 additions & 13 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
260 | 260 | | |
261 | 261 | | |
262 | 262 | | |
263 | | - | |
264 | | - | |
265 | | - | |
266 | | - | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
267 | 268 | | |
268 | 269 | | |
269 | 270 | | |
| |||
282 | 283 | | |
283 | 284 | | |
284 | 285 | | |
285 | | - | |
| 286 | + | |
286 | 287 | | |
287 | 288 | | |
288 | 289 | | |
289 | 290 | | |
290 | 291 | | |
291 | | - | |
| 292 | + | |
292 | 293 | | |
293 | 294 | | |
294 | 295 | | |
295 | 296 | | |
296 | | - | |
| 297 | + | |
297 | 298 | | |
298 | 299 | | |
299 | | - | |
| 300 | + | |
300 | 301 | | |
301 | 302 | | |
302 | | - | |
303 | | - | |
304 | | - | |
| 303 | + | |
305 | 304 | | |
306 | 305 | | |
307 | 306 | | |
308 | 307 | | |
309 | | - | |
| 308 | + | |
310 | 309 | | |
311 | 310 | | |
312 | | - | |
313 | 311 | | |
314 | 312 | | |
315 | 313 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
97 | | - | |
| 97 | + | |
98 | 98 | | |
99 | | - | |
| 99 | + | |
100 | 100 | | |
101 | | - | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
102 | 108 | | |
103 | 109 | | |
104 | 110 | | |
| |||
208 | 214 | | |
209 | 215 | | |
210 | 216 | | |
211 | | - | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
212 | 220 | | |
213 | 221 | | |
214 | 222 | | |
| |||
230 | 238 | | |
231 | 239 | | |
232 | 240 | | |
233 | | - | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
Lines changed: 89 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
| 14 | + | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| |||
301 | 301 | | |
302 | 302 | | |
303 | 303 | | |
304 | | - | |
305 | | - | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
306 | 307 | | |
307 | 308 | | |
308 | 309 | | |
| |||
1138 | 1139 | | |
1139 | 1140 | | |
1140 | 1141 | | |
| 1142 | + | |
| 1143 | + | |
| 1144 | + | |
| 1145 | + | |
| 1146 | + | |
| 1147 | + | |
| 1148 | + | |
| 1149 | + | |
| 1150 | + | |
| 1151 | + | |
| 1152 | + | |
| 1153 | + | |
| 1154 | + | |
| 1155 | + | |
| 1156 | + | |
| 1157 | + | |
| 1158 | + | |
| 1159 | + | |
| 1160 | + | |
| 1161 | + | |
| 1162 | + | |
| 1163 | + | |
| 1164 | + | |
| 1165 | + | |
| 1166 | + | |
| 1167 | + | |
| 1168 | + | |
| 1169 | + | |
| 1170 | + | |
| 1171 | + | |
| 1172 | + | |
| 1173 | + | |
| 1174 | + | |
| 1175 | + | |
| 1176 | + | |
| 1177 | + | |
| 1178 | + | |
| 1179 | + | |
| 1180 | + | |
| 1181 | + | |
| 1182 | + | |
| 1183 | + | |
| 1184 | + | |
| 1185 | + | |
| 1186 | + | |
| 1187 | + | |
| 1188 | + | |
| 1189 | + | |
| 1190 | + | |
| 1191 | + | |
| 1192 | + | |
| 1193 | + | |
| 1194 | + | |
| 1195 | + | |
| 1196 | + | |
| 1197 | + | |
| 1198 | + | |
| 1199 | + | |
| 1200 | + | |
| 1201 | + | |
| 1202 | + | |
| 1203 | + | |
| 1204 | + | |
| 1205 | + | |
| 1206 | + | |
| 1207 | + | |
| 1208 | + | |
| 1209 | + | |
| 1210 | + | |
| 1211 | + | |
| 1212 | + | |
| 1213 | + | |
| 1214 | + | |
| 1215 | + | |
| 1216 | + | |
| 1217 | + | |
| 1218 | + | |
| 1219 | + | |
| 1220 | + | |
| 1221 | + | |
| 1222 | + | |
| 1223 | + | |
| 1224 | + | |
| 1225 | + | |
| 1226 | + | |
1141 | 1227 | | |
Lines changed: 9 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
149 | 149 | | |
150 | 150 | | |
151 | 151 | | |
152 | | - | |
| 152 | + | |
153 | 153 | | |
154 | 154 | | |
155 | 155 | | |
| |||
328 | 328 | | |
329 | 329 | | |
330 | 330 | | |
331 | | - | |
| 331 | + | |
| 332 | + | |
332 | 333 | | |
333 | 334 | | |
334 | 335 | | |
| |||
518 | 519 | | |
519 | 520 | | |
520 | 521 | | |
521 | | - | |
| 522 | + | |
522 | 523 | | |
523 | 524 | | |
524 | 525 | | |
| |||
671 | 672 | | |
672 | 673 | | |
673 | 674 | | |
674 | | - | |
| 675 | + | |
675 | 676 | | |
676 | 677 | | |
677 | 678 | | |
| |||
963 | 964 | | |
964 | 965 | | |
965 | 966 | | |
966 | | - | |
| 967 | + | |
967 | 968 | | |
968 | 969 | | |
969 | 970 | | |
| |||
1034 | 1035 | | |
1035 | 1036 | | |
1036 | 1037 | | |
1037 | | - | |
| 1038 | + | |
1038 | 1039 | | |
1039 | 1040 | | |
1040 | 1041 | | |
| |||
1205 | 1206 | | |
1206 | 1207 | | |
1207 | 1208 | | |
1208 | | - | |
| 1209 | + | |
1209 | 1210 | | |
1210 | 1211 | | |
1211 | 1212 | | |
| |||
1221 | 1222 | | |
1222 | 1223 | | |
1223 | 1224 | | |
1224 | | - | |
| 1225 | + | |
1225 | 1226 | | |
1226 | 1227 | | |
1227 | 1228 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
| |||
0 commit comments