@lodestar/beacon-node 1.40.0-dev.1cab20c166 → 1.40.0-dev.2a72cee670

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 (301) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +7 -7
  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 +10 -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/chain/ColumnReconstructionTracker.d.ts +2 -0
  10. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  11. package/lib/chain/ColumnReconstructionTracker.js +7 -3
  12. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  13. package/lib/chain/blocks/blockInput/blockInput.d.ts +28 -0
  14. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  15. package/lib/chain/blocks/blockInput/blockInput.js +36 -1
  16. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  17. package/lib/chain/blocks/importBlock.js +1 -1
  18. package/lib/chain/blocks/importBlock.js.map +1 -1
  19. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  20. package/lib/chain/blocks/verifyBlock.js +1 -1
  21. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  22. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  23. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  24. package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
  25. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  26. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  27. package/lib/chain/blocks/writeBlockInputToDb.js +8 -0
  28. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  29. package/lib/chain/bls/multithread/index.d.ts +3 -1
  30. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  31. package/lib/chain/bls/multithread/index.js +5 -3
  32. package/lib/chain/bls/multithread/index.js.map +1 -1
  33. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  34. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  35. package/lib/chain/bls/multithread/jobItem.js +2 -2
  36. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  37. package/lib/chain/bls/singleThread.d.ts +4 -2
  38. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  39. package/lib/chain/bls/singleThread.js +4 -2
  40. package/lib/chain/bls/singleThread.js.map +1 -1
  41. package/lib/chain/bls/utils.d.ts +2 -2
  42. package/lib/chain/bls/utils.d.ts.map +1 -1
  43. package/lib/chain/bls/utils.js +9 -6
  44. package/lib/chain/bls/utils.js.map +1 -1
  45. package/lib/chain/chain.d.ts +8 -3
  46. package/lib/chain/chain.d.ts.map +1 -1
  47. package/lib/chain/chain.js +39 -33
  48. package/lib/chain/chain.js.map +1 -1
  49. package/lib/chain/errors/attestationError.d.ts +14 -1
  50. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  51. package/lib/chain/errors/attestationError.js +8 -0
  52. package/lib/chain/errors/attestationError.js.map +1 -1
  53. package/lib/chain/errors/executionPayloadBid.d.ts +48 -0
  54. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -0
  55. package/lib/chain/errors/executionPayloadBid.js +15 -0
  56. package/lib/chain/errors/executionPayloadBid.js.map +1 -0
  57. package/lib/chain/errors/executionPayloadEnvelope.d.ts +48 -0
  58. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -0
  59. package/lib/chain/errors/executionPayloadEnvelope.js +16 -0
  60. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -0
  61. package/lib/chain/errors/index.d.ts +3 -0
  62. package/lib/chain/errors/index.d.ts.map +1 -1
  63. package/lib/chain/errors/index.js +3 -0
  64. package/lib/chain/errors/index.js.map +1 -1
  65. package/lib/chain/errors/payloadAttestation.d.ts +34 -0
  66. package/lib/chain/errors/payloadAttestation.d.ts.map +1 -0
  67. package/lib/chain/errors/payloadAttestation.js +13 -0
  68. package/lib/chain/errors/payloadAttestation.js.map +1 -0
  69. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  70. package/lib/chain/forkChoice/index.js +18 -0
  71. package/lib/chain/forkChoice/index.js.map +1 -1
  72. package/lib/chain/interface.d.ts +7 -2
  73. package/lib/chain/interface.d.ts.map +1 -1
  74. package/lib/chain/interface.js.map +1 -1
  75. package/lib/chain/opPools/executionPayloadBidPool.d.ts +21 -0
  76. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -0
  77. package/lib/chain/opPools/executionPayloadBidPool.js +57 -0
  78. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -0
  79. package/lib/chain/opPools/index.d.ts +2 -0
  80. package/lib/chain/opPools/index.d.ts.map +1 -1
  81. package/lib/chain/opPools/index.js +2 -0
  82. package/lib/chain/opPools/index.js.map +1 -1
  83. package/lib/chain/opPools/payloadAttestationPool.d.ts +24 -0
  84. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -0
  85. package/lib/chain/opPools/payloadAttestationPool.js +109 -0
  86. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -0
  87. package/lib/chain/options.d.ts +0 -1
  88. package/lib/chain/options.d.ts.map +1 -1
  89. package/lib/chain/options.js +0 -1
  90. package/lib/chain/options.js.map +1 -1
  91. package/lib/chain/regen/interface.d.ts +2 -1
  92. package/lib/chain/regen/interface.d.ts.map +1 -1
  93. package/lib/chain/regen/interface.js +1 -0
  94. package/lib/chain/regen/interface.js.map +1 -1
  95. package/lib/chain/regen/queued.d.ts +1 -1
  96. package/lib/chain/regen/queued.d.ts.map +1 -1
  97. package/lib/chain/regen/queued.js.map +1 -1
  98. package/lib/chain/regen/regen.d.ts +2 -0
  99. package/lib/chain/regen/regen.d.ts.map +1 -1
  100. package/lib/chain/regen/regen.js +4 -1
  101. package/lib/chain/regen/regen.js.map +1 -1
  102. package/lib/chain/seenCache/index.d.ts +3 -1
  103. package/lib/chain/seenCache/index.d.ts.map +1 -1
  104. package/lib/chain/seenCache/index.js +3 -1
  105. package/lib/chain/seenCache/index.js.map +1 -1
  106. package/lib/chain/seenCache/seenAttesters.d.ts +5 -0
  107. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
  108. package/lib/chain/seenCache/seenAttesters.js +5 -0
  109. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  110. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts +12 -0
  111. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts.map +1 -0
  112. package/lib/chain/seenCache/seenExecutionPayloadBids.js +30 -0
  113. package/lib/chain/seenCache/seenExecutionPayloadBids.js.map +1 -0
  114. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +15 -0
  115. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +1 -0
  116. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +28 -0
  117. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +1 -0
  118. package/lib/chain/seenCache/seenGossipBlockInput.js +1 -1
  119. package/lib/chain/stateCache/index.d.ts +0 -2
  120. package/lib/chain/stateCache/index.d.ts.map +1 -1
  121. package/lib/chain/stateCache/index.js +0 -2
  122. package/lib/chain/stateCache/index.js.map +1 -1
  123. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +2 -1
  124. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  125. package/lib/chain/stateCache/persistentCheckpointsCache.js +3 -0
  126. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  127. package/lib/chain/validation/aggregateAndProof.js +35 -14
  128. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  129. package/lib/chain/validation/attestation.d.ts +2 -2
  130. package/lib/chain/validation/attestation.d.ts.map +1 -1
  131. package/lib/chain/validation/attestation.js +27 -8
  132. package/lib/chain/validation/attestation.js.map +1 -1
  133. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  134. package/lib/chain/validation/attesterSlashing.js +1 -1
  135. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  136. package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
  137. package/lib/chain/validation/blobSidecar.js +2 -2
  138. package/lib/chain/validation/blobSidecar.js.map +1 -1
  139. package/lib/chain/validation/block.d.ts.map +1 -1
  140. package/lib/chain/validation/block.js +6 -6
  141. package/lib/chain/validation/block.js.map +1 -1
  142. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  143. package/lib/chain/validation/dataColumnSidecar.js +2 -2
  144. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  145. package/lib/chain/validation/executionPayloadBid.d.ts +5 -0
  146. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -0
  147. package/lib/chain/validation/executionPayloadBid.js +104 -0
  148. package/lib/chain/validation/executionPayloadBid.js.map +1 -0
  149. package/lib/chain/validation/executionPayloadEnvelope.d.ts +5 -0
  150. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -0
  151. package/lib/chain/validation/executionPayloadEnvelope.js +89 -0
  152. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -0
  153. package/lib/chain/validation/payloadAttestationMessage.d.ts +9 -0
  154. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -0
  155. package/lib/chain/validation/payloadAttestationMessage.js +72 -0
  156. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -0
  157. package/lib/chain/validation/proposerSlashing.js +1 -1
  158. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  159. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +2 -3
  160. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -1
  161. package/lib/chain/validation/signatureSets/aggregateAndProof.js +8 -3
  162. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  163. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  164. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  165. package/lib/chain/validation/signatureSets/contributionAndProof.js +3 -3
  166. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  167. package/lib/chain/validation/signatureSets/selectionProof.d.ts +2 -3
  168. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -1
  169. package/lib/chain/validation/signatureSets/selectionProof.js +8 -3
  170. package/lib/chain/validation/signatureSets/selectionProof.js.map +1 -1
  171. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  172. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  173. package/lib/chain/validation/signatureSets/syncCommittee.js +3 -3
  174. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  175. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -2
  176. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  177. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
  178. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  179. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  180. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  181. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +3 -3
  182. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  183. package/lib/chain/validation/syncCommittee.js +1 -1
  184. package/lib/chain/validation/syncCommittee.js.map +1 -1
  185. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  186. package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -5
  187. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  188. package/lib/chain/validation/voluntaryExit.js +1 -1
  189. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  190. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  191. package/lib/chain/validatorMonitor.js +7 -4
  192. package/lib/chain/validatorMonitor.js.map +1 -1
  193. package/lib/metrics/metrics/lodestar.d.ts +20 -0
  194. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  195. package/lib/metrics/metrics/lodestar.js +40 -0
  196. package/lib/metrics/metrics/lodestar.js.map +1 -1
  197. package/lib/network/gossip/interface.d.ts +20 -2
  198. package/lib/network/gossip/interface.d.ts.map +1 -1
  199. package/lib/network/gossip/interface.js +3 -0
  200. package/lib/network/gossip/interface.js.map +1 -1
  201. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  202. package/lib/network/gossip/scoringParameters.js +38 -2
  203. package/lib/network/gossip/scoringParameters.js.map +1 -1
  204. package/lib/network/gossip/topic.d.ts +77 -1
  205. package/lib/network/gossip/topic.d.ts.map +1 -1
  206. package/lib/network/gossip/topic.js +20 -0
  207. package/lib/network/gossip/topic.js.map +1 -1
  208. package/lib/network/peers/peerManager.d.ts.map +1 -1
  209. package/lib/network/peers/peerManager.js +9 -0
  210. package/lib/network/peers/peerManager.js.map +1 -1
  211. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  212. package/lib/network/processor/gossipHandlers.js +35 -1
  213. package/lib/network/processor/gossipHandlers.js.map +1 -1
  214. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  215. package/lib/network/processor/gossipQueues/index.js +16 -0
  216. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  217. package/lib/network/processor/index.d.ts.map +1 -1
  218. package/lib/network/processor/index.js +3 -0
  219. package/lib/network/processor/index.js.map +1 -1
  220. package/lib/sync/backfill/backfill.js +2 -2
  221. package/lib/sync/backfill/backfill.js.map +1 -1
  222. package/lib/sync/backfill/verify.d.ts +1 -2
  223. package/lib/sync/backfill/verify.d.ts.map +1 -1
  224. package/lib/sync/backfill/verify.js +2 -2
  225. package/lib/sync/backfill/verify.js.map +1 -1
  226. package/package.json +15 -15
  227. package/src/api/impl/beacon/blocks/index.ts +9 -7
  228. package/src/api/impl/lodestar/index.ts +12 -0
  229. package/src/api/impl/validator/index.ts +2 -1
  230. package/src/chain/ColumnReconstructionTracker.ts +8 -4
  231. package/src/chain/blocks/blockInput/blockInput.ts +45 -2
  232. package/src/chain/blocks/importBlock.ts +1 -1
  233. package/src/chain/blocks/verifyBlock.ts +0 -1
  234. package/src/chain/blocks/verifyBlocksSignatures.ts +4 -12
  235. package/src/chain/blocks/writeBlockInputToDb.ts +9 -0
  236. package/src/chain/bls/multithread/index.ts +7 -4
  237. package/src/chain/bls/multithread/jobItem.ts +7 -3
  238. package/src/chain/bls/singleThread.ts +5 -3
  239. package/src/chain/bls/utils.ts +15 -7
  240. package/src/chain/chain.ts +46 -34
  241. package/src/chain/errors/attestationError.ts +11 -1
  242. package/src/chain/errors/executionPayloadBid.ts +35 -0
  243. package/src/chain/errors/executionPayloadEnvelope.ts +34 -0
  244. package/src/chain/errors/index.ts +3 -0
  245. package/src/chain/errors/payloadAttestation.ts +25 -0
  246. package/src/chain/forkChoice/index.ts +19 -0
  247. package/src/chain/interface.ts +16 -1
  248. package/src/chain/opPools/executionPayloadBidPool.ts +77 -0
  249. package/src/chain/opPools/index.ts +2 -0
  250. package/src/chain/opPools/payloadAttestationPool.ts +157 -0
  251. package/src/chain/options.ts +0 -2
  252. package/src/chain/regen/interface.ts +2 -1
  253. package/src/chain/regen/queued.ts +1 -2
  254. package/src/chain/regen/regen.ts +6 -1
  255. package/src/chain/seenCache/index.ts +3 -1
  256. package/src/chain/seenCache/seenAttesters.ts +5 -0
  257. package/src/chain/seenCache/seenExecutionPayloadBids.ts +35 -0
  258. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +34 -0
  259. package/src/chain/seenCache/seenGossipBlockInput.ts +1 -1
  260. package/src/chain/stateCache/index.ts +0 -2
  261. package/src/chain/stateCache/persistentCheckpointsCache.ts +6 -2
  262. package/src/chain/validation/aggregateAndProof.ts +36 -14
  263. package/src/chain/validation/attestation.ts +33 -16
  264. package/src/chain/validation/attesterSlashing.ts +1 -6
  265. package/src/chain/validation/blobSidecar.ts +1 -6
  266. package/src/chain/validation/block.ts +6 -6
  267. package/src/chain/validation/dataColumnSidecar.ts +1 -6
  268. package/src/chain/validation/executionPayloadBid.ts +141 -0
  269. package/src/chain/validation/executionPayloadEnvelope.ts +122 -0
  270. package/src/chain/validation/payloadAttestationMessage.ts +109 -0
  271. package/src/chain/validation/proposerSlashing.ts +1 -6
  272. package/src/chain/validation/signatureSets/aggregateAndProof.ts +9 -14
  273. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -4
  274. package/src/chain/validation/signatureSets/selectionProof.ts +9 -9
  275. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -4
  276. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -3
  277. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -4
  278. package/src/chain/validation/syncCommittee.ts +1 -1
  279. package/src/chain/validation/syncCommitteeContributionAndProof.ts +3 -5
  280. package/src/chain/validation/voluntaryExit.ts +1 -1
  281. package/src/chain/validatorMonitor.ts +10 -5
  282. package/src/metrics/metrics/lodestar.ts +40 -0
  283. package/src/network/gossip/interface.ts +17 -0
  284. package/src/network/gossip/scoringParameters.ts +44 -2
  285. package/src/network/gossip/topic.ts +21 -0
  286. package/src/network/peers/peerManager.ts +11 -0
  287. package/src/network/processor/gossipHandlers.ts +49 -1
  288. package/src/network/processor/gossipQueues/index.ts +16 -0
  289. package/src/network/processor/index.ts +3 -0
  290. package/src/sync/backfill/backfill.ts +2 -2
  291. package/src/sync/backfill/verify.ts +2 -3
  292. package/lib/chain/stateCache/blockStateCacheImpl.d.ts +0 -54
  293. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +0 -1
  294. package/lib/chain/stateCache/blockStateCacheImpl.js +0 -130
  295. package/lib/chain/stateCache/blockStateCacheImpl.js.map +0 -1
  296. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts +0 -60
  297. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +0 -1
  298. package/lib/chain/stateCache/inMemoryCheckpointsCache.js +0 -156
  299. package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +0 -1
  300. package/src/chain/stateCache/blockStateCacheImpl.ts +0 -149
  301. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +0 -192
@@ -244,6 +244,18 @@ export function getLodestarApi({
244
244
  data: chain.validatorMonitor?.getMonitoredValidatorIndices() ?? [],
245
245
  };
246
246
  },
247
+
248
+ async getCustodyInfo() {
249
+ const {custodyColumns, targetCustodyGroupCount} = chain.custodyConfig;
250
+
251
+ return {
252
+ data: {
253
+ earliestCustodiedSlot: chain.earliestAvailableSlot,
254
+ custodyGroupCount: targetCustodyGroupCount,
255
+ custodyColumns,
256
+ },
257
+ };
258
+ },
247
259
  };
248
260
  }
249
261
 
@@ -67,10 +67,11 @@ import {
67
67
  SyncCommitteeError,
68
68
  SyncCommitteeErrorCode,
69
69
  } from "../../../chain/errors/index.js";
70
- import {ChainEvent, CheckpointHex, CommonBlockBody} from "../../../chain/index.js";
70
+ import {ChainEvent, CommonBlockBody} from "../../../chain/index.js";
71
71
  import {PREPARE_NEXT_SLOT_BPS} from "../../../chain/prepareNextSlot.js";
72
72
  import {BlockType, ProduceFullDeneb} from "../../../chain/produceBlock/index.js";
73
73
  import {RegenCaller} from "../../../chain/regen/index.js";
74
+ import {CheckpointHex} from "../../../chain/stateCache/types.js";
74
75
  import {validateApiAggregateAndProof} from "../../../chain/validation/index.js";
75
76
  import {validateSyncCommitteeGossipContributionAndProof} from "../../../chain/validation/syncCommitteeContributionAndProof.js";
76
77
  import {ZERO_HASH} from "../../../constants/index.js";
@@ -8,12 +8,12 @@ import {ChainEventEmitter} from "./emitter.js";
8
8
  /**
9
9
  * Minimum time to wait before attempting reconstruction
10
10
  */
11
- const RECONSTRUCTION_DELAY_MIN_MS = 800;
11
+ const RECONSTRUCTION_DELAY_MIN_BPS = 667;
12
12
 
13
13
  /**
14
14
  * Maximum time to wait before attempting reconstruction
15
15
  */
16
- const RECONSTRUCTION_DELAY_MAX_MS = 1200;
16
+ const RECONSTRUCTION_DELAY_MAX_BPS = 1000;
17
17
 
18
18
  export type ColumnReconstructionTrackerInit = {
19
19
  logger: Logger;
@@ -41,11 +41,16 @@ export class ColumnReconstructionTracker {
41
41
  /** Track if a reconstruction attempt is in-flight */
42
42
  running = false;
43
43
 
44
+ private readonly minDelayMs: number;
45
+ private readonly maxDelayMs: number;
46
+
44
47
  constructor(init: ColumnReconstructionTrackerInit) {
45
48
  this.logger = init.logger;
46
49
  this.emitter = init.emitter;
47
50
  this.metrics = init.metrics;
48
51
  this.config = init.config;
52
+ this.minDelayMs = this.config.getSlotComponentDurationMs(RECONSTRUCTION_DELAY_MIN_BPS);
53
+ this.maxDelayMs = this.config.getSlotComponentDurationMs(RECONSTRUCTION_DELAY_MAX_BPS);
49
54
  }
50
55
 
51
56
  triggerColumnReconstruction(blockInput: BlockInputColumns): void {
@@ -61,8 +66,7 @@ export class ColumnReconstructionTracker {
61
66
  // just that it has been triggered for this block root.
62
67
  this.running = true;
63
68
  this.lastBlockRootHex = blockInput.blockRootHex;
64
- const delay =
65
- RECONSTRUCTION_DELAY_MIN_MS + Math.random() * (RECONSTRUCTION_DELAY_MAX_MS - RECONSTRUCTION_DELAY_MIN_MS);
69
+ const delay = this.minDelayMs + Math.random() * (this.maxDelayMs - this.minDelayMs);
66
70
  sleep(delay)
67
71
  .then(() => {
68
72
  const logCtx = {slot: blockInput.slot, root: blockInput.blockRootHex};
@@ -1,4 +1,4 @@
1
- import {ForkName, ForkPostFulu, ForkPreDeneb, ForkPreGloas} from "@lodestar/params";
1
+ import {ForkName, ForkPostFulu, ForkPreDeneb, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
2
2
  import {BeaconBlockBody, BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
3
3
  import {fromHex, prettyBytes, toRootHex, withTimeout} from "@lodestar/utils";
4
4
  import {VersionedHashes} from "../../../execution/index.js";
@@ -561,6 +561,7 @@ type BlockInputColumnsState =
561
561
  | {
562
562
  hasBlock: true;
563
563
  hasAllData: true;
564
+ hasComputedAllData: boolean;
564
565
  versionedHashes: VersionedHashes;
565
566
  block: SignedBeaconBlock<ForkColumnsDA>;
566
567
  source: SourceMeta;
@@ -569,6 +570,7 @@ type BlockInputColumnsState =
569
570
  | {
570
571
  hasBlock: true;
571
572
  hasAllData: false;
573
+ hasComputedAllData: false;
572
574
  versionedHashes: VersionedHashes;
573
575
  block: SignedBeaconBlock<ForkColumnsDA>;
574
576
  source: SourceMeta;
@@ -576,11 +578,13 @@ type BlockInputColumnsState =
576
578
  | {
577
579
  hasBlock: false;
578
580
  hasAllData: true;
581
+ hasComputedAllData: boolean;
579
582
  versionedHashes: VersionedHashes;
580
583
  }
581
584
  | {
582
585
  hasBlock: false;
583
586
  hasAllData: false;
587
+ hasComputedAllData: false;
584
588
  versionedHashes: VersionedHashes;
585
589
  };
586
590
  /**
@@ -598,6 +602,12 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
598
602
  private columnsCache = new Map<ColumnIndex, ColumnWithSource>();
599
603
  private readonly sampledColumns: ColumnIndex[];
600
604
  private readonly custodyColumns: ColumnIndex[];
605
+ /**
606
+ * This promise resolves when all sampled columns are available
607
+ *
608
+ * This is different from `dataPromise` which resolves when all data is available or could become available (e.g. through reconstruction)
609
+ */
610
+ protected computedDataPromise = createPromise<fulu.DataColumnSidecars>();
601
611
 
602
612
  private constructor(
603
613
  init: BlockInputInit,
@@ -626,6 +636,7 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
626
636
  const state = {
627
637
  hasBlock: true,
628
638
  hasAllData,
639
+ hasComputedAllData: hasAllData,
629
640
  versionedHashes: props.block.message.body.blobKzgCommitments.map(kzgCommitmentToVersionedHash),
630
641
  block: props.block,
631
642
  source: {
@@ -649,6 +660,7 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
649
660
  blockInput.blockPromise.resolve(props.block);
650
661
  if (hasAllData) {
651
662
  blockInput.dataPromise.resolve([]);
663
+ blockInput.computedDataPromise.resolve([]);
652
664
  }
653
665
  return blockInput;
654
666
  }
@@ -661,6 +673,7 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
661
673
  const state: BlockInputColumnsState = {
662
674
  hasBlock: false,
663
675
  hasAllData,
676
+ hasComputedAllData: hasAllData as false,
664
677
  versionedHashes: props.columnSidecar.kzgCommitments.map(kzgCommitmentToVersionedHash),
665
678
  };
666
679
  const init: BlockInputInit = {
@@ -674,6 +687,7 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
674
687
  const blockInput = new BlockInputColumns(init, state, props.sampledColumns, props.custodyColumns);
675
688
  if (hasAllData) {
676
689
  blockInput.dataPromise.resolve([]);
690
+ blockInput.computedDataPromise.resolve([]);
677
691
  }
678
692
  return blockInput;
679
693
  }
@@ -722,11 +736,14 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
722
736
  const hasAllData =
723
737
  (props.block.message.body as BeaconBlockBody<ForkPostFulu & ForkPreGloas>).blobKzgCommitments.length === 0 ||
724
738
  this.state.hasAllData;
739
+ const hasComputedAllData =
740
+ props.block.message.body.blobKzgCommitments.length === 0 || this.state.hasComputedAllData;
725
741
 
726
742
  this.state = {
727
743
  ...this.state,
728
744
  hasBlock: true,
729
745
  hasAllData,
746
+ hasComputedAllData,
730
747
  block: props.block,
731
748
  source: {
732
749
  source: props.source,
@@ -774,17 +791,32 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
774
791
  this.columnsCache.set(columnSidecar.index, {columnSidecar, source, seenTimestampSec, peerIdStr});
775
792
 
776
793
  const sampledColumns = this.getSampledColumns();
777
- const hasAllData = this.state.hasAllData || sampledColumns.length === this.sampledColumns.length;
794
+ const hasAllData =
795
+ // already hasAllData
796
+ this.state.hasAllData ||
797
+ // has all sampled columns
798
+ sampledColumns.length === this.sampledColumns.length ||
799
+ // has enough columns to reconstruct the rest
800
+ this.columnsCache.size >= NUMBER_OF_COLUMNS / 2;
801
+
802
+ const hasComputedAllData =
803
+ // has all sampled columns
804
+ sampledColumns.length === this.sampledColumns.length;
778
805
 
779
806
  this.state = {
780
807
  ...this.state,
781
808
  hasAllData: hasAllData || this.state.hasAllData,
809
+ hasComputedAllData: hasComputedAllData || this.state.hasComputedAllData,
782
810
  timeCompleteSec: hasAllData ? seenTimestampSec : undefined,
783
811
  } as BlockInputColumnsState;
784
812
 
785
813
  if (hasAllData && sampledColumns !== null) {
786
814
  this.dataPromise.resolve(sampledColumns);
787
815
  }
816
+
817
+ if (hasComputedAllData && sampledColumns !== null) {
818
+ this.computedDataPromise.resolve(sampledColumns);
819
+ }
788
820
  }
789
821
 
790
822
  hasColumn(columnIndex: number): boolean {
@@ -859,4 +891,15 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
859
891
  versionedHashes: this.state.versionedHashes,
860
892
  };
861
893
  }
894
+
895
+ hasComputedAllData(): boolean {
896
+ return this.state.hasComputedAllData;
897
+ }
898
+
899
+ waitForComputedAllData(timeout: number, signal?: AbortSignal): Promise<fulu.DataColumnSidecars> {
900
+ if (!this.state.hasComputedAllData) {
901
+ return withTimeout(() => this.computedDataPromise.promise, timeout, signal);
902
+ }
903
+ return Promise.resolve(this.getSampledColumns());
904
+ }
862
905
  }
@@ -30,7 +30,7 @@ import type {BeaconChain} from "../chain.js";
30
30
  import {ChainEvent, ReorgEventData} from "../emitter.js";
31
31
  import {ForkchoiceCaller} from "../forkChoice/index.js";
32
32
  import {REPROCESS_MIN_TIME_TO_NEXT_SLOT_SEC} from "../reprocess.js";
33
- import {toCheckpointHex} from "../stateCache/index.js";
33
+ import {toCheckpointHex} from "../stateCache/persistentCheckpointsCache.js";
34
34
  import {isBlockInputBlobs, isBlockInputColumns} from "./blockInput/blockInput.js";
35
35
  import {AttestationImportOpt, FullyVerifiedBlock, ImportBlockOpts} from "./types.js";
36
36
  import {getCheckpointFromState} from "./utils/checkpoint.js";
@@ -145,7 +145,6 @@ export async function verifyBlocksInEpoch(
145
145
  opts.skipVerifyBlockSignatures !== true
146
146
  ? verifyBlocksSignatures(
147
147
  this.config,
148
- this.index2pubkey,
149
148
  this.bls,
150
149
  this.logger,
151
150
  this.metrics,
@@ -1,5 +1,5 @@
1
1
  import {BeaconConfig} from "@lodestar/config";
2
- import {CachedBeaconStateAllForks, Index2PubkeyCache, getBlockSignatureSets} from "@lodestar/state-transition";
2
+ import {CachedBeaconStateAllForks, getBlockSignatureSets} from "@lodestar/state-transition";
3
3
  import {IndexedAttestation, SignedBeaconBlock} from "@lodestar/types";
4
4
  import {Logger} from "@lodestar/utils";
5
5
  import {Metrics} from "../../metrics/metrics.js";
@@ -17,7 +17,6 @@ import {ImportBlockOpts} from "./types.js";
17
17
  */
18
18
  export async function verifyBlocksSignatures(
19
19
  config: BeaconConfig,
20
- index2pubkey: Index2PubkeyCache,
21
20
  bls: IBlsVerifier,
22
21
  logger: Logger,
23
22
  metrics: Metrics | null,
@@ -42,16 +41,9 @@ export async function verifyBlocksSignatures(
42
41
  : //
43
42
  // Verify signatures per block to track which block is invalid
44
43
  bls.verifySignatureSets(
45
- getBlockSignatureSets(
46
- config,
47
- index2pubkey,
48
- currentSyncCommitteeIndexed,
49
- block,
50
- indexedAttestationsByBlock[i],
51
- {
52
- skipProposerSignature: opts.validProposerSignature,
53
- }
54
- )
44
+ getBlockSignatureSets(config, currentSyncCommitteeIndexed, block, indexedAttestationsByBlock[i], {
45
+ skipProposerSignature: opts.validProposerSignature,
46
+ })
55
47
  );
56
48
 
57
49
  // getBlockSignatureSets() takes 45ms in benchmarks for 2022Q2 mainnet blocks (100 sigs). When syncing a 32 blocks
@@ -44,6 +44,15 @@ export async function writeBlockInputToDb(this: BeaconChain, blocksInputs: IBloc
44
44
 
45
45
  // NOTE: Old data is pruned on archive
46
46
  if (isBlockInputColumns(blockInput)) {
47
+ if (!blockInput.hasComputedAllData()) {
48
+ // Supernodes may only have a subset of the data columns by the time the block begins to be imported
49
+ // because full data availability can be assumed after NUMBER_OF_COLUMNS / 2 columns are available.
50
+ // Here, however, all data columns must be fully available/reconstructed before persisting to the DB.
51
+ await blockInput.waitForComputedAllData(BLOB_AVAILABILITY_TIMEOUT).catch(() => {
52
+ this.logger.debug("Failed to wait for computed all data", {slot, blockRoot: blockRootHex});
53
+ });
54
+ }
55
+
47
56
  const {custodyColumns} = this.custodyConfig;
48
57
  const blobsLen = (block.message as fulu.BeaconBlock).body.blobKzgCommitments.length;
49
58
  let dataColumnsLen: number;
@@ -7,7 +7,7 @@ import {Worker, spawn} from "@chainsafe/threads";
7
7
  self = undefined;
8
8
 
9
9
  import {PublicKey} from "@chainsafe/blst";
10
- import {ISignatureSet} from "@lodestar/state-transition";
10
+ import {ISignatureSet, Index2PubkeyCache} from "@lodestar/state-transition";
11
11
  import {Logger} from "@lodestar/utils";
12
12
  import {Metrics} from "../../../metrics/index.js";
13
13
  import {LinkedList} from "../../../util/array.js";
@@ -34,6 +34,7 @@ const workerDir = process.env.NODE_ENV === "test" ? "../../../../lib/chain/bls/m
34
34
  export type BlsMultiThreadWorkerPoolModules = {
35
35
  logger: Logger;
36
36
  metrics: Metrics | null;
37
+ index2pubkey: Index2PubkeyCache;
37
38
  };
38
39
 
39
40
  export type BlsMultiThreadWorkerPoolOptions = {
@@ -113,6 +114,7 @@ type WorkerDescriptor = {
113
114
  export class BlsMultiThreadWorkerPool implements IBlsVerifier {
114
115
  private readonly logger: Logger;
115
116
  private readonly metrics: Metrics | null;
117
+ private readonly index2pubkey: Index2PubkeyCache;
116
118
 
117
119
  private readonly workers: WorkerDescriptor[];
118
120
  private readonly jobs = new LinkedList<JobQueueItem>();
@@ -128,9 +130,10 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
128
130
  private workersBusy = 0;
129
131
 
130
132
  constructor(options: BlsMultiThreadWorkerPoolOptions, modules: BlsMultiThreadWorkerPoolModules) {
131
- const {logger, metrics} = modules;
133
+ const {logger, metrics, index2pubkey} = modules;
132
134
  this.logger = logger;
133
135
  this.metrics = metrics;
136
+ this.index2pubkey = index2pubkey;
134
137
  this.blsVerifyAllMultiThread = options.blsVerifyAllMultiThread ?? false;
135
138
 
136
139
  // Use compressed for herumi for now.
@@ -170,7 +173,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
170
173
  try {
171
174
  return verifySignatureSetsMaybeBatch(
172
175
  sets.map((set) => ({
173
- publicKey: getAggregatedPubkey(set),
176
+ publicKey: getAggregatedPubkey(set, this.index2pubkey),
174
177
  message: set.signingRoot.valueOf(),
175
178
  signature: set.signature,
176
179
  }))
@@ -395,7 +398,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
395
398
  try {
396
399
  // Note: This can throw, must be handled per-job.
397
400
  // Pubkey and signature aggregation is defered here
398
- workReq = await jobItemWorkReq(job, this.metrics);
401
+ workReq = await jobItemWorkReq(job, this.index2pubkey, this.metrics);
399
402
  } catch (e) {
400
403
  this.metrics?.blsThreadPool.errorAggregateSignatureSetsCount.inc({type: job.type});
401
404
 
@@ -1,5 +1,5 @@
1
1
  import {PublicKey, asyncAggregateWithRandomness} 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
  import {LinkedList} from "../../../util/array.js";
5
5
  import {VerifySignatureOpts} from "../interface.js";
@@ -48,14 +48,18 @@ export function jobItemSigSets(job: JobQueueItem): number {
48
48
  * Prepare BlsWorkReq from JobQueueItem
49
49
  * WARNING: May throw with untrusted user input
50
50
  */
51
- export async function jobItemWorkReq(job: JobQueueItem, metrics: Metrics | null): Promise<BlsWorkReq> {
51
+ export async function jobItemWorkReq(
52
+ job: JobQueueItem,
53
+ index2pubkey: Index2PubkeyCache,
54
+ metrics: Metrics | null
55
+ ): Promise<BlsWorkReq> {
52
56
  switch (job.type) {
53
57
  case JobQueueItemType.default:
54
58
  return {
55
59
  opts: job.opts,
56
60
  sets: job.sets.map((set) => ({
57
61
  // this can throw, handled in the consumer code
58
- publicKey: getAggregatedPubkey(set, metrics).toBytes(),
62
+ publicKey: getAggregatedPubkey(set, index2pubkey, metrics).toBytes(),
59
63
  signature: set.signature,
60
64
  message: set.signingRoot,
61
65
  })),
@@ -1,5 +1,5 @@
1
1
  import {PublicKey, Signature, aggregatePublicKeys, aggregateSignatures, verify} from "@chainsafe/blst";
2
- import {ISignatureSet} from "@lodestar/state-transition";
2
+ import {ISignatureSet, Index2PubkeyCache} from "@lodestar/state-transition";
3
3
  import {Metrics} from "../../metrics/index.js";
4
4
  import {IBlsVerifier} from "./interface.js";
5
5
  import {verifySignatureSetsMaybeBatch} from "./maybeBatch.js";
@@ -7,16 +7,18 @@ import {getAggregatedPubkey, getAggregatedPubkeysCount} from "./utils.js";
7
7
 
8
8
  export class BlsSingleThreadVerifier implements IBlsVerifier {
9
9
  private readonly metrics: Metrics | null;
10
+ private readonly index2pubkey: Index2PubkeyCache;
10
11
 
11
- constructor({metrics = null}: {metrics: Metrics | null}) {
12
+ constructor({metrics = null, index2pubkey}: {metrics: Metrics | null; index2pubkey: Index2PubkeyCache}) {
12
13
  this.metrics = metrics;
14
+ this.index2pubkey = index2pubkey;
13
15
  }
14
16
 
15
17
  async verifySignatureSets(sets: ISignatureSet[]): Promise<boolean> {
16
18
  this.metrics?.bls.aggregatedPubkeys.inc(getAggregatedPubkeysCount(sets));
17
19
 
18
20
  const setsAggregated = sets.map((set) => ({
19
- publicKey: getAggregatedPubkey(set),
21
+ publicKey: getAggregatedPubkey(set, this.index2pubkey, this.metrics),
20
22
  message: set.signingRoot,
21
23
  signature: set.signature,
22
24
  }));
@@ -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";
@@ -137,7 +140,7 @@ export class BeaconChain implements IBeaconChain {
137
140
  readonly logger: Logger;
138
141
  readonly metrics: Metrics | null;
139
142
  readonly validatorMonitor: ValidatorMonitor | null;
140
- readonly bufferPool: BufferPool | null;
143
+ readonly bufferPool: BufferPool;
141
144
 
142
145
  readonly anchorStateLatestBlockSlot: Slot;
143
146
 
@@ -156,12 +159,17 @@ export class BeaconChain implements IBeaconChain {
156
159
  readonly aggregatedAttestationPool: AggregatedAttestationPool;
157
160
  readonly syncCommitteeMessagePool: SyncCommitteeMessagePool;
158
161
  readonly syncContributionAndProofPool;
162
+ readonly executionPayloadBidPool: ExecutionPayloadBidPool;
163
+ readonly payloadAttestationPool: PayloadAttestationPool;
159
164
  readonly opPool: OpPool;
160
165
 
161
166
  // Gossip seen cache
162
167
  readonly seenAttesters = new SeenAttesters();
163
168
  readonly seenAggregators = new SeenAggregators();
169
+ readonly seenPayloadAttesters = new SeenPayloadAttesters();
164
170
  readonly seenAggregatedAttestations: SeenAggregatedAttestations;
171
+ readonly seenExecutionPayloadEnvelopes = new SeenExecutionPayloadEnvelopes();
172
+ readonly seenExecutionPayloadBids = new SeenExecutionPayloadBids();
165
173
  readonly seenBlockProposers = new SeenBlockProposers();
166
174
  readonly seenSyncCommitteeMessages = new SeenSyncCommitteeMessages();
167
175
  readonly seenContributionAndProof: SeenContributionAndProof;
@@ -268,8 +276,8 @@ export class BeaconChain implements IBeaconChain {
268
276
  const emitter = new ChainEventEmitter();
269
277
  // by default, verify signatures on both main threads and worker threads
270
278
  const bls = opts.blsVerifyAllMainThread
271
- ? new BlsSingleThreadVerifier({metrics})
272
- : new BlsMultiThreadWorkerPool(opts, {logger, metrics});
279
+ ? new BlsSingleThreadVerifier({metrics, index2pubkey})
280
+ : new BlsMultiThreadWorkerPool(opts, {logger, metrics, index2pubkey});
273
281
 
274
282
  if (!clock) clock = new Clock({config, genesisTime: this.genesisTime, signal});
275
283
 
@@ -278,6 +286,8 @@ export class BeaconChain implements IBeaconChain {
278
286
  this.aggregatedAttestationPool = new AggregatedAttestationPool(this.config, metrics);
279
287
  this.syncCommitteeMessagePool = new SyncCommitteeMessagePool(config, clock, this.opts?.preaggregateSlotDistance);
280
288
  this.syncContributionAndProofPool = new SyncContributionAndProofPool(config, clock, metrics, logger);
289
+ this.executionPayloadBidPool = new ExecutionPayloadBidPool();
290
+ this.payloadAttestationPool = new PayloadAttestationPool(config, clock, metrics);
281
291
  this.opPool = new OpPool(config);
282
292
 
283
293
  this.seenAggregatedAttestations = new SeenAggregatedAttestations(metrics);
@@ -327,32 +337,23 @@ export class BeaconChain implements IBeaconChain {
327
337
  this.index2pubkey = index2pubkey;
328
338
 
329
339
  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;
340
+ const blockStateCache = new FIFOBlockStateCache(this.opts, {metrics});
341
+ this.bufferPool = new BufferPool(anchorState.type.tree_serializedSize(anchorState.node), metrics);
336
342
 
337
343
  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
- }
344
+ this.cpStateDatastore = fileDataStore ? new FileCPStateDatastore(dataDir) : new DbCPStateDatastore(this.db);
345
+ checkpointStateCache = new PersistentCheckpointStateCache(
346
+ {
347
+ config,
348
+ metrics,
349
+ logger,
350
+ clock,
351
+ blockStateCache,
352
+ bufferPool: this.bufferPool,
353
+ datastore: this.cpStateDatastore,
354
+ },
355
+ this.opts
356
+ );
356
357
 
357
358
  const {checkpoint} = computeAnchorCheckpoint(config, anchorState);
358
359
  blockStateCache.add(anchorState);
@@ -375,6 +376,7 @@ export class BeaconChain implements IBeaconChain {
375
376
  forkChoice,
376
377
  blockStateCache,
377
378
  checkpointStateCache,
379
+ seenBlockInputCache: this.seenBlockInputCache,
378
380
  db,
379
381
  metrics,
380
382
  validatorMonitor,
@@ -488,6 +490,8 @@ export class BeaconChain implements IBeaconChain {
488
490
  this.seenAttesters.isKnown(epoch, index) ||
489
491
  // seenAggregators = single aggregator index, not participants of the aggregate
490
492
  this.seenAggregators.isKnown(epoch, index) ||
493
+ // seenPayloadAttesters = single signer of payload attestation message
494
+ this.seenPayloadAttesters.isKnown(epoch, index) ||
491
495
  // seenBlockProposers = single block proposer
492
496
  this.seenBlockProposers.seenAtEpoch(epoch, index)
493
497
  );
@@ -1262,6 +1266,8 @@ export class BeaconChain implements IBeaconChain {
1262
1266
  metrics.opPool.proposerSlashingPoolSize.set(this.opPool.proposerSlashingsSize);
1263
1267
  metrics.opPool.voluntaryExitPoolSize.set(this.opPool.voluntaryExitsSize);
1264
1268
  metrics.opPool.syncCommitteeMessagePoolSize.set(this.syncCommitteeMessagePool.size);
1269
+ metrics.opPool.payloadAttestationPool.size.set(this.payloadAttestationPool.size);
1270
+ metrics.opPool.executionPayloadBidPool.size.set(this.executionPayloadBidPool.size);
1265
1271
  // syncContributionAndProofPool tracks metrics on its own
1266
1272
  metrics.opPool.blsToExecutionChangePoolSize.set(this.opPool.blsToExecutionChangeSize);
1267
1273
  metrics.chain.blacklistedBlocks.set(this.blacklistedBlocks.size);
@@ -1292,6 +1298,9 @@ export class BeaconChain implements IBeaconChain {
1292
1298
  this.aggregatedAttestationPool.prune(slot);
1293
1299
  this.syncCommitteeMessagePool.prune(slot);
1294
1300
  this.seenSyncCommitteeMessages.prune(slot);
1301
+ this.payloadAttestationPool.prune(slot);
1302
+ this.executionPayloadBidPool.prune(slot);
1303
+ this.seenExecutionPayloadBids.prune(slot);
1295
1304
  this.seenAttestationDatas.onSlot(slot);
1296
1305
  this.reprocessController.onSlot(slot);
1297
1306
 
@@ -1315,6 +1324,7 @@ export class BeaconChain implements IBeaconChain {
1315
1324
 
1316
1325
  this.seenAttesters.prune(epoch);
1317
1326
  this.seenAggregators.prune(epoch);
1327
+ this.seenPayloadAttesters.prune(epoch);
1318
1328
  this.seenAggregatedAttestations.prune(epoch);
1319
1329
  this.seenBlockAttesters.prune(epoch);
1320
1330
  this.beaconProposerCache.prune(epoch);
@@ -1338,7 +1348,9 @@ export class BeaconChain implements IBeaconChain {
1338
1348
 
1339
1349
  private async onForkChoiceFinalized(this: BeaconChain, cp: CheckpointWithHex): Promise<void> {
1340
1350
  this.logger.verbose("Fork choice finalized", {epoch: cp.epoch, root: cp.rootHex});
1341
- this.seenBlockProposers.prune(computeStartSlotAtEpoch(cp.epoch));
1351
+ const finalizedSlot = computeStartSlotAtEpoch(cp.epoch);
1352
+ this.seenBlockProposers.prune(finalizedSlot);
1353
+ this.seenExecutionPayloadEnvelopes.prune(finalizedSlot);
1342
1354
 
1343
1355
  // Update validator custody to account for effective balance changes
1344
1356
  await this.updateValidatorsCustodyRequirement(cp);
@@ -1346,13 +1358,13 @@ export class BeaconChain implements IBeaconChain {
1346
1358
  // TODO: Improve using regen here
1347
1359
  const {blockRoot, stateRoot, slot} = this.forkChoice.getHead();
1348
1360
  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`);
1361
+ const blockResult = await this.getBlockByRoot(blockRoot);
1362
+ if (blockResult == null) {
1363
+ throw Error(`Head block for ${slot} is not available in cache or database`);
1352
1364
  }
1353
1365
 
1354
1366
  if (headState) {
1355
- this.opPool.pruneAll(headBlock, headState);
1367
+ this.opPool.pruneAll(blockResult.block, headState);
1356
1368
  }
1357
1369
 
1358
1370
  if (headState === null) {