@lodestar/beacon-node 1.43.0-dev.bc569affb9 → 1.43.0-dev.be5f70c0c8

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 (317) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +16 -5
  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 +45 -2
  6. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  7. package/lib/api/impl/debug/index.d.ts.map +1 -1
  8. package/lib/api/impl/debug/index.js +0 -1
  9. package/lib/api/impl/debug/index.js.map +1 -1
  10. package/lib/api/impl/lodestar/index.js +1 -1
  11. package/lib/api/impl/lodestar/index.js.map +1 -1
  12. package/lib/api/impl/validator/index.d.ts.map +1 -1
  13. package/lib/api/impl/validator/index.js +68 -2
  14. package/lib/api/impl/validator/index.js.map +1 -1
  15. package/lib/chain/blocks/blockInput/blockInput.d.ts +3 -0
  16. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  17. package/lib/chain/blocks/blockInput/blockInput.js +4 -1
  18. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  19. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  20. package/lib/chain/blocks/importBlock.js +16 -28
  21. package/lib/chain/blocks/importBlock.js.map +1 -1
  22. package/lib/chain/blocks/importExecutionPayload.d.ts +23 -6
  23. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  24. package/lib/chain/blocks/importExecutionPayload.js +57 -24
  25. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  26. package/lib/chain/blocks/index.d.ts +5 -3
  27. package/lib/chain/blocks/index.d.ts.map +1 -1
  28. package/lib/chain/blocks/index.js +58 -25
  29. package/lib/chain/blocks/index.js.map +1 -1
  30. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +12 -1
  31. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  32. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +28 -2
  33. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  34. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +17 -0
  35. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  36. package/lib/chain/blocks/payloadEnvelopeProcessor.js +2 -2
  37. package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
  38. package/lib/chain/blocks/types.d.ts +4 -3
  39. package/lib/chain/blocks/types.d.ts.map +1 -1
  40. package/lib/chain/blocks/utils/chainSegment.d.ts +23 -2
  41. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  42. package/lib/chain/blocks/utils/chainSegment.js +89 -12
  43. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  44. package/lib/chain/blocks/verifyBlock.d.ts +5 -3
  45. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  46. package/lib/chain/blocks/verifyBlock.js +50 -7
  47. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  48. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +0 -4
  49. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  50. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -2
  51. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  52. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +2 -1
  53. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  54. package/lib/chain/blocks/verifyBlocksSanityChecks.js +25 -5
  55. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  56. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +2 -2
  57. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
  58. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +12 -8
  59. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
  60. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  61. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +8 -3
  62. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  63. package/lib/chain/chain.d.ts +3 -2
  64. package/lib/chain/chain.d.ts.map +1 -1
  65. package/lib/chain/chain.js +35 -12
  66. package/lib/chain/chain.js.map +1 -1
  67. package/lib/chain/emitter.d.ts +0 -11
  68. package/lib/chain/emitter.d.ts.map +1 -1
  69. package/lib/chain/emitter.js +0 -4
  70. package/lib/chain/emitter.js.map +1 -1
  71. package/lib/chain/errors/blockError.d.ts +8 -1
  72. package/lib/chain/errors/blockError.d.ts.map +1 -1
  73. package/lib/chain/errors/blockError.js +2 -0
  74. package/lib/chain/errors/blockError.js.map +1 -1
  75. package/lib/chain/errors/index.d.ts +1 -0
  76. package/lib/chain/errors/index.d.ts.map +1 -1
  77. package/lib/chain/errors/index.js +1 -0
  78. package/lib/chain/errors/index.js.map +1 -1
  79. package/lib/chain/errors/proposerPreferences.d.ts +40 -0
  80. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -0
  81. package/lib/chain/errors/proposerPreferences.js +14 -0
  82. package/lib/chain/errors/proposerPreferences.js.map +1 -0
  83. package/lib/chain/initState.d.ts.map +1 -1
  84. package/lib/chain/initState.js +6 -1
  85. package/lib/chain/initState.js.map +1 -1
  86. package/lib/chain/interface.d.ts +3 -2
  87. package/lib/chain/interface.d.ts.map +1 -1
  88. package/lib/chain/interface.js.map +1 -1
  89. package/lib/chain/opPools/payloadAttestationPool.d.ts +3 -2
  90. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  91. package/lib/chain/opPools/payloadAttestationPool.js +26 -4
  92. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  93. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  94. package/lib/chain/prepareNextSlot.js +16 -18
  95. package/lib/chain/prepareNextSlot.js.map +1 -1
  96. package/lib/chain/produceBlock/produceBlockBody.d.ts +12 -3
  97. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  98. package/lib/chain/produceBlock/produceBlockBody.js +35 -17
  99. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  100. package/lib/chain/regen/interface.d.ts +1 -0
  101. package/lib/chain/regen/interface.d.ts.map +1 -1
  102. package/lib/chain/regen/interface.js +1 -0
  103. package/lib/chain/regen/interface.js.map +1 -1
  104. package/lib/chain/regen/queued.d.ts.map +1 -1
  105. package/lib/chain/regen/queued.js +1 -4
  106. package/lib/chain/regen/queued.js.map +1 -1
  107. package/lib/chain/regen/regen.d.ts.map +1 -1
  108. package/lib/chain/regen/regen.js +1 -4
  109. package/lib/chain/regen/regen.js.map +1 -1
  110. package/lib/chain/seenCache/index.d.ts +1 -0
  111. package/lib/chain/seenCache/index.d.ts.map +1 -1
  112. package/lib/chain/seenCache/index.js +1 -0
  113. package/lib/chain/seenCache/index.js.map +1 -1
  114. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +21 -11
  115. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  116. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +70 -20
  117. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  118. package/lib/chain/seenCache/seenProposerPreferences.d.ts +16 -0
  119. package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -0
  120. package/lib/chain/seenCache/seenProposerPreferences.js +26 -0
  121. package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -0
  122. package/lib/chain/validation/block.d.ts.map +1 -1
  123. package/lib/chain/validation/block.js +1 -0
  124. package/lib/chain/validation/block.js.map +1 -1
  125. package/lib/chain/validation/executionPayloadBid.js +11 -8
  126. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  127. package/lib/chain/validation/proposerPreferences.d.ts +8 -0
  128. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -0
  129. package/lib/chain/validation/proposerPreferences.js +91 -0
  130. package/lib/chain/validation/proposerPreferences.js.map +1 -0
  131. package/lib/metrics/metrics/lodestar.d.ts +1 -0
  132. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  133. package/lib/metrics/metrics/lodestar.js +4 -0
  134. package/lib/metrics/metrics/lodestar.js.map +1 -1
  135. package/lib/network/gossip/interface.d.ts +7 -1
  136. package/lib/network/gossip/interface.d.ts.map +1 -1
  137. package/lib/network/gossip/interface.js +1 -0
  138. package/lib/network/gossip/interface.js.map +1 -1
  139. package/lib/network/gossip/scoringParameters.d.ts.map +1 -1
  140. package/lib/network/gossip/scoringParameters.js +12 -1
  141. package/lib/network/gossip/scoringParameters.js.map +1 -1
  142. package/lib/network/gossip/topic.d.ts +29 -766
  143. package/lib/network/gossip/topic.d.ts.map +1 -1
  144. package/lib/network/gossip/topic.js +6 -0
  145. package/lib/network/gossip/topic.js.map +1 -1
  146. package/lib/network/interface.d.ts +2 -0
  147. package/lib/network/interface.d.ts.map +1 -1
  148. package/lib/network/network.d.ts +2 -0
  149. package/lib/network/network.d.ts.map +1 -1
  150. package/lib/network/network.js +8 -0
  151. package/lib/network/network.js.map +1 -1
  152. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  153. package/lib/network/processor/gossipHandlers.js +38 -16
  154. package/lib/network/processor/gossipHandlers.js.map +1 -1
  155. package/lib/network/processor/gossipQueues/index.d.ts.map +1 -1
  156. package/lib/network/processor/gossipQueues/index.js +5 -0
  157. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  158. package/lib/network/processor/index.d.ts.map +1 -1
  159. package/lib/network/processor/index.js +6 -5
  160. package/lib/network/processor/index.js.map +1 -1
  161. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  162. package/lib/network/reqresp/ReqRespBeaconNode.js +1 -1
  163. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  164. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts +9 -0
  165. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts.map +1 -0
  166. package/lib/network/reqresp/handlers/beaconBlocksByHead.js +61 -0
  167. package/lib/network/reqresp/handlers/beaconBlocksByHead.js.map +1 -0
  168. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts.map +1 -1
  169. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +14 -6
  170. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  171. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts.map +1 -1
  172. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +11 -5
  173. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  174. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts.map +1 -1
  175. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +17 -5
  176. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  177. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.d.ts.map +1 -1
  178. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js +7 -4
  179. package/lib/network/reqresp/handlers/executionPayloadEnvelopesByRange.js.map +1 -1
  180. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  181. package/lib/network/reqresp/handlers/index.js +5 -0
  182. package/lib/network/reqresp/handlers/index.js.map +1 -1
  183. package/lib/network/reqresp/interface.d.ts +1 -1
  184. package/lib/network/reqresp/interface.js +1 -1
  185. package/lib/network/reqresp/protocols.d.ts +1 -0
  186. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  187. package/lib/network/reqresp/protocols.js +5 -0
  188. package/lib/network/reqresp/protocols.js.map +1 -1
  189. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  190. package/lib/network/reqresp/rateLimit.js +4 -0
  191. package/lib/network/reqresp/rateLimit.js.map +1 -1
  192. package/lib/network/reqresp/score.d.ts.map +1 -1
  193. package/lib/network/reqresp/score.js +1 -0
  194. package/lib/network/reqresp/score.js.map +1 -1
  195. package/lib/network/reqresp/types.d.ts +3 -0
  196. package/lib/network/reqresp/types.d.ts.map +1 -1
  197. package/lib/network/reqresp/types.js +3 -0
  198. package/lib/network/reqresp/types.js.map +1 -1
  199. package/lib/node/nodejs.js +2 -2
  200. package/lib/node/nodejs.js.map +1 -1
  201. package/lib/sync/constants.d.ts +7 -1
  202. package/lib/sync/constants.d.ts.map +1 -1
  203. package/lib/sync/constants.js +7 -4
  204. package/lib/sync/constants.js.map +1 -1
  205. package/lib/sync/range/batch.d.ts +35 -5
  206. package/lib/sync/range/batch.d.ts.map +1 -1
  207. package/lib/sync/range/batch.js +240 -59
  208. package/lib/sync/range/batch.js.map +1 -1
  209. package/lib/sync/range/chain.d.ts +22 -4
  210. package/lib/sync/range/chain.d.ts.map +1 -1
  211. package/lib/sync/range/chain.js +100 -10
  212. package/lib/sync/range/chain.js.map +1 -1
  213. package/lib/sync/range/range.d.ts.map +1 -1
  214. package/lib/sync/range/range.js +31 -9
  215. package/lib/sync/range/range.js.map +1 -1
  216. package/lib/sync/sync.d.ts.map +1 -1
  217. package/lib/sync/sync.js +13 -0
  218. package/lib/sync/sync.js.map +1 -1
  219. package/lib/sync/types.d.ts +34 -0
  220. package/lib/sync/types.d.ts.map +1 -1
  221. package/lib/sync/types.js +34 -0
  222. package/lib/sync/types.js.map +1 -1
  223. package/lib/sync/unknownBlock.d.ts +29 -1
  224. package/lib/sync/unknownBlock.d.ts.map +1 -1
  225. package/lib/sync/unknownBlock.js +727 -61
  226. package/lib/sync/unknownBlock.js.map +1 -1
  227. package/lib/sync/utils/downloadByRange.d.ts +67 -10
  228. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  229. package/lib/sync/utils/downloadByRange.js +211 -26
  230. package/lib/sync/utils/downloadByRange.js.map +1 -1
  231. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  232. package/lib/sync/utils/downloadByRoot.js +16 -2
  233. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  234. package/lib/sync/utils/pendingBlocksTree.d.ts +0 -1
  235. package/lib/sync/utils/pendingBlocksTree.d.ts.map +1 -1
  236. package/lib/sync/utils/pendingBlocksTree.js +0 -9
  237. package/lib/sync/utils/pendingBlocksTree.js.map +1 -1
  238. package/lib/sync/utils/rateLimit.d.ts +2 -0
  239. package/lib/sync/utils/rateLimit.d.ts.map +1 -0
  240. package/lib/sync/utils/rateLimit.js +15 -0
  241. package/lib/sync/utils/rateLimit.js.map +1 -0
  242. package/lib/util/sszBytes.d.ts.map +1 -1
  243. package/lib/util/sszBytes.js +8 -6
  244. package/lib/util/sszBytes.js.map +1 -1
  245. package/package.json +16 -16
  246. package/src/api/impl/beacon/blocks/index.ts +21 -5
  247. package/src/api/impl/beacon/pool/index.ts +83 -1
  248. package/src/api/impl/debug/index.ts +0 -1
  249. package/src/api/impl/lodestar/index.ts +1 -1
  250. package/src/api/impl/validator/index.ts +82 -1
  251. package/src/chain/blocks/blockInput/blockInput.ts +4 -1
  252. package/src/chain/blocks/importBlock.ts +16 -48
  253. package/src/chain/blocks/importExecutionPayload.ts +76 -30
  254. package/src/chain/blocks/index.ts +71 -22
  255. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +37 -3
  256. package/src/chain/blocks/payloadEnvelopeInput/types.ts +18 -0
  257. package/src/chain/blocks/payloadEnvelopeProcessor.ts +2 -2
  258. package/src/chain/blocks/types.ts +4 -3
  259. package/src/chain/blocks/utils/chainSegment.ts +114 -17
  260. package/src/chain/blocks/verifyBlock.ts +70 -9
  261. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +6 -4
  262. package/src/chain/blocks/verifyBlocksSanityChecks.ts +26 -7
  263. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +16 -8
  264. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +7 -4
  265. package/src/chain/chain.ts +43 -10
  266. package/src/chain/emitter.ts +0 -11
  267. package/src/chain/errors/blockError.ts +4 -1
  268. package/src/chain/errors/index.ts +1 -0
  269. package/src/chain/errors/proposerPreferences.ts +47 -0
  270. package/src/chain/initState.ts +9 -1
  271. package/src/chain/interface.ts +7 -1
  272. package/src/chain/opPools/payloadAttestationPool.ts +29 -8
  273. package/src/chain/prepareNextSlot.ts +21 -29
  274. package/src/chain/produceBlock/produceBlockBody.ts +46 -22
  275. package/src/chain/regen/interface.ts +1 -0
  276. package/src/chain/regen/queued.ts +2 -7
  277. package/src/chain/regen/regen.ts +2 -7
  278. package/src/chain/seenCache/index.ts +1 -0
  279. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +90 -24
  280. package/src/chain/seenCache/seenProposerPreferences.ts +32 -0
  281. package/src/chain/validation/block.ts +1 -0
  282. package/src/chain/validation/executionPayloadBid.ts +11 -8
  283. package/src/chain/validation/proposerPreferences.ts +110 -0
  284. package/src/metrics/metrics/lodestar.ts +4 -0
  285. package/src/network/gossip/interface.ts +6 -0
  286. package/src/network/gossip/scoringParameters.ts +14 -1
  287. package/src/network/gossip/topic.ts +6 -0
  288. package/src/network/interface.ts +2 -0
  289. package/src/network/network.ts +23 -0
  290. package/src/network/processor/gossipHandlers.ts +53 -17
  291. package/src/network/processor/gossipQueues/index.ts +5 -0
  292. package/src/network/processor/index.ts +6 -5
  293. package/src/network/reqresp/ReqRespBeaconNode.ts +1 -0
  294. package/src/network/reqresp/handlers/beaconBlocksByHead.ts +91 -0
  295. package/src/network/reqresp/handlers/beaconBlocksByRange.ts +14 -6
  296. package/src/network/reqresp/handlers/blobSidecarsByRange.ts +11 -5
  297. package/src/network/reqresp/handlers/dataColumnSidecarsByRange.ts +17 -5
  298. package/src/network/reqresp/handlers/executionPayloadEnvelopesByRange.ts +7 -4
  299. package/src/network/reqresp/handlers/index.ts +5 -0
  300. package/src/network/reqresp/interface.ts +1 -1
  301. package/src/network/reqresp/protocols.ts +6 -0
  302. package/src/network/reqresp/rateLimit.ts +4 -0
  303. package/src/network/reqresp/score.ts +1 -0
  304. package/src/network/reqresp/types.ts +5 -0
  305. package/src/node/nodejs.ts +2 -2
  306. package/src/sync/constants.ts +8 -4
  307. package/src/sync/range/batch.ts +320 -67
  308. package/src/sync/range/chain.ts +128 -13
  309. package/src/sync/range/range.ts +34 -9
  310. package/src/sync/sync.ts +13 -1
  311. package/src/sync/types.ts +72 -0
  312. package/src/sync/unknownBlock.ts +915 -65
  313. package/src/sync/utils/downloadByRange.ts +378 -39
  314. package/src/sync/utils/downloadByRoot.ts +24 -2
  315. package/src/sync/utils/pendingBlocksTree.ts +0 -15
  316. package/src/sync/utils/rateLimit.ts +16 -0
  317. package/src/util/sszBytes.ts +8 -6
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/sync/constants.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,8FAA8F;AAC9F,eAAO,MAAM,oCAAoC,KAAK,CAAC;AAEvD,2EAA2E;AAI3E,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C;;;;;IAKI;AACJ,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,4CAA4C;AAC5C,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,QAAmC,CAAC;AAElE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,IAAI,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/sync/constants.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,8FAA8F;AAC9F,eAAO,MAAM,oCAAoC,KAAK,CAAC;AAEvD,2EAA2E;AAC3E,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,OAAQ,CAAC;AAElD;;;;;IAKI;AACJ,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,4CAA4C;AAC5C,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,QAAmC,CAAC;AAElE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,IAAI,CAAC"}
@@ -3,10 +3,13 @@ export const PARALLEL_HEAD_CHAINS = 2;
3
3
  /** Minimum work we require a finalized chain to do before picking a chain with more peers. */
4
4
  export const MIN_FINALIZED_CHAIN_VALIDATED_EPOCHS = 10;
5
5
  /** The number of times to retry a batch before it is considered failed. */
6
- // export const MAX_BATCH_DOWNLOAD_ATTEMPTS = 5;
7
- // this constant is increased a lot for peerDAS because we may have many failed download due to rate limit not implemented yet
8
- // TODO: change it back to 5 when this issue is implemented https://github.com/ChainSafe/lodestar/issues/8033
9
- export const MAX_BATCH_DOWNLOAD_ATTEMPTS = 20;
6
+ export const MAX_BATCH_DOWNLOAD_ATTEMPTS = 5;
7
+ /**
8
+ * Backoff before assigning more range-sync batches to a peer that rate-limited us.
9
+ *
10
+ * Note: this is used when rate limited due to MAX_CONCURRENT_REQUESTS
11
+ */
12
+ export const RATE_LIMITED_PEER_BACKOFF_MS = 5_000;
10
13
  /**
11
14
  * Consider batch faulty after downloading and processing this number of times
12
15
  * as in https://github.com/ChainSafe/lodestar/issues/8147 we cannot proceed the sync chain if there is unknown parent
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/sync/constants.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,8FAA8F;AAC9F,MAAM,CAAC,MAAM,oCAAoC,GAAG,EAAE,CAAC;AAEvD,2EAA2E;AAC3E,gDAAgD;AAChD,8HAA8H;AAC9H,6GAA6G;AAC7G,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAE9C;;;;;IAKI;AACJ,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,4CAA4C;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,CAAC;AAE5C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,gBAAgB,CAAC,CAAC;AAElE;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/sync/constants.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,8FAA8F;AAC9F,MAAM,CAAC,MAAM,oCAAoC,GAAG,EAAE,CAAC;AAEvD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAElD;;;;;IAKI;AACJ,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,4CAA4C;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,CAAC;AAE5C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,gBAAgB,CAAC,CAAC;AAElE;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC"}
@@ -1,13 +1,14 @@
1
1
  import { ChainForkConfig } from "@lodestar/config";
2
2
  import { ForkName } from "@lodestar/params";
3
- import { Epoch, RootHex, Slot } from "@lodestar/types";
3
+ import { Epoch, RootHex, Slot, gloas } from "@lodestar/types";
4
4
  import { LodestarError } from "@lodestar/utils";
5
5
  import { IBlockInput } from "../../chain/blocks/blockInput/types.js";
6
+ import { PayloadEnvelopeInput } from "../../chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js";
6
7
  import { PeerSyncMeta } from "../../network/peers/peersData.js";
7
8
  import { IClock } from "../../util/clock.js";
8
9
  import { CustodyConfig } from "../../util/dataColumns.js";
9
10
  import { PeerIdStr } from "../../util/peerId.js";
10
- import { DownloadByRangeRequests } from "../utils/downloadByRange.js";
11
+ import { DownloadByRangeRequests, ParentPayloadCommitments } from "../utils/downloadByRange.js";
11
12
  /**
12
13
  * Current state of a batch
13
14
  */
@@ -38,27 +39,42 @@ export type Attempt = {
38
39
  export type AwaitingDownloadState = {
39
40
  status: BatchStatus.AwaitingDownload;
40
41
  blocks: IBlockInput[];
42
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null;
41
43
  };
42
44
  export type DownloadSuccessState = {
43
45
  status: BatchStatus.AwaitingProcessing;
44
46
  blocks: IBlockInput[];
47
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null;
45
48
  };
46
49
  export type BatchState = AwaitingDownloadState | {
47
50
  status: BatchStatus.Downloading;
48
51
  peer: PeerIdStr;
49
52
  blocks: IBlockInput[];
53
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null;
50
54
  } | DownloadSuccessState | {
51
55
  status: BatchStatus.Processing;
52
56
  blocks: IBlockInput[];
57
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null;
53
58
  attempt: Attempt;
54
59
  } | {
55
60
  status: BatchStatus.AwaitingValidation;
56
61
  blocks: IBlockInput[];
62
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null;
57
63
  attempt: Attempt;
58
64
  };
59
65
  export type BatchMetadata = {
60
66
  startEpoch: Epoch;
67
+ startSlot: Slot;
68
+ count: number;
61
69
  status: BatchStatus;
70
+ blocksReq?: string;
71
+ blobsReq?: string;
72
+ columnsReq?: string;
73
+ envelopesReq?: string;
74
+ downloadAttempts: number;
75
+ processingAttempts: number;
76
+ failedDownloadPeers?: string;
77
+ failedProcessingPeers?: string;
62
78
  };
63
79
  /**
64
80
  * Batches are downloaded at the first block of the epoch.
@@ -91,7 +107,11 @@ export declare class Batch {
91
107
  private readonly config;
92
108
  private readonly clock;
93
109
  private readonly custodyConfig;
94
- constructor(startEpoch: Epoch, config: ChainForkConfig, clock: IClock, custodyConfig: CustodyConfig);
110
+ private readonly isFirstBatchInChain;
111
+ private readonly latestBid;
112
+ constructor(startEpoch: Epoch, config: ChainForkConfig, clock: IClock, custodyConfig: CustodyConfig, isFirstBatchInChain: boolean, latestBid: gloas.ExecutionPayloadBid | undefined, targetSlot: Slot);
113
+ private shouldDownloadParentEnvelope;
114
+ getParentPayloadCommitments(parentBlockRoot: Uint8Array): ParentPayloadCommitments;
95
115
  /**
96
116
  * Builds ByRange requests for block, blobs and columns
97
117
  */
@@ -106,6 +126,7 @@ export declare class Batch {
106
126
  getFailedPeers(): PeerIdStr[];
107
127
  getMetadata(): BatchMetadata;
108
128
  getBlocks(): IBlockInput[];
129
+ getPayloadEnvelopes(): Map<Slot, PayloadEnvelopeInput> | null;
109
130
  /**
110
131
  * AwaitingDownload -> Downloading
111
132
  */
@@ -113,15 +134,24 @@ export declare class Batch {
113
134
  /**
114
135
  * Downloading -> AwaitingProcessing
115
136
  */
116
- downloadingSuccess(peer: PeerIdStr, blocks: IBlockInput[]): DownloadSuccessState;
137
+ downloadingSuccess(peer: PeerIdStr, blocks: IBlockInput[], payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null): DownloadSuccessState;
117
138
  /**
118
139
  * Downloading -> AwaitingDownload
119
140
  */
120
141
  downloadingError(peer: PeerIdStr): void;
142
+ /**
143
+ * Downloading -> AwaitingDownload (without counting as a failed attempt).
144
+ * Used when the peer rate-limited us — the request was never actually served.
145
+ */
146
+ downloadingRateLimited(): void;
121
147
  /**
122
148
  * AwaitingProcessing -> Processing
123
149
  */
124
- startProcessing(): IBlockInput[];
150
+ startProcessing(): {
151
+ blocks: IBlockInput[];
152
+ payloadEnvelopes: Map<Slot, PayloadEnvelopeInput> | null;
153
+ peers: PeerIdStr[];
154
+ };
125
155
  /**
126
156
  * Processing -> AwaitingValidation
127
157
  */
@@ -1 +1 @@
1
- {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../src/sync/range/batch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../src/sync/range/batch.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- import { isForkPostDeneb, isForkPostFulu } from "@lodestar/params";
2
- import { LodestarError } from "@lodestar/utils";
1
+ import { isForkPostDeneb, isForkPostFulu, isForkPostGloas } from "@lodestar/params";
2
+ import { LodestarError, byteArrayEquals, prettyPrintIndices, toRootHex } from "@lodestar/utils";
3
3
  import { isBlockInputColumns } from "../../chain/blocks/blockInput/blockInput.js";
4
4
  import { isDaOutOfRange } from "../../chain/blocks/blockInput/utils.js";
5
5
  import { BlockError, BlockErrorCode } from "../../chain/errors/index.js";
6
+ import { ZERO_HASH } from "../../constants/constants.js";
6
7
  import { MAX_BATCH_DOWNLOAD_ATTEMPTS, MAX_BATCH_PROCESSING_ATTEMPTS } from "../constants.js";
7
8
  import { getBatchSlotRange, hashBlocks } from "./utils/index.js";
8
9
  export { BatchStatus };
@@ -28,6 +29,12 @@ var BatchStatus;
28
29
  */
29
30
  BatchStatus["AwaitingValidation"] = "AwaitingValidation";
30
31
  })(BatchStatus || (BatchStatus = {}));
32
+ function formatRangeReq(req) {
33
+ return `startSlot=${req.startSlot},count=${req.count}`;
34
+ }
35
+ function formatColumnsReq(req) {
36
+ return `startSlot=${req.startSlot},count=${req.count},cols=${prettyPrintIndices(req.columns)}`;
37
+ }
31
38
  /**
32
39
  * Batches are downloaded at the first block of the epoch.
33
40
  *
@@ -47,7 +54,7 @@ export class Batch {
47
54
  /** Block, blob and column requests that are used to determine the best peer and are used in downloadByRange */
48
55
  requests;
49
56
  /** State of the batch. */
50
- state = { status: BatchStatus.AwaitingDownload, blocks: [] };
57
+ state = { status: BatchStatus.AwaitingDownload, blocks: [], payloadEnvelopes: null };
51
58
  /** Peers that provided good data */
52
59
  goodPeers = [];
53
60
  /** The `Attempts` that have been made and failed to send us this batch. */
@@ -59,7 +66,9 @@ export class Batch {
59
66
  config;
60
67
  clock;
61
68
  custodyConfig;
62
- constructor(startEpoch, config, clock, custodyConfig) {
69
+ isFirstBatchInChain;
70
+ latestBid;
71
+ constructor(startEpoch, config, clock, custodyConfig, isFirstBatchInChain, latestBid, targetSlot) {
63
72
  this.config = config;
64
73
  this.clock = clock;
65
74
  this.custodyConfig = custodyConfig;
@@ -67,9 +76,36 @@ export class Batch {
67
76
  this.forkName = this.config.getForkName(startSlot);
68
77
  this.startEpoch = startEpoch;
69
78
  this.startSlot = startSlot;
70
- this.count = count;
79
+ this.count = Math.min(count, targetSlot - startSlot + 1);
80
+ this.isFirstBatchInChain = isFirstBatchInChain;
81
+ this.latestBid = latestBid;
71
82
  this.requests = this.getRequests([]);
72
83
  }
84
+ shouldDownloadParentEnvelope(firstBlock) {
85
+ if (!this.isFirstBatchInChain)
86
+ return false;
87
+ if (this.startSlot === 0 || !isForkPostGloas(this.config.getForkName(this.startSlot - 1))) {
88
+ return false;
89
+ }
90
+ // we only know if we should download parent envelope if firstBlock is downloaded
91
+ if (firstBlock === undefined)
92
+ return false;
93
+ if (this.latestBid === undefined)
94
+ return false;
95
+ const firstBlockBidParentHash = firstBlock.message.body.signedExecutionPayloadBid.message
96
+ .parentBlockHash;
97
+ return byteArrayEquals(firstBlockBidParentHash, this.latestBid.blockHash);
98
+ }
99
+ getParentPayloadCommitments(parentBlockRoot) {
100
+ if (this.latestBid === undefined) {
101
+ throw new Error(`Coding error: getParentPayloadCommitments called without latestBid for parentBlockRoot=${toRootHex(parentBlockRoot)}`);
102
+ }
103
+ return {
104
+ blockRoot: parentBlockRoot,
105
+ blockRootHex: toRootHex(parentBlockRoot),
106
+ kzgCommitments: this.latestBid.blobKzgCommitments,
107
+ };
108
+ }
73
109
  /**
74
110
  * Builds ByRange requests for block, blobs and columns
75
111
  */
@@ -82,35 +118,32 @@ export class Batch {
82
118
  count: this.count,
83
119
  step: 1,
84
120
  };
121
+ const requests = { blocksRequest };
122
+ // Post-Gloas envelopes are required for block processing, independent of DA retention window.
123
+ if (isForkPostGloas(this.forkName)) {
124
+ requests.envelopesRequest = { startSlot: this.startSlot, count: this.count };
125
+ }
85
126
  if (isForkPostFulu(this.forkName) && withinValidRequestWindow) {
86
- return {
87
- blocksRequest,
88
- columnsRequest: {
89
- startSlot: this.startSlot,
90
- count: this.count,
91
- columns: this.custodyConfig.sampledColumns,
92
- },
127
+ requests.columnsRequest = {
128
+ startSlot: this.startSlot,
129
+ count: this.count,
130
+ columns: this.custodyConfig.sampledColumns,
93
131
  };
94
132
  }
95
- if (isForkPostDeneb(this.forkName) && withinValidRequestWindow) {
96
- return {
97
- blocksRequest,
98
- blobsRequest: {
99
- startSlot: this.startSlot,
100
- count: this.count,
101
- },
102
- };
133
+ else if (isForkPostDeneb(this.forkName) && withinValidRequestWindow) {
134
+ requests.blobsRequest = { startSlot: this.startSlot, count: this.count };
103
135
  }
104
- return {
105
- blocksRequest,
106
- };
136
+ return requests;
107
137
  }
108
138
  // subsequent request where part of the epoch has already been downloaded. Need to figure out what is the beginning
109
139
  // of the range where download needs to resume
110
140
  let blockStartSlot = this.startSlot;
111
141
  let dataStartSlot = this.startSlot;
142
+ let envelopeStartSlot = this.startSlot;
112
143
  const neededColumns = new Set();
144
+ const envelopesBySlot = this.state.payloadEnvelopes ?? new Map();
113
145
  // ensure blocks are in slot-wise order
146
+ const isPostGloas = isForkPostGloas(this.forkName);
114
147
  for (const blockInput of blocks) {
115
148
  const blockSlot = blockInput.slot;
116
149
  // check if block/data is present (hasBlock/hasAllData). If present then check if startSlot is the same as
@@ -126,15 +159,38 @@ export class Batch {
126
159
  if (blockInput.hasBlock() && blockStartSlot === blockSlot) {
127
160
  blockStartSlot = blockSlot + 1;
128
161
  }
129
- if (!blockInput.hasAllData()) {
130
- if (isBlockInputColumns(blockInput)) {
131
- for (const index of blockInput.getMissingSampledColumnMeta().missing) {
162
+ // Range sync uses hasComputedAllData (all sampled columns physically present), not hasAllData
163
+ // which flips at the reconstruction threshold. Sync never triggers reconstruction, so accepting
164
+ // a half-downloaded block here makes writeBlockInputToDb later block on waitForComputedAllData.
165
+ if (isPostGloas) {
166
+ // Post-Gloas: column data lives on PayloadEnvelopeInput, not on BlockInputNoData.
167
+ const payloadInput = envelopesBySlot.get(blockSlot);
168
+ if (blockInput.hasBlock() && envelopeStartSlot === blockSlot && payloadInput?.hasPayloadEnvelope()) {
169
+ envelopeStartSlot = blockSlot + 1;
170
+ }
171
+ if (payloadInput && !payloadInput.hasComputedAllData()) {
172
+ for (const index of payloadInput.getMissingSampledColumnMeta().missing) {
132
173
  neededColumns.add(index);
133
174
  }
134
175
  }
176
+ else if (payloadInput?.hasComputedAllData() && dataStartSlot === blockSlot) {
177
+ // Only advance dataStartSlot when we know columns for this slot are complete. If
178
+ // payloadInput is missing entirely we cannot tell, so stop here so the next round
179
+ // re-requests columns (and envelopes) starting at this slot.
180
+ dataStartSlot = blockSlot + 1;
181
+ }
135
182
  }
136
- else if (dataStartSlot === blockSlot) {
137
- dataStartSlot = blockSlot + 1;
183
+ else {
184
+ if (isBlockInputColumns(blockInput) ? !blockInput.hasComputedAllData() : !blockInput.hasAllData()) {
185
+ if (isBlockInputColumns(blockInput)) {
186
+ for (const index of blockInput.getMissingSampledColumnMeta().missing) {
187
+ neededColumns.add(index);
188
+ }
189
+ }
190
+ }
191
+ else if (dataStartSlot === blockSlot) {
192
+ dataStartSlot = blockSlot + 1;
193
+ }
138
194
  }
139
195
  }
140
196
  // if the blockStartSlot or dataStartSlot is after the desired endSlot then no request will be made for the batch
@@ -153,11 +209,15 @@ export class Batch {
153
209
  // range of 40 - 63, startSlot will be inclusive but subtraction will exclusive so need to + 1
154
210
  const count = endSlot - dataStartSlot + 1;
155
211
  if (isForkPostFulu(this.forkName) && withinValidRequestWindow) {
156
- requests.columnsRequest = {
157
- count,
158
- startSlot: dataStartSlot,
159
- columns: Array.from(neededColumns),
160
- };
212
+ // Skip the column re-request when we have no specific column indices outstanding.
213
+ // Peer rejects an empty `columns` list
214
+ if (neededColumns.size > 0) {
215
+ requests.columnsRequest = {
216
+ count,
217
+ startSlot: dataStartSlot,
218
+ columns: Array.from(neededColumns),
219
+ };
220
+ }
161
221
  }
162
222
  else if (isForkPostDeneb(this.forkName) && withinValidRequestWindow) {
163
223
  requests.blobsRequest = {
@@ -167,6 +227,39 @@ export class Batch {
167
227
  }
168
228
  // dataSlot will still have a value but do not create a request for preDeneb forks
169
229
  }
230
+ if (isForkPostGloas(this.forkName) && envelopeStartSlot <= endSlot) {
231
+ requests.envelopesRequest = {
232
+ startSlot: envelopeStartSlot,
233
+ count: endSlot - envelopeStartSlot + 1,
234
+ };
235
+ }
236
+ // Only the first batch of a SyncChain may need the dangling-parent payload by-root.
237
+ if (blocks.length > 0 && this.shouldDownloadParentEnvelope(blocks[0].getBlock())) {
238
+ // shouldDownloadParentEnvelope() = true means there are at least 1 block
239
+ const parentRoot = blocks[0].getBlock().message.parentRoot;
240
+ if (!byteArrayEquals(parentRoot, ZERO_HASH)) {
241
+ const parentRootHex = toRootHex(parentRoot);
242
+ let parentPayloadInput;
243
+ if (this.state.payloadEnvelopes) {
244
+ for (const pi of this.state.payloadEnvelopes.values()) {
245
+ if (pi.blockRootHex === parentRootHex) {
246
+ parentPayloadInput = pi;
247
+ break;
248
+ }
249
+ }
250
+ }
251
+ const needsEnvelope = !parentPayloadInput?.hasPayloadEnvelope();
252
+ const missingColumns = parentPayloadInput
253
+ ? parentPayloadInput.getMissingSampledColumnMeta().missing
254
+ : this.custodyConfig.sampledColumns;
255
+ if (needsEnvelope || missingColumns.length > 0) {
256
+ requests.parentPayloadRequest = {
257
+ ...(needsEnvelope ? { envelopeBlockRoot: parentRoot } : {}),
258
+ ...(missingColumns.length > 0 ? { blockRoot: parentRoot, columns: missingColumns } : {}),
259
+ };
260
+ }
261
+ }
262
+ }
170
263
  return requests;
171
264
  }
172
265
  /**
@@ -176,22 +269,22 @@ export class Batch {
176
269
  if (!isForkPostFulu(this.forkName)) {
177
270
  return this.requests;
178
271
  }
179
- // post-fulu we need to ensure that we only request columns that the peer has advertised
180
- const { columnsRequest } = this.requests;
181
- if (columnsRequest == null) {
182
- return this.requests;
183
- }
272
+ // post-fulu we need to ensure that we only request columns that the peer has advertised.
273
+ const { columnsRequest, parentPayloadRequest } = this.requests;
184
274
  const peerColumns = new Set(peer.custodyColumns ?? []);
185
- const requestedColumns = columnsRequest.columns.filter((c) => peerColumns.has(c));
186
- if (requestedColumns.length === columnsRequest.columns.length) {
187
- return this.requests;
188
- }
275
+ const filteredColumnsRequest = columnsRequest != null ? columnsRequest.columns.filter((c) => peerColumns.has(c)) : null;
276
+ const parentColumns = parentPayloadRequest?.columns;
277
+ const filteredParentColumns = parentColumns != null ? parentColumns.filter((c) => peerColumns.has(c)) : null;
278
+ const updatedColumnRequest = columnsRequest != null && filteredColumnsRequest != null
279
+ ? { columnsRequest: { ...columnsRequest, columns: filteredColumnsRequest } }
280
+ : {};
281
+ const updatedParentPayloadRequest = parentPayloadRequest != null && filteredParentColumns != null
282
+ ? { parentPayloadRequest: { ...parentPayloadRequest, columns: filteredParentColumns } }
283
+ : {};
189
284
  return {
190
285
  ...this.requests,
191
- columnsRequest: {
192
- ...columnsRequest,
193
- columns: requestedColumns,
194
- },
286
+ ...updatedColumnRequest,
287
+ ...updatedParentPayloadRequest,
195
288
  };
196
289
  }
197
290
  /**
@@ -201,11 +294,33 @@ export class Batch {
201
294
  return [...this.failedDownloadAttempts, ...this.failedProcessingAttempts.flatMap((a) => a.peers)];
202
295
  }
203
296
  getMetadata() {
204
- return { startEpoch: this.startEpoch, status: this.state.status };
297
+ const { blocksRequest, blobsRequest, columnsRequest, envelopesRequest } = this.requests;
298
+ const failedProcessingPeerList = this.failedProcessingAttempts.flatMap((a) => a.peers);
299
+ return {
300
+ startEpoch: this.startEpoch,
301
+ startSlot: this.startSlot,
302
+ count: this.count,
303
+ status: this.state.status,
304
+ ...(blocksRequest && { blocksReq: formatRangeReq(blocksRequest) }),
305
+ ...(blobsRequest && { blobsReq: formatRangeReq(blobsRequest) }),
306
+ ...(columnsRequest && { columnsReq: formatColumnsReq(columnsRequest) }),
307
+ ...(envelopesRequest && { envelopesReq: formatRangeReq(envelopesRequest) }),
308
+ downloadAttempts: this.failedDownloadAttempts.length,
309
+ processingAttempts: this.failedProcessingAttempts.length,
310
+ ...(this.failedDownloadAttempts.length > 0 && {
311
+ failedDownloadPeers: this.failedDownloadAttempts.join(","),
312
+ }),
313
+ ...(failedProcessingPeerList.length > 0 && {
314
+ failedProcessingPeers: failedProcessingPeerList.join(","),
315
+ }),
316
+ };
205
317
  }
206
318
  getBlocks() {
207
319
  return this.state.blocks;
208
320
  }
321
+ getPayloadEnvelopes() {
322
+ return this.state.payloadEnvelopes;
323
+ }
209
324
  /**
210
325
  * AwaitingDownload -> Downloading
211
326
  */
@@ -213,12 +328,17 @@ export class Batch {
213
328
  if (this.state.status !== BatchStatus.AwaitingDownload) {
214
329
  throw new BatchError(this.wrongStatusErrorType(BatchStatus.AwaitingDownload));
215
330
  }
216
- this.state = { status: BatchStatus.Downloading, peer, blocks: this.state.blocks };
331
+ this.state = {
332
+ status: BatchStatus.Downloading,
333
+ peer,
334
+ blocks: this.state.blocks,
335
+ payloadEnvelopes: this.state.payloadEnvelopes,
336
+ };
217
337
  }
218
338
  /**
219
339
  * Downloading -> AwaitingProcessing
220
340
  */
221
- downloadingSuccess(peer, blocks) {
341
+ downloadingSuccess(peer, blocks, payloadEnvelopes) {
222
342
  if (this.state.status !== BatchStatus.Downloading) {
223
343
  throw new BatchError(this.wrongStatusErrorType(BatchStatus.Downloading));
224
344
  }
@@ -229,7 +349,11 @@ export class Batch {
229
349
  const slots = new Set();
230
350
  for (const block of blocks) {
231
351
  slots.add(block.slot);
232
- if (!block.hasBlockAndAllData()) {
352
+ const dataComplete = isBlockInputColumns(block)
353
+ ? // by_range needs to download all columns
354
+ block.hasBlock() && block.hasComputedAllData()
355
+ : block.hasBlockAndAllData();
356
+ if (!dataComplete) {
233
357
  allComplete = false;
234
358
  }
235
359
  }
@@ -242,12 +366,45 @@ export class Batch {
242
366
  status: this.state.status,
243
367
  });
244
368
  }
369
+ const newPayloadEnvelopes = payloadEnvelopes ?? this.state.payloadEnvelopes;
370
+ if (allComplete && isForkPostGloas(this.forkName)) {
371
+ for (const block of blocks) {
372
+ const payloadInput = newPayloadEnvelopes?.get(block.slot);
373
+ // by_range needs every block's envelope and all sampled columns.
374
+ if (!payloadInput?.hasPayloadEnvelope() || !payloadInput.hasComputedAllData()) {
375
+ allComplete = false;
376
+ break;
377
+ }
378
+ }
379
+ }
380
+ // First batch of a sync chain must additionally have the dangling-parent payload fully
381
+ // present, otherwise `processBlocks` will throw PARENT_PAYLOAD_UNKNOWN. The parent's
382
+ // `PayloadEnvelopeInput` is identified by `blockRootHex` matching `blocks[0].parentRoot`.
383
+ if (allComplete && blocks.length > 0 && this.shouldDownloadParentEnvelope(blocks[0].getBlock())) {
384
+ const parentRoot = blocks[0].getBlock().message.parentRoot;
385
+ // Genesis has no parent payload — nothing to wait for.
386
+ if (!byteArrayEquals(parentRoot, ZERO_HASH)) {
387
+ const parentRootHex = toRootHex(parentRoot);
388
+ let parentPayloadComplete = false;
389
+ if (newPayloadEnvelopes) {
390
+ for (const payloadInput of newPayloadEnvelopes.values()) {
391
+ if (payloadInput.blockRootHex === parentRootHex) {
392
+ parentPayloadComplete = payloadInput.hasPayloadEnvelope() && payloadInput.hasComputedAllData();
393
+ break;
394
+ }
395
+ }
396
+ }
397
+ if (!parentPayloadComplete) {
398
+ allComplete = false;
399
+ }
400
+ }
401
+ }
245
402
  if (allComplete) {
246
- this.state = { status: BatchStatus.AwaitingProcessing, blocks };
403
+ this.state = { status: BatchStatus.AwaitingProcessing, blocks, payloadEnvelopes: newPayloadEnvelopes };
247
404
  }
248
405
  else {
406
+ this.state = { status: BatchStatus.AwaitingDownload, blocks, payloadEnvelopes: newPayloadEnvelopes };
249
407
  this.requests = this.getRequests(blocks);
250
- this.state = { status: BatchStatus.AwaitingDownload, blocks };
251
408
  }
252
409
  return this.state;
253
410
  }
@@ -262,7 +419,25 @@ export class Batch {
262
419
  if (this.failedDownloadAttempts.length > MAX_BATCH_DOWNLOAD_ATTEMPTS) {
263
420
  throw new BatchError(this.errorType({ code: BatchErrorCode.MAX_DOWNLOAD_ATTEMPTS }));
264
421
  }
265
- this.state = { status: BatchStatus.AwaitingDownload, blocks: this.state.blocks };
422
+ this.state = {
423
+ status: BatchStatus.AwaitingDownload,
424
+ blocks: this.state.blocks,
425
+ payloadEnvelopes: this.state.payloadEnvelopes,
426
+ };
427
+ }
428
+ /**
429
+ * Downloading -> AwaitingDownload (without counting as a failed attempt).
430
+ * Used when the peer rate-limited us — the request was never actually served.
431
+ */
432
+ downloadingRateLimited() {
433
+ if (this.state.status !== BatchStatus.Downloading) {
434
+ throw new BatchError(this.wrongStatusErrorType(BatchStatus.Downloading));
435
+ }
436
+ this.state = {
437
+ status: BatchStatus.AwaitingDownload,
438
+ blocks: this.state.blocks,
439
+ payloadEnvelopes: this.state.payloadEnvelopes,
440
+ };
266
441
  }
267
442
  /**
268
443
  * AwaitingProcessing -> Processing
@@ -272,13 +447,14 @@ export class Batch {
272
447
  throw new BatchError(this.wrongStatusErrorType(BatchStatus.AwaitingProcessing));
273
448
  }
274
449
  const blocks = this.state.blocks;
450
+ const payloadEnvelopes = this.state.payloadEnvelopes;
275
451
  const hash = hashBlocks(blocks, this.config); // tracks blocks to report peer on processing error
276
452
  // Reset goodPeers in case another download attempt needs to be made. When Attempt is successful or not the peers
277
453
  // that the data came from will be handled by the Attempt that goes for processing
278
454
  const peers = this.goodPeers;
279
455
  this.goodPeers = [];
280
- this.state = { status: BatchStatus.Processing, blocks, attempt: { peers, hash } };
281
- return blocks;
456
+ this.state = { status: BatchStatus.Processing, blocks, payloadEnvelopes, attempt: { peers, hash } };
457
+ return { blocks, payloadEnvelopes, peers };
282
458
  }
283
459
  /**
284
460
  * Processing -> AwaitingValidation
@@ -287,7 +463,12 @@ export class Batch {
287
463
  if (this.state.status !== BatchStatus.Processing) {
288
464
  throw new BatchError(this.wrongStatusErrorType(BatchStatus.Processing));
289
465
  }
290
- this.state = { status: BatchStatus.AwaitingValidation, blocks: this.state.blocks, attempt: this.state.attempt };
466
+ this.state = {
467
+ status: BatchStatus.AwaitingValidation,
468
+ blocks: this.state.blocks,
469
+ payloadEnvelopes: this.state.payloadEnvelopes,
470
+ attempt: this.state.attempt,
471
+ };
291
472
  }
292
473
  /**
293
474
  * Processing -> AwaitingDownload
@@ -333,7 +514,7 @@ export class Batch {
333
514
  }
334
515
  // remove any downloaded blocks and re-attempt
335
516
  // TODO(fulu): need to remove the bad blocks from the SeenBlockInputCache
336
- this.state = { status: BatchStatus.AwaitingDownload, blocks: [] };
517
+ this.state = { status: BatchStatus.AwaitingDownload, blocks: [], payloadEnvelopes: null };
337
518
  }
338
519
  onProcessingError(attempt) {
339
520
  this.failedProcessingAttempts.push(attempt);
@@ -342,11 +523,11 @@ export class Batch {
342
523
  }
343
524
  // remove any downloaded blocks and re-attempt
344
525
  // TODO(fulu): need to remove the bad blocks from the SeenBlockInputCache
345
- this.state = { status: BatchStatus.AwaitingDownload, blocks: [] };
526
+ this.state = { status: BatchStatus.AwaitingDownload, blocks: [], payloadEnvelopes: null };
346
527
  }
347
528
  /** Helper to construct typed BatchError. Stack traces are correct as the error is thrown above */
348
529
  errorType(type) {
349
- return { ...type, ...this.getMetadata() };
530
+ return { ...type, startEpoch: this.startEpoch, status: this.state.status };
350
531
  }
351
532
  wrongStatusErrorType(expectedStatus) {
352
533
  return this.errorType({ code: BatchErrorCode.WRONG_STATUS, expectedStatus });