@lodestar/beacon-node 1.42.0-dev.f6213da56d → 1.42.0-dev.f866249fa3

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 (464) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +25 -13
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/pool/index.js +5 -1
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  8. package/lib/api/impl/beacon/state/index.js +38 -40
  9. package/lib/api/impl/beacon/state/index.js.map +1 -1
  10. package/lib/api/impl/beacon/state/utils.d.ts +4 -4
  11. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  12. package/lib/api/impl/beacon/state/utils.js +7 -10
  13. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  14. package/lib/api/impl/debug/index.js.map +1 -1
  15. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  16. package/lib/api/impl/lodestar/index.js +8 -6
  17. package/lib/api/impl/lodestar/index.js.map +1 -1
  18. package/lib/api/impl/proof/index.d.ts.map +1 -1
  19. package/lib/api/impl/proof/index.js +2 -6
  20. package/lib/api/impl/proof/index.js.map +1 -1
  21. package/lib/api/impl/validator/index.d.ts.map +1 -1
  22. package/lib/api/impl/validator/index.js +33 -27
  23. package/lib/api/impl/validator/index.js.map +1 -1
  24. package/lib/api/impl/validator/utils.d.ts +2 -2
  25. package/lib/api/impl/validator/utils.d.ts.map +1 -1
  26. package/lib/api/impl/validator/utils.js +3 -3
  27. package/lib/api/impl/validator/utils.js.map +1 -1
  28. package/lib/chain/ColumnReconstructionTracker.d.ts +2 -1
  29. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  30. package/lib/chain/ColumnReconstructionTracker.js +5 -5
  31. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  32. package/lib/chain/GetBlobsTracker.d.ts +2 -1
  33. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  34. package/lib/chain/GetBlobsTracker.js +14 -12
  35. package/lib/chain/GetBlobsTracker.js.map +1 -1
  36. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  37. package/lib/chain/archiveStore/archiveStore.js +1 -0
  38. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  39. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +3 -7
  40. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  41. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +8 -26
  42. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  43. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts +2 -2
  44. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
  45. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
  46. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  47. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
  48. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  49. package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
  50. package/lib/chain/archiveStore/historicalState/worker.js +1 -3
  51. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  52. package/lib/chain/archiveStore/interface.d.ts +1 -0
  53. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  54. package/lib/chain/balancesCache.d.ts +2 -2
  55. package/lib/chain/balancesCache.d.ts.map +1 -1
  56. package/lib/chain/balancesCache.js +4 -4
  57. package/lib/chain/balancesCache.js.map +1 -1
  58. package/lib/chain/blocks/blockInput/blockInput.d.ts +5 -5
  59. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  60. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  61. package/lib/chain/blocks/blockInput/types.d.ts +5 -4
  62. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  63. package/lib/chain/blocks/blockInput/types.js +1 -0
  64. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  65. package/lib/chain/blocks/importBlock.d.ts +3 -3
  66. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  67. package/lib/chain/blocks/importBlock.js +37 -23
  68. package/lib/chain/blocks/importBlock.js.map +1 -1
  69. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -8
  70. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  71. package/lib/chain/blocks/importExecutionPayload.js +84 -51
  72. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  73. package/lib/chain/blocks/index.d.ts.map +1 -1
  74. package/lib/chain/blocks/index.js +3 -2
  75. package/lib/chain/blocks/index.js.map +1 -1
  76. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +14 -6
  77. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  78. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +33 -2
  79. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  80. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +2 -1
  81. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  82. package/lib/chain/blocks/types.d.ts +21 -15
  83. package/lib/chain/blocks/types.d.ts.map +1 -1
  84. package/lib/chain/blocks/types.js.map +1 -1
  85. package/lib/chain/blocks/utils/checkpoint.d.ts +2 -2
  86. package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -1
  87. package/lib/chain/blocks/utils/checkpoint.js.map +1 -1
  88. package/lib/chain/blocks/verifyBlock.d.ts +2 -2
  89. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  90. package/lib/chain/blocks/verifyBlock.js +4 -4
  91. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  92. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +5 -5
  93. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  94. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -4
  95. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  96. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  97. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  98. package/lib/chain/blocks/verifyBlocksSignatures.js +4 -2
  99. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  100. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -3
  101. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  102. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +3 -3
  103. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  104. package/lib/chain/chain.d.ts +15 -14
  105. package/lib/chain/chain.d.ts.map +1 -1
  106. package/lib/chain/chain.js +110 -62
  107. package/lib/chain/chain.js.map +1 -1
  108. package/lib/chain/emitter.d.ts +31 -9
  109. package/lib/chain/emitter.d.ts.map +1 -1
  110. package/lib/chain/emitter.js +12 -3
  111. package/lib/chain/emitter.js.map +1 -1
  112. package/lib/chain/errors/blockError.d.ts +4 -4
  113. package/lib/chain/errors/blockError.d.ts.map +1 -1
  114. package/lib/chain/errors/dataColumnSidecarError.d.ts +31 -1
  115. package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -1
  116. package/lib/chain/errors/dataColumnSidecarError.js +7 -0
  117. package/lib/chain/errors/dataColumnSidecarError.js.map +1 -1
  118. package/lib/chain/forkChoice/index.d.ts +4 -4
  119. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  120. package/lib/chain/forkChoice/index.js +30 -24
  121. package/lib/chain/forkChoice/index.js.map +1 -1
  122. package/lib/chain/initState.d.ts +2 -2
  123. package/lib/chain/initState.d.ts.map +1 -1
  124. package/lib/chain/initState.js +1 -1
  125. package/lib/chain/initState.js.map +1 -1
  126. package/lib/chain/interface.d.ts +15 -14
  127. package/lib/chain/interface.d.ts.map +1 -1
  128. package/lib/chain/lightClient/index.d.ts +2 -2
  129. package/lib/chain/lightClient/index.d.ts.map +1 -1
  130. package/lib/chain/lightClient/index.js +4 -4
  131. package/lib/chain/lightClient/index.js.map +1 -1
  132. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -6
  133. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  134. package/lib/chain/opPools/aggregatedAttestationPool.js +13 -13
  135. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  136. package/lib/chain/opPools/opPool.d.ts +3 -3
  137. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  138. package/lib/chain/opPools/opPool.js +7 -7
  139. package/lib/chain/opPools/opPool.js.map +1 -1
  140. package/lib/chain/opPools/utils.d.ts +2 -2
  141. package/lib/chain/opPools/utils.d.ts.map +1 -1
  142. package/lib/chain/opPools/utils.js +1 -1
  143. package/lib/chain/opPools/utils.js.map +1 -1
  144. package/lib/chain/options.d.ts +1 -0
  145. package/lib/chain/options.d.ts.map +1 -1
  146. package/lib/chain/options.js +1 -0
  147. package/lib/chain/options.js.map +1 -1
  148. package/lib/chain/prepareNextSlot.d.ts +2 -2
  149. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  150. package/lib/chain/prepareNextSlot.js +10 -4
  151. package/lib/chain/prepareNextSlot.js.map +1 -1
  152. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +4 -4
  153. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  154. package/lib/chain/produceBlock/computeNewStateRoot.js +3 -4
  155. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  156. package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -5
  157. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  158. package/lib/chain/produceBlock/produceBlockBody.js +21 -16
  159. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  160. package/lib/chain/regen/interface.d.ts +13 -13
  161. package/lib/chain/regen/interface.d.ts.map +1 -1
  162. package/lib/chain/regen/queued.d.ts +14 -14
  163. package/lib/chain/regen/queued.d.ts.map +1 -1
  164. package/lib/chain/regen/queued.js.map +1 -1
  165. package/lib/chain/regen/regen.d.ts +6 -5
  166. package/lib/chain/regen/regen.d.ts.map +1 -1
  167. package/lib/chain/regen/regen.js +6 -6
  168. package/lib/chain/regen/regen.js.map +1 -1
  169. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +1 -1
  170. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  171. package/lib/chain/seenCache/seenGossipBlockInput.js +2 -2
  172. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  173. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +1 -1
  174. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  175. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +2 -2
  176. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  177. package/lib/chain/serializeState.d.ts +2 -2
  178. package/lib/chain/serializeState.d.ts.map +1 -1
  179. package/lib/chain/serializeState.js +1 -1
  180. package/lib/chain/serializeState.js.map +1 -1
  181. package/lib/chain/shufflingCache.d.ts +2 -2
  182. package/lib/chain/shufflingCache.d.ts.map +1 -1
  183. package/lib/chain/shufflingCache.js +3 -4
  184. package/lib/chain/shufflingCache.js.map +1 -1
  185. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +6 -6
  186. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  187. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  188. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +11 -11
  189. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  190. package/lib/chain/stateCache/persistentCheckpointsCache.js +12 -16
  191. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  192. package/lib/chain/stateCache/types.d.ts +14 -14
  193. package/lib/chain/stateCache/types.d.ts.map +1 -1
  194. package/lib/chain/stateCache/types.js.map +1 -1
  195. package/lib/chain/validation/attesterSlashing.js +3 -3
  196. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  197. package/lib/chain/validation/blobSidecar.js +1 -1
  198. package/lib/chain/validation/blobSidecar.js.map +1 -1
  199. package/lib/chain/validation/block.d.ts.map +1 -1
  200. package/lib/chain/validation/block.js +3 -3
  201. package/lib/chain/validation/block.js.map +1 -1
  202. package/lib/chain/validation/blsToExecutionChange.js +2 -2
  203. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  204. package/lib/chain/validation/dataColumnSidecar.d.ts +11 -4
  205. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  206. package/lib/chain/validation/dataColumnSidecar.js +185 -6
  207. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  208. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  209. package/lib/chain/validation/executionPayloadBid.js +7 -4
  210. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  211. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  212. package/lib/chain/validation/executionPayloadEnvelope.js +5 -3
  213. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  214. package/lib/chain/validation/payloadAttestationMessage.js +5 -3
  215. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  216. package/lib/chain/validation/proposerSlashing.js +1 -1
  217. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  218. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  219. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  220. package/lib/chain/validation/signatureSets/contributionAndProof.js +1 -1
  221. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  222. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  223. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  224. package/lib/chain/validation/signatureSets/syncCommittee.js +1 -1
  225. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  226. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -2
  227. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  228. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  229. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  230. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  231. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -1
  232. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  233. package/lib/chain/validation/syncCommittee.d.ts +4 -4
  234. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  235. package/lib/chain/validation/syncCommittee.js +17 -12
  236. package/lib/chain/validation/syncCommittee.js.map +1 -1
  237. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  238. package/lib/chain/validation/syncCommitteeContributionAndProof.js +5 -2
  239. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  240. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
  241. package/lib/chain/validation/voluntaryExit.js +3 -3
  242. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  243. package/lib/chain/validatorMonitor.d.ts +3 -3
  244. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  245. package/lib/chain/validatorMonitor.js +11 -9
  246. package/lib/chain/validatorMonitor.js.map +1 -1
  247. package/lib/db/buckets.d.ts +2 -2
  248. package/lib/db/buckets.d.ts.map +1 -1
  249. package/lib/db/buckets.js +2 -2
  250. package/lib/db/buckets.js.map +1 -1
  251. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  252. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  253. package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -1
  254. package/lib/db/repositories/dataColumnSidecar.js +4 -2
  255. package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
  256. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  257. package/lib/db/repositories/dataColumnSidecarArchive.js +4 -2
  258. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  259. package/lib/metrics/metrics/lodestar.d.ts +32 -4
  260. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  261. package/lib/metrics/metrics/lodestar.js +52 -15
  262. package/lib/metrics/metrics/lodestar.js.map +1 -1
  263. package/lib/network/gossip/encoding.d.ts.map +1 -1
  264. package/lib/network/gossip/encoding.js +15 -0
  265. package/lib/network/gossip/encoding.js.map +1 -1
  266. package/lib/network/interface.d.ts +7 -4
  267. package/lib/network/interface.d.ts.map +1 -1
  268. package/lib/network/libp2p/index.d.ts.map +1 -1
  269. package/lib/network/libp2p/index.js +22 -11
  270. package/lib/network/libp2p/index.js.map +1 -1
  271. package/lib/network/network.d.ts +7 -4
  272. package/lib/network/network.d.ts.map +1 -1
  273. package/lib/network/network.js +12 -3
  274. package/lib/network/network.js.map +1 -1
  275. package/lib/network/options.d.ts.map +1 -1
  276. package/lib/network/options.js +7 -2
  277. package/lib/network/options.js.map +1 -1
  278. package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
  279. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  280. package/lib/network/processor/extractSlotRootFns.js +25 -5
  281. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  282. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  283. package/lib/network/processor/gossipHandlers.js +265 -80
  284. package/lib/network/processor/gossipHandlers.js.map +1 -1
  285. package/lib/network/processor/index.d.ts +22 -7
  286. package/lib/network/processor/index.d.ts.map +1 -1
  287. package/lib/network/processor/index.js +313 -80
  288. package/lib/network/processor/index.js.map +1 -1
  289. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  290. package/lib/network/reqresp/ReqRespBeaconNode.js +9 -0
  291. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  292. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +8 -0
  293. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -0
  294. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +69 -0
  295. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -0
  296. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +6 -0
  297. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -0
  298. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +28 -0
  299. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -0
  300. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  301. package/lib/network/reqresp/handlers/index.js +11 -1
  302. package/lib/network/reqresp/handlers/index.js.map +1 -1
  303. package/lib/network/reqresp/protocols.d.ts +2 -0
  304. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  305. package/lib/network/reqresp/protocols.js +10 -0
  306. package/lib/network/reqresp/protocols.js.map +1 -1
  307. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  308. package/lib/network/reqresp/rateLimit.js +8 -0
  309. package/lib/network/reqresp/rateLimit.js.map +1 -1
  310. package/lib/network/reqresp/score.d.ts.map +1 -1
  311. package/lib/network/reqresp/score.js +2 -0
  312. package/lib/network/reqresp/score.js.map +1 -1
  313. package/lib/network/reqresp/types.d.ts +10 -4
  314. package/lib/network/reqresp/types.d.ts.map +1 -1
  315. package/lib/network/reqresp/types.js +16 -4
  316. package/lib/network/reqresp/types.js.map +1 -1
  317. package/lib/node/nodejs.d.ts +2 -2
  318. package/lib/node/nodejs.d.ts.map +1 -1
  319. package/lib/node/nodejs.js +3 -3
  320. package/lib/node/nodejs.js.map +1 -1
  321. package/lib/node/notifier.d.ts.map +1 -1
  322. package/lib/node/notifier.js +3 -3
  323. package/lib/node/notifier.js.map +1 -1
  324. package/lib/sync/backfill/backfill.d.ts +2 -2
  325. package/lib/sync/backfill/backfill.d.ts.map +1 -1
  326. package/lib/sync/backfill/backfill.js +2 -2
  327. package/lib/sync/backfill/backfill.js.map +1 -1
  328. package/lib/sync/unknownBlock.d.ts +3 -9
  329. package/lib/sync/unknownBlock.d.ts.map +1 -1
  330. package/lib/sync/unknownBlock.js +10 -43
  331. package/lib/sync/unknownBlock.js.map +1 -1
  332. package/lib/sync/utils/downloadByRange.d.ts +3 -3
  333. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  334. package/lib/sync/utils/downloadByRange.js +4 -2
  335. package/lib/sync/utils/downloadByRange.js.map +1 -1
  336. package/lib/sync/utils/downloadByRoot.d.ts +3 -3
  337. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  338. package/lib/sync/utils/downloadByRoot.js +10 -5
  339. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  340. package/lib/util/blobs.d.ts +3 -3
  341. package/lib/util/blobs.d.ts.map +1 -1
  342. package/lib/util/blobs.js +21 -10
  343. package/lib/util/blobs.js.map +1 -1
  344. package/lib/util/dataColumns.d.ts +18 -11
  345. package/lib/util/dataColumns.d.ts.map +1 -1
  346. package/lib/util/dataColumns.js +51 -17
  347. package/lib/util/dataColumns.js.map +1 -1
  348. package/lib/util/execution.d.ts +6 -2
  349. package/lib/util/execution.d.ts.map +1 -1
  350. package/lib/util/execution.js +49 -25
  351. package/lib/util/execution.js.map +1 -1
  352. package/lib/util/sszBytes.d.ts +25 -1
  353. package/lib/util/sszBytes.d.ts.map +1 -1
  354. package/lib/util/sszBytes.js +189 -2
  355. package/lib/util/sszBytes.js.map +1 -1
  356. package/lib/util/types.d.ts +2 -0
  357. package/lib/util/types.d.ts.map +1 -1
  358. package/lib/util/types.js +1 -0
  359. package/lib/util/types.js.map +1 -1
  360. package/package.json +16 -16
  361. package/src/api/impl/beacon/blocks/index.ts +33 -16
  362. package/src/api/impl/beacon/pool/index.ts +5 -1
  363. package/src/api/impl/beacon/state/index.ts +43 -55
  364. package/src/api/impl/beacon/state/utils.ts +11 -25
  365. package/src/api/impl/debug/index.ts +2 -2
  366. package/src/api/impl/lodestar/index.ts +8 -8
  367. package/src/api/impl/proof/index.ts +2 -9
  368. package/src/api/impl/validator/index.ts +36 -41
  369. package/src/api/impl/validator/utils.ts +4 -7
  370. package/src/chain/ColumnReconstructionTracker.ts +6 -5
  371. package/src/chain/GetBlobsTracker.ts +14 -12
  372. package/src/chain/archiveStore/archiveStore.ts +1 -0
  373. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -39
  374. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +2 -1
  375. package/src/chain/archiveStore/historicalState/types.ts +2 -0
  376. package/src/chain/archiveStore/historicalState/worker.ts +1 -4
  377. package/src/chain/archiveStore/interface.ts +1 -0
  378. package/src/chain/balancesCache.ts +5 -11
  379. package/src/chain/blocks/blockInput/blockInput.ts +8 -8
  380. package/src/chain/blocks/blockInput/types.ts +5 -4
  381. package/src/chain/blocks/importBlock.ts +50 -31
  382. package/src/chain/blocks/importExecutionPayload.ts +95 -63
  383. package/src/chain/blocks/index.ts +3 -2
  384. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +53 -12
  385. package/src/chain/blocks/payloadEnvelopeInput/types.ts +2 -1
  386. package/src/chain/blocks/types.ts +26 -15
  387. package/src/chain/blocks/utils/checkpoint.ts +2 -2
  388. package/src/chain/blocks/verifyBlock.ts +5 -10
  389. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +10 -14
  390. package/src/chain/blocks/verifyBlocksSignatures.ts +10 -3
  391. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
  392. package/src/chain/chain.ts +148 -95
  393. package/src/chain/emitter.ts +27 -9
  394. package/src/chain/errors/blockError.ts +4 -4
  395. package/src/chain/errors/dataColumnSidecarError.ts +32 -1
  396. package/src/chain/forkChoice/index.ts +35 -41
  397. package/src/chain/initState.ts +7 -2
  398. package/src/chain/interface.ts +16 -15
  399. package/src/chain/lightClient/index.ts +9 -18
  400. package/src/chain/opPools/aggregatedAttestationPool.ts +20 -21
  401. package/src/chain/opPools/opPool.ts +13 -14
  402. package/src/chain/opPools/utils.ts +3 -3
  403. package/src/chain/options.ts +2 -0
  404. package/src/chain/prepareNextSlot.ts +14 -8
  405. package/src/chain/produceBlock/computeNewStateRoot.ts +7 -10
  406. package/src/chain/produceBlock/produceBlockBody.ts +38 -45
  407. package/src/chain/regen/interface.ts +13 -17
  408. package/src/chain/regen/queued.ts +16 -20
  409. package/src/chain/regen/regen.ts +16 -17
  410. package/src/chain/seenCache/seenGossipBlockInput.ts +2 -2
  411. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +2 -2
  412. package/src/chain/serializeState.ts +3 -3
  413. package/src/chain/shufflingCache.ts +5 -7
  414. package/src/chain/stateCache/fifoBlockStateCache.ts +7 -7
  415. package/src/chain/stateCache/persistentCheckpointsCache.ts +27 -42
  416. package/src/chain/stateCache/types.ts +14 -18
  417. package/src/chain/validation/attesterSlashing.ts +3 -3
  418. package/src/chain/validation/blobSidecar.ts +1 -1
  419. package/src/chain/validation/block.ts +3 -4
  420. package/src/chain/validation/blsToExecutionChange.ts +2 -2
  421. package/src/chain/validation/dataColumnSidecar.ts +231 -8
  422. package/src/chain/validation/executionPayloadBid.ts +7 -7
  423. package/src/chain/validation/executionPayloadEnvelope.ts +5 -4
  424. package/src/chain/validation/payloadAttestationMessage.ts +6 -4
  425. package/src/chain/validation/proposerSlashing.ts +1 -1
  426. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -7
  427. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -7
  428. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -2
  429. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -7
  430. package/src/chain/validation/syncCommittee.ts +25 -20
  431. package/src/chain/validation/syncCommitteeContributionAndProof.ts +9 -10
  432. package/src/chain/validation/voluntaryExit.ts +3 -8
  433. package/src/chain/validatorMonitor.ts +15 -13
  434. package/src/db/buckets.ts +2 -2
  435. package/src/db/repositories/dataColumnSidecar.ts +4 -2
  436. package/src/db/repositories/dataColumnSidecarArchive.ts +4 -2
  437. package/src/metrics/metrics/lodestar.ts +57 -19
  438. package/src/network/gossip/encoding.ts +16 -0
  439. package/src/network/interface.ts +18 -4
  440. package/src/network/libp2p/index.ts +24 -13
  441. package/src/network/network.ts +39 -8
  442. package/src/network/options.ts +7 -2
  443. package/src/network/processor/extractSlotRootFns.ts +32 -6
  444. package/src/network/processor/gossipHandlers.ts +329 -94
  445. package/src/network/processor/index.ts +395 -92
  446. package/src/network/reqresp/ReqRespBeaconNode.ts +13 -0
  447. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +94 -0
  448. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +43 -0
  449. package/src/network/reqresp/handlers/index.ts +12 -0
  450. package/src/network/reqresp/protocols.ts +12 -0
  451. package/src/network/reqresp/rateLimit.ts +18 -0
  452. package/src/network/reqresp/score.ts +2 -0
  453. package/src/network/reqresp/types.ts +26 -5
  454. package/src/node/nodejs.ts +6 -5
  455. package/src/node/notifier.ts +5 -6
  456. package/src/sync/backfill/backfill.ts +3 -3
  457. package/src/sync/unknownBlock.ts +13 -53
  458. package/src/sync/utils/downloadByRange.ts +9 -7
  459. package/src/sync/utils/downloadByRoot.ts +16 -12
  460. package/src/util/blobs.ts +35 -15
  461. package/src/util/dataColumns.ts +69 -25
  462. package/src/util/execution.ts +49 -30
  463. package/src/util/sszBytes.ts +245 -3
  464. package/src/util/types.ts +6 -0
@@ -1,13 +1,16 @@
1
1
  import {routes} from "@lodestar/api";
2
2
  import {BeaconConfig, ChainForkConfig} from "@lodestar/config";
3
+ import {PayloadStatus} from "@lodestar/fork-choice";
3
4
  import {
4
5
  ForkName,
5
6
  ForkPostDeneb,
6
7
  ForkPostElectra,
8
+ ForkPostGloas,
7
9
  ForkPreElectra,
8
10
  ForkSeq,
9
11
  NUMBER_OF_COLUMNS,
10
12
  isForkPostElectra,
13
+ isForkPostGloas,
11
14
  } from "@lodestar/params";
12
15
  import {computeTimeAtSlot} from "@lodestar/state-transition";
13
16
  import {
@@ -19,6 +22,8 @@ import {
19
22
  UintNum64,
20
23
  deneb,
21
24
  fulu,
25
+ gloas,
26
+ isGloasDataColumnSidecar,
22
27
  ssz,
23
28
  sszTypesFor,
24
29
  } from "@lodestar/types";
@@ -30,7 +35,7 @@ import {
30
35
  IBlockInput,
31
36
  isBlockInputColumns,
32
37
  } from "../../chain/blocks/blockInput/index.js";
33
- import {PayloadEnvelopeInputSource} from "../../chain/blocks/payloadEnvelopeInput/index.js";
38
+ import {PayloadEnvelopeInput, PayloadEnvelopeInputSource} from "../../chain/blocks/payloadEnvelopeInput/index.js";
34
39
  import {BlobSidecarValidation} from "../../chain/blocks/types.js";
35
40
  import {ChainEvent} from "../../chain/emitter.js";
36
41
  import {
@@ -51,7 +56,10 @@ import {
51
56
  } from "../../chain/errors/index.js";
52
57
  import {IBeaconChain} from "../../chain/interface.js";
53
58
  import {validateGossipBlobSidecar} from "../../chain/validation/blobSidecar.js";
54
- import {validateGossipDataColumnSidecar} from "../../chain/validation/dataColumnSidecar.js";
59
+ import {
60
+ validateGossipFuluDataColumnSidecar,
61
+ validateGossipGloasDataColumnSidecar,
62
+ } from "../../chain/validation/dataColumnSidecar.js";
55
63
  import {validateGossipExecutionPayloadBid} from "../../chain/validation/executionPayloadBid.js";
56
64
  import {validateGossipExecutionPayloadEnvelope} from "../../chain/validation/executionPayloadEnvelope.js";
57
65
  import {
@@ -74,7 +82,7 @@ import {validateGossipPayloadAttestationMessage} from "../../chain/validation/pa
74
82
  import {OpSource} from "../../chain/validatorMonitor.js";
75
83
  import {Metrics} from "../../metrics/index.js";
76
84
  import {kzgCommitmentToVersionedHash} from "../../util/blobs.js";
77
- import {getBlobKzgCommitments} from "../../util/dataColumns.js";
85
+ import {getBlobKzgCommitments, getDataColumnSidecarSlot} from "../../util/dataColumns.js";
78
86
  import {INetworkCore} from "../core/index.js";
79
87
  import {NetworkEventBus} from "../events.js";
80
88
  import {
@@ -161,16 +169,19 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
161
169
 
162
170
  logger.debug("Received gossip block", {...logCtx});
163
171
 
164
- let blockInput: IBlockInput | undefined;
172
+ // optimistically add gossip block to the seen cache
173
+ // if validation fails, we will NOT forward this gossip block to peers
174
+ // - if PARENT_UNKNOWN error, blockInput will then be queued inside BlockInputSync. If the gossip block is really invalid, it will be pruned there
175
+ // - if other validator errors, blockInput will stay in the seen cache and will be pruned on finalization
176
+ const blockInput = chain.seenBlockInputCache.getByBlock({
177
+ block: signedBlock,
178
+ blockRootHex,
179
+ source: BlockInputSource.gossip,
180
+ seenTimestampSec,
181
+ peerIdStr,
182
+ });
165
183
  try {
166
184
  await validateGossipBlock(config, chain, signedBlock, fork);
167
- blockInput = chain.seenBlockInputCache.getByBlock({
168
- block: signedBlock,
169
- blockRootHex,
170
- source: BlockInputSource.gossip,
171
- seenTimestampSec,
172
- peerIdStr,
173
- });
174
185
  const blockInputMeta = blockInput.getLogMeta();
175
186
 
176
187
  const recvToValidation = Date.now() / 1000 - seenTimestampSec;
@@ -186,9 +197,9 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
186
197
  return blockInput;
187
198
  } catch (e) {
188
199
  if (e instanceof BlockGossipError) {
200
+ logger.debug("Gossip block has error", {slot, root: blockShortHex, code: e.type.code});
189
201
  if (e.type.code === BlockErrorCode.PARENT_UNKNOWN && blockInput) {
190
- logger.debug("Gossip block has error", {slot, root: blockShortHex, code: e.type.code});
191
- chain.emitter.emit(ChainEvent.unknownParent, {
202
+ chain.emitter.emit(ChainEvent.blockUnknownParent, {
192
203
  blockInput,
193
204
  peer: peerIdStr,
194
205
  source: BlockInputSource.gossip,
@@ -324,7 +335,7 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
324
335
  const blockInput = chain.seenBlockInputCache.get(blockRootHex);
325
336
  if (blockInput && isBlockInputColumns(blockInput) && blockInput.hasColumn(dataColumnSidecar.index)) {
326
337
  metrics?.peerDas.dataColumnSidecarProcessingSkip.inc();
327
- logger.debug("Already have column sidecar, skipping processing", {
338
+ logger.debug("Already have column sidecar in BlockInput, skipping processing", {
328
339
  ...blockInput.getLogMeta(),
329
340
  index: dataColumnSidecar.index,
330
341
  });
@@ -339,10 +350,11 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
339
350
  const verificationTimer = metrics?.peerDas.dataColumnSidecarGossipVerificationTime.startTimer();
340
351
 
341
352
  const delaySec = chain.clock.secFromSlot(slot, seenTimestampSec);
353
+ const secFromSlot = chain.clock.secFromSlot(slot);
342
354
  const recvToValLatency = Date.now() / 1000 - seenTimestampSec;
343
355
 
344
356
  try {
345
- await validateGossipDataColumnSidecar(chain, dataColumnSidecar, gossipSubnet, metrics);
357
+ await validateGossipFuluDataColumnSidecar(chain, dataColumnSidecar, gossipSubnet, metrics);
346
358
  const blockInput = chain.seenBlockInputCache.getByColumn({
347
359
  blockRootHex,
348
360
  columnSidecar: dataColumnSidecar,
@@ -372,6 +384,7 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
372
384
  currentSlot: chain.clock.currentSlot,
373
385
  peerId: peerIdStr,
374
386
  delaySec,
387
+ secFromSlot,
375
388
  gossipSubnet,
376
389
  columnIndex: dataColumnSidecar.index,
377
390
  recvToValLatency,
@@ -401,6 +414,131 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
401
414
  }
402
415
  }
403
416
 
417
+ async function validatePayloadDataColumn(
418
+ dataColumnSidecar: gloas.DataColumnSidecar,
419
+ gossipSubnet: SubnetID,
420
+ peerIdStr: string,
421
+ seenTimestampSec: number
422
+ ): Promise<PayloadEnvelopeInput> {
423
+ metrics?.peerDas.dataColumnSidecarProcessingRequests.inc();
424
+ const slot = dataColumnSidecar.slot;
425
+ const blockRootHex = toRootHex(dataColumnSidecar.beaconBlockRoot);
426
+
427
+ // check to see if payload has already been processed and PayloadEnvelopeInput has been deleted (column received via reqresp or other means)
428
+ if (chain.forkChoice.getBlockHex(blockRootHex, PayloadStatus.FULL) !== null) {
429
+ metrics?.peerDas.dataColumnSidecarProcessingSkip.inc();
430
+ logger.debug("Already processed payload for column sidecar, skipping processing", {
431
+ slot,
432
+ blockRoot: blockRootHex,
433
+ index: dataColumnSidecar.index,
434
+ });
435
+ throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
436
+ code: DataColumnSidecarErrorCode.ALREADY_KNOWN,
437
+ columnIndex: dataColumnSidecar.index,
438
+ slot,
439
+ });
440
+ }
441
+
442
+ const payloadInput = chain.seenPayloadEnvelopeInputCache.get(blockRootHex);
443
+
444
+ if (!payloadInput) {
445
+ // This should not happen for gossip because the network processor queues `data_column_sidecar`
446
+ // until block import creates the corresponding PayloadEnvelopeInput.
447
+ throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
448
+ code: DataColumnSidecarErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING,
449
+ slot,
450
+ blockRoot: blockRootHex,
451
+ });
452
+ }
453
+
454
+ // [IGNORE] The sidecar is the first sidecar for the tuple
455
+ // (sidecar.beacon_block_root, sidecar.index) with valid kzg proof.
456
+ if (payloadInput.hasColumn(dataColumnSidecar.index)) {
457
+ metrics?.peerDas.dataColumnSidecarProcessingSkip.inc();
458
+ logger.debug("Already have column sidecar in PayloadEnvelopeInput, skipping processing", {
459
+ ...payloadInput.getLogMeta(),
460
+ index: dataColumnSidecar.index,
461
+ });
462
+ throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
463
+ code: DataColumnSidecarErrorCode.ALREADY_KNOWN,
464
+ columnIndex: dataColumnSidecar.index,
465
+ slot,
466
+ });
467
+ }
468
+
469
+ const verificationTimer = metrics?.peerDas.dataColumnSidecarGossipVerificationTime.startTimer();
470
+
471
+ const delaySec = chain.clock.secFromSlot(slot, seenTimestampSec);
472
+ const secFromSlot = chain.clock.secFromSlot(slot);
473
+ const recvToValLatency = Date.now() / 1000 - seenTimestampSec;
474
+
475
+ try {
476
+ await validateGossipGloasDataColumnSidecar(chain, payloadInput, dataColumnSidecar, gossipSubnet, metrics);
477
+
478
+ const addedColumn = payloadInput.addColumn({
479
+ columnSidecar: dataColumnSidecar,
480
+ source: PayloadEnvelopeInputSource.gossip,
481
+ seenTimestampSec,
482
+ peerIdStr,
483
+ });
484
+
485
+ if (!addedColumn) {
486
+ metrics?.peerDas.dataColumnSidecarProcessingSkip.inc();
487
+ logger.debug("Already have column sidecar in PayloadEnvelopeInput, skipping processing", {
488
+ ...payloadInput.getLogMeta(),
489
+ index: dataColumnSidecar.index,
490
+ });
491
+ throw new DataColumnSidecarGossipError(GossipAction.IGNORE, {
492
+ code: DataColumnSidecarErrorCode.ALREADY_KNOWN,
493
+ columnIndex: dataColumnSidecar.index,
494
+ slot,
495
+ });
496
+ }
497
+
498
+ const recvToValidation = Date.now() / 1000 - seenTimestampSec;
499
+ const validationTime = recvToValidation - recvToValLatency;
500
+
501
+ metrics?.peerDas.dataColumnSidecarProcessingSuccesses.inc();
502
+ metrics?.gossipBlob.recvToValidation.observe(recvToValidation);
503
+ metrics?.gossipBlob.validationTime.observe(validationTime);
504
+
505
+ if (chain.emitter.listenerCount(routes.events.EventType.dataColumnSidecar)) {
506
+ chain.emitter.emit(routes.events.EventType.dataColumnSidecar, {
507
+ blockRoot: blockRootHex,
508
+ slot,
509
+ index: dataColumnSidecar.index,
510
+ });
511
+ }
512
+
513
+ logger.debug("Received gossip dataColumn", {
514
+ ...payloadInput.getLogMeta(),
515
+ currentSlot: chain.clock.currentSlot,
516
+ peerId: peerIdStr,
517
+ delaySec,
518
+ secFromSlot,
519
+ gossipSubnet,
520
+ columnIndex: dataColumnSidecar.index,
521
+ recvToValLatency,
522
+ recvToValidation,
523
+ validationTime,
524
+ });
525
+
526
+ return payloadInput;
527
+ } catch (e) {
528
+ if (e instanceof DataColumnSidecarGossipError && e.action === GossipAction.REJECT) {
529
+ chain.persistInvalidSszValue(
530
+ sszTypesFor(payloadInput.forkName as ForkPostGloas).DataColumnSidecar,
531
+ dataColumnSidecar,
532
+ `gossip_reject_slot_${slot}_index_${dataColumnSidecar.index}`
533
+ );
534
+ }
535
+
536
+ throw e;
537
+ } finally {
538
+ verificationTimer?.();
539
+ }
540
+ }
541
+
404
542
  function handleValidBeaconBlock(blockInput: IBlockInput, peerIdStr: string, seenTimestampSec: number): void {
405
543
  const signedBlock = blockInput.getBlock();
406
544
  const slot = signedBlock.message.slot;
@@ -554,78 +692,137 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
554
692
  peerIdStr,
555
693
  seenTimestampSec,
556
694
  }: GossipHandlerParamGeneric<GossipType.data_column_sidecar>) => {
695
+ const {fork} = topic.boundary;
557
696
  const {serializedData} = gossipData;
558
- // TODO GLOAS: handle gloas.DataColumnSidecar
559
- const dataColumnSidecar = sszDeserialize(topic, serializedData) as fulu.DataColumnSidecar;
560
- const dataColumnSlot = dataColumnSidecar.signedBlockHeader.message.slot;
697
+ const dataColumnSidecar = sszDeserialize(topic, serializedData);
698
+ const dataColumnSlot = getDataColumnSidecarSlot(dataColumnSidecar);
561
699
  const index = dataColumnSidecar.index;
562
-
563
- if (config.getForkSeq(dataColumnSlot) < ForkSeq.fulu) {
564
- throw new GossipActionError(GossipAction.REJECT, {code: "PRE_FULU_BLOCK"});
565
- }
566
700
  const delaySec = chain.clock.secFromSlot(dataColumnSlot, seenTimestampSec);
567
- const blockInput = await validateBeaconDataColumn(
568
- dataColumnSidecar,
569
- serializedData,
570
- topic.subnet,
571
- peerIdStr,
572
- seenTimestampSec
573
- );
574
- chain.serializedCache.set(dataColumnSidecar, serializedData);
575
- const blockInputMeta = blockInput.getLogMeta();
576
- const {receivedColumns} = blockInputMeta;
577
- // it's not helpful to track every single column received
578
- // instead of that, track 1st, 8th, 16th 32th, 64th, and 128th column
579
- switch (receivedColumns) {
580
- case 1:
581
- case config.SAMPLES_PER_SLOT:
582
- case 2 * config.SAMPLES_PER_SLOT:
583
- case NUMBER_OF_COLUMNS / 4:
584
- case NUMBER_OF_COLUMNS / 2:
585
- case NUMBER_OF_COLUMNS:
586
- metrics?.dataColumns.elapsedTimeTillReceived.observe({receivedOrder: receivedColumns}, delaySec);
587
- break;
588
- }
589
701
 
590
- if (!blockInput.hasComputedAllData()) {
591
- // immediately attempt fetch of data columns from execution engine
592
- chain.getBlobsTracker.triggerGetBlobs(blockInput);
593
- // if we've received at least half of the columns, trigger reconstruction of the rest
594
- if (blockInput.columnCount >= NUMBER_OF_COLUMNS / 2) {
595
- chain.columnReconstructionTracker.triggerColumnReconstruction(blockInput);
702
+ if (isForkPostGloas(fork)) {
703
+ if (!isGloasDataColumnSidecar(dataColumnSidecar)) {
704
+ throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
705
+ code: DataColumnSidecarErrorCode.INCORRECT_TYPE,
706
+ slot: dataColumnSlot,
707
+ columnIndex: index,
708
+ fork,
709
+ });
596
710
  }
597
- }
598
711
 
599
- if (!blockInput.hasBlockAndAllData()) {
600
- const cutoffTimeMs = getCutoffTimeMs(chain, dataColumnSlot, BLOCK_AVAILABILITY_CUTOFF_MS);
601
- chain.logger.debug("Received gossip data column, waiting for full data availability", {
602
- msToWait: cutoffTimeMs,
603
- dataColumnIndex: index,
604
- ...blockInputMeta,
605
- });
606
- // do not await here to not delay gossip validation
607
- blockInput.waitForBlockAndAllData(cutoffTimeMs).catch((_e) => {
712
+ // After gloas, data columns are tracked in PayloadEnvelopeInput
713
+ const payloadInput = await validatePayloadDataColumn(
714
+ dataColumnSidecar,
715
+ topic.subnet,
716
+ peerIdStr,
717
+ seenTimestampSec
718
+ );
719
+ chain.serializedCache.set(dataColumnSidecar, serializedData);
720
+
721
+ const payloadInputMeta = payloadInput.getLogMeta();
722
+ const {receivedColumns} = payloadInputMeta;
723
+ // it's not helpful to track every single column received
724
+ // instead of that, track 1st, 8th, 16th 32th, 64th, and 128th column
725
+ switch (receivedColumns) {
726
+ case 1:
727
+ case config.SAMPLES_PER_SLOT:
728
+ case 2 * config.SAMPLES_PER_SLOT:
729
+ case NUMBER_OF_COLUMNS / 4:
730
+ case NUMBER_OF_COLUMNS / 2:
731
+ case NUMBER_OF_COLUMNS:
732
+ metrics?.dataColumns.elapsedTimeTillReceived.observe({receivedOrder: receivedColumns}, delaySec);
733
+ break;
734
+ }
735
+
736
+ if (!payloadInput.hasComputedAllData()) {
737
+ // if we've received at least half of the columns, trigger reconstruction of the rest
738
+ if (receivedColumns >= NUMBER_OF_COLUMNS / 2) {
739
+ chain.columnReconstructionTracker.triggerColumnReconstruction(payloadInput);
740
+ }
741
+
742
+ chain.logger.debug("Received gossip data column, payload envelope input not yet complete", {
743
+ dataColumnIndex: index,
744
+ ...payloadInputMeta,
745
+ });
746
+ }
747
+
748
+ chain.processExecutionPayload(payloadInput, {validSignature: true}).catch((e) => {
608
749
  chain.logger.debug(
609
- "Waited for data after receiving gossip column. Cut-off reached so attempting to fetch remainder of BlockInput",
610
- {
611
- dataColumnIndex: index,
612
- ...blockInputMeta,
613
- }
750
+ "Error processing execution payload from gossip data column",
751
+ {slot: dataColumnSlot, root: payloadInput.blockRootHex},
752
+ e as Error
614
753
  );
615
- chain.emitter.emit(ChainEvent.incompleteBlockInput, {
616
- blockInput,
617
- peer: peerIdStr,
618
- source: BlockInputSource.gossip,
619
- });
620
754
  });
621
- }
755
+ } else {
756
+ if (config.getForkSeq(dataColumnSlot) < ForkSeq.fulu) {
757
+ throw new GossipActionError(GossipAction.REJECT, {code: "PRE_FULU_BLOCK"});
758
+ }
622
759
 
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
- // }
760
+ if (isGloasDataColumnSidecar(dataColumnSidecar)) {
761
+ throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
762
+ code: DataColumnSidecarErrorCode.INCORRECT_TYPE,
763
+ slot: dataColumnSlot,
764
+ columnIndex: index,
765
+ fork,
766
+ });
767
+ }
768
+
769
+ // Before gloas, data columns are tracked in BlockInput
770
+ const blockInput = await validateBeaconDataColumn(
771
+ dataColumnSidecar,
772
+ serializedData,
773
+ topic.subnet,
774
+ peerIdStr,
775
+ seenTimestampSec
776
+ );
777
+ chain.serializedCache.set(dataColumnSidecar, serializedData);
778
+ const blockInputMeta = blockInput.getLogMeta();
779
+ const {receivedColumns} = blockInputMeta;
780
+ // it's not helpful to track every single column received
781
+ // instead of that, track 1st, 8th, 16th 32th, 64th, and 128th column
782
+ switch (receivedColumns) {
783
+ case 1:
784
+ case config.SAMPLES_PER_SLOT:
785
+ case 2 * config.SAMPLES_PER_SLOT:
786
+ case NUMBER_OF_COLUMNS / 4:
787
+ case NUMBER_OF_COLUMNS / 2:
788
+ case NUMBER_OF_COLUMNS:
789
+ metrics?.dataColumns.elapsedTimeTillReceived.observe({receivedOrder: receivedColumns}, delaySec);
790
+ break;
791
+ }
792
+
793
+ if (!blockInput.hasComputedAllData()) {
794
+ // immediately attempt fetch of data columns from execution engine
795
+ chain.getBlobsTracker.triggerGetBlobs(blockInput);
796
+ // if we've received at least half of the columns, trigger reconstruction of the rest
797
+ if (blockInput.columnCount >= NUMBER_OF_COLUMNS / 2) {
798
+ chain.columnReconstructionTracker.triggerColumnReconstruction(blockInput);
799
+ }
800
+ }
801
+
802
+ if (!blockInput.hasBlockAndAllData()) {
803
+ const cutoffTimeMs = getCutoffTimeMs(chain, dataColumnSlot, BLOCK_AVAILABILITY_CUTOFF_MS);
804
+ chain.logger.debug("Received gossip data column, waiting for full data availability", {
805
+ msToWait: cutoffTimeMs,
806
+ dataColumnIndex: index,
807
+ ...blockInputMeta,
808
+ });
809
+ // do not await here to not delay gossip validation
810
+ blockInput.waitForBlockAndAllData(cutoffTimeMs).catch((_e) => {
811
+ chain.logger.debug(
812
+ "Waited for data after receiving gossip column. Cut-off reached so attempting to fetch remainder of BlockInput",
813
+ {
814
+ dataColumnIndex: index,
815
+ ...blockInputMeta,
816
+ }
817
+ );
818
+ chain.emitter.emit(ChainEvent.incompleteBlockInput, {
819
+ blockInput,
820
+ peer: peerIdStr,
821
+ source: BlockInputSource.gossip,
822
+ });
823
+ });
824
+ }
825
+ }
629
826
  },
630
827
 
631
828
  [GossipType.beacon_aggregate_and_proof]: async ({
@@ -777,9 +974,9 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
777
974
  const {serializedData} = gossipData;
778
975
  const syncCommittee = sszDeserialize(topic, serializedData);
779
976
  const {subnet} = topic;
780
- let indexInSubcommittee = 0;
977
+ let indicesInSubcommittee: number[] = [0];
781
978
  try {
782
- indexInSubcommittee = (await validateGossipSyncCommittee(chain, syncCommittee, subnet)).indexInSubcommittee;
979
+ indicesInSubcommittee = (await validateGossipSyncCommittee(chain, syncCommittee, subnet)).indicesInSubcommittee;
783
980
  } catch (e) {
784
981
  if (e instanceof SyncCommitteeError && e.action === GossipAction.REJECT) {
785
982
  chain.persistInvalidSszValue(ssz.altair.SyncCommitteeMessage, syncCommittee, "gossip_reject");
@@ -787,11 +984,12 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
787
984
  throw e;
788
985
  }
789
986
 
790
- // Handler
791
-
987
+ // Handler — add for ALL positions this validator holds in the subcommittee
792
988
  try {
793
- const insertOutcome = chain.syncCommitteeMessagePool.add(subnet, syncCommittee, indexInSubcommittee);
794
- metrics?.opPool.syncCommitteeMessagePoolInsertOutcome.inc({insertOutcome});
989
+ for (const indexInSubcommittee of indicesInSubcommittee) {
990
+ const insertOutcome = chain.syncCommitteeMessagePool.add(subnet, syncCommittee, indexInSubcommittee);
991
+ metrics?.opPool.syncCommitteeMessagePoolInsertOutcome.inc({insertOutcome});
992
+ }
795
993
  } catch (e) {
796
994
  logger.debug("Error adding to syncCommittee pool", {subnet}, e as Error);
797
995
  }
@@ -840,36 +1038,73 @@ function getSequentialHandlers(modules: ValidatorFnsModules, options: GossipHand
840
1038
  seenTimestampSec,
841
1039
  }: GossipHandlerParamGeneric<GossipType.execution_payload>) => {
842
1040
  const {serializedData} = gossipData;
843
- const executionPayloadEnvelope = sszDeserialize(topic, serializedData);
844
- // TODO GLOAS: handle BLOCK_ROOT_UNKNOWN error to trigger sync
845
- await validateGossipExecutionPayloadEnvelope(chain, executionPayloadEnvelope);
1041
+ const signedEnvelope = sszDeserialize(topic, serializedData);
1042
+ const envelope = signedEnvelope.message;
846
1043
 
847
- const slot = executionPayloadEnvelope.message.slot;
1044
+ // TODO GLOAS: consider optimistically create PayloadEnvelopeInput here similar to how we do that for beacon_block
1045
+ // so that UnknownBlockSync can handle backward sync
1046
+ // the problem now is we cannot create a PayloadEnvelopeInput without the beacon block being known, we need at least the proposer index
1047
+ // we can achieve that by looking into the EpochCache
1048
+ try {
1049
+ await validateGossipExecutionPayloadEnvelope(chain, signedEnvelope);
1050
+ } catch (e) {
1051
+ if (e instanceof ExecutionPayloadEnvelopeError) {
1052
+ const {slot, beaconBlockRoot} = signedEnvelope.message;
1053
+ logger.debug("Gossip envelope has error", {slot, root: toRootHex(beaconBlockRoot), code: e.type.code});
1054
+ if (e.type.code === ExecutionPayloadEnvelopeErrorCode.BLOCK_ROOT_UNKNOWN) {
1055
+ // TODO GLOAS: UnknownBlockSync to handle this
1056
+ chain.emitter.emit(ChainEvent.envelopeUnknownBlock, {
1057
+ envelope: signedEnvelope,
1058
+ peer: peerIdStr,
1059
+ source: BlockInputSource.gossip,
1060
+ });
1061
+ }
1062
+
1063
+ if (e.action === GossipAction.REJECT) {
1064
+ chain.persistInvalidSszValue(
1065
+ ssz.gloas.SignedExecutionPayloadEnvelope,
1066
+ signedEnvelope,
1067
+ `gossip_reject_slot_${slot}`
1068
+ );
1069
+ }
1070
+ }
1071
+
1072
+ throw e;
1073
+ }
1074
+
1075
+ const slot = envelope.slot;
848
1076
  const delaySec = seenTimestampSec - computeTimeAtSlot(config, slot, chain.genesisTime);
849
1077
  metrics?.gossipExecutionPayloadEnvelope.elapsedTimeTillReceived.observe({source: OpSource.gossip}, delaySec);
850
- chain.validatorMonitor?.registerExecutionPayloadEnvelope(OpSource.gossip, delaySec, executionPayloadEnvelope);
1078
+ chain.validatorMonitor?.registerExecutionPayloadEnvelope(OpSource.gossip, delaySec, signedEnvelope);
851
1079
 
852
- const blockRootHex = toRootHex(executionPayloadEnvelope.message.beaconBlockRoot);
1080
+ const blockRootHex = toRootHex(envelope.beaconBlockRoot);
853
1081
  const payloadInput = chain.seenPayloadEnvelopeInputCache.get(blockRootHex);
854
1082
 
855
1083
  if (!payloadInput) {
856
1084
  // 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, {
1085
+ throw new ExecutionPayloadEnvelopeError(GossipAction.IGNORE, {
858
1086
  code: ExecutionPayloadEnvelopeErrorCode.PAYLOAD_ENVELOPE_INPUT_MISSING,
859
1087
  blockRoot: blockRootHex,
860
1088
  });
861
1089
  }
862
1090
 
863
- chain.serializedCache.set(executionPayloadEnvelope, serializedData);
1091
+ chain.serializedCache.set(signedEnvelope, serializedData);
864
1092
 
865
1093
  payloadInput.addPayloadEnvelope({
866
- envelope: executionPayloadEnvelope,
1094
+ envelope: signedEnvelope,
867
1095
  source: PayloadEnvelopeInputSource.gossip,
868
1096
  seenTimestampSec,
869
1097
  peerIdStr,
870
1098
  });
871
1099
 
872
- // TODO GLOAS: Emit execution_payload_gossip event for gossip receipt.
1100
+ chain.emitter.emit(routes.events.EventType.executionPayloadGossip, {
1101
+ slot,
1102
+ builderIndex: envelope.builderIndex,
1103
+ blockHash: toRootHex(envelope.payload.blockHash),
1104
+ blockRoot: blockRootHex,
1105
+ stateRoot: toRootHex(envelope.stateRoot),
1106
+ });
1107
+
873
1108
  chain.processExecutionPayload(payloadInput, {validSignature: true}).catch((e) => {
874
1109
  chain.logger.debug("Error processing execution payload from gossip", {slot, root: blockRootHex}, e as Error);
875
1110
  });
@@ -1043,7 +1278,7 @@ export async function validateGossipFnRetryUnknownRoot<T>(
1043
1278
  if (unknownBlockRootRetries === 0) {
1044
1279
  // Trigger unknown block root search here
1045
1280
  const rootHex = toRootHex(blockRoot);
1046
- network.searchUnknownSlotRoot({slot, root: rootHex}, BlockInputSource.gossip);
1281
+ network.searchUnknownBlock({slot, root: rootHex}, BlockInputSource.gossip);
1047
1282
  }
1048
1283
 
1049
1284
  if (unknownBlockRootRetries++ < MAX_UNKNOWN_BLOCK_ROOT_RETRIES) {