@lodestar/beacon-node 1.47.0-dev.ec596194e2 → 1.47.0-dev.f0f26cd2b6

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 (357) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +47 -18
  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 +25 -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/archiveStore/historicalState/metrics.d.ts.map +1 -1
  27. package/lib/chain/archiveStore/historicalState/metrics.js +21 -0
  28. package/lib/chain/archiveStore/historicalState/metrics.js.map +1 -1
  29. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  30. package/lib/chain/blocks/importBlock.js +2 -7
  31. package/lib/chain/blocks/importBlock.js.map +1 -1
  32. package/lib/chain/blocks/importExecutionPayload.d.ts +3 -2
  33. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  34. package/lib/chain/blocks/importExecutionPayload.js +11 -9
  35. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  36. package/lib/chain/blocks/index.d.ts.map +1 -1
  37. package/lib/chain/blocks/index.js +21 -13
  38. package/lib/chain/blocks/index.js.map +1 -1
  39. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +2 -1
  40. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  41. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +6 -2
  42. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  43. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +14 -5
  44. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  45. package/lib/chain/blocks/payloadEnvelopeInput/types.js +5 -0
  46. package/lib/chain/blocks/payloadEnvelopeInput/types.js.map +1 -1
  47. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  48. package/lib/chain/blocks/verifyBlock.js +5 -2
  49. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  50. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  51. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +22 -12
  52. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  53. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +2 -2
  54. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
  55. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +2 -2
  56. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
  57. package/lib/chain/bls/index.d.ts +1 -1
  58. package/lib/chain/bls/index.d.ts.map +1 -1
  59. package/lib/chain/bls/interface.d.ts +5 -5
  60. package/lib/chain/bls/interface.d.ts.map +1 -1
  61. package/lib/chain/bls/multithread/index.d.ts +5 -11
  62. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  63. package/lib/chain/bls/multithread/index.js +116 -101
  64. package/lib/chain/bls/multithread/index.js.map +1 -1
  65. package/lib/chain/bls/multithread/jobItem.d.ts +5 -19
  66. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  67. package/lib/chain/bls/multithread/jobItem.js +10 -65
  68. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  69. package/lib/chain/bls/multithread/types.d.ts +29 -8
  70. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  71. package/lib/chain/bls/multithread/types.js +12 -0
  72. package/lib/chain/bls/multithread/types.js.map +1 -1
  73. package/lib/chain/bls/multithread/utils.d.ts +4 -0
  74. package/lib/chain/bls/multithread/utils.d.ts.map +1 -1
  75. package/lib/chain/bls/multithread/utils.js +10 -0
  76. package/lib/chain/bls/multithread/utils.js.map +1 -1
  77. package/lib/chain/bls/multithread/worker.js +49 -23
  78. package/lib/chain/bls/multithread/worker.js.map +1 -1
  79. package/lib/chain/bls/singleThread.d.ts +4 -10
  80. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  81. package/lib/chain/bls/singleThread.js +8 -45
  82. package/lib/chain/bls/singleThread.js.map +1 -1
  83. package/lib/chain/bls/utils.d.ts +4 -4
  84. package/lib/chain/bls/utils.d.ts.map +1 -1
  85. package/lib/chain/bls/utils.js +18 -19
  86. package/lib/chain/bls/utils.js.map +1 -1
  87. package/lib/chain/chain.d.ts +9 -4
  88. package/lib/chain/chain.d.ts.map +1 -1
  89. package/lib/chain/chain.js +22 -8
  90. package/lib/chain/chain.js.map +1 -1
  91. package/lib/chain/errors/blockError.d.ts +1 -0
  92. package/lib/chain/errors/blockError.d.ts.map +1 -1
  93. package/lib/chain/errors/blockError.js +6 -1
  94. package/lib/chain/errors/blockError.js.map +1 -1
  95. package/lib/chain/errors/proposerPreferences.d.ts +6 -0
  96. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -1
  97. package/lib/chain/errors/proposerPreferences.js +1 -0
  98. package/lib/chain/errors/proposerPreferences.js.map +1 -1
  99. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  100. package/lib/chain/forkChoice/index.js +4 -0
  101. package/lib/chain/forkChoice/index.js.map +1 -1
  102. package/lib/chain/interface.d.ts +8 -4
  103. package/lib/chain/interface.d.ts.map +1 -1
  104. package/lib/chain/interface.js.map +1 -1
  105. package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
  106. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  107. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  108. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  109. package/lib/chain/opPools/attestationPool.js +1 -1
  110. package/lib/chain/opPools/attestationPool.js.map +1 -1
  111. package/lib/chain/opPools/deferredVoluntaryExitPool.d.ts +16 -0
  112. package/lib/chain/opPools/deferredVoluntaryExitPool.d.ts.map +1 -0
  113. package/lib/chain/opPools/deferredVoluntaryExitPool.js +57 -0
  114. package/lib/chain/opPools/deferredVoluntaryExitPool.js.map +1 -0
  115. package/lib/chain/opPools/executionPayloadBidPool.d.ts +7 -2
  116. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -1
  117. package/lib/chain/opPools/executionPayloadBidPool.js +4 -4
  118. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -1
  119. package/lib/chain/opPools/index.d.ts +2 -1
  120. package/lib/chain/opPools/index.d.ts.map +1 -1
  121. package/lib/chain/opPools/index.js +1 -0
  122. package/lib/chain/opPools/index.js.map +1 -1
  123. package/lib/chain/opPools/payloadAttestationPool.js +3 -3
  124. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  125. package/lib/chain/opPools/syncCommitteeMessagePool.js +1 -1
  126. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  127. package/lib/chain/opPools/syncContributionAndProofPool.js +1 -1
  128. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  129. package/lib/chain/opPools/utils.d.ts +1 -1
  130. package/lib/chain/opPools/utils.d.ts.map +1 -1
  131. package/lib/chain/opPools/utils.js +1 -1
  132. package/lib/chain/opPools/utils.js.map +1 -1
  133. package/lib/chain/prepareNextSlot.d.ts +5 -0
  134. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  135. package/lib/chain/prepareNextSlot.js +47 -6
  136. package/lib/chain/prepareNextSlot.js.map +1 -1
  137. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  138. package/lib/chain/produceBlock/computeNewStateRoot.js +3 -25
  139. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  140. package/lib/chain/produceBlock/produceBlockBody.js +1 -1
  141. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  142. package/lib/chain/regen/interface.d.ts +5 -2
  143. package/lib/chain/regen/interface.d.ts.map +1 -1
  144. package/lib/chain/regen/interface.js +3 -0
  145. package/lib/chain/regen/interface.js.map +1 -1
  146. package/lib/chain/regen/queued.d.ts +2 -2
  147. package/lib/chain/regen/queued.d.ts.map +1 -1
  148. package/lib/chain/regen/queued.js +5 -5
  149. package/lib/chain/regen/queued.js.map +1 -1
  150. package/lib/chain/seenCache/seenAttesters.d.ts +9 -5
  151. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
  152. package/lib/chain/seenCache/seenAttesters.js +25 -4
  153. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  154. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +28 -1
  155. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  156. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +121 -13
  157. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  158. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +5 -1
  159. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  160. package/lib/chain/stateCache/fifoBlockStateCache.js +6 -0
  161. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  162. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +47 -5
  163. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  164. package/lib/chain/stateCache/persistentCheckpointsCache.js +117 -7
  165. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  166. package/lib/chain/stateCache/types.d.ts +3 -3
  167. package/lib/chain/stateCache/types.d.ts.map +1 -1
  168. package/lib/chain/validation/attestation.d.ts.map +1 -1
  169. package/lib/chain/validation/attestation.js +1 -4
  170. package/lib/chain/validation/attestation.js.map +1 -1
  171. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  172. package/lib/chain/validation/attesterSlashing.js +1 -1
  173. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  174. package/lib/chain/validation/block.d.ts.map +1 -1
  175. package/lib/chain/validation/block.js +40 -10
  176. package/lib/chain/validation/block.js.map +1 -1
  177. package/lib/chain/validation/executionPayloadBid.d.ts +13 -3
  178. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  179. package/lib/chain/validation/executionPayloadBid.js +147 -12
  180. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  181. package/lib/chain/validation/executionPayloadEnvelope.js +1 -1
  182. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  183. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  184. package/lib/chain/validation/payloadAttestationMessage.js +5 -14
  185. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  186. package/lib/chain/validation/proposerPreferences.d.ts +1 -1
  187. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -1
  188. package/lib/chain/validation/proposerPreferences.js +13 -4
  189. package/lib/chain/validation/proposerPreferences.js.map +1 -1
  190. package/lib/chain/validation/proposerSlashing.js +1 -1
  191. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  192. package/lib/chain/validation/voluntaryExit.d.ts +9 -1
  193. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
  194. package/lib/chain/validation/voluntaryExit.js +46 -1
  195. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  196. package/lib/execution/builder/apiClient.d.ts +70 -0
  197. package/lib/execution/builder/apiClient.d.ts.map +1 -0
  198. package/lib/execution/builder/apiClient.js +202 -0
  199. package/lib/execution/builder/apiClient.js.map +1 -0
  200. package/lib/execution/builder/validateBid.d.ts +22 -0
  201. package/lib/execution/builder/validateBid.d.ts.map +1 -0
  202. package/lib/execution/builder/validateBid.js +111 -0
  203. package/lib/execution/builder/validateBid.js.map +1 -0
  204. package/lib/metrics/metrics/lodestar.d.ts +94 -23
  205. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  206. package/lib/metrics/metrics/lodestar.js +177 -55
  207. package/lib/metrics/metrics/lodestar.js.map +1 -1
  208. package/lib/network/gossip/topic.d.ts +13 -0
  209. package/lib/network/gossip/topic.d.ts.map +1 -1
  210. package/lib/network/gossip/topic.js +37 -0
  211. package/lib/network/gossip/topic.js.map +1 -1
  212. package/lib/network/libp2p/index.d.ts.map +1 -1
  213. package/lib/network/libp2p/index.js +10 -2
  214. package/lib/network/libp2p/index.js.map +1 -1
  215. package/lib/network/network.d.ts.map +1 -1
  216. package/lib/network/network.js +23 -43
  217. package/lib/network/network.js.map +1 -1
  218. package/lib/network/processor/constants.d.ts +7 -0
  219. package/lib/network/processor/constants.d.ts.map +1 -0
  220. package/lib/network/processor/constants.js +7 -0
  221. package/lib/network/processor/constants.js.map +1 -0
  222. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  223. package/lib/network/processor/gossipHandlers.js +13 -4
  224. package/lib/network/processor/gossipHandlers.js.map +1 -1
  225. package/lib/network/processor/gossipQueues/indexed.d.ts.map +1 -1
  226. package/lib/network/processor/gossipQueues/indexed.js +0 -1
  227. package/lib/network/processor/gossipQueues/indexed.js.map +1 -1
  228. package/lib/network/processor/index.d.ts +3 -0
  229. package/lib/network/processor/index.d.ts.map +1 -1
  230. package/lib/network/processor/index.js +52 -23
  231. package/lib/network/processor/index.js.map +1 -1
  232. package/lib/network/reqresp/score.d.ts.map +1 -1
  233. package/lib/network/reqresp/score.js +5 -11
  234. package/lib/network/reqresp/score.js.map +1 -1
  235. package/lib/network/util.d.ts +0 -1
  236. package/lib/network/util.d.ts.map +1 -1
  237. package/lib/network/util.js +0 -4
  238. package/lib/network/util.js.map +1 -1
  239. package/lib/node/deferredVoluntaryExitPublisher.d.ts +15 -0
  240. package/lib/node/deferredVoluntaryExitPublisher.d.ts.map +1 -0
  241. package/lib/node/deferredVoluntaryExitPublisher.js +38 -0
  242. package/lib/node/deferredVoluntaryExitPublisher.js.map +1 -0
  243. package/lib/node/nodejs.d.ts +2 -1
  244. package/lib/node/nodejs.d.ts.map +1 -1
  245. package/lib/node/nodejs.js +7 -0
  246. package/lib/node/nodejs.js.map +1 -1
  247. package/lib/sync/range/batch.d.ts +23 -5
  248. package/lib/sync/range/batch.d.ts.map +1 -1
  249. package/lib/sync/range/batch.js +61 -22
  250. package/lib/sync/range/batch.js.map +1 -1
  251. package/lib/sync/range/chain.d.ts +2 -1
  252. package/lib/sync/range/chain.d.ts.map +1 -1
  253. package/lib/sync/range/chain.js +32 -12
  254. package/lib/sync/range/chain.js.map +1 -1
  255. package/lib/sync/range/range.js +1 -1
  256. package/lib/sync/range/range.js.map +1 -1
  257. package/lib/sync/types.d.ts +32 -0
  258. package/lib/sync/types.d.ts.map +1 -1
  259. package/lib/sync/types.js +33 -0
  260. package/lib/sync/types.js.map +1 -1
  261. package/lib/sync/unknownBlock.d.ts +15 -2
  262. package/lib/sync/unknownBlock.d.ts.map +1 -1
  263. package/lib/sync/unknownBlock.js +220 -61
  264. package/lib/sync/unknownBlock.js.map +1 -1
  265. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  266. package/lib/sync/utils/downloadByRange.js +16 -11
  267. package/lib/sync/utils/downloadByRange.js.map +1 -1
  268. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  269. package/lib/sync/utils/downloadByRoot.js +3 -1
  270. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  271. package/package.json +35 -35
  272. package/src/api/impl/beacon/blocks/index.ts +55 -21
  273. package/src/api/impl/beacon/pool/index.ts +27 -2
  274. package/src/api/impl/beacon/state/utils.ts +2 -1
  275. package/src/api/impl/events/index.ts +12 -4
  276. package/src/api/impl/lodestar/index.ts +1 -1
  277. package/src/api/impl/validator/index.ts +285 -49
  278. package/src/api/impl/validator/utils.ts +1 -1
  279. package/src/api/rest/base.ts +7 -0
  280. package/src/chain/archiveStore/archiveStore.ts +1 -1
  281. package/src/chain/archiveStore/historicalState/metrics.ts +22 -0
  282. package/src/chain/blocks/importBlock.ts +1 -6
  283. package/src/chain/blocks/importExecutionPayload.ts +12 -11
  284. package/src/chain/blocks/index.ts +25 -13
  285. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +8 -2
  286. package/src/chain/blocks/payloadEnvelopeInput/types.ts +17 -4
  287. package/src/chain/blocks/verifyBlock.ts +5 -2
  288. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +25 -16
  289. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +1 -9
  290. package/src/chain/bls/index.ts +1 -1
  291. package/src/chain/bls/interface.ts +7 -3
  292. package/src/chain/bls/multithread/index.ts +148 -120
  293. package/src/chain/bls/multithread/jobItem.ts +12 -82
  294. package/src/chain/bls/multithread/types.ts +33 -8
  295. package/src/chain/bls/multithread/utils.ts +11 -0
  296. package/src/chain/bls/multithread/worker.ts +85 -27
  297. package/src/chain/bls/singleThread.ts +11 -55
  298. package/src/chain/bls/utils.ts +23 -24
  299. package/src/chain/chain.ts +25 -7
  300. package/src/chain/errors/blockError.ts +8 -2
  301. package/src/chain/errors/proposerPreferences.ts +7 -0
  302. package/src/chain/forkChoice/index.ts +4 -0
  303. package/src/chain/interface.ts +8 -3
  304. package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
  305. package/src/chain/opPools/attestationPool.ts +1 -1
  306. package/src/chain/opPools/deferredVoluntaryExitPool.ts +65 -0
  307. package/src/chain/opPools/executionPayloadBidPool.ts +13 -7
  308. package/src/chain/opPools/index.ts +2 -1
  309. package/src/chain/opPools/payloadAttestationPool.ts +3 -3
  310. package/src/chain/opPools/syncCommitteeMessagePool.ts +1 -1
  311. package/src/chain/opPools/syncContributionAndProofPool.ts +1 -1
  312. package/src/chain/opPools/utils.ts +1 -1
  313. package/src/chain/prepareNextSlot.ts +49 -6
  314. package/src/chain/produceBlock/computeNewStateRoot.ts +3 -38
  315. package/src/chain/produceBlock/produceBlockBody.ts +1 -1
  316. package/src/chain/regen/interface.ts +5 -2
  317. package/src/chain/regen/queued.ts +5 -5
  318. package/src/chain/seenCache/seenAttesters.ts +31 -5
  319. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +143 -14
  320. package/src/chain/stateCache/fifoBlockStateCache.ts +8 -1
  321. package/src/chain/stateCache/persistentCheckpointsCache.ts +133 -8
  322. package/src/chain/stateCache/types.ts +3 -3
  323. package/src/chain/validation/attestation.ts +1 -7
  324. package/src/chain/validation/attesterSlashing.ts +1 -8
  325. package/src/chain/validation/block.ts +43 -10
  326. package/src/chain/validation/executionPayloadBid.ts +168 -14
  327. package/src/chain/validation/executionPayloadEnvelope.ts +0 -1
  328. package/src/chain/validation/payloadAttestationMessage.ts +6 -17
  329. package/src/chain/validation/proposerPreferences.ts +15 -5
  330. package/src/chain/validation/proposerSlashing.ts +1 -1
  331. package/src/chain/validation/voluntaryExit.ts +59 -2
  332. package/src/execution/builder/apiClient.ts +264 -0
  333. package/src/execution/builder/validateBid.ts +166 -0
  334. package/src/metrics/metrics/lodestar.ts +192 -61
  335. package/src/network/gossip/topic.ts +38 -0
  336. package/src/network/libp2p/index.ts +11 -2
  337. package/src/network/network.ts +29 -54
  338. package/src/network/processor/constants.ts +6 -0
  339. package/src/network/processor/gossipHandlers.ts +15 -2
  340. package/src/network/processor/gossipQueues/indexed.ts +0 -1
  341. package/src/network/processor/index.ts +67 -30
  342. package/src/network/reqresp/score.ts +5 -11
  343. package/src/network/util.ts +0 -5
  344. package/src/node/deferredVoluntaryExitPublisher.ts +54 -0
  345. package/src/node/nodejs.ts +10 -1
  346. package/src/sync/range/batch.ts +83 -28
  347. package/src/sync/range/chain.ts +35 -13
  348. package/src/sync/range/range.ts +1 -1
  349. package/src/sync/types.ts +36 -1
  350. package/src/sync/unknownBlock.ts +258 -68
  351. package/src/sync/utils/downloadByRange.ts +21 -12
  352. package/src/sync/utils/downloadByRoot.ts +3 -1
  353. package/lib/chain/bls/maybeBatch.d.ts +0 -12
  354. package/lib/chain/bls/maybeBatch.d.ts.map +0 -1
  355. package/lib/chain/bls/maybeBatch.js +0 -35
  356. package/lib/chain/bls/maybeBatch.js.map +0 -1
  357. package/src/chain/bls/maybeBatch.ts +0 -45
@@ -4,7 +4,10 @@ import {ArchiveStoreTask} from "../../chain/archiveStore/archiveStore.js";
4
4
  import {FrequencyStateArchiveStep} from "../../chain/archiveStore/strategies/frequencyStateArchiveStrategy.js";
5
5
  import {BlockInputSource} from "../../chain/blocks/blockInput/index.js";
6
6
  import {PayloadErrorCode} from "../../chain/blocks/importExecutionPayload.js";
7
- import {PayloadEnvelopeInputSource} from "../../chain/blocks/payloadEnvelopeInput/index.js";
7
+ import {
8
+ PayloadEnvelopeInputPruneReason,
9
+ PayloadEnvelopeInputSource,
10
+ } from "../../chain/blocks/payloadEnvelopeInput/index.js";
8
11
  import {JobQueueItemType} from "../../chain/bls/index.js";
9
12
  import {AttestationErrorCode, BlockErrorCode} from "../../chain/errors/index.js";
10
13
  import {
@@ -21,7 +24,7 @@ import {ExecutionPayloadStatus} from "../../execution/index.js";
21
24
  import {GossipType} from "../../network/index.js";
22
25
  import {CannotAcceptWorkReason, ReprocessRejectReason} from "../../network/processor/index.js";
23
26
  import {BackfillSyncMethod} from "../../sync/backfill/backfill.js";
24
- import {PendingBlockType} from "../../sync/types.js";
27
+ import {DroppedItemReason, PendingBlockType} from "../../sync/types.js";
25
28
  import {PeerSyncType, RangeSyncType} from "../../sync/utils/remoteSyncType.js";
26
29
  import {AllocSource} from "../../util/bufferPool.js";
27
30
  import {DataColumnReconstructionCode} from "../../util/dataColumns.js";
@@ -31,6 +34,10 @@ import {RegistryMetricCreator} from "../utils/registryMetricCreator.js";
31
34
 
32
35
  export type LodestarMetrics = ReturnType<typeof createLodestarMetrics>;
33
36
 
37
+ type BlsJobOutcome = "valid" | "invalid" | "prepError" | "verifyError" | "workerError";
38
+ type BlsBufferFlushReason = "size" | "timeout";
39
+ type BlsVerificationCallOperation = "batch" | "single" | "fallback" | "same_message";
40
+
34
41
  /**
35
42
  * Extra Lodestar custom metrics
36
43
  */
@@ -76,15 +83,15 @@ export function createLodestarMetrics(
76
83
  }),
77
84
  jobTime: register.histogram<{topic: GossipType}>({
78
85
  name: "lodestar_gossip_validation_queue_job_time_seconds",
79
- help: "Time to process gossip validation queue job in seconds",
86
+ help: "Time to process gossip validation queue job in seconds (accepted messages only)",
80
87
  labelNames: ["topic"],
81
- buckets: [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10],
88
+ buckets: [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2],
82
89
  }),
83
90
  jobWaitTime: register.histogram<{topic: GossipType}>({
84
91
  name: "lodestar_gossip_validation_queue_job_wait_time_seconds",
85
92
  help: "Time from job added to the queue to starting the job in seconds",
86
93
  labelNames: ["topic"],
87
- buckets: [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10],
94
+ buckets: [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2],
88
95
  }),
89
96
  concurrency: register.gauge<{topic: GossipType}>({
90
97
  name: "lodestar_gossip_validation_queue_concurrency",
@@ -97,9 +104,10 @@ export function createLodestarMetrics(
97
104
  help: "Age of the first item of each key in the indexed queues in seconds",
98
105
  buckets: [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 5],
99
106
  }),
100
- queueTime: register.histogram({
107
+ queueTime: register.histogram<{topic: GossipType}>({
101
108
  name: "lodestar_gossip_validation_queue_time_seconds",
102
109
  help: "Total time an item stays in queue until it is processed in seconds",
110
+ labelNames: ["topic"],
103
111
  buckets: [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 5],
104
112
  }),
105
113
  },
@@ -396,86 +404,108 @@ export function createLodestarMetrics(
396
404
  // BLS verifier thread pool and queue
397
405
 
398
406
  bls: {
399
- aggregatedPubkeys: register.gauge({
407
+ aggregatedPubkeys: register.counter({
400
408
  name: "lodestar_bls_aggregated_pubkeys_total",
401
- help: "Total aggregated pubkeys for BLS validation",
409
+ help: "Total validator public keys used as inputs to aggregate signature sets",
410
+ }),
411
+ pubkeyCacheSize: register.gauge({
412
+ name: "lodestar_bls_pubkey_cache_size",
413
+ help: "Current number of validator public keys in the native cache",
414
+ }),
415
+ pubkeyCacheCapacity: register.gauge({
416
+ name: "lodestar_bls_pubkey_cache_capacity",
417
+ help: "Number of validator public keys the native cache can hold without growing",
402
418
  }),
403
419
  },
404
420
 
405
421
  blsThreadPool: {
406
- jobsWorkerTime: register.gauge<{workerId: number}>({
422
+ jobsWorkerTime: register.counter<{workerId: number}>({
407
423
  name: "lodestar_bls_thread_pool_time_seconds_sum",
408
- help: "Total time spent verifying signature sets measured on the worker",
424
+ help: "Cumulative wall time spent processing BLS dispatch groups by worker",
409
425
  labelNames: ["workerId"],
410
426
  }),
411
- successJobsSignatureSetsCount: register.gauge({
427
+ successJobsSignatureSetsCount: register.counter({
412
428
  name: "lodestar_bls_thread_pool_success_jobs_signature_sets_count",
413
- help: "Count of total verified signature sets",
414
- }),
415
- errorAggregateSignatureSetsCount: register.gauge<{type: JobQueueItemType}>({
416
- name: "lodestar_bls_thread_pool_error_aggregate_signature_sets_count",
417
- help: "Count of error when aggregating pubkeys or signatures",
418
- labelNames: ["type"],
429
+ help: "Count of signature sets completed without an operational error",
419
430
  }),
420
- errorJobsSignatureSetsCount: register.gauge({
431
+ errorJobsSignatureSetsCount: register.counter({
421
432
  name: "lodestar_bls_thread_pool_error_jobs_signature_sets_count",
422
- help: "Count of total error-ed signature sets",
433
+ help: "Count of signature sets that ended in an input, binding, or worker error",
423
434
  }),
424
- jobWaitTime: register.histogram({
435
+ jobWaitTime: register.histogram<{type: JobQueueItemType}>({
425
436
  name: "lodestar_bls_thread_pool_queue_job_wait_time_seconds",
426
- help: "Time from job added to the queue to starting the job in seconds",
427
- buckets: [0.01, 0.02, 0.1, 0.3, 0.5, 1],
437
+ help: "Time from adding a BLS job until it is selected for a worker dispatch group",
438
+ labelNames: ["type"],
439
+ buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.2, 0.5, 1, 2],
440
+ }),
441
+ jobDuration: register.histogram<{type: JobQueueItemType}>({
442
+ name: "lodestar_bls_thread_pool_job_duration_seconds",
443
+ help: "End-to-end duration of a BLS job from submission through completion",
444
+ labelNames: ["type"],
445
+ buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.2, 0.5, 1, 2],
446
+ }),
447
+ jobResults: register.counter<{type: JobQueueItemType; outcome: BlsJobOutcome}>({
448
+ name: "lodestar_bls_thread_pool_job_results_total",
449
+ help: "Count of completed BLS jobs by cryptographic or operational outcome",
450
+ labelNames: ["type", "outcome"],
428
451
  }),
429
452
  queueLength: register.gauge({
430
453
  name: "lodestar_bls_thread_pool_queue_length",
431
- help: "Count of total block processor queue length",
454
+ help: "Count of ready BLS jobs waiting for a worker",
455
+ }),
456
+ bufferedQueueLength: register.gauge({
457
+ name: "lodestar_bls_thread_pool_buffered_queue_length",
458
+ help: "Count of BLS jobs waiting in the intentional batching buffer",
432
459
  }),
433
460
  workersBusy: register.gauge({
434
461
  name: "lodestar_bls_thread_pool_workers_busy",
435
462
  help: "Count of current busy workers",
436
463
  }),
437
- totalJobsGroupsStarted: register.gauge({
464
+ totalJobsGroupsStarted: register.counter({
438
465
  name: "lodestar_bls_thread_pool_job_groups_started_total",
439
- help: "Count of total jobs groups started in bls thread pool, job groups include +1 jobs",
466
+ help: "Count of worker dispatch groups started by the BLS thread pool",
440
467
  }),
441
- totalJobsStarted: register.gauge<{type: JobQueueItemType}>({
468
+ totalJobsStarted: register.counter<{type: JobQueueItemType}>({
442
469
  name: "lodestar_bls_thread_pool_jobs_started_total",
443
- help: "Count of total jobs started in bls thread pool, jobs include +1 signature sets",
470
+ help: "Count of jobs started by the BLS thread pool",
444
471
  labelNames: ["type"],
445
472
  }),
446
- totalSigSetsStarted: register.gauge<{type: JobQueueItemType}>({
473
+ totalSigSetsStarted: register.counter<{type: JobQueueItemType}>({
447
474
  name: "lodestar_bls_thread_pool_sig_sets_started_total",
448
- help: "Count of total signature sets started in bls thread pool, sig sets include 1 pk, msg, sig",
475
+ help: "Count of signature sets started by the BLS thread pool",
449
476
  labelNames: ["type"],
450
477
  }),
451
478
  // Re-verifying a batch means doing double work. This number must be very low or it can be a waste of CPU resources
452
- batchRetries: register.gauge({
479
+ batchRetries: register.counter({
453
480
  name: "lodestar_bls_thread_pool_batch_retries_total",
454
- help: "Count of total batches that failed and had to be verified again.",
481
+ help: "Count of combined batches that failed and required per-job fallback",
455
482
  }),
456
483
  // To count how many sigs are being validated with the optimization of batching them
457
- batchSigsSuccess: register.gauge({
484
+ batchSigsSuccess: register.counter({
458
485
  name: "lodestar_bls_thread_pool_batch_sigs_success_total",
459
- help: "Count of total batches that failed and had to be verified again.",
486
+ help: "Count of signature sets accepted by combined batch verification without fallback",
460
487
  }),
461
- sameMessageRetryJobs: register.gauge({
462
- name: "lodestar_bls_thread_pool_same_message_jobs_retries_total",
463
- help: "Count of total same message jobs that failed and had to be verified again.",
488
+ bufferFlushes: register.counter<{reason: BlsBufferFlushReason}>({
489
+ name: "lodestar_bls_thread_pool_buffer_flushes_total",
490
+ help: "Count of batching-buffer flushes by trigger",
491
+ labelNames: ["reason"],
464
492
  }),
465
- sameMessageRetrySets: register.gauge({
466
- name: "lodestar_bls_thread_pool_same_message_sets_retries_total",
467
- help: "Count of total same message sets that failed and had to be verified again.",
493
+ bufferedSignatureSets: register.histogram({
494
+ name: "lodestar_bls_thread_pool_buffered_signature_sets",
495
+ help: "Count of signature sets included in each batching-buffer flush",
496
+ buckets: [1, 8, 16, 24, 28, 32, 36, 40, 44, 48, 64, 128],
468
497
  }),
469
498
  // To measure the time cost of main thread <-> worker message passing
470
499
  latencyToWorker: register.histogram({
471
500
  name: "lodestar_bls_thread_pool_latency_to_worker",
472
501
  help: "Time from sending the job to the worker and the worker receiving it",
473
- buckets: [0.001, 0.003, 0.01, 0.03, 0.1],
502
+ // The dashboard treats 20ms as slow; values above 100ms only need severe-stall classification.
503
+ buckets: [0.00025, 0.001, 0.005, 0.02, 0.1],
474
504
  }),
475
505
  latencyFromWorker: register.histogram({
476
506
  name: "lodestar_bls_thread_pool_latency_from_worker",
477
507
  help: "Time from the worker sending the result and the main thread receiving it",
478
- buckets: [0.001, 0.003, 0.01, 0.03, 0.1],
508
+ buckets: [0.00025, 0.001, 0.005, 0.02, 0.1],
479
509
  }),
480
510
  mainThreadDurationInThreadPool: register.histogram({
481
511
  name: "lodestar_bls_thread_pool_main_thread_time_seconds",
@@ -485,32 +515,40 @@ export function createLodestarMetrics(
485
515
  }),
486
516
  timePerSigSet: register.histogram({
487
517
  name: "lodestar_bls_worker_thread_time_per_sigset_seconds",
488
- help: "Time to verify each sigset with worker thread mode",
518
+ help: "Average BLS worker dispatch wall time per original signature set",
489
519
  // Time per sig ~0.9ms on good machines
490
- buckets: [0.5e-3, 0.75e-3, 1e-3, 1.5e-3, 2e-3, 5e-3],
491
- }),
492
- totalSigSets: register.gauge({
520
+ buckets: [0.5e-3, 0.75e-3, 1e-3, 1.5e-3, 2e-3, 5e-3, 10e-3, 20e-3, 50e-3, 100e-3],
521
+ }),
522
+ workRequestPreparationDuration: register.histogram({
523
+ name: "lodestar_bls_thread_pool_work_request_preparation_duration_seconds",
524
+ help: "Main-thread time spent converting one worker dispatch group to binding inputs",
525
+ // Normal requests take microseconds; the dashboard treats 1ms as a main-thread stall.
526
+ buckets: [0.000005, 0.000025, 0.0001, 0.0005, 0.001, 0.005, 0.025],
527
+ }),
528
+ verificationCallDuration: register.histogram<{operation: BlsVerificationCallOperation}>({
529
+ name: "lodestar_bls_thread_pool_verification_call_duration_seconds",
530
+ help: "Duration of one worker-side lodestar-z verification binding call, including input conversion",
531
+ labelNames: ["operation"],
532
+ // Verification ranges from sub-millisecond calls to large batches; above 500ms is uniformly severe.
533
+ buckets: [0.00025, 0.001, 0.005, 0.02, 0.1, 0.5],
534
+ }),
535
+ verificationCallSignatureSets: register.counter<{operation: BlsVerificationCallOperation}>({
536
+ name: "lodestar_bls_thread_pool_verification_call_signature_sets_total",
537
+ help: "Count of signature sets passed to worker-side lodestar-z verification binding calls",
538
+ labelNames: ["operation"],
539
+ }),
540
+ totalSigSets: register.counter({
493
541
  name: "lodestar_bls_thread_pool_sig_sets_total",
494
542
  help: "Count of total signature sets",
495
543
  }),
496
- prioritizedSigSets: register.gauge({
544
+ prioritizedSigSets: register.counter({
497
545
  name: "lodestar_bls_thread_pool_prioritized_sig_sets_total",
498
546
  help: "Count of total prioritized signature sets",
499
547
  }),
500
- batchableSigSets: register.gauge({
548
+ batchableSigSets: register.counter({
501
549
  name: "lodestar_bls_thread_pool_batchable_sig_sets_total",
502
550
  help: "Count of total batchable signature sets",
503
551
  }),
504
- aggregateWithRandomnessAsyncDuration: register.histogram({
505
- name: "lodestar_bls_thread_pool_aggregate_with_randomness_async_time_seconds",
506
- help: "Total time performing aggregateWithRandomness async",
507
- buckets: [0.001, 0.005, 0.01, 0.1, 0.3],
508
- }),
509
- pubkeysAggregationMainThreadDuration: register.histogram({
510
- name: "lodestar_bls_thread_pool_pubkeys_aggregation_main_thread_time_seconds",
511
- help: "Total time spent aggregating pubkeys on main thread",
512
- buckets: [0.001, 0.005, 0.01, 0.1],
513
- }),
514
552
  },
515
553
 
516
554
  // BLS time on single thread mode
@@ -643,9 +681,15 @@ export function createLodestarMetrics(
643
681
  name: "lodestar_sync_unknown_block_downloaded_blocks_error_total",
644
682
  help: "Total number of downloaded blocks errors in UnknownBlockSync",
645
683
  }),
646
- removedBlocks: register.gauge({
684
+ removedBlocks: register.gauge<{reason: DroppedItemReason}>({
647
685
  name: "lodestar_sync_unknown_block_removed_blocks_total",
648
- help: "Total number of removed bad blocks in UnknownBlockSync",
686
+ help: "Total pending blocks dropped from BlockInputSync without completing, by reason",
687
+ labelNames: ["reason"],
688
+ }),
689
+ removedPayloads: register.gauge<{reason: DroppedItemReason}>({
690
+ name: "lodestar_sync_unknown_block_removed_payloads_total",
691
+ help: "Total pending payloads dropped from BlockInputSync without completing, by reason",
692
+ labelNames: ["reason"],
649
693
  }),
650
694
  elapsedTimeTillReceived: register.histogram({
651
695
  name: "lodestar_sync_unknown_block_elapsed_time_till_received",
@@ -877,6 +921,12 @@ export function createLodestarMetrics(
877
921
  help: "Count of errors, by error type, while processing blocks",
878
922
  labelNames: ["error"],
879
923
  }),
924
+
925
+ preStateSource: register.counter<{source: "parentState" | "fallbackPreState" | "preState"}>({
926
+ name: "lodestar_gossip_block_validation_pre_state_source_total",
927
+ help: "Source of the pre-state used for gossip block validation",
928
+ labelNames: ["source"],
929
+ }),
880
930
  },
881
931
  gossipBlob: {
882
932
  recvToValidation: register.histogram({
@@ -908,6 +958,22 @@ export function createLodestarMetrics(
908
958
  labelNames: ["error"],
909
959
  }),
910
960
  },
961
+ gossipExecutionPayloadBid: {
962
+ elapsedTimeTillReceived: register.histogram<{source: OpSource}>({
963
+ name: "lodestar_gossip_execution_payload_bid_elapsed_time_till_received_seconds",
964
+ help: "Time elapsed between the bid's slot start and the time the execution payload bid was received (negative = received before its slot, broadcast in the previous slot; positive = received during its own slot, late)",
965
+ labelNames: ["source"],
966
+ buckets: [-6, -3, -1, 0, 3],
967
+ }),
968
+ },
969
+ gossipPayloadAttestationMessage: {
970
+ elapsedTimeTillReceived: register.histogram<{source: OpSource}>({
971
+ name: "lodestar_gossip_payload_attestation_message_elapsed_time_till_received_seconds",
972
+ help: "Time elapsed between slot time and the time the payload attestation message was received",
973
+ labelNames: ["source"],
974
+ buckets: [3, 6, 9, 12],
975
+ }),
976
+ },
911
977
  // recovery in the case of specific blob rows required
912
978
  recoverBlobSidecars: {
913
979
  blobsReconstructed: register.counter({
@@ -1175,6 +1241,12 @@ export function createLodestarMetrics(
1175
1241
  name: "lodestar_oppool_attester_slashing_pool_size",
1176
1242
  help: "Current size of the AttesterSlashingPool",
1177
1243
  }),
1244
+ deferredVoluntaryExitPool: {
1245
+ size: register.gauge({
1246
+ name: "lodestar_oppool_deferred_voluntary_exit_pool_size",
1247
+ help: "Current size of the DeferredVoluntaryExitPool",
1248
+ }),
1249
+ },
1178
1250
  proposerSlashingPoolSize: register.gauge({
1179
1251
  name: "lodestar_oppool_proposer_slashing_pool_size",
1180
1252
  help: "Current size of the ProposerSlashingPool",
@@ -1285,6 +1357,11 @@ export function createLodestarMetrics(
1285
1357
  help: "Total number of InsertOutcome as a result of adding an execution payload bid from api to the pool",
1286
1358
  labelNames: ["insertOutcome"],
1287
1359
  }),
1360
+ apiValidationTime: register.histogram({
1361
+ name: "lodestar_api_execution_payload_bid_validation_time_seconds",
1362
+ help: "Time elapsed for signed execution payload bid validation - api path",
1363
+ buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.5],
1364
+ }),
1288
1365
  },
1289
1366
  },
1290
1367
 
@@ -1379,6 +1456,16 @@ export function createLodestarMetrics(
1379
1456
  help: "Checkpoint state cache size",
1380
1457
  labelNames: ["type"],
1381
1458
  }),
1459
+ persistentTierEpochs: register.gauge<{tier: number}>({
1460
+ name: "lodestar_cp_state_cache_persistent_tier_epochs",
1461
+ help: "Number of epoch keys retained in each on-disk checkpoint state retention tier",
1462
+ labelNames: ["tier"],
1463
+ }),
1464
+ persistentTierStates: register.gauge<{tier: number}>({
1465
+ name: "lodestar_cp_state_cache_persistent_tier_states",
1466
+ help: "Number of persisted checkpoint states retained in each on-disk retention tier",
1467
+ labelNames: ["tier"],
1468
+ }),
1382
1469
  reads: register.avgMinMax({
1383
1470
  name: "lodestar_cp_state_epoch_reads",
1384
1471
  help: "Avg min max of all state cache items total read count",
@@ -1593,9 +1680,15 @@ export function createLodestarMetrics(
1593
1680
  name: "lodestar_seen_payload_envelope_input_cache_serialized_object_refs",
1594
1681
  help: "Number of serialized-cache object refs retained by cached PayloadEnvelopeInputs",
1595
1682
  }),
1596
- created: register.counter({
1683
+ created: register.counter<{source: PayloadEnvelopeInputSource}>({
1597
1684
  name: "lodestar_seen_payload_envelope_input_cache_items_created_total",
1598
- help: "Number of PayloadEnvelopeInputs created",
1685
+ help: "Number of PayloadEnvelopeInputs created by source",
1686
+ labelNames: ["source"],
1687
+ }),
1688
+ pruned: register.counter<{reason: PayloadEnvelopeInputPruneReason}>({
1689
+ name: "lodestar_seen_payload_envelope_input_cache_items_pruned_total",
1690
+ help: "Number of PayloadEnvelopeInputs evicted by reason",
1691
+ labelNames: ["reason"],
1599
1692
  }),
1600
1693
  },
1601
1694
  },
@@ -1705,6 +1798,10 @@ export function createLodestarMetrics(
1705
1798
  name: "lodestar_precompute_next_epoch_transition_waste_total",
1706
1799
  help: "Total number of precomputing next epoch transition wasted",
1707
1800
  }),
1801
+ predictedReorg: register.counter({
1802
+ name: "lodestar_precompute_next_epoch_transition_predicted_reorg_total",
1803
+ help: "Predicted epoch-boundary reorgs where the strong parent was dialed instead of the weak head",
1804
+ }),
1708
1805
  duration: register.histogram({
1709
1806
  name: "lodestar_precompute_next_epoch_transition_duration_seconds",
1710
1807
  help: "Duration of precomputeNextEpochTransition, including epoch transition and hashTreeRoot",
@@ -1944,6 +2041,40 @@ export function createLodestarMetrics(
1944
2041
  }),
1945
2042
  },
1946
2043
 
2044
+ builderApi: {
2045
+ statusChecks: register.counter<{status: "success" | "error"}>({
2046
+ name: "lodestar_builder_api_status_checks_total",
2047
+ help: "Total count of status checks sent to external builders ahead of a proposal",
2048
+ labelNames: ["status"],
2049
+ }),
2050
+ bidRequests: register.counter({
2051
+ name: "lodestar_builder_api_bid_requests_total",
2052
+ help: "Total count of execution payload bid requests sent to external builders",
2053
+ }),
2054
+ bidRequestErrors: register.counter({
2055
+ name: "lodestar_builder_api_bid_request_errors_total",
2056
+ help: "Total count of failed execution payload bid requests to external builders",
2057
+ }),
2058
+ bidsReceived: register.counter({
2059
+ name: "lodestar_builder_api_bids_received_total",
2060
+ help: "Total count of execution payload bids received from external builders",
2061
+ }),
2062
+ bidsDiscarded: register.counter({
2063
+ name: "lodestar_builder_api_bids_discarded_total",
2064
+ help: "Total count of execution payload bids from external builders discarded due to failed validation",
2065
+ }),
2066
+ blockSubmissions: register.counter<{status: "success" | "error"}>({
2067
+ name: "lodestar_builder_api_block_submissions_total",
2068
+ help: "Total count of signed beacon blocks submitted to external builders",
2069
+ labelNames: ["status"],
2070
+ }),
2071
+ preferencesForwarded: register.counter<{status: "success" | "error"}>({
2072
+ name: "lodestar_builder_api_preferences_forwarded_total",
2073
+ help: "Total count of builder preferences forwarded to external builders",
2074
+ labelNames: ["status"],
2075
+ }),
2076
+ },
2077
+
1947
2078
  db: {
1948
2079
  dbReadReq: register.gauge<{bucket: string}>({
1949
2080
  name: "lodestar_db_read_req_total",
@@ -414,3 +414,41 @@ export const gossipTopicIgnoreDuplicatePublishError: Record<GossipType, boolean>
414
414
  [GossipType.execution_payload_bid]: true,
415
415
  [GossipType.proposer_preferences]: true,
416
416
  };
417
+
418
+ /**
419
+ * Whether a publish that reached zero subscribed peers is an acceptable outcome for a topic.
420
+ *
421
+ * Publishing to a topic with no subscribed peers throws `PublishError.NoPeersSubscribedToTopic`, which
422
+ * propagates to the caller and, for messages submitted through the beacon API, is surfaced to the
423
+ * validator client. That is the right default: a message that reached nobody is a failed broadcast, and a
424
+ * VC configured with several beacon nodes can fall back to another one.
425
+ *
426
+ * Only topics that have a concrete reason to tolerate it opt out here, ie. are set to `true`, and the
427
+ * reason is named on the entry. Everything else is `false` and keeps raising. Note this is applied per
428
+ * publish, a topic set to `false` still honors the global `--network.allowPublishToZeroPeers` flag.
429
+ */
430
+ export const gossipTopicAllowPublishToZeroPeers: Record<GossipType, boolean> = {
431
+ [GossipType.beacon_block]: false,
432
+ [GossipType.blob_sidecar]: false,
433
+ // data_column_sidecar: we ensure having all topic peers via prioritizePeers(). Even with 0 peers on the
434
+ // topic the overall publish can still succeed, because a supernode rebuilds and publishes the missing
435
+ // columns for us, so track sent peers as 0 instead of raising
436
+ [GossipType.data_column_sidecar]: true,
437
+ [GossipType.beacon_aggregate_and_proof]: false,
438
+ [GossipType.beacon_attestation]: false,
439
+ [GossipType.voluntary_exit]: false,
440
+ [GossipType.proposer_slashing]: false,
441
+ [GossipType.attester_slashing]: false,
442
+ [GossipType.sync_committee_contribution_and_proof]: false,
443
+ [GossipType.sync_committee]: false,
444
+ // light_client_finality_update and light_client_optimistic_update: non-mandatory route on most of the
445
+ // network as of Oct 2022, there may be no peer subscribed to the topic at all. Reason carried over from
446
+ // the handlers in network.ts, which used to swallow the error instead
447
+ [GossipType.light_client_finality_update]: true,
448
+ [GossipType.light_client_optimistic_update]: true,
449
+ [GossipType.bls_to_execution_change]: false,
450
+ [GossipType.execution_payload]: false,
451
+ [GossipType.payload_attestation_message]: false,
452
+ [GossipType.execution_payload_bid]: false,
453
+ [GossipType.proposer_preferences]: false,
454
+ };
@@ -1,3 +1,4 @@
1
+ import {getCiphers} from "node:crypto";
1
2
  import {bootstrap} from "@libp2p/bootstrap";
2
3
  import {identify} from "@libp2p/identify";
3
4
  import type {PrivateKey} from "@libp2p/interface";
@@ -9,12 +10,20 @@ import {Libp2pInit, createLibp2p} from "libp2p";
9
10
  import {Registry} from "prom-client";
10
11
  import {ENR} from "@chainsafe/enr";
11
12
  import {noise} from "@chainsafe/libp2p-noise";
12
- import {defaultCrypto} from "@chainsafe/libp2p-noise/crypto";
13
+ import {asCrypto, defaultCrypto} from "@chainsafe/libp2p-noise/crypto";
13
14
  import {quic} from "@chainsafe/libp2p-quic";
14
15
  import {Libp2p, LodestarComponents} from "../interface.js";
15
16
  import {NetworkOptions, defaultNetworkOptions} from "../options.js";
16
17
  import {Eth2PeerDataStore} from "../peers/datastore.js";
17
18
 
19
+ const noiseCrypto = getCiphers().includes("chacha20-poly1305")
20
+ ? defaultCrypto
21
+ : {
22
+ ...defaultCrypto,
23
+ chaCha20Poly1305Encrypt: asCrypto.chaCha20Poly1305Encrypt,
24
+ chaCha20Poly1305Decrypt: asCrypto.chaCha20Poly1305Decrypt,
25
+ };
26
+
18
27
  export type NodeJsLibp2pOpts = {
19
28
  peerStoreDir?: string;
20
29
  disablePeerDiscovery?: boolean;
@@ -122,7 +131,7 @@ export async function createNodeJsLibp2p(
122
131
  listen: localMultiaddrs,
123
132
  announce: [],
124
133
  },
125
- connectionEncrypters: [noise({crypto: defaultCrypto})],
134
+ connectionEncrypters: [noise({crypto: noiseCrypto})],
126
135
  transports,
127
136
  streamMuxers: [mplex({disconnectThreshold})],
128
137
  peerDiscovery,