@lodestar/beacon-node 1.42.0-dev.d73eccfa56 → 1.42.0-dev.ed2323ce4f

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 (374) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +14 -2
  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 +1 -0
  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 +21 -21
  55. package/lib/chain/blocks/importBlock.js.map +1 -1
  56. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -8
  57. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  58. package/lib/chain/blocks/importExecutionPayload.js +78 -51
  59. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  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/types.d.ts +21 -15
  64. package/lib/chain/blocks/types.d.ts.map +1 -1
  65. package/lib/chain/blocks/types.js.map +1 -1
  66. package/lib/chain/blocks/utils/checkpoint.d.ts +2 -2
  67. package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -1
  68. package/lib/chain/blocks/utils/checkpoint.js.map +1 -1
  69. package/lib/chain/blocks/verifyBlock.d.ts +2 -2
  70. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  71. package/lib/chain/blocks/verifyBlock.js +4 -4
  72. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  73. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +5 -5
  74. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  75. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +4 -4
  76. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  77. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  78. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  79. package/lib/chain/blocks/verifyBlocksSignatures.js +1 -1
  80. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  81. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -3
  82. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  83. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +3 -3
  84. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  85. package/lib/chain/chain.d.ts +12 -12
  86. package/lib/chain/chain.d.ts.map +1 -1
  87. package/lib/chain/chain.js +47 -39
  88. package/lib/chain/chain.js.map +1 -1
  89. package/lib/chain/emitter.d.ts +2 -2
  90. package/lib/chain/emitter.d.ts.map +1 -1
  91. package/lib/chain/errors/blockError.d.ts +4 -4
  92. package/lib/chain/errors/blockError.d.ts.map +1 -1
  93. package/lib/chain/forkChoice/index.d.ts +4 -4
  94. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  95. package/lib/chain/forkChoice/index.js +27 -23
  96. package/lib/chain/forkChoice/index.js.map +1 -1
  97. package/lib/chain/initState.d.ts +2 -2
  98. package/lib/chain/initState.d.ts.map +1 -1
  99. package/lib/chain/initState.js +1 -1
  100. package/lib/chain/initState.js.map +1 -1
  101. package/lib/chain/interface.d.ts +11 -12
  102. package/lib/chain/interface.d.ts.map +1 -1
  103. package/lib/chain/lightClient/index.d.ts +2 -2
  104. package/lib/chain/lightClient/index.d.ts.map +1 -1
  105. package/lib/chain/lightClient/index.js +4 -4
  106. package/lib/chain/lightClient/index.js.map +1 -1
  107. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -6
  108. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  109. package/lib/chain/opPools/aggregatedAttestationPool.js +10 -13
  110. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  111. package/lib/chain/opPools/opPool.d.ts +3 -3
  112. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  113. package/lib/chain/opPools/opPool.js +7 -7
  114. package/lib/chain/opPools/opPool.js.map +1 -1
  115. package/lib/chain/opPools/utils.d.ts +2 -2
  116. package/lib/chain/opPools/utils.d.ts.map +1 -1
  117. package/lib/chain/opPools/utils.js +1 -1
  118. package/lib/chain/opPools/utils.js.map +1 -1
  119. package/lib/chain/options.d.ts +1 -0
  120. package/lib/chain/options.d.ts.map +1 -1
  121. package/lib/chain/options.js +1 -0
  122. package/lib/chain/options.js.map +1 -1
  123. package/lib/chain/prepareNextSlot.d.ts +2 -2
  124. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  125. package/lib/chain/prepareNextSlot.js +3 -3
  126. package/lib/chain/prepareNextSlot.js.map +1 -1
  127. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +4 -4
  128. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  129. package/lib/chain/produceBlock/computeNewStateRoot.js +3 -4
  130. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  131. package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -5
  132. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  133. package/lib/chain/produceBlock/produceBlockBody.js +12 -16
  134. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  135. package/lib/chain/regen/interface.d.ts +13 -13
  136. package/lib/chain/regen/interface.d.ts.map +1 -1
  137. package/lib/chain/regen/queued.d.ts +14 -14
  138. package/lib/chain/regen/queued.d.ts.map +1 -1
  139. package/lib/chain/regen/queued.js.map +1 -1
  140. package/lib/chain/regen/regen.d.ts +6 -5
  141. package/lib/chain/regen/regen.d.ts.map +1 -1
  142. package/lib/chain/regen/regen.js +6 -6
  143. package/lib/chain/regen/regen.js.map +1 -1
  144. package/lib/chain/serializeState.d.ts +2 -2
  145. package/lib/chain/serializeState.d.ts.map +1 -1
  146. package/lib/chain/serializeState.js +1 -1
  147. package/lib/chain/serializeState.js.map +1 -1
  148. package/lib/chain/shufflingCache.d.ts +2 -2
  149. package/lib/chain/shufflingCache.d.ts.map +1 -1
  150. package/lib/chain/shufflingCache.js +3 -4
  151. package/lib/chain/shufflingCache.js.map +1 -1
  152. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +6 -6
  153. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  154. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  155. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +11 -11
  156. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  157. package/lib/chain/stateCache/persistentCheckpointsCache.js +12 -16
  158. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  159. package/lib/chain/stateCache/types.d.ts +14 -14
  160. package/lib/chain/stateCache/types.d.ts.map +1 -1
  161. package/lib/chain/stateCache/types.js.map +1 -1
  162. package/lib/chain/validation/attesterSlashing.js +3 -3
  163. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  164. package/lib/chain/validation/blobSidecar.js +1 -1
  165. package/lib/chain/validation/blobSidecar.js.map +1 -1
  166. package/lib/chain/validation/block.d.ts.map +1 -1
  167. package/lib/chain/validation/block.js +3 -3
  168. package/lib/chain/validation/block.js.map +1 -1
  169. package/lib/chain/validation/blsToExecutionChange.js +2 -2
  170. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  171. package/lib/chain/validation/dataColumnSidecar.js +1 -1
  172. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  173. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  174. package/lib/chain/validation/executionPayloadBid.js +4 -4
  175. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  176. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  177. package/lib/chain/validation/executionPayloadEnvelope.js +2 -3
  178. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  179. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  180. package/lib/chain/validation/payloadAttestationMessage.js +1 -2
  181. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  182. package/lib/chain/validation/proposerSlashing.js +1 -1
  183. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  184. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  185. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  186. package/lib/chain/validation/signatureSets/contributionAndProof.js +1 -1
  187. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  188. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  189. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  190. package/lib/chain/validation/signatureSets/syncCommittee.js +1 -1
  191. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  192. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -2
  193. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  194. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  195. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  196. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  197. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -1
  198. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  199. package/lib/chain/validation/syncCommittee.d.ts +4 -4
  200. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  201. package/lib/chain/validation/syncCommittee.js +13 -12
  202. package/lib/chain/validation/syncCommittee.js.map +1 -1
  203. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  204. package/lib/chain/validation/syncCommitteeContributionAndProof.js +1 -1
  205. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  206. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
  207. package/lib/chain/validation/voluntaryExit.js +3 -3
  208. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  209. package/lib/chain/validatorMonitor.d.ts +3 -3
  210. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  211. package/lib/chain/validatorMonitor.js +9 -7
  212. package/lib/chain/validatorMonitor.js.map +1 -1
  213. package/lib/metrics/metrics/lodestar.d.ts +12 -4
  214. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  215. package/lib/metrics/metrics/lodestar.js +19 -15
  216. package/lib/metrics/metrics/lodestar.js.map +1 -1
  217. package/lib/network/gossip/encoding.d.ts.map +1 -1
  218. package/lib/network/gossip/encoding.js +15 -0
  219. package/lib/network/gossip/encoding.js.map +1 -1
  220. package/lib/network/interface.d.ts +4 -2
  221. package/lib/network/interface.d.ts.map +1 -1
  222. package/lib/network/libp2p/index.d.ts.map +1 -1
  223. package/lib/network/libp2p/index.js +22 -11
  224. package/lib/network/libp2p/index.js.map +1 -1
  225. package/lib/network/network.d.ts +4 -2
  226. package/lib/network/network.d.ts.map +1 -1
  227. package/lib/network/network.js +9 -3
  228. package/lib/network/network.js.map +1 -1
  229. package/lib/network/options.d.ts.map +1 -1
  230. package/lib/network/options.js +7 -2
  231. package/lib/network/options.js.map +1 -1
  232. package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
  233. package/lib/network/processor/extractSlotRootFns.js +1 -1
  234. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  235. package/lib/network/processor/gossipHandlers.js +24 -15
  236. package/lib/network/processor/gossipHandlers.js.map +1 -1
  237. package/lib/network/processor/index.d.ts +12 -7
  238. package/lib/network/processor/index.d.ts.map +1 -1
  239. package/lib/network/processor/index.js +99 -78
  240. package/lib/network/processor/index.js.map +1 -1
  241. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  242. package/lib/network/reqresp/ReqRespBeaconNode.js +9 -0
  243. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  244. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +8 -0
  245. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -0
  246. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +69 -0
  247. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -0
  248. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +6 -0
  249. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -0
  250. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +28 -0
  251. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -0
  252. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  253. package/lib/network/reqresp/handlers/index.js +11 -1
  254. package/lib/network/reqresp/handlers/index.js.map +1 -1
  255. package/lib/network/reqresp/protocols.d.ts +2 -0
  256. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  257. package/lib/network/reqresp/protocols.js +10 -0
  258. package/lib/network/reqresp/protocols.js.map +1 -1
  259. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  260. package/lib/network/reqresp/rateLimit.js +8 -0
  261. package/lib/network/reqresp/rateLimit.js.map +1 -1
  262. package/lib/network/reqresp/score.d.ts.map +1 -1
  263. package/lib/network/reqresp/score.js +2 -0
  264. package/lib/network/reqresp/score.js.map +1 -1
  265. package/lib/network/reqresp/types.d.ts +8 -2
  266. package/lib/network/reqresp/types.d.ts.map +1 -1
  267. package/lib/network/reqresp/types.js +7 -1
  268. package/lib/network/reqresp/types.js.map +1 -1
  269. package/lib/node/nodejs.d.ts +2 -2
  270. package/lib/node/nodejs.d.ts.map +1 -1
  271. package/lib/node/nodejs.js +1 -4
  272. package/lib/node/nodejs.js.map +1 -1
  273. package/lib/node/notifier.d.ts.map +1 -1
  274. package/lib/node/notifier.js +3 -3
  275. package/lib/node/notifier.js.map +1 -1
  276. package/lib/sync/backfill/backfill.d.ts +2 -2
  277. package/lib/sync/backfill/backfill.d.ts.map +1 -1
  278. package/lib/sync/backfill/backfill.js +2 -2
  279. package/lib/sync/backfill/backfill.js.map +1 -1
  280. package/lib/sync/unknownBlock.d.ts +3 -9
  281. package/lib/sync/unknownBlock.d.ts.map +1 -1
  282. package/lib/sync/unknownBlock.js +8 -41
  283. package/lib/sync/unknownBlock.js.map +1 -1
  284. package/lib/util/types.d.ts +2 -0
  285. package/lib/util/types.d.ts.map +1 -1
  286. package/lib/util/types.js +1 -0
  287. package/lib/util/types.js.map +1 -1
  288. package/package.json +16 -16
  289. package/src/api/impl/beacon/blocks/index.ts +16 -2
  290. package/src/api/impl/beacon/pool/index.ts +1 -1
  291. package/src/api/impl/beacon/state/index.ts +29 -41
  292. package/src/api/impl/beacon/state/utils.ts +11 -25
  293. package/src/api/impl/lodestar/index.ts +4 -8
  294. package/src/api/impl/proof/index.ts +2 -9
  295. package/src/api/impl/validator/index.ts +29 -41
  296. package/src/api/impl/validator/utils.ts +4 -7
  297. package/src/chain/archiveStore/archiveStore.ts +1 -0
  298. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -39
  299. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +2 -1
  300. package/src/chain/archiveStore/historicalState/types.ts +2 -0
  301. package/src/chain/archiveStore/historicalState/worker.ts +1 -4
  302. package/src/chain/archiveStore/interface.ts +1 -0
  303. package/src/chain/balancesCache.ts +5 -11
  304. package/src/chain/blocks/blockInput/types.ts +1 -0
  305. package/src/chain/blocks/importBlock.ts +23 -25
  306. package/src/chain/blocks/importExecutionPayload.ts +89 -63
  307. package/src/chain/blocks/index.ts +3 -2
  308. package/src/chain/blocks/types.ts +26 -15
  309. package/src/chain/blocks/utils/checkpoint.ts +2 -2
  310. package/src/chain/blocks/verifyBlock.ts +5 -10
  311. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -14
  312. package/src/chain/blocks/verifyBlocksSignatures.ts +3 -3
  313. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
  314. package/src/chain/chain.ts +75 -67
  315. package/src/chain/emitter.ts +2 -2
  316. package/src/chain/errors/blockError.ts +4 -4
  317. package/src/chain/forkChoice/index.ts +33 -42
  318. package/src/chain/initState.ts +7 -2
  319. package/src/chain/interface.ts +12 -13
  320. package/src/chain/lightClient/index.ts +9 -22
  321. package/src/chain/opPools/aggregatedAttestationPool.ts +15 -21
  322. package/src/chain/opPools/opPool.ts +13 -14
  323. package/src/chain/opPools/utils.ts +3 -3
  324. package/src/chain/options.ts +2 -0
  325. package/src/chain/prepareNextSlot.ts +6 -8
  326. package/src/chain/produceBlock/computeNewStateRoot.ts +6 -10
  327. package/src/chain/produceBlock/produceBlockBody.ts +22 -49
  328. package/src/chain/regen/interface.ts +13 -17
  329. package/src/chain/regen/queued.ts +16 -20
  330. package/src/chain/regen/regen.ts +16 -17
  331. package/src/chain/serializeState.ts +3 -3
  332. package/src/chain/shufflingCache.ts +5 -7
  333. package/src/chain/stateCache/fifoBlockStateCache.ts +7 -7
  334. package/src/chain/stateCache/persistentCheckpointsCache.ts +27 -42
  335. package/src/chain/stateCache/types.ts +14 -18
  336. package/src/chain/validation/attesterSlashing.ts +3 -3
  337. package/src/chain/validation/blobSidecar.ts +1 -1
  338. package/src/chain/validation/block.ts +2 -4
  339. package/src/chain/validation/blsToExecutionChange.ts +2 -2
  340. package/src/chain/validation/dataColumnSidecar.ts +1 -1
  341. package/src/chain/validation/executionPayloadBid.ts +3 -7
  342. package/src/chain/validation/executionPayloadEnvelope.ts +2 -8
  343. package/src/chain/validation/payloadAttestationMessage.ts +2 -4
  344. package/src/chain/validation/proposerSlashing.ts +1 -1
  345. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -7
  346. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -7
  347. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -2
  348. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -7
  349. package/src/chain/validation/syncCommittee.ts +21 -20
  350. package/src/chain/validation/syncCommitteeContributionAndProof.ts +5 -10
  351. package/src/chain/validation/voluntaryExit.ts +3 -8
  352. package/src/chain/validatorMonitor.ts +12 -11
  353. package/src/metrics/metrics/lodestar.ts +23 -19
  354. package/src/network/gossip/encoding.ts +16 -0
  355. package/src/network/interface.ts +15 -2
  356. package/src/network/libp2p/index.ts +24 -13
  357. package/src/network/network.ts +32 -4
  358. package/src/network/options.ts +7 -2
  359. package/src/network/processor/extractSlotRootFns.ts +1 -1
  360. package/src/network/processor/gossipHandlers.ts +25 -16
  361. package/src/network/processor/index.ts +110 -89
  362. package/src/network/reqresp/ReqRespBeaconNode.ts +13 -0
  363. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +94 -0
  364. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +43 -0
  365. package/src/network/reqresp/handlers/index.ts +12 -0
  366. package/src/network/reqresp/protocols.ts +12 -0
  367. package/src/network/reqresp/rateLimit.ts +18 -0
  368. package/src/network/reqresp/score.ts +2 -0
  369. package/src/network/reqresp/types.ts +13 -0
  370. package/src/node/nodejs.ts +3 -5
  371. package/src/node/notifier.ts +4 -10
  372. package/src/sync/backfill/backfill.ts +3 -3
  373. package/src/sync/unknownBlock.ts +10 -50
  374. package/src/util/types.ts +6 -0
@@ -1,5 +1,5 @@
1
1
  import {SYNC_COMMITTEE_SUBNET_SIZE} from "@lodestar/params";
2
- import {CachedBeaconStateAltair, isSyncCommitteeAggregator} from "@lodestar/state-transition";
2
+ import {IBeaconStateView, isSyncCommitteeAggregator} from "@lodestar/state-transition";
3
3
  import {ValidatorIndex, altair} from "@lodestar/types";
4
4
  import {GossipAction, SyncCommitteeError, SyncCommitteeErrorCode} from "../errors/index.js";
5
5
  import {IBeaconChain} from "../interface.js";
@@ -53,7 +53,7 @@ export async function validateSyncCommitteeGossipContributionAndProof(
53
53
  }
54
54
 
55
55
  // [REJECT] The contribution has participants -- that is, any(contribution.aggregation_bits)
56
- const syncCommitteeParticipantIndices = getContributionIndices(headState as CachedBeaconStateAltair, contribution);
56
+ const syncCommitteeParticipantIndices = getContributionIndices(headState, contribution);
57
57
  if (syncCommitteeParticipantIndices.length === 0) {
58
58
  throw new SyncCommitteeError(GossipAction.REJECT, {
59
59
  code: SyncCommitteeErrorCode.NO_PARTICIPANT,
@@ -83,12 +83,7 @@ export async function validateSyncCommitteeGossipContributionAndProof(
83
83
 
84
84
  // [REJECT] The aggregate signature is valid for the message beacon_block_root and aggregate pubkey derived from
85
85
  // the participation info in aggregation_bits for the subcommittee specified by the contribution.subcommittee_index.
86
- getSyncCommitteeContributionSignatureSet(
87
- chain.config,
88
- headState as CachedBeaconStateAltair,
89
- contribution,
90
- syncCommitteeParticipantIndices
91
- ),
86
+ getSyncCommitteeContributionSignatureSet(chain.config, headState, contribution, syncCommitteeParticipantIndices),
92
87
  ];
93
88
 
94
89
  if (!(await chain.bls.verifySignatureSets(signatureSets, {batchable: true}))) {
@@ -109,12 +104,12 @@ export async function validateSyncCommitteeGossipContributionAndProof(
109
104
  * - pubkeyCache
110
105
  */
111
106
  function getContributionIndices(
112
- state: CachedBeaconStateAltair,
107
+ state: IBeaconStateView,
113
108
  contribution: altair.SyncCommitteeContribution
114
109
  ): ValidatorIndex[] {
115
110
  const startIndex = contribution.subcommitteeIndex * SYNC_COMMITTEE_SUBNET_SIZE;
116
111
 
117
- const syncCommittee = state.epochCtx.getIndexedSyncCommittee(contribution.slot);
112
+ const syncCommittee = state.getIndexedSyncCommittee(contribution.slot);
118
113
  // The bits in contribution.aggregationBits select validatorIndexes in the subcommittee starting at startIndex
119
114
  const subcommitteeValidatorIndices = syncCommittee.validatorIndices.slice(
120
115
  startIndex,
@@ -1,9 +1,4 @@
1
- import {
2
- BeaconStateView,
3
- VoluntaryExitValidity,
4
- getVoluntaryExitSignatureSet,
5
- getVoluntaryExitValidity,
6
- } from "@lodestar/state-transition";
1
+ import {VoluntaryExitValidity, getVoluntaryExitSignatureSet} from "@lodestar/state-transition";
7
2
  import {phase0} from "@lodestar/types";
8
3
  import {
9
4
  GossipAction,
@@ -53,14 +48,14 @@ async function validateVoluntaryExit(
53
48
 
54
49
  // [REJECT] All of the conditions within process_voluntary_exit pass validation.
55
50
  // verifySignature = false, verified in batch below
56
- const validity = getVoluntaryExitValidity(chain.config.getForkSeq(state.slot), state, voluntaryExit, false);
51
+ const validity = state.getVoluntaryExitValidity(voluntaryExit, false);
57
52
  if (validity !== VoluntaryExitValidity.valid) {
58
53
  throw new VoluntaryExitError(GossipAction.REJECT, {
59
54
  code: voluntaryExitValidityToErrorCode(validity),
60
55
  });
61
56
  }
62
57
 
63
- const signatureSet = getVoluntaryExitSignatureSet(chain.config, new BeaconStateView(state), voluntaryExit);
58
+ const signatureSet = getVoluntaryExitSignatureSet(chain.config, state, voluntaryExit);
64
59
  if (!(await chain.bls.verifySignatureSets([signatureSet], {batchable: true, priority: prioritizeBls}))) {
65
60
  throw new VoluntaryExitError(GossipAction.REJECT, {
66
61
  code: VoluntaryExitErrorCode.INVALID_SIGNATURE,
@@ -1,13 +1,11 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
2
  import {ForkSeq, MIN_ATTESTATION_INCLUSION_DELAY, SLOTS_PER_EPOCH} from "@lodestar/params";
3
3
  import {
4
- CachedBeaconStateAllForks,
5
- CachedBeaconStateAltair,
4
+ IBeaconStateView,
6
5
  ParticipationFlags,
7
6
  computeEpochAtSlot,
8
7
  computeStartSlotAtEpoch,
9
8
  computeTimeAtSlot,
10
- getBlockRootAtSlot,
11
9
  getCurrentSlot,
12
10
  parseAttesterFlags,
13
11
  parseParticipationFlags,
@@ -102,7 +100,7 @@ export type ValidatorMonitor = {
102
100
  syncAggregate: altair.SyncAggregate,
103
101
  syncCommitteeIndices: Uint32Array
104
102
  ): void;
105
- onceEveryEndOfEpoch(state: CachedBeaconStateAllForks): void;
103
+ onceEveryEndOfEpoch(state: IBeaconStateView): void;
106
104
  scrapeMetrics(slotClock: Slot): void;
107
105
  /** Returns the list of validator indices currently being monitored */
108
106
  getMonitoredValidatorIndices(): ValidatorIndex[];
@@ -736,16 +734,19 @@ export function createValidatorMonitor(
736
734
  return;
737
735
  }
738
736
 
737
+ if (validators.size === 0) {
738
+ return;
739
+ }
740
+
739
741
  const rootCache = new RootHexCache(headState);
740
742
 
741
743
  if (config.getForkSeq(headState.slot) >= ForkSeq.altair) {
742
- const {previousEpochParticipation} = headState as CachedBeaconStateAltair;
743
744
  const prevEpochStartSlot = computeStartSlotAtEpoch(prevEpoch);
744
- const prevEpochTargetRoot = toRootHex(getBlockRootAtSlot(headState, prevEpochStartSlot));
745
+ const prevEpochTargetRoot = toRootHex(headState.getBlockRootAtSlot(prevEpochStartSlot));
745
746
 
746
747
  // Check attestation performance
747
748
  for (const [index, validator] of validators.entries()) {
748
- const flags = parseParticipationFlags(previousEpochParticipation.get(index));
749
+ const flags = parseParticipationFlags(headState.getPreviousEpochParticipation(index));
749
750
  const attestationSummary = validator.attestations.get(prevEpoch)?.get(prevEpochTargetRoot);
750
751
  const summary = renderAttestationSummary(config, rootCache, attestationSummary, flags);
751
752
  validatorMonitorMetrics?.prevEpochAttestationSummary.inc({summary});
@@ -757,9 +758,9 @@ export function createValidatorMonitor(
757
758
  }
758
759
  }
759
760
 
760
- if (headState.epochCtx.proposersPrevEpoch !== null) {
761
+ if (headState.previousProposers !== null) {
761
762
  // proposersPrevEpoch is null on the first epoch of `headState` being generated
762
- for (const [slotIndex, validatorIndex] of headState.epochCtx.proposersPrevEpoch.entries()) {
763
+ for (const [slotIndex, validatorIndex] of headState.previousProposers.entries()) {
763
764
  const validator = validators.get(validatorIndex);
764
765
  if (validator) {
765
766
  // If expected proposer is a tracked validator
@@ -1139,12 +1140,12 @@ function renderBlockProposalSummary(
1139
1140
  export class RootHexCache {
1140
1141
  private readonly blockRootSlotCache = new Map<Slot, RootHex>();
1141
1142
 
1142
- constructor(private readonly state: CachedBeaconStateAllForks) {}
1143
+ constructor(private readonly state: IBeaconStateView) {}
1143
1144
 
1144
1145
  getBlockRootAtSlot(slot: Slot): RootHex {
1145
1146
  let root = this.blockRootSlotCache.get(slot);
1146
1147
  if (!root) {
1147
- root = toRootHex(getBlockRootAtSlot(this.state, slot));
1148
+ root = toRootHex(this.state.getBlockRootAtSlot(slot));
1148
1149
  this.blockRootSlotCache.set(slot, root);
1149
1150
  }
1150
1151
  return root;
@@ -1712,33 +1712,37 @@ export function createLodestarMetrics(
1712
1712
  }),
1713
1713
  },
1714
1714
 
1715
- // reprocess gossip attestations
1716
- reprocessGossipAttestations: {
1717
- total: register.gauge({
1718
- name: "lodestar_reprocess_gossip_attestations_total",
1719
- 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"],
1720
1721
  }),
1721
1722
  countPerSlot: register.gauge({
1722
- name: "lodestar_reprocess_gossip_attestations_per_slot_total",
1723
- 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",
1724
1725
  }),
1725
- resolve: register.gauge({
1726
- name: "lodestar_reprocess_gossip_attestations_resolve_total",
1727
- 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"],
1728
1730
  }),
1729
- waitSecBeforeResolve: register.gauge({
1730
- 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",
1731
1733
  help: "Time to wait for unknown block in seconds",
1734
+ labelNames: ["topic"],
1732
1735
  }),
1733
- reject: register.gauge<{reason: ReprocessRejectReason}>({
1734
- name: "lodestar_reprocess_gossip_attestations_reject_total",
1735
- help: "Total number of attestations are rejected to reprocess",
1736
- 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"],
1737
1741
  }),
1738
- waitSecBeforeReject: register.gauge<{reason: ReprocessRejectReason}>({
1739
- 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",
1740
1744
  help: "Time to wait for unknown block before being rejected",
1741
- labelNames: ["reason"],
1745
+ labelNames: ["reason", "topic"],
1742
1746
  }),
1743
1747
  },
1744
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
@@ -17,7 +17,7 @@ import {ExtractSlotRootFns} from "./types.js";
17
17
 
18
18
  /**
19
19
  * Extract the slot and block root of a gossip message form serialized data.
20
- * Only applicable for beacon_attestation and beacon_aggregate_and_proof topics.
20
+ * Not applicable for all topics.
21
21
  */
22
22
  export function createExtractBlockSlotRootFns(): ExtractSlotRootFns {
23
23
  return {
@@ -777,9 +777,9 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
777
777
  const {serializedData} = gossipData;
778
778
  const syncCommittee = sszDeserialize(topic, serializedData);
779
779
  const {subnet} = topic;
780
- let indexInSubcommittee = 0;
780
+ let indicesInSubcommittee: number[] = [0];
781
781
  try {
782
- indexInSubcommittee = (await validateGossipSyncCommittee(chain, syncCommittee, subnet)).indexInSubcommittee;
782
+ indicesInSubcommittee = (await validateGossipSyncCommittee(chain, syncCommittee, subnet)).indicesInSubcommittee;
783
783
  } catch (e) {
784
784
  if (e instanceof SyncCommitteeError && e.action === GossipAction.REJECT) {
785
785
  chain.persistInvalidSszValue(ssz.altair.SyncCommitteeMessage, syncCommittee, "gossip_reject");
@@ -787,11 +787,12 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
787
787
  throw e;
788
788
  }
789
789
 
790
- // Handler
791
-
790
+ // Handler — add for ALL positions this validator holds in the subcommittee
792
791
  try {
793
- const insertOutcome = chain.syncCommitteeMessagePool.add(subnet, syncCommittee, indexInSubcommittee);
794
- 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
+ }
795
796
  } catch (e) {
796
797
  logger.debug("Error adding to syncCommittee pool", {subnet}, e as Error);
797
798
  }
@@ -840,36 +841,44 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
840
841
  seenTimestampSec,
841
842
  }: GossipHandlerParamGeneric<GossipType.execution_payload>) => {
842
843
  const {serializedData} = gossipData;
843
- const executionPayloadEnvelope = sszDeserialize(topic, serializedData);
844
+ const signedEnvelope = sszDeserialize(topic, serializedData);
845
+ const envelope = signedEnvelope.message;
844
846
  // TODO GLOAS: handle BLOCK_ROOT_UNKNOWN error to trigger sync
845
- await validateGossipExecutionPayloadEnvelope(chain, executionPayloadEnvelope);
847
+ await validateGossipExecutionPayloadEnvelope(chain, signedEnvelope);
846
848
 
847
- const slot = executionPayloadEnvelope.message.slot;
849
+ const slot = envelope.slot;
848
850
  const delaySec = seenTimestampSec - computeTimeAtSlot(config, slot, chain.genesisTime);
849
851
  metrics?.gossipExecutionPayloadEnvelope.elapsedTimeTillReceived.observe({source: OpSource.gossip}, delaySec);
850
- chain.validatorMonitor?.registerExecutionPayloadEnvelope(OpSource.gossip, delaySec, executionPayloadEnvelope);
852
+ chain.validatorMonitor?.registerExecutionPayloadEnvelope(OpSource.gossip, delaySec, signedEnvelope);
851
853
 
852
- const blockRootHex = toRootHex(executionPayloadEnvelope.message.beaconBlockRoot);
854
+ const blockRootHex = toRootHex(envelope.beaconBlockRoot);
853
855
  const payloadInput = chain.seenPayloadEnvelopeInputCache.get(blockRootHex);
854
856
 
855
857
  if (!payloadInput) {
856
858
  // This shouldn't happen because beacon block should have been imported and thus payload input should have been created.
857
- throw new ExecutionPayloadEnvelopeError(GossipAction.REJECT, {
859
+ throw new ExecutionPayloadEnvelopeError(GossipAction.IGNORE, {
858
860
  code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING,
859
861
  blockRoot: blockRootHex,
860
862
  });
861
863
  }
862
864
 
863
- chain.serializedCache.set(executionPayloadEnvelope, serializedData);
865
+ chain.serializedCache.set(signedEnvelope, serializedData);
864
866
 
865
867
  payloadInput.addPayloadEnvelope({
866
- envelope: executionPayloadEnvelope,
868
+ envelope: signedEnvelope,
867
869
  source: PayloadEnvelopeInputSource.gossip,
868
870
  seenTimestampSec,
869
871
  peerIdStr,
870
872
  });
871
873
 
872
- // TODO GLOAS: Emit execution_payload_gossip event for gossip receipt.
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
+
873
882
  chain.processExecutionPayload(payloadInput, {validSignature: true}).catch((e) => {
874
883
  chain.logger.debug("Error processing execution payload from gossip", {slot, root: blockRootHex}, e as Error);
875
884
  });
@@ -1043,7 +1052,7 @@ export async function validateGossipFnRetryUnknownRoot<T>(
1043
1052
  if (unknownBlockRootRetries === 0) {
1044
1053
  // Trigger unknown block root search here
1045
1054
  const rootHex = toRootHex(blockRoot);
1046
- network.searchUnknownSlotRoot({slot, root: rootHex}, BlockInputSource.gossip);
1055
+ network.searchUnknownBlock({slot, root: rootHex}, BlockInputSource.gossip);
1047
1056
  }
1048
1057
 
1049
1058
  if (unknownBlockRootRetries++ < MAX_UNKNOWN_BLOCK_ROOT_RETRIES) {