@lodestar/beacon-node 1.34.0-dev.27285cdee9 → 1.34.0-dev.44611dcdcc

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 (140) hide show
  1. package/lib/api/impl/beacon/blocks/index.js +35 -34
  2. package/lib/api/impl/beacon/blocks/index.js.map +1 -1
  3. package/lib/api/impl/beacon/pool/index.js +3 -3
  4. package/lib/api/impl/beacon/pool/index.js.map +1 -1
  5. package/lib/api/impl/beacon/state/index.js +15 -16
  6. package/lib/api/impl/beacon/state/index.js.map +1 -1
  7. package/lib/api/impl/debug/index.js +2 -2
  8. package/lib/api/impl/debug/index.js.map +1 -1
  9. package/lib/api/impl/validator/index.js +37 -26
  10. package/lib/api/impl/validator/index.js.map +1 -1
  11. package/lib/api/impl/validator/utils.d.ts +3 -3
  12. package/lib/api/impl/validator/utils.js +2 -2
  13. package/lib/api/impl/validator/utils.js.map +1 -1
  14. package/lib/chain/archiveStore/utils/archiveBlocks.js +19 -20
  15. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  16. package/lib/chain/blocks/utils/zebraBanner.d.ts +2 -0
  17. package/lib/chain/blocks/utils/zebraBanner.js +45 -0
  18. package/lib/chain/blocks/utils/zebraBanner.js.map +1 -0
  19. package/lib/chain/blocks/verifyBlock.js +18 -5
  20. package/lib/chain/blocks/verifyBlock.js.map +1 -1
  21. package/lib/chain/blocks/writeBlockInputToDb.js +7 -34
  22. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  23. package/lib/chain/chain.d.ts +8 -80
  24. package/lib/chain/chain.js +51 -76
  25. package/lib/chain/chain.js.map +1 -1
  26. package/lib/chain/interface.d.ts +3 -10
  27. package/lib/chain/interface.js.map +1 -1
  28. package/lib/chain/prepareNextSlot.js +2 -1
  29. package/lib/chain/prepareNextSlot.js.map +1 -1
  30. package/lib/chain/produceBlock/produceBlockBody.d.ts +30 -18
  31. package/lib/chain/produceBlock/produceBlockBody.js +27 -32
  32. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  33. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +6 -4
  34. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +21 -23
  35. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
  36. package/lib/chain/validation/dataColumnSidecar.d.ts +2 -1
  37. package/lib/chain/validation/dataColumnSidecar.js +9 -8
  38. package/lib/chain/validation/dataColumnSidecar.js.map +1 -1
  39. package/lib/db/beacon.d.ts +3 -3
  40. package/lib/db/beacon.js +3 -3
  41. package/lib/db/beacon.js.map +1 -1
  42. package/lib/db/interface.d.ts +3 -3
  43. package/lib/db/repositories/dataColumnSidecar.d.ts +26 -0
  44. package/lib/db/repositories/dataColumnSidecar.js +39 -0
  45. package/lib/db/repositories/dataColumnSidecar.js.map +1 -0
  46. package/lib/db/repositories/dataColumnSidecarArchive.d.ts +24 -0
  47. package/lib/db/repositories/dataColumnSidecarArchive.js +39 -0
  48. package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -0
  49. package/lib/db/repositories/index.d.ts +2 -2
  50. package/lib/db/repositories/index.js +2 -2
  51. package/lib/db/repositories/index.js.map +1 -1
  52. package/lib/execution/builder/http.d.ts +20 -4
  53. package/lib/execution/builder/http.js +30 -11
  54. package/lib/execution/builder/http.js.map +1 -1
  55. package/lib/execution/builder/interface.d.ts +5 -4
  56. package/lib/execution/engine/http.d.ts +2 -2
  57. package/lib/execution/engine/http.js.map +1 -1
  58. package/lib/execution/engine/interface.d.ts +2 -11
  59. package/lib/execution/engine/mock.d.ts +4 -1
  60. package/lib/execution/engine/mock.js +54 -16
  61. package/lib/execution/engine/mock.js.map +1 -1
  62. package/lib/execution/engine/types.d.ts +5 -5
  63. package/lib/execution/engine/types.js +2 -2
  64. package/lib/execution/engine/types.js.map +1 -1
  65. package/lib/metrics/metrics/beacon.d.ts +1 -5
  66. package/lib/metrics/metrics/beacon.js +4 -14
  67. package/lib/metrics/metrics/beacon.js.map +1 -1
  68. package/lib/metrics/metrics/lodestar.d.ts +5 -0
  69. package/lib/metrics/metrics/lodestar.js +14 -0
  70. package/lib/metrics/metrics/lodestar.js.map +1 -1
  71. package/lib/network/core/networkCore.js +11 -6
  72. package/lib/network/core/networkCore.js.map +1 -1
  73. package/lib/network/gossip/topic.d.ts +579 -51
  74. package/lib/network/interface.d.ts +3 -3
  75. package/lib/network/network.d.ts +3 -3
  76. package/lib/network/network.js +1 -1
  77. package/lib/network/network.js.map +1 -1
  78. package/lib/network/options.js +2 -2
  79. package/lib/network/peers/discover.js +1 -1
  80. package/lib/network/peers/discover.js.map +1 -1
  81. package/lib/network/peers/peerManager.js +5 -5
  82. package/lib/network/peers/peerManager.js.map +1 -1
  83. package/lib/network/peers/utils/prioritizePeers.d.ts +2 -1
  84. package/lib/network/peers/utils/prioritizePeers.js +5 -5
  85. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  86. package/lib/network/processor/gossipHandlers.js +9 -6
  87. package/lib/network/processor/gossipHandlers.js.map +1 -1
  88. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +6 -3
  89. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +45 -17
  90. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
  91. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +7 -2
  92. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +7 -7
  93. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
  94. package/lib/network/reqresp/handlers/beaconBlocksByRange.js +3 -3
  95. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  96. package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts +2 -2
  97. package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
  98. package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +2 -2
  99. package/lib/network/reqresp/handlers/blobSidecarsByRange.js +2 -3
  100. package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
  101. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +3 -3
  102. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +27 -46
  103. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -1
  104. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +2 -2
  105. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +7 -21
  106. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -1
  107. package/lib/network/reqresp/handlers/index.js +4 -3
  108. package/lib/network/reqresp/handlers/index.js.map +1 -1
  109. package/lib/network/reqresp/rateLimit.js +11 -5
  110. package/lib/network/reqresp/rateLimit.js.map +1 -1
  111. package/lib/network/reqresp/types.d.ts +3 -3
  112. package/lib/network/reqresp/types.js +3 -3
  113. package/lib/network/reqresp/types.js.map +1 -1
  114. package/lib/sync/range/chain.d.ts +1 -1
  115. package/lib/sync/range/chain.js +2 -2
  116. package/lib/sync/range/chain.js.map +1 -1
  117. package/lib/sync/range/range.js +2 -2
  118. package/lib/sync/range/range.js.map +1 -1
  119. package/lib/sync/range/utils/peerBalancer.d.ts +3 -1
  120. package/lib/sync/range/utils/peerBalancer.js +20 -1
  121. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  122. package/lib/sync/unknownBlock.d.ts +46 -4
  123. package/lib/sync/unknownBlock.js +305 -201
  124. package/lib/sync/unknownBlock.js.map +1 -1
  125. package/lib/util/blobs.d.ts +3 -13
  126. package/lib/util/blobs.js +9 -47
  127. package/lib/util/blobs.js.map +1 -1
  128. package/lib/util/dataColumns.d.ts +7 -5
  129. package/lib/util/dataColumns.js +32 -27
  130. package/lib/util/dataColumns.js.map +1 -1
  131. package/lib/util/types.d.ts +7 -0
  132. package/lib/util/types.js +3 -0
  133. package/lib/util/types.js.map +1 -1
  134. package/package.json +16 -16
  135. package/lib/db/repositories/dataColumnSidecars.d.ts +0 -47
  136. package/lib/db/repositories/dataColumnSidecars.js +0 -40
  137. package/lib/db/repositories/dataColumnSidecars.js.map +0 -1
  138. package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +0 -15
  139. package/lib/db/repositories/dataColumnSidecarsArchive.js +0 -23
  140. package/lib/db/repositories/dataColumnSidecarsArchive.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { PeerSyncMeta } from "../../../network/peers/peersData.js";
2
2
  import { CustodyConfig } from "../../../util/dataColumns.js";
3
+ import { RangeSyncType } from "../../utils/remoteSyncType.js";
3
4
  import { Batch } from "../batch.js";
4
5
  import { ChainTarget } from "./chainTarget.js";
5
6
  export type PeerSyncInfo = PeerSyncMeta & {
@@ -13,12 +14,13 @@ export declare class ChainPeersBalancer {
13
14
  private peers;
14
15
  private activeRequestsByPeer;
15
16
  private readonly custodyConfig;
17
+ private readonly syncType;
16
18
  private readonly maxConcurrentRequests;
17
19
  /**
18
20
  * No need to specify `maxConcurrentRequests` for production code
19
21
  * It is used for testing purposes to limit the number of concurrent requests
20
22
  */
21
- constructor(peers: PeerSyncInfo[], batches: Batch[], custodyConfig: CustodyConfig, maxConcurrentRequests?: number);
23
+ constructor(peers: PeerSyncInfo[], batches: Batch[], custodyConfig: CustodyConfig, syncType: RangeSyncType, maxConcurrentRequests?: number);
22
24
  /**
23
25
  * Return the most suitable peer to retry
24
26
  * Sort peers by (1) no failed request (2) less active requests, then pick first
@@ -1,6 +1,7 @@
1
1
  import { shuffle } from "../../../util/shuffle.js";
2
2
  import { sortBy } from "../../../util/sortBy.js";
3
3
  import { MAX_CONCURRENT_REQUESTS } from "../../constants.js";
4
+ import { RangeSyncType } from "../../utils/remoteSyncType.js";
4
5
  import { BatchStatus } from "../batch.js";
5
6
  /**
6
7
  * Balance and organize peers to perform requests with a SyncChain
@@ -11,10 +12,11 @@ export class ChainPeersBalancer {
11
12
  * No need to specify `maxConcurrentRequests` for production code
12
13
  * It is used for testing purposes to limit the number of concurrent requests
13
14
  */
14
- constructor(peers, batches, custodyConfig, maxConcurrentRequests = MAX_CONCURRENT_REQUESTS) {
15
+ constructor(peers, batches, custodyConfig, syncType, maxConcurrentRequests = MAX_CONCURRENT_REQUESTS) {
15
16
  this.activeRequestsByPeer = new Map();
16
17
  this.peers = shuffle(peers);
17
18
  this.custodyConfig = custodyConfig;
19
+ this.syncType = syncType;
18
20
  this.maxConcurrentRequests = maxConcurrentRequests;
19
21
  // Compute activeRequestsByPeer from all batches internal states
20
22
  for (const batch of batches) {
@@ -51,6 +53,9 @@ export class ChainPeersBalancer {
51
53
  * Return peers with 0 or no active requests that has a higher target slot than this batch and has columns we need.
52
54
  */
53
55
  idlePeerForBatch(batch) {
56
+ if (batch.state.status !== BatchStatus.AwaitingDownload) {
57
+ return;
58
+ }
54
59
  const eligiblePeers = this.filterPeers(batch, this.custodyConfig.sampledColumns, true);
55
60
  // pick idle peer that has (for pre-fulu they are the same)
56
61
  // - earliestAvailableSlot defined
@@ -67,6 +72,9 @@ export class ChainPeersBalancer {
67
72
  }
68
73
  filterPeers(batch, requestColumns, noActiveRequest) {
69
74
  const eligiblePeers = [];
75
+ if (batch.state.status !== BatchStatus.AwaitingDownload) {
76
+ return eligiblePeers;
77
+ }
70
78
  for (const peer of this.peers) {
71
79
  const { earliestAvailableSlot, custodyGroups, target, peerId } = peer;
72
80
  const activeRequest = this.activeRequestsByPeer.get(peerId) ?? 0;
@@ -81,6 +89,17 @@ export class ChainPeersBalancer {
81
89
  if (target.slot < batch.request.startSlot) {
82
90
  continue;
83
91
  }
92
+ if (batch.isPostFulu() && this.syncType === RangeSyncType.Head) {
93
+ // for head sync, target slot is head slot and each peer may have a different head slot
94
+ // we don't want to retry a batch with a peer that's not as up-to-date as the previous peer
95
+ // see https://github.com/ChainSafe/lodestar/issues/8193
96
+ const blocks = batch.state.partialDownload?.blocks;
97
+ const lastBlock = blocks?.at(-1)?.block;
98
+ const lastBlockSlot = lastBlock?.message?.slot;
99
+ if (lastBlockSlot && lastBlockSlot > target.slot) {
100
+ continue;
101
+ }
102
+ }
84
103
  if (!batch.isPostFulu()) {
85
104
  // pre-fulu logic, we don't care columns and earliestAvailableSlot
86
105
  eligiblePeers.push({ syncInfo: peer, columns: 0, hasEarliestAvailableSlots: false });
@@ -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":"AAGA,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAC,uBAAuB,EAAC,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAC,aAAa,EAAC,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAQ,WAAW,EAAC,MAAM,aAAa,CAAC;AAS/C;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAO7B;;;OAGG;IACH,YACE,KAAqB,EACrB,OAAgB,EAChB,aAA4B,EAC5B,QAAuB,EACvB,qBAAqB,GAAG,uBAAuB;QAdzC,yBAAoB,GAAG,IAAI,GAAG,EAAqB,CAAC;QAgB1D,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;QAEnD,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,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,gBAAgB,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QACD,MAAM,EAAC,eAAe,EAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QACtC,MAAM,kBAAkB,GAAG,eAAe,EAAE,kBAAkB,IAAI,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;QACpG,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAEzE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;QACpD,MAAM,eAAe,GAAG,MAAM,CAC5B,aAAa,EACb,CAAC,EAAC,QAAQ,EAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,uCAAuC;QACnG,CAAC,EAAC,QAAQ,EAAC,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,qCAAqC;QAC1G,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,qCAAqC;SAClE,CAAC;QAEF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YACpC,qEAAqE;YACrE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAC3B,QAAQ,CAAC,QAAQ,CAAC,MAAM,EACxB,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CACnE,CAAC;YACF,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAY;QAC3B,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,gBAAgB,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAEvF,2DAA2D;QAC3D,kCAAkC;QAClC,6BAA6B;QAC7B,MAAM,eAAe,GAAG,MAAM,CAC5B,aAAa,EACb,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,yCAAyC;SACtE,CAAC;QACF,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,qEAAqE;YACrE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,WAAW,CAAC,KAAY,EAAE,cAAwB,EAAE,eAAwB;QAClF,MAAM,aAAa,GAAqB,EAAE,CAAC;QAE3C,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,gBAAgB,EAAE,CAAC;YACxD,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,EAAC,qBAAqB,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAC,GAAG,IAAI,CAAC;YAEpE,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjE,IAAI,eAAe,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACzC,uFAAuF;gBACvF,SAAS;YACX,CAAC;YAED,IAAI,aAAa,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAChD,wFAAwF;gBACxF,SAAS;YACX,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC1C,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;gBAC/D,uFAAuF;gBACvF,2FAA2F;gBAC3F,wDAAwD;gBACxD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC;gBACnD,MAAM,SAAS,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;gBACxC,MAAM,aAAa,GAAG,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;gBAC/C,IAAI,aAAa,IAAI,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;oBACjD,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;gBACxB,kEAAkE;gBAClE,aAAa,CAAC,IAAI,CAAC,EAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,yBAAyB,EAAE,KAAK,EAAC,CAAC,CAAC;gBACnF,SAAS;YACX,CAAC;YAED,sGAAsG;YACtG,wDAAwD;YACxD,IAAI,qBAAqB,IAAI,IAAI,EAAE,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,IAAI,qBAAqB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACpD,SAAS;YACX,CAAC;YAED,MAAM,WAAW,GAAG,aAAa,CAAC;YAClC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;gBAC/C,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC,EAAE,EAAc,CAAC,CAAC;YAEnB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,aAAa,CAAC,IAAI,CAAC;oBACjB,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE,OAAO,CAAC,MAAM;oBACvB,yBAAyB,EAAE,qBAAqB,IAAI,IAAI;iBACzD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;CACF"}
@@ -1,8 +1,12 @@
1
1
  import { ChainForkConfig } from "@lodestar/config";
2
2
  import { Logger } from "@lodestar/utils";
3
+ import { BlockInput, NullBlockInput } from "../chain/blocks/types.js";
3
4
  import { IBeaconChain } from "../chain/index.js";
4
5
  import { Metrics } from "../metrics/index.js";
5
6
  import { INetwork } from "../network/index.js";
7
+ import { PeerSyncMeta } from "../network/peers/peersData.js";
8
+ import { CustodyConfig } from "../util/dataColumns.js";
9
+ import { PeerIdStr } from "../util/peerId.js";
6
10
  import { SyncOptions } from "./options.js";
7
11
  export declare class UnknownBlockSync {
8
12
  private readonly config;
@@ -21,6 +25,7 @@ export declare class UnknownBlockSync {
21
25
  private subscribedToNetworkEvents;
22
26
  private engineGetBlobsCache;
23
27
  private blockInputsRetryTrackerCache;
28
+ private peerBalancer;
24
29
  constructor(config: ChainForkConfig, network: INetwork, chain: IBeaconChain, logger: Logger, metrics: Metrics | null, opts?: SyncOptions | undefined);
25
30
  subscribeToNetwork(): void;
26
31
  unsubscribeFromNetwork(): void;
@@ -40,13 +45,15 @@ export declare class UnknownBlockSync {
40
45
  private onUnknownParent;
41
46
  /**
42
47
  * When a blockInput comes with an unknown parent:
43
- * - add the block to pendingBlocks with status downloaded, blockRootHex as key. This is similar to
48
+ * - add the block to pendingBlocks with status downloaded or pending blockRootHex as key. This is similar to
44
49
  * an `onUnknownBlock` event, but the blocks is downloaded.
45
50
  * - add the parent root to pendingBlocks with status pending, parentBlockRootHex as key. This is
46
51
  * the same to an `onUnknownBlock` event with parentBlockRootHex as root.
47
52
  */
48
53
  private addUnknownParent;
49
54
  private addUnknownBlock;
55
+ private onPeerConnected;
56
+ private onPeerDisconnected;
50
57
  /**
51
58
  * Gather tip parent blocks with unknown parent and do a search for all of them
52
59
  */
@@ -55,6 +62,7 @@ export declare class UnknownBlockSync {
55
62
  /**
56
63
  * Send block to the processor awaiting completition. If processed successfully, send all children to the processor.
57
64
  * On error, remove and downscore all descendants.
65
+ * This function could run recursively for all descendant blocks
58
66
  */
59
67
  private processBlock;
60
68
  /**
@@ -63,7 +71,7 @@ export declare class UnknownBlockSync {
63
71
  * - from deneb, fetch all missing blobs
64
72
  * - from peerDAS, fetch sampled colmns
65
73
  * TODO: this means we only have block root, and nothing else. Consider to reflect this in the function name
66
- * Will attempt a max of `MAX_ATTEMPTS_PER_BLOCK` on different peers if connectPeers.length > MAX_ATTEMPTS_PER_BLOCK.
74
+ * prefulu, will attempt a max of `MAX_ATTEMPTS_PER_BLOCK` on different peers, postfulu we may attempt more as defined in `getMaxDownloadAttempts()` function
67
75
  * Also verifies the received block root + returns the peer that provided the block for future downscoring.
68
76
  */
69
77
  private fetchUnknownBlockRoot;
@@ -71,8 +79,7 @@ export declare class UnknownBlockSync {
71
79
  * We have partial block input:
72
80
  * - we have block but not have all blobs (deneb) or needed columns (fulu)
73
81
  * - we don't have block and have some blobs (deneb) or some columns (fulu)
74
- * Fetches missing blobs for the blockinput, in future can also pull block is thats also missing
75
- * along with the blobs (i.e. only some blobs are available)
82
+ * Fetches missing block/data columns/block for the blockinput. This function returns either preData or availableData BlockInput.
76
83
  */
77
84
  private fetchUnavailableBlockInput;
78
85
  /**
@@ -83,5 +90,40 @@ export declare class UnknownBlockSync {
83
90
  */
84
91
  private removeAndDownscoreAllDescendants;
85
92
  private removeAllDescendants;
93
+ private getMaxDownloadAttempts;
94
+ }
95
+ /**
96
+ * Class to track active byRoots requests and balance them across eligible peers.
97
+ */
98
+ export declare class UnknownBlockPeerBalancer {
99
+ readonly peersMeta: Map<PeerIdStr, PeerSyncMeta>;
100
+ readonly activeRequests: Map<PeerIdStr, number>;
101
+ private readonly custodyConfig;
102
+ constructor(custodyConfig: CustodyConfig);
103
+ /** Trigger on each peer re-status */
104
+ onPeerConnected(peerId: PeerIdStr, syncMeta: PeerSyncMeta): void;
105
+ onPeerDisconnected(peerId: PeerIdStr): void;
106
+ /**
107
+ * called from fetchUnknownBlockRoot() where we only have block root and nothing else
108
+ * excludedPeers are the peers that we requested already so we don't want to try again
109
+ * pendingColumns is empty for prefulu, or the 1st time we we download a block by root
110
+ */
111
+ bestPeerForPendingColumns(pendingColumns: Set<number> | null, excludedPeers: Set<PeerIdStr>): PeerSyncMeta | null;
112
+ /**
113
+ * called from fetchUnavailableBlockInput() where we have either BlockInput or NullBlockInput
114
+ * excludedPeers are the peers that we requested already so we don't want to try again
115
+ */
116
+ bestPeerForBlockInput(unavailableBlockInput: BlockInput | NullBlockInput, excludedPeers: Set<PeerIdStr>): PeerSyncMeta | null;
117
+ /**
118
+ * Consumers don't need to call this method directly, it is called internally by bestPeer*() methods
119
+ * make this public for testing
120
+ */
121
+ onRequest(peerId: PeerIdStr): void;
122
+ /**
123
+ * Consumers should call this method when a request is completed for a peer.
124
+ */
125
+ onRequestCompleted(peerId: PeerIdStr): void;
126
+ getTotalActiveRequests(): number;
127
+ private filterPeers;
86
128
  }
87
129
  //# sourceMappingURL=unknownBlock.d.ts.map