@lodestar/beacon-node 1.40.0-dev.0ae7a89ead → 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 (346) 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/config/constants.d.ts +3 -0
  5. package/lib/api/impl/config/constants.d.ts.map +1 -1
  6. package/lib/api/impl/config/constants.js +5 -1
  7. package/lib/api/impl/config/constants.js.map +1 -1
  8. package/lib/api/impl/debug/index.d.ts +1 -1
  9. package/lib/api/impl/debug/index.d.ts.map +1 -1
  10. package/lib/api/impl/debug/index.js +3 -6
  11. package/lib/api/impl/debug/index.js.map +1 -1
  12. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  13. package/lib/api/impl/lodestar/index.js +15 -2
  14. package/lib/api/impl/lodestar/index.js.map +1 -1
  15. package/lib/api/impl/validator/index.d.ts.map +1 -1
  16. package/lib/api/impl/validator/index.js +9 -8
  17. package/lib/api/impl/validator/index.js.map +1 -1
  18. package/lib/chain/ColumnReconstructionTracker.d.ts +2 -0
  19. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  20. package/lib/chain/ColumnReconstructionTracker.js +7 -3
  21. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  22. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  23. package/lib/chain/archiveStore/utils/archiveBlocks.js +4 -0
  24. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  25. package/lib/chain/blocks/blockInput/blockInput.d.ts +2 -0
  26. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  27. package/lib/chain/blocks/blockInput/blockInput.js +6 -0
  28. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  29. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  30. package/lib/chain/blocks/importBlock.js +2 -6
  31. package/lib/chain/blocks/importBlock.js.map +1 -1
  32. package/lib/chain/blocks/index.d.ts.map +1 -1
  33. package/lib/chain/blocks/index.js +0 -14
  34. package/lib/chain/blocks/index.js.map +1 -1
  35. package/lib/chain/blocks/types.d.ts +0 -2
  36. package/lib/chain/blocks/types.d.ts.map +1 -1
  37. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  38. package/lib/chain/blocks/verifyBlock.js +1 -8
  39. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  40. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  41. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  42. package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
  43. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  44. package/lib/chain/blocks/writeBlockInputToDb.d.ts +1 -4
  45. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  46. package/lib/chain/blocks/writeBlockInputToDb.js +20 -28
  47. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  48. package/lib/chain/bls/multithread/index.d.ts +3 -1
  49. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  50. package/lib/chain/bls/multithread/index.js +5 -3
  51. package/lib/chain/bls/multithread/index.js.map +1 -1
  52. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  53. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  54. package/lib/chain/bls/multithread/jobItem.js +2 -2
  55. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  56. package/lib/chain/bls/singleThread.d.ts +4 -2
  57. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  58. package/lib/chain/bls/singleThread.js +4 -2
  59. package/lib/chain/bls/singleThread.js.map +1 -1
  60. package/lib/chain/bls/utils.d.ts +2 -2
  61. package/lib/chain/bls/utils.d.ts.map +1 -1
  62. package/lib/chain/bls/utils.js +9 -6
  63. package/lib/chain/bls/utils.js.map +1 -1
  64. package/lib/chain/chain.d.ts +21 -4
  65. package/lib/chain/chain.d.ts.map +1 -1
  66. package/lib/chain/chain.js +185 -19
  67. package/lib/chain/chain.js.map +1 -1
  68. package/lib/chain/errors/attestationError.d.ts +14 -1
  69. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  70. package/lib/chain/errors/attestationError.js +8 -0
  71. package/lib/chain/errors/attestationError.js.map +1 -1
  72. package/lib/chain/errors/executionPayloadBid.d.ts +48 -0
  73. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -0
  74. package/lib/chain/errors/executionPayloadBid.js +15 -0
  75. package/lib/chain/errors/executionPayloadBid.js.map +1 -0
  76. package/lib/chain/errors/executionPayloadEnvelope.d.ts +48 -0
  77. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -0
  78. package/lib/chain/errors/executionPayloadEnvelope.js +16 -0
  79. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -0
  80. package/lib/chain/errors/index.d.ts +3 -0
  81. package/lib/chain/errors/index.d.ts.map +1 -1
  82. package/lib/chain/errors/index.js +3 -0
  83. package/lib/chain/errors/index.js.map +1 -1
  84. package/lib/chain/errors/payloadAttestation.d.ts +34 -0
  85. package/lib/chain/errors/payloadAttestation.d.ts.map +1 -0
  86. package/lib/chain/errors/payloadAttestation.js +13 -0
  87. package/lib/chain/errors/payloadAttestation.js.map +1 -0
  88. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  89. package/lib/chain/forkChoice/index.js +18 -0
  90. package/lib/chain/forkChoice/index.js.map +1 -1
  91. package/lib/chain/interface.d.ts +21 -3
  92. package/lib/chain/interface.d.ts.map +1 -1
  93. package/lib/chain/interface.js.map +1 -1
  94. package/lib/chain/opPools/executionPayloadBidPool.d.ts +21 -0
  95. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -0
  96. package/lib/chain/opPools/executionPayloadBidPool.js +57 -0
  97. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -0
  98. package/lib/chain/opPools/index.d.ts +2 -0
  99. package/lib/chain/opPools/index.d.ts.map +1 -1
  100. package/lib/chain/opPools/index.js +2 -0
  101. package/lib/chain/opPools/index.js.map +1 -1
  102. package/lib/chain/opPools/payloadAttestationPool.d.ts +24 -0
  103. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -0
  104. package/lib/chain/opPools/payloadAttestationPool.js +109 -0
  105. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -0
  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 +3 -8
  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 +1 -2
  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/validation/aggregateAndProof.js +35 -14
  142. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  143. package/lib/chain/validation/attestation.d.ts +2 -2
  144. package/lib/chain/validation/attestation.d.ts.map +1 -1
  145. package/lib/chain/validation/attestation.js +27 -8
  146. package/lib/chain/validation/attestation.js.map +1 -1
  147. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  148. package/lib/chain/validation/attesterSlashing.js +1 -1
  149. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  150. package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
  151. package/lib/chain/validation/blobSidecar.js +3 -3
  152. package/lib/chain/validation/blobSidecar.js.map +1 -1
  153. package/lib/chain/validation/block.d.ts.map +1 -1
  154. package/lib/chain/validation/block.js +5 -4
  155. package/lib/chain/validation/block.js.map +1 -1
  156. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  157. package/lib/chain/validation/dataColumnSidecar.js +3 -3
  158. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  159. package/lib/chain/validation/executionPayloadBid.d.ts +5 -0
  160. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -0
  161. package/lib/chain/validation/executionPayloadBid.js +104 -0
  162. package/lib/chain/validation/executionPayloadBid.js.map +1 -0
  163. package/lib/chain/validation/executionPayloadEnvelope.d.ts +5 -0
  164. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -0
  165. package/lib/chain/validation/executionPayloadEnvelope.js +89 -0
  166. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -0
  167. package/lib/chain/validation/payloadAttestationMessage.d.ts +9 -0
  168. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -0
  169. package/lib/chain/validation/payloadAttestationMessage.js +72 -0
  170. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -0
  171. package/lib/chain/validation/proposerSlashing.js +1 -1
  172. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  173. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +2 -3
  174. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -1
  175. package/lib/chain/validation/signatureSets/aggregateAndProof.js +8 -3
  176. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  177. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  178. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  179. package/lib/chain/validation/signatureSets/contributionAndProof.js +3 -3
  180. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  181. package/lib/chain/validation/signatureSets/selectionProof.d.ts +2 -3
  182. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -1
  183. package/lib/chain/validation/signatureSets/selectionProof.js +8 -3
  184. package/lib/chain/validation/signatureSets/selectionProof.js.map +1 -1
  185. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  186. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  187. package/lib/chain/validation/signatureSets/syncCommittee.js +3 -3
  188. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  189. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -2
  190. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  191. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
  192. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  193. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  194. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  195. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +3 -3
  196. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  197. package/lib/chain/validation/syncCommittee.js +1 -1
  198. package/lib/chain/validation/syncCommittee.js.map +1 -1
  199. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  200. package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -5
  201. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  202. package/lib/chain/validation/voluntaryExit.js +1 -1
  203. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  204. package/lib/chain/validatorMonitor.d.ts +2 -0
  205. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  206. package/lib/chain/validatorMonitor.js +49 -7
  207. package/lib/chain/validatorMonitor.js.map +1 -1
  208. package/lib/db/repositories/checkpointState.js +0 -1
  209. package/lib/db/repositories/checkpointState.js.map +1 -1
  210. package/lib/metrics/metrics/lodestar.d.ts +27 -0
  211. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  212. package/lib/metrics/metrics/lodestar.js +64 -0
  213. package/lib/metrics/metrics/lodestar.js.map +1 -1
  214. package/lib/network/gossip/interface.d.ts +20 -2
  215. package/lib/network/gossip/interface.d.ts.map +1 -1
  216. package/lib/network/gossip/interface.js +3 -0
  217. package/lib/network/gossip/interface.js.map +1 -1
  218. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  219. package/lib/network/gossip/scoringParameters.js +38 -2
  220. package/lib/network/gossip/scoringParameters.js.map +1 -1
  221. package/lib/network/gossip/topic.d.ts +77 -1
  222. package/lib/network/gossip/topic.d.ts.map +1 -1
  223. package/lib/network/gossip/topic.js +20 -0
  224. package/lib/network/gossip/topic.js.map +1 -1
  225. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  226. package/lib/network/processor/gossipHandlers.js +34 -3
  227. package/lib/network/processor/gossipHandlers.js.map +1 -1
  228. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  229. package/lib/network/processor/gossipQueues/index.js +16 -0
  230. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  231. package/lib/network/processor/index.d.ts.map +1 -1
  232. package/lib/network/processor/index.js +3 -0
  233. package/lib/network/processor/index.js.map +1 -1
  234. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  235. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +2 -4
  236. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  237. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts +1 -2
  238. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -1
  239. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js +5 -26
  240. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
  241. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +1 -2
  242. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -1
  243. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +5 -7
  244. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  245. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  246. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +1 -2
  247. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  248. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -1
  249. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -5
  250. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  251. package/lib/network/reqresp/handlers/index.js +2 -2
  252. package/lib/network/reqresp/handlers/index.js.map +1 -1
  253. package/lib/sync/backfill/backfill.js +2 -2
  254. package/lib/sync/backfill/backfill.js.map +1 -1
  255. package/lib/sync/backfill/verify.d.ts +1 -2
  256. package/lib/sync/backfill/verify.d.ts.map +1 -1
  257. package/lib/sync/backfill/verify.js +2 -2
  258. package/lib/sync/backfill/verify.js.map +1 -1
  259. package/lib/sync/range/chain.d.ts.map +1 -1
  260. package/lib/sync/range/chain.js +0 -1
  261. package/lib/sync/range/chain.js.map +1 -1
  262. package/lib/sync/range/range.d.ts.map +1 -1
  263. package/lib/sync/range/range.js +0 -3
  264. package/lib/sync/range/range.js.map +1 -1
  265. package/lib/sync/unknownBlock.d.ts.map +1 -1
  266. package/lib/sync/unknownBlock.js +0 -3
  267. package/lib/sync/unknownBlock.js.map +1 -1
  268. package/package.json +15 -15
  269. package/src/api/impl/beacon/blocks/index.ts +17 -25
  270. package/src/api/impl/config/constants.ts +8 -0
  271. package/src/api/impl/debug/index.ts +2 -6
  272. package/src/api/impl/lodestar/index.ts +18 -3
  273. package/src/api/impl/validator/index.ts +12 -11
  274. package/src/chain/ColumnReconstructionTracker.ts +8 -4
  275. package/src/chain/archiveStore/utils/archiveBlocks.ts +4 -0
  276. package/src/chain/blocks/blockInput/blockInput.ts +8 -0
  277. package/src/chain/blocks/importBlock.ts +2 -6
  278. package/src/chain/blocks/index.ts +0 -19
  279. package/src/chain/blocks/types.ts +0 -2
  280. package/src/chain/blocks/verifyBlock.ts +0 -9
  281. package/src/chain/blocks/verifyBlocksSignatures.ts +4 -12
  282. package/src/chain/blocks/writeBlockInputToDb.ts +24 -30
  283. package/src/chain/bls/multithread/index.ts +7 -4
  284. package/src/chain/bls/multithread/jobItem.ts +7 -3
  285. package/src/chain/bls/singleThread.ts +5 -3
  286. package/src/chain/bls/utils.ts +15 -7
  287. package/src/chain/chain.ts +210 -27
  288. package/src/chain/errors/attestationError.ts +11 -1
  289. package/src/chain/errors/executionPayloadBid.ts +35 -0
  290. package/src/chain/errors/executionPayloadEnvelope.ts +34 -0
  291. package/src/chain/errors/index.ts +3 -0
  292. package/src/chain/errors/payloadAttestation.ts +25 -0
  293. package/src/chain/forkChoice/index.ts +19 -0
  294. package/src/chain/interface.ts +32 -1
  295. package/src/chain/opPools/executionPayloadBidPool.ts +77 -0
  296. package/src/chain/opPools/index.ts +2 -0
  297. package/src/chain/opPools/payloadAttestationPool.ts +157 -0
  298. package/src/chain/prepareNextSlot.ts +6 -6
  299. package/src/chain/produceBlock/produceBlockBody.ts +7 -5
  300. package/src/chain/regen/interface.ts +2 -12
  301. package/src/chain/regen/queued.ts +3 -23
  302. package/src/chain/regen/regen.ts +10 -25
  303. package/src/chain/seenCache/index.ts +3 -1
  304. package/src/chain/seenCache/seenAttesters.ts +5 -0
  305. package/src/chain/seenCache/seenExecutionPayloadBids.ts +35 -0
  306. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +34 -0
  307. package/src/chain/seenCache/seenGossipBlockInput.ts +1 -1
  308. package/src/chain/validation/aggregateAndProof.ts +36 -14
  309. package/src/chain/validation/attestation.ts +33 -16
  310. package/src/chain/validation/attesterSlashing.ts +1 -6
  311. package/src/chain/validation/blobSidecar.ts +2 -7
  312. package/src/chain/validation/block.ts +5 -4
  313. package/src/chain/validation/dataColumnSidecar.ts +2 -7
  314. package/src/chain/validation/executionPayloadBid.ts +141 -0
  315. package/src/chain/validation/executionPayloadEnvelope.ts +122 -0
  316. package/src/chain/validation/payloadAttestationMessage.ts +109 -0
  317. package/src/chain/validation/proposerSlashing.ts +1 -6
  318. package/src/chain/validation/signatureSets/aggregateAndProof.ts +9 -14
  319. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -4
  320. package/src/chain/validation/signatureSets/selectionProof.ts +9 -9
  321. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -4
  322. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -3
  323. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -4
  324. package/src/chain/validation/syncCommittee.ts +1 -1
  325. package/src/chain/validation/syncCommitteeContributionAndProof.ts +3 -5
  326. package/src/chain/validation/voluntaryExit.ts +1 -1
  327. package/src/chain/validatorMonitor.ts +62 -8
  328. package/src/db/repositories/checkpointState.ts +1 -1
  329. package/src/metrics/metrics/lodestar.ts +65 -0
  330. package/src/network/gossip/interface.ts +17 -0
  331. package/src/network/gossip/scoringParameters.ts +44 -2
  332. package/src/network/gossip/topic.ts +21 -0
  333. package/src/network/processor/gossipHandlers.ts +48 -3
  334. package/src/network/processor/gossipQueues/index.ts +16 -0
  335. package/src/network/processor/index.ts +3 -0
  336. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -4
  337. package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +5 -32
  338. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +5 -9
  339. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +5 -2
  340. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +1 -5
  341. package/src/network/reqresp/handlers/index.ts +2 -2
  342. package/src/sync/backfill/backfill.ts +2 -2
  343. package/src/sync/backfill/verify.ts +2 -3
  344. package/src/sync/range/chain.ts +0 -1
  345. package/src/sync/range/range.ts +0 -3
  346. package/src/sync/unknownBlock.ts +0 -3
@@ -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";
@@ -113,6 +126,11 @@ import {ValidatorMonitor} from "./validatorMonitor.js";
113
126
  */
114
127
  const DEFAULT_MAX_CACHED_PRODUCED_RESULTS = 4;
115
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
+
116
134
  export class BeaconChain implements IBeaconChain {
117
135
  readonly genesisTime: UintNum64;
118
136
  readonly genesisValidatorsRoot: Root;
@@ -136,18 +154,24 @@ export class BeaconChain implements IBeaconChain {
136
154
  readonly lightClientServer?: LightClientServer;
137
155
  readonly reprocessController: ReprocessController;
138
156
  readonly archiveStore: ArchiveStore;
157
+ readonly unfinalizedBlockWrites: JobItemQueue<[IBlockInput[]], void>;
139
158
 
140
159
  // Ops pool
141
160
  readonly attestationPool: AttestationPool;
142
161
  readonly aggregatedAttestationPool: AggregatedAttestationPool;
143
162
  readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
144
163
  readonly syncContributionAndProofPool;
164
+ readonly executionPayloadBidPool: ExecutionPayloadBidPool;
165
+ readonly payloadAttestationPool: PayloadAttestationPool;
145
166
  readonly opPool: OpPool;
146
167
 
147
168
  // Gossip seen cache
148
169
  readonly seenAttesters = new SeenAttesters();
149
170
  readonly seenAggregators = new SeenAggregators();
171
+ readonly seenPayloadAttesters = new SeenPayloadAttesters();
150
172
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
173
+ readonly seenExecutionPayloadEnvelopes = new SeenExecutionPayloadEnvelopes();
174
+ readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
151
175
  readonly seenBlockProposers = new SeenBlockProposers();
152
176
  readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
153
177
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -254,8 +278,8 @@ export class BeaconChain implements IBeaconChain {
254
278
  const emitter = new ChainEventEmitter();
255
279
  // by default, verify signatures on both main threads and worker threads
256
280
  const bls = opts.blsVerifyAllMainThread
257
- ? new BlsSingleThreadVerifier({metrics})
258
- : new BlsMultiThreadWorkerPool(opts, {logger, metrics});
281
+ ? new BlsSingleThreadVerifier({metrics, index2pubkey})
282
+ : new BlsMultiThreadWorkerPool(opts, {logger, metrics, index2pubkey});
259
283
 
260
284
  if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
261
285
 
@@ -264,6 +288,8 @@ export class BeaconChain implements IBeaconChain {
264
288
  this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
265
289
  this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
266
290
  this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
291
+ this.executionPayloadBidPool = new ExecutionPayloadBidPool();
292
+ this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
267
293
  this.opPool = new OpPool(config);
268
294
 
269
295
  this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
@@ -361,6 +387,7 @@ export class BeaconChain implements IBeaconChain {
361
387
  forkChoice,
362
388
  blockStateCache,
363
389
  checkpointStateCache,
390
+ seenBlockInputCache: this.seenBlockInputCache,
364
391
  db,
365
392
  metrics,
366
393
  validatorMonitor,
@@ -405,6 +432,15 @@ export class BeaconChain implements IBeaconChain {
405
432
  signal
406
433
  );
407
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
+
408
444
  // always run PrepareNextSlotScheduler except for fork_choice spec tests
409
445
  if (!opts?.disablePrepareNextSlot) {
410
446
  new PrepareNextSlotScheduler(this, this.config, metrics, this.logger, signal);
@@ -430,6 +466,12 @@ export class BeaconChain implements IBeaconChain {
430
466
  async close(): Promise<void> {
431
467
  await this.archiveStore.close();
432
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
+
433
475
  this.abortController.abort();
434
476
  }
435
477
 
@@ -459,6 +501,8 @@ export class BeaconChain implements IBeaconChain {
459
501
  this.seenAttesters.isKnown(epoch, index) ||
460
502
  // seenAggregators = single aggregator index, not participants of the aggregate
461
503
  this.seenAggregators.isKnown(epoch, index) ||
504
+ // seenPayloadAttesters = single signer of payload attestation message
505
+ this.seenPayloadAttesters.isKnown(epoch, index) ||
462
506
  // seenBlockProposers = single block proposer
463
507
  this.seenBlockProposers.seenAtEpoch(epoch, index)
464
508
  );
@@ -501,7 +545,7 @@ export class BeaconChain implements IBeaconChain {
501
545
  // only use regen queue if necessary, it'll cache in checkpointStateCache if regen gets through epoch transition
502
546
  const head = this.forkChoice.getHead();
503
547
  const startSlot = computeStartSlotAtEpoch(epoch);
504
- return this.regen.getBlockSlotState(head.blockRoot, startSlot, {dontTransferCache: true}, regenCaller);
548
+ return this.regen.getBlockSlotState(head, startSlot, {dontTransferCache: true}, regenCaller);
505
549
  }
506
550
 
507
551
  async getStateBySlot(
@@ -519,12 +563,7 @@ export class BeaconChain implements IBeaconChain {
519
563
  if (opts?.allowRegen) {
520
564
  // Find closest canonical block to slot, then trigger regen
521
565
  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
- );
566
+ const state = await this.regen.getBlockSlotState(block, slot, {dontTransferCache: true}, RegenCaller.restApi);
528
567
  return {
529
568
  state,
530
569
  executionOptimistic: isOptimisticBlock(block),
@@ -652,6 +691,13 @@ export class BeaconChain implements IBeaconChain {
652
691
  // Unfinalized slot, attempt to find in fork-choice
653
692
  const block = this.forkChoice.getCanonicalBlockAtSlot(slot);
654
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
+ }
655
701
  const data = await this.db.block.get(fromHex(block.blockRoot));
656
702
  if (data) {
657
703
  return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
@@ -671,6 +717,13 @@ export class BeaconChain implements IBeaconChain {
671
717
  ): Promise<{block: SignedBeaconBlock; executionOptimistic: boolean; finalized: boolean} | null> {
672
718
  const block = this.forkChoice.getBlockHex(root);
673
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
+ }
674
727
  const data = await this.db.block.get(fromHex(root));
675
728
  if (data) {
676
729
  return {block: data, executionOptimistic: isOptimisticBlock(block), finalized: false};
@@ -683,10 +736,137 @@ export class BeaconChain implements IBeaconChain {
683
736
  return data && {block: data, executionOptimistic: false, finalized: true};
684
737
  }
685
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
+
686
866
  async produceCommonBlockBody(blockAttributes: BlockAttributes): Promise<CommonBlockBody> {
687
- const {slot, parentBlockRoot} = blockAttributes;
867
+ const {slot, parentBlock} = blockAttributes;
688
868
  const state = await this.regen.getBlockSlotState(
689
- toRootHex(parentBlockRoot),
869
+ parentBlock,
690
870
  slot,
691
871
  {dontTransferCache: true},
692
872
  RegenCaller.produceBlock
@@ -723,7 +903,7 @@ export class BeaconChain implements IBeaconChain {
723
903
  slot,
724
904
  feeRecipient,
725
905
  commonBlockBodyPromise,
726
- parentBlockRoot,
906
+ parentBlock,
727
907
  }: BlockAttributes & {commonBlockBodyPromise: Promise<CommonBlockBody>}
728
908
  ): Promise<{
729
909
  block: AssembledBlockType<T>;
@@ -732,7 +912,7 @@ export class BeaconChain implements IBeaconChain {
732
912
  shouldOverrideBuilder?: boolean;
733
913
  }> {
734
914
  const state = await this.regen.getBlockSlotState(
735
- toRootHex(parentBlockRoot),
915
+ parentBlock,
736
916
  slot,
737
917
  {dontTransferCache: true},
738
918
  RegenCaller.produceBlock
@@ -749,7 +929,7 @@ export class BeaconChain implements IBeaconChain {
749
929
  graffiti,
750
930
  slot,
751
931
  feeRecipient,
752
- parentBlockRoot,
932
+ parentBlock,
753
933
  proposerIndex,
754
934
  proposerPubKey,
755
935
  commonBlockBodyPromise,
@@ -772,7 +952,7 @@ export class BeaconChain implements IBeaconChain {
772
952
  const block = {
773
953
  slot,
774
954
  proposerIndex,
775
- parentRoot: parentBlockRoot,
955
+ parentRoot: fromHex(parentBlock.blockRoot),
776
956
  stateRoot: ZERO_HASH,
777
957
  body,
778
958
  } as AssembledBlockType<T>;
@@ -968,12 +1148,7 @@ export class BeaconChain implements IBeaconChain {
968
1148
  // thanks to one epoch look ahead, we don't need to dial up to attEpoch
969
1149
  const targetSlot = computeStartSlotAtEpoch(attEpoch - 1);
970
1150
  this.metrics?.gossipAttestation.useHeadBlockStateDialedToTargetEpoch.inc({caller: regenCaller});
971
- state = await this.regen.getBlockSlotState(
972
- attHeadBlock.blockRoot,
973
- targetSlot,
974
- {dontTransferCache: true},
975
- regenCaller
976
- );
1151
+ state = await this.regen.getBlockSlotState(attHeadBlock, targetSlot, {dontTransferCache: true}, regenCaller);
977
1152
  } else if (blockEpoch > attEpoch) {
978
1153
  // should not happen, handled inside attestation verification code
979
1154
  throw Error(`Block epoch ${blockEpoch} is after attestation epoch ${attEpoch}`);
@@ -1102,6 +1277,8 @@ export class BeaconChain implements IBeaconChain {
1102
1277
  metrics.opPool.proposerSlashingPoolSize.set(this.opPool.proposerSlashingsSize);
1103
1278
  metrics.opPool.voluntaryExitPoolSize.set(this.opPool.voluntaryExitsSize);
1104
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);
1105
1282
  // syncContributionAndProofPool tracks metrics on its own
1106
1283
  metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
1107
1284
  metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
@@ -1132,6 +1309,9 @@ export class BeaconChain implements IBeaconChain {
1132
1309
  this.aggregatedAttestationPool.prune(slot);
1133
1310
  this.syncCommitteeMessagePool.prune(slot);
1134
1311
  this.seenSyncCommitteeMessages.prune(slot);
1312
+ this.payloadAttestationPool.prune(slot);
1313
+ this.executionPayloadBidPool.prune(slot);
1314
+ this.seenExecutionPayloadBids.prune(slot);
1135
1315
  this.seenAttestationDatas.onSlot(slot);
1136
1316
  this.reprocessController.onSlot(slot);
1137
1317
 
@@ -1155,6 +1335,7 @@ export class BeaconChain implements IBeaconChain {
1155
1335
 
1156
1336
  this.seenAttesters.prune(epoch);
1157
1337
  this.seenAggregators.prune(epoch);
1338
+ this.seenPayloadAttesters.prune(epoch);
1158
1339
  this.seenAggregatedAttestations.prune(epoch);
1159
1340
  this.seenBlockAttesters.prune(epoch);
1160
1341
  this.beaconProposerCache.prune(epoch);
@@ -1178,7 +1359,9 @@ export class BeaconChain implements IBeaconChain {
1178
1359
 
1179
1360
  private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1180
1361
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1181
- this.seenBlockProposers.prune(computeStartSlotAtEpoch(cp.epoch));
1362
+ const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1363
+ this.seenBlockProposers.prune(finalizedSlot);
1364
+ this.seenExecutionPayloadEnvelopes.prune(finalizedSlot);
1182
1365
 
1183
1366
  // Update validator custody to account for effective balance changes
1184
1367
  await this.updateValidatorsCustodyRequirement(cp);
@@ -1186,13 +1369,13 @@ export class BeaconChain implements IBeaconChain {
1186
1369
  // TODO: Improve using regen here
1187
1370
  const {blockRoot, stateRoot, slot} = this.forkChoice.getHead();
1188
1371
  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`);
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`);
1192
1375
  }
1193
1376
 
1194
1377
  if (headState) {
1195
- this.opPool.pruneAll(headBlock, headState);
1378
+ this.opPool.pruneAll(blockResult.block, headState);
1196
1379
  }
1197
1380
 
1198
1381
  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> {}
@@ -11,6 +11,7 @@ import {
11
11
  import {ZERO_HASH_HEX} from "@lodestar/params";
12
12
  import {
13
13
  CachedBeaconStateAllForks,
14
+ CachedBeaconStateGloas,
14
15
  DataAvailabilityStatus,
15
16
  computeAnchorCheckpoint,
16
17
  computeEpochAtSlot,
@@ -144,6 +145,15 @@ export function initializeForkChoiceFromFinalizedState(
144
145
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
145
146
 
146
147
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
148
+ ...(computeEpochAtSlot(blockHeader.slot) < state.config.GLOAS_FORK_EPOCH
149
+ ? {
150
+ builderIndex: undefined,
151
+ blockHashHex: undefined,
152
+ }
153
+ : {
154
+ builderIndex: (state as CachedBeaconStateGloas).latestExecutionPayloadBid.builderIndex,
155
+ blockHashHex: toRootHex((state as CachedBeaconStateGloas).latestExecutionPayloadBid.blockHash),
156
+ }),
147
157
  },
148
158
  currentSlot
149
159
  ),
@@ -225,6 +235,15 @@ export function initializeForkChoiceFromUnfinalizedState(
225
235
  : {executionPayloadBlockHash: null, executionStatus: ExecutionStatus.PreMerge}),
226
236
 
227
237
  dataAvailabilityStatus: DataAvailabilityStatus.PreData,
238
+ ...(computeEpochAtSlot(blockHeader.slot) < unfinalizedState.config.GLOAS_FORK_EPOCH
239
+ ? {
240
+ builderIndex: undefined,
241
+ blockHashHex: undefined,
242
+ }
243
+ : {
244
+ builderIndex: (unfinalizedState as CachedBeaconStateGloas).latestExecutionPayloadBid.builderIndex,
245
+ blockHashHex: toRootHex((unfinalizedState as CachedBeaconStateGloas).latestExecutionPayloadBid.blockHash),
246
+ }),
228
247
  };
229
248
 
230
249
  const parentSlot = blockHeader.slot - 1;