@lodestar/beacon-node 1.39.1 → 1.40.0-dev.1020f27ca9

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 (441) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +15 -25
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/utils.d.ts +2 -7
  5. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  6. package/lib/api/impl/beacon/state/utils.js +0 -12
  7. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  8. package/lib/api/impl/config/constants.d.ts +3 -0
  9. package/lib/api/impl/config/constants.d.ts.map +1 -1
  10. package/lib/api/impl/config/constants.js +5 -1
  11. package/lib/api/impl/config/constants.js.map +1 -1
  12. package/lib/api/impl/debug/index.d.ts +1 -1
  13. package/lib/api/impl/debug/index.d.ts.map +1 -1
  14. package/lib/api/impl/debug/index.js +3 -6
  15. package/lib/api/impl/debug/index.js.map +1 -1
  16. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  17. package/lib/api/impl/lodestar/index.js +16 -3
  18. package/lib/api/impl/lodestar/index.js.map +1 -1
  19. package/lib/api/impl/proof/index.d.ts.map +1 -1
  20. package/lib/api/impl/proof/index.js +1 -2
  21. package/lib/api/impl/proof/index.js.map +1 -1
  22. package/lib/api/impl/validator/index.d.ts.map +1 -1
  23. package/lib/api/impl/validator/index.js +10 -11
  24. package/lib/api/impl/validator/index.js.map +1 -1
  25. package/lib/chain/ColumnReconstructionTracker.d.ts +2 -0
  26. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  27. package/lib/chain/ColumnReconstructionTracker.js +7 -3
  28. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  29. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  30. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +5 -3
  31. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  32. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  33. package/lib/chain/archiveStore/utils/archiveBlocks.js +23 -14
  34. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  35. package/lib/chain/blocks/blockInput/blockInput.d.ts +2 -0
  36. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  37. package/lib/chain/blocks/blockInput/blockInput.js +6 -0
  38. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  39. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  40. package/lib/chain/blocks/importBlock.js +14 -9
  41. package/lib/chain/blocks/importBlock.js.map +1 -1
  42. package/lib/chain/blocks/index.d.ts.map +1 -1
  43. package/lib/chain/blocks/index.js +0 -14
  44. package/lib/chain/blocks/index.js.map +1 -1
  45. package/lib/chain/blocks/types.d.ts +0 -2
  46. package/lib/chain/blocks/types.d.ts.map +1 -1
  47. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  48. package/lib/chain/blocks/verifyBlock.js +9 -9
  49. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  50. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  51. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  52. package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
  53. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  54. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  55. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +1 -0
  56. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  57. package/lib/chain/blocks/writeBlockInputToDb.d.ts +1 -4
  58. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  59. package/lib/chain/blocks/writeBlockInputToDb.js +20 -28
  60. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  61. package/lib/chain/bls/multithread/index.d.ts +3 -1
  62. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  63. package/lib/chain/bls/multithread/index.js +5 -3
  64. package/lib/chain/bls/multithread/index.js.map +1 -1
  65. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  66. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  67. package/lib/chain/bls/multithread/jobItem.js +2 -2
  68. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  69. package/lib/chain/bls/singleThread.d.ts +4 -2
  70. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  71. package/lib/chain/bls/singleThread.js +4 -2
  72. package/lib/chain/bls/singleThread.js.map +1 -1
  73. package/lib/chain/bls/utils.d.ts +2 -2
  74. package/lib/chain/bls/utils.d.ts.map +1 -1
  75. package/lib/chain/bls/utils.js +9 -6
  76. package/lib/chain/bls/utils.js.map +1 -1
  77. package/lib/chain/chain.d.ts +24 -6
  78. package/lib/chain/chain.d.ts.map +1 -1
  79. package/lib/chain/chain.js +201 -25
  80. package/lib/chain/chain.js.map +1 -1
  81. package/lib/chain/errors/attestationError.d.ts +14 -1
  82. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  83. package/lib/chain/errors/attestationError.js +8 -0
  84. package/lib/chain/errors/attestationError.js.map +1 -1
  85. package/lib/chain/errors/executionPayloadBid.d.ts +48 -0
  86. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -0
  87. package/lib/chain/errors/executionPayloadBid.js +15 -0
  88. package/lib/chain/errors/executionPayloadBid.js.map +1 -0
  89. package/lib/chain/errors/executionPayloadEnvelope.d.ts +48 -0
  90. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -0
  91. package/lib/chain/errors/executionPayloadEnvelope.js +16 -0
  92. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -0
  93. package/lib/chain/errors/index.d.ts +3 -0
  94. package/lib/chain/errors/index.d.ts.map +1 -1
  95. package/lib/chain/errors/index.js +3 -0
  96. package/lib/chain/errors/index.js.map +1 -1
  97. package/lib/chain/errors/payloadAttestation.d.ts +34 -0
  98. package/lib/chain/errors/payloadAttestation.d.ts.map +1 -0
  99. package/lib/chain/errors/payloadAttestation.js +13 -0
  100. package/lib/chain/errors/payloadAttestation.js.map +1 -0
  101. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  102. package/lib/chain/forkChoice/index.js +18 -0
  103. package/lib/chain/forkChoice/index.js.map +1 -1
  104. package/lib/chain/initState.d.ts +1 -1
  105. package/lib/chain/initState.d.ts.map +1 -1
  106. package/lib/chain/initState.js +5 -3
  107. package/lib/chain/initState.js.map +1 -1
  108. package/lib/chain/interface.d.ts +23 -5
  109. package/lib/chain/interface.d.ts.map +1 -1
  110. package/lib/chain/interface.js.map +1 -1
  111. package/lib/chain/lightClient/proofs.d.ts.map +1 -1
  112. package/lib/chain/lightClient/proofs.js +0 -2
  113. package/lib/chain/lightClient/proofs.js.map +1 -1
  114. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +5 -9
  115. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  116. package/lib/chain/opPools/aggregatedAttestationPool.js +12 -141
  117. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  118. package/lib/chain/opPools/executionPayloadBidPool.d.ts +21 -0
  119. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -0
  120. package/lib/chain/opPools/executionPayloadBidPool.js +57 -0
  121. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -0
  122. package/lib/chain/opPools/index.d.ts +2 -0
  123. package/lib/chain/opPools/index.d.ts.map +1 -1
  124. package/lib/chain/opPools/index.js +2 -0
  125. package/lib/chain/opPools/index.js.map +1 -1
  126. package/lib/chain/opPools/opPool.js +5 -8
  127. package/lib/chain/opPools/opPool.js.map +1 -1
  128. package/lib/chain/opPools/payloadAttestationPool.d.ts +24 -0
  129. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -0
  130. package/lib/chain/opPools/payloadAttestationPool.js +109 -0
  131. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -0
  132. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  133. package/lib/chain/prepareNextSlot.js +9 -10
  134. package/lib/chain/prepareNextSlot.js.map +1 -1
  135. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  136. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  137. package/lib/chain/produceBlock/produceBlockBody.js +6 -4
  138. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  139. package/lib/chain/regen/interface.d.ts +4 -13
  140. package/lib/chain/regen/interface.d.ts.map +1 -1
  141. package/lib/chain/regen/interface.js +1 -1
  142. package/lib/chain/regen/interface.js.map +1 -1
  143. package/lib/chain/regen/queued.d.ts +5 -9
  144. package/lib/chain/regen/queued.d.ts.map +1 -1
  145. package/lib/chain/regen/queued.js +16 -40
  146. package/lib/chain/regen/queued.js.map +1 -1
  147. package/lib/chain/regen/regen.d.ts +6 -8
  148. package/lib/chain/regen/regen.d.ts.map +1 -1
  149. package/lib/chain/regen/regen.js +20 -34
  150. package/lib/chain/regen/regen.js.map +1 -1
  151. package/lib/chain/seenCache/index.d.ts +3 -1
  152. package/lib/chain/seenCache/index.d.ts.map +1 -1
  153. package/lib/chain/seenCache/index.js +3 -1
  154. package/lib/chain/seenCache/index.js.map +1 -1
  155. package/lib/chain/seenCache/seenAttesters.d.ts +5 -0
  156. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
  157. package/lib/chain/seenCache/seenAttesters.js +5 -0
  158. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  159. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts +12 -0
  160. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts.map +1 -0
  161. package/lib/chain/seenCache/seenExecutionPayloadBids.js +30 -0
  162. package/lib/chain/seenCache/seenExecutionPayloadBids.js.map +1 -0
  163. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +15 -0
  164. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +1 -0
  165. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +28 -0
  166. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +1 -0
  167. package/lib/chain/seenCache/seenGossipBlockInput.js +1 -1
  168. package/lib/chain/shufflingCache.d.ts +16 -11
  169. package/lib/chain/shufflingCache.d.ts.map +1 -1
  170. package/lib/chain/shufflingCache.js +47 -41
  171. package/lib/chain/shufflingCache.js.map +1 -1
  172. package/lib/chain/stateCache/blockStateCacheImpl.d.ts +1 -2
  173. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +1 -1
  174. package/lib/chain/stateCache/blockStateCacheImpl.js +2 -2
  175. package/lib/chain/stateCache/blockStateCacheImpl.js.map +1 -1
  176. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +1 -2
  177. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  178. package/lib/chain/stateCache/fifoBlockStateCache.js +4 -4
  179. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  180. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts +4 -5
  181. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +1 -1
  182. package/lib/chain/stateCache/inMemoryCheckpointsCache.js +9 -10
  183. package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +1 -1
  184. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +5 -6
  185. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  186. package/lib/chain/stateCache/persistentCheckpointsCache.js +17 -17
  187. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  188. package/lib/chain/stateCache/types.d.ts +5 -6
  189. package/lib/chain/stateCache/types.d.ts.map +1 -1
  190. package/lib/chain/stateCache/types.js.map +1 -1
  191. package/lib/chain/validation/aggregateAndProof.js +35 -14
  192. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  193. package/lib/chain/validation/attestation.d.ts +2 -2
  194. package/lib/chain/validation/attestation.d.ts.map +1 -1
  195. package/lib/chain/validation/attestation.js +28 -9
  196. package/lib/chain/validation/attestation.js.map +1 -1
  197. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  198. package/lib/chain/validation/attesterSlashing.js +2 -2
  199. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  200. package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
  201. package/lib/chain/validation/blobSidecar.js +3 -3
  202. package/lib/chain/validation/blobSidecar.js.map +1 -1
  203. package/lib/chain/validation/block.d.ts.map +1 -1
  204. package/lib/chain/validation/block.js +7 -4
  205. package/lib/chain/validation/block.js.map +1 -1
  206. package/lib/chain/validation/blsToExecutionChange.d.ts.map +1 -1
  207. package/lib/chain/validation/blsToExecutionChange.js +9 -2
  208. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  209. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  210. package/lib/chain/validation/dataColumnSidecar.js +3 -3
  211. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  212. package/lib/chain/validation/executionPayloadBid.d.ts +5 -0
  213. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -0
  214. package/lib/chain/validation/executionPayloadBid.js +104 -0
  215. package/lib/chain/validation/executionPayloadBid.js.map +1 -0
  216. package/lib/chain/validation/executionPayloadEnvelope.d.ts +5 -0
  217. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -0
  218. package/lib/chain/validation/executionPayloadEnvelope.js +89 -0
  219. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -0
  220. package/lib/chain/validation/payloadAttestationMessage.d.ts +9 -0
  221. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -0
  222. package/lib/chain/validation/payloadAttestationMessage.js +72 -0
  223. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -0
  224. package/lib/chain/validation/proposerSlashing.js +3 -2
  225. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  226. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +2 -3
  227. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -1
  228. package/lib/chain/validation/signatureSets/aggregateAndProof.js +8 -3
  229. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  230. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  231. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  232. package/lib/chain/validation/signatureSets/contributionAndProof.js +3 -3
  233. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  234. package/lib/chain/validation/signatureSets/selectionProof.d.ts +2 -3
  235. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -1
  236. package/lib/chain/validation/signatureSets/selectionProof.js +8 -3
  237. package/lib/chain/validation/signatureSets/selectionProof.js.map +1 -1
  238. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  239. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  240. package/lib/chain/validation/signatureSets/syncCommittee.js +3 -3
  241. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  242. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -2
  243. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  244. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
  245. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  246. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  247. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  248. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +3 -3
  249. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  250. package/lib/chain/validation/syncCommittee.js +1 -1
  251. package/lib/chain/validation/syncCommittee.js.map +1 -1
  252. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  253. package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -5
  254. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  255. package/lib/chain/validation/voluntaryExit.js +1 -1
  256. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  257. package/lib/chain/validatorMonitor.d.ts +2 -0
  258. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  259. package/lib/chain/validatorMonitor.js +49 -7
  260. package/lib/chain/validatorMonitor.js.map +1 -1
  261. package/lib/db/repositories/checkpointState.d.ts +2 -6
  262. package/lib/db/repositories/checkpointState.d.ts.map +1 -1
  263. package/lib/db/repositories/checkpointState.js +3 -16
  264. package/lib/db/repositories/checkpointState.js.map +1 -1
  265. package/lib/db/repositories/stateArchive.d.ts +9 -9
  266. package/lib/db/repositories/stateArchive.d.ts.map +1 -1
  267. package/lib/db/repositories/stateArchive.js +6 -21
  268. package/lib/db/repositories/stateArchive.js.map +1 -1
  269. package/lib/execution/engine/mock.d.ts +9 -6
  270. package/lib/execution/engine/mock.d.ts.map +1 -1
  271. package/lib/execution/engine/mock.js +34 -7
  272. package/lib/execution/engine/mock.js.map +1 -1
  273. package/lib/index.d.ts +1 -1
  274. package/lib/index.d.ts.map +1 -1
  275. package/lib/index.js +1 -1
  276. package/lib/index.js.map +1 -1
  277. package/lib/metrics/metrics/lodestar.d.ts +28 -6
  278. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  279. package/lib/metrics/metrics/lodestar.js +67 -17
  280. package/lib/metrics/metrics/lodestar.js.map +1 -1
  281. package/lib/network/gossip/interface.d.ts +20 -2
  282. package/lib/network/gossip/interface.d.ts.map +1 -1
  283. package/lib/network/gossip/interface.js +3 -0
  284. package/lib/network/gossip/interface.js.map +1 -1
  285. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  286. package/lib/network/gossip/scoringParameters.js +38 -2
  287. package/lib/network/gossip/scoringParameters.js.map +1 -1
  288. package/lib/network/gossip/topic.d.ts +77 -1
  289. package/lib/network/gossip/topic.d.ts.map +1 -1
  290. package/lib/network/gossip/topic.js +20 -0
  291. package/lib/network/gossip/topic.js.map +1 -1
  292. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  293. package/lib/network/processor/gossipHandlers.js +34 -3
  294. package/lib/network/processor/gossipHandlers.js.map +1 -1
  295. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  296. package/lib/network/processor/gossipQueues/index.js +16 -0
  297. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  298. package/lib/network/processor/index.d.ts.map +1 -1
  299. package/lib/network/processor/index.js +3 -0
  300. package/lib/network/processor/index.js.map +1 -1
  301. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  302. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +2 -4
  303. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  304. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts +1 -2
  305. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -1
  306. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js +5 -26
  307. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
  308. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +1 -2
  309. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -1
  310. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +5 -7
  311. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  312. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  313. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +1 -2
  314. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  315. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -1
  316. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -5
  317. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  318. package/lib/network/reqresp/handlers/index.js +2 -2
  319. package/lib/network/reqresp/handlers/index.js.map +1 -1
  320. package/lib/network/reqresp/utils/dataColumnResponseValidation.js +1 -1
  321. package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
  322. package/lib/node/nodejs.d.ts.map +1 -1
  323. package/lib/node/nodejs.js +17 -2
  324. package/lib/node/nodejs.js.map +1 -1
  325. package/lib/sync/backfill/backfill.js +2 -2
  326. package/lib/sync/backfill/backfill.js.map +1 -1
  327. package/lib/sync/backfill/verify.d.ts +1 -2
  328. package/lib/sync/backfill/verify.d.ts.map +1 -1
  329. package/lib/sync/backfill/verify.js +2 -2
  330. package/lib/sync/backfill/verify.js.map +1 -1
  331. package/lib/sync/range/chain.d.ts.map +1 -1
  332. package/lib/sync/range/chain.js +0 -1
  333. package/lib/sync/range/chain.js.map +1 -1
  334. package/lib/sync/range/range.d.ts.map +1 -1
  335. package/lib/sync/range/range.js +0 -3
  336. package/lib/sync/range/range.js.map +1 -1
  337. package/lib/sync/unknownBlock.d.ts.map +1 -1
  338. package/lib/sync/unknownBlock.js +0 -3
  339. package/lib/sync/unknownBlock.js.map +1 -1
  340. package/lib/util/sszBytes.js +1 -1
  341. package/lib/util/sszBytes.js.map +1 -1
  342. package/package.json +15 -15
  343. package/src/api/impl/beacon/blocks/index.ts +17 -25
  344. package/src/api/impl/beacon/state/utils.ts +2 -22
  345. package/src/api/impl/config/constants.ts +8 -0
  346. package/src/api/impl/debug/index.ts +2 -6
  347. package/src/api/impl/lodestar/index.ts +19 -4
  348. package/src/api/impl/proof/index.ts +1 -2
  349. package/src/api/impl/validator/index.ts +13 -14
  350. package/src/chain/ColumnReconstructionTracker.ts +8 -4
  351. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +5 -3
  352. package/src/chain/archiveStore/utils/archiveBlocks.ts +25 -14
  353. package/src/chain/blocks/blockInput/blockInput.ts +8 -0
  354. package/src/chain/blocks/importBlock.ts +15 -9
  355. package/src/chain/blocks/index.ts +0 -19
  356. package/src/chain/blocks/types.ts +0 -2
  357. package/src/chain/blocks/verifyBlock.ts +9 -12
  358. package/src/chain/blocks/verifyBlocksSignatures.ts +4 -12
  359. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +1 -0
  360. package/src/chain/blocks/writeBlockInputToDb.ts +24 -30
  361. package/src/chain/bls/multithread/index.ts +7 -4
  362. package/src/chain/bls/multithread/jobItem.ts +7 -3
  363. package/src/chain/bls/singleThread.ts +5 -3
  364. package/src/chain/bls/utils.ts +15 -7
  365. package/src/chain/chain.ts +230 -36
  366. package/src/chain/errors/attestationError.ts +11 -1
  367. package/src/chain/errors/executionPayloadBid.ts +35 -0
  368. package/src/chain/errors/executionPayloadEnvelope.ts +34 -0
  369. package/src/chain/errors/index.ts +3 -0
  370. package/src/chain/errors/payloadAttestation.ts +25 -0
  371. package/src/chain/forkChoice/index.ts +19 -0
  372. package/src/chain/initState.ts +5 -3
  373. package/src/chain/interface.ts +34 -3
  374. package/src/chain/lightClient/proofs.ts +0 -2
  375. package/src/chain/opPools/aggregatedAttestationPool.ts +19 -191
  376. package/src/chain/opPools/executionPayloadBidPool.ts +77 -0
  377. package/src/chain/opPools/index.ts +2 -0
  378. package/src/chain/opPools/opPool.ts +5 -7
  379. package/src/chain/opPools/payloadAttestationPool.ts +157 -0
  380. package/src/chain/prepareNextSlot.ts +8 -12
  381. package/src/chain/produceBlock/produceBlockBody.ts +13 -6
  382. package/src/chain/regen/interface.ts +3 -17
  383. package/src/chain/regen/queued.ts +17 -56
  384. package/src/chain/regen/regen.ts +22 -43
  385. package/src/chain/seenCache/index.ts +3 -1
  386. package/src/chain/seenCache/seenAttesters.ts +5 -0
  387. package/src/chain/seenCache/seenExecutionPayloadBids.ts +35 -0
  388. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +34 -0
  389. package/src/chain/seenCache/seenGossipBlockInput.ts +1 -1
  390. package/src/chain/shufflingCache.ts +67 -50
  391. package/src/chain/stateCache/blockStateCacheImpl.ts +2 -3
  392. package/src/chain/stateCache/fifoBlockStateCache.ts +4 -5
  393. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +9 -15
  394. package/src/chain/stateCache/persistentCheckpointsCache.ts +17 -25
  395. package/src/chain/stateCache/types.ts +5 -10
  396. package/src/chain/validation/aggregateAndProof.ts +36 -14
  397. package/src/chain/validation/attestation.ts +36 -19
  398. package/src/chain/validation/attesterSlashing.ts +9 -7
  399. package/src/chain/validation/blobSidecar.ts +2 -7
  400. package/src/chain/validation/block.ts +8 -4
  401. package/src/chain/validation/blsToExecutionChange.ts +9 -7
  402. package/src/chain/validation/dataColumnSidecar.ts +2 -7
  403. package/src/chain/validation/executionPayloadBid.ts +141 -0
  404. package/src/chain/validation/executionPayloadEnvelope.ts +122 -0
  405. package/src/chain/validation/payloadAttestationMessage.ts +109 -0
  406. package/src/chain/validation/proposerSlashing.ts +3 -7
  407. package/src/chain/validation/signatureSets/aggregateAndProof.ts +9 -14
  408. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -4
  409. package/src/chain/validation/signatureSets/selectionProof.ts +9 -9
  410. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -4
  411. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -3
  412. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -4
  413. package/src/chain/validation/syncCommittee.ts +1 -1
  414. package/src/chain/validation/syncCommitteeContributionAndProof.ts +3 -5
  415. package/src/chain/validation/voluntaryExit.ts +1 -1
  416. package/src/chain/validatorMonitor.ts +62 -8
  417. package/src/db/repositories/checkpointState.ts +3 -19
  418. package/src/db/repositories/stateArchive.ts +13 -27
  419. package/src/execution/engine/mock.ts +40 -13
  420. package/src/index.ts +1 -1
  421. package/src/metrics/metrics/lodestar.ts +68 -17
  422. package/src/network/gossip/interface.ts +17 -0
  423. package/src/network/gossip/scoringParameters.ts +44 -2
  424. package/src/network/gossip/topic.ts +21 -0
  425. package/src/network/processor/gossipHandlers.ts +48 -3
  426. package/src/network/processor/gossipQueues/index.ts +16 -0
  427. package/src/network/processor/index.ts +3 -0
  428. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -4
  429. package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +5 -32
  430. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +5 -9
  431. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +5 -2
  432. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +1 -5
  433. package/src/network/reqresp/handlers/index.ts +2 -2
  434. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +1 -1
  435. package/src/node/nodejs.ts +18 -3
  436. package/src/sync/backfill/backfill.ts +2 -2
  437. package/src/sync/backfill/verify.ts +2 -3
  438. package/src/sync/range/chain.ts +0 -1
  439. package/src/sync/range/range.ts +0 -3
  440. package/src/sync/unknownBlock.ts +0 -3
  441. package/src/util/sszBytes.ts +1 -1
@@ -37,14 +37,19 @@ import {
37
37
  UintNum64,
38
38
  ValidatorIndex,
39
39
  Wei,
40
+ deneb,
41
+ fulu,
40
42
  isBlindedBeaconBlock,
41
43
  phase0,
42
44
  rewards,
45
+ ssz,
46
+ sszTypesFor,
43
47
  } from "@lodestar/types";
44
48
  import {Logger, fromHex, gweiToWei, isErrorAborted, pruneSetToMax, sleep, toRootHex} from "@lodestar/utils";
45
49
  import {ProcessShutdownCallback} from "@lodestar/validator";
46
50
  import {GENESIS_EPOCH, ZERO_HASH} from "../constants/index.js";
47
51
  import {IBeaconDb} from "../db/index.js";
52
+ import {BLOB_SIDECARS_IN_WRAPPER_INDEX} from "../db/repositories/blobSidecars.ts";
48
53
  import {BuilderStatus} from "../execution/builder/http.js";
49
54
  import {IExecutionBuilder, IExecutionEngine} from "../execution/index.js";
50
55
  import {Metrics} from "../metrics/index.js";
@@ -52,14 +57,18 @@ import {computeNodeIdFromPrivateKey} from "../network/subnets/interface.js";
52
57
  import {BufferPool} from "../util/bufferPool.js";
53
58
  import {Clock, ClockEvent, IClock} from "../util/clock.js";
54
59
  import {CustodyConfig, getValidatorsCustodyRequirement} from "../util/dataColumns.js";
60
+ import {callInNextEventLoop} from "../util/eventLoop.js";
55
61
  import {ensureDir, writeIfNotExist} from "../util/file.js";
56
62
  import {isOptimisticBlock} from "../util/forkChoice.js";
63
+ import {JobItemQueue} from "../util/queue/itemQueue.ts";
57
64
  import {SerializedCache} from "../util/serializedCache.js";
65
+ import {getSlotFromSignedBeaconBlockSerialized} from "../util/sszBytes.ts";
58
66
  import {ArchiveStore} from "./archiveStore/archiveStore.js";
59
67
  import {CheckpointBalancesCache} from "./balancesCache.js";
60
68
  import {BeaconProposerCache} from "./beaconProposerCache.js";
61
- import {IBlockInput} from "./blocks/blockInput/index.js";
69
+ import {IBlockInput, isBlockInputBlobs, isBlockInputColumns} from "./blocks/blockInput/index.js";
62
70
  import {BlockProcessor, ImportBlockOpts} from "./blocks/index.js";
71
+ import {persistBlockInputs} from "./blocks/writeBlockInputToDb.ts";
63
72
  import {BlsMultiThreadWorkerPool, BlsSingleThreadVerifier, IBlsVerifier} from "./bls/index.js";
64
73
  import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
65
74
  import {ChainEvent, ChainEventEmitter} from "./emitter.js";
@@ -70,7 +79,9 @@ import {LightClientServer} from "./lightClient/index.js";
70
79
  import {
71
80
  AggregatedAttestationPool,
72
81
  AttestationPool,
82
+ ExecutionPayloadBidPool,
73
83
  OpPool,
84
+ PayloadAttestationPool,
74
85
  SyncCommitteeMessagePool,
75
86
  SyncContributionAndProofPool,
76
87
  } from "./opPools/index.js";
@@ -86,6 +97,9 @@ import {
86
97
  SeenAttesters,
87
98
  SeenBlockProposers,
88
99
  SeenContributionAndProof,
100
+ SeenExecutionPayloadBids,
101
+ SeenExecutionPayloadEnvelopes,
102
+ SeenPayloadAttesters,
89
103
  SeenSyncCommitteeMessages,
90
104
  } from "./seenCache/index.js";
91
105
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -112,6 +126,11 @@ import {ValidatorMonitor} from "./validatorMonitor.js";
112
126
  */
113
127
  const DEFAULT_MAX_CACHED_PRODUCED_RESULTS = 4;
114
128
 
129
+ /**
130
+ * The maximum number of pending unfinalized block writes to the database before backpressure is applied.
131
+ */
132
+ const DEFAULT_MAX_PENDING_UNFINALIZED_BLOCK_WRITES = 32;
133
+
115
134
  export class BeaconChain implements IBeaconChain {
116
135
  readonly genesisTime: UintNum64;
117
136
  readonly genesisValidatorsRoot: Root;
@@ -135,18 +154,24 @@ export class BeaconChain implements IBeaconChain {
135
154
  readonly lightClientServer?: LightClientServer;
136
155
  readonly reprocessController: ReprocessController;
137
156
  readonly archiveStore: ArchiveStore;
157
+ readonly unfinalizedBlockWrites: JobItemQueue<[IBlockInput[]], void>;
138
158
 
139
159
  // Ops pool
140
160
  readonly attestationPool: AttestationPool;
141
161
  readonly aggregatedAttestationPool: AggregatedAttestationPool;
142
162
  readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
143
163
  readonly syncContributionAndProofPool;
164
+ readonly executionPayloadBidPool: ExecutionPayloadBidPool;
165
+ readonly payloadAttestationPool: PayloadAttestationPool;
144
166
  readonly opPool: OpPool;
145
167
 
146
168
  // Gossip seen cache
147
169
  readonly seenAttesters = new SeenAttesters();
148
170
  readonly seenAggregators = new SeenAggregators();
171
+ readonly seenPayloadAttesters = new SeenPayloadAttesters();
149
172
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
173
+ readonly seenExecutionPayloadEnvelopes = new SeenExecutionPayloadEnvelopes();
174
+ readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
150
175
  readonly seenBlockProposers = new SeenBlockProposers();
151
176
  readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
152
177
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -253,8 +278,8 @@ export class BeaconChain implements IBeaconChain {
253
278
  const emitter = new ChainEventEmitter();
254
279
  // by default, verify signatures on both main threads and worker threads
255
280
  const bls = opts.blsVerifyAllMainThread
256
- ? new BlsSingleThreadVerifier({metrics})
257
- : new BlsMultiThreadWorkerPool(opts, {logger, metrics});
281
+ ? new BlsSingleThreadVerifier({metrics, index2pubkey})
282
+ : new BlsMultiThreadWorkerPool(opts, {logger, metrics, index2pubkey});
258
283
 
259
284
  if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
260
285
 
@@ -263,6 +288,8 @@ export class BeaconChain implements IBeaconChain {
263
288
  this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
264
289
  this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
265
290
  this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
291
+ this.executionPayloadBidPool = new ExecutionPayloadBidPool();
292
+ this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
266
293
  this.opPool = new OpPool(config);
267
294
 
268
295
  this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
@@ -291,7 +318,8 @@ export class BeaconChain implements IBeaconChain {
291
318
  });
292
319
 
293
320
  this._earliestAvailableSlot = anchorState.slot;
294
- this.shufflingCache = anchorState.epochCtx.shufflingCache = new ShufflingCache(metrics, logger, this.opts, [
321
+
322
+ this.shufflingCache = new ShufflingCache(metrics, logger, this.opts, [
295
323
  {
296
324
  shuffling: anchorState.epochCtx.previousShuffling,
297
325
  decisionRoot: anchorState.epochCtx.previousDecisionRoot,
@@ -359,6 +387,7 @@ export class BeaconChain implements IBeaconChain {
359
387
  forkChoice,
360
388
  blockStateCache,
361
389
  checkpointStateCache,
390
+ seenBlockInputCache: this.seenBlockInputCache,
362
391
  db,
363
392
  metrics,
364
393
  validatorMonitor,
@@ -403,6 +432,15 @@ export class BeaconChain implements IBeaconChain {
403
432
  signal
404
433
  );
405
434
 
435
+ this.unfinalizedBlockWrites = new JobItemQueue(
436
+ persistBlockInputs.bind(this),
437
+ {
438
+ maxLength: DEFAULT_MAX_PENDING_UNFINALIZED_BLOCK_WRITES,
439
+ signal,
440
+ },
441
+ metrics?.unfinalizedBlockWritesQueue
442
+ );
443
+
406
444
  // always run PrepareNextSlotScheduler except for fork_choice spec tests
407
445
  if (!opts?.disablePrepareNextSlot) {
408
446
  new PrepareNextSlotScheduler(this, this.config, metrics, this.logger, signal);
@@ -417,6 +455,7 @@ export class BeaconChain implements IBeaconChain {
417
455
  clock.addListener(ClockEvent.epoch, this.onClockEpoch.bind(this));
418
456
  emitter.addListener(ChainEvent.forkChoiceFinalized, this.onForkChoiceFinalized.bind(this));
419
457
  emitter.addListener(ChainEvent.forkChoiceJustified, this.onForkChoiceJustified.bind(this));
458
+ emitter.addListener(ChainEvent.checkpoint, this.onCheckpoint.bind(this));
420
459
  }
421
460
 
422
461
  async init(): Promise<void> {
@@ -427,6 +466,12 @@ export class BeaconChain implements IBeaconChain {
427
466
  async close(): Promise<void> {
428
467
  await this.archiveStore.close();
429
468
  await this.bls.close();
469
+
470
+ // Since we don't persist unfinalized fork-choice,
471
+ // we can abort any ongoing unfinalized block writes.
472
+ // TODO: persist fork choice to disk and allow unfinalized block writes to complete.
473
+ this.unfinalizedBlockWrites.dropAllJobs();
474
+
430
475
  this.abortController.abort();
431
476
  }
432
477
 
@@ -456,6 +501,8 @@ export class BeaconChain implements IBeaconChain {
456
501
  this.seenAttesters.isKnown(epoch, index) ||
457
502
  // seenAggregators = single aggregator index, not participants of the aggregate
458
503
  this.seenAggregators.isKnown(epoch, index) ||
504
+ // seenPayloadAttesters = single signer of payload attestation message
505
+ this.seenPayloadAttesters.isKnown(epoch, index) ||
459
506
  // seenBlockProposers = single block proposer
460
507
  this.seenBlockProposers.seenAtEpoch(epoch, index)
461
508
  );
@@ -498,13 +545,13 @@ export class BeaconChain implements IBeaconChain {
498
545
  // only use regen queue if necessary, it'll cache in checkpointStateCache if regen gets through epoch transition
499
546
  const head = this.forkChoice.getHead();
500
547
  const startSlot = computeStartSlotAtEpoch(epoch);
501
- return this.regen.getBlockSlotState(head.blockRoot, startSlot, {dontTransferCache: true}, regenCaller);
548
+ return this.regen.getBlockSlotState(head, startSlot, {dontTransferCache: true}, regenCaller);
502
549
  }
503
550
 
504
551
  async getStateBySlot(
505
552
  slot: Slot,
506
553
  opts?: StateGetOpts
507
- ): Promise<{state: BeaconStateAllForks; executionOptimistic: boolean; finalized: boolean} | null> {
554
+ ): Promise<{state: CachedBeaconStateAllForks; executionOptimistic: boolean; finalized: boolean} | null> {
508
555
  const finalizedBlock = this.forkChoice.getFinalizedBlock();
509
556
 
510
557
  if (slot < finalizedBlock.slot) {
@@ -516,12 +563,7 @@ export class BeaconChain implements IBeaconChain {
516
563
  if (opts?.allowRegen) {
517
564
  // Find closest canonical block to slot, then trigger regen
518
565
  const block = this.forkChoice.getCanonicalBlockClosestLteSlot(slot) ?? finalizedBlock;
519
- const state = await this.regen.getBlockSlotState(
520
- block.blockRoot,
521
- slot,
522
- {dontTransferCache: true},
523
- RegenCaller.restApi
524
- );
566
+ const state = await this.regen.getBlockSlotState(block, slot, {dontTransferCache: true}, RegenCaller.restApi);
525
567
  return {
526
568
  state,
527
569
  executionOptimistic: isOptimisticBlock(block),
@@ -559,7 +601,7 @@ export class BeaconChain implements IBeaconChain {
559
601
  async getStateByStateRoot(
560
602
  stateRoot: RootHex,
561
603
  opts?: StateGetOpts
562
- ): Promise<{state: BeaconStateAllForks; executionOptimistic: boolean; finalized: boolean} | null> {
604
+ ): Promise<{state: CachedBeaconStateAllForks | Uint8Array; executionOptimistic: boolean; finalized: boolean} | null> {
563
605
  if (opts?.allowRegen) {
564
606
  const state = await this.regen.getState(stateRoot, RegenCaller.restApi);
565
607
  const block = this.forkChoice.getBlock(state.latestBlockHeader.hashTreeRoot());
@@ -587,7 +629,8 @@ export class BeaconChain implements IBeaconChain {
587
629
  };
588
630
  }
589
631
 
590
- const data = await this.db.stateArchive.getByRoot(fromHex(stateRoot));
632
+ // this is mostly useful for a node with `--chain.archiveStateEpochFrequency 1`
633
+ const data = await this.db.stateArchive.getBinaryByRoot(fromHex(stateRoot));
591
634
  return data && {state: data, executionOptimistic: false, finalized: true};
592
635
  }
593
636
 
@@ -648,6 +691,13 @@ export class BeaconChain implements IBeaconChain {
648
691
  // Unfinalized slot, attempt to find in fork-choice
649
692
  const block = this.forkChoice.getCanonicalBlockAtSlot(slot);
650
693
  if (block) {
694
+ // Block found in fork-choice.
695
+ // It may be in the block input cache, awaiting full DA reconstruction, check there first
696
+ // Otherwise (most likely), check the hot db
697
+ const blockInput = this.seenBlockInputCache.get(block.blockRoot);
698
+ if (blockInput?.hasBlock()) {
699
+ return {block: blockInput.getBlock(), executionOptimistic: isOptimisticBlock(block), finalized: false};
700
+ }
651
701
  const data = await this.db.block.get(fromHex(block.blockRoot));
652
702
  if (data) {
653
703
  return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
@@ -667,6 +717,13 @@ export class BeaconChain implements IBeaconChain {
667
717
  ): Promise<{block: SignedBeaconBlock; executionOptimistic: boolean; finalized: boolean} | null> {
668
718
  const block = this.forkChoice.getBlockHex(root);
669
719
  if (block) {
720
+ // Block found in fork-choice.
721
+ // It may be in the block input cache, awaiting full DA reconstruction, check there first
722
+ // Otherwise (most likely), check the hot db
723
+ const blockInput = this.seenBlockInputCache.get(block.blockRoot);
724
+ if (blockInput?.hasBlock()) {
725
+ return {block: blockInput.getBlock(), executionOptimistic: isOptimisticBlock(block), finalized: false};
726
+ }
670
727
  const data = await this.db.block.get(fromHex(root));
671
728
  if (data) {
672
729
  return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
@@ -679,10 +736,137 @@ export class BeaconChain implements IBeaconChain {
679
736
  return data && {block: data, executionOptimistic: false, finalized: true};
680
737
  }
681
738
 
739
+ async getSerializedBlockByRoot(
740
+ root: string
741
+ ): Promise<{block: Uint8Array; executionOptimistic: boolean; finalized: boolean; slot: Slot} | null> {
742
+ const block = this.forkChoice.getBlockHex(root);
743
+ if (block) {
744
+ // Block found in fork-choice.
745
+ // It may be in the block input cache, awaiting full DA reconstruction, check there first
746
+ // Otherwise (most likely), check the hot db
747
+ const blockInput = this.seenBlockInputCache.get(block.blockRoot);
748
+ if (blockInput?.hasBlock()) {
749
+ const signedBlock = blockInput.getBlock();
750
+ const serialized = this.serializedCache.get(signedBlock);
751
+ if (serialized) {
752
+ return {
753
+ block: serialized,
754
+ executionOptimistic: isOptimisticBlock(block),
755
+ finalized: false,
756
+ slot: blockInput.slot,
757
+ };
758
+ }
759
+ return {
760
+ block: sszTypesFor(blockInput.forkName).SignedBeaconBlock.serialize(signedBlock),
761
+ executionOptimistic: isOptimisticBlock(block),
762
+ finalized: false,
763
+ slot: blockInput.slot,
764
+ };
765
+ }
766
+ const data = await this.db.block.getBinary(fromHex(root));
767
+ if (data) {
768
+ const slot = getSlotFromSignedBeaconBlockSerialized(data);
769
+ if (slot === null) throw new Error(`Invalid block data stored in DB for root: ${root}`);
770
+ return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false, slot};
771
+ }
772
+ // If block is not found in hot db, try cold db since there could be an archive cycle happening
773
+ // TODO: Add a lock to the archiver to have deterministic behavior on where are blocks
774
+ }
775
+
776
+ const data = await this.db.blockArchive.getBinaryEntryByRoot(fromHex(root));
777
+ return data && {block: data.value, executionOptimistic: false, finalized: true, slot: data.key};
778
+ }
779
+
780
+ async getBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<deneb.BlobSidecars | null> {
781
+ const blockInput = this.seenBlockInputCache.get(blockRootHex);
782
+ if (blockInput) {
783
+ if (!isBlockInputBlobs(blockInput)) {
784
+ throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
785
+ }
786
+ if (!blockInput.hasAllData()) {
787
+ return null;
788
+ }
789
+ return blockInput.getBlobs();
790
+ }
791
+ const unfinalizedBlobSidecars = (await this.db.blobSidecars.get(fromHex(blockRootHex)))?.blobSidecars ?? null;
792
+ if (unfinalizedBlobSidecars) {
793
+ return unfinalizedBlobSidecars;
794
+ }
795
+ return (await this.db.blobSidecarsArchive.get(blockSlot))?.blobSidecars ?? null;
796
+ }
797
+
798
+ async getSerializedBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
799
+ const blockInput = this.seenBlockInputCache.get(blockRootHex);
800
+ if (blockInput) {
801
+ if (!isBlockInputBlobs(blockInput)) {
802
+ throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
803
+ }
804
+ if (!blockInput.hasAllData()) {
805
+ return null;
806
+ }
807
+ return ssz.deneb.BlobSidecars.serialize(blockInput.getBlobs());
808
+ }
809
+ const unfinalizedBlobSidecarsWrapper = await this.db.blobSidecars.getBinary(fromHex(blockRootHex));
810
+ if (unfinalizedBlobSidecarsWrapper) {
811
+ return unfinalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
812
+ }
813
+ const finalizedBlobSidecarsWrapper = await this.db.blobSidecarsArchive.getBinary(blockSlot);
814
+ if (finalizedBlobSidecarsWrapper) {
815
+ return finalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
816
+ }
817
+ return null;
818
+ }
819
+
820
+ async getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<fulu.DataColumnSidecars> {
821
+ const blockInput = this.seenBlockInputCache.get(blockRootHex);
822
+ if (blockInput) {
823
+ if (!isBlockInputColumns(blockInput)) {
824
+ throw new Error(`Expected block input to have columns: slot=${blockSlot} root=${blockRootHex}`);
825
+ }
826
+ return blockInput.getAllColumns();
827
+ }
828
+ const sidecarsUnfinalized = await this.db.dataColumnSidecar.values(fromHex(blockRootHex));
829
+ if (sidecarsUnfinalized.length > 0) {
830
+ return sidecarsUnfinalized;
831
+ }
832
+ const sidecarsFinalized = await this.db.dataColumnSidecarArchive.values(blockSlot);
833
+ return sidecarsFinalized;
834
+ }
835
+
836
+ async getSerializedDataColumnSidecars(
837
+ blockSlot: Slot,
838
+ blockRootHex: string,
839
+ indices: number[]
840
+ ): Promise<(Uint8Array | undefined)[]> {
841
+ const blockInput = this.seenBlockInputCache.get(blockRootHex);
842
+ if (blockInput) {
843
+ if (!isBlockInputColumns(blockInput)) {
844
+ throw new Error(`Expected block input to have columns: slot=${blockSlot} root=${blockRootHex}`);
845
+ }
846
+ return indices.map((index) => {
847
+ const sidecar = blockInput.getColumn(index);
848
+ if (!sidecar) {
849
+ return undefined;
850
+ }
851
+ const serialized = this.serializedCache.get(sidecar);
852
+ if (serialized) {
853
+ return serialized;
854
+ }
855
+ return ssz.fulu.DataColumnSidecar.serialize(sidecar);
856
+ });
857
+ }
858
+ const sidecarsUnfinalized = await this.db.dataColumnSidecar.getManyBinary(fromHex(blockRootHex), indices);
859
+ if (sidecarsUnfinalized.some((sidecar) => sidecar != null)) {
860
+ return sidecarsUnfinalized;
861
+ }
862
+ const sidecarsFinalized = await this.db.dataColumnSidecarArchive.getManyBinary(blockSlot, indices);
863
+ return sidecarsFinalized;
864
+ }
865
+
682
866
  async produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody> {
683
- const {slot, parentBlockRoot} = blockAttributes;
867
+ const {slot, parentBlock} = blockAttributes;
684
868
  const state = await this.regen.getBlockSlotState(
685
- toRootHex(parentBlockRoot),
869
+ parentBlock,
686
870
  slot,
687
871
  {dontTransferCache: true},
688
872
  RegenCaller.produceBlock
@@ -719,7 +903,7 @@ export class BeaconChain implements IBeaconChain {
719
903
  slot,
720
904
  feeRecipient,
721
905
  commonBlockBodyPromise,
722
- parentBlockRoot,
906
+ parentBlock,
723
907
  }: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}
724
908
  ): Promise<{
725
909
  block: AssembledBlockType<T>;
@@ -728,7 +912,7 @@ export class BeaconChain implements IBeaconChain {
728
912
  shouldOverrideBuilder?: boolean;
729
913
  }> {
730
914
  const state = await this.regen.getBlockSlotState(
731
- toRootHex(parentBlockRoot),
915
+ parentBlock,
732
916
  slot,
733
917
  {dontTransferCache: true},
734
918
  RegenCaller.produceBlock
@@ -745,7 +929,7 @@ export class BeaconChain implements IBeaconChain {
745
929
  graffiti,
746
930
  slot,
747
931
  feeRecipient,
748
- parentBlockRoot,
932
+ parentBlock,
749
933
  proposerIndex,
750
934
  proposerPubKey,
751
935
  commonBlockBodyPromise,
@@ -768,7 +952,7 @@ export class BeaconChain implements IBeaconChain {
768
952
  const block = {
769
953
  slot,
770
954
  proposerIndex,
771
- parentRoot: parentBlockRoot,
955
+ parentRoot: fromHex(parentBlock.blockRoot),
772
956
  stateRoot: ZERO_HASH,
773
957
  body,
774
958
  } as AssembledBlockType<T>;
@@ -964,12 +1148,7 @@ export class BeaconChain implements IBeaconChain {
964
1148
  // thanks to one epoch look ahead, we don't need to dial up to attEpoch
965
1149
  const targetSlot = computeStartSlotAtEpoch(attEpoch - 1);
966
1150
  this.metrics?.gossipAttestation.useHeadBlockStateDialedToTargetEpoch.inc({caller: regenCaller});
967
- state = await this.regen.getBlockSlotState(
968
- attHeadBlock.blockRoot,
969
- targetSlot,
970
- {dontTransferCache: true},
971
- regenCaller
972
- );
1151
+ state = await this.regen.getBlockSlotState(attHeadBlock, targetSlot, {dontTransferCache: true}, regenCaller);
973
1152
  } else if (blockEpoch > attEpoch) {
974
1153
  // should not happen, handled inside attestation verification code
975
1154
  throw Error(`Block epoch ${blockEpoch} is after attestation epoch ${attEpoch}`);
@@ -980,8 +1159,8 @@ export class BeaconChain implements IBeaconChain {
980
1159
  this.metrics?.gossipAttestation.useHeadBlockState.inc({caller: regenCaller});
981
1160
  state = await this.regen.getState(attHeadBlock.stateRoot, regenCaller);
982
1161
  }
983
-
984
- // should always be the current epoch of the active context so no need to await a result from the ShufflingCache
1162
+ // resolve the promise to unblock other calls of the same epoch and dependent root
1163
+ this.shufflingCache.processState(state);
985
1164
  return state.epochCtx.getShufflingAtEpoch(attEpoch);
986
1165
  }
987
1166
 
@@ -1098,6 +1277,8 @@ export class BeaconChain implements IBeaconChain {
1098
1277
  metrics.opPool.proposerSlashingPoolSize.set(this.opPool.proposerSlashingsSize);
1099
1278
  metrics.opPool.voluntaryExitPoolSize.set(this.opPool.voluntaryExitsSize);
1100
1279
  metrics.opPool.syncCommitteeMessagePoolSize.set(this.syncCommitteeMessagePool.size);
1280
+ metrics.opPool.payloadAttestationPool.size.set(this.payloadAttestationPool.size);
1281
+ metrics.opPool.executionPayloadBidPool.size.set(this.executionPayloadBidPool.size);
1101
1282
  // syncContributionAndProofPool tracks metrics on its own
1102
1283
  metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
1103
1284
  metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
@@ -1128,6 +1309,9 @@ export class BeaconChain implements IBeaconChain {
1128
1309
  this.aggregatedAttestationPool.prune(slot);
1129
1310
  this.syncCommitteeMessagePool.prune(slot);
1130
1311
  this.seenSyncCommitteeMessages.prune(slot);
1312
+ this.payloadAttestationPool.prune(slot);
1313
+ this.executionPayloadBidPool.prune(slot);
1314
+ this.seenExecutionPayloadBids.prune(slot);
1131
1315
  this.seenAttestationDatas.onSlot(slot);
1132
1316
  this.reprocessController.onSlot(slot);
1133
1317
 
@@ -1151,6 +1335,7 @@ export class BeaconChain implements IBeaconChain {
1151
1335
 
1152
1336
  this.seenAttesters.prune(epoch);
1153
1337
  this.seenAggregators.prune(epoch);
1338
+ this.seenPayloadAttesters.prune(epoch);
1154
1339
  this.seenAggregatedAttestations.prune(epoch);
1155
1340
  this.seenBlockAttesters.prune(epoch);
1156
1341
  this.beaconProposerCache.prune(epoch);
@@ -1165,9 +1350,18 @@ export class BeaconChain implements IBeaconChain {
1165
1350
  this.logger.verbose("Fork choice justified", {epoch: cp.epoch, root: cp.rootHex});
1166
1351
  }
1167
1352
 
1353
+ private onCheckpoint(this: BeaconChain, _checkpoint: phase0.Checkpoint, state: CachedBeaconStateAllForks): void {
1354
+ // Defer to not block other checkpoint event handlers, which can cause lightclient update delays
1355
+ callInNextEventLoop(() => {
1356
+ this.shufflingCache.processState(state);
1357
+ });
1358
+ }
1359
+
1168
1360
  private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1169
1361
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1170
- this.seenBlockProposers.prune(computeStartSlotAtEpoch(cp.epoch));
1362
+ const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1363
+ this.seenBlockProposers.prune(finalizedSlot);
1364
+ this.seenExecutionPayloadEnvelopes.prune(finalizedSlot);
1171
1365
 
1172
1366
  // Update validator custody to account for effective balance changes
1173
1367
  await this.updateValidatorsCustodyRequirement(cp);
@@ -1175,13 +1369,13 @@ export class BeaconChain implements IBeaconChain {
1175
1369
  // TODO: Improve using regen here
1176
1370
  const {blockRoot, stateRoot, slot} = this.forkChoice.getHead();
1177
1371
  const headState = this.regen.getStateSync(stateRoot);
1178
- const headBlock = await this.db.block.get(fromHex(blockRoot));
1179
- if (headBlock == null) {
1180
- throw Error(`Head block ${slot} ${headBlock} is not available in database`);
1372
+ const blockResult = await this.getBlockByRoot(blockRoot);
1373
+ if (blockResult == null) {
1374
+ throw Error(`Head block for ${slot} is not available in cache or database`);
1181
1375
  }
1182
1376
 
1183
1377
  if (headState) {
1184
- this.opPool.pruneAll(headBlock, headState);
1378
+ this.opPool.pruneAll(blockResult.block, headState);
1185
1379
  }
1186
1380
 
1187
1381
  if (headState === null) {
@@ -1295,9 +1489,9 @@ export class BeaconChain implements IBeaconChain {
1295
1489
 
1296
1490
  preState = processSlots(preState, block.slot); // Dial preState's slot to block.slot
1297
1491
 
1298
- const postState = this.regen.getStateSync(toRootHex(block.stateRoot)) ?? undefined;
1492
+ const proposerRewards = this.regen.getStateSync(toRootHex(block.stateRoot))?.proposerRewards ?? undefined;
1299
1493
 
1300
- return computeBlockRewards(this.config, block, preState.clone(), postState?.clone());
1494
+ return computeBlockRewards(this.config, block, preState, proposerRewards);
1301
1495
  }
1302
1496
 
1303
1497
  async getAttestationsRewards(
@@ -1338,6 +1532,6 @@ export class BeaconChain implements IBeaconChain {
1338
1532
 
1339
1533
  preState = processSlots(preState, block.slot); // Dial preState's slot to block.slot
1340
1534
 
1341
- return computeSyncCommitteeRewards(this.config, this.index2pubkey, block, preState.clone(), validatorIds);
1535
+ return computeSyncCommitteeRewards(this.config, this.index2pubkey, block, preState, validatorIds);
1342
1536
  }
1343
1537
  }
@@ -139,6 +139,14 @@ export enum AttestationErrorCode {
139
139
  * Electra: Attester not in committee
140
140
  */
141
141
  ATTESTER_NOT_IN_COMMITTEE = "ATTESTATION_ERROR_ATTESTER_NOT_IN_COMMITTEE",
142
+ /**
143
+ * Gloas: Invalid attestationData index: is non-zero and non-one
144
+ */
145
+ INVALID_PAYLOAD_STATUS_VALUE = "ATTESTATION_ERROR_INVALID_PAYLOAD_STATUS_VALUE",
146
+ /**
147
+ * Gloas: Current slot attestation is marking payload as present
148
+ */
149
+ PREMATURELY_INDICATED_PAYLOAD_PRESENT = "ATTESTATION_ERROR_PREMATURELY_INDICATED_PAYLOAD_PRESENT",
142
150
  }
143
151
 
144
152
  export type AttestationErrorType =
@@ -175,7 +183,9 @@ export type AttestationErrorType =
175
183
  | {code: AttestationErrorCode.TOO_MANY_SKIPPED_SLOTS; headBlockSlot: Slot; attestationSlot: Slot}
176
184
  | {code: AttestationErrorCode.NOT_EXACTLY_ONE_COMMITTEE_BIT_SET}
177
185
  | {code: AttestationErrorCode.NON_ZERO_ATTESTATION_DATA_INDEX}
178
- | {code: AttestationErrorCode.ATTESTER_NOT_IN_COMMITTEE};
186
+ | {code: AttestationErrorCode.ATTESTER_NOT_IN_COMMITTEE}
187
+ | {code: AttestationErrorCode.INVALID_PAYLOAD_STATUS_VALUE; attDataIndex: number}
188
+ | {code: AttestationErrorCode.PREMATURELY_INDICATED_PAYLOAD_PRESENT};
179
189
 
180
190
  export class AttestationError extends GossipActionError<AttestationErrorType> {
181
191
  getMetadata(): Record<string, string | number | null> {
@@ -0,0 +1,35 @@
1
+ import {BuilderIndex, RootHex, Slot} from "@lodestar/types";
2
+ import {GossipActionError} from "./gossipValidation.ts";
3
+
4
+ export enum ExecutionPayloadBidErrorCode {
5
+ BUILDER_NOT_ELIGIBLE = "EXECUTION_PAYLOAD_BID_ERROR_BUILDER_NOT_ELIGIBLE",
6
+ NON_ZERO_EXECUTION_PAYMENT = "EXECUTION_PAYLOAD_BID_ERROR_NON_ZERO_EXECUTION_PAYMENT",
7
+ BID_ALREADY_KNOWN = "EXECUTION_PAYLOAD_BID_ERROR_BID_ALREADY_KNOWN",
8
+ BID_TOO_LOW = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_LOW",
9
+ BID_TOO_HIGH = "EXECUTION_PAYLOAD_BID_ERROR_BID_TOO_HIGH",
10
+ UNKNOWN_BLOCK_ROOT = "EXECUTION_PAYLOAD_BID_ERROR_UNKNOWN_BLOCK_ROOT",
11
+ INVALID_SLOT = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SLOT",
12
+ INVALID_SIGNATURE = "EXECUTION_PAYLOAD_BID_ERROR_INVALID_SIGNATURE",
13
+ }
14
+
15
+ export type ExecutionPayloadBidErrorType =
16
+ | {code: ExecutionPayloadBidErrorCode.BUILDER_NOT_ELIGIBLE; builderIndex: BuilderIndex}
17
+ | {
18
+ code: ExecutionPayloadBidErrorCode.NON_ZERO_EXECUTION_PAYMENT;
19
+ builderIndex: BuilderIndex;
20
+ executionPayment: number;
21
+ }
22
+ | {
23
+ code: ExecutionPayloadBidErrorCode.BID_ALREADY_KNOWN;
24
+ builderIndex: BuilderIndex;
25
+ slot: Slot;
26
+ parentBlockRoot: RootHex;
27
+ parentBlockHash: RootHex;
28
+ }
29
+ | {code: ExecutionPayloadBidErrorCode.BID_TOO_LOW; bidValue: number; currentHighestBid: number}
30
+ | {code: ExecutionPayloadBidErrorCode.BID_TOO_HIGH; bidValue: number; builderBalance: number}
31
+ | {code: ExecutionPayloadBidErrorCode.UNKNOWN_BLOCK_ROOT; parentBlockRoot: RootHex}
32
+ | {code: ExecutionPayloadBidErrorCode.INVALID_SLOT; builderIndex: BuilderIndex; slot: Slot}
33
+ | {code: ExecutionPayloadBidErrorCode.INVALID_SIGNATURE; builderIndex: BuilderIndex; slot: Slot};
34
+
35
+ export class ExecutionPayloadBidError extends GossipActionError<ExecutionPayloadBidErrorType> {}
@@ -0,0 +1,34 @@
1
+ import {BuilderIndex, RootHex, Slot} from "@lodestar/types";
2
+ import {GossipActionError} from "./gossipValidation.js";
3
+
4
+ export enum ExecutionPayloadEnvelopeErrorCode {
5
+ BELONG_TO_FINALIZED_BLOCK = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BELONG_TO_FINALIZED_BLOCK",
6
+ BLOCK_ROOT_UNKNOWN = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_ROOT_UNKNOWN",
7
+ ENVELOPE_ALREADY_KNOWN = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_ALREADY_KNOWN",
8
+ INVALID_BLOCK = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_BLOCK",
9
+ SLOT_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_SLOT_MISMATCH",
10
+ BUILDER_INDEX_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BUILDER_INDEX_MISMATCH",
11
+ BLOCK_HASH_MISMATCH = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_BLOCK_HASH_MISMATCH",
12
+ INVALID_SIGNATURE = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_INVALID_SIGNATURE",
13
+ CACHE_FAIL = "EXECUTION_PAYLOAD_ENVELOPE_ERROR_CACHE_FAIL",
14
+ }
15
+ export type ExecutionPayloadEnvelopeErrorType =
16
+ | {code: ExecutionPayloadEnvelopeErrorCode.BELONG_TO_FINALIZED_BLOCK; envelopeSlot: Slot; finalizedSlot: Slot}
17
+ | {code: ExecutionPayloadEnvelopeErrorCode.BLOCK_ROOT_UNKNOWN; blockRoot: RootHex}
18
+ | {
19
+ code: ExecutionPayloadEnvelopeErrorCode.ENVELOPE_ALREADY_KNOWN;
20
+ blockRoot: RootHex;
21
+ slot: Slot;
22
+ }
23
+ | {code: ExecutionPayloadEnvelopeErrorCode.INVALID_BLOCK; blockRoot: RootHex}
24
+ | {code: ExecutionPayloadEnvelopeErrorCode.SLOT_MISMATCH; envelopeSlot: Slot; blockSlot: Slot}
25
+ | {
26
+ code: ExecutionPayloadEnvelopeErrorCode.BUILDER_INDEX_MISMATCH;
27
+ envelopeBuilderIndex: BuilderIndex;
28
+ bidBuilderIndex: BuilderIndex;
29
+ }
30
+ | {code: ExecutionPayloadEnvelopeErrorCode.BLOCK_HASH_MISMATCH; envelopeBlockHash: RootHex; bidBlockHash: RootHex}
31
+ | {code: ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE}
32
+ | {code: ExecutionPayloadEnvelopeErrorCode.CACHE_FAIL; blockRoot: RootHex};
33
+
34
+ export class ExecutionPayloadEnvelopeError extends GossipActionError<ExecutionPayloadEnvelopeErrorType> {}
@@ -4,7 +4,10 @@ export * from "./blobSidecarError.js";
4
4
  export * from "./blockError.js";
5
5
  export * from "./blsToExecutionChangeError.js";
6
6
  export * from "./dataColumnSidecarError.js";
7
+ export * from "./executionPayloadBid.js";
8
+ export * from "./executionPayloadEnvelope.js";
7
9
  export * from "./gossipValidation.js";
10
+ export * from "./payloadAttestation.js";
8
11
  export * from "./proposerSlashingError.js";
9
12
  export * from "./syncCommitteeError.js";
10
13
  export * from "./voluntaryExitError.js";
@@ -0,0 +1,25 @@
1
+ import {RootHex, Slot, ValidatorIndex} from "@lodestar/types";
2
+ import {GossipActionError} from "./gossipValidation.ts";
3
+
4
+ export enum PayloadAttestationErrorCode {
5
+ NOT_CURRENT_SLOT = "PAYLOAD_ATTESTATION_ERROR_NOT_CURRENT_SLOT",
6
+ PAYLOAD_ATTESTATION_ALREADY_KNOWN = "PAYLOAD_ATTESTATION_ERROR_PAYLOAD_ATTESTATION_ALREADY_KNOWN",
7
+ UNKNOWN_BLOCK_ROOT = "PAYLOAD_ATTESTATION_ERROR_UNKNOWN_BLOCK_ROOT",
8
+ INVALID_BLOCK = "PAYLOAD_ATTESTATION_ERROR_INVALID_BLOCK",
9
+ INVALID_ATTESTER = "PAYLOAD_ATTESTATION_ERROR_INVALID_ATTESTER",
10
+ INVALID_SIGNATURE = "PAYLOAD_ATTESTATION_ERROR_INVALID_SIGNATURE",
11
+ }
12
+ export type PayloadAttestationErrorType =
13
+ | {code: PayloadAttestationErrorCode.NOT_CURRENT_SLOT; currentSlot: Slot; slot: Slot}
14
+ | {
15
+ code: PayloadAttestationErrorCode.PAYLOAD_ATTESTATION_ALREADY_KNOWN;
16
+ validatorIndex: ValidatorIndex;
17
+ slot: Slot;
18
+ blockRoot: RootHex;
19
+ }
20
+ | {code: PayloadAttestationErrorCode.UNKNOWN_BLOCK_ROOT; blockRoot: RootHex}
21
+ | {code: PayloadAttestationErrorCode.INVALID_BLOCK; blockRoot: RootHex}
22
+ | {code: PayloadAttestationErrorCode.INVALID_ATTESTER; attesterIndex: ValidatorIndex}
23
+ | {code: PayloadAttestationErrorCode.INVALID_SIGNATURE};
24
+
25
+ export class PayloadAttestationError extends GossipActionError<PayloadAttestationErrorType> {}