@lodestar/beacon-node 1.47.0-dev.f3dcc639a0 → 1.47.0-rc.0

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 (327) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +40 -12
  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 +21 -2
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/utils.d.ts +2 -1
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  10. package/lib/api/impl/events/index.d.ts +1 -1
  11. package/lib/api/impl/events/index.d.ts.map +1 -1
  12. package/lib/api/impl/events/index.js +12 -3
  13. package/lib/api/impl/events/index.js.map +1 -1
  14. package/lib/api/impl/lodestar/index.js +1 -1
  15. package/lib/api/impl/lodestar/index.js.map +1 -1
  16. package/lib/api/impl/validator/index.d.ts.map +1 -1
  17. package/lib/api/impl/validator/index.js +232 -49
  18. package/lib/api/impl/validator/index.js.map +1 -1
  19. package/lib/api/impl/validator/utils.js +1 -1
  20. package/lib/api/impl/validator/utils.js.map +1 -1
  21. package/lib/api/rest/base.d.ts.map +1 -1
  22. package/lib/api/rest/base.js +7 -0
  23. package/lib/api/rest/base.js.map +1 -1
  24. package/lib/chain/archiveStore/archiveStore.js +1 -1
  25. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  26. package/lib/chain/blocks/importExecutionPayload.d.ts +3 -2
  27. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  28. package/lib/chain/blocks/importExecutionPayload.js +11 -9
  29. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  30. package/lib/chain/blocks/index.d.ts.map +1 -1
  31. package/lib/chain/blocks/index.js +14 -6
  32. package/lib/chain/blocks/index.js.map +1 -1
  33. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +2 -1
  34. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  35. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +6 -2
  36. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  37. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +14 -5
  38. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  39. package/lib/chain/blocks/payloadEnvelopeInput/types.js +5 -0
  40. package/lib/chain/blocks/payloadEnvelopeInput/types.js.map +1 -1
  41. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  42. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +22 -12
  43. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  44. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +2 -2
  45. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
  46. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +2 -2
  47. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
  48. package/lib/chain/bls/index.d.ts +1 -1
  49. package/lib/chain/bls/index.d.ts.map +1 -1
  50. package/lib/chain/bls/interface.d.ts +5 -5
  51. package/lib/chain/bls/interface.d.ts.map +1 -1
  52. package/lib/chain/bls/multithread/index.d.ts +5 -11
  53. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  54. package/lib/chain/bls/multithread/index.js +116 -101
  55. package/lib/chain/bls/multithread/index.js.map +1 -1
  56. package/lib/chain/bls/multithread/jobItem.d.ts +5 -19
  57. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  58. package/lib/chain/bls/multithread/jobItem.js +10 -65
  59. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  60. package/lib/chain/bls/multithread/types.d.ts +29 -8
  61. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  62. package/lib/chain/bls/multithread/types.js +12 -0
  63. package/lib/chain/bls/multithread/types.js.map +1 -1
  64. package/lib/chain/bls/multithread/utils.d.ts +4 -0
  65. package/lib/chain/bls/multithread/utils.d.ts.map +1 -1
  66. package/lib/chain/bls/multithread/utils.js +10 -0
  67. package/lib/chain/bls/multithread/utils.js.map +1 -1
  68. package/lib/chain/bls/multithread/worker.js +49 -23
  69. package/lib/chain/bls/multithread/worker.js.map +1 -1
  70. package/lib/chain/bls/singleThread.d.ts +4 -10
  71. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  72. package/lib/chain/bls/singleThread.js +8 -45
  73. package/lib/chain/bls/singleThread.js.map +1 -1
  74. package/lib/chain/bls/utils.d.ts +4 -4
  75. package/lib/chain/bls/utils.d.ts.map +1 -1
  76. package/lib/chain/bls/utils.js +18 -19
  77. package/lib/chain/bls/utils.js.map +1 -1
  78. package/lib/chain/chain.d.ts +8 -3
  79. package/lib/chain/chain.d.ts.map +1 -1
  80. package/lib/chain/chain.js +20 -7
  81. package/lib/chain/chain.js.map +1 -1
  82. package/lib/chain/errors/blockError.d.ts +1 -0
  83. package/lib/chain/errors/blockError.d.ts.map +1 -1
  84. package/lib/chain/errors/blockError.js +6 -1
  85. package/lib/chain/errors/blockError.js.map +1 -1
  86. package/lib/chain/errors/proposerPreferences.d.ts +6 -0
  87. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -1
  88. package/lib/chain/errors/proposerPreferences.js +1 -0
  89. package/lib/chain/errors/proposerPreferences.js.map +1 -1
  90. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  91. package/lib/chain/forkChoice/index.js +4 -0
  92. package/lib/chain/forkChoice/index.js.map +1 -1
  93. package/lib/chain/interface.d.ts +6 -2
  94. package/lib/chain/interface.d.ts.map +1 -1
  95. package/lib/chain/interface.js.map +1 -1
  96. package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
  97. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  98. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  99. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  100. package/lib/chain/opPools/attestationPool.js +1 -1
  101. package/lib/chain/opPools/attestationPool.js.map +1 -1
  102. package/lib/chain/opPools/deferredVoluntaryExitPool.d.ts +16 -0
  103. package/lib/chain/opPools/deferredVoluntaryExitPool.d.ts.map +1 -0
  104. package/lib/chain/opPools/deferredVoluntaryExitPool.js +57 -0
  105. package/lib/chain/opPools/deferredVoluntaryExitPool.js.map +1 -0
  106. package/lib/chain/opPools/executionPayloadBidPool.d.ts +7 -2
  107. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -1
  108. package/lib/chain/opPools/executionPayloadBidPool.js +4 -4
  109. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -1
  110. package/lib/chain/opPools/index.d.ts +2 -1
  111. package/lib/chain/opPools/index.d.ts.map +1 -1
  112. package/lib/chain/opPools/index.js +1 -0
  113. package/lib/chain/opPools/index.js.map +1 -1
  114. package/lib/chain/opPools/payloadAttestationPool.js +3 -3
  115. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  116. package/lib/chain/opPools/syncCommitteeMessagePool.js +1 -1
  117. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  118. package/lib/chain/opPools/syncContributionAndProofPool.js +1 -1
  119. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  120. package/lib/chain/opPools/utils.d.ts +1 -1
  121. package/lib/chain/opPools/utils.d.ts.map +1 -1
  122. package/lib/chain/opPools/utils.js +1 -1
  123. package/lib/chain/opPools/utils.js.map +1 -1
  124. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  125. package/lib/chain/prepareNextSlot.js +23 -5
  126. package/lib/chain/prepareNextSlot.js.map +1 -1
  127. package/lib/chain/produceBlock/produceBlockBody.js +1 -1
  128. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  129. package/lib/chain/regen/interface.d.ts +4 -2
  130. package/lib/chain/regen/interface.d.ts.map +1 -1
  131. package/lib/chain/regen/interface.js +2 -0
  132. package/lib/chain/regen/interface.js.map +1 -1
  133. package/lib/chain/regen/queued.d.ts +2 -2
  134. package/lib/chain/regen/queued.d.ts.map +1 -1
  135. package/lib/chain/regen/queued.js +5 -5
  136. package/lib/chain/regen/queued.js.map +1 -1
  137. package/lib/chain/seenCache/seenAttesters.d.ts +9 -5
  138. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
  139. package/lib/chain/seenCache/seenAttesters.js +25 -4
  140. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  141. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +28 -1
  142. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  143. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +121 -13
  144. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  145. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +5 -1
  146. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  147. package/lib/chain/stateCache/fifoBlockStateCache.js +6 -0
  148. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  149. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +47 -5
  150. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  151. package/lib/chain/stateCache/persistentCheckpointsCache.js +117 -7
  152. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  153. package/lib/chain/stateCache/types.d.ts +3 -3
  154. package/lib/chain/stateCache/types.d.ts.map +1 -1
  155. package/lib/chain/validation/attestation.d.ts.map +1 -1
  156. package/lib/chain/validation/attestation.js +1 -4
  157. package/lib/chain/validation/attestation.js.map +1 -1
  158. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  159. package/lib/chain/validation/attesterSlashing.js +1 -1
  160. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  161. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  162. package/lib/chain/validation/executionPayloadBid.js +3 -4
  163. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  164. package/lib/chain/validation/executionPayloadEnvelope.js +1 -1
  165. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  166. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  167. package/lib/chain/validation/payloadAttestationMessage.js +5 -14
  168. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  169. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -1
  170. package/lib/chain/validation/proposerPreferences.js +12 -3
  171. package/lib/chain/validation/proposerPreferences.js.map +1 -1
  172. package/lib/chain/validation/proposerSlashing.js +1 -1
  173. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  174. package/lib/chain/validation/voluntaryExit.d.ts +9 -1
  175. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
  176. package/lib/chain/validation/voluntaryExit.js +46 -1
  177. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  178. package/lib/execution/builder/apiClient.d.ts +64 -0
  179. package/lib/execution/builder/apiClient.d.ts.map +1 -0
  180. package/lib/execution/builder/apiClient.js +184 -0
  181. package/lib/execution/builder/apiClient.js.map +1 -0
  182. package/lib/execution/builder/validateBid.d.ts +22 -0
  183. package/lib/execution/builder/validateBid.d.ts.map +1 -0
  184. package/lib/execution/builder/validateBid.js +111 -0
  185. package/lib/execution/builder/validateBid.js.map +1 -0
  186. package/lib/metrics/metrics/lodestar.d.ts +74 -22
  187. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  188. package/lib/metrics/metrics/lodestar.js +142 -52
  189. package/lib/metrics/metrics/lodestar.js.map +1 -1
  190. package/lib/network/gossip/topic.d.ts +13 -0
  191. package/lib/network/gossip/topic.d.ts.map +1 -1
  192. package/lib/network/gossip/topic.js +37 -0
  193. package/lib/network/gossip/topic.js.map +1 -1
  194. package/lib/network/libp2p/index.d.ts.map +1 -1
  195. package/lib/network/libp2p/index.js +10 -2
  196. package/lib/network/libp2p/index.js.map +1 -1
  197. package/lib/network/network.d.ts.map +1 -1
  198. package/lib/network/network.js +22 -43
  199. package/lib/network/network.js.map +1 -1
  200. package/lib/network/processor/constants.d.ts +7 -0
  201. package/lib/network/processor/constants.d.ts.map +1 -0
  202. package/lib/network/processor/constants.js +7 -0
  203. package/lib/network/processor/constants.js.map +1 -0
  204. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  205. package/lib/network/processor/gossipHandlers.js +6 -2
  206. package/lib/network/processor/gossipHandlers.js.map +1 -1
  207. package/lib/network/processor/index.d.ts +3 -0
  208. package/lib/network/processor/index.d.ts.map +1 -1
  209. package/lib/network/processor/index.js +36 -15
  210. package/lib/network/processor/index.js.map +1 -1
  211. package/lib/network/reqresp/score.d.ts.map +1 -1
  212. package/lib/network/reqresp/score.js +5 -11
  213. package/lib/network/reqresp/score.js.map +1 -1
  214. package/lib/network/util.d.ts +0 -1
  215. package/lib/network/util.d.ts.map +1 -1
  216. package/lib/network/util.js +0 -4
  217. package/lib/network/util.js.map +1 -1
  218. package/lib/node/deferredVoluntaryExitPublisher.d.ts +15 -0
  219. package/lib/node/deferredVoluntaryExitPublisher.d.ts.map +1 -0
  220. package/lib/node/deferredVoluntaryExitPublisher.js +38 -0
  221. package/lib/node/deferredVoluntaryExitPublisher.js.map +1 -0
  222. package/lib/node/nodejs.d.ts +2 -1
  223. package/lib/node/nodejs.d.ts.map +1 -1
  224. package/lib/node/nodejs.js +7 -0
  225. package/lib/node/nodejs.js.map +1 -1
  226. package/lib/sync/range/batch.d.ts +23 -5
  227. package/lib/sync/range/batch.d.ts.map +1 -1
  228. package/lib/sync/range/batch.js +61 -22
  229. package/lib/sync/range/batch.js.map +1 -1
  230. package/lib/sync/range/chain.d.ts +2 -1
  231. package/lib/sync/range/chain.d.ts.map +1 -1
  232. package/lib/sync/range/chain.js +23 -10
  233. package/lib/sync/range/chain.js.map +1 -1
  234. package/lib/sync/types.d.ts +32 -0
  235. package/lib/sync/types.d.ts.map +1 -1
  236. package/lib/sync/types.js +33 -0
  237. package/lib/sync/types.js.map +1 -1
  238. package/lib/sync/unknownBlock.d.ts +15 -2
  239. package/lib/sync/unknownBlock.d.ts.map +1 -1
  240. package/lib/sync/unknownBlock.js +220 -61
  241. package/lib/sync/unknownBlock.js.map +1 -1
  242. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  243. package/lib/sync/utils/downloadByRange.js +16 -11
  244. package/lib/sync/utils/downloadByRange.js.map +1 -1
  245. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  246. package/lib/sync/utils/downloadByRoot.js +3 -1
  247. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  248. package/package.json +35 -35
  249. package/src/api/impl/beacon/blocks/index.ts +47 -15
  250. package/src/api/impl/beacon/pool/index.ts +22 -2
  251. package/src/api/impl/beacon/state/utils.ts +2 -1
  252. package/src/api/impl/events/index.ts +12 -4
  253. package/src/api/impl/lodestar/index.ts +1 -1
  254. package/src/api/impl/validator/index.ts +285 -49
  255. package/src/api/impl/validator/utils.ts +1 -1
  256. package/src/api/rest/base.ts +7 -0
  257. package/src/chain/archiveStore/archiveStore.ts +1 -1
  258. package/src/chain/blocks/importExecutionPayload.ts +12 -11
  259. package/src/chain/blocks/index.ts +18 -6
  260. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +8 -2
  261. package/src/chain/blocks/payloadEnvelopeInput/types.ts +17 -4
  262. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +25 -16
  263. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +1 -9
  264. package/src/chain/bls/index.ts +1 -1
  265. package/src/chain/bls/interface.ts +7 -3
  266. package/src/chain/bls/multithread/index.ts +148 -120
  267. package/src/chain/bls/multithread/jobItem.ts +12 -82
  268. package/src/chain/bls/multithread/types.ts +33 -8
  269. package/src/chain/bls/multithread/utils.ts +11 -0
  270. package/src/chain/bls/multithread/worker.ts +85 -27
  271. package/src/chain/bls/singleThread.ts +11 -55
  272. package/src/chain/bls/utils.ts +23 -24
  273. package/src/chain/chain.ts +23 -6
  274. package/src/chain/errors/blockError.ts +8 -2
  275. package/src/chain/errors/proposerPreferences.ts +7 -0
  276. package/src/chain/forkChoice/index.ts +4 -0
  277. package/src/chain/interface.ts +6 -1
  278. package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
  279. package/src/chain/opPools/attestationPool.ts +1 -1
  280. package/src/chain/opPools/deferredVoluntaryExitPool.ts +65 -0
  281. package/src/chain/opPools/executionPayloadBidPool.ts +13 -7
  282. package/src/chain/opPools/index.ts +2 -1
  283. package/src/chain/opPools/payloadAttestationPool.ts +3 -3
  284. package/src/chain/opPools/syncCommitteeMessagePool.ts +1 -1
  285. package/src/chain/opPools/syncContributionAndProofPool.ts +1 -1
  286. package/src/chain/opPools/utils.ts +1 -1
  287. package/src/chain/prepareNextSlot.ts +23 -5
  288. package/src/chain/produceBlock/produceBlockBody.ts +1 -1
  289. package/src/chain/regen/interface.ts +4 -2
  290. package/src/chain/regen/queued.ts +5 -5
  291. package/src/chain/seenCache/seenAttesters.ts +31 -5
  292. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +143 -14
  293. package/src/chain/stateCache/fifoBlockStateCache.ts +8 -1
  294. package/src/chain/stateCache/persistentCheckpointsCache.ts +133 -8
  295. package/src/chain/stateCache/types.ts +3 -3
  296. package/src/chain/validation/attestation.ts +1 -7
  297. package/src/chain/validation/attesterSlashing.ts +1 -8
  298. package/src/chain/validation/executionPayloadBid.ts +3 -4
  299. package/src/chain/validation/executionPayloadEnvelope.ts +0 -1
  300. package/src/chain/validation/payloadAttestationMessage.ts +6 -17
  301. package/src/chain/validation/proposerPreferences.ts +14 -4
  302. package/src/chain/validation/proposerSlashing.ts +1 -1
  303. package/src/chain/validation/voluntaryExit.ts +59 -2
  304. package/src/execution/builder/apiClient.ts +244 -0
  305. package/src/execution/builder/validateBid.ts +166 -0
  306. package/src/metrics/metrics/lodestar.ts +155 -57
  307. package/src/network/gossip/topic.ts +38 -0
  308. package/src/network/libp2p/index.ts +11 -2
  309. package/src/network/network.ts +27 -55
  310. package/src/network/processor/constants.ts +6 -0
  311. package/src/network/processor/gossipHandlers.ts +6 -2
  312. package/src/network/processor/index.ts +42 -19
  313. package/src/network/reqresp/score.ts +5 -11
  314. package/src/network/util.ts +0 -5
  315. package/src/node/deferredVoluntaryExitPublisher.ts +54 -0
  316. package/src/node/nodejs.ts +10 -1
  317. package/src/sync/range/batch.ts +83 -28
  318. package/src/sync/range/chain.ts +26 -11
  319. package/src/sync/types.ts +36 -1
  320. package/src/sync/unknownBlock.ts +258 -68
  321. package/src/sync/utils/downloadByRange.ts +21 -12
  322. package/src/sync/utils/downloadByRoot.ts +3 -1
  323. package/lib/chain/bls/maybeBatch.d.ts +0 -12
  324. package/lib/chain/bls/maybeBatch.d.ts.map +0 -1
  325. package/lib/chain/bls/maybeBatch.js +0 -35
  326. package/lib/chain/bls/maybeBatch.js.map +0 -1
  327. package/src/chain/bls/maybeBatch.ts +0 -45
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/ChainSafe/lodestar/issues"
13
13
  },
14
- "version": "1.47.0-dev.f3dcc639a0",
14
+ "version": "1.47.0-rc.0",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -100,51 +100,51 @@
100
100
  "check-readme": "pnpm exec tsx ../../scripts/check_readme.ts"
101
101
  },
102
102
  "dependencies": {
103
- "@chainsafe/as-sha256": "^1.2.4",
104
- "@chainsafe/blst": "^2.2.0",
103
+ "@chainsafe/as-sha256": "^1.2.5",
105
104
  "@chainsafe/discv5": "^12.0.2",
106
105
  "@chainsafe/enr": "^6.0.2",
107
106
  "@chainsafe/libp2p-noise": "^17.0.0",
108
107
  "@chainsafe/libp2p-quic": "^2.1.3",
109
- "@chainsafe/persistent-merkle-tree": "^1.3.0",
108
+ "@chainsafe/lodestar-z": "catalog:",
109
+ "@chainsafe/persistent-merkle-tree": "^1.3.1",
110
110
  "@chainsafe/prometheus-gc-stats": "^1.0.0",
111
111
  "@chainsafe/snappy-wasm": "^0.5.0",
112
- "@chainsafe/ssz": "^1.6.2",
112
+ "@chainsafe/ssz": "^1.6.3",
113
113
  "@chainsafe/threads": "^1.11.3",
114
114
  "@crate-crypto/node-eth-kzg": "0.9.1",
115
115
  "@fastify/bearer-auth": "^10.0.1",
116
116
  "@fastify/cors": "^10.0.1",
117
117
  "@fastify/swagger": "^9.0.0",
118
118
  "@fastify/swagger-ui": "^5.0.1",
119
- "@libp2p/bootstrap": "^12.0.14",
120
- "@libp2p/crypto": "^5.1.13",
121
- "@libp2p/gossipsub": "^16.0.2",
122
- "@libp2p/identify": "^4.0.13",
123
- "@libp2p/interface": "^3.1.0",
124
- "@libp2p/mdns": "^12.0.14",
125
- "@libp2p/mplex": "^12.0.14",
126
- "@libp2p/peer-id": "^6.0.4",
127
- "@libp2p/prometheus-metrics": "^5.0.14",
128
- "@libp2p/tcp": "^11.0.13",
129
- "@lodestar/api": "^1.47.0-dev.f3dcc639a0",
130
- "@lodestar/config": "^1.47.0-dev.f3dcc639a0",
131
- "@lodestar/db": "^1.47.0-dev.f3dcc639a0",
132
- "@lodestar/fork-choice": "^1.47.0-dev.f3dcc639a0",
133
- "@lodestar/logger": "^1.47.0-dev.f3dcc639a0",
134
- "@lodestar/params": "^1.47.0-dev.f3dcc639a0",
135
- "@lodestar/reqresp": "^1.47.0-dev.f3dcc639a0",
136
- "@lodestar/state-transition": "^1.47.0-dev.f3dcc639a0",
137
- "@lodestar/types": "^1.47.0-dev.f3dcc639a0",
138
- "@lodestar/utils": "^1.47.0-dev.f3dcc639a0",
139
- "@lodestar/validator": "^1.47.0-dev.f3dcc639a0",
119
+ "@libp2p/bootstrap": "^12.0.30",
120
+ "@libp2p/crypto": "^5.1.23",
121
+ "@libp2p/gossipsub": "^16.1.1",
122
+ "@libp2p/identify": "^4.1.13",
123
+ "@libp2p/interface": "^3.3.0",
124
+ "@libp2p/mdns": "^12.0.30",
125
+ "@libp2p/mplex": "^12.0.30",
126
+ "@libp2p/peer-id": "^6.0.15",
127
+ "@libp2p/prometheus-metrics": "^5.0.28",
128
+ "@libp2p/tcp": "^11.0.27",
129
+ "@lodestar/api": "^1.47.0-rc.0",
130
+ "@lodestar/config": "^1.47.0-rc.0",
131
+ "@lodestar/db": "^1.47.0-rc.0",
132
+ "@lodestar/fork-choice": "^1.47.0-rc.0",
133
+ "@lodestar/logger": "^1.47.0-rc.0",
134
+ "@lodestar/params": "^1.47.0-rc.0",
135
+ "@lodestar/reqresp": "^1.47.0-rc.0",
136
+ "@lodestar/state-transition": "^1.47.0-rc.0",
137
+ "@lodestar/types": "^1.47.0-rc.0",
138
+ "@lodestar/utils": "^1.47.0-rc.0",
139
+ "@lodestar/validator": "^1.47.0-rc.0",
140
140
  "@multiformats/multiaddr": "^13.0.1",
141
- "datastore-core": "^11.0.2",
142
- "datastore-level": "^12.0.2",
141
+ "datastore-core": "^12.0.1",
142
+ "datastore-level": "^13.0.1",
143
143
  "deepmerge": "^4.3.1",
144
144
  "fastify": "^5.8.1",
145
- "interface-datastore": "^9.0.2",
145
+ "interface-datastore": "^10.0.1",
146
146
  "jwt-simple": "0.5.6",
147
- "libp2p": "3.1.6",
147
+ "libp2p": "3.3.9",
148
148
  "multiformats": "^13.4.2",
149
149
  "prom-client": "^15.1.0",
150
150
  "qs": "^6.14.2",
@@ -155,10 +155,10 @@
155
155
  },
156
156
  "devDependencies": {
157
157
  "@chainsafe/swap-or-not-shuffle": "^1.2.1",
158
- "@libp2p/interface-internal": "^3.0.13",
159
- "@libp2p/logger": "^6.2.2",
160
- "@libp2p/utils": "^7.0.13",
161
- "@lodestar/spec-test-util": "^1.47.0-dev.f3dcc639a0",
158
+ "@libp2p/interface-internal": "^3.1.12",
159
+ "@libp2p/logger": "^6.2.13",
160
+ "@libp2p/utils": "^7.4.0",
161
+ "@lodestar/spec-test-util": "^1.47.0-rc.0",
162
162
  "@types/js-yaml": "^4.0.5",
163
163
  "@types/qs": "^6.9.7",
164
164
  "@types/tmp": "^0.2.3",
@@ -175,5 +175,5 @@
175
175
  "beacon",
176
176
  "blockchain"
177
177
  ],
178
- "gitHead": "b5dbe3d5e8479b739746117cac5ed76a8b4ced2b"
178
+ "gitHead": "f911cc099e402b3f8daf3130e722a09053c8e31f"
179
179
  }
@@ -104,8 +104,8 @@ export function getBeaconBlockApi({
104
104
  "chain" | "config" | "metrics" | "network" | "db"
105
105
  >): ApplicationMethods<routes.beacon.block.Endpoints> {
106
106
  const publishBlockV2: ApplicationMethods<routes.beacon.block.Endpoints>["publishBlockV2"] = async (
107
- {signedBlockContents, broadcastValidation},
108
- _context,
107
+ {signedBlockContents, broadcastValidation, builderUrl},
108
+ context,
109
109
  opts: PublishBlockOpts = {}
110
110
  ) => {
111
111
  const seenTimestampSec = Date.now() / 1000;
@@ -128,7 +128,8 @@ export function getBeaconBlockApi({
128
128
  forkName: fork,
129
129
  sampledColumns: chain.custodyConfig.sampledColumns,
130
130
  custodyColumns: chain.custodyConfig.custodyColumns,
131
- timeCreatedSec: seenTimestampSec,
131
+ seenTimestampSec,
132
+ source: PayloadEnvelopeInputSource.api,
132
133
  });
133
134
  }
134
135
 
@@ -208,6 +209,12 @@ export function getBeaconBlockApi({
208
209
  const blockLocallyProduced = chain.blockProductionCache.has(blockRoot);
209
210
  const valLogMeta = {slot, blockRoot, bodyRoot, broadcastValidation, blockLocallyProduced};
210
211
 
212
+ if (chain.forkChoice.hasBlockHex(blockRoot)) {
213
+ // Block was already imported, e.g. published again by the validator client or received via gossip
214
+ chain.logger.debug("Ignoring already-known block during publishing", valLogMeta);
215
+ return;
216
+ }
217
+
211
218
  switch (broadcastValidation) {
212
219
  case routes.beacon.BroadcastValidation.gossip: {
213
220
  if (!blockLocallyProduced) {
@@ -355,6 +362,24 @@ export function getBeaconBlockApi({
355
362
  chain.validatorMonitor?.registerBeaconBlock(OpSource.api, delaySec, signedBlock.message);
356
363
 
357
364
  chain.logger.info("Publishing block", valLogMeta);
365
+
366
+ // Forward the signed block to the winning builder echoed by the validator client so it can
367
+ // help disseminate the block and learn that its bid won without waiting for block gossip.
368
+ // Failures are non-fatal, the builder also sees the block on gossip.
369
+ if (isForkPostGloas(fork) && builderUrl !== undefined) {
370
+ const gloasBlock = signedBlock as SignedBeaconBlock<ForkPostGloas>;
371
+ if (gloasBlock.message.body.signedExecutionPayloadBid.message.builderIndex !== BUILDER_INDEX_SELF_BUILD) {
372
+ chain.builderApiClient
373
+ .submitSignedBeaconBlock(builderUrl, {data: gloasBlock, bytes: context?.sszBytes ?? undefined})
374
+ .then(() => {
375
+ chain.logger.debug("Submitted signed block to builder", {slot, builderUrl});
376
+ })
377
+ .catch((e) => {
378
+ chain.logger.warn("Failed to submit signed block to builder", {...valLogMeta, builderUrl}, e);
379
+ });
380
+ }
381
+ }
382
+
358
383
  const publishPromises = [
359
384
  // Send the block, regardless of whether or not it is valid. The API
360
385
  // specification is very clear that this is the desired behavior.
@@ -373,16 +398,20 @@ export function getBeaconBlockApi({
373
398
  chain
374
399
  .processBlock(blockForImport, opts)
375
400
  .catch((e) => {
376
- if (
377
- e instanceof BlockError &&
378
- (e.type.code === BlockErrorCode.PARENT_BLOCK_UNKNOWN ||
379
- e.type.code === BlockErrorCode.PARENT_PAYLOAD_UNKNOWN)
380
- ) {
381
- chain.emitter.emit(ChainEvent.blockUnknownParent, {
382
- blockInput: blockForImport,
383
- peer: IDENTITY_PEER_ID,
384
- source: BlockInputSource.api,
385
- });
401
+ if (e instanceof BlockError) {
402
+ switch (e.type.code) {
403
+ case BlockErrorCode.ALREADY_KNOWN:
404
+ // Block was imported while publishing, e.g. received via gossip
405
+ chain.logger.debug("Ignoring already-known block during publishing", valLogMeta);
406
+ return;
407
+ case BlockErrorCode.PARENT_BLOCK_UNKNOWN:
408
+ case BlockErrorCode.PARENT_PAYLOAD_UNKNOWN:
409
+ chain.emitter.emit(ChainEvent.blockUnknownParent, {
410
+ blockInput: blockForImport,
411
+ peer: IDENTITY_PEER_ID,
412
+ source: BlockInputSource.api,
413
+ });
414
+ }
386
415
  }
387
416
  throw e;
388
417
  }),
@@ -401,7 +430,7 @@ export function getBeaconBlockApi({
401
430
  for (let i = 0; i < dataColumnSidecars.length; i++) {
402
431
  // + 1 because we publish to beacon_block first
403
432
  const {sentPeers, alreadyPublished} = sentPeersArr[i + 1] as {sentPeers: number; alreadyPublished: boolean};
404
- // sent peers could be 0 as we set `allowPublishToZeroTopicPeers=true` in network.publishDataColumnSidecar()
433
+ // sent peers could be 0, data_column_sidecar opts out of the zero peers publish error, see gossipTopicAllowPublishToZeroPeers
405
434
  metrics?.dataColumns.sentPeersPerSubnet.observe(sentPeers);
406
435
  // A duplicate publish (alreadyPublished=true) means the column is already propagating on the network —
407
436
  // expected in self-build flows where peers gossip columns back to us before we publish the envelope.
@@ -1041,7 +1070,10 @@ export function getBeaconBlockApi({
1041
1070
  metrics?.gossipExecutionPayloadBid.elapsedTimeTillReceived.observe({source: OpSource.api}, elapsedSec);
1042
1071
 
1043
1072
  try {
1044
- const insertOutcome = chain.executionPayloadBidPool.add(signedExecutionPayloadBid);
1073
+ const insertOutcome = chain.executionPayloadBidPool.add(
1074
+ signedExecutionPayloadBid,
1075
+ Math.floor(elapsedSec * 1000)
1076
+ );
1045
1077
  metrics?.opPool.executionPayloadBidPool.apiInsertOutcome.inc({insertOutcome});
1046
1078
  } catch (e) {
1047
1079
  chain.logger.error("Error adding to executionPayloadBid pool", {}, e as Error);
@@ -100,7 +100,9 @@ export function getBeaconPoolApi({
100
100
  const {indexedAttestation, subnet, attDataRootHex, committeeIndex, validatorCommitteeIndex, committeeSize} =
101
101
  await validateGossipFnRetryUnknownRoot(validateFn, network, chain, slot, beaconBlockRoot);
102
102
 
103
- if (network.shouldAggregate(subnet, slot)) {
103
+ try {
104
+ // `is_aggregator` only covers aggregating what we receive on the subnet via gossip, not what
105
+ // a validator client hands us directly, see https://github.com/ChainSafe/lodestar/issues/7548
104
106
  const insertOutcome = chain.attestationPool.add(
105
107
  committeeIndex,
106
108
  attestation,
@@ -110,6 +112,10 @@ export function getBeaconPoolApi({
110
112
  priority
111
113
  );
112
114
  metrics?.opPool.attestationPool.apiInsertOutcome.inc({insertOutcome});
115
+ } catch (e) {
116
+ // The pool is a local optimization, failing to insert must not stop us from publishing a
117
+ // validated attestation, which the route requires us to do. Same handling as the gossip path
118
+ logger.debug("Error adding unaggregated attestation to pool", {subnet}, e as Error);
113
119
  }
114
120
 
115
121
  if (isForkPostElectra(fork)) {
@@ -173,7 +179,21 @@ export function getBeaconPoolApi({
173
179
  },
174
180
 
175
181
  async submitPoolVoluntaryExit({signedVoluntaryExit}) {
176
- await validateApiVoluntaryExit(chain, signedVoluntaryExit);
182
+ const result = await validateApiVoluntaryExit(chain, signedVoluntaryExit);
183
+
184
+ if (result.status === "deferred") {
185
+ const currentEpoch = chain.clock.currentEpoch;
186
+ const inserted = chain.deferredVoluntaryExitPool.insert(signedVoluntaryExit, result.validity, currentEpoch);
187
+ if (!inserted) {
188
+ throw new ApiError(400, "Deferred voluntary exit pool is full or already contains this validator");
189
+ }
190
+ logger.info("Voluntary exit deferred until transient conditions are met", {
191
+ validatorIndex: signedVoluntaryExit.message.validatorIndex,
192
+ reason: result.validity,
193
+ });
194
+ return;
195
+ }
196
+
177
197
  chain.opPool.insertVoluntaryExit(signedVoluntaryExit);
178
198
  chain.emitter.emit(routes.events.EventType.voluntaryExit, signedVoluntaryExit);
179
199
  await network.publishVoluntaryExit(signedVoluntaryExit);
@@ -1,7 +1,8 @@
1
+ import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
1
2
  import {routes} from "@lodestar/api";
2
3
  import {CheckpointWithHex, IForkChoice} from "@lodestar/fork-choice";
3
4
  import {GENESIS_SLOT} from "@lodestar/params";
4
- import {IBeaconStateView, IBeaconStateViewGloas, PubkeyCache} from "@lodestar/state-transition";
5
+ import {IBeaconStateView, IBeaconStateViewGloas} from "@lodestar/state-transition";
5
6
  import {
6
7
  BLSPubkey,
7
8
  BuilderIndex,
@@ -4,7 +4,8 @@ import {ApiModules} from "../types.js";
4
4
 
5
5
  export function getEventsApi({
6
6
  chain,
7
- }: Pick<ApiModules, "chain" | "config">): ApplicationMethods<routes.events.Endpoints> {
7
+ logger,
8
+ }: Pick<ApiModules, "chain" | "config" | "logger">): ApplicationMethods<routes.events.Endpoints> {
8
9
  return {
9
10
  async eventstream({topics, signal, onEvent}) {
10
11
  const onAbortFns: (() => void)[] = [];
@@ -12,9 +13,16 @@ export function getEventsApi({
12
13
  for (const topic of topics) {
13
14
  // biome-ignore lint/suspicious/noExplicitAny: We need to use `any` type here
14
15
  const handler = (data: any): void => {
15
- // TODO: What happens if this handler throws? Does it break the other chain.emitter listeners?
16
-
17
- onEvent({type: topic, message: data});
16
+ try {
17
+ // TS only relates `{type, message}` to the `BeaconEvent` discriminated union while
18
+ // `EventType` stays within its ~25-member cap; without the cast, adding events trips TS2345.
19
+ onEvent({type: topic, message: data} as routes.events.BeaconEvent);
20
+ } catch (e) {
21
+ // `chain.emitter` emits synchronously, a throwing listener would propagate the error to
22
+ // whoever emitted the event, e.g. a gossip handler, and skip the remaining listeners.
23
+ // A single misbehaving event or client must not affect the node or other subscribers.
24
+ logger.warn("Error sending event to client", {topic}, e as Error);
25
+ }
18
26
  };
19
27
 
20
28
  chain.emitter.on(topic, handler);
@@ -147,7 +147,7 @@ export function getLodestarApi({
147
147
  },
148
148
 
149
149
  async dropStateCache() {
150
- chain.regen.dropCache();
150
+ await chain.regen.dropCache();
151
151
  },
152
152
 
153
153
  async connectPeer({peerId, multiaddrs}) {