@lodestar/beacon-node 1.43.0-dev.433e692fd9 → 1.43.0-dev.4451fec75a

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 (406) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +17 -9
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/pool/index.js +45 -2
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/utils.d.ts +2 -2
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  10. package/lib/api/impl/debug/index.d.ts.map +1 -1
  11. package/lib/api/impl/debug/index.js +0 -1
  12. package/lib/api/impl/debug/index.js.map +1 -1
  13. package/lib/api/impl/lodestar/index.js +1 -1
  14. package/lib/api/impl/lodestar/index.js.map +1 -1
  15. package/lib/api/impl/validator/index.d.ts.map +1 -1
  16. package/lib/api/impl/validator/index.js +68 -6
  17. package/lib/api/impl/validator/index.js.map +1 -1
  18. package/lib/chain/GetBlobsTracker.d.ts +1 -1
  19. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  20. package/lib/chain/GetBlobsTracker.js +1 -2
  21. package/lib/chain/GetBlobsTracker.js.map +1 -1
  22. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  23. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  24. package/lib/chain/archiveStore/interface.d.ts +4 -4
  25. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  26. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
  27. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
  28. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  29. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +2 -2
  30. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  31. package/lib/chain/archiveStore/utils/archiveBlocks.js +110 -58
  32. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  33. package/lib/chain/blocks/blockInput/blockInput.d.ts +3 -0
  34. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  35. package/lib/chain/blocks/blockInput/blockInput.js +4 -1
  36. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  37. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  38. package/lib/chain/blocks/importBlock.js +16 -32
  39. package/lib/chain/blocks/importBlock.js.map +1 -1
  40. package/lib/chain/blocks/importExecutionPayload.d.ts +32 -14
  41. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  42. package/lib/chain/blocks/importExecutionPayload.js +101 -90
  43. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  44. package/lib/chain/blocks/index.d.ts +5 -3
  45. package/lib/chain/blocks/index.d.ts.map +1 -1
  46. package/lib/chain/blocks/index.js +58 -26
  47. package/lib/chain/blocks/index.js.map +1 -1
  48. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +15 -1
  49. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  50. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +48 -2
  51. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  52. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +17 -0
  53. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  54. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +5 -0
  55. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  56. package/lib/chain/blocks/payloadEnvelopeProcessor.js +7 -5
  57. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  58. package/lib/chain/blocks/types.d.ts +15 -20
  59. package/lib/chain/blocks/types.d.ts.map +1 -1
  60. package/lib/chain/blocks/utils/chainSegment.d.ts +21 -2
  61. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  62. package/lib/chain/blocks/utils/chainSegment.js +92 -12
  63. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  64. package/lib/chain/blocks/verifyBlock.d.ts +5 -3
  65. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  66. package/lib/chain/blocks/verifyBlock.js +50 -7
  67. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  68. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +0 -4
  69. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  70. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -2
  71. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  72. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +2 -1
  73. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  74. package/lib/chain/blocks/verifyBlocksSanityChecks.js +25 -5
  75. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  76. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +24 -0
  77. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -0
  78. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +80 -0
  79. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -0
  80. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +14 -0
  81. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -0
  82. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +30 -0
  83. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -0
  84. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +1 -1
  85. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -1
  86. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +2 -11
  87. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -1
  88. package/lib/chain/chain.d.ts +8 -6
  89. package/lib/chain/chain.d.ts.map +1 -1
  90. package/lib/chain/chain.js +44 -14
  91. package/lib/chain/chain.js.map +1 -1
  92. package/lib/chain/emitter.d.ts +16 -15
  93. package/lib/chain/emitter.d.ts.map +1 -1
  94. package/lib/chain/emitter.js +5 -4
  95. package/lib/chain/emitter.js.map +1 -1
  96. package/lib/chain/errors/blockError.d.ts +8 -1
  97. package/lib/chain/errors/blockError.d.ts.map +1 -1
  98. package/lib/chain/errors/blockError.js +2 -0
  99. package/lib/chain/errors/blockError.js.map +1 -1
  100. package/lib/chain/errors/executionPayloadBid.d.ts +5 -0
  101. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  102. package/lib/chain/errors/executionPayloadBid.js +1 -0
  103. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  104. package/lib/chain/errors/executionPayloadEnvelope.d.ts +5 -0
  105. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  106. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  107. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  108. package/lib/chain/errors/index.d.ts +1 -0
  109. package/lib/chain/errors/index.d.ts.map +1 -1
  110. package/lib/chain/errors/index.js +1 -0
  111. package/lib/chain/errors/index.js.map +1 -1
  112. package/lib/chain/errors/proposerPreferences.d.ts +40 -0
  113. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -0
  114. package/lib/chain/errors/proposerPreferences.js +14 -0
  115. package/lib/chain/errors/proposerPreferences.js.map +1 -0
  116. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  117. package/lib/chain/forkChoice/index.js +11 -19
  118. package/lib/chain/forkChoice/index.js.map +1 -1
  119. package/lib/chain/initState.d.ts.map +1 -1
  120. package/lib/chain/initState.js +6 -1
  121. package/lib/chain/initState.js.map +1 -1
  122. package/lib/chain/interface.d.ts +7 -5
  123. package/lib/chain/interface.d.ts.map +1 -1
  124. package/lib/chain/interface.js.map +1 -1
  125. package/lib/chain/lightClient/index.d.ts.map +1 -1
  126. package/lib/chain/lightClient/index.js +1 -1
  127. package/lib/chain/lightClient/index.js.map +1 -1
  128. package/lib/chain/opPools/payloadAttestationPool.d.ts +4 -3
  129. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  130. package/lib/chain/opPools/payloadAttestationPool.js +56 -14
  131. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  132. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  133. package/lib/chain/prepareNextSlot.js +45 -17
  134. package/lib/chain/prepareNextSlot.js.map +1 -1
  135. package/lib/chain/produceBlock/produceBlockBody.d.ts +13 -2
  136. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  137. package/lib/chain/produceBlock/produceBlockBody.js +68 -25
  138. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  139. package/lib/chain/regen/interface.d.ts +1 -0
  140. package/lib/chain/regen/interface.d.ts.map +1 -1
  141. package/lib/chain/regen/interface.js +1 -0
  142. package/lib/chain/regen/interface.js.map +1 -1
  143. package/lib/chain/regen/queued.d.ts.map +1 -1
  144. package/lib/chain/regen/queued.js +1 -4
  145. package/lib/chain/regen/queued.js.map +1 -1
  146. package/lib/chain/regen/regen.d.ts.map +1 -1
  147. package/lib/chain/regen/regen.js +1 -4
  148. package/lib/chain/regen/regen.js.map +1 -1
  149. package/lib/chain/seenCache/index.d.ts +1 -0
  150. package/lib/chain/seenCache/index.d.ts.map +1 -1
  151. package/lib/chain/seenCache/index.js +1 -0
  152. package/lib/chain/seenCache/index.js.map +1 -1
  153. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +24 -7
  154. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  155. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +69 -17
  156. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  157. package/lib/chain/seenCache/seenProposerPreferences.d.ts +16 -0
  158. package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -0
  159. package/lib/chain/seenCache/seenProposerPreferences.js +26 -0
  160. package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -0
  161. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  162. package/lib/chain/stateCache/persistentCheckpointsCache.js +4 -1
  163. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  164. package/lib/chain/validation/block.d.ts.map +1 -1
  165. package/lib/chain/validation/block.js +1 -0
  166. package/lib/chain/validation/block.js.map +1 -1
  167. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  168. package/lib/chain/validation/executionPayloadBid.js +24 -9
  169. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  170. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  171. package/lib/chain/validation/executionPayloadEnvelope.js +19 -9
  172. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  173. package/lib/chain/validation/payloadAttestationMessage.d.ts +1 -1
  174. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  175. package/lib/chain/validation/payloadAttestationMessage.js +9 -6
  176. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  177. package/lib/chain/validation/proposerPreferences.d.ts +8 -0
  178. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -0
  179. package/lib/chain/validation/proposerPreferences.js +91 -0
  180. package/lib/chain/validation/proposerPreferences.js.map +1 -0
  181. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +1 -1
  182. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -1
  183. package/lib/execution/engine/http.d.ts.map +1 -1
  184. package/lib/execution/engine/http.js +21 -14
  185. package/lib/execution/engine/http.js.map +1 -1
  186. package/lib/execution/engine/interface.d.ts +1 -0
  187. package/lib/execution/engine/interface.d.ts.map +1 -1
  188. package/lib/execution/engine/mock.d.ts.map +1 -1
  189. package/lib/execution/engine/mock.js +6 -0
  190. package/lib/execution/engine/mock.js.map +1 -1
  191. package/lib/execution/engine/types.d.ts +20 -0
  192. package/lib/execution/engine/types.d.ts.map +1 -1
  193. package/lib/execution/engine/types.js +18 -0
  194. package/lib/execution/engine/types.js.map +1 -1
  195. package/lib/metrics/metrics/lodestar.d.ts +5 -0
  196. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  197. package/lib/metrics/metrics/lodestar.js +9 -0
  198. package/lib/metrics/metrics/lodestar.js.map +1 -1
  199. package/lib/network/gossip/interface.d.ts +7 -1
  200. package/lib/network/gossip/interface.d.ts.map +1 -1
  201. package/lib/network/gossip/interface.js +1 -0
  202. package/lib/network/gossip/interface.js.map +1 -1
  203. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  204. package/lib/network/gossip/scoringParameters.js +12 -1
  205. package/lib/network/gossip/scoringParameters.js.map +1 -1
  206. package/lib/network/gossip/topic.d.ts +760 -2
  207. package/lib/network/gossip/topic.d.ts.map +1 -1
  208. package/lib/network/gossip/topic.js +6 -0
  209. package/lib/network/gossip/topic.js.map +1 -1
  210. package/lib/network/interface.d.ts +2 -0
  211. package/lib/network/interface.d.ts.map +1 -1
  212. package/lib/network/network.d.ts +2 -0
  213. package/lib/network/network.d.ts.map +1 -1
  214. package/lib/network/network.js +9 -1
  215. package/lib/network/network.js.map +1 -1
  216. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  217. package/lib/network/processor/gossipHandlers.js +93 -25
  218. package/lib/network/processor/gossipHandlers.js.map +1 -1
  219. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  220. package/lib/network/processor/gossipQueues/index.js +5 -0
  221. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  222. package/lib/network/processor/index.d.ts.map +1 -1
  223. package/lib/network/processor/index.js +6 -5
  224. package/lib/network/processor/index.js.map +1 -1
  225. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  226. package/lib/network/reqresp/ReqRespBeaconNode.js +1 -1
  227. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  228. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts +9 -0
  229. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts.map +1 -0
  230. package/lib/network/reqresp/handlers/beaconBlocksByHead.js +61 -0
  231. package/lib/network/reqresp/handlers/beaconBlocksByHead.js.map +1 -0
  232. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  233. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +14 -6
  234. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  235. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  236. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +11 -5
  237. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  238. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  239. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +17 -5
  240. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  241. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  242. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +7 -4
  243. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  244. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  245. package/lib/network/reqresp/handlers/index.js +5 -0
  246. package/lib/network/reqresp/handlers/index.js.map +1 -1
  247. package/lib/network/reqresp/interface.d.ts +1 -1
  248. package/lib/network/reqresp/interface.js +1 -1
  249. package/lib/network/reqresp/protocols.d.ts +1 -0
  250. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  251. package/lib/network/reqresp/protocols.js +5 -0
  252. package/lib/network/reqresp/protocols.js.map +1 -1
  253. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  254. package/lib/network/reqresp/rateLimit.js +4 -0
  255. package/lib/network/reqresp/rateLimit.js.map +1 -1
  256. package/lib/network/reqresp/score.d.ts.map +1 -1
  257. package/lib/network/reqresp/score.js +1 -0
  258. package/lib/network/reqresp/score.js.map +1 -1
  259. package/lib/network/reqresp/types.d.ts +3 -0
  260. package/lib/network/reqresp/types.d.ts.map +1 -1
  261. package/lib/network/reqresp/types.js +3 -0
  262. package/lib/network/reqresp/types.js.map +1 -1
  263. package/lib/node/nodejs.d.ts.map +1 -1
  264. package/lib/node/nodejs.js +6 -4
  265. package/lib/node/nodejs.js.map +1 -1
  266. package/lib/sync/constants.d.ts +7 -1
  267. package/lib/sync/constants.d.ts.map +1 -1
  268. package/lib/sync/constants.js +7 -4
  269. package/lib/sync/constants.js.map +1 -1
  270. package/lib/sync/range/batch.d.ts +55 -8
  271. package/lib/sync/range/batch.d.ts.map +1 -1
  272. package/lib/sync/range/batch.js +291 -66
  273. package/lib/sync/range/batch.js.map +1 -1
  274. package/lib/sync/range/chain.d.ts +22 -4
  275. package/lib/sync/range/chain.d.ts.map +1 -1
  276. package/lib/sync/range/chain.js +103 -11
  277. package/lib/sync/range/chain.js.map +1 -1
  278. package/lib/sync/range/range.d.ts.map +1 -1
  279. package/lib/sync/range/range.js +71 -11
  280. package/lib/sync/range/range.js.map +1 -1
  281. package/lib/sync/range/utils/peerBalancer.d.ts +2 -1
  282. package/lib/sync/range/utils/peerBalancer.d.ts.map +1 -1
  283. package/lib/sync/range/utils/peerBalancer.js +8 -4
  284. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  285. package/lib/sync/sync.d.ts.map +1 -1
  286. package/lib/sync/sync.js +13 -0
  287. package/lib/sync/sync.js.map +1 -1
  288. package/lib/sync/types.d.ts +34 -0
  289. package/lib/sync/types.d.ts.map +1 -1
  290. package/lib/sync/types.js +34 -0
  291. package/lib/sync/types.js.map +1 -1
  292. package/lib/sync/unknownBlock.d.ts +29 -1
  293. package/lib/sync/unknownBlock.d.ts.map +1 -1
  294. package/lib/sync/unknownBlock.js +727 -61
  295. package/lib/sync/unknownBlock.js.map +1 -1
  296. package/lib/sync/utils/downloadByRange.d.ts +73 -10
  297. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  298. package/lib/sync/utils/downloadByRange.js +213 -26
  299. package/lib/sync/utils/downloadByRange.js.map +1 -1
  300. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  301. package/lib/sync/utils/downloadByRoot.js +16 -2
  302. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  303. package/lib/sync/utils/pendingBlocksTree.d.ts +0 -1
  304. package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -1
  305. package/lib/sync/utils/pendingBlocksTree.js +0 -9
  306. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  307. package/lib/sync/utils/rateLimit.d.ts +2 -0
  308. package/lib/sync/utils/rateLimit.d.ts.map +1 -0
  309. package/lib/sync/utils/rateLimit.js +15 -0
  310. package/lib/sync/utils/rateLimit.js.map +1 -0
  311. package/lib/util/sszBytes.d.ts.map +1 -1
  312. package/lib/util/sszBytes.js +20 -5
  313. package/lib/util/sszBytes.js.map +1 -1
  314. package/package.json +17 -17
  315. package/src/api/impl/beacon/blocks/index.ts +22 -9
  316. package/src/api/impl/beacon/pool/index.ts +83 -1
  317. package/src/api/impl/beacon/state/utils.ts +2 -2
  318. package/src/api/impl/debug/index.ts +0 -1
  319. package/src/api/impl/lodestar/index.ts +1 -1
  320. package/src/api/impl/validator/index.ts +82 -5
  321. package/src/chain/GetBlobsTracker.ts +1 -2
  322. package/src/chain/archiveStore/archiveStore.ts +5 -5
  323. package/src/chain/archiveStore/interface.ts +4 -4
  324. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +4 -4
  325. package/src/chain/archiveStore/utils/archiveBlocks.ts +153 -94
  326. package/src/chain/blocks/blockInput/blockInput.ts +4 -1
  327. package/src/chain/blocks/importBlock.ts +16 -56
  328. package/src/chain/blocks/importExecutionPayload.ts +127 -107
  329. package/src/chain/blocks/index.ts +71 -23
  330. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +64 -3
  331. package/src/chain/blocks/payloadEnvelopeInput/types.ts +18 -0
  332. package/src/chain/blocks/payloadEnvelopeProcessor.ts +7 -6
  333. package/src/chain/blocks/types.ts +15 -25
  334. package/src/chain/blocks/utils/chainSegment.ts +117 -17
  335. package/src/chain/blocks/verifyBlock.ts +70 -9
  336. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +6 -4
  337. package/src/chain/blocks/verifyBlocksSanityChecks.ts +26 -7
  338. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +137 -0
  339. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +41 -0
  340. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +9 -18
  341. package/src/chain/chain.ts +65 -26
  342. package/src/chain/emitter.ts +15 -14
  343. package/src/chain/errors/blockError.ts +4 -1
  344. package/src/chain/errors/executionPayloadBid.ts +6 -0
  345. package/src/chain/errors/executionPayloadEnvelope.ts +6 -0
  346. package/src/chain/errors/index.ts +1 -0
  347. package/src/chain/errors/proposerPreferences.ts +47 -0
  348. package/src/chain/forkChoice/index.ts +8 -24
  349. package/src/chain/initState.ts +9 -1
  350. package/src/chain/interface.ts +11 -3
  351. package/src/chain/lightClient/index.ts +6 -6
  352. package/src/chain/opPools/payloadAttestationPool.ts +63 -18
  353. package/src/chain/prepareNextSlot.ts +53 -18
  354. package/src/chain/produceBlock/produceBlockBody.ts +91 -21
  355. package/src/chain/regen/interface.ts +1 -0
  356. package/src/chain/regen/queued.ts +2 -7
  357. package/src/chain/regen/regen.ts +2 -7
  358. package/src/chain/seenCache/index.ts +1 -0
  359. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +89 -21
  360. package/src/chain/seenCache/seenProposerPreferences.ts +32 -0
  361. package/src/chain/stateCache/persistentCheckpointsCache.ts +4 -1
  362. package/src/chain/validation/block.ts +1 -0
  363. package/src/chain/validation/executionPayloadBid.ts +25 -8
  364. package/src/chain/validation/executionPayloadEnvelope.ts +20 -10
  365. package/src/chain/validation/payloadAttestationMessage.ts +11 -7
  366. package/src/chain/validation/proposerPreferences.ts +110 -0
  367. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +1 -1
  368. package/src/execution/engine/http.ts +21 -14
  369. package/src/execution/engine/interface.ts +1 -0
  370. package/src/execution/engine/mock.ts +8 -1
  371. package/src/execution/engine/types.ts +41 -0
  372. package/src/metrics/metrics/lodestar.ts +10 -0
  373. package/src/network/gossip/interface.ts +6 -0
  374. package/src/network/gossip/scoringParameters.ts +14 -1
  375. package/src/network/gossip/topic.ts +6 -0
  376. package/src/network/interface.ts +2 -0
  377. package/src/network/network.ts +24 -1
  378. package/src/network/processor/gossipHandlers.ts +116 -30
  379. package/src/network/processor/gossipQueues/index.ts +5 -0
  380. package/src/network/processor/index.ts +6 -5
  381. package/src/network/reqresp/ReqRespBeaconNode.ts +1 -0
  382. package/src/network/reqresp/handlers/beaconBlocksByHead.ts +91 -0
  383. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +14 -6
  384. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +11 -5
  385. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +17 -5
  386. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +7 -4
  387. package/src/network/reqresp/handlers/index.ts +5 -0
  388. package/src/network/reqresp/interface.ts +1 -1
  389. package/src/network/reqresp/protocols.ts +6 -0
  390. package/src/network/reqresp/rateLimit.ts +4 -0
  391. package/src/network/reqresp/score.ts +1 -0
  392. package/src/network/reqresp/types.ts +5 -0
  393. package/src/node/nodejs.ts +6 -4
  394. package/src/sync/constants.ts +8 -4
  395. package/src/sync/range/batch.ts +388 -75
  396. package/src/sync/range/chain.ts +131 -14
  397. package/src/sync/range/range.ts +86 -11
  398. package/src/sync/range/utils/peerBalancer.ts +9 -3
  399. package/src/sync/sync.ts +13 -1
  400. package/src/sync/types.ts +72 -0
  401. package/src/sync/unknownBlock.ts +915 -65
  402. package/src/sync/utils/downloadByRange.ts +386 -39
  403. package/src/sync/utils/downloadByRoot.ts +24 -2
  404. package/src/sync/utils/pendingBlocksTree.ts +0 -15
  405. package/src/sync/utils/rateLimit.ts +16 -0
  406. package/src/util/sszBytes.ts +25 -5
@@ -0,0 +1,41 @@
1
+ import {DataAvailabilityStatus} from "@lodestar/state-transition";
2
+ import {gloas} from "@lodestar/types";
3
+ import {PayloadEnvelopeInput} from "../seenCache/seenPayloadEnvelopeInput.js";
4
+
5
+ // we can now wait for full 12 seconds because sync and reconstruction will try pulling
6
+ // the data columns from the network anyway while the envelope is being processed
7
+ export const PAYLOAD_DATA_AVAILABILITY_TIMEOUT = 12_000;
8
+
9
+ /**
10
+ * Verifies that all payload envelope inputs have their data columns available.
11
+ * - Waits a max of PAYLOAD_DATA_AVAILABILITY_TIMEOUT for all data to be available
12
+ * - Returns the time at which all data was available
13
+ * - Returns the data availability status for each payload input
14
+ */
15
+ export async function verifyPayloadsDataAvailability(
16
+ payloadInputs: PayloadEnvelopeInput[],
17
+ signal: AbortSignal
18
+ ): Promise<{
19
+ dataAvailabilityStatuses: DataAvailabilityStatus[];
20
+ availableTime: number;
21
+ }> {
22
+ const promises: Promise<gloas.DataColumnSidecar[]>[] = [];
23
+ for (const payloadInput of payloadInputs) {
24
+ if (!payloadInput.hasAllData()) {
25
+ promises.push(payloadInput.waitForAllData(PAYLOAD_DATA_AVAILABILITY_TIMEOUT, signal));
26
+ }
27
+ }
28
+ await Promise.all(promises);
29
+
30
+ const availableTime = Math.max(0, Math.max(...payloadInputs.map((payloadInput) => payloadInput.getTimeComplete())));
31
+ const dataAvailabilityStatuses: DataAvailabilityStatus[] = payloadInputs.map((payloadInput) => {
32
+ if (payloadInput.daOutOfRange) {
33
+ return DataAvailabilityStatus.OutOfRange;
34
+ }
35
+ return payloadInput.getBlobKzgCommitments().length === 0
36
+ ? DataAvailabilityStatus.NotRequired
37
+ : DataAvailabilityStatus.Available;
38
+ });
39
+
40
+ return {dataAvailabilityStatuses, availableTime};
41
+ }
@@ -5,7 +5,7 @@ import {writeDataColumnsToDb} from "./writeBlockInputToDb.js";
5
5
  /**
6
6
  * Persists payload envelope data to DB. This operation must be eventually completed if a payload is imported.
7
7
  *
8
- * TODO GLOAS: Persist envelope metadata (stateRoot, executionRequests, builderIndex, etc.) without the full
8
+ * TODO GLOAS: Persist envelope metadata (executionRequests, builderIndex, etc.) without the full
9
9
  * execution payload body — only keep the blockHash reference. The EL already stores the payload.
10
10
  * See https://github.com/ChainSafe/lodestar/issues/5671
11
11
  */
@@ -33,23 +33,14 @@ export async function persistPayloadEnvelopeInput(
33
33
  this: BeaconChain,
34
34
  payloadInput: PayloadEnvelopeInput
35
35
  ): Promise<void> {
36
- await writePayloadEnvelopeInputToDb
37
- .call(this, payloadInput)
38
- .catch((e) => {
39
- this.logger.error(
40
- "Error persisting payload envelope in hot db",
41
- {
42
- slot: payloadInput.slot,
43
- root: payloadInput.blockRootHex,
44
- },
45
- e
46
- );
47
- })
48
- .finally(() => {
49
- this.seenPayloadEnvelopeInputCache.prune(payloadInput.blockRootHex);
50
- this.logger.debug("Pruned payload envelope input", {
36
+ await writePayloadEnvelopeInputToDb.call(this, payloadInput).catch((e) => {
37
+ this.logger.error(
38
+ "Error persisting payload envelope in hot db",
39
+ {
51
40
  slot: payloadInput.slot,
52
41
  root: payloadInput.blockRootHex,
53
- });
54
- });
42
+ },
43
+ e
44
+ );
45
+ });
55
46
  }
@@ -2,7 +2,7 @@ import path from "node:path";
2
2
  import {PrivateKey} from "@libp2p/interface";
3
3
  import {Type} from "@chainsafe/ssz";
4
4
  import {BeaconConfig} from "@lodestar/config";
5
- import {CheckpointWithPayloadStatus, IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
5
+ import {CheckpointWithHex, IForkChoice, ProtoBlock, UpdateHeadOpt} from "@lodestar/fork-choice";
6
6
  import {LoggerNode} from "@lodestar/logger/node";
7
7
  import {
8
8
  EFFECTIVE_BALANCE_INCREMENT,
@@ -23,6 +23,7 @@ import {
23
23
  getEffectiveBalancesFromStateBytes,
24
24
  isStatePostAltair,
25
25
  isStatePostElectra,
26
+ isStatePostGloas,
26
27
  } from "@lodestar/state-transition";
27
28
  import {
28
29
  BeaconBlock,
@@ -39,6 +40,7 @@ import {
39
40
  ValidatorIndex,
40
41
  Wei,
41
42
  deneb,
43
+ electra,
42
44
  gloas,
43
45
  isBlindedBeaconBlock,
44
46
  phase0,
@@ -105,6 +107,7 @@ import {
105
107
  SeenExecutionPayloadBids,
106
108
  SeenPayloadAttesters,
107
109
  SeenPayloadEnvelopeInput,
110
+ SeenProposerPreferences,
108
111
  SeenSyncCommitteeMessages,
109
112
  } from "./seenCache/index.js";
110
113
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -185,6 +188,7 @@ export class BeaconChain implements IBeaconChain {
185
188
  readonly seenPayloadAttesters = new SeenPayloadAttesters();
186
189
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
187
190
  readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
191
+ readonly seenProposerPreferences = new SeenProposerPreferences();
188
192
  readonly seenBlockProposers = new SeenBlockProposers();
189
193
  readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
190
194
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -332,13 +336,6 @@ export class BeaconChain implements IBeaconChain {
332
336
  metrics,
333
337
  logger,
334
338
  });
335
- this.seenPayloadEnvelopeInputCache = new SeenPayloadEnvelopeInput({
336
- chainEvents: emitter,
337
- signal,
338
- serializedCache: this.serializedCache,
339
- metrics,
340
- logger,
341
- });
342
339
 
343
340
  this._earliestAvailableSlot = anchorState.slot;
344
341
 
@@ -394,6 +391,7 @@ export class BeaconChain implements IBeaconChain {
394
391
  metrics,
395
392
  logger
396
393
  );
394
+
397
395
  const regen = new QueuedStateRegenerator({
398
396
  config,
399
397
  forkChoice,
@@ -418,6 +416,33 @@ export class BeaconChain implements IBeaconChain {
418
416
  this.payloadEnvelopeProcessor = new PayloadEnvelopeProcessor(this, metrics, signal);
419
417
 
420
418
  this.forkChoice = forkChoice;
419
+
420
+ this.seenPayloadEnvelopeInputCache = new SeenPayloadEnvelopeInput({
421
+ config,
422
+ clock,
423
+ forkChoice,
424
+ chainEvents: emitter,
425
+ signal,
426
+ serializedCache: this.serializedCache,
427
+ metrics,
428
+ logger,
429
+ });
430
+
431
+ const anchorBlockSlot = anchorState.latestBlockHeader.slot;
432
+ if (isStatePostGloas(anchorState) && anchorBlockSlot > 0) {
433
+ const anchorBid = anchorState.latestExecutionPayloadBid;
434
+ this.seenPayloadEnvelopeInputCache.addFromBid({
435
+ blockRootHex: toRootHex(checkpoint.root),
436
+ slot: anchorBlockSlot,
437
+ forkName: anchorState.forkName,
438
+ proposerIndex: anchorState.latestBlockHeader.proposerIndex,
439
+ bid: anchorBid,
440
+ sampledColumns: this.custodyConfig.sampledColumns,
441
+ custodyColumns: this.custodyConfig.custodyColumns,
442
+ timeCreatedSec: Math.floor(Date.now() / 1000),
443
+ });
444
+ }
445
+
421
446
  this.clock = clock;
422
447
  this.regen = regen;
423
448
  this.bls = bls;
@@ -680,7 +705,7 @@ export class BeaconChain implements IBeaconChain {
680
705
  }
681
706
 
682
707
  getStateByCheckpoint(
683
- checkpoint: CheckpointWithPayloadStatus
708
+ checkpoint: CheckpointWithHex
684
709
  ): {state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean} | null {
685
710
  // finalized or justified checkpoint states maynot be available with PersistentCheckpointStateCache, use getCheckpointStateOrBytes() api to get Uint8Array
686
711
  const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
@@ -701,7 +726,7 @@ export class BeaconChain implements IBeaconChain {
701
726
  }
702
727
 
703
728
  async getStateOrBytesByCheckpoint(
704
- checkpoint: CheckpointWithPayloadStatus
729
+ checkpoint: CheckpointWithHex
705
730
  ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
706
731
  const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
707
732
  const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHex);
@@ -886,6 +911,21 @@ export class BeaconChain implements IBeaconChain {
886
911
  );
887
912
  }
888
913
 
914
+ async getParentExecutionRequests(
915
+ parentBlockSlot: Slot,
916
+ parentBlockRootHex: RootHex
917
+ ): Promise<electra.ExecutionRequests> {
918
+ // at the fork boundary, parent is pre-gloas
919
+ if (!isForkPostGloas(this.config.getForkName(parentBlockSlot))) {
920
+ return ssz.electra.ExecutionRequests.defaultValue();
921
+ }
922
+ const envelope = await this.getExecutionPayloadEnvelope(parentBlockSlot, parentBlockRootHex);
923
+ if (envelope === null) {
924
+ throw Error(`Parent execution payload envelope not found slot=${parentBlockSlot}, root=${parentBlockRootHex}`);
925
+ }
926
+ return envelope.message.executionRequests;
927
+ }
928
+
889
929
  async getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<DataColumnSidecar[]> {
890
930
  const fork = this.config.getForkName(blockSlot);
891
931
 
@@ -1082,11 +1122,15 @@ export class BeaconChain implements IBeaconChain {
1082
1122
  }
1083
1123
 
1084
1124
  async processBlock(block: IBlockInput, opts?: ImportBlockOpts): Promise<void> {
1085
- return this.blockProcessor.processBlocksJob([block], opts);
1125
+ return this.blockProcessor.processBlocksJob([block], null, opts);
1086
1126
  }
1087
1127
 
1088
- async processChainSegment(blocks: IBlockInput[], opts?: ImportBlockOpts): Promise<void> {
1089
- return this.blockProcessor.processBlocksJob(blocks, opts);
1128
+ async processChainSegment(
1129
+ blocks: IBlockInput[],
1130
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
1131
+ opts?: ImportBlockOpts
1132
+ ): Promise<void> {
1133
+ await this.blockProcessor.processBlocksJob(blocks, payloadEnvelopes, opts);
1090
1134
  }
1091
1135
 
1092
1136
  async processExecutionPayload(payloadInput: PayloadEnvelopeInput, opts?: ImportPayloadOpts): Promise<void> {
@@ -1277,7 +1321,7 @@ export class BeaconChain implements IBeaconChain {
1277
1321
  * @param blockState state that declares justified checkpoint `checkpoint`
1278
1322
  */
1279
1323
  private justifiedBalancesGetter(
1280
- checkpoint: CheckpointWithPayloadStatus,
1324
+ checkpoint: CheckpointWithHex,
1281
1325
  blockState: IBeaconStateView
1282
1326
  ): EffectiveBalanceIncrements {
1283
1327
  this.metrics?.balancesCache.requests.inc();
@@ -1316,7 +1360,7 @@ export class BeaconChain implements IBeaconChain {
1316
1360
  * @param blockState state that declares justified checkpoint `checkpoint`
1317
1361
  */
1318
1362
  private closestJustifiedBalancesStateToCheckpoint(
1319
- checkpoint: CheckpointWithPayloadStatus,
1363
+ checkpoint: CheckpointWithHex,
1320
1364
  blockState: IBeaconStateView
1321
1365
  ): {state: IBeaconStateView; stateId: string; shouldWarn: boolean} {
1322
1366
  const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
@@ -1331,10 +1375,7 @@ export class BeaconChain implements IBeaconChain {
1331
1375
  }
1332
1376
 
1333
1377
  // Find a state in the same branch of checkpoint at same epoch. Balances should exactly the same
1334
- for (const descendantBlock of this.forkChoice.forwardIterateDescendants(
1335
- checkpoint.rootHex,
1336
- checkpoint.payloadStatus
1337
- )) {
1378
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1338
1379
  if (computeEpochAtSlot(descendantBlock.slot) === checkpoint.epoch) {
1339
1380
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1340
1381
  if (descendantBlockState) {
@@ -1350,10 +1391,7 @@ export class BeaconChain implements IBeaconChain {
1350
1391
 
1351
1392
  // Find a state in the same branch of checkpoint at a latter epoch. Balances are not the same, but should be close
1352
1393
  // Note: must call .forwardIterateDescendants() again since nodes are not sorted
1353
- for (const descendantBlock of this.forkChoice.forwardIterateDescendants(
1354
- checkpoint.rootHex,
1355
- checkpoint.payloadStatus
1356
- )) {
1394
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1357
1395
  if (computeEpochAtSlot(descendantBlock.slot) > checkpoint.epoch) {
1358
1396
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1359
1397
  if (descendantBlockState) {
@@ -1423,6 +1461,7 @@ export class BeaconChain implements IBeaconChain {
1423
1461
  this.payloadAttestationPool.prune(slot);
1424
1462
  this.executionPayloadBidPool.prune(slot);
1425
1463
  this.seenExecutionPayloadBids.prune(slot);
1464
+ this.seenProposerPreferences.prune(slot);
1426
1465
  this.seenAttestationDatas.onSlot(slot);
1427
1466
  this.reprocessController.onSlot(slot);
1428
1467
 
@@ -1457,7 +1496,7 @@ export class BeaconChain implements IBeaconChain {
1457
1496
  this.seenContributionAndProof.prune(head.slot);
1458
1497
  }
1459
1498
 
1460
- private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithPayloadStatus): void {
1499
+ private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
1461
1500
  this.logger.verbose("Fork choice justified", {epoch: cp.epoch, root: cp.rootHex});
1462
1501
  }
1463
1502
 
@@ -1468,7 +1507,7 @@ export class BeaconChain implements IBeaconChain {
1468
1507
  });
1469
1508
  }
1470
1509
 
1471
- private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithPayloadStatus): Promise<void> {
1510
+ private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1472
1511
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1473
1512
  const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1474
1513
  this.seenBlockProposers.prune(finalizedSlot);
@@ -1509,7 +1548,7 @@ export class BeaconChain implements IBeaconChain {
1509
1548
  }
1510
1549
  }
1511
1550
 
1512
- private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithPayloadStatus): Promise<void> {
1551
+ private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithHex): Promise<void> {
1513
1552
  if (this.custodyConfig.targetCustodyGroupCount === this.config.NUMBER_OF_CUSTODY_GROUPS) {
1514
1553
  // Custody requirements can only be increased, we can disable dynamic custody updates
1515
1554
  // if the node already maintains custody of all custody groups in case it is configured
@@ -1,12 +1,12 @@
1
1
  import {EventEmitter} from "node:events";
2
2
  import {StrictEventEmitter} from "strict-event-emitter-types";
3
3
  import {routes} from "@lodestar/api";
4
- import {CheckpointWithPayloadStatus} from "@lodestar/fork-choice";
4
+ import {CheckpointWithHex} from "@lodestar/fork-choice";
5
5
  import {IBeaconStateView} from "@lodestar/state-transition";
6
6
  import {DataColumnSidecar, RootHex, deneb, phase0} from "@lodestar/types";
7
- import {SignedExecutionPayloadEnvelope} from "@lodestar/types/gloas";
8
7
  import {PeerIdStr} from "../util/peerId.js";
9
8
  import {BlockInputSource, IBlockInput} from "./blocks/blockInput/types.js";
9
+ import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
10
10
 
11
11
  /**
12
12
  * Important chain events that occur during normal chain operation.
@@ -59,10 +59,6 @@ export enum ChainEvent {
59
59
  * Post-gloas, missing parent could be a SignedBeaconBlock and/or a SignedExecutionPayloadEnvelope
60
60
  */
61
61
  blockUnknownParent = "blockUnknownParent",
62
- /**
63
- * Trigger BlockInputSync to find a SignedBeaconBlock given a SignedExecutionPayloadEnvelop received
64
- */
65
- envelopeUnknownBlock = "envelopeUnknownBlock",
66
62
  /**
67
63
  * Trigger BlockInputSync to find a SignedBeaconBlock with specified block root.
68
64
  */
@@ -76,6 +72,11 @@ export enum ChainEvent {
76
72
  * cut-off window passes for waiting on gossip
77
73
  */
78
74
  incompleteBlockInput = "incompleteBlockInput",
75
+ /**
76
+ * Post-gloas: trigger BlockInputSync for payload envelopes whose envelope and/or sampled columns are partially
77
+ * received via gossip but are not complete by time the cut-off window passes for waiting on gossip
78
+ */
79
+ incompletePayloadEnvelope = "incompletePayloadEnvelope",
79
80
  }
80
81
 
81
82
  export type HeadEventData = routes.events.EventData[routes.events.EventType.head];
@@ -86,21 +87,21 @@ type ApiEvents = {[K in routes.events.EventType]: (data: routes.events.EventData
86
87
 
87
88
  export type ChainEventData = {
88
89
  [ChainEvent.blockUnknownParent]: {blockInput: IBlockInput; peer: PeerIdStr; source: BlockInputSource};
89
- [ChainEvent.envelopeUnknownBlock]: {
90
- envelope: SignedExecutionPayloadEnvelope;
91
- peer?: PeerIdStr;
92
- source: BlockInputSource;
93
- };
94
90
  [ChainEvent.unknownBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
95
91
  [ChainEvent.incompleteBlockInput]: {blockInput: IBlockInput; peer: PeerIdStr; source: BlockInputSource};
92
+ [ChainEvent.incompletePayloadEnvelope]: {
93
+ payloadInput: PayloadEnvelopeInput;
94
+ peer: PeerIdStr;
95
+ source: BlockInputSource;
96
+ };
96
97
  [ChainEvent.unknownEnvelopeBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
97
98
  };
98
99
 
99
100
  export type IChainEvents = ApiEvents & {
100
101
  [ChainEvent.checkpoint]: (checkpoint: phase0.Checkpoint, state: IBeaconStateView) => void;
101
102
 
102
- [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithPayloadStatus) => void;
103
- [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithPayloadStatus) => void;
103
+ [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithHex) => void;
104
+ [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithHex) => void;
104
105
 
105
106
  [ChainEvent.updateTargetCustodyGroupCount]: (targetGroupCount: number) => void;
106
107
 
@@ -113,9 +114,9 @@ export type IChainEvents = ApiEvents & {
113
114
  // Sync events that are chain->chain. Initiated from network requests but do not cross the network
114
115
  // barrier so are considered ChainEvent(s).
115
116
  [ChainEvent.blockUnknownParent]: (data: ChainEventData[ChainEvent.blockUnknownParent]) => void;
116
- [ChainEvent.envelopeUnknownBlock]: (data: ChainEventData[ChainEvent.envelopeUnknownBlock]) => void;
117
117
  [ChainEvent.unknownBlockRoot]: (data: ChainEventData[ChainEvent.unknownBlockRoot]) => void;
118
118
  [ChainEvent.incompleteBlockInput]: (data: ChainEventData[ChainEvent.incompleteBlockInput]) => void;
119
+ [ChainEvent.incompletePayloadEnvelope]: (data: ChainEventData[ChainEvent.incompletePayloadEnvelope]) => void;
119
120
  [ChainEvent.unknownEnvelopeBlockRoot]: (data: ChainEventData[ChainEvent.unknownEnvelopeBlockRoot]) => void;
120
121
  };
121
122
 
@@ -74,6 +74,8 @@ export enum BlockErrorCode {
74
74
  PARENT_EXECUTION_INVALID = "BLOCK_ERROR_PARENT_EXECUTION_INVALID",
75
75
  /** The block's parent execution payload (defined by bid.parent_block_hash) has not been seen */
76
76
  PARENT_PAYLOAD_UNKNOWN = "BLOCK_ERROR_PARENT_PAYLOAD_UNKNOWN",
77
+ /** An execution payload envelope in the chain segment references a block root that does not match its slot's block */
78
+ ENVELOPE_BLOCK_ROOT_MISMATCH = "BLOCK_ERROR_ENVELOPE_BLOCK_ROOT_MISMATCH",
77
79
  }
78
80
 
79
81
  type ExecutionErrorStatus = Exclude<
@@ -107,6 +109,7 @@ export type BlockErrorType =
107
109
  | {code: BlockErrorCode.NOT_LATER_THAN_PARENT; parentSlot: Slot; slot: Slot}
108
110
  | {code: BlockErrorCode.NON_LINEAR_PARENT_ROOTS}
109
111
  | {code: BlockErrorCode.NON_LINEAR_SLOTS}
112
+ | {code: BlockErrorCode.ENVELOPE_BLOCK_ROOT_MISMATCH; envelopeBlockRoot: RootHex; blockRoot: RootHex}
110
113
  | {code: BlockErrorCode.PER_BLOCK_PROCESSING_ERROR; error: Error}
111
114
  | {code: BlockErrorCode.BEACON_CHAIN_ERROR; error: Error}
112
115
  | {code: BlockErrorCode.KNOWN_BAD_BLOCK}
@@ -120,7 +123,7 @@ export type BlockErrorType =
120
123
  | {code: BlockErrorCode.TOO_MANY_KZG_COMMITMENTS; blobKzgCommitmentsLen: number; commitmentLimit: number}
121
124
  | {code: BlockErrorCode.BID_PARENT_ROOT_MISMATCH; bidParentRoot: RootHex; blockParentRoot: RootHex}
122
125
  | {code: BlockErrorCode.PARENT_EXECUTION_INVALID; parentRoot: RootHex}
123
- | {code: BlockErrorCode.PARENT_PAYLOAD_UNKNOWN; parentBlockHash: RootHex};
126
+ | {code: BlockErrorCode.PARENT_PAYLOAD_UNKNOWN; parentRoot: RootHex; parentBlockHash: RootHex};
124
127
 
125
128
  export class BlockGossipError extends GossipActionError<BlockErrorType> {}
126
129
 
@@ -7,6 +7,7 @@ export enum ExecutionPayloadBidErrorCode {
7
7
  BID_ALREADY_KNOWN = "EXECUTION_PAYLOAD_BID_ERROR_BID_ALREADY_KNOWN",
8
8
  BID_TOO_LOW = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_LOW",
9
9
  BID_TOO_HIGH = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_HIGH",
10
+ TOO_MANY_KZG_COMMITMENTS = "EXECUTION_PAYLOAD_BID_ERROR_TOO_MANY_KZG_COMMITMENTS",
10
11
  UNKNOWN_BLOCK_ROOT = "EXECUTION_PAYLOAD_BID_ERROR_UNKNOWN_BLOCK_ROOT",
11
12
  INVALID_SLOT = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SLOT",
12
13
  INVALID_SIGNATURE = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SIGNATURE",
@@ -28,6 +29,11 @@ export type ExecutionPayloadBidErrorType =
28
29
  }
29
30
  | {code: ExecutionPayloadBidErrorCode.BID_TOO_LOW; bidValue: number; currentHighestBid: number}
30
31
  | {code: ExecutionPayloadBidErrorCode.BID_TOO_HIGH; bidValue: number; builderBalance: number}
32
+ | {
33
+ code: ExecutionPayloadBidErrorCode.TOO_MANY_KZG_COMMITMENTS;
34
+ blobKzgCommitmentsLen: number;
35
+ commitmentLimit: number;
36
+ }
31
37
  | {code: ExecutionPayloadBidErrorCode.UNKNOWN_BLOCK_ROOT; parentBlockRoot: RootHex}
32
38
  | {code: ExecutionPayloadBidErrorCode.INVALID_SLOT; builderIndex: BuilderIndex; slot: Slot}
33
39
  | {code: ExecutionPayloadBidErrorCode.INVALID_SIGNATURE; builderIndex: BuilderIndex; slot: Slot};
@@ -11,6 +11,7 @@ export enum ExecutionPayloadEnvelopeErrorCode {
11
11
  SLOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_SLOT_MISMATCH",
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
+ EXECUTION_REQUESTS_ROOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_EXECUTION_REQUESTS_ROOT_MISMATCH",
14
15
  INVALID_SIGNATURE = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_SIGNATURE",
15
16
  PAYLOAD_ENVELOPE_INPUT_MISSING = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_PAYLOAD_ENVELOPE_INPUT_MISSING",
16
17
  }
@@ -36,6 +37,11 @@ export type ExecutionPayloadEnvelopeErrorType =
36
37
  envelopeBlockHash: RootHex;
37
38
  bidBlockHash: RootHex | null;
38
39
  }
40
+ | {
41
+ code: ExecutionPayloadEnvelopeErrorCode.EXECUTION_REQUESTS_ROOT_MISMATCH;
42
+ envelopeRequestsRoot: RootHex;
43
+ bidRequestsRoot: RootHex;
44
+ }
39
45
  | {code: ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE}
40
46
  | {code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING; blockRoot: RootHex};
41
47
 
@@ -8,6 +8,7 @@ export * from "./executionPayloadBid.js";
8
8
  export * from "./executionPayloadEnvelope.js";
9
9
  export * from "./gossipValidation.js";
10
10
  export * from "./payloadAttestation.js";
11
+ export * from "./proposerPreferences.js";
11
12
  export * from "./proposerSlashingError.js";
12
13
  export * from "./syncCommitteeError.js";
13
14
  export * from "./voluntaryExitError.js";
@@ -0,0 +1,47 @@
1
+ import {RootHex, Slot, ValidatorIndex} from "@lodestar/types";
2
+ import {GossipActionError} from "./gossipValidation.js";
3
+
4
+ export enum ProposerPreferencesErrorCode {
5
+ INVALID_EPOCH = "PROPOSER_PREFERENCES_ERROR_INVALID_EPOCH",
6
+ PROPOSAL_SLOT_PASSED = "PROPOSER_PREFERENCES_ERROR_PROPOSAL_SLOT_PASSED",
7
+ UNKNOWN_DEPENDENT_ROOT = "PROPOSER_PREFERENCES_ERROR_UNKNOWN_DEPENDENT_ROOT",
8
+ INVALID_PROPOSER = "PROPOSER_PREFERENCES_ERROR_INVALID_PROPOSER",
9
+ ALREADY_KNOWN = "PROPOSER_PREFERENCES_ERROR_ALREADY_KNOWN",
10
+ INVALID_SIGNATURE = "PROPOSER_PREFERENCES_ERROR_INVALID_SIGNATURE",
11
+ }
12
+
13
+ export type ProposerPreferencesErrorType =
14
+ | {
15
+ code: ProposerPreferencesErrorCode.INVALID_EPOCH;
16
+ proposalSlot: Slot;
17
+ currentEpoch: number;
18
+ }
19
+ | {
20
+ code: ProposerPreferencesErrorCode.PROPOSAL_SLOT_PASSED;
21
+ proposalSlot: Slot;
22
+ currentSlot: Slot;
23
+ }
24
+ | {
25
+ code: ProposerPreferencesErrorCode.UNKNOWN_DEPENDENT_ROOT;
26
+ proposalSlot: Slot;
27
+ dependentRoot: RootHex;
28
+ }
29
+ | {
30
+ code: ProposerPreferencesErrorCode.INVALID_PROPOSER;
31
+ proposalSlot: Slot;
32
+ validatorIndex: ValidatorIndex;
33
+ dependentRoot: RootHex;
34
+ }
35
+ | {
36
+ code: ProposerPreferencesErrorCode.ALREADY_KNOWN;
37
+ proposalSlot: Slot;
38
+ validatorIndex: ValidatorIndex;
39
+ dependentRoot: RootHex;
40
+ }
41
+ | {
42
+ code: ProposerPreferencesErrorCode.INVALID_SIGNATURE;
43
+ proposalSlot: Slot;
44
+ validatorIndex: ValidatorIndex;
45
+ };
46
+
47
+ export class ProposerPreferencesError extends GossipActionError<ProposerPreferencesErrorType> {}
@@ -8,7 +8,6 @@ import {
8
8
  ProtoArray,
9
9
  ProtoBlock,
10
10
  ForkChoiceOpts as RawForkChoiceOpts,
11
- getCheckpointPayloadStatus,
12
11
  } from "@lodestar/fork-choice";
13
12
  import {ZERO_HASH_HEX} from "@lodestar/params";
14
13
  import {
@@ -104,16 +103,6 @@ export function initializeForkChoiceFromFinalizedState(
104
103
 
105
104
  const isForkPostGloas = computeEpochAtSlot(state.slot) >= config.GLOAS_FORK_EPOCH;
106
105
 
107
- // Determine justified checkpoint payload status
108
- const justifiedPayloadStatus = isForkPostGloas
109
- ? PayloadStatus.PENDING
110
- : getCheckpointPayloadStatus(config, state, justifiedCheckpoint.epoch);
111
-
112
- // Determine finalized checkpoint payload status
113
- const finalizedPayloadStatus = isForkPostGloas
114
- ? PayloadStatus.PENDING
115
- : getCheckpointPayloadStatus(config, state, finalizedCheckpoint.epoch);
116
-
117
106
  return new forkchoiceConstructor(
118
107
  config,
119
108
 
@@ -123,8 +112,6 @@ export function initializeForkChoiceFromFinalizedState(
123
112
  finalizedCheckpoint,
124
113
  justifiedBalances,
125
114
  justifiedBalancesGetter,
126
- justifiedPayloadStatus,
127
- finalizedPayloadStatus,
128
115
  {
129
116
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
130
117
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
@@ -150,7 +137,9 @@ export function initializeForkChoiceFromFinalizedState(
150
137
 
151
138
  ...(isStatePostBellatrix(state) && state.isExecutionStateType && state.isMergeTransitionComplete
152
139
  ? {
153
- executionPayloadBlockHash: toRootHex(state.latestBlockHash),
140
+ executionPayloadBlockHash: isStatePostGloas(state)
141
+ ? toRootHex(state.latestBlockHash)
142
+ : toRootHex(state.latestExecutionPayloadHeader.blockHash),
154
143
  // TODO GLOAS: executionPayloadNumber is not tracked in BeaconState post-gloas (EIP-7732 removed
155
144
  // latestExecutionPayloadHeader). Using 0 as unavailable fallback until a solution is found.
156
145
  executionPayloadNumber: isStatePostGloas(state) ? 0 : state.payloadBlockNumber,
@@ -159,7 +148,7 @@ export function initializeForkChoiceFromFinalizedState(
159
148
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
160
149
 
161
150
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
162
- payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL, // TODO GLOAS: Post-gloas how do we know if the checkpoint payload is FULL or EMPTY?
151
+ payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL,
163
152
  parentBlockHash: isStatePostGloas(state) ? toRootHex(state.latestBlockHash) : null,
164
153
  },
165
154
  currentSlot
@@ -206,19 +195,12 @@ export function initializeForkChoiceFromUnfinalizedState(
206
195
 
207
196
  const isForkPostGloas = computeEpochAtSlot(unfinalizedState.slot) >= config.GLOAS_FORK_EPOCH;
208
197
 
209
- // For unfinalized state, use getCheckpointPayloadStatus to determine the correct status.
210
- // It checks state.execution_payload_availability to determine EMPTY vs FULL.
211
- const justifiedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, justifiedCheckpoint.epoch);
212
- const finalizedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, finalizedCheckpoint.epoch);
213
-
214
198
  const store = new ForkChoiceStore(
215
199
  currentSlot,
216
200
  justifiedCheckpoint,
217
201
  finalizedCheckpoint,
218
202
  justifiedBalances,
219
203
  justifiedBalancesGetter,
220
- justifiedPayloadStatus,
221
- finalizedPayloadStatus,
222
204
  {
223
205
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
224
206
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
@@ -247,7 +229,9 @@ export function initializeForkChoiceFromUnfinalizedState(
247
229
  unfinalizedState.isExecutionStateType &&
248
230
  unfinalizedState.isMergeTransitionComplete
249
231
  ? {
250
- executionPayloadBlockHash: toRootHex(unfinalizedState.latestBlockHash),
232
+ executionPayloadBlockHash: isStatePostGloas(unfinalizedState)
233
+ ? toRootHex(unfinalizedState.latestBlockHash)
234
+ : toRootHex(unfinalizedState.latestExecutionPayloadHeader.blockHash),
251
235
  // TODO GLOAS: executionPayloadNumber is not tracked in BeaconState post-gloas (EIP-7732 removed
252
236
  // latestExecutionPayloadHeader). Using 0 as unavailable fallback until a solution is found.
253
237
  executionPayloadNumber: isStatePostGloas(unfinalizedState) ? 0 : unfinalizedState.payloadBlockNumber,
@@ -256,7 +240,7 @@ export function initializeForkChoiceFromUnfinalizedState(
256
240
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
257
241
 
258
242
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
259
- payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL, // TODO GLOAS: Post-gloas how do we know if the checkpoint payload is FULL or EMPTY?
243
+ payloadStatus: isForkPostGloas ? PayloadStatus.PENDING : PayloadStatus.FULL,
260
244
  parentBlockHash: isStatePostGloas(unfinalizedState) ? toRootHex(unfinalizedState.latestBlockHash) : null,
261
245
  };
262
246
 
@@ -1,7 +1,8 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
- import {ZERO_HASH} from "@lodestar/params";
2
+ import {ForkPostGloas, ForkSeq, ZERO_HASH} from "@lodestar/params";
3
3
  import {
4
4
  BeaconStateAllForks,
5
+ BeaconStateGloas,
5
6
  IBeaconStateView,
6
7
  computeEpochAtSlot,
7
8
  computeStartSlotAtEpoch,
@@ -52,6 +53,13 @@ export function createGenesisBlock(config: ChainForkConfig, genesisState: Beacon
52
53
  const genesisBlock = types.SignedBeaconBlock.defaultValue();
53
54
  const stateRoot = genesisState.hashTreeRoot();
54
55
  genesisBlock.message.stateRoot = stateRoot;
56
+
57
+ if (config.getForkSeq(GENESIS_SLOT) >= ForkSeq.gloas) {
58
+ const gloasBlock = genesisBlock as SignedBeaconBlock<ForkPostGloas>;
59
+ const gloasState = genesisState as BeaconStateGloas;
60
+ gloasBlock.message.body.signedExecutionPayloadBid.message = gloasState.latestExecutionPayloadBid.toValue();
61
+ }
62
+
55
63
  return genesisBlock;
56
64
  }
57
65