@lodestar/beacon-node 1.47.0-dev.09607ce6d4 → 1.47.0-dev.101e2c290d

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 (303) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +3 -2
  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 +21 -2
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/beacon/state/utils.d.ts +2 -1
  8. package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
  9. package/lib/api/impl/beacon/state/utils.js.map +1 -1
  10. package/lib/api/impl/events/index.d.ts +1 -1
  11. package/lib/api/impl/events/index.d.ts.map +1 -1
  12. package/lib/api/impl/events/index.js +12 -3
  13. package/lib/api/impl/events/index.js.map +1 -1
  14. package/lib/api/impl/lodestar/index.js +1 -1
  15. package/lib/api/impl/lodestar/index.js.map +1 -1
  16. package/lib/api/rest/base.d.ts.map +1 -1
  17. package/lib/api/rest/base.js +7 -0
  18. package/lib/api/rest/base.js.map +1 -1
  19. package/lib/chain/archiveStore/archiveStore.js +1 -1
  20. package/lib/chain/archiveStore/archiveStore.js.map +1 -1
  21. package/lib/chain/blocks/importExecutionPayload.d.ts +3 -2
  22. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  23. package/lib/chain/blocks/importExecutionPayload.js +11 -9
  24. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  25. package/lib/chain/blocks/index.d.ts.map +1 -1
  26. package/lib/chain/blocks/index.js +14 -6
  27. package/lib/chain/blocks/index.js.map +1 -1
  28. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +2 -1
  29. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  30. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +6 -2
  31. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  32. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +14 -5
  33. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  34. package/lib/chain/blocks/payloadEnvelopeInput/types.js +5 -0
  35. package/lib/chain/blocks/payloadEnvelopeInput/types.js.map +1 -1
  36. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.d.ts.map +1 -1
  37. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js +22 -12
  38. package/lib/chain/blocks/verifyBlocksStateTransitionOnly.js.map +1 -1
  39. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +2 -2
  40. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
  41. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +2 -2
  42. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
  43. package/lib/chain/bls/index.d.ts +1 -1
  44. package/lib/chain/bls/index.d.ts.map +1 -1
  45. package/lib/chain/bls/interface.d.ts +5 -5
  46. package/lib/chain/bls/interface.d.ts.map +1 -1
  47. package/lib/chain/bls/multithread/index.d.ts +5 -11
  48. package/lib/chain/bls/multithread/index.d.ts.map +1 -1
  49. package/lib/chain/bls/multithread/index.js +116 -101
  50. package/lib/chain/bls/multithread/index.js.map +1 -1
  51. package/lib/chain/bls/multithread/jobItem.d.ts +5 -19
  52. package/lib/chain/bls/multithread/jobItem.d.ts.map +1 -1
  53. package/lib/chain/bls/multithread/jobItem.js +10 -65
  54. package/lib/chain/bls/multithread/jobItem.js.map +1 -1
  55. package/lib/chain/bls/multithread/types.d.ts +29 -8
  56. package/lib/chain/bls/multithread/types.d.ts.map +1 -1
  57. package/lib/chain/bls/multithread/types.js +12 -0
  58. package/lib/chain/bls/multithread/types.js.map +1 -1
  59. package/lib/chain/bls/multithread/utils.d.ts +4 -0
  60. package/lib/chain/bls/multithread/utils.d.ts.map +1 -1
  61. package/lib/chain/bls/multithread/utils.js +10 -0
  62. package/lib/chain/bls/multithread/utils.js.map +1 -1
  63. package/lib/chain/bls/multithread/worker.js +49 -23
  64. package/lib/chain/bls/multithread/worker.js.map +1 -1
  65. package/lib/chain/bls/singleThread.d.ts +4 -10
  66. package/lib/chain/bls/singleThread.d.ts.map +1 -1
  67. package/lib/chain/bls/singleThread.js +8 -45
  68. package/lib/chain/bls/singleThread.js.map +1 -1
  69. package/lib/chain/bls/utils.d.ts +4 -4
  70. package/lib/chain/bls/utils.d.ts.map +1 -1
  71. package/lib/chain/bls/utils.js +18 -19
  72. package/lib/chain/bls/utils.js.map +1 -1
  73. package/lib/chain/chain.d.ts +4 -2
  74. package/lib/chain/chain.d.ts.map +1 -1
  75. package/lib/chain/chain.js +16 -6
  76. package/lib/chain/chain.js.map +1 -1
  77. package/lib/chain/errors/blockError.d.ts +1 -0
  78. package/lib/chain/errors/blockError.d.ts.map +1 -1
  79. package/lib/chain/errors/blockError.js +6 -1
  80. package/lib/chain/errors/blockError.js.map +1 -1
  81. package/lib/chain/errors/proposerPreferences.d.ts +6 -0
  82. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -1
  83. package/lib/chain/errors/proposerPreferences.js +1 -0
  84. package/lib/chain/errors/proposerPreferences.js.map +1 -1
  85. package/lib/chain/forkChoice/index.d.ts.map +1 -1
  86. package/lib/chain/forkChoice/index.js +4 -0
  87. package/lib/chain/forkChoice/index.js.map +1 -1
  88. package/lib/chain/interface.d.ts +4 -2
  89. package/lib/chain/interface.d.ts.map +1 -1
  90. package/lib/chain/interface.js.map +1 -1
  91. package/lib/chain/opPools/aggregatedAttestationPool.js +1 -1
  92. package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
  93. package/lib/chain/opPools/attestationPool.d.ts +1 -1
  94. package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
  95. package/lib/chain/opPools/attestationPool.js +1 -1
  96. package/lib/chain/opPools/attestationPool.js.map +1 -1
  97. package/lib/chain/opPools/deferredVoluntaryExitPool.d.ts +16 -0
  98. package/lib/chain/opPools/deferredVoluntaryExitPool.d.ts.map +1 -0
  99. package/lib/chain/opPools/deferredVoluntaryExitPool.js +57 -0
  100. package/lib/chain/opPools/deferredVoluntaryExitPool.js.map +1 -0
  101. package/lib/chain/opPools/index.d.ts +1 -0
  102. package/lib/chain/opPools/index.d.ts.map +1 -1
  103. package/lib/chain/opPools/index.js +1 -0
  104. package/lib/chain/opPools/index.js.map +1 -1
  105. package/lib/chain/opPools/payloadAttestationPool.js +3 -3
  106. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  107. package/lib/chain/opPools/syncCommitteeMessagePool.js +1 -1
  108. package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
  109. package/lib/chain/opPools/syncContributionAndProofPool.js +1 -1
  110. package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
  111. package/lib/chain/opPools/utils.d.ts +1 -1
  112. package/lib/chain/opPools/utils.d.ts.map +1 -1
  113. package/lib/chain/opPools/utils.js +1 -1
  114. package/lib/chain/opPools/utils.js.map +1 -1
  115. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  116. package/lib/chain/prepareNextSlot.js +23 -5
  117. package/lib/chain/prepareNextSlot.js.map +1 -1
  118. package/lib/chain/regen/interface.d.ts +4 -2
  119. package/lib/chain/regen/interface.d.ts.map +1 -1
  120. package/lib/chain/regen/interface.js +2 -0
  121. package/lib/chain/regen/interface.js.map +1 -1
  122. package/lib/chain/regen/queued.d.ts +2 -2
  123. package/lib/chain/regen/queued.d.ts.map +1 -1
  124. package/lib/chain/regen/queued.js +5 -5
  125. package/lib/chain/regen/queued.js.map +1 -1
  126. package/lib/chain/seenCache/seenAttesters.d.ts +9 -5
  127. package/lib/chain/seenCache/seenAttesters.d.ts.map +1 -1
  128. package/lib/chain/seenCache/seenAttesters.js +25 -4
  129. package/lib/chain/seenCache/seenAttesters.js.map +1 -1
  130. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +28 -1
  131. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  132. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +121 -13
  133. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  134. package/lib/chain/stateCache/fifoBlockStateCache.d.ts +5 -1
  135. package/lib/chain/stateCache/fifoBlockStateCache.d.ts.map +1 -1
  136. package/lib/chain/stateCache/fifoBlockStateCache.js +6 -0
  137. package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
  138. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +47 -5
  139. package/lib/chain/stateCache/persistentCheckpointsCache.d.ts.map +1 -1
  140. package/lib/chain/stateCache/persistentCheckpointsCache.js +117 -7
  141. package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
  142. package/lib/chain/stateCache/types.d.ts +3 -3
  143. package/lib/chain/stateCache/types.d.ts.map +1 -1
  144. package/lib/chain/validation/attestation.d.ts.map +1 -1
  145. package/lib/chain/validation/attestation.js +1 -4
  146. package/lib/chain/validation/attestation.js.map +1 -1
  147. package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
  148. package/lib/chain/validation/attesterSlashing.js +1 -1
  149. package/lib/chain/validation/attesterSlashing.js.map +1 -1
  150. package/lib/chain/validation/executionPayloadBid.d.ts.map +1 -1
  151. package/lib/chain/validation/executionPayloadBid.js +1 -2
  152. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  153. package/lib/chain/validation/executionPayloadEnvelope.js +1 -1
  154. package/lib/chain/validation/executionPayloadEnvelope.js.map +1 -1
  155. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  156. package/lib/chain/validation/payloadAttestationMessage.js +5 -14
  157. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  158. package/lib/chain/validation/proposerPreferences.d.ts +1 -1
  159. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -1
  160. package/lib/chain/validation/proposerPreferences.js +13 -4
  161. package/lib/chain/validation/proposerPreferences.js.map +1 -1
  162. package/lib/chain/validation/proposerSlashing.js +1 -1
  163. package/lib/chain/validation/proposerSlashing.js.map +1 -1
  164. package/lib/chain/validation/voluntaryExit.d.ts +9 -1
  165. package/lib/chain/validation/voluntaryExit.d.ts.map +1 -1
  166. package/lib/chain/validation/voluntaryExit.js +46 -1
  167. package/lib/chain/validation/voluntaryExit.js.map +1 -1
  168. package/lib/metrics/metrics/lodestar.d.ts +62 -22
  169. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  170. package/lib/metrics/metrics/lodestar.js +114 -52
  171. package/lib/metrics/metrics/lodestar.js.map +1 -1
  172. package/lib/network/gossip/topic.d.ts +13 -0
  173. package/lib/network/gossip/topic.d.ts.map +1 -1
  174. package/lib/network/gossip/topic.js +37 -0
  175. package/lib/network/gossip/topic.js.map +1 -1
  176. package/lib/network/libp2p/index.d.ts.map +1 -1
  177. package/lib/network/libp2p/index.js +10 -2
  178. package/lib/network/libp2p/index.js.map +1 -1
  179. package/lib/network/network.d.ts.map +1 -1
  180. package/lib/network/network.js +22 -43
  181. package/lib/network/network.js.map +1 -1
  182. package/lib/network/processor/constants.d.ts +7 -0
  183. package/lib/network/processor/constants.d.ts.map +1 -0
  184. package/lib/network/processor/constants.js +7 -0
  185. package/lib/network/processor/constants.js.map +1 -0
  186. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  187. package/lib/network/processor/gossipHandlers.js +5 -1
  188. package/lib/network/processor/gossipHandlers.js.map +1 -1
  189. package/lib/network/processor/index.d.ts +3 -0
  190. package/lib/network/processor/index.d.ts.map +1 -1
  191. package/lib/network/processor/index.js +36 -15
  192. package/lib/network/processor/index.js.map +1 -1
  193. package/lib/network/reqresp/score.d.ts.map +1 -1
  194. package/lib/network/reqresp/score.js +5 -11
  195. package/lib/network/reqresp/score.js.map +1 -1
  196. package/lib/network/util.d.ts +0 -1
  197. package/lib/network/util.d.ts.map +1 -1
  198. package/lib/network/util.js +0 -4
  199. package/lib/network/util.js.map +1 -1
  200. package/lib/node/deferredVoluntaryExitPublisher.d.ts +15 -0
  201. package/lib/node/deferredVoluntaryExitPublisher.d.ts.map +1 -0
  202. package/lib/node/deferredVoluntaryExitPublisher.js +38 -0
  203. package/lib/node/deferredVoluntaryExitPublisher.js.map +1 -0
  204. package/lib/node/nodejs.d.ts +2 -1
  205. package/lib/node/nodejs.d.ts.map +1 -1
  206. package/lib/node/nodejs.js +2 -0
  207. package/lib/node/nodejs.js.map +1 -1
  208. package/lib/sync/range/batch.d.ts +23 -5
  209. package/lib/sync/range/batch.d.ts.map +1 -1
  210. package/lib/sync/range/batch.js +61 -22
  211. package/lib/sync/range/batch.js.map +1 -1
  212. package/lib/sync/range/chain.d.ts +2 -1
  213. package/lib/sync/range/chain.d.ts.map +1 -1
  214. package/lib/sync/range/chain.js +23 -10
  215. package/lib/sync/range/chain.js.map +1 -1
  216. package/lib/sync/types.d.ts +32 -0
  217. package/lib/sync/types.d.ts.map +1 -1
  218. package/lib/sync/types.js +33 -0
  219. package/lib/sync/types.js.map +1 -1
  220. package/lib/sync/unknownBlock.d.ts +13 -2
  221. package/lib/sync/unknownBlock.d.ts.map +1 -1
  222. package/lib/sync/unknownBlock.js +204 -61
  223. package/lib/sync/unknownBlock.js.map +1 -1
  224. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  225. package/lib/sync/utils/downloadByRange.js +16 -11
  226. package/lib/sync/utils/downloadByRange.js.map +1 -1
  227. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  228. package/lib/sync/utils/downloadByRoot.js +3 -1
  229. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  230. package/package.json +35 -35
  231. package/src/api/impl/beacon/blocks/index.ts +3 -2
  232. package/src/api/impl/beacon/pool/index.ts +22 -2
  233. package/src/api/impl/beacon/state/utils.ts +2 -1
  234. package/src/api/impl/events/index.ts +12 -4
  235. package/src/api/impl/lodestar/index.ts +1 -1
  236. package/src/api/rest/base.ts +7 -0
  237. package/src/chain/archiveStore/archiveStore.ts +1 -1
  238. package/src/chain/blocks/importExecutionPayload.ts +12 -11
  239. package/src/chain/blocks/index.ts +18 -6
  240. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +8 -2
  241. package/src/chain/blocks/payloadEnvelopeInput/types.ts +17 -4
  242. package/src/chain/blocks/verifyBlocksStateTransitionOnly.ts +25 -16
  243. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +1 -9
  244. package/src/chain/bls/index.ts +1 -1
  245. package/src/chain/bls/interface.ts +7 -3
  246. package/src/chain/bls/multithread/index.ts +148 -120
  247. package/src/chain/bls/multithread/jobItem.ts +12 -82
  248. package/src/chain/bls/multithread/types.ts +33 -8
  249. package/src/chain/bls/multithread/utils.ts +11 -0
  250. package/src/chain/bls/multithread/worker.ts +85 -27
  251. package/src/chain/bls/singleThread.ts +11 -55
  252. package/src/chain/bls/utils.ts +23 -24
  253. package/src/chain/chain.ts +17 -6
  254. package/src/chain/errors/blockError.ts +8 -2
  255. package/src/chain/errors/proposerPreferences.ts +7 -0
  256. package/src/chain/forkChoice/index.ts +4 -0
  257. package/src/chain/interface.ts +4 -1
  258. package/src/chain/opPools/aggregatedAttestationPool.ts +1 -1
  259. package/src/chain/opPools/attestationPool.ts +1 -1
  260. package/src/chain/opPools/deferredVoluntaryExitPool.ts +65 -0
  261. package/src/chain/opPools/index.ts +1 -0
  262. package/src/chain/opPools/payloadAttestationPool.ts +3 -3
  263. package/src/chain/opPools/syncCommitteeMessagePool.ts +1 -1
  264. package/src/chain/opPools/syncContributionAndProofPool.ts +1 -1
  265. package/src/chain/opPools/utils.ts +1 -1
  266. package/src/chain/prepareNextSlot.ts +23 -5
  267. package/src/chain/regen/interface.ts +4 -2
  268. package/src/chain/regen/queued.ts +5 -5
  269. package/src/chain/seenCache/seenAttesters.ts +31 -5
  270. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +143 -14
  271. package/src/chain/stateCache/fifoBlockStateCache.ts +8 -1
  272. package/src/chain/stateCache/persistentCheckpointsCache.ts +133 -8
  273. package/src/chain/stateCache/types.ts +3 -3
  274. package/src/chain/validation/attestation.ts +1 -7
  275. package/src/chain/validation/attesterSlashing.ts +1 -8
  276. package/src/chain/validation/executionPayloadBid.ts +1 -2
  277. package/src/chain/validation/executionPayloadEnvelope.ts +0 -1
  278. package/src/chain/validation/payloadAttestationMessage.ts +6 -17
  279. package/src/chain/validation/proposerPreferences.ts +15 -5
  280. package/src/chain/validation/proposerSlashing.ts +1 -1
  281. package/src/chain/validation/voluntaryExit.ts +59 -2
  282. package/src/metrics/metrics/lodestar.ts +126 -57
  283. package/src/network/gossip/topic.ts +38 -0
  284. package/src/network/libp2p/index.ts +11 -2
  285. package/src/network/network.ts +27 -55
  286. package/src/network/processor/constants.ts +6 -0
  287. package/src/network/processor/gossipHandlers.ts +5 -1
  288. package/src/network/processor/index.ts +42 -19
  289. package/src/network/reqresp/score.ts +5 -11
  290. package/src/network/util.ts +0 -5
  291. package/src/node/deferredVoluntaryExitPublisher.ts +54 -0
  292. package/src/node/nodejs.ts +5 -1
  293. package/src/sync/range/batch.ts +83 -28
  294. package/src/sync/range/chain.ts +26 -11
  295. package/src/sync/types.ts +36 -1
  296. package/src/sync/unknownBlock.ts +240 -68
  297. package/src/sync/utils/downloadByRange.ts +21 -12
  298. package/src/sync/utils/downloadByRoot.ts +3 -1
  299. package/lib/chain/bls/maybeBatch.d.ts +0 -12
  300. package/lib/chain/bls/maybeBatch.d.ts.map +0 -1
  301. package/lib/chain/bls/maybeBatch.js +0 -35
  302. package/lib/chain/bls/maybeBatch.js.map +0 -1
  303. package/src/chain/bls/maybeBatch.ts +0 -45
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/ChainSafe/lodestar/issues"
13
13
  },
14
- "version": "1.47.0-dev.09607ce6d4",
14
+ "version": "1.47.0-dev.101e2c290d",
15
15
  "type": "module",
16
16
  "exports": {
17
17
  ".": {
@@ -100,51 +100,51 @@
100
100
  "check-readme": "pnpm exec tsx ../../scripts/check_readme.ts"
101
101
  },
102
102
  "dependencies": {
103
- "@chainsafe/as-sha256": "^1.2.4",
104
- "@chainsafe/blst": "^2.2.0",
103
+ "@chainsafe/as-sha256": "^1.2.5",
105
104
  "@chainsafe/discv5": "^12.0.2",
106
105
  "@chainsafe/enr": "^6.0.2",
107
106
  "@chainsafe/libp2p-noise": "^17.0.0",
108
107
  "@chainsafe/libp2p-quic": "^2.1.3",
109
- "@chainsafe/persistent-merkle-tree": "^1.3.0",
108
+ "@chainsafe/lodestar-z": "catalog:",
109
+ "@chainsafe/persistent-merkle-tree": "^1.3.1",
110
110
  "@chainsafe/prometheus-gc-stats": "^1.0.0",
111
111
  "@chainsafe/snappy-wasm": "^0.5.0",
112
- "@chainsafe/ssz": "^1.6.2",
112
+ "@chainsafe/ssz": "^1.6.3",
113
113
  "@chainsafe/threads": "^1.11.3",
114
114
  "@crate-crypto/node-eth-kzg": "0.9.1",
115
115
  "@fastify/bearer-auth": "^10.0.1",
116
116
  "@fastify/cors": "^10.0.1",
117
117
  "@fastify/swagger": "^9.0.0",
118
118
  "@fastify/swagger-ui": "^5.0.1",
119
- "@libp2p/bootstrap": "^12.0.14",
120
- "@libp2p/crypto": "^5.1.13",
121
- "@libp2p/gossipsub": "^16.0.2",
122
- "@libp2p/identify": "^4.0.13",
123
- "@libp2p/interface": "^3.1.0",
124
- "@libp2p/mdns": "^12.0.14",
125
- "@libp2p/mplex": "^12.0.14",
126
- "@libp2p/peer-id": "^6.0.4",
127
- "@libp2p/prometheus-metrics": "^5.0.14",
128
- "@libp2p/tcp": "^11.0.13",
129
- "@lodestar/api": "^1.47.0-dev.09607ce6d4",
130
- "@lodestar/config": "^1.47.0-dev.09607ce6d4",
131
- "@lodestar/db": "^1.47.0-dev.09607ce6d4",
132
- "@lodestar/fork-choice": "^1.47.0-dev.09607ce6d4",
133
- "@lodestar/logger": "^1.47.0-dev.09607ce6d4",
134
- "@lodestar/params": "^1.47.0-dev.09607ce6d4",
135
- "@lodestar/reqresp": "^1.47.0-dev.09607ce6d4",
136
- "@lodestar/state-transition": "^1.47.0-dev.09607ce6d4",
137
- "@lodestar/types": "^1.47.0-dev.09607ce6d4",
138
- "@lodestar/utils": "^1.47.0-dev.09607ce6d4",
139
- "@lodestar/validator": "^1.47.0-dev.09607ce6d4",
119
+ "@libp2p/bootstrap": "^12.0.30",
120
+ "@libp2p/crypto": "^5.1.23",
121
+ "@libp2p/gossipsub": "^16.1.1",
122
+ "@libp2p/identify": "^4.1.13",
123
+ "@libp2p/interface": "^3.3.0",
124
+ "@libp2p/mdns": "^12.0.30",
125
+ "@libp2p/mplex": "^12.0.30",
126
+ "@libp2p/peer-id": "^6.0.15",
127
+ "@libp2p/prometheus-metrics": "^5.0.28",
128
+ "@libp2p/tcp": "^11.0.27",
129
+ "@lodestar/api": "^1.47.0-dev.101e2c290d",
130
+ "@lodestar/config": "^1.47.0-dev.101e2c290d",
131
+ "@lodestar/db": "^1.47.0-dev.101e2c290d",
132
+ "@lodestar/fork-choice": "^1.47.0-dev.101e2c290d",
133
+ "@lodestar/logger": "^1.47.0-dev.101e2c290d",
134
+ "@lodestar/params": "^1.47.0-dev.101e2c290d",
135
+ "@lodestar/reqresp": "^1.47.0-dev.101e2c290d",
136
+ "@lodestar/state-transition": "^1.47.0-dev.101e2c290d",
137
+ "@lodestar/types": "^1.47.0-dev.101e2c290d",
138
+ "@lodestar/utils": "^1.47.0-dev.101e2c290d",
139
+ "@lodestar/validator": "^1.47.0-dev.101e2c290d",
140
140
  "@multiformats/multiaddr": "^13.0.1",
141
- "datastore-core": "^11.0.2",
142
- "datastore-level": "^12.0.2",
141
+ "datastore-core": "^12.0.1",
142
+ "datastore-level": "^13.0.1",
143
143
  "deepmerge": "^4.3.1",
144
144
  "fastify": "^5.8.1",
145
- "interface-datastore": "^9.0.2",
145
+ "interface-datastore": "^10.0.1",
146
146
  "jwt-simple": "0.5.6",
147
- "libp2p": "3.1.6",
147
+ "libp2p": "3.3.9",
148
148
  "multiformats": "^13.4.2",
149
149
  "prom-client": "^15.1.0",
150
150
  "qs": "^6.14.2",
@@ -155,10 +155,10 @@
155
155
  },
156
156
  "devDependencies": {
157
157
  "@chainsafe/swap-or-not-shuffle": "^1.2.1",
158
- "@libp2p/interface-internal": "^3.0.13",
159
- "@libp2p/logger": "^6.2.2",
160
- "@libp2p/utils": "^7.0.13",
161
- "@lodestar/spec-test-util": "^1.47.0-dev.09607ce6d4",
158
+ "@libp2p/interface-internal": "^3.1.12",
159
+ "@libp2p/logger": "^6.2.13",
160
+ "@libp2p/utils": "^7.4.0",
161
+ "@lodestar/spec-test-util": "^1.47.0-dev.101e2c290d",
162
162
  "@types/js-yaml": "^4.0.5",
163
163
  "@types/qs": "^6.9.7",
164
164
  "@types/tmp": "^0.2.3",
@@ -175,5 +175,5 @@
175
175
  "beacon",
176
176
  "blockchain"
177
177
  ],
178
- "gitHead": "32812cbd48e49510ebf147be672f46e086545ccc"
178
+ "gitHead": "b6252ef539292197ada5c141c894fc4ca64abd45"
179
179
  }
@@ -128,7 +128,8 @@ export function getBeaconBlockApi({
128
128
  forkName: fork,
129
129
  sampledColumns: chain.custodyConfig.sampledColumns,
130
130
  custodyColumns: chain.custodyConfig.custodyColumns,
131
- timeCreatedSec: seenTimestampSec,
131
+ seenTimestampSec,
132
+ source: PayloadEnvelopeInputSource.api,
132
133
  });
133
134
  }
134
135
 
@@ -401,7 +402,7 @@ export function getBeaconBlockApi({
401
402
  for (let i = 0; i < dataColumnSidecars.length; i++) {
402
403
  // + 1 because we publish to beacon_block first
403
404
  const {sentPeers, alreadyPublished} = sentPeersArr[i + 1] as {sentPeers: number; alreadyPublished: boolean};
404
- // sent peers could be 0 as we set `allowPublishToZeroTopicPeers=true` in network.publishDataColumnSidecar()
405
+ // sent peers could be 0, data_column_sidecar opts out of the zero peers publish error, see gossipTopicAllowPublishToZeroPeers
405
406
  metrics?.dataColumns.sentPeersPerSubnet.observe(sentPeers);
406
407
  // A duplicate publish (alreadyPublished=true) means the column is already propagating on the network —
407
408
  // expected in self-build flows where peers gossip columns back to us before we publish the envelope.
@@ -100,7 +100,9 @@ export function getBeaconPoolApi({
100
100
  const {indexedAttestation, subnet, attDataRootHex, committeeIndex, validatorCommitteeIndex, committeeSize} =
101
101
  await validateGossipFnRetryUnknownRoot(validateFn, network, chain, slot, beaconBlockRoot);
102
102
 
103
- if (network.shouldAggregate(subnet, slot)) {
103
+ try {
104
+ // `is_aggregator` only covers aggregating what we receive on the subnet via gossip, not what
105
+ // a validator client hands us directly, see https://github.com/ChainSafe/lodestar/issues/7548
104
106
  const insertOutcome = chain.attestationPool.add(
105
107
  committeeIndex,
106
108
  attestation,
@@ -110,6 +112,10 @@ export function getBeaconPoolApi({
110
112
  priority
111
113
  );
112
114
  metrics?.opPool.attestationPool.apiInsertOutcome.inc({insertOutcome});
115
+ } catch (e) {
116
+ // The pool is a local optimization, failing to insert must not stop us from publishing a
117
+ // validated attestation, which the route requires us to do. Same handling as the gossip path
118
+ logger.debug("Error adding unaggregated attestation to pool", {subnet}, e as Error);
113
119
  }
114
120
 
115
121
  if (isForkPostElectra(fork)) {
@@ -173,7 +179,21 @@ export function getBeaconPoolApi({
173
179
  },
174
180
 
175
181
  async submitPoolVoluntaryExit({signedVoluntaryExit}) {
176
- await validateApiVoluntaryExit(chain, signedVoluntaryExit);
182
+ const result = await validateApiVoluntaryExit(chain, signedVoluntaryExit);
183
+
184
+ if (result.status === "deferred") {
185
+ const currentEpoch = chain.clock.currentEpoch;
186
+ const inserted = chain.deferredVoluntaryExitPool.insert(signedVoluntaryExit, result.validity, currentEpoch);
187
+ if (!inserted) {
188
+ throw new ApiError(400, "Deferred voluntary exit pool is full or already contains this validator");
189
+ }
190
+ logger.info("Voluntary exit deferred until transient conditions are met", {
191
+ validatorIndex: signedVoluntaryExit.message.validatorIndex,
192
+ reason: result.validity,
193
+ });
194
+ return;
195
+ }
196
+
177
197
  chain.opPool.insertVoluntaryExit(signedVoluntaryExit);
178
198
  chain.emitter.emit(routes.events.EventType.voluntaryExit, signedVoluntaryExit);
179
199
  await network.publishVoluntaryExit(signedVoluntaryExit);
@@ -1,7 +1,8 @@
1
+ import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
1
2
  import {routes} from "@lodestar/api";
2
3
  import {CheckpointWithHex, IForkChoice} from "@lodestar/fork-choice";
3
4
  import {GENESIS_SLOT} from "@lodestar/params";
4
- import {IBeaconStateView, IBeaconStateViewGloas, PubkeyCache} from "@lodestar/state-transition";
5
+ import {IBeaconStateView, IBeaconStateViewGloas} from "@lodestar/state-transition";
5
6
  import {
6
7
  BLSPubkey,
7
8
  BuilderIndex,
@@ -4,7 +4,8 @@ import {ApiModules} from "../types.js";
4
4
 
5
5
  export function getEventsApi({
6
6
  chain,
7
- }: Pick<ApiModules, "chain" | "config">): ApplicationMethods<routes.events.Endpoints> {
7
+ logger,
8
+ }: Pick<ApiModules, "chain" | "config" | "logger">): ApplicationMethods<routes.events.Endpoints> {
8
9
  return {
9
10
  async eventstream({topics, signal, onEvent}) {
10
11
  const onAbortFns: (() => void)[] = [];
@@ -12,9 +13,16 @@ export function getEventsApi({
12
13
  for (const topic of topics) {
13
14
  // biome-ignore lint/suspicious/noExplicitAny: We need to use `any` type here
14
15
  const handler = (data: any): void => {
15
- // TODO: What happens if this handler throws? Does it break the other chain.emitter listeners?
16
-
17
- onEvent({type: topic, message: data});
16
+ try {
17
+ // TS only relates `{type, message}` to the `BeaconEvent` discriminated union while
18
+ // `EventType` stays within its ~25-member cap; without the cast, adding events trips TS2345.
19
+ onEvent({type: topic, message: data} as routes.events.BeaconEvent);
20
+ } catch (e) {
21
+ // `chain.emitter` emits synchronously, a throwing listener would propagate the error to
22
+ // whoever emitted the event, e.g. a gossip handler, and skip the remaining listeners.
23
+ // A single misbehaving event or client must not affect the node or other subscribers.
24
+ logger.warn("Error sending event to client", {topic}, e as Error);
25
+ }
18
26
  };
19
27
 
20
28
  chain.emitter.on(topic, handler);
@@ -147,7 +147,7 @@ export function getLodestarApi({
147
147
  },
148
148
 
149
149
  async dropStateCache() {
150
- chain.regen.dropCache();
150
+ await chain.regen.dropCache();
151
151
  },
152
152
 
153
153
  async connectPeer({peerId, multiaddrs}) {
@@ -104,6 +104,13 @@ export class RestApiServer {
104
104
 
105
105
  // To parse our ApiError -> statusCode
106
106
  server.setErrorHandler<FastifyError | Error>((err, _req, res) => {
107
+ if (res.raw.headersSent) {
108
+ // A status code can no longer be written, e.g. if a long-lived SSE stream failed mid-flight.
109
+ // End the response instead, else the socket is left open and the client never notices.
110
+ if (!res.raw.writableEnded && !res.raw.destroyed) res.raw.end();
111
+ return;
112
+ }
113
+
107
114
  const stacktraces = opts.stacktraces ? err.stack?.split("\n") : undefined;
108
115
  if ("validation" in err && err.validation) {
109
116
  const {instancePath = "unknown", message} = err.validation?.[0] ?? {};
@@ -192,7 +192,7 @@ export class ArchiveStore {
192
192
 
193
193
  private onCheckpoint = (): void => {
194
194
  const headStateRoot = this.chain.forkChoice.getHead().stateRoot;
195
- this.chain.regen.pruneOnCheckpoint(
195
+ this.chain.regen.onCheckpoint(
196
196
  this.chain.forkChoice.getFinalizedCheckpoint().epoch,
197
197
  this.chain.forkChoice.getJustifiedCheckpoint().epoch,
198
198
  headStateRoot
@@ -58,11 +58,12 @@ export type PayloadErrorType =
58
58
  };
59
59
 
60
60
  export class PayloadError extends Error {
61
- type: PayloadErrorType;
62
-
63
- constructor(type: PayloadErrorType, message?: string) {
61
+ constructor(
62
+ readonly payloadInput: PayloadEnvelopeInput,
63
+ readonly type: PayloadErrorType,
64
+ message?: string
65
+ ) {
64
66
  super(message ?? type.code);
65
- this.type = type;
66
67
  }
67
68
  }
68
69
 
@@ -125,7 +126,7 @@ export async function importExecutionPayload(
125
126
  // 2. Get ProtoBlock for parent root lookup
126
127
  const protoBlock = this.forkChoice.getBlockHexDefaultStatus(blockRootHex);
127
128
  if (!protoBlock) {
128
- throw new PayloadError({
129
+ throw new PayloadError(payloadInput, {
129
130
  code: PayloadErrorCode.BLOCK_NOT_IN_FORK_CHOICE,
130
131
  blockRootHex,
131
132
  });
@@ -140,13 +141,13 @@ export async function importExecutionPayload(
140
141
  );
141
142
 
142
143
  if (blockState == null) {
143
- throw new PayloadError({
144
+ throw new PayloadError(payloadInput, {
144
145
  code: PayloadErrorCode.MISS_BLOCK_STATE,
145
146
  blockRootHex: protoBlock.blockRoot,
146
147
  });
147
148
  }
148
149
  if (!isStatePostGloas(blockState)) {
149
- throw new PayloadError({
150
+ throw new PayloadError(payloadInput, {
150
151
  code: PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR,
151
152
  message: `Expected gloas+ state for payload import, got fork=${blockState.forkName}`,
152
153
  });
@@ -161,6 +162,7 @@ export async function importExecutionPayload(
161
162
  });
162
163
  } catch (e) {
163
164
  throw new PayloadError(
165
+ payloadInput,
164
166
  {
165
167
  code: PayloadErrorCode.ENVELOPE_VERIFICATION_ERROR,
166
168
  message: (e as Error).message,
@@ -184,7 +186,6 @@ export async function importExecutionPayload(
184
186
  : verifyExecutionPayloadEnvelopeSignature(
185
187
  this.config,
186
188
  blockState,
187
- this.pubkeyCache,
188
189
  signedEnvelope,
189
190
  payloadInput.proposerIndex,
190
191
  this.bls
@@ -193,7 +194,7 @@ export async function importExecutionPayload(
193
194
 
194
195
  // 4b. Check signature verification result
195
196
  if (!signatureValid) {
196
- throw new PayloadError({code: PayloadErrorCode.INVALID_SIGNATURE});
197
+ throw new PayloadError(payloadInput, {code: PayloadErrorCode.INVALID_SIGNATURE});
197
198
  }
198
199
 
199
200
  // 4c. Handle EL response
@@ -202,7 +203,7 @@ export async function importExecutionPayload(
202
203
  break;
203
204
 
204
205
  case ExecutionPayloadStatus.INVALID:
205
- throw new PayloadError({
206
+ throw new PayloadError(payloadInput, {
206
207
  code: PayloadErrorCode.EXECUTION_ENGINE_INVALID,
207
208
  execStatus: execResult.status,
208
209
  errorMessage: execResult.validationError ?? "",
@@ -215,7 +216,7 @@ export async function importExecutionPayload(
215
216
  case ExecutionPayloadStatus.INVALID_BLOCK_HASH:
216
217
  case ExecutionPayloadStatus.ELERROR:
217
218
  case ExecutionPayloadStatus.UNAVAILABLE:
218
- throw new PayloadError({
219
+ throw new PayloadError(payloadInput, {
219
220
  code: PayloadErrorCode.EXECUTION_ENGINE_ERROR,
220
221
  execStatus: execResult.status,
221
222
  errorMessage: execResult.validationError ?? "",
@@ -8,7 +8,7 @@ import {BlockError, BlockErrorCode, isBlockErrorAborted} from "../errors/index.j
8
8
  import {BlockProcessOpts} from "../options.js";
9
9
  import {IBlockInput} from "./blockInput/types.js";
10
10
  import {importBlock} from "./importBlock.js";
11
- import {importExecutionPayload} from "./importExecutionPayload.js";
11
+ import {PayloadError, importExecutionPayload} from "./importExecutionPayload.js";
12
12
  import {PayloadEnvelopeInput} from "./payloadEnvelopeInput/payloadEnvelopeInput.js";
13
13
  import {FullyVerifiedBlock, ImportBlockOpts} from "./types.js";
14
14
  import {assertLinearChainSegment} from "./utils/chainSegment.js";
@@ -164,13 +164,21 @@ export async function processBlocks(
164
164
  return; // Ignore
165
165
  }
166
166
 
167
- // above functions should only throw BlockError
168
- const err = getBlockError(e, blocks[0].getBlock());
167
+ // above functions should only throw BlockError, or PayloadError from the gloas payload import
168
+ const err = getBlockOrPayloadError(e, blocks[0].getBlock());
169
169
 
170
170
  // TODO: De-duplicate with logic above
171
171
  // ChainEvent.errorBlock
172
- if (!(err instanceof BlockError)) {
173
- this.logger.debug("Non BlockError received", {}, err);
172
+ if (!(err instanceof BlockError) && !(err instanceof PayloadError)) {
173
+ this.logger.debug("Neither BlockError nor PayloadError received", {}, err);
174
+ } else if (err instanceof PayloadError) {
175
+ if (!opts.disableOnBlockError) {
176
+ this.logger.debug(
177
+ "Payload error",
178
+ {slot: err.payloadInput.slot, blockRoot: err.payloadInput.blockRootHex},
179
+ err
180
+ );
181
+ }
174
182
  } else if (!opts.disableOnBlockError) {
175
183
  this.logger.debug("Block error", {slot: err.signedBlock.message.slot}, err);
176
184
 
@@ -201,11 +209,15 @@ export async function processBlocks(
201
209
  }
202
210
  }
203
211
 
204
- function getBlockError(e: unknown, block: SignedBeaconBlock): BlockError {
212
+ function getBlockOrPayloadError(e: unknown, block: SignedBeaconBlock): BlockError | PayloadError {
205
213
  if (e instanceof BlockError) {
206
214
  return e;
207
215
  }
208
216
 
217
+ if (e instanceof PayloadError) {
218
+ return e;
219
+ }
220
+
209
221
  if (e instanceof Error) {
210
222
  const blockError = new BlockError(block, {code: BlockErrorCode.BEACON_CHAIN_ERROR, error: e});
211
223
  blockError.stack = e.stack;
@@ -9,6 +9,7 @@ import {
9
9
  ColumnWithSource,
10
10
  CreateFromBidProps,
11
11
  CreateFromBlockProps,
12
+ PayloadEnvelopeInputSource,
12
13
  SourceMeta,
13
14
  } from "./types.js";
14
15
 
@@ -71,6 +72,7 @@ export class PayloadEnvelopeInput {
71
72
  readonly bid: gloas.ExecutionPayloadBid;
72
73
  readonly versionedHashes: VersionedHashes;
73
74
  readonly daOutOfRange: boolean;
75
+ readonly source: PayloadEnvelopeInputSource;
74
76
 
75
77
  private columnsCache = new Map<ColumnIndex, ColumnWithSource>();
76
78
 
@@ -95,6 +97,7 @@ export class PayloadEnvelopeInput {
95
97
  custodyColumns: ColumnIndex[];
96
98
  timeCreatedSec: number;
97
99
  daOutOfRange: boolean;
100
+ source: PayloadEnvelopeInputSource;
98
101
  }) {
99
102
  this.blockRootHex = props.blockRootHex;
100
103
  this.slot = props.slot;
@@ -106,6 +109,7 @@ export class PayloadEnvelopeInput {
106
109
  this.custodyColumns = props.custodyColumns;
107
110
  this.timeCreatedSec = props.timeCreatedSec;
108
111
  this.daOutOfRange = props.daOutOfRange;
112
+ this.source = props.source;
109
113
  this.payloadEnvelopeDataPromise = createPromise();
110
114
  this.allDataPromise = createPromise();
111
115
  this.columnsDataPromise = createPromise();
@@ -133,8 +137,9 @@ export class PayloadEnvelopeInput {
133
137
  bid,
134
138
  sampledColumns: props.sampledColumns,
135
139
  custodyColumns: props.custodyColumns,
136
- timeCreatedSec: props.timeCreatedSec,
140
+ timeCreatedSec: props.seenTimestampSec,
137
141
  daOutOfRange: props.daOutOfRange,
142
+ source: props.source,
138
143
  });
139
144
  }
140
145
 
@@ -153,8 +158,9 @@ export class PayloadEnvelopeInput {
153
158
  bid: props.bid,
154
159
  sampledColumns: props.sampledColumns,
155
160
  custodyColumns: props.custodyColumns,
156
- timeCreatedSec: props.timeCreatedSec,
161
+ timeCreatedSec: props.seenTimestampSec,
157
162
  daOutOfRange: props.daOutOfRange,
163
+ source: props.source,
158
164
  });
159
165
  }
160
166
 
@@ -7,9 +7,24 @@ export enum PayloadEnvelopeInputSource {
7
7
  engine = "engine",
8
8
  byRange = "req_resp_by_range",
9
9
  byRoot = "req_resp_by_root",
10
+ // Data-column reconstruction (KZG cell recovery), NOT a cache reload
10
11
  recovery = "recovery",
12
+ // Entry reconstructed from the hot DB by SeenPayloadEnvelopeInput.getOrReload
13
+ reload = "reload",
14
+ // Entry seeded from a checkpoint anchor state's latestExecutionPayloadBid at chain init
15
+ anchorState = "anchor_state",
11
16
  }
12
17
 
18
+ /**
19
+ * Reason a PayloadEnvelopeInput is evicted from SeenPayloadEnvelopeInput. Used for the `pruned` metric
20
+ * label and the eviction log.
21
+ * - belowParent: pruned below the new head's parent (canonical, FULL, all-columns)
22
+ * - finalized: below the finalized slot
23
+ * - prune: explicit prune by root
24
+ * - cap: insertion-order backstop cap (MAX_PAYLOAD_ENVELOPE_INPUT_CACHE_SIZE)
25
+ */
26
+ export type PayloadEnvelopeInputPruneReason = "belowParent" | "finalized" | "prune" | "cap";
27
+
13
28
  export type SourceMeta = {
14
29
  source: PayloadEnvelopeInputSource;
15
30
  seenTimestampSec: number;
@@ -20,13 +35,12 @@ export type ColumnWithSource = SourceMeta & {
20
35
  columnSidecar: gloas.DataColumnSidecar;
21
36
  };
22
37
 
23
- export type CreateFromBlockProps = {
38
+ export type CreateFromBlockProps = SourceMeta & {
24
39
  blockRootHex: RootHex;
25
40
  block: SignedBeaconBlock<ForkPostGloas>;
26
41
  forkName: ForkName;
27
42
  sampledColumns: ColumnIndex[];
28
43
  custodyColumns: ColumnIndex[];
29
- timeCreatedSec: number;
30
44
  daOutOfRange: boolean;
31
45
  };
32
46
 
@@ -35,7 +49,7 @@ export type CreateFromBlockProps = {
35
49
  * the chain from a checkpoint anchor state — we have the bid via the state but not the
36
50
  * full SignedBeaconBlock).
37
51
  */
38
- export type CreateFromBidProps = {
52
+ export type CreateFromBidProps = SourceMeta & {
39
53
  blockRootHex: RootHex;
40
54
  slot: number;
41
55
  forkName: ForkName;
@@ -43,7 +57,6 @@ export type CreateFromBidProps = {
43
57
  bid: gloas.ExecutionPayloadBid;
44
58
  sampledColumns: ColumnIndex[];
45
59
  custodyColumns: ColumnIndex[];
46
- timeCreatedSec: number;
47
60
  daOutOfRange: boolean;
48
61
  };
49
62
 
@@ -44,22 +44,31 @@ export async function verifyBlocksStateTransitionOnly(
44
44
  // STFN - per_slot_processing() + per_block_processing()
45
45
  // NOTE: `regen.getPreState()` should have dialed forward the state already caching checkpoint states
46
46
  const useBlsBatchVerify = !opts?.disableBlsBatchVerify;
47
- const postState = preState.stateTransition(
48
- block,
49
- {
50
- // NOTE: Assume valid for now while sending payload to execution engine in parallel
51
- // Latter verifyBlocksInEpoch() will make sure that payload is indeed valid
52
- executionPayloadStatus: ExecutionPayloadStatus.valid,
53
- dataAvailabilityStatus,
54
- // false because it's verified below with better error typing
55
- verifyStateRoot: false,
56
- // if block is trusted don't verify proposer or op signature
57
- verifyProposer: !useBlsBatchVerify && !validSignatures && !validProposerSignature,
58
- verifySignatures: !useBlsBatchVerify && !validSignatures,
59
- dontTransferCache: false,
60
- },
61
- {metrics, validatorMonitor}
62
- );
47
+ let postState: IBeaconStateView;
48
+ try {
49
+ postState = preState.stateTransition(
50
+ block,
51
+ {
52
+ // NOTE: Assume valid for now while sending payload to execution engine in parallel
53
+ // Latter verifyBlocksInEpoch() will make sure that payload is indeed valid
54
+ executionPayloadStatus: ExecutionPayloadStatus.valid,
55
+ dataAvailabilityStatus,
56
+ // false because it's verified below with better error typing
57
+ verifyStateRoot: false,
58
+ // if block is trusted don't verify proposer or op signature
59
+ verifyProposer: !useBlsBatchVerify && !validSignatures && !validProposerSignature,
60
+ verifySignatures: !useBlsBatchVerify && !validSignatures,
61
+ dontTransferCache: false,
62
+ },
63
+ {metrics, validatorMonitor}
64
+ );
65
+ } catch (e) {
66
+ throw new BlockError(block, {
67
+ code: BlockErrorCode.PER_BLOCK_PROCESSING_ERROR,
68
+ blockRoot: blocks[i].blockRootHex,
69
+ error: e as Error,
70
+ });
71
+ }
63
72
 
64
73
  const hashTreeRootTimer = metrics?.stateHashTreeRootTime.startTimer({
65
74
  source: StateHashTreeRootSource.blockTransition,
@@ -1,7 +1,6 @@
1
1
  import {BeaconConfig} from "@lodestar/config";
2
2
  import {
3
3
  type IBeaconStateViewGloas,
4
- type PubkeyCache,
5
4
  computeTimeAtSlot,
6
5
  getExecutionPayloadEnvelopeSignatureSet,
7
6
  } from "@lodestar/state-transition";
@@ -119,17 +118,10 @@ export function verifyExecutionPayloadEnvelope(
119
118
  export async function verifyExecutionPayloadEnvelopeSignature(
120
119
  config: BeaconConfig,
121
120
  state: IBeaconStateViewGloas,
122
- pubkeyCache: PubkeyCache,
123
121
  signedEnvelope: gloas.SignedExecutionPayloadEnvelope,
124
122
  proposerIndex: number,
125
123
  bls: IBlsVerifier
126
124
  ): Promise<boolean> {
127
- const signatureSet = getExecutionPayloadEnvelopeSignatureSet(
128
- config,
129
- pubkeyCache,
130
- state,
131
- signedEnvelope,
132
- proposerIndex
133
- );
125
+ const signatureSet = getExecutionPayloadEnvelopeSignatureSet(config, state, signedEnvelope, proposerIndex);
134
126
  return bls.verifySignatureSets([signatureSet]);
135
127
  }
@@ -1,4 +1,4 @@
1
- export type {IBlsVerifier} from "./interface.js";
1
+ export type {IBlsVerifier, SameMessageSignatureSet} from "./interface.js";
2
2
  export type {BlsMultiThreadWorkerPoolModules, JobQueueItemType} from "./multithread/index.js";
3
3
  export {BlsMultiThreadWorkerPool} from "./multithread/index.js";
4
4
  export {BlsSingleThreadVerifier} from "./singleThread.js";
@@ -1,6 +1,10 @@
1
- import {PublicKey} from "@chainsafe/blst";
2
1
  import {ISignatureSet} from "@lodestar/state-transition";
3
2
 
3
+ export type SameMessageSignatureSet = {
4
+ index: number;
5
+ signature: Uint8Array;
6
+ };
7
+
4
8
  export type VerifySignatureOpts = {
5
9
  /**
6
10
  * A batchable set MAY be verified with more sets to reduce the verification costs.
@@ -53,8 +57,8 @@ export interface IBlsVerifier {
53
57
  * - only support `batchable` option
54
58
  */
55
59
  verifySignatureSetsSameMessage(
56
- sets: {publicKey: PublicKey; signature: Uint8Array}[],
57
- messsage: Uint8Array,
60
+ sets: SameMessageSignatureSet[],
61
+ message: Uint8Array,
58
62
  opts?: Omit<VerifySignatureOpts, "verifyOnMainThread">
59
63
  ): Promise<boolean[]>;
60
64