@lodestar/beacon-node 1.50.0-dev.456b75a81e → 1.50.0-dev.4b00f7bf39

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 (389) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +13 -3
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/index.js +13 -0
  6. package/lib/api/impl/beacon/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/index.d.ts.map +1 -1
  8. package/lib/api/impl/beacon/state/index.js +28 -6
  9. package/lib/api/impl/beacon/state/index.js.map +1 -1
  10. package/lib/api/impl/debug/index.d.ts.map +1 -1
  11. package/lib/api/impl/debug/index.js +26 -18
  12. package/lib/api/impl/debug/index.js.map +1 -1
  13. package/lib/api/impl/validator/index.d.ts +1 -0
  14. package/lib/api/impl/validator/index.d.ts.map +1 -1
  15. package/lib/api/impl/validator/index.js +80 -18
  16. package/lib/api/impl/validator/index.js.map +1 -1
  17. package/lib/chain/ColumnReconstructionTracker.d.ts +0 -2
  18. package/lib/chain/ColumnReconstructionTracker.d.ts.map +1 -1
  19. package/lib/chain/ColumnReconstructionTracker.js +4 -5
  20. package/lib/chain/ColumnReconstructionTracker.js.map +1 -1
  21. package/lib/chain/archiveStore/archiveStore.d.ts +5 -0
  22. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  23. package/lib/chain/archiveStore/archiveStore.js +14 -24
  24. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  25. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts +2 -2
  26. package/lib/chain/archiveStore/historicalState/getHistoricalState.d.ts.map +1 -1
  27. package/lib/chain/archiveStore/historicalState/getHistoricalState.js +5 -7
  28. package/lib/chain/archiveStore/historicalState/getHistoricalState.js.map +1 -1
  29. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js +1 -1
  30. package/lib/chain/archiveStore/historicalState/historicalStateRegen.js.map +1 -1
  31. package/lib/chain/archiveStore/historicalState/types.d.ts +2 -2
  32. package/lib/chain/archiveStore/historicalState/types.d.ts.map +1 -1
  33. package/lib/chain/archiveStore/historicalState/worker.js +1 -1
  34. package/lib/chain/archiveStore/historicalState/worker.js.map +1 -1
  35. package/lib/chain/archiveStore/interface.d.ts +1 -1
  36. package/lib/chain/archiveStore/interface.d.ts.map +1 -1
  37. package/lib/chain/archiveStore/utils/pruneHistory.d.ts +1 -1
  38. package/lib/chain/archiveStore/utils/pruneHistory.d.ts.map +1 -1
  39. package/lib/chain/archiveStore/utils/pruneHistory.js +2 -1
  40. package/lib/chain/archiveStore/utils/pruneHistory.js.map +1 -1
  41. package/lib/chain/beaconProposerCache.d.ts +6 -0
  42. package/lib/chain/beaconProposerCache.d.ts.map +1 -1
  43. package/lib/chain/beaconProposerCache.js +16 -0
  44. package/lib/chain/beaconProposerCache.js.map +1 -1
  45. package/lib/chain/blocks/blockInput/blockInput.d.ts +1 -1
  46. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  47. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  48. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  49. package/lib/chain/blocks/importBlock.js +21 -12
  50. package/lib/chain/blocks/importBlock.js.map +1 -1
  51. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +2 -1
  52. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  53. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  54. package/lib/chain/blocks/verifyBlock.js +7 -7
  55. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  56. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts +2 -1
  57. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  58. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +5 -4
  59. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  60. package/lib/chain/chain.d.ts +10 -5
  61. package/lib/chain/chain.d.ts.map +1 -1
  62. package/lib/chain/chain.js +105 -35
  63. package/lib/chain/chain.js.map +1 -1
  64. package/lib/chain/emitter.d.ts +7 -1
  65. package/lib/chain/emitter.d.ts.map +1 -1
  66. package/lib/chain/emitter.js +5 -0
  67. package/lib/chain/emitter.js.map +1 -1
  68. package/lib/chain/errors/envelopeReconstructionError.d.ts +5 -0
  69. package/lib/chain/errors/envelopeReconstructionError.d.ts.map +1 -1
  70. package/lib/chain/errors/envelopeReconstructionError.js +2 -0
  71. package/lib/chain/errors/envelopeReconstructionError.js.map +1 -1
  72. package/lib/chain/errors/gossipValidation.d.ts +1 -0
  73. package/lib/chain/errors/gossipValidation.d.ts.map +1 -1
  74. package/lib/chain/errors/gossipValidation.js +1 -0
  75. package/lib/chain/errors/gossipValidation.js.map +1 -1
  76. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  77. package/lib/chain/forkChoice/index.js +2 -0
  78. package/lib/chain/forkChoice/index.js.map +1 -1
  79. package/lib/chain/interface.d.ts +6 -3
  80. package/lib/chain/interface.d.ts.map +1 -1
  81. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +4 -2
  82. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  83. package/lib/chain/opPools/aggregatedAttestationPool.js +30 -8
  84. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  85. package/lib/chain/opPools/opPool.d.ts.map +1 -1
  86. package/lib/chain/opPools/opPool.js +1 -23
  87. package/lib/chain/opPools/opPool.js.map +1 -1
  88. package/lib/chain/opPools/proposerPreferencesPool.d.ts +8 -4
  89. package/lib/chain/opPools/proposerPreferencesPool.d.ts.map +1 -1
  90. package/lib/chain/opPools/proposerPreferencesPool.js +27 -12
  91. package/lib/chain/opPools/proposerPreferencesPool.js.map +1 -1
  92. package/lib/chain/opPools/utils.d.ts +11 -0
  93. package/lib/chain/opPools/utils.d.ts.map +1 -1
  94. package/lib/chain/opPools/utils.js +22 -0
  95. package/lib/chain/opPools/utils.js.map +1 -1
  96. package/lib/chain/options.d.ts +2 -1
  97. package/lib/chain/options.d.ts.map +1 -1
  98. package/lib/chain/options.js +1 -1
  99. package/lib/chain/options.js.map +1 -1
  100. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  101. package/lib/chain/prepareNextSlot.js +20 -8
  102. package/lib/chain/prepareNextSlot.js.map +1 -1
  103. package/lib/chain/produceBlock/computeNewStateRoot.d.ts.map +1 -1
  104. package/lib/chain/produceBlock/computeNewStateRoot.js +1 -1
  105. package/lib/chain/produceBlock/computeNewStateRoot.js.map +1 -1
  106. package/lib/chain/produceBlock/produceBlockBody.d.ts +11 -1
  107. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  108. package/lib/chain/produceBlock/produceBlockBody.js +54 -36
  109. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  110. package/lib/chain/regen/regen.d.ts +2 -0
  111. package/lib/chain/regen/regen.d.ts.map +1 -1
  112. package/lib/chain/regen/regen.js +10 -4
  113. package/lib/chain/regen/regen.js.map +1 -1
  114. package/lib/chain/reprocess.d.ts +2 -1
  115. package/lib/chain/reprocess.d.ts.map +1 -1
  116. package/lib/chain/reprocess.js +2 -1
  117. package/lib/chain/reprocess.js.map +1 -1
  118. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -0
  119. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  120. package/lib/chain/seenCache/seenGossipBlockInput.js +22 -1
  121. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  122. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +9 -2
  123. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  124. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +23 -13
  125. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  126. package/lib/chain/shufflingCache.d.ts +18 -8
  127. package/lib/chain/shufflingCache.d.ts.map +1 -1
  128. package/lib/chain/shufflingCache.js +72 -18
  129. package/lib/chain/shufflingCache.js.map +1 -1
  130. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  131. package/lib/chain/stateCache/persistentCheckpointsCache.js +1 -1
  132. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  133. package/lib/chain/validatorMonitor.d.ts +5 -1
  134. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  135. package/lib/chain/validatorMonitor.js +70 -58
  136. package/lib/chain/validatorMonitor.js.map +1 -1
  137. package/lib/constants/constants.d.ts +1 -0
  138. package/lib/constants/constants.d.ts.map +1 -1
  139. package/lib/constants/constants.js +1 -0
  140. package/lib/constants/constants.js.map +1 -1
  141. package/lib/db/beacon.d.ts +4 -1
  142. package/lib/db/beacon.d.ts.map +1 -1
  143. package/lib/db/beacon.js +6 -1
  144. package/lib/db/beacon.js.map +1 -1
  145. package/lib/db/buckets.d.ts +3 -1
  146. package/lib/db/buckets.d.ts.map +1 -1
  147. package/lib/db/buckets.js +2 -0
  148. package/lib/db/buckets.js.map +1 -1
  149. package/lib/db/interface.d.ts +4 -1
  150. package/lib/db/interface.d.ts.map +1 -1
  151. package/lib/db/repositories/blockArchive.js +2 -2
  152. package/lib/db/repositories/blockArchive.js.map +1 -1
  153. package/lib/db/repositories/blockArchiveIndex.d.ts +3 -3
  154. package/lib/db/repositories/blockArchiveIndex.d.ts.map +1 -1
  155. package/lib/db/repositories/blockArchiveIndex.js +1 -2
  156. package/lib/db/repositories/blockArchiveIndex.js.map +1 -1
  157. package/lib/db/repositories/earliestAvailableSlot.d.ts +11 -0
  158. package/lib/db/repositories/earliestAvailableSlot.d.ts.map +1 -0
  159. package/lib/db/repositories/earliestAvailableSlot.js +19 -0
  160. package/lib/db/repositories/earliestAvailableSlot.js.map +1 -0
  161. package/lib/db/repositories/index.d.ts +1 -0
  162. package/lib/db/repositories/index.d.ts.map +1 -1
  163. package/lib/db/repositories/index.js +1 -0
  164. package/lib/db/repositories/index.js.map +1 -1
  165. package/lib/db/repositories/proposerPreferences.d.ts +14 -0
  166. package/lib/db/repositories/proposerPreferences.d.ts.map +1 -0
  167. package/lib/db/repositories/proposerPreferences.js +21 -0
  168. package/lib/db/repositories/proposerPreferences.js.map +1 -0
  169. package/lib/execution/engine/blobVersionedHashes.d.ts +9 -0
  170. package/lib/execution/engine/blobVersionedHashes.d.ts.map +1 -0
  171. package/lib/execution/engine/blobVersionedHashes.js +74 -0
  172. package/lib/execution/engine/blobVersionedHashes.js.map +1 -0
  173. package/lib/execution/engine/disabled.d.ts +0 -2
  174. package/lib/execution/engine/disabled.d.ts.map +1 -1
  175. package/lib/execution/engine/disabled.js +0 -6
  176. package/lib/execution/engine/disabled.js.map +1 -1
  177. package/lib/execution/engine/http.d.ts +46 -16
  178. package/lib/execution/engine/http.d.ts.map +1 -1
  179. package/lib/execution/engine/http.js +236 -213
  180. package/lib/execution/engine/http.js.map +1 -1
  181. package/lib/execution/engine/index.d.ts +3 -2
  182. package/lib/execution/engine/index.d.ts.map +1 -1
  183. package/lib/execution/engine/index.js +33 -8
  184. package/lib/execution/engine/index.js.map +1 -1
  185. package/lib/execution/engine/interface.d.ts +2 -4
  186. package/lib/execution/engine/interface.d.ts.map +1 -1
  187. package/lib/execution/engine/jsonRpcHttpClient.d.ts.map +1 -1
  188. package/lib/execution/engine/jsonRpcHttpClient.js +14 -4
  189. package/lib/execution/engine/jsonRpcHttpClient.js.map +1 -1
  190. package/lib/execution/engine/jsonRpcTransport.d.ts +25 -0
  191. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -0
  192. package/lib/execution/engine/jsonRpcTransport.js +158 -0
  193. package/lib/execution/engine/jsonRpcTransport.js.map +1 -0
  194. package/lib/execution/engine/mock.d.ts +0 -2
  195. package/lib/execution/engine/mock.d.ts.map +1 -1
  196. package/lib/execution/engine/mock.js +0 -8
  197. package/lib/execution/engine/mock.js.map +1 -1
  198. package/lib/execution/engine/restHttpClient.d.ts +71 -0
  199. package/lib/execution/engine/restHttpClient.d.ts.map +1 -0
  200. package/lib/execution/engine/restHttpClient.js +201 -0
  201. package/lib/execution/engine/restHttpClient.js.map +1 -0
  202. package/lib/execution/engine/restTransport.d.ts +48 -0
  203. package/lib/execution/engine/restTransport.d.ts.map +1 -0
  204. package/lib/execution/engine/restTransport.js +411 -0
  205. package/lib/execution/engine/restTransport.js.map +1 -0
  206. package/lib/execution/engine/sszTypes.d.ts +1261 -0
  207. package/lib/execution/engine/sszTypes.d.ts.map +1 -0
  208. package/lib/execution/engine/sszTypes.js +216 -0
  209. package/lib/execution/engine/sszTypes.js.map +1 -0
  210. package/lib/execution/engine/transport.d.ts +39 -0
  211. package/lib/execution/engine/transport.d.ts.map +1 -0
  212. package/lib/execution/engine/transport.js +2 -0
  213. package/lib/execution/engine/transport.js.map +1 -0
  214. package/lib/execution/engine/transportMetrics.d.ts +5 -1
  215. package/lib/execution/engine/transportMetrics.d.ts.map +1 -1
  216. package/lib/execution/engine/types.d.ts +2 -8
  217. package/lib/execution/engine/types.d.ts.map +1 -1
  218. package/lib/execution/engine/types.js +31 -63
  219. package/lib/execution/engine/types.js.map +1 -1
  220. package/lib/execution/engine/utils.d.ts.map +1 -1
  221. package/lib/execution/engine/utils.js +9 -2
  222. package/lib/execution/engine/utils.js.map +1 -1
  223. package/lib/metrics/metrics/lodestar.d.ts +14 -0
  224. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  225. package/lib/metrics/metrics/lodestar.js +29 -1
  226. package/lib/metrics/metrics/lodestar.js.map +1 -1
  227. package/lib/metrics/metrics.d.ts +7 -3
  228. package/lib/metrics/metrics.d.ts.map +1 -1
  229. package/lib/metrics/metrics.js +4 -4
  230. package/lib/metrics/metrics.js.map +1 -1
  231. package/lib/network/core/events.d.ts +5 -1
  232. package/lib/network/core/events.d.ts.map +1 -1
  233. package/lib/network/core/events.js +8 -0
  234. package/lib/network/core/events.js.map +1 -1
  235. package/lib/network/gossip/topic.d.ts +0 -14
  236. package/lib/network/gossip/topic.d.ts.map +1 -1
  237. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  238. package/lib/network/processor/gossipHandlers.js +63 -64
  239. package/lib/network/processor/gossipHandlers.js.map +1 -1
  240. package/lib/network/processor/gossipValidatorFn.d.ts +4 -2
  241. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  242. package/lib/network/processor/gossipValidatorFn.js +6 -2
  243. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  244. package/lib/network/processor/index.d.ts +8 -0
  245. package/lib/network/processor/index.d.ts.map +1 -1
  246. package/lib/network/processor/index.js +52 -5
  247. package/lib/network/processor/index.js.map +1 -1
  248. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js +1 -1
  249. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRoot.js.map +1 -1
  250. package/lib/network/reqresp/rateLimit.js +2 -2
  251. package/lib/network/reqresp/rateLimit.js.map +1 -1
  252. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  253. package/lib/network/subnets/attnetsService.js +3 -1
  254. package/lib/network/subnets/attnetsService.js.map +1 -1
  255. package/lib/node/nodejs.d.ts +3 -1
  256. package/lib/node/nodejs.d.ts.map +1 -1
  257. package/lib/node/nodejs.js +27 -4
  258. package/lib/node/nodejs.js.map +1 -1
  259. package/lib/node/notifier.d.ts.map +1 -1
  260. package/lib/node/notifier.js +12 -13
  261. package/lib/node/notifier.js.map +1 -1
  262. package/lib/node/options.d.ts +3 -2
  263. package/lib/node/options.d.ts.map +1 -1
  264. package/lib/node/options.js +2 -2
  265. package/lib/node/options.js.map +1 -1
  266. package/lib/sync/range/batch.d.ts +11 -5
  267. package/lib/sync/range/batch.d.ts.map +1 -1
  268. package/lib/sync/range/batch.js +21 -17
  269. package/lib/sync/range/batch.js.map +1 -1
  270. package/lib/sync/range/chain.d.ts +4 -4
  271. package/lib/sync/range/chain.d.ts.map +1 -1
  272. package/lib/sync/range/chain.js +12 -6
  273. package/lib/sync/range/chain.js.map +1 -1
  274. package/lib/sync/range/range.d.ts.map +1 -1
  275. package/lib/sync/range/range.js +75 -29
  276. package/lib/sync/range/range.js.map +1 -1
  277. package/lib/sync/unknownBlock.d.ts +5 -2
  278. package/lib/sync/unknownBlock.d.ts.map +1 -1
  279. package/lib/sync/unknownBlock.js +52 -26
  280. package/lib/sync/unknownBlock.js.map +1 -1
  281. package/lib/sync/utils/downloadByRange.d.ts +38 -14
  282. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  283. package/lib/sync/utils/downloadByRange.js +84 -39
  284. package/lib/sync/utils/downloadByRange.js.map +1 -1
  285. package/lib/util/asyncIterableToEvents.d.ts +10 -2
  286. package/lib/util/asyncIterableToEvents.d.ts.map +1 -1
  287. package/lib/util/asyncIterableToEvents.js +29 -3
  288. package/lib/util/asyncIterableToEvents.js.map +1 -1
  289. package/lib/util/clock.d.ts.map +1 -1
  290. package/lib/util/clock.js +3 -4
  291. package/lib/util/clock.js.map +1 -1
  292. package/lib/util/execution.d.ts +9 -11
  293. package/lib/util/execution.d.ts.map +1 -1
  294. package/lib/util/execution.js +5 -1
  295. package/lib/util/execution.js.map +1 -1
  296. package/lib/util/metadata.d.ts.map +1 -1
  297. package/lib/util/metadata.js +2 -1
  298. package/lib/util/metadata.js.map +1 -1
  299. package/lib/util/sszBytes.d.ts +2 -2
  300. package/lib/util/sszBytes.d.ts.map +1 -1
  301. package/lib/util/sszBytes.js +22 -14
  302. package/lib/util/sszBytes.js.map +1 -1
  303. package/package.json +18 -17
  304. package/src/api/impl/beacon/blocks/index.ts +17 -7
  305. package/src/api/impl/beacon/index.ts +15 -0
  306. package/src/api/impl/beacon/state/index.ts +43 -6
  307. package/src/api/impl/debug/index.ts +28 -19
  308. package/src/api/impl/validator/index.ts +102 -21
  309. package/src/chain/ColumnReconstructionTracker.ts +4 -6
  310. package/src/chain/archiveStore/archiveStore.ts +19 -25
  311. package/src/chain/archiveStore/historicalState/getHistoricalState.ts +5 -7
  312. package/src/chain/archiveStore/historicalState/historicalStateRegen.ts +1 -1
  313. package/src/chain/archiveStore/historicalState/types.ts +2 -2
  314. package/src/chain/archiveStore/historicalState/worker.ts +1 -2
  315. package/src/chain/archiveStore/interface.ts +1 -1
  316. package/src/chain/archiveStore/utils/pruneHistory.ts +4 -1
  317. package/src/chain/beaconProposerCache.ts +19 -1
  318. package/src/chain/blocks/blockInput/blockInput.ts +1 -1
  319. package/src/chain/blocks/importBlock.ts +25 -11
  320. package/src/chain/blocks/payloadEnvelopeInput/types.ts +2 -1
  321. package/src/chain/blocks/verifyBlock.ts +8 -6
  322. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +6 -3
  323. package/src/chain/chain.ts +135 -37
  324. package/src/chain/emitter.ts +7 -1
  325. package/src/chain/errors/envelopeReconstructionError.ts +3 -0
  326. package/src/chain/errors/gossipValidation.ts +1 -0
  327. package/src/chain/forkChoice/index.ts +2 -0
  328. package/src/chain/interface.ts +7 -3
  329. package/src/chain/opPools/aggregatedAttestationPool.ts +34 -10
  330. package/src/chain/opPools/opPool.ts +1 -31
  331. package/src/chain/opPools/proposerPreferencesPool.ts +34 -11
  332. package/src/chain/opPools/utils.ts +31 -0
  333. package/src/chain/options.ts +3 -3
  334. package/src/chain/prepareNextSlot.ts +28 -9
  335. package/src/chain/produceBlock/computeNewStateRoot.ts +10 -3
  336. package/src/chain/produceBlock/produceBlockBody.ts +86 -40
  337. package/src/chain/regen/regen.ts +12 -4
  338. package/src/chain/reprocess.ts +2 -1
  339. package/src/chain/seenCache/seenGossipBlockInput.ts +25 -1
  340. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +31 -13
  341. package/src/chain/shufflingCache.ts +84 -22
  342. package/src/chain/stateCache/persistentCheckpointsCache.ts +4 -1
  343. package/src/chain/validatorMonitor.ts +82 -61
  344. package/src/constants/constants.ts +1 -0
  345. package/src/db/beacon.ts +6 -0
  346. package/src/db/buckets.ts +2 -0
  347. package/src/db/interface.ts +4 -0
  348. package/src/db/repositories/blockArchive.ts +2 -2
  349. package/src/db/repositories/blockArchiveIndex.ts +2 -3
  350. package/src/db/repositories/earliestAvailableSlot.ts +19 -0
  351. package/src/db/repositories/index.ts +1 -0
  352. package/src/db/repositories/proposerPreferences.ts +23 -0
  353. package/src/execution/engine/blobVersionedHashes.ts +72 -0
  354. package/src/execution/engine/disabled.ts +0 -8
  355. package/src/execution/engine/http.ts +304 -300
  356. package/src/execution/engine/index.ts +42 -7
  357. package/src/execution/engine/interface.ts +2 -6
  358. package/src/execution/engine/jsonRpcHttpClient.ts +12 -5
  359. package/src/execution/engine/jsonRpcTransport.ts +247 -0
  360. package/src/execution/engine/mock.ts +1 -19
  361. package/src/execution/engine/restHttpClient.ts +269 -0
  362. package/src/execution/engine/restTransport.ts +575 -0
  363. package/src/execution/engine/sszTypes.ts +354 -0
  364. package/src/execution/engine/transport.ts +61 -0
  365. package/src/execution/engine/transportMetrics.ts +2 -1
  366. package/src/execution/engine/types.ts +42 -90
  367. package/src/execution/engine/utils.ts +12 -2
  368. package/src/metrics/metrics/lodestar.ts +30 -1
  369. package/src/metrics/metrics.ts +21 -6
  370. package/src/network/core/events.ts +16 -1
  371. package/src/network/processor/gossipHandlers.ts +94 -77
  372. package/src/network/processor/gossipValidatorFn.ts +12 -2
  373. package/src/network/processor/index.ts +58 -5
  374. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRoot.ts +1 -1
  375. package/src/network/reqresp/rateLimit.ts +2 -2
  376. package/src/network/subnets/attnetsService.ts +8 -3
  377. package/src/node/nodejs.ts +35 -3
  378. package/src/node/notifier.ts +14 -13
  379. package/src/node/options.ts +10 -1
  380. package/src/sync/range/batch.ts +25 -19
  381. package/src/sync/range/chain.ts +15 -8
  382. package/src/sync/range/range.ts +76 -30
  383. package/src/sync/unknownBlock.ts +65 -27
  384. package/src/sync/utils/downloadByRange.ts +123 -58
  385. package/src/util/asyncIterableToEvents.ts +44 -5
  386. package/src/util/clock.ts +3 -4
  387. package/src/util/execution.ts +16 -8
  388. package/src/util/metadata.ts +2 -1
  389. package/src/util/sszBytes.ts +25 -12
@@ -0,0 +1,269 @@
1
+ import {ErrorAborted, FetchError, LodestarError, TimeoutError, fetch, isValidHttpUrl, retry} from "@lodestar/utils";
2
+ import {
3
+ JsonRpcHttpClientEvent,
4
+ JsonRpcHttpClientEventEmitter,
5
+ JsonRpcHttpClientMetrics,
6
+ ReqOpts,
7
+ } from "./jsonRpcHttpClient.js";
8
+ import {JwtClaim, encodeJwtToken} from "./jwt.js";
9
+ import {ExecutionForkName} from "./sszTypes.js";
10
+
11
+ export const ENGINE_REST_BASE_PATH = "/engine/v1";
12
+ export const EXECUTION_VERSION_HEADER = "Eth-Execution-Version";
13
+ export const CLIENT_VERSION_HEADER = "X-Engine-Client-Version";
14
+ export const MEDIA_TYPE_SSZ = "application/octet-stream";
15
+ export const MEDIA_TYPE_JSON = "application/json";
16
+
17
+ const REQUEST_TIMEOUT = 30 * 1000;
18
+ /** Limits the amount of error detail printed with REST errors */
19
+ const MAX_ERROR_DETAIL_LENGTH = 500;
20
+
21
+ export type EngineRestRequest = {
22
+ method: "GET" | "POST";
23
+ /** Path relative to the `/engine/v1` base path */
24
+ path: string;
25
+ query?: Record<string, string | number>;
26
+ /** Sets the `Eth-Execution-Version` header on fork-scoped endpoints */
27
+ executionFork?: ExecutionForkName;
28
+ /** SSZ encoded request body */
29
+ body?: Uint8Array;
30
+ responseType: "ssz" | "json";
31
+ };
32
+
33
+ export type EngineRestResponse = {
34
+ status: number;
35
+ /** Empty on `204 No Content` */
36
+ body: Uint8Array;
37
+ };
38
+
39
+ /** Non-2xx response, `type` and `detail` are taken from the problem+json body when present */
40
+ export class EngineRestError extends Error {
41
+ constructor(
42
+ readonly status: number,
43
+ readonly type: string | null,
44
+ readonly detail: string | null,
45
+ routeId: string
46
+ ) {
47
+ super(
48
+ `Engine REST error: status=${status} type=${type ?? "unknown"}${detail ? ` detail=${detail}` : ""}, ${routeId}`
49
+ );
50
+ }
51
+ }
52
+
53
+ export class EngineRestResponseError extends LodestarError<{
54
+ code: "ENGINE_REST_INVALID_RESPONSE";
55
+ routeId: string;
56
+ reason: string;
57
+ }> {
58
+ constructor(routeId: string, reason: string) {
59
+ super(
60
+ {code: "ENGINE_REST_INVALID_RESPONSE", routeId, reason},
61
+ `Invalid engine REST response: ${reason}, ${routeId}`
62
+ );
63
+ }
64
+ }
65
+
66
+ export type EngineRestHttpClientOpts = {
67
+ signal?: AbortSignal;
68
+ timeout?: number;
69
+ retries?: number;
70
+ retryDelay?: number;
71
+ /** HS256 secret, a fresh token is generated for every request as ELs check `iat` freshness */
72
+ jwtSecret?: Uint8Array;
73
+ /** Included as `id` claim if `jwtSecret` is provided */
74
+ jwtId?: string;
75
+ /** Value of the `X-Engine-Client-Version` header, the `clv` JWT claim is removed in the REST API */
76
+ clientVersion?: string;
77
+ metrics?: JsonRpcHttpClientMetrics | null;
78
+ };
79
+
80
+ /**
81
+ * HTTP/1.1 client for the REST engine API. Only transport concerns live here, encoding of
82
+ * request and response bodies is up to the caller.
83
+ */
84
+ export class EngineRestHttpClient {
85
+ readonly emitter = new JsonRpcHttpClientEventEmitter();
86
+ private readonly metrics: JsonRpcHttpClientMetrics | null;
87
+
88
+ constructor(
89
+ private readonly urls: string[],
90
+ private readonly opts: EngineRestHttpClientOpts = {}
91
+ ) {
92
+ if (urls.length === 0) {
93
+ throw Error("No urls provided to EngineRestHttpClient");
94
+ }
95
+ for (const [i, url] of urls.entries()) {
96
+ if (!isValidHttpUrl(url)) {
97
+ throw Error(`EngineRestHttpClient.urls[${i}] must be a valid URL: ${url}`);
98
+ }
99
+ }
100
+ this.metrics = opts.metrics ?? null;
101
+ }
102
+
103
+ /** Perform request with retries, emitting response and error events consumed by the engine state tracking */
104
+ async request(req: EngineRestRequest, opts?: ReqOpts): Promise<EngineRestResponse> {
105
+ try {
106
+ const response = await this.requestWithRetries(req, opts);
107
+ this.emitter.emit(JsonRpcHttpClientEvent.RESPONSE, {payload: req, response});
108
+ return response;
109
+ } catch (error) {
110
+ this.emitter.emit(JsonRpcHttpClientEvent.ERROR, {payload: req, error: error as Error});
111
+ throw error;
112
+ }
113
+ }
114
+
115
+ /** Perform request with retries without emitting events, used to probe support for the REST API */
116
+ async requestWithRetries(req: EngineRestRequest, opts?: ReqOpts): Promise<EngineRestResponse> {
117
+ const routeId = opts?.routeId ?? "unknown";
118
+ return retry(() => this.requestAnyUrl(req, opts), {
119
+ retries: opts?.retries ?? this.opts.retries ?? 0,
120
+ retryDelay: opts?.retryDelay ?? this.opts.retryDelay,
121
+ shouldRetry: opts?.shouldRetry ?? isRetryableEngineRestError,
122
+ signal: this.opts.signal,
123
+ onRetry: () => {
124
+ this.metrics?.retryCount.inc({routeId});
125
+ },
126
+ });
127
+ }
128
+
129
+ private async requestAnyUrl(req: EngineRestRequest, opts?: ReqOpts): Promise<EngineRestResponse> {
130
+ const routeId = opts?.routeId ?? "unknown";
131
+ let lastError: Error | null = null;
132
+
133
+ for (let i = 0; i < this.urls.length; i++) {
134
+ if (i > 0) {
135
+ this.metrics?.requestUsedFallbackUrl.inc({routeId});
136
+ }
137
+
138
+ try {
139
+ return await this.requestOneUrl(this.urls[i], req, opts);
140
+ } catch (e) {
141
+ if (!isRetryableEngineRestError(e as Error)) {
142
+ throw e;
143
+ }
144
+ lastError = e as Error;
145
+ }
146
+ }
147
+ throw lastError ?? Error("Unknown error");
148
+ }
149
+
150
+ private async requestOneUrl(baseUrl: string, req: EngineRestRequest, opts?: ReqOpts): Promise<EngineRestResponse> {
151
+ const controller = new AbortController();
152
+ const timeout = setTimeout(() => controller.abort(), opts?.timeout ?? this.opts.timeout ?? REQUEST_TIMEOUT);
153
+
154
+ // Not AbortSignal.any(), Node retains every composite until the long-lived parent signal aborts
155
+ const onParentSignalAbort = (): void => controller.abort();
156
+ this.opts.signal?.addEventListener("abort", onParentSignalAbort, {once: true});
157
+ if (this.opts.signal?.aborted) {
158
+ controller.abort();
159
+ }
160
+
161
+ const routeId = opts?.routeId ?? "unknown";
162
+ const timer = this.metrics?.requestTime.startTimer({routeId});
163
+ this.metrics?.activeRequests.inc({routeId}, 1);
164
+
165
+ try {
166
+ const url = new URL(`${ENGINE_REST_BASE_PATH}${req.path}`, baseUrl);
167
+ for (const [key, value] of Object.entries(req.query ?? {})) {
168
+ url.searchParams.set(key, String(value));
169
+ }
170
+
171
+ const headers: Record<string, string> = {
172
+ Accept: req.responseType === "ssz" ? MEDIA_TYPE_SSZ : MEDIA_TYPE_JSON,
173
+ };
174
+ if (req.body !== undefined) {
175
+ headers["Content-Type"] = MEDIA_TYPE_SSZ;
176
+ }
177
+ if (req.executionFork !== undefined) {
178
+ headers[EXECUTION_VERSION_HEADER] = req.executionFork;
179
+ }
180
+ if (this.opts.clientVersion !== undefined) {
181
+ headers[CLIENT_VERSION_HEADER] = this.opts.clientVersion;
182
+ }
183
+ if (this.opts.jwtSecret) {
184
+ const jwtClaim: JwtClaim = {iat: Math.floor(Date.now() / 1000), id: this.opts.jwtId};
185
+ headers.Authorization = `Bearer ${encodeJwtToken(jwtClaim, this.opts.jwtSecret)}`;
186
+ }
187
+
188
+ this.metrics?.requestBytes.inc({routeId}, req.body?.length ?? 0);
189
+
190
+ const res = await fetch(url, {
191
+ method: req.method,
192
+ body: req.body as BodyInit | undefined,
193
+ headers,
194
+ signal: controller.signal,
195
+ });
196
+
197
+ const streamTimer = this.metrics?.streamTime.startTimer({routeId});
198
+ let body: Uint8Array;
199
+ try {
200
+ body = new Uint8Array(await res.arrayBuffer());
201
+ } catch (e) {
202
+ throw new FetchError(url, e);
203
+ } finally {
204
+ streamTimer?.();
205
+ }
206
+ this.metrics?.responseBytes.inc({routeId}, body.length);
207
+
208
+ if (!res.ok) {
209
+ const {type, detail} = parseProblemBody(body);
210
+ throw new EngineRestError(res.status, type, detail, routeId);
211
+ }
212
+
213
+ if (res.status !== 200 && res.status !== 204) {
214
+ throw new EngineRestResponseError(routeId, `Unexpected status ${res.status}`);
215
+ }
216
+ const contentType = res.headers.get("content-type")?.split(";", 1)[0].trim().toLowerCase();
217
+ const expectedContentType = req.responseType === "ssz" ? MEDIA_TYPE_SSZ : MEDIA_TYPE_JSON;
218
+ if (res.status !== 204 && contentType !== expectedContentType) {
219
+ throw new EngineRestResponseError(routeId, `Unexpected content type ${contentType}`);
220
+ }
221
+
222
+ return {status: res.status, body};
223
+ } catch (e) {
224
+ this.metrics?.requestErrors.inc({routeId});
225
+ if (controller.signal.aborted) {
226
+ if (this.opts.signal?.aborted) {
227
+ throw new ErrorAborted("request");
228
+ }
229
+ throw new TimeoutError("request");
230
+ }
231
+ throw e;
232
+ } finally {
233
+ timer?.();
234
+ this.metrics?.activeRequests.dec({routeId}, 1);
235
+
236
+ clearTimeout(timeout);
237
+ this.opts.signal?.removeEventListener("abort", onParentSignalAbort);
238
+ }
239
+ }
240
+ }
241
+
242
+ /** Client errors are deterministic apart from timeouts and rate limits, transport failures and server errors are retried */
243
+ export function isRetryableEngineRestError(e: Error): boolean {
244
+ return (
245
+ (e instanceof EngineRestError && (e.status >= 500 || e.status === 408 || e.status === 429)) ||
246
+ e instanceof TimeoutError ||
247
+ (e instanceof FetchError && e.type !== "input" && e.type !== "aborted")
248
+ );
249
+ }
250
+
251
+ function parseProblemBody(body: Uint8Array): {type: string | null; detail: string | null} {
252
+ const text = new TextDecoder().decode(body);
253
+ try {
254
+ const problem: unknown = JSON.parse(text);
255
+ if (typeof problem === "object" && problem !== null) {
256
+ return {
257
+ type: "type" in problem && typeof problem.type === "string" ? problem.type : null,
258
+ detail:
259
+ ("detail" in problem && typeof problem.detail === "string" ? problem.detail : text).slice(
260
+ 0,
261
+ MAX_ERROR_DETAIL_LENGTH
262
+ ) || null,
263
+ };
264
+ }
265
+ } catch {
266
+ // Legacy endpoints and proxies may return plain text instead of a problem document.
267
+ }
268
+ return {type: null, detail: text.slice(0, MAX_ERROR_DETAIL_LENGTH) || null};
269
+ }