@lodestar/beacon-node 1.42.0-dev.4411584fd8 → 1.42.0-dev.4e640bd2f7

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 (431) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +49 -18
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.js +1 -1
  5. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  6. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  7. package/lib/api/impl/beacon/state/index.js +27 -32
  8. package/lib/api/impl/beacon/state/index.js.map +1 -1
  9. package/lib/api/impl/beacon/state/utils.d.ts +4 -4
  10. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  11. package/lib/api/impl/beacon/state/utils.js +7 -10
  12. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  13. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  14. package/lib/api/impl/lodestar/index.js +4 -6
  15. package/lib/api/impl/lodestar/index.js.map +1 -1
  16. package/lib/api/impl/proof/index.d.ts.map +1 -1
  17. package/lib/api/impl/proof/index.js +2 -6
  18. package/lib/api/impl/proof/index.js.map +1 -1
  19. package/lib/api/impl/validator/index.d.ts.map +1 -1
  20. package/lib/api/impl/validator/index.js +27 -27
  21. package/lib/api/impl/validator/index.js.map +1 -1
  22. package/lib/api/impl/validator/utils.d.ts +2 -2
  23. package/lib/api/impl/validator/utils.d.ts.map +1 -1
  24. package/lib/api/impl/validator/utils.js +3 -3
  25. package/lib/api/impl/validator/utils.js.map +1 -1
  26. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  27. package/lib/chain/archiveStore/archiveStore.js +1 -0
  28. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  29. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +3 -7
  30. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  31. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +8 -26
  32. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  33. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts +2 -2
  34. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
  35. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
  36. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  37. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
  38. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  39. package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
  40. package/lib/chain/archiveStore/historicalState/worker.js +1 -3
  41. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  42. package/lib/chain/archiveStore/interface.d.ts +1 -0
  43. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  44. package/lib/chain/balancesCache.d.ts +2 -2
  45. package/lib/chain/balancesCache.d.ts.map +1 -1
  46. package/lib/chain/balancesCache.js +4 -4
  47. package/lib/chain/balancesCache.js.map +1 -1
  48. package/lib/chain/blocks/blockInput/types.d.ts +4 -3
  49. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  50. package/lib/chain/blocks/blockInput/types.js +1 -0
  51. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  52. package/lib/chain/blocks/importBlock.d.ts +3 -3
  53. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  54. package/lib/chain/blocks/importBlock.js +39 -23
  55. package/lib/chain/blocks/importBlock.js.map +1 -1
  56. package/lib/chain/blocks/importExecutionPayload.d.ts +50 -0
  57. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -0
  58. package/lib/chain/blocks/importExecutionPayload.js +186 -0
  59. package/lib/chain/blocks/importExecutionPayload.js.map +1 -0
  60. package/lib/chain/blocks/index.d.ts.map +1 -1
  61. package/lib/chain/blocks/index.js +3 -2
  62. package/lib/chain/blocks/index.js.map +1 -1
  63. package/lib/chain/blocks/payloadEnvelopeInput/index.d.ts +3 -0
  64. package/lib/chain/blocks/payloadEnvelopeInput/index.d.ts.map +1 -0
  65. package/lib/chain/blocks/payloadEnvelopeInput/index.js +3 -0
  66. package/lib/chain/blocks/payloadEnvelopeInput/index.js.map +1 -0
  67. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +80 -0
  68. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -0
  69. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +248 -0
  70. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -0
  71. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +29 -0
  72. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -0
  73. package/lib/chain/blocks/payloadEnvelopeInput/types.js +11 -0
  74. package/lib/chain/blocks/payloadEnvelopeInput/types.js.map +1 -0
  75. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +15 -0
  76. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -0
  77. package/lib/chain/blocks/payloadEnvelopeProcessor.js +46 -0
  78. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -0
  79. package/lib/chain/blocks/types.d.ts +28 -15
  80. package/lib/chain/blocks/types.d.ts.map +1 -1
  81. package/lib/chain/blocks/types.js.map +1 -1
  82. package/lib/chain/blocks/utils/checkpoint.d.ts +2 -2
  83. package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -1
  84. package/lib/chain/blocks/utils/checkpoint.js.map +1 -1
  85. package/lib/chain/blocks/verifyBlock.d.ts +2 -2
  86. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  87. package/lib/chain/blocks/verifyBlock.js +4 -4
  88. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  89. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +5 -5
  90. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  91. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +4 -4
  92. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  93. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  94. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  95. package/lib/chain/blocks/verifyBlocksSignatures.js +1 -1
  96. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  97. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -3
  98. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  99. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +3 -3
  100. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  101. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts +12 -0
  102. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.d.ts.map +1 -0
  103. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js +40 -0
  104. package/lib/chain/blocks/writePayloadEnvelopeInputToDb.js.map +1 -0
  105. package/lib/chain/chain.d.ts +19 -14
  106. package/lib/chain/chain.d.ts.map +1 -1
  107. package/lib/chain/chain.js +75 -42
  108. package/lib/chain/chain.js.map +1 -1
  109. package/lib/chain/emitter.d.ts +2 -2
  110. package/lib/chain/emitter.d.ts.map +1 -1
  111. package/lib/chain/errors/blockError.d.ts +4 -4
  112. package/lib/chain/errors/blockError.d.ts.map +1 -1
  113. package/lib/chain/errors/executionPayloadEnvelope.d.ts +12 -2
  114. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  115. package/lib/chain/errors/executionPayloadEnvelope.js +3 -1
  116. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  117. package/lib/chain/forkChoice/index.d.ts +4 -4
  118. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  119. package/lib/chain/forkChoice/index.js +27 -33
  120. package/lib/chain/forkChoice/index.js.map +1 -1
  121. package/lib/chain/initState.d.ts +2 -2
  122. package/lib/chain/initState.d.ts.map +1 -1
  123. package/lib/chain/initState.js +1 -1
  124. package/lib/chain/initState.js.map +1 -1
  125. package/lib/chain/interface.d.ts +17 -15
  126. package/lib/chain/interface.d.ts.map +1 -1
  127. package/lib/chain/lightClient/index.d.ts +2 -2
  128. package/lib/chain/lightClient/index.d.ts.map +1 -1
  129. package/lib/chain/lightClient/index.js +4 -4
  130. package/lib/chain/lightClient/index.js.map +1 -1
  131. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -6
  132. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  133. package/lib/chain/opPools/aggregatedAttestationPool.js +10 -13
  134. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  135. package/lib/chain/opPools/opPool.d.ts +3 -3
  136. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  137. package/lib/chain/opPools/opPool.js +7 -7
  138. package/lib/chain/opPools/opPool.js.map +1 -1
  139. package/lib/chain/opPools/utils.d.ts +2 -2
  140. package/lib/chain/opPools/utils.d.ts.map +1 -1
  141. package/lib/chain/opPools/utils.js +1 -1
  142. package/lib/chain/opPools/utils.js.map +1 -1
  143. package/lib/chain/options.d.ts +1 -0
  144. package/lib/chain/options.d.ts.map +1 -1
  145. package/lib/chain/options.js +1 -0
  146. package/lib/chain/options.js.map +1 -1
  147. package/lib/chain/prepareNextSlot.d.ts +2 -2
  148. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  149. package/lib/chain/prepareNextSlot.js +3 -3
  150. package/lib/chain/prepareNextSlot.js.map +1 -1
  151. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +4 -4
  152. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  153. package/lib/chain/produceBlock/computeNewStateRoot.js +8 -4
  154. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  155. package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -5
  156. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  157. package/lib/chain/produceBlock/produceBlockBody.js +12 -16
  158. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  159. package/lib/chain/regen/interface.d.ts +15 -13
  160. package/lib/chain/regen/interface.d.ts.map +1 -1
  161. package/lib/chain/regen/interface.js +2 -0
  162. package/lib/chain/regen/interface.js.map +1 -1
  163. package/lib/chain/regen/queued.d.ts +14 -14
  164. package/lib/chain/regen/queued.d.ts.map +1 -1
  165. package/lib/chain/regen/queued.js.map +1 -1
  166. package/lib/chain/regen/regen.d.ts +6 -5
  167. package/lib/chain/regen/regen.d.ts.map +1 -1
  168. package/lib/chain/regen/regen.js +6 -6
  169. package/lib/chain/regen/regen.js.map +1 -1
  170. package/lib/chain/seenCache/index.d.ts +1 -1
  171. package/lib/chain/seenCache/index.d.ts.map +1 -1
  172. package/lib/chain/seenCache/index.js +1 -1
  173. package/lib/chain/seenCache/index.js.map +1 -1
  174. package/lib/chain/seenCache/seenGossipBlockInput.js +2 -2
  175. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  176. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +38 -0
  177. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -0
  178. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +76 -0
  179. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -0
  180. package/lib/chain/serializeState.d.ts +2 -2
  181. package/lib/chain/serializeState.d.ts.map +1 -1
  182. package/lib/chain/serializeState.js +1 -1
  183. package/lib/chain/serializeState.js.map +1 -1
  184. package/lib/chain/shufflingCache.d.ts +2 -2
  185. package/lib/chain/shufflingCache.d.ts.map +1 -1
  186. package/lib/chain/shufflingCache.js +3 -4
  187. package/lib/chain/shufflingCache.js.map +1 -1
  188. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +6 -6
  189. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  190. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  191. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +11 -11
  192. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  193. package/lib/chain/stateCache/persistentCheckpointsCache.js +12 -16
  194. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  195. package/lib/chain/stateCache/types.d.ts +14 -14
  196. package/lib/chain/stateCache/types.d.ts.map +1 -1
  197. package/lib/chain/stateCache/types.js.map +1 -1
  198. package/lib/chain/validation/attesterSlashing.js +3 -3
  199. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  200. package/lib/chain/validation/blobSidecar.js +1 -1
  201. package/lib/chain/validation/blobSidecar.js.map +1 -1
  202. package/lib/chain/validation/block.d.ts.map +1 -1
  203. package/lib/chain/validation/block.js +3 -3
  204. package/lib/chain/validation/block.js.map +1 -1
  205. package/lib/chain/validation/blsToExecutionChange.js +2 -2
  206. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  207. package/lib/chain/validation/dataColumnSidecar.js +1 -1
  208. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  209. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  210. package/lib/chain/validation/executionPayloadBid.js +4 -4
  211. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  212. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  213. package/lib/chain/validation/executionPayloadEnvelope.js +29 -19
  214. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  215. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  216. package/lib/chain/validation/payloadAttestationMessage.js +1 -2
  217. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  218. package/lib/chain/validation/proposerSlashing.js +1 -1
  219. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  220. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  221. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  222. package/lib/chain/validation/signatureSets/contributionAndProof.js +1 -1
  223. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  224. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  225. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  226. package/lib/chain/validation/signatureSets/syncCommittee.js +1 -1
  227. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  228. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -2
  229. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  230. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  231. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  232. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  233. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -1
  234. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  235. package/lib/chain/validation/syncCommittee.d.ts +4 -4
  236. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  237. package/lib/chain/validation/syncCommittee.js +13 -12
  238. package/lib/chain/validation/syncCommittee.js.map +1 -1
  239. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  240. package/lib/chain/validation/syncCommitteeContributionAndProof.js +1 -1
  241. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  242. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
  243. package/lib/chain/validation/voluntaryExit.js +3 -3
  244. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  245. package/lib/chain/validatorMonitor.d.ts +5 -4
  246. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  247. package/lib/chain/validatorMonitor.js +12 -7
  248. package/lib/chain/validatorMonitor.js.map +1 -1
  249. package/lib/metrics/metrics/lodestar.d.ts +40 -4
  250. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  251. package/lib/metrics/metrics/lodestar.js +93 -15
  252. package/lib/metrics/metrics/lodestar.js.map +1 -1
  253. package/lib/network/gossip/encoding.d.ts.map +1 -1
  254. package/lib/network/gossip/encoding.js +15 -0
  255. package/lib/network/gossip/encoding.js.map +1 -1
  256. package/lib/network/interface.d.ts +4 -2
  257. package/lib/network/interface.d.ts.map +1 -1
  258. package/lib/network/libp2p/index.d.ts.map +1 -1
  259. package/lib/network/libp2p/index.js +22 -11
  260. package/lib/network/libp2p/index.js.map +1 -1
  261. package/lib/network/network.d.ts +4 -2
  262. package/lib/network/network.d.ts.map +1 -1
  263. package/lib/network/network.js +9 -3
  264. package/lib/network/network.js.map +1 -1
  265. package/lib/network/options.d.ts.map +1 -1
  266. package/lib/network/options.js +7 -2
  267. package/lib/network/options.js.map +1 -1
  268. package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
  269. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  270. package/lib/network/processor/extractSlotRootFns.js +15 -5
  271. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  272. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  273. package/lib/network/processor/gossipHandlers.js +49 -12
  274. package/lib/network/processor/gossipHandlers.js.map +1 -1
  275. package/lib/network/processor/index.d.ts +12 -7
  276. package/lib/network/processor/index.d.ts.map +1 -1
  277. package/lib/network/processor/index.js +99 -78
  278. package/lib/network/processor/index.js.map +1 -1
  279. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  280. package/lib/network/reqresp/ReqRespBeaconNode.js +9 -0
  281. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  282. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +8 -0
  283. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -0
  284. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +69 -0
  285. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -0
  286. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +6 -0
  287. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -0
  288. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +28 -0
  289. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -0
  290. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  291. package/lib/network/reqresp/handlers/index.js +11 -1
  292. package/lib/network/reqresp/handlers/index.js.map +1 -1
  293. package/lib/network/reqresp/protocols.d.ts +2 -0
  294. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  295. package/lib/network/reqresp/protocols.js +10 -0
  296. package/lib/network/reqresp/protocols.js.map +1 -1
  297. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  298. package/lib/network/reqresp/rateLimit.js +8 -0
  299. package/lib/network/reqresp/rateLimit.js.map +1 -1
  300. package/lib/network/reqresp/score.d.ts.map +1 -1
  301. package/lib/network/reqresp/score.js +2 -0
  302. package/lib/network/reqresp/score.js.map +1 -1
  303. package/lib/network/reqresp/types.d.ts +8 -2
  304. package/lib/network/reqresp/types.d.ts.map +1 -1
  305. package/lib/network/reqresp/types.js +7 -1
  306. package/lib/network/reqresp/types.js.map +1 -1
  307. package/lib/node/nodejs.d.ts +2 -2
  308. package/lib/node/nodejs.d.ts.map +1 -1
  309. package/lib/node/nodejs.js +1 -4
  310. package/lib/node/nodejs.js.map +1 -1
  311. package/lib/node/notifier.d.ts.map +1 -1
  312. package/lib/node/notifier.js +3 -3
  313. package/lib/node/notifier.js.map +1 -1
  314. package/lib/sync/backfill/backfill.d.ts +2 -2
  315. package/lib/sync/backfill/backfill.d.ts.map +1 -1
  316. package/lib/sync/backfill/backfill.js +2 -2
  317. package/lib/sync/backfill/backfill.js.map +1 -1
  318. package/lib/sync/unknownBlock.d.ts +3 -9
  319. package/lib/sync/unknownBlock.d.ts.map +1 -1
  320. package/lib/sync/unknownBlock.js +8 -41
  321. package/lib/sync/unknownBlock.js.map +1 -1
  322. package/lib/util/sszBytes.d.ts +4 -1
  323. package/lib/util/sszBytes.d.ts.map +1 -1
  324. package/lib/util/sszBytes.js +69 -12
  325. package/lib/util/sszBytes.js.map +1 -1
  326. package/lib/util/types.d.ts +2 -0
  327. package/lib/util/types.d.ts.map +1 -1
  328. package/lib/util/types.js +1 -0
  329. package/lib/util/types.js.map +1 -1
  330. package/package.json +16 -16
  331. package/src/api/impl/beacon/blocks/index.ts +52 -19
  332. package/src/api/impl/beacon/pool/index.ts +1 -1
  333. package/src/api/impl/beacon/state/index.ts +29 -41
  334. package/src/api/impl/beacon/state/utils.ts +11 -25
  335. package/src/api/impl/lodestar/index.ts +4 -8
  336. package/src/api/impl/proof/index.ts +2 -9
  337. package/src/api/impl/validator/index.ts +29 -41
  338. package/src/api/impl/validator/utils.ts +4 -7
  339. package/src/chain/archiveStore/archiveStore.ts +1 -0
  340. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -39
  341. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +2 -1
  342. package/src/chain/archiveStore/historicalState/types.ts +2 -0
  343. package/src/chain/archiveStore/historicalState/worker.ts +1 -4
  344. package/src/chain/archiveStore/interface.ts +1 -0
  345. package/src/chain/balancesCache.ts +5 -11
  346. package/src/chain/blocks/blockInput/types.ts +4 -3
  347. package/src/chain/blocks/importBlock.ts +59 -27
  348. package/src/chain/blocks/importExecutionPayload.ts +267 -0
  349. package/src/chain/blocks/index.ts +3 -2
  350. package/src/chain/blocks/payloadEnvelopeInput/index.ts +2 -0
  351. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +336 -0
  352. package/src/chain/blocks/payloadEnvelopeInput/types.ts +33 -0
  353. package/src/chain/blocks/payloadEnvelopeProcessor.ts +61 -0
  354. package/src/chain/blocks/types.ts +34 -15
  355. package/src/chain/blocks/utils/checkpoint.ts +2 -2
  356. package/src/chain/blocks/verifyBlock.ts +5 -10
  357. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -14
  358. package/src/chain/blocks/verifyBlocksSignatures.ts +3 -3
  359. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
  360. package/src/chain/blocks/writePayloadEnvelopeInputToDb.ts +55 -0
  361. package/src/chain/chain.ts +112 -70
  362. package/src/chain/emitter.ts +2 -2
  363. package/src/chain/errors/blockError.ts +4 -4
  364. package/src/chain/errors/executionPayloadEnvelope.ts +6 -2
  365. package/src/chain/forkChoice/index.ts +33 -52
  366. package/src/chain/initState.ts +7 -2
  367. package/src/chain/interface.ts +18 -16
  368. package/src/chain/lightClient/index.ts +9 -22
  369. package/src/chain/opPools/aggregatedAttestationPool.ts +15 -21
  370. package/src/chain/opPools/opPool.ts +13 -14
  371. package/src/chain/opPools/utils.ts +3 -3
  372. package/src/chain/options.ts +2 -0
  373. package/src/chain/prepareNextSlot.ts +6 -8
  374. package/src/chain/produceBlock/computeNewStateRoot.ts +11 -10
  375. package/src/chain/produceBlock/produceBlockBody.ts +22 -49
  376. package/src/chain/regen/interface.ts +15 -17
  377. package/src/chain/regen/queued.ts +16 -20
  378. package/src/chain/regen/regen.ts +16 -17
  379. package/src/chain/seenCache/index.ts +1 -1
  380. package/src/chain/seenCache/seenGossipBlockInput.ts +2 -2
  381. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +106 -0
  382. package/src/chain/serializeState.ts +3 -3
  383. package/src/chain/shufflingCache.ts +5 -7
  384. package/src/chain/stateCache/fifoBlockStateCache.ts +7 -7
  385. package/src/chain/stateCache/persistentCheckpointsCache.ts +27 -42
  386. package/src/chain/stateCache/types.ts +14 -18
  387. package/src/chain/validation/attesterSlashing.ts +3 -3
  388. package/src/chain/validation/blobSidecar.ts +1 -1
  389. package/src/chain/validation/block.ts +2 -4
  390. package/src/chain/validation/blsToExecutionChange.ts +2 -2
  391. package/src/chain/validation/dataColumnSidecar.ts +1 -1
  392. package/src/chain/validation/executionPayloadBid.ts +3 -7
  393. package/src/chain/validation/executionPayloadEnvelope.ts +36 -29
  394. package/src/chain/validation/payloadAttestationMessage.ts +2 -4
  395. package/src/chain/validation/proposerSlashing.ts +1 -1
  396. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -7
  397. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -7
  398. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -2
  399. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -7
  400. package/src/chain/validation/syncCommittee.ts +21 -20
  401. package/src/chain/validation/syncCommitteeContributionAndProof.ts +5 -10
  402. package/src/chain/validation/voluntaryExit.ts +3 -8
  403. package/src/chain/validatorMonitor.ts +22 -11
  404. package/src/metrics/metrics/lodestar.ts +100 -19
  405. package/src/network/gossip/encoding.ts +16 -0
  406. package/src/network/interface.ts +15 -2
  407. package/src/network/libp2p/index.ts +24 -13
  408. package/src/network/network.ts +32 -4
  409. package/src/network/options.ts +7 -2
  410. package/src/network/processor/extractSlotRootFns.ts +19 -6
  411. package/src/network/processor/gossipHandlers.ts +56 -11
  412. package/src/network/processor/index.ts +110 -89
  413. package/src/network/reqresp/ReqRespBeaconNode.ts +13 -0
  414. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +94 -0
  415. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +43 -0
  416. package/src/network/reqresp/handlers/index.ts +12 -0
  417. package/src/network/reqresp/protocols.ts +12 -0
  418. package/src/network/reqresp/rateLimit.ts +18 -0
  419. package/src/network/reqresp/score.ts +2 -0
  420. package/src/network/reqresp/types.ts +13 -0
  421. package/src/node/nodejs.ts +3 -5
  422. package/src/node/notifier.ts +4 -10
  423. package/src/sync/backfill/backfill.ts +3 -3
  424. package/src/sync/unknownBlock.ts +10 -50
  425. package/src/util/sszBytes.ts +90 -10
  426. package/src/util/types.ts +6 -0
  427. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +0 -15
  428. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +0 -1
  429. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +0 -28
  430. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +0 -1
  431. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +0 -34
@@ -3,6 +3,7 @@ import {NotReorgedReason} from "@lodestar/fork-choice";
3
3
  import {ArchiveStoreTask} from "../../chain/archiveStore/archiveStore.js";
4
4
  import {FrequencyStateArchiveStep} from "../../chain/archiveStore/strategies/frequencyStateArchiveStrategy.js";
5
5
  import {BlockInputSource} from "../../chain/blocks/blockInput/index.js";
6
+ import {PayloadEnvelopeInputSource} from "../../chain/blocks/payloadEnvelopeInput/index.js";
6
7
  import {JobQueueItemType} from "../../chain/bls/index.js";
7
8
  import {AttestationErrorCode, BlockErrorCode} from "../../chain/errors/index.js";
8
9
  import {
@@ -237,6 +238,56 @@ export function createLodestarMetrics(
237
238
  }),
238
239
  },
239
240
 
241
+ payloadEnvelopeProcessorQueue: {
242
+ length: register.gauge({
243
+ name: "lodestar_payload_envelope_processor_queue_length",
244
+ help: "Count of total payload envelope processor queue length",
245
+ }),
246
+ droppedJobs: register.gauge({
247
+ name: "lodestar_payload_envelope_processor_queue_dropped_jobs_total",
248
+ help: "Count of total payload envelope processor queue dropped jobs",
249
+ }),
250
+ jobTime: register.histogram({
251
+ name: "lodestar_payload_envelope_processor_queue_job_time_seconds",
252
+ help: "Time to process payload envelope processor queue job in seconds",
253
+ buckets: [0.01, 0.1, 1, 4, 12],
254
+ }),
255
+ jobWaitTime: register.histogram({
256
+ name: "lodestar_payload_envelope_processor_queue_job_wait_time_seconds",
257
+ help: "Time from job added to the payload envelope processor queue to starting in seconds",
258
+ buckets: [0.01, 0.1, 1, 4, 12],
259
+ }),
260
+ concurrency: register.gauge({
261
+ name: "lodestar_payload_envelope_processor_queue_concurrency",
262
+ help: "Current concurrency of payload envelope processor queue",
263
+ }),
264
+ },
265
+
266
+ unfinalizedPayloadEnvelopeWritesQueue: {
267
+ length: register.gauge({
268
+ name: "lodestar_unfinalized_payload_envelope_writes_queue_length",
269
+ help: "Count of total unfinalized payload envelope writes queue length",
270
+ }),
271
+ droppedJobs: register.gauge({
272
+ name: "lodestar_unfinalized_payload_envelope_writes_queue_dropped_jobs_total",
273
+ help: "Count of total unfinalized payload envelope writes queue dropped jobs",
274
+ }),
275
+ jobTime: register.histogram({
276
+ name: "lodestar_unfinalized_payload_envelope_writes_queue_job_time_seconds",
277
+ help: "Time to process unfinalized payload envelope writes queue job in seconds",
278
+ buckets: [0.01, 0.1, 1, 4, 12],
279
+ }),
280
+ jobWaitTime: register.histogram({
281
+ name: "lodestar_unfinalized_payload_envelope_writes_queue_job_wait_time_seconds",
282
+ help: "Time from job added to the unfinalized payload envelope writes queue to starting in seconds",
283
+ buckets: [0.01, 0.1, 1, 4, 12],
284
+ }),
285
+ concurrency: register.gauge({
286
+ name: "lodestar_unfinalized_payload_envelope_writes_queue_concurrency",
287
+ help: "Current concurrency of unfinalized payload envelope writes queue",
288
+ }),
289
+ },
290
+
240
291
  engineHttpProcessorQueue: {
241
292
  length: register.gauge({
242
293
  name: "lodestar_engine_http_processor_queue_length",
@@ -925,6 +976,18 @@ export function createLodestarMetrics(
925
976
  labelNames: ["reason"],
926
977
  }),
927
978
  },
979
+ importPayload: {
980
+ bySource: register.gauge<{source: PayloadEnvelopeInputSource}>({
981
+ name: "lodestar_import_payload_by_source_total",
982
+ help: "Total number of imported execution payload envelopes by source",
983
+ labelNames: ["source"],
984
+ }),
985
+ columnsBySource: register.gauge<{source: PayloadEnvelopeInputSource}>({
986
+ name: "lodestar_import_payload_columns_by_source_total",
987
+ help: "Total number of payload-attached columns (sampled columns for Gloas) by source",
988
+ labelNames: ["source"],
989
+ }),
990
+ },
928
991
  engineNotifyNewPayloadResult: register.gauge<{result: ExecutionPayloadStatus}>({
929
992
  name: "lodestar_execution_engine_notify_new_payload_result_total",
930
993
  help: "The total result of calling notifyNewPayload execution engine api",
@@ -1495,6 +1558,20 @@ export function createLodestarMetrics(
1495
1558
  help: "Number of BlockInputs created via a data column being seen first",
1496
1559
  }),
1497
1560
  },
1561
+ payloadEnvelopeInput: {
1562
+ count: register.gauge({
1563
+ name: "lodestar_seen_payload_envelope_input_cache_size",
1564
+ help: "Number of cached PayloadEnvelopeInputs",
1565
+ }),
1566
+ serializedObjectRefs: register.gauge({
1567
+ name: "lodestar_seen_payload_envelope_input_cache_serialized_object_refs",
1568
+ help: "Number of serialized-cache object refs retained by cached PayloadEnvelopeInputs",
1569
+ }),
1570
+ created: register.counter({
1571
+ name: "lodestar_seen_payload_envelope_input_cache_items_created_total",
1572
+ help: "Number of PayloadEnvelopeInputs created",
1573
+ }),
1574
+ },
1498
1575
  },
1499
1576
 
1500
1577
  processFinalizedCheckpoint: {
@@ -1635,33 +1712,37 @@ export function createLodestarMetrics(
1635
1712
  }),
1636
1713
  },
1637
1714
 
1638
- // reprocess gossip attestations
1639
- reprocessGossipAttestations: {
1640
- total: register.gauge({
1641
- name: "lodestar_reprocess_gossip_attestations_total",
1642
- help: "Total number of gossip attestations waiting to reprocess",
1715
+ // some gossip messages need to wait for block to be processed before they can be processed
1716
+ awaitingBlockGossipMessages: {
1717
+ queue: register.gauge<{topic: GossipType}>({
1718
+ name: "lodestar_awaiting_block_gossip_messages_total",
1719
+ help: "Total number of gossip messages waiting for block to be processed",
1720
+ labelNames: ["topic"],
1643
1721
  }),
1644
1722
  countPerSlot: register.gauge({
1645
- name: "lodestar_reprocess_gossip_attestations_per_slot_total",
1646
- help: "Total number of gossip attestations waiting to reprocess pet slot",
1723
+ name: "lodestar_awaiting_block_gossip_messages_per_slot_total",
1724
+ help: "Total number of gossip messages waiting for block to be processed per slot",
1647
1725
  }),
1648
- resolve: register.gauge({
1649
- name: "lodestar_reprocess_gossip_attestations_resolve_total",
1650
- help: "Total number of gossip attestations are reprocessed",
1726
+ resolve: register.gauge<{topic: GossipType}>({
1727
+ name: "lodestar_awaiting_block_gossip_messages_resolve_total",
1728
+ help: "Total number of gossip messages are reprocessed",
1729
+ labelNames: ["topic"],
1651
1730
  }),
1652
- waitSecBeforeResolve: register.gauge({
1653
- name: "lodestar_reprocess_gossip_attestations_wait_time_resolve_seconds",
1731
+ waitSecBeforeResolve: register.gauge<{topic: GossipType}>({
1732
+ name: "lodestar_awaiting_block_gossip_messages_wait_time_resolve_seconds",
1654
1733
  help: "Time to wait for unknown block in seconds",
1734
+ labelNames: ["topic"],
1655
1735
  }),
1656
- reject: register.gauge<{reason: ReprocessRejectReason}>({
1657
- name: "lodestar_reprocess_gossip_attestations_reject_total",
1658
- help: "Total number of attestations are rejected to reprocess",
1659
- labelNames: ["reason"],
1736
+ // having 2 labels here is not great for performance, however it's rarely happening and having the reason label is important for debugging
1737
+ reject: register.gauge<{reason: ReprocessRejectReason; topic: GossipType}>({
1738
+ name: "lodestar_awaiting_block_gossip_messages_reject_total",
1739
+ help: "Total number of gossip messages are rejected to reprocess",
1740
+ labelNames: ["reason", "topic"],
1660
1741
  }),
1661
- waitSecBeforeReject: register.gauge<{reason: ReprocessRejectReason}>({
1662
- name: "lodestar_reprocess_gossip_attestations_wait_time_reject_seconds",
1742
+ waitSecBeforeReject: register.gauge<{reason: ReprocessRejectReason; topic: GossipType}>({
1743
+ name: "lodestar_awaiting_block_gossip_messages_wait_time_reject_seconds",
1663
1744
  help: "Time to wait for unknown block before being rejected",
1664
- labelNames: ["reason"],
1745
+ labelNames: ["reason", "topic"],
1665
1746
  }),
1666
1747
  },
1667
1748
 
@@ -24,12 +24,28 @@ const decoder = new snappyWasm.Decoder();
24
24
  // Shared buffer to convert msgId to string
25
25
  const sharedMsgIdBuf = Buffer.alloc(20);
26
26
 
27
+ // Cache topic -> seed to avoid per-message allocations on the hot path.
28
+ // Topics are a fixed set per fork (changes only at fork boundaries).
29
+ const topicSeedCache = new Map<string, bigint>();
30
+
27
31
  /**
28
32
  * The function used to generate a gossipsub message id
29
33
  * We use the first 8 bytes of SHA256(data) for content addressing
30
34
  */
31
35
  export function fastMsgIdFn(rpcMsg: RPC.Message): string {
32
36
  if (rpcMsg.data) {
37
+ if (rpcMsg.topic) {
38
+ // Use topic-derived seed to prevent cross-topic deduplication of identical messages.
39
+ // SyncCommitteeMessages are published to multiple sync_committee_{subnet} topics with
40
+ // identical data, so hashing only the data incorrectly deduplicates across subnets.
41
+ // See https://github.com/ChainSafe/lodestar/issues/8294
42
+ let topicSeed = topicSeedCache.get(rpcMsg.topic);
43
+ if (topicSeed === undefined) {
44
+ topicSeed = xxhash.h64Raw(Buffer.from(rpcMsg.topic), h64Seed);
45
+ topicSeedCache.set(rpcMsg.topic, topicSeed);
46
+ }
47
+ return xxhash.h64Raw(rpcMsg.data, topicSeed).toString(16);
48
+ }
33
49
  return xxhash.h64Raw(rpcMsg.data, h64Seed).toString(16);
34
50
  }
35
51
  return "0000000000000000";
@@ -38,7 +38,12 @@ import {
38
38
  import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
39
39
  import {CustodyConfig} from "../util/dataColumns.js";
40
40
  import {PeerIdStr} from "../util/peerId.js";
41
- import {BeaconBlocksByRootRequest, BlobSidecarsByRootRequest, DataColumnSidecarsByRootRequest} from "../util/types.js";
41
+ import {
42
+ BeaconBlocksByRootRequest,
43
+ BlobSidecarsByRootRequest,
44
+ DataColumnSidecarsByRootRequest,
45
+ ExecutionPayloadEnvelopesByRootRequest,
46
+ } from "../util/types.js";
42
47
  import {INetworkCorePublic} from "./core/types.js";
43
48
  import {INetworkEventBus} from "./events.js";
44
49
  import {GossipType} from "./gossip/interface.js";
@@ -68,7 +73,7 @@ export interface INetwork extends INetworkCorePublic {
68
73
  reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
69
74
  shouldAggregate(subnet: SubnetID, slot: Slot): boolean;
70
75
  reStatusPeers(peers: PeerIdStr[]): Promise<void>;
71
- searchUnknownSlotRoot(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
76
+ searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
72
77
  // ReqResp
73
78
  sendBeaconBlocksByRange(peerId: PeerIdStr, request: phase0.BeaconBlocksByRangeRequest): Promise<SignedBeaconBlock[]>;
74
79
  sendBeaconBlocksByRoot(peerId: PeerIdStr, request: BeaconBlocksByRootRequest): Promise<SignedBeaconBlock[]>;
@@ -82,6 +87,14 @@ export interface INetwork extends INetworkCorePublic {
82
87
  peerId: PeerIdStr,
83
88
  request: DataColumnSidecarsByRootRequest
84
89
  ): Promise<fulu.DataColumnSidecar[]>;
90
+ sendExecutionPayloadEnvelopesByRange(
91
+ peerId: PeerIdStr,
92
+ request: gloas.ExecutionPayloadEnvelopesByRangeRequest
93
+ ): Promise<gloas.SignedExecutionPayloadEnvelope[]>;
94
+ sendExecutionPayloadEnvelopesByRoot(
95
+ peerId: PeerIdStr,
96
+ request: ExecutionPayloadEnvelopesByRootRequest
97
+ ): Promise<gloas.SignedExecutionPayloadEnvelope[]>;
85
98
 
86
99
  // Gossip
87
100
  publishBeaconBlock(signedBlock: SignedBeaconBlock): Promise<number>;
@@ -44,6 +44,8 @@ export async function createNodeJsLibp2p(
44
44
  ): Promise<Libp2p> {
45
45
  const localMultiaddrs = networkOpts.localMultiaddrs || defaultNetworkOptions.localMultiaddrs;
46
46
  const disconnectThreshold = networkOpts.disconnectThreshold ?? defaultNetworkOptions.disconnectThreshold;
47
+ const tcpEnabled = networkOpts.tcp ?? defaultNetworkOptions.tcp;
48
+ const quicEnabled = networkOpts.quic ?? defaultNetworkOptions.quic;
47
49
  const {peerStoreDir, disablePeerDiscovery} = nodeJsLibp2pOpts;
48
50
 
49
51
  let datastore: undefined | Eth2PeerDataStore = undefined;
@@ -58,7 +60,7 @@ export async function createNodeJsLibp2p(
58
60
  ...(networkOpts.bootMultiaddrs ?? defaultNetworkOptions.bootMultiaddrs ?? []),
59
61
  // Append discv5.bootEnrs to bootMultiaddrs if requested
60
62
  ...(networkOpts.connectToDiscv5Bootnodes
61
- ? await getDiscv5Multiaddrs(networkOpts.discv5?.bootEnrs ?? [], networkOpts.quic)
63
+ ? await getDiscv5Multiaddrs(networkOpts.discv5?.bootEnrs ?? [], quicEnabled)
62
64
  : []),
63
65
  ];
64
66
 
@@ -71,7 +73,7 @@ export async function createNodeJsLibp2p(
71
73
  }
72
74
  }
73
75
  const transports: Libp2pInit["transports"] = [];
74
- if (networkOpts.tcp ?? true) {
76
+ if (tcpEnabled) {
75
77
  transports.unshift(
76
78
  tcp({
77
79
  // Reject connections when the server's connection count gets high
@@ -87,17 +89,26 @@ export async function createNodeJsLibp2p(
87
89
  })
88
90
  );
89
91
  }
90
- if (networkOpts.quic) {
91
- transports.unshift(
92
- quic({
93
- handshakeTimeout: 5_000,
94
- maxIdleTimeout: 10_000,
95
- keepAliveInterval: 5_000,
96
- maxConcurrentStreamLimit: 256,
97
- maxStreamData: 10_000_000,
98
- maxConnectionData: 15_000_000,
99
- })
100
- );
92
+ if (quicEnabled) {
93
+ const quicMultiaddrs = localMultiaddrs.filter((ma) => ma.includes("/quic-v1"));
94
+ const hasIpv4Quic = quicMultiaddrs.some((ma) => ma.includes("/ip4/"));
95
+ const hasIpv6Quic = quicMultiaddrs.some((ma) => ma.includes("/ip6/"));
96
+ // Only add QUIC transport if at least one QUIC listen address is configured,
97
+ // otherwise the transport constructor will throw
98
+ if (hasIpv4Quic || hasIpv6Quic) {
99
+ transports.unshift(
100
+ quic({
101
+ handshakeTimeout: 5_000,
102
+ maxIdleTimeout: 10_000,
103
+ keepAliveInterval: 5_000,
104
+ maxConcurrentStreamLimit: 256,
105
+ maxStreamData: 10_000_000,
106
+ maxConnectionData: 15_000_000,
107
+ ipv4: hasIpv4Quic,
108
+ ipv6: hasIpv6Quic,
109
+ })
110
+ );
111
+ }
101
112
  }
102
113
 
103
114
  const noiseCrypto = {
@@ -40,7 +40,12 @@ import {IClock} from "../util/clock.js";
40
40
  import {CustodyConfig} from "../util/dataColumns.js";
41
41
  import {PeerIdStr, peerIdToString} from "../util/peerId.js";
42
42
  import {promiseAllMaybeAsync} from "../util/promises.js";
43
- import {BeaconBlocksByRootRequest, BlobSidecarsByRootRequest, DataColumnSidecarsByRootRequest} from "../util/types.js";
43
+ import {
44
+ BeaconBlocksByRootRequest,
45
+ BlobSidecarsByRootRequest,
46
+ DataColumnSidecarsByRootRequest,
47
+ ExecutionPayloadEnvelopesByRootRequest,
48
+ } from "../util/types.js";
44
49
  import {INetworkCore, NetworkCore, WorkerNetworkCore} from "./core/index.js";
45
50
  import {INetworkEventBus, NetworkEvent, NetworkEventBus, NetworkEventData} from "./events.js";
46
51
  import {getActiveForkBoundaries} from "./forks.js";
@@ -161,7 +166,7 @@ export class Network implements INetwork {
161
166
  const events = new NetworkEventBus();
162
167
  const aggregatorTracker = new AggregatorTracker();
163
168
 
164
- const activeValidatorCount = chain.getHeadState().epochCtx.currentShuffling.activeIndices.length;
169
+ const activeValidatorCount = chain.getHeadState().activeValidatorCount;
165
170
  const initialStatus = chain.getStatus();
166
171
  const initialCustodyGroupCount = chain.custodyConfig.targetCustodyGroupCount;
167
172
 
@@ -277,8 +282,8 @@ export class Network implements INetwork {
277
282
  return this.core.reStatusPeers(peers);
278
283
  }
279
284
 
280
- searchUnknownSlotRoot(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
281
- this.networkProcessor.searchUnknownSlotRoot(slotRoot, source, peer);
285
+ searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void {
286
+ this.networkProcessor.searchUnknownBlock(slotRoot, source, peer);
282
287
  }
283
288
 
284
289
  async reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): Promise<void> {
@@ -636,6 +641,29 @@ export class Network implements INetwork {
636
641
  );
637
642
  }
638
643
 
644
+ async sendExecutionPayloadEnvelopesByRange(
645
+ peerId: PeerIdStr,
646
+ request: gloas.ExecutionPayloadEnvelopesByRangeRequest
647
+ ): Promise<gloas.SignedExecutionPayloadEnvelope[]> {
648
+ return collectMaxResponseTyped(
649
+ this.sendReqRespRequest(peerId, ReqRespMethod.ExecutionPayloadEnvelopesByRange, [Version.V1], request),
650
+ request.count,
651
+ responseSszTypeByMethod[ReqRespMethod.ExecutionPayloadEnvelopesByRange]
652
+ );
653
+ }
654
+
655
+ async sendExecutionPayloadEnvelopesByRoot(
656
+ peerId: PeerIdStr,
657
+ request: ExecutionPayloadEnvelopesByRootRequest
658
+ ): Promise<gloas.SignedExecutionPayloadEnvelope[]> {
659
+ return collectMaxResponseTyped(
660
+ this.sendReqRespRequest(peerId, ReqRespMethod.ExecutionPayloadEnvelopesByRoot, [Version.V1], request),
661
+ request.length,
662
+ responseSszTypeByMethod[ReqRespMethod.ExecutionPayloadEnvelopesByRoot],
663
+ this.chain.serializedCache
664
+ );
665
+ }
666
+
639
667
  private sendReqRespRequest<Req>(
640
668
  peerId: PeerIdStr,
641
669
  method: ReqRespMethod,
@@ -55,7 +55,12 @@ export const defaultNetworkOptions: NetworkOptions = {
55
55
  maxPeers: 210, // Allow some room above targetPeers for new inbound peers
56
56
  targetPeers: 200,
57
57
  // In CLI usage this is typically overridden; when unset it serves as a fallback default (e.g. programmatic usage/tests)
58
- localMultiaddrs: ["/ip4/0.0.0.0/tcp/9000", "/ip6/::/tcp/9000"],
58
+ localMultiaddrs: [
59
+ "/ip4/0.0.0.0/udp/9001/quic-v1",
60
+ "/ip6/::/udp/9001/quic-v1",
61
+ "/ip4/0.0.0.0/tcp/9000",
62
+ "/ip6/::/tcp/9000",
63
+ ],
59
64
  bootMultiaddrs: [],
60
65
  /** disabled by default */
61
66
  discv5: null,
@@ -69,7 +74,7 @@ export const defaultNetworkOptions: NetworkOptions = {
69
74
  slotsToSubscribeBeforeAggregatorDuty: 2,
70
75
  // This will enable the light client server by default
71
76
  disableLightClientServer: false,
72
- quic: false,
77
+ quic: true,
73
78
  tcp: true,
74
79
  // specific option for fulu
75
80
  // - this is the same to TARGET_SUBNET_PEERS
@@ -1,11 +1,14 @@
1
- import {ForkName} from "@lodestar/params";
1
+ import {ForkName, isForkPostGloas} from "@lodestar/params";
2
2
  import {SlotOptionalRoot, SlotRootHex} from "@lodestar/types";
3
3
  import {
4
+ getBeaconBlockRootFromDataColumnSidecarSerialized,
5
+ getBeaconBlockRootFromExecutionPayloadEnvelopeSerialized,
4
6
  getBlockRootFromBeaconAttestationSerialized,
5
7
  getBlockRootFromSignedAggregateAndProofSerialized,
6
8
  getSlotFromBeaconAttestationSerialized,
7
9
  getSlotFromBlobSidecarSerialized,
8
10
  getSlotFromDataColumnSidecarSerialized,
11
+ getSlotFromExecutionPayloadEnvelopeSerialized,
9
12
  getSlotFromSignedAggregateAndProofSerialized,
10
13
  getSlotFromSignedBeaconBlockSerialized,
11
14
  } from "../../util/sszBytes.js";
@@ -14,7 +17,7 @@ import {ExtractSlotRootFns} from "./types.js";
14
17
 
15
18
  /**
16
19
  * Extract the slot and block root of a gossip message form serialized data.
17
- * Only applicable for beacon_attestation and beacon_aggregate_and_proof topics.
20
+ * Not applicable for all topics.
18
21
  */
19
22
  export function createExtractBlockSlotRootFns(): ExtractSlotRootFns {
20
23
  return {
@@ -52,13 +55,23 @@ export function createExtractBlockSlotRootFns(): ExtractSlotRootFns {
52
55
  }
53
56
  return {slot};
54
57
  },
55
- [GossipType.data_column_sidecar]: (data: Uint8Array): SlotOptionalRoot | null => {
56
- const slot = getSlotFromDataColumnSidecarSerialized(data);
57
-
58
+ [GossipType.data_column_sidecar]: (data: Uint8Array, fork: ForkName): SlotOptionalRoot | null => {
59
+ const slot = getSlotFromDataColumnSidecarSerialized(data, fork);
58
60
  if (slot === null) {
59
61
  return null;
60
62
  }
61
- return {slot};
63
+
64
+ const root = isForkPostGloas(fork) ? getBeaconBlockRootFromDataColumnSidecarSerialized(data) : null;
65
+ return root !== null ? {slot, root} : {slot};
66
+ },
67
+ [GossipType.execution_payload]: (data: Uint8Array): SlotRootHex | null => {
68
+ const slot = getSlotFromExecutionPayloadEnvelopeSerialized(data);
69
+ const root = getBeaconBlockRootFromExecutionPayloadEnvelopeSerialized(data);
70
+
71
+ if (slot === null || root === null) {
72
+ return null;
73
+ }
74
+ return {slot, root};
62
75
  },
63
76
  };
64
77
  }
@@ -30,6 +30,7 @@ import {
30
30
  IBlockInput,
31
31
  isBlockInputColumns,
32
32
  } from "../../chain/blocks/blockInput/index.js";
33
+ import {PayloadEnvelopeInputSource} from "../../chain/blocks/payloadEnvelopeInput/index.js";
33
34
  import {BlobSidecarValidation} from "../../chain/blocks/types.js";
34
35
  import {ChainEvent} from "../../chain/emitter.js";
35
36
  import {
@@ -42,6 +43,8 @@ import {
42
43
  BlockGossipError,
43
44
  DataColumnSidecarErrorCode,
44
45
  DataColumnSidecarGossipError,
46
+ ExecutionPayloadEnvelopeError,
47
+ ExecutionPayloadEnvelopeErrorCode,
45
48
  GossipAction,
46
49
  GossipActionError,
47
50
  SyncCommitteeError,
@@ -616,6 +619,13 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
616
619
  });
617
620
  });
618
621
  }
622
+
623
+ // TODO GLOAS: In Gloas, also add column to PayloadEnvelopeInput and notify the payload processor:
624
+ // const payloadInput = chain.seenPayloadEnvelopeInput.get(blockRootHex);
625
+ // if (payloadInput) {
626
+ // payloadInput.addColumn({columnSidecar, source: BlockInputSource.gossip, seenTimestampSec, peerIdStr});
627
+ // chain.processExecutionPayload(payloadInput, {validSignature: true});
628
+ // }
619
629
  },
620
630
 
621
631
  [GossipType.beacon_aggregate_and_proof]: async ({
@@ -767,9 +777,9 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
767
777
  const {serializedData} = gossipData;
768
778
  const syncCommittee = sszDeserialize(topic, serializedData);
769
779
  const {subnet} = topic;
770
- let indexInSubcommittee = 0;
780
+ let indicesInSubcommittee: number[] = [0];
771
781
  try {
772
- indexInSubcommittee = (await validateGossipSyncCommittee(chain, syncCommittee, subnet)).indexInSubcommittee;
782
+ indicesInSubcommittee = (await validateGossipSyncCommittee(chain, syncCommittee, subnet)).indicesInSubcommittee;
773
783
  } catch (e) {
774
784
  if (e instanceof SyncCommitteeError && e.action === GossipAction.REJECT) {
775
785
  chain.persistInvalidSszValue(ssz.altair.SyncCommitteeMessage, syncCommittee, "gossip_reject");
@@ -777,11 +787,12 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
777
787
  throw e;
778
788
  }
779
789
 
780
- // Handler
781
-
790
+ // Handler — add for ALL positions this validator holds in the subcommittee
782
791
  try {
783
- const insertOutcome = chain.syncCommitteeMessagePool.add(subnet, syncCommittee, indexInSubcommittee);
784
- metrics?.opPool.syncCommitteeMessagePoolInsertOutcome.inc({insertOutcome});
792
+ for (const indexInSubcommittee of indicesInSubcommittee) {
793
+ const insertOutcome = chain.syncCommitteeMessagePool.add(subnet, syncCommittee, indexInSubcommittee);
794
+ metrics?.opPool.syncCommitteeMessagePoolInsertOutcome.inc({insertOutcome});
795
+ }
785
796
  } catch (e) {
786
797
  logger.debug("Error adding to syncCommittee pool", {subnet}, e as Error);
787
798
  }
@@ -826,17 +837,51 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
826
837
  [GossipType.execution_payload]: async ({
827
838
  gossipData,
828
839
  topic,
840
+ peerIdStr,
829
841
  seenTimestampSec,
830
842
  }: GossipHandlerParamGeneric<GossipType.execution_payload>) => {
831
843
  const {serializedData} = gossipData;
832
- const executionPayloadEnvelope = sszDeserialize(topic, serializedData);
833
- await validateGossipExecutionPayloadEnvelope(chain, executionPayloadEnvelope);
844
+ const signedEnvelope = sszDeserialize(topic, serializedData);
845
+ const envelope = signedEnvelope.message;
846
+ // TODO GLOAS: handle BLOCK_ROOT_UNKNOWN error to trigger sync
847
+ await validateGossipExecutionPayloadEnvelope(chain, signedEnvelope);
834
848
 
835
- const slot = executionPayloadEnvelope.message.slot;
849
+ const slot = envelope.slot;
836
850
  const delaySec = seenTimestampSec - computeTimeAtSlot(config, slot, chain.genesisTime);
837
851
  metrics?.gossipExecutionPayloadEnvelope.elapsedTimeTillReceived.observe({source: OpSource.gossip}, delaySec);
852
+ chain.validatorMonitor?.registerExecutionPayloadEnvelope(OpSource.gossip, delaySec, signedEnvelope);
853
+
854
+ const blockRootHex = toRootHex(envelope.beaconBlockRoot);
855
+ const payloadInput = chain.seenPayloadEnvelopeInputCache.get(blockRootHex);
856
+
857
+ if (!payloadInput) {
858
+ // This shouldn't happen because beacon block should have been imported and thus payload input should have been created.
859
+ throw new ExecutionPayloadEnvelopeError(GossipAction.IGNORE, {
860
+ code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING,
861
+ blockRoot: blockRootHex,
862
+ });
863
+ }
838
864
 
839
- // TODO GLOAS: Handle valid envelope. Need an import flow that calls `processExecutionPayloadEnvelope` and fork choice
865
+ chain.serializedCache.set(signedEnvelope, serializedData);
866
+
867
+ payloadInput.addPayloadEnvelope({
868
+ envelope: signedEnvelope,
869
+ source: PayloadEnvelopeInputSource.gossip,
870
+ seenTimestampSec,
871
+ peerIdStr,
872
+ });
873
+
874
+ chain.emitter.emit(routes.events.EventType.executionPayloadGossip, {
875
+ slot,
876
+ builderIndex: envelope.builderIndex,
877
+ blockHash: toRootHex(envelope.payload.blockHash),
878
+ blockRoot: blockRootHex,
879
+ stateRoot: toRootHex(envelope.stateRoot),
880
+ });
881
+
882
+ chain.processExecutionPayload(payloadInput, {validSignature: true}).catch((e) => {
883
+ chain.logger.debug("Error processing execution payload from gossip", {slot, root: blockRootHex}, e as Error);
884
+ });
840
885
  },
841
886
  [GossipType.payload_attestation_message]: async ({
842
887
  gossipData,
@@ -1007,7 +1052,7 @@ export async function validateGossipFnRetryUnknownRoot<T>(
1007
1052
  if (unknownBlockRootRetries === 0) {
1008
1053
  // Trigger unknown block root search here
1009
1054
  const rootHex = toRootHex(blockRoot);
1010
- network.searchUnknownSlotRoot({slot, root: rootHex}, BlockInputSource.gossip);
1055
+ network.searchUnknownBlock({slot, root: rootHex}, BlockInputSource.gossip);
1011
1056
  }
1012
1057
 
1013
1058
  if (unknownBlockRootRetries++ < MAX_UNKNOWN_BLOCK_ROOT_RETRIES) {