@lodestar/beacon-node 1.40.0-dev.9e8478fc70 → 1.40.0-dev.ade3accfa0

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 (386) 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 -9
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  5. package/lib/api/impl/lodestar/index.js +24 -0
  6. package/lib/api/impl/lodestar/index.js.map +1 -1
  7. package/lib/api/impl/validator/index.d.ts.map +1 -1
  8. package/lib/api/impl/validator/index.js.map +1 -1
  9. package/lib/api/rest/base.d.ts.map +1 -1
  10. package/lib/api/rest/base.js +12 -10
  11. package/lib/api/rest/base.js.map +1 -1
  12. package/lib/chain/ColumnReconstructionTracker.d.ts +2 -0
  13. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  14. package/lib/chain/ColumnReconstructionTracker.js +7 -3
  15. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  16. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  17. package/lib/chain/archiveStore/archiveStore.js +10 -4
  18. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  19. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  20. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +2 -1
  21. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  22. package/lib/chain/blocks/blockInput/blockInput.d.ts +28 -0
  23. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  24. package/lib/chain/blocks/blockInput/blockInput.js +38 -3
  25. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  26. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  27. package/lib/chain/blocks/importBlock.js +10 -2
  28. package/lib/chain/blocks/importBlock.js.map +1 -1
  29. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  30. package/lib/chain/blocks/verifyBlock.js +1 -1
  31. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  32. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  33. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  34. package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
  35. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  36. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  37. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +1 -2
  38. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  39. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  40. package/lib/chain/blocks/writeBlockInputToDb.js +8 -0
  41. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  42. package/lib/chain/bls/multithread/index.d.ts +3 -1
  43. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  44. package/lib/chain/bls/multithread/index.js +5 -3
  45. package/lib/chain/bls/multithread/index.js.map +1 -1
  46. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  47. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  48. package/lib/chain/bls/multithread/jobItem.js +2 -2
  49. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  50. package/lib/chain/bls/singleThread.d.ts +4 -2
  51. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  52. package/lib/chain/bls/singleThread.js +4 -2
  53. package/lib/chain/bls/singleThread.js.map +1 -1
  54. package/lib/chain/bls/utils.d.ts +2 -2
  55. package/lib/chain/bls/utils.d.ts.map +1 -1
  56. package/lib/chain/bls/utils.js +9 -6
  57. package/lib/chain/bls/utils.js.map +1 -1
  58. package/lib/chain/chain.d.ts +8 -3
  59. package/lib/chain/chain.d.ts.map +1 -1
  60. package/lib/chain/chain.js +44 -36
  61. package/lib/chain/chain.js.map +1 -1
  62. package/lib/chain/errors/attestationError.d.ts +14 -1
  63. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  64. package/lib/chain/errors/attestationError.js +8 -0
  65. package/lib/chain/errors/attestationError.js.map +1 -1
  66. package/lib/chain/errors/executionPayloadBid.d.ts +48 -0
  67. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -0
  68. package/lib/chain/errors/executionPayloadBid.js +15 -0
  69. package/lib/chain/errors/executionPayloadBid.js.map +1 -0
  70. package/lib/chain/errors/executionPayloadEnvelope.d.ts +48 -0
  71. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -0
  72. package/lib/chain/errors/executionPayloadEnvelope.js +16 -0
  73. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -0
  74. package/lib/chain/errors/index.d.ts +3 -0
  75. package/lib/chain/errors/index.d.ts.map +1 -1
  76. package/lib/chain/errors/index.js +3 -0
  77. package/lib/chain/errors/index.js.map +1 -1
  78. package/lib/chain/errors/payloadAttestation.d.ts +34 -0
  79. package/lib/chain/errors/payloadAttestation.d.ts.map +1 -0
  80. package/lib/chain/errors/payloadAttestation.js +13 -0
  81. package/lib/chain/errors/payloadAttestation.js.map +1 -0
  82. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  83. package/lib/chain/forkChoice/index.js +18 -0
  84. package/lib/chain/forkChoice/index.js.map +1 -1
  85. package/lib/chain/initState.d.ts.map +1 -1
  86. package/lib/chain/initState.js +2 -2
  87. package/lib/chain/initState.js.map +1 -1
  88. package/lib/chain/interface.d.ts +7 -2
  89. package/lib/chain/interface.d.ts.map +1 -1
  90. package/lib/chain/interface.js.map +1 -1
  91. package/lib/chain/lightClient/index.d.ts +2 -0
  92. package/lib/chain/lightClient/index.d.ts.map +1 -1
  93. package/lib/chain/lightClient/index.js +11 -6
  94. package/lib/chain/lightClient/index.js.map +1 -1
  95. package/lib/chain/opPools/executionPayloadBidPool.d.ts +21 -0
  96. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -0
  97. package/lib/chain/opPools/executionPayloadBidPool.js +57 -0
  98. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -0
  99. package/lib/chain/opPools/index.d.ts +2 -0
  100. package/lib/chain/opPools/index.d.ts.map +1 -1
  101. package/lib/chain/opPools/index.js +2 -0
  102. package/lib/chain/opPools/index.js.map +1 -1
  103. package/lib/chain/opPools/payloadAttestationPool.d.ts +24 -0
  104. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -0
  105. package/lib/chain/opPools/payloadAttestationPool.js +109 -0
  106. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -0
  107. package/lib/chain/options.d.ts +0 -1
  108. package/lib/chain/options.d.ts.map +1 -1
  109. package/lib/chain/options.js +0 -1
  110. package/lib/chain/options.js.map +1 -1
  111. package/lib/chain/regen/interface.d.ts +2 -1
  112. package/lib/chain/regen/interface.d.ts.map +1 -1
  113. package/lib/chain/regen/interface.js +1 -0
  114. package/lib/chain/regen/interface.js.map +1 -1
  115. package/lib/chain/regen/queued.d.ts +1 -1
  116. package/lib/chain/regen/queued.d.ts.map +1 -1
  117. package/lib/chain/regen/queued.js.map +1 -1
  118. package/lib/chain/regen/regen.d.ts +2 -0
  119. package/lib/chain/regen/regen.d.ts.map +1 -1
  120. package/lib/chain/regen/regen.js +4 -1
  121. package/lib/chain/regen/regen.js.map +1 -1
  122. package/lib/chain/seenCache/index.d.ts +3 -1
  123. package/lib/chain/seenCache/index.d.ts.map +1 -1
  124. package/lib/chain/seenCache/index.js +3 -1
  125. package/lib/chain/seenCache/index.js.map +1 -1
  126. package/lib/chain/seenCache/seenAttesters.d.ts +5 -0
  127. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
  128. package/lib/chain/seenCache/seenAttesters.js +5 -0
  129. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  130. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts +12 -0
  131. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts.map +1 -0
  132. package/lib/chain/seenCache/seenExecutionPayloadBids.js +30 -0
  133. package/lib/chain/seenCache/seenExecutionPayloadBids.js.map +1 -0
  134. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +15 -0
  135. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +1 -0
  136. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +28 -0
  137. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +1 -0
  138. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -7
  139. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  140. package/lib/chain/seenCache/seenGossipBlockInput.js +23 -12
  141. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  142. package/lib/chain/serializeState.d.ts.map +1 -1
  143. package/lib/chain/serializeState.js +2 -1
  144. package/lib/chain/serializeState.js.map +1 -1
  145. package/lib/chain/stateCache/index.d.ts +0 -2
  146. package/lib/chain/stateCache/index.d.ts.map +1 -1
  147. package/lib/chain/stateCache/index.js +0 -2
  148. package/lib/chain/stateCache/index.js.map +1 -1
  149. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +2 -1
  150. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  151. package/lib/chain/stateCache/persistentCheckpointsCache.js +3 -0
  152. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  153. package/lib/chain/validation/aggregateAndProof.js +35 -14
  154. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  155. package/lib/chain/validation/attestation.d.ts +2 -2
  156. package/lib/chain/validation/attestation.d.ts.map +1 -1
  157. package/lib/chain/validation/attestation.js +27 -8
  158. package/lib/chain/validation/attestation.js.map +1 -1
  159. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  160. package/lib/chain/validation/attesterSlashing.js +1 -1
  161. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  162. package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
  163. package/lib/chain/validation/blobSidecar.js +4 -4
  164. package/lib/chain/validation/blobSidecar.js.map +1 -1
  165. package/lib/chain/validation/block.d.ts.map +1 -1
  166. package/lib/chain/validation/block.js +6 -6
  167. package/lib/chain/validation/block.js.map +1 -1
  168. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  169. package/lib/chain/validation/dataColumnSidecar.js +4 -4
  170. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  171. package/lib/chain/validation/executionPayloadBid.d.ts +5 -0
  172. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -0
  173. package/lib/chain/validation/executionPayloadBid.js +104 -0
  174. package/lib/chain/validation/executionPayloadBid.js.map +1 -0
  175. package/lib/chain/validation/executionPayloadEnvelope.d.ts +5 -0
  176. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -0
  177. package/lib/chain/validation/executionPayloadEnvelope.js +89 -0
  178. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -0
  179. package/lib/chain/validation/payloadAttestationMessage.d.ts +9 -0
  180. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -0
  181. package/lib/chain/validation/payloadAttestationMessage.js +72 -0
  182. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -0
  183. package/lib/chain/validation/proposerSlashing.js +1 -1
  184. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  185. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +2 -3
  186. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -1
  187. package/lib/chain/validation/signatureSets/aggregateAndProof.js +8 -3
  188. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  189. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  190. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  191. package/lib/chain/validation/signatureSets/contributionAndProof.js +3 -3
  192. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  193. package/lib/chain/validation/signatureSets/selectionProof.d.ts +2 -3
  194. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -1
  195. package/lib/chain/validation/signatureSets/selectionProof.js +8 -3
  196. package/lib/chain/validation/signatureSets/selectionProof.js.map +1 -1
  197. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  198. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  199. package/lib/chain/validation/signatureSets/syncCommittee.js +3 -3
  200. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  201. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -2
  202. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  203. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
  204. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  205. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  206. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  207. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +3 -3
  208. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  209. package/lib/chain/validation/syncCommittee.js +1 -1
  210. package/lib/chain/validation/syncCommittee.js.map +1 -1
  211. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  212. package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -5
  213. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  214. package/lib/chain/validation/voluntaryExit.js +1 -1
  215. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  216. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  217. package/lib/chain/validatorMonitor.js +7 -4
  218. package/lib/chain/validatorMonitor.js.map +1 -1
  219. package/lib/db/repositories/checkpointState.js +0 -1
  220. package/lib/db/repositories/checkpointState.js.map +1 -1
  221. package/lib/metrics/metrics/lodestar.d.ts +20 -0
  222. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  223. package/lib/metrics/metrics/lodestar.js +40 -0
  224. package/lib/metrics/metrics/lodestar.js.map +1 -1
  225. package/lib/network/core/networkCore.d.ts +3 -0
  226. package/lib/network/core/networkCore.d.ts.map +1 -1
  227. package/lib/network/core/networkCore.js +9 -0
  228. package/lib/network/core/networkCore.js.map +1 -1
  229. package/lib/network/core/networkCoreWorker.js +3 -0
  230. package/lib/network/core/networkCoreWorker.js.map +1 -1
  231. package/lib/network/core/networkCoreWorkerHandler.d.ts +3 -0
  232. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  233. package/lib/network/core/networkCoreWorkerHandler.js +9 -0
  234. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  235. package/lib/network/core/types.d.ts +3 -0
  236. package/lib/network/core/types.d.ts.map +1 -1
  237. package/lib/network/gossip/gossipsub.d.ts +34 -0
  238. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  239. package/lib/network/gossip/gossipsub.js +123 -0
  240. package/lib/network/gossip/gossipsub.js.map +1 -1
  241. package/lib/network/gossip/interface.d.ts +20 -2
  242. package/lib/network/gossip/interface.d.ts.map +1 -1
  243. package/lib/network/gossip/interface.js +3 -0
  244. package/lib/network/gossip/interface.js.map +1 -1
  245. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  246. package/lib/network/gossip/scoringParameters.js +38 -2
  247. package/lib/network/gossip/scoringParameters.js.map +1 -1
  248. package/lib/network/gossip/topic.d.ts +77 -1
  249. package/lib/network/gossip/topic.d.ts.map +1 -1
  250. package/lib/network/gossip/topic.js +20 -0
  251. package/lib/network/gossip/topic.js.map +1 -1
  252. package/lib/network/network.d.ts +3 -0
  253. package/lib/network/network.d.ts.map +1 -1
  254. package/lib/network/network.js +9 -0
  255. package/lib/network/network.js.map +1 -1
  256. package/lib/network/options.d.ts +6 -0
  257. package/lib/network/options.d.ts.map +1 -1
  258. package/lib/network/options.js.map +1 -1
  259. package/lib/network/peers/peerManager.d.ts.map +1 -1
  260. package/lib/network/peers/peerManager.js +9 -0
  261. package/lib/network/peers/peerManager.js.map +1 -1
  262. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  263. package/lib/network/processor/gossipHandlers.js +35 -1
  264. package/lib/network/processor/gossipHandlers.js.map +1 -1
  265. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  266. package/lib/network/processor/gossipQueues/index.js +16 -0
  267. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  268. package/lib/network/processor/index.d.ts.map +1 -1
  269. package/lib/network/processor/index.js +3 -0
  270. package/lib/network/processor/index.js.map +1 -1
  271. package/lib/sync/backfill/backfill.d.ts.map +1 -1
  272. package/lib/sync/backfill/backfill.js +3 -4
  273. package/lib/sync/backfill/backfill.js.map +1 -1
  274. package/lib/sync/backfill/verify.d.ts +1 -2
  275. package/lib/sync/backfill/verify.d.ts.map +1 -1
  276. package/lib/sync/backfill/verify.js +2 -2
  277. package/lib/sync/backfill/verify.js.map +1 -1
  278. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  279. package/lib/sync/utils/downloadByRange.js +2 -2
  280. package/lib/sync/utils/downloadByRange.js.map +1 -1
  281. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  282. package/lib/sync/utils/downloadByRoot.js +1 -2
  283. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  284. package/lib/util/queue/itemQueue.d.ts +10 -0
  285. package/lib/util/queue/itemQueue.d.ts.map +1 -1
  286. package/lib/util/queue/itemQueue.js +57 -0
  287. package/lib/util/queue/itemQueue.js.map +1 -1
  288. package/package.json +16 -16
  289. package/src/api/impl/beacon/blocks/index.ts +31 -19
  290. package/src/api/impl/lodestar/index.ts +29 -0
  291. package/src/api/impl/validator/index.ts +2 -1
  292. package/src/api/rest/base.ts +15 -13
  293. package/src/chain/ColumnReconstructionTracker.ts +8 -4
  294. package/src/chain/archiveStore/archiveStore.ts +10 -4
  295. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +2 -1
  296. package/src/chain/blocks/blockInput/blockInput.ts +47 -4
  297. package/src/chain/blocks/importBlock.ts +10 -2
  298. package/src/chain/blocks/verifyBlock.ts +0 -1
  299. package/src/chain/blocks/verifyBlocksSignatures.ts +4 -12
  300. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +1 -2
  301. package/src/chain/blocks/writeBlockInputToDb.ts +9 -0
  302. package/src/chain/bls/multithread/index.ts +7 -4
  303. package/src/chain/bls/multithread/jobItem.ts +7 -3
  304. package/src/chain/bls/singleThread.ts +5 -3
  305. package/src/chain/bls/utils.ts +15 -7
  306. package/src/chain/chain.ts +52 -38
  307. package/src/chain/errors/attestationError.ts +11 -1
  308. package/src/chain/errors/executionPayloadBid.ts +35 -0
  309. package/src/chain/errors/executionPayloadEnvelope.ts +34 -0
  310. package/src/chain/errors/index.ts +3 -0
  311. package/src/chain/errors/payloadAttestation.ts +25 -0
  312. package/src/chain/forkChoice/index.ts +19 -0
  313. package/src/chain/initState.ts +2 -2
  314. package/src/chain/interface.ts +16 -1
  315. package/src/chain/lightClient/index.ts +12 -6
  316. package/src/chain/opPools/executionPayloadBidPool.ts +77 -0
  317. package/src/chain/opPools/index.ts +2 -0
  318. package/src/chain/opPools/payloadAttestationPool.ts +157 -0
  319. package/src/chain/options.ts +0 -2
  320. package/src/chain/regen/interface.ts +2 -1
  321. package/src/chain/regen/queued.ts +1 -2
  322. package/src/chain/regen/regen.ts +6 -1
  323. package/src/chain/seenCache/index.ts +3 -1
  324. package/src/chain/seenCache/seenAttesters.ts +5 -0
  325. package/src/chain/seenCache/seenExecutionPayloadBids.ts +35 -0
  326. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +34 -0
  327. package/src/chain/seenCache/seenGossipBlockInput.ts +31 -12
  328. package/src/chain/serializeState.ts +2 -1
  329. package/src/chain/stateCache/index.ts +0 -2
  330. package/src/chain/stateCache/persistentCheckpointsCache.ts +6 -2
  331. package/src/chain/validation/aggregateAndProof.ts +36 -14
  332. package/src/chain/validation/attestation.ts +33 -16
  333. package/src/chain/validation/attesterSlashing.ts +1 -6
  334. package/src/chain/validation/blobSidecar.ts +3 -8
  335. package/src/chain/validation/block.ts +6 -6
  336. package/src/chain/validation/dataColumnSidecar.ts +3 -8
  337. package/src/chain/validation/executionPayloadBid.ts +141 -0
  338. package/src/chain/validation/executionPayloadEnvelope.ts +122 -0
  339. package/src/chain/validation/payloadAttestationMessage.ts +109 -0
  340. package/src/chain/validation/proposerSlashing.ts +1 -6
  341. package/src/chain/validation/signatureSets/aggregateAndProof.ts +9 -14
  342. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -4
  343. package/src/chain/validation/signatureSets/selectionProof.ts +9 -9
  344. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -4
  345. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -3
  346. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -4
  347. package/src/chain/validation/syncCommittee.ts +1 -1
  348. package/src/chain/validation/syncCommitteeContributionAndProof.ts +3 -5
  349. package/src/chain/validation/voluntaryExit.ts +1 -1
  350. package/src/chain/validatorMonitor.ts +10 -5
  351. package/src/db/repositories/checkpointState.ts +1 -1
  352. package/src/metrics/metrics/lodestar.ts +40 -0
  353. package/src/network/core/networkCore.ts +12 -0
  354. package/src/network/core/networkCoreWorker.ts +3 -0
  355. package/src/network/core/networkCoreWorkerHandler.ts +9 -0
  356. package/src/network/core/types.ts +6 -0
  357. package/src/network/gossip/gossipsub.ts +147 -1
  358. package/src/network/gossip/interface.ts +17 -0
  359. package/src/network/gossip/scoringParameters.ts +44 -2
  360. package/src/network/gossip/topic.ts +21 -0
  361. package/src/network/network.ts +12 -0
  362. package/src/network/options.ts +6 -0
  363. package/src/network/peers/peerManager.ts +11 -0
  364. package/src/network/processor/gossipHandlers.ts +49 -1
  365. package/src/network/processor/gossipQueues/index.ts +16 -0
  366. package/src/network/processor/index.ts +3 -0
  367. package/src/sync/backfill/backfill.ts +3 -4
  368. package/src/sync/backfill/verify.ts +2 -3
  369. package/src/sync/utils/downloadByRange.ts +2 -2
  370. package/src/sync/utils/downloadByRoot.ts +1 -2
  371. package/src/util/queue/itemQueue.ts +62 -0
  372. package/lib/chain/stateCache/blockStateCacheImpl.d.ts +0 -54
  373. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +0 -1
  374. package/lib/chain/stateCache/blockStateCacheImpl.js +0 -130
  375. package/lib/chain/stateCache/blockStateCacheImpl.js.map +0 -1
  376. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts +0 -60
  377. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +0 -1
  378. package/lib/chain/stateCache/inMemoryCheckpointsCache.js +0 -156
  379. package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +0 -1
  380. package/lib/util/bytes.d.ts +0 -3
  381. package/lib/util/bytes.d.ts.map +0 -1
  382. package/lib/util/bytes.js +0 -11
  383. package/lib/util/bytes.js.map +0 -1
  384. package/src/chain/stateCache/blockStateCacheImpl.ts +0 -149
  385. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +0 -192
  386. package/src/util/bytes.ts +0 -11
@@ -1,17 +1,25 @@
1
1
  import {PublicKey, aggregatePublicKeys} from "@chainsafe/blst";
2
- import {ISignatureSet, SignatureSetType} from "@lodestar/state-transition";
2
+ import {ISignatureSet, Index2PubkeyCache, SignatureSetType} from "@lodestar/state-transition";
3
3
  import {Metrics} from "../../metrics/metrics.js";
4
4
 
5
- export function getAggregatedPubkey(signatureSet: ISignatureSet, metrics: Metrics | null = null): PublicKey {
5
+ export function getAggregatedPubkey(
6
+ signatureSet: ISignatureSet,
7
+ index2pubkey: Index2PubkeyCache,
8
+ metrics: Metrics | null = null
9
+ ): PublicKey {
6
10
  switch (signatureSet.type) {
7
11
  case SignatureSetType.single:
8
12
  return signatureSet.pubkey;
9
13
 
14
+ case SignatureSetType.indexed:
15
+ return index2pubkey[signatureSet.index];
16
+
10
17
  case SignatureSetType.aggregate: {
11
18
  const timer = metrics?.blsThreadPool.pubkeysAggregationMainThreadDuration.startTimer();
12
- const pubkeys = aggregatePublicKeys(signatureSet.pubkeys);
19
+ const pubkeys = signatureSet.indices.map((i) => index2pubkey[i]);
20
+ const aggregated = aggregatePublicKeys(pubkeys);
13
21
  timer?.();
14
- return pubkeys;
22
+ return aggregated;
15
23
  }
16
24
 
17
25
  default:
@@ -20,11 +28,11 @@ export function getAggregatedPubkey(signatureSet: ISignatureSet, metrics: Metric
20
28
  }
21
29
 
22
30
  export function getAggregatedPubkeysCount(signatureSets: ISignatureSet[]): number {
23
- let pubkeysConut = 0;
31
+ let pubkeysCount = 0;
24
32
  for (const set of signatureSets) {
25
33
  if (set.type === SignatureSetType.aggregate) {
26
- pubkeysConut += set.pubkeys.length;
34
+ pubkeysCount += set.indices.length;
27
35
  }
28
36
  }
29
- return pubkeysConut;
37
+ return pubkeysCount;
30
38
  }
@@ -79,7 +79,9 @@ import {LightClientServer} from "./lightClient/index.js";
79
79
  import {
80
80
  AggregatedAttestationPool,
81
81
  AttestationPool,
82
+ ExecutionPayloadBidPool,
82
83
  OpPool,
84
+ PayloadAttestationPool,
83
85
  SyncCommitteeMessagePool,
84
86
  SyncContributionAndProofPool,
85
87
  } from "./opPools/index.js";
@@ -95,6 +97,9 @@ import {
95
97
  SeenAttesters,
96
98
  SeenBlockProposers,
97
99
  SeenContributionAndProof,
100
+ SeenExecutionPayloadBids,
101
+ SeenExecutionPayloadEnvelopes,
102
+ SeenPayloadAttesters,
98
103
  SeenSyncCommitteeMessages,
99
104
  } from "./seenCache/index.js";
100
105
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -102,12 +107,10 @@ import {SeenAttestationDatas} from "./seenCache/seenAttestationData.js";
102
107
  import {SeenBlockAttesters} from "./seenCache/seenBlockAttesters.js";
103
108
  import {SeenBlockInput} from "./seenCache/seenGossipBlockInput.js";
104
109
  import {ShufflingCache} from "./shufflingCache.js";
105
- import {BlockStateCacheImpl} from "./stateCache/blockStateCacheImpl.js";
106
110
  import {DbCPStateDatastore, checkpointToDatastoreKey} from "./stateCache/datastore/db.js";
107
111
  import {FileCPStateDatastore} from "./stateCache/datastore/file.js";
108
112
  import {CPStateDatastore} from "./stateCache/datastore/types.js";
109
113
  import {FIFOBlockStateCache} from "./stateCache/fifoBlockStateCache.js";
110
- import {InMemoryCheckpointStateCache} from "./stateCache/inMemoryCheckpointsCache.js";
111
114
  import {PersistentCheckpointStateCache} from "./stateCache/persistentCheckpointsCache.js";
112
115
  import {CheckpointStateCache} from "./stateCache/types.js";
113
116
  import {ValidatorMonitor} from "./validatorMonitor.js";
@@ -123,8 +126,11 @@ const DEFAULT_MAX_CACHED_PRODUCED_RESULTS = 4;
123
126
 
124
127
  /**
125
128
  * The maximum number of pending unfinalized block writes to the database before backpressure is applied.
129
+ * Write queue entries hold references to block inputs, keeping them in memory even after cache eviction.
130
+ * This is especially important for supernodes which store all 128 columns per block — each pending
131
+ * write can hold significant memory. Keep moderate to avoid OOM during sync.
126
132
  */
127
- const DEFAULT_MAX_PENDING_UNFINALIZED_BLOCK_WRITES = 32;
133
+ const DEFAULT_MAX_PENDING_UNFINALIZED_BLOCK_WRITES = 16;
128
134
 
129
135
  export class BeaconChain implements IBeaconChain {
130
136
  readonly genesisTime: UintNum64;
@@ -137,7 +143,7 @@ export class BeaconChain implements IBeaconChain {
137
143
  readonly logger: Logger;
138
144
  readonly metrics: Metrics | null;
139
145
  readonly validatorMonitor: ValidatorMonitor | null;
140
- readonly bufferPool: BufferPool | null;
146
+ readonly bufferPool: BufferPool;
141
147
 
142
148
  readonly anchorStateLatestBlockSlot: Slot;
143
149
 
@@ -156,12 +162,17 @@ export class BeaconChain implements IBeaconChain {
156
162
  readonly aggregatedAttestationPool: AggregatedAttestationPool;
157
163
  readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
158
164
  readonly syncContributionAndProofPool;
165
+ readonly executionPayloadBidPool: ExecutionPayloadBidPool;
166
+ readonly payloadAttestationPool: PayloadAttestationPool;
159
167
  readonly opPool: OpPool;
160
168
 
161
169
  // Gossip seen cache
162
170
  readonly seenAttesters = new SeenAttesters();
163
171
  readonly seenAggregators = new SeenAggregators();
172
+ readonly seenPayloadAttesters = new SeenPayloadAttesters();
164
173
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
174
+ readonly seenExecutionPayloadEnvelopes = new SeenExecutionPayloadEnvelopes();
175
+ readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
165
176
  readonly seenBlockProposers = new SeenBlockProposers();
166
177
  readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
167
178
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -268,8 +279,8 @@ export class BeaconChain implements IBeaconChain {
268
279
  const emitter = new ChainEventEmitter();
269
280
  // by default, verify signatures on both main threads and worker threads
270
281
  const bls = opts.blsVerifyAllMainThread
271
- ? new BlsSingleThreadVerifier({metrics})
272
- : new BlsMultiThreadWorkerPool(opts, {logger, metrics});
282
+ ? new BlsSingleThreadVerifier({metrics, index2pubkey})
283
+ : new BlsMultiThreadWorkerPool(opts, {logger, metrics, index2pubkey});
273
284
 
274
285
  if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
275
286
 
@@ -278,6 +289,8 @@ export class BeaconChain implements IBeaconChain {
278
289
  this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
279
290
  this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
280
291
  this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
292
+ this.executionPayloadBidPool = new ExecutionPayloadBidPool();
293
+ this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
281
294
  this.opPool = new OpPool(config);
282
295
 
283
296
  this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
@@ -327,32 +340,22 @@ export class BeaconChain implements IBeaconChain {
327
340
  this.index2pubkey = index2pubkey;
328
341
 
329
342
  const fileDataStore = opts.nHistoricalStatesFileDataStore ?? true;
330
- const blockStateCache = this.opts.nHistoricalStates
331
- ? new FIFOBlockStateCache(this.opts, {metrics})
332
- : new BlockStateCacheImpl({metrics});
333
- this.bufferPool = this.opts.nHistoricalStates
334
- ? new BufferPool(anchorState.type.tree_serializedSize(anchorState.node), metrics)
335
- : null;
336
-
337
- let checkpointStateCache: CheckpointStateCache;
338
- this.cpStateDatastore = undefined;
339
- if (this.opts.nHistoricalStates) {
340
- this.cpStateDatastore = fileDataStore ? new FileCPStateDatastore(dataDir) : new DbCPStateDatastore(this.db);
341
- checkpointStateCache = new PersistentCheckpointStateCache(
342
- {
343
- config,
344
- metrics,
345
- logger,
346
- clock,
347
- blockStateCache,
348
- bufferPool: this.bufferPool,
349
- datastore: this.cpStateDatastore,
350
- },
351
- this.opts
352
- );
353
- } else {
354
- checkpointStateCache = new InMemoryCheckpointStateCache({metrics});
355
- }
343
+ const blockStateCache = new FIFOBlockStateCache(this.opts, {metrics});
344
+ this.bufferPool = new BufferPool(anchorState.type.tree_serializedSize(anchorState.node), metrics);
345
+
346
+ this.cpStateDatastore = fileDataStore ? new FileCPStateDatastore(dataDir) : new DbCPStateDatastore(this.db);
347
+ const checkpointStateCache: CheckpointStateCache = new PersistentCheckpointStateCache(
348
+ {
349
+ config,
350
+ metrics,
351
+ logger,
352
+ clock,
353
+ blockStateCache,
354
+ bufferPool: this.bufferPool,
355
+ datastore: this.cpStateDatastore,
356
+ },
357
+ this.opts
358
+ );
356
359
 
357
360
  const {checkpoint} = computeAnchorCheckpoint(config, anchorState);
358
361
  blockStateCache.add(anchorState);
@@ -375,6 +378,7 @@ export class BeaconChain implements IBeaconChain {
375
378
  forkChoice,
376
379
  blockStateCache,
377
380
  checkpointStateCache,
381
+ seenBlockInputCache: this.seenBlockInputCache,
378
382
  db,
379
383
  metrics,
380
384
  validatorMonitor,
@@ -384,7 +388,7 @@ export class BeaconChain implements IBeaconChain {
384
388
  });
385
389
 
386
390
  if (!opts.disableLightClientServer) {
387
- this.lightClientServer = new LightClientServer(opts, {config, clock, db, metrics, emitter, logger});
391
+ this.lightClientServer = new LightClientServer(opts, {config, clock, db, metrics, emitter, logger, signal});
388
392
  }
389
393
 
390
394
  this.reprocessController = new ReprocessController(this.metrics);
@@ -488,6 +492,8 @@ export class BeaconChain implements IBeaconChain {
488
492
  this.seenAttesters.isKnown(epoch, index) ||
489
493
  // seenAggregators = single aggregator index, not participants of the aggregate
490
494
  this.seenAggregators.isKnown(epoch, index) ||
495
+ // seenPayloadAttesters = single signer of payload attestation message
496
+ this.seenPayloadAttesters.isKnown(epoch, index) ||
491
497
  // seenBlockProposers = single block proposer
492
498
  this.seenBlockProposers.seenAtEpoch(epoch, index)
493
499
  );
@@ -1262,6 +1268,8 @@ export class BeaconChain implements IBeaconChain {
1262
1268
  metrics.opPool.proposerSlashingPoolSize.set(this.opPool.proposerSlashingsSize);
1263
1269
  metrics.opPool.voluntaryExitPoolSize.set(this.opPool.voluntaryExitsSize);
1264
1270
  metrics.opPool.syncCommitteeMessagePoolSize.set(this.syncCommitteeMessagePool.size);
1271
+ metrics.opPool.payloadAttestationPool.size.set(this.payloadAttestationPool.size);
1272
+ metrics.opPool.executionPayloadBidPool.size.set(this.executionPayloadBidPool.size);
1265
1273
  // syncContributionAndProofPool tracks metrics on its own
1266
1274
  metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
1267
1275
  metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
@@ -1292,6 +1300,9 @@ export class BeaconChain implements IBeaconChain {
1292
1300
  this.aggregatedAttestationPool.prune(slot);
1293
1301
  this.syncCommitteeMessagePool.prune(slot);
1294
1302
  this.seenSyncCommitteeMessages.prune(slot);
1303
+ this.payloadAttestationPool.prune(slot);
1304
+ this.executionPayloadBidPool.prune(slot);
1305
+ this.seenExecutionPayloadBids.prune(slot);
1295
1306
  this.seenAttestationDatas.onSlot(slot);
1296
1307
  this.reprocessController.onSlot(slot);
1297
1308
 
@@ -1315,6 +1326,7 @@ export class BeaconChain implements IBeaconChain {
1315
1326
 
1316
1327
  this.seenAttesters.prune(epoch);
1317
1328
  this.seenAggregators.prune(epoch);
1329
+ this.seenPayloadAttesters.prune(epoch);
1318
1330
  this.seenAggregatedAttestations.prune(epoch);
1319
1331
  this.seenBlockAttesters.prune(epoch);
1320
1332
  this.beaconProposerCache.prune(epoch);
@@ -1338,7 +1350,9 @@ export class BeaconChain implements IBeaconChain {
1338
1350
 
1339
1351
  private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1340
1352
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1341
- this.seenBlockProposers.prune(computeStartSlotAtEpoch(cp.epoch));
1353
+ const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1354
+ this.seenBlockProposers.prune(finalizedSlot);
1355
+ this.seenExecutionPayloadEnvelopes.prune(finalizedSlot);
1342
1356
 
1343
1357
  // Update validator custody to account for effective balance changes
1344
1358
  await this.updateValidatorsCustodyRequirement(cp);
@@ -1346,13 +1360,13 @@ export class BeaconChain implements IBeaconChain {
1346
1360
  // TODO: Improve using regen here
1347
1361
  const {blockRoot, stateRoot, slot} = this.forkChoice.getHead();
1348
1362
  const headState = this.regen.getStateSync(stateRoot);
1349
- const headBlock = await this.db.block.get(fromHex(blockRoot));
1350
- if (headBlock == null) {
1351
- throw Error(`Head block ${slot} ${headBlock} is not available in database`);
1363
+ const blockResult = await this.getBlockByRoot(blockRoot);
1364
+ if (blockResult == null) {
1365
+ throw Error(`Head block for ${slot} is not available in cache or database`);
1352
1366
  }
1353
1367
 
1354
1368
  if (headState) {
1355
- this.opPool.pruneAll(headBlock, headState);
1369
+ this.opPool.pruneAll(blockResult.block, headState);
1356
1370
  }
1357
1371
 
1358
1372
  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;
@@ -2,7 +2,7 @@ import {ChainForkConfig} from "@lodestar/config";
2
2
  import {ZERO_HASH} from "@lodestar/params";
3
3
  import {BeaconStateAllForks, computeEpochAtSlot, computeStartSlotAtEpoch} from "@lodestar/state-transition";
4
4
  import {SignedBeaconBlock, ssz} from "@lodestar/types";
5
- import {Logger, toHex, toRootHex} from "@lodestar/utils";
5
+ import {Logger, byteArrayEquals, toHex, toRootHex} from "@lodestar/utils";
6
6
  import {GENESIS_SLOT} from "../constants/index.js";
7
7
  import {IBeaconDb} from "../db/index.js";
8
8
  import {Metrics} from "../metrics/index.js";
@@ -26,7 +26,7 @@ export async function persistAnchorState(
26
26
 
27
27
  const latestBlockRoot = ssz.phase0.BeaconBlockHeader.hashTreeRoot(latestBlockHeader);
28
28
 
29
- if (Buffer.compare(blockRoot, latestBlockRoot) !== 0) {
29
+ if (!byteArrayEquals(blockRoot, latestBlockRoot)) {
30
30
  throw Error(
31
31
  `Genesis block root ${toRootHex(blockRoot)} does not match genesis state latest block root ${toRootHex(latestBlockRoot)}`
32
32
  );
@@ -46,7 +46,14 @@ import {ForkchoiceCaller} from "./forkChoice/index.js";
46
46
  import {GetBlobsTracker} from "./GetBlobsTracker.js";
47
47
  import {LightClientServer} from "./lightClient/index.js";
48
48
  import {AggregatedAttestationPool} from "./opPools/aggregatedAttestationPool.js";
49
- import {AttestationPool, OpPool, SyncCommitteeMessagePool, SyncContributionAndProofPool} from "./opPools/index.js";
49
+ import {
50
+ AttestationPool,
51
+ ExecutionPayloadBidPool,
52
+ OpPool,
53
+ PayloadAttestationPool,
54
+ SyncCommitteeMessagePool,
55
+ SyncContributionAndProofPool,
56
+ } from "./opPools/index.js";
50
57
  import {IChainOptions} from "./options.js";
51
58
  import {AssembledBlockType, BlockAttributes, BlockType, ProduceResult} from "./produceBlock/produceBlockBody.js";
52
59
  import {IStateRegenerator, RegenCaller} from "./regen/index.js";
@@ -56,6 +63,9 @@ import {
56
63
  SeenAttesters,
57
64
  SeenBlockProposers,
58
65
  SeenContributionAndProof,
66
+ SeenExecutionPayloadBids,
67
+ SeenExecutionPayloadEnvelopes,
68
+ SeenPayloadAttesters,
59
69
  SeenSyncCommitteeMessages,
60
70
  } from "./seenCache/index.js";
61
71
  import {SeenAggregatedAttestations} from "./seenCache/seenAggregateAndProof.js";
@@ -116,12 +126,17 @@ export interface IBeaconChain {
116
126
  readonly aggregatedAttestationPool: AggregatedAttestationPool;
117
127
  readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
118
128
  readonly syncContributionAndProofPool: SyncContributionAndProofPool;
129
+ readonly executionPayloadBidPool: ExecutionPayloadBidPool;
130
+ readonly payloadAttestationPool: PayloadAttestationPool;
119
131
  readonly opPool: OpPool;
120
132
 
121
133
  // Gossip seen cache
122
134
  readonly seenAttesters: SeenAttesters;
123
135
  readonly seenAggregators: SeenAggregators;
136
+ readonly seenPayloadAttesters: SeenPayloadAttesters;
124
137
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
138
+ readonly seenExecutionPayloadEnvelopes: SeenExecutionPayloadEnvelopes;
139
+ readonly seenExecutionPayloadBids: SeenExecutionPayloadBids;
125
140
  readonly seenBlockProposers: SeenBlockProposers;
126
141
  readonly seenSyncCommitteeMessages: SeenSyncCommitteeMessages;
127
142
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -46,12 +46,11 @@ import {
46
46
  ssz,
47
47
  sszTypesFor,
48
48
  } from "@lodestar/types";
49
- import {Logger, MapDef, pruneSetToMax, toRootHex} from "@lodestar/utils";
49
+ import {Logger, MapDef, byteArrayEquals, pruneSetToMax, toRootHex} from "@lodestar/utils";
50
50
  import {ZERO_HASH} from "../../constants/index.js";
51
51
  import {IBeaconDb} from "../../db/index.js";
52
52
  import {NUM_WITNESS, NUM_WITNESS_ELECTRA} from "../../db/repositories/lightclientSyncCommitteeWitness.js";
53
53
  import {Metrics} from "../../metrics/index.js";
54
- import {byteArrayEquals} from "../../util/bytes.js";
55
54
  import {IClock} from "../../util/clock.js";
56
55
  import {ChainEventEmitter} from "../emitter.js";
57
56
  import {LightClientServerError, LightClientServerErrorCode} from "../errors/lightClientError.js";
@@ -93,6 +92,7 @@ type LightClientServerModules = {
93
92
  metrics: Metrics | null;
94
93
  emitter: ChainEventEmitter;
95
94
  logger: Logger;
95
+ signal: AbortSignal;
96
96
  };
97
97
 
98
98
  const MAX_CACHED_FINALIZED_HEADERS = 3;
@@ -205,6 +205,7 @@ export class LightClientServer {
205
205
  private readonly emitter: ChainEventEmitter;
206
206
  private readonly logger: Logger;
207
207
  private readonly clock: IClock;
208
+ private readonly signal: AbortSignal;
208
209
  private readonly knownSyncCommittee = new MapDef<SyncPeriod, Set<DependentRootHex>>(() => new Set());
209
210
  private storedCurrentSyncCommittee = false;
210
211
 
@@ -225,13 +226,14 @@ export class LightClientServer {
225
226
  private readonly opts: LightClientServerOpts,
226
227
  modules: LightClientServerModules
227
228
  ) {
228
- const {config, clock, db, metrics, emitter, logger} = modules;
229
+ const {config, clock, db, metrics, emitter, logger, signal} = modules;
229
230
  this.config = config;
230
231
  this.clock = clock;
231
232
  this.db = db;
232
233
  this.metrics = metrics;
233
234
  this.emitter = emitter;
234
235
  this.logger = logger;
236
+ this.signal = signal;
235
237
 
236
238
  this.zero = {
237
239
  // Assign the hightest fork's default value because it can always be typecasted down to correct fork
@@ -288,12 +290,16 @@ export class LightClientServer {
288
290
  const syncPeriod = computeSyncPeriodAtSlot(block.slot);
289
291
 
290
292
  this.onSyncAggregate(syncPeriod, block.body.syncAggregate, block.slot, signedBlockRoot).catch((e) => {
291
- this.logger.error("Error onSyncAggregate", {}, e);
292
- this.metrics?.lightclientServer.onSyncAggregate.inc({event: "error"});
293
+ if (!this.signal.aborted) {
294
+ this.logger.error("Error onSyncAggregate", {}, e);
295
+ this.metrics?.lightclientServer.onSyncAggregate.inc({event: "error"});
296
+ }
293
297
  });
294
298
 
295
299
  this.persistPostBlockImportData(block, postState, parentBlockSlot).catch((e) => {
296
- this.logger.error("Error persistPostBlockImportData", {}, e);
300
+ if (!this.signal.aborted) {
301
+ this.logger.error("Error persistPostBlockImportData", {}, e);
302
+ }
297
303
  });
298
304
  }
299
305
 
@@ -0,0 +1,77 @@
1
+ import {Slot, gloas} from "@lodestar/types";
2
+ import {MapDef, toRootHex} from "@lodestar/utils";
3
+ import {InsertOutcome} from "./types.js";
4
+ import {pruneBySlot} from "./utils.js";
5
+
6
+ /**
7
+ * TODO GLOAS: Revisit this value and add rational for choosing it
8
+ */
9
+ const SLOTS_RETAINED = 2;
10
+
11
+ type BlockRootHex = string;
12
+ type BlockHashHex = string;
13
+
14
+ /**
15
+ * Store the best execution payload bid per slot / (parent block root, parent block hash).
16
+ */
17
+ export class ExecutionPayloadBidPool {
18
+ private readonly bidByParentHashByParentRootBySlot = new MapDef<
19
+ Slot,
20
+ MapDef<BlockRootHex, Map<BlockHashHex, gloas.ExecutionPayloadBid>>
21
+ >(() => new MapDef<BlockRootHex, Map<BlockHashHex, gloas.ExecutionPayloadBid>>(() => new Map()));
22
+ private lowestPermissibleSlot = 0;
23
+
24
+ get size(): number {
25
+ let count = 0;
26
+ for (const byParentRoot of this.bidByParentHashByParentRootBySlot.values()) {
27
+ for (const byParentHash of byParentRoot.values()) {
28
+ count += byParentHash.size;
29
+ }
30
+ }
31
+ return count;
32
+ }
33
+
34
+ add(bid: gloas.ExecutionPayloadBid): InsertOutcome {
35
+ const {slot, parentBlockRoot, parentBlockHash, value} = bid;
36
+ const lowestPermissibleSlot = this.lowestPermissibleSlot;
37
+
38
+ if (slot < lowestPermissibleSlot) {
39
+ return InsertOutcome.Old;
40
+ }
41
+
42
+ const parentRootHex = toRootHex(parentBlockRoot);
43
+ const parentHashHex = toRootHex(parentBlockHash);
44
+ const bidByParentHash = this.bidByParentHashByParentRootBySlot.getOrDefault(slot).getOrDefault(parentRootHex);
45
+ const existing = bidByParentHash.get(parentHashHex);
46
+
47
+ if (existing) {
48
+ const existingValue = existing.value;
49
+ const newValue = value;
50
+ if (newValue > existingValue) {
51
+ bidByParentHash.set(parentHashHex, bid);
52
+ return InsertOutcome.NewData;
53
+ }
54
+ return newValue === existingValue ? InsertOutcome.AlreadyKnown : InsertOutcome.NotBetterThan;
55
+ }
56
+
57
+ bidByParentHash.set(parentHashHex, bid);
58
+ return InsertOutcome.NewData;
59
+ }
60
+
61
+ /**
62
+ * Return the highest-value bid matching slot, parent block root, and parent block hash.
63
+ * Used for gossip validation and block production.
64
+ */
65
+ getBestBid(
66
+ parentBlockRoot: BlockRootHex,
67
+ parentBlockHash: BlockHashHex,
68
+ slot: Slot
69
+ ): gloas.ExecutionPayloadBid | null {
70
+ const bidByParentHash = this.bidByParentHashByParentRootBySlot.get(slot)?.get(parentBlockRoot);
71
+ return bidByParentHash?.get(parentBlockHash) ?? null;
72
+ }
73
+
74
+ prune(clockSlot: Slot): void {
75
+ this.lowestPermissibleSlot = pruneBySlot(this.bidByParentHashByParentRootBySlot, clockSlot, SLOTS_RETAINED);
76
+ }
77
+ }
@@ -1,5 +1,7 @@
1
1
  export {AggregatedAttestationPool} from "./aggregatedAttestationPool.js";
2
2
  export {AttestationPool} from "./attestationPool.js";
3
+ export {ExecutionPayloadBidPool} from "./executionPayloadBidPool.js";
3
4
  export {OpPool} from "./opPool.js";
5
+ export {PayloadAttestationPool} from "./payloadAttestationPool.js";
4
6
  export {SyncCommitteeMessagePool} from "./syncCommitteeMessagePool.js";
5
7
  export {SyncContributionAndProofPool} from "./syncContributionAndProofPool.js";