@lodestar/beacon-node 1.51.0-dev.b3beff2246 → 1.51.0-dev.b74e8e576d

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 (588) hide show
  1. package/lib/api/impl/api.js +1 -1
  2. package/lib/api/impl/api.js.map +1 -1
  3. package/lib/api/impl/beacon/blocks/index.d.ts +2 -1
  4. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/blocks/index.js +48 -95
  6. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  7. package/lib/api/impl/beacon/index.d.ts +2 -1
  8. package/lib/api/impl/beacon/index.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/index.js +2 -2
  10. package/lib/api/impl/beacon/index.js.map +1 -1
  11. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  12. package/lib/api/impl/beacon/pool/index.js +22 -2
  13. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  14. package/lib/api/impl/beacon/state/utils.d.ts +1 -1
  15. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  16. package/lib/api/impl/validator/index.d.ts +6 -0
  17. package/lib/api/impl/validator/index.d.ts.map +1 -1
  18. package/lib/api/impl/validator/index.js +42 -26
  19. package/lib/api/impl/validator/index.js.map +1 -1
  20. package/lib/api/options.d.ts +2 -0
  21. package/lib/api/options.d.ts.map +1 -1
  22. package/lib/api/options.js +1 -0
  23. package/lib/api/options.js.map +1 -1
  24. package/lib/chain/GetBlobsTracker.d.ts +13 -2
  25. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  26. package/lib/chain/GetBlobsTracker.js +69 -35
  27. package/lib/chain/GetBlobsTracker.js.map +1 -1
  28. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  29. package/lib/chain/archiveStore/archiveStore.js +1 -0
  30. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  31. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +4 -0
  32. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  33. package/lib/chain/archiveStore/utils/archiveBlocks.js +61 -97
  34. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  35. package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
  36. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  37. package/lib/chain/blocks/blockInput/blockInput.js +5 -241
  38. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  39. package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
  40. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
  41. package/lib/chain/blocks/blockInput/errors.js.map +1 -1
  42. package/lib/chain/blocks/blockInput/types.d.ts +2 -18
  43. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  44. package/lib/chain/blocks/blockInput/types.js +0 -1
  45. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  46. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  47. package/lib/chain/blocks/importBlock.js +40 -56
  48. package/lib/chain/blocks/importBlock.js.map +1 -1
  49. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
  50. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  51. package/lib/chain/blocks/importExecutionPayload.js +34 -19
  52. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  53. package/lib/chain/blocks/index.d.ts.map +1 -1
  54. package/lib/chain/blocks/index.js +4 -4
  55. package/lib/chain/blocks/index.js.map +1 -1
  56. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
  57. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  58. package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
  59. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  60. package/lib/chain/blocks/types.d.ts +4 -20
  61. package/lib/chain/blocks/types.d.ts.map +1 -1
  62. package/lib/chain/blocks/types.js +0 -24
  63. package/lib/chain/blocks/types.js.map +1 -1
  64. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  65. package/lib/chain/blocks/verifyBlock.js +18 -7
  66. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  67. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  68. package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
  69. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  70. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
  71. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  72. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
  73. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  74. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  75. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
  76. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  77. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  78. package/lib/chain/blocks/verifyBlocksSignatures.js +7 -5
  79. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  80. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
  81. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  82. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
  83. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  84. package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
  85. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  86. package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
  87. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  88. package/lib/chain/bls/interface.d.ts +2 -0
  89. package/lib/chain/bls/interface.d.ts.map +1 -1
  90. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  91. package/lib/chain/bls/multithread/index.js +13 -11
  92. package/lib/chain/bls/multithread/index.js.map +1 -1
  93. package/lib/chain/bls/multithread/types.d.ts +1 -1
  94. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  95. package/lib/chain/bls/multithread/worker.js +1 -1
  96. package/lib/chain/bls/multithread/worker.js.map +1 -1
  97. package/lib/chain/bls/singleThread.js +1 -1
  98. package/lib/chain/bls/singleThread.js.map +1 -1
  99. package/lib/chain/bls/utils.js +1 -1
  100. package/lib/chain/bls/utils.js.map +1 -1
  101. package/lib/chain/chain.d.ts +25 -4
  102. package/lib/chain/chain.d.ts.map +1 -1
  103. package/lib/chain/chain.js +124 -43
  104. package/lib/chain/chain.js.map +1 -1
  105. package/lib/chain/emitter.d.ts +7 -7
  106. package/lib/chain/emitter.d.ts.map +1 -1
  107. package/lib/chain/emitter.js +5 -5
  108. package/lib/chain/emitter.js.map +1 -1
  109. package/lib/chain/errors/blockError.d.ts +1 -1
  110. package/lib/chain/errors/blockError.d.ts.map +1 -1
  111. package/lib/chain/errors/blockError.js +1 -1
  112. package/lib/chain/errors/blockError.js.map +1 -1
  113. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  114. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  115. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  116. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  117. package/lib/chain/errors/index.d.ts +0 -1
  118. package/lib/chain/errors/index.d.ts.map +1 -1
  119. package/lib/chain/errors/index.js +0 -1
  120. package/lib/chain/errors/index.js.map +1 -1
  121. package/lib/chain/forkChoice/index.d.ts +11 -1
  122. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  123. package/lib/chain/forkChoice/index.js +11 -0
  124. package/lib/chain/forkChoice/index.js.map +1 -1
  125. package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
  126. package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
  127. package/lib/chain/forkChoiceExecutionEngine.js +117 -0
  128. package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
  129. package/lib/chain/interface.d.ts +9 -7
  130. package/lib/chain/interface.d.ts.map +1 -1
  131. package/lib/chain/interface.js.map +1 -1
  132. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
  133. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  134. package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
  135. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  136. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  137. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  138. package/lib/chain/opPools/attestationPool.js +15 -4
  139. package/lib/chain/opPools/attestationPool.js.map +1 -1
  140. package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -1
  141. package/lib/chain/opPools/inclusionListStore.js +2 -2
  142. package/lib/chain/opPools/inclusionListStore.js.map +1 -1
  143. package/lib/chain/opPools/index.d.ts +1 -0
  144. package/lib/chain/opPools/index.d.ts.map +1 -1
  145. package/lib/chain/opPools/index.js +1 -0
  146. package/lib/chain/opPools/index.js.map +1 -1
  147. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  148. package/lib/chain/opPools/payloadAttestationPool.js +17 -7
  149. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  150. package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
  151. package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
  152. package/lib/chain/opPools/singleAttestationPool.js +209 -0
  153. package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
  154. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  155. package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
  156. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  157. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  158. package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
  159. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  160. package/lib/chain/opPools/utils.d.ts +1 -1
  161. package/lib/chain/opPools/utils.d.ts.map +1 -1
  162. package/lib/chain/opPools/utils.js +1 -1
  163. package/lib/chain/opPools/utils.js.map +1 -1
  164. package/lib/chain/options.d.ts +5 -3
  165. package/lib/chain/options.d.ts.map +1 -1
  166. package/lib/chain/options.js +0 -1
  167. package/lib/chain/options.js.map +1 -1
  168. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  169. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  170. package/lib/chain/produceBlock/produceBlockBody.js +3 -3
  171. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  172. package/lib/chain/proposerTracker.d.ts +31 -0
  173. package/lib/chain/proposerTracker.d.ts.map +1 -0
  174. package/lib/chain/proposerTracker.js +75 -0
  175. package/lib/chain/proposerTracker.js.map +1 -0
  176. package/lib/chain/regen/interface.d.ts +1 -2
  177. package/lib/chain/regen/interface.d.ts.map +1 -1
  178. package/lib/chain/regen/interface.js +0 -1
  179. package/lib/chain/regen/interface.js.map +1 -1
  180. package/lib/chain/regen/queued.d.ts +1 -1
  181. package/lib/chain/regen/queued.d.ts.map +1 -1
  182. package/lib/chain/regen/queued.js +5 -3
  183. package/lib/chain/regen/queued.js.map +1 -1
  184. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
  185. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  186. package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
  187. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  188. package/lib/chain/validation/executionPayloadBid.d.ts +0 -15
  189. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  190. package/lib/chain/validation/executionPayloadBid.js +13 -166
  191. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  192. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  193. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  194. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  195. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  196. package/lib/chain/validation/inclusionList.d.ts.map +1 -1
  197. package/lib/chain/validation/inclusionList.js +11 -2
  198. package/lib/chain/validation/inclusionList.js.map +1 -1
  199. package/lib/chain/validatorMonitor.d.ts +1 -2
  200. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  201. package/lib/chain/validatorMonitor.js +0 -3
  202. package/lib/chain/validatorMonitor.js.map +1 -1
  203. package/lib/db/beacon.d.ts +7 -0
  204. package/lib/db/beacon.d.ts.map +1 -1
  205. package/lib/db/beacon.js +34 -0
  206. package/lib/db/beacon.js.map +1 -1
  207. package/lib/db/dataColumnStore.d.ts +1 -1
  208. package/lib/db/dataColumnStore.d.ts.map +1 -1
  209. package/lib/db/dataColumnStore.js +1 -4
  210. package/lib/db/dataColumnStore.js.map +1 -1
  211. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  212. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  213. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  214. package/lib/db/flatFileStore/slotIndex.js +2 -2
  215. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  216. package/lib/db/interface.d.ts +1 -0
  217. package/lib/db/interface.d.ts.map +1 -1
  218. package/lib/db/repositories/blobSidecars.d.ts +0 -1
  219. package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
  220. package/lib/db/repositories/blobSidecars.js +0 -1
  221. package/lib/db/repositories/blobSidecars.js.map +1 -1
  222. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
  223. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  224. package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
  225. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  226. package/lib/execution/builder/apiClient.d.ts +14 -8
  227. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  228. package/lib/execution/builder/apiClient.js +12 -10
  229. package/lib/execution/builder/apiClient.js.map +1 -1
  230. package/lib/execution/builder/http.d.ts +2 -0
  231. package/lib/execution/builder/http.d.ts.map +1 -1
  232. package/lib/execution/builder/http.js +2 -0
  233. package/lib/execution/builder/http.js.map +1 -1
  234. package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
  235. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
  236. package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
  237. package/lib/execution/engine/http.d.ts +4 -6
  238. package/lib/execution/engine/http.d.ts.map +1 -1
  239. package/lib/execution/engine/http.js +8 -11
  240. package/lib/execution/engine/http.js.map +1 -1
  241. package/lib/execution/engine/index.d.ts +1 -1
  242. package/lib/execution/engine/index.d.ts.map +1 -1
  243. package/lib/execution/engine/index.js +1 -1
  244. package/lib/execution/engine/index.js.map +1 -1
  245. package/lib/execution/engine/interface.d.ts +18 -6
  246. package/lib/execution/engine/interface.d.ts.map +1 -1
  247. package/lib/execution/engine/interface.js.map +1 -1
  248. package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
  249. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  250. package/lib/execution/engine/jsonRpcTransport.js +2 -12
  251. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  252. package/lib/execution/engine/mock.d.ts +0 -1
  253. package/lib/execution/engine/mock.d.ts.map +1 -1
  254. package/lib/execution/engine/mock.js +6 -8
  255. package/lib/execution/engine/mock.js.map +1 -1
  256. package/lib/execution/engine/payloadIdCache.d.ts +1 -2
  257. package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
  258. package/lib/execution/engine/payloadIdCache.js +3 -3
  259. package/lib/execution/engine/payloadIdCache.js.map +1 -1
  260. package/lib/execution/engine/restTransport.d.ts +2 -4
  261. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  262. package/lib/execution/engine/restTransport.js +1 -15
  263. package/lib/execution/engine/restTransport.js.map +1 -1
  264. package/lib/execution/engine/sszTypes.d.ts +38 -47
  265. package/lib/execution/engine/sszTypes.d.ts.map +1 -1
  266. package/lib/execution/engine/sszTypes.js +0 -5
  267. package/lib/execution/engine/sszTypes.js.map +1 -1
  268. package/lib/execution/engine/transport.d.ts +1 -14
  269. package/lib/execution/engine/transport.d.ts.map +1 -1
  270. package/lib/execution/engine/types.d.ts +1 -9
  271. package/lib/execution/engine/types.d.ts.map +1 -1
  272. package/lib/execution/engine/types.js +9 -16
  273. package/lib/execution/engine/types.js.map +1 -1
  274. package/lib/execution/engine/utils.d.ts.map +1 -1
  275. package/lib/execution/engine/utils.js +3 -2
  276. package/lib/execution/engine/utils.js.map +1 -1
  277. package/lib/index.d.ts +1 -0
  278. package/lib/index.d.ts.map +1 -1
  279. package/lib/index.js +2 -0
  280. package/lib/index.js.map +1 -1
  281. package/lib/metrics/metrics/beacon.d.ts +0 -9
  282. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  283. package/lib/metrics/metrics/beacon.js +0 -30
  284. package/lib/metrics/metrics/beacon.js.map +1 -1
  285. package/lib/metrics/metrics/lodestar.d.ts +33 -8
  286. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  287. package/lib/metrics/metrics/lodestar.js +84 -18
  288. package/lib/metrics/metrics/lodestar.js.map +1 -1
  289. package/lib/metrics/server/http.js +5 -5
  290. package/lib/metrics/server/http.js.map +1 -1
  291. package/lib/monitoring/service.js +1 -1
  292. package/lib/monitoring/service.js.map +1 -1
  293. package/lib/network/core/networkCore.d.ts +4 -1
  294. package/lib/network/core/networkCore.d.ts.map +1 -1
  295. package/lib/network/core/networkCore.js +7 -0
  296. package/lib/network/core/networkCore.js.map +1 -1
  297. package/lib/network/core/networkCoreWorker.js +2 -0
  298. package/lib/network/core/networkCoreWorker.js.map +1 -1
  299. package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
  300. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  301. package/lib/network/core/networkCoreWorkerHandler.js +6 -0
  302. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  303. package/lib/network/core/types.d.ts +6 -1
  304. package/lib/network/core/types.d.ts.map +1 -1
  305. package/lib/network/gossip/gossipsub.d.ts +1 -0
  306. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  307. package/lib/network/gossip/gossipsub.js +10 -0
  308. package/lib/network/gossip/gossipsub.js.map +1 -1
  309. package/lib/network/gossip/interface.d.ts +1 -8
  310. package/lib/network/gossip/interface.d.ts.map +1 -1
  311. package/lib/network/gossip/interface.js +0 -1
  312. package/lib/network/gossip/interface.js.map +1 -1
  313. package/lib/network/gossip/topic.d.ts +6 -22
  314. package/lib/network/gossip/topic.d.ts.map +1 -1
  315. package/lib/network/gossip/topic.js +0 -23
  316. package/lib/network/gossip/topic.js.map +1 -1
  317. package/lib/network/interface.d.ts +4 -5
  318. package/lib/network/interface.d.ts.map +1 -1
  319. package/lib/network/libp2p/index.d.ts.map +1 -1
  320. package/lib/network/libp2p/index.js +5 -1
  321. package/lib/network/libp2p/index.js.map +1 -1
  322. package/lib/network/network.d.ts +8 -7
  323. package/lib/network/network.d.ts.map +1 -1
  324. package/lib/network/network.js +53 -35
  325. package/lib/network/network.js.map +1 -1
  326. package/lib/network/options.d.ts +2 -0
  327. package/lib/network/options.d.ts.map +1 -1
  328. package/lib/network/options.js +2 -0
  329. package/lib/network/options.js.map +1 -1
  330. package/lib/network/peers/peerManager.d.ts +2 -1
  331. package/lib/network/peers/peerManager.d.ts.map +1 -1
  332. package/lib/network/peers/peerManager.js +28 -1
  333. package/lib/network/peers/peerManager.js.map +1 -1
  334. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  335. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  336. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  337. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  338. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  339. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  340. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  341. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  342. package/lib/network/peers/utils/subnetMap.d.ts +5 -2
  343. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
  344. package/lib/network/peers/utils/subnetMap.js +6 -3
  345. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  346. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  347. package/lib/network/processor/extractSlotRootFns.js +1 -8
  348. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  349. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  350. package/lib/network/processor/gossipHandlers.js +79 -149
  351. package/lib/network/processor/gossipHandlers.js.map +1 -1
  352. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  353. package/lib/network/processor/gossipQueues/index.js +0 -6
  354. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  355. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  356. package/lib/network/processor/gossipValidatorFn.js +1 -5
  357. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  358. package/lib/network/processor/index.d.ts +6 -0
  359. package/lib/network/processor/index.d.ts.map +1 -1
  360. package/lib/network/processor/index.js +29 -4
  361. package/lib/network/processor/index.js.map +1 -1
  362. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  363. package/lib/network/reqresp/ReqRespBeaconNode.js +0 -3
  364. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  365. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
  366. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  367. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  368. package/lib/network/reqresp/handlers/index.js +1 -12
  369. package/lib/network/reqresp/handlers/index.js.map +1 -1
  370. package/lib/network/reqresp/protocols.d.ts +0 -2
  371. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  372. package/lib/network/reqresp/protocols.js +0 -10
  373. package/lib/network/reqresp/protocols.js.map +1 -1
  374. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  375. package/lib/network/reqresp/rateLimit.js +1 -17
  376. package/lib/network/reqresp/rateLimit.js.map +1 -1
  377. package/lib/network/reqresp/types.d.ts +2 -8
  378. package/lib/network/reqresp/types.d.ts.map +1 -1
  379. package/lib/network/reqresp/types.js +1 -7
  380. package/lib/network/reqresp/types.js.map +1 -1
  381. package/lib/network/subnets/attnetsService.d.ts +35 -5
  382. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  383. package/lib/network/subnets/attnetsService.js +84 -6
  384. package/lib/network/subnets/attnetsService.js.map +1 -1
  385. package/lib/network/subnets/interface.d.ts +7 -0
  386. package/lib/network/subnets/interface.d.ts.map +1 -1
  387. package/lib/network/subnets/interface.js.map +1 -1
  388. package/lib/node/nodejs.d.ts +3 -1
  389. package/lib/node/nodejs.d.ts.map +1 -1
  390. package/lib/node/nodejs.js +47 -21
  391. package/lib/node/nodejs.js.map +1 -1
  392. package/lib/node/options.d.ts +3 -1
  393. package/lib/node/options.d.ts.map +1 -1
  394. package/lib/node/options.js +4 -2
  395. package/lib/node/options.js.map +1 -1
  396. package/lib/sync/interface.d.ts.map +1 -1
  397. package/lib/sync/interface.js.map +1 -1
  398. package/lib/sync/range/batch.d.ts +2 -3
  399. package/lib/sync/range/batch.d.ts.map +1 -1
  400. package/lib/sync/range/batch.js +9 -22
  401. package/lib/sync/range/batch.js.map +1 -1
  402. package/lib/sync/range/chain.d.ts.map +1 -1
  403. package/lib/sync/range/chain.js +2 -15
  404. package/lib/sync/range/chain.js.map +1 -1
  405. package/lib/sync/sync.d.ts +7 -0
  406. package/lib/sync/sync.d.ts.map +1 -1
  407. package/lib/sync/sync.js +61 -3
  408. package/lib/sync/sync.js.map +1 -1
  409. package/lib/sync/unknownBlock.d.ts.map +1 -1
  410. package/lib/sync/unknownBlock.js +43 -25
  411. package/lib/sync/unknownBlock.js.map +1 -1
  412. package/lib/sync/utils/downloadByRange.d.ts +6 -34
  413. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  414. package/lib/sync/utils/downloadByRange.js +24 -128
  415. package/lib/sync/utils/downloadByRange.js.map +1 -1
  416. package/lib/sync/utils/downloadByRoot.d.ts +2 -18
  417. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  418. package/lib/sync/utils/downloadByRoot.js +14 -99
  419. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  420. package/lib/util/blobs.d.ts +1 -7
  421. package/lib/util/blobs.d.ts.map +1 -1
  422. package/lib/util/blobs.js +0 -19
  423. package/lib/util/blobs.js.map +1 -1
  424. package/lib/util/execution.d.ts +3 -4
  425. package/lib/util/execution.d.ts.map +1 -1
  426. package/lib/util/execution.js +1 -73
  427. package/lib/util/execution.js.map +1 -1
  428. package/lib/util/file.d.ts.map +1 -1
  429. package/lib/util/file.js +8 -9
  430. package/lib/util/file.js.map +1 -1
  431. package/lib/util/queue/itemQueue.js +1 -1
  432. package/lib/util/queue/itemQueue.js.map +1 -1
  433. package/lib/util/sszBytes.d.ts +5 -1
  434. package/lib/util/sszBytes.d.ts.map +1 -1
  435. package/lib/util/sszBytes.js +36 -19
  436. package/lib/util/sszBytes.js.map +1 -1
  437. package/lib/util/types.d.ts +0 -5
  438. package/lib/util/types.d.ts.map +1 -1
  439. package/lib/util/types.js +1 -2
  440. package/lib/util/types.js.map +1 -1
  441. package/package.json +17 -18
  442. package/src/api/impl/api.ts +1 -1
  443. package/src/api/impl/beacon/blocks/index.ts +81 -126
  444. package/src/api/impl/beacon/index.ts +3 -1
  445. package/src/api/impl/beacon/pool/index.ts +31 -1
  446. package/src/api/impl/beacon/state/utils.ts +1 -1
  447. package/src/api/impl/validator/index.ts +47 -30
  448. package/src/api/options.ts +3 -0
  449. package/src/chain/GetBlobsTracker.ts +82 -52
  450. package/src/chain/archiveStore/archiveStore.ts +1 -0
  451. package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
  452. package/src/chain/blocks/blockInput/blockInput.ts +11 -343
  453. package/src/chain/blocks/blockInput/errors.ts +1 -2
  454. package/src/chain/blocks/blockInput/types.ts +2 -20
  455. package/src/chain/blocks/importBlock.ts +61 -76
  456. package/src/chain/blocks/importExecutionPayload.ts +57 -35
  457. package/src/chain/blocks/index.ts +11 -4
  458. package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
  459. package/src/chain/blocks/types.ts +5 -31
  460. package/src/chain/blocks/verifyBlock.ts +31 -16
  461. package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
  462. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
  463. package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
  464. package/src/chain/blocks/verifyBlocksSignatures.ts +7 -5
  465. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
  466. package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
  467. package/src/chain/bls/interface.ts +2 -0
  468. package/src/chain/bls/multithread/index.ts +14 -10
  469. package/src/chain/bls/multithread/types.ts +1 -1
  470. package/src/chain/bls/multithread/worker.ts +1 -5
  471. package/src/chain/bls/singleThread.ts +1 -1
  472. package/src/chain/bls/utils.ts +1 -1
  473. package/src/chain/chain.ts +140 -42
  474. package/src/chain/emitter.ts +8 -8
  475. package/src/chain/errors/blockError.ts +1 -1
  476. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  477. package/src/chain/errors/index.ts +0 -1
  478. package/src/chain/forkChoice/index.ts +11 -0
  479. package/src/chain/forkChoiceExecutionEngine.ts +183 -0
  480. package/src/chain/interface.ts +9 -6
  481. package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
  482. package/src/chain/opPools/attestationPool.ts +16 -4
  483. package/src/chain/opPools/inclusionListStore.ts +3 -3
  484. package/src/chain/opPools/index.ts +1 -0
  485. package/src/chain/opPools/payloadAttestationPool.ts +18 -7
  486. package/src/chain/opPools/singleAttestationPool.ts +287 -0
  487. package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
  488. package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
  489. package/src/chain/opPools/utils.ts +1 -1
  490. package/src/chain/options.ts +5 -4
  491. package/src/chain/produceBlock/produceBlockBody.ts +7 -4
  492. package/src/chain/proposerTracker.ts +94 -0
  493. package/src/chain/regen/interface.ts +1 -2
  494. package/src/chain/regen/queued.ts +6 -4
  495. package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
  496. package/src/chain/validation/executionPayloadBid.ts +14 -193
  497. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  498. package/src/chain/validation/inclusionList.ts +11 -2
  499. package/src/chain/validatorMonitor.ts +0 -6
  500. package/src/db/beacon.ts +44 -0
  501. package/src/db/dataColumnStore.ts +2 -4
  502. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  503. package/src/db/flatFileStore/slotIndex.ts +4 -3
  504. package/src/db/interface.ts +2 -0
  505. package/src/db/repositories/blobSidecars.ts +0 -1
  506. package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
  507. package/src/execution/builder/apiClient.ts +16 -13
  508. package/src/execution/builder/http.ts +4 -0
  509. package/src/execution/engine/blobVersionedHashes.ts +1 -1
  510. package/src/execution/engine/http.ts +19 -43
  511. package/src/execution/engine/index.ts +1 -1
  512. package/src/execution/engine/interface.ts +19 -10
  513. package/src/execution/engine/jsonRpcTransport.ts +10 -22
  514. package/src/execution/engine/mock.ts +6 -11
  515. package/src/execution/engine/payloadIdCache.ts +6 -7
  516. package/src/execution/engine/restTransport.ts +3 -22
  517. package/src/execution/engine/sszTypes.ts +0 -9
  518. package/src/execution/engine/transport.ts +8 -17
  519. package/src/execution/engine/types.ts +11 -26
  520. package/src/execution/engine/utils.ts +4 -2
  521. package/src/index.ts +2 -0
  522. package/src/metrics/metrics/beacon.ts +0 -30
  523. package/src/metrics/metrics/lodestar.ts +85 -18
  524. package/src/metrics/server/http.ts +5 -5
  525. package/src/monitoring/service.ts +1 -1
  526. package/src/network/core/networkCore.ts +11 -1
  527. package/src/network/core/networkCoreWorker.ts +2 -0
  528. package/src/network/core/networkCoreWorkerHandler.ts +8 -1
  529. package/src/network/core/types.ts +6 -1
  530. package/src/network/gossip/gossipsub.ts +11 -0
  531. package/src/network/gossip/interface.ts +0 -5
  532. package/src/network/gossip/topic.ts +0 -25
  533. package/src/network/interface.ts +2 -5
  534. package/src/network/libp2p/index.ts +5 -1
  535. package/src/network/network.ts +55 -58
  536. package/src/network/options.ts +4 -0
  537. package/src/network/peers/peerManager.ts +28 -3
  538. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  539. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  540. package/src/network/peers/utils/subnetMap.ts +6 -3
  541. package/src/network/processor/extractSlotRootFns.ts +0 -9
  542. package/src/network/processor/gossipHandlers.ts +99 -183
  543. package/src/network/processor/gossipQueues/index.ts +0 -6
  544. package/src/network/processor/gossipValidatorFn.ts +0 -5
  545. package/src/network/processor/index.ts +25 -4
  546. package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
  547. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
  548. package/src/network/reqresp/handlers/index.ts +0 -17
  549. package/src/network/reqresp/protocols.ts +0 -12
  550. package/src/network/reqresp/rateLimit.ts +1 -17
  551. package/src/network/reqresp/types.ts +0 -13
  552. package/src/network/subnets/attnetsService.ts +94 -6
  553. package/src/network/subnets/interface.ts +7 -0
  554. package/src/node/nodejs.ts +58 -22
  555. package/src/node/options.ts +9 -6
  556. package/src/sync/interface.ts +1 -0
  557. package/src/sync/range/batch.ts +9 -21
  558. package/src/sync/range/chain.ts +2 -14
  559. package/src/sync/sync.ts +65 -4
  560. package/src/sync/unknownBlock.ts +48 -36
  561. package/src/sync/utils/downloadByRange.ts +31 -230
  562. package/src/sync/utils/downloadByRoot.ts +15 -142
  563. package/src/util/blobs.ts +0 -34
  564. package/src/util/execution.ts +8 -102
  565. package/src/util/file.ts +8 -9
  566. package/src/util/queue/itemQueue.ts +1 -1
  567. package/src/util/sszBytes.ts +42 -24
  568. package/src/util/types.ts +1 -8
  569. package/lib/chain/errors/blobSidecarError.d.ts +0 -108
  570. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  571. package/lib/chain/errors/blobSidecarError.js +0 -38
  572. package/lib/chain/errors/blobSidecarError.js.map +0 -1
  573. package/lib/chain/validation/blobSidecar.d.ts +0 -16
  574. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  575. package/lib/chain/validation/blobSidecar.js +0 -276
  576. package/lib/chain/validation/blobSidecar.js.map +0 -1
  577. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
  578. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  579. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
  580. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
  581. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
  582. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  583. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
  584. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
  585. package/src/chain/errors/blobSidecarError.ts +0 -70
  586. package/src/chain/validation/blobSidecar.ts +0 -357
  587. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
  588. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
@@ -37,7 +37,7 @@ import {
37
37
  sszTypesFor,
38
38
  } from "@lodestar/types";
39
39
  import {fromHex, prettyGweiToEth, sleep, toHex, toRootHex} from "@lodestar/utils";
40
- import {BlockInputSource, isBlockInputBlobs, isBlockInputColumns} from "../../../../chain/blocks/blockInput/index.js";
40
+ import {BlockInputSource, isBlockInputColumns} from "../../../../chain/blocks/blockInput/index.js";
41
41
  import {PayloadEnvelopeInputSource} from "../../../../chain/blocks/payloadEnvelopeInput/index.js";
42
42
  import {ImportBlockOpts} from "../../../../chain/blocks/types.js";
43
43
  import {verifyBlocksInEpoch} from "../../../../chain/blocks/verifyBlock.js";
@@ -62,12 +62,11 @@ import {
62
62
  } from "../../../../chain/produceBlock/index.js";
63
63
  import {RegenCaller} from "../../../../chain/regen/index.js";
64
64
  import {validateGossipBlock, verifyBlockProposerSignature} from "../../../../chain/validation/block.js";
65
- import {validateApiExecutionPayloadBid} from "../../../../chain/validation/executionPayloadBid.js";
65
+ import {validateGossipExecutionPayloadBid} from "../../../../chain/validation/executionPayloadBid.js";
66
66
  import {validateApiExecutionPayloadEnvelope} from "../../../../chain/validation/executionPayloadEnvelope.js";
67
67
  import {OpSource} from "../../../../chain/validatorMonitor.js";
68
68
  import {
69
69
  computePreFuluKzgCommitmentsInclusionProof,
70
- getBlobSidecars,
71
70
  kzgCommitmentToVersionedHash,
72
71
  reconstructBlobs,
73
72
  } from "../../../../util/blobs.js";
@@ -79,6 +78,7 @@ import {
79
78
  import {isOptimisticBlock} from "../../../../util/forkChoice.js";
80
79
  import {kzg} from "../../../../util/kzg.js";
81
80
  import {promiseAllMaybeAsync} from "../../../../util/promises.js";
81
+ import {ApiOptions} from "../../../options.js";
82
82
  import {ApiModules} from "../../types.js";
83
83
  import {assertUniqueItems} from "../../utils.js";
84
84
  import {getBlockResponse, toBeaconHeaderResponse} from "./utils.js";
@@ -96,16 +96,10 @@ const MAX_API_CLOCK_DISPARITY_MS = 1000;
96
96
  */
97
97
  const IDENTITY_PEER_ID = ""; // TODO: Compute identity keypair
98
98
 
99
- export function getBeaconBlockApi({
100
- chain,
101
- config,
102
- metrics,
103
- network,
104
- db,
105
- }: Pick<
106
- ApiModules,
107
- "chain" | "config" | "metrics" | "network" | "db"
108
- >): ApplicationMethods<routes.beacon.block.Endpoints> {
99
+ export function getBeaconBlockApi(
100
+ opts: ApiOptions,
101
+ {chain, config, metrics, network, db}: Pick<ApiModules, "chain" | "config" | "metrics" | "network" | "db">
102
+ ): ApplicationMethods<routes.beacon.block.Endpoints> {
109
103
  const publishBlockV2: ApplicationMethods<routes.beacon.block.Endpoints>["publishBlockV2"] = async (
110
104
  {signedBlockContents, broadcastValidation, builderUrl},
111
105
  context,
@@ -115,6 +109,9 @@ export function getBeaconBlockApi({
115
109
  const signedBlock = signedBlockContents.signedBlock;
116
110
  const slot = signedBlock.message.slot;
117
111
  const fork = config.getForkName(slot);
112
+ if (!isForkPostFulu(fork)) {
113
+ throw new ApiError(400, `Publishing blocks is not supported for pre-fulu fork=${fork}`);
114
+ }
118
115
  const blockRoot = toRootHex(chain.config.getForkTypes(slot).BeaconBlock.hashTreeRoot(signedBlock.message));
119
116
 
120
117
  const blockForImport = chain.seenBlockInputCache.getByBlock({
@@ -136,40 +133,26 @@ export function getBeaconBlockApi({
136
133
  });
137
134
  }
138
135
 
139
- let blobSidecars: deneb.BlobSidecars, dataColumnSidecars: fulu.DataColumnSidecar[];
140
-
141
- if (isDenebBlockContents(signedBlockContents)) {
142
- if (isForkPostGloas(fork)) {
143
- // After gloas, data columns are not published with the block but when publishing the execution payload envelope
144
- blobSidecars = [];
145
- dataColumnSidecars = [];
146
- } else if (isForkPostFulu(fork)) {
147
- const timer = metrics?.peerDas.dataColumnSidecarComputationTime.startTimer();
148
- // If the block was produced by this node, we will already have computed cells
149
- // Otherwise, we will compute them from the blobs in this function
150
- const cells =
151
- (chain.blockProductionCache.get(blockRoot) as ProduceFullFulu)?.cells ??
152
- signedBlockContents.blobs.map((blob) => kzg.computeCells(blob));
153
- const cellsAndProofs = cells.map((rowCells, rowIndex) => ({
154
- cells: rowCells,
155
- proofs: signedBlockContents.kzgProofs.slice(rowIndex * NUMBER_OF_COLUMNS, (rowIndex + 1) * NUMBER_OF_COLUMNS),
156
- }));
157
- dataColumnSidecars = getDataColumnSidecarsFromBlock(
158
- config,
159
- signedBlock as SignedBeaconBlock<ForkPostFulu>,
160
- cellsAndProofs
161
- ) as fulu.DataColumnSidecar[];
162
- timer?.();
163
- blobSidecars = [];
164
- } else if (isForkPostDeneb(fork)) {
165
- blobSidecars = getBlobSidecars(config, signedBlock, signedBlockContents.blobs, signedBlockContents.kzgProofs);
166
- dataColumnSidecars = [];
167
- } else {
168
- throw Error(`Invalid data fork=${fork} for publish`);
169
- }
170
- } else {
171
- blobSidecars = [];
172
- dataColumnSidecars = [];
136
+ // After gloas, data columns are not published with the block but when publishing the execution payload envelope.
137
+ let dataColumnSidecars: fulu.DataColumnSidecar[] = [];
138
+
139
+ if (isDenebBlockContents(signedBlockContents) && isForkPostFulu(fork) && !isForkPostGloas(fork)) {
140
+ const timer = metrics?.peerDas.dataColumnSidecarComputationTime.startTimer();
141
+ // If the block was produced by this node, we will already have computed cells
142
+ // Otherwise, we will compute them from the blobs in this function
143
+ const cells =
144
+ (chain.blockProductionCache.get(blockRoot) as ProduceFullFulu)?.cells ??
145
+ signedBlockContents.blobs.map((blob) => kzg.computeCells(blob));
146
+ const cellsAndProofs = cells.map((rowCells, rowIndex) => ({
147
+ cells: rowCells,
148
+ proofs: signedBlockContents.kzgProofs.slice(rowIndex * NUMBER_OF_COLUMNS, (rowIndex + 1) * NUMBER_OF_COLUMNS),
149
+ }));
150
+ dataColumnSidecars = getDataColumnSidecarsFromBlock(
151
+ config,
152
+ signedBlock as SignedBeaconBlock<ForkPostFulu>,
153
+ cellsAndProofs
154
+ ) as fulu.DataColumnSidecar[];
155
+ timer?.();
173
156
  }
174
157
 
175
158
  if (isBlockInputColumns(blockForImport)) {
@@ -187,19 +170,6 @@ export function getBeaconBlockApi({
187
170
  {throwOnDuplicateAdd: false}
188
171
  );
189
172
  }
190
- } else if (isBlockInputBlobs(blockForImport)) {
191
- for (const blobSidecar of blobSidecars) {
192
- blockForImport.addBlob(
193
- {
194
- blockRootHex: blockRoot,
195
- blobSidecar,
196
- source: BlockInputSource.api,
197
- seenTimestampSec,
198
- },
199
- // Same as above for columns
200
- {throwOnDuplicateAdd: false}
201
- );
202
- }
203
173
  }
204
174
 
205
175
  // check what validations have been requested before broadcasting and publishing the block
@@ -321,18 +291,8 @@ export function getBeaconBlockApi({
321
291
  break;
322
292
  }
323
293
 
324
- case routes.beacon.BroadcastValidation.none: {
325
- chain.logger.debug("Skipping broadcast validation", valLogMeta);
326
- break;
327
- }
328
-
329
294
  default: {
330
- // error or log warning we do not support this validation
331
- const message = `Broadcast validation of ${broadcastValidation} type not implemented yet`;
332
- if (chain.opts.broadcastValidationStrictness === "error") {
333
- throw Error(message);
334
- }
335
- chain.logger.warn(message, valLogMeta);
295
+ throw new ApiError(400, `Invalid broadcast validation level ${broadcastValidation}`);
336
296
  }
337
297
  }
338
298
 
@@ -399,29 +359,26 @@ export function getBeaconBlockApi({
399
359
  //
400
360
  () => network.publishBeaconBlock(signedBlock),
401
361
  ...dataColumnSidecars.map((dataColumnSidecar) => () => network.publishDataColumnSidecar(dataColumnSidecar)),
402
- ...blobSidecars.map((blobSidecar) => () => network.publishBlobSidecar(blobSidecar)),
403
362
  () =>
404
363
  // there is no rush to persist block since we published it to gossip anyway
405
- chain
406
- .processBlock(blockForImport, opts)
407
- .catch((e) => {
408
- if (e instanceof BlockError) {
409
- switch (e.type.code) {
410
- case BlockErrorCode.ALREADY_KNOWN:
411
- // Block was imported while publishing, e.g. received via gossip
412
- chain.logger.debug("Ignoring already-known block during publishing", valLogMeta);
413
- return;
414
- case BlockErrorCode.PARENT_BLOCK_UNKNOWN:
415
- case BlockErrorCode.PARENT_PAYLOAD_UNKNOWN:
416
- chain.emitter.emit(ChainEvent.blockUnknownParent, {
417
- blockInput: blockForImport,
418
- peer: IDENTITY_PEER_ID,
419
- source: BlockInputSource.api,
420
- });
421
- }
364
+ chain.processBlock(blockForImport, opts).catch((e) => {
365
+ if (e instanceof BlockError) {
366
+ switch (e.type.code) {
367
+ case BlockErrorCode.ALREADY_KNOWN:
368
+ // Block was imported while publishing, e.g. received via gossip
369
+ chain.logger.debug("Ignoring already-known block during publishing", valLogMeta);
370
+ return;
371
+ case BlockErrorCode.PARENT_BLOCK_UNKNOWN:
372
+ case BlockErrorCode.PARENT_PAYLOAD_UNKNOWN:
373
+ chain.emitter.emit(ChainEvent.blockUnknownParent, {
374
+ blockInput: blockForImport,
375
+ peer: IDENTITY_PEER_ID,
376
+ source: BlockInputSource.api,
377
+ });
422
378
  }
423
- throw e;
424
- }),
379
+ }
380
+ throw e;
381
+ }),
425
382
  ];
426
383
  const sentPeersArr = await promiseAllMaybeAsync<{sentPeers: number; alreadyPublished: boolean} | number | void>(
427
384
  publishPromises
@@ -471,20 +428,6 @@ export function getBeaconBlockApi({
471
428
  });
472
429
  }
473
430
  }
474
- } else if (isBlockInputBlobs(blockForImport) && chain.emitter.listenerCount(routes.events.EventType.blobSidecar)) {
475
- const blobSidecars = blockForImport.getBlobs();
476
- const versionedHashes = blockForImport.getVersionedHashes();
477
-
478
- for (const blobSidecar of blobSidecars) {
479
- const {index, kzgCommitment} = blobSidecar;
480
- chain.emitter.emit(routes.events.EventType.blobSidecar, {
481
- blockRoot,
482
- slot,
483
- index,
484
- kzgCommitment: toHex(kzgCommitment),
485
- versionedHash: toHex(versionedHashes[index]),
486
- });
487
- }
488
431
  }
489
432
  };
490
433
 
@@ -809,11 +752,6 @@ export function getBeaconBlockApi({
809
752
  };
810
753
  try {
811
754
  switch (broadcastValidation) {
812
- case routes.beacon.BroadcastValidation.none: {
813
- chain.logger.debug("Skipping broadcast validation of execution payload envelope", valLogMeta);
814
- break;
815
- }
816
-
817
755
  case routes.beacon.BroadcastValidation.gossip: {
818
756
  await validateApiExecutionPayloadEnvelope(chain, signedExecutionPayloadEnvelope);
819
757
  break;
@@ -852,11 +790,7 @@ export function getBeaconBlockApi({
852
790
  }
853
791
 
854
792
  default: {
855
- const message = `Broadcast validation of ${broadcastValidation} type not implemented yet`;
856
- if (chain.opts.broadcastValidationStrictness === "error") {
857
- throw Error(message);
858
- }
859
- chain.logger.warn(message, valLogMeta);
793
+ throw new ApiError(400, `Invalid broadcast validation level ${broadcastValidation}`);
860
794
  }
861
795
  }
862
796
  } catch (error) {
@@ -1008,9 +942,13 @@ export function getBeaconBlockApi({
1008
942
  () => network.publishSignedExecutionPayloadEnvelope(signedExecutionPayloadEnvelope),
1009
943
  // Publish all data column sidecars
1010
944
  ...dataColumnSidecars.map((dataColumnSidecar) => () => network.publishDataColumnSidecar(dataColumnSidecar)),
1011
- // Import execution payload. Signature is verified during broadcast validation, an already
1012
- // known envelope was verified by its original source and `none` deliberately skips validation
1013
- () => chain.processExecutionPayload(payloadInput, {validSignature: true}),
945
+ // Import execution payload
946
+ () =>
947
+ chain.processExecutionPayload(payloadInput, {
948
+ // Signature is verified during broadcast validation only for the submitted envelope,
949
+ // an envelope cached by another source is verified at import
950
+ validSignature: payloadInput.getPayloadEnvelope() === signedExecutionPayloadEnvelope,
951
+ }),
1014
952
  ];
1015
953
 
1016
954
  const publishPromise = promiseAllMaybeAsync<{sentPeers: number; alreadyPublished: boolean} | number | void>(
@@ -1077,15 +1015,25 @@ export function getBeaconBlockApi({
1077
1015
  throw new ApiError(400, `publishExecutionPayloadBid not supported for pre-gloas fork=${fork}`);
1078
1016
  }
1079
1017
 
1080
- const validationTimer = metrics?.opPool.executionPayloadBidPool.apiValidationTime.startTimer();
1081
- // TODO: once the builder is tested and can be trusted, skip this local validation
1082
- // to publish faster, accepting peer-score risk if it ever emits an invalid bid.
1083
- await validateApiExecutionPayloadBid(chain, signedExecutionPayloadBid);
1084
- validationTimer?.();
1085
-
1086
1018
  const elapsedSec = chain.clock.secFromSlot(slot, seenTimestampSec);
1087
1019
  metrics?.gossipExecutionPayloadBid.elapsedTimeTillReceived.observe({source: OpSource.api}, elapsedSec);
1088
1020
 
1021
+ if (!opts.disableBidValidation) {
1022
+ const validationTimer = metrics?.opPool.executionPayloadBidPool.apiValidationTime.startTimer();
1023
+ const {proposerIndex} = await validateGossipExecutionPayloadBid(chain, signedExecutionPayloadBid);
1024
+ validationTimer?.();
1025
+
1026
+ // Gossip does not deliver our own messages back to us, so a validated bid is added to the
1027
+ // pool here to allow a proposer on this node to select it
1028
+ const insertOutcome = chain.executionPayloadBidPool.add(
1029
+ signedExecutionPayloadBid,
1030
+ Math.floor(elapsedSec * 1000)
1031
+ );
1032
+ metrics?.opPool.executionPayloadBidPool.apiInsertOutcome.inc({insertOutcome});
1033
+
1034
+ chain.validatorMonitor?.registerExecutionPayloadBid(OpSource.api, proposerIndex, bid);
1035
+ }
1036
+
1089
1037
  const sentPeers = await network.publishSignedExecutionPayloadBid(signedExecutionPayloadBid);
1090
1038
 
1091
1039
  chain.emitter.emit(routes.events.EventType.executionPayloadBid, {
@@ -1104,7 +1052,7 @@ export function getBeaconBlockApi({
1104
1052
  },
1105
1053
 
1106
1054
  async getSignedExecutionPayloadEnvelope({blockId}, context) {
1107
- const {block, executionOptimistic, finalized} = await getBlockResponse(chain, blockId);
1055
+ const {block, finalized} = await getBlockResponse(chain, blockId);
1108
1056
  const slot = block.message.slot;
1109
1057
  const fork = config.getForkName(slot);
1110
1058
 
@@ -1118,6 +1066,13 @@ export function getBeaconBlockApi({
1118
1066
  const blockRoot = config.getForkTypes(slot).BeaconBlock.hashTreeRoot(block.message);
1119
1067
  const blockRootHex = toRootHex(blockRoot);
1120
1068
 
1069
+ // The block's own flag is the status of the payload it builds on, the envelope's is that of its
1070
+ // FULL variant. An unfinalized block without one has not imported its envelope yet.
1071
+ const payload = finalized ? null : chain.forkChoice.getBlockHex(blockRootHex, PayloadStatus.FULL);
1072
+ if (!finalized && payload === null) {
1073
+ throw new ApiError(404, `Execution payload envelope not found for slot=${slot}, blockRoot=${blockRootHex}`);
1074
+ }
1075
+
1121
1076
  let data: Uint8Array | gloas.SignedExecutionPayloadEnvelope | null;
1122
1077
  try {
1123
1078
  data = context?.returnBytes
@@ -1142,7 +1097,7 @@ export function getBeaconBlockApi({
1142
1097
 
1143
1098
  return {
1144
1099
  data,
1145
- meta: {executionOptimistic, finalized, version: fork},
1100
+ meta: {executionOptimistic: payload !== null && isOptimisticBlock(payload), finalized, version: fork},
1146
1101
  };
1147
1102
  },
1148
1103
 
@@ -3,6 +3,7 @@ import {ApplicationMethods} from "@lodestar/api/server";
3
3
  import {isForkPostGloas} from "@lodestar/params";
4
4
  import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
5
5
  import {toRootHex} from "@lodestar/utils";
6
+ import {ApiOptions} from "../../options.js";
6
7
  import {ApiError} from "../errors.js";
7
8
  import {ApiModules} from "../types.js";
8
9
  import {getBeaconBlockApi} from "./blocks/index.js";
@@ -11,9 +12,10 @@ import {getBeaconRewardsApi} from "./rewards/index.js";
11
12
  import {getBeaconStateApi} from "./state/index.js";
12
13
 
13
14
  export function getBeaconApi(
15
+ opts: ApiOptions,
14
16
  modules: Pick<ApiModules, "chain" | "config" | "logger" | "metrics" | "network" | "db" | "sync">
15
17
  ): ApplicationMethods<routes.beacon.Endpoints> {
16
- const block = getBeaconBlockApi(modules);
18
+ const block = getBeaconBlockApi(opts, modules);
17
19
  const pool = getBeaconPoolApi(modules);
18
20
  const state = getBeaconStateApi(modules);
19
21
  const rewards = getBeaconRewardsApi(modules);
@@ -17,6 +17,7 @@ import {
17
17
  PayloadAttestationError,
18
18
  PayloadAttestationErrorCode,
19
19
  SyncCommitteeError,
20
+ SyncCommitteeErrorCode,
20
21
  } from "../../../../chain/errors/index.js";
21
22
  import {validateApiAttesterSlashing} from "../../../../chain/validation/attesterSlashing.js";
22
23
  import {validateApiBlsToExecutionChange} from "../../../../chain/validation/blsToExecutionChange.js";
@@ -122,6 +123,32 @@ export function getBeaconPoolApi({
122
123
  logger.debug("Error adding unaggregated attestation to pool", {subnet}, e as Error);
123
124
  }
124
125
 
126
+ // Collected only for vote slots that an upcoming block of a connected validator can include
127
+ if (isForkPostElectra(fork) && chain.proposerTracker.shouldCollect(slot)) {
128
+ try {
129
+ const insertOutcome = chain.singleAttestationPool.add(
130
+ attestation as SingleAttestation<ForkPostElectra>,
131
+ attDataRootHex,
132
+ validatorCommitteeIndex,
133
+ committeeSize
134
+ );
135
+ metrics?.opPool.singleAttestationPool.apiInsertOutcome.inc({insertOutcome});
136
+ } catch (e) {
137
+ logger.debug(
138
+ "Error adding single attestation to pool",
139
+ {
140
+ slot,
141
+ committeeIndex,
142
+ validatorCommitteeIndex,
143
+ validatorIndex: (attestation as SingleAttestation<ForkPostElectra>).attesterIndex,
144
+ subnet,
145
+ attDataRoot: attDataRootHex,
146
+ },
147
+ e as Error
148
+ );
149
+ }
150
+ }
151
+
125
152
  if (isForkPostElectra(fork)) {
126
153
  chain.emitter.emit(
127
154
  routes.events.EventType.singleAttestation,
@@ -340,7 +367,10 @@ export function getBeaconPoolApi({
340
367
  const synCommittee = state.getIndexedSyncCommittee(signature.slot);
341
368
  const indexesInCommittee = synCommittee.validatorIndexMap.get(signature.validatorIndex);
342
369
  if (indexesInCommittee === undefined || indexesInCommittee.length === 0) {
343
- return; // Not a sync committee member
370
+ throw new SyncCommitteeError(GossipAction.REJECT, {
371
+ code: SyncCommitteeErrorCode.VALIDATOR_NOT_IN_SYNC_COMMITTEE,
372
+ validatorIndex: signature.validatorIndex,
373
+ });
344
374
  }
345
375
 
346
376
  // Verify signature only, all other data is very likely to be correct, since the `signature` object is created by this node.
@@ -1,6 +1,6 @@
1
- import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
2
1
  import {routes} from "@lodestar/api";
3
2
  import {CheckpointWithHex, IForkChoice} from "@lodestar/fork-choice";
3
+ import {type PubkeyCache} from "@lodestar/native/pubkeys";
4
4
  import {GENESIS_SLOT} from "@lodestar/params";
5
5
  import {IBeaconStateView, IBeaconStateViewGloas} from "@lodestar/state-transition";
6
6
  import {
@@ -94,7 +94,7 @@ import {
94
94
  import {validateGossipProposerPreferences} from "../../../chain/validation/proposerPreferences.js";
95
95
  import {validateSyncCommitteeGossipContributionAndProof} from "../../../chain/validation/syncCommitteeContributionAndProof.js";
96
96
  import {ZERO_HASH} from "../../../constants/index.js";
97
- import {BUILDER_BID_DEADLINE_MS, BuilderApiBid, decodeBuilderUrl} from "../../../execution/builder/apiClient.js";
97
+ import {BuilderApiBid, decodeBuilderUrl} from "../../../execution/builder/apiClient.js";
98
98
  import {BuilderStatus, NoBidReceived} from "../../../execution/builder/http.js";
99
99
  import {getBuilderBidTotalGwei, validateBuilderApiExecutionPayloadBid} from "../../../execution/builder/validateBid.js";
100
100
  import {validateGossipFnRetryUnknownRoot} from "../../../network/processor/gossipHandlers.js";
@@ -123,10 +123,14 @@ import {
123
123
  * A cutoff of 1667 BPS (2 seconds for 12s slots) gives enough time and if there are unexpected delays
124
124
  * it ensures we publish in time as proposals after the attestation deadline will likely be orphaned
125
125
  * due to proposer boost reorg.
126
- *
127
- * TODO GLOAS: re-evaluate cutoff timing due to attestation deadline changes in gloas
128
126
  */
129
127
  const BLOCK_PRODUCTION_RACE_CUTOFF_BPS = 1667;
128
+ /**
129
+ * Post-gloas cutoff, kept at 1667 BPS (2 seconds for 12s slots) for now.
130
+ *
131
+ * TODO GLOAS: revisit, the block propagates faster as it only commits to a bid and the attestation deadline changed
132
+ */
133
+ export const BLOCK_PRODUCTION_RACE_CUTOFF_GLOAS_BPS = 1667;
130
134
  /** Rejection message of the bid block branch when there is no viable bid to commit to */
131
135
  const NO_BID_AVAILABLE = "No builder bid available";
132
136
 
@@ -1005,33 +1009,50 @@ export function getValidatorApi(
1005
1009
  (!circuitBreakerActive &&
1006
1010
  chain.executionPayloadBidPool.getBestBid(slot, bidParentBlockHash, parentBlockRootHex) !== null);
1007
1011
 
1008
- // Select the p2p bid once builders had time to bid up, matching the deadline advertised
1009
- // on builder API bid requests, unless the circuit breaker is active
1010
- const p2pBidPromise: Promise<PooledExecutionPayloadBid | null> = circuitBreakerActive
1011
- ? Promise.resolve(null)
1012
- : sleep(Math.max(0, BUILDER_BID_DEADLINE_MS - chain.clock.msFromSlot(slot))).then(() => {
1013
- const p2pBid = chain.executionPayloadBidPool.getBestBid(slot, bidParentBlockHash, parentBlockRootHex);
1014
- // Discard p2p bids below the proposer's configured floor on the total payment.
1015
- // A p2p bid's total is just its value since gossip validation enforces executionPayment=0.
1016
- if (p2pBid !== null && BigInt(p2pBid.signedBid.message.value) < builderConfig.minBid) {
1017
- logger.info("Best p2p bid below configured minimum", {
1018
- slot,
1019
- bidValue: prettyGweiToEth(p2pBid.signedBid.message.value),
1020
- minBid: prettyGweiToEth(builderConfig.minBid),
1021
- });
1022
- return null;
1023
- }
1024
- return p2pBid;
1025
- });
1012
+ // Calculate cutoff time based on start of the slot, ensures a slow local payload build does
1013
+ // not delay the proposal when a builder bid block is available (and vice versa)
1014
+ const cutoffMs = Math.max(
1015
+ 0,
1016
+ config.getSlotComponentDurationMs(fork, BLOCK_PRODUCTION_RACE_CUTOFF_GLOAS_BPS) - chain.clock.msFromSlot(slot)
1017
+ );
1018
+
1019
+ // Give p2p bids the same time to bid up as granted to builder API bid requests via the advertised
1020
+ // deadline, the pool is read once the deadline passed and the bid requests settled. A late request
1021
+ // does not wait past the race cutoff, a pooled bid is still the fastest fallback if the local block fails
1022
+ const bidDeadlinePromise = circuitBreakerActive
1023
+ ? Promise.resolve()
1024
+ : sleep(Math.min(chain.builderApiClient.bidDeadline, cutoffMs));
1026
1025
 
1027
1026
  // Candidates are ranked by their boosted counted total payment, the p2p bid is governed
1028
1027
  // by the top-level factors and each builder API bid by its own entry. Ties prefer the
1029
1028
  // earliest received builder API bid, so the signed block can be routed back to its
1030
1029
  // builder directly.
1031
1030
  const bestBidPromise: Promise<BidCandidate | null> = (async () => {
1032
- const [builderApiBids, p2pBid] = await Promise.all([builderApiBidsPromise, p2pBidPromise]);
1031
+ // Past the race cutoff a pooled p2p bid is used right away rather than waiting for pending
1032
+ // builder API requests, the local block is selected at the cutoff anyway if it is ready
1033
+ let [builderApiBids] = await Promise.all([
1034
+ Promise.race([builderApiBidsPromise, sleep(cutoffMs).then(() => null)]),
1035
+ bidDeadlinePromise,
1036
+ ]);
1033
1037
  let parentExecutionRequestsPromise: Promise<gloas.ExecutionRequests> | null = null;
1034
1038
 
1039
+ let p2pBid: PooledExecutionPayloadBid | null = circuitBreakerActive
1040
+ ? null
1041
+ : chain.executionPayloadBidPool.getBestBid(slot, bidParentBlockHash, parentBlockRootHex);
1042
+ // Discard p2p bids below the proposer's configured floor on the total payment.
1043
+ // A p2p bid's total is just its value since gossip validation enforces executionPayment=0.
1044
+ if (p2pBid !== null && BigInt(p2pBid.signedBid.message.value) < builderConfig.minBid) {
1045
+ logger.info("Best p2p bid below configured minimum", {
1046
+ slot,
1047
+ bidValue: prettyGweiToEth(p2pBid.signedBid.message.value),
1048
+ minBid: prettyGweiToEth(builderConfig.minBid),
1049
+ });
1050
+ p2pBid = null;
1051
+ }
1052
+ if (builderApiBids === null) {
1053
+ builderApiBids = p2pBid !== null ? [] : await builderApiBidsPromise;
1054
+ }
1055
+
1035
1056
  const candidates = (
1036
1057
  await Promise.all(
1037
1058
  builderApiBids.map(async ({url, entry, signedBid, receivedMs}): Promise<BidCandidate | null> => {
@@ -1118,13 +1139,6 @@ export function getValidatorApi(
1118
1139
  return fn().finally(() => t?.({source}));
1119
1140
  };
1120
1141
 
1121
- // Calculate cutoff time based on start of the slot, ensures a slow local payload build does
1122
- // not delay the proposal when a builder bid block is available (and vice versa)
1123
- const cutoffMs = Math.max(
1124
- 0,
1125
- config.getSlotComponentDurationMs(fork, BLOCK_PRODUCTION_RACE_CUTOFF_BPS) - chain.clock.msFromSlot(slot)
1126
- );
1127
-
1128
1142
  // use abort controller to stop waiting for the bid block if the engine block will be selected
1129
1143
  const controller = new AbortController();
1130
1144
 
@@ -1756,7 +1770,10 @@ export function getValidatorApi(
1756
1770
  }
1757
1771
  }
1758
1772
 
1759
- const dependentRoot = fromHex(state.getShufflingDecisionRoot(epoch));
1773
+ // The fork epoch PTC is computed at the fork from effective balances updated at the end of the
1774
+ // last pre-fork epoch, so its dependent root is one epoch later than for other epochs
1775
+ const dependentRootEpoch = epoch === config.GLOAS_FORK_EPOCH ? epoch + 1 : epoch;
1776
+ const dependentRoot = fromHex(state.getShufflingDecisionRoot(dependentRootEpoch));
1760
1777
 
1761
1778
  return {
1762
1779
  data: duties,
@@ -2,6 +2,8 @@ import {BeaconRestApiServerOpts, beaconRestApiServerOpts} from "./rest/index.js"
2
2
 
3
3
  export type ApiOptions = {
4
4
  maxGindicesInProof?: number;
5
+ /** Broadcast execution payload bids submitted via the API without running gossip validation */
6
+ disableBidValidation?: boolean;
5
7
  rest: BeaconRestApiServerOpts;
6
8
  commit?: string;
7
9
  version?: string;
@@ -10,6 +12,7 @@ export type ApiOptions = {
10
12
 
11
13
  export const defaultApiOptions: ApiOptions = {
12
14
  maxGindicesInProof: 512,
15
+ disableBidValidation: false,
13
16
  rest: beaconRestApiServerOpts,
14
17
  version: "dev",
15
18
  private: false,