@lodestar/beacon-node 1.51.0-dev.ec1447da07 → 1.51.0-dev.ee7f143944

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 (539) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +36 -88
  3. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  4. package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
  5. package/lib/api/impl/beacon/pool/index.js +22 -2
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/utils.d.ts +1 -1
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  9. package/lib/api/impl/validator/index.d.ts +6 -0
  10. package/lib/api/impl/validator/index.d.ts.map +1 -1
  11. package/lib/api/impl/validator/index.js +42 -26
  12. package/lib/api/impl/validator/index.js.map +1 -1
  13. package/lib/chain/GetBlobsTracker.d.ts +13 -2
  14. package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
  15. package/lib/chain/GetBlobsTracker.js +69 -35
  16. package/lib/chain/GetBlobsTracker.js.map +1 -1
  17. package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
  18. package/lib/chain/archiveStore/archiveStore.js +1 -0
  19. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  20. package/lib/chain/blocks/blockInput/blockInput.d.ts +11 -56
  21. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  22. package/lib/chain/blocks/blockInput/blockInput.js +5 -241
  23. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  24. package/lib/chain/blocks/blockInput/errors.d.ts +2 -4
  25. package/lib/chain/blocks/blockInput/errors.d.ts.map +1 -1
  26. package/lib/chain/blocks/blockInput/errors.js.map +1 -1
  27. package/lib/chain/blocks/blockInput/types.d.ts +2 -18
  28. package/lib/chain/blocks/blockInput/types.d.ts.map +1 -1
  29. package/lib/chain/blocks/blockInput/types.js +0 -1
  30. package/lib/chain/blocks/blockInput/types.js.map +1 -1
  31. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  32. package/lib/chain/blocks/importBlock.js +36 -53
  33. package/lib/chain/blocks/importBlock.js.map +1 -1
  34. package/lib/chain/blocks/importExecutionPayload.d.ts +10 -11
  35. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  36. package/lib/chain/blocks/importExecutionPayload.js +32 -18
  37. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  38. package/lib/chain/blocks/index.d.ts.map +1 -1
  39. package/lib/chain/blocks/index.js +4 -4
  40. package/lib/chain/blocks/index.js.map +1 -1
  41. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +12 -9
  42. package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
  43. package/lib/chain/blocks/payloadEnvelopeProcessor.js +24 -19
  44. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  45. package/lib/chain/blocks/types.d.ts +4 -20
  46. package/lib/chain/blocks/types.d.ts.map +1 -1
  47. package/lib/chain/blocks/types.js +0 -24
  48. package/lib/chain/blocks/types.js.map +1 -1
  49. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  50. package/lib/chain/blocks/verifyBlock.js +18 -7
  51. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  52. package/lib/chain/blocks/verifyBlocksDataAvailability.d.ts.map +1 -1
  53. package/lib/chain/blocks/verifyBlocksDataAvailability.js +14 -2
  54. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  55. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +1 -1
  56. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  57. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +7 -3
  58. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  59. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  60. package/lib/chain/blocks/verifyBlocksSanityChecks.js +4 -0
  61. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  62. package/lib/chain/blocks/verifyBlocksSignatures.d.ts.map +1 -1
  63. package/lib/chain/blocks/verifyBlocksSignatures.js +10 -5
  64. package/lib/chain/blocks/verifyBlocksSignatures.js.map +1 -1
  65. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts +3 -3
  66. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  67. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +11 -6
  68. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  69. package/lib/chain/blocks/writeBlockInputToDb.d.ts +0 -2
  70. package/lib/chain/blocks/writeBlockInputToDb.d.ts.map +1 -1
  71. package/lib/chain/blocks/writeBlockInputToDb.js +6 -24
  72. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  73. package/lib/chain/bls/interface.d.ts +2 -0
  74. package/lib/chain/bls/interface.d.ts.map +1 -1
  75. package/lib/chain/bls/multithread/index.d.ts +1 -1
  76. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  77. package/lib/chain/bls/multithread/index.js +50 -22
  78. package/lib/chain/bls/multithread/index.js.map +1 -1
  79. package/lib/chain/bls/multithread/types.d.ts +1 -1
  80. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  81. package/lib/chain/bls/multithread/worker.js +1 -1
  82. package/lib/chain/bls/multithread/worker.js.map +1 -1
  83. package/lib/chain/bls/singleThread.js +1 -1
  84. package/lib/chain/bls/singleThread.js.map +1 -1
  85. package/lib/chain/bls/utils.js +1 -1
  86. package/lib/chain/bls/utils.js.map +1 -1
  87. package/lib/chain/chain.d.ts +25 -4
  88. package/lib/chain/chain.d.ts.map +1 -1
  89. package/lib/chain/chain.js +120 -39
  90. package/lib/chain/chain.js.map +1 -1
  91. package/lib/chain/emitter.d.ts +7 -7
  92. package/lib/chain/emitter.d.ts.map +1 -1
  93. package/lib/chain/emitter.js +5 -5
  94. package/lib/chain/emitter.js.map +1 -1
  95. package/lib/chain/errors/blockError.d.ts +1 -1
  96. package/lib/chain/errors/blockError.d.ts.map +1 -1
  97. package/lib/chain/errors/blockError.js +1 -1
  98. package/lib/chain/errors/blockError.js.map +1 -1
  99. package/lib/chain/errors/executionPayloadEnvelope.d.ts +7 -0
  100. package/lib/chain/errors/executionPayloadEnvelope.d.ts.map +1 -1
  101. package/lib/chain/errors/executionPayloadEnvelope.js +1 -0
  102. package/lib/chain/errors/executionPayloadEnvelope.js.map +1 -1
  103. package/lib/chain/errors/index.d.ts +0 -1
  104. package/lib/chain/errors/index.d.ts.map +1 -1
  105. package/lib/chain/errors/index.js +0 -1
  106. package/lib/chain/errors/index.js.map +1 -1
  107. package/lib/chain/forkChoice/index.d.ts +11 -1
  108. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  109. package/lib/chain/forkChoice/index.js +11 -0
  110. package/lib/chain/forkChoice/index.js.map +1 -1
  111. package/lib/chain/forkChoiceExecutionEngine.d.ts +51 -0
  112. package/lib/chain/forkChoiceExecutionEngine.d.ts.map +1 -0
  113. package/lib/chain/forkChoiceExecutionEngine.js +117 -0
  114. package/lib/chain/forkChoiceExecutionEngine.js.map +1 -0
  115. package/lib/chain/interface.d.ts +9 -7
  116. package/lib/chain/interface.d.ts.map +1 -1
  117. package/lib/chain/interface.js.map +1 -1
  118. package/lib/chain/opPools/aggregatedAttestationPool.d.ts +17 -4
  119. package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
  120. package/lib/chain/opPools/aggregatedAttestationPool.js +199 -46
  121. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  122. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  123. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  124. package/lib/chain/opPools/attestationPool.js +15 -4
  125. package/lib/chain/opPools/attestationPool.js.map +1 -1
  126. package/lib/chain/opPools/index.d.ts +1 -0
  127. package/lib/chain/opPools/index.d.ts.map +1 -1
  128. package/lib/chain/opPools/index.js +1 -0
  129. package/lib/chain/opPools/index.js.map +1 -1
  130. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  131. package/lib/chain/opPools/payloadAttestationPool.js +17 -7
  132. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  133. package/lib/chain/opPools/singleAttestationPool.d.ts +77 -0
  134. package/lib/chain/opPools/singleAttestationPool.d.ts.map +1 -0
  135. package/lib/chain/opPools/singleAttestationPool.js +209 -0
  136. package/lib/chain/opPools/singleAttestationPool.js.map +1 -0
  137. package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
  138. package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
  139. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  140. package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
  141. package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
  142. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  143. package/lib/chain/opPools/utils.d.ts +1 -1
  144. package/lib/chain/opPools/utils.d.ts.map +1 -1
  145. package/lib/chain/opPools/utils.js +1 -1
  146. package/lib/chain/opPools/utils.js.map +1 -1
  147. package/lib/chain/options.d.ts +5 -3
  148. package/lib/chain/options.d.ts.map +1 -1
  149. package/lib/chain/options.js +0 -1
  150. package/lib/chain/options.js.map +1 -1
  151. package/lib/chain/produceBlock/produceBlockBody.d.ts +3 -2
  152. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  153. package/lib/chain/produceBlock/produceBlockBody.js +3 -2
  154. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  155. package/lib/chain/proposerTracker.d.ts +31 -0
  156. package/lib/chain/proposerTracker.d.ts.map +1 -0
  157. package/lib/chain/proposerTracker.js +75 -0
  158. package/lib/chain/proposerTracker.js.map +1 -0
  159. package/lib/chain/regen/interface.d.ts +1 -1
  160. package/lib/chain/regen/interface.d.ts.map +1 -1
  161. package/lib/chain/regen/queued.d.ts +1 -1
  162. package/lib/chain/regen/queued.d.ts.map +1 -1
  163. package/lib/chain/regen/queued.js +5 -3
  164. package/lib/chain/regen/queued.js.map +1 -1
  165. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +7 -14
  166. package/lib/chain/seenCache/seenGossipBlockInput.d.ts.map +1 -1
  167. package/lib/chain/seenCache/seenGossipBlockInput.js +6 -65
  168. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  169. package/lib/chain/validation/executionPayloadBid.js +13 -13
  170. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  171. package/lib/chain/validation/executionPayloadEnvelope.d.ts +6 -0
  172. package/lib/chain/validation/executionPayloadEnvelope.d.ts.map +1 -1
  173. package/lib/chain/validation/executionPayloadEnvelope.js +53 -0
  174. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  175. package/lib/chain/validation/syncCommittee.d.ts.map +1 -1
  176. package/lib/chain/validation/syncCommittee.js +16 -10
  177. package/lib/chain/validation/syncCommittee.js.map +1 -1
  178. package/lib/chain/validation/syncCommitteeContributionAndProof.d.ts.map +1 -1
  179. package/lib/chain/validation/syncCommitteeContributionAndProof.js +11 -0
  180. package/lib/chain/validation/syncCommitteeContributionAndProof.js.map +1 -1
  181. package/lib/chain/validatorMonitor.d.ts +1 -2
  182. package/lib/chain/validatorMonitor.d.ts.map +1 -1
  183. package/lib/chain/validatorMonitor.js +0 -3
  184. package/lib/chain/validatorMonitor.js.map +1 -1
  185. package/lib/db/flatFileStore/flatFileStore.js +5 -5
  186. package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
  187. package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
  188. package/lib/db/flatFileStore/slotIndex.js +2 -2
  189. package/lib/db/flatFileStore/slotIndex.js.map +1 -1
  190. package/lib/db/repositories/blobSidecars.d.ts +0 -1
  191. package/lib/db/repositories/blobSidecars.d.ts.map +1 -1
  192. package/lib/db/repositories/blobSidecars.js +0 -1
  193. package/lib/db/repositories/blobSidecars.js.map +1 -1
  194. package/lib/execution/builder/apiClient.d.ts +14 -8
  195. package/lib/execution/builder/apiClient.d.ts.map +1 -1
  196. package/lib/execution/builder/apiClient.js +12 -10
  197. package/lib/execution/builder/apiClient.js.map +1 -1
  198. package/lib/execution/builder/http.d.ts +2 -0
  199. package/lib/execution/builder/http.d.ts.map +1 -1
  200. package/lib/execution/builder/http.js +2 -0
  201. package/lib/execution/builder/http.js.map +1 -1
  202. package/lib/execution/engine/http.d.ts +4 -6
  203. package/lib/execution/engine/http.d.ts.map +1 -1
  204. package/lib/execution/engine/http.js +8 -10
  205. package/lib/execution/engine/http.js.map +1 -1
  206. package/lib/execution/engine/index.d.ts +1 -1
  207. package/lib/execution/engine/index.d.ts.map +1 -1
  208. package/lib/execution/engine/index.js +1 -1
  209. package/lib/execution/engine/index.js.map +1 -1
  210. package/lib/execution/engine/interface.d.ts +18 -6
  211. package/lib/execution/engine/interface.d.ts.map +1 -1
  212. package/lib/execution/engine/interface.js.map +1 -1
  213. package/lib/execution/engine/jsonRpcTransport.d.ts +2 -4
  214. package/lib/execution/engine/jsonRpcTransport.d.ts.map +1 -1
  215. package/lib/execution/engine/jsonRpcTransport.js +2 -12
  216. package/lib/execution/engine/jsonRpcTransport.js.map +1 -1
  217. package/lib/execution/engine/mock.d.ts +0 -1
  218. package/lib/execution/engine/mock.d.ts.map +1 -1
  219. package/lib/execution/engine/mock.js +0 -4
  220. package/lib/execution/engine/mock.js.map +1 -1
  221. package/lib/execution/engine/restTransport.d.ts +2 -4
  222. package/lib/execution/engine/restTransport.d.ts.map +1 -1
  223. package/lib/execution/engine/restTransport.js +1 -15
  224. package/lib/execution/engine/restTransport.js.map +1 -1
  225. package/lib/execution/engine/sszTypes.d.ts +0 -9
  226. package/lib/execution/engine/sszTypes.d.ts.map +1 -1
  227. package/lib/execution/engine/sszTypes.js +0 -5
  228. package/lib/execution/engine/sszTypes.js.map +1 -1
  229. package/lib/execution/engine/transport.d.ts +1 -14
  230. package/lib/execution/engine/transport.d.ts.map +1 -1
  231. package/lib/execution/engine/types.d.ts +0 -8
  232. package/lib/execution/engine/types.d.ts.map +1 -1
  233. package/lib/execution/engine/types.js +2 -10
  234. package/lib/execution/engine/types.js.map +1 -1
  235. package/lib/execution/engine/utils.d.ts.map +1 -1
  236. package/lib/execution/engine/utils.js +3 -2
  237. package/lib/execution/engine/utils.js.map +1 -1
  238. package/lib/index.d.ts +1 -1
  239. package/lib/index.d.ts.map +1 -1
  240. package/lib/index.js +1 -1
  241. package/lib/index.js.map +1 -1
  242. package/lib/metrics/metrics/beacon.d.ts +0 -9
  243. package/lib/metrics/metrics/beacon.d.ts.map +1 -1
  244. package/lib/metrics/metrics/beacon.js +0 -30
  245. package/lib/metrics/metrics/beacon.js.map +1 -1
  246. package/lib/metrics/metrics/lodestar.d.ts +30 -8
  247. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  248. package/lib/metrics/metrics/lodestar.js +79 -18
  249. package/lib/metrics/metrics/lodestar.js.map +1 -1
  250. package/lib/metrics/server/http.js +5 -5
  251. package/lib/metrics/server/http.js.map +1 -1
  252. package/lib/monitoring/service.js +1 -1
  253. package/lib/monitoring/service.js.map +1 -1
  254. package/lib/network/core/networkCore.d.ts +4 -1
  255. package/lib/network/core/networkCore.d.ts.map +1 -1
  256. package/lib/network/core/networkCore.js +7 -0
  257. package/lib/network/core/networkCore.js.map +1 -1
  258. package/lib/network/core/networkCoreWorker.js +2 -0
  259. package/lib/network/core/networkCoreWorker.js.map +1 -1
  260. package/lib/network/core/networkCoreWorkerHandler.d.ts +4 -1
  261. package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
  262. package/lib/network/core/networkCoreWorkerHandler.js +6 -0
  263. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  264. package/lib/network/core/types.d.ts +6 -1
  265. package/lib/network/core/types.d.ts.map +1 -1
  266. package/lib/network/gossip/gossipsub.d.ts +1 -0
  267. package/lib/network/gossip/gossipsub.d.ts.map +1 -1
  268. package/lib/network/gossip/gossipsub.js +10 -0
  269. package/lib/network/gossip/gossipsub.js.map +1 -1
  270. package/lib/network/gossip/interface.d.ts +1 -8
  271. package/lib/network/gossip/interface.d.ts.map +1 -1
  272. package/lib/network/gossip/interface.js +0 -1
  273. package/lib/network/gossip/interface.js.map +1 -1
  274. package/lib/network/gossip/topic.d.ts +0 -16
  275. package/lib/network/gossip/topic.d.ts.map +1 -1
  276. package/lib/network/gossip/topic.js +0 -23
  277. package/lib/network/gossip/topic.js.map +1 -1
  278. package/lib/network/interface.d.ts +4 -5
  279. package/lib/network/interface.d.ts.map +1 -1
  280. package/lib/network/libp2p/index.d.ts.map +1 -1
  281. package/lib/network/libp2p/index.js +5 -1
  282. package/lib/network/libp2p/index.js.map +1 -1
  283. package/lib/network/network.d.ts +8 -7
  284. package/lib/network/network.d.ts.map +1 -1
  285. package/lib/network/network.js +53 -35
  286. package/lib/network/network.js.map +1 -1
  287. package/lib/network/options.d.ts +2 -0
  288. package/lib/network/options.d.ts.map +1 -1
  289. package/lib/network/options.js +2 -0
  290. package/lib/network/options.js.map +1 -1
  291. package/lib/network/peers/peerManager.d.ts +2 -1
  292. package/lib/network/peers/peerManager.d.ts.map +1 -1
  293. package/lib/network/peers/peerManager.js +28 -1
  294. package/lib/network/peers/peerManager.js.map +1 -1
  295. package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
  296. package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
  297. package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
  298. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  299. package/lib/network/peers/utils/prioritizePeers.d.ts +4 -1
  300. package/lib/network/peers/utils/prioritizePeers.d.ts.map +1 -1
  301. package/lib/network/peers/utils/prioritizePeers.js +8 -16
  302. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  303. package/lib/network/peers/utils/subnetMap.d.ts +5 -2
  304. package/lib/network/peers/utils/subnetMap.d.ts.map +1 -1
  305. package/lib/network/peers/utils/subnetMap.js +6 -3
  306. package/lib/network/peers/utils/subnetMap.js.map +1 -1
  307. package/lib/network/processor/extractSlotRootFns.d.ts.map +1 -1
  308. package/lib/network/processor/extractSlotRootFns.js +1 -8
  309. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  310. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  311. package/lib/network/processor/gossipHandlers.js +52 -131
  312. package/lib/network/processor/gossipHandlers.js.map +1 -1
  313. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  314. package/lib/network/processor/gossipQueues/index.js +0 -6
  315. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  316. package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
  317. package/lib/network/processor/gossipValidatorFn.js +1 -5
  318. package/lib/network/processor/gossipValidatorFn.js.map +1 -1
  319. package/lib/network/processor/index.d.ts +6 -0
  320. package/lib/network/processor/index.d.ts.map +1 -1
  321. package/lib/network/processor/index.js +29 -4
  322. package/lib/network/processor/index.js.map +1 -1
  323. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  324. package/lib/network/reqresp/ReqRespBeaconNode.js +0 -3
  325. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  326. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +2 -2
  327. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  328. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  329. package/lib/network/reqresp/handlers/index.js +1 -12
  330. package/lib/network/reqresp/handlers/index.js.map +1 -1
  331. package/lib/network/reqresp/protocols.d.ts +0 -2
  332. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  333. package/lib/network/reqresp/protocols.js +0 -10
  334. package/lib/network/reqresp/protocols.js.map +1 -1
  335. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  336. package/lib/network/reqresp/rateLimit.js +1 -17
  337. package/lib/network/reqresp/rateLimit.js.map +1 -1
  338. package/lib/network/reqresp/types.d.ts +2 -8
  339. package/lib/network/reqresp/types.d.ts.map +1 -1
  340. package/lib/network/reqresp/types.js +1 -7
  341. package/lib/network/reqresp/types.js.map +1 -1
  342. package/lib/network/subnets/attnetsService.d.ts +35 -5
  343. package/lib/network/subnets/attnetsService.d.ts.map +1 -1
  344. package/lib/network/subnets/attnetsService.js +84 -6
  345. package/lib/network/subnets/attnetsService.js.map +1 -1
  346. package/lib/network/subnets/interface.d.ts +7 -0
  347. package/lib/network/subnets/interface.d.ts.map +1 -1
  348. package/lib/network/subnets/interface.js.map +1 -1
  349. package/lib/node/nodejs.d.ts +3 -1
  350. package/lib/node/nodejs.d.ts.map +1 -1
  351. package/lib/node/nodejs.js +38 -20
  352. package/lib/node/nodejs.js.map +1 -1
  353. package/lib/node/options.d.ts +3 -1
  354. package/lib/node/options.d.ts.map +1 -1
  355. package/lib/node/options.js +4 -2
  356. package/lib/node/options.js.map +1 -1
  357. package/lib/sync/interface.d.ts.map +1 -1
  358. package/lib/sync/interface.js.map +1 -1
  359. package/lib/sync/range/batch.d.ts +2 -3
  360. package/lib/sync/range/batch.d.ts.map +1 -1
  361. package/lib/sync/range/batch.js +9 -22
  362. package/lib/sync/range/batch.js.map +1 -1
  363. package/lib/sync/range/chain.d.ts.map +1 -1
  364. package/lib/sync/range/chain.js +2 -15
  365. package/lib/sync/range/chain.js.map +1 -1
  366. package/lib/sync/sync.d.ts +15 -0
  367. package/lib/sync/sync.d.ts.map +1 -1
  368. package/lib/sync/sync.js +103 -25
  369. package/lib/sync/sync.js.map +1 -1
  370. package/lib/sync/unknownBlock.d.ts.map +1 -1
  371. package/lib/sync/unknownBlock.js +1 -7
  372. package/lib/sync/unknownBlock.js.map +1 -1
  373. package/lib/sync/utils/downloadByRange.d.ts +6 -34
  374. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  375. package/lib/sync/utils/downloadByRange.js +24 -128
  376. package/lib/sync/utils/downloadByRange.js.map +1 -1
  377. package/lib/sync/utils/downloadByRoot.d.ts +2 -18
  378. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  379. package/lib/sync/utils/downloadByRoot.js +14 -99
  380. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  381. package/lib/util/blobs.d.ts +1 -7
  382. package/lib/util/blobs.d.ts.map +1 -1
  383. package/lib/util/blobs.js +0 -19
  384. package/lib/util/blobs.js.map +1 -1
  385. package/lib/util/execution.d.ts +3 -4
  386. package/lib/util/execution.d.ts.map +1 -1
  387. package/lib/util/execution.js +1 -73
  388. package/lib/util/execution.js.map +1 -1
  389. package/lib/util/file.d.ts.map +1 -1
  390. package/lib/util/file.js +8 -9
  391. package/lib/util/file.js.map +1 -1
  392. package/lib/util/queue/itemQueue.js +1 -1
  393. package/lib/util/queue/itemQueue.js.map +1 -1
  394. package/lib/util/sszBytes.d.ts +5 -1
  395. package/lib/util/sszBytes.d.ts.map +1 -1
  396. package/lib/util/sszBytes.js +36 -19
  397. package/lib/util/sszBytes.js.map +1 -1
  398. package/lib/util/types.d.ts +0 -5
  399. package/lib/util/types.d.ts.map +1 -1
  400. package/lib/util/types.js +1 -2
  401. package/lib/util/types.js.map +1 -1
  402. package/package.json +16 -17
  403. package/src/api/impl/beacon/blocks/index.ts +59 -109
  404. package/src/api/impl/beacon/pool/index.ts +31 -1
  405. package/src/api/impl/beacon/state/utils.ts +1 -1
  406. package/src/api/impl/validator/index.ts +47 -30
  407. package/src/chain/GetBlobsTracker.ts +82 -52
  408. package/src/chain/archiveStore/archiveStore.ts +1 -0
  409. package/src/chain/blocks/blockInput/blockInput.ts +11 -343
  410. package/src/chain/blocks/blockInput/errors.ts +1 -2
  411. package/src/chain/blocks/blockInput/types.ts +2 -20
  412. package/src/chain/blocks/importBlock.ts +56 -72
  413. package/src/chain/blocks/importExecutionPayload.ts +55 -34
  414. package/src/chain/blocks/index.ts +11 -4
  415. package/src/chain/blocks/payloadEnvelopeProcessor.ts +35 -24
  416. package/src/chain/blocks/types.ts +5 -31
  417. package/src/chain/blocks/verifyBlock.ts +31 -16
  418. package/src/chain/blocks/verifyBlocksDataAvailability.ts +16 -2
  419. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +9 -6
  420. package/src/chain/blocks/verifyBlocksSanityChecks.ts +4 -1
  421. package/src/chain/blocks/verifyBlocksSignatures.ts +10 -5
  422. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +14 -6
  423. package/src/chain/blocks/writeBlockInputToDb.ts +6 -29
  424. package/src/chain/bls/interface.ts +2 -0
  425. package/src/chain/bls/multithread/index.ts +48 -24
  426. package/src/chain/bls/multithread/types.ts +1 -1
  427. package/src/chain/bls/multithread/worker.ts +1 -5
  428. package/src/chain/bls/singleThread.ts +1 -1
  429. package/src/chain/bls/utils.ts +1 -1
  430. package/src/chain/chain.ts +136 -38
  431. package/src/chain/emitter.ts +8 -8
  432. package/src/chain/errors/blockError.ts +1 -1
  433. package/src/chain/errors/executionPayloadEnvelope.ts +8 -0
  434. package/src/chain/errors/index.ts +0 -1
  435. package/src/chain/forkChoice/index.ts +11 -0
  436. package/src/chain/forkChoiceExecutionEngine.ts +183 -0
  437. package/src/chain/interface.ts +9 -6
  438. package/src/chain/opPools/aggregatedAttestationPool.ts +246 -43
  439. package/src/chain/opPools/attestationPool.ts +16 -4
  440. package/src/chain/opPools/index.ts +1 -0
  441. package/src/chain/opPools/payloadAttestationPool.ts +18 -7
  442. package/src/chain/opPools/singleAttestationPool.ts +287 -0
  443. package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
  444. package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
  445. package/src/chain/opPools/utils.ts +1 -1
  446. package/src/chain/options.ts +5 -4
  447. package/src/chain/produceBlock/produceBlockBody.ts +7 -3
  448. package/src/chain/proposerTracker.ts +94 -0
  449. package/src/chain/regen/interface.ts +1 -1
  450. package/src/chain/regen/queued.ts +6 -4
  451. package/src/chain/seenCache/seenGossipBlockInput.ts +9 -93
  452. package/src/chain/validation/executionPayloadBid.ts +14 -13
  453. package/src/chain/validation/executionPayloadEnvelope.ts +68 -1
  454. package/src/chain/validation/syncCommittee.ts +31 -15
  455. package/src/chain/validation/syncCommitteeContributionAndProof.ts +13 -0
  456. package/src/chain/validatorMonitor.ts +0 -6
  457. package/src/db/flatFileStore/flatFileStore.ts +7 -7
  458. package/src/db/flatFileStore/slotIndex.ts +4 -3
  459. package/src/db/repositories/blobSidecars.ts +0 -1
  460. package/src/execution/builder/apiClient.ts +16 -13
  461. package/src/execution/builder/http.ts +4 -0
  462. package/src/execution/engine/http.ts +19 -42
  463. package/src/execution/engine/index.ts +1 -1
  464. package/src/execution/engine/interface.ts +19 -10
  465. package/src/execution/engine/jsonRpcTransport.ts +10 -22
  466. package/src/execution/engine/mock.ts +0 -7
  467. package/src/execution/engine/restTransport.ts +3 -22
  468. package/src/execution/engine/sszTypes.ts +0 -9
  469. package/src/execution/engine/transport.ts +8 -17
  470. package/src/execution/engine/types.ts +3 -18
  471. package/src/execution/engine/utils.ts +4 -2
  472. package/src/index.ts +1 -1
  473. package/src/metrics/metrics/beacon.ts +0 -30
  474. package/src/metrics/metrics/lodestar.ts +80 -18
  475. package/src/metrics/server/http.ts +5 -5
  476. package/src/monitoring/service.ts +1 -1
  477. package/src/network/core/networkCore.ts +11 -1
  478. package/src/network/core/networkCoreWorker.ts +2 -0
  479. package/src/network/core/networkCoreWorkerHandler.ts +8 -1
  480. package/src/network/core/types.ts +6 -1
  481. package/src/network/gossip/gossipsub.ts +11 -0
  482. package/src/network/gossip/interface.ts +0 -5
  483. package/src/network/gossip/topic.ts +0 -25
  484. package/src/network/interface.ts +2 -5
  485. package/src/network/libp2p/index.ts +5 -1
  486. package/src/network/network.ts +55 -58
  487. package/src/network/options.ts +4 -0
  488. package/src/network/peers/peerManager.ts +28 -3
  489. package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
  490. package/src/network/peers/utils/prioritizePeers.ts +14 -22
  491. package/src/network/peers/utils/subnetMap.ts +6 -3
  492. package/src/network/processor/extractSlotRootFns.ts +0 -9
  493. package/src/network/processor/gossipHandlers.ts +65 -164
  494. package/src/network/processor/gossipQueues/index.ts +0 -6
  495. package/src/network/processor/gossipValidatorFn.ts +0 -5
  496. package/src/network/processor/index.ts +25 -4
  497. package/src/network/reqresp/ReqRespBeaconNode.ts +0 -7
  498. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +2 -2
  499. package/src/network/reqresp/handlers/index.ts +0 -17
  500. package/src/network/reqresp/protocols.ts +0 -12
  501. package/src/network/reqresp/rateLimit.ts +1 -17
  502. package/src/network/reqresp/types.ts +0 -13
  503. package/src/network/subnets/attnetsService.ts +94 -6
  504. package/src/network/subnets/interface.ts +7 -0
  505. package/src/node/nodejs.ts +40 -21
  506. package/src/node/options.ts +9 -6
  507. package/src/sync/interface.ts +1 -0
  508. package/src/sync/range/batch.ts +9 -21
  509. package/src/sync/range/chain.ts +2 -14
  510. package/src/sync/sync.ts +108 -26
  511. package/src/sync/unknownBlock.ts +1 -8
  512. package/src/sync/utils/downloadByRange.ts +31 -230
  513. package/src/sync/utils/downloadByRoot.ts +15 -142
  514. package/src/util/blobs.ts +0 -34
  515. package/src/util/execution.ts +8 -102
  516. package/src/util/file.ts +8 -9
  517. package/src/util/queue/itemQueue.ts +1 -1
  518. package/src/util/sszBytes.ts +42 -24
  519. package/src/util/types.ts +1 -8
  520. package/lib/chain/errors/blobSidecarError.d.ts +0 -108
  521. package/lib/chain/errors/blobSidecarError.d.ts.map +0 -1
  522. package/lib/chain/errors/blobSidecarError.js +0 -38
  523. package/lib/chain/errors/blobSidecarError.js.map +0 -1
  524. package/lib/chain/validation/blobSidecar.d.ts +0 -16
  525. package/lib/chain/validation/blobSidecar.d.ts.map +0 -1
  526. package/lib/chain/validation/blobSidecar.js +0 -276
  527. package/lib/chain/validation/blobSidecar.js.map +0 -1
  528. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +0 -9
  529. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +0 -1
  530. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +0 -91
  531. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +0 -1
  532. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts +0 -5
  533. package/lib/network/reqresp/handlers/blobSidecarsByRoot.d.ts.map +0 -1
  534. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js +0 -46
  535. package/lib/network/reqresp/handlers/blobSidecarsByRoot.js.map +0 -1
  536. package/src/chain/errors/blobSidecarError.ts +0 -70
  537. package/src/chain/validation/blobSidecar.ts +0 -357
  538. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +0 -133
  539. package/src/network/reqresp/handlers/blobSidecarsByRoot.ts +0 -69
@@ -1,15 +1,12 @@
1
- import {ForkName, ForkPostFulu, ForkPostGloas, ForkPreDeneb, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
2
- import {BeaconBlockBody, BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu, gloas} from "@lodestar/types";
3
- import {byteArrayEquals, fromHex, prettyBytes, toRootHex, withTimeout} from "@lodestar/utils";
1
+ import {ForkName, ForkPostFulu, ForkPostGloas, ForkPreFulu, ForkPreGloas, NUMBER_OF_COLUMNS} from "@lodestar/params";
2
+ import {BeaconBlockBody, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu, gloas} from "@lodestar/types";
3
+ import {prettyBytes, toRootHex, withTimeout} from "@lodestar/utils";
4
4
  import {VersionedHashes} from "../../../execution/index.js";
5
5
  import {kzgCommitmentToVersionedHash} from "../../../util/blobs.js";
6
6
  import {BlockInputError, BlockInputErrorCode} from "./errors.js";
7
7
  import {
8
- AddBlob,
9
8
  AddBlock,
10
9
  AddColumn,
11
- BlobMeta,
12
- BlobWithSource,
13
10
  BlockInputInit,
14
11
  ColumnWithSource,
15
12
  CreateBlockInputMeta,
@@ -17,22 +14,17 @@ import {
17
14
  DAType,
18
15
  IBlockInput,
19
16
  LogMetaBasic,
20
- LogMetaBlobs,
21
17
  LogMetaColumns,
22
18
  MissingColumnMeta,
23
19
  PromiseParts,
24
20
  SourceMeta,
25
21
  } from "./types.js";
26
22
 
27
- export type BlockInput = BlockInputPreData | BlockInputBlobs | BlockInputColumns | BlockInputNoData;
23
+ export type BlockInput = BlockInputPreData | BlockInputColumns | BlockInputNoData;
28
24
 
29
- export function isBlockInputPreDeneb(blockInput: IBlockInput): blockInput is BlockInputPreData {
25
+ export function isBlockInputPreData(blockInput: IBlockInput): blockInput is BlockInputPreData {
30
26
  return blockInput.type === DAType.PreData;
31
27
  }
32
- export function isBlockInputBlobs(blockInput: IBlockInput): blockInput is BlockInputBlobs {
33
- return blockInput.type === DAType.Blobs;
34
- }
35
-
36
28
  export function isBlockInputColumns(blockInput: IBlockInput): blockInput is BlockInputColumns {
37
29
  return blockInput.type === DAType.Columns;
38
30
  }
@@ -189,16 +181,18 @@ abstract class AbstractBlockInput<F extends ForkName = ForkName, TData extends D
189
181
  type BlockInputPreDataState = {
190
182
  hasBlock: true;
191
183
  hasAllData: true;
192
- block: SignedBeaconBlock<ForkPreDeneb>;
184
+ block: SignedBeaconBlock<ForkPreFulu>;
193
185
  source: SourceMeta;
194
186
  timeCompleteSec: number;
195
187
  };
196
188
 
197
189
  /**
198
- * Pre-DA, BlockInput only has a single state.
190
+ * Pre-fulu BlockInput, it only has a single state.
199
191
  * - the block simply exists
192
+ *
193
+ * Legacy deneb..electra blob sidecars are not tracked.
200
194
  */
201
- export class BlockInputPreData extends AbstractBlockInput<ForkPreDeneb, null> {
195
+ export class BlockInputPreData extends AbstractBlockInput<ForkPreFulu, null> {
202
196
  type = DAType.PreData as const;
203
197
 
204
198
  state: BlockInputPreDataState;
@@ -210,7 +204,7 @@ export class BlockInputPreData extends AbstractBlockInput<ForkPreDeneb, null> {
210
204
  this.blockPromise.resolve(state.block);
211
205
  }
212
206
 
213
- static createFromBlock(props: AddBlock<ForkPreDeneb> & CreateBlockInputMeta): BlockInputPreData {
207
+ static createFromBlock(props: AddBlock<ForkPreFulu> & CreateBlockInputMeta): BlockInputPreData {
214
208
  const init: BlockInputInit = {
215
209
  daOutOfRange: props.daOutOfRange,
216
210
  timeCreated: props.seenTimestampSec,
@@ -250,332 +244,6 @@ export class BlockInputPreData extends AbstractBlockInput<ForkPreDeneb, null> {
250
244
  }
251
245
  }
252
246
 
253
- // Blobs DA
254
-
255
- export type ForkBlobsDA = ForkName.deneb | ForkName.electra;
256
-
257
- type BlockInputBlobsState =
258
- | {
259
- hasBlock: true;
260
- hasAllData: true;
261
- versionedHashes: VersionedHashes;
262
- block: SignedBeaconBlock<ForkBlobsDA>;
263
- source: SourceMeta;
264
- timeCompleteSec: number;
265
- }
266
- | {
267
- hasBlock: true;
268
- hasAllData: false;
269
- versionedHashes: VersionedHashes;
270
- block: SignedBeaconBlock<ForkBlobsDA>;
271
- source: SourceMeta;
272
- }
273
- | {
274
- hasBlock: false;
275
- hasAllData: false;
276
- };
277
-
278
- /**
279
- * With blobs, BlockInput has several states:
280
- * - The block is seen and all blobs are seen
281
- * - The block is seen and all blobs are not yet seen
282
- * - The block is yet not seen and its unknown if all blobs are seen
283
- */
284
- export class BlockInputBlobs extends AbstractBlockInput<ForkBlobsDA, deneb.BlobSidecars> {
285
- type = DAType.Blobs as const;
286
-
287
- state: BlockInputBlobsState;
288
- private blobsCache = new Map<BlobIndex, BlobWithSource>();
289
-
290
- private constructor(init: BlockInputInit, state: BlockInputBlobsState) {
291
- super(init);
292
- this.state = state;
293
- }
294
-
295
- static createFromBlock(props: AddBlock<ForkBlobsDA> & CreateBlockInputMeta): BlockInputBlobs {
296
- const hasAllData = props.daOutOfRange || props.block.message.body.blobKzgCommitments.length === 0;
297
-
298
- const state = {
299
- hasBlock: true,
300
- hasAllData,
301
- versionedHashes: props.block.message.body.blobKzgCommitments.map(kzgCommitmentToVersionedHash),
302
- block: props.block,
303
- source: {
304
- source: props.source,
305
- seenTimestampSec: props.seenTimestampSec,
306
- peerIdStr: props.peerIdStr,
307
- },
308
- timeCompleteSec: hasAllData ? props.seenTimestampSec : undefined,
309
- } as BlockInputBlobsState;
310
- const init: BlockInputInit = {
311
- daOutOfRange: props.daOutOfRange,
312
- timeCreated: props.seenTimestampSec,
313
- forkName: props.forkName,
314
- slot: props.block.message.slot,
315
- blockRootHex: props.blockRootHex,
316
- parentRootHex: toRootHex(props.block.message.parentRoot),
317
- };
318
- const blockInput = new BlockInputBlobs(init, state);
319
- blockInput.blockPromise.resolve(props.block);
320
- if (hasAllData) {
321
- blockInput.dataPromise.resolve([]);
322
- }
323
- return blockInput;
324
- }
325
-
326
- static createFromBlob(props: AddBlob & CreateBlockInputMeta): BlockInputBlobs {
327
- const state: BlockInputBlobsState = {
328
- hasBlock: false,
329
- hasAllData: false,
330
- };
331
- const init: BlockInputInit = {
332
- daOutOfRange: props.daOutOfRange,
333
- timeCreated: props.seenTimestampSec,
334
- forkName: props.forkName,
335
- blockRootHex: props.blockRootHex,
336
- parentRootHex: toRootHex(props.blobSidecar.signedBlockHeader.message.parentRoot),
337
- slot: props.blobSidecar.signedBlockHeader.message.slot,
338
- };
339
- const blockInput = new BlockInputBlobs(init, state);
340
- blockInput.blobsCache.set(props.blobSidecar.index, {
341
- blobSidecar: props.blobSidecar,
342
- source: props.source,
343
- seenTimestampSec: props.seenTimestampSec,
344
- peerIdStr: props.peerIdStr,
345
- });
346
- return blockInput;
347
- }
348
-
349
- getLogMeta(): LogMetaBlobs {
350
- return {
351
- slot: this.slot,
352
- blockRoot: prettyBytes(this.blockRootHex),
353
- timeCreatedSec: this.timeCreatedSec,
354
- expectedBlobs: this.state.hasBlock ? this.state.block.message.body.blobKzgCommitments.length : "unknown",
355
- receivedBlobs: this.blobsCache.size,
356
- };
357
- }
358
-
359
- addBlock(
360
- {blockRootHex, block, source, seenTimestampSec, peerIdStr}: AddBlock<ForkBlobsDA>,
361
- opts = {throwOnDuplicateAdd: true}
362
- ): void {
363
- // this check suffices for checking slot, parentRoot, and forkName
364
- if (blockRootHex !== this.blockRootHex) {
365
- throw new BlockInputError(
366
- {
367
- code: BlockInputErrorCode.MISMATCHED_ROOT_HEX,
368
- blockInputRoot: this.blockRootHex,
369
- mismatchedRoot: blockRootHex,
370
- source,
371
- peerId: `${peerIdStr}`,
372
- },
373
- "addBlock blockRootHex does not match BlockInput.blockRootHex"
374
- );
375
- }
376
-
377
- if (!opts.throwOnDuplicateAdd) {
378
- return;
379
- }
380
-
381
- if (this.state.hasBlock) {
382
- throw new BlockInputError(
383
- {
384
- code: BlockInputErrorCode.INVALID_CONSTRUCTION,
385
- blockRoot: this.blockRootHex,
386
- },
387
- "Cannot addBlock to BlockInputBlobs after it already has a block"
388
- );
389
- }
390
-
391
- for (const {blobSidecar} of this.blobsCache.values()) {
392
- if (!blockAndBlobArePaired(block, blobSidecar)) {
393
- this.blobsCache.delete(blobSidecar.index);
394
- // TODO: (@matthewkeil) spec says to ignore invalid blobs but should we downscore the peer maybe?
395
- // this.logger?.error(`Removing blobIndex=${blobSidecar.index} from BlockInput`, {}, err);
396
- }
397
- }
398
-
399
- const hasAllData = this.blobsCache.size === block.message.body.blobKzgCommitments.length;
400
-
401
- this.state = {
402
- ...this.state,
403
- hasBlock: true,
404
- hasAllData,
405
- block,
406
- versionedHashes: block.message.body.blobKzgCommitments.map(kzgCommitmentToVersionedHash),
407
- source: {
408
- source,
409
- seenTimestampSec,
410
- peerIdStr,
411
- },
412
- timeCompleteSec: hasAllData ? seenTimestampSec : undefined,
413
- } as BlockInputBlobsState;
414
- this.blockPromise.resolve(block);
415
- if (hasAllData) {
416
- this.dataPromise.resolve(this.getBlobs());
417
- }
418
- }
419
-
420
- hasBlob(blobIndex: BlobIndex): boolean {
421
- return this.blobsCache.has(blobIndex);
422
- }
423
-
424
- getBlob(blobIndex: BlobIndex): deneb.BlobSidecar | undefined {
425
- return this.blobsCache.get(blobIndex)?.blobSidecar;
426
- }
427
-
428
- addBlob(
429
- {blockRootHex, blobSidecar, source, peerIdStr, seenTimestampSec}: AddBlob,
430
- opts = {throwOnDuplicateAdd: true}
431
- ): void {
432
- // this check suffices for checking slot, parentRoot, and forkName
433
- if (blockRootHex !== this.blockRootHex) {
434
- throw new BlockInputError(
435
- {
436
- code: BlockInputErrorCode.MISMATCHED_ROOT_HEX,
437
- blockInputRoot: this.blockRootHex,
438
- mismatchedRoot: blockRootHex,
439
- source: source,
440
- peerId: `${peerIdStr}`,
441
- },
442
- "Blob BeaconBlockHeader blockRootHex does not match BlockInput.blockRootHex"
443
- );
444
- }
445
-
446
- const isDuplicate = this.blobsCache.has(blobSidecar.index);
447
- if (isDuplicate && opts.throwOnDuplicateAdd) {
448
- throw new BlockInputError(
449
- {
450
- code: BlockInputErrorCode.INVALID_CONSTRUCTION,
451
- blockRoot: this.blockRootHex,
452
- },
453
- "Cannot addBlob to BlockInputBlobs with duplicate blobIndex"
454
- );
455
- }
456
-
457
- if (this.state.hasBlock) {
458
- assertBlockAndBlobArePaired(this.blockRootHex, this.state.block, blobSidecar);
459
- }
460
-
461
- if (isDuplicate) {
462
- return;
463
- }
464
-
465
- this.blobsCache.set(blobSidecar.index, {blobSidecar, source, seenTimestampSec, peerIdStr});
466
-
467
- if (this.state.hasBlock && this.blobsCache.size === this.state.block.message.body.blobKzgCommitments.length) {
468
- this.state = {
469
- ...this.state,
470
- hasAllData: true,
471
- timeCompleteSec: seenTimestampSec,
472
- };
473
- this.dataPromise.resolve([...this.blobsCache.values()].map(({blobSidecar}) => blobSidecar));
474
- }
475
- }
476
-
477
- getVersionedHashes(): VersionedHashes {
478
- if (!this.state.hasBlock) {
479
- throw new BlockInputError(
480
- {
481
- code: BlockInputErrorCode.INCOMPLETE_DATA,
482
- ...this.getLogMeta(),
483
- },
484
- "Cannot get versioned hashes. Block is unknown"
485
- );
486
- }
487
- return this.state.versionedHashes;
488
- }
489
-
490
- getMissingBlobMeta(): BlobMeta[] {
491
- if (!this.state.hasBlock) {
492
- throw new BlockInputError(
493
- {
494
- code: BlockInputErrorCode.INCOMPLETE_DATA,
495
- ...this.getLogMeta(),
496
- },
497
- "Cannot get missing blobs. Block is unknown"
498
- );
499
- }
500
- if (this.state.hasAllData) {
501
- return [];
502
- }
503
-
504
- const blobMeta: BlobMeta[] = [];
505
- const versionedHashes = this.state.versionedHashes;
506
- for (let index = 0; index < versionedHashes.length; index++) {
507
- if (!this.blobsCache.has(index)) {
508
- blobMeta.push({
509
- index,
510
- blockRoot: fromHex(this.blockRootHex),
511
- versionedHash: versionedHashes[index],
512
- });
513
- }
514
- }
515
- return blobMeta;
516
- }
517
-
518
- getAllBlobsWithSource(): BlobWithSource[] {
519
- if (!this.state.hasAllData) {
520
- throw new BlockInputError(
521
- {
522
- code: BlockInputErrorCode.INCOMPLETE_DATA,
523
- ...this.getLogMeta(),
524
- },
525
- "Cannot get all blobs. DA status is not complete"
526
- );
527
- }
528
- return [...this.blobsCache.values()];
529
- }
530
-
531
- getBlobs(): deneb.BlobSidecars {
532
- return this.getAllBlobsWithSource().map(({blobSidecar}) => blobSidecar);
533
- }
534
-
535
- getSerializedCacheKeys(): object[] {
536
- const objects: object[] = [];
537
-
538
- if (this.state.hasBlock) {
539
- objects.push(this.state.block);
540
- }
541
-
542
- for (const {blobSidecar} of this.blobsCache.values()) {
543
- objects.push(blobSidecar);
544
- }
545
-
546
- return objects;
547
- }
548
- }
549
-
550
- function blockAndBlobArePaired(block: SignedBeaconBlock<ForkBlobsDA>, blobSidecar: deneb.BlobSidecar): boolean {
551
- const blockCommitment = block.message.body.blobKzgCommitments[blobSidecar.index];
552
- if (!blockCommitment || !blobSidecar.kzgCommitment) {
553
- return false;
554
- }
555
- return byteArrayEquals(blockCommitment, blobSidecar.kzgCommitment);
556
- }
557
-
558
- function assertBlockAndBlobArePaired(
559
- blockRootHex: string,
560
- block: SignedBeaconBlock<ForkBlobsDA>,
561
- blobSidecar: deneb.BlobSidecar
562
- ): void {
563
- if (!blockAndBlobArePaired(block, blobSidecar)) {
564
- // TODO: (@matthewkeil) should this eject the bad blob instead? No way to tell if the blob or the block
565
- // has the invalid commitment. Guessing it would be the blob though because we match via block
566
- // hashTreeRoot and we do not take a hashTreeRoot of the BlobSidecar
567
- throw new BlockInputError(
568
- {
569
- code: BlockInputErrorCode.MISMATCHED_KZG_COMMITMENT,
570
- blockRoot: blockRootHex,
571
- slot: block.message.slot,
572
- sidecarIndex: blobSidecar.index,
573
- },
574
- "BlobSidecar commitment does not match block commitment"
575
- );
576
- }
577
- }
578
-
579
247
  // Columns DA
580
248
 
581
249
  export type ForkColumnsDA = ForkName.fulu;
@@ -1,7 +1,7 @@
1
1
  import {Slot} from "@lodestar/types";
2
2
  import {LodestarError} from "@lodestar/utils";
3
3
  import {PeerIdStr} from "../../../util/peerId.js";
4
- import {BlockInputSource, LogMetaBlobs, LogMetaColumns} from "./types.js";
4
+ import {BlockInputSource, LogMetaColumns} from "./types.js";
5
5
 
6
6
  export enum BlockInputErrorCode {
7
7
  // Bad Arguments
@@ -42,7 +42,6 @@ export type BlockInputErrorType =
42
42
  sidecarIndex: number;
43
43
  commitmentIndex?: number;
44
44
  }
45
- | (LogMetaBlobs & {code: BlockInputErrorCode.INCOMPLETE_DATA})
46
45
  | (LogMetaColumns & {code: BlockInputErrorCode.INCOMPLETE_DATA});
47
46
 
48
47
  export class BlockInputError extends LodestarError<BlockInputErrorType> {}
@@ -1,15 +1,14 @@
1
1
  import {ForkName} from "@lodestar/params";
2
- import {ColumnIndex, DataColumnSidecar, RootHex, SignedBeaconBlock, Slot, deneb, fulu} from "@lodestar/types";
2
+ import {ColumnIndex, DataColumnSidecar, RootHex, SignedBeaconBlock, Slot, fulu} from "@lodestar/types";
3
3
  import {VersionedHashes} from "../../../execution/index.js";
4
4
 
5
5
  export enum DAType {
6
6
  PreData = "pre-data",
7
- Blobs = "blobs",
8
7
  Columns = "columns",
9
8
  NoData = "no-data",
10
9
  }
11
10
 
12
- export type DAData = null | deneb.BlobSidecars | fulu.DataColumnSidecar[];
11
+ export type DAData = null | fulu.DataColumnSidecar[];
13
12
 
14
13
  /**
15
14
  * Represents were input originated. Blocks and Data can come from different
@@ -37,11 +36,6 @@ export type LogMetaBasic = {
37
36
  timeCreatedSec: number;
38
37
  };
39
38
 
40
- export type LogMetaBlobs = LogMetaBasic & {
41
- expectedBlobs: number | string;
42
- receivedBlobs: number;
43
- };
44
-
45
39
  export type LogMetaColumns = LogMetaBasic & {
46
40
  expectedColumns: number;
47
41
  receivedColumns: number;
@@ -55,8 +49,6 @@ export type SourceMeta = {
55
49
 
56
50
  export type BlockWithSource = SourceMeta & {block: SignedBeaconBlock; blockRootHex: RootHex};
57
51
 
58
- export type BlobWithSource = SourceMeta & {blobSidecar: deneb.BlobSidecar};
59
-
60
52
  export type ColumnWithSource = SourceMeta & {columnSidecar: fulu.DataColumnSidecar};
61
53
 
62
54
  export type BlockHeaderMeta = {
@@ -82,20 +74,10 @@ export type AddBlock<F extends ForkName = ForkName> = SourceMeta & {
82
74
  blockRootHex: string;
83
75
  };
84
76
 
85
- export type AddBlob = BlobWithSource & {
86
- blockRootHex: RootHex;
87
- };
88
-
89
77
  export type AddColumn = ColumnWithSource & {
90
78
  blockRootHex: RootHex;
91
79
  };
92
80
 
93
- export type BlobMeta = {
94
- index: number;
95
- blockRoot: Uint8Array;
96
- versionedHash: Uint8Array;
97
- };
98
-
99
81
  export type MissingColumnMeta = {
100
82
  missing: ColumnIndex[];
101
83
  versionedHashes: VersionedHashes;
@@ -1,11 +1,11 @@
1
1
  import {BitArray} from "@chainsafe/ssz";
2
2
  import {routes} from "@lodestar/api";
3
3
  import {
4
- AncestorStatus,
5
- ExecutionStatus,
6
4
  ForkChoiceError,
7
5
  ForkChoiceErrorCode,
6
+ InvalidBlockCode,
8
7
  NotReorgedReason,
8
+ ProtoBlock,
9
9
  getFinalizedExecutionBlockHash,
10
10
  getSafeExecutionBlockHash,
11
11
  } from "@lodestar/fork-choice";
@@ -43,11 +43,13 @@ import {callInNextEventLoop} from "../../util/eventLoop.js";
43
43
  import {isOptimisticBlock} from "../../util/forkChoice.js";
44
44
  import {isQueueErrorAborted} from "../../util/queue/index.js";
45
45
  import type {BeaconChain} from "../chain.js";
46
- import {ChainEvent, ReorgEventData} from "../emitter.js";
46
+ import {ChainEvent} from "../emitter.js";
47
+ import {BlockError, BlockErrorCode} from "../errors/index.js";
47
48
  import {ForkchoiceCaller} from "../forkChoice/index.js";
49
+ import {IncludedAttesters} from "../opPools/singleAttestationPool.js";
48
50
  import {REPROCESS_MIN_TIME_TO_NEXT_SLOT_BPS} from "../reprocess.js";
49
51
  import {toCheckpointHex} from "../stateCache/persistentCheckpointsCache.js";
50
- import {isBlockInputBlobs, isBlockInputColumns} from "./blockInput/blockInput.js";
52
+ import {isBlockInputColumns} from "./blockInput/blockInput.js";
51
53
  import {AttestationImportOpt, FullyVerifiedBlock, ImportBlockOpts} from "./types.js";
52
54
  import {getCheckpointFromState} from "./utils/checkpoint.js";
53
55
 
@@ -94,8 +96,8 @@ export async function importBlock(
94
96
  fullyVerifiedBlock: FullyVerifiedBlock,
95
97
  opts: ImportBlockOpts
96
98
  ): Promise<void> {
97
- const {blockInput, postState, parentBlockSlot, dataAvailabilityStatus, indexedAttestations} = fullyVerifiedBlock;
98
- let {executionStatus} = fullyVerifiedBlock;
99
+ const {blockInput, postState, parentBlockSlot, executionStatus, dataAvailabilityStatus, indexedAttestations} =
100
+ fullyVerifiedBlock;
99
101
  const block = blockInput.getBlock();
100
102
  const source = blockInput.getBlockSource();
101
103
  const {slot: blockSlot} = block.message;
@@ -131,35 +133,30 @@ export async function importBlock(
131
133
 
132
134
  // Should compute checkpoint balances before forkchoice.onBlock
133
135
  this.checkpointBalancesCache.processState(blockRootHex, postState);
134
- if (isGloasBeaconBlock(block.message)) {
135
- // A gloas block has no payload of its own, it inherits the status of the payload it builds on,
136
- // i.e. the parent variant matching the bid's parent block hash. The parent's default (PENDING)
137
- // variant does not reflect a SYNCING parent payload, and onBlock would then mark that payload VALID.
138
- const parentRootHex = toRootHex(block.message.parentRoot);
139
- const parentBlockHashHex = toRootHex(block.message.body.signedExecutionPayloadBid.message.parentBlockHash);
140
- const parentBlock = this.forkChoice.getBlockHexAndBlockHash(parentRootHex, parentBlockHashHex);
141
- if (parentBlock === null) {
142
- throw Error(
143
- `Parent block not found in forkChoice, parentRoot=${parentRootHex} parentBlockHash=${parentBlockHashHex}`
144
- );
145
- }
146
- if (parentBlock.executionStatus === ExecutionStatus.Invalid) {
147
- throw Error(`Parent block has invalid execution status, parentRoot=${parentRootHex}`);
136
+ const importDelayMs = this.clock.msFromSlot(blockSlot);
137
+ let blockSummary: ProtoBlock;
138
+ try {
139
+ blockSummary = this.forkChoice.onBlock(
140
+ block.message,
141
+ postState,
142
+ receiveDelayMs,
143
+ importDelayMs,
144
+ currentSlot,
145
+ executionStatus,
146
+ dataAvailabilityStatus
147
+ );
148
+ } catch (e) {
149
+ // The parent can be invalidated by a forkchoiceUpdated verdict after verifyBlocksSanityChecks passed
150
+ if (
151
+ e instanceof ForkChoiceError &&
152
+ e.type.code === ForkChoiceErrorCode.INVALID_BLOCK &&
153
+ e.type.err.code === InvalidBlockCode.PARENT_EXECUTION_INVALID
154
+ ) {
155
+ throw new BlockError(block, {code: BlockErrorCode.PARENT_EXECUTION_INVALID, parentRoot: e.type.err.root});
148
156
  }
149
- executionStatus = parentBlock.executionStatus;
157
+ throw e;
150
158
  }
151
159
 
152
- const importDelayMs = this.clock.msFromSlot(blockSlot);
153
- const blockSummary = this.forkChoice.onBlock(
154
- block.message,
155
- postState,
156
- receiveDelayMs,
157
- importDelayMs,
158
- currentSlot,
159
- executionStatus,
160
- dataAvailabilityStatus
161
- );
162
-
163
160
  // This adds the state necessary to process the next block
164
161
  // Some block event handlers require state being in state cache so need to do this before emitting EventType.block
165
162
  this.regen.processState(blockRootHex, postState);
@@ -176,6 +173,9 @@ export async function importBlock(
176
173
  // Only process attestations of blocks with relevant attestations for the fork-choice:
177
174
  // If current epoch is N, and block is epoch X, block may include attestations for epoch X or X - 1.
178
175
  // The latest block that is useful is at epoch N - 1 which may include attestations for epoch N - 1 or N - 2.
176
+ // the pool is empty outside the slots before a local block proposal, nothing to prune then
177
+ const pruneSingleAttestations = fork >= ForkSeq.electra && !this.singleAttestationPool.isEmpty();
178
+ const includedAttesters: IncludedAttesters[] = [];
179
179
  if (importsBlockAttestations(opts, blockEpoch, currentEpoch)) {
180
180
  const attestations = block.message.body.attestations;
181
181
  const rootCache = new RootCache(postState);
@@ -190,6 +190,14 @@ export async function importBlock(
190
190
  const {target, beaconBlockRoot} = attestation.data;
191
191
 
192
192
  const attDataRoot = toRootHex(ssz.phase0.AttestationData.hashTreeRoot(indexedAttestation.data));
193
+ // the block includes these attesters even if fork choice below rejects the vote
194
+ if (pruneSingleAttestations) {
195
+ includedAttesters.push({
196
+ slot: attestation.data.slot,
197
+ attDataRootHex: attDataRoot,
198
+ attestingIndices: indexedAttestation.attestingIndices,
199
+ });
200
+ }
193
201
  addAttestation.call(
194
202
  this,
195
203
  postState,
@@ -321,19 +329,19 @@ export async function importBlock(
321
329
  });
322
330
  }
323
331
 
332
+ // only a block that becomes head prunes, not a side-branch import
333
+ if (pruneSingleAttestations && newHead.blockRoot === blockRootHex) {
334
+ callInNextEventLoop(() => {
335
+ const deleted = this.singleAttestationPool.onHead(blockRootHex, newHead.parentRoot, includedAttesters);
336
+ this.metrics?.opPool.singleAttestationPool.deletedByBlock.inc(deleted);
337
+ });
338
+ }
339
+
324
340
  if (newHead.blockRoot !== oldHead.blockRoot) {
325
- // Set head state as strong reference
326
- this.regen.updateHeadState(newHead, postState);
341
+ this.onHeadChanged(oldHead, newHead, postState);
327
342
 
328
343
  const delaySec = this.clock.secFromSlot(newHead.slot);
329
- this.logger.verbose("New chain head", {
330
- slot: newHead.slot,
331
- root: newHead.blockRoot,
332
- delaySec,
333
- });
334
-
335
344
  if (this.metrics) {
336
- this.metrics.headSlot.set(newHead.slot);
337
345
  // Only track "recent" blocks. Otherwise sync can distort this metrics heavily.
338
346
  // We want to track recent blocks coming from gossip, unknown block sync, and API.
339
347
  const headFork = this.config.getForkName(newHead.slot);
@@ -346,32 +354,6 @@ export async function importBlock(
346
354
  }
347
355
  }
348
356
 
349
- this.onNewHead(newHead);
350
-
351
- this.metrics?.forkChoice.changedHead.inc();
352
-
353
- const ancestorResult = this.forkChoice.getCommonAncestorDepth(oldHead, newHead);
354
- if (ancestorResult.code === AncestorStatus.CommonAncestor) {
355
- // CommonAncestor = chain reorg, old head and new head not direct descendants
356
-
357
- const forkChoiceReorgEventData: ReorgEventData = {
358
- depth: ancestorResult.depth,
359
- epoch: computeEpochAtSlot(newHead.slot),
360
- slot: newHead.slot,
361
- newHeadBlock: newHead.blockRoot,
362
- oldHeadBlock: oldHead.blockRoot,
363
- newHeadState: newHead.stateRoot,
364
- oldHeadState: oldHead.stateRoot,
365
- executionOptimistic: isOptimisticBlock(newHead),
366
- };
367
-
368
- this.emitter.emit(routes.events.EventType.chainReorg, forkChoiceReorgEventData);
369
- this.logger.verbose("Chain reorg", forkChoiceReorgEventData);
370
-
371
- this.metrics?.forkChoice.reorg.inc();
372
- this.metrics?.forkChoice.reorgDistance.observe(ancestorResult.depth);
373
- }
374
-
375
357
  // Lightclient server support (only after altair)
376
358
  // - Persist state witness
377
359
  // - Use block's syncAggregate
@@ -470,7 +452,13 @@ export async function importBlock(
470
452
  const finalizedBlockHash = getFinalizedExecutionBlockHash(this.forkChoice);
471
453
  if (headBlockHash !== ZERO_HASH_HEX) {
472
454
  this.executionEngine
473
- .notifyForkchoiceUpdate(this.config.getForkName(fcuHead.slot), headBlockHash, safeBlockHash, finalizedBlockHash)
455
+ .notifyForkchoiceUpdate(
456
+ this.config.getForkName(fcuHead.slot),
457
+ fcuHead.blockRoot,
458
+ headBlockHash,
459
+ safeBlockHash,
460
+ finalizedBlockHash
461
+ )
474
462
  .catch((e) => {
475
463
  if (!isErrorAborted(e) && !isQueueErrorAborted(e)) {
476
464
  this.logger.error("Error pushing notifyForkchoiceUpdate()", {headBlockHash, finalizedBlockHash}, e);
@@ -592,10 +580,6 @@ export async function importBlock(
592
580
  for (const {source} of blockInput.getSampledColumnsWithSource()) {
593
581
  this.metrics?.dataColumns.bySource.inc({source});
594
582
  }
595
- } else if (isBlockInputBlobs(blockInput)) {
596
- for (const {source} of blockInput.getAllBlobsWithSource()) {
597
- this.metrics?.importBlock.blobsBySource.inc({blobsSource: source});
598
- }
599
583
  }
600
584
 
601
585
  const reprocessGuardSec =