@lodestar/beacon-node 1.40.0 → 1.41.0-dev.0087e7a664

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 (446) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +123 -4
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/index.js +8 -8
  5. package/lib/api/impl/beacon/state/index.js.map +1 -1
  6. package/lib/api/impl/beacon/state/utils.d.ts +3 -4
  7. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  8. package/lib/api/impl/beacon/state/utils.js +5 -24
  9. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  10. package/lib/api/impl/debug/index.d.ts.map +1 -1
  11. package/lib/api/impl/debug/index.js +6 -2
  12. package/lib/api/impl/debug/index.js.map +1 -1
  13. package/lib/api/impl/lightclient/index.d.ts.map +1 -1
  14. package/lib/api/impl/lightclient/index.js +19 -2
  15. package/lib/api/impl/lightclient/index.js.map +1 -1
  16. package/lib/api/impl/node/index.d.ts +1 -1
  17. package/lib/api/impl/node/index.d.ts.map +1 -1
  18. package/lib/api/impl/node/index.js +18 -1
  19. package/lib/api/impl/node/index.js.map +1 -1
  20. package/lib/api/impl/node/utils.d.ts +1 -1
  21. package/lib/api/impl/node/utils.d.ts.map +1 -1
  22. package/lib/api/impl/node/utils.js.map +1 -1
  23. package/lib/api/impl/validator/index.d.ts.map +1 -1
  24. package/lib/api/impl/validator/index.js +130 -16
  25. package/lib/api/impl/validator/index.js.map +1 -1
  26. package/lib/chain/archiveStore/archiveStore.d.ts +1 -0
  27. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  28. package/lib/chain/archiveStore/archiveStore.js +9 -0
  29. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  30. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +5 -6
  31. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  32. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +9 -10
  33. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  34. package/lib/chain/archiveStore/historicalState/worker.js +3 -3
  35. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  36. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +3 -8
  37. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  38. package/lib/chain/archiveStore/utils/archiveBlocks.js +1 -1
  39. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  40. package/lib/chain/archiveStore/utils/archivePayloads.d.ts +7 -0
  41. package/lib/chain/archiveStore/utils/archivePayloads.d.ts.map +1 -0
  42. package/lib/chain/archiveStore/utils/archivePayloads.js +10 -0
  43. package/lib/chain/archiveStore/utils/archivePayloads.js.map +1 -0
  44. package/lib/chain/archiveStore/utils/updateBackfillRange.js +1 -1
  45. package/lib/chain/archiveStore/utils/updateBackfillRange.js.map +1 -1
  46. package/lib/chain/blocks/blockInput/blockInput.d.ts +25 -2
  47. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  48. package/lib/chain/blocks/blockInput/blockInput.js +71 -0
  49. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  50. package/lib/chain/blocks/blockInput/types.d.ts +18 -1
  51. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  52. package/lib/chain/blocks/blockInput/types.js +1 -0
  53. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  54. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  55. package/lib/chain/blocks/importBlock.js +27 -6
  56. package/lib/chain/blocks/importBlock.js.map +1 -1
  57. package/lib/chain/blocks/index.d.ts.map +1 -1
  58. package/lib/chain/blocks/index.js +2 -1
  59. package/lib/chain/blocks/index.js.map +1 -1
  60. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  61. package/lib/chain/blocks/verifyBlocksDataAvailability.js +3 -0
  62. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  63. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +4 -0
  64. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  65. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -1
  66. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  67. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  68. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -1
  69. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  70. package/lib/chain/blocks/writeBlockInputToDb.d.ts +12 -3
  71. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  72. package/lib/chain/blocks/writeBlockInputToDb.js +92 -95
  73. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  74. package/lib/chain/bls/multithread/index.d.ts +3 -3
  75. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  76. package/lib/chain/bls/multithread/index.js +5 -5
  77. package/lib/chain/bls/multithread/index.js.map +1 -1
  78. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  79. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  80. package/lib/chain/bls/multithread/jobItem.js +2 -2
  81. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  82. package/lib/chain/bls/singleThread.d.ts +4 -4
  83. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  84. package/lib/chain/bls/singleThread.js +4 -4
  85. package/lib/chain/bls/singleThread.js.map +1 -1
  86. package/lib/chain/bls/utils.d.ts +2 -2
  87. package/lib/chain/bls/utils.d.ts.map +1 -1
  88. package/lib/chain/bls/utils.js +7 -4
  89. package/lib/chain/bls/utils.js.map +1 -1
  90. package/lib/chain/chain.d.ts +8 -11
  91. package/lib/chain/chain.d.ts.map +1 -1
  92. package/lib/chain/chain.js +45 -28
  93. package/lib/chain/chain.js.map +1 -1
  94. package/lib/chain/emitter.d.ts +5 -5
  95. package/lib/chain/emitter.d.ts.map +1 -1
  96. package/lib/chain/errors/blockError.d.ts +7 -1
  97. package/lib/chain/errors/blockError.d.ts.map +1 -1
  98. package/lib/chain/errors/blockError.js +2 -0
  99. package/lib/chain/errors/blockError.js.map +1 -1
  100. package/lib/chain/errors/executionPayloadBid.d.ts +1 -1
  101. package/lib/chain/errors/executionPayloadEnvelope.d.ts +2 -2
  102. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  103. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  104. package/lib/chain/errors/payloadAttestation.d.ts +1 -1
  105. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  106. package/lib/chain/forkChoice/index.js +30 -24
  107. package/lib/chain/forkChoice/index.js.map +1 -1
  108. package/lib/chain/interface.d.ts +4 -6
  109. package/lib/chain/interface.d.ts.map +1 -1
  110. package/lib/chain/interface.js.map +1 -1
  111. package/lib/chain/lightClient/index.d.ts.map +1 -1
  112. package/lib/chain/lightClient/index.js +1 -1
  113. package/lib/chain/lightClient/index.js.map +1 -1
  114. package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
  115. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  116. package/lib/chain/options.d.ts.map +1 -1
  117. package/lib/chain/options.js.map +1 -1
  118. package/lib/chain/prepareNextSlot.js +3 -3
  119. package/lib/chain/prepareNextSlot.js.map +1 -1
  120. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +9 -2
  121. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  122. package/lib/chain/produceBlock/computeNewStateRoot.js +25 -2
  123. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  124. package/lib/chain/produceBlock/produceBlockBody.d.ts +22 -7
  125. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  126. package/lib/chain/produceBlock/produceBlockBody.js +109 -10
  127. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  128. package/lib/chain/regen/queued.d.ts.map +1 -1
  129. package/lib/chain/regen/queued.js +4 -1
  130. package/lib/chain/regen/queued.js.map +1 -1
  131. package/lib/chain/regen/regen.d.ts.map +1 -1
  132. package/lib/chain/regen/regen.js +6 -2
  133. package/lib/chain/regen/regen.js.map +1 -1
  134. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +5 -1
  135. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  136. package/lib/chain/seenCache/seenGossipBlockInput.js +36 -15
  137. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  138. package/lib/chain/validation/aggregateAndProof.js +1 -1
  139. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  140. package/lib/chain/validation/attestation.d.ts.map +1 -1
  141. package/lib/chain/validation/attestation.js +7 -4
  142. package/lib/chain/validation/attestation.js.map +1 -1
  143. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  144. package/lib/chain/validation/attesterSlashing.js +9 -2
  145. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  146. package/lib/chain/validation/blobSidecar.js +2 -2
  147. package/lib/chain/validation/blobSidecar.js.map +1 -1
  148. package/lib/chain/validation/block.d.ts.map +1 -1
  149. package/lib/chain/validation/block.js +33 -6
  150. package/lib/chain/validation/block.js.map +1 -1
  151. package/lib/chain/validation/dataColumnSidecar.d.ts +2 -2
  152. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  153. package/lib/chain/validation/dataColumnSidecar.js +1 -1
  154. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  155. package/lib/chain/validation/executionPayloadBid.js +1 -2
  156. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  157. package/lib/chain/validation/executionPayloadEnvelope.js +6 -5
  158. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  159. package/lib/chain/validation/payloadAttestationMessage.js +9 -3
  160. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  161. package/lib/chain/validation/proposerSlashing.js +1 -1
  162. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  163. package/lib/chain/validation/syncCommitteeContributionAndProof.js +1 -1
  164. package/lib/db/beacon.d.ts +3 -1
  165. package/lib/db/beacon.d.ts.map +1 -1
  166. package/lib/db/beacon.js +5 -1
  167. package/lib/db/beacon.js.map +1 -1
  168. package/lib/db/buckets.d.ts +3 -1
  169. package/lib/db/buckets.d.ts.map +1 -1
  170. package/lib/db/buckets.js +2 -0
  171. package/lib/db/buckets.js.map +1 -1
  172. package/lib/db/index.d.ts +1 -0
  173. package/lib/db/index.d.ts.map +1 -1
  174. package/lib/db/index.js +1 -0
  175. package/lib/db/index.js.map +1 -1
  176. package/lib/db/interface.d.ts +3 -1
  177. package/lib/db/interface.d.ts.map +1 -1
  178. package/lib/db/repositories/blockArchive.d.ts.map +1 -1
  179. package/lib/db/repositories/blockArchive.js +1 -2
  180. package/lib/db/repositories/blockArchive.js.map +1 -1
  181. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  182. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  183. package/lib/db/repositories/dataColumnSidecar.d.ts +5 -3
  184. package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -1
  185. package/lib/db/repositories/dataColumnSidecar.js +14 -1
  186. package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
  187. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +5 -3
  188. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  189. package/lib/db/repositories/dataColumnSidecarArchive.js +14 -1
  190. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  191. package/lib/db/repositories/executionPayloadEnvelope.d.ts +19 -0
  192. package/lib/db/repositories/executionPayloadEnvelope.d.ts.map +1 -0
  193. package/lib/db/repositories/executionPayloadEnvelope.js +22 -0
  194. package/lib/db/repositories/executionPayloadEnvelope.js.map +1 -0
  195. package/lib/db/repositories/executionPayloadEnvelopeArchive.d.ts +18 -0
  196. package/lib/db/repositories/executionPayloadEnvelopeArchive.d.ts.map +1 -0
  197. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +28 -0
  198. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -0
  199. package/lib/db/repositories/index.d.ts +2 -0
  200. package/lib/db/repositories/index.d.ts.map +1 -1
  201. package/lib/db/repositories/index.js +2 -0
  202. package/lib/db/repositories/index.js.map +1 -1
  203. package/lib/execution/engine/http.d.ts +1 -0
  204. package/lib/execution/engine/http.d.ts.map +1 -1
  205. package/lib/execution/engine/http.js +3 -0
  206. package/lib/execution/engine/http.js.map +1 -1
  207. package/lib/execution/engine/interface.d.ts +3 -25
  208. package/lib/execution/engine/interface.d.ts.map +1 -1
  209. package/lib/execution/engine/interface.js +2 -20
  210. package/lib/execution/engine/interface.js.map +1 -1
  211. package/lib/metrics/metrics/beacon.d.ts +1 -0
  212. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  213. package/lib/metrics/metrics/beacon.js +5 -0
  214. package/lib/metrics/metrics/beacon.js.map +1 -1
  215. package/lib/metrics/metrics/lodestar.d.ts +9 -0
  216. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  217. package/lib/metrics/metrics/lodestar.js +18 -0
  218. package/lib/metrics/metrics/lodestar.js.map +1 -1
  219. package/lib/metrics/metrics.d.ts.map +1 -1
  220. package/lib/metrics/metrics.js +8 -3
  221. package/lib/metrics/metrics.js.map +1 -1
  222. package/lib/monitoring/service.d.ts +2 -2
  223. package/lib/monitoring/service.d.ts.map +1 -1
  224. package/lib/monitoring/service.js +3 -2
  225. package/lib/monitoring/service.js.map +1 -1
  226. package/lib/network/core/networkCore.d.ts +3 -3
  227. package/lib/network/core/networkCore.d.ts.map +1 -1
  228. package/lib/network/core/networkCore.js.map +1 -1
  229. package/lib/network/core/networkCoreWorkerHandler.d.ts +3 -3
  230. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  231. package/lib/network/core/types.d.ts +2 -2
  232. package/lib/network/core/types.d.ts.map +1 -1
  233. package/lib/network/events.d.ts +2 -1
  234. package/lib/network/events.d.ts.map +1 -1
  235. package/lib/network/events.js.map +1 -1
  236. package/lib/network/gossip/encoding.d.ts +3 -3
  237. package/lib/network/gossip/encoding.d.ts.map +1 -1
  238. package/lib/network/gossip/encoding.js.map +1 -1
  239. package/lib/network/gossip/gossipsub.d.ts +13 -4
  240. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  241. package/lib/network/gossip/gossipsub.js +47 -20
  242. package/lib/network/gossip/gossipsub.js.map +1 -1
  243. package/lib/network/gossip/interface.d.ts +6 -6
  244. package/lib/network/gossip/interface.d.ts.map +1 -1
  245. package/lib/network/gossip/scoringParameters.d.ts +1 -1
  246. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  247. package/lib/network/gossip/scoringParameters.js +1 -1
  248. package/lib/network/gossip/scoringParameters.js.map +1 -1
  249. package/lib/network/gossip/topic.d.ts +114 -65
  250. package/lib/network/gossip/topic.d.ts.map +1 -1
  251. package/lib/network/gossip/topic.js +2 -2
  252. package/lib/network/gossip/topic.js.map +1 -1
  253. package/lib/network/interface.d.ts +6 -5
  254. package/lib/network/interface.d.ts.map +1 -1
  255. package/lib/network/libp2p/index.d.ts +1 -1
  256. package/lib/network/libp2p/index.d.ts.map +1 -1
  257. package/lib/network/libp2p/index.js +7 -2
  258. package/lib/network/libp2p/index.js.map +1 -1
  259. package/lib/network/network.d.ts +5 -4
  260. package/lib/network/network.d.ts.map +1 -1
  261. package/lib/network/network.js +11 -2
  262. package/lib/network/network.js.map +1 -1
  263. package/lib/network/options.d.ts.map +1 -1
  264. package/lib/network/options.js +3 -0
  265. package/lib/network/options.js.map +1 -1
  266. package/lib/network/peers/datastore.d.ts +7 -5
  267. package/lib/network/peers/datastore.d.ts.map +1 -1
  268. package/lib/network/peers/datastore.js +10 -10
  269. package/lib/network/peers/datastore.js.map +1 -1
  270. package/lib/network/peers/peerManager.d.ts +3 -0
  271. package/lib/network/peers/peerManager.d.ts.map +1 -1
  272. package/lib/network/peers/peerManager.js +103 -53
  273. package/lib/network/peers/peerManager.js.map +1 -1
  274. package/lib/network/peers/utils/prioritizePeers.d.ts +3 -3
  275. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  276. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  277. package/lib/network/processor/gossipHandlers.js +9 -2
  278. package/lib/network/processor/gossipHandlers.js.map +1 -1
  279. package/lib/network/processor/gossipValidatorFn.js +1 -1
  280. package/lib/network/processor/types.d.ts +1 -1
  281. package/lib/network/processor/types.d.ts.map +1 -1
  282. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  283. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +3 -2
  284. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  285. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  286. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +3 -2
  287. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  288. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +1 -1
  289. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  290. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  291. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +3 -2
  292. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  293. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -1
  294. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  295. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.d.ts.map +1 -1
  296. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.js +7 -1
  297. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.js.map +1 -1
  298. package/lib/network/reqresp/score.d.ts.map +1 -1
  299. package/lib/network/reqresp/score.js +0 -1
  300. package/lib/network/reqresp/score.js.map +1 -1
  301. package/lib/network/reqresp/utils/collect.d.ts +1 -1
  302. package/lib/network/reqresp/utils/collectSequentialBlocksInRange.d.ts +1 -1
  303. package/lib/network/util.js +2 -2
  304. package/lib/network/util.js.map +1 -1
  305. package/lib/node/nodejs.d.ts +3 -5
  306. package/lib/node/nodejs.d.ts.map +1 -1
  307. package/lib/node/nodejs.js +6 -4
  308. package/lib/node/nodejs.js.map +1 -1
  309. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  310. package/lib/sync/utils/downloadByRange.js +3 -9
  311. package/lib/sync/utils/downloadByRange.js.map +1 -1
  312. package/lib/sync/utils/downloadByRoot.d.ts +2 -2
  313. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  314. package/lib/sync/utils/downloadByRoot.js +4 -4
  315. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  316. package/lib/sync/utils/remoteSyncType.d.ts +1 -1
  317. package/lib/util/blobs.d.ts +2 -2
  318. package/lib/util/blobs.d.ts.map +1 -1
  319. package/lib/util/blobs.js.map +1 -1
  320. package/lib/util/clock.d.ts +6 -0
  321. package/lib/util/clock.d.ts.map +1 -1
  322. package/lib/util/clock.js +9 -3
  323. package/lib/util/clock.js.map +1 -1
  324. package/lib/util/dataColumns.d.ts +15 -2
  325. package/lib/util/dataColumns.d.ts.map +1 -1
  326. package/lib/util/dataColumns.js +40 -5
  327. package/lib/util/dataColumns.js.map +1 -1
  328. package/lib/util/multifork.d.ts +8 -0
  329. package/lib/util/multifork.d.ts.map +1 -1
  330. package/lib/util/multifork.js +37 -0
  331. package/lib/util/multifork.js.map +1 -1
  332. package/lib/util/serializedCache.d.ts +7 -2
  333. package/lib/util/serializedCache.d.ts.map +1 -1
  334. package/lib/util/serializedCache.js +9 -2
  335. package/lib/util/serializedCache.js.map +1 -1
  336. package/package.json +39 -42
  337. package/src/api/impl/beacon/blocks/index.ts +147 -3
  338. package/src/api/impl/beacon/state/index.ts +8 -8
  339. package/src/api/impl/beacon/state/utils.ts +15 -29
  340. package/src/api/impl/debug/index.ts +9 -5
  341. package/src/api/impl/lightclient/index.ts +19 -2
  342. package/src/api/impl/node/index.ts +22 -1
  343. package/src/api/impl/node/utils.ts +3 -3
  344. package/src/api/impl/validator/index.ts +153 -17
  345. package/src/chain/archiveStore/archiveStore.ts +15 -5
  346. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -11
  347. package/src/chain/archiveStore/historicalState/worker.ts +3 -3
  348. package/src/chain/archiveStore/utils/archiveBlocks.ts +4 -5
  349. package/src/chain/archiveStore/utils/archivePayloads.ts +15 -0
  350. package/src/chain/archiveStore/utils/updateBackfillRange.ts +1 -1
  351. package/src/chain/blocks/blockInput/blockInput.ts +103 -3
  352. package/src/chain/blocks/blockInput/types.ts +18 -0
  353. package/src/chain/blocks/importBlock.ts +35 -7
  354. package/src/chain/blocks/index.ts +2 -1
  355. package/src/chain/blocks/verifyBlocksDataAvailability.ts +3 -0
  356. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -2
  357. package/src/chain/blocks/verifyBlocksSanityChecks.ts +7 -2
  358. package/src/chain/blocks/writeBlockInputToDb.ts +105 -101
  359. package/src/chain/bls/multithread/index.ts +7 -7
  360. package/src/chain/bls/multithread/jobItem.ts +3 -3
  361. package/src/chain/bls/singleThread.ts +5 -5
  362. package/src/chain/bls/utils.ts +8 -5
  363. package/src/chain/chain.ts +82 -45
  364. package/src/chain/emitter.ts +5 -5
  365. package/src/chain/errors/blockError.ts +4 -1
  366. package/src/chain/errors/executionPayloadBid.ts +1 -1
  367. package/src/chain/errors/executionPayloadEnvelope.ts +6 -2
  368. package/src/chain/errors/payloadAttestation.ts +1 -1
  369. package/src/chain/forkChoice/index.ts +39 -21
  370. package/src/chain/interface.ts +4 -11
  371. package/src/chain/lightClient/index.ts +4 -1
  372. package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
  373. package/src/chain/options.ts +1 -0
  374. package/src/chain/prepareNextSlot.ts +5 -5
  375. package/src/chain/produceBlock/computeNewStateRoot.ts +36 -3
  376. package/src/chain/produceBlock/produceBlockBody.ts +162 -13
  377. package/src/chain/regen/queued.ts +7 -2
  378. package/src/chain/regen/regen.ts +9 -3
  379. package/src/chain/seenCache/seenGossipBlockInput.ts +54 -17
  380. package/src/chain/validation/aggregateAndProof.ts +1 -1
  381. package/src/chain/validation/attestation.ts +7 -4
  382. package/src/chain/validation/attesterSlashing.ts +10 -1
  383. package/src/chain/validation/blobSidecar.ts +2 -2
  384. package/src/chain/validation/block.ts +40 -7
  385. package/src/chain/validation/dataColumnSidecar.ts +3 -6
  386. package/src/chain/validation/executionPayloadBid.ts +1 -2
  387. package/src/chain/validation/executionPayloadEnvelope.ts +6 -5
  388. package/src/chain/validation/payloadAttestationMessage.ts +11 -4
  389. package/src/chain/validation/proposerSlashing.ts +1 -1
  390. package/src/chain/validation/syncCommitteeContributionAndProof.ts +1 -1
  391. package/src/db/beacon.ts +8 -0
  392. package/src/db/buckets.ts +3 -0
  393. package/src/db/index.ts +1 -0
  394. package/src/db/interface.ts +5 -0
  395. package/src/db/repositories/blockArchive.ts +1 -2
  396. package/src/db/repositories/dataColumnSidecar.ts +18 -3
  397. package/src/db/repositories/dataColumnSidecarArchive.ts +18 -3
  398. package/src/db/repositories/executionPayloadEnvelope.ts +26 -0
  399. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +32 -0
  400. package/src/db/repositories/index.ts +2 -0
  401. package/src/execution/engine/http.ts +3 -0
  402. package/src/execution/engine/interface.ts +3 -27
  403. package/src/metrics/metrics/beacon.ts +5 -0
  404. package/src/metrics/metrics/lodestar.ts +18 -0
  405. package/src/metrics/metrics.ts +8 -3
  406. package/src/monitoring/service.ts +3 -2
  407. package/src/network/core/networkCore.ts +3 -3
  408. package/src/network/core/networkCoreWorkerHandler.ts +3 -3
  409. package/src/network/core/types.ts +2 -2
  410. package/src/network/events.ts +2 -1
  411. package/src/network/gossip/encoding.ts +3 -3
  412. package/src/network/gossip/gossipsub.ts +86 -25
  413. package/src/network/gossip/interface.ts +6 -6
  414. package/src/network/gossip/scoringParameters.ts +4 -4
  415. package/src/network/gossip/topic.ts +2 -1
  416. package/src/network/interface.ts +7 -4
  417. package/src/network/libp2p/index.ts +8 -3
  418. package/src/network/network.ts +26 -7
  419. package/src/network/options.ts +3 -0
  420. package/src/network/peers/datastore.ts +13 -10
  421. package/src/network/peers/peerManager.ts +118 -54
  422. package/src/network/peers/utils/prioritizePeers.ts +3 -3
  423. package/src/network/processor/gossipHandlers.ts +19 -4
  424. package/src/network/processor/gossipValidatorFn.ts +2 -2
  425. package/src/network/processor/types.ts +1 -1
  426. package/src/network/reqresp/ReqRespBeaconNode.ts +1 -1
  427. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +4 -3
  428. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +3 -2
  429. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +1 -1
  430. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +4 -3
  431. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +2 -2
  432. package/src/network/reqresp/handlers/lightClientUpdatesByRange.ts +6 -1
  433. package/src/network/reqresp/score.ts +0 -1
  434. package/src/network/reqresp/utils/collect.ts +1 -1
  435. package/src/network/reqresp/utils/collectSequentialBlocksInRange.ts +1 -1
  436. package/src/network/util.ts +2 -2
  437. package/src/node/nodejs.ts +8 -9
  438. package/src/sync/utils/downloadByRange.ts +3 -15
  439. package/src/sync/utils/downloadByRoot.ts +6 -12
  440. package/src/sync/utils/remoteSyncType.ts +1 -1
  441. package/src/util/blobs.ts +3 -3
  442. package/src/util/clock.ts +9 -4
  443. package/src/util/dataColumns.ts +54 -5
  444. package/src/util/multifork.ts +45 -0
  445. package/src/util/serializedCache.ts +10 -3
  446. package/src/util/workerEvents.ts +1 -1
@@ -20,7 +20,7 @@ import {
20
20
  isStartSlotOfEpoch,
21
21
  isStateValidatorsNodesPopulated,
22
22
  } from "@lodestar/state-transition";
23
- import {Attestation, BeaconBlock, altair, capella, electra, phase0, ssz} from "@lodestar/types";
23
+ import {Attestation, BeaconBlock, altair, capella, electra, isGloasBeaconBlock, phase0, ssz} from "@lodestar/types";
24
24
  import {isErrorAborted, toRootHex} from "@lodestar/utils";
25
25
  import {ZERO_HASH_HEX} from "../../constants/index.js";
26
26
  import {callInNextEventLoop} from "../../util/eventLoop.js";
@@ -95,15 +95,12 @@ export async function importBlock(
95
95
  // Without this, a supernode syncing from behind can accumulate many blocks worth of column
96
96
  // data in memory (up to 128 columns per block) causing OOM before persistence catches up.
97
97
  await this.unfinalizedBlockWrites.waitForSpace();
98
- this.unfinalizedBlockWrites.push([blockInput]).catch((e) => {
98
+ this.unfinalizedBlockWrites.push(blockInput).catch((e) => {
99
99
  if (!isQueueErrorAborted(e)) {
100
100
  this.logger.error("Error pushing block to unfinalized write queue", {slot: blockSlot}, e as Error);
101
101
  }
102
102
  });
103
103
 
104
- // Without forcefully clearing this cache, we would rely on WeakMap to evict memory which is not reliable
105
- this.serializedCache.clear();
106
-
107
104
  // 2. Import block to fork choice
108
105
 
109
106
  // Should compute checkpoint balances before forkchoice.onBlock
@@ -233,6 +230,32 @@ export async function importBlock(
233
230
  }
234
231
  }
235
232
 
233
+ // 4.5. Import payload attestations to fork choice (Gloas)
234
+ //
235
+ if (isGloasBeaconBlock(block.message)) {
236
+ for (const payloadAttestation of block.message.body.payloadAttestations) {
237
+ try {
238
+ // Extract PTC indices from aggregation bits
239
+ const ptcIndices: number[] = [];
240
+ for (let i = 0; i < payloadAttestation.aggregationBits.bitLen; i++) {
241
+ if (payloadAttestation.aggregationBits.get(i)) {
242
+ ptcIndices.push(i);
243
+ }
244
+ }
245
+
246
+ if (ptcIndices.length > 0) {
247
+ this.forkChoice.notifyPtcMessages(
248
+ toRootHex(payloadAttestation.data.beaconBlockRoot),
249
+ ptcIndices,
250
+ payloadAttestation.data.payloadPresent
251
+ );
252
+ }
253
+ } catch (e) {
254
+ this.logger.warn("Error processing PayloadAttestation from block", {slot: blockSlot}, e as Error);
255
+ }
256
+ }
257
+ }
258
+
236
259
  // 5. Compute head. If new head, immediately stateCache.setHeadState()
237
260
 
238
261
  const oldHead = this.forkChoice.getHead();
@@ -348,7 +371,7 @@ export async function importBlock(
348
371
  // 3) Proposer boost reorg related flag is turned on (this is checked inside the function)
349
372
  // 4) Block meets the criteria of being re-orged out (this is also checked inside the function)
350
373
  const result = this.forkChoice.shouldOverrideForkChoiceUpdate(
351
- blockSummary.blockRoot,
374
+ blockSummary,
352
375
  this.clock.secFromSlot(currentSlot),
353
376
  currentSlot
354
377
  );
@@ -444,7 +467,12 @@ export async function importBlock(
444
467
  this.metrics?.currentActiveValidators.set(activeValidatorsCount);
445
468
  this.metrics?.currentValidators.set({status: "active"}, activeValidatorsCount);
446
469
 
447
- const parentBlockSummary = this.forkChoice.getBlock(checkpointState.latestBlockHeader.parentRoot);
470
+ const parentBlockSummary = isGloasBeaconBlock(block.message)
471
+ ? this.forkChoice.getBlockHexAndBlockHash(
472
+ toRootHex(checkpointState.latestBlockHeader.parentRoot),
473
+ toRootHex(block.message.body.signedExecutionPayloadBid.message.parentBlockHash)
474
+ )
475
+ : this.forkChoice.getBlockDefaultStatus(checkpointState.latestBlockHeader.parentRoot);
448
476
 
449
477
  if (parentBlockSummary) {
450
478
  const justifiedCheckpoint = checkpointState.currentJustifiedCheckpoint;
@@ -1,6 +1,7 @@
1
1
  import {SignedBeaconBlock} from "@lodestar/types";
2
2
  import {isErrorAborted, toRootHex} from "@lodestar/utils";
3
3
  import {Metrics} from "../../metrics/metrics.js";
4
+ import {nextEventLoop} from "../../util/eventLoop.js";
4
5
  import {JobItemQueue, isQueueErrorAborted} from "../../util/queue/index.js";
5
6
  import type {BeaconChain} from "../chain.js";
6
7
  import {BlockError, BlockErrorCode, isBlockErrorAborted} from "../errors/index.js";
@@ -100,9 +101,9 @@ export async function processBlocks(
100
101
  );
101
102
 
102
103
  for (const fullyVerifiedBlock of fullyVerifiedBlocks) {
103
- // No need to sleep(0) here since `importBlock` includes a disk write
104
104
  // TODO: Consider batching importBlock too if it takes significant time
105
105
  await importBlock.call(this, fullyVerifiedBlock, opts);
106
+ await nextEventLoop();
106
107
  }
107
108
  } catch (e) {
108
109
  if (isErrorAborted(e) || isQueueErrorAborted(e) || isBlockErrorAborted(e)) {
@@ -29,6 +29,9 @@ export async function verifyBlocksDataAvailability(
29
29
 
30
30
  const availableTime = Math.max(0, Math.max(...blocks.map((blockInput) => blockInput.getTimeComplete())));
31
31
  const dataAvailabilityStatuses: DataAvailabilityStatus[] = blocks.map((blockInput) => {
32
+ if (blockInput.type === DAType.NoData) {
33
+ return DataAvailabilityStatus.NotRequired;
34
+ }
32
35
  if (blockInput.type === DAType.PreData) {
33
36
  return DataAvailabilityStatus.PreData;
34
37
  }
@@ -21,7 +21,7 @@ import {Metrics} from "../../metrics/metrics.js";
21
21
  import {IClock} from "../../util/clock.js";
22
22
  import {BlockError, BlockErrorCode} from "../errors/index.js";
23
23
  import {BlockProcessOpts} from "../options.js";
24
- import {isBlockInputBlobs, isBlockInputColumns} from "./blockInput/blockInput.js";
24
+ import {isBlockInputBlobs, isBlockInputColumns, isBlockInputNoData} from "./blockInput/blockInput.js";
25
25
  import {IBlockInput} from "./blockInput/types.js";
26
26
  import {ImportBlockOpts} from "./types.js";
27
27
 
@@ -51,7 +51,8 @@ type VerifyBlockExecutionResponse =
51
51
  | VerifyExecutionErrorResponse
52
52
  | {executionStatus: ExecutionStatus.Valid; lvhResponse: LVHValidResponse; execError: null}
53
53
  | {executionStatus: ExecutionStatus.Syncing; lvhResponse?: LVHValidResponse; execError: null}
54
- | {executionStatus: ExecutionStatus.PreMerge; lvhResponse: undefined; execError: null};
54
+ | {executionStatus: ExecutionStatus.PreMerge; lvhResponse: undefined; execError: null}
55
+ | {executionStatus: ExecutionStatus.PayloadSeparated; lvhResponse: undefined; execError: null};
55
56
 
56
57
  /**
57
58
  * Verifies 1 or more execution payloads from a linear sequence of blocks.
@@ -148,6 +149,12 @@ export async function verifyBlockExecutionPayload(
148
149
  preState0: CachedBeaconStateAllForks
149
150
  ): Promise<VerifyBlockExecutionResponse> {
150
151
  const block = blockInput.getBlock();
152
+
153
+ // Gloas block doesn't have execution payload. Return right away
154
+ if (isBlockInputNoData(blockInput)) {
155
+ return {executionStatus: ExecutionStatus.PayloadSeparated, lvhResponse: undefined, execError: null};
156
+ }
157
+
151
158
  /** Not null if execution is enabled */
152
159
  const executionPayloadEnabled =
153
160
  isExecutionStateType(preState0) &&
@@ -1,7 +1,7 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
2
  import {IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
3
3
  import {computeStartSlotAtEpoch} from "@lodestar/state-transition";
4
- import {RootHex, Slot} from "@lodestar/types";
4
+ import {RootHex, Slot, isGloasBeaconBlock} from "@lodestar/types";
5
5
  import {toRootHex} from "@lodestar/utils";
6
6
  import {IClock} from "../../util/clock.js";
7
7
  import {BlockError, BlockErrorCode} from "../errors/index.js";
@@ -90,7 +90,12 @@ export function verifyBlocksSanityChecks(
90
90
  } else {
91
91
  // When importing a block segment, only the first NON-IGNORED block must be known to the fork-choice.
92
92
  const parentRoot = toRootHex(block.message.parentRoot);
93
- parentBlock = chain.forkChoice.getBlockHex(parentRoot);
93
+ parentBlock = isGloasBeaconBlock(block.message)
94
+ ? chain.forkChoice.getBlockHexAndBlockHash(
95
+ parentRoot,
96
+ toRootHex(block.message.body.signedExecutionPayloadBid.message.parentBlockHash)
97
+ )
98
+ : chain.forkChoice.getBlockHexDefaultStatus(parentRoot);
94
99
  if (!parentBlock) {
95
100
  throw new BlockError(block, {code: BlockErrorCode.PARENT_UNKNOWN, parentRoot});
96
101
  }
@@ -1,7 +1,9 @@
1
- import {fulu} from "@lodestar/types";
2
- import {prettyPrintIndices, toRootHex} from "@lodestar/utils";
1
+ import {ForkPostDeneb, isForkPostDeneb} from "@lodestar/params";
2
+ import {SignedBeaconBlock} from "@lodestar/types";
3
+ import {fromHex, toRootHex} from "@lodestar/utils";
4
+ import {getBlobKzgCommitments} from "../../util/dataColumns.js";
3
5
  import {BeaconChain} from "../chain.js";
4
- import {IBlockInput, isBlockInputBlobs, isBlockInputColumns} from "./blockInput/index.js";
6
+ import {IBlockInput, IDataColumnsInput, isBlockInputBlobs, isBlockInputColumns} from "./blockInput/index.js";
5
7
  import {BLOB_AVAILABILITY_TIMEOUT} from "./verifyBlocksDataAvailability.js";
6
8
 
7
9
  /**
@@ -10,126 +12,128 @@ import {BLOB_AVAILABILITY_TIMEOUT} from "./verifyBlocksDataAvailability.js";
10
12
  *
11
13
  * This operation may be performed before, during or after importing to the fork-choice. As long as errors
12
14
  * are handled properly for eventual consistency.
15
+ *
16
+ * Block+blobs (pre-fulu) and data columns (fulu+) are written in parallel.
13
17
  */
14
- export async function writeBlockInputToDb(this: BeaconChain, blocksInputs: IBlockInput[]): Promise<void> {
15
- const fnPromises: Promise<void>[] = [];
16
- // track slots for logging
17
- const slots: number[] = [];
18
-
19
- for (const blockInput of blocksInputs) {
20
- const block = blockInput.getBlock();
21
- const slot = block.message.slot;
22
- slots.push(slot);
23
- const blockRoot = this.config.getForkTypes(block.message.slot).BeaconBlock.hashTreeRoot(block.message);
24
- const blockRootHex = toRootHex(blockRoot);
25
- const blockBytes = this.serializedCache.get(block);
26
- if (blockBytes) {
27
- // skip serializing data if we already have it
28
- this.metrics?.importBlock.persistBlockWithSerializedDataCount.inc();
29
- fnPromises.push(this.db.block.putBinary(this.db.block.getId(block), blockBytes));
30
- } else {
31
- this.metrics?.importBlock.persistBlockNoSerializedDataCount.inc();
32
- fnPromises.push(this.db.block.add(block));
33
- }
18
+ export async function writeBlockInputToDb(this: BeaconChain, blockInput: IBlockInput): Promise<void> {
19
+ const promises: Promise<void>[] = [writeBlockAndBlobsToDb.call(this, blockInput)];
34
20
 
35
- this.logger.debug("Persist block to hot DB", {
36
- slot: block.message.slot,
37
- root: blockRootHex,
38
- inputType: blockInput.type,
39
- });
21
+ if (isBlockInputColumns(blockInput)) {
22
+ promises.push(writeDataColumnsToDb.call(this, blockInput));
23
+ }
40
24
 
41
- if (!blockInput.hasAllData()) {
42
- await blockInput.waitForAllData(BLOB_AVAILABILITY_TIMEOUT);
43
- }
25
+ await Promise.all(promises);
26
+ this.logger.debug("Persisted blockInput to db", {slot: blockInput.slot, root: blockInput.blockRootHex});
27
+ }
44
28
 
45
- // NOTE: Old data is pruned on archive
46
- if (isBlockInputColumns(blockInput)) {
47
- if (!blockInput.hasComputedAllData()) {
48
- // Supernodes may only have a subset of the data columns by the time the block begins to be imported
49
- // because full data availability can be assumed after NUMBER_OF_COLUMNS / 2 columns are available.
50
- // Here, however, all data columns must be fully available/reconstructed before persisting to the DB.
51
- await blockInput.waitForComputedAllData(BLOB_AVAILABILITY_TIMEOUT).catch(() => {
52
- this.logger.debug("Failed to wait for computed all data", {slot, blockRoot: blockRootHex});
53
- });
54
- }
29
+ async function writeBlockAndBlobsToDb(this: BeaconChain, blockInput: IBlockInput): Promise<void> {
30
+ const block = blockInput.getBlock();
31
+ const slot = block.message.slot;
32
+ const blockRoot = this.config.getForkTypes(slot).BeaconBlock.hashTreeRoot(block.message);
33
+ const blockRootHex = toRootHex(blockRoot);
34
+ const numBlobs = isForkPostDeneb(blockInput.forkName)
35
+ ? getBlobKzgCommitments(blockInput.forkName, block as SignedBeaconBlock<ForkPostDeneb>).length
36
+ : undefined;
37
+ const fnPromises: Promise<void>[] = [];
55
38
 
56
- const {custodyColumns} = this.custodyConfig;
57
- const blobsLen = (block.message as fulu.BeaconBlock).body.blobKzgCommitments.length;
58
- let dataColumnsLen: number;
59
- if (blobsLen === 0) {
60
- dataColumnsLen = 0;
61
- } else {
62
- dataColumnsLen = custodyColumns.length;
63
- }
39
+ const blockBytes = this.serializedCache.get(block);
40
+ if (blockBytes) {
41
+ // skip serializing data if we already have it
42
+ this.metrics?.importBlock.persistBlockWithSerializedDataCount.inc();
43
+ fnPromises.push(this.db.block.putBinary(this.db.block.getId(block), blockBytes));
44
+ } else {
45
+ this.metrics?.importBlock.persistBlockNoSerializedDataCount.inc();
46
+ fnPromises.push(this.db.block.add(block));
47
+ }
64
48
 
65
- const dataColumnSidecars = blockInput.getCustodyColumns();
66
- if (dataColumnSidecars.length !== dataColumnsLen) {
67
- this.logger.debug(
68
- `Invalid dataColumnSidecars=${dataColumnSidecars.length} for custody expected custodyColumnsLen=${dataColumnsLen}`
69
- );
70
- }
49
+ this.logger.debug("Persist block to hot DB", {slot, root: blockRootHex, inputType: blockInput.type, numBlobs});
71
50
 
72
- const binaryPuts = [];
73
- const nonbinaryPuts = [];
74
- for (const dataColumnSidecar of dataColumnSidecars) {
75
- // skip reserializing column if we already have it
76
- const serialized = this.serializedCache.get(dataColumnSidecar);
77
- if (serialized) {
78
- binaryPuts.push({key: dataColumnSidecar.index, value: serialized});
79
- } else {
80
- nonbinaryPuts.push(dataColumnSidecar);
51
+ if (isBlockInputBlobs(blockInput)) {
52
+ fnPromises.push(
53
+ (async () => {
54
+ if (!blockInput.hasAllData()) {
55
+ await blockInput.waitForAllData(BLOB_AVAILABILITY_TIMEOUT);
81
56
  }
82
- }
83
- fnPromises.push(this.db.dataColumnSidecar.putManyBinary(blockRoot, binaryPuts));
84
- fnPromises.push(this.db.dataColumnSidecar.putMany(blockRoot, nonbinaryPuts));
85
- this.logger.debug("Persisted dataColumnSidecars to hot DB", {
86
- slot: block.message.slot,
87
- root: blockRootHex,
88
- dataColumnSidecars: dataColumnSidecars.length,
89
- numBlobs: blobsLen,
90
- custodyColumns: custodyColumns.length,
91
- });
92
- } else if (isBlockInputBlobs(blockInput)) {
93
- const blobSidecars = blockInput.getBlobs();
94
- fnPromises.push(this.db.blobSidecars.add({blockRoot, slot: block.message.slot, blobSidecars}));
95
- this.logger.debug("Persisted blobSidecars to hot DB", {
96
- blobsLen: blobSidecars.length,
97
- slot: block.message.slot,
98
- root: blockRootHex,
99
- });
100
- }
57
+ const blobSidecars = blockInput.getBlobs();
58
+ await this.db.blobSidecars.add({blockRoot, slot, blobSidecars});
59
+ this.logger.debug("Persisted blobSidecars to hot DB", {
60
+ slot,
61
+ root: blockRootHex,
62
+ numBlobs: blobSidecars.length,
63
+ });
64
+ })()
65
+ );
66
+ }
67
+
68
+ await Promise.all(fnPromises);
69
+ }
70
+
71
+ /**
72
+ * Persists data columns to DB for a given block. Accepts a narrow sub-interface of IBlockInput
73
+ * so it can be reused across forks (e.g. Fulu, Gloas).
74
+ *
75
+ * NOTE: Old data is pruned on archive.
76
+ */
77
+ export async function writeDataColumnsToDb(this: BeaconChain, blockInput: IDataColumnsInput): Promise<void> {
78
+ const {slot, blockRootHex} = blockInput;
79
+ const blockRoot = fromHex(blockRootHex);
101
80
 
102
- await Promise.all(fnPromises);
103
- this.logger.debug("Persisted blocksInput to db", {
104
- blocksInput: blocksInputs.length,
105
- slots: prettyPrintIndices(slots),
81
+ if (!blockInput.hasComputedAllData()) {
82
+ // Supernodes may only have a subset of the data columns by the time the block begins to be imported
83
+ // because full data availability can be assumed after NUMBER_OF_COLUMNS / 2 columns are available.
84
+ // Here, however, all data columns must be fully available/reconstructed before persisting to the DB.
85
+ await blockInput.waitForComputedAllData(BLOB_AVAILABILITY_TIMEOUT).catch(() => {
86
+ this.logger.debug("Failed to wait for computed all data", {slot, blockRoot: blockRootHex});
106
87
  });
107
88
  }
89
+
90
+ const {custodyColumns} = this.custodyConfig;
91
+ const dataColumnSidecars = blockInput.getCustodyColumns();
92
+
93
+ const binaryPuts: {key: number; value: Uint8Array}[] = [];
94
+ const nonbinaryPuts = [];
95
+ for (const dataColumnSidecar of dataColumnSidecars) {
96
+ // skip reserializing column if we already have it
97
+ const serialized = this.serializedCache.get(dataColumnSidecar);
98
+ if (serialized) {
99
+ binaryPuts.push({key: dataColumnSidecar.index, value: serialized});
100
+ } else {
101
+ nonbinaryPuts.push(dataColumnSidecar);
102
+ }
103
+ }
104
+
105
+ await Promise.all([
106
+ this.db.dataColumnSidecar.putManyBinary(blockRoot, binaryPuts),
107
+ this.db.dataColumnSidecar.putMany(blockRoot, nonbinaryPuts),
108
+ ]);
109
+
110
+ this.logger.debug("Persisted dataColumnSidecars to hot DB", {
111
+ slot,
112
+ root: blockRootHex,
113
+ dataColumnSidecars: dataColumnSidecars.length,
114
+ custodyColumns: custodyColumns.length,
115
+ numBlobs: dataColumnSidecars[0]?.column.length,
116
+ });
108
117
  }
109
118
 
110
- export async function persistBlockInputs(this: BeaconChain, blockInputs: IBlockInput[]): Promise<void> {
119
+ export async function persistBlockInput(this: BeaconChain, blockInput: IBlockInput): Promise<void> {
111
120
  await writeBlockInputToDb
112
- .call(this, blockInputs)
121
+ .call(this, blockInput)
113
122
  .catch((e) => {
114
123
  this.logger.debug(
115
124
  "Error persisting block input in hot db",
116
125
  {
117
- count: blockInputs.length,
118
- slot: blockInputs[0].slot,
119
- root: blockInputs[0].blockRootHex,
126
+ slot: blockInput.slot,
127
+ root: blockInput.blockRootHex,
120
128
  },
121
129
  e
122
130
  );
123
131
  })
124
132
  .finally(() => {
125
- for (const blockInput of blockInputs) {
126
- this.seenBlockInputCache.prune(blockInput.blockRootHex);
127
- }
128
- if (blockInputs.length === 1) {
129
- this.logger.debug("Pruned block input", {
130
- slot: blockInputs[0].slot,
131
- root: blockInputs[0].blockRootHex,
132
- });
133
- }
133
+ this.seenBlockInputCache.prune(blockInput.blockRootHex);
134
+ this.logger.debug("Pruned block input", {
135
+ slot: blockInput.slot,
136
+ root: blockInput.blockRootHex,
137
+ });
134
138
  });
135
139
  }
@@ -7,7 +7,7 @@ import {Worker, spawn} from "@chainsafe/threads";
7
7
  self = undefined;
8
8
 
9
9
  import {PublicKey} from "@chainsafe/blst";
10
- import {ISignatureSet, Index2PubkeyCache} from "@lodestar/state-transition";
10
+ import {ISignatureSet, PubkeyCache} from "@lodestar/state-transition";
11
11
  import {Logger} from "@lodestar/utils";
12
12
  import {Metrics} from "../../../metrics/index.js";
13
13
  import {LinkedList} from "../../../util/array.js";
@@ -34,7 +34,7 @@ const workerDir = process.env.NODE_ENV === "test" ? "../../../../lib/chain/bls/m
34
34
  export type BlsMultiThreadWorkerPoolModules = {
35
35
  logger: Logger;
36
36
  metrics: Metrics | null;
37
- index2pubkey: Index2PubkeyCache;
37
+ pubkeyCache: PubkeyCache;
38
38
  };
39
39
 
40
40
  export type BlsMultiThreadWorkerPoolOptions = {
@@ -114,7 +114,7 @@ type WorkerDescriptor = {
114
114
  export class BlsMultiThreadWorkerPool implements IBlsVerifier {
115
115
  private readonly logger: Logger;
116
116
  private readonly metrics: Metrics | null;
117
- private readonly index2pubkey: Index2PubkeyCache;
117
+ private readonly pubkeyCache: PubkeyCache;
118
118
 
119
119
  private readonly workers: WorkerDescriptor[];
120
120
  private readonly jobs = new LinkedList<JobQueueItem>();
@@ -130,10 +130,10 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
130
130
  private workersBusy = 0;
131
131
 
132
132
  constructor(options: BlsMultiThreadWorkerPoolOptions, modules: BlsMultiThreadWorkerPoolModules) {
133
- const {logger, metrics, index2pubkey} = modules;
133
+ const {logger, metrics, pubkeyCache} = modules;
134
134
  this.logger = logger;
135
135
  this.metrics = metrics;
136
- this.index2pubkey = index2pubkey;
136
+ this.pubkeyCache = pubkeyCache;
137
137
  this.blsVerifyAllMultiThread = options.blsVerifyAllMultiThread ?? false;
138
138
 
139
139
  // Use compressed for herumi for now.
@@ -173,7 +173,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
173
173
  try {
174
174
  return verifySignatureSetsMaybeBatch(
175
175
  sets.map((set) => ({
176
- publicKey: getAggregatedPubkey(set, this.index2pubkey),
176
+ publicKey: getAggregatedPubkey(set, this.pubkeyCache),
177
177
  message: set.signingRoot.valueOf(),
178
178
  signature: set.signature,
179
179
  }))
@@ -398,7 +398,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
398
398
  try {
399
399
  // Note: This can throw, must be handled per-job.
400
400
  // Pubkey and signature aggregation is defered here
401
- workReq = await jobItemWorkReq(job, this.index2pubkey, this.metrics);
401
+ workReq = await jobItemWorkReq(job, this.pubkeyCache, this.metrics);
402
402
  } catch (e) {
403
403
  this.metrics?.blsThreadPool.errorAggregateSignatureSetsCount.inc({type: job.type});
404
404
 
@@ -1,5 +1,5 @@
1
1
  import {PublicKey, asyncAggregateWithRandomness} from "@chainsafe/blst";
2
- import {ISignatureSet, Index2PubkeyCache, SignatureSetType} from "@lodestar/state-transition";
2
+ import {ISignatureSet, PubkeyCache, SignatureSetType} from "@lodestar/state-transition";
3
3
  import {Metrics} from "../../../metrics/metrics.js";
4
4
  import {LinkedList} from "../../../util/array.js";
5
5
  import {VerifySignatureOpts} from "../interface.js";
@@ -50,7 +50,7 @@ export function jobItemSigSets(job: JobQueueItem): number {
50
50
  */
51
51
  export async function jobItemWorkReq(
52
52
  job: JobQueueItem,
53
- index2pubkey: Index2PubkeyCache,
53
+ pubkeyCache: PubkeyCache,
54
54
  metrics: Metrics | null
55
55
  ): Promise<BlsWorkReq> {
56
56
  switch (job.type) {
@@ -59,7 +59,7 @@ export async function jobItemWorkReq(
59
59
  opts: job.opts,
60
60
  sets: job.sets.map((set) => ({
61
61
  // this can throw, handled in the consumer code
62
- publicKey: getAggregatedPubkey(set, index2pubkey, metrics).toBytes(),
62
+ publicKey: getAggregatedPubkey(set, pubkeyCache, metrics).toBytes(),
63
63
  signature: set.signature,
64
64
  message: set.signingRoot,
65
65
  })),
@@ -1,5 +1,5 @@
1
1
  import {PublicKey, Signature, aggregatePublicKeys, aggregateSignatures, verify} from "@chainsafe/blst";
2
- import {ISignatureSet, Index2PubkeyCache} from "@lodestar/state-transition";
2
+ import {ISignatureSet, PubkeyCache} from "@lodestar/state-transition";
3
3
  import {Metrics} from "../../metrics/index.js";
4
4
  import {IBlsVerifier} from "./interface.js";
5
5
  import {verifySignatureSetsMaybeBatch} from "./maybeBatch.js";
@@ -7,18 +7,18 @@ import {getAggregatedPubkey, getAggregatedPubkeysCount} from "./utils.js";
7
7
 
8
8
  export class BlsSingleThreadVerifier implements IBlsVerifier {
9
9
  private readonly metrics: Metrics | null;
10
- private readonly index2pubkey: Index2PubkeyCache;
10
+ private readonly pubkeyCache: PubkeyCache;
11
11
 
12
- constructor({metrics = null, index2pubkey}: {metrics: Metrics | null; index2pubkey: Index2PubkeyCache}) {
12
+ constructor({metrics = null, pubkeyCache}: {metrics: Metrics | null; pubkeyCache: PubkeyCache}) {
13
13
  this.metrics = metrics;
14
- this.index2pubkey = index2pubkey;
14
+ this.pubkeyCache = pubkeyCache;
15
15
  }
16
16
 
17
17
  async verifySignatureSets(sets: ISignatureSet[]): Promise<boolean> {
18
18
  this.metrics?.bls.aggregatedPubkeys.inc(getAggregatedPubkeysCount(sets));
19
19
 
20
20
  const setsAggregated = sets.map((set) => ({
21
- publicKey: getAggregatedPubkey(set, this.index2pubkey, this.metrics),
21
+ publicKey: getAggregatedPubkey(set, this.pubkeyCache, this.metrics),
22
22
  message: set.signingRoot,
23
23
  signature: set.signature,
24
24
  }));
@@ -1,22 +1,25 @@
1
1
  import {PublicKey, aggregatePublicKeys} from "@chainsafe/blst";
2
- import {ISignatureSet, Index2PubkeyCache, SignatureSetType} from "@lodestar/state-transition";
2
+ import {ISignatureSet, PubkeyCache, SignatureSetType} from "@lodestar/state-transition";
3
3
  import {Metrics} from "../../metrics/metrics.js";
4
4
 
5
5
  export function getAggregatedPubkey(
6
6
  signatureSet: ISignatureSet,
7
- index2pubkey: Index2PubkeyCache,
7
+ pubkeyCache: PubkeyCache,
8
8
  metrics: Metrics | null = null
9
9
  ): PublicKey {
10
10
  switch (signatureSet.type) {
11
11
  case SignatureSetType.single:
12
12
  return signatureSet.pubkey;
13
13
 
14
- case SignatureSetType.indexed:
15
- return index2pubkey[signatureSet.index];
14
+ case SignatureSetType.indexed: {
15
+ return pubkeyCache.getOrThrow(signatureSet.index);
16
+ }
16
17
 
17
18
  case SignatureSetType.aggregate: {
18
19
  const timer = metrics?.blsThreadPool.pubkeysAggregationMainThreadDuration.startTimer();
19
- const pubkeys = signatureSet.indices.map((i) => index2pubkey[i]);
20
+ const pubkeys = signatureSet.indices.map((i) => {
21
+ return pubkeyCache.getOrThrow(i);
22
+ });
20
23
  const aggregated = aggregatePublicKeys(pubkeys);
21
24
  timer?.();
22
25
  return aggregated;