@lodestar/beacon-node 1.35.0-dev.83de5b8dea → 1.35.0-dev.8689cc3545

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 (849) hide show
  1. package/lib/api/impl/api.d.ts.map +1 -0
  2. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -0
  3. package/lib/api/impl/beacon/blocks/utils.d.ts.map +1 -0
  4. package/lib/api/impl/beacon/index.d.ts.map +1 -0
  5. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -0
  6. package/lib/api/impl/beacon/rewards/index.d.ts.map +1 -0
  7. package/lib/api/impl/beacon/state/index.d.ts.map +1 -0
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -0
  9. package/lib/api/impl/config/constants.d.ts.map +1 -0
  10. package/lib/api/impl/config/index.d.ts.map +1 -0
  11. package/lib/api/impl/debug/index.d.ts.map +1 -0
  12. package/lib/api/impl/errors.d.ts.map +1 -0
  13. package/lib/api/impl/events/index.d.ts.map +1 -0
  14. package/lib/api/impl/index.d.ts.map +1 -0
  15. package/lib/api/impl/lightclient/index.d.ts.map +1 -0
  16. package/lib/api/impl/lodestar/index.d.ts.map +1 -0
  17. package/lib/api/impl/node/index.d.ts.map +1 -0
  18. package/lib/api/impl/node/utils.d.ts.map +1 -0
  19. package/lib/api/impl/proof/index.d.ts.map +1 -0
  20. package/lib/api/impl/types.d.ts.map +1 -0
  21. package/lib/api/impl/utils.d.ts.map +1 -0
  22. package/lib/api/impl/validator/index.d.ts.map +1 -0
  23. package/lib/api/impl/validator/utils.d.ts.map +1 -0
  24. package/lib/api/index.d.ts.map +1 -0
  25. package/lib/api/options.d.ts.map +1 -0
  26. package/lib/api/rest/activeSockets.d.ts.map +1 -0
  27. package/lib/api/rest/base.d.ts.map +1 -0
  28. package/lib/api/rest/index.d.ts.map +1 -0
  29. package/lib/api/rest/swaggerUI.d.ts.map +1 -0
  30. package/lib/bun-wrappers/prometheus-gc-stats.d.ts.map +1 -0
  31. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -0
  32. package/lib/chain/GetBlobsTracker.d.ts.map +1 -0
  33. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -0
  34. package/lib/chain/archiveStore/constants.d.ts.map +1 -0
  35. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -0
  36. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -0
  37. package/lib/chain/archiveStore/historicalState/metrics.d.ts.map +1 -0
  38. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -0
  39. package/lib/chain/archiveStore/historicalState/worker.d.ts.map +1 -0
  40. package/lib/chain/archiveStore/index.d.ts.map +1 -0
  41. package/lib/chain/archiveStore/interface.d.ts.map +1 -0
  42. package/lib/chain/archiveStore/strategies/frequencyStateArchiveStrategy.d.ts.map +1 -0
  43. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -0
  44. package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +1 -0
  45. package/lib/chain/archiveStore/utils/updateBackfillRange.d.ts.map +1 -0
  46. package/lib/chain/balancesCache.d.ts.map +1 -0
  47. package/lib/chain/beaconProposerCache.d.ts.map +1 -0
  48. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -0
  49. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -0
  50. package/lib/chain/blocks/blockInput/index.d.ts.map +1 -0
  51. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -0
  52. package/lib/chain/blocks/blockInput/utils.d.ts.map +1 -0
  53. package/lib/chain/blocks/importBlock.d.ts.map +1 -0
  54. package/lib/chain/blocks/index.d.ts.map +1 -0
  55. package/lib/chain/blocks/types.d.ts.map +1 -0
  56. package/lib/chain/blocks/utils/blowfishBanner.d.ts.map +1 -0
  57. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -0
  58. package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -0
  59. package/lib/chain/blocks/utils/giraffeBanner.d.ts.map +1 -0
  60. package/lib/chain/blocks/utils/ownBanner.d.ts.map +1 -0
  61. package/lib/chain/blocks/utils/pandaMergeTransitionBanner.d.ts.map +1 -0
  62. package/lib/chain/blocks/utils/zebraBanner.d.ts.map +1 -0
  63. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -0
  64. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -0
  65. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -0
  66. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -0
  67. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -0
  68. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -0
  69. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -0
  70. package/lib/chain/bls/index.d.ts.map +1 -0
  71. package/lib/chain/bls/interface.d.ts.map +1 -0
  72. package/lib/chain/bls/maybeBatch.d.ts.map +1 -0
  73. package/lib/chain/bls/multithread/index.d.ts.map +1 -0
  74. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -0
  75. package/lib/chain/bls/multithread/poolSize.d.ts.map +1 -0
  76. package/lib/chain/bls/multithread/types.d.ts.map +1 -0
  77. package/lib/chain/bls/multithread/utils.d.ts.map +1 -0
  78. package/lib/chain/bls/multithread/worker.d.ts.map +1 -0
  79. package/lib/chain/bls/singleThread.d.ts.map +1 -0
  80. package/lib/chain/bls/utils.d.ts.map +1 -0
  81. package/lib/chain/chain.d.ts.map +1 -0
  82. package/lib/chain/emitter.d.ts.map +1 -0
  83. package/lib/chain/errors/attestationError.d.ts.map +1 -0
  84. package/lib/chain/errors/attesterSlashingError.d.ts.map +1 -0
  85. package/lib/chain/errors/blobSidecarError.d.ts.map +1 -0
  86. package/lib/chain/errors/blockError.d.ts.map +1 -0
  87. package/lib/chain/errors/blsToExecutionChangeError.d.ts.map +1 -0
  88. package/lib/chain/errors/dataColumnSidecarError.d.ts.map +1 -0
  89. package/lib/chain/errors/gossipValidation.d.ts.map +1 -0
  90. package/lib/chain/errors/index.d.ts.map +1 -0
  91. package/lib/chain/errors/lightClientError.d.ts.map +1 -0
  92. package/lib/chain/errors/proposerSlashingError.d.ts.map +1 -0
  93. package/lib/chain/errors/syncCommitteeError.d.ts.map +1 -0
  94. package/lib/chain/errors/voluntaryExitError.d.ts.map +1 -0
  95. package/lib/chain/forkChoice/index.d.ts.map +1 -0
  96. package/lib/chain/genesis/genesis.d.ts.map +1 -0
  97. package/lib/chain/genesis/interface.d.ts.map +1 -0
  98. package/lib/chain/index.d.ts.map +1 -0
  99. package/lib/chain/initState.d.ts.map +1 -0
  100. package/lib/chain/interface.d.ts.map +1 -0
  101. package/lib/chain/lightClient/index.d.ts.map +1 -0
  102. package/lib/chain/lightClient/proofs.d.ts.map +1 -0
  103. package/lib/chain/lightClient/types.d.ts.map +1 -0
  104. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -0
  105. package/lib/chain/opPools/attestationPool.d.ts.map +1 -0
  106. package/lib/chain/opPools/index.d.ts.map +1 -0
  107. package/lib/chain/opPools/opPool.d.ts.map +1 -0
  108. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -0
  109. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -0
  110. package/lib/chain/opPools/types.d.ts.map +1 -0
  111. package/lib/chain/opPools/utils.d.ts.map +1 -0
  112. package/lib/chain/options.d.ts.map +1 -0
  113. package/lib/chain/prepareNextSlot.d.ts.map +1 -0
  114. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -0
  115. package/lib/chain/produceBlock/index.d.ts.map +1 -0
  116. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -0
  117. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts.map +1 -0
  118. package/lib/chain/regen/errors.d.ts.map +1 -0
  119. package/lib/chain/regen/index.d.ts.map +1 -0
  120. package/lib/chain/regen/interface.d.ts.map +1 -0
  121. package/lib/chain/regen/queued.d.ts.map +1 -0
  122. package/lib/chain/regen/regen.d.ts.map +1 -0
  123. package/lib/chain/reprocess.d.ts.map +1 -0
  124. package/lib/chain/rewards/attestationsRewards.d.ts.map +1 -0
  125. package/lib/chain/rewards/blockRewards.d.ts.map +1 -0
  126. package/lib/chain/rewards/syncCommitteeRewards.d.ts.map +1 -0
  127. package/lib/chain/seenCache/index.d.ts.map +1 -0
  128. package/lib/chain/seenCache/seenAggregateAndProof.d.ts.map +1 -0
  129. package/lib/chain/seenCache/seenAttestationData.d.ts.map +1 -0
  130. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -0
  131. package/lib/chain/seenCache/seenBlockAttesters.d.ts.map +1 -0
  132. package/lib/chain/seenCache/seenBlockProposers.d.ts.map +1 -0
  133. package/lib/chain/seenCache/seenCommittee.d.ts.map +1 -0
  134. package/lib/chain/seenCache/seenCommitteeContribution.d.ts.map +1 -0
  135. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -0
  136. package/lib/chain/serializeState.d.ts.map +1 -0
  137. package/lib/chain/shufflingCache.d.ts.map +1 -0
  138. package/lib/chain/stateCache/blockStateCacheImpl.d.ts.map +1 -0
  139. package/lib/chain/stateCache/datastore/db.d.ts.map +1 -0
  140. package/lib/chain/stateCache/datastore/file.d.ts.map +1 -0
  141. package/lib/chain/stateCache/datastore/index.d.ts.map +1 -0
  142. package/lib/chain/stateCache/datastore/types.d.ts.map +1 -0
  143. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -0
  144. package/lib/chain/stateCache/inMemoryCheckpointsCache.d.ts.map +1 -0
  145. package/lib/chain/stateCache/index.d.ts.map +1 -0
  146. package/lib/chain/stateCache/mapMetrics.d.ts.map +1 -0
  147. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -0
  148. package/lib/chain/stateCache/types.d.ts.map +1 -0
  149. package/lib/chain/validation/aggregateAndProof.d.ts.map +1 -0
  150. package/lib/chain/validation/attestation.d.ts.map +1 -0
  151. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -0
  152. package/lib/chain/validation/blobSidecar.d.ts.map +1 -0
  153. package/lib/chain/validation/block.d.ts.map +1 -0
  154. package/lib/chain/validation/blsToExecutionChange.d.ts.map +1 -0
  155. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -0
  156. package/lib/chain/validation/index.d.ts.map +1 -0
  157. package/lib/chain/validation/lightClientFinalityUpdate.d.ts.map +1 -0
  158. package/lib/chain/validation/lightClientOptimisticUpdate.d.ts.map +1 -0
  159. package/lib/chain/validation/proposerSlashing.d.ts.map +1 -0
  160. package/lib/chain/validation/signatureSets/aggregateAndProof.d.ts.map +1 -0
  161. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -0
  162. package/lib/chain/validation/signatureSets/index.d.ts.map +1 -0
  163. package/lib/chain/validation/signatureSets/selectionProof.d.ts.map +1 -0
  164. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -0
  165. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -0
  166. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -0
  167. package/lib/chain/validation/syncCommittee.d.ts.map +1 -0
  168. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -0
  169. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -0
  170. package/lib/chain/validatorMonitor.d.ts.map +1 -0
  171. package/lib/constants/constants.d.ts.map +1 -0
  172. package/lib/constants/index.d.ts.map +1 -0
  173. package/lib/constants/network.d.ts.map +1 -0
  174. package/lib/db/beacon.d.ts.map +1 -0
  175. package/lib/db/buckets.d.ts.map +1 -0
  176. package/lib/db/index.d.ts.map +1 -0
  177. package/lib/db/interface.d.ts.map +1 -0
  178. package/lib/db/options.d.ts.map +1 -0
  179. package/lib/db/repositories/attesterSlashing.d.ts.map +1 -0
  180. package/lib/db/repositories/backfilledRanges.d.ts.map +1 -0
  181. package/lib/db/repositories/blobSidecars.d.ts.map +1 -0
  182. package/lib/db/repositories/blobSidecarsArchive.d.ts.map +1 -0
  183. package/lib/db/repositories/block.d.ts.map +1 -0
  184. package/lib/db/repositories/blockArchive.d.ts.map +1 -0
  185. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -0
  186. package/lib/db/repositories/blsToExecutionChange.d.ts.map +1 -0
  187. package/lib/db/repositories/checkpointState.d.ts.map +1 -0
  188. package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -0
  189. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -0
  190. package/lib/db/repositories/depositDataRoot.d.ts.map +1 -0
  191. package/lib/db/repositories/depositEvent.d.ts.map +1 -0
  192. package/lib/db/repositories/eth1Data.d.ts.map +1 -0
  193. package/lib/db/repositories/index.d.ts.map +1 -0
  194. package/lib/db/repositories/lightclientBestUpdate.d.ts.map +1 -0
  195. package/lib/db/repositories/lightclientCheckpointHeader.d.ts.map +1 -0
  196. package/lib/db/repositories/lightclientSyncCommittee.d.ts.map +1 -0
  197. package/lib/db/repositories/lightclientSyncCommitteeWitness.d.ts.map +1 -0
  198. package/lib/db/repositories/proposerSlashing.d.ts.map +1 -0
  199. package/lib/db/repositories/stateArchive.d.ts.map +1 -0
  200. package/lib/db/repositories/stateArchiveIndex.d.ts.map +1 -0
  201. package/lib/db/repositories/voluntaryExit.d.ts.map +1 -0
  202. package/lib/db/single/index.d.ts.map +1 -0
  203. package/lib/db/single/preGenesisState.d.ts.map +1 -0
  204. package/lib/db/single/preGenesisStateLastProcessedBlock.d.ts.map +1 -0
  205. package/lib/eth1/errors.d.ts.map +1 -0
  206. package/lib/eth1/eth1DataCache.d.ts.map +1 -0
  207. package/lib/eth1/eth1DepositDataTracker.d.ts.map +1 -0
  208. package/lib/eth1/eth1DepositsCache.d.ts.map +1 -0
  209. package/lib/eth1/eth1MergeBlockTracker.d.ts.map +1 -0
  210. package/lib/eth1/index.d.ts.map +1 -0
  211. package/lib/eth1/interface.d.ts.map +1 -0
  212. package/lib/eth1/options.d.ts.map +1 -0
  213. package/lib/eth1/provider/eth1Provider.d.ts.map +1 -0
  214. package/lib/eth1/provider/jsonRpcHttpClient.d.ts.map +1 -0
  215. package/lib/eth1/provider/jwt.d.ts.map +1 -0
  216. package/lib/eth1/provider/utils.d.ts.map +1 -0
  217. package/lib/eth1/stream.d.ts.map +1 -0
  218. package/lib/eth1/utils/depositContract.d.ts.map +1 -0
  219. package/lib/eth1/utils/deposits.d.ts.map +1 -0
  220. package/lib/eth1/utils/eth1Data.d.ts.map +1 -0
  221. package/lib/eth1/utils/eth1DepositEvent.d.ts.map +1 -0
  222. package/lib/eth1/utils/eth1Vote.d.ts.map +1 -0
  223. package/lib/eth1/utils/groupDepositEventsByBlock.d.ts.map +1 -0
  224. package/lib/eth1/utils/optimizeNextBlockDiffForGenesis.d.ts.map +1 -0
  225. package/lib/execution/builder/cache.d.ts.map +1 -0
  226. package/lib/execution/builder/http.d.ts.map +1 -0
  227. package/lib/execution/builder/index.d.ts.map +1 -0
  228. package/lib/execution/builder/interface.d.ts.map +1 -0
  229. package/lib/execution/builder/utils.d.ts.map +1 -0
  230. package/lib/execution/engine/disabled.d.ts.map +1 -0
  231. package/lib/execution/engine/http.d.ts.map +1 -0
  232. package/lib/execution/engine/index.d.ts.map +1 -0
  233. package/lib/execution/engine/interface.d.ts.map +1 -0
  234. package/lib/execution/engine/mock.d.ts.map +1 -0
  235. package/lib/execution/engine/payloadIdCache.d.ts.map +1 -0
  236. package/lib/execution/engine/types.d.ts.map +1 -0
  237. package/lib/execution/engine/utils.d.ts.map +1 -0
  238. package/lib/execution/index.d.ts.map +1 -0
  239. package/lib/index.d.ts.map +1 -0
  240. package/lib/metrics/index.d.ts.map +1 -0
  241. package/lib/metrics/metrics/beacon.d.ts.map +1 -0
  242. package/lib/metrics/metrics/lodestar.d.ts.map +1 -0
  243. package/lib/metrics/metrics.d.ts.map +1 -0
  244. package/lib/metrics/nodeJsMetrics.d.ts.map +1 -0
  245. package/lib/metrics/options.d.ts.map +1 -0
  246. package/lib/metrics/server/http.d.ts.map +1 -0
  247. package/lib/metrics/server/index.d.ts.map +1 -0
  248. package/lib/metrics/utils/avgMinMax.d.ts.map +1 -0
  249. package/lib/metrics/utils/gauge.d.ts.map +1 -0
  250. package/lib/metrics/utils/registryMetricCreator.d.ts.map +1 -0
  251. package/lib/monitoring/clientStats.d.ts.map +1 -0
  252. package/lib/monitoring/index.d.ts.map +1 -0
  253. package/lib/monitoring/options.d.ts.map +1 -0
  254. package/lib/monitoring/properties.d.ts.map +1 -0
  255. package/lib/monitoring/service.d.ts.map +1 -0
  256. package/lib/monitoring/system.d.ts.map +1 -0
  257. package/lib/monitoring/types.d.ts.map +1 -0
  258. package/lib/network/core/events.d.ts.map +1 -0
  259. package/lib/network/core/index.d.ts.map +1 -0
  260. package/lib/network/core/metrics.d.ts.map +1 -0
  261. package/lib/network/core/networkCore.d.ts.map +1 -0
  262. package/lib/network/core/networkCoreWorker.d.ts.map +1 -0
  263. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -0
  264. package/lib/network/core/types.d.ts.map +1 -0
  265. package/lib/network/discv5/index.d.ts.map +1 -0
  266. package/lib/network/discv5/types.d.ts.map +1 -0
  267. package/lib/network/discv5/utils.d.ts.map +1 -0
  268. package/lib/network/discv5/worker.d.ts.map +1 -0
  269. package/lib/network/events.d.ts.map +1 -0
  270. package/lib/network/forks.d.ts.map +1 -0
  271. package/lib/network/gossip/constants.d.ts.map +1 -0
  272. package/lib/network/gossip/encoding.d.ts.map +1 -0
  273. package/lib/network/gossip/errors.d.ts.map +1 -0
  274. package/lib/network/gossip/gossipsub.d.ts.map +1 -0
  275. package/lib/network/gossip/index.d.ts.map +1 -0
  276. package/lib/network/gossip/interface.d.ts.map +1 -0
  277. package/lib/network/gossip/metrics.d.ts.map +1 -0
  278. package/lib/network/gossip/scoringParameters.d.ts.map +1 -0
  279. package/lib/network/gossip/topic.d.ts.map +1 -0
  280. package/lib/network/index.d.ts.map +1 -0
  281. package/lib/network/interface.d.ts.map +1 -0
  282. package/lib/network/libp2p/error.d.ts.map +1 -0
  283. package/lib/network/libp2p/index.d.ts.map +1 -0
  284. package/lib/network/metadata.d.ts.map +1 -0
  285. package/lib/network/network.d.ts.map +1 -0
  286. package/lib/network/networkConfig.d.ts.map +1 -0
  287. package/lib/network/options.d.ts.map +1 -0
  288. package/lib/network/peers/client.d.ts.map +1 -0
  289. package/lib/network/peers/datastore.d.ts.map +1 -0
  290. package/lib/network/peers/discover.d.ts.map +1 -0
  291. package/lib/network/peers/index.d.ts.map +1 -0
  292. package/lib/network/peers/peerManager.d.ts.map +1 -0
  293. package/lib/network/peers/peersData.d.ts.map +1 -0
  294. package/lib/network/peers/score/constants.d.ts.map +1 -0
  295. package/lib/network/peers/score/index.d.ts.map +1 -0
  296. package/lib/network/peers/score/interface.d.ts.map +1 -0
  297. package/lib/network/peers/score/score.d.ts.map +1 -0
  298. package/lib/network/peers/score/store.d.ts.map +1 -0
  299. package/lib/network/peers/score/utils.d.ts.map +1 -0
  300. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -0
  301. package/lib/network/peers/utils/enrSubnetsDeserialize.d.ts.map +1 -0
  302. package/lib/network/peers/utils/getConnectedPeerIds.d.ts.map +1 -0
  303. package/lib/network/peers/utils/index.d.ts.map +1 -0
  304. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -0
  305. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -0
  306. package/lib/network/processor/aggregatorTracker.d.ts.map +1 -0
  307. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -0
  308. package/lib/network/processor/gossipHandlers.d.ts.map +1 -0
  309. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -0
  310. package/lib/network/processor/gossipQueues/indexed.d.ts.map +1 -0
  311. package/lib/network/processor/gossipQueues/linear.d.ts.map +1 -0
  312. package/lib/network/processor/gossipQueues/types.d.ts.map +1 -0
  313. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -0
  314. package/lib/network/processor/index.d.ts.map +1 -0
  315. package/lib/network/processor/types.d.ts.map +1 -0
  316. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -0
  317. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -0
  318. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts.map +1 -0
  319. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -0
  320. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +1 -0
  321. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -0
  322. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts.map +1 -0
  323. package/lib/network/reqresp/handlers/index.d.ts.map +1 -0
  324. package/lib/network/reqresp/handlers/lightClientBootstrap.d.ts.map +1 -0
  325. package/lib/network/reqresp/handlers/lightClientFinalityUpdate.d.ts.map +1 -0
  326. package/lib/network/reqresp/handlers/lightClientOptimisticUpdate.d.ts.map +1 -0
  327. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.d.ts.map +1 -0
  328. package/lib/network/reqresp/index.d.ts.map +1 -0
  329. package/lib/network/reqresp/interface.d.ts.map +1 -0
  330. package/lib/network/reqresp/protocols.d.ts.map +1 -0
  331. package/lib/network/reqresp/rateLimit.d.ts.map +1 -0
  332. package/lib/network/reqresp/score.d.ts.map +1 -0
  333. package/lib/network/reqresp/types.d.ts.map +1 -0
  334. package/lib/network/reqresp/utils/collect.d.ts.map +1 -0
  335. package/lib/network/reqresp/utils/collectSequentialBlocksInRange.d.ts.map +1 -0
  336. package/lib/network/reqresp/utils/dataColumnResponseValidation.d.ts.map +1 -0
  337. package/lib/network/statusCache.d.ts.map +1 -0
  338. package/lib/network/subnets/attnetsService.d.ts.map +1 -0
  339. package/lib/network/subnets/index.d.ts.map +1 -0
  340. package/lib/network/subnets/interface.d.ts.map +1 -0
  341. package/lib/network/subnets/syncnetsService.d.ts.map +1 -0
  342. package/lib/network/subnets/util.d.ts.map +1 -0
  343. package/lib/network/util.d.ts.map +1 -0
  344. package/lib/node/index.d.ts.map +1 -0
  345. package/lib/node/nodejs.d.ts.map +1 -0
  346. package/lib/node/notifier.d.ts.map +1 -0
  347. package/lib/node/options.d.ts.map +1 -0
  348. package/lib/node/utils/interop/deposits.d.ts.map +1 -0
  349. package/lib/node/utils/interop/state.d.ts.map +1 -0
  350. package/lib/node/utils/lightclient.d.ts.map +1 -0
  351. package/lib/node/utils/state.d.ts.map +1 -0
  352. package/lib/sync/backfill/backfill.d.ts.map +1 -0
  353. package/lib/sync/backfill/errors.d.ts.map +1 -0
  354. package/lib/sync/backfill/index.d.ts.map +1 -0
  355. package/lib/sync/backfill/verify.d.ts.map +1 -0
  356. package/lib/sync/constants.d.ts.map +1 -0
  357. package/lib/sync/index.d.ts.map +1 -0
  358. package/lib/sync/interface.d.ts.map +1 -0
  359. package/lib/sync/options.d.ts.map +1 -0
  360. package/lib/sync/range/batch.d.ts.map +1 -0
  361. package/lib/sync/range/chain.d.ts.map +1 -0
  362. package/lib/sync/range/range.d.ts.map +1 -0
  363. package/lib/sync/range/utils/batches.d.ts.map +1 -0
  364. package/lib/sync/range/utils/chainTarget.d.ts.map +1 -0
  365. package/lib/sync/range/utils/hashBlocks.d.ts.map +1 -0
  366. package/lib/sync/range/utils/index.d.ts.map +1 -0
  367. package/lib/sync/range/utils/peerBalancer.d.ts.map +1 -0
  368. package/lib/sync/range/utils/updateChains.d.ts.map +1 -0
  369. package/lib/sync/sync.d.ts.map +1 -0
  370. package/lib/sync/types.d.ts.map +1 -0
  371. package/lib/sync/unknownBlock.d.ts.map +1 -0
  372. package/lib/sync/utils/downloadByRange.d.ts.map +1 -0
  373. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -0
  374. package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -0
  375. package/lib/sync/utils/remoteSyncType.d.ts.map +1 -0
  376. package/lib/util/address.d.ts.map +1 -0
  377. package/lib/util/array.d.ts.map +1 -0
  378. package/lib/util/asyncIterableToEvents.d.ts.map +1 -0
  379. package/lib/util/binarySearch.d.ts.map +1 -0
  380. package/lib/util/bitArray.d.ts.map +1 -0
  381. package/lib/util/blobs.d.ts.map +1 -0
  382. package/lib/util/blobs.js +5 -3
  383. package/lib/util/blobs.js.map +1 -1
  384. package/lib/util/bufferPool.d.ts.map +1 -0
  385. package/lib/util/bytes.d.ts.map +1 -0
  386. package/lib/util/chunkify.d.ts.map +1 -0
  387. package/lib/util/clock.d.ts.map +1 -0
  388. package/lib/util/dataColumns.d.ts.map +1 -0
  389. package/lib/util/dependentRoot.d.ts.map +1 -0
  390. package/lib/util/enum.d.ts.map +1 -0
  391. package/lib/util/error.d.ts.map +1 -0
  392. package/lib/util/eventLoop.d.ts.map +1 -0
  393. package/lib/util/execution.d.ts.map +1 -0
  394. package/lib/util/file.d.ts.map +1 -0
  395. package/lib/util/forkChoice.d.ts.map +1 -0
  396. package/lib/util/forkName.d.ts.map +1 -0
  397. package/lib/util/graffiti.d.ts.map +1 -0
  398. package/lib/util/hex.d.ts.map +1 -0
  399. package/lib/util/index.d.ts.map +1 -0
  400. package/lib/util/ip.d.ts.map +1 -0
  401. package/lib/util/itTrigger.d.ts.map +1 -0
  402. package/lib/util/kzg.d.ts.map +1 -0
  403. package/lib/util/map.d.ts.map +1 -0
  404. package/lib/util/metadata.d.ts.map +1 -0
  405. package/lib/util/multifork.d.ts.map +1 -0
  406. package/lib/util/numpy.d.ts.map +1 -0
  407. package/lib/util/peerId.d.ts.map +1 -0
  408. package/lib/util/profile.d.ts.map +1 -0
  409. package/lib/util/promises.d.ts.map +1 -0
  410. package/lib/util/queue/errors.d.ts.map +1 -0
  411. package/lib/util/queue/fnQueue.d.ts.map +1 -0
  412. package/lib/util/queue/index.d.ts.map +1 -0
  413. package/lib/util/queue/itemQueue.d.ts.map +1 -0
  414. package/lib/util/queue/options.d.ts.map +1 -0
  415. package/lib/util/serializedCache.d.ts.map +1 -0
  416. package/lib/util/set.d.ts.map +1 -0
  417. package/lib/util/shuffle.d.ts.map +1 -0
  418. package/lib/util/sortBy.d.ts.map +1 -0
  419. package/lib/util/sszBytes.d.ts.map +1 -0
  420. package/lib/util/strictEvents.d.ts.map +1 -0
  421. package/lib/util/time.d.ts.map +1 -0
  422. package/lib/util/timeSeries.d.ts.map +1 -0
  423. package/lib/util/types.d.ts.map +1 -0
  424. package/lib/util/workerEvents.d.ts.map +1 -0
  425. package/lib/util/wrapError.d.ts.map +1 -0
  426. package/package.json +17 -19
  427. package/src/api/impl/api.ts +26 -0
  428. package/src/api/impl/beacon/blocks/index.ts +744 -0
  429. package/src/api/impl/beacon/blocks/utils.ts +75 -0
  430. package/src/api/impl/beacon/index.ts +35 -0
  431. package/src/api/impl/beacon/pool/index.ts +314 -0
  432. package/src/api/impl/beacon/rewards/index.ts +30 -0
  433. package/src/api/impl/beacon/state/index.ts +406 -0
  434. package/src/api/impl/beacon/state/utils.ts +189 -0
  435. package/src/api/impl/config/constants.ts +127 -0
  436. package/src/api/impl/config/index.ts +59 -0
  437. package/src/api/impl/debug/index.ts +131 -0
  438. package/src/api/impl/errors.ts +50 -0
  439. package/src/api/impl/events/index.ts +33 -0
  440. package/src/api/impl/index.ts +6 -0
  441. package/src/api/impl/lightclient/index.ts +64 -0
  442. package/src/api/impl/lodestar/index.ts +257 -0
  443. package/src/api/impl/node/index.ts +88 -0
  444. package/src/api/impl/node/utils.ts +51 -0
  445. package/src/api/impl/proof/index.ts +60 -0
  446. package/src/api/impl/types.ts +17 -0
  447. package/src/api/impl/utils.ts +25 -0
  448. package/src/api/impl/validator/index.ts +1538 -0
  449. package/src/api/impl/validator/utils.ts +85 -0
  450. package/src/api/index.ts +2 -0
  451. package/src/api/options.ts +16 -0
  452. package/src/api/rest/activeSockets.ts +109 -0
  453. package/src/api/rest/base.ts +216 -0
  454. package/src/api/rest/index.ts +63 -0
  455. package/src/api/rest/swaggerUI.ts +80 -0
  456. package/src/bun-wrappers/prometheus-gc-stats.ts +7 -0
  457. package/src/chain/ColumnReconstructionTracker.ts +90 -0
  458. package/src/chain/GetBlobsTracker.ts +115 -0
  459. package/src/chain/archiveStore/archiveStore.ts +222 -0
  460. package/src/chain/archiveStore/constants.ts +5 -0
  461. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +116 -0
  462. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +68 -0
  463. package/src/chain/archiveStore/historicalState/metrics.ts +214 -0
  464. package/src/chain/archiveStore/historicalState/types.ts +41 -0
  465. package/src/chain/archiveStore/historicalState/worker.ts +77 -0
  466. package/src/chain/archiveStore/index.ts +3 -0
  467. package/src/chain/archiveStore/interface.ts +75 -0
  468. package/src/chain/archiveStore/strategies/frequencyStateArchiveStrategy.ts +138 -0
  469. package/src/chain/archiveStore/utils/archiveBlocks.ts +437 -0
  470. package/src/chain/archiveStore/utils/pruneHistory.ts +56 -0
  471. package/src/chain/archiveStore/utils/updateBackfillRange.ts +50 -0
  472. package/src/chain/balancesCache.ts +52 -0
  473. package/src/chain/beaconProposerCache.ts +43 -0
  474. package/src/chain/blocks/blockInput/blockInput.ts +851 -0
  475. package/src/chain/blocks/blockInput/errors.ts +48 -0
  476. package/src/chain/blocks/blockInput/index.ts +4 -0
  477. package/src/chain/blocks/blockInput/types.ts +145 -0
  478. package/src/chain/blocks/blockInput/utils.ts +21 -0
  479. package/src/chain/blocks/importBlock.ts +603 -0
  480. package/src/chain/blocks/index.ts +179 -0
  481. package/src/chain/blocks/types.ts +101 -0
  482. package/src/chain/blocks/utils/blowfishBanner.ts +28 -0
  483. package/src/chain/blocks/utils/chainSegment.ts +29 -0
  484. package/src/chain/blocks/utils/checkpoint.ts +25 -0
  485. package/src/chain/blocks/utils/giraffeBanner.ts +30 -0
  486. package/src/chain/blocks/utils/ownBanner.ts +20 -0
  487. package/src/chain/blocks/utils/pandaMergeTransitionBanner.ts +43 -0
  488. package/src/chain/blocks/utils/zebraBanner.ts +45 -0
  489. package/src/chain/blocks/verifyBlock.ts +242 -0
  490. package/src/chain/blocks/verifyBlocksDataAvailability.ts +34 -0
  491. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +438 -0
  492. package/src/chain/blocks/verifyBlocksSanityChecks.ts +129 -0
  493. package/src/chain/blocks/verifyBlocksSignatures.ts +105 -0
  494. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +114 -0
  495. package/src/chain/blocks/writeBlockInputToDb.ts +128 -0
  496. package/src/chain/bls/index.ts +4 -0
  497. package/src/chain/bls/interface.ts +68 -0
  498. package/src/chain/bls/maybeBatch.ts +45 -0
  499. package/src/chain/bls/multithread/index.ts +582 -0
  500. package/src/chain/bls/multithread/jobItem.ts +119 -0
  501. package/src/chain/bls/multithread/poolSize.ts +16 -0
  502. package/src/chain/bls/multithread/types.ts +38 -0
  503. package/src/chain/bls/multithread/utils.ts +19 -0
  504. package/src/chain/bls/multithread/worker.ts +114 -0
  505. package/src/chain/bls/singleThread.ts +87 -0
  506. package/src/chain/bls/utils.ts +30 -0
  507. package/src/chain/chain.ts +1365 -0
  508. package/src/chain/emitter.ts +113 -0
  509. package/src/chain/errors/attestationError.ts +194 -0
  510. package/src/chain/errors/attesterSlashingError.ts +11 -0
  511. package/src/chain/errors/blobSidecarError.ts +60 -0
  512. package/src/chain/errors/blockError.ts +166 -0
  513. package/src/chain/errors/blsToExecutionChangeError.ts +13 -0
  514. package/src/chain/errors/dataColumnSidecarError.ts +80 -0
  515. package/src/chain/errors/gossipValidation.ts +20 -0
  516. package/src/chain/errors/index.ts +10 -0
  517. package/src/chain/errors/lightClientError.ts +30 -0
  518. package/src/chain/errors/proposerSlashingError.ts +11 -0
  519. package/src/chain/errors/syncCommitteeError.ts +36 -0
  520. package/src/chain/errors/voluntaryExitError.ts +13 -0
  521. package/src/chain/forkChoice/index.ts +112 -0
  522. package/src/chain/genesis/genesis.ts +190 -0
  523. package/src/chain/genesis/interface.ts +14 -0
  524. package/src/chain/index.ts +6 -0
  525. package/src/chain/initState.ts +221 -0
  526. package/src/chain/interface.ts +280 -0
  527. package/src/chain/lightClient/index.ts +764 -0
  528. package/src/chain/lightClient/proofs.ts +85 -0
  529. package/src/chain/lightClient/types.ts +33 -0
  530. package/src/chain/opPools/aggregatedAttestationPool.ts +1063 -0
  531. package/src/chain/opPools/attestationPool.ts +283 -0
  532. package/src/chain/opPools/index.ts +5 -0
  533. package/src/chain/opPools/opPool.ts +462 -0
  534. package/src/chain/opPools/syncCommitteeMessagePool.ts +167 -0
  535. package/src/chain/opPools/syncContributionAndProofPool.ts +240 -0
  536. package/src/chain/opPools/types.ts +35 -0
  537. package/src/chain/opPools/utils.ts +65 -0
  538. package/src/chain/options.ts +138 -0
  539. package/src/chain/prepareNextSlot.ts +277 -0
  540. package/src/chain/produceBlock/computeNewStateRoot.ts +55 -0
  541. package/src/chain/produceBlock/index.ts +2 -0
  542. package/src/chain/produceBlock/produceBlockBody.ts +797 -0
  543. package/src/chain/produceBlock/validateBlobsAndKzgCommitments.ts +54 -0
  544. package/src/chain/regen/errors.ts +30 -0
  545. package/src/chain/regen/index.ts +4 -0
  546. package/src/chain/regen/interface.ts +93 -0
  547. package/src/chain/regen/queued.ts +317 -0
  548. package/src/chain/regen/regen.ts +424 -0
  549. package/src/chain/reprocess.ts +161 -0
  550. package/src/chain/rewards/attestationsRewards.ts +196 -0
  551. package/src/chain/rewards/blockRewards.ts +150 -0
  552. package/src/chain/rewards/syncCommitteeRewards.ts +58 -0
  553. package/src/chain/seenCache/index.ts +5 -0
  554. package/src/chain/seenCache/seenAggregateAndProof.ts +120 -0
  555. package/src/chain/seenCache/seenAttestationData.ts +145 -0
  556. package/src/chain/seenCache/seenAttesters.ts +58 -0
  557. package/src/chain/seenCache/seenBlockAttesters.ts +18 -0
  558. package/src/chain/seenCache/seenBlockProposers.ts +48 -0
  559. package/src/chain/seenCache/seenCommittee.ts +43 -0
  560. package/src/chain/seenCache/seenCommitteeContribution.ts +104 -0
  561. package/src/chain/seenCache/seenGossipBlockInput.ts +373 -0
  562. package/src/chain/serializeState.ts +32 -0
  563. package/src/chain/shufflingCache.ts +238 -0
  564. package/src/chain/stateCache/blockStateCacheImpl.ts +150 -0
  565. package/src/chain/stateCache/datastore/db.ts +36 -0
  566. package/src/chain/stateCache/datastore/file.ts +53 -0
  567. package/src/chain/stateCache/datastore/index.ts +2 -0
  568. package/src/chain/stateCache/datastore/types.ts +13 -0
  569. package/src/chain/stateCache/fifoBlockStateCache.ts +208 -0
  570. package/src/chain/stateCache/inMemoryCheckpointsCache.ts +198 -0
  571. package/src/chain/stateCache/index.ts +3 -0
  572. package/src/chain/stateCache/mapMetrics.ts +52 -0
  573. package/src/chain/stateCache/persistentCheckpointsCache.ts +835 -0
  574. package/src/chain/stateCache/types.ts +86 -0
  575. package/src/chain/validation/aggregateAndProof.ts +258 -0
  576. package/src/chain/validation/attestation.ts +885 -0
  577. package/src/chain/validation/attesterSlashing.ts +61 -0
  578. package/src/chain/validation/blobSidecar.ts +301 -0
  579. package/src/chain/validation/block.ts +188 -0
  580. package/src/chain/validation/blsToExecutionChange.ts +61 -0
  581. package/src/chain/validation/dataColumnSidecar.ts +381 -0
  582. package/src/chain/validation/index.ts +9 -0
  583. package/src/chain/validation/lightClientFinalityUpdate.ts +45 -0
  584. package/src/chain/validation/lightClientOptimisticUpdate.ts +67 -0
  585. package/src/chain/validation/proposerSlashing.ts +54 -0
  586. package/src/chain/validation/signatureSets/aggregateAndProof.ts +38 -0
  587. package/src/chain/validation/signatureSets/contributionAndProof.ts +27 -0
  588. package/src/chain/validation/signatureSets/index.ts +6 -0
  589. package/src/chain/validation/signatureSets/selectionProof.ts +27 -0
  590. package/src/chain/validation/signatureSets/syncCommittee.ts +22 -0
  591. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +18 -0
  592. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +27 -0
  593. package/src/chain/validation/syncCommittee.ts +165 -0
  594. package/src/chain/validation/syncCommitteeContributionAndProof.ts +122 -0
  595. package/src/chain/validation/voluntaryExit.ts +58 -0
  596. package/src/chain/validatorMonitor.ts +1299 -0
  597. package/src/constants/constants.ts +15 -0
  598. package/src/constants/index.ts +2 -0
  599. package/src/constants/network.ts +52 -0
  600. package/src/db/beacon.ts +113 -0
  601. package/src/db/buckets.ts +80 -0
  602. package/src/db/index.ts +2 -0
  603. package/src/db/interface.ts +76 -0
  604. package/src/db/options.ts +7 -0
  605. package/src/db/repositories/attesterSlashing.ts +38 -0
  606. package/src/db/repositories/backfilledRanges.ts +29 -0
  607. package/src/db/repositories/blobSidecars.ts +37 -0
  608. package/src/db/repositories/blobSidecarsArchive.ts +28 -0
  609. package/src/db/repositories/block.ts +33 -0
  610. package/src/db/repositories/blockArchive.ts +170 -0
  611. package/src/db/repositories/blockArchiveIndex.ts +45 -0
  612. package/src/db/repositories/blsToExecutionChange.ts +16 -0
  613. package/src/db/repositories/checkpointState.ts +31 -0
  614. package/src/db/repositories/dataColumnSidecar.ts +49 -0
  615. package/src/db/repositories/dataColumnSidecarArchive.ts +56 -0
  616. package/src/db/repositories/depositDataRoot.ts +80 -0
  617. package/src/db/repositories/depositEvent.ts +32 -0
  618. package/src/db/repositories/eth1Data.ts +33 -0
  619. package/src/db/repositories/index.ts +20 -0
  620. package/src/db/repositories/lightclientBestUpdate.ts +41 -0
  621. package/src/db/repositories/lightclientCheckpointHeader.ts +32 -0
  622. package/src/db/repositories/lightclientSyncCommittee.ts +16 -0
  623. package/src/db/repositories/lightclientSyncCommitteeWitness.ts +77 -0
  624. package/src/db/repositories/proposerSlashing.ts +15 -0
  625. package/src/db/repositories/stateArchive.ts +69 -0
  626. package/src/db/repositories/stateArchiveIndex.ts +18 -0
  627. package/src/db/repositories/voluntaryExit.ts +15 -0
  628. package/src/db/single/index.ts +2 -0
  629. package/src/db/single/preGenesisState.ts +37 -0
  630. package/src/db/single/preGenesisStateLastProcessedBlock.ts +34 -0
  631. package/src/eth1/errors.ts +40 -0
  632. package/src/eth1/eth1DataCache.ts +26 -0
  633. package/src/eth1/eth1DepositDataTracker.ts +410 -0
  634. package/src/eth1/eth1DepositsCache.ts +141 -0
  635. package/src/eth1/eth1MergeBlockTracker.ts +328 -0
  636. package/src/eth1/index.ts +157 -0
  637. package/src/eth1/interface.ts +131 -0
  638. package/src/eth1/options.ts +28 -0
  639. package/src/eth1/provider/eth1Provider.ts +229 -0
  640. package/src/eth1/provider/jsonRpcHttpClient.ts +390 -0
  641. package/src/eth1/provider/jwt.ts +36 -0
  642. package/src/eth1/provider/utils.ts +136 -0
  643. package/src/eth1/stream.ts +75 -0
  644. package/src/eth1/utils/depositContract.ts +37 -0
  645. package/src/eth1/utils/deposits.ts +70 -0
  646. package/src/eth1/utils/eth1Data.ts +100 -0
  647. package/src/eth1/utils/eth1DepositEvent.ts +12 -0
  648. package/src/eth1/utils/eth1Vote.ts +142 -0
  649. package/src/eth1/utils/groupDepositEventsByBlock.ts +19 -0
  650. package/src/eth1/utils/optimizeNextBlockDiffForGenesis.ts +18 -0
  651. package/src/execution/builder/cache.ts +39 -0
  652. package/src/execution/builder/http.ts +229 -0
  653. package/src/execution/builder/index.ts +27 -0
  654. package/src/execution/builder/interface.ts +49 -0
  655. package/src/execution/builder/utils.ts +19 -0
  656. package/src/execution/engine/disabled.ts +35 -0
  657. package/src/execution/engine/http.ts +644 -0
  658. package/src/execution/engine/index.ts +63 -0
  659. package/src/execution/engine/interface.ts +199 -0
  660. package/src/execution/engine/mock.ts +493 -0
  661. package/src/execution/engine/payloadIdCache.ts +54 -0
  662. package/src/execution/engine/types.ts +640 -0
  663. package/src/execution/engine/utils.ts +136 -0
  664. package/src/execution/index.ts +4 -0
  665. package/src/index.ts +20 -0
  666. package/src/metrics/index.ts +4 -0
  667. package/src/metrics/metrics/beacon.ts +390 -0
  668. package/src/metrics/metrics/lodestar.ts +1870 -0
  669. package/src/metrics/metrics.ts +43 -0
  670. package/src/metrics/nodeJsMetrics.ts +19 -0
  671. package/src/metrics/options.ts +22 -0
  672. package/src/metrics/server/http.ts +114 -0
  673. package/src/metrics/server/index.ts +1 -0
  674. package/src/metrics/utils/avgMinMax.ts +87 -0
  675. package/src/metrics/utils/gauge.ts +22 -0
  676. package/src/metrics/utils/registryMetricCreator.ts +41 -0
  677. package/src/monitoring/clientStats.ts +297 -0
  678. package/src/monitoring/index.ts +2 -0
  679. package/src/monitoring/options.ts +19 -0
  680. package/src/monitoring/properties.ts +152 -0
  681. package/src/monitoring/service.ts +235 -0
  682. package/src/monitoring/system.ts +146 -0
  683. package/src/monitoring/types.ts +21 -0
  684. package/src/network/core/events.ts +59 -0
  685. package/src/network/core/index.ts +3 -0
  686. package/src/network/core/metrics.ts +304 -0
  687. package/src/network/core/networkCore.ts +599 -0
  688. package/src/network/core/networkCoreWorker.ts +176 -0
  689. package/src/network/core/networkCoreWorkerHandler.ts +284 -0
  690. package/src/network/core/types.ts +119 -0
  691. package/src/network/discv5/index.ts +132 -0
  692. package/src/network/discv5/types.ts +74 -0
  693. package/src/network/discv5/utils.ts +50 -0
  694. package/src/network/discv5/worker.ts +137 -0
  695. package/src/network/events.ts +51 -0
  696. package/src/network/forks.ts +94 -0
  697. package/src/network/gossip/constants.ts +15 -0
  698. package/src/network/gossip/encoding.ts +111 -0
  699. package/src/network/gossip/errors.ts +7 -0
  700. package/src/network/gossip/gossipsub.ts +384 -0
  701. package/src/network/gossip/index.ts +4 -0
  702. package/src/network/gossip/interface.ts +215 -0
  703. package/src/network/gossip/metrics.ts +71 -0
  704. package/src/network/gossip/scoringParameters.ts +333 -0
  705. package/src/network/gossip/topic.ts +332 -0
  706. package/src/network/index.ts +8 -0
  707. package/src/network/interface.ts +134 -0
  708. package/src/network/libp2p/error.ts +55 -0
  709. package/src/network/libp2p/index.ts +153 -0
  710. package/src/network/metadata.ts +162 -0
  711. package/src/network/network.ts +767 -0
  712. package/src/network/networkConfig.ts +12 -0
  713. package/src/network/options.ts +70 -0
  714. package/src/network/peers/client.ts +29 -0
  715. package/src/network/peers/datastore.ts +188 -0
  716. package/src/network/peers/discover.ts +647 -0
  717. package/src/network/peers/index.ts +2 -0
  718. package/src/network/peers/peerManager.ts +899 -0
  719. package/src/network/peers/peersData.ts +65 -0
  720. package/src/network/peers/score/constants.ts +34 -0
  721. package/src/network/peers/score/index.ts +4 -0
  722. package/src/network/peers/score/interface.ts +74 -0
  723. package/src/network/peers/score/score.ts +200 -0
  724. package/src/network/peers/score/store.ts +95 -0
  725. package/src/network/peers/score/utils.ts +37 -0
  726. package/src/network/peers/utils/assertPeerRelevance.ts +99 -0
  727. package/src/network/peers/utils/enrSubnetsDeserialize.ts +27 -0
  728. package/src/network/peers/utils/getConnectedPeerIds.ts +33 -0
  729. package/src/network/peers/utils/index.ts +4 -0
  730. package/src/network/peers/utils/prioritizePeers.ts +627 -0
  731. package/src/network/peers/utils/subnetMap.ts +88 -0
  732. package/src/network/processor/aggregatorTracker.ts +38 -0
  733. package/src/network/processor/extractSlotRootFns.ts +64 -0
  734. package/src/network/processor/gossipHandlers.ts +951 -0
  735. package/src/network/processor/gossipQueues/index.ts +114 -0
  736. package/src/network/processor/gossipQueues/indexed.ts +219 -0
  737. package/src/network/processor/gossipQueues/linear.ts +162 -0
  738. package/src/network/processor/gossipQueues/types.ts +57 -0
  739. package/src/network/processor/gossipValidatorFn.ts +142 -0
  740. package/src/network/processor/index.ts +497 -0
  741. package/src/network/processor/types.ts +27 -0
  742. package/src/network/reqresp/ReqRespBeaconNode.ts +373 -0
  743. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +101 -0
  744. package/src/network/reqresp/handlers/beaconBlocksByRoot.ts +49 -0
  745. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +114 -0
  746. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +62 -0
  747. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +144 -0
  748. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +88 -0
  749. package/src/network/reqresp/handlers/index.ts +78 -0
  750. package/src/network/reqresp/handlers/lightClientBootstrap.ts +31 -0
  751. package/src/network/reqresp/handlers/lightClientFinalityUpdate.ts +21 -0
  752. package/src/network/reqresp/handlers/lightClientOptimisticUpdate.ts +21 -0
  753. package/src/network/reqresp/handlers/lightClientUpdatesByRange.ts +39 -0
  754. package/src/network/reqresp/index.ts +2 -0
  755. package/src/network/reqresp/interface.ts +45 -0
  756. package/src/network/reqresp/protocols.ts +146 -0
  757. package/src/network/reqresp/rateLimit.ts +112 -0
  758. package/src/network/reqresp/score.ts +70 -0
  759. package/src/network/reqresp/types.ts +174 -0
  760. package/src/network/reqresp/utils/collect.ts +84 -0
  761. package/src/network/reqresp/utils/collectSequentialBlocksInRange.ts +57 -0
  762. package/src/network/reqresp/utils/dataColumnResponseValidation.ts +99 -0
  763. package/src/network/statusCache.ts +17 -0
  764. package/src/network/subnets/attnetsService.ts +385 -0
  765. package/src/network/subnets/index.ts +2 -0
  766. package/src/network/subnets/interface.ts +66 -0
  767. package/src/network/subnets/syncnetsService.ts +147 -0
  768. package/src/network/subnets/util.ts +63 -0
  769. package/src/network/util.ts +29 -0
  770. package/src/node/index.ts +2 -0
  771. package/src/node/nodejs.ts +349 -0
  772. package/src/node/notifier.ts +206 -0
  773. package/src/node/options.ts +51 -0
  774. package/src/node/utils/interop/deposits.ts +53 -0
  775. package/src/node/utils/interop/state.ts +59 -0
  776. package/src/node/utils/lightclient.ts +7 -0
  777. package/src/node/utils/state.ts +37 -0
  778. package/src/sync/backfill/backfill.ts +893 -0
  779. package/src/sync/backfill/errors.ts +23 -0
  780. package/src/sync/backfill/index.ts +1 -0
  781. package/src/sync/backfill/verify.ts +58 -0
  782. package/src/sync/constants.ts +71 -0
  783. package/src/sync/index.ts +2 -0
  784. package/src/sync/interface.ts +55 -0
  785. package/src/sync/options.ts +45 -0
  786. package/src/sync/range/batch.ts +455 -0
  787. package/src/sync/range/chain.ts +715 -0
  788. package/src/sync/range/range.ts +354 -0
  789. package/src/sync/range/utils/batches.ts +119 -0
  790. package/src/sync/range/utils/chainTarget.ts +62 -0
  791. package/src/sync/range/utils/hashBlocks.ts +27 -0
  792. package/src/sync/range/utils/index.ts +5 -0
  793. package/src/sync/range/utils/peerBalancer.ts +184 -0
  794. package/src/sync/range/utils/updateChains.ts +66 -0
  795. package/src/sync/sync.ts +290 -0
  796. package/src/sync/types.ts +59 -0
  797. package/src/sync/unknownBlock.ts +862 -0
  798. package/src/sync/utils/downloadByRange.ts +808 -0
  799. package/src/sync/utils/downloadByRoot.ts +560 -0
  800. package/src/sync/utils/pendingBlocksTree.ts +97 -0
  801. package/src/sync/utils/remoteSyncType.ts +144 -0
  802. package/src/util/address.ts +3 -0
  803. package/src/util/array.ts +311 -0
  804. package/src/util/asyncIterableToEvents.ts +164 -0
  805. package/src/util/binarySearch.ts +48 -0
  806. package/src/util/bitArray.ts +84 -0
  807. package/src/util/blobs.ts +210 -0
  808. package/src/util/bufferPool.ts +95 -0
  809. package/src/util/bytes.ts +11 -0
  810. package/src/util/chunkify.ts +27 -0
  811. package/src/util/clock.ts +204 -0
  812. package/src/util/dataColumns.ts +415 -0
  813. package/src/util/dependentRoot.ts +47 -0
  814. package/src/util/enum.ts +17 -0
  815. package/src/util/error.ts +56 -0
  816. package/src/util/eventLoop.ts +22 -0
  817. package/src/util/execution.ts +223 -0
  818. package/src/util/file.ts +52 -0
  819. package/src/util/forkChoice.ts +5 -0
  820. package/src/util/forkName.ts +20 -0
  821. package/src/util/graffiti.ts +39 -0
  822. package/src/util/hex.ts +9 -0
  823. package/src/util/index.ts +2 -0
  824. package/src/util/ip.ts +6 -0
  825. package/src/util/itTrigger.ts +49 -0
  826. package/src/util/kzg.ts +3 -0
  827. package/src/util/map.ts +77 -0
  828. package/src/util/metadata.ts +22 -0
  829. package/src/util/multifork.ts +69 -0
  830. package/src/util/numpy.ts +8 -0
  831. package/src/util/peerId.ts +16 -0
  832. package/src/util/profile.ts +54 -0
  833. package/src/util/promises.ts +14 -0
  834. package/src/util/queue/errors.ts +14 -0
  835. package/src/util/queue/fnQueue.ts +16 -0
  836. package/src/util/queue/index.ts +4 -0
  837. package/src/util/queue/itemQueue.ts +128 -0
  838. package/src/util/queue/options.ts +37 -0
  839. package/src/util/serializedCache.ts +20 -0
  840. package/src/util/set.ts +62 -0
  841. package/src/util/shuffle.ts +21 -0
  842. package/src/util/sortBy.ts +19 -0
  843. package/src/util/sszBytes.ts +481 -0
  844. package/src/util/strictEvents.ts +8 -0
  845. package/src/util/time.ts +13 -0
  846. package/src/util/timeSeries.ts +118 -0
  847. package/src/util/types.ts +31 -0
  848. package/src/util/workerEvents.ts +142 -0
  849. package/src/util/wrapError.ts +27 -0
@@ -0,0 +1,862 @@
1
+ import {ChainForkConfig} from "@lodestar/config";
2
+ import {ForkSeq, INTERVALS_PER_SLOT} from "@lodestar/params";
3
+ import {RequestError, RequestErrorCode} from "@lodestar/reqresp";
4
+ import {RootHex, Slot} from "@lodestar/types";
5
+ import {Logger, prettyBytes, prettyPrintIndices, pruneSetToMax, sleep} from "@lodestar/utils";
6
+ import {isBlockInputBlobs, isBlockInputColumns} from "../chain/blocks/blockInput/blockInput.js";
7
+ import {BlockInputSource, IBlockInput} from "../chain/blocks/blockInput/types.js";
8
+ import {BlockError, BlockErrorCode} from "../chain/errors/index.js";
9
+ import {ChainEvent, ChainEventData, IBeaconChain} from "../chain/index.js";
10
+ import {Metrics} from "../metrics/index.js";
11
+ import {INetwork, NetworkEvent, NetworkEventData, prettyPrintPeerIdStr} from "../network/index.js";
12
+ import {PeerSyncMeta} from "../network/peers/peersData.js";
13
+ import {PeerIdStr} from "../util/peerId.js";
14
+ import {shuffle} from "../util/shuffle.js";
15
+ import {sortBy} from "../util/sortBy.js";
16
+ import {wrapError} from "../util/wrapError.js";
17
+ import {MAX_CONCURRENT_REQUESTS} from "./constants.js";
18
+ import {SyncOptions} from "./options.js";
19
+ import {
20
+ BlockInputSyncCacheItem,
21
+ PendingBlockInput,
22
+ PendingBlockInputStatus,
23
+ PendingBlockType,
24
+ getBlockInputSyncCacheItemRootHex,
25
+ getBlockInputSyncCacheItemSlot,
26
+ isPendingBlockInput,
27
+ } from "./types.js";
28
+ import {DownloadByRootError, downloadByRoot} from "./utils/downloadByRoot.js";
29
+ import {getAllDescendantBlocks, getDescendantBlocks, getUnknownAndAncestorBlocks} from "./utils/pendingBlocksTree.js";
30
+
31
+ const MAX_ATTEMPTS_PER_BLOCK = 5;
32
+ const MAX_KNOWN_BAD_BLOCKS = 500;
33
+ const MAX_PENDING_BLOCKS = 100;
34
+
35
+ enum FetchResult {
36
+ SuccessResolved = "success_resolved",
37
+ SuccessMissingParent = "success_missing_parent",
38
+ SuccessLate = "success_late",
39
+ FailureTriedAllPeers = "failure_tried_all_peers",
40
+ FailureMaxAttempts = "failure_max_attempts",
41
+ }
42
+
43
+ /**
44
+ * BlockInputSync is a class that handles ReqResp to find blocks and data related to a specific blockRoot. The
45
+ * blockRoot may have been found via object gossip, or the API. Gossip objects that can trigger a search are block,
46
+ * blobs, columns, attestations, etc. In the case of blocks and data this is generally during the current slot but
47
+ * can also be for items that are received late but are not fully verified and thus not in fork-choice (old blocks on
48
+ * an unknown fork). It can also be triggered via an attestation (or sync committee message or any other item that
49
+ * gets gossiped) that references a blockRoot that is not in fork-choice. In rare (and realistically should not happen)
50
+ * situations it can get triggered via the API when the validator attempts to publish a block, attestation, aggregate
51
+ * and proof or a sync committee contribution that has unknown information included (parentRoot for instance).
52
+ *
53
+ * The goal of the class is to make sure that all information that is necessary for import into fork-choice is pulled
54
+ * from peers so that the block and data can be processed, and thus the object that triggered the search can be
55
+ * referenced and validated.
56
+ *
57
+ * The most common case for this search is a set of block/data that comes across gossip for the current slot, during
58
+ * normal chain operation, but not everything was received before the gossip cutoff window happens so it is necessary
59
+ * to pull remaining data via req/resp so that fork-choice can be updated prior to making an attestation for the
60
+ * current slot.
61
+ *
62
+ * Event sources for old UnknownBlock
63
+ *
64
+ * - publishBlock
65
+ * - gossipHandlers
66
+ * - searchUnknownSlotRoot
67
+ * = produceSyncCommitteeContribution
68
+ * = validateGossipFnRetryUnknownRoot
69
+ * * submitPoolAttestationsV2
70
+ * * publishAggregateAndProofsV2
71
+ * = onPendingGossipsubMessage
72
+ * * NetworkEvent.pendingGossipsubMessage
73
+ * - onGossipsubMessage
74
+ */
75
+ export class BlockInputSync {
76
+ /**
77
+ * block RootHex -> PendingBlock. To avoid finding same root at the same time
78
+ */
79
+ private readonly pendingBlocks = new Map<RootHex, BlockInputSyncCacheItem>();
80
+ private readonly knownBadBlocks = new Set<RootHex>();
81
+ private readonly proposerBoostSecWindow: number;
82
+ private readonly maxPendingBlocks;
83
+ private subscribedToNetworkEvents = false;
84
+ private peerBalancer: UnknownBlockPeerBalancer;
85
+
86
+ constructor(
87
+ private readonly config: ChainForkConfig,
88
+ private readonly network: INetwork,
89
+ private readonly chain: IBeaconChain,
90
+ private readonly logger: Logger,
91
+ private readonly metrics: Metrics | null,
92
+ private readonly opts?: SyncOptions
93
+ ) {
94
+ this.maxPendingBlocks = opts?.maxPendingBlocks ?? MAX_PENDING_BLOCKS;
95
+ this.proposerBoostSecWindow = this.config.SECONDS_PER_SLOT / INTERVALS_PER_SLOT;
96
+ this.peerBalancer = new UnknownBlockPeerBalancer();
97
+
98
+ if (metrics) {
99
+ metrics.blockInputSync.pendingBlocks.addCollect(() =>
100
+ metrics.blockInputSync.pendingBlocks.set(this.pendingBlocks.size)
101
+ );
102
+ metrics.blockInputSync.knownBadBlocks.addCollect(() =>
103
+ metrics.blockInputSync.knownBadBlocks.set(this.knownBadBlocks.size)
104
+ );
105
+ }
106
+ }
107
+
108
+ subscribeToNetwork(): void {
109
+ if (this.opts?.disableBlockInputSync) {
110
+ this.logger.verbose("BlockInputSync disabled by disableBlockInputSync option.");
111
+ return;
112
+ }
113
+
114
+ // cannot chain to the above if or the log will be incorrect
115
+ if (!this.subscribedToNetworkEvents) {
116
+ this.logger.verbose("BlockInputSync enabled.");
117
+ this.chain.emitter.on(ChainEvent.unknownBlockRoot, this.onUnknownBlockRoot);
118
+ this.chain.emitter.on(ChainEvent.incompleteBlockInput, this.onIncompleteBlockInput);
119
+ this.chain.emitter.on(ChainEvent.unknownParent, this.onUnknownParent);
120
+ this.network.events.on(NetworkEvent.peerConnected, this.onPeerConnected);
121
+ this.network.events.on(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
122
+ this.subscribedToNetworkEvents = true;
123
+ }
124
+ }
125
+
126
+ unsubscribeFromNetwork(): void {
127
+ this.logger.verbose("BlockInputSync disabled.");
128
+ this.chain.emitter.off(ChainEvent.unknownBlockRoot, this.onUnknownBlockRoot);
129
+ this.chain.emitter.off(ChainEvent.incompleteBlockInput, this.onIncompleteBlockInput);
130
+ this.chain.emitter.off(ChainEvent.unknownParent, this.onUnknownParent);
131
+ this.network.events.off(NetworkEvent.peerConnected, this.onPeerConnected);
132
+ this.network.events.off(NetworkEvent.peerDisconnected, this.onPeerDisconnected);
133
+ this.subscribedToNetworkEvents = false;
134
+ }
135
+
136
+ close(): void {
137
+ this.unsubscribeFromNetwork();
138
+ }
139
+
140
+ isSubscribedToNetwork(): boolean {
141
+ return this.subscribedToNetworkEvents;
142
+ }
143
+
144
+ /**
145
+ * Process an unknownBlock event and register the block in `pendingBlocks` Map.
146
+ */
147
+ private onUnknownBlockRoot = (data: ChainEventData[ChainEvent.unknownBlockRoot]): void => {
148
+ try {
149
+ const {root, slot} = data.rootSlot;
150
+ this.addByRootHex(root, slot, data.peer);
151
+ this.triggerUnknownBlockSearch();
152
+ this.metrics?.blockInputSync.requests.inc({type: PendingBlockType.UNKNOWN_BLOCK_ROOT});
153
+ this.metrics?.blockInputSync.source.inc({source: data.source});
154
+ } catch (e) {
155
+ this.logger.debug("Error handling unknownBlockRoot event", {}, e as Error);
156
+ }
157
+ };
158
+
159
+ /**
160
+ * Process an unknownBlockInput event and register the block in `pendingBlocks` Map.
161
+ */
162
+ private onIncompleteBlockInput = (data: ChainEventData[ChainEvent.incompleteBlockInput]): void => {
163
+ try {
164
+ this.addByBlockInput(data.blockInput, data.peer);
165
+ this.triggerUnknownBlockSearch();
166
+ this.metrics?.blockInputSync.requests.inc({type: PendingBlockType.INCOMPLETE_BLOCK_INPUT});
167
+ this.metrics?.blockInputSync.source.inc({source: data.source});
168
+ } catch (e) {
169
+ this.logger.debug("Error handling incompleteBlockInput event", {}, e as Error);
170
+ }
171
+ };
172
+
173
+ /**
174
+ * Process an unknownBlockParent event and register the block in `pendingBlocks` Map.
175
+ */
176
+ private onUnknownParent = (data: ChainEventData[ChainEvent.unknownParent]): void => {
177
+ try {
178
+ // we don't know the slot of parent, hence make it undefined
179
+ this.addByRootHex(data.blockInput.parentRootHex, undefined, data.peer);
180
+ this.addByBlockInput(data.blockInput, data.peer);
181
+ this.triggerUnknownBlockSearch();
182
+ this.metrics?.blockInputSync.requests.inc({type: PendingBlockType.UNKNOWN_PARENT});
183
+ this.metrics?.blockInputSync.source.inc({source: data.source});
184
+ } catch (e) {
185
+ this.logger.debug("Error handling unknownParent event", {}, e as Error);
186
+ }
187
+ };
188
+
189
+ private addByRootHex = (rootHex: RootHex, slot?: Slot, peerIdStr?: PeerIdStr): void => {
190
+ let pendingBlock = this.pendingBlocks.get(rootHex);
191
+ if (!pendingBlock) {
192
+ pendingBlock = {
193
+ status: PendingBlockInputStatus.pending,
194
+ slot,
195
+ rootHex: rootHex,
196
+ peerIdStrings: new Set(),
197
+ timeAddedSec: Date.now() / 1000,
198
+ };
199
+ this.pendingBlocks.set(rootHex, pendingBlock);
200
+
201
+ this.logger.verbose("Added new rootHex to BlockInputSync.pendingBlocks", {
202
+ rootHex: prettyBytes(pendingBlock.rootHex),
203
+ peerIdStr: peerIdStr ?? "unknown peer",
204
+ });
205
+ }
206
+
207
+ if (peerIdStr) {
208
+ pendingBlock.peerIdStrings.add(peerIdStr);
209
+ }
210
+
211
+ // TODO: check this prune methodology
212
+ // Limit pending blocks to prevent DOS attacks that cause OOM
213
+ const prunedItemCount = pruneSetToMax(this.pendingBlocks, this.maxPendingBlocks);
214
+ if (prunedItemCount > 0) {
215
+ this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingBlocks`);
216
+ }
217
+ };
218
+
219
+ private addByBlockInput = (blockInput: IBlockInput, peerIdStr?: string): void => {
220
+ let pendingBlock = this.pendingBlocks.get(blockInput.blockRootHex);
221
+ // if entry is missing or was added via rootHex and now we have more complete information overwrite
222
+ // the existing information with the more complete cache entry
223
+ if (!pendingBlock || !isPendingBlockInput(pendingBlock)) {
224
+ pendingBlock = {
225
+ // can be added via unknown parent and we may already have full block input. need to check and set correctly
226
+ // so we pull the data if its missing or handle the block correctly in getIncompleteAndAncestorBlocks
227
+ status: blockInput.hasBlockAndAllData() ? PendingBlockInputStatus.downloaded : PendingBlockInputStatus.pending,
228
+ blockInput,
229
+ peerIdStrings: new Set(),
230
+ timeAddedSec: Date.now() / 1000,
231
+ };
232
+ this.pendingBlocks.set(blockInput.blockRootHex, pendingBlock);
233
+
234
+ this.logger.verbose("Added blockInput to BlockInputSync.pendingBlocks", pendingBlock.blockInput.getLogMeta());
235
+ }
236
+
237
+ if (peerIdStr) {
238
+ pendingBlock.peerIdStrings.add(peerIdStr);
239
+ }
240
+
241
+ // TODO: check this prune methodology
242
+ // Limit pending blocks to prevent DOS attacks that cause OOM
243
+ const prunedItemCount = pruneSetToMax(this.pendingBlocks, this.maxPendingBlocks);
244
+ if (prunedItemCount > 0) {
245
+ this.logger.verbose(`Pruned ${prunedItemCount} items from BlockInputSync.pendingBlocks`);
246
+ }
247
+ };
248
+
249
+ private onPeerConnected = (data: NetworkEventData[NetworkEvent.peerConnected]): void => {
250
+ try {
251
+ const peerId = data.peer;
252
+ const peerSyncMeta = this.network.getConnectedPeerSyncMeta(peerId);
253
+ this.peerBalancer.onPeerConnected(data.peer, peerSyncMeta);
254
+ this.triggerUnknownBlockSearch();
255
+ } catch (e) {
256
+ this.logger.debug("Error handling peerConnected event", {}, e as Error);
257
+ }
258
+ };
259
+
260
+ private onPeerDisconnected = (data: NetworkEventData[NetworkEvent.peerDisconnected]): void => {
261
+ const peerId = data.peer;
262
+ this.peerBalancer.onPeerDisconnected(peerId);
263
+ };
264
+
265
+ /**
266
+ * Gather tip parent blocks with unknown parent and do a search for all of them
267
+ */
268
+ private triggerUnknownBlockSearch = (): void => {
269
+ // Cheap early stop to prevent calling the network.getConnectedPeers()
270
+ if (this.pendingBlocks.size === 0) {
271
+ return;
272
+ }
273
+
274
+ // If the node loses all peers with pending unknown blocks, the sync will stall
275
+ const connectedPeers = this.network.getConnectedPeers();
276
+ if (connectedPeers.length === 0) {
277
+ this.logger.debug("No connected peers, skipping unknown block search.");
278
+ return;
279
+ }
280
+
281
+ const {unknowns, ancestors} = getUnknownAndAncestorBlocks(this.pendingBlocks);
282
+ // it's rare when there is no unknown block
283
+ // see https://github.com/ChainSafe/lodestar/issues/5649#issuecomment-1594213550
284
+ if (unknowns.length === 0) {
285
+ let processedBlocks = 0;
286
+
287
+ for (const block of ancestors) {
288
+ // when this happens, it's likely the block and parent block are processed by head sync
289
+ if (this.chain.forkChoice.hasBlockHex(block.blockInput.parentRootHex)) {
290
+ processedBlocks++;
291
+ this.processBlock(block).catch((e) => {
292
+ this.logger.debug("Unexpected error - process old downloaded block", {}, e);
293
+ });
294
+ }
295
+ }
296
+
297
+ this.logger.verbose("No unknown block, process ancestor downloaded blocks", {
298
+ pendingBlocks: this.pendingBlocks.size,
299
+ ancestorBlocks: ancestors.length,
300
+ processedBlocks,
301
+ });
302
+ return;
303
+ }
304
+
305
+ // most of the time there is exactly 1 unknown block
306
+ for (const block of unknowns) {
307
+ this.downloadBlock(block).catch((e) => {
308
+ this.logger.debug("Unexpected error - downloadBlock", {root: getBlockInputSyncCacheItemRootHex(block)}, e);
309
+ });
310
+ }
311
+ };
312
+
313
+ private async downloadBlock(block: BlockInputSyncCacheItem): Promise<void> {
314
+ if (block.status !== PendingBlockInputStatus.pending) {
315
+ return;
316
+ }
317
+
318
+ const rootHex = getBlockInputSyncCacheItemRootHex(block);
319
+ const logCtx = {
320
+ slot: getBlockInputSyncCacheItemSlot(block),
321
+ blockRoot: prettyBytes(rootHex),
322
+ pendingBlocks: this.pendingBlocks.size,
323
+ };
324
+
325
+ this.logger.verbose("BlockInputSync.downloadBlock()", logCtx);
326
+
327
+ block.status = PendingBlockInputStatus.fetching;
328
+
329
+ const res = await wrapError(this.fetchBlockInput(block));
330
+
331
+ if (!res.err) {
332
+ this.metrics?.blockInputSync.downloadedBlocksSuccess.inc();
333
+ const pending = res.result;
334
+ this.pendingBlocks.set(pending.blockInput.blockRootHex, pending);
335
+ const blockSlot = pending.blockInput.slot;
336
+ const finalizedSlot = this.chain.forkChoice.getFinalizedBlock().slot;
337
+ const delaySec = Date.now() / 1000 - (this.chain.genesisTime + blockSlot * this.config.SECONDS_PER_SLOT);
338
+ this.metrics?.blockInputSync.elapsedTimeTillReceived.observe(delaySec);
339
+
340
+ const parentInForkChoice = this.chain.forkChoice.hasBlockHex(pending.blockInput.parentRootHex);
341
+ const logCtx2 = {
342
+ ...logCtx,
343
+ slot: blockSlot,
344
+ parentInForkChoice,
345
+ };
346
+ this.logger.verbose("Downloaded unknown block", logCtx2);
347
+
348
+ if (parentInForkChoice) {
349
+ // Bingo! Process block. Add to pending blocks anyway for recycle the cache that prevents duplicate processing
350
+ this.processBlock(pending).catch((e) => {
351
+ this.logger.debug("Unexpected error - process newly downloaded block", logCtx2, e);
352
+ });
353
+ } else if (blockSlot <= finalizedSlot) {
354
+ // the common ancestor of the downloading chain and canonical chain should be at least the finalized slot and
355
+ // we should found it through forkchoice. If not, we should penalize all peers sending us this block chain
356
+ // 0 - 1 - ... - n - finalizedSlot
357
+ // \
358
+ // parent 1 - parent 2 - ... - unknownParent block
359
+ this.logger.debug("Downloaded block is before finalized slot", {
360
+ ...logCtx2,
361
+ finalizedSlot,
362
+ });
363
+ this.removeAndDownScoreAllDescendants(block);
364
+ } else {
365
+ this.onUnknownBlockRoot({rootSlot: {root: pending.blockInput.parentRootHex}, source: BlockInputSource.byRoot});
366
+ }
367
+ } else {
368
+ this.metrics?.blockInputSync.downloadedBlocksError.inc();
369
+ this.logger.debug("Ignoring unknown block root after many failed downloads", logCtx, res.err);
370
+ this.removeAndDownScoreAllDescendants(block);
371
+ }
372
+ }
373
+
374
+ /**
375
+ * Send block to the processor awaiting completition. If processed successfully, send all children to the processor.
376
+ * On error, remove and downscore all descendants.
377
+ * This function could run recursively for all descendant blocks
378
+ */
379
+ private async processBlock(pendingBlock: PendingBlockInput): Promise<void> {
380
+ // pending block status is `downloaded` right after `downloadBlock`
381
+ // but could be `pending` if added by `onUnknownBlockParent` event and this function is called recursively
382
+ if (pendingBlock.status !== PendingBlockInputStatus.downloaded) {
383
+ if (pendingBlock.status === PendingBlockInputStatus.pending) {
384
+ const connectedPeers = this.network.getConnectedPeers();
385
+ if (connectedPeers.length === 0) {
386
+ this.logger.debug("No connected peers, skipping download block", {
387
+ slot: pendingBlock.blockInput.slot,
388
+ blockRoot: pendingBlock.blockInput.blockRootHex,
389
+ });
390
+ return;
391
+ }
392
+ // if the download is a success we'll call `processBlock()` for this block
393
+ await this.downloadBlock(pendingBlock);
394
+ }
395
+ return;
396
+ }
397
+
398
+ pendingBlock.status = PendingBlockInputStatus.processing;
399
+ // this prevents unbundling attack
400
+ // see https://lighthouse-blog.sigmaprime.io/mev-unbundling-rpc.html
401
+ const {slot: blockSlot, proposerIndex} = pendingBlock.blockInput.getBlock().message;
402
+ if (
403
+ this.chain.clock.secFromSlot(blockSlot) < this.proposerBoostSecWindow &&
404
+ this.chain.seenBlockProposers.isKnown(blockSlot, proposerIndex)
405
+ ) {
406
+ // proposer is known by a gossip block already, wait a bit to make sure this block is not
407
+ // eligible for proposer boost to prevent unbundling attack
408
+ this.logger.verbose("Avoid proposer boost for this block of known proposer", {
409
+ slot: blockSlot,
410
+ blockRoot: prettyBytes(pendingBlock.blockInput.blockRootHex),
411
+ proposerIndex,
412
+ });
413
+ await sleep(this.proposerBoostSecWindow * 1000);
414
+ }
415
+ // At gossip time, it's critical to keep a good number of mesh peers.
416
+ // To do that, the Gossip Job Wait Time should be consistently <3s to avoid the behavior penalties in gossip
417
+ // Gossip Job Wait Time depends on the BLS Job Wait Time
418
+ // so `blsVerifyOnMainThread = true`: we want to verify signatures immediately without affecting the bls thread pool.
419
+ // otherwise we can't utilize bls thread pool capacity and Gossip Job Wait Time can't be kept low consistently.
420
+ // See https://github.com/ChainSafe/lodestar/issues/3792
421
+ const res = await wrapError(
422
+ this.chain.processBlock(pendingBlock.blockInput, {
423
+ ignoreIfKnown: true,
424
+ // there could be finalized/head sync at the same time so we need to ignore if finalized
425
+ // see https://github.com/ChainSafe/lodestar/issues/5650
426
+ ignoreIfFinalized: true,
427
+ blsVerifyOnMainThread: true,
428
+ // block is validated with correct root, we want to process it as soon as possible
429
+ eagerPersistBlock: true,
430
+ })
431
+ );
432
+
433
+ if (res.err) this.metrics?.blockInputSync.processedBlocksError.inc();
434
+ else this.metrics?.blockInputSync.processedBlocksSuccess.inc();
435
+
436
+ if (!res.err) {
437
+ // no need to update status to "processed", delete anyway
438
+ this.pendingBlocks.delete(pendingBlock.blockInput.blockRootHex);
439
+ this.chain.seenBlockInputCache.prune(pendingBlock.blockInput.blockRootHex);
440
+
441
+ // Send child blocks to the processor
442
+ for (const descendantBlock of getDescendantBlocks(pendingBlock.blockInput.blockRootHex, this.pendingBlocks)) {
443
+ if (isPendingBlockInput(descendantBlock)) {
444
+ this.processBlock(descendantBlock).catch((e) => {
445
+ this.logger.debug("Unexpected error - process descendant block", {}, e);
446
+ });
447
+ }
448
+ }
449
+ } else {
450
+ const errorData = {slot: pendingBlock.blockInput.slot, root: pendingBlock.blockInput.blockRootHex};
451
+ if (res.err instanceof BlockError) {
452
+ switch (res.err.type.code) {
453
+ // This cases are already handled with `{ignoreIfKnown: true}`
454
+ // case BlockErrorCode.ALREADY_KNOWN:
455
+ // case BlockErrorCode.GENESIS_BLOCK:
456
+
457
+ case BlockErrorCode.PARENT_UNKNOWN:
458
+ case BlockErrorCode.PRESTATE_MISSING:
459
+ // Should not happen, mark as downloaded to try again latter
460
+ this.logger.debug("Attempted to process block but its parent was still unknown", errorData, res.err);
461
+ pendingBlock.status = PendingBlockInputStatus.downloaded;
462
+ break;
463
+
464
+ case BlockErrorCode.EXECUTION_ENGINE_ERROR:
465
+ // Removing the block(s) without penalizing the peers, hoping for EL to
466
+ // recover on a latter download + verify attempt
467
+ this.removeAllDescendants(pendingBlock);
468
+ break;
469
+
470
+ default:
471
+ // Block is not correct with respect to our chain. Log error loudly
472
+ this.logger.debug("Error processing block from unknown parent sync", errorData, res.err);
473
+ this.removeAndDownScoreAllDescendants(pendingBlock);
474
+ }
475
+ }
476
+
477
+ // Probably a queue error or something unwanted happened, mark as pending to try again latter
478
+ else {
479
+ this.logger.debug("Unknown error processing block from unknown block sync", errorData, res.err);
480
+ pendingBlock.status = PendingBlockInputStatus.downloaded;
481
+ }
482
+ }
483
+ }
484
+
485
+ /**
486
+ * From a set of shuffled peers:
487
+ * - fetch the block
488
+ * - from deneb, fetch all missing blobs
489
+ * - from peerDAS, fetch sampled colmns
490
+ * TODO: this means we only have block root, and nothing else. Consider to reflect this in the function name
491
+ * prefulu, will attempt a max of `MAX_ATTEMPTS_PER_BLOCK` on different peers, postfulu we may attempt more as defined in `getMaxDownloadAttempts()` function
492
+ * Also verifies the received block root + returns the peer that provided the block for future downscoring.
493
+ */
494
+ private async fetchBlockInput(cacheItem: BlockInputSyncCacheItem): Promise<PendingBlockInput> {
495
+ const rootHex = getBlockInputSyncCacheItemRootHex(cacheItem);
496
+ const excludedPeers = new Set<PeerIdStr>();
497
+ const defaultPendingColumns =
498
+ this.config.getForkSeq(this.chain.clock.currentSlot) >= ForkSeq.fulu
499
+ ? new Set(this.network.custodyConfig.sampledColumns)
500
+ : null;
501
+
502
+ const fetchStartSec = Date.now() / 1000;
503
+ let slot = isPendingBlockInput(cacheItem) ? cacheItem.blockInput.slot : cacheItem.slot;
504
+ if (slot !== undefined) {
505
+ this.metrics?.blockInputSync.fetchBegin.observe(this.chain.clock.secFromSlot(slot, fetchStartSec));
506
+ }
507
+
508
+ let i = 0;
509
+ while (i++ < this.getMaxDownloadAttempts()) {
510
+ const pendingColumns =
511
+ isPendingBlockInput(cacheItem) && isBlockInputColumns(cacheItem.blockInput)
512
+ ? new Set(cacheItem.blockInput.getMissingSampledColumnMeta().missing)
513
+ : defaultPendingColumns;
514
+ // pendingDataColumns is null pre-fulu
515
+ const peerMeta = this.peerBalancer.bestPeerForPendingColumns(pendingColumns, excludedPeers);
516
+ if (peerMeta === null) {
517
+ // no more peer with needed columns to try, throw error
518
+ let message = `Error fetching UnknownBlockRoot slot=${slot} blockRoot=${prettyBytes(rootHex)} after ${i}: cannot find peer`;
519
+ if (pendingColumns) {
520
+ message += ` with needed columns=${prettyPrintIndices(Array.from(pendingColumns))}`;
521
+ }
522
+ this.metrics?.blockInputSync.fetchTimeSec.observe(
523
+ {result: FetchResult.FailureTriedAllPeers},
524
+ Date.now() / 1000 - fetchStartSec
525
+ );
526
+ this.metrics?.blockInputSync.fetchPeers.set({result: FetchResult.FailureTriedAllPeers}, i);
527
+ throw Error(message);
528
+ }
529
+ const {peerId, client: peerClient} = peerMeta;
530
+
531
+ cacheItem.peerIdStrings.add(peerId);
532
+
533
+ try {
534
+ const downloadResult = await downloadByRoot({
535
+ config: this.config,
536
+ network: this.network,
537
+ seenCache: this.chain.seenBlockInputCache,
538
+ emitter: this.chain.emitter,
539
+ peerMeta,
540
+ cacheItem,
541
+ });
542
+ cacheItem = downloadResult.result;
543
+ if (slot === undefined) {
544
+ slot = cacheItem.blockInput.slot;
545
+ // we were not able to observe the time into slot when starting the fetch, do it now
546
+ this.metrics?.blockInputSync.fetchBegin.observe(this.chain.clock.secFromSlot(slot, fetchStartSec));
547
+ }
548
+
549
+ const logCtx = {slot, rootHex, peerId, peerClient};
550
+ this.logger.verbose("BlockInputSync.fetchBlockInput: successful download", logCtx);
551
+ this.metrics?.blockInputSync.downloadByRoot.success.inc();
552
+ const warnings = downloadResult.warnings;
553
+ if (warnings) {
554
+ for (const warning of warnings) {
555
+ this.logger.debug("BlockInputSync.fetchBlockInput: downloaded with warning", logCtx, warning);
556
+ this.metrics?.blockInputSync.downloadByRoot.warn.inc({code: warning.type.code, client: peerClient});
557
+ }
558
+ // TODO: penalize peer?
559
+ }
560
+ } catch (e) {
561
+ this.logger.debug(
562
+ "Error downloading in BlockInputSync.fetchBlockInput",
563
+ {slot, rootHex, attempt: i, peer: peerId, peerClient},
564
+ e as Error
565
+ );
566
+ const downloadByRootMetrics = this.metrics?.blockInputSync.downloadByRoot;
567
+ // TODO: penalize peer?
568
+ if (e instanceof DownloadByRootError) {
569
+ const errorCode = e.type.code;
570
+ downloadByRootMetrics?.error.inc({code: errorCode, client: peerClient});
571
+ excludedPeers.add(peerId);
572
+ } else if (e instanceof RequestError) {
573
+ // should look into req_resp metrics in this case
574
+ downloadByRootMetrics?.error.inc({code: "req_resp", client: peerClient});
575
+ switch (e.type.code) {
576
+ case RequestErrorCode.REQUEST_RATE_LIMITED:
577
+ case RequestErrorCode.REQUEST_TIMEOUT:
578
+ // do not exclude peer for these errors
579
+ break;
580
+ default:
581
+ excludedPeers.add(peerId);
582
+ break;
583
+ }
584
+ } else {
585
+ // investigate if this happens
586
+ downloadByRootMetrics?.error.inc({code: "unknown", client: peerClient});
587
+ excludedPeers.add(peerId);
588
+ }
589
+ } finally {
590
+ this.peerBalancer.onRequestCompleted(peerId);
591
+ }
592
+
593
+ this.pendingBlocks.set(getBlockInputSyncCacheItemRootHex(cacheItem), cacheItem);
594
+
595
+ if (cacheItem.status === PendingBlockInputStatus.downloaded) {
596
+ // download was successful, no need to go with another peer, return
597
+ const result = this.chain.forkChoice.hasBlockHex(cacheItem.blockInput.blockRootHex)
598
+ ? FetchResult.SuccessLate
599
+ : this.chain.forkChoice.hasBlockHex(cacheItem.blockInput.parentRootHex)
600
+ ? FetchResult.SuccessResolved
601
+ : FetchResult.SuccessMissingParent;
602
+ this.metrics?.blockInputSync.fetchTimeSec.observe({result}, Date.now() / 1000 - fetchStartSec);
603
+ this.metrics?.blockInputSync.fetchPeers.set({result}, i);
604
+ return cacheItem;
605
+ }
606
+ } // end while loop over peers
607
+
608
+ const message = `Error fetching BlockInput with slot=${slot} blockRoot=${prettyBytes(rootHex)} after ${i - 1} attempts.`;
609
+
610
+ if (!isPendingBlockInput(cacheItem)) {
611
+ throw Error(`${message} No block and no data was found.`);
612
+ }
613
+
614
+ if (!cacheItem.blockInput.hasBlock()) {
615
+ throw new Error(`${message} Block was not found.`);
616
+ }
617
+
618
+ if (isBlockInputBlobs(cacheItem.blockInput)) {
619
+ const missing = cacheItem.blockInput.getMissingBlobMeta().map((b) => b.index);
620
+ if (missing.length) {
621
+ throw new Error(`${message} Missing blob indices=${prettyPrintIndices(missing)}.`);
622
+ }
623
+ }
624
+
625
+ if (isBlockInputColumns(cacheItem.blockInput)) {
626
+ const missing = cacheItem.blockInput.getMissingSampledColumnMeta().missing;
627
+ if (missing.length) {
628
+ throw new Error(`${message} Missing column indices=${prettyPrintIndices(missing)}.`);
629
+ }
630
+ }
631
+
632
+ this.metrics?.blockInputSync.fetchTimeSec.observe(
633
+ {result: FetchResult.FailureMaxAttempts},
634
+ Date.now() / 1000 - fetchStartSec
635
+ );
636
+ this.metrics?.blockInputSync.fetchPeers.set({result: FetchResult.FailureMaxAttempts}, i - 1);
637
+
638
+ throw Error(message);
639
+ }
640
+
641
+ /**
642
+ * Gets all descendant blocks of `block` recursively from `pendingBlocks`.
643
+ * Assumes that if a parent block does not exist or is not processable, all descendant blocks are bad too.
644
+ * Downscore all peers that have referenced any of this bad blocks. May report peers multiple times if they have
645
+ * referenced more than one bad block.
646
+ */
647
+ private removeAndDownScoreAllDescendants(block: BlockInputSyncCacheItem): void {
648
+ // Get all blocks that are a descendant of this one
649
+ const badPendingBlocks = this.removeAllDescendants(block);
650
+ // just console log and do not penalize on pending/bad blocks for debugging
651
+ // console.log("removeAndDownscoreAllDescendants", {block});
652
+
653
+ for (const block of badPendingBlocks) {
654
+ //
655
+ // TODO(fulu): why is this commented out here?
656
+ //
657
+ // this.knownBadBlocks.add(block.blockRootHex);
658
+ // for (const peerIdStr of block.peerIdStrs) {
659
+ // // TODO: Refactor peerRpcScores to work with peerIdStr only
660
+ // this.network.reportPeer(peerIdStr, PeerAction.LowToleranceError, "BadBlockByRoot");
661
+ // }
662
+ this.logger.debug("ignored Banning unknown block", {
663
+ slot: getBlockInputSyncCacheItemSlot(block),
664
+ root: getBlockInputSyncCacheItemRootHex(block),
665
+ peerIdStrings: Array.from(block.peerIdStrings)
666
+ .map((id) => prettyPrintPeerIdStr(id))
667
+ .join(","),
668
+ });
669
+ }
670
+
671
+ // Prune knownBadBlocks
672
+ pruneSetToMax(this.knownBadBlocks, MAX_KNOWN_BAD_BLOCKS);
673
+ }
674
+
675
+ private removeAllDescendants(block: BlockInputSyncCacheItem): BlockInputSyncCacheItem[] {
676
+ const rootHex = getBlockInputSyncCacheItemRootHex(block);
677
+ const slot = getBlockInputSyncCacheItemSlot(block);
678
+ // Get all blocks that are a descendant of this one
679
+ const badPendingBlocks = [block, ...getAllDescendantBlocks(rootHex, this.pendingBlocks)];
680
+
681
+ this.metrics?.blockInputSync.removedBlocks.inc(badPendingBlocks.length);
682
+
683
+ for (const block of badPendingBlocks) {
684
+ const rootHex = getBlockInputSyncCacheItemRootHex(block);
685
+ this.pendingBlocks.delete(rootHex);
686
+ this.chain.seenBlockInputCache.prune(rootHex);
687
+ this.logger.debug("Removing bad/unknown/incomplete BlockInputSyncCacheItem", {
688
+ slot,
689
+ blockRoot: rootHex,
690
+ });
691
+ }
692
+
693
+ return badPendingBlocks;
694
+ }
695
+
696
+ private getMaxDownloadAttempts(): number {
697
+ if (this.config.getForkSeq(this.chain.clock.currentSlot) < ForkSeq.fulu) {
698
+ return MAX_ATTEMPTS_PER_BLOCK;
699
+ }
700
+
701
+ // TODO: I consider max 20 downloads per block for a supernode is enough for devnets
702
+ // review this computation for public testnets or mainnet
703
+ return Math.min(
704
+ 20,
705
+ (MAX_ATTEMPTS_PER_BLOCK * this.network.custodyConfig.sampleGroups.length) / this.config.SAMPLES_PER_SLOT
706
+ );
707
+ }
708
+ }
709
+
710
+ /**
711
+ * Class to track active byRoots requests and balance them across eligible peers.
712
+ */
713
+ export class UnknownBlockPeerBalancer {
714
+ readonly peersMeta: Map<PeerIdStr, PeerSyncMeta>;
715
+ readonly activeRequests: Map<PeerIdStr, number>;
716
+
717
+ constructor() {
718
+ this.peersMeta = new Map();
719
+ this.activeRequests = new Map();
720
+ }
721
+
722
+ /** Trigger on each peer re-status */
723
+ onPeerConnected(peerId: PeerIdStr, syncMeta: PeerSyncMeta): void {
724
+ this.peersMeta.set(peerId, syncMeta);
725
+
726
+ if (!this.activeRequests.has(peerId)) {
727
+ this.activeRequests.set(peerId, 0);
728
+ }
729
+ }
730
+
731
+ onPeerDisconnected(peerId: PeerIdStr): void {
732
+ this.peersMeta.delete(peerId);
733
+ this.activeRequests.delete(peerId);
734
+ }
735
+
736
+ /**
737
+ * called from fetchUnknownBlockRoot() where we only have block root and nothing else
738
+ * excludedPeers are the peers that we requested already so we don't want to try again
739
+ * pendingColumns is empty for prefulu, or the 1st time we we download a block by root
740
+ */
741
+ bestPeerForPendingColumns(pendingColumns: Set<number> | null, excludedPeers: Set<PeerIdStr>): PeerSyncMeta | null {
742
+ const eligiblePeers = this.filterPeers(pendingColumns, excludedPeers);
743
+ if (eligiblePeers.length === 0) {
744
+ return null;
745
+ }
746
+
747
+ const sortedEligiblePeers = sortBy(
748
+ shuffle(eligiblePeers),
749
+ // prefer peers with least active req
750
+ (peerId) => this.activeRequests.get(peerId) ?? 0
751
+ );
752
+
753
+ const bestPeerId = sortedEligiblePeers[0];
754
+ this.onRequest(bestPeerId);
755
+ return this.peersMeta.get(bestPeerId) ?? null;
756
+ }
757
+
758
+ /**
759
+ * called from fetchUnavailableBlockInput() where we have either BlockInput or NullBlockInput
760
+ * excludedPeers are the peers that we requested already so we don't want to try again
761
+ */
762
+ bestPeerForBlockInput(blockInput: IBlockInput, excludedPeers: Set<PeerIdStr>): PeerSyncMeta | null {
763
+ const eligiblePeers: PeerIdStr[] = [];
764
+
765
+ if (isBlockInputColumns(blockInput)) {
766
+ const pendingDataColumns: Set<number> = new Set(blockInput.getMissingSampledColumnMeta().missing);
767
+ // there could be no pending column in case when block is still missing
768
+ eligiblePeers.push(...this.filterPeers(pendingDataColumns, excludedPeers));
769
+ } else {
770
+ // prefulu
771
+ eligiblePeers.push(...this.filterPeers(null, excludedPeers));
772
+ }
773
+
774
+ if (eligiblePeers.length === 0) {
775
+ return null;
776
+ }
777
+
778
+ const sortedEligiblePeers = sortBy(
779
+ shuffle(eligiblePeers),
780
+ // prefer peers with least active req
781
+ (peerId) => this.activeRequests.get(peerId) ?? 0
782
+ );
783
+
784
+ const bestPeerId = sortedEligiblePeers[0];
785
+ this.onRequest(bestPeerId);
786
+ return this.peersMeta.get(bestPeerId) ?? null;
787
+ }
788
+
789
+ /**
790
+ * Consumers don't need to call this method directly, it is called internally by bestPeer*() methods
791
+ * make this public for testing
792
+ */
793
+ onRequest(peerId: PeerIdStr): void {
794
+ this.activeRequests.set(peerId, (this.activeRequests.get(peerId) ?? 0) + 1);
795
+ }
796
+
797
+ /**
798
+ * Consumers should call this method when a request is completed for a peer.
799
+ */
800
+ onRequestCompleted(peerId: PeerIdStr): void {
801
+ this.activeRequests.set(peerId, Math.max(0, (this.activeRequests.get(peerId) ?? 1) - 1));
802
+ }
803
+
804
+ getTotalActiveRequests(): number {
805
+ let totalActiveRequests = 0;
806
+ for (const count of this.activeRequests.values()) {
807
+ totalActiveRequests += count;
808
+ }
809
+ return totalActiveRequests;
810
+ }
811
+
812
+ // pendingDataColumns could be null for prefulu
813
+ private filterPeers(pendingDataColumns: Set<number> | null, excludedPeers: Set<PeerIdStr>): PeerIdStr[] {
814
+ let maxColumnCount = 0;
815
+ const considerPeers: {peerId: PeerIdStr; columnCount: number}[] = [];
816
+ for (const [peerId, syncMeta] of this.peersMeta.entries()) {
817
+ if (excludedPeers.has(peerId)) {
818
+ // made request to this peer already
819
+ continue;
820
+ }
821
+
822
+ const activeRequests = this.activeRequests.get(peerId) ?? 0;
823
+ if (activeRequests >= MAX_CONCURRENT_REQUESTS) {
824
+ // should return peer with no more than MAX_CONCURRENT_REQUESTS active requests
825
+ continue;
826
+ }
827
+
828
+ if (pendingDataColumns === null || pendingDataColumns.size === 0) {
829
+ // prefulu, no pending columns
830
+ considerPeers.push({peerId, columnCount: 0});
831
+ continue;
832
+ }
833
+
834
+ // postfulu, find peers that have custody columns that we need
835
+ const {custodyColumns: peerColumns} = syncMeta;
836
+ // check if the peer has all needed columns
837
+ // get match
838
+ const columns = peerColumns.reduce((acc, elem) => {
839
+ if (pendingDataColumns.has(elem)) {
840
+ acc.push(elem);
841
+ }
842
+ return acc;
843
+ }, [] as number[]);
844
+
845
+ if (columns.length > 0) {
846
+ if (columns.length > maxColumnCount) {
847
+ maxColumnCount = columns.length;
848
+ }
849
+ considerPeers.push({peerId, columnCount: columns.length});
850
+ }
851
+ } // end for
852
+
853
+ const eligiblePeers: PeerIdStr[] = [];
854
+ for (const {peerId, columnCount} of considerPeers) {
855
+ if (columnCount === maxColumnCount) {
856
+ eligiblePeers.push(peerId);
857
+ }
858
+ }
859
+
860
+ return eligiblePeers;
861
+ }
862
+ }