@lodestar/beacon-node 1.50.0 → 1.51.0-dev.15ecdb3b27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +7 -2
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/state/index.js +8 -2
  6. package/lib/api/impl/beacon/state/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/utils.d.ts +2 -1
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/state/utils.js +17 -9
  10. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  11. package/lib/api/impl/debug/index.d.ts.map +1 -1
  12. package/lib/api/impl/debug/index.js +3 -0
  13. package/lib/api/impl/debug/index.js.map +1 -1
  14. package/lib/api/impl/validator/index.d.ts.map +1 -1
  15. package/lib/api/impl/validator/index.js +133 -27
  16. package/lib/api/impl/validator/index.js.map +1 -1
  17. package/lib/chain/ColumnReconstructionTracker.d.ts +11 -13
  18. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  19. package/lib/chain/ColumnReconstructionTracker.js +49 -44
  20. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  21. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  22. package/lib/chain/archiveStore/utils/archiveBlocks.js +4 -5
  23. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  24. package/lib/chain/blocks/blockInput/blockInput.d.ts +1 -1
  25. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  26. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  27. package/lib/chain/blocks/blockInput/utils.js +2 -2
  28. package/lib/chain/blocks/blockInput/utils.js.map +1 -1
  29. package/lib/chain/blocks/importBlock.js +10 -6
  30. package/lib/chain/blocks/importBlock.js.map +1 -1
  31. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  32. package/lib/chain/blocks/importExecutionPayload.js +49 -2
  33. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  34. package/lib/chain/blocks/types.d.ts +4 -0
  35. package/lib/chain/blocks/types.d.ts.map +1 -1
  36. package/lib/chain/blocks/types.js +5 -0
  37. package/lib/chain/blocks/types.js.map +1 -1
  38. package/lib/chain/chain.d.ts +2 -1
  39. package/lib/chain/chain.d.ts.map +1 -1
  40. package/lib/chain/chain.js +8 -3
  41. package/lib/chain/chain.js.map +1 -1
  42. package/lib/chain/errors/executionPayloadBid.d.ts +11 -1
  43. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  44. package/lib/chain/errors/executionPayloadBid.js +2 -0
  45. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  46. package/lib/chain/errors/inclusionList.d.ts +60 -0
  47. package/lib/chain/errors/inclusionList.d.ts.map +1 -0
  48. package/lib/chain/errors/inclusionList.js +19 -0
  49. package/lib/chain/errors/inclusionList.js.map +1 -0
  50. package/lib/chain/errors/index.d.ts +1 -0
  51. package/lib/chain/errors/index.d.ts.map +1 -1
  52. package/lib/chain/errors/index.js +1 -0
  53. package/lib/chain/errors/index.js.map +1 -1
  54. package/lib/chain/interface.d.ts +3 -2
  55. package/lib/chain/interface.d.ts.map +1 -1
  56. package/lib/chain/interface.js.map +1 -1
  57. package/lib/chain/opPools/inclusionListStore.d.ts +63 -0
  58. package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -0
  59. package/lib/chain/opPools/inclusionListStore.js +171 -0
  60. package/lib/chain/opPools/inclusionListStore.js.map +1 -0
  61. package/lib/chain/opPools/index.d.ts +1 -0
  62. package/lib/chain/opPools/index.d.ts.map +1 -1
  63. package/lib/chain/opPools/index.js +1 -0
  64. package/lib/chain/opPools/index.js.map +1 -1
  65. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  66. package/lib/chain/prepareNextSlot.js +4 -3
  67. package/lib/chain/prepareNextSlot.js.map +1 -1
  68. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  69. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  70. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -1
  71. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  72. package/lib/chain/produceBlock/produceBlockBody.js +37 -14
  73. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  74. package/lib/chain/regen/interface.d.ts +1 -0
  75. package/lib/chain/regen/interface.d.ts.map +1 -1
  76. package/lib/chain/regen/interface.js +1 -0
  77. package/lib/chain/regen/interface.js.map +1 -1
  78. package/lib/chain/reprocess.d.ts +2 -1
  79. package/lib/chain/reprocess.d.ts.map +1 -1
  80. package/lib/chain/reprocess.js +2 -1
  81. package/lib/chain/reprocess.js.map +1 -1
  82. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  83. package/lib/chain/seenCache/seenGossipBlockInput.js +1 -1
  84. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  85. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  86. package/lib/chain/stateCache/persistentCheckpointsCache.js +1 -1
  87. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  88. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  89. package/lib/chain/validation/executionPayloadBid.js +33 -1
  90. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  91. package/lib/chain/validation/inclusionList.d.ts +14 -0
  92. package/lib/chain/validation/inclusionList.d.ts.map +1 -0
  93. package/lib/chain/validation/inclusionList.js +141 -0
  94. package/lib/chain/validation/inclusionList.js.map +1 -0
  95. package/lib/chain/validation/index.d.ts +1 -0
  96. package/lib/chain/validation/index.d.ts.map +1 -1
  97. package/lib/chain/validation/index.js +1 -0
  98. package/lib/chain/validation/index.js.map +1 -1
  99. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  100. package/lib/chain/validatorMonitor.js +6 -4
  101. package/lib/chain/validatorMonitor.js.map +1 -1
  102. package/lib/constants/constants.d.ts +1 -0
  103. package/lib/constants/constants.d.ts.map +1 -1
  104. package/lib/constants/constants.js +1 -0
  105. package/lib/constants/constants.js.map +1 -1
  106. package/lib/db/repositories/blockArchive.js +2 -2
  107. package/lib/db/repositories/blockArchive.js.map +1 -1
  108. package/lib/db/repositories/blockArchiveIndex.d.ts +1 -1
  109. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  110. package/lib/db/repositories/blockArchiveIndex.js +1 -2
  111. package/lib/db/repositories/blockArchiveIndex.js.map +1 -1
  112. package/lib/execution/builder/validateBid.d.ts.map +1 -1
  113. package/lib/execution/builder/validateBid.js +14 -1
  114. package/lib/execution/builder/validateBid.js.map +1 -1
  115. package/lib/execution/engine/disabled.d.ts +1 -0
  116. package/lib/execution/engine/disabled.d.ts.map +1 -1
  117. package/lib/execution/engine/disabled.js +3 -0
  118. package/lib/execution/engine/disabled.js.map +1 -1
  119. package/lib/execution/engine/http.d.ts +8 -2
  120. package/lib/execution/engine/http.d.ts.map +1 -1
  121. package/lib/execution/engine/http.js +28 -4
  122. package/lib/execution/engine/http.js.map +1 -1
  123. package/lib/execution/engine/index.d.ts.map +1 -1
  124. package/lib/execution/engine/index.js +1 -1
  125. package/lib/execution/engine/index.js.map +1 -1
  126. package/lib/execution/engine/interface.d.ts +11 -2
  127. package/lib/execution/engine/interface.d.ts.map +1 -1
  128. package/lib/execution/engine/interface.js.map +1 -1
  129. package/lib/execution/engine/jsonRpcHttpClient.d.ts.map +1 -1
  130. package/lib/execution/engine/jsonRpcHttpClient.js +14 -4
  131. package/lib/execution/engine/jsonRpcHttpClient.js.map +1 -1
  132. package/lib/execution/engine/jsonRpcTransport.d.ts +3 -2
  133. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  134. package/lib/execution/engine/jsonRpcTransport.js +33 -9
  135. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  136. package/lib/execution/engine/mock.d.ts +1 -0
  137. package/lib/execution/engine/mock.d.ts.map +1 -1
  138. package/lib/execution/engine/mock.js +25 -3
  139. package/lib/execution/engine/mock.js.map +1 -1
  140. package/lib/execution/engine/payloadIdCache.d.ts +4 -1
  141. package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
  142. package/lib/execution/engine/payloadIdCache.js +13 -2
  143. package/lib/execution/engine/payloadIdCache.js.map +1 -1
  144. package/lib/execution/engine/restTransport.d.ts +5 -2
  145. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  146. package/lib/execution/engine/restTransport.js +36 -21
  147. package/lib/execution/engine/restTransport.js.map +1 -1
  148. package/lib/execution/engine/transport.d.ts +5 -2
  149. package/lib/execution/engine/transport.d.ts.map +1 -1
  150. package/lib/execution/engine/transportMetrics.d.ts +5 -1
  151. package/lib/execution/engine/transportMetrics.d.ts.map +1 -1
  152. package/lib/execution/engine/types.d.ts +24 -0
  153. package/lib/execution/engine/types.d.ts.map +1 -1
  154. package/lib/execution/engine/types.js +24 -11
  155. package/lib/execution/engine/types.js.map +1 -1
  156. package/lib/metrics/metrics/beacon.d.ts +16 -0
  157. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  158. package/lib/metrics/metrics/beacon.js +35 -0
  159. package/lib/metrics/metrics/beacon.js.map +1 -1
  160. package/lib/metrics/metrics/lodestar.d.ts +20 -0
  161. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  162. package/lib/metrics/metrics/lodestar.js +51 -1
  163. package/lib/metrics/metrics/lodestar.js.map +1 -1
  164. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  165. package/lib/network/gossip/gossipsub.js +3 -1
  166. package/lib/network/gossip/gossipsub.js.map +1 -1
  167. package/lib/network/gossip/interface.d.ts +8 -2
  168. package/lib/network/gossip/interface.d.ts.map +1 -1
  169. package/lib/network/gossip/interface.js +1 -0
  170. package/lib/network/gossip/interface.js.map +1 -1
  171. package/lib/network/gossip/topic.d.ts +8 -14
  172. package/lib/network/gossip/topic.d.ts.map +1 -1
  173. package/lib/network/gossip/topic.js +13 -1
  174. package/lib/network/gossip/topic.js.map +1 -1
  175. package/lib/network/interface.d.ts +2 -1
  176. package/lib/network/interface.d.ts.map +1 -1
  177. package/lib/network/network.d.ts +2 -1
  178. package/lib/network/network.d.ts.map +1 -1
  179. package/lib/network/network.js +5 -0
  180. package/lib/network/network.js.map +1 -1
  181. package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -1
  182. package/lib/network/peers/utils/enrSubnetsDeserialize.js +5 -2
  183. package/lib/network/peers/utils/enrSubnetsDeserialize.js.map +1 -1
  184. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  185. package/lib/network/processor/gossipHandlers.js +40 -1
  186. package/lib/network/processor/gossipHandlers.js.map +1 -1
  187. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  188. package/lib/network/processor/gossipQueues/index.js +6 -0
  189. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  190. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  191. package/lib/network/processor/gossipValidatorFn.js +5 -1
  192. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  193. package/lib/network/processor/index.d.ts +5 -0
  194. package/lib/network/processor/index.d.ts.map +1 -1
  195. package/lib/network/processor/index.js +40 -29
  196. package/lib/network/processor/index.js.map +1 -1
  197. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  198. package/lib/network/reqresp/ReqRespBeaconNode.js +6 -0
  199. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  200. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  201. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +4 -4
  202. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  203. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +3 -3
  204. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  205. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts +10 -0
  206. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts.map +1 -0
  207. package/lib/network/reqresp/handlers/inclusionListsByIndices.js +30 -0
  208. package/lib/network/reqresp/handlers/inclusionListsByIndices.js.map +1 -0
  209. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  210. package/lib/network/reqresp/handlers/index.js +5 -0
  211. package/lib/network/reqresp/handlers/index.js.map +1 -1
  212. package/lib/network/reqresp/protocols.d.ts +1 -0
  213. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  214. package/lib/network/reqresp/protocols.js +5 -0
  215. package/lib/network/reqresp/protocols.js.map +1 -1
  216. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  217. package/lib/network/reqresp/rateLimit.js +6 -2
  218. package/lib/network/reqresp/rateLimit.js.map +1 -1
  219. package/lib/network/reqresp/types.d.ts +5 -2
  220. package/lib/network/reqresp/types.d.ts.map +1 -1
  221. package/lib/network/reqresp/types.js +3 -0
  222. package/lib/network/reqresp/types.js.map +1 -1
  223. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  224. package/lib/network/subnets/attnetsService.js +3 -1
  225. package/lib/network/subnets/attnetsService.js.map +1 -1
  226. package/lib/node/notifier.d.ts.map +1 -1
  227. package/lib/node/notifier.js +12 -13
  228. package/lib/node/notifier.js.map +1 -1
  229. package/lib/sync/unknownBlock.d.ts.map +1 -1
  230. package/lib/sync/unknownBlock.js +3 -2
  231. package/lib/sync/unknownBlock.js.map +1 -1
  232. package/lib/util/clock.d.ts.map +1 -1
  233. package/lib/util/clock.js +3 -4
  234. package/lib/util/clock.js.map +1 -1
  235. package/lib/util/sszBytes.d.ts +2 -2
  236. package/lib/util/sszBytes.d.ts.map +1 -1
  237. package/lib/util/sszBytes.js +22 -14
  238. package/lib/util/sszBytes.js.map +1 -1
  239. package/package.json +15 -15
  240. package/src/api/impl/beacon/blocks/index.ts +10 -3
  241. package/src/api/impl/beacon/state/index.ts +10 -1
  242. package/src/api/impl/beacon/state/utils.ts +19 -9
  243. package/src/api/impl/debug/index.ts +4 -0
  244. package/src/api/impl/validator/index.ts +173 -29
  245. package/src/chain/ColumnReconstructionTracker.ts +63 -46
  246. package/src/chain/archiveStore/utils/archiveBlocks.ts +6 -7
  247. package/src/chain/blocks/blockInput/blockInput.ts +1 -1
  248. package/src/chain/blocks/blockInput/utils.ts +2 -2
  249. package/src/chain/blocks/importBlock.ts +11 -11
  250. package/src/chain/blocks/importExecutionPayload.ts +67 -2
  251. package/src/chain/blocks/types.ts +5 -0
  252. package/src/chain/chain.ts +8 -2
  253. package/src/chain/errors/executionPayloadBid.ts +12 -0
  254. package/src/chain/errors/inclusionList.ts +38 -0
  255. package/src/chain/errors/index.ts +1 -0
  256. package/src/chain/interface.ts +4 -1
  257. package/src/chain/opPools/inclusionListStore.ts +208 -0
  258. package/src/chain/opPools/index.ts +1 -0
  259. package/src/chain/prepareNextSlot.ts +7 -3
  260. package/src/chain/produceBlock/computeNewStateRoot.ts +9 -2
  261. package/src/chain/produceBlock/produceBlockBody.ts +70 -23
  262. package/src/chain/regen/interface.ts +1 -0
  263. package/src/chain/reprocess.ts +2 -1
  264. package/src/chain/seenCache/seenGossipBlockInput.ts +2 -1
  265. package/src/chain/stateCache/persistentCheckpointsCache.ts +4 -1
  266. package/src/chain/validation/executionPayloadBid.ts +52 -2
  267. package/src/chain/validation/inclusionList.ts +183 -0
  268. package/src/chain/validation/index.ts +1 -0
  269. package/src/chain/validatorMonitor.ts +7 -4
  270. package/src/constants/constants.ts +1 -0
  271. package/src/db/repositories/blockArchive.ts +2 -2
  272. package/src/db/repositories/blockArchiveIndex.ts +2 -3
  273. package/src/execution/builder/validateBid.ts +23 -2
  274. package/src/execution/engine/disabled.ts +4 -0
  275. package/src/execution/engine/http.ts +41 -5
  276. package/src/execution/engine/index.ts +2 -1
  277. package/src/execution/engine/interface.ts +27 -3
  278. package/src/execution/engine/jsonRpcHttpClient.ts +12 -5
  279. package/src/execution/engine/jsonRpcTransport.ts +46 -9
  280. package/src/execution/engine/mock.ts +26 -3
  281. package/src/execution/engine/payloadIdCache.ts +23 -4
  282. package/src/execution/engine/restTransport.ts +68 -23
  283. package/src/execution/engine/transport.ts +7 -2
  284. package/src/execution/engine/transportMetrics.ts +2 -1
  285. package/src/execution/engine/types.ts +48 -11
  286. package/src/metrics/metrics/beacon.ts +37 -0
  287. package/src/metrics/metrics/lodestar.ts +53 -1
  288. package/src/network/gossip/gossipsub.ts +3 -1
  289. package/src/network/gossip/interface.ts +5 -0
  290. package/src/network/gossip/topic.ts +14 -0
  291. package/src/network/interface.ts +2 -0
  292. package/src/network/network.ts +11 -0
  293. package/src/network/peers/utils/enrSubnetsDeserialize.ts +5 -2
  294. package/src/network/processor/gossipHandlers.ts +52 -1
  295. package/src/network/processor/gossipQueues/index.ts +6 -0
  296. package/src/network/processor/gossipValidatorFn.ts +5 -0
  297. package/src/network/processor/index.ts +36 -27
  298. package/src/network/processor/types.ts +1 -1
  299. package/src/network/reqresp/ReqRespBeaconNode.ts +7 -0
  300. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +4 -10
  301. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +3 -3
  302. package/src/network/reqresp/handlers/inclusionListsByIndices.ts +44 -0
  303. package/src/network/reqresp/handlers/index.ts +5 -0
  304. package/src/network/reqresp/protocols.ts +6 -0
  305. package/src/network/reqresp/rateLimit.ts +6 -2
  306. package/src/network/reqresp/types.ts +6 -0
  307. package/src/network/subnets/attnetsService.ts +8 -3
  308. package/src/node/notifier.ts +14 -13
  309. package/src/sync/unknownBlock.ts +3 -2
  310. package/src/util/clock.ts +3 -4
  311. package/src/util/sszBytes.ts +25 -12
@@ -137,10 +137,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
137
137
  engine_newPayloadV3: this.notifyNewPayload.bind(this),
138
138
  engine_newPayloadV4: this.notifyNewPayload.bind(this),
139
139
  engine_newPayloadV5: this.notifyNewPayload.bind(this),
140
+ engine_newPayloadV6: this.notifyNewPayload.bind(this),
140
141
  engine_forkchoiceUpdatedV1: this.notifyForkchoiceUpdate.bind(this),
141
142
  engine_forkchoiceUpdatedV2: this.notifyForkchoiceUpdate.bind(this),
142
143
  engine_forkchoiceUpdatedV3: this.notifyForkchoiceUpdate.bind(this),
143
144
  engine_forkchoiceUpdatedV4: this.notifyForkchoiceUpdate.bind(this),
145
+ engine_forkchoiceUpdatedV5: this.notifyForkchoiceUpdate.bind(this),
144
146
  engine_getPayloadV1: this.getPayloadV1.bind(this),
145
147
  engine_getPayloadV2: this.getPayloadV5.bind(this),
146
148
  engine_getPayloadV3: this.getPayloadV5.bind(this),
@@ -151,6 +153,7 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
151
153
  engine_getClientVersionV1: this.getClientVersionV1.bind(this),
152
154
  engine_getBlobsV1: this.getBlobs.bind(this),
153
155
  engine_getBlobsV2: this.getBlobsV2.bind(this),
156
+ engine_getInclusionListV1: this.getInclusionList.bind(this),
154
157
  };
155
158
  }
156
159
 
@@ -234,7 +237,13 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
234
237
  // IF the payload has been fully validated while processing the call
235
238
  // RETURN payload status from the Payload validation process
236
239
  // If validation succeeds, the response MUST contain {status: VALID, latestValidHash: payload.blockHash}
237
- return {status: ExecutionPayloadStatus.VALID, latestValidHash: blockHash, validationError: null};
240
+ // The mock does not check inclusion list constraints, so every payload satisfies them (PayloadStatusV2)
241
+ return {
242
+ status: ExecutionPayloadStatus.VALID,
243
+ latestValidHash: blockHash,
244
+ validationError: null,
245
+ inclusionListSatisfied: true,
246
+ };
238
247
  }
239
248
 
240
249
  /**
@@ -409,7 +418,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
409
418
  // IF the payload is deemed VALID and the build process has begun
410
419
  // {payloadStatus: {status: VALID, latestValidHash: forkchoiceState.headBlockHash, validationError: null}, payloadId: buildProcessId}
411
420
  return {
412
- payloadStatus: {status: ExecutionPayloadStatus.VALID, latestValidHash: null, validationError: null},
421
+ payloadStatus: {
422
+ status: ExecutionPayloadStatus.VALID,
423
+ latestValidHash: null,
424
+ validationError: null,
425
+ inclusionListSatisfied: true,
426
+ },
413
427
  payloadId: String(payloadId as number),
414
428
  };
415
429
  }
@@ -418,7 +432,12 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
418
432
  // IF the payload is deemed VALID and a build process hasn't been started
419
433
  // {payloadStatus: {status: VALID, latestValidHash: forkchoiceState.headBlockHash, validationError: null}, payloadId: null}
420
434
  return {
421
- payloadStatus: {status: ExecutionPayloadStatus.VALID, latestValidHash: null, validationError: null},
435
+ payloadStatus: {
436
+ status: ExecutionPayloadStatus.VALID,
437
+ latestValidHash: null,
438
+ validationError: null,
439
+ inclusionListSatisfied: true,
440
+ },
422
441
  payloadId: null,
423
442
  };
424
443
  }
@@ -487,6 +506,10 @@ export class ExecutionEngineMockBackend implements JsonRpcBackend {
487
506
  return null;
488
507
  }
489
508
 
509
+ private getInclusionList(): EngineApiRpcReturnTypes["engine_getInclusionListV1"] {
510
+ return [];
511
+ }
512
+
490
513
  private timestampToFork(timestamp: number): ForkPostBellatrix {
491
514
  if (timestamp >= this.gloasForkTimestamp) return ForkName.gloas;
492
515
  if (timestamp >= this.fuluForkTimestamp) return ForkName.fulu;
@@ -1,4 +1,6 @@
1
+ import {byteArrayEquals} from "@chainsafe/ssz";
1
2
  import {SLOTS_PER_EPOCH} from "@lodestar/params";
3
+ import {bellatrix} from "@lodestar/types";
2
4
  import {pruneSetToMax} from "@lodestar/utils";
3
5
  import {PayloadAttributesRpc} from "./types.js";
4
6
  import {DATA, QUANTITY} from "./utils.js";
@@ -17,10 +19,16 @@ export type WithdrawalV1 = {
17
19
  amount: QUANTITY;
18
20
  };
19
21
 
20
- type FcuAttributes = {headBlockHash: DATA; finalizedBlockHash: DATA} & Omit<PayloadAttributesRpc, "withdrawals">;
22
+ type FcuAttributes = {headBlockHash: DATA; finalizedBlockHash: DATA} & Omit<
23
+ PayloadAttributesRpc,
24
+ "withdrawals" | "inclusionListTransactions"
25
+ > & {inclusionListTransactions?: bellatrix.Transactions};
21
26
 
22
27
  export class PayloadIdCache {
23
- private readonly payloadIdByFcuAttributes = new Map<string, {payloadId: PayloadId; fullKey: string}>();
28
+ private readonly payloadIdByFcuAttributes = new Map<
29
+ string,
30
+ {payloadId: PayloadId; fullKey: string; inclusionListTransactions?: bellatrix.Transactions}
31
+ >();
24
32
 
25
33
  getFullKey({headBlockHash, finalizedBlockHash, timestamp, prevRandao, suggestedFeeRecipient}: FcuAttributes): string {
26
34
  return `${headBlockHash}-${finalizedBlockHash}-${timestamp}-${prevRandao}-${suggestedFeeRecipient}`;
@@ -37,7 +45,8 @@ export class PayloadIdCache {
37
45
  add(fcuAttributes: FcuAttributes, payloadId: PayloadId): void {
38
46
  const key = this.getKey(fcuAttributes);
39
47
  const fullKey = this.getFullKey(fcuAttributes);
40
- this.payloadIdByFcuAttributes.set(key, {payloadId, fullKey});
48
+ const {inclusionListTransactions} = fcuAttributes;
49
+ this.payloadIdByFcuAttributes.set(key, {payloadId, fullKey, inclusionListTransactions});
41
50
  }
42
51
 
43
52
  prune(): void {
@@ -49,6 +58,16 @@ export class PayloadIdCache {
49
58
  const key = this.getKey(fcuAttributes);
50
59
  const fullKey = this.getFullKey(fcuAttributes);
51
60
  const payloadInfo = this.payloadIdByFcuAttributes.get(key);
52
- return payloadInfo?.fullKey === fullKey ? payloadInfo.payloadId : undefined;
61
+ return payloadInfo?.fullKey === fullKey &&
62
+ isSameInclusionList(payloadInfo.inclusionListTransactions, fcuAttributes.inclusionListTransactions)
63
+ ? payloadInfo.payloadId
64
+ : undefined;
53
65
  }
54
66
  }
67
+
68
+ function isSameInclusionList(a?: bellatrix.Transactions, b?: bellatrix.Transactions): boolean {
69
+ if (a === undefined || b === undefined) {
70
+ return a === b;
71
+ }
72
+ return a.length === b.length && a.every((transaction, i) => byteArrayEquals(transaction, b[i]));
73
+ }
@@ -1,9 +1,19 @@
1
1
  import {Type} from "@chainsafe/ssz";
2
2
  import {CELLS_PER_EXT_BLOB, ForkName, ForkSeq, isForkPostBellatrix} from "@lodestar/params";
3
- import {ExecutionPayload, ExecutionRequests, Root, RootHex, capella, deneb, electra, gloas} from "@lodestar/types";
3
+ import {
4
+ ExecutionPayload,
5
+ ExecutionRequests,
6
+ Root,
7
+ RootHex,
8
+ bellatrix,
9
+ capella,
10
+ deneb,
11
+ electra,
12
+ gloas,
13
+ } from "@lodestar/types";
4
14
  import {BlobAndProof} from "@lodestar/types/deneb";
5
15
  import {BlobAndProofV2} from "@lodestar/types/fulu";
6
- import {LodestarError, fromHex, strip0xPrefix, toHex, toRootHex} from "@lodestar/utils";
16
+ import {EndTimer, LodestarError, fromHex, strip0xPrefix, toHex, toRootHex} from "@lodestar/utils";
7
17
  import {isValidBlobVersionedHashes} from "./blobVersionedHashes.js";
8
18
  import {
9
19
  ClientCode,
@@ -48,6 +58,7 @@ import {
48
58
  executionForkName,
49
59
  } from "./sszTypes.js";
50
60
  import {ForkchoiceUpdatedResult, GetPayloadResult, IEngineTransport, PayloadStatusResult} from "./transport.js";
61
+ import {EngineTransportMetrics} from "./transportMetrics.js";
51
62
  import {
52
63
  ExecutionPayloadBodyV2,
53
64
  assertReqSizeLimit,
@@ -102,7 +113,10 @@ export function formatClientVersionHeader(clientVersion: ClientVersion): string
102
113
  export class RestEngineTransport implements IEngineTransport {
103
114
  private limits = DEFAULT_LIMITS;
104
115
 
105
- constructor(private readonly client: EngineRestHttpClient) {}
116
+ constructor(
117
+ private readonly client: EngineRestHttpClient,
118
+ private readonly metrics?: EngineTransportMetrics | null
119
+ ) {}
106
120
 
107
121
  get emitter(): JsonRpcHttpClientEventEmitter {
108
122
  return this.client.emitter;
@@ -114,7 +128,7 @@ export class RestEngineTransport implements IEngineTransport {
114
128
  {method: "GET", path: "/capabilities", responseType: "json"},
115
129
  getCapabilitiesOpts
116
130
  );
117
- const capabilities = parseJson(body, "getCapabilities");
131
+ const capabilities = parseJson(body, "getCapabilities", this.metrics);
118
132
  if (
119
133
  !isRecord(capabilities) ||
120
134
  !Array.isArray(capabilities.supported_forks) ||
@@ -220,7 +234,7 @@ export class RestEngineTransport implements IEngineTransport {
220
234
  {method: "POST", path: "/payloads", executionFork: toExecutionForkName(fork), body, responseType: "ssz"},
221
235
  notifyNewPayloadOpts
222
236
  );
223
- return toPayloadStatusResult(deserializeResponse(PayloadStatus, res.body, "notifyNewPayload"));
237
+ return toPayloadStatusResult(deserializeResponse(PayloadStatus, res.body, "notifyNewPayload", this.metrics));
224
238
  }
225
239
 
226
240
  async forkchoiceUpdated(
@@ -268,7 +282,12 @@ export class RestEngineTransport implements IEngineTransport {
268
282
  {method: "POST", path: "/forkchoice", executionFork: toExecutionForkName(fork), body, responseType: "ssz"},
269
283
  fcUReqOpts
270
284
  );
271
- const {payloadStatus, payloadId} = deserializeResponse(ForkchoiceUpdateResponse, res.body, "forkchoiceUpdated");
285
+ const {payloadStatus, payloadId} = deserializeResponse(
286
+ ForkchoiceUpdateResponse,
287
+ res.body,
288
+ "forkchoiceUpdated",
289
+ this.metrics
290
+ );
272
291
  return {
273
292
  payloadStatus: toPayloadStatusResult(payloadStatus),
274
293
  payloadId: payloadId.length > 0 ? toHex(payloadId[0]) : null,
@@ -289,7 +308,8 @@ export class RestEngineTransport implements IEngineTransport {
289
308
  const {payload, blockValue, blobsBundle, executionRequests, shouldOverrideBuilder} = deserializeResponse(
290
309
  BuiltPayloadGloas,
291
310
  res.body,
292
- "getPayload"
311
+ "getPayload",
312
+ this.metrics
293
313
  );
294
314
  return {
295
315
  executionPayload: payload,
@@ -303,7 +323,8 @@ export class RestEngineTransport implements IEngineTransport {
303
323
  const {payload, blockValue, blobsBundle, executionRequests, shouldOverrideBuilder} = deserializeResponse(
304
324
  BuiltPayloadFulu,
305
325
  res.body,
306
- "getPayload"
326
+ "getPayload",
327
+ this.metrics
307
328
  );
308
329
  return {
309
330
  executionPayload: payload,
@@ -317,7 +338,8 @@ export class RestEngineTransport implements IEngineTransport {
317
338
  const {payload, blockValue, blobsBundle, executionRequests, shouldOverrideBuilder} = deserializeResponse(
318
339
  BuiltPayloadElectra,
319
340
  res.body,
320
- "getPayload"
341
+ "getPayload",
342
+ this.metrics
321
343
  );
322
344
  return {
323
345
  executionPayload: payload,
@@ -331,15 +353,16 @@ export class RestEngineTransport implements IEngineTransport {
331
353
  const {payload, blockValue, blobsBundle, shouldOverrideBuilder} = deserializeResponse(
332
354
  BuiltPayloadDeneb,
333
355
  res.body,
334
- "getPayload"
356
+ "getPayload",
357
+ this.metrics
335
358
  );
336
359
  return {executionPayload: payload, executionPayloadValue: blockValue, blobsBundle, shouldOverrideBuilder};
337
360
  }
338
361
  if (ForkSeq[fork] >= ForkSeq.capella) {
339
- const {payload, blockValue} = deserializeResponse(BuiltPayloadCapella, res.body, "getPayload");
362
+ const {payload, blockValue} = deserializeResponse(BuiltPayloadCapella, res.body, "getPayload", this.metrics);
340
363
  return {executionPayload: payload, executionPayloadValue: blockValue, shouldOverrideBuilder: false};
341
364
  }
342
- const {payload, blockValue} = deserializeResponse(BuiltPayloadBellatrix, res.body, "getPayload");
365
+ const {payload, blockValue} = deserializeResponse(BuiltPayloadBellatrix, res.body, "getPayload", this.metrics);
343
366
  return {executionPayload: payload, executionPayloadValue: blockValue, shouldOverrideBuilder: false};
344
367
  }
345
368
 
@@ -356,7 +379,7 @@ export class RestEngineTransport implements IEngineTransport {
356
379
  },
357
380
  getPayloadBodiesByHashOpts
358
381
  );
359
- const bodies = deserializeBodiesResponse(ForkName.gloas, res.body);
382
+ const bodies = deserializeBodiesResponse(ForkName.gloas, res.body, this.metrics);
360
383
  if (bodies.length !== blockHashes.length) {
361
384
  throw Error(`Invalid bodies response length=${bodies.length} blockHashes=${blockHashes.length}`);
362
385
  }
@@ -374,7 +397,7 @@ export class RestEngineTransport implements IEngineTransport {
374
397
  return versionedHashes.map(() => null);
375
398
  }
376
399
 
377
- const {entries} = deserializeResponse(BlobsV1Response, res.body, "getBlobsV1");
400
+ const {entries} = deserializeResponse(BlobsV1Response, res.body, "getBlobsV1", this.metrics);
378
401
  if (entries.length !== versionedHashes.length) {
379
402
  throw Error(`Invalid blobs/v1 response length=${entries.length} versionedHashes=${versionedHashes.length}`);
380
403
  }
@@ -397,7 +420,7 @@ export class RestEngineTransport implements IEngineTransport {
397
420
  return null;
398
421
  }
399
422
 
400
- const {entries} = deserializeResponse(BlobsV2Response, res.body, "getBlobsV2", {reuseBytes: true});
423
+ const {entries} = deserializeResponse(BlobsV2Response, res.body, "getBlobsV2", this.metrics, {reuseBytes: true});
401
424
  if (entries.length !== versionedHashes.length) {
402
425
  throw Error(`Invalid blobs/v2 response length=${entries.length} versionedHashes=${versionedHashes.length}`);
403
426
  }
@@ -418,7 +441,7 @@ export class RestEngineTransport implements IEngineTransport {
418
441
  {method: "GET", path: "/identity", responseType: "json"},
419
442
  getClientVersionOpts
420
443
  );
421
- const versions = parseJson(body, "getClientVersion");
444
+ const versions = parseJson(body, "getClientVersion", this.metrics);
422
445
  if (!Array.isArray(versions)) {
423
446
  throw new EngineRestResponseError("getClientVersion", "Expected an array of client versions");
424
447
  }
@@ -441,6 +464,10 @@ export class RestEngineTransport implements IEngineTransport {
441
464
  };
442
465
  });
443
466
  }
467
+
468
+ getInclusionList(): Promise<bellatrix.Transactions> {
469
+ throw Error("engine_getInclusionListV1 is not available over the REST engine API");
470
+ }
444
471
  }
445
472
 
446
473
  function toPayloadAttributesBellatrix(attributes: PayloadAttributes) {
@@ -502,36 +529,54 @@ function toPayloadStatusResult(payloadStatus: PayloadStatusSsz): PayloadStatusRe
502
529
  }
503
530
  }
504
531
 
505
- function deserializeBodiesResponse(fork: ForkName, data: Uint8Array): (ExecutionPayloadBodyV2 | null)[] {
532
+ function deserializeBodiesResponse(
533
+ fork: ForkName,
534
+ data: Uint8Array,
535
+ metrics?: EngineTransportMetrics | null
536
+ ): (ExecutionPayloadBodyV2 | null)[] {
506
537
  if (ForkSeq[fork] >= ForkSeq.gloas) {
507
- return deserializeResponse(BodiesResponseGloas, data, "getPayloadBodiesByHash").entries.map((entry) =>
538
+ return deserializeResponse(BodiesResponseGloas, data, "getPayloadBodiesByHash", metrics).entries.map((entry) =>
508
539
  entry.available ? entry.body : null
509
540
  );
510
541
  }
511
542
  if (ForkSeq[fork] >= ForkSeq.capella) {
512
- return deserializeResponse(BodiesResponseCapella, data, "getPayloadBodiesByHash").entries.map((entry) =>
543
+ return deserializeResponse(BodiesResponseCapella, data, "getPayloadBodiesByHash", metrics).entries.map((entry) =>
513
544
  entry.available ? {...entry.body, blockAccessList: null} : null
514
545
  );
515
546
  }
516
- return deserializeResponse(BodiesResponseBellatrix, data, "getPayloadBodiesByHash").entries.map((entry) =>
547
+ return deserializeResponse(BodiesResponseBellatrix, data, "getPayloadBodiesByHash", metrics).entries.map((entry) =>
517
548
  entry.available ? {transactions: entry.body.transactions, withdrawals: null, blockAccessList: null} : null
518
549
  );
519
550
  }
520
551
 
521
552
  /** A 2xx response that does not decode is an execution client error, not an unreachable client */
522
- function deserializeResponse<T>(type: Type<T>, body: Uint8Array, routeId: string, opts?: {reuseBytes?: boolean}): T {
553
+ function deserializeResponse<T>(
554
+ type: Type<T>,
555
+ body: Uint8Array,
556
+ routeId: string,
557
+ metrics?: EngineTransportMetrics | null,
558
+ opts?: {reuseBytes?: boolean}
559
+ ): T {
560
+ const timer = metrics?.responseParseTime.startTimer({routeId, encoding: "ssz"});
523
561
  try {
524
562
  return type.deserialize(body, opts);
525
563
  } catch (e) {
526
564
  throw new EngineRestResponseError(routeId, `Invalid SSZ: ${(e as Error).message}`);
565
+ } finally {
566
+ timer?.();
527
567
  }
528
568
  }
529
569
 
530
- function parseJson(body: Uint8Array, routeId: string): unknown {
570
+ function parseJson(body: Uint8Array, routeId: string, metrics?: EngineTransportMetrics | null): unknown {
571
+ let timer: EndTimer | undefined;
531
572
  try {
532
- return JSON.parse(textDecoder.decode(body));
573
+ const text = textDecoder.decode(body);
574
+ timer = metrics?.responseParseTime.startTimer({routeId, encoding: "json"});
575
+ return JSON.parse(text);
533
576
  } catch (e) {
534
577
  throw new EngineRestResponseError(routeId, `Invalid JSON: ${(e as Error).message}`);
578
+ } finally {
579
+ timer?.();
535
580
  }
536
581
  }
537
582
 
@@ -1,5 +1,5 @@
1
1
  import {ForkName} from "@lodestar/params";
2
- import {BlobsBundle, ExecutionPayload, ExecutionRequests, Root, RootHex, Wei} from "@lodestar/types";
2
+ import {BlobsBundle, ExecutionPayload, ExecutionRequests, Root, RootHex, Wei, bellatrix} from "@lodestar/types";
3
3
  import {BlobAndProof} from "@lodestar/types/deneb";
4
4
  import {BlobAndProofV2} from "@lodestar/types/fulu";
5
5
  import {ClientVersion, ExecutionPayloadStatus, PayloadAttributes, PayloadId, VersionedHashes} from "./interface.js";
@@ -10,6 +10,8 @@ export type PayloadStatusResult = {
10
10
  status: ExecutionPayloadStatus;
11
11
  latestValidHash: RootHex | null;
12
12
  validationError: string | null;
13
+ /** PayloadStatusV2: whether a VALID payload satisfied the inclusion list constraints, null otherwise */
14
+ inclusionListSatisfied?: boolean | null;
13
15
  };
14
16
 
15
17
  export type ForkchoiceUpdatedResult = {
@@ -38,7 +40,8 @@ export interface IEngineTransport {
38
40
  executionPayload: ExecutionPayload,
39
41
  versionedHashes?: VersionedHashes,
40
42
  parentBeaconBlockRoot?: Root,
41
- executionRequests?: ExecutionRequests
43
+ executionRequests?: ExecutionRequests,
44
+ inclusionListTransactions?: bellatrix.Transactions
42
45
  ): Promise<PayloadStatusResult>;
43
46
 
44
47
  forkchoiceUpdated(
@@ -58,4 +61,6 @@ export interface IEngineTransport {
58
61
  getBlobsV2(versionedHashes: VersionedHashes, buffers?: Uint8Array[]): Promise<BlobAndProofV2[] | null>;
59
62
 
60
63
  getClientVersion(clientVersion: ClientVersion): Promise<ClientVersion[]>;
64
+
65
+ getInclusionList(): Promise<bellatrix.Transactions>;
61
66
  }
@@ -1,4 +1,4 @@
1
- import {Counter} from "@lodestar/utils";
1
+ import {Counter, Histogram} from "@lodestar/utils";
2
2
 
3
3
  /**
4
4
  * Common metrics type for both json rpc and ssz transport.
@@ -6,4 +6,5 @@ import {Counter} from "@lodestar/utils";
6
6
  export type EngineTransportMetrics = {
7
7
  requestBytes: Counter<{routeId: string}>;
8
8
  responseBytes: Counter<{routeId: string}>;
9
+ responseParseTime: Histogram<{routeId: string; encoding: "json" | "ssz"}>;
9
10
  };
@@ -1,3 +1,4 @@
1
+ import {Type} from "@chainsafe/ssz";
1
2
  import {
2
3
  BUILDER_DEPOSIT_REQUEST_TYPE,
3
4
  BUILDER_EXIT_REQUEST_TYPE,
@@ -53,6 +54,7 @@ export type EngineApiRpcParamTypes = {
53
54
  engine_newPayloadV3: [ExecutionPayloadRpc, VersionedHashesRpc, DATA];
54
55
  engine_newPayloadV4: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc];
55
56
  engine_newPayloadV5: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc];
57
+ engine_newPayloadV6: [ExecutionPayloadRpc, VersionedHashesRpc, DATA, ExecutionRequestsRpc, InclusionListRpc];
56
58
  /**
57
59
  * 1. Object - Payload validity status with respect to the consensus rules:
58
60
  * - blockHash: DATA, 32 Bytes - block hash value of the payload
@@ -74,6 +76,10 @@ export type EngineApiRpcParamTypes = {
74
76
  forkChoiceData: {headBlockHash: DATA; safeBlockHash: DATA; finalizedBlockHash: DATA},
75
77
  payloadAttributes?: PayloadAttributesRpc,
76
78
  ];
79
+ engine_forkchoiceUpdatedV5: [
80
+ forkChoiceData: {headBlockHash: DATA; safeBlockHash: DATA; finalizedBlockHash: DATA},
81
+ payloadAttributes?: PayloadAttributesRpc,
82
+ ];
77
83
  /**
78
84
  * 1. payloadId: QUANTITY, 64 Bits - Identifier of the payload building process
79
85
  */
@@ -96,12 +102,16 @@ export type EngineApiRpcParamTypes = {
96
102
 
97
103
  engine_getBlobsV1: [DATA[]];
98
104
  engine_getBlobsV2: [DATA[]];
105
+
106
+ engine_getInclusionListV1: [];
99
107
  };
100
108
 
101
109
  export type PayloadStatus = {
102
110
  status: ExecutionPayloadStatus;
103
111
  latestValidHash: DATA | null;
104
112
  validationError: string | null;
113
+ /** PayloadStatusV2: whether a VALID payload satisfied the inclusion list constraints, null otherwise */
114
+ inclusionListSatisfied?: boolean | null;
105
115
  };
106
116
 
107
117
  export type EngineApiRpcReturnTypes = {
@@ -114,6 +124,7 @@ export type EngineApiRpcReturnTypes = {
114
124
  engine_newPayloadV3: PayloadStatus;
115
125
  engine_newPayloadV4: PayloadStatus;
116
126
  engine_newPayloadV5: PayloadStatus;
127
+ engine_newPayloadV6: PayloadStatus;
117
128
  engine_forkchoiceUpdatedV1: {
118
129
  payloadStatus: PayloadStatus;
119
130
  payloadId: QUANTITY | null;
@@ -130,6 +141,10 @@ export type EngineApiRpcReturnTypes = {
130
141
  payloadStatus: PayloadStatus;
131
142
  payloadId: QUANTITY | null;
132
143
  };
144
+ engine_forkchoiceUpdatedV5: {
145
+ payloadStatus: PayloadStatus;
146
+ payloadId: QUANTITY | null;
147
+ };
133
148
  /**
134
149
  * payloadId | Error: QUANTITY, 64 Bits - Identifier of the payload building process
135
150
  */
@@ -146,6 +161,8 @@ export type EngineApiRpcReturnTypes = {
146
161
 
147
162
  engine_getBlobsV1: (BlobAndProofRpc | null)[];
148
163
  engine_getBlobsV2: BlobAndProofV2Rpc[] | null;
164
+
165
+ engine_getInclusionListV1: InclusionListRpc;
149
166
  };
150
167
 
151
168
  type ExecutionPayloadRpcWithValue = {
@@ -260,8 +277,13 @@ export type PayloadAttributesRpc = {
260
277
  slotNumber?: QUANTITY;
261
278
  /** QUANTITY, 64 Bits - target value for the gasLimit field of the new payload (GLOAS, execution-apis#796) */
262
279
  targetGasLimit?: QUANTITY;
280
+ /** Array of DATA - transactions that the built payload must include (PayloadAttributesV5, HEZE) */
281
+ inclusionListTransactions?: InclusionListRpc;
263
282
  };
264
283
 
284
+ /** Array of DATA - array of transaction objects */
285
+ export type InclusionListRpc = DATA[];
286
+
265
287
  export type ClientVersionRpc = {
266
288
  /** ClientCode */
267
289
  code: string;
@@ -441,6 +463,9 @@ export function serializePayloadAttributes(data: PayloadAttributes): PayloadAttr
441
463
  parentBeaconBlockRoot: data.parentBeaconBlockRoot ? bytesToData(data.parentBeaconBlockRoot) : undefined,
442
464
  slotNumber: data.slotNumber !== undefined ? numToQuantity(data.slotNumber) : undefined,
443
465
  targetGasLimit: data.targetGasLimit !== undefined ? numToQuantity(data.targetGasLimit) : undefined,
466
+ inclusionListTransactions: data.inclusionListTransactions
467
+ ? serializeInclusionList(data.inclusionListTransactions)
468
+ : undefined,
444
469
  };
445
470
  }
446
471
 
@@ -448,6 +473,14 @@ export function serializeBeaconBlockRoot(data: Root): DATA {
448
473
  return bytesToData(data);
449
474
  }
450
475
 
476
+ export function serializeInclusionList(data: bellatrix.Transactions): InclusionListRpc {
477
+ return data.map((transaction) => bytesToData(transaction));
478
+ }
479
+
480
+ export function deserializeInclusionList(data: InclusionListRpc): bellatrix.Transactions {
481
+ return data.map((transaction) => dataToBytes(transaction, null));
482
+ }
483
+
451
484
  export function deserializePayloadAttributes(data: PayloadAttributesRpc): PayloadAttributes {
452
485
  return {
453
486
  timestamp: quantityToNum(data.timestamp),
@@ -459,6 +492,9 @@ export function deserializePayloadAttributes(data: PayloadAttributesRpc): Payloa
459
492
  parentBeaconBlockRoot: data.parentBeaconBlockRoot ? dataToBytes(data.parentBeaconBlockRoot, 32) : undefined,
460
493
  slotNumber: data.slotNumber !== undefined ? quantityToNum(data.slotNumber) : undefined,
461
494
  targetGasLimit: data.targetGasLimit !== undefined ? quantityToBigint(data.targetGasLimit) : undefined,
495
+ inclusionListTransactions: data.inclusionListTransactions
496
+ ? deserializeInclusionList(data.inclusionListTransactions)
497
+ : undefined,
462
498
  };
463
499
  }
464
500
 
@@ -500,14 +536,15 @@ export function deserializeWithdrawal(serialized: WithdrawalRpc): capella.Withdr
500
536
  }
501
537
 
502
538
  /**
503
- * Prepend a single-byte requestType to requestsBytes
539
+ * Serialize requests prefixed with a single-byte requestType in one allocation
504
540
  */
505
- function prefixRequests(requestsBytes: Uint8Array, requestType: ExecutionRequestType): Uint8Array {
506
- const prefixedRequests = new Uint8Array(1 + requestsBytes.length);
507
- prefixedRequests[0] = requestType;
508
- prefixedRequests.set(requestsBytes, 1);
541
+ function serializePrefixedRequests<T>(type: Type<T>, requests: T, requestType: ExecutionRequestType): Uint8Array {
542
+ const uint8Array = new Uint8Array(1 + type.value_serializedSize(requests));
543
+ const dataView = new DataView(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength);
544
+ uint8Array[0] = requestType;
545
+ type.value_serializeToBytes({uint8Array, dataView}, 1, requests);
509
546
 
510
- return prefixedRequests;
547
+ return uint8Array;
511
548
  }
512
549
 
513
550
  /**
@@ -522,16 +559,16 @@ export function serializeExecutionRequestsToBytes(fork: ForkName, executionReque
522
559
  const result: Uint8Array[] = [];
523
560
 
524
561
  if (deposits.length !== 0) {
525
- result.push(prefixRequests(ssz.electra.DepositRequests.serialize(deposits), DEPOSIT_REQUEST_TYPE));
562
+ result.push(serializePrefixedRequests(ssz.electra.DepositRequests, deposits, DEPOSIT_REQUEST_TYPE));
526
563
  }
527
564
 
528
565
  if (withdrawals.length !== 0) {
529
- result.push(prefixRequests(ssz.electra.WithdrawalRequests.serialize(withdrawals), WITHDRAWAL_REQUEST_TYPE));
566
+ result.push(serializePrefixedRequests(ssz.electra.WithdrawalRequests, withdrawals, WITHDRAWAL_REQUEST_TYPE));
530
567
  }
531
568
 
532
569
  if (consolidations.length !== 0) {
533
570
  result.push(
534
- prefixRequests(ssz.electra.ConsolidationRequests.serialize(consolidations), CONSOLIDATION_REQUEST_TYPE)
571
+ serializePrefixedRequests(ssz.electra.ConsolidationRequests, consolidations, CONSOLIDATION_REQUEST_TYPE)
535
572
  );
536
573
  }
537
574
 
@@ -540,12 +577,12 @@ export function serializeExecutionRequestsToBytes(fork: ForkName, executionReque
540
577
 
541
578
  if (builderDeposits.length !== 0) {
542
579
  result.push(
543
- prefixRequests(ssz.gloas.BuilderDepositRequests.serialize(builderDeposits), BUILDER_DEPOSIT_REQUEST_TYPE)
580
+ serializePrefixedRequests(ssz.gloas.BuilderDepositRequests, builderDeposits, BUILDER_DEPOSIT_REQUEST_TYPE)
544
581
  );
545
582
  }
546
583
 
547
584
  if (builderExits.length !== 0) {
548
- result.push(prefixRequests(ssz.gloas.BuilderExitRequests.serialize(builderExits), BUILDER_EXIT_REQUEST_TYPE));
585
+ result.push(serializePrefixedRequests(ssz.gloas.BuilderExitRequests, builderExits, BUILDER_EXIT_REQUEST_TYPE));
549
586
  }
550
587
  }
551
588
 
@@ -1,5 +1,6 @@
1
1
  import {ProducedBlockSource} from "@lodestar/types";
2
2
  import {BlockSelectionResult} from "../../api/impl/validator/index.js";
3
+ import {InclusionListSource} from "../../chain/blocks/types.js";
3
4
  import {BlockProductionStep, PayloadPreparationType} from "../../chain/produceBlock/index.js";
4
5
  import {RegistryMetricCreator} from "../utils/registryMetricCreator.js";
5
6
 
@@ -432,5 +433,41 @@ export function createBeaconMetrics(register: RegistryMetricCreator) {
432
433
  name: "beacon_weak_head_detected_total",
433
434
  help: "Detected current head block is weak. May reorg it out when proposing next slot. See proposer boost reorg for more",
434
435
  }),
436
+
437
+ // HEZE:EIP-7805
438
+ inclusionListsReceived: register.counter<{source: InclusionListSource}>({
439
+ name: "beacon_inclusion_lists_received_total",
440
+ help: "Total number of received inclusion lists",
441
+ labelNames: ["source"],
442
+ }),
443
+ inclusionListsValid: register.counter<{source: InclusionListSource}>({
444
+ name: "beacon_inclusion_lists_valid_total",
445
+ help: "Total number of valid inclusion lists",
446
+ labelNames: ["source"],
447
+ }),
448
+ inclusionListsValidSize: register.counter({
449
+ name: "beacon_inclusion_lists_valid_size_bytes_total",
450
+ help: "Total size of valid inclusion lists in bytes",
451
+ }),
452
+ inclusionListTransactionsReceived: register.counter<{source: InclusionListSource}>({
453
+ name: "beacon_inclusion_list_transactions_received_total",
454
+ help: "Total number of transactions in received inclusion lists",
455
+ labelNames: ["source"],
456
+ }),
457
+ inclusionListsPublished: register.counter({
458
+ name: "beacon_inclusion_lists_published_total",
459
+ help: "Total number of published inclusion lists",
460
+ }),
461
+ inclusionListsValidationTime: register.histogram<{source: InclusionListSource}>({
462
+ name: "beacon_inclusion_lists_validation_time_seconds",
463
+ help: "Time taken to validate inclusion lists",
464
+ buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5],
465
+ labelNames: ["source"],
466
+ }),
467
+ inclusionListArrivalTime: register.histogram({
468
+ name: "beacon_inclusion_lists_arrival_time_seconds",
469
+ help: "Inclusion list arrival time since the beginning of slot",
470
+ buckets: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
471
+ }),
435
472
  };
436
473
  }