@lodestar/beacon-node 1.51.0-dev.c99cf49add → 1.51.0-dev.d2440f7e84

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 (484) hide show
  1. package/lib/api/impl/api.js +1 -1
  2. package/lib/api/impl/api.js.map +1 -1
  3. package/lib/api/impl/beacon/blocks/index.d.ts +2 -1
  4. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/blocks/index.js +29 -34
  6. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  7. package/lib/api/impl/beacon/index.d.ts +2 -1
  8. package/lib/api/impl/beacon/index.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/index.js +2 -2
  10. package/lib/api/impl/beacon/index.js.map +1 -1
  11. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  12. package/lib/api/impl/beacon/pool/index.js +5 -2
  13. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  14. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  15. package/lib/api/impl/beacon/state/index.js +8 -2
  16. package/lib/api/impl/beacon/state/index.js.map +1 -1
  17. package/lib/api/impl/beacon/state/utils.d.ts +3 -2
  18. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  19. package/lib/api/impl/beacon/state/utils.js +17 -9
  20. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  21. package/lib/api/impl/debug/index.d.ts.map +1 -1
  22. package/lib/api/impl/debug/index.js +3 -0
  23. package/lib/api/impl/debug/index.js.map +1 -1
  24. package/lib/api/impl/validator/index.d.ts +6 -0
  25. package/lib/api/impl/validator/index.d.ts.map +1 -1
  26. package/lib/api/impl/validator/index.js +143 -35
  27. package/lib/api/impl/validator/index.js.map +1 -1
  28. package/lib/api/options.d.ts +2 -0
  29. package/lib/api/options.d.ts.map +1 -1
  30. package/lib/api/options.js +1 -0
  31. package/lib/api/options.js.map +1 -1
  32. package/lib/chain/ColumnReconstructionTracker.d.ts +11 -11
  33. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  34. package/lib/chain/ColumnReconstructionTracker.js +46 -40
  35. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  36. package/lib/chain/GetBlobsTracker.d.ts +11 -0
  37. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  38. package/lib/chain/GetBlobsTracker.js +85 -27
  39. package/lib/chain/GetBlobsTracker.js.map +1 -1
  40. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  41. package/lib/chain/archiveStore/archiveStore.js +1 -0
  42. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  43. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +4 -0
  44. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  45. package/lib/chain/archiveStore/utils/archiveBlocks.js +61 -97
  46. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  47. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  48. package/lib/chain/blocks/importBlock.js +9 -7
  49. package/lib/chain/blocks/importBlock.js.map +1 -1
  50. package/lib/chain/blocks/importExecutionPayload.d.ts +6 -11
  51. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  52. package/lib/chain/blocks/importExecutionPayload.js +58 -17
  53. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  54. package/lib/chain/blocks/index.js +2 -2
  55. package/lib/chain/blocks/index.js.map +1 -1
  56. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
  57. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  58. package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
  59. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  60. package/lib/chain/blocks/types.d.ts +8 -1
  61. package/lib/chain/blocks/types.d.ts.map +1 -1
  62. package/lib/chain/blocks/types.js +5 -0
  63. package/lib/chain/blocks/types.js.map +1 -1
  64. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  65. package/lib/chain/blocks/verifyBlock.js +18 -7
  66. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  67. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  68. package/lib/chain/blocks/verifyBlocksDataAvailability.js +8 -1
  69. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  70. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  71. package/lib/chain/blocks/verifyBlocksSignatures.js +7 -5
  72. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  73. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
  74. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  75. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
  76. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  77. package/lib/chain/bls/interface.d.ts +2 -0
  78. package/lib/chain/bls/interface.d.ts.map +1 -1
  79. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  80. package/lib/chain/bls/multithread/index.js +13 -11
  81. package/lib/chain/bls/multithread/index.js.map +1 -1
  82. package/lib/chain/bls/multithread/types.d.ts +1 -1
  83. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  84. package/lib/chain/bls/multithread/worker.js +1 -1
  85. package/lib/chain/bls/multithread/worker.js.map +1 -1
  86. package/lib/chain/bls/singleThread.js +1 -1
  87. package/lib/chain/bls/singleThread.js.map +1 -1
  88. package/lib/chain/bls/utils.js +1 -1
  89. package/lib/chain/bls/utils.js.map +1 -1
  90. package/lib/chain/chain.d.ts +3 -2
  91. package/lib/chain/chain.d.ts.map +1 -1
  92. package/lib/chain/chain.js +9 -5
  93. package/lib/chain/chain.js.map +1 -1
  94. package/lib/chain/errors/blockError.d.ts +1 -1
  95. package/lib/chain/errors/blockError.d.ts.map +1 -1
  96. package/lib/chain/errors/blockError.js +1 -1
  97. package/lib/chain/errors/blockError.js.map +1 -1
  98. package/lib/chain/errors/executionPayloadBid.d.ts +11 -1
  99. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  100. package/lib/chain/errors/executionPayloadBid.js +2 -0
  101. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  102. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  103. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  104. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  105. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  106. package/lib/chain/errors/inclusionList.d.ts +60 -0
  107. package/lib/chain/errors/inclusionList.d.ts.map +1 -0
  108. package/lib/chain/errors/inclusionList.js +19 -0
  109. package/lib/chain/errors/inclusionList.js.map +1 -0
  110. package/lib/chain/errors/index.d.ts +1 -0
  111. package/lib/chain/errors/index.d.ts.map +1 -1
  112. package/lib/chain/errors/index.js +1 -0
  113. package/lib/chain/errors/index.js.map +1 -1
  114. package/lib/chain/interface.d.ts +4 -4
  115. package/lib/chain/interface.d.ts.map +1 -1
  116. package/lib/chain/interface.js.map +1 -1
  117. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  118. package/lib/chain/opPools/aggregatedAttestationPool.js +23 -10
  119. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  120. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  121. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  122. package/lib/chain/opPools/attestationPool.js +15 -4
  123. package/lib/chain/opPools/attestationPool.js.map +1 -1
  124. package/lib/chain/opPools/inclusionListStore.d.ts +63 -0
  125. package/lib/chain/opPools/inclusionListStore.d.ts.map +1 -0
  126. package/lib/chain/opPools/inclusionListStore.js +171 -0
  127. package/lib/chain/opPools/inclusionListStore.js.map +1 -0
  128. package/lib/chain/opPools/index.d.ts +1 -0
  129. package/lib/chain/opPools/index.d.ts.map +1 -1
  130. package/lib/chain/opPools/index.js +1 -0
  131. package/lib/chain/opPools/index.js.map +1 -1
  132. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  133. package/lib/chain/opPools/payloadAttestationPool.js +17 -7
  134. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  135. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  136. package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
  137. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  138. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  139. package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
  140. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  141. package/lib/chain/opPools/utils.d.ts +1 -1
  142. package/lib/chain/opPools/utils.d.ts.map +1 -1
  143. package/lib/chain/opPools/utils.js +1 -1
  144. package/lib/chain/opPools/utils.js.map +1 -1
  145. package/lib/chain/options.d.ts +0 -1
  146. package/lib/chain/options.d.ts.map +1 -1
  147. package/lib/chain/options.js +0 -1
  148. package/lib/chain/options.js.map +1 -1
  149. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -1
  150. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  151. package/lib/chain/produceBlock/produceBlockBody.js +30 -10
  152. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  153. package/lib/chain/regen/interface.d.ts +1 -1
  154. package/lib/chain/regen/interface.d.ts.map +1 -1
  155. package/lib/chain/regen/interface.js +1 -1
  156. package/lib/chain/regen/interface.js.map +1 -1
  157. package/lib/chain/validation/executionPayloadBid.d.ts +0 -15
  158. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  159. package/lib/chain/validation/executionPayloadBid.js +37 -158
  160. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  161. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  162. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  163. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  164. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  165. package/lib/chain/validation/inclusionList.d.ts +14 -0
  166. package/lib/chain/validation/inclusionList.d.ts.map +1 -0
  167. package/lib/chain/validation/inclusionList.js +150 -0
  168. package/lib/chain/validation/inclusionList.js.map +1 -0
  169. package/lib/chain/validation/index.d.ts +1 -0
  170. package/lib/chain/validation/index.d.ts.map +1 -1
  171. package/lib/chain/validation/index.js +1 -0
  172. package/lib/chain/validation/index.js.map +1 -1
  173. package/lib/db/beacon.d.ts +7 -0
  174. package/lib/db/beacon.d.ts.map +1 -1
  175. package/lib/db/beacon.js +34 -0
  176. package/lib/db/beacon.js.map +1 -1
  177. package/lib/db/dataColumnStore.d.ts +1 -1
  178. package/lib/db/dataColumnStore.d.ts.map +1 -1
  179. package/lib/db/dataColumnStore.js +1 -4
  180. package/lib/db/dataColumnStore.js.map +1 -1
  181. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  182. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  183. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  184. package/lib/db/flatFileStore/slotIndex.js +2 -2
  185. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  186. package/lib/db/interface.d.ts +1 -0
  187. package/lib/db/interface.d.ts.map +1 -1
  188. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +6 -0
  189. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  190. package/lib/db/repositories/dataColumnSidecarArchive.js +19 -0
  191. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  192. package/lib/execution/builder/apiClient.d.ts +14 -8
  193. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  194. package/lib/execution/builder/apiClient.js +12 -10
  195. package/lib/execution/builder/apiClient.js.map +1 -1
  196. package/lib/execution/builder/http.d.ts +2 -0
  197. package/lib/execution/builder/http.d.ts.map +1 -1
  198. package/lib/execution/builder/http.js +2 -0
  199. package/lib/execution/builder/http.js.map +1 -1
  200. package/lib/execution/builder/validateBid.d.ts.map +1 -1
  201. package/lib/execution/builder/validateBid.js +14 -1
  202. package/lib/execution/builder/validateBid.js.map +1 -1
  203. package/lib/execution/engine/blobVersionedHashes.d.ts +1 -1
  204. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -1
  205. package/lib/execution/engine/blobVersionedHashes.js.map +1 -1
  206. package/lib/execution/engine/disabled.d.ts +1 -0
  207. package/lib/execution/engine/disabled.d.ts.map +1 -1
  208. package/lib/execution/engine/disabled.js +3 -0
  209. package/lib/execution/engine/disabled.js.map +1 -1
  210. package/lib/execution/engine/http.d.ts +8 -2
  211. package/lib/execution/engine/http.d.ts.map +1 -1
  212. package/lib/execution/engine/http.js +27 -4
  213. package/lib/execution/engine/http.js.map +1 -1
  214. package/lib/execution/engine/index.d.ts +1 -1
  215. package/lib/execution/engine/index.d.ts.map +1 -1
  216. package/lib/execution/engine/index.js +1 -1
  217. package/lib/execution/engine/index.js.map +1 -1
  218. package/lib/execution/engine/interface.d.ts +12 -3
  219. package/lib/execution/engine/interface.d.ts.map +1 -1
  220. package/lib/execution/engine/interface.js.map +1 -1
  221. package/lib/execution/engine/jsonRpcTransport.d.ts +3 -2
  222. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  223. package/lib/execution/engine/jsonRpcTransport.js +33 -9
  224. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  225. package/lib/execution/engine/mock.d.ts +1 -0
  226. package/lib/execution/engine/mock.d.ts.map +1 -1
  227. package/lib/execution/engine/mock.js +31 -7
  228. package/lib/execution/engine/mock.js.map +1 -1
  229. package/lib/execution/engine/payloadIdCache.d.ts +5 -3
  230. package/lib/execution/engine/payloadIdCache.d.ts.map +1 -1
  231. package/lib/execution/engine/payloadIdCache.js +15 -4
  232. package/lib/execution/engine/payloadIdCache.js.map +1 -1
  233. package/lib/execution/engine/restTransport.d.ts +2 -1
  234. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  235. package/lib/execution/engine/restTransport.js +3 -0
  236. package/lib/execution/engine/restTransport.js.map +1 -1
  237. package/lib/execution/engine/sszTypes.d.ts +38 -38
  238. package/lib/execution/engine/transport.d.ts +5 -2
  239. package/lib/execution/engine/transport.d.ts.map +1 -1
  240. package/lib/execution/engine/types.d.ts +25 -1
  241. package/lib/execution/engine/types.d.ts.map +1 -1
  242. package/lib/execution/engine/types.js +19 -6
  243. package/lib/execution/engine/types.js.map +1 -1
  244. package/lib/execution/engine/utils.d.ts.map +1 -1
  245. package/lib/execution/engine/utils.js +3 -2
  246. package/lib/execution/engine/utils.js.map +1 -1
  247. package/lib/index.d.ts +1 -0
  248. package/lib/index.d.ts.map +1 -1
  249. package/lib/index.js +2 -0
  250. package/lib/index.js.map +1 -1
  251. package/lib/metrics/metrics/beacon.d.ts +16 -0
  252. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  253. package/lib/metrics/metrics/beacon.js +35 -0
  254. package/lib/metrics/metrics/beacon.js.map +1 -1
  255. package/lib/metrics/metrics/lodestar.d.ts +23 -0
  256. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  257. package/lib/metrics/metrics/lodestar.js +59 -0
  258. package/lib/metrics/metrics/lodestar.js.map +1 -1
  259. package/lib/metrics/server/http.js +5 -5
  260. package/lib/metrics/server/http.js.map +1 -1
  261. package/lib/monitoring/service.js +1 -1
  262. package/lib/monitoring/service.js.map +1 -1
  263. package/lib/network/core/networkCore.d.ts +2 -0
  264. package/lib/network/core/networkCore.d.ts.map +1 -1
  265. package/lib/network/core/networkCore.js +3 -0
  266. package/lib/network/core/networkCore.js.map +1 -1
  267. package/lib/network/core/networkCoreWorker.js +1 -0
  268. package/lib/network/core/networkCoreWorker.js.map +1 -1
  269. package/lib/network/core/networkCoreWorkerHandler.d.ts +2 -0
  270. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  271. package/lib/network/core/networkCoreWorkerHandler.js +3 -0
  272. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  273. package/lib/network/core/types.d.ts +2 -0
  274. package/lib/network/core/types.d.ts.map +1 -1
  275. package/lib/network/gossip/gossipsub.d.ts +1 -0
  276. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  277. package/lib/network/gossip/gossipsub.js +10 -0
  278. package/lib/network/gossip/gossipsub.js.map +1 -1
  279. package/lib/network/gossip/interface.d.ts +8 -2
  280. package/lib/network/gossip/interface.d.ts.map +1 -1
  281. package/lib/network/gossip/interface.js +1 -0
  282. package/lib/network/gossip/interface.js.map +1 -1
  283. package/lib/network/gossip/topic.d.ts +13 -5
  284. package/lib/network/gossip/topic.d.ts.map +1 -1
  285. package/lib/network/gossip/topic.js +13 -1
  286. package/lib/network/gossip/topic.js.map +1 -1
  287. package/lib/network/interface.d.ts +4 -1
  288. package/lib/network/interface.d.ts.map +1 -1
  289. package/lib/network/libp2p/index.d.ts.map +1 -1
  290. package/lib/network/libp2p/index.js +5 -1
  291. package/lib/network/libp2p/index.js.map +1 -1
  292. package/lib/network/network.d.ts +4 -1
  293. package/lib/network/network.d.ts.map +1 -1
  294. package/lib/network/network.js +11 -1
  295. package/lib/network/network.js.map +1 -1
  296. package/lib/network/options.d.ts +2 -0
  297. package/lib/network/options.d.ts.map +1 -1
  298. package/lib/network/options.js.map +1 -1
  299. package/lib/network/peers/peerManager.d.ts +2 -1
  300. package/lib/network/peers/peerManager.d.ts.map +1 -1
  301. package/lib/network/peers/peerManager.js +30 -1
  302. package/lib/network/peers/peerManager.js.map +1 -1
  303. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  304. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  305. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  306. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  307. package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -1
  308. package/lib/network/peers/utils/enrSubnetsDeserialize.js +5 -2
  309. package/lib/network/peers/utils/enrSubnetsDeserialize.js.map +1 -1
  310. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  311. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  312. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  313. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  314. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  315. package/lib/network/processor/gossipHandlers.js +97 -38
  316. package/lib/network/processor/gossipHandlers.js.map +1 -1
  317. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  318. package/lib/network/processor/gossipQueues/index.js +6 -0
  319. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  320. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  321. package/lib/network/processor/gossipValidatorFn.js +5 -1
  322. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  323. package/lib/network/processor/index.d.ts +5 -0
  324. package/lib/network/processor/index.d.ts.map +1 -1
  325. package/lib/network/processor/index.js +37 -26
  326. package/lib/network/processor/index.js.map +1 -1
  327. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  328. package/lib/network/reqresp/ReqRespBeaconNode.js +6 -0
  329. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  330. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts +10 -0
  331. package/lib/network/reqresp/handlers/inclusionListsByIndices.d.ts.map +1 -0
  332. package/lib/network/reqresp/handlers/inclusionListsByIndices.js +30 -0
  333. package/lib/network/reqresp/handlers/inclusionListsByIndices.js.map +1 -0
  334. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  335. package/lib/network/reqresp/handlers/index.js +5 -0
  336. package/lib/network/reqresp/handlers/index.js.map +1 -1
  337. package/lib/network/reqresp/protocols.d.ts +1 -0
  338. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  339. package/lib/network/reqresp/protocols.js +5 -0
  340. package/lib/network/reqresp/protocols.js.map +1 -1
  341. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  342. package/lib/network/reqresp/rateLimit.js +4 -0
  343. package/lib/network/reqresp/rateLimit.js.map +1 -1
  344. package/lib/network/reqresp/types.d.ts +5 -2
  345. package/lib/network/reqresp/types.d.ts.map +1 -1
  346. package/lib/network/reqresp/types.js +3 -0
  347. package/lib/network/reqresp/types.js.map +1 -1
  348. package/lib/node/nodejs.d.ts +3 -1
  349. package/lib/node/nodejs.d.ts.map +1 -1
  350. package/lib/node/nodejs.js +47 -21
  351. package/lib/node/nodejs.js.map +1 -1
  352. package/lib/node/options.d.ts +3 -1
  353. package/lib/node/options.d.ts.map +1 -1
  354. package/lib/node/options.js +4 -2
  355. package/lib/node/options.js.map +1 -1
  356. package/lib/sync/interface.d.ts.map +1 -1
  357. package/lib/sync/interface.js.map +1 -1
  358. package/lib/sync/sync.d.ts +7 -0
  359. package/lib/sync/sync.d.ts.map +1 -1
  360. package/lib/sync/sync.js +61 -3
  361. package/lib/sync/sync.js.map +1 -1
  362. package/lib/sync/unknownBlock.d.ts.map +1 -1
  363. package/lib/sync/unknownBlock.js +42 -18
  364. package/lib/sync/unknownBlock.js.map +1 -1
  365. package/lib/util/file.d.ts.map +1 -1
  366. package/lib/util/file.js +8 -9
  367. package/lib/util/file.js.map +1 -1
  368. package/lib/util/queue/itemQueue.js +1 -1
  369. package/lib/util/queue/itemQueue.js.map +1 -1
  370. package/lib/util/sszBytes.d.ts +5 -0
  371. package/lib/util/sszBytes.d.ts.map +1 -1
  372. package/lib/util/sszBytes.js +35 -2
  373. package/lib/util/sszBytes.js.map +1 -1
  374. package/package.json +31 -32
  375. package/src/api/impl/api.ts +1 -1
  376. package/src/api/impl/beacon/blocks/index.ts +57 -62
  377. package/src/api/impl/beacon/index.ts +3 -1
  378. package/src/api/impl/beacon/pool/index.ts +5 -1
  379. package/src/api/impl/beacon/state/index.ts +10 -1
  380. package/src/api/impl/beacon/state/utils.ts +20 -10
  381. package/src/api/impl/debug/index.ts +4 -0
  382. package/src/api/impl/validator/index.ts +178 -39
  383. package/src/api/options.ts +3 -0
  384. package/src/chain/ColumnReconstructionTracker.ts +60 -41
  385. package/src/chain/GetBlobsTracker.ts +97 -38
  386. package/src/chain/archiveStore/archiveStore.ts +1 -0
  387. package/src/chain/archiveStore/utils/archiveBlocks.ts +76 -130
  388. package/src/chain/blocks/importBlock.ts +11 -14
  389. package/src/chain/blocks/importExecutionPayload.ts +81 -23
  390. package/src/chain/blocks/index.ts +6 -2
  391. package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
  392. package/src/chain/blocks/types.ts +9 -1
  393. package/src/chain/blocks/verifyBlock.ts +31 -16
  394. package/src/chain/blocks/verifyBlocksDataAvailability.ts +10 -1
  395. package/src/chain/blocks/verifyBlocksSignatures.ts +7 -5
  396. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
  397. package/src/chain/bls/interface.ts +2 -0
  398. package/src/chain/bls/multithread/index.ts +14 -10
  399. package/src/chain/bls/multithread/types.ts +1 -1
  400. package/src/chain/bls/multithread/worker.ts +1 -5
  401. package/src/chain/bls/singleThread.ts +1 -1
  402. package/src/chain/bls/utils.ts +1 -1
  403. package/src/chain/chain.ts +10 -5
  404. package/src/chain/errors/blockError.ts +1 -1
  405. package/src/chain/errors/executionPayloadBid.ts +12 -0
  406. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  407. package/src/chain/errors/inclusionList.ts +38 -0
  408. package/src/chain/errors/index.ts +1 -0
  409. package/src/chain/interface.ts +4 -3
  410. package/src/chain/opPools/aggregatedAttestationPool.ts +25 -9
  411. package/src/chain/opPools/attestationPool.ts +16 -4
  412. package/src/chain/opPools/inclusionListStore.ts +208 -0
  413. package/src/chain/opPools/index.ts +1 -0
  414. package/src/chain/opPools/payloadAttestationPool.ts +18 -7
  415. package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
  416. package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
  417. package/src/chain/opPools/utils.ts +1 -1
  418. package/src/chain/options.ts +0 -2
  419. package/src/chain/produceBlock/produceBlockBody.ts +60 -19
  420. package/src/chain/regen/interface.ts +1 -1
  421. package/src/chain/validation/executionPayloadBid.ts +54 -183
  422. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  423. package/src/chain/validation/inclusionList.ts +192 -0
  424. package/src/chain/validation/index.ts +1 -0
  425. package/src/db/beacon.ts +44 -0
  426. package/src/db/dataColumnStore.ts +2 -4
  427. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  428. package/src/db/flatFileStore/slotIndex.ts +4 -3
  429. package/src/db/interface.ts +2 -0
  430. package/src/db/repositories/dataColumnSidecarArchive.ts +20 -0
  431. package/src/execution/builder/apiClient.ts +16 -13
  432. package/src/execution/builder/http.ts +4 -0
  433. package/src/execution/builder/validateBid.ts +23 -2
  434. package/src/execution/engine/blobVersionedHashes.ts +1 -1
  435. package/src/execution/engine/disabled.ts +4 -0
  436. package/src/execution/engine/http.ts +40 -5
  437. package/src/execution/engine/index.ts +1 -1
  438. package/src/execution/engine/interface.ts +28 -4
  439. package/src/execution/engine/jsonRpcTransport.ts +46 -9
  440. package/src/execution/engine/mock.ts +32 -7
  441. package/src/execution/engine/payloadIdCache.ts +24 -6
  442. package/src/execution/engine/restTransport.ts +15 -1
  443. package/src/execution/engine/transport.ts +7 -2
  444. package/src/execution/engine/types.ts +44 -7
  445. package/src/execution/engine/utils.ts +4 -2
  446. package/src/index.ts +2 -0
  447. package/src/metrics/metrics/beacon.ts +37 -0
  448. package/src/metrics/metrics/lodestar.ts +61 -0
  449. package/src/metrics/server/http.ts +5 -5
  450. package/src/monitoring/service.ts +1 -1
  451. package/src/network/core/networkCore.ts +5 -0
  452. package/src/network/core/networkCoreWorker.ts +1 -0
  453. package/src/network/core/networkCoreWorkerHandler.ts +4 -0
  454. package/src/network/core/types.ts +2 -0
  455. package/src/network/gossip/gossipsub.ts +11 -0
  456. package/src/network/gossip/interface.ts +5 -0
  457. package/src/network/gossip/topic.ts +14 -0
  458. package/src/network/interface.ts +4 -0
  459. package/src/network/libp2p/index.ts +5 -1
  460. package/src/network/network.ts +19 -1
  461. package/src/network/options.ts +2 -0
  462. package/src/network/peers/peerManager.ts +30 -3
  463. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  464. package/src/network/peers/utils/enrSubnetsDeserialize.ts +5 -2
  465. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  466. package/src/network/processor/gossipHandlers.ts +121 -41
  467. package/src/network/processor/gossipQueues/index.ts +6 -0
  468. package/src/network/processor/gossipValidatorFn.ts +5 -0
  469. package/src/network/processor/index.ts +33 -24
  470. package/src/network/processor/types.ts +1 -1
  471. package/src/network/reqresp/ReqRespBeaconNode.ts +7 -0
  472. package/src/network/reqresp/handlers/inclusionListsByIndices.ts +44 -0
  473. package/src/network/reqresp/handlers/index.ts +5 -0
  474. package/src/network/reqresp/protocols.ts +6 -0
  475. package/src/network/reqresp/rateLimit.ts +4 -0
  476. package/src/network/reqresp/types.ts +6 -0
  477. package/src/node/nodejs.ts +58 -22
  478. package/src/node/options.ts +9 -6
  479. package/src/sync/interface.ts +1 -0
  480. package/src/sync/sync.ts +65 -4
  481. package/src/sync/unknownBlock.ts +47 -28
  482. package/src/util/file.ts +8 -9
  483. package/src/util/queue/itemQueue.ts +1 -1
  484. package/src/util/sszBytes.ts +42 -2
@@ -11,6 +11,7 @@ import type {LoggerNode} from "@lodestar/logger/node";
11
11
  import {ResponseIncoming, ResponseOutgoing} from "@lodestar/reqresp";
12
12
  import {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
  }
@@ -5,6 +5,7 @@ import {SpecJson} from "@lodestar/config";
5
5
  import {LoggerNodeOpts} from "@lodestar/logger/node";
6
6
  import {ResponseIncoming} from "@lodestar/reqresp";
7
7
  import {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[]>;
@@ -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
  }
@@ -16,6 +16,7 @@ import {
16
16
  capella,
17
17
  deneb,
18
18
  gloas,
19
+ heze,
19
20
  phase0,
20
21
  } from "@lodestar/types";
21
22
  import {Logger} from "@lodestar/utils";
@@ -42,6 +43,7 @@ export enum GossipType {
42
43
  payload_attestation_message = "payload_attestation_message",
43
44
  execution_payload_bid = "execution_payload_bid",
44
45
  proposer_preferences = "proposer_preferences",
46
+ inclusion_list = "inclusion_list",
45
47
  }
46
48
 
47
49
  export type SequentialGossipType = Exclude<GossipType, GossipType.beacon_attestation>;
@@ -80,6 +82,7 @@ export type GossipTopicTypeMap = {
80
82
  [GossipType.payload_attestation_message]: {type: GossipType.payload_attestation_message};
81
83
  [GossipType.execution_payload_bid]: {type: GossipType.execution_payload_bid};
82
84
  [GossipType.proposer_preferences]: {type: GossipType.proposer_preferences};
85
+ [GossipType.inclusion_list]: {type: GossipType.inclusion_list};
83
86
  };
84
87
 
85
88
  export type GossipTopicMap = {
@@ -113,6 +116,7 @@ export type GossipTypeMap = {
113
116
  [GossipType.payload_attestation_message]: gloas.PayloadAttestationMessage;
114
117
  [GossipType.execution_payload_bid]: gloas.SignedExecutionPayloadBid;
115
118
  [GossipType.proposer_preferences]: gloas.SignedProposerPreferences;
119
+ [GossipType.inclusion_list]: heze.SignedInclusionList;
116
120
  };
117
121
 
118
122
  export type GossipFnByType = {
@@ -147,6 +151,7 @@ export type GossipFnByType = {
147
151
  [GossipType.proposer_preferences]: (
148
152
  signedProposerPreferences: gloas.SignedProposerPreferences
149
153
  ) => Promise<void> | void;
154
+ [GossipType.inclusion_list]: (signedInclusionList: heze.SignedInclusionList) => Promise<void> | void;
150
155
  };
151
156
 
152
157
  export type GossipFn = GossipFnByType[keyof GossipFnByType];
@@ -4,6 +4,7 @@ import {
4
4
  ATTESTATION_SUBNET_COUNT,
5
5
  ForkName,
6
6
  ForkSeq,
7
+ MAX_SIGNED_INCLUSION_LIST_SIZE,
7
8
  SYNC_COMMITTEE_SUBNET_COUNT,
8
9
  isForkPostAltair,
9
10
  isForkPostElectra,
@@ -91,6 +92,7 @@ function stringifyGossipTopicType(topic: GossipTopic): string {
91
92
  case GossipType.payload_attestation_message:
92
93
  case GossipType.execution_payload_bid:
93
94
  case GossipType.proposer_preferences:
95
+ case GossipType.inclusion_list:
94
96
  return topic.type;
95
97
  case GossipType.beacon_attestation:
96
98
  case GossipType.sync_committee:
@@ -144,6 +146,8 @@ export function getGossipSSZType(topic: GossipTopic) {
144
146
  return isForkPostGloas(fork) ? sszTypesFor(fork).SignedExecutionPayloadBid : ssz.gloas.SignedExecutionPayloadBid;
145
147
  case GossipType.proposer_preferences:
146
148
  return ssz.gloas.SignedProposerPreferences;
149
+ case GossipType.inclusion_list:
150
+ return ssz.heze.SignedInclusionList;
147
151
  }
148
152
  }
149
153
 
@@ -152,6 +156,9 @@ export function getGossipSSZType(topic: GossipTopic) {
152
156
  */
153
157
  export function getGossipSSZMaxSize(topic: GossipTopic, config: ChainForkConfig, sszType: CompositeTypeAny): number {
154
158
  const maxSize = Math.min(sszType.maxSize, config.MAX_PAYLOAD_SIZE);
159
+ if (topic.type === GossipType.inclusion_list) {
160
+ return Math.min(maxSize, MAX_SIGNED_INCLUSION_LIST_SIZE);
161
+ }
155
162
  if (isForkPostGloas(topic.boundary.fork) && topic.type === GossipType.data_column_sidecar) {
156
163
  return Math.min(maxSize, computeMaxGloasDataColumnSidecarSize(config));
157
164
  }
@@ -235,6 +242,7 @@ export function parseGossipTopic(forkDigestContext: ForkDigestContext, topicStr:
235
242
  case GossipType.payload_attestation_message:
236
243
  case GossipType.execution_payload_bid:
237
244
  case GossipType.proposer_preferences:
245
+ case GossipType.inclusion_list:
238
246
  return {type: gossipTypeStr, boundary, encoding};
239
247
  }
240
248
 
@@ -292,6 +300,10 @@ export function getCoreTopicsAtFork(
292
300
  topics.push({type: GossipType.proposer_preferences});
293
301
  }
294
302
 
303
+ if (ForkSeq[fork] >= ForkSeq.heze) {
304
+ topics.push({type: GossipType.inclusion_list});
305
+ }
306
+
295
307
  // After fulu also track data_column_sidecar_{index}
296
308
  if (ForkSeq[fork] >= ForkSeq.fulu) {
297
309
  topics.push(...getDataColumnSidecarTopics(networkConfig, opts.subscribeAllColumnSubnets));
@@ -409,6 +421,7 @@ export const gossipTopicIgnoreDuplicatePublishError: Record<GossipType, boolean>
409
421
  [GossipType.payload_attestation_message]: true,
410
422
  [GossipType.execution_payload_bid]: true,
411
423
  [GossipType.proposer_preferences]: true,
424
+ [GossipType.inclusion_list]: true,
412
425
  };
413
426
 
414
427
  /**
@@ -447,4 +460,5 @@ export const gossipTopicAllowPublishToZeroPeers: Record<GossipType, boolean> = {
447
460
  [GossipType.payload_attestation_message]: false,
448
461
  [GossipType.execution_payload_bid]: false,
449
462
  [GossipType.proposer_preferences]: false,
463
+ [GossipType.inclusion_list]: false,
450
464
  };
@@ -33,9 +33,11 @@ import {
33
33
  deneb,
34
34
  fulu,
35
35
  gloas,
36
+ heze,
36
37
  phase0,
37
38
  } from "@lodestar/types";
38
39
  import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
40
+ import {GoodByeReasonCode} from "../constants/index.js";
39
41
  import {CustodyConfig} from "../util/dataColumns.js";
40
42
  import {PeerIdStr} from "../util/peerId.js";
41
43
  import {
@@ -73,6 +75,7 @@ export interface INetwork extends INetworkCorePublic {
73
75
  reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
74
76
  shouldAggregate(subnet: SubnetID, slot: Slot): boolean;
75
77
  reStatusPeers(peers: PeerIdStr[]): Promise<void>;
78
+ goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void>;
76
79
  searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
77
80
  searchUnknownEnvelope(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
78
81
  // ReqResp
@@ -118,6 +121,7 @@ export interface INetwork extends INetworkCorePublic {
118
121
  publishSignedExecutionPayloadBid(signedBid: gloas.SignedExecutionPayloadBid): Promise<number>;
119
122
  publishPayloadAttestationMessage(payloadAttestationMessage: gloas.PayloadAttestationMessage): Promise<number>;
120
123
  publishProposerPreferences(signedProposerPreferences: gloas.SignedProposerPreferences): Promise<number>;
124
+ publishInclusionList(signedInclusionList: heze.SignedInclusionList): Promise<number>;
121
125
 
122
126
  // Debug
123
127
  dumpGossipQueue(gossipType: GossipType): Promise<PendingGossipsubMessage[]>;
@@ -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,
@@ -26,6 +26,7 @@ import {
26
26
  deneb,
27
27
  fulu,
28
28
  gloas,
29
+ heze,
29
30
  isGloasDataColumnSidecar,
30
31
  phase0,
31
32
  } from "@lodestar/types";
@@ -33,6 +34,7 @@ import {prettyPrintIndices, sleep} from "@lodestar/utils";
33
34
  import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
34
35
  import {ChainEvent, IBeaconChain} from "../chain/index.js";
35
36
  import {computeSubnetForDataColumnSidecar} from "../chain/validation/dataColumnSidecar.js";
37
+ import {GoodByeReasonCode} from "../constants/index.js";
36
38
  import {IBeaconDb} from "../db/interface.js";
37
39
  import {Metrics, RegistryMetricCreator} from "../metrics/index.js";
38
40
  import {IClock} from "../util/clock.js";
@@ -288,6 +290,10 @@ export class Network implements INetwork {
288
290
  return this.core.reStatusPeers(peers);
289
291
  }
290
292
 
293
+ async goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void> {
294
+ return this.core.goodbyeAndDisconnect(peer, reason);
295
+ }
296
+
291
297
  searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
292
298
  this.networkProcessor.searchUnknownBlock(slotRoot, source, peer);
293
299
  }
@@ -531,6 +537,16 @@ export class Network implements INetwork {
531
537
  );
532
538
  }
533
539
 
540
+ async publishInclusionList(signedInclusionList: heze.SignedInclusionList): Promise<number> {
541
+ const epoch = computeEpochAtSlot(signedInclusionList.message.slot);
542
+ const boundary = this.config.getForkBoundaryAtEpoch(epoch);
543
+
544
+ return this.publishGossip<GossipType.inclusion_list>(
545
+ {type: GossipType.inclusion_list, boundary},
546
+ signedInclusionList
547
+ );
548
+ }
549
+
534
550
  async publishProposerPreferences(signedProposerPreferences: gloas.SignedProposerPreferences): Promise<number> {
535
551
  const epoch = computeEpochAtSlot(signedProposerPreferences.message.proposalSlot);
536
552
  const boundary = this.config.getForkBoundaryAtEpoch(epoch);
@@ -844,7 +860,9 @@ export class Network implements INetwork {
844
860
  };
845
861
 
846
862
  private onTargetGroupCountUpdated = (count: number): void => {
847
- this.core.setTargetGroupCount(count);
863
+ this.core.setTargetGroupCount(count).catch((e) => {
864
+ this.logger.debug("Error setting target custody group count", {count}, e as Error);
865
+ });
848
866
  };
849
867
 
850
868
  private onPublishDataColumns = async (sidecars: DataColumnSidecar[]): Promise<void> => {
@@ -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;
@@ -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,32 @@ 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
601
+ .getActiveSubnets()
602
+ .map((request) => {
603
+ const subscribers = this.gossipsub.getSubscribersWithOutboundStream({
604
+ type: GossipType.beacon_attestation,
605
+ boundary,
606
+ subnet: request.subnet,
607
+ });
608
+ let peerCount = 0;
609
+ for (const peer of subscribers) {
610
+ if (connectedHealthyPeerIds.has(peer)) peerCount++;
611
+ }
612
+ return {...request, peerCount};
613
+ }),
614
+ this.syncnetsService.getActiveSubnets().map((request) => {
615
+ const subscribers = this.gossipsub.getSubscribersWithOutboundStream({
616
+ type: GossipType.sync_committee,
617
+ boundary,
618
+ subnet: request.subnet,
619
+ });
620
+ let peerCount = 0;
621
+ for (const peer of subscribers) {
622
+ if (connectedHealthyPeerIds.has(peer)) peerCount++;
623
+ }
624
+ return {...request, peerCount};
625
+ }),
599
626
  // ignore samplingGroups for pre-fulu forks
600
627
  forkSeq >= ForkSeq.fulu ? this.networkConfig.custodyConfig.sampleGroups : undefined,
601
628
  {
@@ -893,7 +920,7 @@ export class PeerManager {
893
920
  }
894
921
  }
895
922
 
896
- private async goodbyeAndDisconnect(peer: PeerId, goodbye: GoodByeReasonCode): Promise<void> {
923
+ async goodbyeAndDisconnect(peer: PeerId, goodbye: GoodByeReasonCode): Promise<void> {
897
924
  const reason = GOODBYE_KNOWN_CODES[goodbye.toString()] || "";
898
925
  const peerIdStr = peer.toString();
899
926
  try {
@@ -1,5 +1,6 @@
1
- import {ForkName, isForkPostFulu} from "@lodestar/params";
2
- import {ForkDigest, Root, Slot, Status, fulu, ssz} from "@lodestar/types";
1
+ import {ForkName, GENESIS_EPOCH, isForkPostFulu} from "@lodestar/params";
2
+ import {computeEpochAtSlot} from "@lodestar/state-transition";
3
+ import {Epoch, ForkDigest, Root, Slot, Status, fulu, ssz} from "@lodestar/types";
3
4
  import {toHex, toRootHex} from "@lodestar/utils";
4
5
 
5
6
  // TODO: Why this value? (From Lighthouse)
@@ -9,6 +10,8 @@ export enum IrrelevantPeerCode {
9
10
  INCOMPATIBLE_FORKS = "IRRELEVANT_PEER_INCOMPATIBLE_FORKS",
10
11
  DIFFERENT_CLOCKS = "IRRELEVANT_PEER_DIFFERENT_CLOCKS",
11
12
  DIFFERENT_FINALIZED = "IRRELEVANT_PEER_DIFFERENT_FINALIZED",
13
+ FINALIZED_EPOCH_TOO_HIGH = "IRRELEVANT_PEER_FINALIZED_EPOCH_TOO_HIGH",
14
+ INVALID_FINALIZED_ROOT = "IRRELEVANT_PEER_INVALID_FINALIZED_ROOT",
12
15
  NO_EARLIEST_AVAILABLE_SLOT = "NO_EARLIEST_AVAILABLE_SLOT",
13
16
  }
14
17
 
@@ -16,6 +19,8 @@ type IrrelevantPeerType =
16
19
  | {code: IrrelevantPeerCode.INCOMPATIBLE_FORKS; ours: ForkDigest; theirs: ForkDigest}
17
20
  | {code: IrrelevantPeerCode.DIFFERENT_CLOCKS; slotDiff: number}
18
21
  | {code: IrrelevantPeerCode.NO_EARLIEST_AVAILABLE_SLOT}
22
+ | {code: IrrelevantPeerCode.FINALIZED_EPOCH_TOO_HIGH; finalizedEpoch: Epoch; maxFinalizedEpoch: Epoch}
23
+ | {code: IrrelevantPeerCode.INVALID_FINALIZED_ROOT}
19
24
  | {code: IrrelevantPeerCode.DIFFERENT_FINALIZED; expectedRoot: Root; remoteRoot: Root};
20
25
 
21
26
  /**
@@ -45,29 +50,35 @@ export function assertPeerRelevance(
45
50
  return {code: IrrelevantPeerCode.DIFFERENT_CLOCKS, slotDiff};
46
51
  }
47
52
 
48
- // The remote's finalized epoch is less than or equal to ours, but the block root is
49
- // different to the one in our chain. Therefore, the node is on a different chain and we
50
- // should not communicate with them.
53
+ // A checkpoint can be finalized at the earliest at the start of epoch + 2
54
+ const maxFinalizedEpoch = Math.max(
55
+ GENESIS_EPOCH,
56
+ computeEpochAtSlot(Math.max(currentSlot, 0) + FUTURE_SLOT_TOLERANCE) - 2
57
+ );
58
+ if (remote.finalizedEpoch > maxFinalizedEpoch) {
59
+ return {
60
+ code: IrrelevantPeerCode.FINALIZED_EPOCH_TOO_HIGH,
61
+ finalizedEpoch: remote.finalizedEpoch,
62
+ maxFinalizedEpoch,
63
+ };
64
+ }
65
+
66
+ if (remote.finalizedEpoch > GENESIS_EPOCH && isZeroRoot(remote.finalizedRoot)) {
67
+ return {code: IrrelevantPeerCode.INVALID_FINALIZED_ROOT};
68
+ }
51
69
 
70
+ // The remote's finalized epoch is equal to ours, but the block root is different to the one in our chain.
71
+ // Therefore, the node is on a different chain and we should not communicate with them.
52
72
  if (
53
- remote.finalizedEpoch <= local.finalizedEpoch &&
54
- !isZeroRoot(remote.finalizedRoot) &&
55
- !isZeroRoot(local.finalizedRoot)
73
+ remote.finalizedEpoch === local.finalizedEpoch &&
74
+ !isZeroRoot(local.finalizedRoot) &&
75
+ !ssz.Root.equals(remote.finalizedRoot, local.finalizedRoot)
56
76
  ) {
57
- // NOTE: due to preferring to not access chain state here, we can't check the finalized root against our history.
58
- // The impact of not doing check is low: peers that are behind us we can't confirm they are in the same chain as us.
59
- // In the worst case they will attempt to sync from us, fail and disconnect. The ENR fork check should be sufficient
60
- // to differentiate most peers in normal network conditions.
61
- const remoteRoot = remote.finalizedRoot;
62
- const expectedRoot = remote.finalizedEpoch === local.finalizedEpoch ? local.finalizedRoot : null;
63
-
64
- if (expectedRoot !== null && !ssz.Root.equals(remoteRoot, expectedRoot)) {
65
- return {
66
- code: IrrelevantPeerCode.DIFFERENT_FINALIZED,
67
- expectedRoot: expectedRoot, // forkChoice returns Tree BranchNode which the logger prints as {}
68
- remoteRoot: remoteRoot,
69
- };
70
- }
77
+ return {
78
+ code: IrrelevantPeerCode.DIFFERENT_FINALIZED,
79
+ expectedRoot: local.finalizedRoot,
80
+ remoteRoot: remote.finalizedRoot,
81
+ };
71
82
  }
72
83
 
73
84
  if (isForkPostFulu(forkName) && (remote as fulu.Status).earliestAvailableSlot === undefined) {
@@ -76,7 +87,8 @@ export function assertPeerRelevance(
76
87
  };
77
88
  }
78
89
 
79
- // Note: Accept request status finalized checkpoint in the future, we do not know if it is a true finalized root
90
+ // Note: for a behind finalized checkpoint, we validate it more on the main thread against our history,
91
+ // see BeaconSync.verifyPastFinalizedCheckpoint
80
92
  return null;
81
93
  }
82
94
 
@@ -93,6 +105,10 @@ export function renderIrrelevantPeerType(type: IrrelevantPeerType): string {
93
105
  return `DIFFERENT_CLOCKS slotDiff: ${type.slotDiff}`;
94
106
  case IrrelevantPeerCode.DIFFERENT_FINALIZED:
95
107
  return `DIFFERENT_FINALIZED root: ${toRootHex(type.remoteRoot)} expected: ${toRootHex(type.expectedRoot)}`;
108
+ case IrrelevantPeerCode.FINALIZED_EPOCH_TOO_HIGH:
109
+ return `FINALIZED_EPOCH_TOO_HIGH finalizedEpoch: ${type.finalizedEpoch} max: ${type.maxFinalizedEpoch}`;
110
+ case IrrelevantPeerCode.INVALID_FINALIZED_ROOT:
111
+ return "INVALID_FINALIZED_ROOT zero root for a non-genesis finalized epoch";
96
112
  case IrrelevantPeerCode.NO_EARLIEST_AVAILABLE_SLOT:
97
113
  return "No earliestAvailableSlot announced via peer Status";
98
114
  }
@@ -17,10 +17,13 @@ export function deserializeEnrSubnets(bytes: Uint8Array, subnetCount: number): b
17
17
  return getUint8ByteToBitBooleanArray(bytes[0] ?? 0);
18
18
  }
19
19
 
20
- let boolsArr: boolean[] = [];
21
20
  const byteCount = Math.ceil(subnetCount / 8);
21
+ const boolsArr = new Array<boolean>(byteCount * 8);
22
22
  for (let i = 0; i < byteCount; i++) {
23
- boolsArr = boolsArr.concat(getUint8ByteToBitBooleanArray(bytes[i] ?? 0));
23
+ const bits = getUint8ByteToBitBooleanArray(bytes[i] ?? 0);
24
+ for (let j = 0; j < 8; j++) {
25
+ boolsArr[i * 8 + j] = bits[j];
26
+ }
24
27
  }
25
28
 
26
29
  return boolsArr;
@@ -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
  }