@lodestar/beacon-node 1.43.0-dev.4fb05c546d → 1.43.0-dev.4fe6b362c9

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 (412) 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 +86 -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 +86 -17
  17. package/lib/api/impl/validator/index.js.map +1 -1
  18. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  19. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  20. package/lib/chain/archiveStore/interface.d.ts +4 -4
  21. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  22. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts +4 -4
  23. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -1
  24. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.js.map +1 -1
  25. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +2 -2
  26. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  27. package/lib/chain/archiveStore/utils/archiveBlocks.js +110 -58
  28. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  29. package/lib/chain/blocks/blockInput/blockInput.d.ts +3 -0
  30. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  31. package/lib/chain/blocks/blockInput/blockInput.js +4 -1
  32. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  33. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  34. package/lib/chain/blocks/importBlock.js +16 -28
  35. package/lib/chain/blocks/importBlock.js.map +1 -1
  36. package/lib/chain/blocks/importExecutionPayload.d.ts +32 -14
  37. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  38. package/lib/chain/blocks/importExecutionPayload.js +100 -91
  39. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  40. package/lib/chain/blocks/index.d.ts +5 -3
  41. package/lib/chain/blocks/index.d.ts.map +1 -1
  42. package/lib/chain/blocks/index.js +58 -26
  43. package/lib/chain/blocks/index.js.map +1 -1
  44. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +12 -1
  45. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  46. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +28 -2
  47. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  48. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +17 -0
  49. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  50. package/lib/chain/blocks/payloadEnvelopeProcessor.js +2 -2
  51. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  52. package/lib/chain/blocks/types.d.ts +15 -20
  53. package/lib/chain/blocks/types.d.ts.map +1 -1
  54. package/lib/chain/blocks/utils/chainSegment.d.ts +21 -2
  55. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  56. package/lib/chain/blocks/utils/chainSegment.js +92 -12
  57. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  58. package/lib/chain/blocks/verifyBlock.d.ts +5 -3
  59. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  60. package/lib/chain/blocks/verifyBlock.js +50 -7
  61. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  62. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +0 -4
  63. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  64. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -2
  65. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  66. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +2 -1
  67. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  68. package/lib/chain/blocks/verifyBlocksSanityChecks.js +25 -5
  69. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  70. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +24 -0
  71. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -0
  72. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +80 -0
  73. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -0
  74. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  75. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +8 -3
  76. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  77. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +1 -1
  78. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -1
  79. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +2 -11
  80. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -1
  81. package/lib/chain/chain.d.ts +10 -7
  82. package/lib/chain/chain.d.ts.map +1 -1
  83. package/lib/chain/chain.js +47 -15
  84. package/lib/chain/chain.js.map +1 -1
  85. package/lib/chain/emitter.d.ts +3 -14
  86. package/lib/chain/emitter.d.ts.map +1 -1
  87. package/lib/chain/emitter.js +0 -4
  88. package/lib/chain/emitter.js.map +1 -1
  89. package/lib/chain/errors/blockError.d.ts +8 -1
  90. package/lib/chain/errors/blockError.d.ts.map +1 -1
  91. package/lib/chain/errors/blockError.js +2 -0
  92. package/lib/chain/errors/blockError.js.map +1 -1
  93. package/lib/chain/errors/executionPayloadBid.d.ts +24 -1
  94. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  95. package/lib/chain/errors/executionPayloadBid.js +4 -0
  96. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  97. package/lib/chain/errors/executionPayloadEnvelope.d.ts +5 -0
  98. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  99. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  100. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  101. package/lib/chain/errors/index.d.ts +1 -0
  102. package/lib/chain/errors/index.d.ts.map +1 -1
  103. package/lib/chain/errors/index.js +1 -0
  104. package/lib/chain/errors/index.js.map +1 -1
  105. package/lib/chain/errors/proposerPreferences.d.ts +40 -0
  106. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -0
  107. package/lib/chain/errors/proposerPreferences.js +14 -0
  108. package/lib/chain/errors/proposerPreferences.js.map +1 -0
  109. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  110. package/lib/chain/forkChoice/index.js +5 -17
  111. package/lib/chain/forkChoice/index.js.map +1 -1
  112. package/lib/chain/initState.d.ts.map +1 -1
  113. package/lib/chain/initState.js +6 -1
  114. package/lib/chain/initState.js.map +1 -1
  115. package/lib/chain/interface.d.ts +9 -6
  116. package/lib/chain/interface.d.ts.map +1 -1
  117. package/lib/chain/interface.js.map +1 -1
  118. package/lib/chain/lightClient/index.d.ts.map +1 -1
  119. package/lib/chain/lightClient/index.js +1 -1
  120. package/lib/chain/lightClient/index.js.map +1 -1
  121. package/lib/chain/opPools/index.d.ts +1 -0
  122. package/lib/chain/opPools/index.d.ts.map +1 -1
  123. package/lib/chain/opPools/index.js +1 -0
  124. package/lib/chain/opPools/index.js.map +1 -1
  125. package/lib/chain/opPools/payloadAttestationPool.d.ts +4 -3
  126. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  127. package/lib/chain/opPools/payloadAttestationPool.js +56 -14
  128. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  129. package/lib/chain/opPools/proposerPreferencesPool.d.ts +29 -0
  130. package/lib/chain/opPools/proposerPreferencesPool.d.ts.map +1 -0
  131. package/lib/chain/opPools/proposerPreferencesPool.js +56 -0
  132. package/lib/chain/opPools/proposerPreferencesPool.js.map +1 -0
  133. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  134. package/lib/chain/prepareNextSlot.js +31 -13
  135. package/lib/chain/prepareNextSlot.js.map +1 -1
  136. package/lib/chain/produceBlock/produceBlockBody.d.ts +11 -1
  137. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  138. package/lib/chain/produceBlock/produceBlockBody.js +52 -14
  139. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  140. package/lib/chain/regen/interface.d.ts +1 -0
  141. package/lib/chain/regen/interface.d.ts.map +1 -1
  142. package/lib/chain/regen/interface.js +1 -0
  143. package/lib/chain/regen/interface.js.map +1 -1
  144. package/lib/chain/regen/queued.d.ts.map +1 -1
  145. package/lib/chain/regen/queued.js +1 -4
  146. package/lib/chain/regen/queued.js.map +1 -1
  147. package/lib/chain/regen/regen.d.ts.map +1 -1
  148. package/lib/chain/regen/regen.js +1 -4
  149. package/lib/chain/regen/regen.js.map +1 -1
  150. package/lib/chain/seenCache/index.d.ts +1 -0
  151. package/lib/chain/seenCache/index.d.ts.map +1 -1
  152. package/lib/chain/seenCache/index.js +1 -0
  153. package/lib/chain/seenCache/index.js.map +1 -1
  154. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +24 -7
  155. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  156. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +69 -17
  157. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  158. package/lib/chain/seenCache/seenProposerPreferences.d.ts +16 -0
  159. package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -0
  160. package/lib/chain/seenCache/seenProposerPreferences.js +26 -0
  161. package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -0
  162. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  163. package/lib/chain/stateCache/persistentCheckpointsCache.js +4 -1
  164. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  165. package/lib/chain/validation/block.d.ts.map +1 -1
  166. package/lib/chain/validation/block.js +1 -0
  167. package/lib/chain/validation/block.js.map +1 -1
  168. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  169. package/lib/chain/validation/executionPayloadBid.js +81 -18
  170. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  171. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  172. package/lib/chain/validation/executionPayloadEnvelope.js +19 -9
  173. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  174. package/lib/chain/validation/payloadAttestationMessage.d.ts +1 -1
  175. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  176. package/lib/chain/validation/payloadAttestationMessage.js +5 -3
  177. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  178. package/lib/chain/validation/proposerPreferences.d.ts +8 -0
  179. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -0
  180. package/lib/chain/validation/proposerPreferences.js +91 -0
  181. package/lib/chain/validation/proposerPreferences.js.map +1 -0
  182. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +1 -1
  183. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -1
  184. package/lib/execution/engine/http.d.ts.map +1 -1
  185. package/lib/execution/engine/http.js +21 -14
  186. package/lib/execution/engine/http.js.map +1 -1
  187. package/lib/execution/engine/interface.d.ts +1 -0
  188. package/lib/execution/engine/interface.d.ts.map +1 -1
  189. package/lib/execution/engine/mock.d.ts.map +1 -1
  190. package/lib/execution/engine/mock.js +6 -0
  191. package/lib/execution/engine/mock.js.map +1 -1
  192. package/lib/execution/engine/types.d.ts +20 -0
  193. package/lib/execution/engine/types.d.ts.map +1 -1
  194. package/lib/execution/engine/types.js +18 -0
  195. package/lib/execution/engine/types.js.map +1 -1
  196. package/lib/metrics/metrics/lodestar.d.ts +5 -0
  197. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  198. package/lib/metrics/metrics/lodestar.js +9 -0
  199. package/lib/metrics/metrics/lodestar.js.map +1 -1
  200. package/lib/network/gossip/interface.d.ts +7 -1
  201. package/lib/network/gossip/interface.d.ts.map +1 -1
  202. package/lib/network/gossip/interface.js +1 -0
  203. package/lib/network/gossip/interface.js.map +1 -1
  204. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  205. package/lib/network/gossip/scoringParameters.js +12 -1
  206. package/lib/network/gossip/scoringParameters.js.map +1 -1
  207. package/lib/network/gossip/topic.d.ts +13 -2
  208. package/lib/network/gossip/topic.d.ts.map +1 -1
  209. package/lib/network/gossip/topic.js +6 -0
  210. package/lib/network/gossip/topic.js.map +1 -1
  211. package/lib/network/interface.d.ts +3 -0
  212. package/lib/network/interface.d.ts.map +1 -1
  213. package/lib/network/network.d.ts +3 -0
  214. package/lib/network/network.d.ts.map +1 -1
  215. package/lib/network/network.js +14 -1
  216. package/lib/network/network.js.map +1 -1
  217. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  218. package/lib/network/processor/gossipHandlers.js +80 -23
  219. package/lib/network/processor/gossipHandlers.js.map +1 -1
  220. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  221. package/lib/network/processor/gossipQueues/index.js +5 -0
  222. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  223. package/lib/network/processor/index.d.ts.map +1 -1
  224. package/lib/network/processor/index.js +6 -5
  225. package/lib/network/processor/index.js.map +1 -1
  226. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  227. package/lib/network/reqresp/ReqRespBeaconNode.js +1 -1
  228. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  229. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts +9 -0
  230. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts.map +1 -0
  231. package/lib/network/reqresp/handlers/beaconBlocksByHead.js +61 -0
  232. package/lib/network/reqresp/handlers/beaconBlocksByHead.js.map +1 -0
  233. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  234. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +14 -6
  235. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  236. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  237. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +11 -5
  238. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  239. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  240. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +17 -5
  241. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  242. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  243. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +7 -4
  244. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  245. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  246. package/lib/network/reqresp/handlers/index.js +5 -0
  247. package/lib/network/reqresp/handlers/index.js.map +1 -1
  248. package/lib/network/reqresp/interface.d.ts +1 -1
  249. package/lib/network/reqresp/interface.js +1 -1
  250. package/lib/network/reqresp/protocols.d.ts +1 -0
  251. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  252. package/lib/network/reqresp/protocols.js +5 -0
  253. package/lib/network/reqresp/protocols.js.map +1 -1
  254. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  255. package/lib/network/reqresp/rateLimit.js +4 -0
  256. package/lib/network/reqresp/rateLimit.js.map +1 -1
  257. package/lib/network/reqresp/score.d.ts.map +1 -1
  258. package/lib/network/reqresp/score.js +1 -0
  259. package/lib/network/reqresp/score.js.map +1 -1
  260. package/lib/network/reqresp/types.d.ts +3 -0
  261. package/lib/network/reqresp/types.d.ts.map +1 -1
  262. package/lib/network/reqresp/types.js +3 -0
  263. package/lib/network/reqresp/types.js.map +1 -1
  264. package/lib/node/nodejs.js +2 -2
  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/dependentRoot.d.ts +6 -2
  312. package/lib/util/dependentRoot.d.ts.map +1 -1
  313. package/lib/util/dependentRoot.js +20 -16
  314. package/lib/util/dependentRoot.js.map +1 -1
  315. package/lib/util/sszBytes.d.ts.map +1 -1
  316. package/lib/util/sszBytes.js +20 -5
  317. package/lib/util/sszBytes.js.map +1 -1
  318. package/package.json +16 -16
  319. package/src/api/impl/beacon/blocks/index.ts +22 -9
  320. package/src/api/impl/beacon/pool/index.ts +136 -1
  321. package/src/api/impl/beacon/state/utils.ts +2 -2
  322. package/src/api/impl/debug/index.ts +0 -1
  323. package/src/api/impl/lodestar/index.ts +1 -1
  324. package/src/api/impl/validator/index.ts +101 -16
  325. package/src/chain/archiveStore/archiveStore.ts +5 -5
  326. package/src/chain/archiveStore/interface.ts +4 -4
  327. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +4 -4
  328. package/src/chain/archiveStore/utils/archiveBlocks.ts +153 -94
  329. package/src/chain/blocks/blockInput/blockInput.ts +4 -1
  330. package/src/chain/blocks/importBlock.ts +16 -48
  331. package/src/chain/blocks/importExecutionPayload.ts +126 -110
  332. package/src/chain/blocks/index.ts +71 -23
  333. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +37 -3
  334. package/src/chain/blocks/payloadEnvelopeInput/types.ts +18 -0
  335. package/src/chain/blocks/payloadEnvelopeProcessor.ts +2 -2
  336. package/src/chain/blocks/types.ts +15 -25
  337. package/src/chain/blocks/utils/chainSegment.ts +117 -17
  338. package/src/chain/blocks/verifyBlock.ts +70 -9
  339. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +6 -4
  340. package/src/chain/blocks/verifyBlocksSanityChecks.ts +26 -7
  341. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +137 -0
  342. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +7 -4
  343. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +9 -18
  344. package/src/chain/chain.ts +68 -26
  345. package/src/chain/emitter.ts +3 -14
  346. package/src/chain/errors/blockError.ts +4 -1
  347. package/src/chain/errors/executionPayloadBid.ts +28 -1
  348. package/src/chain/errors/executionPayloadEnvelope.ts +6 -0
  349. package/src/chain/errors/index.ts +1 -0
  350. package/src/chain/errors/proposerPreferences.ts +47 -0
  351. package/src/chain/forkChoice/index.ts +2 -22
  352. package/src/chain/initState.ts +9 -1
  353. package/src/chain/interface.ts +13 -3
  354. package/src/chain/lightClient/index.ts +6 -6
  355. package/src/chain/opPools/index.ts +1 -0
  356. package/src/chain/opPools/payloadAttestationPool.ts +63 -18
  357. package/src/chain/opPools/proposerPreferencesPool.ts +59 -0
  358. package/src/chain/prepareNextSlot.ts +36 -14
  359. package/src/chain/produceBlock/produceBlockBody.ts +63 -13
  360. package/src/chain/regen/interface.ts +1 -0
  361. package/src/chain/regen/queued.ts +2 -7
  362. package/src/chain/regen/regen.ts +2 -7
  363. package/src/chain/seenCache/index.ts +1 -0
  364. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +89 -21
  365. package/src/chain/seenCache/seenProposerPreferences.ts +32 -0
  366. package/src/chain/stateCache/persistentCheckpointsCache.ts +4 -1
  367. package/src/chain/validation/block.ts +1 -0
  368. package/src/chain/validation/executionPayloadBid.ts +85 -18
  369. package/src/chain/validation/executionPayloadEnvelope.ts +20 -10
  370. package/src/chain/validation/payloadAttestationMessage.ts +6 -4
  371. package/src/chain/validation/proposerPreferences.ts +110 -0
  372. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +1 -1
  373. package/src/execution/engine/http.ts +21 -14
  374. package/src/execution/engine/interface.ts +1 -0
  375. package/src/execution/engine/mock.ts +8 -1
  376. package/src/execution/engine/types.ts +41 -0
  377. package/src/metrics/metrics/lodestar.ts +10 -0
  378. package/src/network/gossip/interface.ts +6 -0
  379. package/src/network/gossip/scoringParameters.ts +14 -1
  380. package/src/network/gossip/topic.ts +6 -0
  381. package/src/network/interface.ts +3 -0
  382. package/src/network/network.ts +35 -1
  383. package/src/network/processor/gossipHandlers.ts +99 -23
  384. package/src/network/processor/gossipQueues/index.ts +5 -0
  385. package/src/network/processor/index.ts +6 -5
  386. package/src/network/reqresp/ReqRespBeaconNode.ts +1 -0
  387. package/src/network/reqresp/handlers/beaconBlocksByHead.ts +91 -0
  388. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +14 -6
  389. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +11 -5
  390. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +17 -5
  391. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +7 -4
  392. package/src/network/reqresp/handlers/index.ts +5 -0
  393. package/src/network/reqresp/interface.ts +1 -1
  394. package/src/network/reqresp/protocols.ts +6 -0
  395. package/src/network/reqresp/rateLimit.ts +4 -0
  396. package/src/network/reqresp/score.ts +1 -0
  397. package/src/network/reqresp/types.ts +5 -0
  398. package/src/node/nodejs.ts +2 -2
  399. package/src/sync/constants.ts +8 -4
  400. package/src/sync/range/batch.ts +388 -75
  401. package/src/sync/range/chain.ts +131 -14
  402. package/src/sync/range/range.ts +86 -11
  403. package/src/sync/range/utils/peerBalancer.ts +9 -3
  404. package/src/sync/sync.ts +13 -1
  405. package/src/sync/types.ts +72 -0
  406. package/src/sync/unknownBlock.ts +915 -65
  407. package/src/sync/utils/downloadByRange.ts +386 -39
  408. package/src/sync/utils/downloadByRoot.ts +24 -2
  409. package/src/sync/utils/pendingBlocksTree.ts +0 -15
  410. package/src/sync/utils/rateLimit.ts +16 -0
  411. package/src/util/dependentRoot.ts +22 -18
  412. package/src/util/sszBytes.ts +25 -5
@@ -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,
@@ -86,6 +88,7 @@ import {
86
88
  ExecutionPayloadBidPool,
87
89
  OpPool,
88
90
  PayloadAttestationPool,
91
+ ProposerPreferencesPool,
89
92
  SyncCommitteeMessagePool,
90
93
  SyncContributionAndProofPool,
91
94
  } from "./opPools/index.js";
@@ -105,6 +108,7 @@ import {
105
108
  SeenExecutionPayloadBids,
106
109
  SeenPayloadAttesters,
107
110
  SeenPayloadEnvelopeInput,
111
+ SeenProposerPreferences,
108
112
  SeenSyncCommitteeMessages,
109
113
  } from "./seenCache/index.js";
110
114
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -177,6 +181,7 @@ export class BeaconChain implements IBeaconChain {
177
181
  readonly syncContributionAndProofPool;
178
182
  readonly executionPayloadBidPool: ExecutionPayloadBidPool;
179
183
  readonly payloadAttestationPool: PayloadAttestationPool;
184
+ readonly proposerPreferencesPool = new ProposerPreferencesPool();
180
185
  readonly opPool: OpPool;
181
186
 
182
187
  // Gossip seen cache
@@ -185,6 +190,7 @@ export class BeaconChain implements IBeaconChain {
185
190
  readonly seenPayloadAttesters = new SeenPayloadAttesters();
186
191
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
187
192
  readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
193
+ readonly seenProposerPreferences = new SeenProposerPreferences();
188
194
  readonly seenBlockProposers = new SeenBlockProposers();
189
195
  readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
190
196
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -332,13 +338,6 @@ export class BeaconChain implements IBeaconChain {
332
338
  metrics,
333
339
  logger,
334
340
  });
335
- this.seenPayloadEnvelopeInputCache = new SeenPayloadEnvelopeInput({
336
- chainEvents: emitter,
337
- signal,
338
- serializedCache: this.serializedCache,
339
- metrics,
340
- logger,
341
- });
342
341
 
343
342
  this._earliestAvailableSlot = anchorState.slot;
344
343
 
@@ -394,6 +393,7 @@ export class BeaconChain implements IBeaconChain {
394
393
  metrics,
395
394
  logger
396
395
  );
396
+
397
397
  const regen = new QueuedStateRegenerator({
398
398
  config,
399
399
  forkChoice,
@@ -418,6 +418,33 @@ export class BeaconChain implements IBeaconChain {
418
418
  this.payloadEnvelopeProcessor = new PayloadEnvelopeProcessor(this, metrics, signal);
419
419
 
420
420
  this.forkChoice = forkChoice;
421
+
422
+ this.seenPayloadEnvelopeInputCache = new SeenPayloadEnvelopeInput({
423
+ config,
424
+ clock,
425
+ forkChoice,
426
+ chainEvents: emitter,
427
+ signal,
428
+ serializedCache: this.serializedCache,
429
+ metrics,
430
+ logger,
431
+ });
432
+
433
+ const anchorBlockSlot = anchorState.latestBlockHeader.slot;
434
+ if (isStatePostGloas(anchorState) && anchorBlockSlot > 0) {
435
+ const anchorBid = anchorState.latestExecutionPayloadBid;
436
+ this.seenPayloadEnvelopeInputCache.addFromBid({
437
+ blockRootHex: toRootHex(checkpoint.root),
438
+ slot: anchorBlockSlot,
439
+ forkName: anchorState.forkName,
440
+ proposerIndex: anchorState.latestBlockHeader.proposerIndex,
441
+ bid: anchorBid,
442
+ sampledColumns: this.custodyConfig.sampledColumns,
443
+ custodyColumns: this.custodyConfig.custodyColumns,
444
+ timeCreatedSec: Math.floor(Date.now() / 1000),
445
+ });
446
+ }
447
+
421
448
  this.clock = clock;
422
449
  this.regen = regen;
423
450
  this.bls = bls;
@@ -680,7 +707,7 @@ export class BeaconChain implements IBeaconChain {
680
707
  }
681
708
 
682
709
  getStateByCheckpoint(
683
- checkpoint: CheckpointWithPayloadStatus
710
+ checkpoint: CheckpointWithHex
684
711
  ): {state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean} | null {
685
712
  // finalized or justified checkpoint states maynot be available with PersistentCheckpointStateCache, use getCheckpointStateOrBytes() api to get Uint8Array
686
713
  const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
@@ -701,7 +728,7 @@ export class BeaconChain implements IBeaconChain {
701
728
  }
702
729
 
703
730
  async getStateOrBytesByCheckpoint(
704
- checkpoint: CheckpointWithPayloadStatus
731
+ checkpoint: CheckpointWithHex
705
732
  ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
706
733
  const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
707
734
  const cachedStateCtx = await this.regen.getCheckpointStateOrBytes(checkpointHex);
@@ -886,6 +913,21 @@ export class BeaconChain implements IBeaconChain {
886
913
  );
887
914
  }
888
915
 
916
+ async getParentExecutionRequests(
917
+ parentBlockSlot: Slot,
918
+ parentBlockRootHex: RootHex
919
+ ): Promise<electra.ExecutionRequests> {
920
+ // at the fork boundary, parent is pre-gloas
921
+ if (!isForkPostGloas(this.config.getForkName(parentBlockSlot))) {
922
+ return ssz.electra.ExecutionRequests.defaultValue();
923
+ }
924
+ const envelope = await this.getExecutionPayloadEnvelope(parentBlockSlot, parentBlockRootHex);
925
+ if (envelope === null) {
926
+ throw Error(`Parent execution payload envelope not found slot=${parentBlockSlot}, root=${parentBlockRootHex}`);
927
+ }
928
+ return envelope.message.executionRequests;
929
+ }
930
+
889
931
  async getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<DataColumnSidecar[]> {
890
932
  const fork = this.config.getForkName(blockSlot);
891
933
 
@@ -1082,11 +1124,15 @@ export class BeaconChain implements IBeaconChain {
1082
1124
  }
1083
1125
 
1084
1126
  async processBlock(block: IBlockInput, opts?: ImportBlockOpts): Promise<void> {
1085
- return this.blockProcessor.processBlocksJob([block], opts);
1127
+ return this.blockProcessor.processBlocksJob([block], null, opts);
1086
1128
  }
1087
1129
 
1088
- async processChainSegment(blocks: IBlockInput[], opts?: ImportBlockOpts): Promise<void> {
1089
- return this.blockProcessor.processBlocksJob(blocks, opts);
1130
+ async processChainSegment(
1131
+ blocks: IBlockInput[],
1132
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
1133
+ opts?: ImportBlockOpts
1134
+ ): Promise<void> {
1135
+ await this.blockProcessor.processBlocksJob(blocks, payloadEnvelopes, opts);
1090
1136
  }
1091
1137
 
1092
1138
  async processExecutionPayload(payloadInput: PayloadEnvelopeInput, opts?: ImportPayloadOpts): Promise<void> {
@@ -1277,7 +1323,7 @@ export class BeaconChain implements IBeaconChain {
1277
1323
  * @param blockState state that declares justified checkpoint `checkpoint`
1278
1324
  */
1279
1325
  private justifiedBalancesGetter(
1280
- checkpoint: CheckpointWithPayloadStatus,
1326
+ checkpoint: CheckpointWithHex,
1281
1327
  blockState: IBeaconStateView
1282
1328
  ): EffectiveBalanceIncrements {
1283
1329
  this.metrics?.balancesCache.requests.inc();
@@ -1316,7 +1362,7 @@ export class BeaconChain implements IBeaconChain {
1316
1362
  * @param blockState state that declares justified checkpoint `checkpoint`
1317
1363
  */
1318
1364
  private closestJustifiedBalancesStateToCheckpoint(
1319
- checkpoint: CheckpointWithPayloadStatus,
1365
+ checkpoint: CheckpointWithHex,
1320
1366
  blockState: IBeaconStateView
1321
1367
  ): {state: IBeaconStateView; stateId: string; shouldWarn: boolean} {
1322
1368
  const checkpointHex = {epoch: checkpoint.epoch, rootHex: checkpoint.rootHex};
@@ -1331,10 +1377,7 @@ export class BeaconChain implements IBeaconChain {
1331
1377
  }
1332
1378
 
1333
1379
  // 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
- )) {
1380
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1338
1381
  if (computeEpochAtSlot(descendantBlock.slot) === checkpoint.epoch) {
1339
1382
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1340
1383
  if (descendantBlockState) {
@@ -1350,10 +1393,7 @@ export class BeaconChain implements IBeaconChain {
1350
1393
 
1351
1394
  // Find a state in the same branch of checkpoint at a latter epoch. Balances are not the same, but should be close
1352
1395
  // 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
- )) {
1396
+ for (const descendantBlock of this.forkChoice.forwardIterateDescendantsDefaultStatus(checkpoint.rootHex)) {
1357
1397
  if (computeEpochAtSlot(descendantBlock.slot) > checkpoint.epoch) {
1358
1398
  const descendantBlockState = this.regen.getStateSync(descendantBlock.stateRoot);
1359
1399
  if (descendantBlockState) {
@@ -1423,6 +1463,8 @@ export class BeaconChain implements IBeaconChain {
1423
1463
  this.payloadAttestationPool.prune(slot);
1424
1464
  this.executionPayloadBidPool.prune(slot);
1425
1465
  this.seenExecutionPayloadBids.prune(slot);
1466
+ this.seenProposerPreferences.prune(slot);
1467
+ this.proposerPreferencesPool.prune(slot);
1426
1468
  this.seenAttestationDatas.onSlot(slot);
1427
1469
  this.reprocessController.onSlot(slot);
1428
1470
 
@@ -1457,7 +1499,7 @@ export class BeaconChain implements IBeaconChain {
1457
1499
  this.seenContributionAndProof.prune(head.slot);
1458
1500
  }
1459
1501
 
1460
- private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithPayloadStatus): void {
1502
+ private onForkChoiceJustified(this: BeaconChain, cp: CheckpointWithHex): void {
1461
1503
  this.logger.verbose("Fork choice justified", {epoch: cp.epoch, root: cp.rootHex});
1462
1504
  }
1463
1505
 
@@ -1468,7 +1510,7 @@ export class BeaconChain implements IBeaconChain {
1468
1510
  });
1469
1511
  }
1470
1512
 
1471
- private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithPayloadStatus): Promise<void> {
1513
+ private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1472
1514
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1473
1515
  const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1474
1516
  this.seenBlockProposers.prune(finalizedSlot);
@@ -1509,7 +1551,7 @@ export class BeaconChain implements IBeaconChain {
1509
1551
  }
1510
1552
  }
1511
1553
 
1512
- private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithPayloadStatus): Promise<void> {
1554
+ private async updateValidatorsCustodyRequirement(finalizedCheckpoint: CheckpointWithHex): Promise<void> {
1513
1555
  if (this.custodyConfig.targetCustodyGroupCount === this.config.NUMBER_OF_CUSTODY_GROUPS) {
1514
1556
  // Custody requirements can only be increased, we can disable dynamic custody updates
1515
1557
  // if the node already maintains custody of all custody groups in case it is configured
@@ -1,10 +1,9 @@
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";
10
9
  import {PayloadEnvelopeInput} from "./blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
@@ -60,10 +59,6 @@ export enum ChainEvent {
60
59
  * Post-gloas, missing parent could be a SignedBeaconBlock and/or a SignedExecutionPayloadEnvelope
61
60
  */
62
61
  blockUnknownParent = "blockUnknownParent",
63
- /**
64
- * Trigger BlockInputSync to find a SignedBeaconBlock given a SignedExecutionPayloadEnvelop received
65
- */
66
- envelopeUnknownBlock = "envelopeUnknownBlock",
67
62
  /**
68
63
  * Trigger BlockInputSync to find a SignedBeaconBlock with specified block root.
69
64
  */
@@ -92,11 +87,6 @@ type ApiEvents = {[K in routes.events.EventType]: (data: routes.events.EventData
92
87
 
93
88
  export type ChainEventData = {
94
89
  [ChainEvent.blockUnknownParent]: {blockInput: IBlockInput; peer: PeerIdStr; source: BlockInputSource};
95
- [ChainEvent.envelopeUnknownBlock]: {
96
- envelope: SignedExecutionPayloadEnvelope;
97
- peer?: PeerIdStr;
98
- source: BlockInputSource;
99
- };
100
90
  [ChainEvent.unknownBlockRoot]: {rootHex: RootHex; peer?: PeerIdStr; source: BlockInputSource};
101
91
  [ChainEvent.incompleteBlockInput]: {blockInput: IBlockInput; peer: PeerIdStr; source: BlockInputSource};
102
92
  [ChainEvent.incompletePayloadEnvelope]: {
@@ -110,8 +100,8 @@ export type ChainEventData = {
110
100
  export type IChainEvents = ApiEvents & {
111
101
  [ChainEvent.checkpoint]: (checkpoint: phase0.Checkpoint, state: IBeaconStateView) => void;
112
102
 
113
- [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithPayloadStatus) => void;
114
- [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithPayloadStatus) => void;
103
+ [ChainEvent.forkChoiceJustified]: (checkpoint: CheckpointWithHex) => void;
104
+ [ChainEvent.forkChoiceFinalized]: (checkpoint: CheckpointWithHex) => void;
115
105
 
116
106
  [ChainEvent.updateTargetCustodyGroupCount]: (targetGroupCount: number) => void;
117
107
 
@@ -124,7 +114,6 @@ export type IChainEvents = ApiEvents & {
124
114
  // Sync events that are chain->chain. Initiated from network requests but do not cross the network
125
115
  // barrier so are considered ChainEvent(s).
126
116
  [ChainEvent.blockUnknownParent]: (data: ChainEventData[ChainEvent.blockUnknownParent]) => void;
127
- [ChainEvent.envelopeUnknownBlock]: (data: ChainEventData[ChainEvent.envelopeUnknownBlock]) => void;
128
117
  [ChainEvent.unknownBlockRoot]: (data: ChainEventData[ChainEvent.unknownBlockRoot]) => void;
129
118
  [ChainEvent.incompleteBlockInput]: (data: ChainEventData[ChainEvent.incompleteBlockInput]) => void;
130
119
  [ChainEvent.incompletePayloadEnvelope]: (data: ChainEventData[ChainEvent.incompletePayloadEnvelope]) => void;
@@ -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,9 +7,13 @@ 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",
14
+ NO_MATCHING_PROPOSER_PREFERENCES = "EXECUTION_PAYLOAD_BID_ERROR_NO_MATCHING_PROPOSER_PREFERENCES",
15
+ PROPOSER_PREFERENCES_FEE_RECIPIENT_MISMATCH = "EXECUTION_PAYLOAD_BID_ERROR_PROPOSER_PREFERENCES_FEE_RECIPIENT_MISMATCH",
16
+ PROPOSER_PREFERENCES_GAS_LIMIT_MISMATCH = "EXECUTION_PAYLOAD_BID_ERROR_PROPOSER_PREFERENCES_GAS_LIMIT_MISMATCH",
13
17
  }
14
18
 
15
19
  export type ExecutionPayloadBidErrorType =
@@ -28,8 +32,31 @@ export type ExecutionPayloadBidErrorType =
28
32
  }
29
33
  | {code: ExecutionPayloadBidErrorCode.BID_TOO_LOW; bidValue: number; currentHighestBid: number}
30
34
  | {code: ExecutionPayloadBidErrorCode.BID_TOO_HIGH; bidValue: number; builderBalance: number}
35
+ | {
36
+ code: ExecutionPayloadBidErrorCode.TOO_MANY_KZG_COMMITMENTS;
37
+ blobKzgCommitmentsLen: number;
38
+ commitmentLimit: number;
39
+ }
31
40
  | {code: ExecutionPayloadBidErrorCode.UNKNOWN_BLOCK_ROOT; parentBlockRoot: RootHex}
32
41
  | {code: ExecutionPayloadBidErrorCode.INVALID_SLOT; builderIndex: BuilderIndex; slot: Slot}
33
- | {code: ExecutionPayloadBidErrorCode.INVALID_SIGNATURE; builderIndex: BuilderIndex; slot: Slot};
42
+ | {code: ExecutionPayloadBidErrorCode.INVALID_SIGNATURE; builderIndex: BuilderIndex; slot: Slot}
43
+ | {
44
+ code: ExecutionPayloadBidErrorCode.NO_MATCHING_PROPOSER_PREFERENCES;
45
+ slot: Slot;
46
+ parentBlockRoot: RootHex;
47
+ dependentRoot: RootHex;
48
+ }
49
+ | {
50
+ code: ExecutionPayloadBidErrorCode.PROPOSER_PREFERENCES_FEE_RECIPIENT_MISMATCH;
51
+ builderIndex: BuilderIndex;
52
+ bidFeeRecipient: string;
53
+ expectedFeeRecipient: string;
54
+ }
55
+ | {
56
+ code: ExecutionPayloadBidErrorCode.PROPOSER_PREFERENCES_GAS_LIMIT_MISMATCH;
57
+ builderIndex: BuilderIndex;
58
+ bidGasLimit: number;
59
+ expectedGasLimit: number;
60
+ };
34
61
 
35
62
  export class ExecutionPayloadBidError extends GossipActionError<ExecutionPayloadBidErrorType> {}
@@ -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),
@@ -161,7 +148,7 @@ export function initializeForkChoiceFromFinalizedState(
161
148
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
162
149
 
163
150
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
164
- 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,
165
152
  parentBlockHash: isStatePostGloas(state) ? toRootHex(state.latestBlockHash) : null,
166
153
  },
167
154
  currentSlot
@@ -208,19 +195,12 @@ export function initializeForkChoiceFromUnfinalizedState(
208
195
 
209
196
  const isForkPostGloas = computeEpochAtSlot(unfinalizedState.slot) >= config.GLOAS_FORK_EPOCH;
210
197
 
211
- // For unfinalized state, use getCheckpointPayloadStatus to determine the correct status.
212
- // It checks state.execution_payload_availability to determine EMPTY vs FULL.
213
- const justifiedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, justifiedCheckpoint.epoch);
214
- const finalizedPayloadStatus = getCheckpointPayloadStatus(config, unfinalizedState, finalizedCheckpoint.epoch);
215
-
216
198
  const store = new ForkChoiceStore(
217
199
  currentSlot,
218
200
  justifiedCheckpoint,
219
201
  finalizedCheckpoint,
220
202
  justifiedBalances,
221
203
  justifiedBalancesGetter,
222
- justifiedPayloadStatus,
223
- finalizedPayloadStatus,
224
204
  {
225
205
  onJustified: (cp) => emitter.emit(ChainEvent.forkChoiceJustified, cp),
226
206
  onFinalized: (cp) => emitter.emit(ChainEvent.forkChoiceFinalized, cp),
@@ -260,7 +240,7 @@ export function initializeForkChoiceFromUnfinalizedState(
260
240
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
261
241
 
262
242
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
263
- 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,
264
244
  parentBlockHash: isStatePostGloas(unfinalizedState) ? toRootHex(unfinalizedState.latestBlockHash) : null,
265
245
  };
266
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
 
@@ -1,6 +1,6 @@
1
1
  import {Type} from "@chainsafe/ssz";
2
2
  import {BeaconConfig} from "@lodestar/config";
3
- import {CheckpointWithHex, CheckpointWithPayloadStatus, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
3
+ import {CheckpointWithHex, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
4
4
  import {EpochShuffling, IBeaconStateView, PubkeyCache} from "@lodestar/state-transition";
5
5
  import {
6
6
  BeaconBlock,
@@ -18,6 +18,7 @@ import {
18
18
  altair,
19
19
  capella,
20
20
  deneb,
21
+ electra,
21
22
  gloas,
22
23
  phase0,
23
24
  rewards,
@@ -46,6 +47,7 @@ import {
46
47
  ExecutionPayloadBidPool,
47
48
  OpPool,
48
49
  PayloadAttestationPool,
50
+ ProposerPreferencesPool,
49
51
  SyncCommitteeMessagePool,
50
52
  SyncContributionAndProofPool,
51
53
  } from "./opPools/index.js";
@@ -60,6 +62,7 @@ import {
60
62
  SeenContributionAndProof,
61
63
  SeenExecutionPayloadBids,
62
64
  SeenPayloadAttesters,
65
+ SeenProposerPreferences,
63
66
  SeenSyncCommitteeMessages,
64
67
  } from "./seenCache/index.js";
65
68
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -122,6 +125,7 @@ export interface IBeaconChain {
122
125
  readonly syncContributionAndProofPool: SyncContributionAndProofPool;
123
126
  readonly executionPayloadBidPool: ExecutionPayloadBidPool;
124
127
  readonly payloadAttestationPool: PayloadAttestationPool;
128
+ readonly proposerPreferencesPool: ProposerPreferencesPool;
125
129
  readonly opPool: OpPool;
126
130
 
127
131
  // Gossip seen cache
@@ -130,6 +134,7 @@ export interface IBeaconChain {
130
134
  readonly seenPayloadAttesters: SeenPayloadAttesters;
131
135
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
132
136
  readonly seenExecutionPayloadBids: SeenExecutionPayloadBids;
137
+ readonly seenProposerPreferences: SeenProposerPreferences;
133
138
  readonly seenBlockProposers: SeenBlockProposers;
134
139
  readonly seenSyncCommitteeMessages: SeenSyncCommitteeMessages;
135
140
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -195,7 +200,7 @@ export interface IBeaconChain {
195
200
  ): {state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean} | null;
196
201
  /** Return state bytes by checkpoint */
197
202
  getStateOrBytesByCheckpoint(
198
- checkpoint: CheckpointWithPayloadStatus
203
+ checkpoint: CheckpointWithHex
199
204
  ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null>;
200
205
 
201
206
  /**
@@ -231,6 +236,7 @@ export interface IBeaconChain {
231
236
  blockSlot: Slot,
232
237
  blockRootHex: string
233
238
  ): Promise<gloas.SignedExecutionPayloadEnvelope | null>;
239
+ getParentExecutionRequests(parentBlockSlot: Slot, parentBlockRootHex: RootHex): Promise<electra.ExecutionRequests>;
234
240
 
235
241
  produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody>;
236
242
  produceBlock(blockAttributes: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}): Promise<{
@@ -248,7 +254,11 @@ export interface IBeaconChain {
248
254
  /** Process a block until complete */
249
255
  processBlock(block: IBlockInput, opts?: ImportBlockOpts): Promise<void>;
250
256
  /** Process a chain of blocks until complete */
251
- processChainSegment(blocks: IBlockInput[], opts?: ImportBlockOpts): Promise<void>;
257
+ processChainSegment(
258
+ blocks: IBlockInput[],
259
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null,
260
+ opts?: ImportBlockOpts
261
+ ): Promise<void>;
252
262
 
253
263
  /** Process execution payload envelope: verify, import to fork choice, and persist to DB */
254
264
  processExecutionPayload(payloadInput: PayloadEnvelopeInput, opts?: ImportPayloadOpts): Promise<void>;
@@ -1,12 +1,6 @@
1
1
  import {BitArray} from "@chainsafe/ssz";
2
2
  import {routes} from "@lodestar/api";
3
3
  import {ChainForkConfig} from "@lodestar/config";
4
- import {
5
- LightClientUpdateSummary,
6
- isBetterUpdate,
7
- toLightClientUpdateSummary,
8
- upgradeLightClientHeader,
9
- } from "@lodestar/light-client/spec";
10
4
  import {
11
5
  ForkName,
12
6
  ForkPostAltair,
@@ -27,6 +21,12 @@ import {
27
21
  computeSyncPeriodAtSlot,
28
22
  executionPayloadToPayloadHeader,
29
23
  } from "@lodestar/state-transition";
24
+ import {
25
+ LightClientUpdateSummary,
26
+ isBetterUpdate,
27
+ toLightClientUpdateSummary,
28
+ upgradeLightClientHeader,
29
+ } from "@lodestar/state-transition/light-client";
30
30
  import {
31
31
  BeaconBlock,
32
32
  BeaconBlockBody,
@@ -3,5 +3,6 @@ export {AttestationPool} from "./attestationPool.js";
3
3
  export {ExecutionPayloadBidPool} from "./executionPayloadBidPool.js";
4
4
  export {OpPool} from "./opPool.js";
5
5
  export {PayloadAttestationPool} from "./payloadAttestationPool.js";
6
+ export {ProposerPreferencesPool} from "./proposerPreferencesPool.js";
6
7
  export {SyncCommitteeMessagePool} from "./syncCommitteeMessagePool.js";
7
8
  export {SyncContributionAndProofPool} from "./syncContributionAndProofPool.js";