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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +26 -67
  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 +22 -2
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/utils.d.ts +1 -1
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  9. package/lib/api/impl/validator/index.d.ts +6 -0
  10. package/lib/api/impl/validator/index.d.ts.map +1 -1
  11. package/lib/api/impl/validator/index.js +38 -25
  12. package/lib/api/impl/validator/index.js.map +1 -1
  13. package/lib/chain/GetBlobsTracker.d.ts +2 -2
  14. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  15. package/lib/chain/GetBlobsTracker.js +11 -33
  16. package/lib/chain/GetBlobsTracker.js.map +1 -1
  17. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  18. package/lib/chain/archiveStore/archiveStore.js +1 -0
  19. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  20. package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
  21. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  22. package/lib/chain/blocks/blockInput/blockInput.js +5 -241
  23. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  24. package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
  25. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
  26. package/lib/chain/blocks/blockInput/errors.js.map +1 -1
  27. package/lib/chain/blocks/blockInput/types.d.ts +2 -18
  28. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  29. package/lib/chain/blocks/blockInput/types.js +0 -1
  30. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  31. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  32. package/lib/chain/blocks/importBlock.js +36 -53
  33. package/lib/chain/blocks/importBlock.js.map +1 -1
  34. package/lib/chain/blocks/importExecutionPayload.d.ts +6 -10
  35. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  36. package/lib/chain/blocks/importExecutionPayload.js +26 -17
  37. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  38. package/lib/chain/blocks/index.d.ts.map +1 -1
  39. package/lib/chain/blocks/index.js +2 -2
  40. package/lib/chain/blocks/index.js.map +1 -1
  41. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +10 -7
  42. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  43. package/lib/chain/blocks/payloadEnvelopeProcessor.js +22 -17
  44. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  45. package/lib/chain/blocks/types.d.ts +4 -20
  46. package/lib/chain/blocks/types.d.ts.map +1 -1
  47. package/lib/chain/blocks/types.js +0 -24
  48. package/lib/chain/blocks/types.js.map +1 -1
  49. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  50. package/lib/chain/blocks/verifyBlock.js +17 -6
  51. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  52. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  53. package/lib/chain/blocks/verifyBlocksDataAvailability.js +6 -1
  54. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  55. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
  56. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  57. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
  58. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  59. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  60. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
  61. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  62. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  63. package/lib/chain/blocks/verifyBlocksSignatures.js +7 -5
  64. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  65. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  66. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +1 -3
  67. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  68. package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
  69. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  70. package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
  71. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  72. package/lib/chain/bls/interface.d.ts +2 -0
  73. package/lib/chain/bls/interface.d.ts.map +1 -1
  74. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  75. package/lib/chain/bls/multithread/index.js +13 -11
  76. package/lib/chain/bls/multithread/index.js.map +1 -1
  77. package/lib/chain/bls/multithread/types.d.ts +1 -1
  78. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  79. package/lib/chain/bls/multithread/worker.js +1 -1
  80. package/lib/chain/bls/multithread/worker.js.map +1 -1
  81. package/lib/chain/bls/singleThread.js +1 -1
  82. package/lib/chain/bls/singleThread.js.map +1 -1
  83. package/lib/chain/bls/utils.js +1 -1
  84. package/lib/chain/bls/utils.js.map +1 -1
  85. package/lib/chain/chain.d.ts +25 -4
  86. package/lib/chain/chain.d.ts.map +1 -1
  87. package/lib/chain/chain.js +120 -39
  88. package/lib/chain/chain.js.map +1 -1
  89. package/lib/chain/emitter.d.ts +7 -7
  90. package/lib/chain/emitter.d.ts.map +1 -1
  91. package/lib/chain/emitter.js +5 -5
  92. package/lib/chain/emitter.js.map +1 -1
  93. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  94. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  95. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  96. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  97. package/lib/chain/errors/index.d.ts +0 -1
  98. package/lib/chain/errors/index.d.ts.map +1 -1
  99. package/lib/chain/errors/index.js +0 -1
  100. package/lib/chain/errors/index.js.map +1 -1
  101. package/lib/chain/forkChoice/index.d.ts +11 -1
  102. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  103. package/lib/chain/forkChoice/index.js +11 -0
  104. package/lib/chain/forkChoice/index.js.map +1 -1
  105. package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
  106. package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
  107. package/lib/chain/forkChoiceExecutionEngine.js +117 -0
  108. package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
  109. package/lib/chain/interface.d.ts +9 -7
  110. package/lib/chain/interface.d.ts.map +1 -1
  111. package/lib/chain/interface.js.map +1 -1
  112. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
  113. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  114. package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
  115. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  116. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  117. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  118. package/lib/chain/opPools/attestationPool.js +15 -4
  119. package/lib/chain/opPools/attestationPool.js.map +1 -1
  120. package/lib/chain/opPools/index.d.ts +1 -0
  121. package/lib/chain/opPools/index.d.ts.map +1 -1
  122. package/lib/chain/opPools/index.js +1 -0
  123. package/lib/chain/opPools/index.js.map +1 -1
  124. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  125. package/lib/chain/opPools/payloadAttestationPool.js +17 -7
  126. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  127. package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
  128. package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
  129. package/lib/chain/opPools/singleAttestationPool.js +209 -0
  130. package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
  131. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  132. package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
  133. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  134. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  135. package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
  136. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  137. package/lib/chain/opPools/utils.d.ts +1 -1
  138. package/lib/chain/opPools/utils.d.ts.map +1 -1
  139. package/lib/chain/opPools/utils.js +1 -1
  140. package/lib/chain/opPools/utils.js.map +1 -1
  141. package/lib/chain/options.d.ts +5 -2
  142. package/lib/chain/options.d.ts.map +1 -1
  143. package/lib/chain/options.js.map +1 -1
  144. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  145. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  146. package/lib/chain/produceBlock/produceBlockBody.js +3 -2
  147. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  148. package/lib/chain/proposerTracker.d.ts +31 -0
  149. package/lib/chain/proposerTracker.d.ts.map +1 -0
  150. package/lib/chain/proposerTracker.js +75 -0
  151. package/lib/chain/proposerTracker.js.map +1 -0
  152. package/lib/chain/regen/interface.d.ts +1 -1
  153. package/lib/chain/regen/interface.d.ts.map +1 -1
  154. package/lib/chain/regen/queued.d.ts +1 -1
  155. package/lib/chain/regen/queued.d.ts.map +1 -1
  156. package/lib/chain/regen/queued.js +5 -3
  157. package/lib/chain/regen/queued.js.map +1 -1
  158. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
  159. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  160. package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
  161. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  162. package/lib/chain/validation/executionPayloadBid.js +13 -13
  163. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  164. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  165. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  166. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  167. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  168. package/lib/chain/validatorMonitor.d.ts +1 -2
  169. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  170. package/lib/chain/validatorMonitor.js +0 -3
  171. package/lib/chain/validatorMonitor.js.map +1 -1
  172. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  173. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  174. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  175. package/lib/db/flatFileStore/slotIndex.js +2 -2
  176. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  177. package/lib/db/repositories/blobSidecars.d.ts +0 -1
  178. package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
  179. package/lib/db/repositories/blobSidecars.js +0 -1
  180. package/lib/db/repositories/blobSidecars.js.map +1 -1
  181. package/lib/execution/builder/apiClient.d.ts +14 -8
  182. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  183. package/lib/execution/builder/apiClient.js +12 -10
  184. package/lib/execution/builder/apiClient.js.map +1 -1
  185. package/lib/execution/builder/http.d.ts +2 -0
  186. package/lib/execution/builder/http.d.ts.map +1 -1
  187. package/lib/execution/builder/http.js +2 -0
  188. package/lib/execution/builder/http.js.map +1 -1
  189. package/lib/execution/engine/http.d.ts +4 -6
  190. package/lib/execution/engine/http.d.ts.map +1 -1
  191. package/lib/execution/engine/http.js +8 -10
  192. package/lib/execution/engine/http.js.map +1 -1
  193. package/lib/execution/engine/index.d.ts +1 -1
  194. package/lib/execution/engine/index.d.ts.map +1 -1
  195. package/lib/execution/engine/index.js +1 -1
  196. package/lib/execution/engine/index.js.map +1 -1
  197. package/lib/execution/engine/interface.d.ts +18 -6
  198. package/lib/execution/engine/interface.d.ts.map +1 -1
  199. package/lib/execution/engine/interface.js.map +1 -1
  200. package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
  201. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  202. package/lib/execution/engine/jsonRpcTransport.js +2 -12
  203. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  204. package/lib/execution/engine/mock.d.ts +0 -1
  205. package/lib/execution/engine/mock.d.ts.map +1 -1
  206. package/lib/execution/engine/mock.js +0 -4
  207. package/lib/execution/engine/mock.js.map +1 -1
  208. package/lib/execution/engine/restTransport.d.ts +2 -4
  209. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  210. package/lib/execution/engine/restTransport.js +1 -15
  211. package/lib/execution/engine/restTransport.js.map +1 -1
  212. package/lib/execution/engine/sszTypes.d.ts +0 -9
  213. package/lib/execution/engine/sszTypes.d.ts.map +1 -1
  214. package/lib/execution/engine/sszTypes.js +0 -5
  215. package/lib/execution/engine/sszTypes.js.map +1 -1
  216. package/lib/execution/engine/transport.d.ts +1 -14
  217. package/lib/execution/engine/transport.d.ts.map +1 -1
  218. package/lib/execution/engine/types.d.ts +0 -8
  219. package/lib/execution/engine/types.d.ts.map +1 -1
  220. package/lib/execution/engine/types.js +2 -10
  221. package/lib/execution/engine/types.js.map +1 -1
  222. package/lib/execution/engine/utils.d.ts.map +1 -1
  223. package/lib/execution/engine/utils.js +3 -2
  224. package/lib/execution/engine/utils.js.map +1 -1
  225. package/lib/index.d.ts +1 -1
  226. package/lib/index.d.ts.map +1 -1
  227. package/lib/index.js +1 -1
  228. package/lib/index.js.map +1 -1
  229. package/lib/metrics/metrics/beacon.d.ts +0 -9
  230. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  231. package/lib/metrics/metrics/beacon.js +0 -30
  232. package/lib/metrics/metrics/beacon.js.map +1 -1
  233. package/lib/metrics/metrics/lodestar.d.ts +30 -8
  234. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  235. package/lib/metrics/metrics/lodestar.js +79 -18
  236. package/lib/metrics/metrics/lodestar.js.map +1 -1
  237. package/lib/metrics/server/http.js +5 -5
  238. package/lib/metrics/server/http.js.map +1 -1
  239. package/lib/monitoring/service.js +1 -1
  240. package/lib/monitoring/service.js.map +1 -1
  241. package/lib/network/core/networkCore.d.ts +4 -1
  242. package/lib/network/core/networkCore.d.ts.map +1 -1
  243. package/lib/network/core/networkCore.js +7 -0
  244. package/lib/network/core/networkCore.js.map +1 -1
  245. package/lib/network/core/networkCoreWorker.js +2 -0
  246. package/lib/network/core/networkCoreWorker.js.map +1 -1
  247. package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
  248. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  249. package/lib/network/core/networkCoreWorkerHandler.js +6 -0
  250. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  251. package/lib/network/core/types.d.ts +6 -1
  252. package/lib/network/core/types.d.ts.map +1 -1
  253. package/lib/network/gossip/gossipsub.d.ts +1 -0
  254. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  255. package/lib/network/gossip/gossipsub.js +10 -0
  256. package/lib/network/gossip/gossipsub.js.map +1 -1
  257. package/lib/network/gossip/interface.d.ts +1 -8
  258. package/lib/network/gossip/interface.d.ts.map +1 -1
  259. package/lib/network/gossip/interface.js +0 -1
  260. package/lib/network/gossip/interface.js.map +1 -1
  261. package/lib/network/gossip/topic.d.ts +0 -16
  262. package/lib/network/gossip/topic.d.ts.map +1 -1
  263. package/lib/network/gossip/topic.js +0 -23
  264. package/lib/network/gossip/topic.js.map +1 -1
  265. package/lib/network/interface.d.ts +4 -5
  266. package/lib/network/interface.d.ts.map +1 -1
  267. package/lib/network/libp2p/index.d.ts.map +1 -1
  268. package/lib/network/libp2p/index.js +5 -1
  269. package/lib/network/libp2p/index.js.map +1 -1
  270. package/lib/network/network.d.ts +8 -7
  271. package/lib/network/network.d.ts.map +1 -1
  272. package/lib/network/network.js +53 -35
  273. package/lib/network/network.js.map +1 -1
  274. package/lib/network/options.d.ts +2 -0
  275. package/lib/network/options.d.ts.map +1 -1
  276. package/lib/network/options.js +2 -0
  277. package/lib/network/options.js.map +1 -1
  278. package/lib/network/peers/peerManager.d.ts +2 -1
  279. package/lib/network/peers/peerManager.d.ts.map +1 -1
  280. package/lib/network/peers/peerManager.js +28 -1
  281. package/lib/network/peers/peerManager.js.map +1 -1
  282. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  283. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  284. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  285. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  286. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  287. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  288. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  289. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  290. package/lib/network/peers/utils/subnetMap.d.ts +5 -2
  291. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
  292. package/lib/network/peers/utils/subnetMap.js +6 -3
  293. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  294. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  295. package/lib/network/processor/extractSlotRootFns.js +1 -8
  296. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  297. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  298. package/lib/network/processor/gossipHandlers.js +46 -128
  299. package/lib/network/processor/gossipHandlers.js.map +1 -1
  300. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  301. package/lib/network/processor/gossipQueues/index.js +0 -6
  302. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  303. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  304. package/lib/network/processor/gossipValidatorFn.js +1 -5
  305. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  306. package/lib/network/processor/index.d.ts +6 -0
  307. package/lib/network/processor/index.d.ts.map +1 -1
  308. package/lib/network/processor/index.js +29 -4
  309. package/lib/network/processor/index.js.map +1 -1
  310. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  311. package/lib/network/reqresp/ReqRespBeaconNode.js +0 -3
  312. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  313. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
  314. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  315. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  316. package/lib/network/reqresp/handlers/index.js +1 -12
  317. package/lib/network/reqresp/handlers/index.js.map +1 -1
  318. package/lib/network/reqresp/protocols.d.ts +0 -2
  319. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  320. package/lib/network/reqresp/protocols.js +0 -10
  321. package/lib/network/reqresp/protocols.js.map +1 -1
  322. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  323. package/lib/network/reqresp/rateLimit.js +1 -17
  324. package/lib/network/reqresp/rateLimit.js.map +1 -1
  325. package/lib/network/reqresp/types.d.ts +2 -8
  326. package/lib/network/reqresp/types.d.ts.map +1 -1
  327. package/lib/network/reqresp/types.js +1 -7
  328. package/lib/network/reqresp/types.js.map +1 -1
  329. package/lib/network/subnets/attnetsService.d.ts +35 -5
  330. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  331. package/lib/network/subnets/attnetsService.js +84 -6
  332. package/lib/network/subnets/attnetsService.js.map +1 -1
  333. package/lib/network/subnets/interface.d.ts +7 -0
  334. package/lib/network/subnets/interface.d.ts.map +1 -1
  335. package/lib/network/subnets/interface.js.map +1 -1
  336. package/lib/node/nodejs.d.ts +3 -1
  337. package/lib/node/nodejs.d.ts.map +1 -1
  338. package/lib/node/nodejs.js +38 -20
  339. package/lib/node/nodejs.js.map +1 -1
  340. package/lib/node/options.d.ts +3 -1
  341. package/lib/node/options.d.ts.map +1 -1
  342. package/lib/node/options.js +4 -2
  343. package/lib/node/options.js.map +1 -1
  344. package/lib/sync/interface.d.ts.map +1 -1
  345. package/lib/sync/interface.js.map +1 -1
  346. package/lib/sync/range/batch.d.ts +2 -3
  347. package/lib/sync/range/batch.d.ts.map +1 -1
  348. package/lib/sync/range/batch.js +9 -22
  349. package/lib/sync/range/batch.js.map +1 -1
  350. package/lib/sync/range/chain.d.ts.map +1 -1
  351. package/lib/sync/range/chain.js +2 -15
  352. package/lib/sync/range/chain.js.map +1 -1
  353. package/lib/sync/sync.d.ts +7 -0
  354. package/lib/sync/sync.d.ts.map +1 -1
  355. package/lib/sync/sync.js +61 -3
  356. package/lib/sync/sync.js.map +1 -1
  357. package/lib/sync/unknownBlock.d.ts.map +1 -1
  358. package/lib/sync/unknownBlock.js +1 -7
  359. package/lib/sync/unknownBlock.js.map +1 -1
  360. package/lib/sync/utils/downloadByRange.d.ts +6 -34
  361. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  362. package/lib/sync/utils/downloadByRange.js +24 -128
  363. package/lib/sync/utils/downloadByRange.js.map +1 -1
  364. package/lib/sync/utils/downloadByRoot.d.ts +2 -18
  365. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  366. package/lib/sync/utils/downloadByRoot.js +14 -99
  367. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  368. package/lib/util/blobs.d.ts +1 -7
  369. package/lib/util/blobs.d.ts.map +1 -1
  370. package/lib/util/blobs.js +0 -19
  371. package/lib/util/blobs.js.map +1 -1
  372. package/lib/util/execution.d.ts +3 -4
  373. package/lib/util/execution.d.ts.map +1 -1
  374. package/lib/util/execution.js +1 -73
  375. package/lib/util/execution.js.map +1 -1
  376. package/lib/util/file.d.ts.map +1 -1
  377. package/lib/util/file.js +8 -9
  378. package/lib/util/file.js.map +1 -1
  379. package/lib/util/queue/itemQueue.js +1 -1
  380. package/lib/util/queue/itemQueue.js.map +1 -1
  381. package/lib/util/sszBytes.d.ts +5 -1
  382. package/lib/util/sszBytes.d.ts.map +1 -1
  383. package/lib/util/sszBytes.js +36 -19
  384. package/lib/util/sszBytes.js.map +1 -1
  385. package/lib/util/types.d.ts +0 -5
  386. package/lib/util/types.d.ts.map +1 -1
  387. package/lib/util/types.js +1 -2
  388. package/lib/util/types.js.map +1 -1
  389. package/package.json +16 -17
  390. package/src/api/impl/beacon/blocks/index.ts +48 -86
  391. package/src/api/impl/beacon/pool/index.ts +31 -1
  392. package/src/api/impl/beacon/state/utils.ts +1 -1
  393. package/src/api/impl/validator/index.ts +43 -29
  394. package/src/chain/GetBlobsTracker.ts +14 -41
  395. package/src/chain/archiveStore/archiveStore.ts +1 -0
  396. package/src/chain/blocks/blockInput/blockInput.ts +11 -343
  397. package/src/chain/blocks/blockInput/errors.ts +1 -2
  398. package/src/chain/blocks/blockInput/types.ts +2 -20
  399. package/src/chain/blocks/importBlock.ts +56 -72
  400. package/src/chain/blocks/importExecutionPayload.ts +44 -33
  401. package/src/chain/blocks/index.ts +5 -2
  402. package/src/chain/blocks/payloadEnvelopeProcessor.ts +33 -22
  403. package/src/chain/blocks/types.ts +5 -31
  404. package/src/chain/blocks/verifyBlock.ts +30 -16
  405. package/src/chain/blocks/verifyBlocksDataAvailability.ts +6 -1
  406. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
  407. package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
  408. package/src/chain/blocks/verifyBlocksSignatures.ts +7 -5
  409. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +1 -3
  410. package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
  411. package/src/chain/bls/interface.ts +2 -0
  412. package/src/chain/bls/multithread/index.ts +14 -10
  413. package/src/chain/bls/multithread/types.ts +1 -1
  414. package/src/chain/bls/multithread/worker.ts +1 -5
  415. package/src/chain/bls/singleThread.ts +1 -1
  416. package/src/chain/bls/utils.ts +1 -1
  417. package/src/chain/chain.ts +136 -38
  418. package/src/chain/emitter.ts +8 -8
  419. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  420. package/src/chain/errors/index.ts +0 -1
  421. package/src/chain/forkChoice/index.ts +11 -0
  422. package/src/chain/forkChoiceExecutionEngine.ts +183 -0
  423. package/src/chain/interface.ts +9 -6
  424. package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
  425. package/src/chain/opPools/attestationPool.ts +16 -4
  426. package/src/chain/opPools/index.ts +1 -0
  427. package/src/chain/opPools/payloadAttestationPool.ts +18 -7
  428. package/src/chain/opPools/singleAttestationPool.ts +287 -0
  429. package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
  430. package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
  431. package/src/chain/opPools/utils.ts +1 -1
  432. package/src/chain/options.ts +5 -2
  433. package/src/chain/produceBlock/produceBlockBody.ts +7 -3
  434. package/src/chain/proposerTracker.ts +94 -0
  435. package/src/chain/regen/interface.ts +1 -1
  436. package/src/chain/regen/queued.ts +6 -4
  437. package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
  438. package/src/chain/validation/executionPayloadBid.ts +14 -13
  439. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  440. package/src/chain/validatorMonitor.ts +0 -6
  441. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  442. package/src/db/flatFileStore/slotIndex.ts +4 -3
  443. package/src/db/repositories/blobSidecars.ts +0 -1
  444. package/src/execution/builder/apiClient.ts +16 -13
  445. package/src/execution/builder/http.ts +4 -0
  446. package/src/execution/engine/http.ts +19 -42
  447. package/src/execution/engine/index.ts +1 -1
  448. package/src/execution/engine/interface.ts +19 -10
  449. package/src/execution/engine/jsonRpcTransport.ts +10 -22
  450. package/src/execution/engine/mock.ts +0 -7
  451. package/src/execution/engine/restTransport.ts +3 -22
  452. package/src/execution/engine/sszTypes.ts +0 -9
  453. package/src/execution/engine/transport.ts +8 -17
  454. package/src/execution/engine/types.ts +3 -18
  455. package/src/execution/engine/utils.ts +4 -2
  456. package/src/index.ts +1 -1
  457. package/src/metrics/metrics/beacon.ts +0 -30
  458. package/src/metrics/metrics/lodestar.ts +80 -18
  459. package/src/metrics/server/http.ts +5 -5
  460. package/src/monitoring/service.ts +1 -1
  461. package/src/network/core/networkCore.ts +11 -1
  462. package/src/network/core/networkCoreWorker.ts +2 -0
  463. package/src/network/core/networkCoreWorkerHandler.ts +8 -1
  464. package/src/network/core/types.ts +6 -1
  465. package/src/network/gossip/gossipsub.ts +11 -0
  466. package/src/network/gossip/interface.ts +0 -5
  467. package/src/network/gossip/topic.ts +0 -25
  468. package/src/network/interface.ts +2 -5
  469. package/src/network/libp2p/index.ts +5 -1
  470. package/src/network/network.ts +55 -58
  471. package/src/network/options.ts +4 -0
  472. package/src/network/peers/peerManager.ts +28 -3
  473. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  474. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  475. package/src/network/peers/utils/subnetMap.ts +6 -3
  476. package/src/network/processor/extractSlotRootFns.ts +0 -9
  477. package/src/network/processor/gossipHandlers.ts +59 -161
  478. package/src/network/processor/gossipQueues/index.ts +0 -6
  479. package/src/network/processor/gossipValidatorFn.ts +0 -5
  480. package/src/network/processor/index.ts +25 -4
  481. package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
  482. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
  483. package/src/network/reqresp/handlers/index.ts +0 -17
  484. package/src/network/reqresp/protocols.ts +0 -12
  485. package/src/network/reqresp/rateLimit.ts +1 -17
  486. package/src/network/reqresp/types.ts +0 -13
  487. package/src/network/subnets/attnetsService.ts +94 -6
  488. package/src/network/subnets/interface.ts +7 -0
  489. package/src/node/nodejs.ts +40 -21
  490. package/src/node/options.ts +9 -6
  491. package/src/sync/interface.ts +1 -0
  492. package/src/sync/range/batch.ts +9 -21
  493. package/src/sync/range/chain.ts +2 -14
  494. package/src/sync/sync.ts +65 -4
  495. package/src/sync/unknownBlock.ts +1 -8
  496. package/src/sync/utils/downloadByRange.ts +31 -230
  497. package/src/sync/utils/downloadByRoot.ts +15 -142
  498. package/src/util/blobs.ts +0 -34
  499. package/src/util/execution.ts +8 -102
  500. package/src/util/file.ts +8 -9
  501. package/src/util/queue/itemQueue.ts +1 -1
  502. package/src/util/sszBytes.ts +42 -24
  503. package/src/util/types.ts +1 -8
  504. package/lib/chain/errors/blobSidecarError.d.ts +0 -108
  505. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  506. package/lib/chain/errors/blobSidecarError.js +0 -38
  507. package/lib/chain/errors/blobSidecarError.js.map +0 -1
  508. package/lib/chain/validation/blobSidecar.d.ts +0 -16
  509. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  510. package/lib/chain/validation/blobSidecar.js +0 -276
  511. package/lib/chain/validation/blobSidecar.js.map +0 -1
  512. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
  513. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  514. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
  515. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
  516. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
  517. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  518. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
  519. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
  520. package/src/chain/errors/blobSidecarError.ts +0 -70
  521. package/src/chain/validation/blobSidecar.ts +0 -357
  522. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
  523. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
@@ -9,8 +9,9 @@ import {routes} from "@lodestar/api";
9
9
  import {BeaconConfig, chainConfigToJson} from "@lodestar/config";
10
10
  import type {LoggerNode} from "@lodestar/logger/node";
11
11
  import {ResponseIncoming, ResponseOutgoing} from "@lodestar/reqresp";
12
- import {Status} from "@lodestar/types";
12
+ import {Slot, Status} from "@lodestar/types";
13
13
  import {withTimeout} from "@lodestar/utils";
14
+ import {GoodByeReasonCode} from "../../constants/index.js";
14
15
  import {Metrics} from "../../metrics/index.js";
15
16
  import {AsyncIterableBridgeCaller, AsyncIterableBridgeHandler} from "../../util/asyncIterableToEvents.js";
16
17
  import {PeerIdStr, peerIdFromString} from "../../util/peerId.js";
@@ -205,6 +206,9 @@ export class WorkerNetworkCore implements INetworkCore {
205
206
  reStatusPeers(peers: PeerIdStr[]): Promise<void> {
206
207
  return this.getApi().reStatusPeers(peers);
207
208
  }
209
+ goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void> {
210
+ return this.getApi().goodbyeAndDisconnect(peer, reason);
211
+ }
208
212
  reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): Promise<void> {
209
213
  return this.getApi().reportPeer(peer, action, actionName);
210
214
  }
@@ -216,6 +220,9 @@ export class WorkerNetworkCore implements INetworkCore {
216
220
  prepareSyncCommitteeSubnets(subscriptions: CommitteeSubscription[]): Promise<void> {
217
221
  return this.getApi().prepareSyncCommitteeSubnets(subscriptions);
218
222
  }
223
+ addLocalProposalSlots(slots: Slot[]): Promise<void> {
224
+ return this.getApi().addLocalProposalSlots(slots);
225
+ }
219
226
  subscribeGossipCoreTopics(): Promise<void> {
220
227
  return this.getApi().subscribeGossipCoreTopics();
221
228
  }
@@ -4,7 +4,8 @@ import {routes} from "@lodestar/api";
4
4
  import {SpecJson} from "@lodestar/config";
5
5
  import {LoggerNodeOpts} from "@lodestar/logger/node";
6
6
  import {ResponseIncoming} from "@lodestar/reqresp";
7
- import {Status} from "@lodestar/types";
7
+ import {Slot, Status} from "@lodestar/types";
8
+ import {GoodByeReasonCode} from "../../constants/index.js";
8
9
  import {PeerIdStr} from "../../util/peerId.js";
9
10
  import {NetworkOptions} from "../options.js";
10
11
  import {PeerAction, PeerScoreStats} from "../peers/index.js";
@@ -53,6 +54,7 @@ export interface INetworkCore extends INetworkCorePublic {
53
54
  // Sync method
54
55
  reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
55
56
  reStatusPeers(peers: PeerIdStr[]): Promise<void>;
57
+ goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void>;
56
58
 
57
59
  // TODO: Duplicated methods with INetwork interface
58
60
  getConnectedPeers(): Promise<PeerIdStr[]>;
@@ -60,6 +62,8 @@ export interface INetworkCore extends INetworkCorePublic {
60
62
 
61
63
  /** Chain must push status updates to the network core */
62
64
  updateStatus(status: Status): Promise<void>;
65
+ /** Block proposal slots of connected validators, used to subscribe to all attestation subnets before them */
66
+ addLocalProposalSlots(slots: Slot[]): Promise<void>;
63
67
 
64
68
  setTargetGroupCount(count: number): Promise<void>;
65
69
  /** Opens stream to handle ReqResp outgoing request */
@@ -109,6 +113,7 @@ export type NetworkWorkerApi = INetworkCorePublic & {
109
113
  getConnectedPeers(): Promise<PeerIdStr[]>;
110
114
  getConnectedPeerCount(): Promise<number>;
111
115
  updateStatus(status: Status): Promise<void>;
116
+ addLocalProposalSlots(slots: Slot[]): Promise<void>;
112
117
 
113
118
  setTargetGroupCount(count: number): Promise<void>;
114
119
 
@@ -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,18 +30,17 @@ import {
30
30
  SubnetID,
31
31
  altair,
32
32
  capella,
33
- deneb,
34
33
  fulu,
35
34
  gloas,
36
35
  heze,
37
36
  phase0,
38
37
  } from "@lodestar/types";
39
38
  import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
39
+ import {GoodByeReasonCode} from "../constants/index.js";
40
40
  import {CustodyConfig} from "../util/dataColumns.js";
41
41
  import {PeerIdStr} from "../util/peerId.js";
42
42
  import {
43
43
  BeaconBlocksByRootRequest,
44
- BlobSidecarsByRootRequest,
45
44
  DataColumnSidecarsByRootRequest,
46
45
  ExecutionPayloadEnvelopesByRootRequest,
47
46
  } from "../util/types.js";
@@ -74,14 +73,13 @@ export interface INetwork extends INetworkCorePublic {
74
73
  reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
75
74
  shouldAggregate(subnet: SubnetID, slot: Slot): boolean;
76
75
  reStatusPeers(peers: PeerIdStr[]): Promise<void>;
76
+ goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void>;
77
77
  searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
78
78
  searchUnknownEnvelope(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
79
79
  // ReqResp
80
80
  sendBeaconBlocksByRange(peerId: PeerIdStr, request: phase0.BeaconBlocksByRangeRequest): Promise<SignedBeaconBlock[]>;
81
81
  sendBeaconBlocksByRoot(peerId: PeerIdStr, request: BeaconBlocksByRootRequest): Promise<SignedBeaconBlock[]>;
82
82
  sendBeaconBlocksByHead(peerId: PeerIdStr, request: fulu.BeaconBlocksByHeadRequest): Promise<SignedBeaconBlock[]>;
83
- sendBlobSidecarsByRange(peerId: PeerIdStr, request: deneb.BlobSidecarsByRangeRequest): Promise<deneb.BlobSidecar[]>;
84
- sendBlobSidecarsByRoot(peerId: PeerIdStr, request: BlobSidecarsByRootRequest): Promise<deneb.BlobSidecar[]>;
85
83
  sendDataColumnSidecarsByRange(
86
84
  peerId: PeerIdStr,
87
85
  request: fulu.DataColumnSidecarsByRangeRequest
@@ -101,7 +99,6 @@ export interface INetwork extends INetworkCorePublic {
101
99
 
102
100
  // Gossip
103
101
  publishBeaconBlock(signedBlock: SignedBeaconBlock): Promise<number>;
104
- publishBlobSidecar(blobSidecar: deneb.BlobSidecar): Promise<number>;
105
102
  publishBeaconAggregateAndProof(aggregateAndProof: SignedAggregateAndProof): Promise<number>;
106
103
  publishBeaconAttestation(attestation: SingleAttestation, subnet: SubnetID): Promise<number>;
107
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,21 +19,22 @@ 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";
37
+ import {GoodByeReasonCode} from "../constants/index.js";
37
38
  import {IBeaconDb} from "../db/interface.js";
38
39
  import {Metrics, RegistryMetricCreator} from "../metrics/index.js";
39
40
  import {IClock} from "../util/clock.js";
@@ -42,7 +43,6 @@ import {PeerIdStr, peerIdToString} from "../util/peerId.js";
42
43
  import {promiseAllMaybeAsync} from "../util/promises.js";
43
44
  import {
44
45
  BeaconBlocksByRootRequest,
45
- BlobSidecarsByRootRequest,
46
46
  DataColumnSidecarsByRootRequest,
47
47
  ExecutionPayloadEnvelopesByRootRequest,
48
48
  } from "../util/types.js";
@@ -127,6 +127,7 @@ export class Network implements INetwork {
127
127
 
128
128
  private subscribedToCoreTopics = false;
129
129
  private connectedPeersSyncMeta = new Map<PeerIdStr, Omit<PeerSyncMeta, "peerId">>();
130
+ private closePromise: Promise<void> | undefined;
130
131
 
131
132
  constructor(modules: NetworkModules) {
132
133
  this.peerId = peerIdFromPrivateKey(modules.privateKey);
@@ -144,17 +145,13 @@ export class Network implements INetwork {
144
145
  this.events.on(NetworkEvent.peerConnected, this.onPeerConnected);
145
146
  this.events.on(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
146
147
  this.chain.emitter.on(routes.events.EventType.head, this.onHead);
147
- this.chain.emitter.on(routes.events.EventType.lightClientFinalityUpdate, ({data}) =>
148
- this.onLightClientFinalityUpdate(data)
149
- );
150
- this.chain.emitter.on(routes.events.EventType.lightClientOptimisticUpdate, ({data}) =>
151
- this.onLightClientOptimisticUpdate(data)
152
- );
148
+ this.chain.emitter.on(routes.events.EventType.lightClientFinalityUpdate, this.onLightClientFinalityUpdate);
149
+ this.chain.emitter.on(routes.events.EventType.lightClientOptimisticUpdate, this.onLightClientOptimisticUpdate);
153
150
  this.chain.emitter.on(ChainEvent.updateTargetCustodyGroupCount, this.onTargetGroupCountUpdated);
154
151
  this.chain.emitter.on(ChainEvent.publishDataColumns, this.onPublishDataColumns);
155
- this.chain.emitter.on(ChainEvent.publishBlobSidecars, this.onPublishBlobSidecars);
156
152
  this.chain.emitter.on(ChainEvent.publishProposerSlashing, this.onPublishProposerSlashing);
157
153
  this.chain.emitter.on(ChainEvent.updateStatus, this.onUpdateStatus);
154
+ this.chain.emitter.on(ChainEvent.localProposalSlots, this.onLocalProposalSlots);
158
155
  }
159
156
 
160
157
  static async init({
@@ -239,9 +236,16 @@ export class Network implements INetwork {
239
236
  return this.controller.signal.aborted;
240
237
  }
241
238
 
242
- /** Destroy this instance. Can only be called once. */
243
- async close(): Promise<void> {
244
- 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();
245
249
 
246
250
  this.events.off(NetworkEvent.peerConnected, this.onPeerConnected);
247
251
  this.events.off(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
@@ -250,13 +254,15 @@ export class Network implements INetwork {
250
254
  this.chain.emitter.off(routes.events.EventType.lightClientOptimisticUpdate, this.onLightClientOptimisticUpdate);
251
255
  this.chain.emitter.off(ChainEvent.updateTargetCustodyGroupCount, this.onTargetGroupCountUpdated);
252
256
  this.chain.emitter.off(ChainEvent.publishDataColumns, this.onPublishDataColumns);
253
- this.chain.emitter.off(ChainEvent.publishBlobSidecars, this.onPublishBlobSidecars);
254
257
  this.chain.emitter.off(ChainEvent.publishProposerSlashing, this.onPublishProposerSlashing);
255
258
  this.chain.emitter.off(ChainEvent.updateStatus, this.onUpdateStatus);
256
- await this.core.close();
257
-
258
- // Used only for sleep() statements
259
- 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
+ }
260
266
  this.logger.debug("network core closed");
261
267
  }
262
268
 
@@ -278,6 +284,13 @@ export class Network implements INetwork {
278
284
  return this.core.prepareBeaconCommitteeSubnets(subscriptions);
279
285
  }
280
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
+
281
294
  async prepareSyncCommitteeSubnets(subscriptions: CommitteeSubscription[]): Promise<void> {
282
295
  return this.core.prepareSyncCommitteeSubnets(subscriptions);
283
296
  }
@@ -289,6 +302,10 @@ export class Network implements INetwork {
289
302
  return this.core.reStatusPeers(peers);
290
303
  }
291
304
 
305
+ async goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void> {
306
+ return this.core.goodbyeAndDisconnect(peer, reason);
307
+ }
308
+
292
309
  searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
293
310
  this.networkProcessor.searchUnknownBlock(slotRoot, source, peer);
294
311
  }
@@ -328,6 +345,7 @@ export class Network implements INetwork {
328
345
  async subscribeGossipCoreTopics(): Promise<void> {
329
346
  if (!this.subscribedToCoreTopics) {
330
347
  await this.core.subscribeGossipCoreTopics();
348
+ if (this.closed) return;
331
349
  // Only mark subscribedToCoreTopics if worker resolved this call
332
350
  this.subscribedToCoreTopics = true;
333
351
  }
@@ -361,15 +379,6 @@ export class Network implements INetwork {
361
379
  return this.publishGossip<GossipType.beacon_block>({type: GossipType.beacon_block, boundary}, signedBlock);
362
380
  }
363
381
 
364
- async publishBlobSidecar(blobSidecar: deneb.BlobSidecar): Promise<number> {
365
- const epoch = computeEpochAtSlot(blobSidecar.signedBlockHeader.message.slot);
366
- const boundary = this.config.getForkBoundaryAtEpoch(epoch);
367
-
368
- const subnet = blobSidecar.index;
369
-
370
- return this.publishGossip<GossipType.blob_sidecar>({type: GossipType.blob_sidecar, boundary, subnet}, blobSidecar);
371
- }
372
-
373
382
  async publishDataColumnSidecar(
374
383
  dataColumnSidecar: DataColumnSidecar
375
384
  ): Promise<{sentPeers: number; alreadyPublished: boolean}> {
@@ -650,28 +659,6 @@ export class Network implements INetwork {
650
659
  );
651
660
  }
652
661
 
653
- async sendBlobSidecarsByRange(
654
- peerId: PeerIdStr,
655
- request: deneb.BlobSidecarsByRangeRequest
656
- ): Promise<deneb.BlobSidecar[]> {
657
- const epoch = computeEpochAtSlot(request.startSlot);
658
- return collectMaxResponseTyped(
659
- this.sendReqRespRequest(peerId, ReqRespMethod.BlobSidecarsByRange, [Version.V1], request),
660
- // request's count represent the slots, so the actual max count received could be slots * blobs per slot
661
- request.count * this.config.getMaxBlobsPerBlock(epoch),
662
- responseSszTypeByMethod[ReqRespMethod.BlobSidecarsByRange]
663
- );
664
- }
665
-
666
- async sendBlobSidecarsByRoot(peerId: PeerIdStr, request: BlobSidecarsByRootRequest): Promise<deneb.BlobSidecar[]> {
667
- return collectMaxResponseTyped(
668
- this.sendReqRespRequest(peerId, ReqRespMethod.BlobSidecarsByRoot, [Version.V1], request),
669
- request.length,
670
- responseSszTypeByMethod[ReqRespMethod.BlobSidecarsByRoot],
671
- this.chain.serializedCache
672
- );
673
- }
674
-
675
662
  async sendDataColumnSidecarsByRange(
676
663
  peerId: PeerIdStr,
677
664
  request: fulu.DataColumnSidecarsByRangeRequest
@@ -798,26 +785,32 @@ export class Network implements INetwork {
798
785
  return this.core.writeDiscv5HeapSnapshot(prefix, dirpath);
799
786
  }
800
787
 
801
- private onLightClientFinalityUpdate = async (finalityUpdate: LightClientFinalityUpdate): Promise<void> => {
788
+ private onLightClientFinalityUpdate = async ({
789
+ data: finalityUpdate,
790
+ }: routes.events.EventData[routes.events.EventType.lightClientFinalityUpdate]): Promise<void> => {
802
791
  // TODO: Review is OK to remove if (this.hasAttachedSyncCommitteeMember())
803
792
 
804
793
  try {
805
794
  // messages SHOULD be broadcast after SYNC_MESSAGE_DUE_BPS of slot has transpired
806
795
  // https://github.com/ethereum/consensus-specs/blob/v1.6.1/specs/altair/light-client/p2p-interface.md#sync-committee
807
796
  await this.waitForSyncMessageCutoff(finalityUpdate.signatureSlot);
797
+ if (this.closed) return;
808
798
  await this.publishLightClientFinalityUpdate(finalityUpdate);
809
799
  } catch (e) {
810
800
  this.logger.debug("Error on BeaconGossipHandler.onLightclientFinalityUpdate", {}, e as Error);
811
801
  }
812
802
  };
813
803
 
814
- private onLightClientOptimisticUpdate = async (optimisticUpdate: LightClientOptimisticUpdate): Promise<void> => {
804
+ private onLightClientOptimisticUpdate = async ({
805
+ data: optimisticUpdate,
806
+ }: routes.events.EventData[routes.events.EventType.lightClientOptimisticUpdate]): Promise<void> => {
815
807
  // TODO: Review is OK to remove if (this.hasAttachedSyncCommitteeMember())
816
808
 
817
809
  try {
818
810
  // messages SHOULD be broadcast after SYNC_MESSAGE_DUE_BPS of slot has transpired
819
811
  // https://github.com/ethereum/consensus-specs/blob/v1.6.1/specs/altair/light-client/p2p-interface.md#sync-committee
820
812
  await this.waitForSyncMessageCutoff(optimisticUpdate.signatureSlot);
813
+ if (this.closed) return;
821
814
  await this.publishLightClientOptimisticUpdate(optimisticUpdate);
822
815
  } catch (e) {
823
816
  this.logger.debug("Error on BeaconGossipHandler.onLightclientOptimisticUpdate", {}, e as Error);
@@ -854,18 +847,18 @@ export class Network implements INetwork {
854
847
  this.connectedPeersSyncMeta.delete(data.peer);
855
848
  };
856
849
 
857
- private onTargetGroupCountUpdated = (count: number): void => {
858
- this.core.setTargetGroupCount(count);
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
+ }
859
856
  };
860
857
 
861
858
  private onPublishDataColumns = async (sidecars: DataColumnSidecar[]): Promise<void> => {
862
859
  await promiseAllMaybeAsync(sidecars.map((sidecar) => () => this.publishDataColumnSidecar(sidecar)));
863
860
  };
864
861
 
865
- private onPublishBlobSidecars = (sidecars: deneb.BlobSidecar[]): Promise<number[]> => {
866
- return promiseAllMaybeAsync(sidecars.map((sidecar) => () => this.publishBlobSidecar(sidecar)));
867
- };
868
-
869
862
  private onPublishProposerSlashing = async (proposerSlashing: phase0.ProposerSlashing): Promise<void> => {
870
863
  try {
871
864
  await this.publishProposerSlashing(proposerSlashing);
@@ -879,6 +872,10 @@ export class Network implements INetwork {
879
872
  };
880
873
 
881
874
  private onUpdateStatus = async (): Promise<void> => {
882
- 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
+ }
883
880
  };
884
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
  {
@@ -893,7 +918,7 @@ export class PeerManager {
893
918
  }
894
919
  }
895
920
 
896
- private async goodbyeAndDisconnect(peer: PeerId, goodbye: GoodByeReasonCode): Promise<void> {
921
+ async goodbyeAndDisconnect(peer: PeerId, goodbye: GoodByeReasonCode): Promise<void> {
897
922
  const reason = GOODBYE_KNOWN_CODES[goodbye.toString()] || "";
898
923
  const peerIdStr = peer.toString();
899
924
  try {