@lodestar/beacon-node 1.41.0-dev.2074a31ba7 → 1.41.0-dev.20f622cc52

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 (358) 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/node/utils.d.ts +1 -1
  14. package/lib/api/impl/node/utils.d.ts.map +1 -1
  15. package/lib/api/impl/node/utils.js.map +1 -1
  16. package/lib/api/impl/validator/index.d.ts.map +1 -1
  17. package/lib/api/impl/validator/index.js +106 -8
  18. package/lib/api/impl/validator/index.js.map +1 -1
  19. package/lib/chain/archiveStore/archiveStore.d.ts +1 -0
  20. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  21. package/lib/chain/archiveStore/archiveStore.js +9 -0
  22. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  23. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +5 -6
  24. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  25. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +9 -10
  26. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  27. package/lib/chain/archiveStore/historicalState/worker.js +3 -3
  28. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  29. package/lib/chain/archiveStore/utils/archivePayloads.d.ts +7 -0
  30. package/lib/chain/archiveStore/utils/archivePayloads.d.ts.map +1 -0
  31. package/lib/chain/archiveStore/utils/archivePayloads.js +10 -0
  32. package/lib/chain/archiveStore/utils/archivePayloads.js.map +1 -0
  33. package/lib/chain/archiveStore/utils/updateBackfillRange.js +1 -1
  34. package/lib/chain/archiveStore/utils/updateBackfillRange.js.map +1 -1
  35. package/lib/chain/blocks/blockInput/blockInput.d.ts +20 -2
  36. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  37. package/lib/chain/blocks/blockInput/blockInput.js +47 -0
  38. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  39. package/lib/chain/blocks/blockInput/types.d.ts +2 -1
  40. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  41. package/lib/chain/blocks/blockInput/types.js +1 -0
  42. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  43. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  44. package/lib/chain/blocks/importBlock.js +26 -3
  45. package/lib/chain/blocks/importBlock.js.map +1 -1
  46. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  47. package/lib/chain/blocks/verifyBlocksDataAvailability.js +3 -0
  48. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  49. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +4 -0
  50. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  51. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -1
  52. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  53. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  54. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -1
  55. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  56. package/lib/chain/bls/multithread/index.d.ts +3 -3
  57. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  58. package/lib/chain/bls/multithread/index.js +5 -5
  59. package/lib/chain/bls/multithread/index.js.map +1 -1
  60. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  61. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  62. package/lib/chain/bls/multithread/jobItem.js +2 -2
  63. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  64. package/lib/chain/bls/singleThread.d.ts +4 -4
  65. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  66. package/lib/chain/bls/singleThread.js +4 -4
  67. package/lib/chain/bls/singleThread.js.map +1 -1
  68. package/lib/chain/bls/utils.d.ts +2 -2
  69. package/lib/chain/bls/utils.d.ts.map +1 -1
  70. package/lib/chain/bls/utils.js +7 -4
  71. package/lib/chain/bls/utils.js.map +1 -1
  72. package/lib/chain/chain.d.ts +6 -9
  73. package/lib/chain/chain.d.ts.map +1 -1
  74. package/lib/chain/chain.js +38 -22
  75. package/lib/chain/chain.js.map +1 -1
  76. package/lib/chain/emitter.d.ts +5 -5
  77. package/lib/chain/emitter.d.ts.map +1 -1
  78. package/lib/chain/errors/executionPayloadEnvelope.d.ts +2 -2
  79. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  80. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  81. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  82. package/lib/chain/forkChoice/index.js +30 -24
  83. package/lib/chain/forkChoice/index.js.map +1 -1
  84. package/lib/chain/interface.d.ts +4 -6
  85. package/lib/chain/interface.d.ts.map +1 -1
  86. package/lib/chain/interface.js.map +1 -1
  87. package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
  88. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  89. package/lib/chain/options.d.ts.map +1 -1
  90. package/lib/chain/options.js.map +1 -1
  91. package/lib/chain/prepareNextSlot.js +3 -3
  92. package/lib/chain/prepareNextSlot.js.map +1 -1
  93. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +10 -2
  94. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  95. package/lib/chain/produceBlock/computeNewStateRoot.js +24 -2
  96. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  97. package/lib/chain/produceBlock/produceBlockBody.d.ts +22 -7
  98. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  99. package/lib/chain/produceBlock/produceBlockBody.js +109 -10
  100. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  101. package/lib/chain/regen/queued.d.ts.map +1 -1
  102. package/lib/chain/regen/queued.js +4 -1
  103. package/lib/chain/regen/queued.js.map +1 -1
  104. package/lib/chain/regen/regen.d.ts.map +1 -1
  105. package/lib/chain/regen/regen.js +5 -1
  106. package/lib/chain/regen/regen.js.map +1 -1
  107. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  108. package/lib/chain/seenCache/seenGossipBlockInput.js +15 -7
  109. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  110. package/lib/chain/validation/aggregateAndProof.js +1 -1
  111. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  112. package/lib/chain/validation/attestation.d.ts.map +1 -1
  113. package/lib/chain/validation/attestation.js +7 -4
  114. package/lib/chain/validation/attestation.js.map +1 -1
  115. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  116. package/lib/chain/validation/attesterSlashing.js +9 -2
  117. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  118. package/lib/chain/validation/blobSidecar.js +2 -2
  119. package/lib/chain/validation/blobSidecar.js.map +1 -1
  120. package/lib/chain/validation/block.d.ts.map +1 -1
  121. package/lib/chain/validation/block.js +6 -3
  122. package/lib/chain/validation/block.js.map +1 -1
  123. package/lib/chain/validation/dataColumnSidecar.d.ts +2 -2
  124. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  125. package/lib/chain/validation/dataColumnSidecar.js +1 -1
  126. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  127. package/lib/chain/validation/executionPayloadBid.js +1 -2
  128. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  129. package/lib/chain/validation/executionPayloadEnvelope.js +4 -4
  130. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  131. package/lib/chain/validation/payloadAttestationMessage.js +9 -3
  132. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  133. package/lib/chain/validation/proposerSlashing.js +1 -1
  134. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  135. package/lib/chain/validation/syncCommitteeContributionAndProof.js +1 -1
  136. package/lib/db/beacon.d.ts +3 -1
  137. package/lib/db/beacon.d.ts.map +1 -1
  138. package/lib/db/beacon.js +5 -1
  139. package/lib/db/beacon.js.map +1 -1
  140. package/lib/db/buckets.d.ts +3 -1
  141. package/lib/db/buckets.d.ts.map +1 -1
  142. package/lib/db/buckets.js +2 -0
  143. package/lib/db/buckets.js.map +1 -1
  144. package/lib/db/interface.d.ts +3 -1
  145. package/lib/db/interface.d.ts.map +1 -1
  146. package/lib/db/repositories/blockArchive.d.ts.map +1 -1
  147. package/lib/db/repositories/blockArchive.js +1 -2
  148. package/lib/db/repositories/blockArchive.js.map +1 -1
  149. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  150. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  151. package/lib/db/repositories/dataColumnSidecar.d.ts +5 -3
  152. package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -1
  153. package/lib/db/repositories/dataColumnSidecar.js +14 -1
  154. package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
  155. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +5 -3
  156. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  157. package/lib/db/repositories/dataColumnSidecarArchive.js +14 -1
  158. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  159. package/lib/db/repositories/executionPayloadEnvelope.d.ts +19 -0
  160. package/lib/db/repositories/executionPayloadEnvelope.d.ts.map +1 -0
  161. package/lib/db/repositories/executionPayloadEnvelope.js +22 -0
  162. package/lib/db/repositories/executionPayloadEnvelope.js.map +1 -0
  163. package/lib/db/repositories/executionPayloadEnvelopeArchive.d.ts +18 -0
  164. package/lib/db/repositories/executionPayloadEnvelopeArchive.d.ts.map +1 -0
  165. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +28 -0
  166. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -0
  167. package/lib/db/repositories/index.d.ts +2 -0
  168. package/lib/db/repositories/index.d.ts.map +1 -1
  169. package/lib/db/repositories/index.js +2 -0
  170. package/lib/db/repositories/index.js.map +1 -1
  171. package/lib/execution/engine/http.d.ts +1 -0
  172. package/lib/execution/engine/http.d.ts.map +1 -1
  173. package/lib/execution/engine/http.js +3 -0
  174. package/lib/execution/engine/http.js.map +1 -1
  175. package/lib/metrics/metrics/beacon.d.ts +1 -0
  176. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  177. package/lib/metrics/metrics/beacon.js +5 -0
  178. package/lib/metrics/metrics/beacon.js.map +1 -1
  179. package/lib/metrics/metrics/lodestar.d.ts +8 -0
  180. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  181. package/lib/metrics/metrics/lodestar.js +14 -0
  182. package/lib/metrics/metrics/lodestar.js.map +1 -1
  183. package/lib/monitoring/service.d.ts +2 -2
  184. package/lib/monitoring/service.d.ts.map +1 -1
  185. package/lib/monitoring/service.js +3 -2
  186. package/lib/monitoring/service.js.map +1 -1
  187. package/lib/network/core/networkCore.d.ts +3 -3
  188. package/lib/network/core/networkCore.d.ts.map +1 -1
  189. package/lib/network/core/networkCore.js.map +1 -1
  190. package/lib/network/core/networkCoreWorkerHandler.d.ts +3 -3
  191. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  192. package/lib/network/core/types.d.ts +2 -2
  193. package/lib/network/core/types.d.ts.map +1 -1
  194. package/lib/network/events.d.ts +2 -1
  195. package/lib/network/events.d.ts.map +1 -1
  196. package/lib/network/events.js.map +1 -1
  197. package/lib/network/gossip/encoding.d.ts +3 -3
  198. package/lib/network/gossip/encoding.d.ts.map +1 -1
  199. package/lib/network/gossip/encoding.js.map +1 -1
  200. package/lib/network/gossip/gossipsub.d.ts +13 -4
  201. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  202. package/lib/network/gossip/gossipsub.js +47 -20
  203. package/lib/network/gossip/gossipsub.js.map +1 -1
  204. package/lib/network/gossip/interface.d.ts +6 -6
  205. package/lib/network/gossip/interface.d.ts.map +1 -1
  206. package/lib/network/gossip/scoringParameters.d.ts +1 -1
  207. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  208. package/lib/network/gossip/scoringParameters.js +1 -1
  209. package/lib/network/gossip/scoringParameters.js.map +1 -1
  210. package/lib/network/gossip/topic.d.ts +113 -63
  211. package/lib/network/gossip/topic.d.ts.map +1 -1
  212. package/lib/network/gossip/topic.js +2 -2
  213. package/lib/network/gossip/topic.js.map +1 -1
  214. package/lib/network/interface.d.ts +6 -5
  215. package/lib/network/interface.d.ts.map +1 -1
  216. package/lib/network/libp2p/index.d.ts +1 -1
  217. package/lib/network/libp2p/index.d.ts.map +1 -1
  218. package/lib/network/libp2p/index.js +7 -2
  219. package/lib/network/libp2p/index.js.map +1 -1
  220. package/lib/network/network.d.ts +5 -4
  221. package/lib/network/network.d.ts.map +1 -1
  222. package/lib/network/network.js +10 -1
  223. package/lib/network/network.js.map +1 -1
  224. package/lib/network/options.d.ts.map +1 -1
  225. package/lib/network/options.js +3 -0
  226. package/lib/network/options.js.map +1 -1
  227. package/lib/network/peers/datastore.d.ts +7 -5
  228. package/lib/network/peers/datastore.d.ts.map +1 -1
  229. package/lib/network/peers/datastore.js +10 -10
  230. package/lib/network/peers/datastore.js.map +1 -1
  231. package/lib/network/peers/peerManager.d.ts +3 -0
  232. package/lib/network/peers/peerManager.d.ts.map +1 -1
  233. package/lib/network/peers/peerManager.js +103 -53
  234. package/lib/network/peers/peerManager.js.map +1 -1
  235. package/lib/network/peers/utils/prioritizePeers.d.ts +3 -3
  236. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  237. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  238. package/lib/network/processor/gossipHandlers.js +9 -2
  239. package/lib/network/processor/gossipHandlers.js.map +1 -1
  240. package/lib/network/processor/gossipValidatorFn.js +1 -1
  241. package/lib/network/processor/types.d.ts +1 -1
  242. package/lib/network/processor/types.d.ts.map +1 -1
  243. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +1 -1
  244. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  245. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -1
  246. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  247. package/lib/network/reqresp/score.d.ts.map +1 -1
  248. package/lib/network/reqresp/score.js +0 -1
  249. package/lib/network/reqresp/score.js.map +1 -1
  250. package/lib/network/util.js +2 -2
  251. package/lib/network/util.js.map +1 -1
  252. package/lib/node/nodejs.d.ts +3 -5
  253. package/lib/node/nodejs.d.ts.map +1 -1
  254. package/lib/node/nodejs.js +6 -4
  255. package/lib/node/nodejs.js.map +1 -1
  256. package/lib/util/blobs.d.ts +2 -2
  257. package/lib/util/blobs.d.ts.map +1 -1
  258. package/lib/util/blobs.js.map +1 -1
  259. package/lib/util/clock.d.ts +6 -0
  260. package/lib/util/clock.d.ts.map +1 -1
  261. package/lib/util/clock.js +9 -3
  262. package/lib/util/clock.js.map +1 -1
  263. package/lib/util/dataColumns.d.ts +11 -3
  264. package/lib/util/dataColumns.d.ts.map +1 -1
  265. package/lib/util/dataColumns.js +27 -0
  266. package/lib/util/dataColumns.js.map +1 -1
  267. package/lib/util/multifork.d.ts +8 -0
  268. package/lib/util/multifork.d.ts.map +1 -1
  269. package/lib/util/multifork.js +37 -0
  270. package/lib/util/multifork.js.map +1 -1
  271. package/package.json +39 -42
  272. package/src/api/impl/beacon/blocks/index.ts +147 -3
  273. package/src/api/impl/beacon/state/index.ts +8 -8
  274. package/src/api/impl/beacon/state/utils.ts +15 -29
  275. package/src/api/impl/debug/index.ts +9 -5
  276. package/src/api/impl/node/utils.ts +3 -3
  277. package/src/api/impl/validator/index.ts +129 -7
  278. package/src/chain/archiveStore/archiveStore.ts +10 -0
  279. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -11
  280. package/src/chain/archiveStore/historicalState/worker.ts +3 -3
  281. package/src/chain/archiveStore/utils/archivePayloads.ts +15 -0
  282. package/src/chain/archiveStore/utils/updateBackfillRange.ts +1 -1
  283. package/src/chain/blocks/blockInput/blockInput.ts +68 -3
  284. package/src/chain/blocks/blockInput/types.ts +1 -0
  285. package/src/chain/blocks/importBlock.ts +34 -3
  286. package/src/chain/blocks/verifyBlocksDataAvailability.ts +3 -0
  287. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -2
  288. package/src/chain/blocks/verifyBlocksSanityChecks.ts +7 -2
  289. package/src/chain/bls/multithread/index.ts +7 -7
  290. package/src/chain/bls/multithread/jobItem.ts +3 -3
  291. package/src/chain/bls/singleThread.ts +5 -5
  292. package/src/chain/bls/utils.ts +8 -5
  293. package/src/chain/chain.ts +57 -32
  294. package/src/chain/emitter.ts +5 -5
  295. package/src/chain/errors/executionPayloadEnvelope.ts +6 -2
  296. package/src/chain/forkChoice/index.ts +39 -21
  297. package/src/chain/interface.ts +4 -11
  298. package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
  299. package/src/chain/options.ts +1 -0
  300. package/src/chain/prepareNextSlot.ts +5 -5
  301. package/src/chain/produceBlock/computeNewStateRoot.ts +35 -3
  302. package/src/chain/produceBlock/produceBlockBody.ts +162 -13
  303. package/src/chain/regen/queued.ts +7 -2
  304. package/src/chain/regen/regen.ts +8 -2
  305. package/src/chain/seenCache/seenGossipBlockInput.ts +16 -7
  306. package/src/chain/validation/aggregateAndProof.ts +1 -1
  307. package/src/chain/validation/attestation.ts +7 -4
  308. package/src/chain/validation/attesterSlashing.ts +10 -1
  309. package/src/chain/validation/blobSidecar.ts +2 -2
  310. package/src/chain/validation/block.ts +9 -4
  311. package/src/chain/validation/dataColumnSidecar.ts +3 -6
  312. package/src/chain/validation/executionPayloadBid.ts +1 -2
  313. package/src/chain/validation/executionPayloadEnvelope.ts +4 -4
  314. package/src/chain/validation/payloadAttestationMessage.ts +10 -3
  315. package/src/chain/validation/proposerSlashing.ts +1 -1
  316. package/src/chain/validation/syncCommitteeContributionAndProof.ts +1 -1
  317. package/src/db/beacon.ts +8 -0
  318. package/src/db/buckets.ts +3 -0
  319. package/src/db/interface.ts +5 -0
  320. package/src/db/repositories/blockArchive.ts +1 -2
  321. package/src/db/repositories/dataColumnSidecar.ts +18 -3
  322. package/src/db/repositories/dataColumnSidecarArchive.ts +18 -3
  323. package/src/db/repositories/executionPayloadEnvelope.ts +26 -0
  324. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +32 -0
  325. package/src/db/repositories/index.ts +2 -0
  326. package/src/execution/engine/http.ts +3 -0
  327. package/src/metrics/metrics/beacon.ts +5 -0
  328. package/src/metrics/metrics/lodestar.ts +14 -0
  329. package/src/monitoring/service.ts +3 -2
  330. package/src/network/core/networkCore.ts +3 -3
  331. package/src/network/core/networkCoreWorkerHandler.ts +3 -3
  332. package/src/network/core/types.ts +2 -2
  333. package/src/network/events.ts +2 -1
  334. package/src/network/gossip/encoding.ts +3 -3
  335. package/src/network/gossip/gossipsub.ts +86 -25
  336. package/src/network/gossip/interface.ts +6 -6
  337. package/src/network/gossip/scoringParameters.ts +4 -4
  338. package/src/network/gossip/topic.ts +2 -1
  339. package/src/network/interface.ts +7 -4
  340. package/src/network/libp2p/index.ts +8 -3
  341. package/src/network/network.ts +24 -6
  342. package/src/network/options.ts +3 -0
  343. package/src/network/peers/datastore.ts +13 -10
  344. package/src/network/peers/peerManager.ts +118 -54
  345. package/src/network/peers/utils/prioritizePeers.ts +3 -3
  346. package/src/network/processor/gossipHandlers.ts +19 -4
  347. package/src/network/processor/gossipValidatorFn.ts +1 -1
  348. package/src/network/processor/types.ts +1 -1
  349. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +1 -1
  350. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +1 -1
  351. package/src/network/reqresp/score.ts +0 -1
  352. package/src/network/util.ts +2 -2
  353. package/src/node/nodejs.ts +8 -9
  354. package/src/util/blobs.ts +3 -3
  355. package/src/util/clock.ts +9 -4
  356. package/src/util/dataColumns.ts +37 -1
  357. package/src/util/multifork.ts +45 -0
  358. package/src/util/workerEvents.ts +1 -1
@@ -1,10 +1,10 @@
1
- import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
2
1
  import {BeaconConfig} from "@lodestar/config";
3
2
  import {
4
3
  BeaconStateAllForks,
5
4
  CachedBeaconStateAllForks,
6
5
  DataAvailabilityStatus,
7
6
  ExecutionPayloadStatus,
7
+ PubkeyCache,
8
8
  createCachedBeaconState,
9
9
  stateTransition,
10
10
  } from "@lodestar/state-transition";
@@ -15,16 +15,16 @@ import {HistoricalStateRegenMetrics} from "./metrics.js";
15
15
  import {RegenErrorType} from "./types.js";
16
16
 
17
17
  /**
18
- * Populate a PubkeyIndexMap with any new entries based on a BeaconState
18
+ * Populate a PubkeyCache with any new entries based on a BeaconState
19
19
  */
20
- export function syncPubkeyCache(state: BeaconStateAllForks, pubkey2index: PubkeyIndexMap): void {
20
+ export function syncPubkeyCache(state: BeaconStateAllForks, pubkeyCache: PubkeyCache): void {
21
21
  // Get the validators sub tree once for all the loop
22
22
  const validators = state.validators;
23
23
 
24
24
  const newCount = state.validators.length;
25
- for (let i = pubkey2index.size; i < newCount; i++) {
25
+ for (let i = pubkeyCache.size; i < newCount; i++) {
26
26
  const pubkey = validators.getReadonly(i).pubkey;
27
- pubkey2index.set(pubkey, i);
27
+ pubkeyCache.set(i, pubkey);
28
28
  }
29
29
  }
30
30
 
@@ -35,7 +35,7 @@ export async function getNearestState(
35
35
  slot: number,
36
36
  config: BeaconConfig,
37
37
  db: IBeaconDb,
38
- pubkey2index: PubkeyIndexMap
38
+ pubkeyCache: PubkeyCache
39
39
  ): Promise<CachedBeaconStateAllForks> {
40
40
  const stateBytesArr = await db.stateArchive.binaries({limit: 1, lte: slot, reverse: true});
41
41
  if (!stateBytesArr.length) {
@@ -44,14 +44,13 @@ export async function getNearestState(
44
44
 
45
45
  const stateBytes = stateBytesArr[0];
46
46
  const state = getStateTypeFromBytes(config, stateBytes).deserializeToViewDU(stateBytes);
47
- syncPubkeyCache(state, pubkey2index);
47
+ syncPubkeyCache(state, pubkeyCache);
48
48
 
49
49
  return createCachedBeaconState(
50
50
  state,
51
51
  {
52
52
  config,
53
- pubkey2index,
54
- index2pubkey: [],
53
+ pubkeyCache,
55
54
  },
56
55
  {
57
56
  skipSyncPubkeys: true,
@@ -66,13 +65,13 @@ export async function getHistoricalState(
66
65
  slot: number,
67
66
  config: BeaconConfig,
68
67
  db: IBeaconDb,
69
- pubkey2index: PubkeyIndexMap,
68
+ pubkeyCache: PubkeyCache,
70
69
  metrics?: HistoricalStateRegenMetrics
71
70
  ): Promise<Uint8Array> {
72
71
  const regenTimer = metrics?.regenTime.startTimer();
73
72
 
74
73
  const loadStateTimer = metrics?.loadStateTime.startTimer();
75
- let state = await getNearestState(slot, config, db, pubkey2index).catch((e) => {
74
+ let state = await getNearestState(slot, config, db, pubkeyCache).catch((e) => {
76
75
  metrics?.regenErrorCount.inc({reason: RegenErrorType.loadState});
77
76
  throw e;
78
77
  });
@@ -1,9 +1,9 @@
1
1
  import worker from "node:worker_threads";
2
- import {PubkeyIndexMap} from "@chainsafe/pubkey-index-map";
3
2
  import {Transfer, expose} from "@chainsafe/threads/worker";
4
3
  import {chainConfigFromJson, createBeaconConfig} from "@lodestar/config";
5
4
  import {LevelDbController} from "@lodestar/db/controller/level";
6
5
  import {getNodeLogger} from "@lodestar/logger/node";
6
+ import {createPubkeyCache} from "@lodestar/state-transition";
7
7
  import {BeaconDb} from "../../../db/index.js";
8
8
  import {RegistryMetricCreator, collectNodeJSMetrics} from "../../../metrics/index.js";
9
9
  import {JobFnQueue} from "../../../util/queue/fnQueue.js";
@@ -52,7 +52,7 @@ const queue = new JobFnQueue(
52
52
  queueMetrics
53
53
  );
54
54
 
55
- const pubkey2index = new PubkeyIndexMap();
55
+ const pubkeyCache = createPubkeyCache();
56
56
 
57
57
  const api: HistoricalStateWorkerApi = {
58
58
  async close() {
@@ -65,7 +65,7 @@ const api: HistoricalStateWorkerApi = {
65
65
  historicalStateRegenMetrics?.regenRequestCount.inc();
66
66
 
67
67
  const stateBytes = await queue.push<Uint8Array>(() =>
68
- getHistoricalState(slot, config, db, pubkey2index, historicalStateRegenMetrics)
68
+ getHistoricalState(slot, config, db, pubkeyCache, historicalStateRegenMetrics)
69
69
  );
70
70
  const result = Transfer(stateBytes, [stateBytes.buffer]) as unknown as Uint8Array;
71
71
 
@@ -0,0 +1,15 @@
1
+ import {CheckpointWithHex} from "@lodestar/fork-choice";
2
+ import {IBeaconChain} from "../../interface.js";
3
+
4
+ /**
5
+ * Archives execution payload envelopes from hot DB to archive DB after finalization.
6
+ */
7
+ export async function archiveExecutionPayloadEnvelopes(
8
+ chain: IBeaconChain,
9
+ _finalized: CheckpointWithHex
10
+ ): Promise<void> {
11
+ const finalizedBlock = chain.forkChoice.getFinalizedBlock();
12
+ if (!finalizedBlock) return;
13
+
14
+ // TODO GLOAS: Implement payload envelope archival after epbs fork choice changes are merged
15
+ }
@@ -20,7 +20,7 @@ export async function updateBackfillRange(
20
20
  try {
21
21
  // Mark the sequence in backfill db from finalized block's slot till anchor slot as
22
22
  // filled.
23
- const finalizedBlockFC = chain.forkChoice.getBlockHex(finalized.rootHex);
23
+ const finalizedBlockFC = chain.forkChoice.getBlockHexDefaultStatus(finalized.rootHex);
24
24
  if (finalizedBlockFC && finalizedBlockFC.slot > chain.anchorStateLatestBlockSlot) {
25
25
  await db.backfilledRanges.put(finalizedBlockFC.slot, chain.anchorStateLatestBlockSlot);
26
26
 
@@ -1,5 +1,5 @@
1
- import {ForkName, ForkPostFulu, ForkPreDeneb, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
2
- import {BeaconBlockBody, BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
1
+ import {ForkName, ForkPostFulu, ForkPostGloas, ForkPreDeneb, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
2
+ import {BeaconBlockBody, BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu, gloas} from "@lodestar/types";
3
3
  import {byteArrayEquals, fromHex, prettyBytes, toRootHex, withTimeout} from "@lodestar/utils";
4
4
  import {VersionedHashes} from "../../../execution/index.js";
5
5
  import {kzgCommitmentToVersionedHash} from "../../../util/blobs.js";
@@ -24,7 +24,7 @@ import {
24
24
  SourceMeta,
25
25
  } from "./types.js";
26
26
 
27
- export type BlockInput = BlockInputPreData | BlockInputBlobs | BlockInputColumns;
27
+ export type BlockInput = BlockInputPreData | BlockInputBlobs | BlockInputColumns | BlockInputNoData;
28
28
 
29
29
  export function isBlockInputPreDeneb(blockInput: IBlockInput): blockInput is BlockInputPreData {
30
30
  return blockInput.type === DAType.PreData;
@@ -37,6 +37,10 @@ export function isBlockInputColumns(blockInput: IBlockInput): blockInput is Bloc
37
37
  return blockInput.type === DAType.Columns;
38
38
  }
39
39
 
40
+ export function isBlockInputNoData(blockInput: IBlockInput): blockInput is BlockInputNoData {
41
+ return blockInput.type === DAType.NoData;
42
+ }
43
+
40
44
  function createPromise<T>(): PromiseParts<T> {
41
45
  let resolve!: (value: T) => void;
42
46
  let reject!: (e: Error) => void;
@@ -903,3 +907,64 @@ export class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.Da
903
907
  return Promise.resolve(this.getSampledColumns());
904
908
  }
905
909
  }
910
+
911
+ type BlockInputNoDataState = {
912
+ hasBlock: true;
913
+ hasAllData: true;
914
+ block: SignedBeaconBlock<ForkPostGloas>;
915
+ source: SourceMeta;
916
+ timeCompleteSec: number;
917
+ };
918
+
919
+ export class BlockInputNoData extends AbstractBlockInput<ForkPostGloas, null> {
920
+ type = DAType.NoData as const;
921
+
922
+ state: BlockInputNoDataState;
923
+
924
+ private constructor(init: BlockInputInit, state: BlockInputNoDataState) {
925
+ super(init);
926
+ this.state = state;
927
+ this.dataPromise.resolve(null);
928
+ this.blockPromise.resolve(state.block);
929
+ }
930
+
931
+ static createFromBlock(props: AddBlock<ForkPostGloas> & CreateBlockInputMeta): BlockInputNoData {
932
+ const init: BlockInputInit = {
933
+ daOutOfRange: props.daOutOfRange,
934
+ timeCreated: props.seenTimestampSec,
935
+ forkName: props.forkName,
936
+ slot: props.block.message.slot,
937
+ blockRootHex: props.blockRootHex,
938
+ parentRootHex: toRootHex(props.block.message.parentRoot),
939
+ };
940
+ const state: BlockInputNoDataState = {
941
+ hasBlock: true,
942
+ hasAllData: true,
943
+ block: props.block,
944
+ source: {
945
+ source: props.source,
946
+ seenTimestampSec: props.seenTimestampSec,
947
+ peerIdStr: props.peerIdStr,
948
+ },
949
+ timeCompleteSec: props.seenTimestampSec,
950
+ };
951
+ return new BlockInputNoData(init, state);
952
+ }
953
+
954
+ addBlock(_: AddBlock<ForkPostGloas>, opts = {throwOnDuplicateAdd: true}): void {
955
+ if (opts.throwOnDuplicateAdd) {
956
+ throw new BlockInputError(
957
+ {
958
+ code: BlockInputErrorCode.INVALID_CONSTRUCTION,
959
+ blockRoot: this.blockRootHex,
960
+ },
961
+ "Cannot addBlock to BlockInputNoData - block already exists"
962
+ );
963
+ }
964
+ }
965
+
966
+ getBlobKzgCommitments(): deneb.BlobKzgCommitments {
967
+ return (this.state.block.message.body as gloas.BeaconBlockBody).signedExecutionPayloadBid.message
968
+ .blobKzgCommitments;
969
+ }
970
+ }
@@ -6,6 +6,7 @@ export enum DAType {
6
6
  PreData = "pre-data",
7
7
  Blobs = "blobs",
8
8
  Columns = "columns",
9
+ NoData = "no-data",
9
10
  }
10
11
 
11
12
  export type DAData = null | deneb.BlobSidecars | fulu.DataColumnSidecars;
@@ -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";
@@ -230,6 +230,32 @@ export async function importBlock(
230
230
  }
231
231
  }
232
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
+
233
259
  // 5. Compute head. If new head, immediately stateCache.setHeadState()
234
260
 
235
261
  const oldHead = this.forkChoice.getHead();
@@ -345,7 +371,7 @@ export async function importBlock(
345
371
  // 3) Proposer boost reorg related flag is turned on (this is checked inside the function)
346
372
  // 4) Block meets the criteria of being re-orged out (this is also checked inside the function)
347
373
  const result = this.forkChoice.shouldOverrideForkChoiceUpdate(
348
- blockSummary.blockRoot,
374
+ blockSummary,
349
375
  this.clock.secFromSlot(currentSlot),
350
376
  currentSlot
351
377
  );
@@ -441,7 +467,12 @@ export async function importBlock(
441
467
  this.metrics?.currentActiveValidators.set(activeValidatorsCount);
442
468
  this.metrics?.currentValidators.set({status: "active"}, activeValidatorsCount);
443
469
 
444
- 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);
445
476
 
446
477
  if (parentBlockSummary) {
447
478
  const justifiedCheckpoint = checkpointState.currentJustifiedCheckpoint;
@@ -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
  }
@@ -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;