@lodestar/beacon-node 1.32.0-dev.ea8c82564a → 1.32.0-peerDAS.223a48c40a

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 (241) hide show
  1. package/lib/api/impl/beacon/blocks/index.js +72 -16
  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 +24 -1
  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/archiveStore.js.map +1 -1
  9. package/lib/chain/archiveStore/historicalState/metrics.js +8 -0
  10. package/lib/chain/archiveStore/historicalState/metrics.js.map +1 -1
  11. package/lib/chain/archiveStore/interface.d.ts +1 -1
  12. package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +1 -1
  13. package/lib/chain/archiveStore/utils/archiveBlocks.js +116 -23
  14. package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
  15. package/lib/chain/beaconProposerCache.d.ts +1 -0
  16. package/lib/chain/beaconProposerCache.js +3 -0
  17. package/lib/chain/beaconProposerCache.js.map +1 -1
  18. package/lib/chain/blocks/importBlock.js +9 -19
  19. package/lib/chain/blocks/importBlock.js.map +1 -1
  20. package/lib/chain/blocks/types.d.ts +66 -24
  21. package/lib/chain/blocks/types.js +39 -6
  22. package/lib/chain/blocks/types.js.map +1 -1
  23. package/lib/chain/blocks/verifyBlocksDataAvailability.js +21 -10
  24. package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
  25. package/lib/chain/blocks/writeBlockInputToDb.js +89 -15
  26. package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
  27. package/lib/chain/chain.d.ts +16 -5
  28. package/lib/chain/chain.js +50 -5
  29. package/lib/chain/chain.js.map +1 -1
  30. package/lib/chain/emitter.d.ts +23 -2
  31. package/lib/chain/emitter.js +17 -0
  32. package/lib/chain/emitter.js.map +1 -1
  33. package/lib/chain/errors/dataColumnSidecarError.d.ts +69 -0
  34. package/lib/chain/errors/dataColumnSidecarError.js +21 -0
  35. package/lib/chain/errors/dataColumnSidecarError.js.map +1 -0
  36. package/lib/chain/errors/index.d.ts +1 -0
  37. package/lib/chain/errors/index.js +1 -0
  38. package/lib/chain/errors/index.js.map +1 -1
  39. package/lib/chain/interface.d.ts +10 -4
  40. package/lib/chain/interface.js.map +1 -1
  41. package/lib/chain/options.d.ts +6 -3
  42. package/lib/chain/options.js +4 -0
  43. package/lib/chain/options.js.map +1 -1
  44. package/lib/chain/produceBlock/produceBlockBody.d.ts +4 -2
  45. package/lib/chain/produceBlock/produceBlockBody.js +7 -2
  46. package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
  47. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +3 -2
  48. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +25 -2
  49. package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
  50. package/lib/chain/seenCache/seenGossipBlockInput.d.ts +64 -18
  51. package/lib/chain/seenCache/seenGossipBlockInput.js +320 -53
  52. package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
  53. package/lib/chain/validation/blobSidecar.d.ts +1 -1
  54. package/lib/chain/validation/blobSidecar.js +6 -6
  55. package/lib/chain/validation/blobSidecar.js.map +1 -1
  56. package/lib/chain/validation/dataColumnSidecar.d.ts +28 -0
  57. package/lib/chain/validation/dataColumnSidecar.js +248 -0
  58. package/lib/chain/validation/dataColumnSidecar.js.map +1 -0
  59. package/lib/db/beacon.d.ts +3 -1
  60. package/lib/db/beacon.js +3 -1
  61. package/lib/db/beacon.js.map +1 -1
  62. package/lib/db/buckets.d.ts +3 -1
  63. package/lib/db/buckets.js +2 -0
  64. package/lib/db/buckets.js.map +1 -1
  65. package/lib/db/interface.d.ts +3 -1
  66. package/lib/db/repositories/dataColumnSidecars.d.ts +47 -0
  67. package/lib/db/repositories/dataColumnSidecars.js +40 -0
  68. package/lib/db/repositories/dataColumnSidecars.js.map +1 -0
  69. package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +15 -0
  70. package/lib/db/repositories/dataColumnSidecarsArchive.js +23 -0
  71. package/lib/db/repositories/dataColumnSidecarsArchive.js.map +1 -0
  72. package/lib/db/repositories/index.d.ts +2 -0
  73. package/lib/db/repositories/index.js +2 -0
  74. package/lib/db/repositories/index.js.map +1 -1
  75. package/lib/execution/engine/http.d.ts +5 -3
  76. package/lib/execution/engine/http.js +70 -31
  77. package/lib/execution/engine/http.js.map +1 -1
  78. package/lib/execution/engine/interface.d.ts +4 -2
  79. package/lib/execution/engine/interface.js +1 -1
  80. package/lib/execution/engine/interface.js.map +1 -1
  81. package/lib/execution/engine/mock.d.ts +1 -0
  82. package/lib/execution/engine/mock.js +8 -3
  83. package/lib/execution/engine/mock.js.map +1 -1
  84. package/lib/execution/engine/types.d.ts +10 -0
  85. package/lib/execution/engine/types.js +6 -0
  86. package/lib/execution/engine/types.js.map +1 -1
  87. package/lib/metrics/metrics/beacon.d.ts +15 -0
  88. package/lib/metrics/metrics/beacon.js +59 -0
  89. package/lib/metrics/metrics/beacon.js.map +1 -1
  90. package/lib/metrics/metrics/lodestar.d.ts +15 -0
  91. package/lib/metrics/metrics/lodestar.js +32 -0
  92. package/lib/metrics/metrics/lodestar.js.map +1 -1
  93. package/lib/network/core/metrics.d.ts +10 -3
  94. package/lib/network/core/metrics.js +22 -4
  95. package/lib/network/core/metrics.js.map +1 -1
  96. package/lib/network/core/networkCore.d.ts +9 -3
  97. package/lib/network/core/networkCore.js +24 -12
  98. package/lib/network/core/networkCore.js.map +1 -1
  99. package/lib/network/core/networkCoreWorker.js +2 -0
  100. package/lib/network/core/networkCoreWorker.js.map +1 -1
  101. package/lib/network/core/networkCoreWorkerHandler.d.ts +5 -3
  102. package/lib/network/core/networkCoreWorkerHandler.js +7 -0
  103. package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
  104. package/lib/network/core/types.d.ts +8 -4
  105. package/lib/network/events.d.ts +4 -2
  106. package/lib/network/events.js.map +1 -1
  107. package/lib/network/gossip/encoding.js +1 -1
  108. package/lib/network/gossip/encoding.js.map +1 -1
  109. package/lib/network/gossip/gossipsub.js +6 -4
  110. package/lib/network/gossip/gossipsub.js.map +1 -1
  111. package/lib/network/gossip/interface.d.ts +10 -3
  112. package/lib/network/gossip/interface.js +1 -0
  113. package/lib/network/gossip/interface.js.map +1 -1
  114. package/lib/network/gossip/scoringParameters.js +7 -8
  115. package/lib/network/gossip/scoringParameters.js.map +1 -1
  116. package/lib/network/gossip/topic.d.ts +1047 -1031
  117. package/lib/network/gossip/topic.js +33 -13
  118. package/lib/network/gossip/topic.js.map +1 -1
  119. package/lib/network/interface.d.ts +13 -1
  120. package/lib/network/metadata.d.ts +10 -6
  121. package/lib/network/metadata.js +23 -4
  122. package/lib/network/metadata.js.map +1 -1
  123. package/lib/network/network.d.ts +13 -2
  124. package/lib/network/network.js +100 -33
  125. package/lib/network/network.js.map +1 -1
  126. package/lib/network/networkConfig.d.ts +23 -0
  127. package/lib/network/networkConfig.js +32 -0
  128. package/lib/network/networkConfig.js.map +1 -0
  129. package/lib/network/options.js +5 -0
  130. package/lib/network/options.js.map +1 -1
  131. package/lib/network/peers/discover.d.ts +8 -3
  132. package/lib/network/peers/discover.js +106 -13
  133. package/lib/network/peers/discover.js.map +1 -1
  134. package/lib/network/peers/peerManager.d.ts +10 -4
  135. package/lib/network/peers/peerManager.js +93 -11
  136. package/lib/network/peers/peerManager.js.map +1 -1
  137. package/lib/network/peers/peersData.d.ts +17 -3
  138. package/lib/network/peers/peersData.js.map +1 -1
  139. package/lib/network/peers/score/interface.d.ts +1 -1
  140. package/lib/network/peers/score/score.d.ts +2 -2
  141. package/lib/network/peers/score/score.js +4 -1
  142. package/lib/network/peers/score/score.js.map +1 -1
  143. package/lib/network/peers/score/store.d.ts +3 -1
  144. package/lib/network/peers/score/store.js +6 -2
  145. package/lib/network/peers/score/store.js.map +1 -1
  146. package/lib/network/peers/utils/assertPeerRelevance.d.ts +7 -3
  147. package/lib/network/peers/utils/assertPeerRelevance.js +10 -1
  148. package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
  149. package/lib/network/peers/utils/prioritizePeers.d.ts +18 -7
  150. package/lib/network/peers/utils/prioritizePeers.js +43 -7
  151. package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
  152. package/lib/network/processor/extractSlotRootFns.js +8 -1
  153. package/lib/network/processor/extractSlotRootFns.js.map +1 -1
  154. package/lib/network/processor/gossipHandlers.js +175 -18
  155. package/lib/network/processor/gossipHandlers.js.map +1 -1
  156. package/lib/network/processor/gossipQueues/index.js +6 -1
  157. package/lib/network/processor/gossipQueues/index.js.map +1 -1
  158. package/lib/network/processor/index.js +3 -2
  159. package/lib/network/processor/index.js.map +1 -1
  160. package/lib/network/reqresp/ReqRespBeaconNode.d.ts +2 -2
  161. package/lib/network/reqresp/ReqRespBeaconNode.js +32 -10
  162. package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
  163. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +15 -5
  164. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +203 -14
  165. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
  166. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +33 -5
  167. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +302 -28
  168. package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
  169. package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +1 -1
  170. package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
  171. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +8 -0
  172. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +106 -0
  173. package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -0
  174. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +6 -0
  175. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +57 -0
  176. package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -0
  177. package/lib/network/reqresp/handlers/index.js +10 -0
  178. package/lib/network/reqresp/handlers/index.js.map +1 -1
  179. package/lib/network/reqresp/handlers/status.js +3 -2
  180. package/lib/network/reqresp/handlers/status.js.map +1 -1
  181. package/lib/network/reqresp/protocols.d.ts +4 -0
  182. package/lib/network/reqresp/protocols.js +20 -0
  183. package/lib/network/reqresp/protocols.js.map +1 -1
  184. package/lib/network/reqresp/rateLimit.js +11 -1
  185. package/lib/network/reqresp/rateLimit.js.map +1 -1
  186. package/lib/network/reqresp/types.d.ts +15 -8
  187. package/lib/network/reqresp/types.js +10 -3
  188. package/lib/network/reqresp/types.js.map +1 -1
  189. package/lib/network/statusCache.d.ts +5 -5
  190. package/lib/network/statusCache.js.map +1 -1
  191. package/lib/network/subnets/attnetsService.js +6 -6
  192. package/lib/network/subnets/attnetsService.js.map +1 -1
  193. package/lib/network/subnets/interface.d.ts +3 -0
  194. package/lib/network/subnets/interface.js +14 -1
  195. package/lib/network/subnets/interface.js.map +1 -1
  196. package/lib/network/subnets/syncnetsService.js +4 -5
  197. package/lib/network/subnets/syncnetsService.js.map +1 -1
  198. package/lib/network/subscribeBoundary.d.ts +5 -0
  199. package/lib/network/subscribeBoundary.js +4 -0
  200. package/lib/network/subscribeBoundary.js.map +1 -0
  201. package/lib/node/nodejs.js +1 -6
  202. package/lib/node/nodejs.js.map +1 -1
  203. package/lib/sync/interface.d.ts +2 -2
  204. package/lib/sync/interface.js +1 -1
  205. package/lib/sync/interface.js.map +1 -1
  206. package/lib/sync/range/batch.d.ts +9 -2
  207. package/lib/sync/range/batch.js +23 -7
  208. package/lib/sync/range/batch.js.map +1 -1
  209. package/lib/sync/range/chain.d.ts +16 -1
  210. package/lib/sync/range/chain.js +105 -29
  211. package/lib/sync/range/chain.js.map +1 -1
  212. package/lib/sync/range/range.d.ts +3 -2
  213. package/lib/sync/range/range.js +9 -3
  214. package/lib/sync/range/range.js.map +1 -1
  215. package/lib/sync/range/utils/chainTarget.d.ts +5 -1
  216. package/lib/sync/range/utils/chainTarget.js +26 -1
  217. package/lib/sync/range/utils/chainTarget.js.map +1 -1
  218. package/lib/sync/range/utils/peerBalancer.d.ts +12 -5
  219. package/lib/sync/range/utils/peerBalancer.js +69 -10
  220. package/lib/sync/range/utils/peerBalancer.js.map +1 -1
  221. package/lib/sync/unknownBlock.d.ts +8 -1
  222. package/lib/sync/unknownBlock.js +226 -68
  223. package/lib/sync/unknownBlock.js.map +1 -1
  224. package/lib/sync/utils/remoteSyncType.d.ts +4 -4
  225. package/lib/sync/utils/remoteSyncType.js.map +1 -1
  226. package/lib/util/blobs.d.ts +18 -1
  227. package/lib/util/blobs.js +104 -1
  228. package/lib/util/blobs.js.map +1 -1
  229. package/lib/util/dataColumns.d.ts +137 -0
  230. package/lib/util/dataColumns.js +353 -0
  231. package/lib/util/dataColumns.js.map +1 -0
  232. package/lib/util/kzg.d.ts +2 -34
  233. package/lib/util/kzg.js +2 -123
  234. package/lib/util/kzg.js.map +1 -1
  235. package/lib/util/metadata.d.ts +4 -0
  236. package/lib/util/metadata.js +7 -0
  237. package/lib/util/metadata.js.map +1 -1
  238. package/lib/util/sszBytes.d.ts +1 -0
  239. package/lib/util/sszBytes.js +17 -0
  240. package/lib/util/sszBytes.js.map +1 -1
  241. package/package.json +15 -15
@@ -1,9 +1,13 @@
1
1
  import { ENR } from "@chainsafe/enr";
2
- import { ATTESTATION_SUBNET_COUNT, SYNC_COMMITTEE_SUBNET_COUNT } from "@lodestar/params";
2
+ import { toHexString } from "@chainsafe/ssz";
3
+ import { ATTESTATION_SUBNET_COUNT, ForkSeq, SYNC_COMMITTEE_SUBNET_COUNT } from "@lodestar/params";
3
4
  import { pruneSetToMax, sleep } from "@lodestar/utils";
5
+ import { bytesToInt } from "@lodestar/utils";
6
+ import { getCustodyGroups } from "../../util/dataColumns.js";
4
7
  import { Discv5Worker } from "../discv5/index.js";
5
8
  import { getLibp2pError } from "../libp2p/error.js";
6
9
  import { ENRKey, SubnetType } from "../metadata.js";
10
+ import { computeNodeId } from "../subnets/interface.js";
7
11
  import { getConnectionsMap, prettyPrintPeerId } from "../util.js";
8
12
  import { ScoreState } from "./score/index.js";
9
13
  import { deserializeEnrSubnets, zeroAttnets, zeroSyncnets } from "./utils/enrSubnetsDeserialize.js";
@@ -59,7 +63,7 @@ export class PeerDiscovery {
59
63
  }
60
64
  const attnets = zeroAttnets;
61
65
  const syncnets = zeroSyncnets;
62
- const status = this.handleDiscoveredPeer(id, multiaddrs[0], attnets, syncnets);
66
+ const status = this.handleDiscoveredPeer(id, multiaddrs[0], attnets, syncnets, undefined);
63
67
  this.logger.debug("Discovered peer via libp2p", { peer: prettyPrintPeerId(id), status });
64
68
  this.metrics?.discovery.discoveredStatus.inc({ status });
65
69
  };
@@ -81,22 +85,34 @@ export class PeerDiscovery {
81
85
  // Are this fields mandatory?
82
86
  const attnetsBytes = enr.kvs.get(ENRKey.attnets); // 64 bits
83
87
  const syncnetsBytes = enr.kvs.get(ENRKey.syncnets); // 4 bits
88
+ const custodyGroupCountBytes = enr.kvs.get(ENRKey.cgc); // 64 bits
89
+ if (custodyGroupCountBytes === undefined) {
90
+ this.logger.warn("peer discovered with no cgc assuming 4", exportENRToJSON(enr));
91
+ }
84
92
  // Use faster version than ssz's implementation that leverages pre-cached.
85
93
  // Some nodes don't serialize the bitfields properly, encoding the syncnets as attnets,
86
94
  // which cause the ssz implementation to throw on validation. deserializeEnrSubnets() will
87
95
  // never throw and treat too long or too short bitfields as zero-ed
88
96
  const attnets = attnetsBytes ? deserializeEnrSubnets(attnetsBytes, ATTESTATION_SUBNET_COUNT) : zeroAttnets;
89
97
  const syncnets = syncnetsBytes ? deserializeEnrSubnets(syncnetsBytes, SYNC_COMMITTEE_SUBNET_COUNT) : zeroSyncnets;
90
- const status = this.handleDiscoveredPeer(peerId, multiaddrTCP, attnets, syncnets);
91
- this.logger.debug("Discovered peer via discv5", { peer: prettyPrintPeerId(peerId), status });
98
+ const custodyGroupCount = custodyGroupCountBytes ? bytesToInt(custodyGroupCountBytes, "be") : undefined;
99
+ const status = this.handleDiscoveredPeer(peerId, multiaddrTCP, attnets, syncnets, custodyGroupCount);
100
+ this.logger.debug("Discovered peer via discv5", {
101
+ peer: prettyPrintPeerId(peerId),
102
+ status,
103
+ custodySubnetCount: custodyGroupCount,
104
+ });
92
105
  this.metrics?.discovery.discoveredStatus.inc({ status });
93
106
  };
94
- const { libp2p, peerRpcScores, metrics, logger } = modules;
107
+ const { libp2p, clock, peerRpcScores, metrics, logger, networkConfig } = modules;
95
108
  this.libp2p = libp2p;
109
+ this.clock = clock;
96
110
  this.peerRpcScores = peerRpcScores;
97
111
  this.metrics = metrics;
98
112
  this.logger = logger;
113
+ this.config = networkConfig.getConfig();
99
114
  this.discv5 = discv5;
115
+ this.groupRequests = new Map();
100
116
  this.discv5StartMs = 0;
101
117
  this.discv5StartMs = Date.now();
102
118
  this.discv5FirstQueryDelayMs = opts.discv5FirstQueryDelayMs;
@@ -122,6 +138,11 @@ export class PeerDiscovery {
122
138
  metrics.discovery.cachedENRsSize.addCollect(() => {
123
139
  metrics.discovery.cachedENRsSize.set(this.cachedENRs.size);
124
140
  metrics.discovery.peersToConnect.set(this.peersToConnect);
141
+ // PeerDAS metrics
142
+ const groupsToConnect = Array.from(this.groupRequests.values());
143
+ const groupPeersToConnect = groupsToConnect.reduce((acc, elem) => acc + elem, 0);
144
+ metrics.discovery.groupPeersToConnect.set(groupPeersToConnect);
145
+ metrics.discovery.groupsToConnect.set(groupsToConnect.filter((elem) => elem > 0).length);
125
146
  for (const type of [SubnetType.attnets, SubnetType.syncnets]) {
126
147
  const subnetPeersToConnect = Array.from(this.subnetRequests[type].values()).reduce((acc, { peersToConnect }) => acc + peersToConnect, 0);
127
148
  metrics.discovery.subnetPeersToConnect.set({ type }, subnetPeersToConnect);
@@ -136,7 +157,7 @@ export class PeerDiscovery {
136
157
  privateKey: modules.privateKey,
137
158
  metrics: modules.metrics ?? undefined,
138
159
  logger: modules.logger,
139
- config: modules.config,
160
+ config: modules.networkConfig.getConfig(),
140
161
  genesisTime: modules.clock.genesisTime,
141
162
  });
142
163
  return new PeerDiscovery(modules, opts, discv5);
@@ -148,8 +169,9 @@ export class PeerDiscovery {
148
169
  }
149
170
  /**
150
171
  * Request to find peers, both on specific subnets and in general
172
+ * pre-fulu groupRequests is empty
151
173
  */
152
- discoverPeers(peersToConnect, subnetRequests = []) {
174
+ discoverPeers(peersToConnect, groupRequests, subnetRequests = []) {
153
175
  const subnetsToDiscoverPeers = [];
154
176
  const cachedENRsToDial = new Map();
155
177
  // Iterate in reverse to consider first the most recent ENRs
@@ -171,14 +193,38 @@ export class PeerDiscovery {
171
193
  }
172
194
  cachedENRsReverse.reverse();
173
195
  this.peersToConnect += peersToConnect;
196
+ // starting from PeerDAS, we need to prioritize column subnet peers first in order to have stable subnet sampling
197
+ const groupsToDiscover = new Set();
198
+ let groupPeersToDiscover = 0;
199
+ const forkSeq = this.config.getForkSeq(this.clock.currentSlot);
200
+ if (forkSeq >= ForkSeq.fulu) {
201
+ group: for (const [group, maxPeersToConnect] of groupRequests) {
202
+ let cachedENRsInGroup = 0;
203
+ for (const cachedENR of cachedENRsReverse) {
204
+ if (cachedENR.peerCustodyGroups?.includes(group)) {
205
+ cachedENRsToDial.set(cachedENR.peerId.toString(), cachedENR);
206
+ if (++cachedENRsInGroup >= maxPeersToConnect) {
207
+ continue group;
208
+ }
209
+ }
210
+ const groupPeersToConnect = Math.max(maxPeersToConnect - cachedENRsInGroup, 0);
211
+ this.groupRequests.set(group, groupPeersToConnect);
212
+ groupsToDiscover.add(group);
213
+ groupPeersToDiscover += groupPeersToConnect;
214
+ }
215
+ }
216
+ }
174
217
  subnet: for (const subnetRequest of subnetRequests) {
175
218
  // Get cached ENRs from the discovery service that are in the requested `subnetId`, but not connected yet
176
219
  let cachedENRsInSubnet = 0;
177
- for (const cachedENR of cachedENRsReverse) {
178
- if (cachedENR.subnets[subnetRequest.type][subnetRequest.subnet]) {
179
- cachedENRsToDial.set(cachedENR.peerId.toString(), cachedENR);
180
- if (++cachedENRsInSubnet >= subnetRequest.maxPeersToDiscover) {
181
- continue subnet;
220
+ // only dial attnet/syncnet peers if subnet sampling peers are stable
221
+ if (groupPeersToDiscover === 0) {
222
+ for (const cachedENR of cachedENRsReverse) {
223
+ if (cachedENR.subnets[subnetRequest.type][subnetRequest.subnet]) {
224
+ cachedENRsToDial.set(cachedENR.peerId.toString(), cachedENR);
225
+ if (++cachedENRsInSubnet >= subnetRequest.maxPeersToDiscover) {
226
+ continue subnet;
227
+ }
182
228
  }
183
229
  }
184
230
  }
@@ -218,6 +264,8 @@ export class PeerDiscovery {
218
264
  peersToConnect,
219
265
  peersAvailableToDial: cachedENRsToDial.size,
220
266
  subnetsToDiscover: subnetsToDiscoverPeers.length,
267
+ groupsToDiscover: Array.from(groupsToDiscover).join(","),
268
+ groupPeersToDiscover,
221
269
  shouldRunFindRandomNodeQuery,
222
270
  });
223
271
  }
@@ -256,7 +304,9 @@ export class PeerDiscovery {
256
304
  /**
257
305
  * Progressively called by peer discovery as a result of any query.
258
306
  */
259
- handleDiscoveredPeer(peerId, multiaddrTCP, attnets, syncnets) {
307
+ handleDiscoveredPeer(peerId, multiaddrTCP, attnets, syncnets, custodySubnetCount) {
308
+ const nodeId = computeNodeId(peerId);
309
+ this.logger.warn("handleDiscoveredPeer", { nodeId: toHexString(nodeId), peerId: peerId.toString() });
260
310
  try {
261
311
  // Check if peer is not banned or disconnected
262
312
  if (this.peerRpcScores.getScoreState(peerId) !== ScoreState.Healthy) {
@@ -272,12 +322,17 @@ export class PeerDiscovery {
272
322
  .find((pendingDial) => pendingDial.peerId?.equals(peerId))) {
273
323
  return DiscoveredPeerStatus.already_dialing;
274
324
  }
325
+ const forkSeq = this.config.getForkSeq(this.clock.currentSlot);
275
326
  // Should dial peer?
276
327
  const cachedPeer = {
277
328
  peerId,
278
329
  multiaddrTCP,
279
330
  subnets: { attnets, syncnets },
280
331
  addedUnixMs: Date.now(),
332
+ // for pre-fulu, peerCustodyGroups is null
333
+ peerCustodyGroups: forkSeq >= ForkSeq.fulu
334
+ ? getCustodyGroups(nodeId, custodySubnetCount ?? this.config.CUSTODY_REQUIREMENT)
335
+ : null,
281
336
  };
282
337
  // Only dial peer if necessary
283
338
  if (this.shouldDialPeer(cachedPeer)) {
@@ -296,6 +351,33 @@ export class PeerDiscovery {
296
351
  }
297
352
  }
298
353
  shouldDialPeer(peer) {
354
+ const forkSeq = this.config.getForkSeq(this.clock.currentSlot);
355
+ if (forkSeq >= ForkSeq.fulu && peer.peerCustodyGroups !== null) {
356
+ // pre-fulu `this.groupRequests` is empty
357
+ // starting from fulu, we need to make sure we have stable subnet sampling peers first
358
+ // given SAMPLES_PER_SLOT = 8 and 100 peers, we have 800 custody columns from peers
359
+ // with NUMBER_OF_CUSTODY_GROUPS = 128, we have 800 / 128 = 6.25 peers per column in average
360
+ // it would not be hard to find TARGET_SUBNET_PEERS(6) peers per sampling columns columns and TARGET_GROUP_PEERS_PER_SUBNET(4) peers per non-sampling columns
361
+ // after some first heartbeats, we should have no more column requested, then go with conditions of prior forks
362
+ let hasMatchingGroup = false;
363
+ let groupRequestCount = 0;
364
+ for (const [group, peersToConnect] of this.groupRequests.entries()) {
365
+ if (peersToConnect <= 0) {
366
+ this.groupRequests.delete(group);
367
+ }
368
+ else if (peer.peerCustodyGroups.includes(group)) {
369
+ this.groupRequests.set(group, Math.max(0, peersToConnect - 1));
370
+ hasMatchingGroup = true;
371
+ groupRequestCount += peersToConnect;
372
+ }
373
+ }
374
+ // if subnet sampling peers are not stable and this peer is not in the requested columns, ignore it
375
+ if (groupRequestCount > 0 && !hasMatchingGroup) {
376
+ this.metrics?.discovery.notDialReason.inc({ reason: NotDialReason.not_contain_requested_sampling_groups });
377
+ return false;
378
+ }
379
+ }
380
+ // logics up to Deneb fork
299
381
  for (const type of [SubnetType.attnets, SubnetType.syncnets]) {
300
382
  for (const [subnet, { toUnixMs, peersToConnect }] of this.subnetRequests[type].entries()) {
301
383
  if (toUnixMs < Date.now() || peersToConnect === 0) {
@@ -320,6 +402,7 @@ export class PeerDiscovery {
320
402
  if (this.peersToConnect > 0) {
321
403
  return true;
322
404
  }
405
+ this.metrics?.discovery.notDialReason.inc({ reason: NotDialReason.not_contain_requested_attnet_syncnet_subnets });
323
406
  return false;
324
407
  }
325
408
  /**
@@ -405,4 +488,14 @@ function formatLibp2pDialError(e) {
405
488
  e.stack = undefined;
406
489
  }
407
490
  }
491
+ function exportENRToJSON(enr) {
492
+ if (enr === undefined) {
493
+ return undefined;
494
+ }
495
+ return {
496
+ ip4: enr.kvs.get("ip")?.toString(),
497
+ cgc: enr.kvs.get("cgc")?.toString(),
498
+ nodeId: enr.nodeId,
499
+ };
500
+ }
408
501
  //# sourceMappingURL=discover.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/network/peers/discover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/network/peers/discover.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  import { PeerId, PrivateKey } from "@libp2p/interface";
2
- import { BeaconConfig } from "@lodestar/config";
3
2
  import { LoggerNode } from "@lodestar/logger/node";
4
- import { Metadata, phase0 } from "@lodestar/types";
3
+ import { Metadata, Status, phase0 } from "@lodestar/types";
5
4
  import { IClock } from "../../util/clock.js";
6
5
  import { NetworkCoreMetrics } from "../core/metrics.js";
7
6
  import { LodestarDiscv5Opts } from "../discv5/types.js";
8
7
  import { INetworkEventBus } from "../events.js";
9
8
  import { Eth2Gossipsub } from "../gossip/gossipsub.js";
10
9
  import { Libp2p } from "../interface.js";
10
+ import { SubnetType } from "../metadata.js";
11
+ import { NetworkConfig } from "../networkConfig.js";
11
12
  import { StatusCache } from "../statusCache.js";
12
13
  import { SubnetsService } from "../subnets/index.js";
13
14
  import { PeerDiscovery } from "./discover.js";
@@ -18,6 +19,8 @@ export type PeerManagerOpts = {
18
19
  targetPeers: number;
19
20
  /** The maximum number of peers we allow (exceptions for subnet peers) */
20
21
  maxPeers: number;
22
+ /** Target peer per PeerDAS group */
23
+ targetGroupPeers: number;
21
24
  /**
22
25
  * Delay the 1st query after starting discv5
23
26
  * See https://github.com/ChainSafe/lodestar/issues/3423
@@ -37,7 +40,7 @@ export type PeerManagerOpts = {
37
40
  */
38
41
  export interface IReqRespBeaconNodePeerManager {
39
42
  sendPing(peerId: PeerId): Promise<phase0.Ping>;
40
- sendStatus(peerId: PeerId, request: phase0.Status): Promise<phase0.Status>;
43
+ sendStatus(peerId: PeerId, request: Status): Promise<Status>;
41
44
  sendGoodbye(peerId: PeerId, request: phase0.Goodbye): Promise<void>;
42
45
  sendMetadata(peerId: PeerId): Promise<Metadata>;
43
46
  }
@@ -51,12 +54,13 @@ export type PeerManagerModules = {
51
54
  attnetsService: SubnetsService;
52
55
  syncnetsService: SubnetsService;
53
56
  clock: IClock;
54
- config: BeaconConfig;
55
57
  peerRpcScores: IPeerRpcScoreStore;
56
58
  events: INetworkEventBus;
59
+ networkConfig: NetworkConfig;
57
60
  peersData: PeersData;
58
61
  statusCache: StatusCache;
59
62
  };
63
+ export type PeerRequestedSubnetType = SubnetType | "column";
60
64
  type PeerIdStr = string;
61
65
  /**
62
66
  * Performs all peer management functionality in a single grouped class:
@@ -67,6 +71,7 @@ type PeerIdStr = string;
67
71
  * - Disconnect peers if over target peers
68
72
  */
69
73
  export declare class PeerManager {
74
+ private nodeId;
70
75
  private readonly libp2p;
71
76
  private readonly logger;
72
77
  private readonly metrics;
@@ -75,6 +80,7 @@ export declare class PeerManager {
75
80
  private readonly attnetsService;
76
81
  private readonly syncnetsService;
77
82
  private readonly clock;
83
+ private readonly networkConfig;
78
84
  private readonly config;
79
85
  private readonly peerRpcScores;
80
86
  /** If null, discovery is disabled */
@@ -1,10 +1,12 @@
1
- import { BitArray } from "@chainsafe/ssz";
2
- import { SLOTS_PER_EPOCH, SYNC_COMMITTEE_SUBNET_COUNT } from "@lodestar/params";
1
+ import { BitArray, toHexString } from "@chainsafe/ssz";
2
+ import { ForkSeq, SLOTS_PER_EPOCH, SYNC_COMMITTEE_SUBNET_COUNT } from "@lodestar/params";
3
3
  import { withTimeout } from "@lodestar/utils";
4
4
  import { GOODBYE_KNOWN_CODES, GoodByeReasonCode, Libp2pEvent } from "../../constants/index.js";
5
+ import { getCustodyGroups, getDataColumns } from "../../util/dataColumns.js";
5
6
  import { NetworkEvent } from "../events.js";
6
7
  import { SubnetType } from "../metadata.js";
7
8
  import { ReqRespMethod } from "../reqresp/ReqRespBeaconNode.js";
9
+ import { computeNodeId } from "../subnets/index.js";
8
10
  import { getConnection, getConnectionsMap, prettyPrintPeerId } from "../util.js";
9
11
  import { ClientKind, getKnownClientFromAgentVersion } from "./client.js";
10
12
  import { PeerDiscovery } from "./discover.js";
@@ -41,6 +43,7 @@ const STARVATION_PRUNE_RATIO = 0.05;
41
43
  * Relative factor of peers that are allowed to have a negative gossipsub score without penalizing them in lodestar.
42
44
  */
43
45
  const ALLOWED_NEGATIVE_GOSSIPSUB_FACTOR = 0.1;
46
+ // TODO(fulu): dedupe with network/peers/peerData.ts
44
47
  var RelevantPeerStatus;
45
48
  (function (RelevantPeerStatus) {
46
49
  RelevantPeerStatus["Unknown"] = "unknown";
@@ -106,6 +109,7 @@ export class PeerManager {
106
109
  // NOTE: libp2p may emit two "peer:connect" events: One for inbound, one for outbound
107
110
  // If that happens, it's okay. Only the "outbound" connection triggers immediate action
108
111
  const now = Date.now();
112
+ const nodeId = computeNodeId(remotePeer);
109
113
  const peerData = {
110
114
  lastReceivedMsgUnixTsMs: direction === "outbound" ? 0 : now,
111
115
  // If inbound, request after STATUS_INBOUND_GRACE_PERIOD
@@ -113,6 +117,7 @@ export class PeerManager {
113
117
  connectedUnixTsMs: now,
114
118
  relevantStatus: RelevantPeerStatus.Unknown,
115
119
  direction,
120
+ nodeId,
116
121
  peerId: remotePeer,
117
122
  status: null,
118
123
  metadata: null,
@@ -122,7 +127,7 @@ export class PeerManager {
122
127
  };
123
128
  this.connectedPeers.set(remotePeer.toString(), peerData);
124
129
  if (direction === "outbound") {
125
- //this.pingAndStatusTimeouts();
130
+ // this.pingAndStatusTimeouts();
126
131
  void this.requestPing(remotePeer);
127
132
  void this.requestStatus(remotePeer, this.statusCache.get());
128
133
  }
@@ -153,6 +158,7 @@ export class PeerManager {
153
158
  .merge(remotePeer, { tags: { [PEER_RELEVANT_TAG]: undefined } })
154
159
  .catch((e) => this.logger.verbose("cannot untag peer", { peerId: remotePeer.toString() }, e));
155
160
  };
161
+ const { networkConfig } = modules;
156
162
  this.libp2p = modules.libp2p;
157
163
  this.logger = modules.logger;
158
164
  this.metrics = modules.metrics;
@@ -162,12 +168,14 @@ export class PeerManager {
162
168
  this.syncnetsService = modules.syncnetsService;
163
169
  this.statusCache = modules.statusCache;
164
170
  this.clock = modules.clock;
165
- this.config = modules.config;
171
+ this.networkConfig = networkConfig;
172
+ this.config = networkConfig.getConfig();
166
173
  this.peerRpcScores = modules.peerRpcScores;
167
174
  this.networkEventBus = modules.events;
168
175
  this.connectedPeers = modules.peersData.connectedPeers;
169
176
  this.opts = opts;
170
177
  this.discovery = discovery;
178
+ this.nodeId = networkConfig.getNodeId();
171
179
  const { metrics } = modules;
172
180
  if (metrics) {
173
181
  metrics.peers.addCollect(() => this.runPeerCountMetrics(metrics));
@@ -254,6 +262,11 @@ export class PeerManager {
254
262
  onPing(peer, seqNumber) {
255
263
  // if the sequence number is unknown update the peer's metadata
256
264
  const metadata = this.connectedPeers.get(peer.toString())?.metadata;
265
+ this.logger.warn("onPing", {
266
+ seqNumber,
267
+ metaSeqNumber: metadata?.seqNumber,
268
+ cond: !metadata || metadata.seqNumber < seqNumber,
269
+ });
257
270
  if (!metadata || metadata.seqNumber < seqNumber) {
258
271
  void this.requestMetadata(peer);
259
272
  }
@@ -265,12 +278,37 @@ export class PeerManager {
265
278
  // Store metadata always in case the peer updates attnets but not the sequence number
266
279
  // Trust that the peer always sends the latest metadata (From Lighthouse)
267
280
  const peerData = this.connectedPeers.get(peer.toString());
281
+ this.logger.warn("onMetadata", {
282
+ peer: peer.toString(),
283
+ peerData: peerData !== undefined,
284
+ custodyGroupCount: metadata.custodyGroupCount,
285
+ });
268
286
  if (peerData) {
287
+ const oldMetadata = peerData.metadata;
288
+ const custodyGroupCount = metadata.custodyGroupCount ?? this.config.CUSTODY_REQUIREMENT;
289
+ const samplingGroupCount = Math.max(this.config.SAMPLES_PER_SLOT, custodyGroupCount);
290
+ const nodeId = peerData?.nodeId ?? computeNodeId(peer);
291
+ // TODO(fulu): this should be columns not groups. need to change everywhere
292
+ const custodyGroups = oldMetadata == null || oldMetadata.custodyGroups == null || custodyGroupCount !== oldMetadata.custodyGroupCount
293
+ ? getCustodyGroups(nodeId, custodyGroupCount)
294
+ : oldMetadata.custodyGroups;
295
+ const oldSamplingGroupCount = Math.max(this.config.SAMPLES_PER_SLOT, oldMetadata?.custodyGroupCount ?? 0);
296
+ const samplingGroups = oldMetadata == null || oldMetadata.samplingGroups == null || samplingGroupCount !== oldSamplingGroupCount
297
+ ? getCustodyGroups(nodeId, samplingGroupCount)
298
+ : oldMetadata.samplingGroups;
269
299
  peerData.metadata = {
270
300
  seqNumber: metadata.seqNumber,
271
301
  attnets: metadata.attnets,
272
302
  syncnets: metadata.syncnets ?? BitArray.fromBitLen(SYNC_COMMITTEE_SUBNET_COUNT),
303
+ custodyGroupCount: metadata.custodyGroupCount ??
304
+ // TODO: spec says that Clients MAY reject peers with a value less than CUSTODY_REQUIREMENT
305
+ this.config.CUSTODY_REQUIREMENT,
306
+ custodyGroups,
307
+ samplingGroups,
273
308
  };
309
+ if (oldMetadata === null || oldMetadata.custodyGroupCount !== peerData.metadata.custodyGroupCount) {
310
+ void this.requestStatus(peer, this.statusCache.get());
311
+ }
274
312
  }
275
313
  }
276
314
  /**
@@ -297,9 +335,10 @@ export class PeerManager {
297
335
  peerData.lastStatusUnixTsMs = Date.now();
298
336
  peerData.status = status;
299
337
  }
338
+ const forkName = this.config.getForkName(this.clock.currentSlot);
300
339
  let isIrrelevant;
301
340
  try {
302
- const irrelevantReasonType = assertPeerRelevance(status, this.statusCache.get(), this.clock.currentSlot);
341
+ const irrelevantReasonType = assertPeerRelevance(status, this.statusCache.get(), this.clock.currentSlot, forkName);
303
342
  if (irrelevantReasonType === null) {
304
343
  isIrrelevant = false;
305
344
  }
@@ -334,19 +373,50 @@ export class PeerManager {
334
373
  peerData.relevantStatus = RelevantPeerStatus.relevant;
335
374
  }
336
375
  if (getConnection(this.libp2p, peer.toString())) {
337
- this.networkEventBus.emit(NetworkEvent.peerConnected, { peer: peer.toString(), status });
376
+ const nodeId = peerData?.nodeId ?? computeNodeId(peer);
377
+ const custodyGroupCount = peerData?.metadata?.custodyGroupCount;
378
+ const peerCustodyGroupCount = custodyGroupCount ?? this.config.CUSTODY_REQUIREMENT;
379
+ const dataColumns = getDataColumns(nodeId, peerCustodyGroupCount);
380
+ // on metadata, we should have custodyGroupss
381
+ const peerCustodyGroups = peerData?.metadata?.custodyGroups ?? getCustodyGroups(nodeId, peerCustodyGroupCount);
382
+ const sampleSubnets = this.networkConfig.getCustodyConfig().sampledSubnets;
383
+ const matchingSubnetsNum = sampleSubnets.reduce((acc, elem) => acc + (dataColumns.includes(elem) ? 1 : 0), 0);
384
+ const hasAllColumns = matchingSubnetsNum === sampleSubnets.length;
385
+ const clientAgent = peerData?.agentClient ?? ClientKind.Unknown;
386
+ this.logger.warn(`onStatus ${custodyGroupCount === undefined ? "undefined custody count assuming 4" : ""}`, {
387
+ nodeId: toHexString(nodeId),
388
+ myNodeId: toHexString(this.nodeId),
389
+ peerId: peer.toString(),
390
+ custodyGroupCount,
391
+ hasAllColumns,
392
+ dataColumns: dataColumns.join(" "),
393
+ matchingSubnetsNum,
394
+ peerCustodyGroups: peerCustodyGroups.join(" "),
395
+ mySampleSubnets: sampleSubnets.join(" "),
396
+ clientAgent,
397
+ });
398
+ // TODO @matthewkeil need to double check the dataColumns is received on the other end of this correctly
399
+ this.networkEventBus.emit(NetworkEvent.peerConnected, {
400
+ peer: peer.toString(),
401
+ status,
402
+ dataColumns,
403
+ clientAgent: `${clientAgent}-cgc:${dataColumns.length}`,
404
+ });
338
405
  }
339
406
  }
340
407
  async requestMetadata(peer) {
341
408
  try {
409
+ this.logger.warn("requestMetadata", { peer: peer.toString() });
342
410
  this.onMetadata(peer, await this.reqResp.sendMetadata(peer));
343
411
  }
344
- catch (_e) {
412
+ catch (e) {
413
+ this.logger.error("invalid requestMetadata response", undefined, e);
345
414
  // TODO: Downvote peer here or in the reqResp layer
346
415
  }
347
416
  }
348
417
  async requestPing(peer) {
349
418
  try {
419
+ this.logger.warn("requestPing", { peer: peer.toString() });
350
420
  this.onPing(peer, await this.reqResp.sendPing(peer));
351
421
  // If peer replies a PING request also update lastReceivedMsg
352
422
  const peerData = this.connectedPeers.get(peer.toString());
@@ -407,7 +477,8 @@ export class PeerManager {
407
477
  this.clock.currentSlot - status.headSlot > STARVATION_THRESHOLD_SLOTS;
408
478
  this.lastStatus = status;
409
479
  this.metrics?.peerManager.starved.set(starved ? 1 : 0);
410
- const { peersToDisconnect, peersToConnect, attnetQueries, syncnetQueries } = prioritizePeers(connectedHealthyPeers.map((peer) => {
480
+ const forkSeq = this.config.getForkSeq(this.clock.currentSlot);
481
+ const { peersToDisconnect, peersToConnect, attnetQueries, syncnetQueries, groupQueries } = prioritizePeers(connectedHealthyPeers.map((peer) => {
411
482
  const peerData = this.connectedPeers.get(peer.toString());
412
483
  return {
413
484
  id: peer,
@@ -415,17 +486,21 @@ export class PeerManager {
415
486
  status: peerData?.status ?? null,
416
487
  attnets: peerData?.metadata?.attnets ?? null,
417
488
  syncnets: peerData?.metadata?.syncnets ?? null,
489
+ // here we care samplingGroups not custodyGroups in order to know which column subnets peers subscribe to
490
+ samplingGroups: peerData?.metadata?.samplingGroups ?? null,
418
491
  score: this.peerRpcScores.getScore(peer),
419
492
  };
420
493
  }),
421
494
  // Collect subnets which we need peers for in the current slot
422
- this.attnetsService.getActiveSubnets(), this.syncnetsService.getActiveSubnets(), {
495
+ this.attnetsService.getActiveSubnets(), this.syncnetsService.getActiveSubnets(),
496
+ // ignore samplingGroups for pre-fulu forks
497
+ forkSeq >= ForkSeq.fulu ? this.networkConfig.getCustodyConfig().sampleGroups : undefined, {
423
498
  ...this.opts,
424
499
  status,
425
500
  starved,
426
501
  starvationPruneRatio: STARVATION_PRUNE_RATIO,
427
502
  starvationThresholdSlots: STARVATION_THRESHOLD_SLOTS,
428
- });
503
+ }, this.metrics);
429
504
  const queriesMerged = [];
430
505
  for (const { type, queries } of [
431
506
  { type: SubnetType.attnets, queries: attnetQueries },
@@ -446,6 +521,10 @@ export class PeerManager {
446
521
  this.metrics?.peersRequestedSubnetsPeerCount.inc({ type }, count);
447
522
  }
448
523
  }
524
+ for (const maxPeersToDiscover of groupQueries.values()) {
525
+ this.metrics?.peersRequestedSubnetsToQuery.inc({ type: "column" }, 1);
526
+ this.metrics?.peersRequestedSubnetsPeerCount.inc({ type: "column" }, maxPeersToDiscover);
527
+ }
449
528
  // disconnect first to have more slots before we dial new peers
450
529
  for (const [reason, peers] of peersToDisconnect) {
451
530
  this.metrics?.peersRequestedToDisconnect.inc({ reason }, peers.length);
@@ -456,7 +535,8 @@ export class PeerManager {
456
535
  if (this.discovery) {
457
536
  try {
458
537
  this.metrics?.peersRequestedToConnect.inc(peersToConnect);
459
- this.discovery.discoverPeers(peersToConnect, queriesMerged);
538
+ // for PeerDAS, lodestar implements subnet sampling strategy, hence we need to issue columnSubnetQueries to PeerDiscovery
539
+ this.discovery.discoverPeers(peersToConnect, groupQueries, queriesMerged);
460
540
  }
461
541
  catch (e) {
462
542
  this.logger.error("Error on discoverPeers", {}, e);
@@ -524,6 +604,7 @@ export class PeerManager {
524
604
  try {
525
605
  const reason = GOODBYE_KNOWN_CODES[goodbye.toString()] || "";
526
606
  this.metrics?.peerGoodbyeSent.inc({ reason });
607
+ this.logger.debug("disconnected peer", { reason, peerId: prettyPrintPeerId(peer) });
527
608
  const conn = getConnection(this.libp2p, peer.toString());
528
609
  if (conn && Date.now() - conn.timeline.open > LONG_PEER_CONNECTION_MS) {
529
610
  this.metrics?.peerLongConnectionDisconnect.inc({ reason });
@@ -565,6 +646,7 @@ export class PeerManager {
565
646
  const attnets = peerData?.metadata?.attnets;
566
647
  // TODO: Consider optimizing by doing observe in batch
567
648
  metrics.peerLongLivedAttnets.observe(attnets ? attnets.getTrueBitIndexes().length : 0);
649
+ metrics.peerColumnGroupCount.observe(peerData?.metadata?.custodyGroupCount ?? 0);
568
650
  metrics.peerScoreByClient.observe({ client }, this.peerRpcScores.getScore(peerId));
569
651
  metrics.peerGossipScoreByClient.observe({ client }, this.peerRpcScores.getGossipScore(peerId));
570
652
  metrics.peerConnectionLength.observe((now - openCnx.timeline.open) / 1000);