@lodestar/beacon-node 1.33.0-peerDAS.e03bda542e → 1.33.0-rc.0

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 (233) hide show
  1. package/lib/api/impl/beacon/blocks/index.js +26 -66
  2. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  3. package/lib/api/impl/debug/index.d.ts +1 -1
  4. package/lib/api/impl/debug/index.js +1 -24
  5. package/lib/api/impl/debug/index.js.map +1 -1
  6. package/lib/chain/archiveStore/archiveStore.d.ts +1 -1
  7. package/lib/chain/archiveStore/archiveStore.js +2 -2
  8. package/lib/chain/archiveStore/interface.d.ts +1 -1
  9. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +1 -1
  10. package/lib/chain/archiveStore/utils/archiveBlocks.js +23 -88
  11. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  12. package/lib/chain/beaconProposerCache.d.ts +0 -1
  13. package/lib/chain/beaconProposerCache.js +0 -3
  14. package/lib/chain/beaconProposerCache.js.map +1 -1
  15. package/lib/chain/blocks/importBlock.js +3 -8
  16. package/lib/chain/blocks/importBlock.js.map +1 -1
  17. package/lib/chain/blocks/types.d.ts +24 -67
  18. package/lib/chain/blocks/types.js +6 -40
  19. package/lib/chain/blocks/types.js.map +1 -1
  20. package/lib/chain/blocks/verifyBlocksDataAvailability.js +10 -21
  21. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  22. package/lib/chain/blocks/writeBlockInputToDb.js +15 -89
  23. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  24. package/lib/chain/chain.d.ts +5 -16
  25. package/lib/chain/chain.js +6 -34
  26. package/lib/chain/chain.js.map +1 -1
  27. package/lib/chain/emitter.d.ts +2 -18
  28. package/lib/chain/emitter.js +0 -13
  29. package/lib/chain/emitter.js.map +1 -1
  30. package/lib/chain/errors/index.d.ts +0 -1
  31. package/lib/chain/errors/index.js +0 -1
  32. package/lib/chain/errors/index.js.map +1 -1
  33. package/lib/chain/interface.d.ts +4 -10
  34. package/lib/chain/interface.js.map +1 -1
  35. package/lib/chain/options.d.ts +1 -4
  36. package/lib/chain/options.js +1 -5
  37. package/lib/chain/options.js.map +1 -1
  38. package/lib/chain/prepareNextSlot.js +1 -1
  39. package/lib/chain/prepareNextSlot.js.map +1 -1
  40. package/lib/chain/produceBlock/produceBlockBody.d.ts +2 -4
  41. package/lib/chain/produceBlock/produceBlockBody.js +2 -7
  42. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  43. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +2 -3
  44. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +2 -25
  45. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
  46. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +18 -64
  47. package/lib/chain/seenCache/seenGossipBlockInput.js +53 -321
  48. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  49. package/lib/constants/network.d.ts +1 -0
  50. package/lib/constants/network.js +2 -0
  51. package/lib/constants/network.js.map +1 -1
  52. package/lib/db/beacon.d.ts +1 -3
  53. package/lib/db/beacon.js +1 -3
  54. package/lib/db/beacon.js.map +1 -1
  55. package/lib/db/buckets.d.ts +1 -3
  56. package/lib/db/buckets.js +0 -2
  57. package/lib/db/buckets.js.map +1 -1
  58. package/lib/db/interface.d.ts +1 -3
  59. package/lib/db/repositories/index.d.ts +0 -2
  60. package/lib/db/repositories/index.js +0 -2
  61. package/lib/db/repositories/index.js.map +1 -1
  62. package/lib/execution/engine/http.d.ts +3 -5
  63. package/lib/execution/engine/http.js +31 -70
  64. package/lib/execution/engine/http.js.map +1 -1
  65. package/lib/execution/engine/interface.d.ts +2 -4
  66. package/lib/execution/engine/interface.js +1 -1
  67. package/lib/execution/engine/interface.js.map +1 -1
  68. package/lib/execution/engine/mock.d.ts +0 -1
  69. package/lib/execution/engine/mock.js +0 -5
  70. package/lib/execution/engine/mock.js.map +1 -1
  71. package/lib/execution/engine/types.d.ts +0 -10
  72. package/lib/execution/engine/types.js +0 -6
  73. package/lib/execution/engine/types.js.map +1 -1
  74. package/lib/metrics/metrics/beacon.d.ts +1 -15
  75. package/lib/metrics/metrics/beacon.js +1 -58
  76. package/lib/metrics/metrics/beacon.js.map +1 -1
  77. package/lib/metrics/metrics/lodestar.d.ts +1 -23
  78. package/lib/metrics/metrics/lodestar.js +0 -39
  79. package/lib/metrics/metrics/lodestar.js.map +1 -1
  80. package/lib/network/core/metrics.d.ts +3 -10
  81. package/lib/network/core/metrics.js +4 -22
  82. package/lib/network/core/metrics.js.map +1 -1
  83. package/lib/network/core/networkCore.d.ts +3 -8
  84. package/lib/network/core/networkCore.js +10 -24
  85. package/lib/network/core/networkCore.js.map +1 -1
  86. package/lib/network/core/networkCoreWorker.js +0 -1
  87. package/lib/network/core/networkCoreWorker.js.map +1 -1
  88. package/lib/network/core/networkCoreWorkerHandler.d.ts +3 -4
  89. package/lib/network/core/networkCoreWorkerHandler.js +0 -4
  90. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  91. package/lib/network/core/types.d.ts +4 -6
  92. package/lib/network/events.d.ts +2 -4
  93. package/lib/network/events.js.map +1 -1
  94. package/lib/network/gossip/interface.d.ts +1 -8
  95. package/lib/network/gossip/interface.js +0 -1
  96. package/lib/network/gossip/interface.js.map +1 -1
  97. package/lib/network/gossip/topic.d.ts +1497 -1513
  98. package/lib/network/gossip/topic.js +1 -20
  99. package/lib/network/gossip/topic.js.map +1 -1
  100. package/lib/network/interface.d.ts +1 -13
  101. package/lib/network/metadata.d.ts +5 -9
  102. package/lib/network/metadata.js +5 -25
  103. package/lib/network/metadata.js.map +1 -1
  104. package/lib/network/network.d.ts +2 -12
  105. package/lib/network/network.js +8 -59
  106. package/lib/network/network.js.map +1 -1
  107. package/lib/network/options.js +0 -5
  108. package/lib/network/options.js.map +1 -1
  109. package/lib/network/peers/discover.d.ts +5 -9
  110. package/lib/network/peers/discover.js +23 -108
  111. package/lib/network/peers/discover.js.map +1 -1
  112. package/lib/network/peers/peerManager.d.ts +4 -10
  113. package/lib/network/peers/peerManager.js +46 -101
  114. package/lib/network/peers/peerManager.js.map +1 -1
  115. package/lib/network/peers/peersData.d.ts +3 -17
  116. package/lib/network/peers/peersData.js.map +1 -1
  117. package/lib/network/peers/score/constants.d.ts +3 -1
  118. package/lib/network/peers/score/constants.js +3 -1
  119. package/lib/network/peers/score/constants.js.map +1 -1
  120. package/lib/network/peers/score/interface.d.ts +6 -1
  121. package/lib/network/peers/score/interface.js.map +1 -1
  122. package/lib/network/peers/score/score.d.ts +7 -2
  123. package/lib/network/peers/score/score.js +35 -5
  124. package/lib/network/peers/score/score.js.map +1 -1
  125. package/lib/network/peers/score/store.d.ts +10 -3
  126. package/lib/network/peers/score/store.js +15 -6
  127. package/lib/network/peers/score/store.js.map +1 -1
  128. package/lib/network/peers/utils/assertPeerRelevance.d.ts +3 -7
  129. package/lib/network/peers/utils/assertPeerRelevance.js +1 -10
  130. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  131. package/lib/network/peers/utils/prioritizePeers.d.ts +7 -18
  132. package/lib/network/peers/utils/prioritizePeers.js +7 -43
  133. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  134. package/lib/network/processor/extractSlotRootFns.js +1 -8
  135. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  136. package/lib/network/processor/gossipHandlers.js +9 -156
  137. package/lib/network/processor/gossipHandlers.js.map +1 -1
  138. package/lib/network/processor/gossipQueues/index.js +0 -5
  139. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  140. package/lib/network/processor/index.js +0 -1
  141. package/lib/network/processor/index.js.map +1 -1
  142. package/lib/network/reqresp/ReqRespBeaconNode.d.ts +2 -2
  143. package/lib/network/reqresp/ReqRespBeaconNode.js +10 -33
  144. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  145. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +5 -16
  146. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +14 -204
  147. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
  148. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +6 -32
  149. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +28 -283
  150. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
  151. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +1 -1
  152. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  153. package/lib/network/reqresp/handlers/index.js +0 -10
  154. package/lib/network/reqresp/handlers/index.js.map +1 -1
  155. package/lib/network/reqresp/handlers/status.js +2 -3
  156. package/lib/network/reqresp/handlers/status.js.map +1 -1
  157. package/lib/network/reqresp/protocols.d.ts +0 -4
  158. package/lib/network/reqresp/protocols.js +0 -20
  159. package/lib/network/reqresp/protocols.js.map +1 -1
  160. package/lib/network/reqresp/rateLimit.js +1 -11
  161. package/lib/network/reqresp/rateLimit.js.map +1 -1
  162. package/lib/network/reqresp/types.d.ts +8 -15
  163. package/lib/network/reqresp/types.js +3 -10
  164. package/lib/network/reqresp/types.js.map +1 -1
  165. package/lib/network/statusCache.d.ts +5 -5
  166. package/lib/network/statusCache.js.map +1 -1
  167. package/lib/network/subnets/interface.d.ts +0 -3
  168. package/lib/network/subnets/interface.js +1 -14
  169. package/lib/network/subnets/interface.js.map +1 -1
  170. package/lib/network/subnets/syncnetsService.js +5 -4
  171. package/lib/network/subnets/syncnetsService.js.map +1 -1
  172. package/lib/node/nodejs.js +0 -1
  173. package/lib/node/nodejs.js.map +1 -1
  174. package/lib/sync/constants.d.ts +1 -1
  175. package/lib/sync/constants.js +1 -4
  176. package/lib/sync/constants.js.map +1 -1
  177. package/lib/sync/interface.d.ts +2 -2
  178. package/lib/sync/interface.js +1 -1
  179. package/lib/sync/interface.js.map +1 -1
  180. package/lib/sync/range/batch.d.ts +2 -16
  181. package/lib/sync/range/batch.js +7 -38
  182. package/lib/sync/range/batch.js.map +1 -1
  183. package/lib/sync/range/chain.d.ts +1 -16
  184. package/lib/sync/range/chain.js +30 -110
  185. package/lib/sync/range/chain.js.map +1 -1
  186. package/lib/sync/range/range.d.ts +2 -3
  187. package/lib/sync/range/range.js +3 -9
  188. package/lib/sync/range/range.js.map +1 -1
  189. package/lib/sync/range/utils/chainTarget.d.ts +1 -5
  190. package/lib/sync/range/utils/chainTarget.js +1 -26
  191. package/lib/sync/range/utils/chainTarget.js.map +1 -1
  192. package/lib/sync/range/utils/peerBalancer.d.ts +5 -12
  193. package/lib/sync/range/utils/peerBalancer.js +10 -69
  194. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  195. package/lib/sync/unknownBlock.d.ts +1 -8
  196. package/lib/sync/unknownBlock.js +69 -226
  197. package/lib/sync/unknownBlock.js.map +1 -1
  198. package/lib/sync/utils/remoteSyncType.d.ts +4 -4
  199. package/lib/sync/utils/remoteSyncType.js.map +1 -1
  200. package/lib/util/blobs.d.ts +1 -18
  201. package/lib/util/blobs.js +1 -104
  202. package/lib/util/blobs.js.map +1 -1
  203. package/lib/util/metadata.d.ts +0 -4
  204. package/lib/util/metadata.js +0 -7
  205. package/lib/util/metadata.js.map +1 -1
  206. package/lib/util/sszBytes.d.ts +0 -1
  207. package/lib/util/sszBytes.js +0 -17
  208. package/lib/util/sszBytes.js.map +1 -1
  209. package/package.json +14 -14
  210. package/lib/chain/errors/dataColumnSidecarError.d.ts +0 -69
  211. package/lib/chain/errors/dataColumnSidecarError.js +0 -21
  212. package/lib/chain/errors/dataColumnSidecarError.js.map +0 -1
  213. package/lib/chain/validation/dataColumnSidecar.d.ts +0 -28
  214. package/lib/chain/validation/dataColumnSidecar.js +0 -248
  215. package/lib/chain/validation/dataColumnSidecar.js.map +0 -1
  216. package/lib/db/repositories/dataColumnSidecars.d.ts +0 -47
  217. package/lib/db/repositories/dataColumnSidecars.js +0 -40
  218. package/lib/db/repositories/dataColumnSidecars.js.map +0 -1
  219. package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +0 -15
  220. package/lib/db/repositories/dataColumnSidecarsArchive.js +0 -23
  221. package/lib/db/repositories/dataColumnSidecarsArchive.js.map +0 -1
  222. package/lib/network/networkConfig.d.ts +0 -22
  223. package/lib/network/networkConfig.js +0 -29
  224. package/lib/network/networkConfig.js.map +0 -1
  225. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +0 -8
  226. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +0 -106
  227. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +0 -1
  228. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +0 -6
  229. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +0 -57
  230. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +0 -1
  231. package/lib/util/dataColumns.d.ts +0 -132
  232. package/lib/util/dataColumns.js +0 -353
  233. package/lib/util/dataColumns.js.map +0 -1
@@ -6,11 +6,9 @@ import { BatchStatus } from "../batch.js";
6
6
  * Shuffles peers only once on instantiation
7
7
  */
8
8
  export class ChainPeersBalancer {
9
- // TODO: @matthewkeil check if this needs to be updated for custody groups
10
- constructor(peers, batches, custodyConfig) {
9
+ constructor(peers, batches) {
11
10
  this.activeRequestsByPeer = new Map();
12
11
  this.peers = shuffle(peers);
13
- this.custodyConfig = custodyConfig;
14
12
  // Compute activeRequestsByPeer from all batches internal states
15
13
  for (const batch of batches) {
16
14
  if (batch.state.status === BatchStatus.Downloading) {
@@ -23,77 +21,20 @@ export class ChainPeersBalancer {
23
21
  * Sort peers by (1) no failed request (2) less active requests, then pick first
24
22
  */
25
23
  bestPeerToRetryBatch(batch) {
26
- if (batch.state.status !== BatchStatus.AwaitingDownload) {
27
- return;
28
- }
29
- const { partialDownload } = batch.state;
30
- const pendingDataColumns = partialDownload?.pendingDataColumns ?? this.custodyConfig.sampledColumns;
31
- const eligiblePeers = this.filterPeers(batch, pendingDataColumns, false);
32
24
  const failedPeers = new Set(batch.getFailedPeers());
33
- const sortedBestPeers = sortBy(eligiblePeers, ({ syncInfo }) => (failedPeers.has(syncInfo.peerId) ? 1 : 0), // prefer peers without failed requests
34
- ({ syncInfo }) => this.activeRequestsByPeer.get(syncInfo.peerId) ?? 0, // prefer peers with least active req
35
- ({ hasEarliestAvailableSlots }) => (hasEarliestAvailableSlots ? 0 : 1), // prefer peers with earliestAvailableSlots defined
36
- ({ columns }) => -1 * columns // prefer peers with the most columns
25
+ const sortedBestPeers = sortBy(this.peers, (peer) => (failedPeers.has(peer) ? 1 : 0), // Sort by no failed first = 0
26
+ (peer) => this.activeRequestsByPeer.get(peer) ?? 0 // Sort by least active req
37
27
  );
38
- return sortedBestPeers.length > 0 ? sortedBestPeers[0].syncInfo : undefined;
28
+ return sortedBestPeers[0];
39
29
  }
40
30
  /**
41
- * Return peers with 0 or no active requests that has a higher target slot than this batch and has columns we need.
31
+ * Return peers with 0 or no active requests
42
32
  */
43
- idlePeerForBatch(batch) {
44
- const eligiblePeers = this.filterPeers(batch, this.custodyConfig.sampledColumns, true);
45
- // pick idle peer that has (for pre-fulu they are the same)
46
- // - earliestAvailableSlot defined
47
- // - the most columns we need
48
- const sortedBestPeers = sortBy(eligiblePeers, ({ hasEarliestAvailableSlots }) => (hasEarliestAvailableSlots ? 0 : 1), // prefer peers with earliestAvailableSlots defined
49
- ({ columns }) => -1 * columns // prefer peers with most columns we need
50
- );
51
- const bestPeer = sortedBestPeers[0];
52
- if (bestPeer != null) {
53
- // we will use this peer for batch in SyncChain right after this call
54
- this.activeRequestsByPeer.set(bestPeer.syncInfo.peerId, 1);
55
- return bestPeer.syncInfo;
56
- }
57
- return undefined;
58
- }
59
- filterPeers(batch, requestColumns, checkActiveRequest) {
60
- const eligiblePeers = [];
61
- for (const peer of this.peers) {
62
- const { earliestAvailableSlot, custodyGroups, target, peerId } = peer;
63
- const activeRequest = this.activeRequestsByPeer.get(peerId) ?? 0;
64
- if (checkActiveRequest && activeRequest > 0) {
65
- continue;
66
- }
67
- if (target.slot < batch.request.startSlot) {
68
- continue;
69
- }
70
- if (!batch.isFulu()) {
71
- // pre-fulu logic, we don't care columns and earliestAvailableSlot
72
- eligiblePeers.push({ syncInfo: peer, columns: 0, hasEarliestAvailableSlots: false });
73
- continue;
74
- }
75
- // for devnet, we optimistically assume peers without earliestAvailableSlot, but don't prioritize them
76
- // TODO(fulu): consider do not accept these peers
77
- const earliestSlot = earliestAvailableSlot ?? 0;
78
- const peerColumns = custodyGroups;
79
- if (earliestSlot > batch.request.startSlot) {
80
- continue;
81
- }
82
- const columns = peerColumns.reduce((acc, elem) => {
83
- if (requestColumns.includes(elem)) {
84
- acc.push(elem);
85
- }
86
- return acc;
87
- }, []);
88
- if (columns.length > 0) {
89
- eligiblePeers.push({
90
- syncInfo: peer,
91
- columns: columns.length,
92
- hasEarliestAvailableSlots: earliestAvailableSlot != null,
93
- });
94
- }
95
- }
96
- return eligiblePeers;
33
+ idlePeers() {
34
+ return this.peers.filter((peer) => {
35
+ const activeRequests = this.activeRequestsByPeer.get(peer);
36
+ return activeRequests === undefined || activeRequests === 0;
37
+ });
97
38
  }
98
39
  }
99
40
  //# sourceMappingURL=peerBalancer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"peerBalancer.js","sourceRoot":"","sources":["../../../../src/sync/range/utils/peerBalancer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"peerBalancer.js","sourceRoot":"","sources":["../../../../src/sync/range/utils/peerBalancer.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAQ,WAAW,EAAC,MAAM,aAAa,CAAC;AAE/C;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAI7B,YAAY,KAAkB,EAAE,OAAgB;QAFxC,yBAAoB,GAAG,IAAI,GAAG,EAAqB,CAAC;QAG1D,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAE5B,gEAAgE;QAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;gBACnD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,oBAAoB,CAAC,KAAY;QAC/B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;QACpD,MAAM,eAAe,GAAG,MAAM,CAC5B,IAAI,CAAC,KAAK,EACV,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,8BAA8B;QACzE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,2BAA2B;SAC/E,CAAC;QACF,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3D,OAAO,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -58,19 +58,12 @@ export declare class UnknownBlockSync {
58
58
  */
59
59
  private processBlock;
60
60
  /**
61
- * From a set of shuffled peers:
62
- * - fetch the block
63
- * - from deneb, fetch all missing blobs
64
- * - from peerDAS, fetch sampled colmns
65
- * TODO: this means we only have block root, and nothing else. Consider to reflect this in the function name
61
+ * Fetches the parent of a block by root from a set of shuffled peers.
66
62
  * Will attempt a max of `MAX_ATTEMPTS_PER_BLOCK` on different peers if connectPeers.length > MAX_ATTEMPTS_PER_BLOCK.
67
63
  * Also verifies the received block root + returns the peer that provided the block for future downscoring.
68
64
  */
69
65
  private fetchUnknownBlockRoot;
70
66
  /**
71
- * We have partial block input:
72
- * - we have block but not have all blobs (deneb) or needed columns (fulu)
73
- * - we don't have block and have some blobs (deneb) or some columns (fulu)
74
67
  * Fetches missing blobs for the blockinput, in future can also pull block is thats also missing
75
68
  * along with the blobs (i.e. only some blobs are available)
76
69
  */
@@ -1,10 +1,9 @@
1
- import { fromHexString, toHexString } from "@chainsafe/ssz";
2
- import { ForkName, INTERVALS_PER_SLOT, NUMBER_OF_COLUMNS } from "@lodestar/params";
1
+ import { INTERVALS_PER_SLOT } from "@lodestar/params";
3
2
  import { fromHex, pruneSetToMax, toRootHex } from "@lodestar/utils";
4
3
  import { sleep } from "@lodestar/utils";
5
4
  import { BlockInputType } from "../chain/blocks/types.js";
6
5
  import { BlockError, BlockErrorCode } from "../chain/errors/index.js";
7
- import { NetworkEvent } from "../network/index.js";
6
+ import { NetworkEvent, PeerAction } from "../network/index.js";
8
7
  import { beaconBlocksMaybeBlobsByRoot, unavailableBeaconBlobsByRoot, } from "../network/reqresp/beaconBlocksMaybeBlobsByRoot.js";
9
8
  import { byteArrayEquals } from "../util/bytes.js";
10
9
  import { shuffle } from "../util/shuffle.js";
@@ -194,8 +193,8 @@ export class UnknownBlockSync {
194
193
  else {
195
194
  if (blockInputOrRootHex.block !== null) {
196
195
  const { block } = blockInputOrRootHex;
197
- blockRootHex = toHexString(this.config.getForkTypes(block.message.slot).BeaconBlock.hashTreeRoot(block.message));
198
- unknownBlockType = PendingBlockType.UNKNOWN_DATA;
196
+ blockRootHex = toRootHex(this.config.getForkTypes(block.message.slot).BeaconBlock.hashTreeRoot(block.message));
197
+ unknownBlockType = PendingBlockType.UNKNOWN_BLOBS;
199
198
  }
200
199
  else {
201
200
  unknownBlockType = PendingBlockType.UNKNOWN_BLOCKINPUT;
@@ -231,70 +230,23 @@ export class UnknownBlockSync {
231
230
  }
232
231
  return unknownBlockType;
233
232
  }
234
- async downloadBlock(block, allPeers) {
233
+ async downloadBlock(block, connectedPeers) {
235
234
  if (block.status !== PendingBlockStatus.pending) {
236
235
  return;
237
236
  }
238
237
  const unknownBlockType = block.unknownBlockType;
239
- const logCtx = {
238
+ this.logger.verbose("Downloading unknown block", {
240
239
  root: block.blockRootHex,
241
240
  pendingBlocks: this.pendingBlocks.size,
242
241
  slot: block.blockInput?.block?.message.slot ?? "unknown",
243
242
  unknownBlockType,
244
- };
245
- this.logger.verbose("Downloading unknown block", logCtx);
243
+ });
246
244
  block.status = PendingBlockStatus.fetching;
247
245
  let res;
248
- let connectedPeers;
249
246
  if (block.blockInput === null) {
250
- connectedPeers = allPeers;
251
- // we only have block root, and nothing else
252
- res = await wrapError(this.fetchUnknownBlockRoot(fromHexString(block.blockRootHex), connectedPeers));
247
+ res = await wrapError(this.fetchUnknownBlockRoot(fromHex(block.blockRootHex), connectedPeers));
253
248
  }
254
249
  else {
255
- const { cachedData } = block.blockInput;
256
- if (cachedData.fork === ForkName.fulu) {
257
- const { dataColumnsCache } = cachedData;
258
- const sampledColumns = this.network.custodyConfig.sampledColumns;
259
- const neededColumns = sampledColumns.reduce((acc, elem) => {
260
- if (dataColumnsCache.get(elem) === undefined) {
261
- acc.push(elem);
262
- }
263
- return acc;
264
- }, []);
265
- connectedPeers =
266
- neededColumns.length <= 0
267
- ? allPeers
268
- : allPeers.filter((peer) => {
269
- const { custodyGroups: peerColumns } = this.network.getConnectedPeerSyncMeta(peer);
270
- const columns = peerColumns.reduce((acc, elem) => {
271
- if (neededColumns.includes(elem)) {
272
- acc.push(elem);
273
- }
274
- return acc;
275
- }, []);
276
- return columns.length > 0;
277
- });
278
- if (connectedPeers.length > 0) {
279
- this.logger.debug("Filtered peers to those having relevant columns for downloading data", {
280
- ...logCtx,
281
- allPeers: allPeers.length,
282
- connectedPeers: connectedPeers.length,
283
- });
284
- }
285
- else {
286
- this.logger.debug("Skipping download as no filtered peers having relevant data", {
287
- ...logCtx,
288
- allPeers: allPeers.length,
289
- connectedPeers: connectedPeers.length,
290
- neededColumns: neededColumns.join(" "),
291
- });
292
- return;
293
- }
294
- }
295
- else {
296
- connectedPeers = allPeers;
297
- }
298
250
  res = await wrapError(this.fetchUnavailableBlockInput(block.blockInput, connectedPeers));
299
251
  }
300
252
  if (res.err)
@@ -303,73 +255,48 @@ export class UnknownBlockSync {
303
255
  this.metrics?.syncUnknownBlock.downloadedBlocksSuccess.inc();
304
256
  if (!res.err) {
305
257
  const { blockInput, peerIdStr } = res.result;
306
- if (blockInput.type === BlockInputType.dataPromise) {
307
- // if there were any peers who would have had the missing datacolumns, it would have resulted in err
308
- block = {
309
- ...block,
310
- blockInput,
311
- unknownBlockType: PendingBlockType.UNKNOWN_DATA,
312
- };
313
- block.blockInput = blockInput;
314
- this.pendingBlocks.set(block.blockRootHex, block);
315
- block.status = PendingBlockStatus.pending;
316
- // parentSlot > finalizedSlot, continue downloading parent of parent
317
- block.downloadAttempts += this.config.CUSTODY_REQUIREMENT / NUMBER_OF_COLUMNS;
318
- const errorData = { root: block.blockRootHex, attempts: block.downloadAttempts, unknownBlockType };
319
- if (block.downloadAttempts > MAX_ATTEMPTS_PER_BLOCK) {
320
- // Give up on this block and assume it does not exist, penalizing all peers as if it was a bad block
321
- this.logger.debug("Ignoring unknown block after many failed downloads", errorData);
322
- this.removeAndDownscoreAllDescendants(block);
323
- }
324
- else {
325
- // Try again when a new peer connects, its status changes, or a new unknownBlockParent event happens
326
- this.logger.debug("Error downloading full unknown block", errorData);
327
- }
258
+ block = {
259
+ ...block,
260
+ status: PendingBlockStatus.downloaded,
261
+ blockInput,
262
+ parentBlockRootHex: toRootHex(blockInput.block.message.parentRoot),
263
+ };
264
+ this.pendingBlocks.set(block.blockRootHex, block);
265
+ const blockSlot = blockInput.block.message.slot;
266
+ const finalizedSlot = this.chain.forkChoice.getFinalizedBlock().slot;
267
+ const delaySec = Date.now() / 1000 - (this.chain.genesisTime + blockSlot * this.config.SECONDS_PER_SLOT);
268
+ this.metrics?.syncUnknownBlock.elapsedTimeTillReceived.observe(delaySec);
269
+ const parentInForkchoice = this.chain.forkChoice.hasBlock(blockInput.block.message.parentRoot);
270
+ this.logger.verbose("Downloaded unknown block", {
271
+ root: block.blockRootHex,
272
+ pendingBlocks: this.pendingBlocks.size,
273
+ parentInForkchoice,
274
+ blockInputType: blockInput.type,
275
+ unknownBlockType,
276
+ });
277
+ if (parentInForkchoice) {
278
+ // Bingo! Process block. Add to pending blocks anyway for recycle the cache that prevents duplicate processing
279
+ this.processBlock(block).catch((e) => {
280
+ this.logger.debug("Unexpected error - process newly downloaded block", {}, e);
281
+ });
328
282
  }
329
- else {
330
- block = {
331
- ...block,
332
- status: PendingBlockStatus.downloaded,
333
- blockInput,
334
- parentBlockRootHex: toHexString(blockInput.block.message.parentRoot),
335
- };
336
- this.pendingBlocks.set(block.blockRootHex, block);
337
- const blockSlot = blockInput.block.message.slot;
338
- const finalizedSlot = this.chain.forkChoice.getFinalizedBlock().slot;
339
- const delaySec = Date.now() / 1000 - (this.chain.genesisTime + blockSlot * this.config.SECONDS_PER_SLOT);
340
- this.metrics?.syncUnknownBlock.elapsedTimeTillReceived.observe(delaySec);
341
- const parentInForkchoice = this.chain.forkChoice.hasBlock(blockInput.block.message.parentRoot);
342
- this.logger.verbose("Downloaded unknown block", {
343
- root: block.blockRootHex,
344
- pendingBlocks: this.pendingBlocks.size,
345
- parentInForkchoice,
346
- blockInputType: blockInput.type,
283
+ else if (blockSlot <= finalizedSlot) {
284
+ // the common ancestor of the downloading chain and canonical chain should be at least the finalized slot and
285
+ // we should found it through forkchoice. If not, we should penalize all peers sending us this block chain
286
+ // 0 - 1 - ... - n - finalizedSlot
287
+ // \
288
+ // parent 1 - parent 2 - ... - unknownParent block
289
+ const blockRoot = this.config.getForkTypes(blockSlot).BeaconBlock.hashTreeRoot(blockInput.block.message);
290
+ this.logger.debug("Downloaded block is before finalized slot", {
291
+ finalizedSlot,
292
+ blockSlot,
293
+ parentRoot: toRootHex(blockRoot),
347
294
  unknownBlockType,
348
295
  });
349
- if (parentInForkchoice) {
350
- // Bingo! Process block. Add to pending blocks anyway for recycle the cache that prevents duplicate processing
351
- this.processBlock(block).catch((e) => {
352
- this.logger.debug("Unexpected error - process newly downloaded block", {}, e);
353
- });
354
- }
355
- else if (blockSlot <= finalizedSlot) {
356
- // the common ancestor of the downloading chain and canonical chain should be at least the finalized slot and
357
- // we should found it through forkchoice. If not, we should penalize all peers sending us this block chain
358
- // 0 - 1 - ... - n - finalizedSlot
359
- // \
360
- // parent 1 - parent 2 - ... - unknownParent block
361
- const blockRoot = this.config.getForkTypes(blockSlot).BeaconBlock.hashTreeRoot(blockInput.block.message);
362
- this.logger.debug("Downloaded block is before finalized slot", {
363
- finalizedSlot,
364
- blockSlot,
365
- parentRoot: toHexString(blockRoot),
366
- unknownBlockType,
367
- });
368
- this.removeAndDownscoreAllDescendants(block);
369
- }
370
- else {
371
- this.onUnknownParent({ blockInput, peer: peerIdStr });
372
- }
296
+ this.removeAndDownscoreAllDescendants(block);
297
+ }
298
+ else {
299
+ this.onUnknownParent({ blockInput, peer: peerIdStr });
373
300
  }
374
301
  }
375
302
  else {
@@ -476,11 +403,7 @@ export class UnknownBlockSync {
476
403
  }
477
404
  }
478
405
  /**
479
- * From a set of shuffled peers:
480
- * - fetch the block
481
- * - from deneb, fetch all missing blobs
482
- * - from peerDAS, fetch sampled colmns
483
- * TODO: this means we only have block root, and nothing else. Consider to reflect this in the function name
406
+ * Fetches the parent of a block by root from a set of shuffled peers.
484
407
  * Will attempt a max of `MAX_ATTEMPTS_PER_BLOCK` on different peers if connectPeers.length > MAX_ATTEMPTS_PER_BLOCK.
485
408
  * Also verifies the received block root + returns the peer that provided the block for future downscoring.
486
409
  */
@@ -488,58 +411,24 @@ export class UnknownBlockSync {
488
411
  const shuffledPeers = shuffle(connectedPeers);
489
412
  const blockRootHex = toRootHex(blockRoot);
490
413
  let lastError = null;
491
- let partialDownload = null;
492
- let fetchedPeerId = null;
493
414
  for (let i = 0; i < MAX_ATTEMPTS_PER_BLOCK; i++) {
494
- const peerId = shuffledPeers[i % shuffledPeers.length];
495
- const { custodyGroups: peerColumns, client: peerClient } = this.network.getConnectedPeerSyncMeta(peerId);
496
- if (partialDownload !== null) {
497
- const [prevBlockInput] = partialDownload.blocks;
498
- if (prevBlockInput === undefined || prevBlockInput.type !== BlockInputType.dataPromise) {
499
- throw Error(`prevBlockInput=${prevBlockInput?.type} in partialDownload`);
500
- }
501
- const { cachedData } = prevBlockInput;
502
- if (cachedData.fork === ForkName.fulu) {
503
- const { dataColumnsCache } = cachedData;
504
- const sampledColumns = this.network.custodyConfig.sampledColumns;
505
- const neededColumns = sampledColumns.reduce((acc, elem) => {
506
- if (dataColumnsCache.get(elem) === undefined) {
507
- acc.push(elem);
508
- }
509
- return acc;
510
- }, []);
511
- const columns = peerColumns.reduce((acc, elem) => {
512
- if (neededColumns.includes(elem)) {
513
- acc.push(elem);
514
- }
515
- return acc;
516
- }, []);
517
- if (columns.length === 0) {
518
- continue;
519
- }
520
- }
521
- }
415
+ const peer = shuffledPeers[i % shuffledPeers.length];
522
416
  try {
523
- const { blocks: [blockInput], pendingDataColumns, } = await beaconBlocksMaybeBlobsByRoot(this.config, this.network, peerId, [blockRoot], partialDownload, peerClient, this.metrics, this.logger);
417
+ const [blockInput] = await beaconBlocksMaybeBlobsByRoot(this.config, this.network, peer, [blockRoot]);
524
418
  // Peer does not have the block, try with next peer
525
419
  if (blockInput === undefined) {
526
420
  continue;
527
421
  }
528
- if (pendingDataColumns !== null) {
529
- partialDownload = { blocks: [blockInput], pendingDataColumns };
530
- fetchedPeerId = peerId;
531
- continue;
532
- }
533
422
  // Verify block root is correct
534
423
  const block = blockInput.block.message;
535
424
  const receivedBlockRoot = this.config.getForkTypes(block.slot).BeaconBlock.hashTreeRoot(block);
536
425
  if (!byteArrayEquals(receivedBlockRoot, blockRoot)) {
537
426
  throw Error(`Wrong block received by peer, got ${toRootHex(receivedBlockRoot)} expected ${blockRootHex}`);
538
427
  }
539
- return { blockInput, peerIdStr: peerId };
428
+ return { blockInput, peerIdStr: peer };
540
429
  }
541
430
  catch (e) {
542
- this.logger.debug("Error fetching UnknownBlockRoot", { attempt: i, blockRootHex, peer: peerId }, e);
431
+ this.logger.debug("Error fetching UnknownBlockRoot", { attempt: i, blockRootHex, peer }, e);
543
432
  lastError = e;
544
433
  }
545
434
  }
@@ -547,16 +436,9 @@ export class UnknownBlockSync {
547
436
  lastError.message = `Error fetching UnknownBlockRoot after ${MAX_ATTEMPTS_PER_BLOCK} attempts: ${lastError.message}`;
548
437
  throw lastError;
549
438
  }
550
- if (partialDownload !== null && fetchedPeerId !== null) {
551
- const { blocks: [blockInput], } = partialDownload;
552
- return { blockInput, peerIdStr: fetchedPeerId };
553
- }
554
- throw Error(`Error fetching UnknownBlockRoot after ${MAX_ATTEMPTS_PER_BLOCK}: unknown error because either partialDownload is null=${partialDownload === null} or fetchedPeerId is null=${fetchedPeerId === null} `);
439
+ throw Error(`Error fetching UnknownBlockRoot after ${MAX_ATTEMPTS_PER_BLOCK}: unknown error`);
555
440
  }
556
441
  /**
557
- * We have partial block input:
558
- * - we have block but not have all blobs (deneb) or needed columns (fulu)
559
- * - we don't have block and have some blobs (deneb) or some columns (fulu)
560
442
  * Fetches missing blobs for the blockinput, in future can also pull block is thats also missing
561
443
  * along with the blobs (i.e. only some blobs are available)
562
444
  */
@@ -566,74 +448,37 @@ export class UnknownBlockSync {
566
448
  }
567
449
  const shuffledPeers = shuffle(connectedPeers);
568
450
  let blockRootHex;
451
+ let pendingBlobs;
569
452
  let blobKzgCommitmentsLen;
570
453
  let blockRoot;
571
- const dataMeta = {};
572
- let sampledColumns = [];
573
454
  if (unavailableBlockInput.block === null) {
574
455
  blockRootHex = unavailableBlockInput.blockRootHex;
575
456
  blockRoot = fromHex(blockRootHex);
576
457
  }
577
458
  else {
578
- const { cachedData, block: unavailableBlock } = unavailableBlockInput;
459
+ const unavailableBlock = unavailableBlockInput.block;
579
460
  blockRoot = this.config
580
461
  .getForkTypes(unavailableBlock.message.slot)
581
462
  .BeaconBlock.hashTreeRoot(unavailableBlock.message);
582
463
  blockRootHex = toRootHex(blockRoot);
583
464
  blobKzgCommitmentsLen = unavailableBlock.message.body.blobKzgCommitments.length;
584
- if (cachedData.fork === ForkName.deneb || cachedData.fork === ForkName.electra) {
585
- const pendingBlobs = blobKzgCommitmentsLen - cachedData.blobsCache.size;
586
- Object.assign(dataMeta, { pendingBlobs });
587
- }
588
- else if (cachedData.fork === ForkName.fulu) {
589
- sampledColumns = this.network.custodyConfig.sampledColumns;
590
- const pendingColumns = sampledColumns.length - cachedData.dataColumnsCache.size;
591
- Object.assign(dataMeta, { pendingColumns });
592
- }
465
+ pendingBlobs = blobKzgCommitmentsLen - unavailableBlockInput.cachedData.blobsCache.size;
593
466
  }
594
467
  let lastError = null;
595
468
  for (let i = 0; i < MAX_ATTEMPTS_PER_BLOCK; i++) {
596
- const peerId = shuffledPeers[i % shuffledPeers.length];
597
- const { custodyGroups: peerColumns, client: peerClient } = this.network.getConnectedPeerSyncMeta(peerId);
598
- if (unavailableBlockInput.block !== null) {
599
- const { cachedData } = unavailableBlockInput;
600
- if (cachedData.fork === ForkName.fulu) {
601
- const { dataColumnsCache } = cachedData;
602
- const neededColumns = sampledColumns.reduce((acc, elem) => {
603
- if (dataColumnsCache.get(elem) === undefined) {
604
- acc.push(elem);
605
- }
606
- return acc;
607
- }, []);
608
- const columns = peerColumns.reduce((acc, elem) => {
609
- if (neededColumns.includes(elem)) {
610
- acc.push(elem);
611
- }
612
- return acc;
613
- }, []);
614
- if (columns.length === 0) {
615
- continue;
616
- }
617
- }
618
- }
469
+ const peer = shuffledPeers[i % shuffledPeers.length];
619
470
  try {
620
- const blockInput = await unavailableBeaconBlobsByRoot(this.config, this.network, peerId, peerClient, unavailableBlockInput, {
471
+ const blockInput = await unavailableBeaconBlobsByRoot(this.config, this.network, peer, unavailableBlockInput, {
621
472
  metrics: this.metrics,
622
- logger: this.logger,
623
- executionEngine: this.chain.executionEngine,
624
473
  emitter: this.chain.emitter,
625
- blockInputsRetryTrackerCache: this.blockInputsRetryTrackerCache,
474
+ executionEngine: this.chain.executionEngine,
626
475
  engineGetBlobsCache: this.engineGetBlobsCache,
476
+ blockInputsRetryTrackerCache: this.blockInputsRetryTrackerCache,
627
477
  });
628
478
  // Peer does not have the block, try with next peer
629
479
  if (blockInput === undefined) {
630
480
  continue;
631
481
  }
632
- if (unavailableBlockInput.block !== null && blockInput.type === BlockInputType.dataPromise) {
633
- // all datacolumns were not downloaded we can continue with other peers
634
- // as unavailableBlockInput.block's dataColumnsCache would be updated
635
- continue;
636
- }
637
482
  // Verify block root is correct
638
483
  const block = blockInput.block.message;
639
484
  const receivedBlockRoot = this.config.getForkTypes(block.slot).BeaconBlock.hashTreeRoot(block);
@@ -644,12 +489,12 @@ export class UnknownBlockSync {
644
489
  this.logger.debug("Fetched NullBlockInput", { attempts: i, blockRootHex });
645
490
  }
646
491
  else {
647
- this.logger.debug("Fetched UnavailableBlockInput", { attempts: i, ...dataMeta, blobKzgCommitmentsLen });
492
+ this.logger.debug("Fetched UnavailableBlockInput", { attempts: i, pendingBlobs, blobKzgCommitmentsLen });
648
493
  }
649
- return { blockInput, peerIdStr: peerId };
494
+ return { blockInput, peerIdStr: peer };
650
495
  }
651
496
  catch (e) {
652
- this.logger.debug("Error fetching UnavailableBlockInput", { attempt: i, blockRootHex, peer: peerId }, e);
497
+ this.logger.debug("Error fetching UnavailableBlockInput", { attempt: i, blockRootHex, peer }, e);
653
498
  lastError = e;
654
499
  }
655
500
  }
@@ -668,15 +513,13 @@ export class UnknownBlockSync {
668
513
  removeAndDownscoreAllDescendants(block) {
669
514
  // Get all blocks that are a descendant of this one
670
515
  const badPendingBlocks = this.removeAllDescendants(block);
671
- // just console log and do not penalize on pending/bad blocks for debugging
672
- // console.log("removeAndDownscoreAllDescendants", {block});
673
516
  for (const block of badPendingBlocks) {
674
- // this.knownBadBlocks.add(block.blockRootHex);
675
- // for (const peerIdStr of block.peerIdStrs) {
676
- // // TODO: Refactor peerRpcScores to work with peerIdStr only
677
- // this.network.reportPeer(peerIdStr, PeerAction.LowToleranceError, "BadBlockByRoot");
678
- // }
679
- this.logger.debug("ignored Banning unknown block", {
517
+ this.knownBadBlocks.add(block.blockRootHex);
518
+ for (const peerIdStr of block.peerIdStrs) {
519
+ // TODO: Refactor peerRpcScores to work with peerIdStr only
520
+ this.network.reportPeer(peerIdStr, PeerAction.LowToleranceError, "BadBlockByRoot");
521
+ }
522
+ this.logger.debug("Banning unknown block", {
680
523
  root: block.blockRootHex,
681
524
  peerIdStrs: Array.from(block.peerIdStrs).join(","),
682
525
  });