@lodestar/beacon-node 1.42.0-dev.d73eccfa56 → 1.42.0-dev.eec18d0609

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 (376) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +14 -2
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.js +1 -1
  5. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  6. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  7. package/lib/api/impl/beacon/state/index.js +27 -32
  8. package/lib/api/impl/beacon/state/index.js.map +1 -1
  9. package/lib/api/impl/beacon/state/utils.d.ts +4 -4
  10. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  11. package/lib/api/impl/beacon/state/utils.js +7 -10
  12. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  13. package/lib/api/impl/lodestar/index.d.ts.map +1 -1
  14. package/lib/api/impl/lodestar/index.js +4 -6
  15. package/lib/api/impl/lodestar/index.js.map +1 -1
  16. package/lib/api/impl/proof/index.d.ts.map +1 -1
  17. package/lib/api/impl/proof/index.js +2 -6
  18. package/lib/api/impl/proof/index.js.map +1 -1
  19. package/lib/api/impl/validator/index.d.ts.map +1 -1
  20. package/lib/api/impl/validator/index.js +27 -27
  21. package/lib/api/impl/validator/index.js.map +1 -1
  22. package/lib/api/impl/validator/utils.d.ts +2 -2
  23. package/lib/api/impl/validator/utils.d.ts.map +1 -1
  24. package/lib/api/impl/validator/utils.js +3 -3
  25. package/lib/api/impl/validator/utils.js.map +1 -1
  26. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  27. package/lib/chain/archiveStore/archiveStore.js +1 -0
  28. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  29. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +3 -7
  30. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  31. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +8 -26
  32. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  33. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts +2 -2
  34. package/lib/chain/archiveStore/historicalState/historicalStateRegen.d.ts.map +1 -1
  35. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -0
  36. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  37. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -0
  38. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  39. package/lib/chain/archiveStore/historicalState/types.js.map +1 -1
  40. package/lib/chain/archiveStore/historicalState/worker.js +1 -3
  41. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  42. package/lib/chain/archiveStore/interface.d.ts +1 -0
  43. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  44. package/lib/chain/balancesCache.d.ts +2 -2
  45. package/lib/chain/balancesCache.d.ts.map +1 -1
  46. package/lib/chain/balancesCache.js +4 -4
  47. package/lib/chain/balancesCache.js.map +1 -1
  48. package/lib/chain/blocks/blockInput/types.d.ts +1 -0
  49. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  50. package/lib/chain/blocks/blockInput/types.js +1 -0
  51. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  52. package/lib/chain/blocks/importBlock.d.ts +3 -3
  53. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  54. package/lib/chain/blocks/importBlock.js +21 -21
  55. package/lib/chain/blocks/importBlock.js.map +1 -1
  56. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -8
  57. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  58. package/lib/chain/blocks/importExecutionPayload.js +78 -51
  59. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  60. package/lib/chain/blocks/index.d.ts.map +1 -1
  61. package/lib/chain/blocks/index.js +3 -2
  62. package/lib/chain/blocks/index.js.map +1 -1
  63. package/lib/chain/blocks/types.d.ts +21 -15
  64. package/lib/chain/blocks/types.d.ts.map +1 -1
  65. package/lib/chain/blocks/types.js.map +1 -1
  66. package/lib/chain/blocks/utils/checkpoint.d.ts +2 -2
  67. package/lib/chain/blocks/utils/checkpoint.d.ts.map +1 -1
  68. package/lib/chain/blocks/utils/checkpoint.js.map +1 -1
  69. package/lib/chain/blocks/verifyBlock.d.ts +2 -2
  70. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  71. package/lib/chain/blocks/verifyBlock.js +4 -4
  72. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  73. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +5 -5
  74. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  75. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +4 -4
  76. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  77. package/lib/chain/blocks/verifyBlocksSignatures.d.ts +2 -2
  78. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  79. package/lib/chain/blocks/verifyBlocksSignatures.js +1 -1
  80. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  81. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +3 -3
  82. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  83. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +3 -3
  84. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  85. package/lib/chain/chain.d.ts +12 -12
  86. package/lib/chain/chain.d.ts.map +1 -1
  87. package/lib/chain/chain.js +47 -39
  88. package/lib/chain/chain.js.map +1 -1
  89. package/lib/chain/emitter.d.ts +2 -2
  90. package/lib/chain/emitter.d.ts.map +1 -1
  91. package/lib/chain/errors/blockError.d.ts +4 -4
  92. package/lib/chain/errors/blockError.d.ts.map +1 -1
  93. package/lib/chain/forkChoice/index.d.ts +4 -4
  94. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  95. package/lib/chain/forkChoice/index.js +27 -23
  96. package/lib/chain/forkChoice/index.js.map +1 -1
  97. package/lib/chain/initState.d.ts +2 -2
  98. package/lib/chain/initState.d.ts.map +1 -1
  99. package/lib/chain/initState.js +1 -1
  100. package/lib/chain/initState.js.map +1 -1
  101. package/lib/chain/interface.d.ts +11 -12
  102. package/lib/chain/interface.d.ts.map +1 -1
  103. package/lib/chain/lightClient/index.d.ts +2 -2
  104. package/lib/chain/lightClient/index.d.ts.map +1 -1
  105. package/lib/chain/lightClient/index.js +4 -4
  106. package/lib/chain/lightClient/index.js.map +1 -1
  107. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +6 -6
  108. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  109. package/lib/chain/opPools/aggregatedAttestationPool.js +10 -13
  110. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  111. package/lib/chain/opPools/opPool.d.ts +3 -3
  112. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  113. package/lib/chain/opPools/opPool.js +7 -7
  114. package/lib/chain/opPools/opPool.js.map +1 -1
  115. package/lib/chain/opPools/utils.d.ts +2 -2
  116. package/lib/chain/opPools/utils.d.ts.map +1 -1
  117. package/lib/chain/opPools/utils.js +1 -1
  118. package/lib/chain/opPools/utils.js.map +1 -1
  119. package/lib/chain/options.d.ts +1 -0
  120. package/lib/chain/options.d.ts.map +1 -1
  121. package/lib/chain/options.js +1 -0
  122. package/lib/chain/options.js.map +1 -1
  123. package/lib/chain/prepareNextSlot.d.ts +2 -2
  124. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  125. package/lib/chain/prepareNextSlot.js +3 -3
  126. package/lib/chain/prepareNextSlot.js.map +1 -1
  127. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +4 -4
  128. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  129. package/lib/chain/produceBlock/computeNewStateRoot.js +3 -4
  130. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  131. package/lib/chain/produceBlock/produceBlockBody.d.ts +5 -5
  132. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  133. package/lib/chain/produceBlock/produceBlockBody.js +12 -16
  134. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  135. package/lib/chain/regen/interface.d.ts +13 -13
  136. package/lib/chain/regen/interface.d.ts.map +1 -1
  137. package/lib/chain/regen/queued.d.ts +14 -14
  138. package/lib/chain/regen/queued.d.ts.map +1 -1
  139. package/lib/chain/regen/queued.js.map +1 -1
  140. package/lib/chain/regen/regen.d.ts +6 -5
  141. package/lib/chain/regen/regen.d.ts.map +1 -1
  142. package/lib/chain/regen/regen.js +6 -6
  143. package/lib/chain/regen/regen.js.map +1 -1
  144. package/lib/chain/serializeState.d.ts +2 -2
  145. package/lib/chain/serializeState.d.ts.map +1 -1
  146. package/lib/chain/serializeState.js +1 -1
  147. package/lib/chain/serializeState.js.map +1 -1
  148. package/lib/chain/shufflingCache.d.ts +2 -2
  149. package/lib/chain/shufflingCache.d.ts.map +1 -1
  150. package/lib/chain/shufflingCache.js +3 -4
  151. package/lib/chain/shufflingCache.js.map +1 -1
  152. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +6 -6
  153. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  154. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  155. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +11 -11
  156. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  157. package/lib/chain/stateCache/persistentCheckpointsCache.js +12 -16
  158. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  159. package/lib/chain/stateCache/types.d.ts +14 -14
  160. package/lib/chain/stateCache/types.d.ts.map +1 -1
  161. package/lib/chain/stateCache/types.js.map +1 -1
  162. package/lib/chain/validation/attesterSlashing.js +3 -3
  163. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  164. package/lib/chain/validation/blobSidecar.js +1 -1
  165. package/lib/chain/validation/blobSidecar.js.map +1 -1
  166. package/lib/chain/validation/block.d.ts.map +1 -1
  167. package/lib/chain/validation/block.js +3 -3
  168. package/lib/chain/validation/block.js.map +1 -1
  169. package/lib/chain/validation/blsToExecutionChange.js +2 -2
  170. package/lib/chain/validation/blsToExecutionChange.js.map +1 -1
  171. package/lib/chain/validation/dataColumnSidecar.js +1 -1
  172. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  173. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  174. package/lib/chain/validation/executionPayloadBid.js +4 -4
  175. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  176. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  177. package/lib/chain/validation/executionPayloadEnvelope.js +2 -3
  178. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  179. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  180. package/lib/chain/validation/payloadAttestationMessage.js +1 -2
  181. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  182. package/lib/chain/validation/proposerSlashing.js +1 -1
  183. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  184. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts +2 -2
  185. package/lib/chain/validation/signatureSets/contributionAndProof.d.ts.map +1 -1
  186. package/lib/chain/validation/signatureSets/contributionAndProof.js +1 -1
  187. package/lib/chain/validation/signatureSets/contributionAndProof.js.map +1 -1
  188. package/lib/chain/validation/signatureSets/syncCommittee.d.ts +2 -2
  189. package/lib/chain/validation/signatureSets/syncCommittee.d.ts.map +1 -1
  190. package/lib/chain/validation/signatureSets/syncCommittee.js +1 -1
  191. package/lib/chain/validation/signatureSets/syncCommittee.js.map +1 -1
  192. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts +2 -2
  193. package/lib/chain/validation/signatureSets/syncCommitteeContribution.d.ts.map +1 -1
  194. package/lib/chain/validation/signatureSets/syncCommitteeContribution.js.map +1 -1
  195. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts +2 -2
  196. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.d.ts.map +1 -1
  197. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js +1 -1
  198. package/lib/chain/validation/signatureSets/syncCommitteeSelectionProof.js.map +1 -1
  199. package/lib/chain/validation/syncCommittee.d.ts +4 -4
  200. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  201. package/lib/chain/validation/syncCommittee.js +13 -12
  202. package/lib/chain/validation/syncCommittee.js.map +1 -1
  203. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  204. package/lib/chain/validation/syncCommitteeContributionAndProof.js +1 -1
  205. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  206. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
  207. package/lib/chain/validation/voluntaryExit.js +3 -3
  208. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  209. package/lib/chain/validatorMonitor.d.ts +3 -3
  210. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  211. package/lib/chain/validatorMonitor.js +9 -7
  212. package/lib/chain/validatorMonitor.js.map +1 -1
  213. package/lib/metrics/metrics/lodestar.d.ts +12 -4
  214. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  215. package/lib/metrics/metrics/lodestar.js +19 -15
  216. package/lib/metrics/metrics/lodestar.js.map +1 -1
  217. package/lib/network/gossip/encoding.d.ts.map +1 -1
  218. package/lib/network/gossip/encoding.js +15 -0
  219. package/lib/network/gossip/encoding.js.map +1 -1
  220. package/lib/network/gossip/topic.d.ts +2 -729
  221. package/lib/network/gossip/topic.d.ts.map +1 -1
  222. package/lib/network/interface.d.ts +4 -2
  223. package/lib/network/interface.d.ts.map +1 -1
  224. package/lib/network/libp2p/index.d.ts.map +1 -1
  225. package/lib/network/libp2p/index.js +22 -11
  226. package/lib/network/libp2p/index.js.map +1 -1
  227. package/lib/network/network.d.ts +4 -2
  228. package/lib/network/network.d.ts.map +1 -1
  229. package/lib/network/network.js +9 -3
  230. package/lib/network/network.js.map +1 -1
  231. package/lib/network/options.d.ts.map +1 -1
  232. package/lib/network/options.js +7 -2
  233. package/lib/network/options.js.map +1 -1
  234. package/lib/network/processor/extractSlotRootFns.d.ts +1 -1
  235. package/lib/network/processor/extractSlotRootFns.js +1 -1
  236. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  237. package/lib/network/processor/gossipHandlers.js +24 -15
  238. package/lib/network/processor/gossipHandlers.js.map +1 -1
  239. package/lib/network/processor/index.d.ts +12 -7
  240. package/lib/network/processor/index.d.ts.map +1 -1
  241. package/lib/network/processor/index.js +99 -78
  242. package/lib/network/processor/index.js.map +1 -1
  243. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  244. package/lib/network/reqresp/ReqRespBeaconNode.js +9 -0
  245. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  246. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts +8 -0
  247. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -0
  248. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +69 -0
  249. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -0
  250. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts +6 -0
  251. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.d.ts.map +1 -0
  252. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +28 -0
  253. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -0
  254. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  255. package/lib/network/reqresp/handlers/index.js +11 -1
  256. package/lib/network/reqresp/handlers/index.js.map +1 -1
  257. package/lib/network/reqresp/protocols.d.ts +2 -0
  258. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  259. package/lib/network/reqresp/protocols.js +10 -0
  260. package/lib/network/reqresp/protocols.js.map +1 -1
  261. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  262. package/lib/network/reqresp/rateLimit.js +8 -0
  263. package/lib/network/reqresp/rateLimit.js.map +1 -1
  264. package/lib/network/reqresp/score.d.ts.map +1 -1
  265. package/lib/network/reqresp/score.js +2 -0
  266. package/lib/network/reqresp/score.js.map +1 -1
  267. package/lib/network/reqresp/types.d.ts +8 -2
  268. package/lib/network/reqresp/types.d.ts.map +1 -1
  269. package/lib/network/reqresp/types.js +7 -1
  270. package/lib/network/reqresp/types.js.map +1 -1
  271. package/lib/node/nodejs.d.ts +2 -2
  272. package/lib/node/nodejs.d.ts.map +1 -1
  273. package/lib/node/nodejs.js +1 -4
  274. package/lib/node/nodejs.js.map +1 -1
  275. package/lib/node/notifier.d.ts.map +1 -1
  276. package/lib/node/notifier.js +3 -3
  277. package/lib/node/notifier.js.map +1 -1
  278. package/lib/sync/backfill/backfill.d.ts +2 -2
  279. package/lib/sync/backfill/backfill.d.ts.map +1 -1
  280. package/lib/sync/backfill/backfill.js +2 -2
  281. package/lib/sync/backfill/backfill.js.map +1 -1
  282. package/lib/sync/unknownBlock.d.ts +3 -9
  283. package/lib/sync/unknownBlock.d.ts.map +1 -1
  284. package/lib/sync/unknownBlock.js +8 -41
  285. package/lib/sync/unknownBlock.js.map +1 -1
  286. package/lib/util/types.d.ts +2 -0
  287. package/lib/util/types.d.ts.map +1 -1
  288. package/lib/util/types.js +1 -0
  289. package/lib/util/types.js.map +1 -1
  290. package/package.json +16 -16
  291. package/src/api/impl/beacon/blocks/index.ts +16 -2
  292. package/src/api/impl/beacon/pool/index.ts +1 -1
  293. package/src/api/impl/beacon/state/index.ts +29 -41
  294. package/src/api/impl/beacon/state/utils.ts +11 -25
  295. package/src/api/impl/lodestar/index.ts +4 -8
  296. package/src/api/impl/proof/index.ts +2 -9
  297. package/src/api/impl/validator/index.ts +29 -41
  298. package/src/api/impl/validator/utils.ts +4 -7
  299. package/src/chain/archiveStore/archiveStore.ts +1 -0
  300. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -39
  301. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +2 -1
  302. package/src/chain/archiveStore/historicalState/types.ts +2 -0
  303. package/src/chain/archiveStore/historicalState/worker.ts +1 -4
  304. package/src/chain/archiveStore/interface.ts +1 -0
  305. package/src/chain/balancesCache.ts +5 -11
  306. package/src/chain/blocks/blockInput/types.ts +1 -0
  307. package/src/chain/blocks/importBlock.ts +23 -25
  308. package/src/chain/blocks/importExecutionPayload.ts +89 -63
  309. package/src/chain/blocks/index.ts +3 -2
  310. package/src/chain/blocks/types.ts +26 -15
  311. package/src/chain/blocks/utils/checkpoint.ts +2 -2
  312. package/src/chain/blocks/verifyBlock.ts +5 -10
  313. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -14
  314. package/src/chain/blocks/verifyBlocksSignatures.ts +3 -3
  315. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -8
  316. package/src/chain/chain.ts +75 -67
  317. package/src/chain/emitter.ts +2 -2
  318. package/src/chain/errors/blockError.ts +4 -4
  319. package/src/chain/forkChoice/index.ts +33 -42
  320. package/src/chain/initState.ts +7 -2
  321. package/src/chain/interface.ts +12 -13
  322. package/src/chain/lightClient/index.ts +9 -22
  323. package/src/chain/opPools/aggregatedAttestationPool.ts +15 -21
  324. package/src/chain/opPools/opPool.ts +13 -14
  325. package/src/chain/opPools/utils.ts +3 -3
  326. package/src/chain/options.ts +2 -0
  327. package/src/chain/prepareNextSlot.ts +6 -8
  328. package/src/chain/produceBlock/computeNewStateRoot.ts +6 -10
  329. package/src/chain/produceBlock/produceBlockBody.ts +22 -49
  330. package/src/chain/regen/interface.ts +13 -17
  331. package/src/chain/regen/queued.ts +16 -20
  332. package/src/chain/regen/regen.ts +16 -17
  333. package/src/chain/serializeState.ts +3 -3
  334. package/src/chain/shufflingCache.ts +5 -7
  335. package/src/chain/stateCache/fifoBlockStateCache.ts +7 -7
  336. package/src/chain/stateCache/persistentCheckpointsCache.ts +27 -42
  337. package/src/chain/stateCache/types.ts +14 -18
  338. package/src/chain/validation/attesterSlashing.ts +3 -3
  339. package/src/chain/validation/blobSidecar.ts +1 -1
  340. package/src/chain/validation/block.ts +2 -4
  341. package/src/chain/validation/blsToExecutionChange.ts +2 -2
  342. package/src/chain/validation/dataColumnSidecar.ts +1 -1
  343. package/src/chain/validation/executionPayloadBid.ts +3 -7
  344. package/src/chain/validation/executionPayloadEnvelope.ts +2 -8
  345. package/src/chain/validation/payloadAttestationMessage.ts +2 -4
  346. package/src/chain/validation/proposerSlashing.ts +1 -1
  347. package/src/chain/validation/signatureSets/contributionAndProof.ts +2 -7
  348. package/src/chain/validation/signatureSets/syncCommittee.ts +2 -7
  349. package/src/chain/validation/signatureSets/syncCommitteeContribution.ts +2 -2
  350. package/src/chain/validation/signatureSets/syncCommitteeSelectionProof.ts +2 -7
  351. package/src/chain/validation/syncCommittee.ts +21 -20
  352. package/src/chain/validation/syncCommitteeContributionAndProof.ts +5 -10
  353. package/src/chain/validation/voluntaryExit.ts +3 -8
  354. package/src/chain/validatorMonitor.ts +12 -11
  355. package/src/metrics/metrics/lodestar.ts +23 -19
  356. package/src/network/gossip/encoding.ts +16 -0
  357. package/src/network/interface.ts +15 -2
  358. package/src/network/libp2p/index.ts +24 -13
  359. package/src/network/network.ts +32 -4
  360. package/src/network/options.ts +7 -2
  361. package/src/network/processor/extractSlotRootFns.ts +1 -1
  362. package/src/network/processor/gossipHandlers.ts +25 -16
  363. package/src/network/processor/index.ts +110 -89
  364. package/src/network/reqresp/ReqRespBeaconNode.ts +13 -0
  365. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +94 -0
  366. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +43 -0
  367. package/src/network/reqresp/handlers/index.ts +12 -0
  368. package/src/network/reqresp/protocols.ts +12 -0
  369. package/src/network/reqresp/rateLimit.ts +18 -0
  370. package/src/network/reqresp/score.ts +2 -0
  371. package/src/network/reqresp/types.ts +13 -0
  372. package/src/node/nodejs.ts +3 -5
  373. package/src/node/notifier.ts +4 -10
  374. package/src/sync/backfill/backfill.ts +3 -3
  375. package/src/sync/unknownBlock.ts +10 -50
  376. package/src/util/types.ts +6 -0
@@ -607,7 +607,7 @@ export function getBeaconBlockApi({
607
607
  if (slot < head.slot && head.slot <= slot + SLOTS_PER_HISTORICAL_ROOT) {
608
608
  const state = chain.getHeadState();
609
609
  return {
610
- data: {root: state.blockRoots.get(slot % SLOTS_PER_HISTORICAL_ROOT)},
610
+ data: {root: state.getBlockRootAtSlot(slot)},
611
611
  meta: {
612
612
  executionOptimistic: isOptimisticBlock(head),
613
613
  finalized: computeEpochAtSlot(slot) <= chain.forkChoice.getFinalizedCheckpoint().epoch,
@@ -647,6 +647,8 @@ export function getBeaconBlockApi({
647
647
  const slot = envelope.slot;
648
648
  const fork = config.getForkName(slot);
649
649
  const blockRootHex = toRootHex(envelope.beaconBlockRoot);
650
+ const blockHashHex = toRootHex(envelope.payload.blockHash);
651
+ const stateRootHex = toRootHex(envelope.stateRoot);
650
652
 
651
653
  if (!isForkPostGloas(fork)) {
652
654
  throw new ApiError(400, `publishExecutionPayloadEnvelope not supported for pre-gloas fork=${fork}`);
@@ -730,6 +732,8 @@ export function getBeaconBlockApi({
730
732
  const valLogMeta = {
731
733
  slot,
732
734
  blockRoot: blockRootHex,
735
+ blockHash: blockHashHex,
736
+ stateRoot: stateRootHex,
733
737
  builderIndex: envelope.builderIndex,
734
738
  isSelfBuild,
735
739
  dataColumns: dataColumnSidecars.length,
@@ -750,7 +754,17 @@ export function getBeaconBlockApi({
750
754
  () => chain.processExecutionPayload(payloadInput, {validSignature: true}),
751
755
  ];
752
756
 
753
- const sentPeersArr = await promiseAllMaybeAsync<number | void>(publishPromises);
757
+ const publishPromise = promiseAllMaybeAsync<number | void>(publishPromises);
758
+
759
+ chain.emitter.emit(routes.events.EventType.executionPayloadGossip, {
760
+ slot,
761
+ builderIndex: envelope.builderIndex,
762
+ blockHash: blockHashHex,
763
+ blockRoot: blockRootHex,
764
+ stateRoot: stateRootHex,
765
+ });
766
+
767
+ const sentPeersArr = await publishPromise;
754
768
 
755
769
  // Track metrics for data column publishing
756
770
  if (dataColumnSidecars.length > 0) {
@@ -255,7 +255,7 @@ export function getBeaconPoolApi({
255
255
  await Promise.all(
256
256
  signatures.map(async (signature, i) => {
257
257
  try {
258
- const synCommittee = state.epochCtx.getIndexedSyncCommittee(signature.slot);
258
+ const synCommittee = state.getIndexedSyncCommittee(signature.slot);
259
259
  const indexesInCommittee = synCommittee.validatorIndexMap.get(signature.validatorIndex);
260
260
  if (indexesInCommittee === undefined || indexesInCommittee.length === 0) {
261
261
  return; // Not a sync committee member
@@ -8,17 +8,12 @@ import {
8
8
  isForkPostFulu,
9
9
  } from "@lodestar/params";
10
10
  import {
11
- BeaconStateAllForks,
12
- BeaconStateElectra,
13
- BeaconStateFulu,
14
- CachedBeaconStateAltair,
11
+ IBeaconStateView,
15
12
  computeEpochAtSlot,
16
13
  computeStartSlotAtEpoch,
17
14
  getCurrentEpoch,
18
- getRandaoMix,
19
- loadState,
20
15
  } from "@lodestar/state-transition";
21
- import {ValidatorIndex, getValidatorStatus} from "@lodestar/types";
16
+ import {ValidatorIndex, getValidatorStatus, ssz} from "@lodestar/types";
22
17
  import {ApiError} from "../../errors.js";
23
18
  import {ApiModules} from "../../types.js";
24
19
  import {assertUniqueItems} from "../../utils.js";
@@ -35,11 +30,11 @@ export function getBeaconStateApi({
35
30
  }: Pick<ApiModules, "chain" | "config">): ApplicationMethods<routes.beacon.state.Endpoints> {
36
31
  async function getState(
37
32
  stateId: routes.beacon.StateId
38
- ): Promise<{state: BeaconStateAllForks; executionOptimistic: boolean; finalized: boolean}> {
33
+ ): Promise<{state: IBeaconStateView; executionOptimistic: boolean; finalized: boolean}> {
39
34
  const {state, executionOptimistic, finalized} = await getStateResponseWithRegen(chain, stateId);
40
35
 
41
36
  return {
42
- state: state instanceof Uint8Array ? loadState(config, chain.getHeadState(), state).state : state,
37
+ state: state instanceof Uint8Array ? chain.getHeadState().loadOtherState(state) : state,
43
38
  executionOptimistic,
44
39
  finalized,
45
40
  };
@@ -71,7 +66,7 @@ export function getBeaconStateApi({
71
66
  throw new ApiError(400, "Requested epoch is out of range");
72
67
  }
73
68
 
74
- const randao = getRandaoMix(state, usedEpoch);
69
+ const randao = state.getRandaoMix(usedEpoch);
75
70
 
76
71
  return {
77
72
  data: {randao},
@@ -94,7 +89,6 @@ export function getBeaconStateApi({
94
89
  async getStateValidators({stateId, validatorIds = [], statuses = []}) {
95
90
  const {state, executionOptimistic, finalized} = await getState(stateId);
96
91
  const currentEpoch = getCurrentEpoch(state);
97
- const {validators, balances} = state; // Get the validators sub tree once for all the loop
98
92
  const {pubkeyCache} = chain;
99
93
 
100
94
  const validatorResponses: routes.beacon.ValidatorResponse[] = [];
@@ -105,14 +99,14 @@ export function getBeaconStateApi({
105
99
  const resp = getStateValidatorIndex(id, state, pubkeyCache);
106
100
  if (resp.valid) {
107
101
  const validatorIndex = resp.validatorIndex;
108
- const validator = validators.getReadonly(validatorIndex);
102
+ const validator = state.getValidator(validatorIndex);
109
103
  if (statuses.length && !statuses.includes(getValidatorStatus(validator, currentEpoch))) {
110
104
  continue;
111
105
  }
112
106
  const validatorResponse = toValidatorResponse(
113
107
  validatorIndex,
114
108
  validator,
115
- balances.get(validatorIndex),
109
+ state.getBalance(validatorIndex),
116
110
  currentEpoch
117
111
  );
118
112
  validatorResponses.push(validatorResponse);
@@ -135,8 +129,8 @@ export function getBeaconStateApi({
135
129
  }
136
130
 
137
131
  // TODO: This loops over the entire state, it's a DOS vector
138
- const validatorsArr = state.validators.getAllReadonlyValues();
139
- const balancesArr = state.balances.getAll();
132
+ const validatorsArr = state.getAllValidators();
133
+ const balancesArr = state.getAllBalances();
140
134
  const resp: routes.beacon.ValidatorResponse[] = [];
141
135
  for (let i = 0; i < validatorsArr.length; i++) {
142
136
  resp.push(toValidatorResponse(i, validatorsArr[i], balancesArr[i], currentEpoch));
@@ -166,12 +160,12 @@ export function getBeaconStateApi({
166
160
  const resp = getStateValidatorIndex(id, state, pubkeyCache);
167
161
  if (resp.valid) {
168
162
  const index = resp.validatorIndex;
169
- const {pubkey, activationEpoch} = state.validators.getReadonly(index);
163
+ const {pubkey, activationEpoch} = state.getValidator(index);
170
164
  validatorIdentities.push({index, pubkey, activationEpoch});
171
165
  }
172
166
  }
173
167
  } else {
174
- const validatorsArr = state.validators.getAllReadonlyValues();
168
+ const validatorsArr = state.getAllValidators();
175
169
  validatorIdentities = new Array(validatorsArr.length) as routes.beacon.ValidatorIdentities;
176
170
  for (let i = 0; i < validatorsArr.length; i++) {
177
171
  const {pubkey, activationEpoch} = validatorsArr[i];
@@ -198,8 +192,8 @@ export function getBeaconStateApi({
198
192
  return {
199
193
  data: toValidatorResponse(
200
194
  validatorIndex,
201
- state.validators.getReadonly(validatorIndex),
202
- state.balances.get(validatorIndex),
195
+ state.getValidator(validatorIndex),
196
+ state.getBalance(validatorIndex),
203
197
  getCurrentEpoch(state)
204
198
  ),
205
199
  meta: {executionOptimistic, finalized},
@@ -219,7 +213,7 @@ export function getBeaconStateApi({
219
213
  if (resp.valid) {
220
214
  balances.push({
221
215
  index: resp.validatorIndex,
222
- balance: state.balances.get(resp.validatorIndex),
216
+ balance: state.getBalance(resp.validatorIndex),
223
217
  });
224
218
  }
225
219
  }
@@ -230,7 +224,7 @@ export function getBeaconStateApi({
230
224
  }
231
225
 
232
226
  // TODO: This loops over the entire state, it's a DOS vector
233
- const balancesArr = state.balances.getAll();
227
+ const balancesArr = state.getAllBalances();
234
228
  const resp: routes.beacon.ValidatorBalance[] = [];
235
229
  for (let i = 0; i < balancesArr.length; i++) {
236
230
  resp.push({index: i, balance: balancesArr[i]});
@@ -248,11 +242,6 @@ export function getBeaconStateApi({
248
242
  async getEpochCommittees({stateId, ...filters}) {
249
243
  const {state, executionOptimistic, finalized} = await getState(stateId);
250
244
 
251
- const stateCached = state as CachedBeaconStateAltair;
252
- if (stateCached.epochCtx === undefined) {
253
- throw new ApiError(400, `No cached state available for stateId: ${stateId}`);
254
- }
255
-
256
245
  const stateEpoch = computeEpochAtSlot(state.slot);
257
246
  const epoch = filters.epoch ?? stateEpoch;
258
247
  const startSlot = computeStartSlotAtEpoch(epoch);
@@ -266,7 +255,7 @@ export function getBeaconStateApi({
266
255
  throw new ApiError(400, `Slot ${filters.slot} is not in epoch ${epoch}`);
267
256
  }
268
257
 
269
- const decisionRoot = stateCached.epochCtx.getShufflingDecisionRoot(epoch);
258
+ const decisionRoot = state.getShufflingDecisionRoot(epoch);
270
259
  const shuffling = await chain.shufflingCache.get(epoch, decisionRoot);
271
260
  if (!shuffling) {
272
261
  throw new ApiError(
@@ -315,12 +304,7 @@ export function getBeaconStateApi({
315
304
  throw new ApiError(400, "Requested state before ALTAIR_FORK_EPOCH");
316
305
  }
317
306
 
318
- const stateCached = state as CachedBeaconStateAltair;
319
- if (stateCached.epochCtx === undefined) {
320
- throw new ApiError(400, `No cached state available for stateId: ${stateId}`);
321
- }
322
-
323
- const syncCommitteeCache = stateCached.epochCtx.getIndexedSyncCommitteeAtEpoch(epoch ?? stateEpoch);
307
+ const syncCommitteeCache = state.getIndexedSyncCommitteeAtEpoch(epoch ?? stateEpoch);
324
308
  const validatorIndices = new Array<ValidatorIndex>(...syncCommitteeCache.validatorIndices);
325
309
 
326
310
  // Subcommittee assignments of the current sync committee
@@ -346,10 +330,10 @@ export function getBeaconStateApi({
346
330
  throw new ApiError(400, `Cannot retrieve pending deposits for pre-electra state fork=${fork}`);
347
331
  }
348
332
 
349
- const {pendingDeposits} = state as BeaconStateElectra;
333
+ const pendingDeposits = state.pendingDeposits;
350
334
 
351
335
  return {
352
- data: context?.returnBytes ? pendingDeposits.serialize() : pendingDeposits.toValue(),
336
+ data: context?.returnBytes ? ssz.electra.PendingDeposits.serialize(pendingDeposits) : pendingDeposits,
353
337
  meta: {executionOptimistic, finalized, version: fork},
354
338
  };
355
339
  },
@@ -362,10 +346,12 @@ export function getBeaconStateApi({
362
346
  throw new ApiError(400, `Cannot retrieve pending partial withdrawals for pre-electra state fork=${fork}`);
363
347
  }
364
348
 
365
- const {pendingPartialWithdrawals} = state as BeaconStateElectra;
349
+ const pendingPartialWithdrawals = state.pendingPartialWithdrawals;
366
350
 
367
351
  return {
368
- data: context?.returnBytes ? pendingPartialWithdrawals.serialize() : pendingPartialWithdrawals.toValue(),
352
+ data: context?.returnBytes
353
+ ? ssz.electra.PendingPartialWithdrawals.serialize(pendingPartialWithdrawals)
354
+ : pendingPartialWithdrawals,
369
355
  meta: {executionOptimistic, finalized, version: fork},
370
356
  };
371
357
  },
@@ -378,10 +364,12 @@ export function getBeaconStateApi({
378
364
  throw new ApiError(400, `Cannot retrieve pending consolidations for pre-electra state fork=${fork}`);
379
365
  }
380
366
 
381
- const {pendingConsolidations} = state as BeaconStateElectra;
367
+ const pendingConsolidations = state.pendingConsolidations;
382
368
 
383
369
  return {
384
- data: context?.returnBytes ? pendingConsolidations.serialize() : pendingConsolidations.toValue(),
370
+ data: context?.returnBytes
371
+ ? ssz.electra.PendingConsolidations.serialize(pendingConsolidations)
372
+ : pendingConsolidations,
385
373
  meta: {executionOptimistic, finalized, version: fork},
386
374
  };
387
375
  },
@@ -394,10 +382,10 @@ export function getBeaconStateApi({
394
382
  throw new ApiError(400, `Cannot retrieve proposer lookahead for pre-fulu state fork=${fork}`);
395
383
  }
396
384
 
397
- const {proposerLookahead} = state as BeaconStateFulu;
385
+ const proposerLookahead = state.proposerLookahead;
398
386
 
399
387
  return {
400
- data: context?.returnBytes ? proposerLookahead.serialize() : proposerLookahead.toValue(),
388
+ data: context?.returnBytes ? ssz.fulu.ProposerLookahead.serialize(proposerLookahead) : proposerLookahead,
401
389
  meta: {executionOptimistic, finalized, version: fork},
402
390
  };
403
391
  },
@@ -1,17 +1,8 @@
1
1
  import {routes} from "@lodestar/api";
2
2
  import {CheckpointWithPayloadStatus, IForkChoice} from "@lodestar/fork-choice";
3
3
  import {GENESIS_SLOT} from "@lodestar/params";
4
- import {BeaconStateAllForks, CachedBeaconStateAllForks, PubkeyCache} from "@lodestar/state-transition";
5
- import {
6
- BLSPubkey,
7
- Epoch,
8
- RootHex,
9
- Slot,
10
- ValidatorIndex,
11
- getValidatorStatus,
12
- mapToGeneralStatus,
13
- phase0,
14
- } from "@lodestar/types";
4
+ import {IBeaconStateView, PubkeyCache} from "@lodestar/state-transition";
5
+ import {BLSPubkey, Epoch, RootHex, Slot, ValidatorIndex, getValidatorStatus, phase0} from "@lodestar/types";
15
6
  import {fromHex} from "@lodestar/utils";
16
7
  import {IBeaconChain} from "../../../../chain/index.js";
17
8
  import {ApiError, ValidationError} from "../../errors.js";
@@ -52,7 +43,7 @@ export function resolveStateId(
52
43
  export async function getStateResponseWithRegen(
53
44
  chain: IBeaconChain,
54
45
  inStateId: routes.beacon.StateId
55
- ): Promise<{state: CachedBeaconStateAllForks | Uint8Array; executionOptimistic: boolean; finalized: boolean}> {
46
+ ): Promise<{state: IBeaconStateView | Uint8Array; executionOptimistic: boolean; finalized: boolean}> {
56
47
  const stateId = resolveStateId(chain.forkChoice, inStateId);
57
48
 
58
49
  const res =
@@ -89,22 +80,17 @@ export function toValidatorResponse(
89
80
 
90
81
  export function filterStateValidatorsByStatus(
91
82
  statuses: string[],
92
- state: BeaconStateAllForks,
83
+ state: IBeaconStateView,
93
84
  pubkeyCache: PubkeyCache,
94
85
  currentEpoch: Epoch
95
86
  ): routes.beacon.ValidatorResponse[] {
96
87
  const responses: routes.beacon.ValidatorResponse[] = [];
97
- const validatorsArr = state.validators.getAllReadonlyValues();
98
- const statusSet = new Set(statuses);
99
-
100
- for (const validator of validatorsArr) {
101
- const validatorStatus = getValidatorStatus(validator, currentEpoch);
102
- const generalStatus = mapToGeneralStatus(validatorStatus);
103
-
88
+ const validators = state.getValidatorsByStatus(new Set(statuses), currentEpoch);
89
+ for (const validator of validators) {
104
90
  const resp = getStateValidatorIndex(validator.pubkey, state, pubkeyCache);
105
- if (resp.valid && (statusSet.has(validatorStatus) || statusSet.has(generalStatus))) {
91
+ if (resp.valid) {
106
92
  responses.push(
107
- toValidatorResponse(resp.validatorIndex, validator, state.balances.get(resp.validatorIndex), currentEpoch)
93
+ toValidatorResponse(resp.validatorIndex, validator, state.getBalance(resp.validatorIndex), currentEpoch)
108
94
  );
109
95
  }
110
96
  }
@@ -117,7 +103,7 @@ type StateValidatorIndexResponse =
117
103
 
118
104
  export function getStateValidatorIndex(
119
105
  id: routes.beacon.ValidatorId | BLSPubkey,
120
- state: BeaconStateAllForks,
106
+ state: IBeaconStateView,
121
107
  pubkeyCache: PubkeyCache
122
108
  ): StateValidatorIndexResponse {
123
109
  if (typeof id === "string") {
@@ -139,7 +125,7 @@ export function getStateValidatorIndex(
139
125
  if (!Number.isSafeInteger(validatorIndex)) {
140
126
  return {valid: false, code: 400, reason: "Invalid validator index"};
141
127
  }
142
- if (validatorIndex >= state.validators.length) {
128
+ if (validatorIndex >= state.validatorCount) {
143
129
  return {valid: false, code: 404, reason: "Validator index from future state"};
144
130
  }
145
131
  return {valid: true, validatorIndex};
@@ -150,7 +136,7 @@ export function getStateValidatorIndex(
150
136
  if (validatorIndex === null) {
151
137
  return {valid: false, code: 404, reason: "Validator pubkey not found in state"};
152
138
  }
153
- if (validatorIndex >= state.validators.length) {
139
+ if (validatorIndex >= state.validatorCount) {
154
140
  return {valid: false, code: 404, reason: "Validator pubkey from future state"};
155
141
  }
156
142
  return {valid: true, validatorIndex};
@@ -1,10 +1,8 @@
1
- import {Tree} from "@chainsafe/persistent-merkle-tree";
2
1
  import {routes} from "@lodestar/api";
3
2
  import {ApplicationMethods} from "@lodestar/api/server";
4
3
  import {ChainForkConfig} from "@lodestar/config";
5
4
  import {Repository} from "@lodestar/db";
6
5
  import {ForkSeq, SLOTS_PER_EPOCH} from "@lodestar/params";
7
- import {BeaconStateCapella, getLatestWeakSubjectivityCheckpointEpoch, loadState} from "@lodestar/state-transition";
8
6
  import {ssz} from "@lodestar/types";
9
7
  import {Checkpoint} from "@lodestar/types/phase0";
10
8
  import {fromHex, toHex, toRootHex} from "@lodestar/utils";
@@ -86,7 +84,7 @@ export function getLodestarApi({
86
84
 
87
85
  async getLatestWeakSubjectivityCheckpointEpoch() {
88
86
  const state = chain.getHeadState();
89
- return {data: getLatestWeakSubjectivityCheckpointEpoch(config, state)};
87
+ return {data: state.getLatestWeakSubjectivityCheckpointEpoch()};
90
88
  },
91
89
 
92
90
  async getSyncChainsDebugState() {
@@ -214,9 +212,7 @@ export function getLodestarApi({
214
212
  async getHistoricalSummaries({stateId}) {
215
213
  const {state, executionOptimistic, finalized} = await getStateResponseWithRegen(chain, stateId);
216
214
 
217
- const stateView = (
218
- state instanceof Uint8Array ? loadState(config, chain.getHeadState(), state).state : state
219
- ) as BeaconStateCapella;
215
+ const stateView = state instanceof Uint8Array ? chain.getHeadState().loadOtherState(state) : state;
220
216
 
221
217
  const fork = config.getForkName(stateView.slot);
222
218
  if (ForkSeq[fork] < ForkSeq.capella) {
@@ -224,12 +220,12 @@ export function getLodestarApi({
224
220
  }
225
221
 
226
222
  const {gindex} = ssz[fork].BeaconState.getPathInfo(["historicalSummaries"]);
227
- const proof = new Tree(stateView.node).getSingleProof(gindex);
223
+ const proof = stateView.getSingleProof(gindex);
228
224
 
229
225
  return {
230
226
  data: {
231
227
  slot: stateView.slot,
232
- historicalSummaries: stateView.historicalSummaries.toValue(),
228
+ historicalSummaries: stateView.historicalSummaries,
233
229
  proof: proof,
234
230
  },
235
231
  meta: {executionOptimistic, finalized, version: fork},
@@ -1,7 +1,6 @@
1
1
  import {CompactMultiProof, ProofType, createProof} from "@chainsafe/persistent-merkle-tree";
2
2
  import {routes} from "@lodestar/api";
3
3
  import {ApplicationMethods} from "@lodestar/api/server";
4
- import {loadState} from "@lodestar/state-transition";
5
4
  import {ApiOptions} from "../../options.js";
6
5
  import {getBlockResponse} from "../beacon/blocks/utils.js";
7
6
  import {getStateResponseWithRegen} from "../beacon/state/utils.js";
@@ -24,16 +23,10 @@ export function getProofApi(
24
23
 
25
24
  const res = await getStateResponseWithRegen(chain, stateId);
26
25
 
27
- const state =
28
- res.state instanceof Uint8Array ? loadState(config, chain.getHeadState(), res.state).state : res.state;
29
-
30
- // there should be no state changes in beacon-node so no need to commit() here
31
- const stateNode = state.node;
32
-
33
- const proof = createProof(stateNode, {type: ProofType.compactMulti, descriptor});
26
+ const state = res.state instanceof Uint8Array ? chain.getHeadState().loadOtherState(res.state) : res.state;
34
27
 
35
28
  return {
36
- data: proof as CompactMultiProof,
29
+ data: state.createMultiProof(descriptor),
37
30
  meta: {version: config.getForkName(state.slot)},
38
31
  };
39
32
  },
@@ -17,19 +17,14 @@ import {
17
17
  isForkPostGloas,
18
18
  } from "@lodestar/params";
19
19
  import {
20
- CachedBeaconStateAllForks,
21
20
  DataAvailabilityStatus,
22
- attesterShufflingDecisionRoot,
21
+ IBeaconStateView,
23
22
  beaconBlockToBlinded,
24
23
  calculateCommitteeAssignments,
25
24
  computeEpochAtSlot,
26
25
  computeStartSlotAtEpoch,
27
26
  computeTimeAtSlot,
28
- createCachedBeaconState,
29
- createPubkeyCache,
30
- getBlockRootAtSlot,
31
27
  getCurrentSlot,
32
- loadState,
33
28
  proposerShufflingDecisionRoot,
34
29
  } from "@lodestar/state-transition";
35
30
  import {
@@ -193,11 +188,13 @@ export function getValidatorApi(
193
188
  const MAX_API_CLOCK_DISPARITY_MS = MAX_API_CLOCK_DISPARITY_SEC * 1000;
194
189
 
195
190
  /** Compute and cache the genesis block root */
196
- async function getGenesisBlockRoot(state: CachedBeaconStateAllForks): Promise<Root> {
191
+ async function getGenesisBlockRoot(state: IBeaconStateView): Promise<Root> {
197
192
  if (!genesisBlockRoot) {
198
193
  // Close to genesis the genesis block may not be available in the DB
199
- if (state.slot < SLOTS_PER_HISTORICAL_ROOT) {
200
- genesisBlockRoot = state.blockRoots.get(0);
194
+ if (state.slot === GENESIS_SLOT) {
195
+ genesisBlockRoot = state.computeAnchorCheckpoint().checkpoint.root;
196
+ } else if (state.slot < SLOTS_PER_HISTORICAL_ROOT) {
197
+ genesisBlockRoot = state.getBlockRootAtSlot(GENESIS_SLOT);
201
198
  }
202
199
 
203
200
  const blockRes = await chain.getCanonicalBlockAtSlot(GENESIS_SLOT);
@@ -303,7 +300,7 @@ export function getValidatorApi(
303
300
  * |
304
301
  * prepareNextSlot (4s before next slot)
305
302
  */
306
- async function waitForCheckpointState(cpHex: CheckpointHexPayload): Promise<CachedBeaconStateAllForks | null> {
303
+ async function waitForCheckpointState(cpHex: CheckpointHexPayload): Promise<IBeaconStateView | null> {
307
304
  const cpState = chain.regen.getCheckpointStateSync(cpHex);
308
305
  if (cpState) {
309
306
  return cpState;
@@ -995,7 +992,7 @@ export function getValidatorApi(
995
992
  headBlockRoot
996
993
  : // Permit attesting to slots *prior* to the current head. This is desirable when
997
994
  // the VC and BN are out-of-sync due to time issues or overloading.
998
- getBlockRootAtSlot(headState, slot);
995
+ headState.getBlockRootAtSlot(slot);
999
996
 
1000
997
  let index: CommitteeIndex;
1001
998
  if (isForkPostGloas(fork)) {
@@ -1026,7 +1023,7 @@ export function getValidatorApi(
1026
1023
  targetSlot >= headSlot
1027
1024
  ? // If the state is earlier than the target slot then the target *must* be the head block root.
1028
1025
  headBlockRoot
1029
- : getBlockRootAtSlot(headState, targetSlot);
1026
+ : headState.getBlockRootAtSlot(targetSlot);
1030
1027
 
1031
1028
  // Check the execution status as validator shouldn't vote on an optimistic head
1032
1029
  // Check on target is sufficient as a valid target would imply a valid source
@@ -1068,7 +1065,7 @@ export function getValidatorApi(
1068
1065
  // see https://github.com/ChainSafe/lodestar/issues/5063
1069
1066
  if (!chain.forkChoice.hasBlock(beaconBlockRoot)) {
1070
1067
  const rootHex = toRootHex(beaconBlockRoot);
1071
- network.searchUnknownSlotRoot({slot, root: rootHex}, BlockInputSource.api);
1068
+ network.searchUnknownBlock({slot, root: rootHex}, BlockInputSource.api);
1072
1069
  // if result of this call is false, i.e. block hasn't seen after 1 slot then the below notOnOptimisticBlockRoot call will throw error
1073
1070
  await chain.waitForBlock(slot, rootHex);
1074
1071
  }
@@ -1103,7 +1100,7 @@ export function getValidatorApi(
1103
1100
  }
1104
1101
 
1105
1102
  const head = chain.forkChoice.getHead();
1106
- let state: CachedBeaconStateAllForks | undefined = undefined;
1103
+ let state: IBeaconStateView | undefined = undefined;
1107
1104
  const startSlot = computeStartSlotAtEpoch(epoch);
1108
1105
  const prepareNextSlotLookAheadMs =
1109
1106
  config.SLOT_DURATION_MS - config.getSlotComponentDurationMs(PREPARE_NEXT_SLOT_BPS);
@@ -1133,43 +1130,34 @@ export function getValidatorApi(
1133
1130
  } else {
1134
1131
  const res = await getStateResponseWithRegen(chain, startSlot);
1135
1132
 
1136
- const stateViewDU =
1137
- res.state instanceof Uint8Array ? loadState(config, chain.getHeadState(), res.state).state : res.state;
1133
+ state = res.state instanceof Uint8Array ? chain.getHeadState().loadOtherState(res.state) : res.state;
1138
1134
 
1139
- state = createCachedBeaconState(
1140
- stateViewDU,
1141
- {
1142
- config: chain.config,
1143
- // Not required to compute proposers
1144
- pubkeyCache: createPubkeyCache(),
1145
- },
1146
- {skipSyncPubkeys: true, skipSyncCommitteeCache: true}
1147
- );
1148
-
1149
- if (state.epochCtx.epoch !== epoch) {
1150
- throw Error(`Loaded state epoch ${state.epochCtx.epoch} does not match requested epoch ${epoch}`);
1135
+ if (state.epoch !== epoch) {
1136
+ throw Error(`Loaded state epoch ${state.epoch} does not match requested epoch ${epoch}`);
1151
1137
  }
1152
1138
  }
1153
1139
  }
1154
1140
 
1155
- const stateEpoch = state.epochCtx.epoch;
1141
+ const stateEpoch = state.epoch;
1156
1142
  let indexes: ValidatorIndex[] = [];
1157
1143
 
1158
1144
  switch (epoch) {
1159
1145
  case stateEpoch:
1160
- indexes = state.epochCtx.getBeaconProposers();
1146
+ indexes = state.currentProposers;
1161
1147
  break;
1162
1148
 
1163
- case stateEpoch + 1:
1149
+ case stateEpoch + 1: {
1164
1150
  // make sure shuffling is calculated and ready for next call to calculate nextProposers
1165
- await chain.shufflingCache.get(state.epochCtx.nextEpoch, state.epochCtx.nextDecisionRoot);
1151
+ const nextEpoch = state.epoch + 1;
1152
+ await chain.shufflingCache.get(nextEpoch, state.nextDecisionRoot);
1166
1153
  // Requesting duties for next epoch is allowed since they can be predicted with high probabilities.
1167
1154
  // @see `epochCtx.getBeaconProposersNextEpoch` JSDocs for rationale.
1168
- indexes = state.epochCtx.getBeaconProposersNextEpoch();
1155
+ indexes = state.nextProposers;
1169
1156
  break;
1157
+ }
1170
1158
 
1171
1159
  case stateEpoch - 1: {
1172
- const indexesPrevEpoch = state.epochCtx.getBeaconProposersPrevEpoch();
1160
+ const indexesPrevEpoch = state.previousProposers;
1173
1161
  if (indexesPrevEpoch === null) {
1174
1162
  // Should not happen as previous proposer duties should be initialized for head state
1175
1163
  // and if we load state from `Uint8Array` it will always be the state of requested epoch
@@ -1188,7 +1176,7 @@ export function getValidatorApi(
1188
1176
  // See benchmark -> packages/lodestar/test/perf/api/impl/validator/attester.test.ts
1189
1177
  // After dropping the flat caches attached to the CachedBeaconState it's no longer available.
1190
1178
  // TODO: Add a flag to just send 0x00 as pubkeys since the Lodestar validator does not need them.
1191
- const pubkeys = getPubkeysForIndices(state.validators, indexes);
1179
+ const pubkeys = getPubkeysForIndices(state, indexes);
1192
1180
 
1193
1181
  const duties: routes.validator.ProposerDuty[] = [];
1194
1182
  for (let i = 0; i < SLOTS_PER_EPOCH; i++) {
@@ -1242,8 +1230,8 @@ export function getValidatorApi(
1242
1230
  // will equal `currentEpoch + 1`
1243
1231
 
1244
1232
  // Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
1245
- const pubkeys = getPubkeysForIndices(state.validators, indices);
1246
- const decisionRoot = state.epochCtx.getShufflingDecisionRoot(epoch);
1233
+ const pubkeys = getPubkeysForIndices(state, indices);
1234
+ const decisionRoot = state.getShufflingDecisionRoot(epoch);
1247
1235
  const shuffling = await chain.shufflingCache.get(epoch, decisionRoot);
1248
1236
  if (!shuffling) {
1249
1237
  throw new ApiError(
@@ -1264,7 +1252,7 @@ export function getValidatorApi(
1264
1252
  }
1265
1253
  }
1266
1254
 
1267
- const dependentRoot = attesterShufflingDecisionRoot(state, epoch) || (await getGenesisBlockRoot(state));
1255
+ const dependentRoot = fromHex(state.getShufflingDecisionRoot(epoch)) || (await getGenesisBlockRoot(state));
1268
1256
 
1269
1257
  return {
1270
1258
  data: duties,
@@ -1305,9 +1293,9 @@ export function getValidatorApi(
1305
1293
  const state = chain.getHeadState();
1306
1294
 
1307
1295
  // Check that all validatorIndex belong to the state before calling getCommitteeAssignments()
1308
- const pubkeys = getPubkeysForIndices(state.validators, indices);
1296
+ const pubkeys = getPubkeysForIndices(state, indices);
1309
1297
  // Ensures `epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD <= current_epoch // EPOCHS_PER_SYNC_COMMITTEE_PERIOD + 1`
1310
- const syncCommitteeCache = state.epochCtx.getIndexedSyncCommitteeAtEpoch(epoch);
1298
+ const syncCommitteeCache = state.getIndexedSyncCommitteeAtEpoch(epoch);
1311
1299
  const validatorSyncCommitteeIndexMap = syncCommitteeCache.validatorIndexMap;
1312
1300
 
1313
1301
  const duties: routes.validator.SyncDuty[] = [];
@@ -1605,7 +1593,7 @@ export function getValidatorApi(
1605
1593
  const validatorIndex = chain.pubkeyCache.getIndex(pubkey);
1606
1594
  if (validatorIndex === null) return false;
1607
1595
 
1608
- const validator = headState.validators.getReadonly(validatorIndex);
1596
+ const validator = headState.getValidator(validatorIndex);
1609
1597
  const status = getValidatorStatus(validator, currentEpoch);
1610
1598
  return (
1611
1599
  status === "active_exiting" ||
@@ -1,6 +1,6 @@
1
1
  import {routes} from "@lodestar/api";
2
2
  import {ATTESTATION_SUBNET_COUNT} from "@lodestar/params";
3
- import {BeaconStateAllForks, computeSlotsSinceEpochStart} from "@lodestar/state-transition";
3
+ import {IBeaconStateView, computeSlotsSinceEpochStart} from "@lodestar/state-transition";
4
4
  import {BLSPubkey, CommitteeIndex, ProducedBlockSource, Slot, SubnetID, ValidatorIndex} from "@lodestar/types";
5
5
  import {MAX_BUILDER_BOOST_FACTOR} from "@lodestar/validator";
6
6
  import {BlockSelectionResult, BuilderBlockSelectionReason, EngineBlockSelectionReason} from "./index.js";
@@ -24,11 +24,8 @@ export function computeSubnetForCommitteesAtSlot(
24
24
  * Note: This is the fastest way of getting compressed pubkeys.
25
25
  * See benchmark -> packages/beacon-node/test/perf/api/impl/validator/attester.test.ts
26
26
  */
27
- export function getPubkeysForIndices(
28
- validators: BeaconStateAllForks["validators"],
29
- indexes: ValidatorIndex[]
30
- ): BLSPubkey[] {
31
- const validatorsLen = validators.length; // Get once, it's expensive
27
+ export function getPubkeysForIndices(state: IBeaconStateView, indexes: ValidatorIndex[]): BLSPubkey[] {
28
+ const validatorsLen = state.validatorCount; // Get once, it's expensive
32
29
 
33
30
  const pubkeys: BLSPubkey[] = [];
34
31
  for (let i = 0, len = indexes.length; i < len; i++) {
@@ -38,7 +35,7 @@ export function getPubkeysForIndices(
38
35
  }
39
36
 
40
37
  // NOTE: This could be optimized further by traversing the tree optimally with .getNodes()
41
- const validator = validators.getReadonly(index);
38
+ const validator = state.getValidator(index);
42
39
  pubkeys.push(validator.pubkey);
43
40
  }
44
41
 
@@ -120,6 +120,7 @@ export class ArchiveStore {
120
120
  opts: {
121
121
  genesisTime: this.chain.clock.genesisTime,
122
122
  dbLocation: this.opts.dbName,
123
+ nativeStateView: this.opts.nativeStateView ?? false,
123
124
  },
124
125
  config: this.chain.config,
125
126
  metrics: this.metrics,