Skip to content

Commit 81b8673

Browse files
lightclientjsvisa
authored andcommitted
eth/catalyst: check fork timestamps during engine_getPayload (#32754)
This adds checks into getPayload to ensure the correct version is called for the fork which applies to the payload. --------- Co-authored-by: jsvisa <[email protected]>
1 parent 60cc8a2 commit 81b8673

File tree

1 file changed

+46
-28
lines changed

1 file changed

+46
-28
lines changed

eth/catalyst/api.go

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -402,10 +402,12 @@ func (api *ConsensusAPI) ExchangeTransitionConfigurationV1(config engine.Transit
402402

403403
// GetPayloadV1 returns a cached payload by id.
404404
func (api *ConsensusAPI) GetPayloadV1(payloadID engine.PayloadID) (*engine.ExecutableData, error) {
405-
if !payloadID.Is(engine.PayloadV1) {
406-
return nil, engine.UnsupportedFork
407-
}
408-
data, err := api.getPayload(payloadID, false)
405+
data, err := api.getPayload(
406+
payloadID,
407+
false,
408+
[]engine.PayloadVersion{engine.PayloadV1},
409+
nil,
410+
)
409411
if err != nil {
410412
return nil, err
411413
}
@@ -414,35 +416,34 @@ func (api *ConsensusAPI) GetPayloadV1(payloadID engine.PayloadID) (*engine.Execu
414416

415417
// GetPayloadV2 returns a cached payload by id.
416418
func (api *ConsensusAPI) GetPayloadV2(payloadID engine.PayloadID) (*engine.ExecutionPayloadEnvelope, error) {
417-
// executionPayload: ExecutionPayloadV1 | ExecutionPayloadV2 where:
418-
//
419-
// - ExecutionPayloadV1 MUST be returned if the payload timestamp is lower
420-
// than the Shanghai timestamp
421-
//
422-
// - ExecutionPayloadV2 MUST be returned if the payload timestamp is greater
423-
// or equal to the Shanghai timestamp
424-
if !payloadID.Is(engine.PayloadV1, engine.PayloadV2) {
425-
return nil, engine.UnsupportedFork
426-
}
427-
return api.getPayload(payloadID, false)
419+
return api.getPayload(
420+
payloadID,
421+
false,
422+
[]engine.PayloadVersion{engine.PayloadV1, engine.PayloadV2},
423+
[]forks.Fork{forks.Shanghai},
424+
)
428425
}
429426

430427
// GetPayloadV3 returns a cached payload by id. This endpoint should only
431428
// be used for the Cancun fork.
432429
func (api *ConsensusAPI) GetPayloadV3(payloadID engine.PayloadID) (*engine.ExecutionPayloadEnvelope, error) {
433-
if !payloadID.Is(engine.PayloadV3) {
434-
return nil, engine.UnsupportedFork
435-
}
436-
return api.getPayload(payloadID, false)
430+
return api.getPayload(
431+
payloadID,
432+
false,
433+
[]engine.PayloadVersion{engine.PayloadV3},
434+
[]forks.Fork{forks.Cancun},
435+
)
437436
}
438437

439438
// GetPayloadV4 returns a cached payload by id. This endpoint should only
440439
// be used for the Prague fork.
441440
func (api *ConsensusAPI) GetPayloadV4(payloadID engine.PayloadID) (*engine.ExecutionPayloadEnvelope, error) {
442-
if !payloadID.Is(engine.PayloadV3) {
443-
return nil, engine.UnsupportedFork
444-
}
445-
return api.getPayload(payloadID, false)
441+
return api.getPayload(
442+
payloadID,
443+
false,
444+
[]engine.PayloadVersion{engine.PayloadV3},
445+
[]forks.Fork{forks.Prague},
446+
)
446447
}
447448

448449
// GetPayloadV5 returns a cached payload by id. This endpoint should only
@@ -451,18 +452,35 @@ func (api *ConsensusAPI) GetPayloadV4(payloadID engine.PayloadID) (*engine.Execu
451452
// This method follows the same specification as engine_getPayloadV4 with
452453
// changes of returning BlobsBundleV2 with BlobSidecar version 1.
453454
func (api *ConsensusAPI) GetPayloadV5(payloadID engine.PayloadID) (*engine.ExecutionPayloadEnvelope, error) {
454-
if !payloadID.Is(engine.PayloadV3) {
455-
return nil, engine.UnsupportedFork
456-
}
457-
return api.getPayload(payloadID, false)
455+
return api.getPayload(
456+
payloadID,
457+
false,
458+
[]engine.PayloadVersion{engine.PayloadV3},
459+
[]forks.Fork{
460+
forks.Osaka,
461+
forks.BPO1,
462+
forks.BPO2,
463+
forks.BPO3,
464+
forks.BPO4,
465+
forks.BPO5,
466+
})
458467
}
459468

460-
func (api *ConsensusAPI) getPayload(payloadID engine.PayloadID, full bool) (*engine.ExecutionPayloadEnvelope, error) {
469+
// getPayload will retreive the specified payload and verify it conforms to the
470+
// endpoint's allowed payload versions and forks.
471+
func (api *ConsensusAPI) getPayload(payloadID engine.PayloadID, full bool, versions []engine.PayloadVersion, forks []forks.Fork) (*engine.ExecutionPayloadEnvelope, error) {
461472
log.Trace("Engine API request received", "method", "GetPayload", "id", payloadID)
473+
if !payloadID.Is(versions...) {
474+
return nil, engine.UnsupportedFork
475+
}
462476
data := api.localBlocks.get(payloadID, full)
463477
if data == nil {
464478
return nil, engine.UnknownPayload
465479
}
480+
if forks != nil && !api.checkFork(data.ExecutionPayload.Timestamp, forks...) {
481+
return nil, engine.UnsupportedFork
482+
}
483+
466484
return data, nil
467485
}
468486

0 commit comments

Comments
 (0)