11# Nimbus
2- # Copyright (c) 2023-2025 Status Research & Development GmbH
2+ # Copyright (c) 2023-2026 Status Research & Development GmbH
33# Licensed under either of
44# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
55# * MIT license ([LICENSE-MIT](LICENSE-MIT))
@@ -14,14 +14,13 @@ import
1414 web3/ execution_types,
1515 ./ api_utils
1616
17- {.push gcsafe , raises :[CatchableError ].}
17+ {.push gcsafe , raises : [CatchableError ].}
1818
19- const
20- maxBodyRequest = 32
19+ const maxBodyRequest = 32
2120
22- proc getPayloadBodiesByHash * (ben: BeaconEngineRef ,
23- hashes: seq [Hash32 ]):
24- seq [Opt [ExecutionPayloadBodyV1 ]] =
21+ proc getPayloadBodiesByHashV1 * (
22+ ben: BeaconEngineRef , hashes: seq [Hash32 ]
23+ ): seq [Opt [ExecutionPayloadBodyV1 ]] =
2524 if hashes.len > maxBodyRequest:
2625 raise tooLargeRequest (" request exceeds max allowed " & $ maxBodyRequest)
2726
@@ -35,9 +34,25 @@ proc getPayloadBodiesByHash*(ben: BeaconEngineRef,
3534
3635 move (list)
3736
38- proc getPayloadBodiesByRange * (ben: BeaconEngineRef ,
39- start: uint64 , count: uint64 ):
40- seq [Opt [ExecutionPayloadBodyV1 ]] =
37+ proc getPayloadBodiesByHashV2 * (
38+ ben: BeaconEngineRef , hashes: seq [Hash32 ]
39+ ): seq [Opt [ExecutionPayloadBodyV2 ]] =
40+ if hashes.len > maxBodyRequest:
41+ raise tooLargeRequest (" request exceeds max allowed " & $ maxBodyRequest)
42+
43+ var list = newSeqOfCap [Opt [ExecutionPayloadBodyV2 ]](hashes.len)
44+
45+ for h in hashes:
46+ var body = ben.chain.payloadBodyV2ByHash (h).valueOr:
47+ list.add Opt .none (ExecutionPayloadBodyV2 )
48+ continue
49+ list.add Opt .some (move (body))
50+
51+ move (list)
52+
53+ proc getPayloadBodiesByRangeV1 * (
54+ ben: BeaconEngineRef , start: uint64 , count: uint64
55+ ): seq [Opt [ExecutionPayloadBodyV1 ]] =
4156 if start == 0 :
4257 raise invalidParams (" start block should greater than zero" )
4358
@@ -47,8 +62,7 @@ proc getPayloadBodiesByRange*(ben: BeaconEngineRef,
4762 if count > maxBodyRequest:
4863 raise tooLargeRequest (" request exceeds max allowed " & $ maxBodyRequest)
4964
50- var
51- last = start+ count- 1
65+ var last = start + count - 1
5266
5367 if start > ben.chain.latestNumber:
5468 # requested range beyond the latest known block.
@@ -58,11 +72,11 @@ proc getPayloadBodiesByRange*(ben: BeaconEngineRef,
5872 last = ben.chain.latestNumber
5973
6074 let base = ben.chain.baseNumber
61- var list = newSeqOfCap [Opt [ExecutionPayloadBodyV1 ]](last- start+ 1 )
75+ var list = newSeqOfCap [Opt [ExecutionPayloadBodyV1 ]](last - start + 1 )
6276
6377 if start < base:
6478 # get bodies from database.
65- for bn in start.. min (last, base):
79+ for bn in start .. min (last, base):
6680 var body = ben.chain.payloadBodyV1ByNumber (bn).valueOr:
6781 list.add Opt .none (ExecutionPayloadBodyV1 )
6882 continue
@@ -75,3 +89,43 @@ proc getPayloadBodiesByRange*(ben: BeaconEngineRef,
7589 ben.chain.payloadBodyV1InMemory (start, last, list)
7690
7791 move (list)
92+
93+ proc getPayloadBodiesByRangeV2 * (
94+ ben: BeaconEngineRef , start: uint64 , count: uint64
95+ ): seq [Opt [ExecutionPayloadBodyV2 ]] =
96+ if start == 0 :
97+ raise invalidParams (" start block should greater than zero" )
98+
99+ if count == 0 :
100+ raise invalidParams (" blocks count should greater than zero" )
101+
102+ if count > maxBodyRequest:
103+ raise tooLargeRequest (" request exceeds max allowed " & $ maxBodyRequest)
104+
105+ var last = start + count - 1
106+
107+ if start > ben.chain.latestNumber:
108+ # requested range beyond the latest known block.
109+ return
110+
111+ if last > ben.chain.latestNumber:
112+ last = ben.chain.latestNumber
113+
114+ let base = ben.chain.baseNumber
115+ var list = newSeqOfCap [Opt [ExecutionPayloadBodyV2 ]](last - start + 1 )
116+
117+ if start < base:
118+ # get bodies from database.
119+ for bn in start .. min (last, base):
120+ var body = ben.chain.payloadBodyV2ByNumber (bn).valueOr:
121+ list.add Opt .none (ExecutionPayloadBodyV2 )
122+ continue
123+ list.add Opt .some (move (body))
124+
125+ # get bodies from cache in FC module.
126+ if last > base:
127+ ben.chain.payloadBodyV2InMemory (base, last, list)
128+ else :
129+ ben.chain.payloadBodyV2InMemory (start, last, list)
130+
131+ move (list)
0 commit comments