@lodestar/beacon-node 1.35.0-dev.fcf8d024ea → 1.35.0-dev.feed916580

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 (945) hide show
  1. package/lib/api/impl/config/constants.d.ts +0 -5
  2. package/lib/api/impl/config/constants.js +1 -6
  3. package/lib/api/impl/config/constants.js.map +1 -1
  4. package/lib/api/impl/validator/index.js +3 -5
  5. package/lib/api/impl/validator/index.js.map +1 -1
  6. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +0 -1
  7. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  8. package/lib/chain/archiveStore/historicalState/worker.js +1 -1
  9. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  10. package/lib/chain/blocks/blockInput/blockInput.js +1 -1
  11. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  12. package/lib/chain/blocks/importBlock.js +3 -4
  13. package/lib/chain/blocks/importBlock.js.map +1 -1
  14. package/lib/chain/blocks/verifyBlocksDataAvailability.js +1 -8
  15. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  16. package/lib/chain/blocks/writeBlockInputToDb.js +7 -1
  17. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  18. package/lib/chain/bls/multithread/index.js +0 -1
  19. package/lib/chain/bls/multithread/index.js.map +1 -1
  20. package/lib/chain/chain.js +3 -2
  21. package/lib/chain/chain.js.map +1 -1
  22. package/lib/chain/emitter.d.ts +2 -2
  23. package/lib/chain/opPools/attestationPool.d.ts +3 -2
  24. package/lib/chain/opPools/attestationPool.js +5 -3
  25. package/lib/chain/opPools/attestationPool.js.map +1 -1
  26. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts +2 -3
  27. package/lib/chain/opPools/syncCommitteeMessagePool.js +5 -6
  28. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  29. package/lib/chain/opPools/types.d.ts +1 -1
  30. package/lib/chain/opPools/types.js +1 -1
  31. package/lib/chain/opPools/types.js.map +1 -1
  32. package/lib/chain/prepareNextSlot.d.ts +3 -3
  33. package/lib/chain/prepareNextSlot.js +8 -8
  34. package/lib/chain/prepareNextSlot.js.map +1 -1
  35. package/lib/chain/stateCache/persistentCheckpointsCache.js +8 -9
  36. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  37. package/lib/chain/validation/lightClientFinalityUpdate.js +3 -4
  38. package/lib/chain/validation/lightClientFinalityUpdate.js.map +1 -1
  39. package/lib/chain/validation/lightClientOptimisticUpdate.d.ts +4 -6
  40. package/lib/chain/validation/lightClientOptimisticUpdate.js +11 -11
  41. package/lib/chain/validation/lightClientOptimisticUpdate.js.map +1 -1
  42. package/lib/chain/validatorMonitor.js +14 -20
  43. package/lib/chain/validatorMonitor.js.map +1 -1
  44. package/lib/db/buckets.d.ts +4 -4
  45. package/lib/db/buckets.js +4 -4
  46. package/lib/db/buckets.js.map +1 -1
  47. package/lib/db/repositories/blobSidecars.js +1 -1
  48. package/lib/db/repositories/blobSidecars.js.map +1 -1
  49. package/lib/db/repositories/blobSidecarsArchive.js +1 -1
  50. package/lib/db/repositories/blobSidecarsArchive.js.map +1 -1
  51. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  52. package/lib/db/repositories/dataColumnSidecar.js +1 -1
  53. package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
  54. package/lib/db/repositories/dataColumnSidecarArchive.js +1 -1
  55. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  56. package/lib/metrics/metrics/lodestar.d.ts +1 -1
  57. package/lib/metrics/metrics/lodestar.js +3 -3
  58. package/lib/metrics/metrics/lodestar.js.map +1 -1
  59. package/lib/network/core/networkCoreWorkerHandler.js +3 -9
  60. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  61. package/lib/network/discv5/index.js +1 -4
  62. package/lib/network/discv5/index.js.map +1 -1
  63. package/lib/network/gossip/gossipsub.d.ts +0 -1
  64. package/lib/network/gossip/gossipsub.js +16 -35
  65. package/lib/network/gossip/gossipsub.js.map +1 -1
  66. package/lib/network/gossip/metrics.d.ts +7 -15
  67. package/lib/network/gossip/metrics.js +6 -16
  68. package/lib/network/gossip/metrics.js.map +1 -1
  69. package/lib/network/libp2p/index.js +1 -9
  70. package/lib/network/libp2p/index.js.map +1 -1
  71. package/lib/network/metadata.js +1 -2
  72. package/lib/network/metadata.js.map +1 -1
  73. package/lib/network/network.d.ts +1 -1
  74. package/lib/network/network.js +13 -11
  75. package/lib/network/network.js.map +1 -1
  76. package/lib/network/peers/datastore.d.ts +2 -2
  77. package/lib/network/peers/datastore.js +2 -2
  78. package/lib/network/peers/datastore.js.map +1 -1
  79. package/lib/network/processor/index.d.ts +1 -1
  80. package/lib/network/processor/index.js +3 -2
  81. package/lib/network/processor/index.js.map +1 -1
  82. package/lib/sync/types.d.ts +1 -0
  83. package/lib/sync/types.js.map +1 -1
  84. package/lib/sync/unknownBlock.d.ts +1 -0
  85. package/lib/sync/unknownBlock.js +19 -17
  86. package/lib/sync/unknownBlock.js.map +1 -1
  87. package/lib/sync/utils/downloadByRoot.d.ts +1 -3
  88. package/lib/sync/utils/downloadByRoot.js +9 -36
  89. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  90. package/lib/util/blobs.js +3 -5
  91. package/lib/util/blobs.js.map +1 -1
  92. package/lib/util/clock.d.ts +0 -5
  93. package/lib/util/clock.js +0 -3
  94. package/lib/util/clock.js.map +1 -1
  95. package/lib/util/dataColumns.js +1 -1
  96. package/lib/util/dataColumns.js.map +1 -1
  97. package/lib/util/execution.js +2 -19
  98. package/lib/util/execution.js.map +1 -1
  99. package/package.json +22 -32
  100. package/lib/api/impl/api.d.ts.map +0 -1
  101. package/lib/api/impl/beacon/blocks/index.d.ts.map +0 -1
  102. package/lib/api/impl/beacon/blocks/utils.d.ts.map +0 -1
  103. package/lib/api/impl/beacon/index.d.ts.map +0 -1
  104. package/lib/api/impl/beacon/pool/index.d.ts.map +0 -1
  105. package/lib/api/impl/beacon/rewards/index.d.ts.map +0 -1
  106. package/lib/api/impl/beacon/state/index.d.ts.map +0 -1
  107. package/lib/api/impl/beacon/state/utils.d.ts.map +0 -1
  108. package/lib/api/impl/config/constants.d.ts.map +0 -1
  109. package/lib/api/impl/config/index.d.ts.map +0 -1
  110. package/lib/api/impl/debug/index.d.ts.map +0 -1
  111. package/lib/api/impl/errors.d.ts.map +0 -1
  112. package/lib/api/impl/events/index.d.ts.map +0 -1
  113. package/lib/api/impl/index.d.ts.map +0 -1
  114. package/lib/api/impl/lightclient/index.d.ts.map +0 -1
  115. package/lib/api/impl/lodestar/index.d.ts.map +0 -1
  116. package/lib/api/impl/node/index.d.ts.map +0 -1
  117. package/lib/api/impl/node/utils.d.ts.map +0 -1
  118. package/lib/api/impl/proof/index.d.ts.map +0 -1
  119. package/lib/api/impl/types.d.ts.map +0 -1
  120. package/lib/api/impl/utils.d.ts.map +0 -1
  121. package/lib/api/impl/validator/index.d.ts.map +0 -1
  122. package/lib/api/impl/validator/utils.d.ts.map +0 -1
  123. package/lib/api/index.d.ts.map +0 -1
  124. package/lib/api/options.d.ts.map +0 -1
  125. package/lib/api/rest/activeSockets.d.ts.map +0 -1
  126. package/lib/api/rest/base.d.ts.map +0 -1
  127. package/lib/api/rest/index.d.ts.map +0 -1
  128. package/lib/api/rest/swaggerUI.d.ts.map +0 -1
  129. package/lib/bun-wrappers/prometheus-gc-stats.d.ts.map +0 -1
  130. package/lib/chain/ColumnReconstructionTracker.d.ts.map +0 -1
  131. package/lib/chain/GetBlobsTracker.d.ts.map +0 -1
  132. package/lib/chain/archiveStore/archiveStore.d.ts.map +0 -1
  133. package/lib/chain/archiveStore/constants.d.ts.map +0 -1
  134. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +0 -1
  135. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +0 -1
  136. package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +0 -1
  137. package/lib/chain/archiveStore/historicalState/types.d.ts.map +0 -1
  138. package/lib/chain/archiveStore/historicalState/worker.d.ts.map +0 -1
  139. package/lib/chain/archiveStore/index.d.ts.map +0 -1
  140. package/lib/chain/archiveStore/interface.d.ts.map +0 -1
  141. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +0 -1
  142. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +0 -1
  143. package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +0 -1
  144. package/lib/chain/archiveStore/utils/updateBackfillRange.d.ts.map +0 -1
  145. package/lib/chain/balancesCache.d.ts.map +0 -1
  146. package/lib/chain/beaconProposerCache.d.ts.map +0 -1
  147. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +0 -1
  148. package/lib/chain/blocks/blockInput/errors.d.ts.map +0 -1
  149. package/lib/chain/blocks/blockInput/index.d.ts.map +0 -1
  150. package/lib/chain/blocks/blockInput/types.d.ts.map +0 -1
  151. package/lib/chain/blocks/blockInput/utils.d.ts.map +0 -1
  152. package/lib/chain/blocks/importBlock.d.ts.map +0 -1
  153. package/lib/chain/blocks/index.d.ts.map +0 -1
  154. package/lib/chain/blocks/types.d.ts.map +0 -1
  155. package/lib/chain/blocks/utils/blowfishBanner.d.ts.map +0 -1
  156. package/lib/chain/blocks/utils/chainSegment.d.ts.map +0 -1
  157. package/lib/chain/blocks/utils/checkpoint.d.ts.map +0 -1
  158. package/lib/chain/blocks/utils/giraffeBanner.d.ts.map +0 -1
  159. package/lib/chain/blocks/utils/ownBanner.d.ts.map +0 -1
  160. package/lib/chain/blocks/utils/pandaMergeTransitionBanner.d.ts.map +0 -1
  161. package/lib/chain/blocks/utils/zebraBanner.d.ts.map +0 -1
  162. package/lib/chain/blocks/verifyBlock.d.ts.map +0 -1
  163. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +0 -1
  164. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +0 -1
  165. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +0 -1
  166. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +0 -1
  167. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +0 -1
  168. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +0 -1
  169. package/lib/chain/bls/index.d.ts.map +0 -1
  170. package/lib/chain/bls/interface.d.ts.map +0 -1
  171. package/lib/chain/bls/maybeBatch.d.ts.map +0 -1
  172. package/lib/chain/bls/multithread/index.d.ts.map +0 -1
  173. package/lib/chain/bls/multithread/jobItem.d.ts.map +0 -1
  174. package/lib/chain/bls/multithread/poolSize.d.ts.map +0 -1
  175. package/lib/chain/bls/multithread/types.d.ts.map +0 -1
  176. package/lib/chain/bls/multithread/utils.d.ts.map +0 -1
  177. package/lib/chain/bls/multithread/worker.d.ts.map +0 -1
  178. package/lib/chain/bls/singleThread.d.ts.map +0 -1
  179. package/lib/chain/bls/utils.d.ts.map +0 -1
  180. package/lib/chain/chain.d.ts.map +0 -1
  181. package/lib/chain/emitter.d.ts.map +0 -1
  182. package/lib/chain/errors/attestationError.d.ts.map +0 -1
  183. package/lib/chain/errors/attesterSlashingError.d.ts.map +0 -1
  184. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  185. package/lib/chain/errors/blockError.d.ts.map +0 -1
  186. package/lib/chain/errors/blsToExecutionChangeError.d.ts.map +0 -1
  187. package/lib/chain/errors/dataColumnSidecarError.d.ts.map +0 -1
  188. package/lib/chain/errors/gossipValidation.d.ts.map +0 -1
  189. package/lib/chain/errors/index.d.ts.map +0 -1
  190. package/lib/chain/errors/lightClientError.d.ts.map +0 -1
  191. package/lib/chain/errors/proposerSlashingError.d.ts.map +0 -1
  192. package/lib/chain/errors/syncCommitteeError.d.ts.map +0 -1
  193. package/lib/chain/errors/voluntaryExitError.d.ts.map +0 -1
  194. package/lib/chain/forkChoice/index.d.ts.map +0 -1
  195. package/lib/chain/genesis/genesis.d.ts.map +0 -1
  196. package/lib/chain/genesis/interface.d.ts.map +0 -1
  197. package/lib/chain/index.d.ts.map +0 -1
  198. package/lib/chain/initState.d.ts.map +0 -1
  199. package/lib/chain/interface.d.ts.map +0 -1
  200. package/lib/chain/lightClient/index.d.ts.map +0 -1
  201. package/lib/chain/lightClient/proofs.d.ts.map +0 -1
  202. package/lib/chain/lightClient/types.d.ts.map +0 -1
  203. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +0 -1
  204. package/lib/chain/opPools/attestationPool.d.ts.map +0 -1
  205. package/lib/chain/opPools/index.d.ts.map +0 -1
  206. package/lib/chain/opPools/opPool.d.ts.map +0 -1
  207. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +0 -1
  208. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +0 -1
  209. package/lib/chain/opPools/types.d.ts.map +0 -1
  210. package/lib/chain/opPools/utils.d.ts.map +0 -1
  211. package/lib/chain/options.d.ts.map +0 -1
  212. package/lib/chain/prepareNextSlot.d.ts.map +0 -1
  213. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +0 -1
  214. package/lib/chain/produceBlock/index.d.ts.map +0 -1
  215. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +0 -1
  216. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts.map +0 -1
  217. package/lib/chain/regen/errors.d.ts.map +0 -1
  218. package/lib/chain/regen/index.d.ts.map +0 -1
  219. package/lib/chain/regen/interface.d.ts.map +0 -1
  220. package/lib/chain/regen/queued.d.ts.map +0 -1
  221. package/lib/chain/regen/regen.d.ts.map +0 -1
  222. package/lib/chain/reprocess.d.ts.map +0 -1
  223. package/lib/chain/rewards/attestationsRewards.d.ts.map +0 -1
  224. package/lib/chain/rewards/blockRewards.d.ts.map +0 -1
  225. package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +0 -1
  226. package/lib/chain/seenCache/index.d.ts.map +0 -1
  227. package/lib/chain/seenCache/seenAggregateAndProof.d.ts.map +0 -1
  228. package/lib/chain/seenCache/seenAttestationData.d.ts.map +0 -1
  229. package/lib/chain/seenCache/seenAttesters.d.ts.map +0 -1
  230. package/lib/chain/seenCache/seenBlockAttesters.d.ts.map +0 -1
  231. package/lib/chain/seenCache/seenBlockProposers.d.ts.map +0 -1
  232. package/lib/chain/seenCache/seenCommittee.d.ts.map +0 -1
  233. package/lib/chain/seenCache/seenCommitteeContribution.d.ts.map +0 -1
  234. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +0 -1
  235. package/lib/chain/serializeState.d.ts.map +0 -1
  236. package/lib/chain/shufflingCache.d.ts.map +0 -1
  237. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +0 -1
  238. package/lib/chain/stateCache/datastore/db.d.ts.map +0 -1
  239. package/lib/chain/stateCache/datastore/file.d.ts.map +0 -1
  240. package/lib/chain/stateCache/datastore/index.d.ts.map +0 -1
  241. package/lib/chain/stateCache/datastore/types.d.ts.map +0 -1
  242. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +0 -1
  243. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +0 -1
  244. package/lib/chain/stateCache/index.d.ts.map +0 -1
  245. package/lib/chain/stateCache/mapMetrics.d.ts.map +0 -1
  246. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +0 -1
  247. package/lib/chain/stateCache/types.d.ts.map +0 -1
  248. package/lib/chain/validation/aggregateAndProof.d.ts.map +0 -1
  249. package/lib/chain/validation/attestation.d.ts.map +0 -1
  250. package/lib/chain/validation/attesterSlashing.d.ts.map +0 -1
  251. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  252. package/lib/chain/validation/block.d.ts.map +0 -1
  253. package/lib/chain/validation/blsToExecutionChange.d.ts.map +0 -1
  254. package/lib/chain/validation/dataColumnSidecar.d.ts.map +0 -1
  255. package/lib/chain/validation/index.d.ts.map +0 -1
  256. package/lib/chain/validation/lightClientFinalityUpdate.d.ts.map +0 -1
  257. package/lib/chain/validation/lightClientOptimisticUpdate.d.ts.map +0 -1
  258. package/lib/chain/validation/proposerSlashing.d.ts.map +0 -1
  259. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +0 -1
  260. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +0 -1
  261. package/lib/chain/validation/signatureSets/index.d.ts.map +0 -1
  262. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +0 -1
  263. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +0 -1
  264. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +0 -1
  265. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +0 -1
  266. package/lib/chain/validation/syncCommittee.d.ts.map +0 -1
  267. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +0 -1
  268. package/lib/chain/validation/voluntaryExit.d.ts.map +0 -1
  269. package/lib/chain/validatorMonitor.d.ts.map +0 -1
  270. package/lib/constants/constants.d.ts.map +0 -1
  271. package/lib/constants/index.d.ts.map +0 -1
  272. package/lib/constants/network.d.ts.map +0 -1
  273. package/lib/db/beacon.d.ts.map +0 -1
  274. package/lib/db/buckets.d.ts.map +0 -1
  275. package/lib/db/index.d.ts.map +0 -1
  276. package/lib/db/interface.d.ts.map +0 -1
  277. package/lib/db/options.d.ts.map +0 -1
  278. package/lib/db/repositories/attesterSlashing.d.ts.map +0 -1
  279. package/lib/db/repositories/backfilledRanges.d.ts.map +0 -1
  280. package/lib/db/repositories/blobSidecars.d.ts.map +0 -1
  281. package/lib/db/repositories/blobSidecarsArchive.d.ts.map +0 -1
  282. package/lib/db/repositories/block.d.ts.map +0 -1
  283. package/lib/db/repositories/blockArchive.d.ts.map +0 -1
  284. package/lib/db/repositories/blockArchiveIndex.d.ts.map +0 -1
  285. package/lib/db/repositories/blsToExecutionChange.d.ts.map +0 -1
  286. package/lib/db/repositories/checkpointState.d.ts.map +0 -1
  287. package/lib/db/repositories/dataColumnSidecar.d.ts.map +0 -1
  288. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +0 -1
  289. package/lib/db/repositories/depositDataRoot.d.ts.map +0 -1
  290. package/lib/db/repositories/depositEvent.d.ts.map +0 -1
  291. package/lib/db/repositories/eth1Data.d.ts.map +0 -1
  292. package/lib/db/repositories/index.d.ts.map +0 -1
  293. package/lib/db/repositories/lightclientBestUpdate.d.ts.map +0 -1
  294. package/lib/db/repositories/lightclientCheckpointHeader.d.ts.map +0 -1
  295. package/lib/db/repositories/lightclientSyncCommittee.d.ts.map +0 -1
  296. package/lib/db/repositories/lightclientSyncCommitteeWitness.d.ts.map +0 -1
  297. package/lib/db/repositories/proposerSlashing.d.ts.map +0 -1
  298. package/lib/db/repositories/stateArchive.d.ts.map +0 -1
  299. package/lib/db/repositories/stateArchiveIndex.d.ts.map +0 -1
  300. package/lib/db/repositories/voluntaryExit.d.ts.map +0 -1
  301. package/lib/db/single/index.d.ts.map +0 -1
  302. package/lib/db/single/preGenesisState.d.ts.map +0 -1
  303. package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts.map +0 -1
  304. package/lib/eth1/errors.d.ts.map +0 -1
  305. package/lib/eth1/eth1DataCache.d.ts.map +0 -1
  306. package/lib/eth1/eth1DepositDataTracker.d.ts.map +0 -1
  307. package/lib/eth1/eth1DepositsCache.d.ts.map +0 -1
  308. package/lib/eth1/eth1MergeBlockTracker.d.ts.map +0 -1
  309. package/lib/eth1/index.d.ts.map +0 -1
  310. package/lib/eth1/interface.d.ts.map +0 -1
  311. package/lib/eth1/options.d.ts.map +0 -1
  312. package/lib/eth1/provider/eth1Provider.d.ts.map +0 -1
  313. package/lib/eth1/provider/jsonRpcHttpClient.d.ts.map +0 -1
  314. package/lib/eth1/provider/jwt.d.ts.map +0 -1
  315. package/lib/eth1/provider/utils.d.ts.map +0 -1
  316. package/lib/eth1/stream.d.ts.map +0 -1
  317. package/lib/eth1/utils/depositContract.d.ts.map +0 -1
  318. package/lib/eth1/utils/deposits.d.ts.map +0 -1
  319. package/lib/eth1/utils/eth1Data.d.ts.map +0 -1
  320. package/lib/eth1/utils/eth1DepositEvent.d.ts.map +0 -1
  321. package/lib/eth1/utils/eth1Vote.d.ts.map +0 -1
  322. package/lib/eth1/utils/groupDepositEventsByBlock.d.ts.map +0 -1
  323. package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts.map +0 -1
  324. package/lib/execution/builder/cache.d.ts.map +0 -1
  325. package/lib/execution/builder/http.d.ts.map +0 -1
  326. package/lib/execution/builder/index.d.ts.map +0 -1
  327. package/lib/execution/builder/interface.d.ts.map +0 -1
  328. package/lib/execution/builder/utils.d.ts.map +0 -1
  329. package/lib/execution/engine/disabled.d.ts.map +0 -1
  330. package/lib/execution/engine/http.d.ts.map +0 -1
  331. package/lib/execution/engine/index.d.ts.map +0 -1
  332. package/lib/execution/engine/interface.d.ts.map +0 -1
  333. package/lib/execution/engine/mock.d.ts.map +0 -1
  334. package/lib/execution/engine/payloadIdCache.d.ts.map +0 -1
  335. package/lib/execution/engine/types.d.ts.map +0 -1
  336. package/lib/execution/engine/utils.d.ts.map +0 -1
  337. package/lib/execution/index.d.ts.map +0 -1
  338. package/lib/index.d.ts.map +0 -1
  339. package/lib/metrics/index.d.ts.map +0 -1
  340. package/lib/metrics/metrics/beacon.d.ts.map +0 -1
  341. package/lib/metrics/metrics/lodestar.d.ts.map +0 -1
  342. package/lib/metrics/metrics.d.ts.map +0 -1
  343. package/lib/metrics/nodeJsMetrics.d.ts.map +0 -1
  344. package/lib/metrics/options.d.ts.map +0 -1
  345. package/lib/metrics/server/http.d.ts.map +0 -1
  346. package/lib/metrics/server/index.d.ts.map +0 -1
  347. package/lib/metrics/utils/avgMinMax.d.ts.map +0 -1
  348. package/lib/metrics/utils/gauge.d.ts.map +0 -1
  349. package/lib/metrics/utils/registryMetricCreator.d.ts.map +0 -1
  350. package/lib/monitoring/clientStats.d.ts.map +0 -1
  351. package/lib/monitoring/index.d.ts.map +0 -1
  352. package/lib/monitoring/options.d.ts.map +0 -1
  353. package/lib/monitoring/properties.d.ts.map +0 -1
  354. package/lib/monitoring/service.d.ts.map +0 -1
  355. package/lib/monitoring/system.d.ts.map +0 -1
  356. package/lib/monitoring/types.d.ts.map +0 -1
  357. package/lib/network/core/events.d.ts.map +0 -1
  358. package/lib/network/core/index.d.ts.map +0 -1
  359. package/lib/network/core/metrics.d.ts.map +0 -1
  360. package/lib/network/core/networkCore.d.ts.map +0 -1
  361. package/lib/network/core/networkCoreWorker.d.ts.map +0 -1
  362. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +0 -1
  363. package/lib/network/core/types.d.ts.map +0 -1
  364. package/lib/network/discv5/index.d.ts.map +0 -1
  365. package/lib/network/discv5/types.d.ts.map +0 -1
  366. package/lib/network/discv5/utils.d.ts.map +0 -1
  367. package/lib/network/discv5/worker.d.ts.map +0 -1
  368. package/lib/network/events.d.ts.map +0 -1
  369. package/lib/network/forks.d.ts.map +0 -1
  370. package/lib/network/gossip/constants.d.ts.map +0 -1
  371. package/lib/network/gossip/encoding.d.ts.map +0 -1
  372. package/lib/network/gossip/errors.d.ts.map +0 -1
  373. package/lib/network/gossip/gossipsub.d.ts.map +0 -1
  374. package/lib/network/gossip/index.d.ts.map +0 -1
  375. package/lib/network/gossip/interface.d.ts.map +0 -1
  376. package/lib/network/gossip/metrics.d.ts.map +0 -1
  377. package/lib/network/gossip/scoringParameters.d.ts.map +0 -1
  378. package/lib/network/gossip/topic.d.ts.map +0 -1
  379. package/lib/network/index.d.ts.map +0 -1
  380. package/lib/network/interface.d.ts.map +0 -1
  381. package/lib/network/libp2p/error.d.ts.map +0 -1
  382. package/lib/network/libp2p/index.d.ts.map +0 -1
  383. package/lib/network/metadata.d.ts.map +0 -1
  384. package/lib/network/network.d.ts.map +0 -1
  385. package/lib/network/networkConfig.d.ts.map +0 -1
  386. package/lib/network/options.d.ts.map +0 -1
  387. package/lib/network/peers/client.d.ts.map +0 -1
  388. package/lib/network/peers/datastore.d.ts.map +0 -1
  389. package/lib/network/peers/discover.d.ts.map +0 -1
  390. package/lib/network/peers/index.d.ts.map +0 -1
  391. package/lib/network/peers/peerManager.d.ts.map +0 -1
  392. package/lib/network/peers/peersData.d.ts.map +0 -1
  393. package/lib/network/peers/score/constants.d.ts.map +0 -1
  394. package/lib/network/peers/score/index.d.ts.map +0 -1
  395. package/lib/network/peers/score/interface.d.ts.map +0 -1
  396. package/lib/network/peers/score/score.d.ts.map +0 -1
  397. package/lib/network/peers/score/store.d.ts.map +0 -1
  398. package/lib/network/peers/score/utils.d.ts.map +0 -1
  399. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +0 -1
  400. package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +0 -1
  401. package/lib/network/peers/utils/getConnectedPeerIds.d.ts.map +0 -1
  402. package/lib/network/peers/utils/index.d.ts.map +0 -1
  403. package/lib/network/peers/utils/prioritizePeers.d.ts.map +0 -1
  404. package/lib/network/peers/utils/subnetMap.d.ts.map +0 -1
  405. package/lib/network/processor/aggregatorTracker.d.ts.map +0 -1
  406. package/lib/network/processor/extractSlotRootFns.d.ts.map +0 -1
  407. package/lib/network/processor/gossipHandlers.d.ts.map +0 -1
  408. package/lib/network/processor/gossipQueues/index.d.ts.map +0 -1
  409. package/lib/network/processor/gossipQueues/indexed.d.ts.map +0 -1
  410. package/lib/network/processor/gossipQueues/linear.d.ts.map +0 -1
  411. package/lib/network/processor/gossipQueues/types.d.ts.map +0 -1
  412. package/lib/network/processor/gossipValidatorFn.d.ts.map +0 -1
  413. package/lib/network/processor/index.d.ts.map +0 -1
  414. package/lib/network/processor/types.d.ts.map +0 -1
  415. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +0 -1
  416. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +0 -1
  417. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +0 -1
  418. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  419. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  420. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +0 -1
  421. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +0 -1
  422. package/lib/network/reqresp/handlers/index.d.ts.map +0 -1
  423. package/lib/network/reqresp/handlers/lightClientBootstrap.d.ts.map +0 -1
  424. package/lib/network/reqresp/handlers/lightClientFinalityUpdate.d.ts.map +0 -1
  425. package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.d.ts.map +0 -1
  426. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.d.ts.map +0 -1
  427. package/lib/network/reqresp/index.d.ts.map +0 -1
  428. package/lib/network/reqresp/interface.d.ts.map +0 -1
  429. package/lib/network/reqresp/protocols.d.ts.map +0 -1
  430. package/lib/network/reqresp/rateLimit.d.ts.map +0 -1
  431. package/lib/network/reqresp/score.d.ts.map +0 -1
  432. package/lib/network/reqresp/types.d.ts.map +0 -1
  433. package/lib/network/reqresp/utils/collect.d.ts.map +0 -1
  434. package/lib/network/reqresp/utils/collectSequentialBlocksInRange.d.ts.map +0 -1
  435. package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +0 -1
  436. package/lib/network/statusCache.d.ts.map +0 -1
  437. package/lib/network/subnets/attnetsService.d.ts.map +0 -1
  438. package/lib/network/subnets/index.d.ts.map +0 -1
  439. package/lib/network/subnets/interface.d.ts.map +0 -1
  440. package/lib/network/subnets/syncnetsService.d.ts.map +0 -1
  441. package/lib/network/subnets/util.d.ts.map +0 -1
  442. package/lib/network/util.d.ts.map +0 -1
  443. package/lib/node/index.d.ts.map +0 -1
  444. package/lib/node/nodejs.d.ts.map +0 -1
  445. package/lib/node/notifier.d.ts.map +0 -1
  446. package/lib/node/options.d.ts.map +0 -1
  447. package/lib/node/utils/interop/deposits.d.ts.map +0 -1
  448. package/lib/node/utils/interop/state.d.ts.map +0 -1
  449. package/lib/node/utils/lightclient.d.ts.map +0 -1
  450. package/lib/node/utils/state.d.ts.map +0 -1
  451. package/lib/sync/backfill/backfill.d.ts.map +0 -1
  452. package/lib/sync/backfill/errors.d.ts.map +0 -1
  453. package/lib/sync/backfill/index.d.ts.map +0 -1
  454. package/lib/sync/backfill/verify.d.ts.map +0 -1
  455. package/lib/sync/constants.d.ts.map +0 -1
  456. package/lib/sync/index.d.ts.map +0 -1
  457. package/lib/sync/interface.d.ts.map +0 -1
  458. package/lib/sync/options.d.ts.map +0 -1
  459. package/lib/sync/range/batch.d.ts.map +0 -1
  460. package/lib/sync/range/chain.d.ts.map +0 -1
  461. package/lib/sync/range/range.d.ts.map +0 -1
  462. package/lib/sync/range/utils/batches.d.ts.map +0 -1
  463. package/lib/sync/range/utils/chainTarget.d.ts.map +0 -1
  464. package/lib/sync/range/utils/hashBlocks.d.ts.map +0 -1
  465. package/lib/sync/range/utils/index.d.ts.map +0 -1
  466. package/lib/sync/range/utils/peerBalancer.d.ts.map +0 -1
  467. package/lib/sync/range/utils/updateChains.d.ts.map +0 -1
  468. package/lib/sync/sync.d.ts.map +0 -1
  469. package/lib/sync/types.d.ts.map +0 -1
  470. package/lib/sync/unknownBlock.d.ts.map +0 -1
  471. package/lib/sync/utils/downloadByRange.d.ts.map +0 -1
  472. package/lib/sync/utils/downloadByRoot.d.ts.map +0 -1
  473. package/lib/sync/utils/pendingBlocksTree.d.ts.map +0 -1
  474. package/lib/sync/utils/remoteSyncType.d.ts.map +0 -1
  475. package/lib/util/address.d.ts.map +0 -1
  476. package/lib/util/array.d.ts.map +0 -1
  477. package/lib/util/asyncIterableToEvents.d.ts.map +0 -1
  478. package/lib/util/binarySearch.d.ts.map +0 -1
  479. package/lib/util/bitArray.d.ts.map +0 -1
  480. package/lib/util/blobs.d.ts.map +0 -1
  481. package/lib/util/bufferPool.d.ts.map +0 -1
  482. package/lib/util/bytes.d.ts.map +0 -1
  483. package/lib/util/chunkify.d.ts.map +0 -1
  484. package/lib/util/clock.d.ts.map +0 -1
  485. package/lib/util/dataColumns.d.ts.map +0 -1
  486. package/lib/util/dependentRoot.d.ts.map +0 -1
  487. package/lib/util/enum.d.ts.map +0 -1
  488. package/lib/util/error.d.ts.map +0 -1
  489. package/lib/util/eventLoop.d.ts.map +0 -1
  490. package/lib/util/execution.d.ts.map +0 -1
  491. package/lib/util/file.d.ts.map +0 -1
  492. package/lib/util/forkChoice.d.ts.map +0 -1
  493. package/lib/util/forkName.d.ts.map +0 -1
  494. package/lib/util/graffiti.d.ts.map +0 -1
  495. package/lib/util/hex.d.ts.map +0 -1
  496. package/lib/util/index.d.ts.map +0 -1
  497. package/lib/util/ip.d.ts.map +0 -1
  498. package/lib/util/itTrigger.d.ts.map +0 -1
  499. package/lib/util/kzg.d.ts.map +0 -1
  500. package/lib/util/map.d.ts.map +0 -1
  501. package/lib/util/metadata.d.ts.map +0 -1
  502. package/lib/util/multifork.d.ts.map +0 -1
  503. package/lib/util/numpy.d.ts.map +0 -1
  504. package/lib/util/peerId.d.ts.map +0 -1
  505. package/lib/util/profile.d.ts.map +0 -1
  506. package/lib/util/promises.d.ts.map +0 -1
  507. package/lib/util/queue/errors.d.ts.map +0 -1
  508. package/lib/util/queue/fnQueue.d.ts.map +0 -1
  509. package/lib/util/queue/index.d.ts.map +0 -1
  510. package/lib/util/queue/itemQueue.d.ts.map +0 -1
  511. package/lib/util/queue/options.d.ts.map +0 -1
  512. package/lib/util/serializedCache.d.ts.map +0 -1
  513. package/lib/util/set.d.ts.map +0 -1
  514. package/lib/util/shuffle.d.ts.map +0 -1
  515. package/lib/util/sortBy.d.ts.map +0 -1
  516. package/lib/util/sszBytes.d.ts.map +0 -1
  517. package/lib/util/strictEvents.d.ts.map +0 -1
  518. package/lib/util/time.d.ts.map +0 -1
  519. package/lib/util/timeSeries.d.ts.map +0 -1
  520. package/lib/util/types.d.ts.map +0 -1
  521. package/lib/util/workerEvents.d.ts.map +0 -1
  522. package/lib/util/wrapError.d.ts.map +0 -1
  523. package/src/api/impl/api.ts +0 -26
  524. package/src/api/impl/beacon/blocks/index.ts +0 -744
  525. package/src/api/impl/beacon/blocks/utils.ts +0 -75
  526. package/src/api/impl/beacon/index.ts +0 -35
  527. package/src/api/impl/beacon/pool/index.ts +0 -314
  528. package/src/api/impl/beacon/rewards/index.ts +0 -30
  529. package/src/api/impl/beacon/state/index.ts +0 -406
  530. package/src/api/impl/beacon/state/utils.ts +0 -189
  531. package/src/api/impl/config/constants.ts +0 -127
  532. package/src/api/impl/config/index.ts +0 -59
  533. package/src/api/impl/debug/index.ts +0 -131
  534. package/src/api/impl/errors.ts +0 -50
  535. package/src/api/impl/events/index.ts +0 -33
  536. package/src/api/impl/index.ts +0 -6
  537. package/src/api/impl/lightclient/index.ts +0 -64
  538. package/src/api/impl/lodestar/index.ts +0 -257
  539. package/src/api/impl/node/index.ts +0 -88
  540. package/src/api/impl/node/utils.ts +0 -51
  541. package/src/api/impl/proof/index.ts +0 -60
  542. package/src/api/impl/types.ts +0 -17
  543. package/src/api/impl/utils.ts +0 -25
  544. package/src/api/impl/validator/index.ts +0 -1540
  545. package/src/api/impl/validator/utils.ts +0 -85
  546. package/src/api/index.ts +0 -2
  547. package/src/api/options.ts +0 -16
  548. package/src/api/rest/activeSockets.ts +0 -109
  549. package/src/api/rest/base.ts +0 -216
  550. package/src/api/rest/index.ts +0 -63
  551. package/src/api/rest/swaggerUI.ts +0 -80
  552. package/src/bun-wrappers/prometheus-gc-stats.ts +0 -7
  553. package/src/chain/ColumnReconstructionTracker.ts +0 -90
  554. package/src/chain/GetBlobsTracker.ts +0 -115
  555. package/src/chain/archiveStore/archiveStore.ts +0 -222
  556. package/src/chain/archiveStore/constants.ts +0 -5
  557. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +0 -116
  558. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +0 -68
  559. package/src/chain/archiveStore/historicalState/metrics.ts +0 -214
  560. package/src/chain/archiveStore/historicalState/types.ts +0 -41
  561. package/src/chain/archiveStore/historicalState/worker.ts +0 -77
  562. package/src/chain/archiveStore/index.ts +0 -3
  563. package/src/chain/archiveStore/interface.ts +0 -75
  564. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +0 -138
  565. package/src/chain/archiveStore/utils/archiveBlocks.ts +0 -437
  566. package/src/chain/archiveStore/utils/pruneHistory.ts +0 -56
  567. package/src/chain/archiveStore/utils/updateBackfillRange.ts +0 -50
  568. package/src/chain/balancesCache.ts +0 -52
  569. package/src/chain/beaconProposerCache.ts +0 -43
  570. package/src/chain/blocks/blockInput/blockInput.ts +0 -852
  571. package/src/chain/blocks/blockInput/errors.ts +0 -48
  572. package/src/chain/blocks/blockInput/index.ts +0 -4
  573. package/src/chain/blocks/blockInput/types.ts +0 -145
  574. package/src/chain/blocks/blockInput/utils.ts +0 -21
  575. package/src/chain/blocks/importBlock.ts +0 -597
  576. package/src/chain/blocks/index.ts +0 -179
  577. package/src/chain/blocks/types.ts +0 -101
  578. package/src/chain/blocks/utils/blowfishBanner.ts +0 -28
  579. package/src/chain/blocks/utils/chainSegment.ts +0 -29
  580. package/src/chain/blocks/utils/checkpoint.ts +0 -25
  581. package/src/chain/blocks/utils/giraffeBanner.ts +0 -30
  582. package/src/chain/blocks/utils/ownBanner.ts +0 -20
  583. package/src/chain/blocks/utils/pandaMergeTransitionBanner.ts +0 -43
  584. package/src/chain/blocks/utils/zebraBanner.ts +0 -45
  585. package/src/chain/blocks/verifyBlock.ts +0 -242
  586. package/src/chain/blocks/verifyBlocksDataAvailability.ts +0 -42
  587. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +0 -438
  588. package/src/chain/blocks/verifyBlocksSanityChecks.ts +0 -129
  589. package/src/chain/blocks/verifyBlocksSignatures.ts +0 -105
  590. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +0 -114
  591. package/src/chain/blocks/writeBlockInputToDb.ts +0 -120
  592. package/src/chain/bls/index.ts +0 -4
  593. package/src/chain/bls/interface.ts +0 -68
  594. package/src/chain/bls/maybeBatch.ts +0 -45
  595. package/src/chain/bls/multithread/index.ts +0 -582
  596. package/src/chain/bls/multithread/jobItem.ts +0 -119
  597. package/src/chain/bls/multithread/poolSize.ts +0 -16
  598. package/src/chain/bls/multithread/types.ts +0 -38
  599. package/src/chain/bls/multithread/utils.ts +0 -19
  600. package/src/chain/bls/multithread/worker.ts +0 -114
  601. package/src/chain/bls/singleThread.ts +0 -87
  602. package/src/chain/bls/utils.ts +0 -30
  603. package/src/chain/chain.ts +0 -1354
  604. package/src/chain/emitter.ts +0 -113
  605. package/src/chain/errors/attestationError.ts +0 -194
  606. package/src/chain/errors/attesterSlashingError.ts +0 -11
  607. package/src/chain/errors/blobSidecarError.ts +0 -60
  608. package/src/chain/errors/blockError.ts +0 -166
  609. package/src/chain/errors/blsToExecutionChangeError.ts +0 -13
  610. package/src/chain/errors/dataColumnSidecarError.ts +0 -80
  611. package/src/chain/errors/gossipValidation.ts +0 -20
  612. package/src/chain/errors/index.ts +0 -10
  613. package/src/chain/errors/lightClientError.ts +0 -30
  614. package/src/chain/errors/proposerSlashingError.ts +0 -11
  615. package/src/chain/errors/syncCommitteeError.ts +0 -36
  616. package/src/chain/errors/voluntaryExitError.ts +0 -13
  617. package/src/chain/forkChoice/index.ts +0 -112
  618. package/src/chain/genesis/genesis.ts +0 -190
  619. package/src/chain/genesis/interface.ts +0 -14
  620. package/src/chain/index.ts +0 -6
  621. package/src/chain/initState.ts +0 -221
  622. package/src/chain/interface.ts +0 -280
  623. package/src/chain/lightClient/index.ts +0 -764
  624. package/src/chain/lightClient/proofs.ts +0 -85
  625. package/src/chain/lightClient/types.ts +0 -33
  626. package/src/chain/opPools/aggregatedAttestationPool.ts +0 -1063
  627. package/src/chain/opPools/attestationPool.ts +0 -282
  628. package/src/chain/opPools/index.ts +0 -5
  629. package/src/chain/opPools/opPool.ts +0 -462
  630. package/src/chain/opPools/syncCommitteeMessagePool.ts +0 -169
  631. package/src/chain/opPools/syncContributionAndProofPool.ts +0 -240
  632. package/src/chain/opPools/types.ts +0 -35
  633. package/src/chain/opPools/utils.ts +0 -65
  634. package/src/chain/options.ts +0 -138
  635. package/src/chain/prepareNextSlot.ts +0 -277
  636. package/src/chain/produceBlock/computeNewStateRoot.ts +0 -55
  637. package/src/chain/produceBlock/index.ts +0 -2
  638. package/src/chain/produceBlock/produceBlockBody.ts +0 -797
  639. package/src/chain/produceBlock/validateBlobsAndKzgCommitments.ts +0 -54
  640. package/src/chain/regen/errors.ts +0 -30
  641. package/src/chain/regen/index.ts +0 -4
  642. package/src/chain/regen/interface.ts +0 -93
  643. package/src/chain/regen/queued.ts +0 -317
  644. package/src/chain/regen/regen.ts +0 -424
  645. package/src/chain/reprocess.ts +0 -161
  646. package/src/chain/rewards/attestationsRewards.ts +0 -196
  647. package/src/chain/rewards/blockRewards.ts +0 -150
  648. package/src/chain/rewards/syncCommitteeRewards.ts +0 -58
  649. package/src/chain/seenCache/index.ts +0 -5
  650. package/src/chain/seenCache/seenAggregateAndProof.ts +0 -120
  651. package/src/chain/seenCache/seenAttestationData.ts +0 -145
  652. package/src/chain/seenCache/seenAttesters.ts +0 -58
  653. package/src/chain/seenCache/seenBlockAttesters.ts +0 -18
  654. package/src/chain/seenCache/seenBlockProposers.ts +0 -48
  655. package/src/chain/seenCache/seenCommittee.ts +0 -43
  656. package/src/chain/seenCache/seenCommitteeContribution.ts +0 -104
  657. package/src/chain/seenCache/seenGossipBlockInput.ts +0 -373
  658. package/src/chain/serializeState.ts +0 -32
  659. package/src/chain/shufflingCache.ts +0 -238
  660. package/src/chain/stateCache/blockStateCacheImpl.ts +0 -150
  661. package/src/chain/stateCache/datastore/db.ts +0 -36
  662. package/src/chain/stateCache/datastore/file.ts +0 -53
  663. package/src/chain/stateCache/datastore/index.ts +0 -2
  664. package/src/chain/stateCache/datastore/types.ts +0 -13
  665. package/src/chain/stateCache/fifoBlockStateCache.ts +0 -208
  666. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +0 -198
  667. package/src/chain/stateCache/index.ts +0 -3
  668. package/src/chain/stateCache/mapMetrics.ts +0 -52
  669. package/src/chain/stateCache/persistentCheckpointsCache.ts +0 -837
  670. package/src/chain/stateCache/types.ts +0 -86
  671. package/src/chain/validation/aggregateAndProof.ts +0 -258
  672. package/src/chain/validation/attestation.ts +0 -885
  673. package/src/chain/validation/attesterSlashing.ts +0 -61
  674. package/src/chain/validation/blobSidecar.ts +0 -301
  675. package/src/chain/validation/block.ts +0 -188
  676. package/src/chain/validation/blsToExecutionChange.ts +0 -61
  677. package/src/chain/validation/dataColumnSidecar.ts +0 -381
  678. package/src/chain/validation/index.ts +0 -9
  679. package/src/chain/validation/lightClientFinalityUpdate.ts +0 -46
  680. package/src/chain/validation/lightClientOptimisticUpdate.ts +0 -68
  681. package/src/chain/validation/proposerSlashing.ts +0 -54
  682. package/src/chain/validation/signatureSets/aggregateAndProof.ts +0 -38
  683. package/src/chain/validation/signatureSets/contributionAndProof.ts +0 -27
  684. package/src/chain/validation/signatureSets/index.ts +0 -6
  685. package/src/chain/validation/signatureSets/selectionProof.ts +0 -27
  686. package/src/chain/validation/signatureSets/syncCommittee.ts +0 -22
  687. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +0 -18
  688. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +0 -27
  689. package/src/chain/validation/syncCommittee.ts +0 -165
  690. package/src/chain/validation/syncCommitteeContributionAndProof.ts +0 -122
  691. package/src/chain/validation/voluntaryExit.ts +0 -58
  692. package/src/chain/validatorMonitor.ts +0 -1309
  693. package/src/constants/constants.ts +0 -15
  694. package/src/constants/index.ts +0 -2
  695. package/src/constants/network.ts +0 -52
  696. package/src/db/beacon.ts +0 -113
  697. package/src/db/buckets.ts +0 -80
  698. package/src/db/index.ts +0 -2
  699. package/src/db/interface.ts +0 -76
  700. package/src/db/options.ts +0 -7
  701. package/src/db/repositories/attesterSlashing.ts +0 -38
  702. package/src/db/repositories/backfilledRanges.ts +0 -29
  703. package/src/db/repositories/blobSidecars.ts +0 -37
  704. package/src/db/repositories/blobSidecarsArchive.ts +0 -28
  705. package/src/db/repositories/block.ts +0 -33
  706. package/src/db/repositories/blockArchive.ts +0 -170
  707. package/src/db/repositories/blockArchiveIndex.ts +0 -45
  708. package/src/db/repositories/blsToExecutionChange.ts +0 -16
  709. package/src/db/repositories/checkpointState.ts +0 -31
  710. package/src/db/repositories/dataColumnSidecar.ts +0 -49
  711. package/src/db/repositories/dataColumnSidecarArchive.ts +0 -56
  712. package/src/db/repositories/depositDataRoot.ts +0 -80
  713. package/src/db/repositories/depositEvent.ts +0 -32
  714. package/src/db/repositories/eth1Data.ts +0 -33
  715. package/src/db/repositories/index.ts +0 -20
  716. package/src/db/repositories/lightclientBestUpdate.ts +0 -41
  717. package/src/db/repositories/lightclientCheckpointHeader.ts +0 -32
  718. package/src/db/repositories/lightclientSyncCommittee.ts +0 -16
  719. package/src/db/repositories/lightclientSyncCommitteeWitness.ts +0 -77
  720. package/src/db/repositories/proposerSlashing.ts +0 -15
  721. package/src/db/repositories/stateArchive.ts +0 -69
  722. package/src/db/repositories/stateArchiveIndex.ts +0 -18
  723. package/src/db/repositories/voluntaryExit.ts +0 -15
  724. package/src/db/single/index.ts +0 -2
  725. package/src/db/single/preGenesisState.ts +0 -37
  726. package/src/db/single/preGenesisStateLastProcessedBlock.ts +0 -34
  727. package/src/eth1/errors.ts +0 -40
  728. package/src/eth1/eth1DataCache.ts +0 -26
  729. package/src/eth1/eth1DepositDataTracker.ts +0 -410
  730. package/src/eth1/eth1DepositsCache.ts +0 -141
  731. package/src/eth1/eth1MergeBlockTracker.ts +0 -328
  732. package/src/eth1/index.ts +0 -157
  733. package/src/eth1/interface.ts +0 -131
  734. package/src/eth1/options.ts +0 -28
  735. package/src/eth1/provider/eth1Provider.ts +0 -229
  736. package/src/eth1/provider/jsonRpcHttpClient.ts +0 -390
  737. package/src/eth1/provider/jwt.ts +0 -36
  738. package/src/eth1/provider/utils.ts +0 -136
  739. package/src/eth1/stream.ts +0 -75
  740. package/src/eth1/utils/depositContract.ts +0 -37
  741. package/src/eth1/utils/deposits.ts +0 -70
  742. package/src/eth1/utils/eth1Data.ts +0 -100
  743. package/src/eth1/utils/eth1DepositEvent.ts +0 -12
  744. package/src/eth1/utils/eth1Vote.ts +0 -142
  745. package/src/eth1/utils/groupDepositEventsByBlock.ts +0 -19
  746. package/src/eth1/utils/optimizeNextBlockDiffForGenesis.ts +0 -18
  747. package/src/execution/builder/cache.ts +0 -39
  748. package/src/execution/builder/http.ts +0 -229
  749. package/src/execution/builder/index.ts +0 -27
  750. package/src/execution/builder/interface.ts +0 -49
  751. package/src/execution/builder/utils.ts +0 -19
  752. package/src/execution/engine/disabled.ts +0 -35
  753. package/src/execution/engine/http.ts +0 -644
  754. package/src/execution/engine/index.ts +0 -63
  755. package/src/execution/engine/interface.ts +0 -199
  756. package/src/execution/engine/mock.ts +0 -493
  757. package/src/execution/engine/payloadIdCache.ts +0 -54
  758. package/src/execution/engine/types.ts +0 -640
  759. package/src/execution/engine/utils.ts +0 -136
  760. package/src/execution/index.ts +0 -4
  761. package/src/index.ts +0 -20
  762. package/src/metrics/index.ts +0 -4
  763. package/src/metrics/metrics/beacon.ts +0 -390
  764. package/src/metrics/metrics/lodestar.ts +0 -1870
  765. package/src/metrics/metrics.ts +0 -43
  766. package/src/metrics/nodeJsMetrics.ts +0 -19
  767. package/src/metrics/options.ts +0 -22
  768. package/src/metrics/server/http.ts +0 -114
  769. package/src/metrics/server/index.ts +0 -1
  770. package/src/metrics/utils/avgMinMax.ts +0 -87
  771. package/src/metrics/utils/gauge.ts +0 -22
  772. package/src/metrics/utils/registryMetricCreator.ts +0 -41
  773. package/src/monitoring/clientStats.ts +0 -297
  774. package/src/monitoring/index.ts +0 -2
  775. package/src/monitoring/options.ts +0 -19
  776. package/src/monitoring/properties.ts +0 -152
  777. package/src/monitoring/service.ts +0 -235
  778. package/src/monitoring/system.ts +0 -146
  779. package/src/monitoring/types.ts +0 -21
  780. package/src/network/core/events.ts +0 -59
  781. package/src/network/core/index.ts +0 -3
  782. package/src/network/core/metrics.ts +0 -304
  783. package/src/network/core/networkCore.ts +0 -599
  784. package/src/network/core/networkCoreWorker.ts +0 -176
  785. package/src/network/core/networkCoreWorkerHandler.ts +0 -284
  786. package/src/network/core/types.ts +0 -119
  787. package/src/network/discv5/index.ts +0 -132
  788. package/src/network/discv5/types.ts +0 -74
  789. package/src/network/discv5/utils.ts +0 -50
  790. package/src/network/discv5/worker.ts +0 -137
  791. package/src/network/events.ts +0 -51
  792. package/src/network/forks.ts +0 -94
  793. package/src/network/gossip/constants.ts +0 -15
  794. package/src/network/gossip/encoding.ts +0 -111
  795. package/src/network/gossip/errors.ts +0 -7
  796. package/src/network/gossip/gossipsub.ts +0 -384
  797. package/src/network/gossip/index.ts +0 -4
  798. package/src/network/gossip/interface.ts +0 -215
  799. package/src/network/gossip/metrics.ts +0 -71
  800. package/src/network/gossip/scoringParameters.ts +0 -333
  801. package/src/network/gossip/topic.ts +0 -332
  802. package/src/network/index.ts +0 -8
  803. package/src/network/interface.ts +0 -134
  804. package/src/network/libp2p/error.ts +0 -55
  805. package/src/network/libp2p/index.ts +0 -153
  806. package/src/network/metadata.ts +0 -162
  807. package/src/network/network.ts +0 -767
  808. package/src/network/networkConfig.ts +0 -12
  809. package/src/network/options.ts +0 -70
  810. package/src/network/peers/client.ts +0 -29
  811. package/src/network/peers/datastore.ts +0 -188
  812. package/src/network/peers/discover.ts +0 -647
  813. package/src/network/peers/index.ts +0 -2
  814. package/src/network/peers/peerManager.ts +0 -899
  815. package/src/network/peers/peersData.ts +0 -65
  816. package/src/network/peers/score/constants.ts +0 -34
  817. package/src/network/peers/score/index.ts +0 -4
  818. package/src/network/peers/score/interface.ts +0 -74
  819. package/src/network/peers/score/score.ts +0 -200
  820. package/src/network/peers/score/store.ts +0 -95
  821. package/src/network/peers/score/utils.ts +0 -37
  822. package/src/network/peers/utils/assertPeerRelevance.ts +0 -99
  823. package/src/network/peers/utils/enrSubnetsDeserialize.ts +0 -27
  824. package/src/network/peers/utils/getConnectedPeerIds.ts +0 -33
  825. package/src/network/peers/utils/index.ts +0 -4
  826. package/src/network/peers/utils/prioritizePeers.ts +0 -627
  827. package/src/network/peers/utils/subnetMap.ts +0 -88
  828. package/src/network/processor/aggregatorTracker.ts +0 -38
  829. package/src/network/processor/extractSlotRootFns.ts +0 -64
  830. package/src/network/processor/gossipHandlers.ts +0 -951
  831. package/src/network/processor/gossipQueues/index.ts +0 -114
  832. package/src/network/processor/gossipQueues/indexed.ts +0 -219
  833. package/src/network/processor/gossipQueues/linear.ts +0 -162
  834. package/src/network/processor/gossipQueues/types.ts +0 -57
  835. package/src/network/processor/gossipValidatorFn.ts +0 -142
  836. package/src/network/processor/index.ts +0 -496
  837. package/src/network/processor/types.ts +0 -27
  838. package/src/network/reqresp/ReqRespBeaconNode.ts +0 -373
  839. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +0 -101
  840. package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +0 -49
  841. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -114
  842. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -62
  843. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +0 -144
  844. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +0 -88
  845. package/src/network/reqresp/handlers/index.ts +0 -78
  846. package/src/network/reqresp/handlers/lightClientBootstrap.ts +0 -31
  847. package/src/network/reqresp/handlers/lightClientFinalityUpdate.ts +0 -21
  848. package/src/network/reqresp/handlers/lightClientOptimisticUpdate.ts +0 -21
  849. package/src/network/reqresp/handlers/lightClientUpdatesByRange.ts +0 -39
  850. package/src/network/reqresp/index.ts +0 -2
  851. package/src/network/reqresp/interface.ts +0 -45
  852. package/src/network/reqresp/protocols.ts +0 -146
  853. package/src/network/reqresp/rateLimit.ts +0 -112
  854. package/src/network/reqresp/score.ts +0 -70
  855. package/src/network/reqresp/types.ts +0 -174
  856. package/src/network/reqresp/utils/collect.ts +0 -84
  857. package/src/network/reqresp/utils/collectSequentialBlocksInRange.ts +0 -57
  858. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +0 -99
  859. package/src/network/statusCache.ts +0 -17
  860. package/src/network/subnets/attnetsService.ts +0 -385
  861. package/src/network/subnets/index.ts +0 -2
  862. package/src/network/subnets/interface.ts +0 -66
  863. package/src/network/subnets/syncnetsService.ts +0 -147
  864. package/src/network/subnets/util.ts +0 -63
  865. package/src/network/util.ts +0 -29
  866. package/src/node/index.ts +0 -2
  867. package/src/node/nodejs.ts +0 -349
  868. package/src/node/notifier.ts +0 -206
  869. package/src/node/options.ts +0 -51
  870. package/src/node/utils/interop/deposits.ts +0 -53
  871. package/src/node/utils/interop/state.ts +0 -59
  872. package/src/node/utils/lightclient.ts +0 -7
  873. package/src/node/utils/state.ts +0 -37
  874. package/src/sync/backfill/backfill.ts +0 -893
  875. package/src/sync/backfill/errors.ts +0 -23
  876. package/src/sync/backfill/index.ts +0 -1
  877. package/src/sync/backfill/verify.ts +0 -58
  878. package/src/sync/constants.ts +0 -71
  879. package/src/sync/index.ts +0 -2
  880. package/src/sync/interface.ts +0 -55
  881. package/src/sync/options.ts +0 -45
  882. package/src/sync/range/batch.ts +0 -455
  883. package/src/sync/range/chain.ts +0 -715
  884. package/src/sync/range/range.ts +0 -354
  885. package/src/sync/range/utils/batches.ts +0 -119
  886. package/src/sync/range/utils/chainTarget.ts +0 -62
  887. package/src/sync/range/utils/hashBlocks.ts +0 -27
  888. package/src/sync/range/utils/index.ts +0 -5
  889. package/src/sync/range/utils/peerBalancer.ts +0 -184
  890. package/src/sync/range/utils/updateChains.ts +0 -66
  891. package/src/sync/sync.ts +0 -290
  892. package/src/sync/types.ts +0 -57
  893. package/src/sync/unknownBlock.ts +0 -859
  894. package/src/sync/utils/downloadByRange.ts +0 -808
  895. package/src/sync/utils/downloadByRoot.ts +0 -560
  896. package/src/sync/utils/pendingBlocksTree.ts +0 -97
  897. package/src/sync/utils/remoteSyncType.ts +0 -144
  898. package/src/util/address.ts +0 -3
  899. package/src/util/array.ts +0 -311
  900. package/src/util/asyncIterableToEvents.ts +0 -164
  901. package/src/util/binarySearch.ts +0 -48
  902. package/src/util/bitArray.ts +0 -84
  903. package/src/util/blobs.ts +0 -210
  904. package/src/util/bufferPool.ts +0 -95
  905. package/src/util/bytes.ts +0 -11
  906. package/src/util/chunkify.ts +0 -27
  907. package/src/util/clock.ts +0 -212
  908. package/src/util/dataColumns.ts +0 -415
  909. package/src/util/dependentRoot.ts +0 -47
  910. package/src/util/enum.ts +0 -17
  911. package/src/util/error.ts +0 -56
  912. package/src/util/eventLoop.ts +0 -22
  913. package/src/util/execution.ts +0 -223
  914. package/src/util/file.ts +0 -52
  915. package/src/util/forkChoice.ts +0 -5
  916. package/src/util/forkName.ts +0 -20
  917. package/src/util/graffiti.ts +0 -39
  918. package/src/util/hex.ts +0 -9
  919. package/src/util/index.ts +0 -2
  920. package/src/util/ip.ts +0 -6
  921. package/src/util/itTrigger.ts +0 -49
  922. package/src/util/kzg.ts +0 -3
  923. package/src/util/map.ts +0 -77
  924. package/src/util/metadata.ts +0 -22
  925. package/src/util/multifork.ts +0 -69
  926. package/src/util/numpy.ts +0 -8
  927. package/src/util/peerId.ts +0 -16
  928. package/src/util/profile.ts +0 -54
  929. package/src/util/promises.ts +0 -14
  930. package/src/util/queue/errors.ts +0 -14
  931. package/src/util/queue/fnQueue.ts +0 -16
  932. package/src/util/queue/index.ts +0 -4
  933. package/src/util/queue/itemQueue.ts +0 -128
  934. package/src/util/queue/options.ts +0 -37
  935. package/src/util/serializedCache.ts +0 -20
  936. package/src/util/set.ts +0 -62
  937. package/src/util/shuffle.ts +0 -21
  938. package/src/util/sortBy.ts +0 -19
  939. package/src/util/sszBytes.ts +0 -481
  940. package/src/util/strictEvents.ts +0 -8
  941. package/src/util/time.ts +0 -13
  942. package/src/util/timeSeries.ts +0 -118
  943. package/src/util/types.ts +0 -31
  944. package/src/util/workerEvents.ts +0 -142
  945. package/src/util/wrapError.ts +0 -27
@@ -1,1540 +0,0 @@
1
- import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
2
- import {routes} from "@lodestar/api";
3
- import {ApplicationMethods} from "@lodestar/api/server";
4
- import {ExecutionStatus} from "@lodestar/fork-choice";
5
- import {
6
- ForkName,
7
- ForkPostBellatrix,
8
- ForkSeq,
9
- GENESIS_SLOT,
10
- SLOTS_PER_EPOCH,
11
- SLOTS_PER_HISTORICAL_ROOT,
12
- SYNC_COMMITTEE_SUBNET_SIZE,
13
- isForkPostBellatrix,
14
- isForkPostDeneb,
15
- isForkPostElectra,
16
- } from "@lodestar/params";
17
- import {
18
- CachedBeaconStateAllForks,
19
- DataAvailabilityStatus,
20
- attesterShufflingDecisionRoot,
21
- beaconBlockToBlinded,
22
- calculateCommitteeAssignments,
23
- computeEpochAtSlot,
24
- computeStartSlotAtEpoch,
25
- createCachedBeaconState,
26
- getBlockRootAtSlot,
27
- getCurrentSlot,
28
- loadState,
29
- proposerShufflingDecisionRoot,
30
- } from "@lodestar/state-transition";
31
- import {
32
- BLSSignature,
33
- BeaconBlock,
34
- BlindedBeaconBlock,
35
- BlockContents,
36
- Bytes32,
37
- CommitteeIndex,
38
- Epoch,
39
- ProducedBlockSource,
40
- Root,
41
- Slot,
42
- ValidatorIndex,
43
- Wei,
44
- bellatrix,
45
- getValidatorStatus,
46
- phase0,
47
- ssz,
48
- } from "@lodestar/types";
49
- import {
50
- TimeoutError,
51
- defer,
52
- formatWeiToEth,
53
- fromHex,
54
- prettyWeiToEth,
55
- resolveOrRacePromises,
56
- toHex,
57
- toRootHex,
58
- } from "@lodestar/utils";
59
- import {MAX_BUILDER_BOOST_FACTOR} from "@lodestar/validator";
60
- import {BlockInputSource} from "../../../chain/blocks/blockInput/types.js";
61
- import {
62
- AttestationError,
63
- AttestationErrorCode,
64
- GossipAction,
65
- SyncCommitteeError,
66
- SyncCommitteeErrorCode,
67
- } from "../../../chain/errors/index.js";
68
- import {ChainEvent, CheckpointHex, CommonBlockBody} from "../../../chain/index.js";
69
- import {PREPARE_NEXT_SLOT_BPS} from "../../../chain/prepareNextSlot.js";
70
- import {BlockType, ProduceFullDeneb} from "../../../chain/produceBlock/index.js";
71
- import {RegenCaller} from "../../../chain/regen/index.js";
72
- import {validateApiAggregateAndProof} from "../../../chain/validation/index.js";
73
- import {validateSyncCommitteeGossipContributionAndProof} from "../../../chain/validation/syncCommitteeContributionAndProof.js";
74
- import {ZERO_HASH} from "../../../constants/index.js";
75
- import {BuilderStatus, NoBidReceived} from "../../../execution/builder/http.js";
76
- import {validateGossipFnRetryUnknownRoot} from "../../../network/processor/gossipHandlers.js";
77
- import {CommitteeSubscription} from "../../../network/subnets/index.js";
78
- import {SyncState} from "../../../sync/index.js";
79
- import {callInNextEventLoop} from "../../../util/eventLoop.js";
80
- import {isOptimisticBlock} from "../../../util/forkChoice.js";
81
- import {getDefaultGraffiti, toGraffitiBytes} from "../../../util/graffiti.js";
82
- import {getLodestarClientVersion} from "../../../util/metadata.js";
83
- import {ApiOptions} from "../../options.js";
84
- import {getStateResponseWithRegen} from "../beacon/state/utils.js";
85
- import {ApiError, NodeIsSyncing, OnlySupportedByDVT} from "../errors.js";
86
- import {ApiModules} from "../types.js";
87
- import {computeSubnetForCommitteesAtSlot, getPubkeysForIndices, selectBlockProductionSource} from "./utils.js";
88
-
89
- /**
90
- * If the node is within this many epochs from the head, we declare it to be synced regardless of
91
- * the network sync state.
92
- *
93
- * This helps prevent attacks where nodes can convince us that we're syncing some non-existent
94
- * finalized head.
95
- *
96
- * TODO: Lighthouse uses 8 for the attack described above. However, 8 kills Lodestar since validators
97
- * can trigger regen to fast-forward head state 8 epochs to be immediately invalidated as sync sets
98
- * a new head. Then the checkpoint state cache grows unbounded with very different states (because
99
- * they are 8 epochs apart) and causes an OOM. Research a proper solution once regen and the state
100
- * caches are better.
101
- */
102
- export const SYNC_TOLERANCE_EPOCHS = 1;
103
-
104
- /**
105
- * Cutoff time to wait from start of the slot for execution and builder block production apis to resolve.
106
- * Post this time, race execution and builder to pick whatever resolves first.
107
- *
108
- * Empirically the builder block resolves in ~1 second, and execution block resolves in <500 ms.
109
- * A cutoff of 2 seconds gives enough time and if there are unexpected delays it ensures we publish
110
- * in time as proposals post 4 seconds into the slot will likely be orphaned due to proposer boost reorg.
111
- *
112
- * TODO GLOAS: re-evaluate cutoff timing
113
- */
114
- const BLOCK_PRODUCTION_RACE_CUTOFF_MS = 2_000;
115
- /** Overall timeout for execution and block production apis */
116
- const BLOCK_PRODUCTION_RACE_TIMEOUT_MS = 12_000;
117
-
118
- type ProduceBlockContentsRes = {executionPayloadValue: Wei; consensusBlockValue: Wei} & {
119
- data: BlockContents;
120
- version: ForkName;
121
- };
122
- type ProduceBlindedBlockRes = {executionPayloadValue: Wei; consensusBlockValue: Wei} & {
123
- data: BlindedBeaconBlock;
124
- version: ForkPostBellatrix;
125
- };
126
-
127
- type ProduceBlindedBlockOrBlockContentsRes = {executionPayloadSource: ProducedBlockSource} & (
128
- | (ProduceBlockContentsRes & {executionPayloadBlinded: false})
129
- | (ProduceBlindedBlockRes & {executionPayloadBlinded: true})
130
- );
131
-
132
- /**
133
- * Engine block selection reasons tracked in metrics / logs
134
- */
135
- export enum EngineBlockSelectionReason {
136
- BuilderDisabled = "builder_disabled",
137
- BuilderError = "builder_error",
138
- BuilderTimeout = "builder_timeout",
139
- BuilderPending = "builder_pending",
140
- BuilderNoBid = "builder_no_bid",
141
- BuilderCensorship = "builder_censorship",
142
- BlockValue = "block_value",
143
- EnginePreferred = "engine_preferred",
144
- }
145
-
146
- /**
147
- * Builder block selection reasons tracked in metrics / logs
148
- */
149
- export enum BuilderBlockSelectionReason {
150
- EngineDisabled = "engine_disabled",
151
- EngineError = "engine_error",
152
- EnginePending = "engine_pending",
153
- BlockValue = "block_value",
154
- BuilderPreferred = "builder_preferred",
155
- }
156
-
157
- export type BlockSelectionResult =
158
- | {
159
- source: ProducedBlockSource.engine;
160
- reason: EngineBlockSelectionReason;
161
- }
162
- | {
163
- source: ProducedBlockSource.builder;
164
- reason: BuilderBlockSelectionReason;
165
- };
166
-
167
- /**
168
- * Server implementation for handling validator duties.
169
- * See `@lodestar/validator/src/api` for the client implementation).
170
- */
171
- export function getValidatorApi(
172
- opts: ApiOptions,
173
- {chain, config, logger, metrics, network, sync}: ApiModules
174
- ): ApplicationMethods<routes.validator.Endpoints> {
175
- let genesisBlockRoot: Root | null = null;
176
-
177
- /**
178
- * Validator clock may be advanced from beacon's clock. If the validator requests a resource in a
179
- * future slot, wait some time instead of rejecting the request because it's in the future.
180
- * This value is the same to MAXIMUM_GOSSIP_CLOCK_DISPARITY_SEC.
181
- * For very fast networks, reduce clock disparity to half a slot.
182
- */
183
- const MAX_API_CLOCK_DISPARITY_SEC = Math.min(0.5, config.SECONDS_PER_SLOT / 2);
184
- const MAX_API_CLOCK_DISPARITY_MS = MAX_API_CLOCK_DISPARITY_SEC * 1000;
185
-
186
- /** Compute and cache the genesis block root */
187
- async function getGenesisBlockRoot(state: CachedBeaconStateAllForks): Promise<Root> {
188
- if (!genesisBlockRoot) {
189
- // Close to genesis the genesis block may not be available in the DB
190
- if (state.slot < SLOTS_PER_HISTORICAL_ROOT) {
191
- genesisBlockRoot = state.blockRoots.get(0);
192
- }
193
-
194
- const blockRes = await chain.getCanonicalBlockAtSlot(GENESIS_SLOT);
195
- if (blockRes) {
196
- genesisBlockRoot = config
197
- .getForkTypes(blockRes.block.message.slot)
198
- .SignedBeaconBlock.hashTreeRoot(blockRes.block);
199
- }
200
- }
201
-
202
- // If for some reason the genesisBlockRoot is not able don't prevent validators from
203
- // proposing or attesting. If the genesisBlockRoot is wrong, at worst it may trigger a re-fetch of the duties
204
- return genesisBlockRoot || ZERO_HASH;
205
- }
206
-
207
- /**
208
- * If advancing the local clock `MAX_API_CLOCK_DISPARITY_MS` ticks to the requested slot, wait for its start
209
- * Prevents the validator from getting errors from the API if the clock is a bit advanced
210
- */
211
- async function waitForSlot(slot: Slot): Promise<void> {
212
- if (slot <= 0) {
213
- return;
214
- }
215
-
216
- const slotStartSec = chain.genesisTime + slot * config.SECONDS_PER_SLOT;
217
- const msToSlot = slotStartSec * 1000 - Date.now();
218
-
219
- if (msToSlot > MAX_API_CLOCK_DISPARITY_MS) {
220
- throw Error(`Requested slot ${slot} is in the future`);
221
- }
222
-
223
- if (msToSlot > 0) {
224
- await chain.clock.waitForSlot(slot);
225
- }
226
-
227
- // else, clock already in slot or slot is in the past
228
- }
229
-
230
- /**
231
- * If advancing the local clock `MAX_API_CLOCK_DISPARITY_MS` ticks to the next epoch, wait for slot 0 of the next epoch.
232
- * Prevents a validator from not being able to get the attestater duties correctly if the beacon and validator clocks are off
233
- */
234
- async function waitForNextClosestEpoch(): Promise<void> {
235
- const toNextEpochMs = msToNextEpoch();
236
- if (toNextEpochMs > 0 && toNextEpochMs < MAX_API_CLOCK_DISPARITY_MS) {
237
- const nextEpoch = chain.clock.currentEpoch + 1;
238
- await chain.clock.waitForSlot(computeStartSlotAtEpoch(nextEpoch));
239
- }
240
- }
241
-
242
- /**
243
- * Compute ms to the next epoch.
244
- */
245
- function msToNextEpoch(): number {
246
- const nextEpoch = chain.clock.currentEpoch + 1;
247
- const secPerEpoch = SLOTS_PER_EPOCH * config.SECONDS_PER_SLOT;
248
- const nextEpochStartSec = chain.genesisTime + nextEpoch * secPerEpoch;
249
- return nextEpochStartSec * 1000 - Date.now();
250
- }
251
-
252
- function currentEpochWithDisparity(): Epoch {
253
- return computeEpochAtSlot(getCurrentSlot(config, chain.genesisTime - MAX_API_CLOCK_DISPARITY_SEC));
254
- }
255
-
256
- function getBlockValueLogInfo(
257
- block: {executionPayloadValue: bigint; consensusBlockValue: bigint},
258
- source?: ProducedBlockSource
259
- ): Record<string, string> {
260
- const executionValue = block.executionPayloadValue;
261
- const consensusValue = block.consensusBlockValue;
262
- const totalValue = executionValue + consensusValue;
263
-
264
- if (source == null) {
265
- return {
266
- executionPayloadValue: prettyWeiToEth(executionValue),
267
- consensusBlockValue: prettyWeiToEth(consensusValue),
268
- blockTotalValue: prettyWeiToEth(totalValue),
269
- };
270
- }
271
- if (source === ProducedBlockSource.builder) {
272
- return {
273
- builderExecutionPayloadValue: prettyWeiToEth(executionValue),
274
- builderConsensusBlockValue: prettyWeiToEth(consensusValue),
275
- builderBlockTotalValue: prettyWeiToEth(totalValue),
276
- };
277
- }
278
- return {
279
- engineExecutionPayloadValue: prettyWeiToEth(executionValue),
280
- engineConsensusBlockValue: prettyWeiToEth(consensusValue),
281
- engineBlockTotalValue: prettyWeiToEth(totalValue),
282
- };
283
- }
284
-
285
- /**
286
- * This function is called 1s before next epoch, usually at that time PrepareNextSlotScheduler finishes
287
- * so we should have checkpoint state, otherwise wait for up to the slot 1 of epoch.
288
- * slot epoch 0 1
289
- * |------------|------------|
290
- * ^ ^
291
- * | |
292
- * | |
293
- * | waitForCheckpointState (1s before slot 0 of epoch, wait until slot 1 of epoch)
294
- * |
295
- * prepareNextSlot (4s before next slot)
296
- */
297
- async function waitForCheckpointState(cpHex: CheckpointHex): Promise<CachedBeaconStateAllForks | null> {
298
- const cpState = chain.regen.getCheckpointStateSync(cpHex);
299
- if (cpState) {
300
- return cpState;
301
- }
302
- const cp = {
303
- epoch: cpHex.epoch,
304
- root: fromHex(cpHex.rootHex),
305
- };
306
- const slot0 = computeStartSlotAtEpoch(cp.epoch);
307
- // if not, wait for ChainEvent.checkpoint event until slot 1 of epoch
308
- let listener: ((eventCp: phase0.Checkpoint) => void) | null = null;
309
- const foundCPState = await Promise.race([
310
- new Promise((resolve) => {
311
- listener = (eventCp) => {
312
- resolve(ssz.phase0.Checkpoint.equals(eventCp, cp));
313
- };
314
- chain.emitter.once(ChainEvent.checkpoint, listener);
315
- }),
316
- // in rare case, checkpoint state cache may happen up to 6s of slot 0 of epoch
317
- // so we wait for it until the slot 1 of epoch
318
- chain.clock.waitForSlot(slot0 + 1),
319
- ]);
320
-
321
- if (listener != null) {
322
- chain.emitter.off(ChainEvent.checkpoint, listener);
323
- }
324
-
325
- if (foundCPState === true) {
326
- return chain.regen.getCheckpointStateSync(cpHex);
327
- }
328
-
329
- return null;
330
- }
331
-
332
- /**
333
- * Reject any request while the node is syncing
334
- */
335
- function notWhileSyncing(): void {
336
- // Consider node synced before or close to genesis
337
- if (chain.clock.currentSlot < SLOTS_PER_EPOCH) {
338
- return;
339
- }
340
-
341
- const syncState = sync.state;
342
- switch (syncState) {
343
- case SyncState.SyncingFinalized:
344
- case SyncState.SyncingHead: {
345
- const currentSlot = chain.clock.currentSlot;
346
- const headSlot = chain.forkChoice.getHead().slot;
347
- if (currentSlot - headSlot > SYNC_TOLERANCE_EPOCHS * SLOTS_PER_EPOCH) {
348
- throw new NodeIsSyncing(`headSlot ${headSlot} currentSlot ${currentSlot}`);
349
- }
350
-
351
- return;
352
- }
353
-
354
- case SyncState.Synced:
355
- return;
356
-
357
- case SyncState.Stalled:
358
- throw new NodeIsSyncing("waiting for peers");
359
- }
360
- }
361
-
362
- /**
363
- * Post merge, the CL and EL could be out of step in the sync, and could result in
364
- * Syncing status of the chain head. To be precise:
365
- * 1. CL could be ahead of the EL, with the validity of head payload not yet verified
366
- * 2. CL could be on an invalid chain of execution blocks with a non-existent
367
- * or non-available parent that never syncs up
368
- *
369
- * Both the above scenarios could be problematic and hence validator shouldn't participate
370
- * or weigh its vote on a head till it resolves to a Valid execution status.
371
- * Following activities should be skipped on an Optimistic head (with Syncing status):
372
- * 1. Attestation if targetRoot is optimistic
373
- * 2. SyncCommitteeContribution if if the root for which to produce contribution is Optimistic.
374
- * 3. ProduceBlock if the parentRoot (chain's current head is optimistic). However this doesn't
375
- * need to be checked/aborted here as assembleBody would call EL's api for the latest
376
- * executionStatus of the parentRoot. If still not validated, produceBlock will throw error.
377
- *
378
- * TODO/PENDING: SyncCommitteeSignatures should also be aborted, the best way to address this
379
- * is still in flux and will be updated as and when other CL's figure this out.
380
- */
381
-
382
- function notOnOptimisticBlockRoot(beaconBlockRoot: Root): void {
383
- const protoBeaconBlock = chain.forkChoice.getBlock(beaconBlockRoot);
384
- if (!protoBeaconBlock) {
385
- throw new ApiError(404, `Block not in forkChoice, beaconBlockRoot=${toRootHex(beaconBlockRoot)}`);
386
- }
387
-
388
- if (protoBeaconBlock.executionStatus === ExecutionStatus.Syncing)
389
- throw new NodeIsSyncing(
390
- `Block's execution payload not yet validated, executionPayloadBlockHash=${protoBeaconBlock.executionPayloadBlockHash} number=${protoBeaconBlock.executionPayloadNumber}`
391
- );
392
- }
393
-
394
- function notOnOutOfRangeData(beaconBlockRoot: Root): void {
395
- const protoBeaconBlock = chain.forkChoice.getBlock(beaconBlockRoot);
396
- if (!protoBeaconBlock) {
397
- throw new ApiError(404, `Block not in forkChoice, beaconBlockRoot=${toRootHex(beaconBlockRoot)}`);
398
- }
399
-
400
- if (protoBeaconBlock.dataAvailabilityStatus === DataAvailabilityStatus.OutOfRange)
401
- throw new NodeIsSyncing("Block's data is out of range and not validated");
402
- }
403
-
404
- async function produceBuilderBlindedBlock(
405
- slot: Slot,
406
- randaoReveal: BLSSignature,
407
- graffiti: Bytes32,
408
- // as of now fee recipient checks can not be performed because builder does not return bid recipient
409
- {
410
- commonBlockBodyPromise,
411
- parentBlockRoot,
412
- parentSlot,
413
- }: Omit<routes.validator.ExtraProduceBlockOpts, "builderSelection"> & {
414
- commonBlockBodyPromise: Promise<CommonBlockBody>;
415
- parentBlockRoot: Root;
416
- parentSlot: Slot;
417
- }
418
- ): Promise<ProduceBlindedBlockRes> {
419
- const version = config.getForkName(slot);
420
- if (!isForkPostBellatrix(version)) {
421
- throw Error(`Invalid fork=${version} for produceBuilderBlindedBlock`);
422
- }
423
-
424
- const source = ProducedBlockSource.builder;
425
- metrics?.blockProductionRequests.inc({source});
426
-
427
- // Error early for builder if builder flow not active
428
- if (!chain.executionBuilder) {
429
- throw Error("External builder not configured");
430
- }
431
-
432
- switch (chain.executionBuilder.status) {
433
- case BuilderStatus.disabled:
434
- throw Error("External builder disabled due to failed status check");
435
- case BuilderStatus.circuitBreaker:
436
- throw Error("External builder circuit breaker is activated");
437
- case BuilderStatus.enabled:
438
- // continue
439
- break;
440
- }
441
-
442
- let timer: undefined | ((opts: {source: ProducedBlockSource}) => number);
443
- try {
444
- timer = metrics?.blockProductionTime.startTimer();
445
- const {block, executionPayloadValue, consensusBlockValue} = await chain.produceBlindedBlock({
446
- slot,
447
- parentBlockRoot,
448
- parentSlot,
449
- randaoReveal,
450
- graffiti,
451
- commonBlockBodyPromise,
452
- });
453
-
454
- metrics?.blockProductionSuccess.inc({source});
455
- metrics?.blockProductionNumAggregated.observe({source}, block.body.attestations.length);
456
- metrics?.blockProductionConsensusBlockValue.observe({source}, Number(formatWeiToEth(consensusBlockValue)));
457
- metrics?.blockProductionExecutionPayloadValue.observe({source}, Number(formatWeiToEth(executionPayloadValue)));
458
- logger.verbose("Produced blinded block", {
459
- slot,
460
- executionPayloadValue,
461
- consensusBlockValue,
462
- root: toRootHex(config.getPostBellatrixForkTypes(slot).BlindedBeaconBlock.hashTreeRoot(block)),
463
- });
464
-
465
- if (chain.opts.persistProducedBlocks) {
466
- void chain.persistBlock(block, "produced_builder_block");
467
- }
468
-
469
- return {data: block, version, executionPayloadValue, consensusBlockValue};
470
- } finally {
471
- if (timer) timer({source});
472
- }
473
- }
474
-
475
- async function produceEngineBlockContents(
476
- slot: Slot,
477
- randaoReveal: BLSSignature,
478
- graffiti: Bytes32,
479
- {
480
- feeRecipient,
481
- strictFeeRecipientCheck,
482
- commonBlockBodyPromise,
483
- parentBlockRoot,
484
- parentSlot,
485
- }: Omit<routes.validator.ExtraProduceBlockOpts, "builderSelection"> & {
486
- commonBlockBodyPromise: Promise<CommonBlockBody>;
487
- parentBlockRoot: Root;
488
- parentSlot: Slot;
489
- }
490
- ): Promise<ProduceBlockContentsRes & {shouldOverrideBuilder?: boolean}> {
491
- const source = ProducedBlockSource.engine;
492
- metrics?.blockProductionRequests.inc({source});
493
-
494
- let timer: undefined | ((opts: {source: ProducedBlockSource}) => number);
495
- try {
496
- timer = metrics?.blockProductionTime.startTimer();
497
- const {block, executionPayloadValue, consensusBlockValue, shouldOverrideBuilder} = await chain.produceBlock({
498
- slot,
499
- parentBlockRoot,
500
- parentSlot,
501
- randaoReveal,
502
- graffiti,
503
- feeRecipient,
504
- commonBlockBodyPromise,
505
- });
506
- const version = config.getForkName(block.slot);
507
- if (strictFeeRecipientCheck && feeRecipient && isForkPostBellatrix(version)) {
508
- const blockFeeRecipient = toHex((block as bellatrix.BeaconBlock).body.executionPayload.feeRecipient);
509
- if (blockFeeRecipient !== feeRecipient) {
510
- throw Error(`Invalid feeRecipient set in engine block expected=${feeRecipient} actual=${blockFeeRecipient}`);
511
- }
512
- }
513
-
514
- metrics?.blockProductionSuccess.inc({source});
515
- metrics?.blockProductionNumAggregated.observe({source}, block.body.attestations.length);
516
- metrics?.blockProductionConsensusBlockValue.observe({source}, Number(formatWeiToEth(consensusBlockValue)));
517
- metrics?.blockProductionExecutionPayloadValue.observe({source}, Number(formatWeiToEth(executionPayloadValue)));
518
-
519
- const blockRoot = toRootHex(config.getForkTypes(slot).BeaconBlock.hashTreeRoot(block));
520
- logger.verbose("Produced execution block", {
521
- slot,
522
- executionPayloadValue,
523
- consensusBlockValue,
524
- root: blockRoot,
525
- });
526
- if (chain.opts.persistProducedBlocks) {
527
- void chain.persistBlock(block, "produced_engine_block");
528
- }
529
- if (isForkPostDeneb(version)) {
530
- const produceResult = chain.blockProductionCache.get(blockRoot);
531
- if (produceResult === undefined) {
532
- throw Error("production result missing in cache");
533
- }
534
- if (!isForkPostDeneb(produceResult.fork)) {
535
- throw Error("production result is for pre-deneb fork");
536
- }
537
- if (produceResult.type !== BlockType.Full) {
538
- throw Error("production result is not full block");
539
- }
540
- const blobsBundle = (produceResult as ProduceFullDeneb).blobsBundle;
541
-
542
- return {
543
- data: {
544
- block,
545
- blobs: blobsBundle.blobs,
546
- kzgProofs: blobsBundle.proofs,
547
- },
548
- version,
549
- executionPayloadValue,
550
- consensusBlockValue,
551
- shouldOverrideBuilder,
552
- };
553
- }
554
-
555
- return {data: {block}, version, executionPayloadValue, consensusBlockValue, shouldOverrideBuilder};
556
- } finally {
557
- if (timer) timer({source});
558
- }
559
- }
560
-
561
- async function produceEngineOrBuilderBlock(
562
- slot: Slot,
563
- randaoReveal: BLSSignature,
564
- graffiti?: string,
565
- // TODO deneb: skip randao verification
566
- _skipRandaoVerification?: boolean,
567
- builderBoostFactor?: bigint,
568
- {feeRecipient, builderSelection, strictFeeRecipientCheck}: routes.validator.ExtraProduceBlockOpts = {}
569
- ): Promise<ProduceBlindedBlockOrBlockContentsRes> {
570
- notWhileSyncing();
571
- await waitForSlot(slot); // Must never request for a future slot > currentSlot
572
-
573
- const {blockRoot: parentBlockRootHex, slot: parentSlot} = chain.getProposerHead(slot);
574
- const parentBlockRoot = fromHex(parentBlockRootHex);
575
- notOnOutOfRangeData(parentBlockRoot);
576
- metrics?.blockProductionSlotDelta.set(slot - parentSlot);
577
-
578
- const fork = config.getForkName(slot);
579
- // set some sensible opts
580
- // builderSelection will be deprecated and will run in mode MaxProfit if builder is enabled
581
- // and the actual selection will be determined using builderBoostFactor passed by the validator
582
- builderSelection = builderSelection ?? routes.validator.BuilderSelection.MaxProfit;
583
- builderBoostFactor = builderBoostFactor ?? BigInt(100);
584
- if (builderBoostFactor > MAX_BUILDER_BOOST_FACTOR) {
585
- throw new ApiError(400, `Invalid builderBoostFactor=${builderBoostFactor} > MAX_BUILDER_BOOST_FACTOR`);
586
- }
587
-
588
- const isBuilderEnabled =
589
- ForkSeq[fork] >= ForkSeq.bellatrix &&
590
- chain.executionBuilder !== undefined &&
591
- builderSelection !== routes.validator.BuilderSelection.ExecutionOnly;
592
-
593
- // At any point either the builder or execution or both flows should be active.
594
- //
595
- // Ideally such a scenario should be prevented on startup, but proposerSettingsFile or keymanager
596
- // configurations could cause a validator pubkey to have builder disabled with builder selection builder only
597
- // (TODO: independently make sure such an options update is not successful for a validator pubkey)
598
- //
599
- // So if builder is disabled ignore builder selection of builder only if caused by user mistake
600
- // https://github.com/ChainSafe/lodestar/issues/6338
601
- const isEngineEnabled = !isBuilderEnabled || builderSelection !== routes.validator.BuilderSelection.BuilderOnly;
602
-
603
- if (!isEngineEnabled && !isBuilderEnabled) {
604
- throw Error(
605
- `Internal Error: Neither builder nor execution proposal flow activated isBuilderEnabled=${isBuilderEnabled} builderSelection=${builderSelection}`
606
- );
607
- }
608
-
609
- const graffitiBytes = toGraffitiBytes(
610
- graffiti ?? getDefaultGraffiti(getLodestarClientVersion(opts), chain.executionEngine.clientVersion, opts)
611
- );
612
-
613
- const loggerContext = {
614
- slot,
615
- parentSlot,
616
- parentBlockRoot: parentBlockRootHex,
617
- fork,
618
- builderSelection,
619
- isBuilderEnabled,
620
- isEngineEnabled,
621
- strictFeeRecipientCheck,
622
- // winston logger doesn't like bigint
623
- builderBoostFactor: `${builderBoostFactor}`,
624
- };
625
-
626
- logger.verbose("Assembling block with produceEngineOrBuilderBlock", loggerContext);
627
-
628
- // Defer common block body production to make sure we sent async builder and engine requests before
629
- const deferredCommonBlockBody = defer<CommonBlockBody>();
630
- const commonBlockBodyPromise = deferredCommonBlockBody.promise;
631
-
632
- // use abort controller to stop waiting for both block sources
633
- const controller = new AbortController();
634
-
635
- // Start calls for building execution and builder blocks
636
- const builderPromise = isBuilderEnabled
637
- ? produceBuilderBlindedBlock(slot, randaoReveal, graffitiBytes, {
638
- feeRecipient,
639
- // can't do fee recipient checks as builder bid doesn't return feeRecipient as of now
640
- strictFeeRecipientCheck: false,
641
- commonBlockBodyPromise,
642
- parentBlockRoot,
643
- parentSlot,
644
- })
645
- : Promise.reject(new Error("Builder disabled"));
646
-
647
- const enginePromise = isEngineEnabled
648
- ? produceEngineBlockContents(slot, randaoReveal, graffitiBytes, {
649
- feeRecipient,
650
- strictFeeRecipientCheck,
651
- commonBlockBodyPromise,
652
- parentBlockRoot,
653
- parentSlot,
654
- }).then((engineBlock) => {
655
- // Once the engine returns a block, in the event of either:
656
- // - suspected builder censorship
657
- // - builder boost factor set to 0 or builder selection `executionalways`
658
- // we don't need to wait for builder block as engine block will always be selected
659
- if (
660
- engineBlock.shouldOverrideBuilder ||
661
- builderBoostFactor === BigInt(0) ||
662
- builderSelection === routes.validator.BuilderSelection.ExecutionAlways
663
- ) {
664
- controller.abort();
665
- }
666
- return engineBlock;
667
- })
668
- : Promise.reject(new Error("Engine disabled"));
669
-
670
- // Calculate cutoff time based on start of the slot
671
- const cutoffMs = Math.max(0, BLOCK_PRODUCTION_RACE_CUTOFF_MS - chain.clock.msFromSlot(slot));
672
-
673
- logger.verbose("Block production race (builder vs execution) starting", {
674
- ...loggerContext,
675
- cutoffMs,
676
- timeoutMs: BLOCK_PRODUCTION_RACE_TIMEOUT_MS,
677
- });
678
-
679
- const blockProductionRacePromise = resolveOrRacePromises([builderPromise, enginePromise], {
680
- resolveTimeoutMs: cutoffMs,
681
- raceTimeoutMs: BLOCK_PRODUCTION_RACE_TIMEOUT_MS,
682
- signal: controller.signal,
683
- });
684
-
685
- // Ensure builder and engine HTTP requests are sent before starting common block body production
686
- // by deferring the call to next event loop iteration, allowing pending I/O operations like
687
- // HTTP requests to be processed first and sent out early in slot.
688
- callInNextEventLoop(() => {
689
- logger.verbose("Producing common block body", loggerContext);
690
- const commonBlockBodyStartedAt = Date.now();
691
-
692
- chain
693
- .produceCommonBlockBody({
694
- slot,
695
- parentBlockRoot,
696
- parentSlot,
697
- randaoReveal,
698
- graffiti: graffitiBytes,
699
- })
700
- .then((commonBlockBody) => {
701
- deferredCommonBlockBody.resolve(commonBlockBody);
702
- logger.verbose("Produced common block body", {
703
- ...loggerContext,
704
- durationMs: Date.now() - commonBlockBodyStartedAt,
705
- });
706
- })
707
- .catch(deferredCommonBlockBody.reject);
708
- });
709
-
710
- const [builder, engine] = await blockProductionRacePromise;
711
-
712
- if (builder.status === "pending" && engine.status === "pending") {
713
- throw Error("Builder and engine both failed to produce the block within timeout");
714
- }
715
-
716
- if (builder.status === "pending" && !isEngineEnabled) {
717
- throw Error("Builder failed to produce the block within timeout");
718
- }
719
-
720
- if (engine.status === "pending" && !isBuilderEnabled) {
721
- throw Error("Engine failed to produce the block within timeout");
722
- }
723
-
724
- if (isEngineEnabled) {
725
- if (engine.status === "rejected") {
726
- logger.warn(
727
- "Engine failed to produce the block",
728
- {
729
- ...loggerContext,
730
- durationMs: engine.durationMs,
731
- },
732
- engine.reason
733
- );
734
- } else if (engine.status === "pending") {
735
- logger.warn("Engine failed to produce the block within cutoff time", {
736
- ...loggerContext,
737
- cutoffMs,
738
- });
739
- }
740
- }
741
-
742
- if (isBuilderEnabled) {
743
- if (builder.status === "rejected") {
744
- if (builder.reason instanceof NoBidReceived) {
745
- logger.info("Builder did not provide a bid", {
746
- ...loggerContext,
747
- durationMs: builder.durationMs,
748
- });
749
- } else {
750
- logger.warn(
751
- "Builder failed to produce the block",
752
- {
753
- ...loggerContext,
754
- durationMs: builder.durationMs,
755
- },
756
- builder.reason
757
- );
758
- }
759
- } else if (builder.status === "pending") {
760
- logger.warn("Builder failed to produce the block within cutoff time", {
761
- ...loggerContext,
762
- cutoffMs,
763
- });
764
- }
765
- }
766
-
767
- if (builder.status === "rejected" && engine.status === "rejected") {
768
- throw Error(
769
- `${isBuilderEnabled && isEngineEnabled ? "Builder and engine both" : isBuilderEnabled ? "Builder" : "Engine"} failed to produce the block`
770
- );
771
- }
772
-
773
- // handle shouldOverrideBuilder separately
774
- if (engine.status === "fulfilled" && engine.value.shouldOverrideBuilder) {
775
- logger.info("Selected engine block: censorship suspected in builder blocks", {
776
- ...loggerContext,
777
- durationMs: engine.durationMs,
778
- shouldOverrideBuilder: engine.value.shouldOverrideBuilder,
779
- ...getBlockValueLogInfo(engine.value),
780
- });
781
-
782
- metrics?.blockProductionSelectionResults.inc({
783
- source: ProducedBlockSource.engine,
784
- reason: EngineBlockSelectionReason.BuilderCensorship,
785
- });
786
-
787
- return {...engine.value, executionPayloadBlinded: false, executionPayloadSource: ProducedBlockSource.engine};
788
- }
789
-
790
- if (builder.status === "fulfilled" && engine.status !== "fulfilled") {
791
- const reason =
792
- isEngineEnabled === false
793
- ? BuilderBlockSelectionReason.EngineDisabled
794
- : engine.status === "pending"
795
- ? BuilderBlockSelectionReason.EnginePending
796
- : BuilderBlockSelectionReason.EngineError;
797
-
798
- logger.info("Selected builder block: no engine block produced", {
799
- reason,
800
- ...loggerContext,
801
- durationMs: builder.durationMs,
802
- ...getBlockValueLogInfo(builder.value),
803
- });
804
-
805
- metrics?.blockProductionSelectionResults.inc({
806
- source: ProducedBlockSource.builder,
807
- reason,
808
- });
809
-
810
- return {...builder.value, executionPayloadBlinded: true, executionPayloadSource: ProducedBlockSource.builder};
811
- }
812
-
813
- if (engine.status === "fulfilled" && builder.status !== "fulfilled") {
814
- const reason =
815
- isBuilderEnabled === false
816
- ? EngineBlockSelectionReason.BuilderDisabled
817
- : builder.status === "pending"
818
- ? EngineBlockSelectionReason.BuilderPending
819
- : builder.reason instanceof NoBidReceived
820
- ? EngineBlockSelectionReason.BuilderNoBid
821
- : builder.reason instanceof TimeoutError
822
- ? EngineBlockSelectionReason.BuilderTimeout
823
- : EngineBlockSelectionReason.BuilderError;
824
-
825
- logger.info("Selected engine block: no builder block produced", {
826
- reason,
827
- ...loggerContext,
828
- durationMs: engine.durationMs,
829
- ...getBlockValueLogInfo(engine.value),
830
- });
831
-
832
- metrics?.blockProductionSelectionResults.inc({
833
- source: ProducedBlockSource.engine,
834
- reason,
835
- });
836
-
837
- return {...engine.value, executionPayloadBlinded: false, executionPayloadSource: ProducedBlockSource.engine};
838
- }
839
-
840
- if (engine.status === "fulfilled" && builder.status === "fulfilled") {
841
- const result = selectBlockProductionSource({
842
- builderExecutionPayloadValue: builder.value.executionPayloadValue,
843
- engineExecutionPayloadValue: engine.value.executionPayloadValue,
844
- builderBoostFactor,
845
- builderSelection,
846
- });
847
- const executionPayloadSource = result.source;
848
-
849
- metrics?.blockProductionSelectionResults.inc(result);
850
-
851
- logger.info(`Selected ${executionPayloadSource} block`, {
852
- reason: result.reason,
853
- ...loggerContext,
854
- engineDurationMs: engine.durationMs,
855
- ...getBlockValueLogInfo(engine.value, ProducedBlockSource.engine),
856
- builderDurationMs: builder.durationMs,
857
- ...getBlockValueLogInfo(builder.value, ProducedBlockSource.builder),
858
- });
859
-
860
- if (executionPayloadSource === ProducedBlockSource.engine) {
861
- return {
862
- ...engine.value,
863
- executionPayloadBlinded: false,
864
- executionPayloadSource,
865
- };
866
- }
867
-
868
- return {
869
- ...builder.value,
870
- executionPayloadBlinded: true,
871
- executionPayloadSource,
872
- };
873
- }
874
-
875
- throw Error("Unreachable error occurred during the builder and execution block production");
876
- }
877
-
878
- return {
879
- async produceBlockV3({slot, randaoReveal, graffiti, skipRandaoVerification, builderBoostFactor, ...opts}) {
880
- const {data, ...meta} = await produceEngineOrBuilderBlock(
881
- slot,
882
- randaoReveal,
883
- graffiti,
884
- skipRandaoVerification,
885
- builderBoostFactor,
886
- opts
887
- );
888
-
889
- if (opts.blindedLocal === true && ForkSeq[meta.version] >= ForkSeq.bellatrix) {
890
- if (meta.executionPayloadBlinded) {
891
- return {data, meta};
892
- }
893
-
894
- const {block} = data as BlockContents;
895
- const blindedBlock = beaconBlockToBlinded(config, block as BeaconBlock<ForkPostBellatrix>);
896
- return {
897
- data: blindedBlock,
898
- meta: {...meta, executionPayloadBlinded: true},
899
- };
900
- }
901
-
902
- return {data, meta};
903
- },
904
-
905
- async produceAttestationData({committeeIndex, slot}) {
906
- notWhileSyncing();
907
-
908
- await waitForSlot(slot); // Must never request for a future slot > currentSlot
909
-
910
- // This needs a state in the same epoch as `slot` such that state.currentJustifiedCheckpoint is correct.
911
- // Note: This may trigger an epoch transition if there skipped slots at the beginning of the epoch.
912
- const headState = chain.getHeadState();
913
- const headSlot = headState.slot;
914
- const attEpoch = computeEpochAtSlot(slot);
915
- const headBlockRootHex = chain.forkChoice.getHead().blockRoot;
916
- const headBlockRoot = fromHex(headBlockRootHex);
917
- const fork = config.getForkName(slot);
918
-
919
- let index: CommitteeIndex;
920
- if (isForkPostElectra(fork)) {
921
- index = 0;
922
- } else {
923
- if (committeeIndex === undefined) {
924
- throw new ApiError(400, `Committee index must be provided for pre-electra fork=${fork}`);
925
- }
926
- index = committeeIndex;
927
- }
928
-
929
- const beaconBlockRoot =
930
- slot >= headSlot
931
- ? // When attesting to the head slot or later, always use the head of the chain.
932
- headBlockRoot
933
- : // Permit attesting to slots *prior* to the current head. This is desirable when
934
- // the VC and BN are out-of-sync due to time issues or overloading.
935
- getBlockRootAtSlot(headState, slot);
936
-
937
- const targetSlot = computeStartSlotAtEpoch(attEpoch);
938
- const targetRoot =
939
- targetSlot >= headSlot
940
- ? // If the state is earlier than the target slot then the target *must* be the head block root.
941
- headBlockRoot
942
- : getBlockRootAtSlot(headState, targetSlot);
943
-
944
- // Check the execution status as validator shouldn't vote on an optimistic head
945
- // Check on target is sufficient as a valid target would imply a valid source
946
- notOnOptimisticBlockRoot(targetRoot);
947
- notOnOutOfRangeData(targetRoot);
948
-
949
- // To get the correct source we must get a state in the same epoch as the attestation's epoch.
950
- // An epoch transition may change state.currentJustifiedCheckpoint
951
- const attEpochState = await chain.getHeadStateAtEpoch(attEpoch, RegenCaller.produceAttestationData);
952
-
953
- // TODO confirm if the below is correct assertion
954
- // notOnOutOfRangeData(attEpochState.currentJustifiedCheckpoint.root);
955
-
956
- return {
957
- data: {
958
- slot,
959
- index,
960
- beaconBlockRoot,
961
- source: attEpochState.currentJustifiedCheckpoint,
962
- target: {epoch: attEpoch, root: targetRoot},
963
- },
964
- };
965
- },
966
-
967
- /**
968
- * GET `/eth/v1/validator/sync_committee_contribution`
969
- *
970
- * Requests that the beacon node produce a sync committee contribution.
971
- *
972
- * https://github.com/ethereum/beacon-APIs/pull/138
973
- *
974
- * @param slot The slot for which a sync committee contribution should be created.
975
- * @param subcommitteeIndex The subcommittee index for which to produce the contribution.
976
- * @param beaconBlockRoot The block root for which to produce the contribution.
977
- */
978
- async produceSyncCommitteeContribution({slot, subcommitteeIndex, beaconBlockRoot}) {
979
- // when a validator is configured with multiple beacon node urls, this beaconBlockRoot may come from another beacon node
980
- // and it hasn't been in our forkchoice since we haven't seen / processing that block
981
- // see https://github.com/ChainSafe/lodestar/issues/5063
982
- if (!chain.forkChoice.hasBlock(beaconBlockRoot)) {
983
- const rootHex = toRootHex(beaconBlockRoot);
984
- network.searchUnknownSlotRoot({slot, root: rootHex}, BlockInputSource.api);
985
- // if result of this call is false, i.e. block hasn't seen after 1 slot then the below notOnOptimisticBlockRoot call will throw error
986
- await chain.waitForBlock(slot, rootHex);
987
- }
988
-
989
- // Check the execution status as validator shouldn't contribute on an optimistic head
990
- notOnOptimisticBlockRoot(beaconBlockRoot);
991
- notOnOutOfRangeData(beaconBlockRoot);
992
-
993
- const contribution = chain.syncCommitteeMessagePool.getContribution(subcommitteeIndex, slot, beaconBlockRoot);
994
- if (!contribution) {
995
- throw new ApiError(
996
- 404,
997
- `No sync committee contribution for slot=${slot}, subnet=${subcommitteeIndex}, beaconBlockRoot=${toRootHex(beaconBlockRoot)}`
998
- );
999
- }
1000
-
1001
- metrics?.production.producedSyncContributionParticipants.observe(
1002
- contribution.aggregationBits.getTrueBitIndexes().length
1003
- );
1004
-
1005
- return {data: contribution};
1006
- },
1007
-
1008
- async getProposerDuties({epoch}) {
1009
- notWhileSyncing();
1010
-
1011
- // Early check that epoch is no more than current_epoch + 1, or allow for pre-genesis
1012
- const currentEpoch = currentEpochWithDisparity();
1013
- const nextEpoch = currentEpoch + 1;
1014
- if (currentEpoch >= 0 && epoch > nextEpoch) {
1015
- throw new ApiError(400, `Requested epoch ${epoch} must not be more than one epoch in the future`);
1016
- }
1017
-
1018
- const head = chain.forkChoice.getHead();
1019
- let state: CachedBeaconStateAllForks | undefined = undefined;
1020
- const startSlot = computeStartSlotAtEpoch(epoch);
1021
- const slotMs = config.SECONDS_PER_SLOT * 1000;
1022
- const prepareNextSlotLookAheadMs = slotMs - config.getSlotComponentDurationMs(PREPARE_NEXT_SLOT_BPS);
1023
- const toNextEpochMs = msToNextEpoch();
1024
- // validators may request next epoch's duties when it's close to next epoch
1025
- // this is to avoid missed block proposal due to 0 epoch look ahead
1026
- if (epoch === nextEpoch && toNextEpochMs < prepareNextSlotLookAheadMs) {
1027
- // wait for maximum 1 slot for cp state which is the timeout of validator api
1028
- const cpState = await waitForCheckpointState({rootHex: head.blockRoot, epoch});
1029
- if (cpState) {
1030
- state = cpState;
1031
- metrics?.duties.requestNextEpochProposalDutiesHit.inc();
1032
- } else {
1033
- metrics?.duties.requestNextEpochProposalDutiesMiss.inc();
1034
- }
1035
- }
1036
-
1037
- if (!state) {
1038
- if (epoch >= currentEpoch - 1) {
1039
- // Cached beacon state stores proposers for previous, current and next epoch. The
1040
- // requested epoch is within that range, we can use the head state at current epoch
1041
- state = await chain.getHeadStateAtCurrentEpoch(RegenCaller.getDuties);
1042
- } else {
1043
- const res = await getStateResponseWithRegen(chain, startSlot);
1044
-
1045
- const stateViewDU =
1046
- res.state instanceof Uint8Array
1047
- ? loadState(config, chain.getHeadState(), res.state).state
1048
- : res.state.clone();
1049
-
1050
- state = createCachedBeaconState(
1051
- stateViewDU,
1052
- {
1053
- config: chain.config,
1054
- // Not required to compute proposers
1055
- pubkey2index: new PubkeyIndexMap(),
1056
- index2pubkey: [],
1057
- },
1058
- {skipSyncPubkeys: true, skipSyncCommitteeCache: true}
1059
- );
1060
-
1061
- if (state.epochCtx.epoch !== epoch) {
1062
- throw Error(`Loaded state epoch ${state.epochCtx.epoch} does not match requested epoch ${epoch}`);
1063
- }
1064
- }
1065
- }
1066
-
1067
- const stateEpoch = state.epochCtx.epoch;
1068
- let indexes: ValidatorIndex[] = [];
1069
-
1070
- switch (epoch) {
1071
- case stateEpoch:
1072
- indexes = state.epochCtx.getBeaconProposers();
1073
- break;
1074
-
1075
- case stateEpoch + 1:
1076
- // make sure shuffling is calculated and ready for next call to calculate nextProposers
1077
- await chain.shufflingCache.get(state.epochCtx.nextEpoch, state.epochCtx.nextDecisionRoot);
1078
- // Requesting duties for next epoch is allowed since they can be predicted with high probabilities.
1079
- // @see `epochCtx.getBeaconProposersNextEpoch` JSDocs for rationale.
1080
- indexes = state.epochCtx.getBeaconProposersNextEpoch();
1081
- break;
1082
-
1083
- case stateEpoch - 1: {
1084
- const indexesPrevEpoch = state.epochCtx.getBeaconProposersPrevEpoch();
1085
- if (indexesPrevEpoch === null) {
1086
- // Should not happen as previous proposer duties should be initialized for head state
1087
- // and if we load state from `Uint8Array` it will always be the state of requested epoch
1088
- throw Error(`Proposer duties for previous epoch ${epoch} not yet initialized`);
1089
- }
1090
- indexes = indexesPrevEpoch;
1091
- break;
1092
- }
1093
-
1094
- default:
1095
- // Should never happen, epoch is checked to be in bounds above
1096
- throw Error(`Proposer duties for epoch ${epoch} not supported, current epoch ${stateEpoch}`);
1097
- }
1098
-
1099
- // NOTE: this is the fastest way of getting compressed pubkeys.
1100
- // See benchmark -> packages/lodestar/test/perf/api/impl/validator/attester.test.ts
1101
- // After dropping the flat caches attached to the CachedBeaconState it's no longer available.
1102
- // TODO: Add a flag to just send 0x00 as pubkeys since the Lodestar validator does not need them.
1103
- const pubkeys = getPubkeysForIndices(state.validators, indexes);
1104
-
1105
- const duties: routes.validator.ProposerDuty[] = [];
1106
- for (let i = 0; i < SLOTS_PER_EPOCH; i++) {
1107
- duties.push({slot: startSlot + i, validatorIndex: indexes[i], pubkey: pubkeys[i]});
1108
- }
1109
-
1110
- // Returns `null` on the one-off scenario where the genesis block decides its own shuffling.
1111
- // It should be set to the latest block applied to `self` or the genesis block root.
1112
- const dependentRoot = proposerShufflingDecisionRoot(state) || (await getGenesisBlockRoot(state));
1113
-
1114
- return {
1115
- data: duties,
1116
- meta: {
1117
- dependentRoot: toRootHex(dependentRoot),
1118
- executionOptimistic: isOptimisticBlock(head),
1119
- },
1120
- };
1121
- },
1122
-
1123
- async getAttesterDuties({epoch, indices}) {
1124
- notWhileSyncing();
1125
-
1126
- if (indices.length === 0) {
1127
- throw new ApiError(400, "No validator to get attester duties");
1128
- }
1129
-
1130
- // May request for an epoch that's in the future
1131
- await waitForNextClosestEpoch();
1132
-
1133
- // should not compare to headEpoch in order to handle skipped slots
1134
- // Check if the epoch is in the future after waiting for requested slot
1135
- if (epoch > chain.clock.currentEpoch + 1) {
1136
- throw new ApiError(400, "Cannot get duties for epoch more than one ahead");
1137
- }
1138
-
1139
- const head = chain.forkChoice.getHead();
1140
- const state = await chain.getHeadStateAtCurrentEpoch(RegenCaller.getDuties);
1141
-
1142
- // TODO: Determine what the current epoch would be if we fast-forward our system clock by
1143
- // `MAXIMUM_GOSSIP_CLOCK_DISPARITY`.
1144
- //
1145
- // Most of the time, `tolerantCurrentEpoch` will be equal to `currentEpoch`. However, during
1146
- // the first `MAXIMUM_GOSSIP_CLOCK_DISPARITY` duration of the epoch `tolerantCurrentEpoch`
1147
- // will equal `currentEpoch + 1`
1148
-
1149
- // Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
1150
- const pubkeys = getPubkeysForIndices(state.validators, indices);
1151
- const decisionRoot = state.epochCtx.getShufflingDecisionRoot(epoch);
1152
- const shuffling = await chain.shufflingCache.get(epoch, decisionRoot);
1153
- if (!shuffling) {
1154
- throw new ApiError(
1155
- 500,
1156
- `No shuffling found to calculate committee assignments for epoch: ${epoch} and decisionRoot: ${decisionRoot}`
1157
- );
1158
- }
1159
- const committeeAssignments = calculateCommitteeAssignments(shuffling, indices);
1160
- const duties: routes.validator.AttesterDuty[] = [];
1161
- for (let i = 0, len = indices.length; i < len; i++) {
1162
- const validatorIndex = indices[i];
1163
- const duty = committeeAssignments.get(validatorIndex) as routes.validator.AttesterDuty | undefined;
1164
- if (duty) {
1165
- // Mutate existing object instead of re-creating another new object with spread operator
1166
- // Should be faster and require less memory
1167
- duty.pubkey = pubkeys[i];
1168
- duties.push(duty);
1169
- }
1170
- }
1171
-
1172
- const dependentRoot = attesterShufflingDecisionRoot(state, epoch) || (await getGenesisBlockRoot(state));
1173
-
1174
- return {
1175
- data: duties,
1176
- meta: {
1177
- dependentRoot: toRootHex(dependentRoot),
1178
- executionOptimistic: isOptimisticBlock(head),
1179
- },
1180
- };
1181
- },
1182
-
1183
- /**
1184
- * `POST /eth/v1/validator/duties/sync/{epoch}`
1185
- *
1186
- * Requests the beacon node to provide a set of sync committee duties for a particular epoch.
1187
- * - Although pubkey can be inferred from the index we return it to keep this call analogous with the one that
1188
- * fetches attester duties.
1189
- * - `sync_committee_index` is the index of the validator in the sync committee. This can be used to infer the
1190
- * subnet to which the contribution should be broadcast. Note, there can be multiple per validator.
1191
- *
1192
- * https://github.com/ethereum/beacon-APIs/pull/134
1193
- *
1194
- * @param validatorIndices an array of the validator indices for which to obtain the duties.
1195
- */
1196
- async getSyncCommitteeDuties({epoch, indices}) {
1197
- notWhileSyncing();
1198
-
1199
- if (indices.length === 0) {
1200
- throw new ApiError(400, "No validator to get attester duties");
1201
- }
1202
-
1203
- // May request for an epoch that's in the future
1204
- await waitForNextClosestEpoch();
1205
-
1206
- // sync committee duties have a lookahead of 1 day. Assuming the validator only requests duties for upcoming
1207
- // epochs, the head state will very likely have the duties available for the requested epoch.
1208
- // Note: does not support requesting past duties
1209
- const head = chain.forkChoice.getHead();
1210
- const state = chain.getHeadState();
1211
-
1212
- // Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
1213
- const pubkeys = getPubkeysForIndices(state.validators, indices);
1214
- // Ensures `epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD <= current_epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD + 1`
1215
- const syncCommitteeCache = state.epochCtx.getIndexedSyncCommitteeAtEpoch(epoch);
1216
- const validatorSyncCommitteeIndexMap = syncCommitteeCache.validatorIndexMap;
1217
-
1218
- const duties: routes.validator.SyncDuty[] = [];
1219
- for (let i = 0, len = indices.length; i < len; i++) {
1220
- const validatorIndex = indices[i];
1221
- const validatorSyncCommitteeIndices = validatorSyncCommitteeIndexMap.get(validatorIndex);
1222
- if (validatorSyncCommitteeIndices) {
1223
- duties.push({
1224
- pubkey: pubkeys[i],
1225
- validatorIndex,
1226
- validatorSyncCommitteeIndices,
1227
- });
1228
- }
1229
- }
1230
-
1231
- return {
1232
- data: duties,
1233
- meta: {executionOptimistic: isOptimisticBlock(head)},
1234
- };
1235
- },
1236
-
1237
- async getAggregatedAttestation({attestationDataRoot, slot}) {
1238
- notWhileSyncing();
1239
-
1240
- await waitForSlot(slot); // Must never request for a future slot > currentSlot
1241
-
1242
- const dataRootHex = toRootHex(attestationDataRoot);
1243
- const aggregate = chain.attestationPool.getAggregate(slot, dataRootHex, null);
1244
- const fork = chain.config.getForkName(slot);
1245
-
1246
- if (isForkPostElectra(fork)) {
1247
- throw new ApiError(
1248
- 400,
1249
- `Use getAggregatedAttestationV2 to retrieve aggregated attestations for post-electra fork=${fork}`
1250
- );
1251
- }
1252
-
1253
- if (!aggregate) {
1254
- throw new ApiError(404, `No aggregated attestation for slot=${slot}, dataRoot=${dataRootHex}`);
1255
- }
1256
-
1257
- metrics?.production.producedAggregateParticipants.observe(aggregate.aggregationBits.getTrueBitIndexes().length);
1258
-
1259
- return {
1260
- data: aggregate,
1261
- };
1262
- },
1263
-
1264
- async getAggregatedAttestationV2({attestationDataRoot, slot, committeeIndex}) {
1265
- notWhileSyncing();
1266
-
1267
- await waitForSlot(slot); // Must never request for a future slot > currentSlot
1268
-
1269
- const dataRootHex = toRootHex(attestationDataRoot);
1270
- const aggregate = chain.attestationPool.getAggregate(slot, dataRootHex, committeeIndex);
1271
-
1272
- if (!aggregate) {
1273
- throw new ApiError(
1274
- 404,
1275
- `No aggregated attestation for slot=${slot}, dataRoot=${dataRootHex}, committeeIndex=${committeeIndex}`
1276
- );
1277
- }
1278
-
1279
- metrics?.production.producedAggregateParticipants.observe(aggregate.aggregationBits.getTrueBitIndexes().length);
1280
-
1281
- return {
1282
- data: aggregate,
1283
- meta: {version: config.getForkName(slot)},
1284
- };
1285
- },
1286
-
1287
- async publishAggregateAndProofs({signedAggregateAndProofs}) {
1288
- await this.publishAggregateAndProofsV2({signedAggregateAndProofs});
1289
- },
1290
-
1291
- async publishAggregateAndProofsV2({signedAggregateAndProofs}) {
1292
- notWhileSyncing();
1293
-
1294
- const seenTimestampSec = Date.now() / 1000;
1295
- const errors: Error[] = [];
1296
- const fork = chain.config.getForkName(chain.clock.currentSlot);
1297
-
1298
- await Promise.all(
1299
- signedAggregateAndProofs.map(async (signedAggregateAndProof, i) => {
1300
- try {
1301
- // TODO: Validate in batch
1302
- const validateFn = () => validateApiAggregateAndProof(fork, chain, signedAggregateAndProof);
1303
- const {slot, beaconBlockRoot} = signedAggregateAndProof.message.aggregate.data;
1304
- // when a validator is configured with multiple beacon node urls, this attestation may come from another beacon node
1305
- // and the block hasn't been in our forkchoice since we haven't seen / processing that block
1306
- // see https://github.com/ChainSafe/lodestar/issues/5098
1307
- const {indexedAttestation, committeeValidatorIndices, attDataRootHex} =
1308
- await validateGossipFnRetryUnknownRoot(validateFn, network, chain, slot, beaconBlockRoot);
1309
-
1310
- const insertOutcome = chain.aggregatedAttestationPool.add(
1311
- signedAggregateAndProof.message.aggregate,
1312
- attDataRootHex,
1313
- indexedAttestation.attestingIndices.length,
1314
- committeeValidatorIndices
1315
- );
1316
- metrics?.opPool.aggregatedAttestationPool.apiInsertOutcome.inc({insertOutcome});
1317
-
1318
- const sentPeers = await network.publishBeaconAggregateAndProof(signedAggregateAndProof);
1319
- chain.validatorMonitor?.onPoolSubmitAggregatedAttestation(seenTimestampSec, indexedAttestation, sentPeers);
1320
- } catch (e) {
1321
- const logCtx = {
1322
- slot: signedAggregateAndProof.message.aggregate.data.slot,
1323
- index: signedAggregateAndProof.message.aggregate.data.index,
1324
- };
1325
-
1326
- if (e instanceof AttestationError && e.type.code === AttestationErrorCode.AGGREGATOR_ALREADY_KNOWN) {
1327
- logger.debug("Ignoring known signedAggregateAndProof", logCtx);
1328
- return; // Ok to submit the same aggregate twice
1329
- }
1330
-
1331
- errors.push(e as Error);
1332
- logger.error(`Error on publishAggregateAndProofs [${i}]`, logCtx, e as Error);
1333
- if (e instanceof AttestationError && e.action === GossipAction.REJECT) {
1334
- chain.persistInvalidSszValue(ssz.phase0.SignedAggregateAndProof, signedAggregateAndProof, "api_reject");
1335
- }
1336
- }
1337
- })
1338
- );
1339
-
1340
- if (errors.length > 1) {
1341
- throw Error("Multiple errors on publishAggregateAndProofs\n" + errors.map((e) => e.message).join("\n"));
1342
- }
1343
-
1344
- if (errors.length === 1) {
1345
- throw errors[0];
1346
- }
1347
- },
1348
-
1349
- /**
1350
- * POST `/eth/v1/validator/contribution_and_proofs`
1351
- *
1352
- * Publish multiple signed sync committee contribution and proofs
1353
- *
1354
- * https://github.com/ethereum/beacon-APIs/pull/137
1355
- */
1356
- async publishContributionAndProofs({contributionAndProofs}) {
1357
- notWhileSyncing();
1358
-
1359
- const errors: Error[] = [];
1360
-
1361
- await Promise.all(
1362
- contributionAndProofs.map(async (contributionAndProof, i) => {
1363
- try {
1364
- // TODO: Validate in batch
1365
- const {syncCommitteeParticipantIndices} = await validateSyncCommitteeGossipContributionAndProof(
1366
- chain,
1367
- contributionAndProof,
1368
- true // skip known participants check
1369
- );
1370
- const insertOutcome = chain.syncContributionAndProofPool.add(
1371
- contributionAndProof.message,
1372
- syncCommitteeParticipantIndices.length,
1373
- true
1374
- );
1375
- metrics?.opPool.syncContributionAndProofPool.apiInsertOutcome.inc({insertOutcome});
1376
- await network.publishContributionAndProof(contributionAndProof);
1377
- } catch (e) {
1378
- const logCtx = {
1379
- slot: contributionAndProof.message.contribution.slot,
1380
- subcommitteeIndex: contributionAndProof.message.contribution.subcommitteeIndex,
1381
- };
1382
-
1383
- if (
1384
- e instanceof SyncCommitteeError &&
1385
- e.type.code === SyncCommitteeErrorCode.SYNC_COMMITTEE_AGGREGATOR_ALREADY_KNOWN
1386
- ) {
1387
- logger.debug("Ignoring known contributionAndProof", logCtx);
1388
- return; // Ok to submit the same aggregate twice
1389
- }
1390
-
1391
- errors.push(e as Error);
1392
- logger.error(`Error on publishContributionAndProofs [${i}]`, logCtx, e as Error);
1393
- if (e instanceof SyncCommitteeError && e.action === GossipAction.REJECT) {
1394
- chain.persistInvalidSszValue(ssz.altair.SignedContributionAndProof, contributionAndProof, "api_reject");
1395
- }
1396
- }
1397
- })
1398
- );
1399
-
1400
- if (errors.length > 1) {
1401
- throw Error("Multiple errors on publishContributionAndProofs\n" + errors.map((e) => e.message).join("\n"));
1402
- }
1403
-
1404
- if (errors.length === 1) {
1405
- throw errors[0];
1406
- }
1407
- },
1408
-
1409
- async prepareBeaconCommitteeSubnet({subscriptions}) {
1410
- notWhileSyncing();
1411
-
1412
- await network.prepareBeaconCommitteeSubnets(
1413
- subscriptions.map(({validatorIndex, slot, isAggregator, committeesAtSlot, committeeIndex}) => ({
1414
- validatorIndex: validatorIndex,
1415
- subnet: computeSubnetForCommitteesAtSlot(slot, committeesAtSlot, committeeIndex),
1416
- slot: slot,
1417
- isAggregator: isAggregator,
1418
- }))
1419
- );
1420
-
1421
- // TODO:
1422
- // If the discovery mechanism isn't disabled, attempt to set up a peer discovery for the
1423
- // required subnets.
1424
-
1425
- if (metrics) {
1426
- for (const subscription of subscriptions) {
1427
- chain.validatorMonitor?.registerLocalValidator(subscription.validatorIndex);
1428
- }
1429
- }
1430
- },
1431
-
1432
- /**
1433
- * POST `/eth/v1/validator/sync_committee_subscriptions`
1434
- *
1435
- * Subscribe to a number of sync committee subnets.
1436
- * Sync committees are not present in phase0, but are required for Altair networks.
1437
- * Subscribing to sync committee subnets is an action performed by VC to enable network participation in Altair networks,
1438
- * and only required if the VC has an active validator in an active sync committee.
1439
- *
1440
- * https://github.com/ethereum/beacon-APIs/pull/136
1441
- */
1442
- async prepareSyncCommitteeSubnets({subscriptions}) {
1443
- notWhileSyncing();
1444
-
1445
- // A `validatorIndex` can be in multiple subnets, so compute the CommitteeSubscription with double for loop
1446
- const subs: CommitteeSubscription[] = [];
1447
- for (const sub of subscriptions) {
1448
- for (const committeeIndex of sub.syncCommitteeIndices) {
1449
- const subnet = Math.floor(committeeIndex / SYNC_COMMITTEE_SUBNET_SIZE);
1450
- subs.push({
1451
- validatorIndex: sub.validatorIndex,
1452
- subnet: subnet,
1453
- // Subscribe until the end of `untilEpoch`: https://github.com/ethereum/beacon-APIs/pull/136#issuecomment-840315097
1454
- slot: computeStartSlotAtEpoch(sub.untilEpoch + 1),
1455
- isAggregator: true,
1456
- });
1457
- }
1458
- }
1459
-
1460
- await network.prepareSyncCommitteeSubnets(subs);
1461
-
1462
- if (metrics) {
1463
- for (const subscription of subscriptions) {
1464
- chain.validatorMonitor?.registerLocalValidatorInSyncCommittee(
1465
- subscription.validatorIndex,
1466
- subscription.untilEpoch
1467
- );
1468
- }
1469
- }
1470
- },
1471
-
1472
- async prepareBeaconProposer({proposers}) {
1473
- await chain.updateBeaconProposerData(chain.clock.currentEpoch, proposers);
1474
- },
1475
-
1476
- async submitBeaconCommitteeSelections() {
1477
- throw new OnlySupportedByDVT();
1478
- },
1479
-
1480
- async submitSyncCommitteeSelections() {
1481
- throw new OnlySupportedByDVT();
1482
- },
1483
-
1484
- async getLiveness({epoch, indices}) {
1485
- if (indices.length === 0) {
1486
- return {
1487
- data: [],
1488
- };
1489
- }
1490
- const currentEpoch = chain.clock.currentEpoch;
1491
- if (epoch < currentEpoch - 1 || epoch > currentEpoch + 1) {
1492
- throw new ApiError(
1493
- 400,
1494
- `Request epoch ${epoch} is more than one epoch before or after the current epoch ${currentEpoch}`
1495
- );
1496
- }
1497
-
1498
- return {
1499
- data: indices.map((index) => ({
1500
- index,
1501
- isLive: chain.validatorSeenAtEpoch(index, epoch),
1502
- })),
1503
- };
1504
- },
1505
-
1506
- async registerValidator({registrations}) {
1507
- if (!chain.executionBuilder) {
1508
- throw Error("External builder not configured");
1509
- }
1510
-
1511
- // should only send active or pending validator to builder
1512
- // Spec: https://ethereum.github.io/builder-specs/#/Builder/registerValidator
1513
- const headState = chain.getHeadState();
1514
- const currentEpoch = chain.clock.currentEpoch;
1515
-
1516
- const filteredRegistrations = registrations.filter((registration) => {
1517
- const {pubkey} = registration.message;
1518
- const validatorIndex = headState.epochCtx.pubkey2index.get(pubkey);
1519
- if (validatorIndex === null) return false;
1520
-
1521
- const validator = headState.validators.getReadonly(validatorIndex);
1522
- const status = getValidatorStatus(validator, currentEpoch);
1523
- return (
1524
- status === "active_exiting" ||
1525
- status === "active_ongoing" ||
1526
- status === "active_slashed" ||
1527
- status === "pending_initialized" ||
1528
- status === "pending_queued"
1529
- );
1530
- });
1531
-
1532
- await chain.executionBuilder.registerValidator(currentEpoch, filteredRegistrations);
1533
-
1534
- logger.debug("Forwarded validator registrations to connected builder", {
1535
- epoch: currentEpoch,
1536
- count: filteredRegistrations.length,
1537
- });
1538
- },
1539
- };
1540
- }