@lodestar/beacon-node 1.40.0-dev.c975f70481 → 1.40.0-dev.cd347a28d7

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 (379) 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/debug/index.d.ts +1 -1
  5. package/lib/api/impl/debug/index.d.ts.map +1 -1
  6. package/lib/api/impl/debug/index.js +3 -6
  7. package/lib/api/impl/debug/index.js.map +1 -1
  8. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  9. package/lib/api/impl/lodestar/index.js +15 -2
  10. package/lib/api/impl/lodestar/index.js.map +1 -1
  11. package/lib/api/impl/validator/index.d.ts.map +1 -1
  12. package/lib/api/impl/validator/index.js +9 -8
  13. package/lib/api/impl/validator/index.js.map +1 -1
  14. package/lib/chain/ColumnReconstructionTracker.d.ts +2 -0
  15. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  16. package/lib/chain/ColumnReconstructionTracker.js +7 -3
  17. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  18. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  19. package/lib/chain/archiveStore/utils/archiveBlocks.js +4 -0
  20. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  21. package/lib/chain/blocks/blockInput/blockInput.d.ts +30 -0
  22. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  23. package/lib/chain/blocks/blockInput/blockInput.js +42 -1
  24. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  25. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  26. package/lib/chain/blocks/importBlock.js +3 -7
  27. package/lib/chain/blocks/importBlock.js.map +1 -1
  28. package/lib/chain/blocks/index.d.ts.map +1 -1
  29. package/lib/chain/blocks/index.js +0 -14
  30. package/lib/chain/blocks/index.js.map +1 -1
  31. package/lib/chain/blocks/types.d.ts +0 -2
  32. package/lib/chain/blocks/types.d.ts.map +1 -1
  33. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  34. package/lib/chain/blocks/verifyBlock.js +1 -8
  35. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  36. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  37. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  38. package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
  39. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  40. package/lib/chain/blocks/writeBlockInputToDb.d.ts +1 -4
  41. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  42. package/lib/chain/blocks/writeBlockInputToDb.js +28 -28
  43. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  44. package/lib/chain/bls/multithread/index.d.ts +3 -1
  45. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  46. package/lib/chain/bls/multithread/index.js +5 -3
  47. package/lib/chain/bls/multithread/index.js.map +1 -1
  48. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  49. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  50. package/lib/chain/bls/multithread/jobItem.js +2 -2
  51. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  52. package/lib/chain/bls/singleThread.d.ts +4 -2
  53. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  54. package/lib/chain/bls/singleThread.js +4 -2
  55. package/lib/chain/bls/singleThread.js.map +1 -1
  56. package/lib/chain/bls/utils.d.ts +2 -2
  57. package/lib/chain/bls/utils.d.ts.map +1 -1
  58. package/lib/chain/bls/utils.js +9 -6
  59. package/lib/chain/bls/utils.js.map +1 -1
  60. package/lib/chain/chain.d.ts +22 -5
  61. package/lib/chain/chain.d.ts.map +1 -1
  62. package/lib/chain/chain.js +197 -44
  63. package/lib/chain/chain.js.map +1 -1
  64. package/lib/chain/errors/attestationError.d.ts +14 -1
  65. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  66. package/lib/chain/errors/attestationError.js +8 -0
  67. package/lib/chain/errors/attestationError.js.map +1 -1
  68. package/lib/chain/errors/executionPayloadBid.d.ts +48 -0
  69. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -0
  70. package/lib/chain/errors/executionPayloadBid.js +15 -0
  71. package/lib/chain/errors/executionPayloadBid.js.map +1 -0
  72. package/lib/chain/errors/executionPayloadEnvelope.d.ts +48 -0
  73. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -0
  74. package/lib/chain/errors/executionPayloadEnvelope.js +16 -0
  75. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -0
  76. package/lib/chain/errors/index.d.ts +3 -0
  77. package/lib/chain/errors/index.d.ts.map +1 -1
  78. package/lib/chain/errors/index.js +3 -0
  79. package/lib/chain/errors/index.js.map +1 -1
  80. package/lib/chain/errors/payloadAttestation.d.ts +34 -0
  81. package/lib/chain/errors/payloadAttestation.d.ts.map +1 -0
  82. package/lib/chain/errors/payloadAttestation.js +13 -0
  83. package/lib/chain/errors/payloadAttestation.js.map +1 -0
  84. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  85. package/lib/chain/forkChoice/index.js +18 -0
  86. package/lib/chain/forkChoice/index.js.map +1 -1
  87. package/lib/chain/interface.d.ts +21 -3
  88. package/lib/chain/interface.d.ts.map +1 -1
  89. package/lib/chain/interface.js.map +1 -1
  90. package/lib/chain/opPools/executionPayloadBidPool.d.ts +21 -0
  91. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -0
  92. package/lib/chain/opPools/executionPayloadBidPool.js +57 -0
  93. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -0
  94. package/lib/chain/opPools/index.d.ts +2 -0
  95. package/lib/chain/opPools/index.d.ts.map +1 -1
  96. package/lib/chain/opPools/index.js +2 -0
  97. package/lib/chain/opPools/index.js.map +1 -1
  98. package/lib/chain/opPools/payloadAttestationPool.d.ts +24 -0
  99. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -0
  100. package/lib/chain/opPools/payloadAttestationPool.js +109 -0
  101. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -0
  102. package/lib/chain/options.d.ts +0 -1
  103. package/lib/chain/options.d.ts.map +1 -1
  104. package/lib/chain/options.js +0 -1
  105. package/lib/chain/options.js.map +1 -1
  106. package/lib/chain/prepareNextSlot.js +6 -4
  107. package/lib/chain/prepareNextSlot.js.map +1 -1
  108. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  109. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  110. package/lib/chain/produceBlock/produceBlockBody.js +5 -3
  111. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  112. package/lib/chain/regen/interface.d.ts +4 -9
  113. package/lib/chain/regen/interface.d.ts.map +1 -1
  114. package/lib/chain/regen/interface.js +1 -1
  115. package/lib/chain/regen/interface.js.map +1 -1
  116. package/lib/chain/regen/queued.d.ts +2 -3
  117. package/lib/chain/regen/queued.d.ts.map +1 -1
  118. package/lib/chain/regen/queued.js +2 -16
  119. package/lib/chain/regen/queued.js.map +1 -1
  120. package/lib/chain/regen/regen.d.ts +5 -7
  121. package/lib/chain/regen/regen.d.ts.map +1 -1
  122. package/lib/chain/regen/regen.js +7 -17
  123. package/lib/chain/regen/regen.js.map +1 -1
  124. package/lib/chain/seenCache/index.d.ts +3 -1
  125. package/lib/chain/seenCache/index.d.ts.map +1 -1
  126. package/lib/chain/seenCache/index.js +3 -1
  127. package/lib/chain/seenCache/index.js.map +1 -1
  128. package/lib/chain/seenCache/seenAttesters.d.ts +5 -0
  129. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
  130. package/lib/chain/seenCache/seenAttesters.js +5 -0
  131. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  132. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts +12 -0
  133. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts.map +1 -0
  134. package/lib/chain/seenCache/seenExecutionPayloadBids.js +30 -0
  135. package/lib/chain/seenCache/seenExecutionPayloadBids.js.map +1 -0
  136. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +15 -0
  137. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +1 -0
  138. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +28 -0
  139. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +1 -0
  140. package/lib/chain/seenCache/seenGossipBlockInput.js +1 -1
  141. package/lib/chain/stateCache/index.d.ts +0 -2
  142. package/lib/chain/stateCache/index.d.ts.map +1 -1
  143. package/lib/chain/stateCache/index.js +0 -2
  144. package/lib/chain/stateCache/index.js.map +1 -1
  145. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +2 -1
  146. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  147. package/lib/chain/stateCache/persistentCheckpointsCache.js +3 -0
  148. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  149. package/lib/chain/validation/aggregateAndProof.js +35 -14
  150. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  151. package/lib/chain/validation/attestation.d.ts +2 -2
  152. package/lib/chain/validation/attestation.d.ts.map +1 -1
  153. package/lib/chain/validation/attestation.js +27 -8
  154. package/lib/chain/validation/attestation.js.map +1 -1
  155. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  156. package/lib/chain/validation/attesterSlashing.js +1 -1
  157. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  158. package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
  159. package/lib/chain/validation/blobSidecar.js +3 -3
  160. package/lib/chain/validation/blobSidecar.js.map +1 -1
  161. package/lib/chain/validation/block.d.ts.map +1 -1
  162. package/lib/chain/validation/block.js +6 -6
  163. package/lib/chain/validation/block.js.map +1 -1
  164. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  165. package/lib/chain/validation/dataColumnSidecar.js +3 -3
  166. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  167. package/lib/chain/validation/executionPayloadBid.d.ts +5 -0
  168. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -0
  169. package/lib/chain/validation/executionPayloadBid.js +104 -0
  170. package/lib/chain/validation/executionPayloadBid.js.map +1 -0
  171. package/lib/chain/validation/executionPayloadEnvelope.d.ts +5 -0
  172. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -0
  173. package/lib/chain/validation/executionPayloadEnvelope.js +89 -0
  174. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -0
  175. package/lib/chain/validation/payloadAttestationMessage.d.ts +9 -0
  176. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -0
  177. package/lib/chain/validation/payloadAttestationMessage.js +72 -0
  178. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -0
  179. package/lib/chain/validation/proposerSlashing.js +1 -1
  180. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  181. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +2 -3
  182. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -1
  183. package/lib/chain/validation/signatureSets/aggregateAndProof.js +8 -3
  184. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  185. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  186. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  187. package/lib/chain/validation/signatureSets/contributionAndProof.js +3 -3
  188. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  189. package/lib/chain/validation/signatureSets/selectionProof.d.ts +2 -3
  190. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -1
  191. package/lib/chain/validation/signatureSets/selectionProof.js +8 -3
  192. package/lib/chain/validation/signatureSets/selectionProof.js.map +1 -1
  193. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  194. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  195. package/lib/chain/validation/signatureSets/syncCommittee.js +3 -3
  196. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  197. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -2
  198. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  199. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
  200. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  201. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  202. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  203. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +3 -3
  204. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  205. package/lib/chain/validation/syncCommittee.js +1 -1
  206. package/lib/chain/validation/syncCommittee.js.map +1 -1
  207. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  208. package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -5
  209. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  210. package/lib/chain/validation/voluntaryExit.js +1 -1
  211. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  212. package/lib/chain/validatorMonitor.d.ts +2 -0
  213. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  214. package/lib/chain/validatorMonitor.js +49 -7
  215. package/lib/chain/validatorMonitor.js.map +1 -1
  216. package/lib/db/repositories/checkpointState.js +0 -1
  217. package/lib/db/repositories/checkpointState.js.map +1 -1
  218. package/lib/metrics/metrics/lodestar.d.ts +27 -0
  219. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  220. package/lib/metrics/metrics/lodestar.js +64 -0
  221. package/lib/metrics/metrics/lodestar.js.map +1 -1
  222. package/lib/network/gossip/gossipsub.d.ts +19 -0
  223. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  224. package/lib/network/gossip/gossipsub.js +71 -0
  225. package/lib/network/gossip/gossipsub.js.map +1 -1
  226. package/lib/network/gossip/interface.d.ts +20 -2
  227. package/lib/network/gossip/interface.d.ts.map +1 -1
  228. package/lib/network/gossip/interface.js +3 -0
  229. package/lib/network/gossip/interface.js.map +1 -1
  230. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  231. package/lib/network/gossip/scoringParameters.js +38 -2
  232. package/lib/network/gossip/scoringParameters.js.map +1 -1
  233. package/lib/network/gossip/topic.d.ts +77 -1
  234. package/lib/network/gossip/topic.d.ts.map +1 -1
  235. package/lib/network/gossip/topic.js +20 -0
  236. package/lib/network/gossip/topic.js.map +1 -1
  237. package/lib/network/options.d.ts +6 -0
  238. package/lib/network/options.d.ts.map +1 -1
  239. package/lib/network/options.js.map +1 -1
  240. package/lib/network/peers/peerManager.d.ts.map +1 -1
  241. package/lib/network/peers/peerManager.js +9 -0
  242. package/lib/network/peers/peerManager.js.map +1 -1
  243. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  244. package/lib/network/processor/gossipHandlers.js +35 -4
  245. package/lib/network/processor/gossipHandlers.js.map +1 -1
  246. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  247. package/lib/network/processor/gossipQueues/index.js +16 -0
  248. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  249. package/lib/network/processor/index.d.ts.map +1 -1
  250. package/lib/network/processor/index.js +3 -0
  251. package/lib/network/processor/index.js.map +1 -1
  252. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  253. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +2 -4
  254. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  255. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts +1 -2
  256. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -1
  257. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js +5 -26
  258. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
  259. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +1 -2
  260. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -1
  261. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +5 -7
  262. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  263. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  264. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +1 -2
  265. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  266. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -1
  267. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -5
  268. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  269. package/lib/network/reqresp/handlers/index.js +2 -2
  270. package/lib/network/reqresp/handlers/index.js.map +1 -1
  271. package/lib/sync/backfill/backfill.js +2 -2
  272. package/lib/sync/backfill/backfill.js.map +1 -1
  273. package/lib/sync/backfill/verify.d.ts +1 -2
  274. package/lib/sync/backfill/verify.d.ts.map +1 -1
  275. package/lib/sync/backfill/verify.js +2 -2
  276. package/lib/sync/backfill/verify.js.map +1 -1
  277. package/lib/sync/range/chain.d.ts.map +1 -1
  278. package/lib/sync/range/chain.js +0 -1
  279. package/lib/sync/range/chain.js.map +1 -1
  280. package/lib/sync/range/range.d.ts.map +1 -1
  281. package/lib/sync/range/range.js +0 -3
  282. package/lib/sync/range/range.js.map +1 -1
  283. package/lib/sync/unknownBlock.d.ts.map +1 -1
  284. package/lib/sync/unknownBlock.js +0 -3
  285. package/lib/sync/unknownBlock.js.map +1 -1
  286. package/package.json +15 -15
  287. package/src/api/impl/beacon/blocks/index.ts +17 -25
  288. package/src/api/impl/debug/index.ts +2 -6
  289. package/src/api/impl/lodestar/index.ts +18 -3
  290. package/src/api/impl/validator/index.ts +14 -12
  291. package/src/chain/ColumnReconstructionTracker.ts +8 -4
  292. package/src/chain/archiveStore/utils/archiveBlocks.ts +4 -0
  293. package/src/chain/blocks/blockInput/blockInput.ts +53 -2
  294. package/src/chain/blocks/importBlock.ts +3 -7
  295. package/src/chain/blocks/index.ts +0 -19
  296. package/src/chain/blocks/types.ts +0 -2
  297. package/src/chain/blocks/verifyBlock.ts +0 -9
  298. package/src/chain/blocks/verifyBlocksSignatures.ts +4 -12
  299. package/src/chain/blocks/writeBlockInputToDb.ts +33 -30
  300. package/src/chain/bls/multithread/index.ts +7 -4
  301. package/src/chain/bls/multithread/jobItem.ts +7 -3
  302. package/src/chain/bls/singleThread.ts +5 -3
  303. package/src/chain/bls/utils.ts +15 -7
  304. package/src/chain/chain.ts +227 -56
  305. package/src/chain/errors/attestationError.ts +11 -1
  306. package/src/chain/errors/executionPayloadBid.ts +35 -0
  307. package/src/chain/errors/executionPayloadEnvelope.ts +34 -0
  308. package/src/chain/errors/index.ts +3 -0
  309. package/src/chain/errors/payloadAttestation.ts +25 -0
  310. package/src/chain/forkChoice/index.ts +19 -0
  311. package/src/chain/interface.ts +32 -1
  312. package/src/chain/opPools/executionPayloadBidPool.ts +77 -0
  313. package/src/chain/opPools/index.ts +2 -0
  314. package/src/chain/opPools/payloadAttestationPool.ts +157 -0
  315. package/src/chain/options.ts +0 -2
  316. package/src/chain/prepareNextSlot.ts +6 -6
  317. package/src/chain/produceBlock/produceBlockBody.ts +7 -5
  318. package/src/chain/regen/interface.ts +3 -13
  319. package/src/chain/regen/queued.ts +3 -24
  320. package/src/chain/regen/regen.ts +10 -25
  321. package/src/chain/seenCache/index.ts +3 -1
  322. package/src/chain/seenCache/seenAttesters.ts +5 -0
  323. package/src/chain/seenCache/seenExecutionPayloadBids.ts +35 -0
  324. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +34 -0
  325. package/src/chain/seenCache/seenGossipBlockInput.ts +1 -1
  326. package/src/chain/stateCache/index.ts +0 -2
  327. package/src/chain/stateCache/persistentCheckpointsCache.ts +6 -2
  328. package/src/chain/validation/aggregateAndProof.ts +36 -14
  329. package/src/chain/validation/attestation.ts +33 -16
  330. package/src/chain/validation/attesterSlashing.ts +1 -6
  331. package/src/chain/validation/blobSidecar.ts +2 -7
  332. package/src/chain/validation/block.ts +6 -6
  333. package/src/chain/validation/dataColumnSidecar.ts +2 -7
  334. package/src/chain/validation/executionPayloadBid.ts +141 -0
  335. package/src/chain/validation/executionPayloadEnvelope.ts +122 -0
  336. package/src/chain/validation/payloadAttestationMessage.ts +109 -0
  337. package/src/chain/validation/proposerSlashing.ts +1 -6
  338. package/src/chain/validation/signatureSets/aggregateAndProof.ts +9 -14
  339. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -4
  340. package/src/chain/validation/signatureSets/selectionProof.ts +9 -9
  341. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -4
  342. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -3
  343. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -4
  344. package/src/chain/validation/syncCommittee.ts +1 -1
  345. package/src/chain/validation/syncCommitteeContributionAndProof.ts +3 -5
  346. package/src/chain/validation/voluntaryExit.ts +1 -1
  347. package/src/chain/validatorMonitor.ts +62 -8
  348. package/src/db/repositories/checkpointState.ts +1 -1
  349. package/src/metrics/metrics/lodestar.ts +65 -0
  350. package/src/network/gossip/gossipsub.ts +86 -1
  351. package/src/network/gossip/interface.ts +17 -0
  352. package/src/network/gossip/scoringParameters.ts +44 -2
  353. package/src/network/gossip/topic.ts +21 -0
  354. package/src/network/options.ts +6 -0
  355. package/src/network/peers/peerManager.ts +11 -0
  356. package/src/network/processor/gossipHandlers.ts +49 -4
  357. package/src/network/processor/gossipQueues/index.ts +16 -0
  358. package/src/network/processor/index.ts +3 -0
  359. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -4
  360. package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +5 -32
  361. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +5 -9
  362. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +5 -2
  363. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +1 -5
  364. package/src/network/reqresp/handlers/index.ts +2 -2
  365. package/src/sync/backfill/backfill.ts +2 -2
  366. package/src/sync/backfill/verify.ts +2 -3
  367. package/src/sync/range/chain.ts +0 -1
  368. package/src/sync/range/range.ts +0 -3
  369. package/src/sync/unknownBlock.ts +0 -3
  370. package/lib/chain/stateCache/blockStateCacheImpl.d.ts +0 -54
  371. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +0 -1
  372. package/lib/chain/stateCache/blockStateCacheImpl.js +0 -130
  373. package/lib/chain/stateCache/blockStateCacheImpl.js.map +0 -1
  374. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts +0 -60
  375. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +0 -1
  376. package/lib/chain/stateCache/inMemoryCheckpointsCache.js +0 -156
  377. package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +0 -1
  378. package/src/chain/stateCache/blockStateCacheImpl.ts +0 -149
  379. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +0 -192
@@ -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";
@@ -55,12 +60,15 @@ import {CustodyConfig, getValidatorsCustodyRequirement} from "../util/dataColumn
55
60
  import {callInNextEventLoop} from "../util/eventLoop.js";
56
61
  import {ensureDir, writeIfNotExist} from "../util/file.js";
57
62
  import {isOptimisticBlock} from "../util/forkChoice.js";
63
+ import {JobItemQueue} from "../util/queue/itemQueue.ts";
58
64
  import {SerializedCache} from "../util/serializedCache.js";
65
+ import {getSlotFromSignedBeaconBlockSerialized} from "../util/sszBytes.ts";
59
66
  import {ArchiveStore} from "./archiveStore/archiveStore.js";
60
67
  import {CheckpointBalancesCache} from "./balancesCache.js";
61
68
  import {BeaconProposerCache} from "./beaconProposerCache.js";
62
- import {IBlockInput} from "./blocks/blockInput/index.js";
69
+ import {IBlockInput, isBlockInputBlobs, isBlockInputColumns} from "./blocks/blockInput/index.js";
63
70
  import {BlockProcessor, ImportBlockOpts} from "./blocks/index.js";
71
+ import {persistBlockInputs} from "./blocks/writeBlockInputToDb.ts";
64
72
  import {BlsMultiThreadWorkerPool, BlsSingleThreadVerifier, IBlsVerifier} from "./bls/index.js";
65
73
  import {ColumnReconstructionTracker} from "./ColumnReconstructionTracker.js";
66
74
  import {ChainEvent, ChainEventEmitter} from "./emitter.js";
@@ -71,7 +79,9 @@ import {LightClientServer} from "./lightClient/index.js";
71
79
  import {
72
80
  AggregatedAttestationPool,
73
81
  AttestationPool,
82
+ ExecutionPayloadBidPool,
74
83
  OpPool,
84
+ PayloadAttestationPool,
75
85
  SyncCommitteeMessagePool,
76
86
  SyncContributionAndProofPool,
77
87
  } from "./opPools/index.js";
@@ -87,6 +97,9 @@ import {
87
97
  SeenAttesters,
88
98
  SeenBlockProposers,
89
99
  SeenContributionAndProof,
100
+ SeenExecutionPayloadBids,
101
+ SeenExecutionPayloadEnvelopes,
102
+ SeenPayloadAttesters,
90
103
  SeenSyncCommitteeMessages,
91
104
  } from "./seenCache/index.js";
92
105
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -94,12 +107,10 @@ import {SeenAttestationDatas} from "./seenCache/seenAttestationData.js";
94
107
  import {SeenBlockAttesters} from "./seenCache/seenBlockAttesters.js";
95
108
  import {SeenBlockInput} from "./seenCache/seenGossipBlockInput.js";
96
109
  import {ShufflingCache} from "./shufflingCache.js";
97
- import {BlockStateCacheImpl} from "./stateCache/blockStateCacheImpl.js";
98
110
  import {DbCPStateDatastore, checkpointToDatastoreKey} from "./stateCache/datastore/db.js";
99
111
  import {FileCPStateDatastore} from "./stateCache/datastore/file.js";
100
112
  import {CPStateDatastore} from "./stateCache/datastore/types.js";
101
113
  import {FIFOBlockStateCache} from "./stateCache/fifoBlockStateCache.js";
102
- import {InMemoryCheckpointStateCache} from "./stateCache/inMemoryCheckpointsCache.js";
103
114
  import {PersistentCheckpointStateCache} from "./stateCache/persistentCheckpointsCache.js";
104
115
  import {CheckpointStateCache} from "./stateCache/types.js";
105
116
  import {ValidatorMonitor} from "./validatorMonitor.js";
@@ -113,6 +124,11 @@ import {ValidatorMonitor} from "./validatorMonitor.js";
113
124
  */
114
125
  const DEFAULT_MAX_CACHED_PRODUCED_RESULTS = 4;
115
126
 
127
+ /**
128
+ * The maximum number of pending unfinalized block writes to the database before backpressure is applied.
129
+ */
130
+ const DEFAULT_MAX_PENDING_UNFINALIZED_BLOCK_WRITES = 32;
131
+
116
132
  export class BeaconChain implements IBeaconChain {
117
133
  readonly genesisTime: UintNum64;
118
134
  readonly genesisValidatorsRoot: Root;
@@ -124,7 +140,7 @@ export class BeaconChain implements IBeaconChain {
124
140
  readonly logger: Logger;
125
141
  readonly metrics: Metrics | null;
126
142
  readonly validatorMonitor: ValidatorMonitor | null;
127
- readonly bufferPool: BufferPool | null;
143
+ readonly bufferPool: BufferPool;
128
144
 
129
145
  readonly anchorStateLatestBlockSlot: Slot;
130
146
 
@@ -136,18 +152,24 @@ export class BeaconChain implements IBeaconChain {
136
152
  readonly lightClientServer?: LightClientServer;
137
153
  readonly reprocessController: ReprocessController;
138
154
  readonly archiveStore: ArchiveStore;
155
+ readonly unfinalizedBlockWrites: JobItemQueue<[IBlockInput[]], void>;
139
156
 
140
157
  // Ops pool
141
158
  readonly attestationPool: AttestationPool;
142
159
  readonly aggregatedAttestationPool: AggregatedAttestationPool;
143
160
  readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
144
161
  readonly syncContributionAndProofPool;
162
+ readonly executionPayloadBidPool: ExecutionPayloadBidPool;
163
+ readonly payloadAttestationPool: PayloadAttestationPool;
145
164
  readonly opPool: OpPool;
146
165
 
147
166
  // Gossip seen cache
148
167
  readonly seenAttesters = new SeenAttesters();
149
168
  readonly seenAggregators = new SeenAggregators();
169
+ readonly seenPayloadAttesters = new SeenPayloadAttesters();
150
170
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
171
+ readonly seenExecutionPayloadEnvelopes = new SeenExecutionPayloadEnvelopes();
172
+ readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
151
173
  readonly seenBlockProposers = new SeenBlockProposers();
152
174
  readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
153
175
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -254,8 +276,8 @@ export class BeaconChain implements IBeaconChain {
254
276
  const emitter = new ChainEventEmitter();
255
277
  // by default, verify signatures on both main threads and worker threads
256
278
  const bls = opts.blsVerifyAllMainThread
257
- ? new BlsSingleThreadVerifier({metrics})
258
- : new BlsMultiThreadWorkerPool(opts, {logger, metrics});
279
+ ? new BlsSingleThreadVerifier({metrics, index2pubkey})
280
+ : new BlsMultiThreadWorkerPool(opts, {logger, metrics, index2pubkey});
259
281
 
260
282
  if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
261
283
 
@@ -264,6 +286,8 @@ export class BeaconChain implements IBeaconChain {
264
286
  this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
265
287
  this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
266
288
  this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
289
+ this.executionPayloadBidPool = new ExecutionPayloadBidPool();
290
+ this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
267
291
  this.opPool = new OpPool(config);
268
292
 
269
293
  this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
@@ -313,32 +337,22 @@ export class BeaconChain implements IBeaconChain {
313
337
  this.index2pubkey = index2pubkey;
314
338
 
315
339
  const fileDataStore = opts.nHistoricalStatesFileDataStore ?? true;
316
- const blockStateCache = this.opts.nHistoricalStates
317
- ? new FIFOBlockStateCache(this.opts, {metrics})
318
- : new BlockStateCacheImpl({metrics});
319
- this.bufferPool = this.opts.nHistoricalStates
320
- ? new BufferPool(anchorState.type.tree_serializedSize(anchorState.node), metrics)
321
- : null;
322
-
323
- let checkpointStateCache: CheckpointStateCache;
324
- this.cpStateDatastore = undefined;
325
- if (this.opts.nHistoricalStates) {
326
- this.cpStateDatastore = fileDataStore ? new FileCPStateDatastore(dataDir) : new DbCPStateDatastore(this.db);
327
- checkpointStateCache = new PersistentCheckpointStateCache(
328
- {
329
- config,
330
- metrics,
331
- logger,
332
- clock,
333
- blockStateCache,
334
- bufferPool: this.bufferPool,
335
- datastore: this.cpStateDatastore,
336
- },
337
- this.opts
338
- );
339
- } else {
340
- checkpointStateCache = new InMemoryCheckpointStateCache({metrics});
341
- }
340
+ const blockStateCache = new FIFOBlockStateCache(this.opts, {metrics});
341
+ this.bufferPool = new BufferPool(anchorState.type.tree_serializedSize(anchorState.node), metrics);
342
+
343
+ this.cpStateDatastore = fileDataStore ? new FileCPStateDatastore(dataDir) : new DbCPStateDatastore(this.db);
344
+ const checkpointStateCache: CheckpointStateCache = new PersistentCheckpointStateCache(
345
+ {
346
+ config,
347
+ metrics,
348
+ logger,
349
+ clock,
350
+ blockStateCache,
351
+ bufferPool: this.bufferPool,
352
+ datastore: this.cpStateDatastore,
353
+ },
354
+ this.opts
355
+ );
342
356
 
343
357
  const {checkpoint} = computeAnchorCheckpoint(config, anchorState);
344
358
  blockStateCache.add(anchorState);
@@ -361,6 +375,7 @@ export class BeaconChain implements IBeaconChain {
361
375
  forkChoice,
362
376
  blockStateCache,
363
377
  checkpointStateCache,
378
+ seenBlockInputCache: this.seenBlockInputCache,
364
379
  db,
365
380
  metrics,
366
381
  validatorMonitor,
@@ -405,6 +420,15 @@ export class BeaconChain implements IBeaconChain {
405
420
  signal
406
421
  );
407
422
 
423
+ this.unfinalizedBlockWrites = new JobItemQueue(
424
+ persistBlockInputs.bind(this),
425
+ {
426
+ maxLength: DEFAULT_MAX_PENDING_UNFINALIZED_BLOCK_WRITES,
427
+ signal,
428
+ },
429
+ metrics?.unfinalizedBlockWritesQueue
430
+ );
431
+
408
432
  // always run PrepareNextSlotScheduler except for fork_choice spec tests
409
433
  if (!opts?.disablePrepareNextSlot) {
410
434
  new PrepareNextSlotScheduler(this, this.config, metrics, this.logger, signal);
@@ -430,6 +454,12 @@ export class BeaconChain implements IBeaconChain {
430
454
  async close(): Promise<void> {
431
455
  await this.archiveStore.close();
432
456
  await this.bls.close();
457
+
458
+ // Since we don't persist unfinalized fork-choice,
459
+ // we can abort any ongoing unfinalized block writes.
460
+ // TODO: persist fork choice to disk and allow unfinalized block writes to complete.
461
+ this.unfinalizedBlockWrites.dropAllJobs();
462
+
433
463
  this.abortController.abort();
434
464
  }
435
465
 
@@ -459,6 +489,8 @@ export class BeaconChain implements IBeaconChain {
459
489
  this.seenAttesters.isKnown(epoch, index) ||
460
490
  // seenAggregators = single aggregator index, not participants of the aggregate
461
491
  this.seenAggregators.isKnown(epoch, index) ||
492
+ // seenPayloadAttesters = single signer of payload attestation message
493
+ this.seenPayloadAttesters.isKnown(epoch, index) ||
462
494
  // seenBlockProposers = single block proposer
463
495
  this.seenBlockProposers.seenAtEpoch(epoch, index)
464
496
  );
@@ -501,7 +533,7 @@ export class BeaconChain implements IBeaconChain {
501
533
  // only use regen queue if necessary, it'll cache in checkpointStateCache if regen gets through epoch transition
502
534
  const head = this.forkChoice.getHead();
503
535
  const startSlot = computeStartSlotAtEpoch(epoch);
504
- return this.regen.getBlockSlotState(head.blockRoot, startSlot, {dontTransferCache: true}, regenCaller);
536
+ return this.regen.getBlockSlotState(head, startSlot, {dontTransferCache: true}, regenCaller);
505
537
  }
506
538
 
507
539
  async getStateBySlot(
@@ -519,12 +551,7 @@ export class BeaconChain implements IBeaconChain {
519
551
  if (opts?.allowRegen) {
520
552
  // Find closest canonical block to slot, then trigger regen
521
553
  const block = this.forkChoice.getCanonicalBlockClosestLteSlot(slot) ?? finalizedBlock;
522
- const state = await this.regen.getBlockSlotState(
523
- block.blockRoot,
524
- slot,
525
- {dontTransferCache: true},
526
- RegenCaller.restApi
527
- );
554
+ const state = await this.regen.getBlockSlotState(block, slot, {dontTransferCache: true}, RegenCaller.restApi);
528
555
  return {
529
556
  state,
530
557
  executionOptimistic: isOptimisticBlock(block),
@@ -652,6 +679,13 @@ export class BeaconChain implements IBeaconChain {
652
679
  // Unfinalized slot, attempt to find in fork-choice
653
680
  const block = this.forkChoice.getCanonicalBlockAtSlot(slot);
654
681
  if (block) {
682
+ // Block found in fork-choice.
683
+ // It may be in the block input cache, awaiting full DA reconstruction, check there first
684
+ // Otherwise (most likely), check the hot db
685
+ const blockInput = this.seenBlockInputCache.get(block.blockRoot);
686
+ if (blockInput?.hasBlock()) {
687
+ return {block: blockInput.getBlock(), executionOptimistic: isOptimisticBlock(block), finalized: false};
688
+ }
655
689
  const data = await this.db.block.get(fromHex(block.blockRoot));
656
690
  if (data) {
657
691
  return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
@@ -671,6 +705,13 @@ export class BeaconChain implements IBeaconChain {
671
705
  ): Promise<{block: SignedBeaconBlock; executionOptimistic: boolean; finalized: boolean} | null> {
672
706
  const block = this.forkChoice.getBlockHex(root);
673
707
  if (block) {
708
+ // Block found in fork-choice.
709
+ // It may be in the block input cache, awaiting full DA reconstruction, check there first
710
+ // Otherwise (most likely), check the hot db
711
+ const blockInput = this.seenBlockInputCache.get(block.blockRoot);
712
+ if (blockInput?.hasBlock()) {
713
+ return {block: blockInput.getBlock(), executionOptimistic: isOptimisticBlock(block), finalized: false};
714
+ }
674
715
  const data = await this.db.block.get(fromHex(root));
675
716
  if (data) {
676
717
  return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
@@ -683,10 +724,137 @@ export class BeaconChain implements IBeaconChain {
683
724
  return data && {block: data, executionOptimistic: false, finalized: true};
684
725
  }
685
726
 
727
+ async getSerializedBlockByRoot(
728
+ root: string
729
+ ): Promise<{block: Uint8Array; executionOptimistic: boolean; finalized: boolean; slot: Slot} | null> {
730
+ const block = this.forkChoice.getBlockHex(root);
731
+ if (block) {
732
+ // Block found in fork-choice.
733
+ // It may be in the block input cache, awaiting full DA reconstruction, check there first
734
+ // Otherwise (most likely), check the hot db
735
+ const blockInput = this.seenBlockInputCache.get(block.blockRoot);
736
+ if (blockInput?.hasBlock()) {
737
+ const signedBlock = blockInput.getBlock();
738
+ const serialized = this.serializedCache.get(signedBlock);
739
+ if (serialized) {
740
+ return {
741
+ block: serialized,
742
+ executionOptimistic: isOptimisticBlock(block),
743
+ finalized: false,
744
+ slot: blockInput.slot,
745
+ };
746
+ }
747
+ return {
748
+ block: sszTypesFor(blockInput.forkName).SignedBeaconBlock.serialize(signedBlock),
749
+ executionOptimistic: isOptimisticBlock(block),
750
+ finalized: false,
751
+ slot: blockInput.slot,
752
+ };
753
+ }
754
+ const data = await this.db.block.getBinary(fromHex(root));
755
+ if (data) {
756
+ const slot = getSlotFromSignedBeaconBlockSerialized(data);
757
+ if (slot === null) throw new Error(`Invalid block data stored in DB for root: ${root}`);
758
+ return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false, slot};
759
+ }
760
+ // If block is not found in hot db, try cold db since there could be an archive cycle happening
761
+ // TODO: Add a lock to the archiver to have deterministic behavior on where are blocks
762
+ }
763
+
764
+ const data = await this.db.blockArchive.getBinaryEntryByRoot(fromHex(root));
765
+ return data && {block: data.value, executionOptimistic: false, finalized: true, slot: data.key};
766
+ }
767
+
768
+ async getBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<deneb.BlobSidecars | null> {
769
+ const blockInput = this.seenBlockInputCache.get(blockRootHex);
770
+ if (blockInput) {
771
+ if (!isBlockInputBlobs(blockInput)) {
772
+ throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
773
+ }
774
+ if (!blockInput.hasAllData()) {
775
+ return null;
776
+ }
777
+ return blockInput.getBlobs();
778
+ }
779
+ const unfinalizedBlobSidecars = (await this.db.blobSidecars.get(fromHex(blockRootHex)))?.blobSidecars ?? null;
780
+ if (unfinalizedBlobSidecars) {
781
+ return unfinalizedBlobSidecars;
782
+ }
783
+ return (await this.db.blobSidecarsArchive.get(blockSlot))?.blobSidecars ?? null;
784
+ }
785
+
786
+ async getSerializedBlobSidecars(blockSlot: Slot, blockRootHex: string): Promise<Uint8Array | null> {
787
+ const blockInput = this.seenBlockInputCache.get(blockRootHex);
788
+ if (blockInput) {
789
+ if (!isBlockInputBlobs(blockInput)) {
790
+ throw new Error(`Expected block input to have blobs: slot=${blockSlot} root=${blockRootHex}`);
791
+ }
792
+ if (!blockInput.hasAllData()) {
793
+ return null;
794
+ }
795
+ return ssz.deneb.BlobSidecars.serialize(blockInput.getBlobs());
796
+ }
797
+ const unfinalizedBlobSidecarsWrapper = await this.db.blobSidecars.getBinary(fromHex(blockRootHex));
798
+ if (unfinalizedBlobSidecarsWrapper) {
799
+ return unfinalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
800
+ }
801
+ const finalizedBlobSidecarsWrapper = await this.db.blobSidecarsArchive.getBinary(blockSlot);
802
+ if (finalizedBlobSidecarsWrapper) {
803
+ return finalizedBlobSidecarsWrapper.slice(BLOB_SIDECARS_IN_WRAPPER_INDEX);
804
+ }
805
+ return null;
806
+ }
807
+
808
+ async getDataColumnSidecars(blockSlot: Slot, blockRootHex: string): Promise<fulu.DataColumnSidecars> {
809
+ const blockInput = this.seenBlockInputCache.get(blockRootHex);
810
+ if (blockInput) {
811
+ if (!isBlockInputColumns(blockInput)) {
812
+ throw new Error(`Expected block input to have columns: slot=${blockSlot} root=${blockRootHex}`);
813
+ }
814
+ return blockInput.getAllColumns();
815
+ }
816
+ const sidecarsUnfinalized = await this.db.dataColumnSidecar.values(fromHex(blockRootHex));
817
+ if (sidecarsUnfinalized.length > 0) {
818
+ return sidecarsUnfinalized;
819
+ }
820
+ const sidecarsFinalized = await this.db.dataColumnSidecarArchive.values(blockSlot);
821
+ return sidecarsFinalized;
822
+ }
823
+
824
+ async getSerializedDataColumnSidecars(
825
+ blockSlot: Slot,
826
+ blockRootHex: string,
827
+ indices: number[]
828
+ ): Promise<(Uint8Array | undefined)[]> {
829
+ const blockInput = this.seenBlockInputCache.get(blockRootHex);
830
+ if (blockInput) {
831
+ if (!isBlockInputColumns(blockInput)) {
832
+ throw new Error(`Expected block input to have columns: slot=${blockSlot} root=${blockRootHex}`);
833
+ }
834
+ return indices.map((index) => {
835
+ const sidecar = blockInput.getColumn(index);
836
+ if (!sidecar) {
837
+ return undefined;
838
+ }
839
+ const serialized = this.serializedCache.get(sidecar);
840
+ if (serialized) {
841
+ return serialized;
842
+ }
843
+ return ssz.fulu.DataColumnSidecar.serialize(sidecar);
844
+ });
845
+ }
846
+ const sidecarsUnfinalized = await this.db.dataColumnSidecar.getManyBinary(fromHex(blockRootHex), indices);
847
+ if (sidecarsUnfinalized.some((sidecar) => sidecar != null)) {
848
+ return sidecarsUnfinalized;
849
+ }
850
+ const sidecarsFinalized = await this.db.dataColumnSidecarArchive.getManyBinary(blockSlot, indices);
851
+ return sidecarsFinalized;
852
+ }
853
+
686
854
  async produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody> {
687
- const {slot, parentBlockRoot} = blockAttributes;
855
+ const {slot, parentBlock} = blockAttributes;
688
856
  const state = await this.regen.getBlockSlotState(
689
- toRootHex(parentBlockRoot),
857
+ parentBlock,
690
858
  slot,
691
859
  {dontTransferCache: true},
692
860
  RegenCaller.produceBlock
@@ -723,7 +891,7 @@ export class BeaconChain implements IBeaconChain {
723
891
  slot,
724
892
  feeRecipient,
725
893
  commonBlockBodyPromise,
726
- parentBlockRoot,
894
+ parentBlock,
727
895
  }: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}
728
896
  ): Promise<{
729
897
  block: AssembledBlockType<T>;
@@ -732,7 +900,7 @@ export class BeaconChain implements IBeaconChain {
732
900
  shouldOverrideBuilder?: boolean;
733
901
  }> {
734
902
  const state = await this.regen.getBlockSlotState(
735
- toRootHex(parentBlockRoot),
903
+ parentBlock,
736
904
  slot,
737
905
  {dontTransferCache: true},
738
906
  RegenCaller.produceBlock
@@ -749,7 +917,7 @@ export class BeaconChain implements IBeaconChain {
749
917
  graffiti,
750
918
  slot,
751
919
  feeRecipient,
752
- parentBlockRoot,
920
+ parentBlock,
753
921
  proposerIndex,
754
922
  proposerPubKey,
755
923
  commonBlockBodyPromise,
@@ -772,7 +940,7 @@ export class BeaconChain implements IBeaconChain {
772
940
  const block = {
773
941
  slot,
774
942
  proposerIndex,
775
- parentRoot: parentBlockRoot,
943
+ parentRoot: fromHex(parentBlock.blockRoot),
776
944
  stateRoot: ZERO_HASH,
777
945
  body,
778
946
  } as AssembledBlockType<T>;
@@ -968,12 +1136,7 @@ export class BeaconChain implements IBeaconChain {
968
1136
  // thanks to one epoch look ahead, we don't need to dial up to attEpoch
969
1137
  const targetSlot = computeStartSlotAtEpoch(attEpoch - 1);
970
1138
  this.metrics?.gossipAttestation.useHeadBlockStateDialedToTargetEpoch.inc({caller: regenCaller});
971
- state = await this.regen.getBlockSlotState(
972
- attHeadBlock.blockRoot,
973
- targetSlot,
974
- {dontTransferCache: true},
975
- regenCaller
976
- );
1139
+ state = await this.regen.getBlockSlotState(attHeadBlock, targetSlot, {dontTransferCache: true}, regenCaller);
977
1140
  } else if (blockEpoch > attEpoch) {
978
1141
  // should not happen, handled inside attestation verification code
979
1142
  throw Error(`Block epoch ${blockEpoch} is after attestation epoch ${attEpoch}`);
@@ -1102,6 +1265,8 @@ export class BeaconChain implements IBeaconChain {
1102
1265
  metrics.opPool.proposerSlashingPoolSize.set(this.opPool.proposerSlashingsSize);
1103
1266
  metrics.opPool.voluntaryExitPoolSize.set(this.opPool.voluntaryExitsSize);
1104
1267
  metrics.opPool.syncCommitteeMessagePoolSize.set(this.syncCommitteeMessagePool.size);
1268
+ metrics.opPool.payloadAttestationPool.size.set(this.payloadAttestationPool.size);
1269
+ metrics.opPool.executionPayloadBidPool.size.set(this.executionPayloadBidPool.size);
1105
1270
  // syncContributionAndProofPool tracks metrics on its own
1106
1271
  metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
1107
1272
  metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
@@ -1132,6 +1297,9 @@ export class BeaconChain implements IBeaconChain {
1132
1297
  this.aggregatedAttestationPool.prune(slot);
1133
1298
  this.syncCommitteeMessagePool.prune(slot);
1134
1299
  this.seenSyncCommitteeMessages.prune(slot);
1300
+ this.payloadAttestationPool.prune(slot);
1301
+ this.executionPayloadBidPool.prune(slot);
1302
+ this.seenExecutionPayloadBids.prune(slot);
1135
1303
  this.seenAttestationDatas.onSlot(slot);
1136
1304
  this.reprocessController.onSlot(slot);
1137
1305
 
@@ -1155,6 +1323,7 @@ export class BeaconChain implements IBeaconChain {
1155
1323
 
1156
1324
  this.seenAttesters.prune(epoch);
1157
1325
  this.seenAggregators.prune(epoch);
1326
+ this.seenPayloadAttesters.prune(epoch);
1158
1327
  this.seenAggregatedAttestations.prune(epoch);
1159
1328
  this.seenBlockAttesters.prune(epoch);
1160
1329
  this.beaconProposerCache.prune(epoch);
@@ -1178,7 +1347,9 @@ export class BeaconChain implements IBeaconChain {
1178
1347
 
1179
1348
  private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1180
1349
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1181
- this.seenBlockProposers.prune(computeStartSlotAtEpoch(cp.epoch));
1350
+ const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1351
+ this.seenBlockProposers.prune(finalizedSlot);
1352
+ this.seenExecutionPayloadEnvelopes.prune(finalizedSlot);
1182
1353
 
1183
1354
  // Update validator custody to account for effective balance changes
1184
1355
  await this.updateValidatorsCustodyRequirement(cp);
@@ -1186,13 +1357,13 @@ export class BeaconChain implements IBeaconChain {
1186
1357
  // TODO: Improve using regen here
1187
1358
  const {blockRoot, stateRoot, slot} = this.forkChoice.getHead();
1188
1359
  const headState = this.regen.getStateSync(stateRoot);
1189
- const headBlock = await this.db.block.get(fromHex(blockRoot));
1190
- if (headBlock == null) {
1191
- throw Error(`Head block ${slot} ${headBlock} is not available in database`);
1360
+ const blockResult = await this.getBlockByRoot(blockRoot);
1361
+ if (blockResult == null) {
1362
+ throw Error(`Head block for ${slot} is not available in cache or database`);
1192
1363
  }
1193
1364
 
1194
1365
  if (headState) {
1195
- this.opPool.pruneAll(headBlock, headState);
1366
+ this.opPool.pruneAll(blockResult.block, headState);
1196
1367
  }
1197
1368
 
1198
1369
  if (headState === null) {
@@ -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> {}