@lodestar/beacon-node 1.51.0-dev.c6e566f915 → 1.51.0-dev.cda05d18f1

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 (598) hide show
  1. package/lib/api/impl/api.js +1 -1
  2. package/lib/api/impl/api.js.map +1 -1
  3. package/lib/api/impl/beacon/blocks/index.d.ts +2 -1
  4. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/blocks/index.js +48 -95
  6. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  7. package/lib/api/impl/beacon/index.d.ts +2 -1
  8. package/lib/api/impl/beacon/index.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/index.js +2 -2
  10. package/lib/api/impl/beacon/index.js.map +1 -1
  11. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  12. package/lib/api/impl/beacon/pool/index.js +22 -2
  13. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  14. package/lib/api/impl/beacon/state/utils.d.ts +1 -1
  15. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  16. package/lib/api/impl/validator/index.d.ts +6 -0
  17. package/lib/api/impl/validator/index.d.ts.map +1 -1
  18. package/lib/api/impl/validator/index.js +49 -31
  19. package/lib/api/impl/validator/index.js.map +1 -1
  20. package/lib/api/options.d.ts +2 -0
  21. package/lib/api/options.d.ts.map +1 -1
  22. package/lib/api/options.js +1 -0
  23. package/lib/api/options.js.map +1 -1
  24. package/lib/chain/GetBlobsTracker.d.ts +13 -2
  25. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  26. package/lib/chain/GetBlobsTracker.js +69 -35
  27. package/lib/chain/GetBlobsTracker.js.map +1 -1
  28. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  29. package/lib/chain/archiveStore/archiveStore.js +1 -0
  30. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  31. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +4 -0
  32. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  33. package/lib/chain/archiveStore/utils/archiveBlocks.js +61 -97
  34. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  35. package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
  36. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  37. package/lib/chain/blocks/blockInput/blockInput.js +5 -241
  38. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  39. package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
  40. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
  41. package/lib/chain/blocks/blockInput/errors.js.map +1 -1
  42. package/lib/chain/blocks/blockInput/types.d.ts +2 -18
  43. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  44. package/lib/chain/blocks/blockInput/types.js +0 -1
  45. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  46. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  47. package/lib/chain/blocks/importBlock.js +40 -56
  48. package/lib/chain/blocks/importBlock.js.map +1 -1
  49. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
  50. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  51. package/lib/chain/blocks/importExecutionPayload.js +34 -19
  52. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  53. package/lib/chain/blocks/index.d.ts.map +1 -1
  54. package/lib/chain/blocks/index.js +4 -4
  55. package/lib/chain/blocks/index.js.map +1 -1
  56. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
  57. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  58. package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
  59. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  60. package/lib/chain/blocks/types.d.ts +4 -20
  61. package/lib/chain/blocks/types.d.ts.map +1 -1
  62. package/lib/chain/blocks/types.js +0 -24
  63. package/lib/chain/blocks/types.js.map +1 -1
  64. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  65. package/lib/chain/blocks/verifyBlock.js +18 -7
  66. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  67. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  68. package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
  69. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  70. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
  71. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  72. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
  73. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  74. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  75. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
  76. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  77. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  78. package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
  79. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  80. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
  81. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  82. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
  83. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  84. package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
  85. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  86. package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
  87. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  88. package/lib/chain/bls/interface.d.ts +2 -0
  89. package/lib/chain/bls/interface.d.ts.map +1 -1
  90. package/lib/chain/bls/multithread/index.d.ts +1 -1
  91. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  92. package/lib/chain/bls/multithread/index.js +50 -22
  93. package/lib/chain/bls/multithread/index.js.map +1 -1
  94. package/lib/chain/bls/multithread/types.d.ts +1 -1
  95. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  96. package/lib/chain/bls/multithread/worker.js +1 -1
  97. package/lib/chain/bls/multithread/worker.js.map +1 -1
  98. package/lib/chain/bls/singleThread.js +1 -1
  99. package/lib/chain/bls/singleThread.js.map +1 -1
  100. package/lib/chain/bls/utils.js +1 -1
  101. package/lib/chain/bls/utils.js.map +1 -1
  102. package/lib/chain/chain.d.ts +25 -4
  103. package/lib/chain/chain.d.ts.map +1 -1
  104. package/lib/chain/chain.js +124 -43
  105. package/lib/chain/chain.js.map +1 -1
  106. package/lib/chain/emitter.d.ts +7 -7
  107. package/lib/chain/emitter.d.ts.map +1 -1
  108. package/lib/chain/emitter.js +5 -5
  109. package/lib/chain/emitter.js.map +1 -1
  110. package/lib/chain/errors/blockError.d.ts +1 -1
  111. package/lib/chain/errors/blockError.d.ts.map +1 -1
  112. package/lib/chain/errors/blockError.js +1 -1
  113. package/lib/chain/errors/blockError.js.map +1 -1
  114. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  115. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  116. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  117. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  118. package/lib/chain/errors/index.d.ts +0 -1
  119. package/lib/chain/errors/index.d.ts.map +1 -1
  120. package/lib/chain/errors/index.js +0 -1
  121. package/lib/chain/errors/index.js.map +1 -1
  122. package/lib/chain/forkChoice/index.d.ts +11 -1
  123. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  124. package/lib/chain/forkChoice/index.js +11 -0
  125. package/lib/chain/forkChoice/index.js.map +1 -1
  126. package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
  127. package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
  128. package/lib/chain/forkChoiceExecutionEngine.js +117 -0
  129. package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
  130. package/lib/chain/interface.d.ts +9 -7
  131. package/lib/chain/interface.d.ts.map +1 -1
  132. package/lib/chain/interface.js.map +1 -1
  133. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
  134. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  135. package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
  136. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  137. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  138. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  139. package/lib/chain/opPools/attestationPool.js +15 -4
  140. package/lib/chain/opPools/attestationPool.js.map +1 -1
  141. package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -1
  142. package/lib/chain/opPools/inclusionListStore.js +2 -2
  143. package/lib/chain/opPools/inclusionListStore.js.map +1 -1
  144. package/lib/chain/opPools/index.d.ts +1 -0
  145. package/lib/chain/opPools/index.d.ts.map +1 -1
  146. package/lib/chain/opPools/index.js +1 -0
  147. package/lib/chain/opPools/index.js.map +1 -1
  148. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  149. package/lib/chain/opPools/payloadAttestationPool.js +17 -7
  150. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  151. package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
  152. package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
  153. package/lib/chain/opPools/singleAttestationPool.js +209 -0
  154. package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
  155. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  156. package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
  157. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  158. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  159. package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
  160. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  161. package/lib/chain/opPools/utils.d.ts +1 -1
  162. package/lib/chain/opPools/utils.d.ts.map +1 -1
  163. package/lib/chain/opPools/utils.js +1 -1
  164. package/lib/chain/opPools/utils.js.map +1 -1
  165. package/lib/chain/options.d.ts +5 -3
  166. package/lib/chain/options.d.ts.map +1 -1
  167. package/lib/chain/options.js +0 -1
  168. package/lib/chain/options.js.map +1 -1
  169. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  170. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  171. package/lib/chain/produceBlock/produceBlockBody.js +3 -3
  172. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  173. package/lib/chain/proposerTracker.d.ts +31 -0
  174. package/lib/chain/proposerTracker.d.ts.map +1 -0
  175. package/lib/chain/proposerTracker.js +75 -0
  176. package/lib/chain/proposerTracker.js.map +1 -0
  177. package/lib/chain/regen/interface.d.ts +1 -2
  178. package/lib/chain/regen/interface.d.ts.map +1 -1
  179. package/lib/chain/regen/interface.js +0 -1
  180. package/lib/chain/regen/interface.js.map +1 -1
  181. package/lib/chain/regen/queued.d.ts +1 -1
  182. package/lib/chain/regen/queued.d.ts.map +1 -1
  183. package/lib/chain/regen/queued.js +5 -3
  184. package/lib/chain/regen/queued.js.map +1 -1
  185. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
  186. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  187. package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
  188. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  189. package/lib/chain/validation/executionPayloadBid.d.ts +0 -15
  190. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  191. package/lib/chain/validation/executionPayloadBid.js +13 -166
  192. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  193. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  194. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  195. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  196. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  197. package/lib/chain/validation/inclusionList.d.ts.map +1 -1
  198. package/lib/chain/validation/inclusionList.js +11 -2
  199. package/lib/chain/validation/inclusionList.js.map +1 -1
  200. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  201. package/lib/chain/validation/syncCommittee.js +16 -10
  202. package/lib/chain/validation/syncCommittee.js.map +1 -1
  203. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  204. package/lib/chain/validation/syncCommitteeContributionAndProof.js +11 -0
  205. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  206. package/lib/chain/validatorMonitor.d.ts +1 -2
  207. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  208. package/lib/chain/validatorMonitor.js +0 -3
  209. package/lib/chain/validatorMonitor.js.map +1 -1
  210. package/lib/db/beacon.d.ts +7 -0
  211. package/lib/db/beacon.d.ts.map +1 -1
  212. package/lib/db/beacon.js +34 -0
  213. package/lib/db/beacon.js.map +1 -1
  214. package/lib/db/dataColumnStore.d.ts +1 -1
  215. package/lib/db/dataColumnStore.d.ts.map +1 -1
  216. package/lib/db/dataColumnStore.js +1 -4
  217. package/lib/db/dataColumnStore.js.map +1 -1
  218. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  219. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  220. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  221. package/lib/db/flatFileStore/slotIndex.js +2 -2
  222. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  223. package/lib/db/interface.d.ts +1 -0
  224. package/lib/db/interface.d.ts.map +1 -1
  225. package/lib/db/repositories/blobSidecars.d.ts +0 -1
  226. package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
  227. package/lib/db/repositories/blobSidecars.js +0 -1
  228. package/lib/db/repositories/blobSidecars.js.map +1 -1
  229. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
  230. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  231. package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
  232. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  233. package/lib/execution/builder/apiClient.d.ts +14 -8
  234. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  235. package/lib/execution/builder/apiClient.js +12 -10
  236. package/lib/execution/builder/apiClient.js.map +1 -1
  237. package/lib/execution/builder/http.d.ts +2 -0
  238. package/lib/execution/builder/http.d.ts.map +1 -1
  239. package/lib/execution/builder/http.js +2 -0
  240. package/lib/execution/builder/http.js.map +1 -1
  241. package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
  242. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
  243. package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
  244. package/lib/execution/engine/http.d.ts +4 -6
  245. package/lib/execution/engine/http.d.ts.map +1 -1
  246. package/lib/execution/engine/http.js +8 -11
  247. package/lib/execution/engine/http.js.map +1 -1
  248. package/lib/execution/engine/index.d.ts +1 -1
  249. package/lib/execution/engine/index.d.ts.map +1 -1
  250. package/lib/execution/engine/index.js +1 -1
  251. package/lib/execution/engine/index.js.map +1 -1
  252. package/lib/execution/engine/interface.d.ts +18 -6
  253. package/lib/execution/engine/interface.d.ts.map +1 -1
  254. package/lib/execution/engine/interface.js.map +1 -1
  255. package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
  256. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  257. package/lib/execution/engine/jsonRpcTransport.js +2 -12
  258. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  259. package/lib/execution/engine/mock.d.ts +0 -1
  260. package/lib/execution/engine/mock.d.ts.map +1 -1
  261. package/lib/execution/engine/mock.js +6 -8
  262. package/lib/execution/engine/mock.js.map +1 -1
  263. package/lib/execution/engine/payloadIdCache.d.ts +1 -2
  264. package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
  265. package/lib/execution/engine/payloadIdCache.js +3 -3
  266. package/lib/execution/engine/payloadIdCache.js.map +1 -1
  267. package/lib/execution/engine/restTransport.d.ts +2 -4
  268. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  269. package/lib/execution/engine/restTransport.js +1 -15
  270. package/lib/execution/engine/restTransport.js.map +1 -1
  271. package/lib/execution/engine/sszTypes.d.ts +38 -47
  272. package/lib/execution/engine/sszTypes.d.ts.map +1 -1
  273. package/lib/execution/engine/sszTypes.js +0 -5
  274. package/lib/execution/engine/sszTypes.js.map +1 -1
  275. package/lib/execution/engine/transport.d.ts +1 -14
  276. package/lib/execution/engine/transport.d.ts.map +1 -1
  277. package/lib/execution/engine/types.d.ts +1 -9
  278. package/lib/execution/engine/types.d.ts.map +1 -1
  279. package/lib/execution/engine/types.js +9 -16
  280. package/lib/execution/engine/types.js.map +1 -1
  281. package/lib/execution/engine/utils.d.ts.map +1 -1
  282. package/lib/execution/engine/utils.js +3 -2
  283. package/lib/execution/engine/utils.js.map +1 -1
  284. package/lib/index.d.ts +1 -0
  285. package/lib/index.d.ts.map +1 -1
  286. package/lib/index.js +2 -0
  287. package/lib/index.js.map +1 -1
  288. package/lib/metrics/metrics/beacon.d.ts +0 -9
  289. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  290. package/lib/metrics/metrics/beacon.js +0 -30
  291. package/lib/metrics/metrics/beacon.js.map +1 -1
  292. package/lib/metrics/metrics/lodestar.d.ts +33 -8
  293. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  294. package/lib/metrics/metrics/lodestar.js +84 -18
  295. package/lib/metrics/metrics/lodestar.js.map +1 -1
  296. package/lib/metrics/server/http.js +5 -5
  297. package/lib/metrics/server/http.js.map +1 -1
  298. package/lib/monitoring/service.js +1 -1
  299. package/lib/monitoring/service.js.map +1 -1
  300. package/lib/network/core/networkCore.d.ts +4 -1
  301. package/lib/network/core/networkCore.d.ts.map +1 -1
  302. package/lib/network/core/networkCore.js +7 -0
  303. package/lib/network/core/networkCore.js.map +1 -1
  304. package/lib/network/core/networkCoreWorker.js +2 -0
  305. package/lib/network/core/networkCoreWorker.js.map +1 -1
  306. package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
  307. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  308. package/lib/network/core/networkCoreWorkerHandler.js +6 -0
  309. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  310. package/lib/network/core/types.d.ts +6 -1
  311. package/lib/network/core/types.d.ts.map +1 -1
  312. package/lib/network/gossip/gossipsub.d.ts +1 -0
  313. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  314. package/lib/network/gossip/gossipsub.js +10 -0
  315. package/lib/network/gossip/gossipsub.js.map +1 -1
  316. package/lib/network/gossip/interface.d.ts +1 -8
  317. package/lib/network/gossip/interface.d.ts.map +1 -1
  318. package/lib/network/gossip/interface.js +0 -1
  319. package/lib/network/gossip/interface.js.map +1 -1
  320. package/lib/network/gossip/topic.d.ts +6 -22
  321. package/lib/network/gossip/topic.d.ts.map +1 -1
  322. package/lib/network/gossip/topic.js +0 -23
  323. package/lib/network/gossip/topic.js.map +1 -1
  324. package/lib/network/interface.d.ts +4 -5
  325. package/lib/network/interface.d.ts.map +1 -1
  326. package/lib/network/libp2p/index.d.ts.map +1 -1
  327. package/lib/network/libp2p/index.js +5 -1
  328. package/lib/network/libp2p/index.js.map +1 -1
  329. package/lib/network/network.d.ts +8 -7
  330. package/lib/network/network.d.ts.map +1 -1
  331. package/lib/network/network.js +53 -35
  332. package/lib/network/network.js.map +1 -1
  333. package/lib/network/options.d.ts +2 -0
  334. package/lib/network/options.d.ts.map +1 -1
  335. package/lib/network/options.js +2 -0
  336. package/lib/network/options.js.map +1 -1
  337. package/lib/network/peers/peerManager.d.ts +2 -1
  338. package/lib/network/peers/peerManager.d.ts.map +1 -1
  339. package/lib/network/peers/peerManager.js +28 -1
  340. package/lib/network/peers/peerManager.js.map +1 -1
  341. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  342. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  343. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  344. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  345. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  346. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  347. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  348. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  349. package/lib/network/peers/utils/subnetMap.d.ts +5 -2
  350. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
  351. package/lib/network/peers/utils/subnetMap.js +6 -3
  352. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  353. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  354. package/lib/network/processor/extractSlotRootFns.js +1 -8
  355. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  356. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  357. package/lib/network/processor/gossipHandlers.js +79 -149
  358. package/lib/network/processor/gossipHandlers.js.map +1 -1
  359. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  360. package/lib/network/processor/gossipQueues/index.js +0 -6
  361. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  362. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  363. package/lib/network/processor/gossipValidatorFn.js +1 -5
  364. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  365. package/lib/network/processor/index.d.ts +6 -0
  366. package/lib/network/processor/index.d.ts.map +1 -1
  367. package/lib/network/processor/index.js +55 -29
  368. package/lib/network/processor/index.js.map +1 -1
  369. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  370. package/lib/network/reqresp/ReqRespBeaconNode.js +0 -3
  371. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  372. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
  373. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  374. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  375. package/lib/network/reqresp/handlers/index.js +1 -12
  376. package/lib/network/reqresp/handlers/index.js.map +1 -1
  377. package/lib/network/reqresp/protocols.d.ts +0 -2
  378. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  379. package/lib/network/reqresp/protocols.js +0 -10
  380. package/lib/network/reqresp/protocols.js.map +1 -1
  381. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  382. package/lib/network/reqresp/rateLimit.js +1 -17
  383. package/lib/network/reqresp/rateLimit.js.map +1 -1
  384. package/lib/network/reqresp/types.d.ts +2 -8
  385. package/lib/network/reqresp/types.d.ts.map +1 -1
  386. package/lib/network/reqresp/types.js +1 -7
  387. package/lib/network/reqresp/types.js.map +1 -1
  388. package/lib/network/subnets/attnetsService.d.ts +35 -5
  389. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  390. package/lib/network/subnets/attnetsService.js +84 -6
  391. package/lib/network/subnets/attnetsService.js.map +1 -1
  392. package/lib/network/subnets/interface.d.ts +7 -0
  393. package/lib/network/subnets/interface.d.ts.map +1 -1
  394. package/lib/network/subnets/interface.js.map +1 -1
  395. package/lib/node/nodejs.d.ts +3 -1
  396. package/lib/node/nodejs.d.ts.map +1 -1
  397. package/lib/node/nodejs.js +47 -21
  398. package/lib/node/nodejs.js.map +1 -1
  399. package/lib/node/options.d.ts +3 -1
  400. package/lib/node/options.d.ts.map +1 -1
  401. package/lib/node/options.js +4 -2
  402. package/lib/node/options.js.map +1 -1
  403. package/lib/sync/interface.d.ts.map +1 -1
  404. package/lib/sync/interface.js.map +1 -1
  405. package/lib/sync/range/batch.d.ts +2 -3
  406. package/lib/sync/range/batch.d.ts.map +1 -1
  407. package/lib/sync/range/batch.js +9 -22
  408. package/lib/sync/range/batch.js.map +1 -1
  409. package/lib/sync/range/chain.d.ts.map +1 -1
  410. package/lib/sync/range/chain.js +2 -15
  411. package/lib/sync/range/chain.js.map +1 -1
  412. package/lib/sync/sync.d.ts +15 -0
  413. package/lib/sync/sync.d.ts.map +1 -1
  414. package/lib/sync/sync.js +103 -25
  415. package/lib/sync/sync.js.map +1 -1
  416. package/lib/sync/unknownBlock.d.ts.map +1 -1
  417. package/lib/sync/unknownBlock.js +43 -25
  418. package/lib/sync/unknownBlock.js.map +1 -1
  419. package/lib/sync/utils/downloadByRange.d.ts +6 -34
  420. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  421. package/lib/sync/utils/downloadByRange.js +24 -128
  422. package/lib/sync/utils/downloadByRange.js.map +1 -1
  423. package/lib/sync/utils/downloadByRoot.d.ts +2 -18
  424. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  425. package/lib/sync/utils/downloadByRoot.js +14 -99
  426. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  427. package/lib/util/blobs.d.ts +1 -7
  428. package/lib/util/blobs.d.ts.map +1 -1
  429. package/lib/util/blobs.js +0 -19
  430. package/lib/util/blobs.js.map +1 -1
  431. package/lib/util/execution.d.ts +3 -4
  432. package/lib/util/execution.d.ts.map +1 -1
  433. package/lib/util/execution.js +1 -73
  434. package/lib/util/execution.js.map +1 -1
  435. package/lib/util/file.d.ts.map +1 -1
  436. package/lib/util/file.js +8 -9
  437. package/lib/util/file.js.map +1 -1
  438. package/lib/util/queue/itemQueue.js +1 -1
  439. package/lib/util/queue/itemQueue.js.map +1 -1
  440. package/lib/util/sszBytes.d.ts +5 -1
  441. package/lib/util/sszBytes.d.ts.map +1 -1
  442. package/lib/util/sszBytes.js +36 -19
  443. package/lib/util/sszBytes.js.map +1 -1
  444. package/lib/util/types.d.ts +0 -5
  445. package/lib/util/types.d.ts.map +1 -1
  446. package/lib/util/types.js +1 -2
  447. package/lib/util/types.js.map +1 -1
  448. package/package.json +31 -32
  449. package/src/api/impl/api.ts +1 -1
  450. package/src/api/impl/beacon/blocks/index.ts +81 -126
  451. package/src/api/impl/beacon/index.ts +3 -1
  452. package/src/api/impl/beacon/pool/index.ts +31 -1
  453. package/src/api/impl/beacon/state/utils.ts +1 -1
  454. package/src/api/impl/validator/index.ts +54 -37
  455. package/src/api/options.ts +3 -0
  456. package/src/chain/GetBlobsTracker.ts +82 -52
  457. package/src/chain/archiveStore/archiveStore.ts +1 -0
  458. package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
  459. package/src/chain/blocks/blockInput/blockInput.ts +11 -343
  460. package/src/chain/blocks/blockInput/errors.ts +1 -2
  461. package/src/chain/blocks/blockInput/types.ts +2 -20
  462. package/src/chain/blocks/importBlock.ts +61 -76
  463. package/src/chain/blocks/importExecutionPayload.ts +57 -35
  464. package/src/chain/blocks/index.ts +11 -4
  465. package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
  466. package/src/chain/blocks/types.ts +5 -31
  467. package/src/chain/blocks/verifyBlock.ts +31 -16
  468. package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
  469. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
  470. package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
  471. package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
  472. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
  473. package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
  474. package/src/chain/bls/interface.ts +2 -0
  475. package/src/chain/bls/multithread/index.ts +48 -24
  476. package/src/chain/bls/multithread/types.ts +1 -1
  477. package/src/chain/bls/multithread/worker.ts +1 -5
  478. package/src/chain/bls/singleThread.ts +1 -1
  479. package/src/chain/bls/utils.ts +1 -1
  480. package/src/chain/chain.ts +140 -42
  481. package/src/chain/emitter.ts +8 -8
  482. package/src/chain/errors/blockError.ts +1 -1
  483. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  484. package/src/chain/errors/index.ts +0 -1
  485. package/src/chain/forkChoice/index.ts +11 -0
  486. package/src/chain/forkChoiceExecutionEngine.ts +183 -0
  487. package/src/chain/interface.ts +9 -6
  488. package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
  489. package/src/chain/opPools/attestationPool.ts +16 -4
  490. package/src/chain/opPools/inclusionListStore.ts +3 -3
  491. package/src/chain/opPools/index.ts +1 -0
  492. package/src/chain/opPools/payloadAttestationPool.ts +18 -7
  493. package/src/chain/opPools/singleAttestationPool.ts +287 -0
  494. package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
  495. package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
  496. package/src/chain/opPools/utils.ts +1 -1
  497. package/src/chain/options.ts +5 -4
  498. package/src/chain/produceBlock/produceBlockBody.ts +7 -4
  499. package/src/chain/proposerTracker.ts +94 -0
  500. package/src/chain/regen/interface.ts +1 -2
  501. package/src/chain/regen/queued.ts +6 -4
  502. package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
  503. package/src/chain/validation/executionPayloadBid.ts +14 -193
  504. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  505. package/src/chain/validation/inclusionList.ts +11 -2
  506. package/src/chain/validation/syncCommittee.ts +31 -15
  507. package/src/chain/validation/syncCommitteeContributionAndProof.ts +13 -0
  508. package/src/chain/validatorMonitor.ts +0 -6
  509. package/src/db/beacon.ts +44 -0
  510. package/src/db/dataColumnStore.ts +2 -4
  511. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  512. package/src/db/flatFileStore/slotIndex.ts +4 -3
  513. package/src/db/interface.ts +2 -0
  514. package/src/db/repositories/blobSidecars.ts +0 -1
  515. package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
  516. package/src/execution/builder/apiClient.ts +16 -13
  517. package/src/execution/builder/http.ts +4 -0
  518. package/src/execution/engine/blobVersionedHashes.ts +1 -1
  519. package/src/execution/engine/http.ts +19 -43
  520. package/src/execution/engine/index.ts +1 -1
  521. package/src/execution/engine/interface.ts +19 -10
  522. package/src/execution/engine/jsonRpcTransport.ts +10 -22
  523. package/src/execution/engine/mock.ts +6 -11
  524. package/src/execution/engine/payloadIdCache.ts +6 -7
  525. package/src/execution/engine/restTransport.ts +3 -22
  526. package/src/execution/engine/sszTypes.ts +0 -9
  527. package/src/execution/engine/transport.ts +8 -17
  528. package/src/execution/engine/types.ts +11 -26
  529. package/src/execution/engine/utils.ts +4 -2
  530. package/src/index.ts +2 -0
  531. package/src/metrics/metrics/beacon.ts +0 -30
  532. package/src/metrics/metrics/lodestar.ts +85 -18
  533. package/src/metrics/server/http.ts +5 -5
  534. package/src/monitoring/service.ts +1 -1
  535. package/src/network/core/networkCore.ts +11 -1
  536. package/src/network/core/networkCoreWorker.ts +2 -0
  537. package/src/network/core/networkCoreWorkerHandler.ts +8 -1
  538. package/src/network/core/types.ts +6 -1
  539. package/src/network/gossip/gossipsub.ts +11 -0
  540. package/src/network/gossip/interface.ts +0 -5
  541. package/src/network/gossip/topic.ts +0 -25
  542. package/src/network/interface.ts +2 -5
  543. package/src/network/libp2p/index.ts +5 -1
  544. package/src/network/network.ts +55 -58
  545. package/src/network/options.ts +4 -0
  546. package/src/network/peers/peerManager.ts +28 -3
  547. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  548. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  549. package/src/network/peers/utils/subnetMap.ts +6 -3
  550. package/src/network/processor/extractSlotRootFns.ts +0 -9
  551. package/src/network/processor/gossipHandlers.ts +99 -183
  552. package/src/network/processor/gossipQueues/index.ts +0 -6
  553. package/src/network/processor/gossipValidatorFn.ts +0 -5
  554. package/src/network/processor/index.ts +47 -27
  555. package/src/network/processor/types.ts +1 -1
  556. package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
  557. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
  558. package/src/network/reqresp/handlers/index.ts +0 -17
  559. package/src/network/reqresp/protocols.ts +0 -12
  560. package/src/network/reqresp/rateLimit.ts +1 -17
  561. package/src/network/reqresp/types.ts +0 -13
  562. package/src/network/subnets/attnetsService.ts +94 -6
  563. package/src/network/subnets/interface.ts +7 -0
  564. package/src/node/nodejs.ts +58 -22
  565. package/src/node/options.ts +9 -6
  566. package/src/sync/interface.ts +1 -0
  567. package/src/sync/range/batch.ts +9 -21
  568. package/src/sync/range/chain.ts +2 -14
  569. package/src/sync/sync.ts +108 -26
  570. package/src/sync/unknownBlock.ts +48 -36
  571. package/src/sync/utils/downloadByRange.ts +31 -230
  572. package/src/sync/utils/downloadByRoot.ts +15 -142
  573. package/src/util/blobs.ts +0 -34
  574. package/src/util/execution.ts +8 -102
  575. package/src/util/file.ts +8 -9
  576. package/src/util/queue/itemQueue.ts +1 -1
  577. package/src/util/sszBytes.ts +42 -24
  578. package/src/util/types.ts +1 -8
  579. package/lib/chain/errors/blobSidecarError.d.ts +0 -108
  580. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  581. package/lib/chain/errors/blobSidecarError.js +0 -38
  582. package/lib/chain/errors/blobSidecarError.js.map +0 -1
  583. package/lib/chain/validation/blobSidecar.d.ts +0 -16
  584. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  585. package/lib/chain/validation/blobSidecar.js +0 -276
  586. package/lib/chain/validation/blobSidecar.js.map +0 -1
  587. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
  588. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  589. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
  590. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
  591. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
  592. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  593. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
  594. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
  595. package/src/chain/errors/blobSidecarError.ts +0 -70
  596. package/src/chain/validation/blobSidecar.ts +0 -357
  597. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
  598. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
@@ -1,10 +1,10 @@
1
1
  import path from "node:path";
2
2
  import {PrivateKey} from "@libp2p/interface";
3
- import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
4
3
  import {Type} from "@chainsafe/ssz";
5
4
  import {routes} from "@lodestar/api";
6
5
  import {BeaconConfig} from "@lodestar/config";
7
6
  import {
7
+ AncestorStatus,
8
8
  CheckpointWithHex,
9
9
  EpochDifference,
10
10
  ForkChoiceStateGetter,
@@ -14,12 +14,14 @@ import {
14
14
  UpdateHeadOpt,
15
15
  } from "@lodestar/fork-choice";
16
16
  import {LoggerNode} from "@lodestar/logger/node";
17
+ import {type PubkeyCache} from "@lodestar/native/pubkeys";
17
18
  import {
18
19
  EFFECTIVE_BALANCE_INCREMENT,
19
20
  type ForkPostFulu,
20
21
  type ForkPostGloas,
21
22
  GENESIS_SLOT,
22
23
  SLOTS_PER_EPOCH,
24
+ isForkPostFulu,
23
25
  isForkPostGloas,
24
26
  } from "@lodestar/params";
25
27
  import {
@@ -33,6 +35,7 @@ import {
33
35
  isStatePostAltair,
34
36
  isStatePostElectra,
35
37
  isStatePostGloas,
38
+ proposerShufflingDecisionRoot,
36
39
  } from "@lodestar/state-transition";
37
40
  import {
38
41
  BeaconBlock,
@@ -60,7 +63,6 @@ import {Logger, fromHex, gweiToWei, isErrorAborted, pruneSetToMax, sleep, toRoot
60
63
  import {ProcessShutdownCallback} from "@lodestar/validator";
61
64
  import {GENESIS_EPOCH, HALF_SLOT_BPS, ZERO_HASH} from "../constants/index.js";
62
65
  import {IBeaconDb} from "../db/index.js";
63
- import {BLOB_SIDECARS_IN_WRAPPER_INDEX} from "../db/repositories/blobSidecars.js";
64
66
  import {decodeArchivedEnvelope} from "../db/repositories/index.js";
65
67
  import {BuilderApiClient, BuilderApiClientOpts} from "../execution/builder/apiClient.js";
66
68
  import {BuilderStatus} from "../execution/builder/http.js";
@@ -80,7 +82,7 @@ import {getSlotFromSignedBeaconBlockSerialized} from "../util/sszBytes.js";
80
82
  import {ArchiveStore} from "./archiveStore/archiveStore.js";
81
83
  import {CheckpointBalancesCache} from "./balancesCache.js";
82
84
  import {BeaconProposerCache} from "./beaconProposerCache.js";
83
- import {IBlockInput, isBlockInputBlobs, isBlockInputColumns} from "./blocks/blockInput/index.js";
85
+ import {IBlockInput, isBlockInputColumns} from "./blocks/blockInput/index.js";
84
86
  import {BlockProcessor, ImportBlockOpts} from "./blocks/index.js";
85
87
  import {PayloadEnvelopeInputSource} from "./blocks/payloadEnvelopeInput/index.js";
86
88
  import {PayloadEnvelopeProcessor} from "./blocks/payloadEnvelopeProcessor.js";
@@ -90,8 +92,9 @@ import {persistPayloadEnvelopeInput} from "./blocks/writePayloadEnvelopeInputToD
90
92
  import {BlsMultiThreadWorkerPool, BlsSingleThreadVerifier, IBlsVerifier} from "./bls/index.js";
91
93
  import {BuilderCircuitBreaker} from "./builderCircuitBreaker.js";
92
94
  import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
93
- import {ChainEvent, ChainEventEmitter} from "./emitter.js";
95
+ import {ChainEvent, ChainEventEmitter, ReorgEventData} from "./emitter.js";
94
96
  import {ForkchoiceCaller, initializeForkChoice} from "./forkChoice/index.js";
97
+ import {ForkChoiceExecutionEngine} from "./forkChoiceExecutionEngine.js";
95
98
  import {GetBlobsTracker} from "./GetBlobsTracker.js";
96
99
  import {CommonBlockBody, FindHeadFnName, IBeaconChain, ProposerPreparationData, StateGetOpts} from "./interface.js";
97
100
  import {LightClientServer} from "./lightClient/index.js";
@@ -104,6 +107,7 @@ import {
104
107
  OpPool,
105
108
  PayloadAttestationPool,
106
109
  ProposerPreferencesPool,
110
+ SingleAttestationPool,
107
111
  SyncCommitteeMessagePool,
108
112
  SyncContributionAndProofPool,
109
113
  } from "./opPools/index.js";
@@ -112,6 +116,7 @@ import {PrepareNextSlotScheduler} from "./prepareNextSlot.js";
112
116
  import {computeNewStateRoot} from "./produceBlock/computeNewStateRoot.js";
113
117
  import {AssembledBlockType, BlockType, ProduceResult} from "./produceBlock/index.js";
114
118
  import {BlockAttributes, produceBlockBody, produceCommonBlockBody} from "./produceBlock/produceBlockBody.js";
119
+ import {ProposerTracker} from "./proposerTracker.js";
115
120
  import {QueuedStateRegenerator, RegenCaller} from "./regen/index.js";
116
121
  import {ReprocessController} from "./reprocess.js";
117
122
  import {
@@ -166,7 +171,7 @@ const DEFAULT_MAX_PENDING_UNFINALIZED_PAYLOAD_ENVELOPE_WRITES = 16;
166
171
  export class BeaconChain implements IBeaconChain {
167
172
  readonly genesisTime: UintNum64;
168
173
  readonly genesisValidatorsRoot: Root;
169
- readonly executionEngine: IExecutionEngine;
174
+ readonly executionEngine: ForkChoiceExecutionEngine;
170
175
  readonly executionBuilder?: IExecutionBuilder;
171
176
  readonly builderCircuitBreaker: BuilderCircuitBreaker;
172
177
  readonly builderApiClient: BuilderApiClient;
@@ -194,6 +199,13 @@ export class BeaconChain implements IBeaconChain {
194
199
  // Ops pool
195
200
  readonly attestationPool: AttestationPool;
196
201
  readonly aggregatedAttestationPool: AggregatedAttestationPool;
202
+ readonly singleAttestationPool: SingleAttestationPool;
203
+ readonly proposerTracker: ProposerTracker;
204
+ /**
205
+ * Head state epoch and decision root of its next epoch proposers when local proposals were last refreshed. The root
206
+ * alone is not enough: a reorg onto a branch without blocks in a whole epoch keeps the root but moves the epoch
207
+ */
208
+ private localProposalsKey: string | null = null;
197
209
  readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
198
210
  readonly syncContributionAndProofPool;
199
211
  readonly executionPayloadBidPool: ExecutionPayloadBidPool;
@@ -317,7 +329,6 @@ export class BeaconChain implements IBeaconChain {
317
329
  this.genesisTime = anchorState.genesisTime;
318
330
  this.anchorStateLatestBlockSlot = anchorState.latestBlockHeader.slot;
319
331
  this.genesisValidatorsRoot = anchorState.genesisValidatorsRoot;
320
- this.executionEngine = executionEngine;
321
332
  this.executionBuilder = executionBuilder;
322
333
  const signal = this.abortController.signal;
323
334
  const emitter = new ChainEventEmitter();
@@ -331,6 +342,8 @@ export class BeaconChain implements IBeaconChain {
331
342
  this.blacklistedBlocks = new Map((opts.blacklistedBlocks ?? []).map((hex) => [hex, null]));
332
343
  this.attestationPool = new AttestationPool(config, clock, this.opts?.preaggregateSlotDistance, metrics);
333
344
  this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics, logger);
345
+ this.singleAttestationPool = new SingleAttestationPool(metrics);
346
+ this.proposerTracker = new ProposerTracker(this.opts.singleAttestationIgnoreProposalDuty ?? false, metrics);
334
347
  this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
335
348
  this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
336
349
  this.executionPayloadBidPool = new ExecutionPayloadBidPool();
@@ -457,6 +470,12 @@ export class BeaconChain implements IBeaconChain {
457
470
  this.payloadEnvelopeProcessor = new PayloadEnvelopeProcessor(this, metrics, signal);
458
471
 
459
472
  this.forkChoice = forkChoice;
473
+ this.executionEngine = new ForkChoiceExecutionEngine(executionEngine, {
474
+ forkChoice,
475
+ recomputeHeadAfterELInvalidResponse: () => this.recomputeHeadAfterELInvalidResponse(),
476
+ logger,
477
+ metrics,
478
+ });
460
479
 
461
480
  this.builderCircuitBreaker = new BuilderCircuitBreaker(
462
481
  {faultInspectionWindow: opts.faultInspectionWindow, allowedFaults: opts.allowedFaults},
@@ -933,16 +952,6 @@ export class BeaconChain implements IBeaconChain {
933
952
  }
934
953
 
935
954
  async getBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<deneb.BlobSidecars | null> {
936
- const blockInput = this.seenBlockInputCache.get(blockRootHex);
937
- if (blockInput) {
938
- if (!isBlockInputBlobs(blockInput)) {
939
- throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
940
- }
941
- if (!blockInput.hasAllData()) {
942
- return null;
943
- }
944
- return blockInput.getBlobs();
945
- }
946
955
  const unfinalizedBlobSidecars = (await this.db.blobSidecars.get(fromHex(blockRootHex)))?.blobSidecars ?? null;
947
956
  if (unfinalizedBlobSidecars) {
948
957
  return unfinalizedBlobSidecars;
@@ -950,28 +959,6 @@ export class BeaconChain implements IBeaconChain {
950
959
  return (await this.db.blobSidecarsArchive.get(blockSlot))?.blobSidecars ?? null;
951
960
  }
952
961
 
953
- async getSerializedBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
954
- const blockInput = this.seenBlockInputCache.get(blockRootHex);
955
- if (blockInput) {
956
- if (!isBlockInputBlobs(blockInput)) {
957
- throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
958
- }
959
- if (!blockInput.hasAllData()) {
960
- return null;
961
- }
962
- return ssz.deneb.BlobSidecars.serialize(blockInput.getBlobs());
963
- }
964
- const unfinalizedBlobSidecarsWrapper = await this.db.blobSidecars.getBinary(fromHex(blockRootHex));
965
- if (unfinalizedBlobSidecarsWrapper) {
966
- return unfinalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
967
- }
968
- const finalizedBlobSidecarsWrapper = await this.db.blobSidecarsArchive.getBinary(blockSlot);
969
- if (finalizedBlobSidecarsWrapper) {
970
- return finalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
971
- }
972
- return null;
973
- }
974
-
975
962
  async getSerializedExecutionPayloadEnvelope(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
976
963
  const [bytes] = await this.getSerializedExecutionPayloadEnvelopes([{blockSlot, blockRootHex}]);
977
964
  return bytes;
@@ -1430,6 +1417,58 @@ export class BeaconChain implements IBeaconChain {
1430
1417
  }
1431
1418
  }
1432
1419
 
1420
+ /**
1421
+ * Apply chain side effects of a fork choice head change: head state, head metrics, and reorg detection
1422
+ */
1423
+ onHeadChanged(oldHead: ProtoBlock, newHead: ProtoBlock, maybeHeadState?: IBeaconStateView): void {
1424
+ // Set head state as strong reference
1425
+ this.regen.updateHeadState(newHead, maybeHeadState);
1426
+
1427
+ const delaySec = this.clock.secFromSlot(newHead.slot);
1428
+ this.logger.verbose("New chain head", {
1429
+ slot: newHead.slot,
1430
+ root: newHead.blockRoot,
1431
+ payloadStatus: newHead.payloadStatus,
1432
+ delaySec,
1433
+ });
1434
+ this.metrics?.headSlot.set(newHead.slot);
1435
+
1436
+ this.onNewHead(newHead);
1437
+ this.metrics?.forkChoice.changedHead.inc();
1438
+
1439
+ const ancestorResult = this.forkChoice.getCommonAncestorDepth(oldHead, newHead);
1440
+ if (ancestorResult.code === AncestorStatus.CommonAncestor) {
1441
+ // CommonAncestor = chain reorg, old head and new head not direct descendants
1442
+
1443
+ const forkChoiceReorgEventData: ReorgEventData = {
1444
+ depth: ancestorResult.depth,
1445
+ epoch: computeEpochAtSlot(newHead.slot),
1446
+ slot: newHead.slot,
1447
+ newHeadBlock: newHead.blockRoot,
1448
+ oldHeadBlock: oldHead.blockRoot,
1449
+ newHeadState: newHead.stateRoot,
1450
+ oldHeadState: oldHead.stateRoot,
1451
+ executionOptimistic: isOptimisticBlock(newHead),
1452
+ };
1453
+
1454
+ this.emitter.emit(routes.events.EventType.chainReorg, forkChoiceReorgEventData);
1455
+ this.logger.verbose("Chain reorg", forkChoiceReorgEventData);
1456
+
1457
+ this.metrics?.forkChoice.reorg.inc();
1458
+ this.metrics?.forkChoice.reorgDistance.observe(ancestorResult.depth);
1459
+ }
1460
+ }
1461
+
1462
+ private recomputeHeadAfterELInvalidResponse(): void {
1463
+ // validateLatestHash only re-scores proto-array, the cached head is still the old one
1464
+ const oldHead = this.forkChoice.getHead();
1465
+ const newHead = this.recomputeForkChoiceHead(ForkchoiceCaller.executionInvalid);
1466
+ if (newHead.blockRoot === oldHead.blockRoot && newHead.payloadStatus === oldHead.payloadStatus) {
1467
+ return;
1468
+ }
1469
+ this.onHeadChanged(oldHead, newHead);
1470
+ }
1471
+
1433
1472
  /**
1434
1473
  * Emit `head` and `head_v2` when the fork choice head differs between two observations. Every caller that
1435
1474
  * can move the head, `updateAndGetHead()` and `updateTime()`, must capture the head before and pass both.
@@ -1486,10 +1525,10 @@ export class BeaconChain implements IBeaconChain {
1486
1525
  this.metrics?.forkChoice.requests.inc();
1487
1526
  const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.predictProposerHead});
1488
1527
  const slot = this.clock.currentSlot;
1489
- const secFromSlot = this.clock.secFromSlot(slot);
1528
+ const msFromSlot = this.clock.msFromSlot(slot);
1490
1529
 
1491
1530
  try {
1492
- return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetPredictedProposerHead, secFromSlot, slot}).head;
1531
+ return this.forkChoice.updateAndGetHead({mode: UpdateHeadOpt.GetPredictedProposerHead, msFromSlot, slot}).head;
1493
1532
  } catch (e) {
1494
1533
  this.metrics?.forkChoice.errors.inc({entrypoint: UpdateHeadOpt.GetPredictedProposerHead});
1495
1534
  throw e;
@@ -1501,13 +1540,13 @@ export class BeaconChain implements IBeaconChain {
1501
1540
  getProposerHead(slot: Slot): ProtoBlock {
1502
1541
  this.metrics?.forkChoice.requests.inc();
1503
1542
  const timer = this.metrics?.forkChoice.findHead.startTimer({caller: FindHeadFnName.getProposerHead});
1504
- const secFromSlot = this.clock.secFromSlot(slot);
1543
+ const msFromSlot = this.clock.msFromSlot(slot);
1505
1544
 
1506
1545
  try {
1507
1546
  // Do not emit head event here, when proposing we rely on the one emitted when importing our own block
1508
1547
  const {head, isHeadTimely, notReorgedReason} = this.forkChoice.updateAndGetHead({
1509
1548
  mode: UpdateHeadOpt.GetProposerHead,
1510
- secFromSlot,
1549
+ msFromSlot,
1511
1550
  slot,
1512
1551
  });
1513
1552
 
@@ -1829,6 +1868,8 @@ export class BeaconChain implements IBeaconChain {
1829
1868
 
1830
1869
  this.attestationPool.prune(slot);
1831
1870
  this.aggregatedAttestationPool.prune(slot);
1871
+ this.proposerTracker.prune(slot);
1872
+ this.singleAttestationPool.prune(this.proposerTracker);
1832
1873
  this.syncCommitteeMessagePool.prune(slot);
1833
1874
  this.seenSyncCommitteeMessages.prune(slot);
1834
1875
  this.payloadAttestationPool.prune(slot);
@@ -1855,6 +1896,55 @@ export class BeaconChain implements IBeaconChain {
1855
1896
  }
1856
1897
  }
1857
1898
 
1899
+ /**
1900
+ * Track upcoming proposals of validators connected to this node, so that SingleAttestationPool only collects and
1901
+ * the network only subscribes to all attestation subnets before them. Proposals only change when the decision block
1902
+ * of next epoch proposers changes (the head enters a new epoch or reorgs that block) or a new validator connects,
1903
+ * set localProposalsKey to null before calling for the latter.
1904
+ * Never throws, it runs during block import.
1905
+ */
1906
+ private refreshLocalProposals(): void {
1907
+ const clockSlot = this.clock.currentSlot;
1908
+ try {
1909
+ const headState = this.getHeadState();
1910
+ const headFork = this.config.getForkName(headState.slot);
1911
+ // post-fulu, the head state knows proposers of its epoch and the next one thanks to the proposer lookahead,
1912
+ // a pre-fulu state only predicts next epoch proposers
1913
+ if (!isForkPostFulu(headFork) || headState.epoch < computeEpochAtSlot(clockSlot) - 1) {
1914
+ return;
1915
+ }
1916
+
1917
+ const decisionRoot = proposerShufflingDecisionRoot(headFork, headState, headState.epoch + 1);
1918
+ if (decisionRoot === null) {
1919
+ return;
1920
+ }
1921
+ const localProposalsKey = `${headState.epoch}_${toRootHex(decisionRoot)}`;
1922
+ if (localProposalsKey === this.localProposalsKey) {
1923
+ return;
1924
+ }
1925
+ this.localProposalsKey = localProposalsKey;
1926
+
1927
+ const startSlot = computeStartSlotAtEpoch(headState.epoch);
1928
+ const newProposalSlots: Slot[] = [];
1929
+ for (const [i, proposerIndex] of [...headState.currentProposers, ...headState.nextProposers].entries()) {
1930
+ const proposalSlot = startSlot + i;
1931
+ if (
1932
+ proposalSlot >= clockSlot &&
1933
+ this.beaconProposerCache.has(proposerIndex) &&
1934
+ this.proposerTracker.addProposal(proposalSlot)
1935
+ ) {
1936
+ newProposalSlots.push(proposalSlot);
1937
+ }
1938
+ }
1939
+
1940
+ if (newProposalSlots.length > 0) {
1941
+ this.emitter.emit(ChainEvent.localProposalSlots, newProposalSlots);
1942
+ }
1943
+ } catch (e) {
1944
+ this.logger.debug("Error refreshing local proposals", {slot: clockSlot}, e as Error);
1945
+ }
1946
+ }
1947
+
1858
1948
  private onClockEpoch(epoch: Epoch): void {
1859
1949
  this.metrics?.clockEpoch.set(epoch);
1860
1950
 
@@ -1869,6 +1959,8 @@ export class BeaconChain implements IBeaconChain {
1869
1959
  protected onNewHead(head: ProtoBlock): void {
1870
1960
  this.syncContributionAndProofPool.prune(head.slot);
1871
1961
  this.seenContributionAndProof.prune(head.slot);
1962
+
1963
+ this.refreshLocalProposals();
1872
1964
  }
1873
1965
 
1874
1966
  private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
@@ -1937,6 +2029,9 @@ export class BeaconChain implements IBeaconChain {
1937
2029
 
1938
2030
  // Only update validator custody if we discovered new validators
1939
2031
  if (newValidatorCount > previousValidatorCount) {
2032
+ // new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
2033
+ this.localProposalsKey = null;
2034
+ this.refreshLocalProposals();
1940
2035
  const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
1941
2036
  await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
1942
2037
  }
@@ -1952,6 +2047,9 @@ export class BeaconChain implements IBeaconChain {
1952
2047
 
1953
2048
  // Only update validator custody if we discovered new validators
1954
2049
  if (hasNewValidators) {
2050
+ // new validators may propose in the current or next epoch, a failed attempt leaves null so the next head retries
2051
+ this.localProposalsKey = null;
2052
+ this.refreshLocalProposals();
1955
2053
  const finalizedCheckpoint = this.forkChoice.getFinalizedCheckpoint();
1956
2054
  await this.updateValidatorsCustodyRequirement(finalizedCheckpoint);
1957
2055
  }
@@ -3,7 +3,7 @@ import {StrictEventEmitter} from "strict-event-emitter-types";
3
3
  import {routes} from "@lodestar/api";
4
4
  import {CheckpointWithHex, PtcQuorumEvent} from "@lodestar/fork-choice";
5
5
  import {IBeaconStateView} from "@lodestar/state-transition";
6
- import {DataColumnSidecar, RootHex, Slot, deneb, phase0} from "@lodestar/types";
6
+ import {DataColumnSidecar, RootHex, Slot, phase0} from "@lodestar/types";
7
7
  import {PeerIdStr} from "../util/peerId.js";
8
8
  import {BlockInputSource, IBlockInput} from "./blocks/blockInput/types.js";
9
9
  import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
@@ -50,16 +50,16 @@ export enum ChainEvent {
50
50
  * and are ready to be published.
51
51
  */
52
52
  publishDataColumns = "publishDataColumns",
53
- /**
54
- * This event signals that blobs have been fetched from the execution engine
55
- * and are ready to be published.
56
- */
57
- publishBlobSidecars = "publishBlobSidecars",
58
53
  /**
59
54
  * This event signals that a proposer slashing has been produced from an observed equivocation
60
55
  * and is ready to be published.
61
56
  */
62
57
  publishProposerSlashing = "publishProposerSlashing",
58
+ /**
59
+ * New block proposal slots of validators connected to this node, the network subscribes to all attestation
60
+ * subnets before them, see `slotsToSubscribeBeforeProposalDuty`
61
+ */
62
+ localProposalSlots = "localProposalSlots",
63
63
  /**
64
64
  * Trigger an update of status so reqresp by peers have current earliestAvailableSlot
65
65
  */
@@ -123,10 +123,10 @@ export type IChainEvents = ApiEvents & {
123
123
 
124
124
  [ChainEvent.publishDataColumns]: (sidecars: DataColumnSidecar[]) => void;
125
125
 
126
- [ChainEvent.publishBlobSidecars]: (sidecars: deneb.BlobSidecar[]) => void;
127
-
128
126
  [ChainEvent.publishProposerSlashing]: (proposerSlashing: phase0.ProposerSlashing) => void;
129
127
 
128
+ [ChainEvent.localProposalSlots]: (proposalSlots: Slot[]) => void;
129
+
130
130
  [ChainEvent.updateStatus]: () => void;
131
131
 
132
132
  // Sync events that are chain->chain. Initiated from network requests but do not cross the network
@@ -72,7 +72,7 @@ export enum BlockErrorCode {
72
72
  * whoever served the block MAY be downscored. Mirrors PayloadErrorCode.EXECUTION_ENGINE_INVALID.
73
73
  */
74
74
  EXECUTION_ENGINE_INVALID = "BLOCK_ERROR_EXECUTION_INVALID",
75
- /** The blobs are unavailable */
75
+ /** The blob or column data did not arrive within the availability wait */
76
76
  DATA_UNAVAILABLE = "BLOCK_ERROR_DATA_UNAVAILABLE",
77
77
  /** Block contains too many kzg commitments */
78
78
  TOO_MANY_KZG_COMMITMENTS = "BLOCK_ERROR_TOO_MANY_KZG_COMMITMENTS",
@@ -12,6 +12,7 @@ export enum ExecutionPayloadEnvelopeErrorCode {
12
12
  BUILDER_INDEX_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BUILDER_INDEX_MISMATCH",
13
13
  BLOCK_HASH_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_HASH_MISMATCH",
14
14
  EXECUTION_REQUESTS_ROOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_EXECUTION_REQUESTS_ROOT_MISMATCH",
15
+ TOO_MANY_TRANSACTIONS = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_TOO_MANY_TRANSACTIONS",
15
16
  INVALID_SIGNATURE = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_SIGNATURE",
16
17
  PAYLOAD_ENVELOPE_INPUT_MISSING = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_PAYLOAD_ENVELOPE_INPUT_MISSING",
17
18
  }
@@ -54,6 +55,13 @@ export type ExecutionPayloadEnvelopeErrorType =
54
55
  envelopeRequestsRoot: RootHex;
55
56
  bidRequestsRoot: RootHex;
56
57
  }
58
+ | {
59
+ code: ExecutionPayloadEnvelopeErrorCode.TOO_MANY_TRANSACTIONS;
60
+ slot: Slot;
61
+ root: RootHex;
62
+ transactionCount: number;
63
+ maxTransactionCount: number;
64
+ }
57
65
  | {code: ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE; slot: Slot; root: RootHex}
58
66
  | {code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING; blockRoot: RootHex};
59
67
 
@@ -1,6 +1,5 @@
1
1
  export * from "./attestationError.js";
2
2
  export * from "./attesterSlashingError.js";
3
- export * from "./blobSidecarError.js";
4
3
  export * from "./blockError.js";
5
4
  export * from "./blsToExecutionChangeError.js";
6
5
  export * from "./dataColumnSidecarError.js";
@@ -34,6 +34,17 @@ export type ForkChoiceOpts = RawForkChoiceOpts & {
34
34
  export enum ForkchoiceCaller {
35
35
  prepareNextSlot = "prepare_next_slot",
36
36
  importBlock = "import_block",
37
+ executionInvalid = "execution_invalid",
38
+ }
39
+
40
+ /**
41
+ * Where an execution engine INVALID verdict comes from. Only `blockSegment` verdicts are about the payload the engine
42
+ * just processed and keep the consensus failure semantics in fork choice, the others are applied leniently.
43
+ */
44
+ export enum ExecutionInvalidSource {
45
+ forkchoiceUpdated = "forkchoice_updated",
46
+ newPayload = "new_payload",
47
+ blockSegment = "block_segment",
37
48
  }
38
49
 
39
50
  /**
@@ -0,0 +1,183 @@
1
+ import {ExecutionStatus, IForkChoice, LVHInvalidResponse} from "@lodestar/fork-choice";
2
+ import {ForkName, ForkPostFulu} from "@lodestar/params";
3
+ import {RootHex, bellatrix} from "@lodestar/types";
4
+ import {BlobAndProofV2} from "@lodestar/types/fulu";
5
+ import {Logger} from "@lodestar/utils";
6
+ import {ExecutionPayloadBodyV2} from "../execution/engine/types.js";
7
+ import {DATA} from "../execution/engine/utils.js";
8
+ import {
9
+ ClientVersion,
10
+ ExecutionEngineState,
11
+ ExecutionPayloadStatus,
12
+ ForkchoiceUpdatedResult,
13
+ IExecutionEngine,
14
+ PayloadAttributes,
15
+ PayloadId,
16
+ PayloadIdCache,
17
+ VersionedHashes,
18
+ } from "../execution/index.js";
19
+ import {Metrics} from "../metrics/index.js";
20
+ import {ExecutionInvalidSource} from "./forkChoice/index.js";
21
+
22
+ export type ForkChoiceExecutionEngineModules = {
23
+ forkChoice: IForkChoice;
24
+ /** Recompute and switch the chain head, fork choice is already updated when this runs */
25
+ recomputeHeadAfterELInvalidResponse: () => void;
26
+ logger: Logger;
27
+ metrics: Metrics | null;
28
+ };
29
+
30
+ /**
31
+ * The only handle on the execution engine. Payloads are imported optimistically, so every engine verdict that can
32
+ * change fork choice is applied here.
33
+ */
34
+ export class ForkChoiceExecutionEngine {
35
+ private readonly forkChoice: IForkChoice;
36
+ private readonly recomputeHeadAfterELInvalidResponse: () => void;
37
+ private readonly logger: Logger;
38
+ private readonly metrics: Metrics | null;
39
+
40
+ constructor(
41
+ private readonly engine: IExecutionEngine,
42
+ modules: ForkChoiceExecutionEngineModules
43
+ ) {
44
+ this.forkChoice = modules.forkChoice;
45
+ this.recomputeHeadAfterELInvalidResponse = modules.recomputeHeadAfterELInvalidResponse;
46
+ this.logger = modules.logger;
47
+ this.metrics = modules.metrics;
48
+ }
49
+
50
+ get state(): ExecutionEngineState {
51
+ return this.engine.state;
52
+ }
53
+
54
+ get clientVersion(): ClientVersion | null | undefined {
55
+ return this.engine.clientVersion;
56
+ }
57
+
58
+ get payloadIdCache(): PayloadIdCache {
59
+ return this.engine.payloadIdCache;
60
+ }
61
+
62
+ notifyNewPayload(
63
+ ...args: Parameters<IExecutionEngine["notifyNewPayload"]>
64
+ ): ReturnType<IExecutionEngine["notifyNewPayload"]> {
65
+ return this.engine.notifyNewPayload(...args);
66
+ }
67
+
68
+ /**
69
+ * `headBlockRoot` is the root of the node whose payload hash is sent as `headBlockHash`, captured by the caller
70
+ * before the call: root and hash identify the exact fork choice node, gloas variant included.
71
+ *
72
+ * The verdict is applied to fork choice before returning. An INVALID verdict throws when preparing a payload so
73
+ * block production fails, otherwise it resolves to null.
74
+ */
75
+ async notifyForkchoiceUpdate(
76
+ fork: ForkName,
77
+ headBlockRoot: RootHex,
78
+ headBlockHash: RootHex,
79
+ safeBlockHash: RootHex,
80
+ finalizedBlockHash: RootHex,
81
+ payloadAttributes?: PayloadAttributes
82
+ ): Promise<PayloadId | null> {
83
+ const result = await this.engine.notifyForkchoiceUpdate(
84
+ fork,
85
+ headBlockHash,
86
+ safeBlockHash,
87
+ finalizedBlockHash,
88
+ payloadAttributes
89
+ );
90
+ this.applyForkchoiceUpdatedResult(headBlockRoot, headBlockHash, result);
91
+
92
+ if (result.payloadStatus.status === ExecutionPayloadStatus.INVALID) {
93
+ if (payloadAttributes) {
94
+ throw Error(`Invalid prepare payload, validationError=${result.payloadStatus.validationError ?? ""}`);
95
+ }
96
+ return null;
97
+ }
98
+ return result.payloadId;
99
+ }
100
+
101
+ getPayload(...args: Parameters<IExecutionEngine["getPayload"]>): ReturnType<IExecutionEngine["getPayload"]> {
102
+ return this.engine.getPayload(...args);
103
+ }
104
+
105
+ getInclusionList(): Promise<bellatrix.Transactions> {
106
+ return this.engine.getInclusionList();
107
+ }
108
+
109
+ getPayloadBodiesByHashV2(blockHashes: DATA[]): Promise<(ExecutionPayloadBodyV2 | null)[]> {
110
+ return this.engine.getPayloadBodiesByHashV2(blockHashes);
111
+ }
112
+
113
+ getBlobs(
114
+ fork: ForkPostFulu,
115
+ versionedHashes: VersionedHashes,
116
+ buffers?: Uint8Array[]
117
+ ): Promise<BlobAndProofV2[] | null> {
118
+ return this.engine.getBlobs(fork, versionedHashes, buffers);
119
+ }
120
+
121
+ /**
122
+ * Apply an execution engine INVALID verdict to fork choice and move the chain head off the invalid chain
123
+ */
124
+ invalidateExecutionPayloads(lvh: LVHInvalidResponse, source: ExecutionInvalidSource): void {
125
+ const logCtx = {
126
+ source,
127
+ blockRoot: lvh.invalidateFromParentBlockRoot,
128
+ blockHash: lvh.invalidateFromParentBlockHash,
129
+ latestValidHash: lvh.latestValidExecHash ?? "null",
130
+ };
131
+ const applied = this.forkChoice.validateLatestHash(lvh, {strict: source === ExecutionInvalidSource.blockSegment});
132
+ if (!applied) {
133
+ this.logger.warn("Execution engine INVALID verdict not applied to fork choice", logCtx);
134
+ return;
135
+ }
136
+ this.metrics?.forkChoice.executionInvalidations.inc({source});
137
+ this.logger.warn("Invalidated execution payloads in fork choice", logCtx);
138
+
139
+ try {
140
+ this.recomputeHeadAfterELInvalidResponse();
141
+ } catch (e) {
142
+ this.logger.error("Error recomputing head after execution payload invalidation", logCtx, e as Error);
143
+ }
144
+ }
145
+
146
+ private applyForkchoiceUpdatedResult(
147
+ headBlockRoot: RootHex,
148
+ headBlockHash: RootHex,
149
+ result: ForkchoiceUpdatedResult
150
+ ): void {
151
+ const {status, latestValidHash, validationError} = result.payloadStatus;
152
+ const executionStatus = this.forkChoice.getBlockHexAndBlockHash(headBlockRoot, headBlockHash)?.executionStatus;
153
+ try {
154
+ if (status === ExecutionPayloadStatus.INVALID) {
155
+ if (executionStatus === ExecutionStatus.Invalid) {
156
+ return;
157
+ }
158
+ this.logger.error("Execution engine reported INVALID forkchoice head", {
159
+ headBlockRoot,
160
+ headBlockHash,
161
+ latestValidHash: latestValidHash ?? "null",
162
+ validationError: validationError ?? "",
163
+ });
164
+ this.invalidateExecutionPayloads(
165
+ {
166
+ executionStatus: ExecutionStatus.Invalid,
167
+ latestValidExecHash: latestValidHash,
168
+ invalidateFromParentBlockRoot: headBlockRoot,
169
+ invalidateFromParentBlockHash: headBlockHash,
170
+ },
171
+ ExecutionInvalidSource.forkchoiceUpdated
172
+ );
173
+ } else if (status === ExecutionPayloadStatus.VALID && executionStatus === ExecutionStatus.Syncing) {
174
+ this.forkChoice.validateLatestHash(
175
+ {executionStatus: ExecutionStatus.Valid, latestValidExecHash: headBlockHash, blockRoot: headBlockRoot},
176
+ {strict: false}
177
+ );
178
+ }
179
+ } catch (e) {
180
+ this.logger.error("Error applying forkchoice update result", {headBlockRoot, headBlockHash, status}, e as Error);
181
+ }
182
+ }
183
+ }