@lodestar/beacon-node 1.43.0-dev.4358217e12 → 1.43.0-dev.4451fec75a

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 (254) hide show
  1. package/lib/api/impl/beacon/blocks/index.d.ts.map +1 -1
  2. package/lib/api/impl/beacon/blocks/index.js +10 -0
  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/validator/index.d.ts.map +1 -1
  11. package/lib/api/impl/validator/index.js +68 -2
  12. package/lib/api/impl/validator/index.js.map +1 -1
  13. package/lib/chain/blocks/blockInput/blockInput.d.ts +3 -0
  14. package/lib/chain/blocks/blockInput/blockInput.d.ts.map +1 -1
  15. package/lib/chain/blocks/blockInput/blockInput.js +4 -1
  16. package/lib/chain/blocks/blockInput/blockInput.js.map +1 -1
  17. package/lib/chain/blocks/importBlock.d.ts.map +1 -1
  18. package/lib/chain/blocks/importBlock.js +16 -31
  19. package/lib/chain/blocks/importBlock.js.map +1 -1
  20. package/lib/chain/blocks/importExecutionPayload.d.ts +6 -1
  21. package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
  22. package/lib/chain/blocks/importExecutionPayload.js +19 -10
  23. package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
  24. package/lib/chain/blocks/index.d.ts.map +1 -1
  25. package/lib/chain/blocks/index.js +35 -21
  26. package/lib/chain/blocks/index.js.map +1 -1
  27. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts +12 -1
  28. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.d.ts.map +1 -1
  29. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js +28 -2
  30. package/lib/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.js.map +1 -1
  31. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts +17 -0
  32. package/lib/chain/blocks/payloadEnvelopeInput/types.d.ts.map +1 -1
  33. package/lib/chain/blocks/types.d.ts +2 -1
  34. package/lib/chain/blocks/types.d.ts.map +1 -1
  35. package/lib/chain/blocks/utils/chainSegment.d.ts +1 -3
  36. package/lib/chain/blocks/utils/chainSegment.d.ts.map +1 -1
  37. package/lib/chain/blocks/utils/chainSegment.js +34 -23
  38. package/lib/chain/blocks/utils/chainSegment.js.map +1 -1
  39. package/lib/chain/blocks/verifyBlock.d.ts +2 -1
  40. package/lib/chain/blocks/verifyBlock.d.ts.map +1 -1
  41. package/lib/chain/blocks/verifyBlock.js +30 -12
  42. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  43. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts +0 -4
  44. package/lib/chain/blocks/verifyBlocksExecutionPayloads.d.ts.map +1 -1
  45. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +5 -2
  46. package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
  47. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts +2 -1
  48. package/lib/chain/blocks/verifyBlocksSanityChecks.d.ts.map +1 -1
  49. package/lib/chain/blocks/verifyBlocksSanityChecks.js +16 -7
  50. package/lib/chain/blocks/verifyBlocksSanityChecks.js.map +1 -1
  51. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts +2 -2
  52. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.d.ts.map +1 -1
  53. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js +10 -6
  54. package/lib/chain/blocks/verifyExecutionPayloadEnvelope.js.map +1 -1
  55. package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
  56. package/lib/chain/blocks/verifyPayloadsDataAvailability.js +8 -3
  57. package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
  58. package/lib/chain/chain.d.ts.map +1 -1
  59. package/lib/chain/chain.js +25 -8
  60. package/lib/chain/chain.js.map +1 -1
  61. package/lib/chain/emitter.d.ts +0 -11
  62. package/lib/chain/emitter.d.ts.map +1 -1
  63. package/lib/chain/emitter.js +0 -4
  64. package/lib/chain/emitter.js.map +1 -1
  65. package/lib/chain/errors/proposerPreferences.d.ts +8 -1
  66. package/lib/chain/errors/proposerPreferences.d.ts.map +1 -1
  67. package/lib/chain/errors/proposerPreferences.js +1 -0
  68. package/lib/chain/errors/proposerPreferences.js.map +1 -1
  69. package/lib/chain/initState.d.ts.map +1 -1
  70. package/lib/chain/initState.js +6 -1
  71. package/lib/chain/initState.js.map +1 -1
  72. package/lib/chain/lightClient/index.d.ts.map +1 -1
  73. package/lib/chain/lightClient/index.js +1 -1
  74. package/lib/chain/lightClient/index.js.map +1 -1
  75. package/lib/chain/opPools/payloadAttestationPool.d.ts +2 -1
  76. package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
  77. package/lib/chain/opPools/payloadAttestationPool.js +52 -10
  78. package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
  79. package/lib/chain/prepareNextSlot.d.ts.map +1 -1
  80. package/lib/chain/prepareNextSlot.js +16 -18
  81. package/lib/chain/prepareNextSlot.js.map +1 -1
  82. package/lib/chain/produceBlock/produceBlockBody.d.ts +12 -3
  83. package/lib/chain/produceBlock/produceBlockBody.d.ts.map +1 -1
  84. package/lib/chain/produceBlock/produceBlockBody.js +33 -20
  85. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  86. package/lib/chain/regen/queued.d.ts.map +1 -1
  87. package/lib/chain/regen/queued.js +1 -4
  88. package/lib/chain/regen/queued.js.map +1 -1
  89. package/lib/chain/regen/regen.d.ts.map +1 -1
  90. package/lib/chain/regen/regen.js +1 -4
  91. package/lib/chain/regen/regen.js.map +1 -1
  92. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts +21 -11
  93. package/lib/chain/seenCache/seenPayloadEnvelopeInput.d.ts.map +1 -1
  94. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js +70 -20
  95. package/lib/chain/seenCache/seenPayloadEnvelopeInput.js.map +1 -1
  96. package/lib/chain/seenCache/seenProposerPreferences.d.ts +8 -7
  97. package/lib/chain/seenCache/seenProposerPreferences.d.ts.map +1 -1
  98. package/lib/chain/seenCache/seenProposerPreferences.js +11 -10
  99. package/lib/chain/seenCache/seenProposerPreferences.js.map +1 -1
  100. package/lib/chain/validation/executionPayloadBid.js +11 -8
  101. package/lib/chain/validation/executionPayloadBid.js.map +1 -1
  102. package/lib/chain/validation/payloadAttestationMessage.d.ts +1 -1
  103. package/lib/chain/validation/payloadAttestationMessage.d.ts.map +1 -1
  104. package/lib/chain/validation/payloadAttestationMessage.js +5 -3
  105. package/lib/chain/validation/payloadAttestationMessage.js.map +1 -1
  106. package/lib/chain/validation/proposerPreferences.d.ts.map +1 -1
  107. package/lib/chain/validation/proposerPreferences.js +39 -17
  108. package/lib/chain/validation/proposerPreferences.js.map +1 -1
  109. package/lib/metrics/metrics/lodestar.d.ts +4 -0
  110. package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
  111. package/lib/metrics/metrics/lodestar.js +5 -0
  112. package/lib/metrics/metrics/lodestar.js.map +1 -1
  113. package/lib/network/gossip/topic.d.ts +751 -2
  114. package/lib/network/gossip/topic.d.ts.map +1 -1
  115. package/lib/network/interface.d.ts +2 -0
  116. package/lib/network/interface.d.ts.map +1 -1
  117. package/lib/network/network.d.ts +2 -0
  118. package/lib/network/network.d.ts.map +1 -1
  119. package/lib/network/network.js +8 -0
  120. package/lib/network/network.js.map +1 -1
  121. package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
  122. package/lib/network/processor/gossipHandlers.js +61 -13
  123. package/lib/network/processor/gossipHandlers.js.map +1 -1
  124. package/lib/network/processor/index.js +5 -5
  125. package/lib/network/processor/index.js.map +1 -1
  126. package/lib/network/reqresp/ReqRespBeaconNode.d.ts.map +1 -1
  127. package/lib/network/reqresp/ReqRespBeaconNode.js +1 -1
  128. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  129. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts +9 -0
  130. package/lib/network/reqresp/handlers/beaconBlocksByHead.d.ts.map +1 -0
  131. package/lib/network/reqresp/handlers/beaconBlocksByHead.js +61 -0
  132. package/lib/network/reqresp/handlers/beaconBlocksByHead.js.map +1 -0
  133. package/lib/network/reqresp/handlers/index.d.ts.map +1 -1
  134. package/lib/network/reqresp/handlers/index.js +5 -0
  135. package/lib/network/reqresp/handlers/index.js.map +1 -1
  136. package/lib/network/reqresp/interface.d.ts +1 -1
  137. package/lib/network/reqresp/interface.js +1 -1
  138. package/lib/network/reqresp/protocols.d.ts +1 -0
  139. package/lib/network/reqresp/protocols.d.ts.map +1 -1
  140. package/lib/network/reqresp/protocols.js +5 -0
  141. package/lib/network/reqresp/protocols.js.map +1 -1
  142. package/lib/network/reqresp/rateLimit.d.ts.map +1 -1
  143. package/lib/network/reqresp/rateLimit.js +4 -0
  144. package/lib/network/reqresp/rateLimit.js.map +1 -1
  145. package/lib/network/reqresp/score.d.ts.map +1 -1
  146. package/lib/network/reqresp/score.js +1 -0
  147. package/lib/network/reqresp/score.js.map +1 -1
  148. package/lib/network/reqresp/types.d.ts +3 -0
  149. package/lib/network/reqresp/types.d.ts.map +1 -1
  150. package/lib/network/reqresp/types.js +3 -0
  151. package/lib/network/reqresp/types.js.map +1 -1
  152. package/lib/node/nodejs.js +2 -2
  153. package/lib/node/nodejs.js.map +1 -1
  154. package/lib/node/notifier.js +1 -7
  155. package/lib/node/notifier.js.map +1 -1
  156. package/lib/sync/constants.d.ts +7 -1
  157. package/lib/sync/constants.d.ts.map +1 -1
  158. package/lib/sync/constants.js +7 -4
  159. package/lib/sync/constants.js.map +1 -1
  160. package/lib/sync/range/batch.d.ts +43 -6
  161. package/lib/sync/range/batch.d.ts.map +1 -1
  162. package/lib/sync/range/batch.js +243 -44
  163. package/lib/sync/range/batch.js.map +1 -1
  164. package/lib/sync/range/chain.d.ts +16 -2
  165. package/lib/sync/range/chain.d.ts.map +1 -1
  166. package/lib/sync/range/chain.js +100 -9
  167. package/lib/sync/range/chain.js.map +1 -1
  168. package/lib/sync/range/range.d.ts.map +1 -1
  169. package/lib/sync/range/range.js +54 -5
  170. package/lib/sync/range/range.js.map +1 -1
  171. package/lib/sync/range/utils/peerBalancer.d.ts +2 -1
  172. package/lib/sync/range/utils/peerBalancer.d.ts.map +1 -1
  173. package/lib/sync/range/utils/peerBalancer.js +8 -4
  174. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  175. package/lib/sync/sync.d.ts.map +1 -1
  176. package/lib/sync/sync.js +13 -0
  177. package/lib/sync/sync.js.map +1 -1
  178. package/lib/sync/unknownBlock.d.ts +7 -2
  179. package/lib/sync/unknownBlock.d.ts.map +1 -1
  180. package/lib/sync/unknownBlock.js +127 -57
  181. package/lib/sync/unknownBlock.js.map +1 -1
  182. package/lib/sync/utils/downloadByRange.d.ts +36 -9
  183. package/lib/sync/utils/downloadByRange.d.ts.map +1 -1
  184. package/lib/sync/utils/downloadByRange.js +106 -42
  185. package/lib/sync/utils/downloadByRange.js.map +1 -1
  186. package/lib/sync/utils/downloadByRoot.d.ts.map +1 -1
  187. package/lib/sync/utils/downloadByRoot.js +10 -0
  188. package/lib/sync/utils/downloadByRoot.js.map +1 -1
  189. package/lib/sync/utils/rateLimit.d.ts +2 -0
  190. package/lib/sync/utils/rateLimit.d.ts.map +1 -0
  191. package/lib/sync/utils/rateLimit.js +15 -0
  192. package/lib/sync/utils/rateLimit.js.map +1 -0
  193. package/lib/util/sszBytes.d.ts.map +1 -1
  194. package/lib/util/sszBytes.js +8 -6
  195. package/lib/util/sszBytes.js.map +1 -1
  196. package/package.json +15 -16
  197. package/src/api/impl/beacon/blocks/index.ts +13 -0
  198. package/src/api/impl/beacon/pool/index.ts +83 -1
  199. package/src/api/impl/debug/index.ts +0 -1
  200. package/src/api/impl/validator/index.ts +82 -1
  201. package/src/chain/blocks/blockInput/blockInput.ts +4 -1
  202. package/src/chain/blocks/importBlock.ts +16 -50
  203. package/src/chain/blocks/importExecutionPayload.ts +32 -15
  204. package/src/chain/blocks/index.ts +32 -15
  205. package/src/chain/blocks/payloadEnvelopeInput/payloadEnvelopeInput.ts +37 -3
  206. package/src/chain/blocks/payloadEnvelopeInput/types.ts +18 -0
  207. package/src/chain/blocks/types.ts +2 -1
  208. package/src/chain/blocks/utils/chainSegment.ts +35 -24
  209. package/src/chain/blocks/verifyBlock.ts +45 -13
  210. package/src/chain/blocks/verifyBlocksExecutionPayloads.ts +6 -4
  211. package/src/chain/blocks/verifyBlocksSanityChecks.ts +16 -6
  212. package/src/chain/blocks/verifyExecutionPayloadEnvelope.ts +14 -6
  213. package/src/chain/blocks/verifyPayloadsDataAvailability.ts +7 -4
  214. package/src/chain/chain.ts +29 -7
  215. package/src/chain/emitter.ts +0 -11
  216. package/src/chain/errors/proposerPreferences.ts +9 -1
  217. package/src/chain/initState.ts +9 -1
  218. package/src/chain/lightClient/index.ts +6 -6
  219. package/src/chain/opPools/payloadAttestationPool.ts +59 -10
  220. package/src/chain/prepareNextSlot.ts +21 -29
  221. package/src/chain/produceBlock/produceBlockBody.ts +41 -25
  222. package/src/chain/regen/queued.ts +2 -7
  223. package/src/chain/regen/regen.ts +2 -7
  224. package/src/chain/seenCache/seenPayloadEnvelopeInput.ts +90 -24
  225. package/src/chain/seenCache/seenProposerPreferences.ts +14 -11
  226. package/src/chain/validation/executionPayloadBid.ts +11 -8
  227. package/src/chain/validation/payloadAttestationMessage.ts +6 -4
  228. package/src/chain/validation/proposerPreferences.ts +37 -18
  229. package/src/metrics/metrics/lodestar.ts +6 -0
  230. package/src/network/interface.ts +2 -0
  231. package/src/network/network.ts +23 -0
  232. package/src/network/processor/gossipHandlers.ts +75 -14
  233. package/src/network/processor/index.ts +5 -5
  234. package/src/network/reqresp/ReqRespBeaconNode.ts +1 -0
  235. package/src/network/reqresp/handlers/beaconBlocksByHead.ts +91 -0
  236. package/src/network/reqresp/handlers/index.ts +5 -0
  237. package/src/network/reqresp/interface.ts +1 -1
  238. package/src/network/reqresp/protocols.ts +6 -0
  239. package/src/network/reqresp/rateLimit.ts +4 -0
  240. package/src/network/reqresp/score.ts +1 -0
  241. package/src/network/reqresp/types.ts +5 -0
  242. package/src/node/nodejs.ts +2 -2
  243. package/src/node/notifier.ts +1 -8
  244. package/src/sync/constants.ts +8 -4
  245. package/src/sync/range/batch.ts +309 -51
  246. package/src/sync/range/chain.ts +119 -10
  247. package/src/sync/range/range.ts +68 -5
  248. package/src/sync/range/utils/peerBalancer.ts +9 -3
  249. package/src/sync/sync.ts +13 -1
  250. package/src/sync/unknownBlock.ts +157 -60
  251. package/src/sync/utils/downloadByRange.ts +174 -44
  252. package/src/sync/utils/downloadByRoot.ts +12 -0
  253. package/src/sync/utils/rateLimit.ts +16 -0
  254. package/src/util/sszBytes.ts +8 -6
@@ -0,0 +1,91 @@
1
+ import {PeerId} from "@libp2p/interface";
2
+ import {BeaconConfig} from "@lodestar/config";
3
+ import {ForkName, GENESIS_EPOCH, GENESIS_SLOT, isForkPostDeneb} from "@lodestar/params";
4
+ import {RespStatus, ResponseError, ResponseOutgoing} from "@lodestar/reqresp";
5
+ import {computeEpochAtSlot, computeStartSlotAtEpoch} from "@lodestar/state-transition";
6
+ import {fulu} from "@lodestar/types";
7
+ import {toRootHex} from "@lodestar/utils";
8
+ import {IBeaconChain} from "../../../chain/index.js";
9
+ import {getParentRootFromSignedBeaconBlockSerialized} from "../../../util/sszBytes.js";
10
+ import {prettyPrintPeerId} from "../../util.js";
11
+
12
+ // See https://github.com/ethereum/consensus-specs/pull/5181
13
+ export async function* onBeaconBlocksByHead(
14
+ request: fulu.BeaconBlocksByHeadRequest,
15
+ chain: IBeaconChain,
16
+ peerId: PeerId,
17
+ peerClient: string
18
+ ): AsyncIterable<ResponseOutgoing> {
19
+ const currentFork = chain.config.getForkName(chain.clock.currentSlot);
20
+ const {beaconRoot, count} = validateBeaconBlocksByHeadRequest(currentFork, chain.config, request);
21
+
22
+ const requestedRootHex = toRootHex(beaconRoot);
23
+ let blockRootHex = requestedRootHex;
24
+ const minimumRequestEpoch = Math.max(
25
+ GENESIS_EPOCH,
26
+ chain.clock.currentEpoch - chain.config.MIN_EPOCHS_FOR_BLOCK_REQUESTS
27
+ );
28
+ const minimumRequestSlot = computeStartSlotAtEpoch(minimumRequestEpoch);
29
+
30
+ for (let blocksSent = 0; blocksSent < count; blocksSent++) {
31
+ const blockBytes = await chain.getSerializedBlockByRoot(blockRootHex);
32
+ if (!blockBytes) {
33
+ if (blocksSent === 0) {
34
+ throw new ResponseError(RespStatus.RESOURCE_UNAVAILABLE, `Unknown block root ${requestedRootHex}`);
35
+ }
36
+ return;
37
+ }
38
+
39
+ if (blockBytes.slot < minimumRequestSlot) {
40
+ if (blocksSent === 0) {
41
+ chain.logger.verbose("Peer requested unavailable block for BeaconBlocksByHead", {
42
+ peer: prettyPrintPeerId(peerId),
43
+ client: peerClient,
44
+ requestedRoot: requestedRootHex,
45
+ slot: blockBytes.slot,
46
+ minimumRequestSlot,
47
+ });
48
+ }
49
+ return;
50
+ }
51
+
52
+ yield {
53
+ data: blockBytes.block,
54
+ boundary: chain.config.getForkBoundaryAtEpoch(computeEpochAtSlot(blockBytes.slot)),
55
+ };
56
+
57
+ if (blockBytes.slot === GENESIS_SLOT) {
58
+ return;
59
+ }
60
+
61
+ const parentRootHex = getParentRootFromSignedBeaconBlockSerialized(blockBytes.block);
62
+ if (parentRootHex === null) {
63
+ throw new ResponseError(
64
+ RespStatus.SERVER_ERROR,
65
+ `Invalid block bytes for root ${blockRootHex} slot ${blockBytes.slot}`
66
+ );
67
+ }
68
+ blockRootHex = parentRootHex;
69
+ }
70
+ }
71
+
72
+ export function validateBeaconBlocksByHeadRequest(
73
+ fork: ForkName,
74
+ config: BeaconConfig,
75
+ request: fulu.BeaconBlocksByHeadRequest
76
+ ): fulu.BeaconBlocksByHeadRequest {
77
+ const {beaconRoot} = request;
78
+ let {count} = request;
79
+
80
+ if (count < 1) {
81
+ throw new ResponseError(RespStatus.INVALID_REQUEST, "count < 1");
82
+ }
83
+
84
+ const maxRequestBlocks = isForkPostDeneb(fork) ? config.MAX_REQUEST_BLOCKS_DENEB : config.MAX_REQUEST_BLOCKS;
85
+
86
+ if (count > maxRequestBlocks) {
87
+ count = maxRequestBlocks;
88
+ }
89
+
90
+ return {beaconRoot, count};
91
+ }
@@ -9,6 +9,7 @@ import {
9
9
  ExecutionPayloadEnvelopesByRootRequestType,
10
10
  } from "../../../util/types.js";
11
11
  import {GetReqRespHandlerFn, ReqRespMethod} from "../types.js";
12
+ import {onBeaconBlocksByHead} from "./beaconBlocksByHead.js";
12
13
  import {onBeaconBlocksByRange} from "./beaconBlocksByRange.js";
13
14
  import {onBeaconBlocksByRoot} from "./beaconBlocksByRoot.js";
14
15
  import {onBlobSidecarsByRange} from "./blobSidecarsByRange.js";
@@ -47,6 +48,10 @@ export function getReqRespHandlers({db, chain}: {db: IBeaconDb; chain: IBeaconCh
47
48
  const body = BeaconBlocksByRootRequestType(fork, chain.config).deserialize(req.data);
48
49
  return onBeaconBlocksByRoot(body, chain);
49
50
  },
51
+ [ReqRespMethod.BeaconBlocksByHead]: (req, peerId, peerClient) => {
52
+ const body = ssz.fulu.BeaconBlocksByHeadRequest.deserialize(req.data);
53
+ return onBeaconBlocksByHead(body, chain, peerId, peerClient);
54
+ },
50
55
  [ReqRespMethod.BlobSidecarsByRoot]: (req) => {
51
56
  const fork = chain.config.getForkName(chain.clock.currentSlot);
52
57
  const body = BlobSidecarsByRootRequestType(fork, chain.config).deserialize(req.data);
@@ -33,7 +33,7 @@ export enum RespStatus {
33
33
  */
34
34
  SERVER_ERROR = 2,
35
35
  /**
36
- * The responder does not have requested resource. The response payload adheres to the ErrorMessage schema (described below). Note: This response code is only valid as a response to BlocksByRange
36
+ * The responder does not have requested resource. The response payload adheres to the ErrorMessage schema.
37
37
  */
38
38
  RESOURCE_UNAVAILABLE = 3,
39
39
  /**
@@ -70,6 +70,12 @@ export const BeaconBlocksByRootV2 = toProtocol({
70
70
  contextBytesType: ContextBytesType.ForkDigest,
71
71
  });
72
72
 
73
+ export const BeaconBlocksByHead = toProtocol({
74
+ method: ReqRespMethod.BeaconBlocksByHead,
75
+ version: Version.V1,
76
+ contextBytesType: ContextBytesType.ForkDigest,
77
+ });
78
+
73
79
  export const BlobSidecarsByRange = toProtocol({
74
80
  method: ReqRespMethod.BlobSidecarsByRange,
75
81
  version: Version.V1,
@@ -40,6 +40,10 @@ export const rateLimitQuotas: (fork: ForkName, config: BeaconConfig) => Record<R
40
40
  },
41
41
  getRequestCount: getRequestCountFn(fork, config, ReqRespMethod.BeaconBlocksByRoot, (req) => req.length),
42
42
  },
43
+ [ReqRespMethod.BeaconBlocksByHead]: {
44
+ byPeer: {quota: config.MAX_REQUEST_BLOCKS_DENEB, quotaTimeMs: 10_000},
45
+ getRequestCount: getRequestCountFn(fork, config, ReqRespMethod.BeaconBlocksByHead, (req) => req.count),
46
+ },
43
47
  [ReqRespMethod.BlobSidecarsByRange]: {
44
48
  // Rationale: MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK
45
49
  byPeer: {
@@ -46,6 +46,7 @@ export function onOutgoingReqRespError(e: RequestError, method: ReqRespMethod):
46
46
  return PeerAction.LowToleranceError;
47
47
  case ReqRespMethod.BeaconBlocksByRange:
48
48
  case ReqRespMethod.BeaconBlocksByRoot:
49
+ case ReqRespMethod.BeaconBlocksByHead:
49
50
  case ReqRespMethod.ExecutionPayloadEnvelopesByRoot:
50
51
  case ReqRespMethod.ExecutionPayloadEnvelopesByRange:
51
52
  return PeerAction.MidToleranceError;
@@ -42,6 +42,7 @@ export enum ReqRespMethod {
42
42
  Metadata = "metadata",
43
43
  BeaconBlocksByRange = "beacon_blocks_by_range",
44
44
  BeaconBlocksByRoot = "beacon_blocks_by_root",
45
+ BeaconBlocksByHead = "beacon_blocks_by_head",
45
46
  BlobSidecarsByRange = "blob_sidecars_by_range",
46
47
  BlobSidecarsByRoot = "blob_sidecars_by_root",
47
48
  DataColumnSidecarsByRange = "data_column_sidecars_by_range",
@@ -62,6 +63,7 @@ export type RequestBodyByMethod = {
62
63
  [ReqRespMethod.Metadata]: null;
63
64
  [ReqRespMethod.BeaconBlocksByRange]: phase0.BeaconBlocksByRangeRequest;
64
65
  [ReqRespMethod.BeaconBlocksByRoot]: BeaconBlocksByRootRequest;
66
+ [ReqRespMethod.BeaconBlocksByHead]: fulu.BeaconBlocksByHeadRequest;
65
67
  [ReqRespMethod.BlobSidecarsByRange]: deneb.BlobSidecarsByRangeRequest;
66
68
  [ReqRespMethod.BlobSidecarsByRoot]: BlobSidecarsByRootRequest;
67
69
  [ReqRespMethod.DataColumnSidecarsByRange]: fulu.DataColumnSidecarsByRangeRequest;
@@ -82,6 +84,7 @@ type ResponseBodyByMethod = {
82
84
  // Do not matter
83
85
  [ReqRespMethod.BeaconBlocksByRange]: SignedBeaconBlock;
84
86
  [ReqRespMethod.BeaconBlocksByRoot]: SignedBeaconBlock;
87
+ [ReqRespMethod.BeaconBlocksByHead]: SignedBeaconBlock;
85
88
  [ReqRespMethod.BlobSidecarsByRange]: deneb.BlobSidecar;
86
89
  [ReqRespMethod.BlobSidecarsByRoot]: deneb.BlobSidecar;
87
90
  [ReqRespMethod.DataColumnSidecarsByRange]: DataColumnSidecar;
@@ -111,6 +114,7 @@ export const requestSszTypeByMethod: (
111
114
 
112
115
  [ReqRespMethod.BeaconBlocksByRange]: ssz.phase0.BeaconBlocksByRangeRequest,
113
116
  [ReqRespMethod.BeaconBlocksByRoot]: BeaconBlocksByRootRequestType(fork, config),
117
+ [ReqRespMethod.BeaconBlocksByHead]: ssz.fulu.BeaconBlocksByHeadRequest,
114
118
  [ReqRespMethod.BlobSidecarsByRange]: ssz.deneb.BlobSidecarsByRangeRequest,
115
119
  [ReqRespMethod.BlobSidecarsByRoot]: BlobSidecarsByRootRequestType(fork, config),
116
120
  [ReqRespMethod.DataColumnSidecarsByRange]: ssz.fulu.DataColumnSidecarsByRangeRequest,
@@ -142,6 +146,7 @@ export const responseSszTypeByMethod: {[K in ReqRespMethod]: ResponseTypeGetter<
142
146
  version === Version.V1 ? ssz.phase0.Metadata : version === Version.V2 ? ssz.altair.Metadata : ssz.fulu.Metadata,
143
147
  [ReqRespMethod.BeaconBlocksByRange]: blocksResponseType,
144
148
  [ReqRespMethod.BeaconBlocksByRoot]: blocksResponseType,
149
+ [ReqRespMethod.BeaconBlocksByHead]: (fork) => ssz[fork].SignedBeaconBlock,
145
150
  [ReqRespMethod.BlobSidecarsByRange]: () => ssz.deneb.BlobSidecar,
146
151
  [ReqRespMethod.BlobSidecarsByRoot]: () => ssz.deneb.BlobSidecar,
147
152
  [ReqRespMethod.LightClientBootstrap]: (fork) => sszTypesFor(onlyPostAltairFork(fork)).LightClientBootstrap,
@@ -221,7 +221,7 @@ export class BeaconNode {
221
221
 
222
222
  let executionEngineOpts = opts.executionEngine;
223
223
  if (opts.executionEngine.mode === "mock") {
224
- const eth1BlockHash =
224
+ const latestEth1BlockHash =
225
225
  isStatePostBellatrix(anchorState) && anchorState.isExecutionStateType
226
226
  ? isStatePostGloas(anchorState)
227
227
  ? toRootHex(anchorState.latestBlockHash)
@@ -230,7 +230,7 @@ export class BeaconNode {
230
230
  executionEngineOpts = {
231
231
  ...opts.executionEngine,
232
232
  genesisBlockHash: ZERO_HASH_HEX,
233
- eth1BlockHash,
233
+ eth1BlockHash: opts.executionEngine.eth1BlockHash ?? latestEth1BlockHash,
234
234
  genesisTime: anchorState.genesisTime,
235
235
  config,
236
236
  };
@@ -167,14 +167,7 @@ function getHeadExecutionInfo(
167
167
  return [];
168
168
  }
169
169
 
170
- // A PayloadSeparated head is a gloas beacon block imported before its payload envelope
171
- // arrives, in that case the exec-block row surfaces the inherited parent anchor (from the
172
- // bid), which is already validated. Normalize to "valid" to avoid leaking internal
173
- // fork-choice bookkeeping into the log. Once the payload envelope arrives and the FULL
174
- // variant becomes head, executionStatus is Valid/Syncing naturally.
175
- // TODO GLOAS: revisit once optimistic sync is implemented
176
- const executionStatusStr =
177
- headInfo.executionStatus === ExecutionStatus.PayloadSeparated ? "valid" : headInfo.executionStatus.toLowerCase();
170
+ const executionStatusStr = headInfo.executionStatus.toLowerCase();
178
171
 
179
172
  // Add execution status to notifier only if head is on/post bellatrix
180
173
  if (isStatePostBellatrix(headState) && headState.isExecutionStateType) {
@@ -5,10 +5,14 @@ export const PARALLEL_HEAD_CHAINS = 2;
5
5
  export const MIN_FINALIZED_CHAIN_VALIDATED_EPOCHS = 10;
6
6
 
7
7
  /** The number of times to retry a batch before it is considered failed. */
8
- // export const MAX_BATCH_DOWNLOAD_ATTEMPTS = 5;
9
- // this constant is increased a lot for peerDAS because we may have many failed download due to rate limit not implemented yet
10
- // TODO: change it back to 5 when this issue is implemented https://github.com/ChainSafe/lodestar/issues/8033
11
- export const MAX_BATCH_DOWNLOAD_ATTEMPTS = 20;
8
+ export const MAX_BATCH_DOWNLOAD_ATTEMPTS = 5;
9
+
10
+ /**
11
+ * Backoff before assigning more range-sync batches to a peer that rate-limited us.
12
+ *
13
+ * Note: this is used when rate limited due to MAX_CONCURRENT_REQUESTS
14
+ */
15
+ export const RATE_LIMITED_PEER_BACKOFF_MS = 5_000;
12
16
 
13
17
  /**
14
18
  * Consider batch faulty after downloading and processing this number of times