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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +123 -4
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/state/index.js +8 -8
  5. package/lib/api/impl/beacon/state/index.js.map +1 -1
  6. package/lib/api/impl/beacon/state/utils.d.ts +3 -4
  7. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  8. package/lib/api/impl/beacon/state/utils.js +5 -24
  9. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  10. package/lib/api/impl/debug/index.d.ts.map +1 -1
  11. package/lib/api/impl/debug/index.js +6 -2
  12. package/lib/api/impl/debug/index.js.map +1 -1
  13. package/lib/api/impl/lightclient/index.d.ts.map +1 -1
  14. package/lib/api/impl/lightclient/index.js +19 -2
  15. package/lib/api/impl/lightclient/index.js.map +1 -1
  16. package/lib/api/impl/node/index.d.ts +1 -1
  17. package/lib/api/impl/node/index.d.ts.map +1 -1
  18. package/lib/api/impl/node/index.js +18 -1
  19. package/lib/api/impl/node/index.js.map +1 -1
  20. package/lib/api/impl/node/utils.d.ts +1 -1
  21. package/lib/api/impl/node/utils.d.ts.map +1 -1
  22. package/lib/api/impl/node/utils.js.map +1 -1
  23. package/lib/api/impl/validator/index.d.ts.map +1 -1
  24. package/lib/api/impl/validator/index.js +130 -16
  25. package/lib/api/impl/validator/index.js.map +1 -1
  26. package/lib/chain/archiveStore/archiveStore.d.ts +1 -0
  27. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  28. package/lib/chain/archiveStore/archiveStore.js +9 -0
  29. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  30. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +5 -6
  31. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  32. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +9 -10
  33. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  34. package/lib/chain/archiveStore/historicalState/worker.js +3 -3
  35. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  36. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +3 -8
  37. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts.map +1 -1
  38. package/lib/chain/archiveStore/utils/archiveBlocks.js +1 -1
  39. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  40. package/lib/chain/archiveStore/utils/archivePayloads.d.ts +7 -0
  41. package/lib/chain/archiveStore/utils/archivePayloads.d.ts.map +1 -0
  42. package/lib/chain/archiveStore/utils/archivePayloads.js +10 -0
  43. package/lib/chain/archiveStore/utils/archivePayloads.js.map +1 -0
  44. package/lib/chain/archiveStore/utils/updateBackfillRange.js +1 -1
  45. package/lib/chain/archiveStore/utils/updateBackfillRange.js.map +1 -1
  46. package/lib/chain/blocks/blockInput/blockInput.d.ts +25 -2
  47. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  48. package/lib/chain/blocks/blockInput/blockInput.js +71 -0
  49. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  50. package/lib/chain/blocks/blockInput/types.d.ts +18 -1
  51. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  52. package/lib/chain/blocks/blockInput/types.js +1 -0
  53. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  54. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  55. package/lib/chain/blocks/importBlock.js +27 -6
  56. package/lib/chain/blocks/importBlock.js.map +1 -1
  57. package/lib/chain/blocks/index.d.ts.map +1 -1
  58. package/lib/chain/blocks/index.js +2 -1
  59. package/lib/chain/blocks/index.js.map +1 -1
  60. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  61. package/lib/chain/blocks/verifyBlocksDataAvailability.js +3 -0
  62. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  63. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +4 -0
  64. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  65. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -1
  66. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  67. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  68. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -1
  69. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  70. package/lib/chain/blocks/writeBlockInputToDb.d.ts +12 -3
  71. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  72. package/lib/chain/blocks/writeBlockInputToDb.js +92 -95
  73. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  74. package/lib/chain/bls/multithread/index.d.ts +3 -3
  75. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  76. package/lib/chain/bls/multithread/index.js +5 -5
  77. package/lib/chain/bls/multithread/index.js.map +1 -1
  78. package/lib/chain/bls/multithread/jobItem.d.ts +2 -2
  79. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  80. package/lib/chain/bls/multithread/jobItem.js +2 -2
  81. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  82. package/lib/chain/bls/singleThread.d.ts +4 -4
  83. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  84. package/lib/chain/bls/singleThread.js +4 -4
  85. package/lib/chain/bls/singleThread.js.map +1 -1
  86. package/lib/chain/bls/utils.d.ts +2 -2
  87. package/lib/chain/bls/utils.d.ts.map +1 -1
  88. package/lib/chain/bls/utils.js +7 -4
  89. package/lib/chain/bls/utils.js.map +1 -1
  90. package/lib/chain/chain.d.ts +8 -11
  91. package/lib/chain/chain.d.ts.map +1 -1
  92. package/lib/chain/chain.js +45 -28
  93. package/lib/chain/chain.js.map +1 -1
  94. package/lib/chain/emitter.d.ts +5 -5
  95. package/lib/chain/emitter.d.ts.map +1 -1
  96. package/lib/chain/errors/blockError.d.ts +7 -1
  97. package/lib/chain/errors/blockError.d.ts.map +1 -1
  98. package/lib/chain/errors/blockError.js +2 -0
  99. package/lib/chain/errors/blockError.js.map +1 -1
  100. package/lib/chain/errors/executionPayloadBid.d.ts +1 -1
  101. package/lib/chain/errors/executionPayloadEnvelope.d.ts +2 -2
  102. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  103. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  104. package/lib/chain/errors/payloadAttestation.d.ts +1 -1
  105. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  106. package/lib/chain/forkChoice/index.js +30 -24
  107. package/lib/chain/forkChoice/index.js.map +1 -1
  108. package/lib/chain/interface.d.ts +4 -6
  109. package/lib/chain/interface.d.ts.map +1 -1
  110. package/lib/chain/interface.js.map +1 -1
  111. package/lib/chain/lightClient/index.d.ts.map +1 -1
  112. package/lib/chain/lightClient/index.js +1 -1
  113. package/lib/chain/lightClient/index.js.map +1 -1
  114. package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
  115. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  116. package/lib/chain/options.d.ts.map +1 -1
  117. package/lib/chain/options.js.map +1 -1
  118. package/lib/chain/prepareNextSlot.js +3 -3
  119. package/lib/chain/prepareNextSlot.js.map +1 -1
  120. package/lib/chain/produceBlock/computeNewStateRoot.d.ts +9 -2
  121. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  122. package/lib/chain/produceBlock/computeNewStateRoot.js +25 -2
  123. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  124. package/lib/chain/produceBlock/produceBlockBody.d.ts +22 -7
  125. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  126. package/lib/chain/produceBlock/produceBlockBody.js +109 -10
  127. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  128. package/lib/chain/regen/queued.d.ts.map +1 -1
  129. package/lib/chain/regen/queued.js +4 -1
  130. package/lib/chain/regen/queued.js.map +1 -1
  131. package/lib/chain/regen/regen.d.ts.map +1 -1
  132. package/lib/chain/regen/regen.js +6 -2
  133. package/lib/chain/regen/regen.js.map +1 -1
  134. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +5 -1
  135. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  136. package/lib/chain/seenCache/seenGossipBlockInput.js +36 -15
  137. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  138. package/lib/chain/validation/aggregateAndProof.js +1 -1
  139. package/lib/chain/validation/aggregateAndProof.js.map +1 -1
  140. package/lib/chain/validation/attestation.d.ts.map +1 -1
  141. package/lib/chain/validation/attestation.js +7 -4
  142. package/lib/chain/validation/attestation.js.map +1 -1
  143. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  144. package/lib/chain/validation/attesterSlashing.js +9 -2
  145. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  146. package/lib/chain/validation/blobSidecar.js +2 -2
  147. package/lib/chain/validation/blobSidecar.js.map +1 -1
  148. package/lib/chain/validation/block.d.ts.map +1 -1
  149. package/lib/chain/validation/block.js +33 -6
  150. package/lib/chain/validation/block.js.map +1 -1
  151. package/lib/chain/validation/dataColumnSidecar.d.ts +2 -2
  152. package/lib/chain/validation/dataColumnSidecar.d.ts.map +1 -1
  153. package/lib/chain/validation/dataColumnSidecar.js +1 -1
  154. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  155. package/lib/chain/validation/executionPayloadBid.js +1 -2
  156. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  157. package/lib/chain/validation/executionPayloadEnvelope.js +6 -5
  158. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  159. package/lib/chain/validation/payloadAttestationMessage.js +9 -3
  160. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  161. package/lib/chain/validation/proposerSlashing.js +1 -1
  162. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  163. package/lib/chain/validation/syncCommitteeContributionAndProof.js +1 -1
  164. package/lib/db/beacon.d.ts +3 -1
  165. package/lib/db/beacon.d.ts.map +1 -1
  166. package/lib/db/beacon.js +5 -1
  167. package/lib/db/beacon.js.map +1 -1
  168. package/lib/db/buckets.d.ts +3 -1
  169. package/lib/db/buckets.d.ts.map +1 -1
  170. package/lib/db/buckets.js +2 -0
  171. package/lib/db/buckets.js.map +1 -1
  172. package/lib/db/index.d.ts +1 -0
  173. package/lib/db/index.d.ts.map +1 -1
  174. package/lib/db/index.js +1 -0
  175. package/lib/db/index.js.map +1 -1
  176. package/lib/db/interface.d.ts +3 -1
  177. package/lib/db/interface.d.ts.map +1 -1
  178. package/lib/db/repositories/blockArchive.d.ts.map +1 -1
  179. package/lib/db/repositories/blockArchive.js +1 -2
  180. package/lib/db/repositories/blockArchive.js.map +1 -1
  181. package/lib/db/repositories/blockArchiveIndex.d.ts +2 -2
  182. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  183. package/lib/db/repositories/dataColumnSidecar.d.ts +5 -3
  184. package/lib/db/repositories/dataColumnSidecar.d.ts.map +1 -1
  185. package/lib/db/repositories/dataColumnSidecar.js +14 -1
  186. package/lib/db/repositories/dataColumnSidecar.js.map +1 -1
  187. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +5 -3
  188. package/lib/db/repositories/dataColumnSidecarArchive.d.ts.map +1 -1
  189. package/lib/db/repositories/dataColumnSidecarArchive.js +14 -1
  190. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -1
  191. package/lib/db/repositories/executionPayloadEnvelope.d.ts +19 -0
  192. package/lib/db/repositories/executionPayloadEnvelope.d.ts.map +1 -0
  193. package/lib/db/repositories/executionPayloadEnvelope.js +22 -0
  194. package/lib/db/repositories/executionPayloadEnvelope.js.map +1 -0
  195. package/lib/db/repositories/executionPayloadEnvelopeArchive.d.ts +18 -0
  196. package/lib/db/repositories/executionPayloadEnvelopeArchive.d.ts.map +1 -0
  197. package/lib/db/repositories/executionPayloadEnvelopeArchive.js +28 -0
  198. package/lib/db/repositories/executionPayloadEnvelopeArchive.js.map +1 -0
  199. package/lib/db/repositories/index.d.ts +2 -0
  200. package/lib/db/repositories/index.d.ts.map +1 -1
  201. package/lib/db/repositories/index.js +2 -0
  202. package/lib/db/repositories/index.js.map +1 -1
  203. package/lib/execution/engine/http.d.ts +1 -0
  204. package/lib/execution/engine/http.d.ts.map +1 -1
  205. package/lib/execution/engine/http.js +3 -0
  206. package/lib/execution/engine/http.js.map +1 -1
  207. package/lib/execution/engine/interface.d.ts +3 -25
  208. package/lib/execution/engine/interface.d.ts.map +1 -1
  209. package/lib/execution/engine/interface.js +2 -20
  210. package/lib/execution/engine/interface.js.map +1 -1
  211. package/lib/metrics/metrics/beacon.d.ts +1 -0
  212. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  213. package/lib/metrics/metrics/beacon.js +5 -0
  214. package/lib/metrics/metrics/beacon.js.map +1 -1
  215. package/lib/metrics/metrics/lodestar.d.ts +9 -0
  216. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  217. package/lib/metrics/metrics/lodestar.js +18 -0
  218. package/lib/metrics/metrics/lodestar.js.map +1 -1
  219. package/lib/metrics/metrics.d.ts.map +1 -1
  220. package/lib/metrics/metrics.js +8 -3
  221. package/lib/metrics/metrics.js.map +1 -1
  222. package/lib/monitoring/service.d.ts +2 -2
  223. package/lib/monitoring/service.d.ts.map +1 -1
  224. package/lib/monitoring/service.js +3 -2
  225. package/lib/monitoring/service.js.map +1 -1
  226. package/lib/network/core/networkCore.d.ts +3 -3
  227. package/lib/network/core/networkCore.d.ts.map +1 -1
  228. package/lib/network/core/networkCore.js.map +1 -1
  229. package/lib/network/core/networkCoreWorkerHandler.d.ts +3 -3
  230. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  231. package/lib/network/core/types.d.ts +2 -2
  232. package/lib/network/core/types.d.ts.map +1 -1
  233. package/lib/network/events.d.ts +2 -1
  234. package/lib/network/events.d.ts.map +1 -1
  235. package/lib/network/events.js.map +1 -1
  236. package/lib/network/gossip/encoding.d.ts +3 -3
  237. package/lib/network/gossip/encoding.d.ts.map +1 -1
  238. package/lib/network/gossip/encoding.js.map +1 -1
  239. package/lib/network/gossip/gossipsub.d.ts +13 -4
  240. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  241. package/lib/network/gossip/gossipsub.js +47 -20
  242. package/lib/network/gossip/gossipsub.js.map +1 -1
  243. package/lib/network/gossip/interface.d.ts +6 -6
  244. package/lib/network/gossip/interface.d.ts.map +1 -1
  245. package/lib/network/gossip/scoringParameters.d.ts +1 -1
  246. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  247. package/lib/network/gossip/scoringParameters.js +1 -1
  248. package/lib/network/gossip/scoringParameters.js.map +1 -1
  249. package/lib/network/gossip/topic.d.ts +114 -65
  250. package/lib/network/gossip/topic.d.ts.map +1 -1
  251. package/lib/network/gossip/topic.js +2 -2
  252. package/lib/network/gossip/topic.js.map +1 -1
  253. package/lib/network/interface.d.ts +6 -5
  254. package/lib/network/interface.d.ts.map +1 -1
  255. package/lib/network/libp2p/index.d.ts +1 -1
  256. package/lib/network/libp2p/index.d.ts.map +1 -1
  257. package/lib/network/libp2p/index.js +7 -2
  258. package/lib/network/libp2p/index.js.map +1 -1
  259. package/lib/network/network.d.ts +5 -4
  260. package/lib/network/network.d.ts.map +1 -1
  261. package/lib/network/network.js +11 -2
  262. package/lib/network/network.js.map +1 -1
  263. package/lib/network/options.d.ts.map +1 -1
  264. package/lib/network/options.js +3 -0
  265. package/lib/network/options.js.map +1 -1
  266. package/lib/network/peers/datastore.d.ts +7 -5
  267. package/lib/network/peers/datastore.d.ts.map +1 -1
  268. package/lib/network/peers/datastore.js +10 -10
  269. package/lib/network/peers/datastore.js.map +1 -1
  270. package/lib/network/peers/peerManager.d.ts +3 -0
  271. package/lib/network/peers/peerManager.d.ts.map +1 -1
  272. package/lib/network/peers/peerManager.js +103 -53
  273. package/lib/network/peers/peerManager.js.map +1 -1
  274. package/lib/network/peers/utils/prioritizePeers.d.ts +3 -3
  275. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  276. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  277. package/lib/network/processor/gossipHandlers.js +9 -2
  278. package/lib/network/processor/gossipHandlers.js.map +1 -1
  279. package/lib/network/processor/gossipValidatorFn.js +1 -1
  280. package/lib/network/processor/types.d.ts +1 -1
  281. package/lib/network/processor/types.d.ts.map +1 -1
  282. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  283. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +3 -2
  284. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  285. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  286. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +3 -2
  287. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  288. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +1 -1
  289. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +1 -1
  290. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  291. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +3 -2
  292. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  293. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +1 -1
  294. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  295. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.d.ts.map +1 -1
  296. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.js +7 -1
  297. package/lib/network/reqresp/handlers/lightClientUpdatesByRange.js.map +1 -1
  298. package/lib/network/reqresp/score.d.ts.map +1 -1
  299. package/lib/network/reqresp/score.js +0 -1
  300. package/lib/network/reqresp/score.js.map +1 -1
  301. package/lib/network/reqresp/utils/collect.d.ts +1 -1
  302. package/lib/network/reqresp/utils/collectSequentialBlocksInRange.d.ts +1 -1
  303. package/lib/network/util.js +2 -2
  304. package/lib/network/util.js.map +1 -1
  305. package/lib/node/nodejs.d.ts +3 -5
  306. package/lib/node/nodejs.d.ts.map +1 -1
  307. package/lib/node/nodejs.js +6 -4
  308. package/lib/node/nodejs.js.map +1 -1
  309. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  310. package/lib/sync/utils/downloadByRange.js +3 -9
  311. package/lib/sync/utils/downloadByRange.js.map +1 -1
  312. package/lib/sync/utils/downloadByRoot.d.ts +2 -2
  313. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  314. package/lib/sync/utils/downloadByRoot.js +4 -4
  315. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  316. package/lib/sync/utils/remoteSyncType.d.ts +1 -1
  317. package/lib/util/blobs.d.ts +2 -2
  318. package/lib/util/blobs.d.ts.map +1 -1
  319. package/lib/util/blobs.js.map +1 -1
  320. package/lib/util/clock.d.ts +6 -0
  321. package/lib/util/clock.d.ts.map +1 -1
  322. package/lib/util/clock.js +9 -3
  323. package/lib/util/clock.js.map +1 -1
  324. package/lib/util/dataColumns.d.ts +15 -2
  325. package/lib/util/dataColumns.d.ts.map +1 -1
  326. package/lib/util/dataColumns.js +40 -5
  327. package/lib/util/dataColumns.js.map +1 -1
  328. package/lib/util/multifork.d.ts +8 -0
  329. package/lib/util/multifork.d.ts.map +1 -1
  330. package/lib/util/multifork.js +37 -0
  331. package/lib/util/multifork.js.map +1 -1
  332. package/lib/util/serializedCache.d.ts +7 -2
  333. package/lib/util/serializedCache.d.ts.map +1 -1
  334. package/lib/util/serializedCache.js +9 -2
  335. package/lib/util/serializedCache.js.map +1 -1
  336. package/package.json +39 -42
  337. package/src/api/impl/beacon/blocks/index.ts +147 -3
  338. package/src/api/impl/beacon/state/index.ts +8 -8
  339. package/src/api/impl/beacon/state/utils.ts +15 -29
  340. package/src/api/impl/debug/index.ts +9 -5
  341. package/src/api/impl/lightclient/index.ts +19 -2
  342. package/src/api/impl/node/index.ts +22 -1
  343. package/src/api/impl/node/utils.ts +3 -3
  344. package/src/api/impl/validator/index.ts +153 -17
  345. package/src/chain/archiveStore/archiveStore.ts +15 -5
  346. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +10 -11
  347. package/src/chain/archiveStore/historicalState/worker.ts +3 -3
  348. package/src/chain/archiveStore/utils/archiveBlocks.ts +4 -5
  349. package/src/chain/archiveStore/utils/archivePayloads.ts +15 -0
  350. package/src/chain/archiveStore/utils/updateBackfillRange.ts +1 -1
  351. package/src/chain/blocks/blockInput/blockInput.ts +103 -3
  352. package/src/chain/blocks/blockInput/types.ts +18 -0
  353. package/src/chain/blocks/importBlock.ts +35 -7
  354. package/src/chain/blocks/index.ts +2 -1
  355. package/src/chain/blocks/verifyBlocksDataAvailability.ts +3 -0
  356. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -2
  357. package/src/chain/blocks/verifyBlocksSanityChecks.ts +7 -2
  358. package/src/chain/blocks/writeBlockInputToDb.ts +105 -101
  359. package/src/chain/bls/multithread/index.ts +7 -7
  360. package/src/chain/bls/multithread/jobItem.ts +3 -3
  361. package/src/chain/bls/singleThread.ts +5 -5
  362. package/src/chain/bls/utils.ts +8 -5
  363. package/src/chain/chain.ts +82 -45
  364. package/src/chain/emitter.ts +5 -5
  365. package/src/chain/errors/blockError.ts +4 -1
  366. package/src/chain/errors/executionPayloadBid.ts +1 -1
  367. package/src/chain/errors/executionPayloadEnvelope.ts +6 -2
  368. package/src/chain/errors/payloadAttestation.ts +1 -1
  369. package/src/chain/forkChoice/index.ts +39 -21
  370. package/src/chain/interface.ts +4 -11
  371. package/src/chain/lightClient/index.ts +4 -1
  372. package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
  373. package/src/chain/options.ts +1 -0
  374. package/src/chain/prepareNextSlot.ts +5 -5
  375. package/src/chain/produceBlock/computeNewStateRoot.ts +36 -3
  376. package/src/chain/produceBlock/produceBlockBody.ts +162 -13
  377. package/src/chain/regen/queued.ts +7 -2
  378. package/src/chain/regen/regen.ts +9 -3
  379. package/src/chain/seenCache/seenGossipBlockInput.ts +54 -17
  380. package/src/chain/validation/aggregateAndProof.ts +1 -1
  381. package/src/chain/validation/attestation.ts +7 -4
  382. package/src/chain/validation/attesterSlashing.ts +10 -1
  383. package/src/chain/validation/blobSidecar.ts +2 -2
  384. package/src/chain/validation/block.ts +40 -7
  385. package/src/chain/validation/dataColumnSidecar.ts +3 -6
  386. package/src/chain/validation/executionPayloadBid.ts +1 -2
  387. package/src/chain/validation/executionPayloadEnvelope.ts +6 -5
  388. package/src/chain/validation/payloadAttestationMessage.ts +11 -4
  389. package/src/chain/validation/proposerSlashing.ts +1 -1
  390. package/src/chain/validation/syncCommitteeContributionAndProof.ts +1 -1
  391. package/src/db/beacon.ts +8 -0
  392. package/src/db/buckets.ts +3 -0
  393. package/src/db/index.ts +1 -0
  394. package/src/db/interface.ts +5 -0
  395. package/src/db/repositories/blockArchive.ts +1 -2
  396. package/src/db/repositories/dataColumnSidecar.ts +18 -3
  397. package/src/db/repositories/dataColumnSidecarArchive.ts +18 -3
  398. package/src/db/repositories/executionPayloadEnvelope.ts +26 -0
  399. package/src/db/repositories/executionPayloadEnvelopeArchive.ts +32 -0
  400. package/src/db/repositories/index.ts +2 -0
  401. package/src/execution/engine/http.ts +3 -0
  402. package/src/execution/engine/interface.ts +3 -27
  403. package/src/metrics/metrics/beacon.ts +5 -0
  404. package/src/metrics/metrics/lodestar.ts +18 -0
  405. package/src/metrics/metrics.ts +8 -3
  406. package/src/monitoring/service.ts +3 -2
  407. package/src/network/core/networkCore.ts +3 -3
  408. package/src/network/core/networkCoreWorkerHandler.ts +3 -3
  409. package/src/network/core/types.ts +2 -2
  410. package/src/network/events.ts +2 -1
  411. package/src/network/gossip/encoding.ts +3 -3
  412. package/src/network/gossip/gossipsub.ts +86 -25
  413. package/src/network/gossip/interface.ts +6 -6
  414. package/src/network/gossip/scoringParameters.ts +4 -4
  415. package/src/network/gossip/topic.ts +2 -1
  416. package/src/network/interface.ts +7 -4
  417. package/src/network/libp2p/index.ts +8 -3
  418. package/src/network/network.ts +26 -7
  419. package/src/network/options.ts +3 -0
  420. package/src/network/peers/datastore.ts +13 -10
  421. package/src/network/peers/peerManager.ts +118 -54
  422. package/src/network/peers/utils/prioritizePeers.ts +3 -3
  423. package/src/network/processor/gossipHandlers.ts +19 -4
  424. package/src/network/processor/gossipValidatorFn.ts +2 -2
  425. package/src/network/processor/types.ts +1 -1
  426. package/src/network/reqresp/ReqRespBeaconNode.ts +1 -1
  427. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +4 -3
  428. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +3 -2
  429. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +1 -1
  430. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +4 -3
  431. package/src/network/reqresp/handlers/dataColumnSidecarsByRoot.ts +2 -2
  432. package/src/network/reqresp/handlers/lightClientUpdatesByRange.ts +6 -1
  433. package/src/network/reqresp/score.ts +0 -1
  434. package/src/network/reqresp/utils/collect.ts +1 -1
  435. package/src/network/reqresp/utils/collectSequentialBlocksInRange.ts +1 -1
  436. package/src/network/util.ts +2 -2
  437. package/src/node/nodejs.ts +8 -9
  438. package/src/sync/utils/downloadByRange.ts +3 -15
  439. package/src/sync/utils/downloadByRoot.ts +6 -12
  440. package/src/sync/utils/remoteSyncType.ts +1 -1
  441. package/src/util/blobs.ts +3 -3
  442. package/src/util/clock.ts +9 -4
  443. package/src/util/dataColumns.ts +54 -5
  444. package/src/util/multifork.ts +45 -0
  445. package/src/util/serializedCache.ts +10 -3
  446. package/src/util/workerEvents.ts +1 -1
@@ -78,7 +78,7 @@ export async function validateGossipBlobSidecar(
78
78
  // already know this block.
79
79
  const blockRoot = ssz.phase0.BeaconBlockHeader.hashTreeRoot(blobSidecar.signedBlockHeader.message);
80
80
  const blockHex = toRootHex(blockRoot);
81
- if (chain.forkChoice.getBlockHex(blockHex) !== null) {
81
+ if (chain.forkChoice.getBlockHexDefaultStatus(blockHex) !== null) {
82
82
  throw new BlobSidecarGossipError(GossipAction.IGNORE, {code: BlobSidecarErrorCode.ALREADY_KNOWN, root: blockHex});
83
83
  }
84
84
 
@@ -89,7 +89,7 @@ export async function validateGossipBlobSidecar(
89
89
  // gossip and non-gossip sources) (a client MAY queue blocks for processing once the parent block is
90
90
  // retrieved).
91
91
  const parentRoot = toRootHex(blobSidecar.signedBlockHeader.message.parentRoot);
92
- const parentBlock = chain.forkChoice.getBlockHex(parentRoot);
92
+ const parentBlock = chain.forkChoice.getBlockHexDefaultStatus(parentRoot);
93
93
  if (parentBlock === null) {
94
94
  // If fork choice does *not* consider the parent to be a descendant of the finalized block,
95
95
  // then there are two more cases:
@@ -9,8 +9,8 @@ import {
9
9
  isExecutionEnabled,
10
10
  isExecutionStateType,
11
11
  } from "@lodestar/state-transition";
12
- import {SignedBeaconBlock, deneb} from "@lodestar/types";
13
- import {sleep, toRootHex} from "@lodestar/utils";
12
+ import {SignedBeaconBlock, deneb, gloas, isGloasBeaconBlock} from "@lodestar/types";
13
+ import {byteArrayEquals, sleep, toRootHex} from "@lodestar/utils";
14
14
  import {BlockErrorCode, BlockGossipError, GossipAction} from "../errors/index.js";
15
15
  import {IBeaconChain} from "../interface.js";
16
16
  import {RegenCaller} from "../regen/index.js";
@@ -23,6 +23,7 @@ export async function validateGossipBlock(
23
23
  ): Promise<void> {
24
24
  const block = signedBlock.message;
25
25
  const blockSlot = block.slot;
26
+ const blockEpoch = computeEpochAtSlot(blockSlot);
26
27
 
27
28
  // [IGNORE] The block is not from a future slot (with a MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance) -- i.e.validate
28
29
  // that signed_beacon_block.message.slot <= current_slot (a client MAY queue future blocks for processing at the
@@ -55,7 +56,7 @@ export async function validateGossipBlock(
55
56
  // check, we will load the parent and state from disk only to find out later that we
56
57
  // already know this block.
57
58
  const blockRoot = toRootHex(config.getForkTypes(blockSlot).BeaconBlock.hashTreeRoot(block));
58
- if (chain.forkChoice.getBlockHex(blockRoot) !== null) {
59
+ if (chain.forkChoice.getBlockHexDefaultStatus(blockRoot) !== null) {
59
60
  throw new BlockGossipError(GossipAction.IGNORE, {code: BlockErrorCode.ALREADY_KNOWN, root: blockRoot});
60
61
  }
61
62
 
@@ -71,7 +72,12 @@ export async function validateGossipBlock(
71
72
  // [REJECT] The current finalized_checkpoint is an ancestor of block -- i.e.
72
73
  // get_ancestor(store, block.parent_root, compute_start_slot_at_epoch(store.finalized_checkpoint.epoch)) == store.finalized_checkpoint.root
73
74
  const parentRoot = toRootHex(block.parentRoot);
74
- const parentBlock = chain.forkChoice.getBlockHex(parentRoot);
75
+ const parentBlock = isGloasBeaconBlock(block)
76
+ ? chain.forkChoice.getBlockHexAndBlockHash(
77
+ parentRoot,
78
+ toRootHex(block.body.signedExecutionPayloadBid.message.parentBlockHash)
79
+ )
80
+ : chain.forkChoice.getBlockHexDefaultStatus(parentRoot);
75
81
  if (parentBlock === null) {
76
82
  // If fork choice does *not* consider the parent to be a descendant of the finalized block,
77
83
  // then there are two more cases:
@@ -103,7 +109,7 @@ export async function validateGossipBlock(
103
109
 
104
110
  // [REJECT] The block is from a higher slot than its parent.
105
111
  if (parentBlock.slot >= blockSlot) {
106
- throw new BlockGossipError(GossipAction.IGNORE, {
112
+ throw new BlockGossipError(GossipAction.REJECT, {
107
113
  code: BlockErrorCode.NOT_LATER_THAN_PARENT,
108
114
  parentSlot: parentBlock.slot,
109
115
  slot: blockSlot,
@@ -113,7 +119,23 @@ export async function validateGossipBlock(
113
119
  // [REJECT] The length of KZG commitments is less than or equal to the limitation defined in Consensus Layer -- i.e. validate that len(body.signed_beacon_block.message.blob_kzg_commitments) <= MAX_BLOBS_PER_BLOCK
114
120
  if (isForkPostDeneb(fork) && !isForkPostGloas(fork)) {
115
121
  const blobKzgCommitmentsLen = (block as deneb.BeaconBlock).body.blobKzgCommitments.length;
116
- const maxBlobsPerBlock = config.getMaxBlobsPerBlock(computeEpochAtSlot(blockSlot));
122
+ const maxBlobsPerBlock = config.getMaxBlobsPerBlock(blockEpoch);
123
+ if (blobKzgCommitmentsLen > maxBlobsPerBlock) {
124
+ throw new BlockGossipError(GossipAction.REJECT, {
125
+ code: BlockErrorCode.TOO_MANY_KZG_COMMITMENTS,
126
+ blobKzgCommitmentsLen,
127
+ commitmentLimit: maxBlobsPerBlock,
128
+ });
129
+ }
130
+ }
131
+
132
+ if (isForkPostGloas(fork)) {
133
+ const bid = (block as gloas.BeaconBlock).body.signedExecutionPayloadBid.message;
134
+
135
+ // [REJECT] The length of KZG commitments is less than or equal to the limitation defined in Consensus Layer
136
+ // -- i.e. validate that len(bid.blob_kzg_commitments) <= max_blobs_per_block
137
+ const blobKzgCommitmentsLen = bid.blobKzgCommitments.length;
138
+ const maxBlobsPerBlock = config.getMaxBlobsPerBlock(blockEpoch);
117
139
  if (blobKzgCommitmentsLen > maxBlobsPerBlock) {
118
140
  throw new BlockGossipError(GossipAction.REJECT, {
119
141
  code: BlockErrorCode.TOO_MANY_KZG_COMMITMENTS,
@@ -121,6 +143,18 @@ export async function validateGossipBlock(
121
143
  commitmentLimit: maxBlobsPerBlock,
122
144
  });
123
145
  }
146
+
147
+ // [REJECT] The bid's parent (defined by bid.parent_block_root) equals the block's parent (defined by block.parent_root)
148
+ if (!byteArrayEquals(bid.parentBlockRoot, block.parentRoot)) {
149
+ throw new BlockGossipError(GossipAction.REJECT, {
150
+ code: BlockErrorCode.BID_PARENT_ROOT_MISMATCH,
151
+ bidParentRoot: toRootHex(bid.parentBlockRoot),
152
+ blockParentRoot: parentRoot,
153
+ });
154
+ }
155
+
156
+ // TODO GLOAS: [REJECT] The block's execution payload parent (defined by bid.parent_block_hash) passes all validation
157
+ // This requires execution engine integration to verify the parent block hash
124
158
  }
125
159
 
126
160
  // use getPreState to reload state if needed. It also checks for whether the current finalized checkpoint is an ancestor of the block.
@@ -128,7 +162,6 @@ export async function validateGossipBlock(
128
162
  // this is something we should change this in the future to make the code airtight to the spec.
129
163
  // [IGNORE] The block's parent (defined by block.parent_root) has been seen (via both gossip and non-gossip sources) (a client MAY queue blocks for processing once the parent block is retrieved).
130
164
  // [REJECT] The block's parent (defined by block.parent_root) passes validation.
131
- // TODO GLOAS: post-gloas, we check the validity of bid's parent payload, not the entire beacon block
132
165
  const blockState = await chain.regen
133
166
  .getPreState(block, {dontTransferCache: true}, RegenCaller.validateGossipBlock)
134
167
  .catch(() => {
@@ -10,7 +10,7 @@ import {
10
10
  getBlockHeaderProposerSignatureSetByHeaderSlot,
11
11
  getBlockHeaderProposerSignatureSetByParentStateSlot,
12
12
  } from "@lodestar/state-transition";
13
- import {Root, Slot, SubnetID, fulu, ssz} from "@lodestar/types";
13
+ import {DataColumnSidecar, Root, Slot, SubnetID, fulu, ssz} from "@lodestar/types";
14
14
  import {byteArrayEquals, toRootHex, verifyMerkleBranch} from "@lodestar/utils";
15
15
  import {Metrics} from "../../metrics/metrics.js";
16
16
  import {kzg} from "../../util/kzg.js";
@@ -73,7 +73,7 @@ export async function validateGossipDataColumnSidecar(
73
73
  // 6) [IGNORE] The sidecar's block's parent (defined by block_header.parent_root) has been seen (via gossip
74
74
  // or non-gossip sources)
75
75
  const parentRoot = toRootHex(blockHeader.parentRoot);
76
- const parentBlock = chain.forkChoice.getBlockHex(parentRoot);
76
+ const parentBlock = chain.forkChoice.getBlockHexDefaultStatus(parentRoot);
77
77
  if (parentBlock === null) {
78
78
  // If fork choice does *not* consider the parent to be a descendant of the finalized block,
79
79
  // then there are two more cases:
@@ -457,9 +457,6 @@ export async function validateBlockDataColumnSidecars(
457
457
  * SPEC FUNCTION
458
458
  * https://github.com/ethereum/consensus-specs/blob/v1.6.0-alpha.4/specs/fulu/p2p-interface.md#compute_subnet_for_data_column_sidecar
459
459
  */
460
- export function computeSubnetForDataColumnSidecar(
461
- config: ChainConfig,
462
- columnSidecar: fulu.DataColumnSidecar
463
- ): SubnetID {
460
+ export function computeSubnetForDataColumnSidecar(config: ChainConfig, columnSidecar: DataColumnSidecar): SubnetID {
464
461
  return columnSidecar.index % config.DATA_COLUMN_SIDECAR_SUBNET_COUNT;
465
462
  }
@@ -113,8 +113,7 @@ async function validateExecutionPayloadBid(
113
113
 
114
114
  // [IGNORE] `bid.parent_block_root` is the hash tree root of a known beacon
115
115
  // block in fork choice.
116
- const block = chain.forkChoice.getBlock(bid.parentBlockRoot);
117
- if (block === null) {
116
+ if (!chain.forkChoice.hasBlock(bid.parentBlockRoot)) {
118
117
  throw new ExecutionPayloadBidError(GossipAction.IGNORE, {
119
118
  code: ExecutionPayloadBidErrorCode.UNKNOWN_BLOCK_ROOT,
120
119
  parentBlockRoot: parentBlockRootHex,
@@ -35,8 +35,9 @@ async function validateExecutionPayloadEnvelope(
35
35
  // [IGNORE] The envelope's block root `envelope.block_root` has been seen (via
36
36
  // gossip or non-gossip sources) (a client MAY queue payload for processing once
37
37
  // the block is retrieved).
38
- // TODO GLOAS: Need to review this
39
- const block = chain.forkChoice.getBlock(envelope.beaconBlockRoot);
38
+ // TODO GLOAS: Need to review this, we should queue the envelope for later
39
+ // processing if the block is not yet known, otherwise we would ignore it here
40
+ const block = chain.forkChoice.getBlockDefaultStatus(envelope.beaconBlockRoot);
40
41
  if (block === null) {
41
42
  throw new ExecutionPayloadEnvelopeError(GossipAction.IGNORE, {
42
43
  code: ExecutionPayloadEnvelopeErrorCode.BLOCK_ROOT_UNKNOWN,
@@ -78,7 +79,7 @@ async function validateExecutionPayloadEnvelope(
78
79
  });
79
80
  }
80
81
 
81
- if (block.builderIndex === undefined || block.blockHashHex === undefined) {
82
+ if (block.builderIndex == null || block.blockHashFromBid == null) {
82
83
  // This indicates this block is a pre-gloas block which is wrong
83
84
  throw new ExecutionPayloadEnvelopeError(GossipAction.IGNORE, {
84
85
  code: ExecutionPayloadEnvelopeErrorCode.CACHE_FAIL,
@@ -96,11 +97,11 @@ async function validateExecutionPayloadEnvelope(
96
97
  }
97
98
 
98
99
  // [REJECT] `payload.block_hash == bid.block_hash`
99
- if (toRootHex(payload.blockHash) !== block.blockHashHex) {
100
+ if (toRootHex(payload.blockHash) !== block.blockHashFromBid) {
100
101
  throw new ExecutionPayloadEnvelopeError(GossipAction.REJECT, {
101
102
  code: ExecutionPayloadEnvelopeErrorCode.BLOCK_HASH_MISMATCH,
102
103
  envelopeBlockHash: toRootHex(payload.blockHash),
103
- bidBlockHash: block.blockHashHex,
104
+ bidBlockHash: block.blockHashFromBid,
104
105
  });
105
106
  }
106
107
 
@@ -59,8 +59,7 @@ async function validatePayloadAttestationMessage(
59
59
  // [IGNORE] The message's block `data.beacon_block_root` has been seen (via
60
60
  // gossip or non-gossip sources) (a client MAY queue attestation for processing
61
61
  // once the block is retrieved. Note a client might want to request payload after).
62
- const block = chain.forkChoice.getBlock(data.beaconBlockRoot);
63
- if (block === null) {
62
+ if (!chain.forkChoice.hasBlock(data.beaconBlockRoot)) {
64
63
  throw new PayloadAttestationError(GossipAction.IGNORE, {
65
64
  code: PayloadAttestationErrorCode.UNKNOWN_BLOCK_ROOT,
66
65
  blockRoot: toRootHex(data.beaconBlockRoot),
@@ -87,9 +86,17 @@ async function validatePayloadAttestationMessage(
87
86
  }
88
87
 
89
88
  // [REJECT] `payload_attestation_message.signature` is valid with respect to the validator's public key.
89
+ const validatorPubkey = chain.pubkeyCache.get(validatorIndex);
90
+ if (!validatorPubkey) {
91
+ throw new PayloadAttestationError(GossipAction.REJECT, {
92
+ code: PayloadAttestationErrorCode.INVALID_ATTESTER,
93
+ attesterIndex: validatorIndex,
94
+ });
95
+ }
96
+
90
97
  const signatureSet = createSingleSignatureSetFromComponents(
91
- chain.index2pubkey[validatorIndex],
92
- getPayloadAttestationDataSigningRoot(chain.config, state.slot, data),
98
+ validatorPubkey,
99
+ getPayloadAttestationDataSigningRoot(chain.config, data),
93
100
  payloadAttestationMessage.signature
94
101
  );
95
102
 
@@ -37,7 +37,7 @@ async function validateProposerSlashing(
37
37
  try {
38
38
  const proposer = state.validators.getReadonly(proposerSlashing.signedHeader1.message.proposerIndex);
39
39
  // verifySignature = false, verified in batch below
40
- assertValidProposerSlashing(chain.config, chain.index2pubkey, state.slot, proposerSlashing, proposer, false);
40
+ assertValidProposerSlashing(chain.config, chain.pubkeyCache, state.slot, proposerSlashing, proposer, false);
41
41
  } catch (e) {
42
42
  throw new ProposerSlashingError(GossipAction.REJECT, {
43
43
  code: ProposerSlashingErrorCode.INVALID,
@@ -106,7 +106,7 @@ export async function validateSyncCommitteeGossipContributionAndProof(
106
106
  /**
107
107
  * Retrieve pubkeys in contribution aggregate using epochCtx:
108
108
  * - currSyncCommitteeIndexes cache
109
- * - index2pubkey cache
109
+ * - pubkeyCache
110
110
  */
111
111
  function getContributionIndices(
112
112
  state: CachedBeaconStateAltair,
package/src/db/beacon.ts CHANGED
@@ -15,6 +15,8 @@ import {
15
15
  CheckpointHeaderRepository,
16
16
  DataColumnSidecarArchiveRepository,
17
17
  DataColumnSidecarRepository,
18
+ ExecutionPayloadEnvelopeArchiveRepository,
19
+ ExecutionPayloadEnvelopeRepository,
18
20
  ProposerSlashingRepository,
19
21
  StateArchiveRepository,
20
22
  SyncCommitteeRepository,
@@ -36,6 +38,9 @@ export class BeaconDb implements IBeaconDb {
36
38
  dataColumnSidecar: DataColumnSidecarRepository;
37
39
  dataColumnSidecarArchive: DataColumnSidecarArchiveRepository;
38
40
 
41
+ executionPayloadEnvelope: ExecutionPayloadEnvelopeRepository;
42
+ executionPayloadEnvelopeArchive: ExecutionPayloadEnvelopeArchiveRepository;
43
+
39
44
  stateArchive: StateArchiveRepository;
40
45
  checkpointState: CheckpointStateRepository;
41
46
 
@@ -65,6 +70,9 @@ export class BeaconDb implements IBeaconDb {
65
70
  this.dataColumnSidecar = new DataColumnSidecarRepository(config, db);
66
71
  this.dataColumnSidecarArchive = new DataColumnSidecarArchiveRepository(config, db);
67
72
 
73
+ this.executionPayloadEnvelope = new ExecutionPayloadEnvelopeRepository(config, db);
74
+ this.executionPayloadEnvelopeArchive = new ExecutionPayloadEnvelopeArchiveRepository(config, db);
75
+
68
76
  this.stateArchive = new StateArchiveRepository(config, db);
69
77
  this.checkpointState = new CheckpointStateRepository(config, db);
70
78
  this.voluntaryExit = new VoluntaryExitRepository(config, db);
package/src/db/buckets.ts CHANGED
@@ -69,6 +69,9 @@ export enum Bucket {
69
69
 
70
70
  fulu_dataColumnSidecars = 57, // FULU BeaconBlockRoot -> DataColumnSidecars
71
71
  fulu_dataColumnSidecarsArchive = 58, // FULU BeaconBlockSlot -> DataColumnSidecars
72
+
73
+ gloas_executionPayloadEnvelope = 59, // GLOAS BeaconBlockRoot -> SignedExecutionPayloadEnvelope
74
+ gloas_executionPayloadEnvelopeArchive = 60, // GLOAS Slot -> SignedExecutionPayloadEnvelope
72
75
  }
73
76
 
74
77
  export function getBucketNameByValue<T extends Bucket>(enumValue: T): keyof typeof Bucket {
package/src/db/index.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export {BeaconDb} from "./beacon.js";
2
+ export {Bucket} from "./buckets.js";
2
3
  export type {IBeaconDb} from "./interface.js";
@@ -12,6 +12,8 @@ import {
12
12
  CheckpointHeaderRepository,
13
13
  DataColumnSidecarArchiveRepository,
14
14
  DataColumnSidecarRepository,
15
+ ExecutionPayloadEnvelopeArchiveRepository,
16
+ ExecutionPayloadEnvelopeRepository,
15
17
  ProposerSlashingRepository,
16
18
  StateArchiveRepository,
17
19
  SyncCommitteeRepository,
@@ -35,6 +37,9 @@ export interface IBeaconDb {
35
37
  dataColumnSidecar: DataColumnSidecarRepository;
36
38
  dataColumnSidecarArchive: DataColumnSidecarArchiveRepository;
37
39
 
40
+ executionPayloadEnvelope: ExecutionPayloadEnvelopeRepository;
41
+ executionPayloadEnvelopeArchive: ExecutionPayloadEnvelopeArchiveRepository;
42
+
38
43
  // finalized states
39
44
  stateArchive: StateArchiveRepository;
40
45
  // checkpoint states
@@ -1,4 +1,3 @@
1
- import all from "it-all";
2
1
  import {ChainForkConfig} from "@lodestar/config";
3
2
  import {Db, FilterOptions, KeyValue, Repository} from "@lodestar/db";
4
3
  import {Root, SignedBeaconBlock, Slot, ssz} from "@lodestar/types";
@@ -121,7 +120,7 @@ export class BlockArchiveRepository extends Repository<Slot, SignedBeaconBlock>
121
120
  }
122
121
 
123
122
  async values(opts?: BlockFilterOptions): Promise<SignedBeaconBlock[]> {
124
- return all(this.valuesStream(opts));
123
+ return await Array.fromAsync(this.valuesStream(opts));
125
124
  }
126
125
 
127
126
  // INDEX
@@ -1,7 +1,8 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
2
  import {Db, PrefixedRepository, decodeNumberForDbKey, encodeNumberForDbKey} from "@lodestar/db";
3
3
  import {NUMBER_OF_COLUMNS} from "@lodestar/params";
4
- import {ColumnIndex, Root, fulu, ssz} from "@lodestar/types";
4
+ import {ColumnIndex, DataColumnSidecar, Root, isGloasDataColumnSidecar, ssz} from "@lodestar/types";
5
+ import {isGloasDataColumnSidecarBytes} from "../../util/multifork.js";
5
6
  import {Bucket, getBucketNameByValue} from "../buckets.js";
6
7
 
7
8
  const COLUMN_INDEX_BYTE_SIZE = 2;
@@ -15,7 +16,7 @@ type BlockRoot = Root;
15
16
  *
16
17
  * Indexed data by `blockRoot` + `columnIndex`
17
18
  */
18
- export class DataColumnSidecarRepository extends PrefixedRepository<BlockRoot, ColumnIndex, fulu.DataColumnSidecar> {
19
+ export class DataColumnSidecarRepository extends PrefixedRepository<BlockRoot, ColumnIndex, DataColumnSidecar> {
19
20
  constructor(config: ChainForkConfig, db: Db) {
20
21
  const bucket = Bucket.fulu_dataColumnSidecars;
21
22
  super(config, db, bucket, ssz.fulu.DataColumnSidecar, getBucketNameByValue(bucket));
@@ -24,10 +25,24 @@ export class DataColumnSidecarRepository extends PrefixedRepository<BlockRoot, C
24
25
  /**
25
26
  * Id is hashTreeRoot of unsigned BeaconBlock
26
27
  */
27
- getId(value: fulu.DataColumnSidecar): ColumnIndex {
28
+ getId(value: DataColumnSidecar): ColumnIndex {
28
29
  return value.index;
29
30
  }
30
31
 
32
+ encodeValue(value: DataColumnSidecar): Uint8Array {
33
+ if (isGloasDataColumnSidecar(value)) {
34
+ return ssz.gloas.DataColumnSidecar.serialize(value);
35
+ }
36
+ return ssz.fulu.DataColumnSidecar.serialize(value);
37
+ }
38
+
39
+ decodeValue(data: Uint8Array): DataColumnSidecar {
40
+ if (isGloasDataColumnSidecarBytes(data)) {
41
+ return ssz.gloas.DataColumnSidecar.deserialize(data);
42
+ }
43
+ return ssz.fulu.DataColumnSidecar.deserialize(data);
44
+ }
45
+
31
46
  encodeKeyRaw(prefix: BlockRoot, id: ColumnIndex): Uint8Array {
32
47
  return Buffer.concat([prefix, encodeNumberForDbKey(id, COLUMN_INDEX_BYTE_SIZE)]);
33
48
  }
@@ -1,7 +1,8 @@
1
1
  import {ChainForkConfig} from "@lodestar/config";
2
2
  import {Db, PrefixedRepository, decodeNumberForDbKey, encodeNumberForDbKey} from "@lodestar/db";
3
3
  import {NUMBER_OF_COLUMNS} from "@lodestar/params";
4
- import {ColumnIndex, Slot, fulu, ssz} from "@lodestar/types";
4
+ import {ColumnIndex, DataColumnSidecar, Slot, isGloasDataColumnSidecar, ssz} from "@lodestar/types";
5
+ import {isGloasDataColumnSidecarBytes} from "../../util/multifork.js";
5
6
  import {Bucket, getBucketNameByValue} from "../buckets.js";
6
7
 
7
8
  const COLUMN_INDEX_BYTE_SIZE = 2;
@@ -13,7 +14,7 @@ const SLOT_BYTE_SIZE = 8;
13
14
  *
14
15
  * Indexed data by `slot` + `columnIndex`
15
16
  */
16
- export class DataColumnSidecarArchiveRepository extends PrefixedRepository<Slot, ColumnIndex, fulu.DataColumnSidecar> {
17
+ export class DataColumnSidecarArchiveRepository extends PrefixedRepository<Slot, ColumnIndex, DataColumnSidecar> {
17
18
  constructor(config: ChainForkConfig, db: Db) {
18
19
  const bucket = Bucket.fulu_dataColumnSidecarsArchive;
19
20
  super(config, db, bucket, ssz.fulu.DataColumnSidecar, getBucketNameByValue(bucket));
@@ -22,10 +23,24 @@ export class DataColumnSidecarArchiveRepository extends PrefixedRepository<Slot,
22
23
  /**
23
24
  * Id is hashTreeRoot of unsigned BeaconBlock
24
25
  */
25
- getId(value: fulu.DataColumnSidecar): ColumnIndex {
26
+ getId(value: DataColumnSidecar): ColumnIndex {
26
27
  return value.index;
27
28
  }
28
29
 
30
+ encodeValue(value: DataColumnSidecar): Uint8Array {
31
+ if (isGloasDataColumnSidecar(value)) {
32
+ return ssz.gloas.DataColumnSidecar.serialize(value);
33
+ }
34
+ return ssz.fulu.DataColumnSidecar.serialize(value);
35
+ }
36
+
37
+ decodeValue(data: Uint8Array): DataColumnSidecar {
38
+ if (isGloasDataColumnSidecarBytes(data)) {
39
+ return ssz.gloas.DataColumnSidecar.deserialize(data);
40
+ }
41
+ return ssz.fulu.DataColumnSidecar.deserialize(data);
42
+ }
43
+
29
44
  encodeKeyRaw(prefix: Slot, id: ColumnIndex): Uint8Array {
30
45
  return Buffer.concat([
31
46
  encodeNumberForDbKey(prefix, SLOT_BYTE_SIZE),
@@ -0,0 +1,26 @@
1
+ import {ChainForkConfig} from "@lodestar/config";
2
+ import {Db, Repository} from "@lodestar/db";
3
+ import {Root, gloas, ssz} from "@lodestar/types";
4
+ import {Bucket, getBucketNameByValue} from "../buckets.js";
5
+
6
+ type BlockRoot = Root;
7
+
8
+ /**
9
+ * Used to store unfinalized `SignedExecutionPayloadEnvelope`
10
+ *
11
+ * Indexed by beacon block root (root of the beacon block that contains the bid)
12
+ */
13
+ export class ExecutionPayloadEnvelopeRepository extends Repository<BlockRoot, gloas.SignedExecutionPayloadEnvelope> {
14
+ constructor(config: ChainForkConfig, db: Db) {
15
+ const bucket = Bucket.gloas_executionPayloadEnvelope;
16
+ super(config, db, bucket, ssz.gloas.SignedExecutionPayloadEnvelope, getBucketNameByValue(bucket));
17
+ }
18
+
19
+ /**
20
+ * Id is the beacon block root (not execution payload hash)
21
+ * This allows correlation with the block that contains the bid
22
+ */
23
+ getId(value: gloas.SignedExecutionPayloadEnvelope): BlockRoot {
24
+ return value.message.beaconBlockRoot;
25
+ }
26
+ }
@@ -0,0 +1,32 @@
1
+ import {ChainForkConfig} from "@lodestar/config";
2
+ import {BUCKET_LENGTH, Db, Repository, encodeKey as encodeDbKey} from "@lodestar/db";
3
+ import {Slot, gloas, ssz} from "@lodestar/types";
4
+ import {bytesToInt} from "@lodestar/utils";
5
+ import {Bucket, getBucketNameByValue} from "../buckets.js";
6
+
7
+ /**
8
+ * Used to store finalized `SignedExecutionPayloadEnvelope`
9
+ *
10
+ * Indexed by slot for chronological archival
11
+ */
12
+ export class ExecutionPayloadEnvelopeArchiveRepository extends Repository<Slot, gloas.SignedExecutionPayloadEnvelope> {
13
+ constructor(config: ChainForkConfig, db: Db) {
14
+ const bucket = Bucket.gloas_executionPayloadEnvelopeArchive;
15
+ super(config, db, bucket, ssz.gloas.SignedExecutionPayloadEnvelope, getBucketNameByValue(bucket));
16
+ }
17
+
18
+ /**
19
+ * Id is the slot from the envelope
20
+ */
21
+ getId(value: gloas.SignedExecutionPayloadEnvelope): Slot {
22
+ return value.message.slot;
23
+ }
24
+
25
+ encodeKey(id: Slot): Uint8Array {
26
+ return encodeDbKey(this.bucket, id);
27
+ }
28
+
29
+ decodeKey(data: Uint8Array): number {
30
+ return bytesToInt(data.subarray(BUCKET_LENGTH), "be");
31
+ }
32
+ }
@@ -8,6 +8,8 @@ export {BlockArchiveRepository} from "./blockArchive.js";
8
8
  export {BLSToExecutionChangeRepository} from "./blsToExecutionChange.js";
9
9
  export {DataColumnSidecarRepository} from "./dataColumnSidecar.js";
10
10
  export {DataColumnSidecarArchiveRepository} from "./dataColumnSidecarArchive.js";
11
+ export {ExecutionPayloadEnvelopeRepository} from "./executionPayloadEnvelope.js";
12
+ export {ExecutionPayloadEnvelopeArchiveRepository} from "./executionPayloadEnvelopeArchive.js";
11
13
  export {BestLightClientUpdateRepository} from "./lightclientBestUpdate.js";
12
14
  export {CheckpointHeaderRepository} from "./lightclientCheckpointHeader.js";
13
15
  export {SyncCommitteeRepository} from "./lightclientSyncCommittee.js";
@@ -128,6 +128,7 @@ const getClientVersionOpts: ReqOpts = {routeId: "getClientVersion"};
128
128
  */
129
129
  export class ExecutionEngineHttp implements IExecutionEngine {
130
130
  private logger: Logger;
131
+ private metrics: Metrics | null;
131
132
 
132
133
  // The default state is ONLINE, it will be updated to SYNCING once we receive the first payload
133
134
  // This assumption is better than the OFFLINE state, since we can't be sure if the EL is offline and being offline may trigger some notifications
@@ -167,6 +168,7 @@ export class ExecutionEngineHttp implements IExecutionEngine {
167
168
  metrics?.engineHttpProcessorQueue
168
169
  );
169
170
  this.logger = logger;
171
+ this.metrics = metrics ?? null;
170
172
 
171
173
  this.rpc.emitter.on(JsonRpcHttpClientEvent.ERROR, ({error}) => {
172
174
  this.updateEngineState(getExecutionEngineState({payloadError: error, oldState: this.state}));
@@ -369,6 +371,7 @@ export class ExecutionEngineHttp implements IExecutionEngine {
369
371
  } = await request;
370
372
 
371
373
  this.updateEngineState(getExecutionEngineState({payloadStatus: status, oldState: this.state}));
374
+ this.metrics?.engineNotifyForkchoiceUpdateResult.inc({result: status});
372
375
 
373
376
  switch (status) {
374
377
  case ExecutionPayloadStatus.VALID:
@@ -1,3 +1,4 @@
1
+ import {routes} from "@lodestar/api";
1
2
  import {
2
3
  CONSOLIDATION_REQUEST_TYPE,
3
4
  DEPOSIT_REQUEST_TYPE,
@@ -14,6 +15,8 @@ import {ExecutionPayloadBody} from "./types.js";
14
15
  import {DATA} from "./utils.js";
15
16
 
16
17
  export {PayloadIdCache, type PayloadId, type WithdrawalV1};
18
+ export type ClientVersion = routes.node.ClientVersion;
19
+ export const ClientCode = routes.node.ClientCode;
17
20
 
18
21
  export enum ExecutionPayloadStatus {
19
22
  /** given payload is valid */
@@ -45,26 +48,6 @@ export enum ExecutionEngineState {
45
48
  AUTH_FAILED = "AUTH_FAILED",
46
49
  }
47
50
 
48
- /**
49
- * Client code as defined in https://github.com/ethereum/execution-apis/blob/v1.0.0-beta.4/src/engine/identification.md#clientcode
50
- * ClientCode.XX is dedicated to other clients which do not have their own code
51
- */
52
- export enum ClientCode {
53
- BU = "BU", // besu
54
- EJ = "EJ", // ethereumJS
55
- EG = "EG", // erigon
56
- GE = "GE", // go-ethereum
57
- GR = "GR", // grandine
58
- LH = "LH", // lighthouse
59
- LS = "LS", // lodestar
60
- NM = "NM", // nethermind
61
- NB = "NB", // nimbus
62
- TK = "TK", // teku
63
- PM = "PM", // prysm
64
- RH = "RH", // reth
65
- XX = "XX", // unknown
66
- }
67
-
68
51
  export type ExecutionRequestType =
69
52
  | typeof DEPOSIT_REQUEST_TYPE
70
53
  | typeof WITHDRAWAL_REQUEST_TYPE
@@ -106,13 +89,6 @@ export type PayloadAttributes = {
106
89
  parentBeaconBlockRoot?: Uint8Array;
107
90
  };
108
91
 
109
- export type ClientVersion = {
110
- code: ClientCode;
111
- name: string;
112
- version: string;
113
- commit: string;
114
- };
115
-
116
92
  export type VersionedHashes = Uint8Array[];
117
93
 
118
94
  /**
@@ -144,6 +144,11 @@ export function createBeaconMetrics(register: RegistryMetricCreator) {
144
144
  help: "Time for preparing payload in advance",
145
145
  buckets: [0.1, 1, 3, 5, 10],
146
146
  }),
147
+ executionPayloadEnvelopeProcessingTime: register.histogram({
148
+ name: "beacon_block_payload_envelope_processing_seconds",
149
+ help: "Time to process execution payload envelope during block production",
150
+ buckets: [0.005, 0.01, 0.05, 0.1, 0.2, 0.5, 1],
151
+ }),
147
152
  payloadFetchedTime: register.histogram<{prepType: PayloadPreparationType}>({
148
153
  name: "beacon_block_payload_fetched_time",
149
154
  help: "Time to fetch the payload from EL",
@@ -827,6 +827,15 @@ export function createLodestarMetrics(
827
827
  help: "Total number of blobs retrieved from execution engine and published to gossip",
828
828
  }),
829
829
  },
830
+ // Gossip execution payload envelope
831
+ gossipExecutionPayloadEnvelope: {
832
+ elapsedTimeTillReceived: register.histogram<{source: OpSource}>({
833
+ name: "lodestar_gossip_execution_payload_envelope_elapsed_time_till_received",
834
+ help: "Time elapsed between slot time and the time execution payload envelope received",
835
+ labelNames: ["source"],
836
+ buckets: [0.5, 1, 2, 4, 6, 12],
837
+ }),
838
+ },
830
839
  recoverDataColumnSidecars: {
831
840
  recoverTime: register.histogram({
832
841
  name: "lodestar_recover_data_column_sidecar_recover_time_seconds",
@@ -919,6 +928,11 @@ export function createLodestarMetrics(
919
928
  help: "The total result of calling notifyNewPayload execution engine api",
920
929
  labelNames: ["result"],
921
930
  }),
931
+ engineNotifyForkchoiceUpdateResult: register.gauge<{result: ExecutionPayloadStatus}>({
932
+ name: "lodestar_execution_engine_notify_forkchoice_update_result_total",
933
+ help: "The total result of calling notifyForkchoiceUpdate execution engine api",
934
+ labelNames: ["result"],
935
+ }),
922
936
  backfillSync: {
923
937
  backfilledTillSlot: register.gauge({
924
938
  name: "lodestar_backfill_till_slot",
@@ -1447,6 +1461,10 @@ export function createLodestarMetrics(
1447
1461
  name: "lodestar_seen_block_input_cache_size",
1448
1462
  help: "Number of cached BlockInputs",
1449
1463
  }),
1464
+ serializedObjectCount: register.gauge({
1465
+ name: "lodestar_seen_block_input_cache_serialized_object_count",
1466
+ help: "Number of serialized objects retained by cached BlockInputs",
1467
+ }),
1450
1468
  duplicateBlockCount: register.gauge<{source: BlockInputSource}>({
1451
1469
  name: "lodestar_seen_block_input_cache_duplicate_block_count",
1452
1470
  help: "Total number of duplicate blocks that pass validation and attempt to be cached but are known",
@@ -19,11 +19,16 @@ export function createMetrics(opts: MetricsOptions, genesisTime: number, externa
19
19
  const lodestar = createLodestarMetrics(register, opts.metadata, genesisTime);
20
20
  const stateTransition = getMetrics(register);
21
21
 
22
- process.on("unhandledRejection", (_error) => {
22
+ const onUnhandledRejection = (_error: unknown): void => {
23
23
  lodestar.unhandledPromiseRejections.inc();
24
- });
24
+ };
25
+ process.on("unhandledRejection", onUnhandledRejection);
25
26
 
26
- const close = collectNodeJSMetrics(register);
27
+ const nodeJsMetricsClose = collectNodeJSMetrics(register);
28
+ const close = (): void => {
29
+ process.removeListener("unhandledRejection", onUnhandledRejection);
30
+ nodeJsMetricsClose();
31
+ };
27
32
 
28
33
  // Merge external registries
29
34
  for (const externalRegister of externalRegistries) {