@lodestar/beacon-node 1.42.0-dev.7b5ce3932d → 1.42.0-dev.7bdb87e586

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 (469) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +25 -13
  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 +5 -1
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  8. package/lib/api/impl/beacon/state/index.js +38 -40
  9. package/lib/api/impl/beacon/state/index.js.map +1 -1
  10. package/lib/api/impl/beacon/state/utils.d.ts +4 -4
  11. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  12. package/lib/api/impl/beacon/state/utils.js +7 -10
  13. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  14. package/lib/api/impl/debug/index.js.map +1 -1
  15. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  16. package/lib/api/impl/lodestar/index.js +8 -6
  17. package/lib/api/impl/lodestar/index.js.map +1 -1
  18. package/lib/api/impl/proof/index.d.ts.map +1 -1
  19. package/lib/api/impl/proof/index.js +2 -6
  20. package/lib/api/impl/proof/index.js.map +1 -1
  21. package/lib/api/impl/validator/index.d.ts.map +1 -1
  22. package/lib/api/impl/validator/index.js +33 -27
  23. package/lib/api/impl/validator/index.js.map +1 -1
  24. package/lib/api/impl/validator/utils.d.ts +2 -2
  25. package/lib/api/impl/validator/utils.d.ts.map +1 -1
  26. package/lib/api/impl/validator/utils.js +3 -3
  27. package/lib/api/impl/validator/utils.js.map +1 -1
  28. package/lib/chain/ColumnReconstructionTracker.d.ts +2 -1
  29. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  30. package/lib/chain/ColumnReconstructionTracker.js +5 -5
  31. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  32. package/lib/chain/GetBlobsTracker.d.ts +2 -1
  33. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  34. package/lib/chain/GetBlobsTracker.js +14 -12
  35. package/lib/chain/GetBlobsTracker.js.map +1 -1
  36. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  37. package/lib/chain/archiveStore/archiveStore.js +1 -0
  38. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  39. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +3 -7
  40. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  41. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +8 -26
  42. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  43. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts +2 -2
  44. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
  45. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
  46. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  47. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
  48. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  49. package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
  50. package/lib/chain/archiveStore/historicalState/worker.js +1 -3
  51. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  52. package/lib/chain/archiveStore/interface.d.ts +1 -0
  53. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  54. package/lib/chain/balancesCache.d.ts +2 -2
  55. package/lib/chain/balancesCache.d.ts.map +1 -1
  56. package/lib/chain/balancesCache.js +4 -4
  57. package/lib/chain/balancesCache.js.map +1 -1
  58. package/lib/chain/blocks/blockInput/blockInput.d.ts +5 -5
  59. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  60. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  61. package/lib/chain/blocks/blockInput/types.d.ts +5 -4
  62. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  63. package/lib/chain/blocks/blockInput/types.js +1 -0
  64. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  65. package/lib/chain/blocks/importBlock.d.ts +3 -3
  66. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  67. package/lib/chain/blocks/importBlock.js +37 -23
  68. package/lib/chain/blocks/importBlock.js.map +1 -1
  69. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -8
  70. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  71. package/lib/chain/blocks/importExecutionPayload.js +87 -51
  72. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  73. package/lib/chain/blocks/index.d.ts.map +1 -1
  74. package/lib/chain/blocks/index.js +3 -2
  75. package/lib/chain/blocks/index.js.map +1 -1
  76. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +14 -6
  77. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  78. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +33 -2
  79. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  80. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +2 -1
  81. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  82. package/lib/chain/blocks/types.d.ts +21 -15
  83. package/lib/chain/blocks/types.d.ts.map +1 -1
  84. package/lib/chain/blocks/types.js.map +1 -1
  85. package/lib/chain/blocks/utils/checkpoint.d.ts +2 -2
  86. package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -1
  87. package/lib/chain/blocks/utils/checkpoint.js.map +1 -1
  88. package/lib/chain/blocks/verifyBlock.d.ts +2 -2
  89. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  90. package/lib/chain/blocks/verifyBlock.js +4 -4
  91. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  92. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +5 -5
  93. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  94. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -4
  95. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  96. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  97. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  98. package/lib/chain/blocks/verifyBlocksSignatures.js +4 -2
  99. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  100. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -3
  101. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  102. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +3 -3
  103. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  104. package/lib/chain/chain.d.ts +15 -14
  105. package/lib/chain/chain.d.ts.map +1 -1
  106. package/lib/chain/chain.js +110 -62
  107. package/lib/chain/chain.js.map +1 -1
  108. package/lib/chain/emitter.d.ts +31 -9
  109. package/lib/chain/emitter.d.ts.map +1 -1
  110. package/lib/chain/emitter.js +12 -3
  111. package/lib/chain/emitter.js.map +1 -1
  112. package/lib/chain/errors/blockError.d.ts +4 -4
  113. package/lib/chain/errors/blockError.d.ts.map +1 -1
  114. package/lib/chain/errors/dataColumnSidecarError.d.ts +31 -1
  115. package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -1
  116. package/lib/chain/errors/dataColumnSidecarError.js +7 -0
  117. package/lib/chain/errors/dataColumnSidecarError.js.map +1 -1
  118. package/lib/chain/forkChoice/index.d.ts +4 -4
  119. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  120. package/lib/chain/forkChoice/index.js +30 -24
  121. package/lib/chain/forkChoice/index.js.map +1 -1
  122. package/lib/chain/initState.d.ts +2 -2
  123. package/lib/chain/initState.d.ts.map +1 -1
  124. package/lib/chain/initState.js +1 -1
  125. package/lib/chain/initState.js.map +1 -1
  126. package/lib/chain/interface.d.ts +15 -14
  127. package/lib/chain/interface.d.ts.map +1 -1
  128. package/lib/chain/lightClient/index.d.ts +2 -2
  129. package/lib/chain/lightClient/index.d.ts.map +1 -1
  130. package/lib/chain/lightClient/index.js +11 -4
  131. package/lib/chain/lightClient/index.js.map +1 -1
  132. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -6
  133. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  134. package/lib/chain/opPools/aggregatedAttestationPool.js +13 -13
  135. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  136. package/lib/chain/opPools/executionPayloadBidPool.d.ts +2 -2
  137. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -1
  138. package/lib/chain/opPools/executionPayloadBidPool.js +2 -2
  139. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -1
  140. package/lib/chain/opPools/opPool.d.ts +3 -3
  141. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  142. package/lib/chain/opPools/opPool.js +7 -7
  143. package/lib/chain/opPools/opPool.js.map +1 -1
  144. package/lib/chain/opPools/utils.d.ts +2 -2
  145. package/lib/chain/opPools/utils.d.ts.map +1 -1
  146. package/lib/chain/opPools/utils.js +1 -1
  147. package/lib/chain/opPools/utils.js.map +1 -1
  148. package/lib/chain/options.d.ts +1 -0
  149. package/lib/chain/options.d.ts.map +1 -1
  150. package/lib/chain/options.js +1 -0
  151. package/lib/chain/options.js.map +1 -1
  152. package/lib/chain/prepareNextSlot.d.ts +2 -2
  153. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  154. package/lib/chain/prepareNextSlot.js +10 -4
  155. package/lib/chain/prepareNextSlot.js.map +1 -1
  156. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +4 -4
  157. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  158. package/lib/chain/produceBlock/computeNewStateRoot.js +3 -4
  159. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  160. package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -5
  161. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  162. package/lib/chain/produceBlock/produceBlockBody.js +21 -16
  163. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  164. package/lib/chain/regen/interface.d.ts +13 -13
  165. package/lib/chain/regen/interface.d.ts.map +1 -1
  166. package/lib/chain/regen/queued.d.ts +14 -14
  167. package/lib/chain/regen/queued.d.ts.map +1 -1
  168. package/lib/chain/regen/queued.js.map +1 -1
  169. package/lib/chain/regen/regen.d.ts +6 -5
  170. package/lib/chain/regen/regen.d.ts.map +1 -1
  171. package/lib/chain/regen/regen.js +6 -6
  172. package/lib/chain/regen/regen.js.map +1 -1
  173. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +1 -1
  174. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  175. package/lib/chain/seenCache/seenGossipBlockInput.js +2 -2
  176. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  177. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +1 -1
  178. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  179. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +2 -2
  180. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  181. package/lib/chain/serializeState.d.ts +2 -2
  182. package/lib/chain/serializeState.d.ts.map +1 -1
  183. package/lib/chain/serializeState.js +1 -1
  184. package/lib/chain/serializeState.js.map +1 -1
  185. package/lib/chain/shufflingCache.d.ts +2 -2
  186. package/lib/chain/shufflingCache.d.ts.map +1 -1
  187. package/lib/chain/shufflingCache.js +3 -4
  188. package/lib/chain/shufflingCache.js.map +1 -1
  189. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +6 -6
  190. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  191. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  192. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +11 -11
  193. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  194. package/lib/chain/stateCache/persistentCheckpointsCache.js +12 -16
  195. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  196. package/lib/chain/stateCache/types.d.ts +14 -14
  197. package/lib/chain/stateCache/types.d.ts.map +1 -1
  198. package/lib/chain/stateCache/types.js.map +1 -1
  199. package/lib/chain/validation/attesterSlashing.js +3 -3
  200. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  201. package/lib/chain/validation/blobSidecar.js +1 -1
  202. package/lib/chain/validation/blobSidecar.js.map +1 -1
  203. package/lib/chain/validation/block.d.ts.map +1 -1
  204. package/lib/chain/validation/block.js +3 -3
  205. package/lib/chain/validation/block.js.map +1 -1
  206. package/lib/chain/validation/blsToExecutionChange.js +2 -2
  207. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  208. package/lib/chain/validation/dataColumnSidecar.d.ts +11 -4
  209. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  210. package/lib/chain/validation/dataColumnSidecar.js +185 -6
  211. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  212. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  213. package/lib/chain/validation/executionPayloadBid.js +10 -7
  214. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  215. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  216. package/lib/chain/validation/executionPayloadEnvelope.js +5 -3
  217. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  218. package/lib/chain/validation/payloadAttestationMessage.js +5 -3
  219. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  220. package/lib/chain/validation/proposerSlashing.js +1 -1
  221. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  222. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  223. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  224. package/lib/chain/validation/signatureSets/contributionAndProof.js +1 -1
  225. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  226. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  227. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  228. package/lib/chain/validation/signatureSets/syncCommittee.js +1 -1
  229. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  230. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -2
  231. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  232. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  233. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  234. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  235. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -1
  236. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  237. package/lib/chain/validation/syncCommittee.d.ts +4 -4
  238. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  239. package/lib/chain/validation/syncCommittee.js +17 -12
  240. package/lib/chain/validation/syncCommittee.js.map +1 -1
  241. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  242. package/lib/chain/validation/syncCommitteeContributionAndProof.js +5 -2
  243. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  244. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
  245. package/lib/chain/validation/voluntaryExit.js +3 -3
  246. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  247. package/lib/chain/validatorMonitor.d.ts +3 -3
  248. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  249. package/lib/chain/validatorMonitor.js +11 -9
  250. package/lib/chain/validatorMonitor.js.map +1 -1
  251. package/lib/db/buckets.d.ts +2 -2
  252. package/lib/db/buckets.d.ts.map +1 -1
  253. package/lib/db/buckets.js +2 -2
  254. package/lib/db/buckets.js.map +1 -1
  255. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  256. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  257. package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -1
  258. package/lib/db/repositories/dataColumnSidecar.js +4 -2
  259. package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
  260. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  261. package/lib/db/repositories/dataColumnSidecarArchive.js +4 -2
  262. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  263. package/lib/metrics/metrics/lodestar.d.ts +32 -4
  264. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  265. package/lib/metrics/metrics/lodestar.js +52 -15
  266. package/lib/metrics/metrics/lodestar.js.map +1 -1
  267. package/lib/network/gossip/encoding.d.ts.map +1 -1
  268. package/lib/network/gossip/encoding.js +15 -0
  269. package/lib/network/gossip/encoding.js.map +1 -1
  270. package/lib/network/interface.d.ts +7 -4
  271. package/lib/network/interface.d.ts.map +1 -1
  272. package/lib/network/libp2p/index.d.ts.map +1 -1
  273. package/lib/network/libp2p/index.js +22 -11
  274. package/lib/network/libp2p/index.js.map +1 -1
  275. package/lib/network/network.d.ts +7 -4
  276. package/lib/network/network.d.ts.map +1 -1
  277. package/lib/network/network.js +12 -3
  278. package/lib/network/network.js.map +1 -1
  279. package/lib/network/options.d.ts.map +1 -1
  280. package/lib/network/options.js +7 -2
  281. package/lib/network/options.js.map +1 -1
  282. package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
  283. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  284. package/lib/network/processor/extractSlotRootFns.js +25 -5
  285. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  286. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  287. package/lib/network/processor/gossipHandlers.js +269 -80
  288. package/lib/network/processor/gossipHandlers.js.map +1 -1
  289. package/lib/network/processor/index.d.ts +22 -7
  290. package/lib/network/processor/index.d.ts.map +1 -1
  291. package/lib/network/processor/index.js +313 -80
  292. package/lib/network/processor/index.js.map +1 -1
  293. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  294. package/lib/network/reqresp/ReqRespBeaconNode.js +9 -0
  295. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  296. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +8 -0
  297. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -0
  298. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +69 -0
  299. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -0
  300. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +6 -0
  301. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -0
  302. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +28 -0
  303. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -0
  304. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  305. package/lib/network/reqresp/handlers/index.js +11 -1
  306. package/lib/network/reqresp/handlers/index.js.map +1 -1
  307. package/lib/network/reqresp/protocols.d.ts +2 -0
  308. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  309. package/lib/network/reqresp/protocols.js +10 -0
  310. package/lib/network/reqresp/protocols.js.map +1 -1
  311. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  312. package/lib/network/reqresp/rateLimit.js +8 -0
  313. package/lib/network/reqresp/rateLimit.js.map +1 -1
  314. package/lib/network/reqresp/score.d.ts.map +1 -1
  315. package/lib/network/reqresp/score.js +2 -0
  316. package/lib/network/reqresp/score.js.map +1 -1
  317. package/lib/network/reqresp/types.d.ts +10 -4
  318. package/lib/network/reqresp/types.d.ts.map +1 -1
  319. package/lib/network/reqresp/types.js +16 -4
  320. package/lib/network/reqresp/types.js.map +1 -1
  321. package/lib/node/nodejs.d.ts +2 -2
  322. package/lib/node/nodejs.d.ts.map +1 -1
  323. package/lib/node/nodejs.js +3 -3
  324. package/lib/node/nodejs.js.map +1 -1
  325. package/lib/node/notifier.d.ts.map +1 -1
  326. package/lib/node/notifier.js +3 -3
  327. package/lib/node/notifier.js.map +1 -1
  328. package/lib/sync/backfill/backfill.d.ts +2 -2
  329. package/lib/sync/backfill/backfill.d.ts.map +1 -1
  330. package/lib/sync/backfill/backfill.js +2 -2
  331. package/lib/sync/backfill/backfill.js.map +1 -1
  332. package/lib/sync/unknownBlock.d.ts +3 -9
  333. package/lib/sync/unknownBlock.d.ts.map +1 -1
  334. package/lib/sync/unknownBlock.js +10 -43
  335. package/lib/sync/unknownBlock.js.map +1 -1
  336. package/lib/sync/utils/downloadByRange.d.ts +3 -3
  337. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  338. package/lib/sync/utils/downloadByRange.js +4 -2
  339. package/lib/sync/utils/downloadByRange.js.map +1 -1
  340. package/lib/sync/utils/downloadByRoot.d.ts +3 -3
  341. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  342. package/lib/sync/utils/downloadByRoot.js +10 -5
  343. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  344. package/lib/util/blobs.d.ts +3 -3
  345. package/lib/util/blobs.d.ts.map +1 -1
  346. package/lib/util/blobs.js +21 -10
  347. package/lib/util/blobs.js.map +1 -1
  348. package/lib/util/dataColumns.d.ts +18 -11
  349. package/lib/util/dataColumns.d.ts.map +1 -1
  350. package/lib/util/dataColumns.js +51 -17
  351. package/lib/util/dataColumns.js.map +1 -1
  352. package/lib/util/execution.d.ts +6 -2
  353. package/lib/util/execution.d.ts.map +1 -1
  354. package/lib/util/execution.js +49 -25
  355. package/lib/util/execution.js.map +1 -1
  356. package/lib/util/sszBytes.d.ts +25 -1
  357. package/lib/util/sszBytes.d.ts.map +1 -1
  358. package/lib/util/sszBytes.js +189 -2
  359. package/lib/util/sszBytes.js.map +1 -1
  360. package/lib/util/types.d.ts +2 -0
  361. package/lib/util/types.d.ts.map +1 -1
  362. package/lib/util/types.js +1 -0
  363. package/lib/util/types.js.map +1 -1
  364. package/package.json +16 -16
  365. package/src/api/impl/beacon/blocks/index.ts +33 -16
  366. package/src/api/impl/beacon/pool/index.ts +5 -1
  367. package/src/api/impl/beacon/state/index.ts +43 -55
  368. package/src/api/impl/beacon/state/utils.ts +11 -25
  369. package/src/api/impl/debug/index.ts +2 -2
  370. package/src/api/impl/lodestar/index.ts +8 -8
  371. package/src/api/impl/proof/index.ts +2 -9
  372. package/src/api/impl/validator/index.ts +36 -41
  373. package/src/api/impl/validator/utils.ts +4 -7
  374. package/src/chain/ColumnReconstructionTracker.ts +6 -5
  375. package/src/chain/GetBlobsTracker.ts +14 -12
  376. package/src/chain/archiveStore/archiveStore.ts +1 -0
  377. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -39
  378. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +2 -1
  379. package/src/chain/archiveStore/historicalState/types.ts +2 -0
  380. package/src/chain/archiveStore/historicalState/worker.ts +1 -4
  381. package/src/chain/archiveStore/interface.ts +1 -0
  382. package/src/chain/balancesCache.ts +5 -11
  383. package/src/chain/blocks/blockInput/blockInput.ts +8 -8
  384. package/src/chain/blocks/blockInput/types.ts +5 -4
  385. package/src/chain/blocks/importBlock.ts +50 -31
  386. package/src/chain/blocks/importExecutionPayload.ts +98 -62
  387. package/src/chain/blocks/index.ts +3 -2
  388. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +53 -12
  389. package/src/chain/blocks/payloadEnvelopeInput/types.ts +2 -1
  390. package/src/chain/blocks/types.ts +26 -15
  391. package/src/chain/blocks/utils/checkpoint.ts +2 -2
  392. package/src/chain/blocks/verifyBlock.ts +5 -10
  393. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +10 -14
  394. package/src/chain/blocks/verifyBlocksSignatures.ts +10 -3
  395. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
  396. package/src/chain/chain.ts +148 -95
  397. package/src/chain/emitter.ts +27 -9
  398. package/src/chain/errors/blockError.ts +4 -4
  399. package/src/chain/errors/dataColumnSidecarError.ts +32 -1
  400. package/src/chain/forkChoice/index.ts +35 -41
  401. package/src/chain/initState.ts +7 -2
  402. package/src/chain/interface.ts +16 -15
  403. package/src/chain/lightClient/index.ts +17 -18
  404. package/src/chain/opPools/aggregatedAttestationPool.ts +20 -21
  405. package/src/chain/opPools/executionPayloadBidPool.ts +3 -3
  406. package/src/chain/opPools/opPool.ts +13 -14
  407. package/src/chain/opPools/utils.ts +3 -3
  408. package/src/chain/options.ts +2 -0
  409. package/src/chain/prepareNextSlot.ts +14 -8
  410. package/src/chain/produceBlock/computeNewStateRoot.ts +7 -10
  411. package/src/chain/produceBlock/produceBlockBody.ts +38 -45
  412. package/src/chain/regen/interface.ts +13 -17
  413. package/src/chain/regen/queued.ts +16 -20
  414. package/src/chain/regen/regen.ts +16 -17
  415. package/src/chain/seenCache/seenGossipBlockInput.ts +2 -2
  416. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +2 -2
  417. package/src/chain/serializeState.ts +3 -3
  418. package/src/chain/shufflingCache.ts +5 -7
  419. package/src/chain/stateCache/fifoBlockStateCache.ts +7 -7
  420. package/src/chain/stateCache/persistentCheckpointsCache.ts +27 -42
  421. package/src/chain/stateCache/types.ts +14 -18
  422. package/src/chain/validation/attesterSlashing.ts +3 -3
  423. package/src/chain/validation/blobSidecar.ts +1 -1
  424. package/src/chain/validation/block.ts +3 -4
  425. package/src/chain/validation/blsToExecutionChange.ts +2 -2
  426. package/src/chain/validation/dataColumnSidecar.ts +231 -8
  427. package/src/chain/validation/executionPayloadBid.ts +10 -10
  428. package/src/chain/validation/executionPayloadEnvelope.ts +5 -4
  429. package/src/chain/validation/payloadAttestationMessage.ts +6 -4
  430. package/src/chain/validation/proposerSlashing.ts +1 -1
  431. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -7
  432. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -7
  433. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -2
  434. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -7
  435. package/src/chain/validation/syncCommittee.ts +25 -20
  436. package/src/chain/validation/syncCommitteeContributionAndProof.ts +9 -10
  437. package/src/chain/validation/voluntaryExit.ts +3 -8
  438. package/src/chain/validatorMonitor.ts +15 -13
  439. package/src/db/buckets.ts +2 -2
  440. package/src/db/repositories/dataColumnSidecar.ts +4 -2
  441. package/src/db/repositories/dataColumnSidecarArchive.ts +4 -2
  442. package/src/metrics/metrics/lodestar.ts +57 -19
  443. package/src/network/gossip/encoding.ts +16 -0
  444. package/src/network/interface.ts +18 -4
  445. package/src/network/libp2p/index.ts +24 -13
  446. package/src/network/network.ts +39 -8
  447. package/src/network/options.ts +7 -2
  448. package/src/network/processor/extractSlotRootFns.ts +32 -6
  449. package/src/network/processor/gossipHandlers.ts +334 -94
  450. package/src/network/processor/index.ts +395 -92
  451. package/src/network/reqresp/ReqRespBeaconNode.ts +13 -0
  452. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +94 -0
  453. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +43 -0
  454. package/src/network/reqresp/handlers/index.ts +12 -0
  455. package/src/network/reqresp/protocols.ts +12 -0
  456. package/src/network/reqresp/rateLimit.ts +18 -0
  457. package/src/network/reqresp/score.ts +2 -0
  458. package/src/network/reqresp/types.ts +26 -5
  459. package/src/node/nodejs.ts +6 -5
  460. package/src/node/notifier.ts +5 -6
  461. package/src/sync/backfill/backfill.ts +3 -3
  462. package/src/sync/unknownBlock.ts +13 -53
  463. package/src/sync/utils/downloadByRange.ts +9 -7
  464. package/src/sync/utils/downloadByRoot.ts +16 -12
  465. package/src/util/blobs.ts +35 -15
  466. package/src/util/dataColumns.ts +69 -25
  467. package/src/util/execution.ts +49 -30
  468. package/src/util/sszBytes.ts +245 -3
  469. package/src/util/types.ts +6 -0
@@ -2,7 +2,7 @@ import {routes} from "@lodestar/api";
2
2
  import {ForkSeq} from "@lodestar/params";
3
3
  import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
4
4
  import {RootHex, Slot, SlotRootHex} from "@lodestar/types";
5
- import {Logger, MapDef, mapValues, pruneSetToMax, sleep} from "@lodestar/utils";
5
+ import {Logger, MapDef, mapValues, sleep} from "@lodestar/utils";
6
6
  import {BlockInputSource} from "../../chain/blocks/blockInput/types.js";
7
7
  import {ChainEvent} from "../../chain/emitter.js";
8
8
  import {GossipErrorCode} from "../../chain/errors/gossipValidation.js";
@@ -12,6 +12,16 @@ import {Metrics} from "../../metrics/metrics.js";
12
12
  import {ClockEvent} from "../../util/clock.js";
13
13
  import {callInNextEventLoop} from "../../util/eventLoop.js";
14
14
  import {PeerIdStr} from "../../util/peerId.js";
15
+ import {
16
+ getBeaconBlockRootFromExecutionPayloadEnvelopeSerialized,
17
+ getDataIndexFromSignedAggregateAndProofSerialized,
18
+ getDataIndexFromSingleAttestationSerialized,
19
+ getParentBlockHashFromGloasSignedBeaconBlockSerialized,
20
+ getParentBlockHashFromSignedExecutionPayloadBidSerialized,
21
+ getParentBlockRootFromSignedExecutionPayloadBidSerialized,
22
+ getParentRootFromSignedBeaconBlockSerialized,
23
+ getPayloadPresentFromPayloadAttestationMessageSerialized,
24
+ } from "../../util/sszBytes.js";
15
25
  import {NetworkEvent, NetworkEventBus} from "../events.js";
16
26
  import {
17
27
  GossipHandlers,
@@ -87,27 +97,29 @@ const executeGossipWorkOrder = Object.keys(executeGossipWorkOrderObj) as (keyof
87
97
  // TODO: Arbitrary constant, check metrics
88
98
  const MAX_JOBS_SUBMITTED_PER_TICK = 128;
89
99
 
90
- // How many attestations (aggregate + unaggregate) we keep before new ones get dropped.
100
+ // How many gossip messages we keep before new ones get dropped.
91
101
  const MAX_QUEUED_UNKNOWN_BLOCK_GOSSIP_OBJECTS = 16_384;
102
+ // TODO gloas: arbitrary constant, check metrics.
103
+ const MAX_QUEUED_UNKNOWN_PAYLOAD_GOSSIP_OBJECTS = 1024;
92
104
 
93
- // We don't want to process too many attestations in a single tick
94
- // As seen on mainnet, attestation concurrency metric ranges from 1000 to 2000
105
+ // We don't want to process too many gossip messages in a single tick
106
+ // As seen on mainnet, gossip messages concurrency metric ranges from 1000 to 2000
95
107
  // so make this constant a little bit conservative
96
- const MAX_UNKNOWN_BLOCK_GOSSIP_OBJECTS_PER_TICK = 1024;
108
+ const MAX_AWAITING_GOSSIP_OBJECTS_PER_TICK = 1024;
97
109
 
98
110
  // Same motivation to JobItemQueue, we don't want to block the event loop
99
- const PROCESS_UNKNOWN_BLOCK_GOSSIP_OBJECTS_YIELD_EVERY_MS = 50;
111
+ const AWAITING_GOSSIP_OBJECTS_YIELD_EVERY_MS = 50;
100
112
 
101
113
  /**
102
114
  * Reprocess reject reason for metrics
103
115
  */
104
116
  export enum ReprocessRejectReason {
105
117
  /**
106
- * There are too many attestations that have unknown block root.
118
+ * There are too many gossip messages that have unknown block root.
107
119
  */
108
120
  reached_limit = "reached_limit",
109
121
  /**
110
- * The awaiting attestation is pruned per clock slot.
122
+ * The awaiting gossip message is pruned per clock slot.
111
123
  */
112
124
  expired = "expired",
113
125
  }
@@ -126,6 +138,20 @@ export enum CannotAcceptWorkReason {
126
138
  regen = "regen_busy",
127
139
  }
128
140
 
141
+ /**
142
+ * No metrics needed here; using a number to keep it lightweight
143
+ */
144
+ enum PreprocessAction {
145
+ AwaitBlock,
146
+ AwaitEnvelope,
147
+ PushToQueue,
148
+ }
149
+
150
+ type PreprocessResult =
151
+ | {action: PreprocessAction.PushToQueue}
152
+ | {action: PreprocessAction.AwaitBlock; root: RootHex}
153
+ | {action: PreprocessAction.AwaitEnvelope; root: RootHex};
154
+
129
155
  /**
130
156
  * Network processor handles the gossip queues and throtles processing to not overload the main thread
131
157
  * - Decides when to process work and what to process
@@ -137,7 +163,7 @@ export enum CannotAcceptWorkReason {
137
163
  *
138
164
  * ### PendingGossipsubMessage beacon_attestation example
139
165
  *
140
- * For attestations, processing the message includes the steps:
166
+ * For gossip messages, processing the message includes the steps:
141
167
  * 1. Pre shuffling sync validation
142
168
  * 2. Retrieve shuffling: async + goes into the regen queue and can be expensive
143
169
  * 3. Pre sig validation sync validation
@@ -156,11 +182,14 @@ export class NetworkProcessor {
156
182
  private readonly gossipQueues: ReturnType<typeof createGossipQueues>;
157
183
  private readonly gossipTopicConcurrency: {[K in GossipType]: number};
158
184
  private readonly extractBlockSlotRootFns = createExtractBlockSlotRootFns();
159
- // we may not receive the block for Attestation and SignedAggregateAndProof messages, in that case PendingGossipsubMessage needs
185
+ // we may not receive the block for messages like Attestation and SignedAggregateAndProof messages, in that case PendingGossipsubMessage needs
160
186
  // to be stored in this Map and reprocessed once the block comes
161
- private readonly awaitingGossipsubMessagesByRootBySlot: MapDef<Slot, MapDef<RootHex, Set<PendingGossipsubMessage>>>;
162
- private unknownBlockGossipsubMessagesCount = 0;
163
- private unknownRootsBySlot = new MapDef<Slot, Set<RootHex>>(() => new Set());
187
+ private readonly awaitingMessagesByBlockRoot: MapDef<RootHex, Set<PendingGossipsubMessage>>;
188
+ // we may not receive the payload for messages that require the FULL payload variant to be processed,
189
+ // in that case PendingGossipsubMessage needs to be stored in this Map and reprocessed once the payload comes
190
+ private readonly awaitingMessagesByPayloadBlockRoot: MapDef<RootHex, Set<PendingGossipsubMessage>>;
191
+ private unknownBlocksBySlot = new MapDef<Slot, Set<RootHex>>(() => new Set());
192
+ private unknownEnvelopesBySlot = new MapDef<Slot, Set<RootHex>>(() => new Set());
164
193
 
165
194
  constructor(
166
195
  modules: NetworkProcessorModules,
@@ -180,13 +209,13 @@ export class NetworkProcessor {
180
209
  modules
181
210
  );
182
211
 
183
- events.on(NetworkEvent.pendingGossipsubMessage, this.onPendingGossipsubMessage.bind(this));
184
- this.chain.emitter.on(routes.events.EventType.block, this.onBlockProcessed.bind(this));
185
- this.chain.clock.on(ClockEvent.slot, this.onClockSlot.bind(this));
212
+ events.on(NetworkEvent.pendingGossipsubMessage, this.onPendingGossipsubMessage);
213
+ this.chain.emitter.on(routes.events.EventType.block, this.onBlockProcessed);
214
+ this.chain.emitter.on(routes.events.EventType.executionPayload, this.onPayloadEnvelopeProcessed);
215
+ this.chain.clock.on(ClockEvent.slot, this.onClockSlot);
186
216
 
187
- this.awaitingGossipsubMessagesByRootBySlot = new MapDef(
188
- () => new MapDef<RootHex, Set<PendingGossipsubMessage>>(() => new Set())
189
- );
217
+ this.awaitingMessagesByBlockRoot = new MapDef<RootHex, Set<PendingGossipsubMessage>>(() => new Set());
218
+ this.awaitingMessagesByPayloadBlockRoot = new MapDef<RootHex, Set<PendingGossipsubMessage>>(() => new Set());
190
219
 
191
220
  // TODO: Implement queues and priorization for ReqResp incoming requests
192
221
  // Listens to NetworkEvent.reqRespIncomingRequest event
@@ -198,7 +227,8 @@ export class NetworkProcessor {
198
227
  metrics.gossipValidationQueue.keySize.set({topic}, this.gossipQueues[topic].keySize);
199
228
  metrics.gossipValidationQueue.concurrency.set({topic}, this.gossipTopicConcurrency[topic]);
200
229
  }
201
- metrics.reprocessGossipAttestations.countPerSlot.set(this.unknownBlockGossipsubMessagesCount);
230
+ metrics.awaitingBlockGossipMessages.countPerSlot.set(this.unknownBlockGossipsubMessagesCount);
231
+ metrics.awaitingPayloadGossipMessages.countPerSlot.set(this.unknownPayloadGossipsubMessagesCount);
202
232
  // specific metric for beacon_attestation topic
203
233
  metrics.gossipValidationQueue.keyAge.reset();
204
234
  for (const ageMs of this.gossipQueues.beacon_attestation.getDataAgeMs()) {
@@ -215,6 +245,7 @@ export class NetworkProcessor {
215
245
  async stop(): Promise<void> {
216
246
  this.events.off(NetworkEvent.pendingGossipsubMessage, this.onPendingGossipsubMessage);
217
247
  this.chain.emitter.off(routes.events.EventType.block, this.onBlockProcessed);
248
+ this.chain.emitter.off(routes.events.EventType.executionPayload, this.onPayloadEnvelopeProcessed);
218
249
  this.chain.emitter.off(ClockEvent.slot, this.onClockSlot);
219
250
  }
220
251
 
@@ -233,72 +264,276 @@ export class NetworkProcessor {
233
264
  return queue.getAll();
234
265
  }
235
266
 
236
- searchUnknownSlotRoot({slot, root}: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
237
- if (this.chain.seenBlock(root) || this.unknownRootsBySlot.getOrDefault(slot).has(root)) {
267
+ /**
268
+ * Search block via `ChainEvent.unknownBlockRoot` event
269
+ * Slot is the message slot, which is not necessarily the same as the block's slot, but it can be used for a good prune strategy.
270
+ * In the rare case, if 2 messages on 2 slots search for the same root (for example beacon_attestation) we may emit the same root twice but BlockInputSync should handle it well.
271
+ */
272
+ searchUnknownBlock({slot, root}: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
273
+ if (
274
+ this.chain.seenBlock(root) ||
275
+ this.awaitingMessagesByBlockRoot.has(root) ||
276
+ this.unknownBlocksBySlot.getOrDefault(slot).has(root)
277
+ ) {
238
278
  return;
239
279
  }
240
280
  // Search for the unknown block
241
- this.unknownRootsBySlot.getOrDefault(slot).add(root);
281
+ this.unknownBlocksBySlot.getOrDefault(slot).add(root);
242
282
  this.chain.emitter.emit(ChainEvent.unknownBlockRoot, {rootHex: root, peer, source});
243
283
  }
244
284
 
245
- private onPendingGossipsubMessage(message: PendingGossipsubMessage): void {
285
+ /**
286
+ * Search envelope via `ChainEvent.unknownEnvelopeBlockRoot` event
287
+ * Slot is the message slot, which is not necessarily the same as the envelope's slot, but it can be used for a good prune strategy.
288
+ * In the rare case, if 2 messages on 2 slots search for the same root (for example beacon_attestation) we may emit the same root twice but BlockInputSync should handle it well.
289
+ */
290
+ searchUnknownEnvelope({slot, root}: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
291
+ if (
292
+ this.chain.seenPayloadEnvelope(root) ||
293
+ this.awaitingMessagesByPayloadBlockRoot.has(root) ||
294
+ this.unknownEnvelopesBySlot.getOrDefault(slot).has(root)
295
+ ) {
296
+ return;
297
+ }
298
+ this.unknownEnvelopesBySlot.getOrDefault(slot).add(root);
299
+ this.chain.emitter.emit(ChainEvent.unknownEnvelopeBlockRoot, {rootHex: root, peer, source});
300
+ }
301
+
302
+ private onPendingGossipsubMessage = (message: PendingGossipsubMessage): void => {
246
303
  const topicType = message.topic.type;
247
304
  const extractBlockSlotRootFn = this.extractBlockSlotRootFns[topicType];
248
- // check block root of Attestation and SignedAggregateAndProof messages
249
- if (extractBlockSlotRootFn) {
250
- const slotRoot = extractBlockSlotRootFn(message.msg.data, message.topic.boundary.fork);
251
- // if slotRoot is null, it means the msg.data is invalid
252
- // in that case message will be rejected when deserializing data in later phase (gossipValidatorFn)
253
- if (slotRoot) {
254
- // DOS protection: avoid processing messages that are too old
255
- const {slot, root} = slotRoot;
256
- const clockSlot = this.chain.clock.currentSlot;
257
- const {fork} = message.topic.boundary;
258
- let earliestPermissableSlot = clockSlot - DEFAULT_EARLIEST_PERMISSIBLE_SLOT_DISTANCE;
259
- if (ForkSeq[fork] >= ForkSeq.deneb && topicType === GossipType.beacon_attestation) {
260
- // post deneb, the attestations could be in current or previous epoch
261
- earliestPermissableSlot = computeStartSlotAtEpoch(this.chain.clock.currentEpoch - 1);
305
+
306
+ // 1st extract round: make sure slot is in range and if block root is not available
307
+ // proactively search for it + queue the message
308
+ const slotRoot = extractBlockSlotRootFn
309
+ ? extractBlockSlotRootFn(message.msg.data, message.topic.boundary.fork)
310
+ : null;
311
+ if (slotRoot === null) {
312
+ // some messages don't have slot and root
313
+ // if the msg.data is invalid, message will be rejected when deserializing data in later phase (gossipValidatorFn)
314
+ this.pushPendingGossipsubMessageToQueue(message);
315
+ return;
316
+ }
317
+
318
+ // common check for all topics
319
+ // DOS protection: avoid processing messages that are too old
320
+ const {slot, root} = slotRoot;
321
+ const clockSlot = this.chain.clock.currentSlot;
322
+ const {fork} = message.topic.boundary;
323
+ let earliestPermissableSlot = clockSlot - DEFAULT_EARLIEST_PERMISSIBLE_SLOT_DISTANCE;
324
+ if (ForkSeq[fork] >= ForkSeq.deneb && topicType === GossipType.beacon_attestation) {
325
+ // post deneb, the attestations could be in current or previous epoch
326
+ earliestPermissableSlot = computeStartSlotAtEpoch(this.chain.clock.currentEpoch - 1);
327
+ }
328
+ if (slot < earliestPermissableSlot) {
329
+ // No need to report the dropped job to gossip. It will be eventually pruned from the mcache
330
+ this.metrics?.networkProcessor.gossipValidationError.inc({
331
+ topic: topicType,
332
+ error: GossipErrorCode.PAST_SLOT,
333
+ });
334
+ return;
335
+ }
336
+
337
+ message.msgSlot = slot;
338
+
339
+ // this determines whether this message needs to wait for a Block or Envelope
340
+ // a message should only wait for what it voted for, hence we don't want to put it on both queues
341
+ let preprocessResult: PreprocessResult = {action: PreprocessAction.PushToQueue};
342
+ // no need to check if root is a descendant of the current finalized block, it will be checked once we validate the message if needed
343
+ if (root && !this.chain.forkChoice.hasBlockHexUnsafe(root)) {
344
+ // starting from GLOAS, unknown root from data_column_sidecar also falls into this case
345
+ this.searchUnknownBlock({slot, root}, BlockInputSource.network_processor, message.propagationSource.toString());
346
+ // for beacon_attestation and beacon_aggregate_and_proof messages, this is only temporary.
347
+ // if "index = 1" we need to await for the Envelope instead
348
+ preprocessResult = {action: PreprocessAction.AwaitBlock, root};
349
+ }
350
+
351
+ // 2nd extract round for some specific topics
352
+ // we separate the search action from the await action
353
+
354
+ // beacon_block: proactively search for parent block/envelope across all forks, but never queue.
355
+ // BlockInputSync handles cascading recovery if the gossip handler throws.
356
+ if (topicType === GossipType.beacon_block) {
357
+ const parentRoot = getParentRootFromSignedBeaconBlockSerialized(message.msg.data);
358
+ if (parentRoot) {
359
+ if (ForkSeq[fork] >= ForkSeq.gloas) {
360
+ // GLOAS: also check parent envelope, same logic as execution_payload_bid
361
+ const parentBlockHash = getParentBlockHashFromGloasSignedBeaconBlockSerialized(message.msg.data);
362
+ if (parentBlockHash && !this.chain.forkChoice.getBlockHexAndBlockHash(parentRoot, parentBlockHash)) {
363
+ const protoBlock = this.chain.forkChoice.getBlockHexDefaultStatus(parentRoot);
364
+ if (protoBlock === null) {
365
+ this.searchUnknownBlock(
366
+ {slot, root: parentRoot},
367
+ BlockInputSource.network_processor,
368
+ message.propagationSource.toString()
369
+ );
370
+ } else if (
371
+ protoBlock.executionPayloadBlockHash &&
372
+ protoBlock.executionPayloadBlockHash !== parentBlockHash
373
+ ) {
374
+ // only search for the envelope by block root if we're sure there is one. Otherwise UnknownBlockSync will penalize the peer.
375
+ this.searchUnknownEnvelope(
376
+ {slot, root: parentRoot},
377
+ BlockInputSource.network_processor,
378
+ message.propagationSource.toString()
379
+ );
380
+ }
381
+ }
382
+ } else if (!this.chain.forkChoice.hasBlockHexUnsafe(parentRoot)) {
383
+ this.searchUnknownBlock(
384
+ {slot, root: parentRoot},
385
+ BlockInputSource.network_processor,
386
+ message.propagationSource.toString()
387
+ );
388
+ }
389
+ }
390
+ preprocessResult = {action: PreprocessAction.PushToQueue};
391
+ }
392
+
393
+ if (ForkSeq[fork] >= ForkSeq.gloas) {
394
+ // specific check for each topic
395
+ // note that it's supposed to NOT queue beacon_block (handled above) and execution_payload because it's not a one-off;
396
+ // for those topics, gossip handlers will throw and BlockInputSync will handle a tree of them instead
397
+ switch (topicType) {
398
+ case GossipType.beacon_attestation:
399
+ case GossipType.beacon_aggregate_and_proof: {
400
+ if (root == null) break;
401
+ const attIndex =
402
+ topicType === GossipType.beacon_attestation
403
+ ? getDataIndexFromSingleAttestationSerialized(fork, message.msg.data)
404
+ : getDataIndexFromSignedAggregateAndProofSerialized(message.msg.data);
405
+ if (attIndex === 1 && !this.chain.forkChoice.hasPayloadHexUnsafe(root)) {
406
+ // attestation votes that the payload is available but it is not yet known
407
+ this.searchUnknownEnvelope(
408
+ {slot, root},
409
+ BlockInputSource.network_processor,
410
+ message.propagationSource.toString()
411
+ );
412
+ preprocessResult = {action: PreprocessAction.AwaitEnvelope, root};
413
+ }
414
+ break;
262
415
  }
263
- if (slot < earliestPermissableSlot) {
264
- // TODO: Should report the dropped job to gossip? It will be eventually pruned from the mcache
265
- this.metrics?.networkProcessor.gossipValidationError.inc({
416
+ case GossipType.payload_attestation_message: {
417
+ if (root == null) break;
418
+ const payloadPresent = getPayloadPresentFromPayloadAttestationMessageSerialized(message.msg.data);
419
+ if (payloadPresent && !this.chain.forkChoice.hasPayloadHexUnsafe(root)) {
420
+ // payload attestation votes that the payload is available but it is not yet known
421
+ this.searchUnknownEnvelope(
422
+ {slot, root},
423
+ BlockInputSource.network_processor,
424
+ message.propagationSource.toString()
425
+ );
426
+ // do not await the envelope, payload attestation processing only requires that the block is known
427
+ // also do not reset preprocessResult, we may already await for the block
428
+ }
429
+ break;
430
+ }
431
+ case GossipType.data_column_sidecar: {
432
+ if (root == null) break;
433
+ if (!this.chain.forkChoice.hasPayloadHexUnsafe(root)) {
434
+ this.searchUnknownEnvelope(
435
+ {slot, root},
436
+ BlockInputSource.network_processor,
437
+ message.propagationSource.toString()
438
+ );
439
+ // do not await the envelope, we can do gossip validation
440
+ // also do not reset preprocessResult, we may already await for the block
441
+ }
442
+ break;
443
+ }
444
+ case GossipType.execution_payload: {
445
+ // extractBlockSlotRootFn does not return a root for this topic.
446
+ // Extract beacon_block_root directly and proactively trigger block sync if missing.
447
+ // Do NOT await the block — the handler runs immediately; BlockInputSync handles recovery.
448
+ const blockRoot = getBeaconBlockRootFromExecutionPayloadEnvelopeSerialized(message.msg.data);
449
+ if (blockRoot && !this.chain.forkChoice.hasBlockHexUnsafe(blockRoot)) {
450
+ this.searchUnknownBlock(
451
+ {slot, root: blockRoot},
452
+ BlockInputSource.network_processor,
453
+ message.propagationSource.toString()
454
+ );
455
+ }
456
+ // do not await the block, we want UnknownBlockSync to handle it.
457
+ preprocessResult = {action: PreprocessAction.PushToQueue};
458
+ break;
459
+ }
460
+ case GossipType.execution_payload_bid: {
461
+ // instead of searching for the message root, this searches for the parent root
462
+ const parentBlockRoot = getParentBlockRootFromSignedExecutionPayloadBidSerialized(message.msg.data);
463
+ const parentBlockHash = getParentBlockHashFromSignedExecutionPayloadBidSerialized(message.msg.data);
464
+ if (
465
+ parentBlockRoot &&
466
+ parentBlockHash &&
467
+ !this.chain.forkChoice.getBlockHexAndBlockHash(parentBlockRoot, parentBlockHash)
468
+ ) {
469
+ const protoBlock = this.chain.forkChoice.getBlockHexDefaultStatus(parentBlockRoot);
470
+ if (protoBlock === null) {
471
+ this.searchUnknownBlock(
472
+ {slot, root: parentBlockRoot},
473
+ BlockInputSource.network_processor,
474
+ message.propagationSource.toString()
475
+ );
476
+ preprocessResult = {action: PreprocessAction.AwaitBlock, root: parentBlockRoot};
477
+ } else if (
478
+ protoBlock.executionPayloadBlockHash &&
479
+ protoBlock.executionPayloadBlockHash !== parentBlockHash
480
+ ) {
481
+ this.searchUnknownEnvelope(
482
+ {slot, root: parentBlockRoot},
483
+ BlockInputSource.network_processor,
484
+ message.propagationSource.toString()
485
+ );
486
+ preprocessResult = {action: PreprocessAction.AwaitEnvelope, root: parentBlockRoot};
487
+ }
488
+ }
489
+ break;
490
+ }
491
+ }
492
+ }
493
+
494
+ switch (preprocessResult.action) {
495
+ case PreprocessAction.PushToQueue:
496
+ this.pushPendingGossipsubMessageToQueue(message);
497
+ break;
498
+ case PreprocessAction.AwaitBlock: {
499
+ if (this.unknownBlockGossipsubMessagesCount > MAX_QUEUED_UNKNOWN_BLOCK_GOSSIP_OBJECTS) {
500
+ // No need to report the dropped job to gossip. It will be eventually pruned from the mcache
501
+ this.metrics?.awaitingBlockGossipMessages.reject.inc({
502
+ reason: ReprocessRejectReason.reached_limit,
266
503
  topic: topicType,
267
- error: GossipErrorCode.PAST_SLOT,
268
504
  });
269
505
  return;
270
506
  }
271
- message.msgSlot = slot;
272
- // check if we processed a block with this root
273
- // no need to check if root is a descendant of the current finalized block, it will be checked once we validate the message if needed
274
- if (root && !this.chain.forkChoice.hasBlockHexUnsafe(root)) {
275
- this.searchUnknownSlotRoot({slot, root}, BlockInputSource.gossip, message.propagationSource.toString());
276
-
277
- if (this.unknownBlockGossipsubMessagesCount > MAX_QUEUED_UNKNOWN_BLOCK_GOSSIP_OBJECTS) {
278
- // TODO: Should report the dropped job to gossip? It will be eventually pruned from the mcache
279
- this.metrics?.reprocessGossipAttestations.reject.inc({reason: ReprocessRejectReason.reached_limit});
280
- return;
281
- }
282
507
 
283
- this.metrics?.reprocessGossipAttestations.total.inc();
284
- const awaitingGossipsubMessagesByRoot = this.awaitingGossipsubMessagesByRootBySlot.getOrDefault(slot);
285
- const awaitingGossipsubMessages = awaitingGossipsubMessagesByRoot.getOrDefault(root);
286
- awaitingGossipsubMessages.add(message);
287
- this.unknownBlockGossipsubMessagesCount++;
508
+ this.metrics?.awaitingBlockGossipMessages.queue.inc({topic: topicType});
509
+ const awaitingGossipsubMessages = this.awaitingMessagesByBlockRoot.getOrDefault(preprocessResult.root);
510
+ awaitingGossipsubMessages.add(message);
511
+ break;
512
+ }
513
+ case PreprocessAction.AwaitEnvelope: {
514
+ if (this.unknownPayloadGossipsubMessagesCount > MAX_QUEUED_UNKNOWN_PAYLOAD_GOSSIP_OBJECTS) {
515
+ this.metrics?.awaitingPayloadGossipMessages.reject.inc({
516
+ reason: ReprocessRejectReason.reached_limit,
517
+ topic: topicType,
518
+ });
288
519
  return;
289
520
  }
521
+
522
+ this.metrics?.awaitingPayloadGossipMessages.queue.inc({topic: topicType});
523
+ const awaitingPayloadGossipsubMessages = this.awaitingMessagesByPayloadBlockRoot.getOrDefault(
524
+ preprocessResult.root
525
+ );
526
+ awaitingPayloadGossipsubMessages.add(message);
527
+ break;
290
528
  }
291
529
  }
292
-
293
- // bypass the check for other messages
294
- this.pushPendingGossipsubMessageToQueue(message);
295
- }
530
+ };
296
531
 
297
532
  private pushPendingGossipsubMessageToQueue(message: PendingGossipsubMessage): void {
298
533
  const topicType = message.topic.type;
299
534
  const droppedCount = this.gossipQueues[topicType].add(message);
300
535
  if (droppedCount) {
301
- // TODO: Should report the dropped job to gossip? It will be eventually pruned from the mcache
536
+ // No need to report the dropped job to gossip. It will be eventually pruned from the mcache
302
537
  this.metrics?.gossipValidationQueue.droppedJobs.inc({topic: message.topic.type}, droppedCount);
303
538
  }
304
539
 
@@ -306,59 +541,111 @@ export class NetworkProcessor {
306
541
  this.executeWork();
307
542
  }
308
543
 
309
- private async onBlockProcessed({
310
- slot,
311
- block: rootHex,
312
- }: {
313
- slot: Slot;
314
- block: string;
315
- executionOptimistic: boolean;
316
- }): Promise<void> {
317
- const byRootGossipsubMessages = this.awaitingGossipsubMessagesByRootBySlot.getOrDefault(slot);
318
- const waitingGossipsubMessages = byRootGossipsubMessages.getOrDefault(rootHex);
319
- if (waitingGossipsubMessages.size === 0) {
544
+ private onBlockProcessed = async ({block: rootHex}: {block: string; executionOptimistic: boolean}): Promise<void> => {
545
+ const waitingGossipsubMessages = this.awaitingMessagesByBlockRoot.get(rootHex);
546
+ if (!waitingGossipsubMessages || waitingGossipsubMessages.size === 0) {
320
547
  return;
321
548
  }
322
549
 
323
- this.metrics?.reprocessGossipAttestations.resolve.inc(waitingGossipsubMessages.size);
324
550
  const nowSec = Date.now() / 1000;
325
551
  let count = 0;
326
552
  // TODO: we can group attestations to process in batches but since we have the SeenAttestationDatas
327
553
  // cache, it may not be necessary at this time
328
554
  for (const message of waitingGossipsubMessages) {
329
- this.metrics?.reprocessGossipAttestations.waitSecBeforeResolve.set(nowSec - message.seenTimestampSec);
555
+ const topicType = message.topic.type;
556
+ this.metrics?.awaitingBlockGossipMessages.waitSecBeforeResolve.set(
557
+ {topic: topicType},
558
+ nowSec - message.seenTimestampSec
559
+ );
560
+ this.metrics?.awaitingBlockGossipMessages.resolve.inc({topic: topicType});
330
561
  this.pushPendingGossipsubMessageToQueue(message);
331
562
  count++;
332
563
  // don't want to block the event loop, worse case it'd wait for 16_084 / 1024 * 50ms = 800ms which is not a big deal
333
- if (count === MAX_UNKNOWN_BLOCK_GOSSIP_OBJECTS_PER_TICK) {
564
+ if (count === MAX_AWAITING_GOSSIP_OBJECTS_PER_TICK) {
334
565
  count = 0;
335
- await sleep(PROCESS_UNKNOWN_BLOCK_GOSSIP_OBJECTS_YIELD_EVERY_MS);
566
+ await sleep(AWAITING_GOSSIP_OBJECTS_YIELD_EVERY_MS);
336
567
  }
337
568
  }
338
569
 
339
- byRootGossipsubMessages.delete(rootHex);
340
- }
570
+ this.awaitingMessagesByBlockRoot.delete(rootHex);
571
+ };
572
+
573
+ private onPayloadEnvelopeProcessed = async ({blockRoot: rootHex}: {blockRoot: RootHex}): Promise<void> => {
574
+ const waitingGossipsubMessages = this.awaitingMessagesByPayloadBlockRoot.get(rootHex);
575
+ if (!waitingGossipsubMessages || waitingGossipsubMessages.size === 0) {
576
+ return;
577
+ }
578
+
579
+ const nowSec = Date.now() / 1000;
580
+ let count = 0;
581
+ for (const message of waitingGossipsubMessages) {
582
+ const topicType = message.topic.type;
583
+ this.metrics?.awaitingPayloadGossipMessages.waitSecBeforeResolve.set(
584
+ {topic: topicType},
585
+ nowSec - message.seenTimestampSec
586
+ );
587
+ this.metrics?.awaitingPayloadGossipMessages.resolve.inc({topic: topicType});
588
+ this.pushPendingGossipsubMessageToQueue(message);
589
+ count++;
590
+ if (count === MAX_AWAITING_GOSSIP_OBJECTS_PER_TICK) {
591
+ count = 0;
592
+ await sleep(AWAITING_GOSSIP_OBJECTS_YIELD_EVERY_MS);
593
+ }
594
+ }
595
+
596
+ this.awaitingMessagesByPayloadBlockRoot.delete(rootHex);
597
+ };
341
598
 
342
- private onClockSlot(clockSlot: Slot): void {
599
+ private onClockSlot = (clockSlot: Slot): void => {
343
600
  const nowSec = Date.now() / 1000;
344
- for (const [slot, gossipMessagesByRoot] of this.awaitingGossipsubMessagesByRootBySlot.entries()) {
345
- if (slot < clockSlot) {
346
- for (const gossipMessages of gossipMessagesByRoot.values()) {
601
+ const minSlot = clockSlot - MAX_UNKNOWN_ROOTS_SLOT_CACHE_SIZE;
602
+
603
+ for (const [slot, roots] of this.unknownBlocksBySlot) {
604
+ if (slot > minSlot) continue;
605
+ for (const rootHex of roots) {
606
+ const gossipMessages = this.awaitingMessagesByBlockRoot.get(rootHex);
607
+ if (gossipMessages !== undefined) {
347
608
  for (const message of gossipMessages) {
348
- this.metrics?.reprocessGossipAttestations.reject.inc({reason: ReprocessRejectReason.expired});
349
- this.metrics?.reprocessGossipAttestations.waitSecBeforeReject.set(
350
- {reason: ReprocessRejectReason.expired},
609
+ const topicType = message.topic.type;
610
+ this.metrics?.awaitingBlockGossipMessages.reject.inc({
611
+ topic: topicType,
612
+ reason: ReprocessRejectReason.expired,
613
+ });
614
+ this.metrics?.awaitingBlockGossipMessages.waitSecBeforeReject.set(
615
+ {topic: topicType, reason: ReprocessRejectReason.expired},
351
616
  nowSec - message.seenTimestampSec
352
617
  );
353
- // TODO: Should report the dropped job to gossip? It will be eventually pruned from the mcache
618
+ // No need to report the dropped job to gossip. It will be eventually pruned from the mcache
354
619
  }
620
+ this.awaitingMessagesByBlockRoot.delete(rootHex);
355
621
  }
356
- this.awaitingGossipsubMessagesByRootBySlot.delete(slot);
357
622
  }
623
+ this.unknownBlocksBySlot.delete(slot);
358
624
  }
359
- pruneSetToMax(this.unknownRootsBySlot, MAX_UNKNOWN_ROOTS_SLOT_CACHE_SIZE);
360
- this.unknownBlockGossipsubMessagesCount = 0;
361
- }
625
+
626
+ for (const [slot, roots] of this.unknownEnvelopesBySlot) {
627
+ if (slot > minSlot) continue;
628
+ for (const rootHex of roots) {
629
+ const gossipMessages = this.awaitingMessagesByPayloadBlockRoot.get(rootHex);
630
+ if (gossipMessages !== undefined) {
631
+ for (const message of gossipMessages) {
632
+ const topicType = message.topic.type;
633
+ this.metrics?.awaitingPayloadGossipMessages.reject.inc({
634
+ topic: topicType,
635
+ reason: ReprocessRejectReason.expired,
636
+ });
637
+ this.metrics?.awaitingPayloadGossipMessages.waitSecBeforeReject.set(
638
+ {topic: topicType, reason: ReprocessRejectReason.expired},
639
+ nowSec - message.seenTimestampSec
640
+ );
641
+ // No need to report the dropped job to gossip. It will be eventually pruned from the mcache
642
+ }
643
+ this.awaitingMessagesByPayloadBlockRoot.delete(rootHex);
644
+ }
645
+ }
646
+ this.unknownEnvelopesBySlot.delete(slot);
647
+ }
648
+ };
362
649
 
363
650
  private executeWork(): void {
364
651
  // TODO: Maybe de-bounce by timing the last time executeWork was run
@@ -496,4 +783,20 @@ export class NetworkProcessor {
496
783
 
497
784
  return null;
498
785
  }
786
+
787
+ private get unknownBlockGossipsubMessagesCount(): number {
788
+ let count = 0;
789
+ for (const messages of this.awaitingMessagesByBlockRoot.values()) {
790
+ count += messages.size;
791
+ }
792
+ return count;
793
+ }
794
+
795
+ private get unknownPayloadGossipsubMessagesCount(): number {
796
+ let count = 0;
797
+ for (const messages of this.awaitingMessagesByPayloadBlockRoot.values()) {
798
+ count += messages.size;
799
+ }
800
+ return count;
801
+ }
499
802
  }
@@ -297,6 +297,19 @@ export class ReqRespBeaconNode extends ReqResp {
297
297
  );
298
298
  }
299
299
 
300
+ if (ForkSeq[fork] >= ForkSeq.gloas) {
301
+ protocolsAtFork.push(
302
+ [
303
+ protocols.ExecutionPayloadEnvelopesByRoot(fork, this.config),
304
+ this.getHandler(ReqRespMethod.ExecutionPayloadEnvelopesByRoot),
305
+ ],
306
+ [
307
+ protocols.ExecutionPayloadEnvelopesByRange(fork, this.config),
308
+ this.getHandler(ReqRespMethod.ExecutionPayloadEnvelopesByRange),
309
+ ]
310
+ );
311
+ }
312
+
300
313
  return protocolsAtFork;
301
314
  }
302
315