@lodestar/beacon-node 1.39.1 → 1.40.0-dev.193b2e2047

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 (434) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +8 -18
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/utils.d.ts +2 -7
  5. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  6. package/lib/api/impl/beacon/state/utils.js +0 -12
  7. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  8. package/lib/api/impl/config/constants.d.ts +3 -0
  9. package/lib/api/impl/config/constants.d.ts.map +1 -1
  10. package/lib/api/impl/config/constants.js +5 -1
  11. package/lib/api/impl/config/constants.js.map +1 -1
  12. package/lib/api/impl/debug/index.d.ts +1 -1
  13. package/lib/api/impl/debug/index.d.ts.map +1 -1
  14. package/lib/api/impl/debug/index.js +3 -6
  15. package/lib/api/impl/debug/index.js.map +1 -1
  16. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  17. package/lib/api/impl/lodestar/index.js +6 -3
  18. package/lib/api/impl/lodestar/index.js.map +1 -1
  19. package/lib/api/impl/proof/index.d.ts.map +1 -1
  20. package/lib/api/impl/proof/index.js +1 -2
  21. package/lib/api/impl/proof/index.js.map +1 -1
  22. package/lib/api/impl/validator/index.d.ts.map +1 -1
  23. package/lib/api/impl/validator/index.js +10 -11
  24. package/lib/api/impl/validator/index.js.map +1 -1
  25. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  26. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +5 -3
  27. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  28. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  29. package/lib/chain/archiveStore/utils/archiveBlocks.js +23 -14
  30. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  31. package/lib/chain/blocks/blockInput/blockInput.d.ts +2 -0
  32. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  33. package/lib/chain/blocks/blockInput/blockInput.js +6 -0
  34. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  35. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  36. package/lib/chain/blocks/importBlock.js +14 -9
  37. package/lib/chain/blocks/importBlock.js.map +1 -1
  38. package/lib/chain/blocks/index.d.ts.map +1 -1
  39. package/lib/chain/blocks/index.js +0 -14
  40. package/lib/chain/blocks/index.js.map +1 -1
  41. package/lib/chain/blocks/types.d.ts +0 -2
  42. package/lib/chain/blocks/types.d.ts.map +1 -1
  43. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  44. package/lib/chain/blocks/verifyBlock.js +9 -9
  45. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  46. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  47. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  48. package/lib/chain/blocks/verifyBlocksSignatures.js +2 -2
  49. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  50. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  51. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +1 -0
  52. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  53. package/lib/chain/blocks/writeBlockInputToDb.d.ts +1 -4
  54. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  55. package/lib/chain/blocks/writeBlockInputToDb.js +20 -28
  56. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  57. package/lib/chain/bls/multithread/index.d.ts +3 -1
  58. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  59. package/lib/chain/bls/multithread/index.js +5 -3
  60. package/lib/chain/bls/multithread/index.js.map +1 -1
  61. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  62. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  63. package/lib/chain/bls/multithread/jobItem.js +2 -2
  64. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  65. package/lib/chain/bls/singleThread.d.ts +4 -2
  66. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  67. package/lib/chain/bls/singleThread.js +4 -2
  68. package/lib/chain/bls/singleThread.js.map +1 -1
  69. package/lib/chain/bls/utils.d.ts +2 -2
  70. package/lib/chain/bls/utils.d.ts.map +1 -1
  71. package/lib/chain/bls/utils.js +9 -6
  72. package/lib/chain/bls/utils.js.map +1 -1
  73. package/lib/chain/chain.d.ts +24 -6
  74. package/lib/chain/chain.d.ts.map +1 -1
  75. package/lib/chain/chain.js +196 -21
  76. package/lib/chain/chain.js.map +1 -1
  77. package/lib/chain/errors/attestationError.d.ts +14 -1
  78. package/lib/chain/errors/attestationError.d.ts.map +1 -1
  79. package/lib/chain/errors/attestationError.js +8 -0
  80. package/lib/chain/errors/attestationError.js.map +1 -1
  81. package/lib/chain/errors/executionPayloadBid.d.ts +48 -0
  82. package/lib/chain/errors/executionPayloadBid.d.ts.map +1 -0
  83. package/lib/chain/errors/executionPayloadBid.js +15 -0
  84. package/lib/chain/errors/executionPayloadBid.js.map +1 -0
  85. package/lib/chain/errors/executionPayloadEnvelope.d.ts +48 -0
  86. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -0
  87. package/lib/chain/errors/executionPayloadEnvelope.js +16 -0
  88. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -0
  89. package/lib/chain/errors/index.d.ts +3 -0
  90. package/lib/chain/errors/index.d.ts.map +1 -1
  91. package/lib/chain/errors/index.js +3 -0
  92. package/lib/chain/errors/index.js.map +1 -1
  93. package/lib/chain/errors/payloadAttestation.d.ts +34 -0
  94. package/lib/chain/errors/payloadAttestation.d.ts.map +1 -0
  95. package/lib/chain/errors/payloadAttestation.js +13 -0
  96. package/lib/chain/errors/payloadAttestation.js.map +1 -0
  97. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  98. package/lib/chain/forkChoice/index.js +18 -0
  99. package/lib/chain/forkChoice/index.js.map +1 -1
  100. package/lib/chain/initState.d.ts +1 -1
  101. package/lib/chain/initState.d.ts.map +1 -1
  102. package/lib/chain/initState.js +5 -3
  103. package/lib/chain/initState.js.map +1 -1
  104. package/lib/chain/interface.d.ts +23 -5
  105. package/lib/chain/interface.d.ts.map +1 -1
  106. package/lib/chain/interface.js.map +1 -1
  107. package/lib/chain/lightClient/proofs.d.ts.map +1 -1
  108. package/lib/chain/lightClient/proofs.js +0 -2
  109. package/lib/chain/lightClient/proofs.js.map +1 -1
  110. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +5 -9
  111. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  112. package/lib/chain/opPools/aggregatedAttestationPool.js +12 -141
  113. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  114. package/lib/chain/opPools/executionPayloadBidPool.d.ts +21 -0
  115. package/lib/chain/opPools/executionPayloadBidPool.d.ts.map +1 -0
  116. package/lib/chain/opPools/executionPayloadBidPool.js +57 -0
  117. package/lib/chain/opPools/executionPayloadBidPool.js.map +1 -0
  118. package/lib/chain/opPools/index.d.ts +2 -0
  119. package/lib/chain/opPools/index.d.ts.map +1 -1
  120. package/lib/chain/opPools/index.js +2 -0
  121. package/lib/chain/opPools/index.js.map +1 -1
  122. package/lib/chain/opPools/opPool.js +5 -8
  123. package/lib/chain/opPools/opPool.js.map +1 -1
  124. package/lib/chain/opPools/payloadAttestationPool.d.ts +24 -0
  125. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -0
  126. package/lib/chain/opPools/payloadAttestationPool.js +109 -0
  127. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -0
  128. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  129. package/lib/chain/prepareNextSlot.js +9 -10
  130. package/lib/chain/prepareNextSlot.js.map +1 -1
  131. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  132. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  133. package/lib/chain/produceBlock/produceBlockBody.js +6 -4
  134. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  135. package/lib/chain/regen/interface.d.ts +4 -13
  136. package/lib/chain/regen/interface.d.ts.map +1 -1
  137. package/lib/chain/regen/interface.js +1 -1
  138. package/lib/chain/regen/interface.js.map +1 -1
  139. package/lib/chain/regen/queued.d.ts +5 -9
  140. package/lib/chain/regen/queued.d.ts.map +1 -1
  141. package/lib/chain/regen/queued.js +16 -40
  142. package/lib/chain/regen/queued.js.map +1 -1
  143. package/lib/chain/regen/regen.d.ts +4 -8
  144. package/lib/chain/regen/regen.d.ts.map +1 -1
  145. package/lib/chain/regen/regen.js +16 -33
  146. package/lib/chain/regen/regen.js.map +1 -1
  147. package/lib/chain/seenCache/index.d.ts +3 -1
  148. package/lib/chain/seenCache/index.d.ts.map +1 -1
  149. package/lib/chain/seenCache/index.js +3 -1
  150. package/lib/chain/seenCache/index.js.map +1 -1
  151. package/lib/chain/seenCache/seenAttesters.d.ts +5 -0
  152. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
  153. package/lib/chain/seenCache/seenAttesters.js +5 -0
  154. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  155. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts +12 -0
  156. package/lib/chain/seenCache/seenExecutionPayloadBids.d.ts.map +1 -0
  157. package/lib/chain/seenCache/seenExecutionPayloadBids.js +30 -0
  158. package/lib/chain/seenCache/seenExecutionPayloadBids.js.map +1 -0
  159. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts +15 -0
  160. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.d.ts.map +1 -0
  161. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js +28 -0
  162. package/lib/chain/seenCache/seenExecutionPayloadEnvelope.js.map +1 -0
  163. package/lib/chain/shufflingCache.d.ts +16 -11
  164. package/lib/chain/shufflingCache.d.ts.map +1 -1
  165. package/lib/chain/shufflingCache.js +47 -41
  166. package/lib/chain/shufflingCache.js.map +1 -1
  167. package/lib/chain/stateCache/blockStateCacheImpl.d.ts +1 -2
  168. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +1 -1
  169. package/lib/chain/stateCache/blockStateCacheImpl.js +2 -2
  170. package/lib/chain/stateCache/blockStateCacheImpl.js.map +1 -1
  171. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +1 -2
  172. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  173. package/lib/chain/stateCache/fifoBlockStateCache.js +4 -4
  174. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  175. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts +4 -5
  176. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +1 -1
  177. package/lib/chain/stateCache/inMemoryCheckpointsCache.js +9 -10
  178. package/lib/chain/stateCache/inMemoryCheckpointsCache.js.map +1 -1
  179. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +5 -6
  180. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  181. package/lib/chain/stateCache/persistentCheckpointsCache.js +17 -17
  182. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  183. package/lib/chain/stateCache/types.d.ts +5 -6
  184. package/lib/chain/stateCache/types.d.ts.map +1 -1
  185. package/lib/chain/stateCache/types.js.map +1 -1
  186. package/lib/chain/validation/aggregateAndProof.js +35 -14
  187. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  188. package/lib/chain/validation/attestation.d.ts +2 -2
  189. package/lib/chain/validation/attestation.d.ts.map +1 -1
  190. package/lib/chain/validation/attestation.js +28 -9
  191. package/lib/chain/validation/attestation.js.map +1 -1
  192. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  193. package/lib/chain/validation/attesterSlashing.js +2 -2
  194. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  195. package/lib/chain/validation/blobSidecar.d.ts.map +1 -1
  196. package/lib/chain/validation/blobSidecar.js +3 -3
  197. package/lib/chain/validation/blobSidecar.js.map +1 -1
  198. package/lib/chain/validation/block.d.ts.map +1 -1
  199. package/lib/chain/validation/block.js +7 -4
  200. package/lib/chain/validation/block.js.map +1 -1
  201. package/lib/chain/validation/blsToExecutionChange.d.ts.map +1 -1
  202. package/lib/chain/validation/blsToExecutionChange.js +9 -2
  203. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  204. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  205. package/lib/chain/validation/dataColumnSidecar.js +3 -3
  206. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  207. package/lib/chain/validation/executionPayloadBid.d.ts +5 -0
  208. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -0
  209. package/lib/chain/validation/executionPayloadBid.js +104 -0
  210. package/lib/chain/validation/executionPayloadBid.js.map +1 -0
  211. package/lib/chain/validation/executionPayloadEnvelope.d.ts +5 -0
  212. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -0
  213. package/lib/chain/validation/executionPayloadEnvelope.js +89 -0
  214. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -0
  215. package/lib/chain/validation/payloadAttestationMessage.d.ts +9 -0
  216. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -0
  217. package/lib/chain/validation/payloadAttestationMessage.js +72 -0
  218. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -0
  219. package/lib/chain/validation/proposerSlashing.js +3 -2
  220. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  221. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts +2 -3
  222. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -1
  223. package/lib/chain/validation/signatureSets/aggregateAndProof.js +8 -3
  224. package/lib/chain/validation/signatureSets/aggregateAndProof.js.map +1 -1
  225. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  226. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  227. package/lib/chain/validation/signatureSets/contributionAndProof.js +3 -3
  228. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  229. package/lib/chain/validation/signatureSets/selectionProof.d.ts +2 -3
  230. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -1
  231. package/lib/chain/validation/signatureSets/selectionProof.js +8 -3
  232. package/lib/chain/validation/signatureSets/selectionProof.js.map +1 -1
  233. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  234. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  235. package/lib/chain/validation/signatureSets/syncCommittee.js +3 -3
  236. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  237. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +1 -2
  238. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  239. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js +2 -2
  240. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  241. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  242. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  243. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +3 -3
  244. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  245. package/lib/chain/validation/syncCommittee.js +1 -1
  246. package/lib/chain/validation/syncCommittee.js.map +1 -1
  247. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  248. package/lib/chain/validation/syncCommitteeContributionAndProof.js +3 -5
  249. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  250. package/lib/chain/validation/voluntaryExit.js +1 -1
  251. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  252. package/lib/chain/validatorMonitor.d.ts +2 -0
  253. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  254. package/lib/chain/validatorMonitor.js +42 -3
  255. package/lib/chain/validatorMonitor.js.map +1 -1
  256. package/lib/db/repositories/checkpointState.d.ts +2 -6
  257. package/lib/db/repositories/checkpointState.d.ts.map +1 -1
  258. package/lib/db/repositories/checkpointState.js +3 -16
  259. package/lib/db/repositories/checkpointState.js.map +1 -1
  260. package/lib/db/repositories/stateArchive.d.ts +9 -9
  261. package/lib/db/repositories/stateArchive.d.ts.map +1 -1
  262. package/lib/db/repositories/stateArchive.js +6 -21
  263. package/lib/db/repositories/stateArchive.js.map +1 -1
  264. package/lib/execution/engine/mock.d.ts +9 -6
  265. package/lib/execution/engine/mock.d.ts.map +1 -1
  266. package/lib/execution/engine/mock.js +34 -7
  267. package/lib/execution/engine/mock.js.map +1 -1
  268. package/lib/index.d.ts +1 -1
  269. package/lib/index.d.ts.map +1 -1
  270. package/lib/index.js +1 -1
  271. package/lib/index.js.map +1 -1
  272. package/lib/metrics/metrics/lodestar.d.ts +28 -6
  273. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  274. package/lib/metrics/metrics/lodestar.js +67 -17
  275. package/lib/metrics/metrics/lodestar.js.map +1 -1
  276. package/lib/network/gossip/interface.d.ts +20 -2
  277. package/lib/network/gossip/interface.d.ts.map +1 -1
  278. package/lib/network/gossip/interface.js +3 -0
  279. package/lib/network/gossip/interface.js.map +1 -1
  280. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  281. package/lib/network/gossip/scoringParameters.js +38 -2
  282. package/lib/network/gossip/scoringParameters.js.map +1 -1
  283. package/lib/network/gossip/topic.d.ts +77 -1
  284. package/lib/network/gossip/topic.d.ts.map +1 -1
  285. package/lib/network/gossip/topic.js +20 -0
  286. package/lib/network/gossip/topic.js.map +1 -1
  287. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  288. package/lib/network/processor/gossipHandlers.js +34 -3
  289. package/lib/network/processor/gossipHandlers.js.map +1 -1
  290. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  291. package/lib/network/processor/gossipQueues/index.js +16 -0
  292. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  293. package/lib/network/processor/index.d.ts.map +1 -1
  294. package/lib/network/processor/index.js +3 -0
  295. package/lib/network/processor/index.js.map +1 -1
  296. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  297. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +2 -4
  298. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  299. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts +1 -2
  300. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -1
  301. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js +5 -26
  302. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
  303. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +1 -2
  304. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -1
  305. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +5 -7
  306. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  307. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  308. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +1 -2
  309. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  310. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -1
  311. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -5
  312. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  313. package/lib/network/reqresp/handlers/index.js +2 -2
  314. package/lib/network/reqresp/handlers/index.js.map +1 -1
  315. package/lib/network/reqresp/utils/dataColumnResponseValidation.js +1 -1
  316. package/lib/network/reqresp/utils/dataColumnResponseValidation.js.map +1 -1
  317. package/lib/node/nodejs.d.ts.map +1 -1
  318. package/lib/node/nodejs.js +17 -2
  319. package/lib/node/nodejs.js.map +1 -1
  320. package/lib/sync/backfill/backfill.js +2 -2
  321. package/lib/sync/backfill/backfill.js.map +1 -1
  322. package/lib/sync/backfill/verify.d.ts +1 -2
  323. package/lib/sync/backfill/verify.d.ts.map +1 -1
  324. package/lib/sync/backfill/verify.js +2 -2
  325. package/lib/sync/backfill/verify.js.map +1 -1
  326. package/lib/sync/range/chain.d.ts.map +1 -1
  327. package/lib/sync/range/chain.js +0 -1
  328. package/lib/sync/range/chain.js.map +1 -1
  329. package/lib/sync/range/range.d.ts.map +1 -1
  330. package/lib/sync/range/range.js +0 -3
  331. package/lib/sync/range/range.js.map +1 -1
  332. package/lib/sync/unknownBlock.d.ts.map +1 -1
  333. package/lib/sync/unknownBlock.js +0 -3
  334. package/lib/sync/unknownBlock.js.map +1 -1
  335. package/lib/util/sszBytes.js +1 -1
  336. package/lib/util/sszBytes.js.map +1 -1
  337. package/package.json +15 -15
  338. package/src/api/impl/beacon/blocks/index.ts +8 -18
  339. package/src/api/impl/beacon/state/utils.ts +2 -22
  340. package/src/api/impl/config/constants.ts +8 -0
  341. package/src/api/impl/debug/index.ts +2 -6
  342. package/src/api/impl/lodestar/index.ts +7 -4
  343. package/src/api/impl/proof/index.ts +1 -2
  344. package/src/api/impl/validator/index.ts +13 -14
  345. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +5 -3
  346. package/src/chain/archiveStore/utils/archiveBlocks.ts +25 -14
  347. package/src/chain/blocks/blockInput/blockInput.ts +8 -0
  348. package/src/chain/blocks/importBlock.ts +15 -9
  349. package/src/chain/blocks/index.ts +0 -19
  350. package/src/chain/blocks/types.ts +0 -2
  351. package/src/chain/blocks/verifyBlock.ts +9 -12
  352. package/src/chain/blocks/verifyBlocksSignatures.ts +4 -12
  353. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +1 -0
  354. package/src/chain/blocks/writeBlockInputToDb.ts +24 -30
  355. package/src/chain/bls/multithread/index.ts +7 -4
  356. package/src/chain/bls/multithread/jobItem.ts +7 -3
  357. package/src/chain/bls/singleThread.ts +5 -3
  358. package/src/chain/bls/utils.ts +15 -7
  359. package/src/chain/chain.ts +225 -32
  360. package/src/chain/errors/attestationError.ts +11 -1
  361. package/src/chain/errors/executionPayloadBid.ts +35 -0
  362. package/src/chain/errors/executionPayloadEnvelope.ts +34 -0
  363. package/src/chain/errors/index.ts +3 -0
  364. package/src/chain/errors/payloadAttestation.ts +25 -0
  365. package/src/chain/forkChoice/index.ts +19 -0
  366. package/src/chain/initState.ts +5 -3
  367. package/src/chain/interface.ts +34 -3
  368. package/src/chain/lightClient/proofs.ts +0 -2
  369. package/src/chain/opPools/aggregatedAttestationPool.ts +19 -191
  370. package/src/chain/opPools/executionPayloadBidPool.ts +77 -0
  371. package/src/chain/opPools/index.ts +2 -0
  372. package/src/chain/opPools/opPool.ts +5 -7
  373. package/src/chain/opPools/payloadAttestationPool.ts +157 -0
  374. package/src/chain/prepareNextSlot.ts +8 -12
  375. package/src/chain/produceBlock/produceBlockBody.ts +13 -6
  376. package/src/chain/regen/interface.ts +3 -17
  377. package/src/chain/regen/queued.ts +17 -56
  378. package/src/chain/regen/regen.ts +16 -42
  379. package/src/chain/seenCache/index.ts +3 -1
  380. package/src/chain/seenCache/seenAttesters.ts +5 -0
  381. package/src/chain/seenCache/seenExecutionPayloadBids.ts +35 -0
  382. package/src/chain/seenCache/seenExecutionPayloadEnvelope.ts +34 -0
  383. package/src/chain/shufflingCache.ts +67 -50
  384. package/src/chain/stateCache/blockStateCacheImpl.ts +2 -3
  385. package/src/chain/stateCache/fifoBlockStateCache.ts +4 -5
  386. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +9 -15
  387. package/src/chain/stateCache/persistentCheckpointsCache.ts +17 -25
  388. package/src/chain/stateCache/types.ts +5 -10
  389. package/src/chain/validation/aggregateAndProof.ts +36 -14
  390. package/src/chain/validation/attestation.ts +36 -19
  391. package/src/chain/validation/attesterSlashing.ts +9 -7
  392. package/src/chain/validation/blobSidecar.ts +2 -7
  393. package/src/chain/validation/block.ts +8 -4
  394. package/src/chain/validation/blsToExecutionChange.ts +9 -7
  395. package/src/chain/validation/dataColumnSidecar.ts +2 -7
  396. package/src/chain/validation/executionPayloadBid.ts +141 -0
  397. package/src/chain/validation/executionPayloadEnvelope.ts +122 -0
  398. package/src/chain/validation/payloadAttestationMessage.ts +109 -0
  399. package/src/chain/validation/proposerSlashing.ts +3 -7
  400. package/src/chain/validation/signatureSets/aggregateAndProof.ts +9 -14
  401. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -4
  402. package/src/chain/validation/signatureSets/selectionProof.ts +9 -9
  403. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -4
  404. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -3
  405. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -4
  406. package/src/chain/validation/syncCommittee.ts +1 -1
  407. package/src/chain/validation/syncCommitteeContributionAndProof.ts +3 -5
  408. package/src/chain/validation/voluntaryExit.ts +1 -1
  409. package/src/chain/validatorMonitor.ts +52 -3
  410. package/src/db/repositories/checkpointState.ts +3 -19
  411. package/src/db/repositories/stateArchive.ts +13 -27
  412. package/src/execution/engine/mock.ts +40 -13
  413. package/src/index.ts +1 -1
  414. package/src/metrics/metrics/lodestar.ts +68 -17
  415. package/src/network/gossip/interface.ts +17 -0
  416. package/src/network/gossip/scoringParameters.ts +44 -2
  417. package/src/network/gossip/topic.ts +21 -0
  418. package/src/network/processor/gossipHandlers.ts +48 -3
  419. package/src/network/processor/gossipQueues/index.ts +16 -0
  420. package/src/network/processor/index.ts +3 -0
  421. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -4
  422. package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +5 -32
  423. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +5 -9
  424. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +5 -2
  425. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +1 -5
  426. package/src/network/reqresp/handlers/index.ts +2 -2
  427. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +1 -1
  428. package/src/node/nodejs.ts +18 -3
  429. package/src/sync/backfill/backfill.ts +2 -2
  430. package/src/sync/backfill/verify.ts +2 -3
  431. package/src/sync/range/chain.ts +0 -1
  432. package/src/sync/range/range.ts +0 -3
  433. package/src/sync/unknownBlock.ts +0 -3
  434. package/src/util/sszBytes.ts +1 -1
@@ -5,6 +5,8 @@ import {
5
5
  BASE_REWARDS_PER_EPOCH,
6
6
  BLOB_TX_TYPE,
7
7
  BLS_WITHDRAWAL_PREFIX,
8
+ BUILDER_INDEX_FLAG,
9
+ BUILDER_INDEX_SELF_BUILD,
8
10
  BUILDER_PAYMENT_THRESHOLD_DENOMINATOR,
9
11
  BUILDER_PAYMENT_THRESHOLD_NUMERATOR,
10
12
  BUILDER_WITHDRAWAL_PREFIX,
@@ -21,6 +23,7 @@ import {
21
23
  DOMAIN_BLS_TO_EXECUTION_CHANGE,
22
24
  DOMAIN_CONTRIBUTION_AND_PROOF,
23
25
  DOMAIN_DEPOSIT,
26
+ DOMAIN_PROPOSER_PREFERENCES,
24
27
  DOMAIN_PTC_ATTESTER,
25
28
  DOMAIN_RANDAO,
26
29
  DOMAIN_SELECTION_PROOF,
@@ -82,6 +85,7 @@ export const specConstants = {
82
85
  DOMAIN_APPLICATION_MASK,
83
86
  DOMAIN_APPLICATION_BUILDER,
84
87
  DOMAIN_BEACON_BUILDER,
88
+ DOMAIN_PROPOSER_PREFERENCES,
85
89
  DOMAIN_PTC_ATTESTER,
86
90
 
87
91
  // phase0/validator.md
@@ -128,6 +132,10 @@ export const specConstants = {
128
132
  DEPOSIT_REQUEST_TYPE: toHexByte(DEPOSIT_REQUEST_TYPE),
129
133
  WITHDRAWAL_REQUEST_TYPE: toHexByte(WITHDRAWAL_REQUEST_TYPE),
130
134
  CONSOLIDATION_REQUEST_TYPE: toHexByte(CONSOLIDATION_REQUEST_TYPE),
135
+
136
+ // gloas
137
+ BUILDER_INDEX_FLAG,
138
+ BUILDER_INDEX_SELF_BUILD,
131
139
  BUILDER_PAYMENT_THRESHOLD_NUMERATOR,
132
140
  BUILDER_PAYMENT_THRESHOLD_DENOMINATOR,
133
141
  };
@@ -3,7 +3,7 @@ import {ApplicationMethods} from "@lodestar/api/server";
3
3
  import {ExecutionStatus} from "@lodestar/fork-choice";
4
4
  import {ZERO_HASH_HEX, isForkPostDeneb, isForkPostFulu} from "@lodestar/params";
5
5
  import {BeaconState, deneb, fulu, sszTypesFor} from "@lodestar/types";
6
- import {fromAsync, toRootHex} from "@lodestar/utils";
6
+ import {toRootHex} from "@lodestar/utils";
7
7
  import {isOptimisticBlock} from "../../../util/forkChoice.js";
8
8
  import {getStateSlotFromBytes} from "../../../util/multifork.js";
9
9
  import {getBlockResponse} from "../beacon/blocks/utils.js";
@@ -14,7 +14,6 @@ import {assertUniqueItems} from "../utils.js";
14
14
  export function getDebugApi({
15
15
  chain,
16
16
  config,
17
- db,
18
17
  }: Pick<ApiModules, "chain" | "config" | "db">): ApplicationMethods<routes.debug.Endpoints> {
19
18
  return {
20
19
  async getDebugChainHeadsV2() {
@@ -104,10 +103,7 @@ export function getDebugApi({
104
103
  : 0;
105
104
 
106
105
  if (isForkPostFulu(fork) && blobCount > 0) {
107
- dataColumnSidecars = await fromAsync(db.dataColumnSidecar.valuesStream(blockRoot));
108
- if (dataColumnSidecars.length === 0) {
109
- dataColumnSidecars = await fromAsync(db.dataColumnSidecarArchive.valuesStream(block.message.slot));
110
- }
106
+ dataColumnSidecars = await chain.getDataColumnSidecars(block.message.slot, toRootHex(blockRoot));
111
107
 
112
108
  if (dataColumnSidecars.length === 0) {
113
109
  throw Error(
@@ -198,7 +198,7 @@ export function getLodestarApi({
198
198
  const {state, executionOptimistic, finalized} = await getStateResponseWithRegen(chain, stateId);
199
199
 
200
200
  const stateView = (
201
- state instanceof Uint8Array ? loadState(config, chain.getHeadState(), state).state : state.clone()
201
+ state instanceof Uint8Array ? loadState(config, chain.getHeadState(), state).state : state
202
202
  ) as BeaconStateCapella;
203
203
 
204
204
  const fork = config.getForkName(stateView.slot);
@@ -238,6 +238,12 @@ export function getLodestarApi({
238
238
  },
239
239
  };
240
240
  },
241
+
242
+ async getMonitoredValidatorIndices() {
243
+ return {
244
+ data: chain.validatorMonitor?.getMonitoredValidatorIndices() ?? [],
245
+ };
246
+ },
241
247
  };
242
248
  }
243
249
 
@@ -249,9 +255,6 @@ function regenRequestToJson(config: ChainForkConfig, regenRequest: RegenRequest)
249
255
  slot: regenRequest.args[1],
250
256
  };
251
257
 
252
- case "getCheckpointState":
253
- return ssz.phase0.Checkpoint.toJson(regenRequest.args[0]);
254
-
255
258
  case "getPreState": {
256
259
  const slot = regenRequest.args[0].slot;
257
260
  return {
@@ -27,8 +27,7 @@ export function getProofApi(
27
27
  const state =
28
28
  res.state instanceof Uint8Array ? loadState(config, chain.getHeadState(), res.state).state : res.state;
29
29
 
30
- // Commit any changes before computing the state root. In normal cases the state should have no changes here
31
- state.commit();
30
+ // there should be no state changes in beacon-node so no need to commit() here
32
31
  const stateNode = state.node;
33
32
 
34
33
  const proof = createProof(stateNode, {type: ProofType.compactMulti, descriptor});
@@ -1,7 +1,7 @@
1
1
  import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
2
2
  import {routes} from "@lodestar/api";
3
3
  import {ApplicationMethods} from "@lodestar/api/server";
4
- import {ExecutionStatus} from "@lodestar/fork-choice";
4
+ import {ExecutionStatus, ProtoBlock} from "@lodestar/fork-choice";
5
5
  import {
6
6
  ForkName,
7
7
  ForkPostBellatrix,
@@ -413,10 +413,10 @@ export function getValidatorApi(
413
413
  // as of now fee recipient checks can not be performed because builder does not return bid recipient
414
414
  {
415
415
  commonBlockBodyPromise,
416
- parentBlockRoot,
416
+ parentBlock,
417
417
  }: Omit<routes.validator.ExtraProduceBlockOpts, "builderSelection"> & {
418
418
  commonBlockBodyPromise: Promise<CommonBlockBody>;
419
- parentBlockRoot: Root;
419
+ parentBlock: ProtoBlock;
420
420
  }
421
421
  ): Promise<ProduceBlindedBlockRes> {
422
422
  const version = config.getForkName(slot);
@@ -447,7 +447,7 @@ export function getValidatorApi(
447
447
  timer = metrics?.blockProductionTime.startTimer();
448
448
  const {block, executionPayloadValue, consensusBlockValue} = await chain.produceBlindedBlock({
449
449
  slot,
450
- parentBlockRoot,
450
+ parentBlock,
451
451
  randaoReveal,
452
452
  graffiti,
453
453
  commonBlockBodyPromise,
@@ -482,10 +482,10 @@ export function getValidatorApi(
482
482
  feeRecipient,
483
483
  strictFeeRecipientCheck,
484
484
  commonBlockBodyPromise,
485
- parentBlockRoot,
485
+ parentBlock,
486
486
  }: Omit<routes.validator.ExtraProduceBlockOpts, "builderSelection"> & {
487
487
  commonBlockBodyPromise: Promise<CommonBlockBody>;
488
- parentBlockRoot: Root;
488
+ parentBlock: ProtoBlock;
489
489
  }
490
490
  ): Promise<ProduceBlockContentsRes & {shouldOverrideBuilder?: boolean}> {
491
491
  const source = ProducedBlockSource.engine;
@@ -496,7 +496,7 @@ export function getValidatorApi(
496
496
  timer = metrics?.blockProductionTime.startTimer();
497
497
  const {block, executionPayloadValue, consensusBlockValue, shouldOverrideBuilder} = await chain.produceBlock({
498
498
  slot,
499
- parentBlockRoot,
499
+ parentBlock,
500
500
  randaoReveal,
501
501
  graffiti,
502
502
  feeRecipient,
@@ -569,7 +569,8 @@ export function getValidatorApi(
569
569
  notWhileSyncing();
570
570
  await waitForSlot(slot); // Must never request for a future slot > currentSlot
571
571
 
572
- const {blockRoot: parentBlockRootHex, slot: parentSlot} = chain.getProposerHead(slot);
572
+ const parentBlock = chain.getProposerHead(slot);
573
+ const {blockRoot: parentBlockRootHex, slot: parentSlot} = parentBlock;
573
574
  const parentBlockRoot = fromHex(parentBlockRootHex);
574
575
  notOnOutOfRangeData(parentBlockRoot);
575
576
  metrics?.blockProductionSlotDelta.set(slot - parentSlot);
@@ -638,7 +639,7 @@ export function getValidatorApi(
638
639
  // can't do fee recipient checks as builder bid doesn't return feeRecipient as of now
639
640
  strictFeeRecipientCheck: false,
640
641
  commonBlockBodyPromise,
641
- parentBlockRoot,
642
+ parentBlock,
642
643
  })
643
644
  : Promise.reject(new Error("Builder disabled"));
644
645
 
@@ -647,7 +648,7 @@ export function getValidatorApi(
647
648
  feeRecipient,
648
649
  strictFeeRecipientCheck,
649
650
  commonBlockBodyPromise,
650
- parentBlockRoot,
651
+ parentBlock,
651
652
  }).then((engineBlock) => {
652
653
  // Once the engine returns a block, in the event of either:
653
654
  // - suspected builder censorship
@@ -689,7 +690,7 @@ export function getValidatorApi(
689
690
  chain
690
691
  .produceCommonBlockBody({
691
692
  slot,
692
- parentBlockRoot,
693
+ parentBlock,
693
694
  randaoReveal,
694
695
  graffiti: graffitiBytes,
695
696
  })
@@ -1040,9 +1041,7 @@ export function getValidatorApi(
1040
1041
  const res = await getStateResponseWithRegen(chain, startSlot);
1041
1042
 
1042
1043
  const stateViewDU =
1043
- res.state instanceof Uint8Array
1044
- ? loadState(config, chain.getHeadState(), res.state).state
1045
- : res.state.clone();
1044
+ res.state instanceof Uint8Array ? loadState(config, chain.getHeadState(), res.state).state : res.state;
1046
1045
 
1047
1046
  state = createCachedBeaconState(
1048
1047
  stateViewDU,
@@ -9,6 +9,7 @@ import {
9
9
  stateTransition,
10
10
  } from "@lodestar/state-transition";
11
11
  import {IBeaconDb} from "../../../db/index.js";
12
+ import {getStateTypeFromBytes} from "../../../util/multifork.js";
12
13
  import {HistoricalStateRegenMetrics} from "./metrics.js";
13
14
  import {RegenErrorType} from "./types.js";
14
15
 
@@ -35,12 +36,13 @@ export async function getNearestState(
35
36
  db: IBeaconDb,
36
37
  pubkey2index: PubkeyIndexMap
37
38
  ): Promise<CachedBeaconStateAllForks> {
38
- const states = await db.stateArchive.values({limit: 1, lte: slot, reverse: true});
39
- if (!states.length) {
39
+ const stateBytesArr = await db.stateArchive.binaries({limit: 1, lte: slot, reverse: true});
40
+ if (!stateBytesArr.length) {
40
41
  throw new Error("No near state found in the database");
41
42
  }
42
43
 
43
- const state = states[0];
44
+ const stateBytes = stateBytesArr[0];
45
+ const state = getStateTypeFromBytes(config, stateBytes).deserializeToViewDU(stateBytes);
44
46
  syncPubkeyCache(state, pubkey2index);
45
47
 
46
48
  return createCachedBeaconState(
@@ -73,9 +73,12 @@ export async function archiveBlocks(
73
73
  root: fromHex(block.blockRoot),
74
74
  }));
75
75
 
76
+ const logCtx = {currentEpoch, finalizedEpoch: finalizedCheckpoint.epoch, finalizedRoot: finalizedCheckpoint.rootHex};
77
+
76
78
  if (finalizedCanonicalBlockRoots.length > 0) {
77
79
  await migrateBlocksFromHotToColdDb(db, finalizedCanonicalBlockRoots);
78
80
  logger.verbose("Migrated blocks from hot DB to cold DB", {
81
+ ...logCtx,
79
82
  fromSlot: finalizedCanonicalBlockRoots[0].slot,
80
83
  toSlot: finalizedCanonicalBlockRoots.at(-1)?.slot,
81
84
  size: finalizedCanonicalBlockRoots.length,
@@ -88,7 +91,7 @@ export async function archiveBlocks(
88
91
  finalizedCanonicalBlockRoots,
89
92
  currentEpoch
90
93
  );
91
- logger.verbose("Migrated blobSidecars from hot DB to cold DB", {migratedEntries});
94
+ logger.verbose("Migrated blobSidecars from hot DB to cold DB", {...logCtx, migratedEntries});
92
95
  }
93
96
 
94
97
  if (finalizedPostFulu) {
@@ -99,7 +102,7 @@ export async function archiveBlocks(
99
102
  finalizedCanonicalBlockRoots,
100
103
  currentEpoch
101
104
  );
102
- logger.verbose("Migrated dataColumnSidecars from hot DB to cold DB", {migratedEntries});
105
+ logger.verbose("Migrated dataColumnSidecars from hot DB to cold DB", {...logCtx, migratedEntries});
103
106
  }
104
107
  }
105
108
 
@@ -114,14 +117,14 @@ export async function archiveBlocks(
114
117
  nonCanonicalBlockRoots.map(async (root, index) => {
115
118
  const block = finalizedNonCanonicalBlocks[index];
116
119
  const blockBytes = await db.block.getBinary(root);
117
- const logCtx = {slot: block.slot, root: block.blockRoot};
120
+ const blockLogCtx = {slot: block.slot, root: block.blockRoot};
118
121
  if (blockBytes) {
119
122
  await persistOrphanedBlock(block.slot, block.blockRoot, blockBytes, {
120
123
  persistOrphanedBlocksDir: persistOrphanedBlocksDir ?? "orphaned_blocks",
121
124
  });
122
- logger.verbose("Persisted orphaned block", logCtx);
125
+ logger.verbose("Persisted orphaned block", {...logCtx, ...blockLogCtx});
123
126
  } else {
124
- logger.warn("Tried to persist orphaned block but no block found", logCtx);
127
+ logger.warn("Tried to persist orphaned block but no block found", {...logCtx, ...blockLogCtx});
125
128
  }
126
129
  })
127
130
  );
@@ -129,17 +132,18 @@ export async function archiveBlocks(
129
132
 
130
133
  await db.block.batchDelete(nonCanonicalBlockRoots);
131
134
  logger.verbose("Deleted non canonical blocks from hot DB", {
135
+ ...logCtx,
132
136
  slots: finalizedNonCanonicalBlocks.map((summary) => summary.slot).join(","),
133
137
  });
134
138
 
135
139
  if (finalizedPostDeneb) {
136
140
  await db.blobSidecars.batchDelete(nonCanonicalBlockRoots);
137
- logger.verbose("Deleted non canonical blobSidecars from hot DB");
141
+ logger.verbose("Deleted non canonical blobSidecars from hot DB", logCtx);
138
142
  }
139
143
 
140
144
  if (finalizedPostFulu) {
141
145
  await db.dataColumnSidecar.deleteMany(nonCanonicalBlockRoots);
142
- logger.verbose("Deleted non canonical dataColumnSidecars from hot DB");
146
+ logger.verbose("Deleted non canonical dataColumnSidecars from hot DB", logCtx);
143
147
  }
144
148
  }
145
149
 
@@ -154,13 +158,13 @@ export async function archiveBlocks(
154
158
  const slotsToDelete = await db.blobSidecarsArchive.keys({lt: computeStartSlotAtEpoch(blobSidecarsMinEpoch)});
155
159
  if (slotsToDelete.length > 0) {
156
160
  await db.blobSidecarsArchive.batchDelete(slotsToDelete);
157
- logger.verbose(`blobSidecars prune: batchDelete range ${slotsToDelete[0]}..${slotsToDelete.at(-1)}`);
161
+ logger.verbose(`blobSidecars prune: batchDelete range ${slotsToDelete[0]}..${slotsToDelete.at(-1)}`, logCtx);
158
162
  } else {
159
- logger.verbose(`blobSidecars prune: no entries before epoch ${blobSidecarsMinEpoch}`);
163
+ logger.verbose(`blobSidecars prune: no entries before epoch ${blobSidecarsMinEpoch}`, logCtx);
160
164
  }
161
165
  }
162
166
  } else {
163
- logger.verbose("blobSidecars pruning skipped: archiveDataEpochs set to Infinity");
167
+ logger.verbose("blobSidecars pruning skipped: archiveDataEpochs set to Infinity", logCtx);
164
168
  }
165
169
  }
166
170
 
@@ -184,20 +188,22 @@ export async function archiveBlocks(
184
188
  if (slotsToDelete.length > 0) {
185
189
  await db.dataColumnSidecarArchive.deleteMany(slotsToDelete);
186
190
  logger.verbose("dataColumnSidecars prune", {
191
+ ...logCtx,
187
192
  slotRange: prettyPrintIndices(slotsToDelete),
188
193
  numOfSlots: slotsToDelete.length,
189
194
  totalNumOfSidecars: prefixedKeys.length,
190
195
  });
191
196
  } else {
192
- logger.verbose(`dataColumnSidecars prune: no entries before epoch ${dataColumnSidecarsMinEpoch}`);
197
+ logger.verbose(`dataColumnSidecars prune: no entries before epoch ${dataColumnSidecarsMinEpoch}`, logCtx);
193
198
  }
194
199
  } else {
195
200
  logger.verbose(
196
- `dataColumnSidecars pruning skipped: ${dataColumnSidecarsMinEpoch} is before fulu fork epoch ${config.FULU_FORK_EPOCH}`
201
+ `dataColumnSidecars pruning skipped: ${dataColumnSidecarsMinEpoch} is before fulu fork epoch ${config.FULU_FORK_EPOCH}`,
202
+ logCtx
197
203
  );
198
204
  }
199
205
  } else {
200
- logger.verbose("dataColumnSidecars pruning skipped: archiveDataEpochs set to Infinity");
206
+ logger.verbose("dataColumnSidecars pruning skipped: archiveDataEpochs set to Infinity", logCtx);
201
207
  }
202
208
  }
203
209
 
@@ -213,8 +219,8 @@ export async function archiveBlocks(
213
219
  }
214
220
 
215
221
  logger.verbose("Archiving of finalized blocks complete", {
222
+ ...logCtx,
216
223
  totalArchived: finalizedCanonicalBlocks.length,
217
- finalizedEpoch: finalizedCheckpoint.epoch,
218
224
  });
219
225
  }
220
226
 
@@ -232,6 +238,7 @@ async function migrateBlocksFromHotToColdDb(db: IBeaconDb, blocks: BlockRootSlot
232
238
  // load Buffer instead of SignedBeaconBlock to improve performance
233
239
  const canonicalBlockEntries: BlockArchiveBatchPutBinaryItem[] = await Promise.all(
234
240
  canonicalBlocks.map(async (block) => {
241
+ // Here we assume the blocks are already in the hot db
235
242
  const blockBuffer = await db.block.getBinary(block.root);
236
243
  if (!blockBuffer) {
237
244
  throw Error(`Block not found for slot ${block.slot} root ${toRootHex(block.root)}`);
@@ -288,6 +295,8 @@ async function migrateBlobSidecarsFromHotToColdDb(
288
295
  );
289
296
  })
290
297
  .map(async (block) => {
298
+ // Here we assume the blob sidecars are already in the hot db
299
+ // instead of checking first the block input cache
291
300
  const bytes = await db.blobSidecars.getBinary(block.root);
292
301
  if (!bytes) {
293
302
  throw Error(`No blobSidecars found for slot ${block.slot} root ${toRootHex(block.root)}`);
@@ -337,9 +346,11 @@ async function migrateDataColumnSidecarsFromHotToColdDb(
337
346
  continue;
338
347
  }
339
348
 
349
+ // Here we assume the data column sidecars are already in the hot db
340
350
  const dataColumnSidecarBytes = await fromAsync(db.dataColumnSidecar.valuesStreamBinary(block.root));
341
351
  // there could be 0 dataColumnSidecarBytes if block has no blob
342
352
  logger.verbose("migrateDataColumnSidecarsFromHotToColdDb", {
353
+ currentEpoch,
343
354
  slot: block.slot,
344
355
  root: toRootHex(block.root),
345
356
  numSidecars: dataColumnSidecarBytes.length,
@@ -412,6 +412,10 @@ export class BlockInputBlobs extends AbstractBlockInput<ForkBlobsDA, deneb.BlobS
412
412
  return this.blobsCache.has(blobIndex);
413
413
  }
414
414
 
415
+ getBlob(blobIndex: BlobIndex): deneb.BlobSidecar | undefined {
416
+ return this.blobsCache.get(blobIndex)?.blobSidecar;
417
+ }
418
+
415
419
  addBlob(
416
420
  {blockRootHex, blobSidecar, source, peerIdStr, seenTimestampSec}: AddBlob,
417
421
  opts = {throwOnDuplicateAdd: true}
@@ -787,6 +791,10 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
787
791
  return this.columnsCache.has(columnIndex);
788
792
  }
789
793
 
794
+ getColumn(columnIndex: number): fulu.DataColumnSidecar | undefined {
795
+ return this.columnsCache.get(columnIndex)?.columnSidecar;
796
+ }
797
+
790
798
  getVersionedHashes(): VersionedHashes {
791
799
  return this.state.versionedHashes;
792
800
  }
@@ -34,7 +34,6 @@ import {toCheckpointHex} from "../stateCache/index.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";
37
- import {writeBlockInputToDb} from "./writeBlockInputToDb.js";
38
37
 
39
38
  /**
40
39
  * Fork-choice allows to import attestations from current (0) or past (1) epoch.
@@ -91,11 +90,8 @@ export async function importBlock(
91
90
  throw Error("Unavailable block can not be imported in forkchoice");
92
91
  }
93
92
 
94
- // 1. Persist block to hot DB (pre-emptively)
95
- // If eagerPersistBlock = true we do that in verifyBlocksInEpoch to batch all I/O operations to save block time to head
96
- if (!opts.eagerPersistBlock) {
97
- await writeBlockInputToDb.call(this, [blockInput]);
98
- }
93
+ // 1. Persist block to hot DB (performed asynchronously to avoid blocking head selection)
94
+ void this.unfinalizedBlockWrites.push([blockInput]);
99
95
 
100
96
  // Without forcefully clearing this cache, we would rely on WeakMap to evict memory which is not reliable
101
97
  this.serializedCache.clear();
@@ -418,13 +414,20 @@ export async function importBlock(
418
414
  this.logger.verbose("After importBlock caching postState without SSZ cache", {slot: postState.slot});
419
415
  }
420
416
 
417
+ // Cache shufflings when crossing an epoch boundary
418
+ const parentEpoch = computeEpochAtSlot(parentBlockSlot);
419
+ if (parentEpoch < blockEpoch) {
420
+ this.shufflingCache.processState(postState);
421
+ this.logger.verbose("Processed shuffling for next epoch", {parentEpoch, blockEpoch, slot: blockSlot});
422
+ }
423
+
421
424
  if (blockSlot % SLOTS_PER_EPOCH === 0) {
422
425
  // Cache state to preserve epoch transition work
423
426
  const checkpointState = postState;
424
427
  const cp = getCheckpointFromState(checkpointState);
425
428
  this.regen.addCheckpointState(cp, checkpointState);
426
- // consumers should not mutate or get the transfered cache
427
- this.emitter.emit(ChainEvent.checkpoint, cp, checkpointState.clone(true));
429
+ // consumers should not mutate state ever
430
+ this.emitter.emit(ChainEvent.checkpoint, cp, checkpointState);
428
431
 
429
432
  // Note: in-lined code from previos handler of ChainEvent.checkpoint
430
433
  this.logger.verbose("Checkpoint processed", toCheckpointHex(cp));
@@ -584,7 +587,10 @@ export function addAttestationPostElectra(
584
587
  true
585
588
  );
586
589
  } else {
587
- const committees = epochCtx.getBeaconCommittees(attestation.data.slot, committeeIndices);
590
+ const attSlot = attestation.data.slot;
591
+ const attEpoch = computeEpochAtSlot(attSlot);
592
+ const decisionRoot = epochCtx.getShufflingDecisionRoot(attEpoch);
593
+ const committees = this.shufflingCache.getBeaconCommittees(attEpoch, decisionRoot, attSlot, committeeIndices);
588
594
  const aggregationBools = attestation.aggregationBits.toBoolArray();
589
595
  let offset = 0;
590
596
  for (let i = 0; i < committees.length; i++) {
@@ -11,7 +11,6 @@ import {FullyVerifiedBlock, ImportBlockOpts} from "./types.js";
11
11
  import {assertLinearChainSegment} from "./utils/chainSegment.js";
12
12
  import {verifyBlocksInEpoch} from "./verifyBlock.js";
13
13
  import {verifyBlocksSanityChecks} from "./verifyBlocksSanityChecks.js";
14
- import {removeEagerlyPersistedBlockInputs} from "./writeBlockInputToDb.js";
15
14
 
16
15
  export {AttestationImportOpt, type ImportBlockOpts} from "./types.js";
17
16
 
@@ -143,24 +142,6 @@ export async function processBlocks(
143
142
  }
144
143
  }
145
144
 
146
- // Clean db if we don't have blocks in forkchoice but already persisted them to db
147
- //
148
- // NOTE: this function is awaited to ensure that DB size remains constant, otherwise an attacker may bloat the
149
- // disk with big malicious payloads. Our sequential block importer will wait for this promise before importing
150
- // another block. The removal call error is not propagated since that would halt the chain.
151
- //
152
- // LOG: Because the error is not propagated and there's a risk of db bloat, the error is logged at warn level
153
- // to alert the user of potential db bloat. This error _should_ never happen user must act and report to us
154
- if (opts.eagerPersistBlock) {
155
- await removeEagerlyPersistedBlockInputs.call(this, blocks).catch((e) => {
156
- this.logger.warn(
157
- "Error pruning eagerly imported block inputs, DB may grow in size if this error happens frequently",
158
- {slot: blocks.map((block) => block.getBlock().message.slot).join(",")},
159
- e
160
- );
161
- });
162
- }
163
-
164
145
  throw err;
165
146
  }
166
147
  }
@@ -78,8 +78,6 @@ export type ImportBlockOpts = {
78
78
  validBlobSidecars?: BlobSidecarValidation;
79
79
  /** Seen timestamp seconds */
80
80
  seenTimestampSec?: number;
81
- /** Set to true if persist block right at verification time */
82
- eagerPersistBlock?: boolean;
83
81
  };
84
82
 
85
83
  /**
@@ -21,7 +21,6 @@ import {verifyBlocksDataAvailability} from "./verifyBlocksDataAvailability.js";
21
21
  import {SegmentExecStatus, verifyBlocksExecutionPayload} from "./verifyBlocksExecutionPayloads.js";
22
22
  import {verifyBlocksSignatures} from "./verifyBlocksSignatures.js";
23
23
  import {verifyBlocksStateTransitionOnly} from "./verifyBlocksStateTransitionOnly.js";
24
- import {writeBlockInputToDb} from "./writeBlockInputToDb.js";
25
24
 
26
25
  /**
27
26
  * Verifies 1 or more blocks are fully valid; from a linear sequence of blocks.
@@ -75,6 +74,10 @@ export async function verifyBlocksInEpoch(
75
74
  throw new BlockError(block0, {code: BlockErrorCode.PRESTATE_MISSING, error: e as Error});
76
75
  });
77
76
 
77
+ // in forky condition, make sure to populate ShufflingCache with regened state
78
+ // otherwise it may fail to get indexed attestations from shuffling cache later
79
+ this.shufflingCache.processState(preState0);
80
+
78
81
  if (!isStateValidatorsNodesPopulated(preState0)) {
79
82
  this.logger.verbose("verifyBlocksInEpoch preState0 SSZ cache stats", {
80
83
  slot: preState0.slot,
@@ -105,9 +108,11 @@ export async function verifyBlocksInEpoch(
105
108
  // Store indexed attestations for each block to avoid recomputing them during import
106
109
  const indexedAttestationsByBlock: IndexedAttestation[][] = [];
107
110
  for (const [i, block] of blocks.entries()) {
108
- indexedAttestationsByBlock[i] = block.message.body.attestations.map((attestation) =>
109
- preState0.epochCtx.getIndexedAttestation(fork, attestation)
110
- );
111
+ indexedAttestationsByBlock[i] = block.message.body.attestations.map((attestation) => {
112
+ const attEpoch = computeEpochAtSlot(attestation.data.slot);
113
+ const decisionRoot = preState0.epochCtx.getShufflingDecisionRoot(attEpoch);
114
+ return this.shufflingCache.getIndexedAttestation(attEpoch, decisionRoot, fork, attestation);
115
+ });
111
116
  }
112
117
 
113
118
  // batch all I/O operations to reduce overhead
@@ -140,7 +145,6 @@ export async function verifyBlocksInEpoch(
140
145
  opts.skipVerifyBlockSignatures !== true
141
146
  ? verifyBlocksSignatures(
142
147
  this.config,
143
- this.index2pubkey,
144
148
  this.bls,
145
149
  this.logger,
146
150
  this.metrics,
@@ -150,13 +154,6 @@ export async function verifyBlocksInEpoch(
150
154
  opts
151
155
  )
152
156
  : Promise.resolve({verifySignaturesTime: Date.now()}),
153
-
154
- // ideally we want to only persist blocks after verifying them however the reality is there are
155
- // rarely invalid blocks we'll batch all I/O operation here to reduce the overhead if there's
156
- // an error, we'll remove blocks not in forkchoice
157
- opts.verifyOnly !== true && opts.eagerPersistBlock
158
- ? writeBlockInputToDb.call(this, blockInputs)
159
- : Promise.resolve(),
160
157
  ]);
161
158
 
162
159
  if (opts.verifyOnly !== true) {
@@ -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
@@ -59,6 +59,7 @@ export async function verifyBlocksStateTransitionOnly(
59
59
  // if block is trusted don't verify proposer or op signature
60
60
  verifyProposer: !useBlsBatchVerify && !validSignatures && !validProposerSignature,
61
61
  verifySignatures: !useBlsBatchVerify && !validSignatures,
62
+ dontTransferCache: false,
62
63
  },
63
64
  {metrics, validatorMonitor}
64
65
  );
@@ -98,35 +98,29 @@ export async function writeBlockInputToDb(this: BeaconChain, blocksInputs: IBloc
98
98
  }
99
99
  }
100
100
 
101
- /**
102
- * Prunes eagerly persisted block inputs only if not known to the fork-choice
103
- */
104
- export async function removeEagerlyPersistedBlockInputs(this: BeaconChain, blockInputs: IBlockInput[]): Promise<void> {
105
- const blockToRemove = [];
106
- const blobsToRemove = [];
107
- const dataColumnsToRemove = [];
108
-
109
- for (const blockInput of blockInputs) {
110
- const block = blockInput.getBlock();
111
- const slot = block.message.slot;
112
- const blockRoot = this.config.getForkTypes(slot).BeaconBlock.hashTreeRoot(block.message);
113
- const blockRootHex = toRootHex(blockRoot);
114
- if (!this.forkChoice.hasBlockHex(blockRootHex)) {
115
- blockToRemove.push(block);
116
-
117
- if (isBlockInputColumns(blockInput) && blockInput.getCustodyColumns().length > 0) {
118
- dataColumnsToRemove.push(blockRoot);
119
- } else if (isBlockInputBlobs(blockInput)) {
120
- const blobSidecars = blockInput.getBlobs();
121
- blobsToRemove.push({blockRoot, slot, blobSidecars});
101
+ export async function persistBlockInputs(this: BeaconChain, blockInputs: IBlockInput[]): Promise<void> {
102
+ await writeBlockInputToDb
103
+ .call(this, blockInputs)
104
+ .catch((e) => {
105
+ this.logger.debug(
106
+ "Error persisting block input in hot db",
107
+ {
108
+ count: blockInputs.length,
109
+ slot: blockInputs[0].slot,
110
+ root: blockInputs[0].blockRootHex,
111
+ },
112
+ e
113
+ );
114
+ })
115
+ .finally(() => {
116
+ for (const blockInput of blockInputs) {
117
+ this.seenBlockInputCache.prune(blockInput.blockRootHex);
122
118
  }
123
- }
124
- }
125
-
126
- await Promise.all([
127
- // TODO: Batch DB operations not with Promise.all but with level db ops
128
- this.db.block.batchRemove(blockToRemove),
129
- this.db.blobSidecars.batchRemove(blobsToRemove),
130
- this.db.dataColumnSidecar.deleteMany(dataColumnsToRemove),
131
- ]);
119
+ if (blockInputs.length === 1) {
120
+ this.logger.debug("Pruned block input", {
121
+ slot: blockInputs[0].slot,
122
+ root: blockInputs[0].blockRootHex,
123
+ });
124
+ }
125
+ });
132
126
  }