@lodestar/beacon-node 1.47.0 → 1.48.0-dev.02b355c4db

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 (327) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +8 -11
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/state/utils.js +14 -0
  6. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  7. package/lib/api/impl/config/index.d.ts.map +1 -1
  8. package/lib/api/impl/config/index.js +4 -1
  9. package/lib/api/impl/config/index.js.map +1 -1
  10. package/lib/api/impl/validator/index.d.ts.map +1 -1
  11. package/lib/api/impl/validator/index.js +44 -39
  12. package/lib/api/impl/validator/index.js.map +1 -1
  13. package/lib/chain/archiveStore/archiveStore.d.ts +1 -0
  14. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  15. package/lib/chain/archiveStore/archiveStore.js +5 -1
  16. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  17. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
  18. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
  19. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  20. package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +1 -1
  21. package/lib/chain/archiveStore/historicalState/metrics.js +12 -1
  22. package/lib/chain/archiveStore/historicalState/metrics.js.map +1 -1
  23. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
  24. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  25. package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
  26. package/lib/chain/archiveStore/historicalState/worker.js +4 -1
  27. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  28. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +9 -1
  29. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  30. package/lib/chain/archiveStore/utils/archiveBlocks.js +68 -38
  31. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  32. package/lib/chain/blocks/importBlock.d.ts +5 -1
  33. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  34. package/lib/chain/blocks/importBlock.js +12 -18
  35. package/lib/chain/blocks/importBlock.js.map +1 -1
  36. package/lib/chain/blocks/index.d.ts +8 -4
  37. package/lib/chain/blocks/index.d.ts.map +1 -1
  38. package/lib/chain/blocks/index.js +89 -23
  39. package/lib/chain/blocks/index.js.map +1 -1
  40. package/lib/chain/blocks/types.d.ts +8 -0
  41. package/lib/chain/blocks/types.d.ts.map +1 -1
  42. package/lib/chain/blocks/types.js.map +1 -1
  43. package/lib/chain/blocks/utils/chainSegment.d.ts +1 -1
  44. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  45. package/lib/chain/blocks/utils/chainSegment.js +26 -11
  46. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  47. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  48. package/lib/chain/blocks/verifyBlock.js +5 -2
  49. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  50. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  51. package/lib/chain/blocks/writeBlockInputToDb.js +9 -16
  52. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  53. package/lib/chain/chain.d.ts +12 -6
  54. package/lib/chain/chain.d.ts.map +1 -1
  55. package/lib/chain/chain.js +131 -76
  56. package/lib/chain/chain.js.map +1 -1
  57. package/lib/chain/emitter.d.ts +1 -1
  58. package/lib/chain/emitter.js +1 -1
  59. package/lib/chain/errors/blockError.d.ts +19 -7
  60. package/lib/chain/errors/blockError.d.ts.map +1 -1
  61. package/lib/chain/errors/blockError.js +2 -2
  62. package/lib/chain/errors/blockError.js.map +1 -1
  63. package/lib/chain/errors/dataColumnSidecarError.d.ts +15 -2
  64. package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -1
  65. package/lib/chain/errors/dataColumnSidecarError.js.map +1 -1
  66. package/lib/chain/errors/executionPayloadBid.d.ts +9 -0
  67. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -1
  68. package/lib/chain/errors/executionPayloadBid.js +2 -0
  69. package/lib/chain/errors/executionPayloadBid.js.map +1 -1
  70. package/lib/chain/errors/executionPayloadEnvelope.d.ts +10 -11
  71. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  72. package/lib/chain/errors/executionPayloadEnvelope.js +0 -2
  73. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  74. package/lib/chain/errors/gossipValidation.d.ts +2 -1
  75. package/lib/chain/errors/gossipValidation.d.ts.map +1 -1
  76. package/lib/chain/errors/gossipValidation.js +1 -0
  77. package/lib/chain/errors/gossipValidation.js.map +1 -1
  78. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  79. package/lib/chain/forkChoice/index.js +2 -0
  80. package/lib/chain/forkChoice/index.js.map +1 -1
  81. package/lib/chain/interface.d.ts +6 -6
  82. package/lib/chain/interface.d.ts.map +1 -1
  83. package/lib/chain/lightClient/index.d.ts +3 -3
  84. package/lib/chain/lightClient/index.d.ts.map +1 -1
  85. package/lib/chain/lightClient/index.js +21 -23
  86. package/lib/chain/lightClient/index.js.map +1 -1
  87. package/lib/chain/lightClient/proofs.d.ts +2 -1
  88. package/lib/chain/lightClient/proofs.d.ts.map +1 -1
  89. package/lib/chain/lightClient/proofs.js +5 -1
  90. package/lib/chain/lightClient/proofs.js.map +1 -1
  91. package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
  92. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  93. package/lib/chain/prepareNextSlot.d.ts +5 -0
  94. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  95. package/lib/chain/prepareNextSlot.js +37 -14
  96. package/lib/chain/prepareNextSlot.js.map +1 -1
  97. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  98. package/lib/chain/produceBlock/computeNewStateRoot.js +3 -25
  99. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  100. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  101. package/lib/chain/produceBlock/produceBlockBody.js +46 -64
  102. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  103. package/lib/chain/regen/interface.d.ts +1 -0
  104. package/lib/chain/regen/interface.d.ts.map +1 -1
  105. package/lib/chain/regen/interface.js +1 -0
  106. package/lib/chain/regen/interface.js.map +1 -1
  107. package/lib/chain/validation/block.d.ts.map +1 -1
  108. package/lib/chain/validation/block.js +74 -63
  109. package/lib/chain/validation/block.js.map +1 -1
  110. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  111. package/lib/chain/validation/dataColumnSidecar.js +38 -13
  112. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  113. package/lib/chain/validation/executionPayloadBid.d.ts +15 -3
  114. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  115. package/lib/chain/validation/executionPayloadBid.js +199 -28
  116. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  117. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  118. package/lib/chain/validation/executionPayloadEnvelope.js +10 -29
  119. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  120. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  121. package/lib/chain/validation/payloadAttestationMessage.js +5 -6
  122. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  123. package/lib/chain/validatorMonitor.d.ts +7 -1
  124. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  125. package/lib/chain/validatorMonitor.js +22 -5
  126. package/lib/chain/validatorMonitor.js.map +1 -1
  127. package/lib/db/beacon.d.ts +14 -5
  128. package/lib/db/beacon.d.ts.map +1 -1
  129. package/lib/db/beacon.js +17 -3
  130. package/lib/db/beacon.js.map +1 -1
  131. package/lib/db/dataColumnStore.d.ts +39 -0
  132. package/lib/db/dataColumnStore.d.ts.map +1 -0
  133. package/lib/db/dataColumnStore.js +81 -0
  134. package/lib/db/dataColumnStore.js.map +1 -0
  135. package/lib/db/flatFileStore/atomicWrite.d.ts +8 -0
  136. package/lib/db/flatFileStore/atomicWrite.d.ts.map +1 -0
  137. package/lib/db/flatFileStore/atomicWrite.js +61 -0
  138. package/lib/db/flatFileStore/atomicWrite.js.map +1 -0
  139. package/lib/db/flatFileStore/dcolFormat.d.ts +90 -0
  140. package/lib/db/flatFileStore/dcolFormat.d.ts.map +1 -0
  141. package/lib/db/flatFileStore/dcolFormat.js +286 -0
  142. package/lib/db/flatFileStore/dcolFormat.js.map +1 -0
  143. package/lib/db/flatFileStore/errors.d.ts +82 -0
  144. package/lib/db/flatFileStore/errors.d.ts.map +1 -0
  145. package/lib/db/flatFileStore/errors.js +32 -0
  146. package/lib/db/flatFileStore/errors.js.map +1 -0
  147. package/lib/db/flatFileStore/flatFileStore.d.ts +41 -0
  148. package/lib/db/flatFileStore/flatFileStore.d.ts.map +1 -0
  149. package/lib/db/flatFileStore/flatFileStore.js +251 -0
  150. package/lib/db/flatFileStore/flatFileStore.js.map +1 -0
  151. package/lib/db/flatFileStore/index.d.ts +4 -0
  152. package/lib/db/flatFileStore/index.d.ts.map +1 -0
  153. package/lib/db/flatFileStore/index.js +2 -0
  154. package/lib/db/flatFileStore/index.js.map +1 -0
  155. package/lib/db/flatFileStore/interface.d.ts +25 -0
  156. package/lib/db/flatFileStore/interface.d.ts.map +1 -0
  157. package/lib/db/flatFileStore/interface.js +2 -0
  158. package/lib/db/flatFileStore/interface.js.map +1 -0
  159. package/lib/db/flatFileStore/metrics.d.ts +24 -0
  160. package/lib/db/flatFileStore/metrics.d.ts.map +1 -0
  161. package/lib/db/flatFileStore/metrics.js +25 -0
  162. package/lib/db/flatFileStore/metrics.js.map +1 -0
  163. package/lib/db/flatFileStore/path.d.ts +9 -0
  164. package/lib/db/flatFileStore/path.d.ts.map +1 -0
  165. package/lib/db/flatFileStore/path.js +21 -0
  166. package/lib/db/flatFileStore/path.js.map +1 -0
  167. package/lib/db/flatFileStore/slotIndex.d.ts +14 -0
  168. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -0
  169. package/lib/db/flatFileStore/slotIndex.js +46 -0
  170. package/lib/db/flatFileStore/slotIndex.js.map +1 -0
  171. package/lib/db/flatFileStore/snappy.d.ts +3 -0
  172. package/lib/db/flatFileStore/snappy.d.ts.map +1 -0
  173. package/lib/db/flatFileStore/snappy.js +12 -0
  174. package/lib/db/flatFileStore/snappy.js.map +1 -0
  175. package/lib/db/index.d.ts +1 -0
  176. package/lib/db/index.d.ts.map +1 -1
  177. package/lib/db/interface.d.ts +8 -1
  178. package/lib/db/interface.d.ts.map +1 -1
  179. package/lib/db/repositories/blockArchive.d.ts +8 -1
  180. package/lib/db/repositories/blockArchive.d.ts.map +1 -1
  181. package/lib/db/repositories/blockArchive.js +65 -28
  182. package/lib/db/repositories/blockArchive.js.map +1 -1
  183. package/lib/db/repositories/blockArchiveIndex.d.ts +1 -2
  184. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  185. package/lib/db/repositories/blockArchiveIndex.js +3 -7
  186. package/lib/db/repositories/blockArchiveIndex.js.map +1 -1
  187. package/lib/execution/builder/apiClient.d.ts +6 -0
  188. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  189. package/lib/execution/builder/apiClient.js +19 -1
  190. package/lib/execution/builder/apiClient.js.map +1 -1
  191. package/lib/execution/builder/validateBid.d.ts +1 -0
  192. package/lib/execution/builder/validateBid.d.ts.map +1 -1
  193. package/lib/execution/builder/validateBid.js +17 -6
  194. package/lib/execution/builder/validateBid.js.map +1 -1
  195. package/lib/execution/engine/mock.d.ts.map +1 -1
  196. package/lib/execution/engine/mock.js +4 -1
  197. package/lib/execution/engine/mock.js.map +1 -1
  198. package/lib/metrics/metrics/lodestar.d.ts +32 -4
  199. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  200. package/lib/metrics/metrics/lodestar.js +78 -8
  201. package/lib/metrics/metrics/lodestar.js.map +1 -1
  202. package/lib/monitoring/clientStats.js +1 -1
  203. package/lib/monitoring/clientStats.js.map +1 -1
  204. package/lib/network/gossip/encoding.d.ts.map +1 -1
  205. package/lib/network/gossip/encoding.js +0 -6
  206. package/lib/network/gossip/encoding.js.map +1 -1
  207. package/lib/network/gossip/topic.d.ts +2 -1
  208. package/lib/network/gossip/topic.d.ts.map +1 -1
  209. package/lib/network/gossip/topic.js +4 -20
  210. package/lib/network/gossip/topic.js.map +1 -1
  211. package/lib/network/network.d.ts.map +1 -1
  212. package/lib/network/network.js +7 -6
  213. package/lib/network/network.js.map +1 -1
  214. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  215. package/lib/network/processor/gossipHandlers.js +388 -285
  216. package/lib/network/processor/gossipHandlers.js.map +1 -1
  217. package/lib/network/processor/gossipQueues/indexed.d.ts.map +1 -1
  218. package/lib/network/processor/gossipQueues/indexed.js +0 -1
  219. package/lib/network/processor/gossipQueues/indexed.js.map +1 -1
  220. package/lib/network/processor/index.d.ts +49 -3
  221. package/lib/network/processor/index.d.ts.map +1 -1
  222. package/lib/network/processor/index.js +270 -122
  223. package/lib/network/processor/index.js.map +1 -1
  224. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  225. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +112 -91
  226. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  227. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -1
  228. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +2 -0
  229. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  230. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  231. package/lib/network/reqresp/protocols.js +6 -22
  232. package/lib/network/reqresp/protocols.js.map +1 -1
  233. package/lib/network/reqresp/rateLimit.js +2 -1
  234. package/lib/network/reqresp/rateLimit.js.map +1 -1
  235. package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts +2 -1
  236. package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +1 -1
  237. package/lib/network/reqresp/utils/dataColumnResponseValidation.js +14 -9
  238. package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
  239. package/lib/node/nodejs.d.ts +2 -1
  240. package/lib/node/nodejs.d.ts.map +1 -1
  241. package/lib/node/nodejs.js +4 -2
  242. package/lib/node/nodejs.js.map +1 -1
  243. package/lib/sync/range/chain.d.ts.map +1 -1
  244. package/lib/sync/range/chain.js +9 -2
  245. package/lib/sync/range/chain.js.map +1 -1
  246. package/lib/sync/range/range.d.ts.map +1 -1
  247. package/lib/sync/range/range.js +25 -2
  248. package/lib/sync/range/range.js.map +1 -1
  249. package/lib/util/sszBytes.d.ts +6 -0
  250. package/lib/util/sszBytes.d.ts.map +1 -1
  251. package/lib/util/sszBytes.js +1 -1
  252. package/lib/util/sszBytes.js.map +1 -1
  253. package/package.json +18 -18
  254. package/src/api/impl/beacon/blocks/index.ts +12 -14
  255. package/src/api/impl/beacon/state/utils.ts +15 -0
  256. package/src/api/impl/config/index.ts +4 -1
  257. package/src/api/impl/validator/index.ts +49 -43
  258. package/src/chain/archiveStore/archiveStore.ts +12 -1
  259. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +1 -0
  260. package/src/chain/archiveStore/historicalState/metrics.ts +14 -1
  261. package/src/chain/archiveStore/historicalState/types.ts +2 -0
  262. package/src/chain/archiveStore/historicalState/worker.ts +4 -1
  263. package/src/chain/archiveStore/utils/archiveBlocks.ts +73 -42
  264. package/src/chain/blocks/importBlock.ts +25 -20
  265. package/src/chain/blocks/index.ts +126 -29
  266. package/src/chain/blocks/types.ts +9 -0
  267. package/src/chain/blocks/utils/chainSegment.ts +26 -12
  268. package/src/chain/blocks/verifyBlock.ts +5 -2
  269. package/src/chain/blocks/writeBlockInputToDb.ts +10 -17
  270. package/src/chain/chain.ts +155 -85
  271. package/src/chain/emitter.ts +1 -1
  272. package/src/chain/errors/blockError.ts +22 -10
  273. package/src/chain/errors/dataColumnSidecarError.ts +24 -8
  274. package/src/chain/errors/executionPayloadBid.ts +8 -0
  275. package/src/chain/errors/executionPayloadEnvelope.ts +14 -11
  276. package/src/chain/errors/gossipValidation.ts +1 -0
  277. package/src/chain/forkChoice/index.ts +2 -0
  278. package/src/chain/interface.ts +6 -6
  279. package/src/chain/lightClient/index.ts +32 -36
  280. package/src/chain/lightClient/proofs.ts +10 -0
  281. package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
  282. package/src/chain/prepareNextSlot.ts +42 -17
  283. package/src/chain/produceBlock/computeNewStateRoot.ts +3 -38
  284. package/src/chain/produceBlock/produceBlockBody.ts +50 -71
  285. package/src/chain/regen/interface.ts +1 -0
  286. package/src/chain/validation/block.ts +77 -79
  287. package/src/chain/validation/dataColumnSidecar.ts +47 -14
  288. package/src/chain/validation/executionPayloadBid.ts +230 -32
  289. package/src/chain/validation/executionPayloadEnvelope.ts +10 -37
  290. package/src/chain/validation/payloadAttestationMessage.ts +8 -9
  291. package/src/chain/validatorMonitor.ts +24 -7
  292. package/src/db/beacon.ts +33 -6
  293. package/src/db/dataColumnStore.ts +113 -0
  294. package/src/db/flatFileStore/atomicWrite.ts +65 -0
  295. package/src/db/flatFileStore/dcolFormat.ts +389 -0
  296. package/src/db/flatFileStore/errors.ts +53 -0
  297. package/src/db/flatFileStore/flatFileStore.ts +310 -0
  298. package/src/db/flatFileStore/index.ts +3 -0
  299. package/src/db/flatFileStore/interface.ts +21 -0
  300. package/src/db/flatFileStore/metrics.ts +48 -0
  301. package/src/db/flatFileStore/path.ts +32 -0
  302. package/src/db/flatFileStore/slotIndex.ts +56 -0
  303. package/src/db/flatFileStore/snappy.ts +14 -0
  304. package/src/db/index.ts +1 -0
  305. package/src/db/interface.ts +9 -1
  306. package/src/db/repositories/blockArchive.ts +89 -30
  307. package/src/db/repositories/blockArchiveIndex.ts +4 -9
  308. package/src/execution/builder/apiClient.ts +21 -1
  309. package/src/execution/builder/validateBid.ts +26 -7
  310. package/src/execution/engine/mock.ts +4 -1
  311. package/src/metrics/metrics/lodestar.ts +83 -9
  312. package/src/monitoring/clientStats.ts +1 -1
  313. package/src/network/gossip/encoding.ts +0 -6
  314. package/src/network/gossip/topic.ts +3 -25
  315. package/src/network/network.ts +9 -6
  316. package/src/network/processor/gossipHandlers.ts +500 -355
  317. package/src/network/processor/gossipQueues/indexed.ts +0 -1
  318. package/src/network/processor/index.ts +312 -176
  319. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +139 -105
  320. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +2 -0
  321. package/src/network/reqresp/protocols.ts +7 -24
  322. package/src/network/reqresp/rateLimit.ts +2 -1
  323. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +15 -7
  324. package/src/node/nodejs.ts +6 -1
  325. package/src/sync/range/chain.ts +9 -2
  326. package/src/sync/range/range.ts +24 -2
  327. package/src/util/sszBytes.ts +1 -1
@@ -1,21 +1,6 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
2
  import {ExecutionStatus} from "@lodestar/fork-choice";
3
- import {
4
- ForkName,
5
- MAX_ATTESTATIONS_ELECTRA,
6
- MAX_ATTESTER_SLASHINGS_ELECTRA,
7
- MAX_BLS_TO_EXECUTION_CHANGES,
8
- MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD,
9
- MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD,
10
- MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD,
11
- MAX_PAYLOAD_ATTESTATIONS,
12
- MAX_PROPOSER_SLASHINGS,
13
- MAX_VOLUNTARY_EXITS,
14
- MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD,
15
- isForkPostBellatrix,
16
- isForkPostDeneb,
17
- isForkPostGloas,
18
- } from "@lodestar/params";
3
+ import {ForkName, MIN_SEED_LOOKAHEAD, isForkPostBellatrix, isForkPostDeneb, isForkPostGloas} from "@lodestar/params";
19
4
  import {
20
5
  computeEpochAtSlot,
21
6
  computeStartSlotAtEpoch,
@@ -149,8 +134,9 @@ export async function validateGossipBlock(
149
134
  if (parentBlock.slot >= blockSlot) {
150
135
  throw new BlockGossipError(GossipAction.REJECT, {
151
136
  code: BlockErrorCode.NOT_LATER_THAN_PARENT,
152
- parentSlot: parentBlock.slot,
153
137
  slot: blockSlot,
138
+ root: blockRoot,
139
+ parentSlot: parentBlock.slot,
154
140
  });
155
141
  }
156
142
 
@@ -165,6 +151,8 @@ export async function validateGossipBlock(
165
151
  if (blobKzgCommitmentsLen > maxBlobsPerBlock) {
166
152
  throw new BlockGossipError(GossipAction.REJECT, {
167
153
  code: BlockErrorCode.TOO_MANY_KZG_COMMITMENTS,
154
+ slot: blockSlot,
155
+ root: blockRoot,
168
156
  blobKzgCommitmentsLen,
169
157
  commitmentLimit: maxBlobsPerBlock,
170
158
  });
@@ -172,7 +160,8 @@ export async function validateGossipBlock(
172
160
  }
173
161
 
174
162
  if (isForkPostGloas(fork)) {
175
- const bid = (block as gloas.BeaconBlock).body.signedExecutionPayloadBid.message;
163
+ const body = (block as gloas.BeaconBlock).body;
164
+ const bid = body.signedExecutionPayloadBid.message;
176
165
 
177
166
  // [REJECT] The length of KZG commitments is less than or equal to the limitation defined in Consensus Layer
178
167
  // -- i.e. validate that len(bid.blob_kzg_commitments) <= max_blobs_per_block
@@ -181,6 +170,8 @@ export async function validateGossipBlock(
181
170
  if (blobKzgCommitmentsLen > maxBlobsPerBlock) {
182
171
  throw new BlockGossipError(GossipAction.REJECT, {
183
172
  code: BlockErrorCode.TOO_MANY_KZG_COMMITMENTS,
173
+ slot: blockSlot,
174
+ root: blockRoot,
184
175
  blobKzgCommitmentsLen,
185
176
  commitmentLimit: maxBlobsPerBlock,
186
177
  });
@@ -190,89 +181,85 @@ export async function validateGossipBlock(
190
181
  if (!byteArrayEquals(bid.parentBlockRoot, block.parentRoot)) {
191
182
  throw new BlockGossipError(GossipAction.REJECT, {
192
183
  code: BlockErrorCode.BID_PARENT_ROOT_MISMATCH,
184
+ slot: blockSlot,
185
+ root: blockRoot,
193
186
  bidParentRoot: toRootHex(bid.parentBlockRoot),
194
187
  blockParentRoot: parentRoot,
195
188
  });
196
189
  }
197
190
 
198
- // [REJECT] The counts of `block.body.parent_execution_requests` are within
199
- // their respective limits -- i.e. validate that
200
- // `len(block.body.parent_execution_requests.withdrawals) <= MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD`,
201
- // `len(block.body.parent_execution_requests.consolidations) <= MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD`,
202
- // `len(block.body.parent_execution_requests.builder_deposits) <= MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD`,
203
- // and
204
- // `len(block.body.parent_execution_requests.builder_exits) <= MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD`.
205
- // [REJECT] The counts of the block body operations are within their respective
206
- // limits -- i.e. validate that
207
- // `len(block.body.proposer_slashings) <= MAX_PROPOSER_SLASHINGS`,
208
- // `len(block.body.attester_slashings) <= MAX_ATTESTER_SLASHINGS_ELECTRA`,
209
- // `len(block.body.attestations) <= MAX_ATTESTATIONS_ELECTRA`,
210
- // `len(block.body.deposits) == 0`,
211
- // `len(block.body.voluntary_exits) <= MAX_VOLUNTARY_EXITS`,
212
- // `len(block.body.bls_to_execution_changes) <= MAX_BLS_TO_EXECUTION_CHANGES`,
213
- // and `len(block.body.payload_attestations) <= MAX_PAYLOAD_ATTESTATIONS`.
214
- const body = (block as gloas.BeaconBlock).body;
215
- const requests = body.parentExecutionRequests;
216
- const countLimits: [string, number, number][] = [
217
- ["parentExecutionRequests.withdrawals", requests.withdrawals.length, MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD],
218
- [
219
- "parentExecutionRequests.consolidations",
220
- requests.consolidations.length,
221
- MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD,
222
- ],
223
- [
224
- "parentExecutionRequests.builderDeposits",
225
- requests.builderDeposits.length,
226
- MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD,
227
- ],
228
- ["parentExecutionRequests.builderExits", requests.builderExits.length, MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD],
229
- ["proposerSlashings", body.proposerSlashings.length, MAX_PROPOSER_SLASHINGS],
230
- ["attesterSlashings", body.attesterSlashings.length, MAX_ATTESTER_SLASHINGS_ELECTRA],
231
- ["attestations", body.attestations.length, MAX_ATTESTATIONS_ELECTRA],
232
- ["deposits", body.deposits.length, 0],
233
- ["voluntaryExits", body.voluntaryExits.length, MAX_VOLUNTARY_EXITS],
234
- ["blsToExecutionChanges", body.blsToExecutionChanges.length, MAX_BLS_TO_EXECUTION_CHANGES],
235
- ["payloadAttestations", body.payloadAttestations.length, MAX_PAYLOAD_ATTESTATIONS],
236
- ];
237
- for (const [name, count, limit] of countLimits) {
238
- if (count > limit) {
239
- throw new BlockGossipError(GossipAction.REJECT, {
240
- code: BlockErrorCode.TOO_MANY_BLOCK_OPERATIONS,
241
- name,
242
- count,
243
- limit,
244
- });
245
- }
191
+ // [REJECT] The block contains no deposits.
192
+ if (body.deposits.length !== 0) {
193
+ throw new BlockGossipError(GossipAction.REJECT, {
194
+ code: BlockErrorCode.NON_ZERO_DEPOSITS,
195
+ slot: blockSlot,
196
+ root: blockRoot,
197
+ count: body.deposits.length,
198
+ });
246
199
  }
247
200
 
248
201
  // TODO GLOAS: [REJECT] The block's execution payload parent (defined by bid.parent_block_hash) passes all validation
249
202
  // This requires execution engine integration to verify the parent block hash
250
203
  }
251
204
 
252
- // use getPreState to reload state if needed. It also checks for whether the current finalized checkpoint is an ancestor of the block.
253
- // As a result, we throw an IGNORE (whereas the spec says we should REJECT for this scenario).
205
+ // For gossip forwarding we only need the state to check the block's proposer index.
206
+ // If the state cannot be regenerated we throw an IGNORE (whereas the spec says we should REJECT for the
207
+ // finalized-ancestor scenario, which is already guarded by the parentBlock lookup above).
254
208
  // this is something we should change this in the future to make the code airtight to the spec.
255
209
  // [IGNORE] The block's parent (defined by block.parent_root) has been seen (via both gossip and non-gossip sources) (a client MAY queue blocks for processing once the parent block is retrieved).
256
210
  // [REJECT] The block's parent (defined by block.parent_root) passes validation.
257
- const blockState = await chain.regen
258
- .getPreState(block, {dontTransferCache: true}, RegenCaller.validateGossipBlock)
259
- .catch(() => {
260
- throw new BlockGossipError(GossipAction.IGNORE, {code: BlockErrorCode.PARENT_BLOCK_UNKNOWN, parentRoot});
211
+ const canUseParentState = blockEpoch - computeEpochAtSlot(parentBlock.slot) <= MIN_SEED_LOOKAHEAD;
212
+
213
+ const getValidationState = async () => {
214
+ const getPreState = () =>
215
+ chain.regen.getPreState(block, {dontTransferCache: true}, RegenCaller.validateGossipBlock);
216
+ if (canUseParentState) {
217
+ try {
218
+ const parentState = await chain.regen.getState(parentBlock.stateRoot, RegenCaller.validateGossipBlock);
219
+ chain.metrics?.gossipBlock.preStateSource.inc({source: "parentState"});
220
+ return parentState;
221
+ } catch {
222
+ // if parent state is not in memory, we fall back to disk reload / dial-forward
223
+ chain.metrics?.gossipBlock.preStateSource.inc({source: "fallbackPreState"});
224
+ chain.logger.debug("Parent state not in memory, falling back to getPreState for gossip block validation", {
225
+ slot: blockSlot,
226
+ root: blockRoot,
227
+ parentSlot: parentBlock.slot,
228
+ parentRoot,
229
+ });
230
+ return getPreState();
231
+ }
232
+ }
233
+ // parent is >1 epoch behind (deep skip) → beyond proposer-lookahead range, must dial forward
234
+ chain.metrics?.gossipBlock.preStateSource.inc({source: "preState"});
235
+ chain.logger.debug("Cannot use parent state for gossip block validation, dialing forward via getPreState", {
236
+ slot: blockSlot,
237
+ root: blockRoot,
238
+ parentSlot: parentBlock.slot,
239
+ parentRoot,
261
240
  });
241
+ return getPreState();
242
+ };
243
+
244
+ const state = await getValidationState().catch(() => {
245
+ throw new BlockGossipError(GossipAction.IGNORE, {code: BlockErrorCode.PARENT_BLOCK_UNKNOWN, parentRoot});
246
+ });
262
247
 
263
248
  // in forky condition, make sure to populate ShufflingCache with regened state
264
- chain.shufflingCache.processState(blockState);
249
+ chain.shufflingCache.processState(state);
265
250
 
266
251
  // [REJECT] The block's execution payload timestamp is correct with respect to the slot
267
252
  // -- i.e. execution_payload.timestamp == compute_timestamp_at_slot(state, block.slot).
268
253
  if (isForkPostBellatrix(fork) && !isForkPostGloas(fork)) {
269
254
  if (!isExecutionBlockBodyType(block.body)) throw Error("Not execution block body type");
270
255
  const executionPayload = block.body.executionPayload;
271
- if (isStatePostBellatrix(blockState) && blockState.isExecutionStateType && blockState.isExecutionEnabled(block)) {
256
+ if (isStatePostBellatrix(state) && state.isExecutionStateType && state.isExecutionEnabled(block)) {
272
257
  const expectedTimestamp = computeTimeAtSlot(config, blockSlot, chain.genesisTime);
273
258
  if (executionPayload.timestamp !== computeTimeAtSlot(config, blockSlot, chain.genesisTime)) {
274
259
  throw new BlockGossipError(GossipAction.REJECT, {
275
260
  code: BlockErrorCode.INCORRECT_TIMESTAMP,
261
+ slot: blockSlot,
262
+ root: blockRoot,
276
263
  timestamp: executionPayload.timestamp,
277
264
  expectedTimestamp,
278
265
  });
@@ -281,8 +268,13 @@ export async function validateGossipBlock(
281
268
  }
282
269
 
283
270
  // [REJECT] The proposer index is a valid validator index
284
- if (proposerIndex >= blockState.validatorCount) {
285
- throw new BlockGossipError(GossipAction.REJECT, {code: BlockErrorCode.UNKNOWN_PROPOSER, proposerIndex});
271
+ if (proposerIndex >= state.validatorCount) {
272
+ throw new BlockGossipError(GossipAction.REJECT, {
273
+ code: BlockErrorCode.UNKNOWN_PROPOSER,
274
+ slot: blockSlot,
275
+ root: blockRoot,
276
+ proposerIndex,
277
+ });
286
278
  }
287
279
 
288
280
  // [REJECT] The proposer signature, signed_beacon_block.signature, is valid with respect to the proposer_index pubkey.
@@ -293,8 +285,13 @@ export async function validateGossipBlock(
293
285
  // shuffling (defined by parent_root/slot). If the proposer_index cannot immediately be verified against the expected
294
286
  // shuffling, the block MAY be queued for later processing while proposers for the block's branch are calculated --
295
287
  // in such a case do not REJECT, instead IGNORE this message.
296
- if (blockState.getBeaconProposer(blockSlot) !== proposerIndex) {
297
- throw new BlockGossipError(GossipAction.REJECT, {code: BlockErrorCode.INCORRECT_PROPOSER, proposerIndex});
288
+ if (state.getBeaconProposer(blockSlot) !== proposerIndex) {
289
+ throw new BlockGossipError(GossipAction.REJECT, {
290
+ code: BlockErrorCode.INCORRECT_PROPOSER,
291
+ slot: blockSlot,
292
+ root: blockRoot,
293
+ proposerIndex,
294
+ });
298
295
  }
299
296
 
300
297
  // Simple implementation of a pending block queue. Keeping the block here recycles the queue logic, and keeps the
@@ -339,7 +336,8 @@ export async function verifyBlockProposerSignature(
339
336
  if (!(await chain.bls.verifySignatureSets([signatureSet], {verifyOnMainThread: opts.verifyOnMainThread ?? true}))) {
340
337
  throw new BlockGossipError(GossipAction.REJECT, {
341
338
  code: BlockErrorCode.PROPOSAL_SIGNATURE_INVALID,
342
- blockSlot,
339
+ slot: blockSlot,
340
+ root: blockRoot,
343
341
  });
344
342
  }
345
343
 
@@ -11,7 +11,7 @@ import {
11
11
  computeStartSlotAtEpoch,
12
12
  getBlockHeaderProposerSignatureSetByHeaderSlot,
13
13
  } from "@lodestar/state-transition";
14
- import {DataColumnSidecar, Root, Slot, SubnetID, ValidatorIndex, fulu, gloas, ssz} from "@lodestar/types";
14
+ import {DataColumnSidecar, Root, RootHex, Slot, SubnetID, ValidatorIndex, fulu, gloas, ssz} from "@lodestar/types";
15
15
  import {byteArrayEquals, toRootHex, verifyMerkleBranch} from "@lodestar/utils";
16
16
  import {BeaconMetrics} from "../../metrics/metrics/beacon.js";
17
17
  import {Metrics} from "../../metrics/metrics.js";
@@ -39,12 +39,14 @@ export async function validateGossipFuluDataColumnSidecar(
39
39
  const blockRootHex = toRootHex(ssz.phase0.BeaconBlockHeader.hashTreeRoot(blockHeader));
40
40
 
41
41
  // 1) [REJECT] The sidecar is valid as verified by verify_data_column_sidecar
42
- verifyFuluDataColumnSidecar(chain.config, dataColumnSidecar);
42
+ verifyFuluDataColumnSidecar(chain.config, dataColumnSidecar, blockRootHex);
43
43
 
44
44
  // 2) [REJECT] The sidecar is for the correct subnet -- i.e. compute_subnet_for_data_column_sidecar(sidecar.index) == subnet_id
45
45
  if (computeSubnetForDataColumnSidecar(chain.config, dataColumnSidecar) !== gossipSubnet) {
46
46
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
47
47
  code: DataColumnSidecarErrorCode.INVALID_SUBNET,
48
+ slot: blockHeader.slot,
49
+ root: blockRootHex,
48
50
  columnIndex: dataColumnSidecar.index,
49
51
  gossipSubnet: gossipSubnet,
50
52
  });
@@ -100,8 +102,9 @@ export async function validateGossipFuluDataColumnSidecar(
100
102
  if (parentBlock.slot >= blockHeader.slot) {
101
103
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
102
104
  code: DataColumnSidecarErrorCode.NOT_LATER_THAN_PARENT,
103
- parentSlot: parentBlock.slot,
104
105
  slot: blockHeader.slot,
106
+ root: blockRootHex,
107
+ parentSlot: parentBlock.slot,
105
108
  });
106
109
  }
107
110
 
@@ -140,6 +143,8 @@ export async function validateGossipFuluDataColumnSidecar(
140
143
  if (proposerIndex !== expectedProposerIndex) {
141
144
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
142
145
  code: DataColumnSidecarErrorCode.INCORRECT_PROPOSER,
146
+ slot: blockHeader.slot,
147
+ root: blockRootHex,
143
148
  actualProposerIndex: proposerIndex,
144
149
  expectedProposerIndex,
145
150
  });
@@ -161,9 +166,9 @@ export async function validateGossipFuluDataColumnSidecar(
161
166
  ) {
162
167
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
163
168
  code: DataColumnSidecarErrorCode.PROPOSAL_SIGNATURE_INVALID,
164
- blockRoot: blockRootHex,
165
- index: dataColumnSidecar.index,
166
169
  slot: blockHeader.slot,
170
+ root: blockRootHex,
171
+ index: dataColumnSidecar.index,
167
172
  });
168
173
  }
169
174
 
@@ -185,7 +190,8 @@ export async function validateGossipFuluDataColumnSidecar(
185
190
  if (!valid) {
186
191
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
187
192
  code: DataColumnSidecarErrorCode.INCLUSION_PROOF_INVALID,
188
- slot: dataColumnSidecar.signedBlockHeader.message.slot,
193
+ slot: blockHeader.slot,
194
+ root: blockRootHex,
189
195
  columnIndex: dataColumnSidecar.index,
190
196
  });
191
197
  }
@@ -204,6 +210,7 @@ export async function validateGossipFuluDataColumnSidecar(
204
210
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
205
211
  code: DataColumnSidecarErrorCode.INVALID_KZG_PROOF,
206
212
  slot: blockHeader.slot,
213
+ root: blockRootHex,
207
214
  columnIndex: dataColumnSidecar.index,
208
215
  });
209
216
  } finally {
@@ -240,6 +247,7 @@ export async function validateGossipGloasDataColumnSidecar(
240
247
  if (block.slot !== dataColumnSidecar.slot) {
241
248
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
242
249
  code: DataColumnSidecarErrorCode.INCORRECT_SIDECAR_SLOT,
250
+ root: blockRootHex,
243
251
  columnIndex: dataColumnSidecar.index,
244
252
  expected: block.slot,
245
253
  actual: dataColumnSidecar.slot,
@@ -248,12 +256,14 @@ export async function validateGossipGloasDataColumnSidecar(
248
256
 
249
257
  // [REJECT] The sidecar must pass verify_data_column_sidecar against the block commitments
250
258
  const kzgCommitments = payloadInput.getBlobKzgCommitments();
251
- verifyGloasDataColumnSidecar(dataColumnSidecar, kzgCommitments);
259
+ verifyGloasDataColumnSidecar(dataColumnSidecar, kzgCommitments, blockRootHex);
252
260
 
253
261
  // [REJECT] The sidecar must be on the correct subnet
254
262
  if (computeSubnetForDataColumnSidecar(chain.config, dataColumnSidecar) !== gossipSubnet) {
255
263
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
256
264
  code: DataColumnSidecarErrorCode.INVALID_SUBNET,
265
+ slot: dataColumnSidecar.slot,
266
+ root: blockRootHex,
257
267
  columnIndex: dataColumnSidecar.index,
258
268
  gossipSubnet,
259
269
  });
@@ -272,6 +282,7 @@ export async function validateGossipGloasDataColumnSidecar(
272
282
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
273
283
  code: DataColumnSidecarErrorCode.INVALID_KZG_PROOF,
274
284
  slot: dataColumnSidecar.slot,
285
+ root: blockRootHex,
275
286
  columnIndex: dataColumnSidecar.index,
276
287
  });
277
288
  } finally {
@@ -283,11 +294,17 @@ export async function validateGossipGloasDataColumnSidecar(
283
294
  * SPEC FUNCTION
284
295
  * https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.4/specs/fulu/p2p-interface.md#verify_data_column_sidecar
285
296
  */
286
- function verifyFuluDataColumnSidecar(config: ChainForkConfig, dataColumnSidecar: fulu.DataColumnSidecar): void {
297
+ function verifyFuluDataColumnSidecar(
298
+ config: ChainForkConfig,
299
+ dataColumnSidecar: fulu.DataColumnSidecar,
300
+ blockRootHex: RootHex
301
+ ): void {
302
+ const slot = dataColumnSidecar.signedBlockHeader.message.slot;
287
303
  if (dataColumnSidecar.index >= NUMBER_OF_COLUMNS) {
288
304
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
289
305
  code: DataColumnSidecarErrorCode.INVALID_INDEX,
290
- slot: dataColumnSidecar.signedBlockHeader.message.slot,
306
+ slot,
307
+ root: blockRootHex,
291
308
  columnIndex: dataColumnSidecar.index,
292
309
  });
293
310
  }
@@ -295,18 +312,20 @@ function verifyFuluDataColumnSidecar(config: ChainForkConfig, dataColumnSidecar:
295
312
  if (dataColumnSidecar.kzgCommitments.length === 0) {
296
313
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
297
314
  code: DataColumnSidecarErrorCode.NO_COMMITMENTS,
298
- slot: dataColumnSidecar.signedBlockHeader.message.slot,
315
+ slot,
316
+ root: blockRootHex,
299
317
  columnIndex: dataColumnSidecar.index,
300
318
  });
301
319
  }
302
320
 
303
- const epoch = computeEpochAtSlot(dataColumnSidecar.signedBlockHeader.message.slot);
321
+ const epoch = computeEpochAtSlot(slot);
304
322
  const maxBlobsPerBlock = config.getMaxBlobsPerBlock(epoch);
305
323
 
306
324
  if (dataColumnSidecar.kzgCommitments.length > maxBlobsPerBlock) {
307
325
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
308
326
  code: DataColumnSidecarErrorCode.TOO_MANY_KZG_COMMITMENTS,
309
- slot: dataColumnSidecar.signedBlockHeader.message.slot,
327
+ slot,
328
+ root: blockRootHex,
310
329
  columnIndex: dataColumnSidecar.index,
311
330
  count: dataColumnSidecar.kzgCommitments.length,
312
331
  limit: maxBlobsPerBlock,
@@ -319,6 +338,8 @@ function verifyFuluDataColumnSidecar(config: ChainForkConfig, dataColumnSidecar:
319
338
  ) {
320
339
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
321
340
  code: DataColumnSidecarErrorCode.MISMATCHED_LENGTHS,
341
+ slot,
342
+ root: blockRootHex,
322
343
  columnLength: dataColumnSidecar.column.length,
323
344
  commitmentsLength: dataColumnSidecar.kzgCommitments.length,
324
345
  proofsLength: dataColumnSidecar.kzgProofs.length,
@@ -330,12 +351,17 @@ function verifyFuluDataColumnSidecar(config: ChainForkConfig, dataColumnSidecar:
330
351
  * SPEC FUNCTION
331
352
  * https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.3/specs/gloas/p2p-interface.md#modified-verify_data_column_sidecar
332
353
  */
333
- function verifyGloasDataColumnSidecar(dataColumnSidecar: gloas.DataColumnSidecar, kzgCommitments: Uint8Array[]): void {
354
+ function verifyGloasDataColumnSidecar(
355
+ dataColumnSidecar: gloas.DataColumnSidecar,
356
+ kzgCommitments: Uint8Array[],
357
+ blockRootHex: RootHex
358
+ ): void {
334
359
  const slot = getDataColumnSidecarSlot(dataColumnSidecar);
335
360
  if (dataColumnSidecar.index >= NUMBER_OF_COLUMNS) {
336
361
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
337
362
  code: DataColumnSidecarErrorCode.INVALID_INDEX,
338
363
  slot,
364
+ root: blockRootHex,
339
365
  columnIndex: dataColumnSidecar.index,
340
366
  });
341
367
  }
@@ -344,6 +370,7 @@ function verifyGloasDataColumnSidecar(dataColumnSidecar: gloas.DataColumnSidecar
344
370
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
345
371
  code: DataColumnSidecarErrorCode.NO_COMMITMENTS,
346
372
  slot,
373
+ root: blockRootHex,
347
374
  columnIndex: dataColumnSidecar.index,
348
375
  });
349
376
  }
@@ -354,6 +381,8 @@ function verifyGloasDataColumnSidecar(dataColumnSidecar: gloas.DataColumnSidecar
354
381
  ) {
355
382
  throw new DataColumnSidecarGossipError(GossipAction.REJECT, {
356
383
  code: DataColumnSidecarErrorCode.MISMATCHED_LENGTHS,
384
+ slot,
385
+ root: blockRootHex,
357
386
  columnLength: dataColumnSidecar.column.length,
358
387
  commitmentsLength: kzgCommitments.length,
359
388
  proofsLength: dataColumnSidecar.kzgProofs.length,
@@ -465,8 +494,8 @@ export async function validateFuluBlockDataColumnSidecars(
465
494
  ) {
466
495
  throw new DataColumnSidecarValidationError({
467
496
  code: DataColumnSidecarErrorCode.PROPOSAL_SIGNATURE_INVALID,
468
- blockRoot: rootHex,
469
497
  slot: blockSlot,
498
+ root: rootHex,
470
499
  index: dataColumnSidecars[0].index,
471
500
  });
472
501
  }
@@ -499,6 +528,7 @@ export async function validateFuluBlockDataColumnSidecars(
499
528
  {
500
529
  code: DataColumnSidecarErrorCode.INVALID_INDEX,
501
530
  slot: blockSlot,
531
+ root: toRootHex(blockRoot),
502
532
  columnIndex: columnSidecar.index,
503
533
  },
504
534
  "DataColumnSidecar has invalid index"
@@ -543,6 +573,7 @@ export async function validateFuluBlockDataColumnSidecars(
543
573
  {
544
574
  code: DataColumnSidecarErrorCode.INCLUSION_PROOF_INVALID,
545
575
  slot: blockSlot,
576
+ root: toRootHex(blockRoot),
546
577
  columnIndex: columnSidecar.index,
547
578
  },
548
579
  "DataColumnSidecar has invalid inclusion proof"
@@ -623,6 +654,7 @@ export async function validateGloasBlockDataColumnSidecars(
623
654
  if (columnSidecar.slot !== blockSlot) {
624
655
  throw new DataColumnSidecarValidationError({
625
656
  code: DataColumnSidecarErrorCode.INCORRECT_SIDECAR_SLOT,
657
+ root: toRootHex(blockRoot),
626
658
  columnIndex: columnSidecar.index,
627
659
  expected: blockSlot,
628
660
  actual: columnSidecar.slot,
@@ -644,6 +676,7 @@ export async function validateGloasBlockDataColumnSidecars(
644
676
  {
645
677
  code: DataColumnSidecarErrorCode.INVALID_INDEX,
646
678
  slot: blockSlot,
679
+ root: toRootHex(blockRoot),
647
680
  columnIndex: columnSidecar.index,
648
681
  },
649
682
  "DataColumnSidecar has invalid index"