@lodestar/beacon-node 1.51.0-dev.fac22802f6 → 1.51.0-dev.fb216e169a

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 (479) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +19 -61
  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 +17 -0
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/validator/index.d.ts +6 -0
  8. package/lib/api/impl/validator/index.d.ts.map +1 -1
  9. package/lib/api/impl/validator/index.js +38 -25
  10. package/lib/api/impl/validator/index.js.map +1 -1
  11. package/lib/chain/GetBlobsTracker.d.ts +2 -2
  12. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  13. package/lib/chain/GetBlobsTracker.js +7 -31
  14. package/lib/chain/GetBlobsTracker.js.map +1 -1
  15. package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
  16. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  17. package/lib/chain/blocks/blockInput/blockInput.js +5 -241
  18. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  19. package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
  20. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
  21. package/lib/chain/blocks/blockInput/errors.js.map +1 -1
  22. package/lib/chain/blocks/blockInput/types.d.ts +2 -18
  23. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  24. package/lib/chain/blocks/blockInput/types.js +0 -1
  25. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  26. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  27. package/lib/chain/blocks/importBlock.js +36 -53
  28. package/lib/chain/blocks/importBlock.js.map +1 -1
  29. package/lib/chain/blocks/importExecutionPayload.d.ts +6 -10
  30. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  31. package/lib/chain/blocks/importExecutionPayload.js +26 -17
  32. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  33. package/lib/chain/blocks/index.d.ts.map +1 -1
  34. package/lib/chain/blocks/index.js +2 -2
  35. package/lib/chain/blocks/index.js.map +1 -1
  36. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +10 -7
  37. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  38. package/lib/chain/blocks/payloadEnvelopeProcessor.js +21 -16
  39. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  40. package/lib/chain/blocks/types.d.ts +4 -20
  41. package/lib/chain/blocks/types.d.ts.map +1 -1
  42. package/lib/chain/blocks/types.js +0 -24
  43. package/lib/chain/blocks/types.js.map +1 -1
  44. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  45. package/lib/chain/blocks/verifyBlock.js +17 -6
  46. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  47. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  48. package/lib/chain/blocks/verifyBlocksDataAvailability.js +6 -1
  49. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  50. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
  51. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  52. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
  53. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  54. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  55. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
  56. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  57. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  58. package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
  59. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  60. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  61. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +1 -3
  62. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  63. package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
  64. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  65. package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
  66. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  67. package/lib/chain/bls/interface.d.ts +2 -0
  68. package/lib/chain/bls/interface.d.ts.map +1 -1
  69. package/lib/chain/bls/multithread/index.d.ts +1 -1
  70. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  71. package/lib/chain/bls/multithread/index.js +45 -17
  72. package/lib/chain/bls/multithread/index.js.map +1 -1
  73. package/lib/chain/chain.d.ts +24 -3
  74. package/lib/chain/chain.d.ts.map +1 -1
  75. package/lib/chain/chain.js +120 -39
  76. package/lib/chain/chain.js.map +1 -1
  77. package/lib/chain/emitter.d.ts +7 -7
  78. package/lib/chain/emitter.d.ts.map +1 -1
  79. package/lib/chain/emitter.js +5 -5
  80. package/lib/chain/emitter.js.map +1 -1
  81. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  82. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  83. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  84. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  85. package/lib/chain/errors/index.d.ts +0 -1
  86. package/lib/chain/errors/index.d.ts.map +1 -1
  87. package/lib/chain/errors/index.js +0 -1
  88. package/lib/chain/errors/index.js.map +1 -1
  89. package/lib/chain/forkChoice/index.d.ts +11 -1
  90. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  91. package/lib/chain/forkChoice/index.js +11 -0
  92. package/lib/chain/forkChoice/index.js.map +1 -1
  93. package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
  94. package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
  95. package/lib/chain/forkChoiceExecutionEngine.js +117 -0
  96. package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
  97. package/lib/chain/interface.d.ts +7 -4
  98. package/lib/chain/interface.d.ts.map +1 -1
  99. package/lib/chain/interface.js.map +1 -1
  100. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
  101. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  102. package/lib/chain/opPools/aggregatedAttestationPool.js +198 -45
  103. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  104. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  105. package/lib/chain/opPools/attestationPool.js +14 -3
  106. package/lib/chain/opPools/attestationPool.js.map +1 -1
  107. package/lib/chain/opPools/index.d.ts +1 -0
  108. package/lib/chain/opPools/index.d.ts.map +1 -1
  109. package/lib/chain/opPools/index.js +1 -0
  110. package/lib/chain/opPools/index.js.map +1 -1
  111. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  112. package/lib/chain/opPools/payloadAttestationPool.js +16 -6
  113. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  114. package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
  115. package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
  116. package/lib/chain/opPools/singleAttestationPool.js +209 -0
  117. package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
  118. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  119. package/lib/chain/opPools/syncCommitteeMessagePool.js +8 -2
  120. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  121. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  122. package/lib/chain/opPools/syncContributionAndProofPool.js +10 -2
  123. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  124. package/lib/chain/options.d.ts +5 -2
  125. package/lib/chain/options.d.ts.map +1 -1
  126. package/lib/chain/options.js.map +1 -1
  127. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  128. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  129. package/lib/chain/produceBlock/produceBlockBody.js +3 -2
  130. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  131. package/lib/chain/proposerTracker.d.ts +31 -0
  132. package/lib/chain/proposerTracker.d.ts.map +1 -0
  133. package/lib/chain/proposerTracker.js +75 -0
  134. package/lib/chain/proposerTracker.js.map +1 -0
  135. package/lib/chain/regen/interface.d.ts +1 -1
  136. package/lib/chain/regen/interface.d.ts.map +1 -1
  137. package/lib/chain/regen/queued.d.ts +1 -1
  138. package/lib/chain/regen/queued.d.ts.map +1 -1
  139. package/lib/chain/regen/queued.js +5 -3
  140. package/lib/chain/regen/queued.js.map +1 -1
  141. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
  142. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  143. package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
  144. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  145. package/lib/chain/validation/executionPayloadBid.js +13 -13
  146. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  147. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  148. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  149. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  150. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  151. package/lib/chain/validatorMonitor.d.ts +1 -2
  152. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  153. package/lib/chain/validatorMonitor.js +0 -3
  154. package/lib/chain/validatorMonitor.js.map +1 -1
  155. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  156. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  157. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  158. package/lib/db/flatFileStore/slotIndex.js +2 -2
  159. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  160. package/lib/db/repositories/blobSidecars.d.ts +0 -1
  161. package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
  162. package/lib/db/repositories/blobSidecars.js +0 -1
  163. package/lib/db/repositories/blobSidecars.js.map +1 -1
  164. package/lib/execution/builder/apiClient.d.ts +14 -8
  165. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  166. package/lib/execution/builder/apiClient.js +12 -10
  167. package/lib/execution/builder/apiClient.js.map +1 -1
  168. package/lib/execution/builder/http.d.ts +2 -0
  169. package/lib/execution/builder/http.d.ts.map +1 -1
  170. package/lib/execution/builder/http.js +2 -0
  171. package/lib/execution/builder/http.js.map +1 -1
  172. package/lib/execution/engine/http.d.ts +4 -6
  173. package/lib/execution/engine/http.d.ts.map +1 -1
  174. package/lib/execution/engine/http.js +8 -10
  175. package/lib/execution/engine/http.js.map +1 -1
  176. package/lib/execution/engine/interface.d.ts +17 -5
  177. package/lib/execution/engine/interface.d.ts.map +1 -1
  178. package/lib/execution/engine/interface.js.map +1 -1
  179. package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
  180. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  181. package/lib/execution/engine/jsonRpcTransport.js +2 -12
  182. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  183. package/lib/execution/engine/mock.d.ts +0 -1
  184. package/lib/execution/engine/mock.d.ts.map +1 -1
  185. package/lib/execution/engine/mock.js +0 -4
  186. package/lib/execution/engine/mock.js.map +1 -1
  187. package/lib/execution/engine/restTransport.d.ts +2 -4
  188. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  189. package/lib/execution/engine/restTransport.js +1 -15
  190. package/lib/execution/engine/restTransport.js.map +1 -1
  191. package/lib/execution/engine/sszTypes.d.ts +0 -9
  192. package/lib/execution/engine/sszTypes.d.ts.map +1 -1
  193. package/lib/execution/engine/sszTypes.js +0 -5
  194. package/lib/execution/engine/sszTypes.js.map +1 -1
  195. package/lib/execution/engine/transport.d.ts +1 -14
  196. package/lib/execution/engine/transport.d.ts.map +1 -1
  197. package/lib/execution/engine/types.d.ts +0 -8
  198. package/lib/execution/engine/types.d.ts.map +1 -1
  199. package/lib/execution/engine/types.js +0 -8
  200. package/lib/execution/engine/types.js.map +1 -1
  201. package/lib/execution/engine/utils.d.ts.map +1 -1
  202. package/lib/execution/engine/utils.js +3 -2
  203. package/lib/execution/engine/utils.js.map +1 -1
  204. package/lib/index.d.ts +1 -1
  205. package/lib/index.d.ts.map +1 -1
  206. package/lib/index.js +1 -1
  207. package/lib/index.js.map +1 -1
  208. package/lib/metrics/metrics/beacon.d.ts +0 -9
  209. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  210. package/lib/metrics/metrics/beacon.js +0 -30
  211. package/lib/metrics/metrics/beacon.js.map +1 -1
  212. package/lib/metrics/metrics/lodestar.d.ts +27 -8
  213. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  214. package/lib/metrics/metrics/lodestar.js +74 -18
  215. package/lib/metrics/metrics/lodestar.js.map +1 -1
  216. package/lib/metrics/server/http.js +5 -5
  217. package/lib/metrics/server/http.js.map +1 -1
  218. package/lib/network/core/networkCore.d.ts +2 -1
  219. package/lib/network/core/networkCore.d.ts.map +1 -1
  220. package/lib/network/core/networkCore.js +4 -0
  221. package/lib/network/core/networkCore.js.map +1 -1
  222. package/lib/network/core/networkCoreWorker.js +1 -0
  223. package/lib/network/core/networkCoreWorker.js.map +1 -1
  224. package/lib/network/core/networkCoreWorkerHandler.d.ts +2 -1
  225. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  226. package/lib/network/core/networkCoreWorkerHandler.js +3 -0
  227. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  228. package/lib/network/core/types.d.ts +4 -1
  229. package/lib/network/core/types.d.ts.map +1 -1
  230. package/lib/network/gossip/gossipsub.d.ts +1 -0
  231. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  232. package/lib/network/gossip/gossipsub.js +10 -0
  233. package/lib/network/gossip/gossipsub.js.map +1 -1
  234. package/lib/network/gossip/interface.d.ts +1 -8
  235. package/lib/network/gossip/interface.d.ts.map +1 -1
  236. package/lib/network/gossip/interface.js +0 -1
  237. package/lib/network/gossip/interface.js.map +1 -1
  238. package/lib/network/gossip/topic.d.ts +0 -16
  239. package/lib/network/gossip/topic.d.ts.map +1 -1
  240. package/lib/network/gossip/topic.js +0 -23
  241. package/lib/network/gossip/topic.js.map +1 -1
  242. package/lib/network/interface.d.ts +2 -5
  243. package/lib/network/interface.d.ts.map +1 -1
  244. package/lib/network/libp2p/index.d.ts.map +1 -1
  245. package/lib/network/libp2p/index.js +5 -1
  246. package/lib/network/libp2p/index.js.map +1 -1
  247. package/lib/network/network.d.ts +6 -7
  248. package/lib/network/network.d.ts.map +1 -1
  249. package/lib/network/network.js +50 -37
  250. package/lib/network/network.js.map +1 -1
  251. package/lib/network/options.d.ts +2 -0
  252. package/lib/network/options.d.ts.map +1 -1
  253. package/lib/network/options.js +2 -0
  254. package/lib/network/options.js.map +1 -1
  255. package/lib/network/peers/peerManager.d.ts.map +1 -1
  256. package/lib/network/peers/peerManager.js +28 -1
  257. package/lib/network/peers/peerManager.js.map +1 -1
  258. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  259. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  260. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  261. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  262. package/lib/network/peers/utils/subnetMap.d.ts +5 -2
  263. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
  264. package/lib/network/peers/utils/subnetMap.js +6 -3
  265. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  266. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  267. package/lib/network/processor/extractSlotRootFns.js +1 -8
  268. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  269. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  270. package/lib/network/processor/gossipHandlers.js +46 -126
  271. package/lib/network/processor/gossipHandlers.js.map +1 -1
  272. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  273. package/lib/network/processor/gossipQueues/index.js +0 -6
  274. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  275. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  276. package/lib/network/processor/gossipValidatorFn.js +1 -5
  277. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  278. package/lib/network/processor/index.d.ts +6 -0
  279. package/lib/network/processor/index.d.ts.map +1 -1
  280. package/lib/network/processor/index.js +29 -4
  281. package/lib/network/processor/index.js.map +1 -1
  282. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  283. package/lib/network/reqresp/ReqRespBeaconNode.js +0 -3
  284. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  285. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
  286. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  287. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  288. package/lib/network/reqresp/handlers/index.js +1 -12
  289. package/lib/network/reqresp/handlers/index.js.map +1 -1
  290. package/lib/network/reqresp/protocols.d.ts +0 -2
  291. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  292. package/lib/network/reqresp/protocols.js +0 -10
  293. package/lib/network/reqresp/protocols.js.map +1 -1
  294. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  295. package/lib/network/reqresp/rateLimit.js +1 -17
  296. package/lib/network/reqresp/rateLimit.js.map +1 -1
  297. package/lib/network/reqresp/types.d.ts +2 -8
  298. package/lib/network/reqresp/types.d.ts.map +1 -1
  299. package/lib/network/reqresp/types.js +1 -7
  300. package/lib/network/reqresp/types.js.map +1 -1
  301. package/lib/network/subnets/attnetsService.d.ts +35 -5
  302. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  303. package/lib/network/subnets/attnetsService.js +84 -6
  304. package/lib/network/subnets/attnetsService.js.map +1 -1
  305. package/lib/network/subnets/interface.d.ts +7 -0
  306. package/lib/network/subnets/interface.d.ts.map +1 -1
  307. package/lib/network/subnets/interface.js.map +1 -1
  308. package/lib/node/nodejs.d.ts +2 -0
  309. package/lib/node/nodejs.d.ts.map +1 -1
  310. package/lib/node/nodejs.js +37 -19
  311. package/lib/node/nodejs.js.map +1 -1
  312. package/lib/node/options.d.ts +3 -1
  313. package/lib/node/options.d.ts.map +1 -1
  314. package/lib/node/options.js +4 -2
  315. package/lib/node/options.js.map +1 -1
  316. package/lib/sync/range/batch.d.ts +2 -3
  317. package/lib/sync/range/batch.d.ts.map +1 -1
  318. package/lib/sync/range/batch.js +9 -22
  319. package/lib/sync/range/batch.js.map +1 -1
  320. package/lib/sync/range/chain.d.ts.map +1 -1
  321. package/lib/sync/range/chain.js +2 -15
  322. package/lib/sync/range/chain.js.map +1 -1
  323. package/lib/sync/sync.d.ts +8 -0
  324. package/lib/sync/sync.d.ts.map +1 -1
  325. package/lib/sync/sync.js +42 -22
  326. package/lib/sync/sync.js.map +1 -1
  327. package/lib/sync/unknownBlock.d.ts.map +1 -1
  328. package/lib/sync/unknownBlock.js +1 -7
  329. package/lib/sync/unknownBlock.js.map +1 -1
  330. package/lib/sync/utils/downloadByRange.d.ts +6 -34
  331. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  332. package/lib/sync/utils/downloadByRange.js +24 -128
  333. package/lib/sync/utils/downloadByRange.js.map +1 -1
  334. package/lib/sync/utils/downloadByRoot.d.ts +2 -18
  335. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  336. package/lib/sync/utils/downloadByRoot.js +14 -99
  337. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  338. package/lib/util/blobs.d.ts +1 -7
  339. package/lib/util/blobs.d.ts.map +1 -1
  340. package/lib/util/blobs.js +0 -19
  341. package/lib/util/blobs.js.map +1 -1
  342. package/lib/util/execution.d.ts +3 -4
  343. package/lib/util/execution.d.ts.map +1 -1
  344. package/lib/util/execution.js +1 -73
  345. package/lib/util/execution.js.map +1 -1
  346. package/lib/util/file.d.ts.map +1 -1
  347. package/lib/util/file.js +8 -9
  348. package/lib/util/file.js.map +1 -1
  349. package/lib/util/sszBytes.d.ts +5 -1
  350. package/lib/util/sszBytes.d.ts.map +1 -1
  351. package/lib/util/sszBytes.js +34 -17
  352. package/lib/util/sszBytes.js.map +1 -1
  353. package/lib/util/types.d.ts +0 -5
  354. package/lib/util/types.d.ts.map +1 -1
  355. package/lib/util/types.js +1 -2
  356. package/lib/util/types.js.map +1 -1
  357. package/package.json +16 -17
  358. package/src/api/impl/beacon/blocks/index.ts +24 -64
  359. package/src/api/impl/beacon/pool/index.ts +26 -0
  360. package/src/api/impl/validator/index.ts +43 -29
  361. package/src/chain/GetBlobsTracker.ts +10 -39
  362. package/src/chain/blocks/blockInput/blockInput.ts +11 -343
  363. package/src/chain/blocks/blockInput/errors.ts +1 -2
  364. package/src/chain/blocks/blockInput/types.ts +2 -20
  365. package/src/chain/blocks/importBlock.ts +56 -72
  366. package/src/chain/blocks/importExecutionPayload.ts +44 -33
  367. package/src/chain/blocks/index.ts +5 -2
  368. package/src/chain/blocks/payloadEnvelopeProcessor.ts +32 -21
  369. package/src/chain/blocks/types.ts +5 -31
  370. package/src/chain/blocks/verifyBlock.ts +30 -16
  371. package/src/chain/blocks/verifyBlocksDataAvailability.ts +6 -1
  372. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
  373. package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
  374. package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
  375. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +1 -3
  376. package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
  377. package/src/chain/bls/interface.ts +2 -0
  378. package/src/chain/bls/multithread/index.ts +43 -19
  379. package/src/chain/chain.ts +135 -37
  380. package/src/chain/emitter.ts +8 -8
  381. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  382. package/src/chain/errors/index.ts +0 -1
  383. package/src/chain/forkChoice/index.ts +11 -0
  384. package/src/chain/forkChoiceExecutionEngine.ts +183 -0
  385. package/src/chain/interface.ts +7 -3
  386. package/src/chain/opPools/aggregatedAttestationPool.ts +245 -42
  387. package/src/chain/opPools/attestationPool.ts +15 -3
  388. package/src/chain/opPools/index.ts +1 -0
  389. package/src/chain/opPools/payloadAttestationPool.ts +17 -6
  390. package/src/chain/opPools/singleAttestationPool.ts +287 -0
  391. package/src/chain/opPools/syncCommitteeMessagePool.ts +9 -2
  392. package/src/chain/opPools/syncContributionAndProofPool.ts +12 -2
  393. package/src/chain/options.ts +5 -2
  394. package/src/chain/produceBlock/produceBlockBody.ts +7 -3
  395. package/src/chain/proposerTracker.ts +94 -0
  396. package/src/chain/regen/interface.ts +1 -1
  397. package/src/chain/regen/queued.ts +6 -4
  398. package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
  399. package/src/chain/validation/executionPayloadBid.ts +14 -13
  400. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  401. package/src/chain/validatorMonitor.ts +0 -6
  402. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  403. package/src/db/flatFileStore/slotIndex.ts +4 -3
  404. package/src/db/repositories/blobSidecars.ts +0 -1
  405. package/src/execution/builder/apiClient.ts +16 -13
  406. package/src/execution/builder/http.ts +4 -0
  407. package/src/execution/engine/http.ts +19 -42
  408. package/src/execution/engine/interface.ts +18 -9
  409. package/src/execution/engine/jsonRpcTransport.ts +10 -22
  410. package/src/execution/engine/mock.ts +0 -7
  411. package/src/execution/engine/restTransport.ts +3 -22
  412. package/src/execution/engine/sszTypes.ts +0 -9
  413. package/src/execution/engine/transport.ts +8 -17
  414. package/src/execution/engine/types.ts +0 -17
  415. package/src/execution/engine/utils.ts +4 -2
  416. package/src/index.ts +1 -1
  417. package/src/metrics/metrics/beacon.ts +0 -30
  418. package/src/metrics/metrics/lodestar.ts +75 -18
  419. package/src/metrics/server/http.ts +5 -5
  420. package/src/network/core/networkCore.ts +6 -1
  421. package/src/network/core/networkCoreWorker.ts +1 -0
  422. package/src/network/core/networkCoreWorkerHandler.ts +4 -1
  423. package/src/network/core/types.ts +4 -1
  424. package/src/network/gossip/gossipsub.ts +11 -0
  425. package/src/network/gossip/interface.ts +0 -5
  426. package/src/network/gossip/topic.ts +0 -25
  427. package/src/network/interface.ts +0 -5
  428. package/src/network/libp2p/index.ts +5 -1
  429. package/src/network/network.ts +50 -60
  430. package/src/network/options.ts +4 -0
  431. package/src/network/peers/peerManager.ts +27 -2
  432. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  433. package/src/network/peers/utils/subnetMap.ts +6 -3
  434. package/src/network/processor/extractSlotRootFns.ts +0 -9
  435. package/src/network/processor/gossipHandlers.ts +59 -159
  436. package/src/network/processor/gossipQueues/index.ts +0 -6
  437. package/src/network/processor/gossipValidatorFn.ts +0 -5
  438. package/src/network/processor/index.ts +25 -4
  439. package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
  440. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
  441. package/src/network/reqresp/handlers/index.ts +0 -17
  442. package/src/network/reqresp/protocols.ts +0 -12
  443. package/src/network/reqresp/rateLimit.ts +1 -17
  444. package/src/network/reqresp/types.ts +0 -13
  445. package/src/network/subnets/attnetsService.ts +94 -6
  446. package/src/network/subnets/interface.ts +7 -0
  447. package/src/node/nodejs.ts +34 -15
  448. package/src/node/options.ts +5 -1
  449. package/src/sync/range/batch.ts +9 -21
  450. package/src/sync/range/chain.ts +2 -14
  451. package/src/sync/sync.ts +43 -22
  452. package/src/sync/unknownBlock.ts +1 -8
  453. package/src/sync/utils/downloadByRange.ts +31 -230
  454. package/src/sync/utils/downloadByRoot.ts +15 -142
  455. package/src/util/blobs.ts +0 -34
  456. package/src/util/execution.ts +8 -102
  457. package/src/util/file.ts +8 -9
  458. package/src/util/sszBytes.ts +40 -22
  459. package/src/util/types.ts +1 -8
  460. package/lib/chain/errors/blobSidecarError.d.ts +0 -108
  461. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  462. package/lib/chain/errors/blobSidecarError.js +0 -38
  463. package/lib/chain/errors/blobSidecarError.js.map +0 -1
  464. package/lib/chain/validation/blobSidecar.d.ts +0 -16
  465. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  466. package/lib/chain/validation/blobSidecar.js +0 -276
  467. package/lib/chain/validation/blobSidecar.js.map +0 -1
  468. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
  469. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  470. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
  471. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
  472. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
  473. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  474. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
  475. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
  476. package/src/chain/errors/blobSidecarError.ts +0 -70
  477. package/src/chain/validation/blobSidecar.ts +0 -357
  478. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
  479. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
@@ -108,6 +108,7 @@ type GossipSubInternal = GossipSub & {
108
108
  score: {score: (peerIdStr: string) => number};
109
109
  direct: Set<string>;
110
110
  topics: Map<string, Set<string>>;
111
+ streamsOutbound: ReadonlyMap<string, unknown>;
111
112
  start: () => Promise<void>;
112
113
  stop: () => Promise<void>;
113
114
  publish: (topic: TopicStr, data: Uint8Array, opts?: PublishOpts) => Promise<PublishResult>;
@@ -248,6 +249,16 @@ export class Eth2Gossipsub {
248
249
  return this.gossipsub.getMeshPeers(topic);
249
250
  }
250
251
 
252
+ getSubscribersWithOutboundStream(topic: GossipTopic): Set<string> {
253
+ const topicStr = stringifyGossipTopic(this.config, topic);
254
+ const peers = new Set<string>();
255
+ for (const peer of this.gossipsub.getSubscribers(topicStr)) {
256
+ const id = peer.toString();
257
+ if (this.gossipsub.streamsOutbound.has(id)) peers.add(id);
258
+ }
259
+ return peers;
260
+ }
261
+
251
262
  publish(topic: TopicStr, data: Uint8Array, opts?: PublishOpts): Promise<PublishResult> {
252
263
  return this.gossipsub.publish(topic, data, opts);
253
264
  }
@@ -14,7 +14,6 @@ import {
14
14
  SubnetID,
15
15
  altair,
16
16
  capella,
17
- deneb,
18
17
  gloas,
19
18
  heze,
20
19
  phase0,
@@ -27,7 +26,6 @@ import {JobItemQueue} from "../../util/queue/index.js";
27
26
 
28
27
  export enum GossipType {
29
28
  beacon_block = "beacon_block",
30
- blob_sidecar = "blob_sidecar",
31
29
  data_column_sidecar = "data_column_sidecar",
32
30
  beacon_aggregate_and_proof = "beacon_aggregate_and_proof",
33
31
  beacon_attestation = "beacon_attestation",
@@ -64,7 +62,6 @@ export interface IGossipTopic {
64
62
 
65
63
  export type GossipTopicTypeMap = {
66
64
  [GossipType.beacon_block]: {type: GossipType.beacon_block};
67
- [GossipType.blob_sidecar]: {type: GossipType.blob_sidecar; subnet: SubnetID};
68
65
  [GossipType.data_column_sidecar]: {type: GossipType.data_column_sidecar; subnet: SubnetID};
69
66
  [GossipType.beacon_aggregate_and_proof]: {type: GossipType.beacon_aggregate_and_proof};
70
67
  [GossipType.beacon_attestation]: {type: GossipType.beacon_attestation; subnet: SubnetID};
@@ -100,7 +97,6 @@ export type SSZTypeOfGossipTopic<T extends GossipTopic> = T extends {type: infer
100
97
 
101
98
  export type GossipTypeMap = {
102
99
  [GossipType.beacon_block]: SignedBeaconBlock;
103
- [GossipType.blob_sidecar]: deneb.BlobSidecar;
104
100
  [GossipType.beacon_aggregate_and_proof]: SignedAggregateAndProof;
105
101
  [GossipType.beacon_attestation]: SingleAttestation;
106
102
  [GossipType.data_column_sidecar]: DataColumnSidecar;
@@ -121,7 +117,6 @@ export type GossipTypeMap = {
121
117
 
122
118
  export type GossipFnByType = {
123
119
  [GossipType.beacon_block]: (signedBlock: SignedBeaconBlock) => Promise<void> | void;
124
- [GossipType.blob_sidecar]: (blobSidecar: deneb.BlobSidecar) => Promise<void> | void;
125
120
  [GossipType.beacon_aggregate_and_proof]: (aggregateAndProof: SignedAggregateAndProof) => Promise<void> | void;
126
121
  [GossipType.beacon_attestation]: (attestation: SingleAttestation) => Promise<void> | void;
127
122
  [GossipType.data_column_sidecar]: (dataColumnSidecar: DataColumnSidecar) => Promise<void> | void;
@@ -97,8 +97,6 @@ function stringifyGossipTopicType(topic: GossipTopic): string {
97
97
  case GossipType.beacon_attestation:
98
98
  case GossipType.sync_committee:
99
99
  return `${topic.type}_${topic.subnet}`;
100
- case GossipType.blob_sidecar:
101
- return `${topic.type}_${topic.subnet}`;
102
100
  case GossipType.data_column_sidecar:
103
101
  return `${topic.type}_${topic.subnet}`;
104
102
  }
@@ -110,8 +108,6 @@ export function getGossipSSZType(topic: GossipTopic) {
110
108
  case GossipType.beacon_block:
111
109
  // beacon_block is updated in altair to support the updated SignedBeaconBlock type
112
110
  return ssz[fork].SignedBeaconBlock;
113
- case GossipType.blob_sidecar:
114
- return ssz.deneb.BlobSidecar;
115
111
  case GossipType.data_column_sidecar:
116
112
  return isForkPostFulu(fork) ? sszTypesFor(fork).DataColumnSidecar : ssz.fulu.DataColumnSidecar;
117
113
  case GossipType.beacon_aggregate_and_proof:
@@ -255,13 +251,6 @@ export function parseGossipTopic(forkDigestContext: ForkDigestContext, topicStr:
255
251
  }
256
252
  }
257
253
 
258
- if (gossipTypeStr.startsWith(GossipType.blob_sidecar)) {
259
- const subnetStr = gossipTypeStr.slice(GossipType.blob_sidecar.length + 1); // +1 for '_' concatenating the topic name and the subnet
260
- const subnet = parseInt(subnetStr, 10);
261
- if (Number.isNaN(subnet)) throw Error(`subnet ${subnetStr} is not a number`);
262
- return {type: GossipType.blob_sidecar, subnet, boundary, encoding};
263
- }
264
-
265
254
  if (gossipTypeStr.startsWith(GossipType.data_column_sidecar)) {
266
255
  const subnetStr = gossipTypeStr.slice(GossipType.data_column_sidecar.length + 1); // +1 for '_' concatenating the topic name and the subnet
267
256
  const subnet = parseInt(subnetStr, 10);
@@ -309,18 +298,6 @@ export function getCoreTopicsAtFork(
309
298
  topics.push(...getDataColumnSidecarTopics(networkConfig, opts.subscribeAllColumnSubnets));
310
299
  }
311
300
 
312
- // After Deneb and before Fulu also track blob_sidecar_{subnet_id}
313
- if (ForkSeq[fork] >= ForkSeq.deneb && ForkSeq[fork] < ForkSeq.fulu) {
314
- const {config} = networkConfig;
315
- const subnetCount = isForkPostElectra(fork)
316
- ? config.BLOB_SIDECAR_SUBNET_COUNT_ELECTRA
317
- : config.BLOB_SIDECAR_SUBNET_COUNT;
318
-
319
- for (let subnet = 0; subnet < subnetCount; subnet++) {
320
- topics.push({type: GossipType.blob_sidecar, subnet});
321
- }
322
- }
323
-
324
301
  // capella
325
302
  if (ForkSeq[fork] >= ForkSeq.capella) {
326
303
  topics.push({type: GossipType.bls_to_execution_change});
@@ -405,7 +382,6 @@ function parseEncodingStr(encodingStr: string): GossipEncoding {
405
382
  // TODO: Review which yes, and which not
406
383
  export const gossipTopicIgnoreDuplicatePublishError: Record<GossipType, boolean> = {
407
384
  [GossipType.beacon_block]: true,
408
- [GossipType.blob_sidecar]: true,
409
385
  [GossipType.data_column_sidecar]: true,
410
386
  [GossipType.beacon_aggregate_and_proof]: true,
411
387
  [GossipType.beacon_attestation]: true,
@@ -438,7 +414,6 @@ export const gossipTopicIgnoreDuplicatePublishError: Record<GossipType, boolean>
438
414
  */
439
415
  export const gossipTopicAllowPublishToZeroPeers: Record<GossipType, boolean> = {
440
416
  [GossipType.beacon_block]: false,
441
- [GossipType.blob_sidecar]: false,
442
417
  // data_column_sidecar: we ensure having all topic peers via prioritizePeers(). Even with 0 peers on the
443
418
  // topic the overall publish can still succeed, because a supernode rebuilds and publishes the missing
444
419
  // columns for us, so track sent peers as 0 instead of raising
@@ -30,7 +30,6 @@ import {
30
30
  SubnetID,
31
31
  altair,
32
32
  capella,
33
- deneb,
34
33
  fulu,
35
34
  gloas,
36
35
  heze,
@@ -42,7 +41,6 @@ import {CustodyConfig} from "../util/dataColumns.js";
42
41
  import {PeerIdStr} from "../util/peerId.js";
43
42
  import {
44
43
  BeaconBlocksByRootRequest,
45
- BlobSidecarsByRootRequest,
46
44
  DataColumnSidecarsByRootRequest,
47
45
  ExecutionPayloadEnvelopesByRootRequest,
48
46
  } from "../util/types.js";
@@ -82,8 +80,6 @@ export interface INetwork extends INetworkCorePublic {
82
80
  sendBeaconBlocksByRange(peerId: PeerIdStr, request: phase0.BeaconBlocksByRangeRequest): Promise<SignedBeaconBlock[]>;
83
81
  sendBeaconBlocksByRoot(peerId: PeerIdStr, request: BeaconBlocksByRootRequest): Promise<SignedBeaconBlock[]>;
84
82
  sendBeaconBlocksByHead(peerId: PeerIdStr, request: fulu.BeaconBlocksByHeadRequest): Promise<SignedBeaconBlock[]>;
85
- sendBlobSidecarsByRange(peerId: PeerIdStr, request: deneb.BlobSidecarsByRangeRequest): Promise<deneb.BlobSidecar[]>;
86
- sendBlobSidecarsByRoot(peerId: PeerIdStr, request: BlobSidecarsByRootRequest): Promise<deneb.BlobSidecar[]>;
87
83
  sendDataColumnSidecarsByRange(
88
84
  peerId: PeerIdStr,
89
85
  request: fulu.DataColumnSidecarsByRangeRequest
@@ -103,7 +99,6 @@ export interface INetwork extends INetworkCorePublic {
103
99
 
104
100
  // Gossip
105
101
  publishBeaconBlock(signedBlock: SignedBeaconBlock): Promise<number>;
106
- publishBlobSidecar(blobSidecar: deneb.BlobSidecar): Promise<number>;
107
102
  publishBeaconAggregateAndProof(aggregateAndProof: SignedAggregateAndProof): Promise<number>;
108
103
  publishBeaconAttestation(attestation: SingleAttestation, subnet: SubnetID): Promise<number>;
109
104
  publishDataColumnSidecar(
@@ -150,7 +150,11 @@ export async function createNodeJsLibp2p(
150
150
  nodeInfo: {
151
151
  name: "lodestar",
152
152
  version: networkOpts.version ?? "unknown",
153
- userAgent: networkOpts.private ? "" : networkOpts.version ? `lodestar/${networkOpts.version}` : "lodestar",
153
+ userAgent: networkOpts.private
154
+ ? ""
155
+ : networkOpts.advertiseVersion && networkOpts.version
156
+ ? `lodestar/${networkOpts.version}`
157
+ : "lodestar",
154
158
  },
155
159
  addresses: {
156
160
  listen: localMultiaddrs,
@@ -19,18 +19,18 @@ import {
19
19
  SignedAggregateAndProof,
20
20
  SignedBeaconBlock,
21
21
  SingleAttestation,
22
+ Slot,
22
23
  SlotRootHex,
23
24
  SubnetID,
24
25
  altair,
25
26
  capella,
26
- deneb,
27
27
  fulu,
28
28
  gloas,
29
29
  heze,
30
30
  isGloasDataColumnSidecar,
31
31
  phase0,
32
32
  } from "@lodestar/types";
33
- import {prettyPrintIndices, sleep} from "@lodestar/utils";
33
+ import {defer, prettyPrintIndices, sleep} from "@lodestar/utils";
34
34
  import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
35
35
  import {ChainEvent, IBeaconChain} from "../chain/index.js";
36
36
  import {computeSubnetForDataColumnSidecar} from "../chain/validation/dataColumnSidecar.js";
@@ -43,7 +43,6 @@ import {PeerIdStr, peerIdToString} from "../util/peerId.js";
43
43
  import {promiseAllMaybeAsync} from "../util/promises.js";
44
44
  import {
45
45
  BeaconBlocksByRootRequest,
46
- BlobSidecarsByRootRequest,
47
46
  DataColumnSidecarsByRootRequest,
48
47
  ExecutionPayloadEnvelopesByRootRequest,
49
48
  } from "../util/types.js";
@@ -128,6 +127,7 @@ export class Network implements INetwork {
128
127
 
129
128
  private subscribedToCoreTopics = false;
130
129
  private connectedPeersSyncMeta = new Map<PeerIdStr, Omit<PeerSyncMeta, "peerId">>();
130
+ private closePromise: Promise<void> | undefined;
131
131
 
132
132
  constructor(modules: NetworkModules) {
133
133
  this.peerId = peerIdFromPrivateKey(modules.privateKey);
@@ -145,17 +145,13 @@ export class Network implements INetwork {
145
145
  this.events.on(NetworkEvent.peerConnected, this.onPeerConnected);
146
146
  this.events.on(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
147
147
  this.chain.emitter.on(routes.events.EventType.head, this.onHead);
148
- this.chain.emitter.on(routes.events.EventType.lightClientFinalityUpdate, ({data}) =>
149
- this.onLightClientFinalityUpdate(data)
150
- );
151
- this.chain.emitter.on(routes.events.EventType.lightClientOptimisticUpdate, ({data}) =>
152
- this.onLightClientOptimisticUpdate(data)
153
- );
148
+ this.chain.emitter.on(routes.events.EventType.lightClientFinalityUpdate, this.onLightClientFinalityUpdate);
149
+ this.chain.emitter.on(routes.events.EventType.lightClientOptimisticUpdate, this.onLightClientOptimisticUpdate);
154
150
  this.chain.emitter.on(ChainEvent.updateTargetCustodyGroupCount, this.onTargetGroupCountUpdated);
155
151
  this.chain.emitter.on(ChainEvent.publishDataColumns, this.onPublishDataColumns);
156
- this.chain.emitter.on(ChainEvent.publishBlobSidecars, this.onPublishBlobSidecars);
157
152
  this.chain.emitter.on(ChainEvent.publishProposerSlashing, this.onPublishProposerSlashing);
158
153
  this.chain.emitter.on(ChainEvent.updateStatus, this.onUpdateStatus);
154
+ this.chain.emitter.on(ChainEvent.localProposalSlots, this.onLocalProposalSlots);
159
155
  }
160
156
 
161
157
  static async init({
@@ -240,9 +236,16 @@ export class Network implements INetwork {
240
236
  return this.controller.signal.aborted;
241
237
  }
242
238
 
243
- /** Destroy this instance. Can only be called once. */
244
- async close(): Promise<void> {
245
- if (this.closed) return;
239
+ close(): Promise<void> {
240
+ if (this.closePromise !== undefined) return this.closePromise;
241
+ const completion = defer<void>();
242
+ this.closePromise = completion.promise;
243
+ void this.closeInternal().then(completion.resolve, completion.reject);
244
+ return this.closePromise;
245
+ }
246
+
247
+ private async closeInternal(): Promise<void> {
248
+ this.controller.abort();
246
249
 
247
250
  this.events.off(NetworkEvent.peerConnected, this.onPeerConnected);
248
251
  this.events.off(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
@@ -251,13 +254,15 @@ export class Network implements INetwork {
251
254
  this.chain.emitter.off(routes.events.EventType.lightClientOptimisticUpdate, this.onLightClientOptimisticUpdate);
252
255
  this.chain.emitter.off(ChainEvent.updateTargetCustodyGroupCount, this.onTargetGroupCountUpdated);
253
256
  this.chain.emitter.off(ChainEvent.publishDataColumns, this.onPublishDataColumns);
254
- this.chain.emitter.off(ChainEvent.publishBlobSidecars, this.onPublishBlobSidecars);
255
257
  this.chain.emitter.off(ChainEvent.publishProposerSlashing, this.onPublishProposerSlashing);
256
258
  this.chain.emitter.off(ChainEvent.updateStatus, this.onUpdateStatus);
257
- await this.core.close();
258
-
259
- // Used only for sleep() statements
260
- this.controller.abort();
259
+ this.chain.emitter.off(ChainEvent.localProposalSlots, this.onLocalProposalSlots);
260
+ this.connectedPeersSyncMeta.clear();
261
+ this.subscribedToCoreTopics = false;
262
+ const results = await Promise.allSettled([this.networkProcessor.stop(), this.core.close()]);
263
+ for (const result of results) {
264
+ if (result.status === "rejected") throw result.reason;
265
+ }
261
266
  this.logger.debug("network core closed");
262
267
  }
263
268
 
@@ -279,6 +284,13 @@ export class Network implements INetwork {
279
284
  return this.core.prepareBeaconCommitteeSubnets(subscriptions);
280
285
  }
281
286
 
287
+ /** The core subscribes to all attestation subnets before these proposals, see `slotsToSubscribeBeforeProposalDuty` */
288
+ private onLocalProposalSlots = (proposalSlots: Slot[]): void => {
289
+ this.core.addLocalProposalSlots(proposalSlots).catch((e) => {
290
+ this.logger.debug("Error adding local proposal slots", {slots: proposalSlots.join(",")}, e as Error);
291
+ });
292
+ };
293
+
282
294
  async prepareSyncCommitteeSubnets(subscriptions: CommitteeSubscription[]): Promise<void> {
283
295
  return this.core.prepareSyncCommitteeSubnets(subscriptions);
284
296
  }
@@ -333,6 +345,7 @@ export class Network implements INetwork {
333
345
  async subscribeGossipCoreTopics(): Promise<void> {
334
346
  if (!this.subscribedToCoreTopics) {
335
347
  await this.core.subscribeGossipCoreTopics();
348
+ if (this.closed) return;
336
349
  // Only mark subscribedToCoreTopics if worker resolved this call
337
350
  this.subscribedToCoreTopics = true;
338
351
  }
@@ -366,15 +379,6 @@ export class Network implements INetwork {
366
379
  return this.publishGossip<GossipType.beacon_block>({type: GossipType.beacon_block, boundary}, signedBlock);
367
380
  }
368
381
 
369
- async publishBlobSidecar(blobSidecar: deneb.BlobSidecar): Promise<number> {
370
- const epoch = computeEpochAtSlot(blobSidecar.signedBlockHeader.message.slot);
371
- const boundary = this.config.getForkBoundaryAtEpoch(epoch);
372
-
373
- const subnet = blobSidecar.index;
374
-
375
- return this.publishGossip<GossipType.blob_sidecar>({type: GossipType.blob_sidecar, boundary, subnet}, blobSidecar);
376
- }
377
-
378
382
  async publishDataColumnSidecar(
379
383
  dataColumnSidecar: DataColumnSidecar
380
384
  ): Promise<{sentPeers: number; alreadyPublished: boolean}> {
@@ -655,28 +659,6 @@ export class Network implements INetwork {
655
659
  );
656
660
  }
657
661
 
658
- async sendBlobSidecarsByRange(
659
- peerId: PeerIdStr,
660
- request: deneb.BlobSidecarsByRangeRequest
661
- ): Promise<deneb.BlobSidecar[]> {
662
- const epoch = computeEpochAtSlot(request.startSlot);
663
- return collectMaxResponseTyped(
664
- this.sendReqRespRequest(peerId, ReqRespMethod.BlobSidecarsByRange, [Version.V1], request),
665
- // request's count represent the slots, so the actual max count received could be slots * blobs per slot
666
- request.count * this.config.getMaxBlobsPerBlock(epoch),
667
- responseSszTypeByMethod[ReqRespMethod.BlobSidecarsByRange]
668
- );
669
- }
670
-
671
- async sendBlobSidecarsByRoot(peerId: PeerIdStr, request: BlobSidecarsByRootRequest): Promise<deneb.BlobSidecar[]> {
672
- return collectMaxResponseTyped(
673
- this.sendReqRespRequest(peerId, ReqRespMethod.BlobSidecarsByRoot, [Version.V1], request),
674
- request.length,
675
- responseSszTypeByMethod[ReqRespMethod.BlobSidecarsByRoot],
676
- this.chain.serializedCache
677
- );
678
- }
679
-
680
662
  async sendDataColumnSidecarsByRange(
681
663
  peerId: PeerIdStr,
682
664
  request: fulu.DataColumnSidecarsByRangeRequest
@@ -803,26 +785,32 @@ export class Network implements INetwork {
803
785
  return this.core.writeDiscv5HeapSnapshot(prefix, dirpath);
804
786
  }
805
787
 
806
- private onLightClientFinalityUpdate = async (finalityUpdate: LightClientFinalityUpdate): Promise<void> => {
788
+ private onLightClientFinalityUpdate = async ({
789
+ data: finalityUpdate,
790
+ }: routes.events.EventData[routes.events.EventType.lightClientFinalityUpdate]): Promise<void> => {
807
791
  // TODO: Review is OK to remove if (this.hasAttachedSyncCommitteeMember())
808
792
 
809
793
  try {
810
794
  // messages SHOULD be broadcast after SYNC_MESSAGE_DUE_BPS of slot has transpired
811
795
  // https://github.com/ethereum/consensus-specs/blob/v1.6.1/specs/altair/light-client/p2p-interface.md#sync-committee
812
796
  await this.waitForSyncMessageCutoff(finalityUpdate.signatureSlot);
797
+ if (this.closed) return;
813
798
  await this.publishLightClientFinalityUpdate(finalityUpdate);
814
799
  } catch (e) {
815
800
  this.logger.debug("Error on BeaconGossipHandler.onLightclientFinalityUpdate", {}, e as Error);
816
801
  }
817
802
  };
818
803
 
819
- private onLightClientOptimisticUpdate = async (optimisticUpdate: LightClientOptimisticUpdate): Promise<void> => {
804
+ private onLightClientOptimisticUpdate = async ({
805
+ data: optimisticUpdate,
806
+ }: routes.events.EventData[routes.events.EventType.lightClientOptimisticUpdate]): Promise<void> => {
820
807
  // TODO: Review is OK to remove if (this.hasAttachedSyncCommitteeMember())
821
808
 
822
809
  try {
823
810
  // messages SHOULD be broadcast after SYNC_MESSAGE_DUE_BPS of slot has transpired
824
811
  // https://github.com/ethereum/consensus-specs/blob/v1.6.1/specs/altair/light-client/p2p-interface.md#sync-committee
825
812
  await this.waitForSyncMessageCutoff(optimisticUpdate.signatureSlot);
813
+ if (this.closed) return;
826
814
  await this.publishLightClientOptimisticUpdate(optimisticUpdate);
827
815
  } catch (e) {
828
816
  this.logger.debug("Error on BeaconGossipHandler.onLightclientOptimisticUpdate", {}, e as Error);
@@ -859,20 +847,18 @@ export class Network implements INetwork {
859
847
  this.connectedPeersSyncMeta.delete(data.peer);
860
848
  };
861
849
 
862
- private onTargetGroupCountUpdated = (count: number): void => {
863
- this.core.setTargetGroupCount(count).catch((e) => {
864
- this.logger.debug("Error setting target custody group count", {count}, e as Error);
865
- });
850
+ private onTargetGroupCountUpdated = async (count: number): Promise<void> => {
851
+ try {
852
+ await this.core.setTargetGroupCount(count);
853
+ } catch (error) {
854
+ this.logger.error("Error updating network custody group count", {count}, error as Error);
855
+ }
866
856
  };
867
857
 
868
858
  private onPublishDataColumns = async (sidecars: DataColumnSidecar[]): Promise<void> => {
869
859
  await promiseAllMaybeAsync(sidecars.map((sidecar) => () => this.publishDataColumnSidecar(sidecar)));
870
860
  };
871
861
 
872
- private onPublishBlobSidecars = (sidecars: deneb.BlobSidecar[]): Promise<number[]> => {
873
- return promiseAllMaybeAsync(sidecars.map((sidecar) => () => this.publishBlobSidecar(sidecar)));
874
- };
875
-
876
862
  private onPublishProposerSlashing = async (proposerSlashing: phase0.ProposerSlashing): Promise<void> => {
877
863
  try {
878
864
  await this.publishProposerSlashing(proposerSlashing);
@@ -886,6 +872,10 @@ export class Network implements INetwork {
886
872
  };
887
873
 
888
874
  private onUpdateStatus = async (): Promise<void> => {
889
- await this.core.updateStatus(this.chain.getStatus());
875
+ try {
876
+ await this.core.updateStatus(this.chain.getStatus());
877
+ } catch (error) {
878
+ this.logger.error("Error updating network status", {}, error as Error);
879
+ }
890
880
  };
891
881
  }
@@ -25,6 +25,8 @@ export interface NetworkOptions
25
25
  mdns?: boolean;
26
26
  connectToDiscv5Bootnodes?: boolean;
27
27
  version?: string;
28
+ /** Include the version in libp2p Identify. Private mode takes precedence. */
29
+ advertiseVersion?: boolean;
28
30
  private?: boolean;
29
31
  useWorker?: boolean;
30
32
  maxYoungGenerationSizeMb?: number;
@@ -72,6 +74,8 @@ export const defaultNetworkOptions: NetworkOptions = {
72
74
  maxYoungGenerationSizeMb: 152,
73
75
  // subscribe 2 slots before aggregator dutied slot to get stable mesh peers as monitored on goerli
74
76
  slotsToSubscribeBeforeAggregatorDuty: 2,
77
+ // up to the max number of attestations per block
78
+ slotsToSubscribeBeforeProposalDuty: 8,
75
79
  // This will enable the light client server by default
76
80
  disableLightClientServer: false,
77
81
  quic: true,
@@ -14,6 +14,7 @@ import {NetworkCoreMetrics} from "../core/metrics.js";
14
14
  import {LodestarDiscv5Opts} from "../discv5/types.js";
15
15
  import {INetworkEventBus, NetworkEvent, NetworkEventData} from "../events.js";
16
16
  import {Eth2Gossipsub} from "../gossip/gossipsub.js";
17
+ import {GossipType} from "../gossip/interface.js";
17
18
  import {Libp2p} from "../interface.js";
18
19
  import {SubnetType} from "../metadata.js";
19
20
  import {NetworkConfig} from "../networkConfig.js";
@@ -577,6 +578,8 @@ export class PeerManager {
577
578
  this.lastStatus = status;
578
579
  this.metrics?.peerManager.starved.set(starved ? 1 : 0);
579
580
  const forkSeq = this.config.getForkSeq(this.clock.currentSlot);
581
+ const boundary = this.config.getForkBoundaryAtEpoch(this.clock.currentEpoch);
582
+ const connectedHealthyPeerIds = new Set(connectedHealthyPeers.map((peer) => peer.toString()));
580
583
 
581
584
  const prioritizeTimer = this.metrics?.peerManager.prioritizePeersDuration.startTimer();
582
585
  const {peersToDisconnect, peersToConnect, attnetQueries, syncnetQueries, custodyGroupQueries} = prioritizePeers(
@@ -594,8 +597,30 @@ export class PeerManager {
594
597
  };
595
598
  }),
596
599
  // Collect subnets which we need peers for in the current slot
597
- this.attnetsService.getActiveSubnets(),
598
- this.syncnetsService.getActiveSubnets(),
600
+ this.attnetsService.getActiveSubnets().map((request) => {
601
+ const subscribers = this.gossipsub.getSubscribersWithOutboundStream({
602
+ type: GossipType.beacon_attestation,
603
+ boundary,
604
+ subnet: request.subnet,
605
+ });
606
+ let peerCount = 0;
607
+ for (const peer of subscribers) {
608
+ if (connectedHealthyPeerIds.has(peer)) peerCount++;
609
+ }
610
+ return {...request, peerCount};
611
+ }),
612
+ this.syncnetsService.getActiveSubnets().map((request) => {
613
+ const subscribers = this.gossipsub.getSubscribersWithOutboundStream({
614
+ type: GossipType.sync_committee,
615
+ boundary,
616
+ subnet: request.subnet,
617
+ });
618
+ let peerCount = 0;
619
+ for (const peer of subscribers) {
620
+ if (connectedHealthyPeerIds.has(peer)) peerCount++;
621
+ }
622
+ return {...request, peerCount};
623
+ }),
599
624
  // ignore samplingGroups for pre-fulu forks
600
625
  forkSeq >= ForkSeq.fulu ? this.networkConfig.custodyConfig.sampleGroups : undefined,
601
626
  {
@@ -49,6 +49,8 @@ const syncnetsZero = BitArray.fromBitLen(SYNC_COMMITTEE_SUBNET_COUNT);
49
49
 
50
50
  type SubnetDiscvQuery = {subnet: SubnetID; toSlot: number; maxPeersToDiscover: number};
51
51
 
52
+ export type RequestedSubnetWithPeerCount = RequestedSubnet & {peerCount: number};
53
+
52
54
  /**
53
55
  * A map of das custody group index to maxPeersToDiscover
54
56
  */
@@ -145,8 +147,8 @@ export function prioritizePeers(
145
147
  samplingGroups: CustodyIndex[] | null;
146
148
  score: number;
147
149
  }[],
148
- activeAttnets: RequestedSubnet[],
149
- activeSyncnets: RequestedSubnet[],
150
+ activeAttnets: RequestedSubnetWithPeerCount[],
151
+ activeSyncnets: RequestedSubnetWithPeerCount[],
150
152
  samplingGroups: CustodyIndex[] | undefined,
151
153
  opts: PrioritizePeersOpts,
152
154
  config: ChainConfig,
@@ -231,8 +233,8 @@ export function prioritizePeers(
231
233
  */
232
234
  function requestSubnetPeers(
233
235
  connectedPeers: PeerInfo[],
234
- activeAttnets: RequestedSubnet[],
235
- activeSyncnets: RequestedSubnet[],
236
+ activeAttnets: RequestedSubnetWithPeerCount[],
237
+ activeSyncnets: RequestedSubnetWithPeerCount[],
236
238
  ourSamplingGroups: CustodyIndex[] | undefined,
237
239
  opts: PrioritizePeersOpts,
238
240
  config: ChainConfig,
@@ -252,54 +254,44 @@ function requestSubnetPeers(
252
254
 
253
255
  // attnets, do we need queries for more peers
254
256
  if (activeAttnets.length > 0) {
255
- /** Map of peers per subnet, peer may be in multiple arrays */
256
- const peersPerSubnet = new Map<number, number>();
257
-
258
257
  for (const peer of connectedPeers) {
259
258
  const trueBitIndices = peer.attnetsTrueBitIndices;
260
259
  let dutyCount = 0;
261
260
  for (const {subnet} of activeAttnets) {
262
261
  if (trueBitIndices.includes(subnet)) {
263
262
  dutyCount += 1;
264
- peersPerSubnet.set(subnet, 1 + (peersPerSubnet.get(subnet) ?? 0));
265
263
  }
266
264
  }
267
265
  dutiesByPeer.set(peer, dutyCount);
268
266
  }
269
267
 
270
- for (const {subnet, toSlot} of activeAttnets) {
271
- const peersInSubnet = peersPerSubnet.get(subnet) ?? 0;
272
- metrics?.peerManager.peersPerActiveSubnet.observe({type: SubnetType.attnets}, peersInSubnet);
273
- if (peersInSubnet < targetSubnetPeers) {
268
+ for (const {subnet, toSlot, peerCount} of activeAttnets) {
269
+ metrics?.peerManager.peersPerActiveSubnet.observe({type: SubnetType.attnets}, peerCount);
270
+ if (peerCount < targetSubnetPeers) {
274
271
  // We need more peers
275
- attnetQueries.push({subnet, toSlot, maxPeersToDiscover: targetSubnetPeers - peersInSubnet});
272
+ attnetQueries.push({subnet, toSlot, maxPeersToDiscover: targetSubnetPeers - peerCount});
276
273
  }
277
274
  }
278
275
  }
279
276
 
280
277
  // syncnets, do we need queries for more peers
281
278
  if (activeSyncnets.length > 0) {
282
- /** Map of peers per subnet, peer may be in multiple arrays */
283
- const peersPerSubnet = new Map<number, number>();
284
-
285
279
  for (const peer of connectedPeers) {
286
280
  const trueBitIndices = peer.syncnetsTrueBitIndices;
287
281
  let dutyCount = dutiesByPeer.get(peer) ?? 0;
288
282
  for (const {subnet} of activeSyncnets) {
289
283
  if (trueBitIndices.includes(subnet)) {
290
284
  dutyCount += 1;
291
- peersPerSubnet.set(subnet, 1 + (peersPerSubnet.get(subnet) ?? 0));
292
285
  }
293
286
  }
294
287
  dutiesByPeer.set(peer, dutyCount);
295
288
  }
296
289
 
297
- for (const {subnet, toSlot} of activeSyncnets) {
298
- const peersInSubnet = peersPerSubnet.get(subnet) ?? 0;
299
- metrics?.peerManager.peersPerActiveSubnet.observe({type: SubnetType.syncnets}, peersInSubnet);
300
- if (peersInSubnet < targetSubnetPeers) {
290
+ for (const {subnet, toSlot, peerCount} of activeSyncnets) {
291
+ metrics?.peerManager.peersPerActiveSubnet.observe({type: SubnetType.syncnets}, peerCount);
292
+ if (peerCount < targetSubnetPeers) {
301
293
  // We need more peers
302
- syncnetQueries.push({subnet, toSlot, maxPeersToDiscover: targetSubnetPeers - peersInSubnet});
294
+ syncnetQueries.push({subnet, toSlot, maxPeersToDiscover: targetSubnetPeers - peerCount});
303
295
  }
304
296
  }
305
297
  }
@@ -66,11 +66,14 @@ export class SubnetMap {
66
66
  return subnets;
67
67
  }
68
68
 
69
- /** Return subnetIds with a `toSlot` less than `currentSlot`. Also deletes expired entries */
70
- getExpired(currentSlot: Slot): SubnetID[] {
69
+ /**
70
+ * Return subnetIds with a `toSlot` less than `currentSlot`. Also deletes expired entries
71
+ * @param keep expired subnets for which it returns true are neither returned nor deleted
72
+ */
73
+ getExpired(currentSlot: Slot, keep?: (subnet: SubnetID) => boolean): SubnetID[] {
71
74
  const subnetIds: SubnetID[] = [];
72
75
  for (const [subnet, toSlot] of this.subnets.entries()) {
73
- if (toSlot < currentSlot) {
76
+ if (toSlot < currentSlot && keep?.(subnet) !== true) {
74
77
  subnetIds.push(subnet);
75
78
  this.subnets.delete(subnet);
76
79
  }
@@ -6,7 +6,6 @@ import {
6
6
  getBlockRootFromPayloadAttestationMessageSerialized,
7
7
  getBlockRootFromSignedAggregateAndProofSerialized,
8
8
  getSlotFromBeaconAttestationSerialized,
9
- getSlotFromBlobSidecarSerialized,
10
9
  getSlotFromDataColumnSidecarSerialized,
11
10
  getSlotFromExecutionPayloadEnvelopeSerialized,
12
11
  getSlotFromPayloadAttestationMessageSerialized,
@@ -49,14 +48,6 @@ export function createExtractBlockSlotRootFns(): ExtractSlotRootFns {
49
48
  }
50
49
  return {slot};
51
50
  },
52
- [GossipType.blob_sidecar]: (data: Uint8Array): SlotOptionalRoot | null => {
53
- const slot = getSlotFromBlobSidecarSerialized(data);
54
-
55
- if (slot === null) {
56
- return null;
57
- }
58
- return {slot};
59
- },
60
51
  [GossipType.data_column_sidecar]: (data: Uint8Array, fork: ForkName): SlotOptionalRoot | null => {
61
52
  const slot = getSlotFromDataColumnSidecarSerialized(data, fork);
62
53