@@ -41,20 +41,41 @@ func validateVersionedHashed(payload: ExecutionPayload,
4141 true
4242
4343template validateVersion (com, timestamp, payloadVersion, apiVersion) =
44- if apiVersion == Version .V4 :
44+ if apiVersion == Version .V5 :
45+ if not com.isAmsterdamOrLater (timestamp):
46+ raise unsupportedFork (" newPayloadV5 expect payload timestamp fall within Amsterdam" )
47+ if payloadVersion != Version .V4 :
48+ raise invalidParams (" newPayload" & $ apiVersion &
49+ " expect ExecutionPayloadV4" &
50+ " but got ExecutionPayload" & $ payloadVersion)
51+
52+ elif apiVersion == Version .V4 :
4553 if not com.isPragueOrLater (timestamp):
4654 raise unsupportedFork (" newPayloadV4 expect payload timestamp fall within Prague" )
47-
48- if com.isPragueOrLater (timestamp):
4955 if payloadVersion != Version .V3 :
50- raise invalidParams (" if timestamp is Prague or later, " &
51- " payload must be ExecutionPayloadV3, got ExecutionPayload" & $ payloadVersion)
56+ raise invalidParams (" newPayload" & $ apiVersion &
57+ " expect ExecutionPayloadV3" &
58+ " but got ExecutionPayload" & $ payloadVersion)
5259
53- if apiVersion == Version .V3 :
60+ elif apiVersion == Version .V3 :
5461 if not com.isCancunOrLater (timestamp):
5562 raise unsupportedFork (" newPayloadV3 expect payload timestamp fall within Cancun" )
63+ if payloadVersion != Version .V3 :
64+ raise invalidParams (" newPayload" & $ apiVersion &
65+ " expect ExecutionPayloadV3" &
66+ " but got ExecutionPayload" & $ payloadVersion)
5667
57- if com.isCancunOrLater (timestamp):
68+ if com.isAmsterdamOrLater (timestamp):
69+ if payloadVersion != Version .V4 :
70+ raise invalidParams (" if timestamp is Amsterdam or later, " &
71+ " payload must be ExecutionPayloadV4, got ExecutionPayload" & $ payloadVersion)
72+
73+ elif com.isPragueOrLater (timestamp):
74+ if payloadVersion != Version .V3 :
75+ raise invalidParams (" if timestamp is Prague or later, " &
76+ " payload must be ExecutionPayloadV3, got ExecutionPayload" & $ payloadVersion)
77+
78+ elif com.isCancunOrLater (timestamp):
5879 if payloadVersion != Version .V3 :
5980 raise invalidParams (" if timestamp is Cancun or later, " &
6081 " payload must be ExecutionPayloadV3, got ExecutionPayload" & $ payloadVersion)
@@ -68,13 +89,6 @@ template validateVersion(com, timestamp, payloadVersion, apiVersion) =
6889 raise invalidParams (" if timestamp is earlier than Shanghai, " &
6990 " payload must be ExecutionPayloadV1, got ExecutionPayload" & $ payloadVersion)
7091
71- if apiVersion == Version .V3 or apiVersion == Version .V4 :
72- # both newPayloadV3 and newPayloadV4 expect ExecutionPayloadV3
73- if payloadVersion != Version .V3 :
74- raise invalidParams (" newPayload" & $ apiVersion &
75- " expect ExecutionPayload3" &
76- " but got ExecutionPayload" & $ payloadVersion)
77-
7892template validatePayload (apiVersion, payloadVersion, payload) =
7993 if payloadVersion >= Version .V2 :
8094 if payload.withdrawals.isNone:
@@ -89,6 +103,11 @@ template validatePayload(apiVersion, payloadVersion, payload) =
89103 raise invalidParams (" newPayload" & $ apiVersion &
90104 " excessBlobGas is expected from execution payload" )
91105
106+ if apiVersion >= Version .V5 or payloadVersion >= Version .V4 :
107+ if payload.blockAccessList.isNone:
108+ raise invalidParams (" newPayload" & $ apiVersion &
109+ " blockAccessList is expected from execution payload" )
110+
92111# https://github.com/ethereum/execution-apis/blob/40088597b8b4f48c45184da002e27ffc3c37641f/src/engine/prague.md#request
93112func validateExecutionRequest (blockHash: Hash32 ,
94113 requests: openArray [seq [byte ]], apiVersion: Version ):
@@ -161,6 +180,13 @@ proc newPayload*(ben: BeaconEngineRef,
161180 warn " Failed to decode payload" ,
162181 error = e.msg
163182 return invalidStatus (payload.blockHash, " Failed to decode payload" )
183+ blockAccessList =
184+ try :
185+ blockAccessList (payload)
186+ except RlpError as e:
187+ warn " Failed to decode payload" ,
188+ error = e.msg
189+ return invalidStatus (payload.blockHash, " Failed to decode payload" )
164190
165191 template header : Header = blk.header
166192
@@ -194,7 +220,7 @@ proc newPayload*(ben: BeaconEngineRef,
194220 # will not trigger a sync cycle. That is fine though, if we get a fork choice
195221 # update after legit payload executions.
196222 let parent = chain.headerByHash (header.parentHash).valueOr:
197- return ben.delayPayloadImport (blockHash, blk)
223+ return ben.delayPayloadImport (blockHash, blk, blockAccessList )
198224
199225 # We have an existing parent, do some sanity checks to avoid the beacon client
200226 # triggering too early
@@ -221,7 +247,7 @@ proc newPayload*(ben: BeaconEngineRef,
221247 return invalidStatus (parent.computeBlockHash, " Invalid timestamp" )
222248
223249 if not chain.haveBlockAndState (header.parentHash):
224- chain.quarantine.addOrphan (blockHash, blk)
250+ chain.quarantine.addOrphan (blockHash, blk, blockAccessList )
225251 warn " State not available, ignoring new payload" ,
226252 hash = blockHash,
227253 number = header.number
@@ -233,7 +259,7 @@ proc newPayload*(ben: BeaconEngineRef,
233259 trace " Importing block without sethead" ,
234260 hash = blockHash, number = header.number
235261
236- let vres = await chain.queueImportBlock (blk)
262+ let vres = await chain.queueImportBlock (blk, blockAccessList )
237263 if vres.isErr:
238264 warn " Error importing block" ,
239265 number = header.number,
0 commit comments