@lodestar/beacon-node 1.34.0-dev.d5a4e7a09c → 1.34.0-dev.d9fc7bb103
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.
- package/lib/api/impl/beacon/blocks/index.js +162 -55
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +3 -3
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.js +15 -16
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/debug/index.d.ts +1 -1
- package/lib/api/impl/debug/index.js +24 -1
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/validator/index.js +37 -26
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/impl/validator/utils.d.ts +3 -3
- package/lib/api/impl/validator/utils.js +2 -2
- package/lib/api/impl/validator/utils.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts +1 -1
- package/lib/chain/archiveStore/archiveStore.js +2 -2
- package/lib/chain/archiveStore/interface.d.ts +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.d.ts +1 -1
- package/lib/chain/archiveStore/utils/archiveBlocks.js +89 -22
- package/lib/chain/archiveStore/utils/archiveBlocks.js.map +1 -1
- package/lib/chain/beaconProposerCache.d.ts +1 -0
- package/lib/chain/beaconProposerCache.js +3 -0
- package/lib/chain/beaconProposerCache.js.map +1 -1
- package/lib/chain/blocks/importBlock.js +3 -2
- package/lib/chain/blocks/importBlock.js.map +1 -1
- package/lib/chain/blocks/types.d.ts +66 -23
- package/lib/chain/blocks/types.js +39 -5
- package/lib/chain/blocks/types.js.map +1 -1
- package/lib/chain/blocks/utils/zebraBanner.d.ts +2 -0
- package/lib/chain/blocks/utils/zebraBanner.js +45 -0
- package/lib/chain/blocks/utils/zebraBanner.js.map +1 -0
- package/lib/chain/blocks/verifyBlock.js +18 -5
- package/lib/chain/blocks/verifyBlock.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksDataAvailability.js +21 -10
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +63 -16
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/chain.d.ts +18 -101
- package/lib/chain/chain.js +107 -68
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/emitter.d.ts +18 -2
- package/lib/chain/emitter.js +13 -0
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/dataColumnSidecarError.d.ts +69 -0
- package/lib/chain/errors/dataColumnSidecarError.js +21 -0
- package/lib/chain/errors/dataColumnSidecarError.js.map +1 -0
- package/lib/chain/errors/index.d.ts +1 -0
- package/lib/chain/errors/index.js +1 -0
- package/lib/chain/errors/index.js.map +1 -1
- package/lib/chain/interface.d.ts +6 -7
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/options.d.ts +4 -1
- package/lib/chain/options.js +1 -0
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/prepareNextSlot.js +2 -1
- package/lib/chain/prepareNextSlot.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.d.ts +30 -16
- package/lib/chain/produceBlock/produceBlockBody.js +28 -28
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +6 -3
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +28 -4
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js.map +1 -1
- package/lib/chain/seenCache/seenGossipBlockInput.d.ts +64 -18
- package/lib/chain/seenCache/seenGossipBlockInput.js +321 -53
- package/lib/chain/seenCache/seenGossipBlockInput.js.map +1 -1
- package/lib/chain/validation/dataColumnSidecar.d.ts +29 -0
- package/lib/chain/validation/dataColumnSidecar.js +248 -0
- package/lib/chain/validation/dataColumnSidecar.js.map +1 -0
- package/lib/db/beacon.d.ts +3 -1
- package/lib/db/beacon.js +3 -1
- package/lib/db/beacon.js.map +1 -1
- package/lib/db/buckets.d.ts +3 -1
- package/lib/db/buckets.js +2 -0
- package/lib/db/buckets.js.map +1 -1
- package/lib/db/interface.d.ts +3 -1
- package/lib/db/repositories/dataColumnSidecar.d.ts +26 -0
- package/lib/db/repositories/dataColumnSidecar.js +39 -0
- package/lib/db/repositories/dataColumnSidecar.js.map +1 -0
- package/lib/db/repositories/dataColumnSidecarArchive.d.ts +24 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js +39 -0
- package/lib/db/repositories/dataColumnSidecarArchive.js.map +1 -0
- package/lib/db/repositories/index.d.ts +2 -0
- package/lib/db/repositories/index.js +2 -0
- package/lib/db/repositories/index.js.map +1 -1
- package/lib/execution/builder/http.d.ts +20 -4
- package/lib/execution/builder/http.js +30 -11
- package/lib/execution/builder/http.js.map +1 -1
- package/lib/execution/builder/interface.d.ts +5 -4
- package/lib/execution/engine/http.d.ts +8 -5
- package/lib/execution/engine/http.js +56 -42
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +6 -13
- package/lib/execution/engine/interface.js +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/mock.d.ts +1 -0
- package/lib/execution/engine/mock.js +5 -0
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/types.d.ts +12 -2
- package/lib/execution/engine/types.js +8 -2
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +15 -5
- package/lib/metrics/metrics/beacon.js +61 -14
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +29 -1
- package/lib/metrics/metrics/lodestar.js +59 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/core/metrics.d.ts +10 -3
- package/lib/network/core/metrics.js +22 -4
- package/lib/network/core/metrics.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +15 -4
- package/lib/network/core/networkCore.js +73 -23
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +2 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +5 -3
- package/lib/network/core/networkCoreWorkerHandler.js +6 -1
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +7 -4
- package/lib/network/events.d.ts +4 -2
- package/lib/network/events.js.map +1 -1
- package/lib/network/gossip/gossipsub.d.ts +2 -2
- package/lib/network/gossip/gossipsub.js +8 -6
- package/lib/network/gossip/gossipsub.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +8 -1
- package/lib/network/gossip/interface.js +1 -0
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/scoringParameters.d.ts +6 -2
- package/lib/network/gossip/scoringParameters.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +2033 -1484
- package/lib/network/gossip/topic.js +29 -1
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +11 -3
- package/lib/network/metadata.d.ts +9 -5
- package/lib/network/metadata.js +26 -5
- package/lib/network/metadata.js.map +1 -1
- package/lib/network/network.d.ts +14 -4
- package/lib/network/network.js +73 -11
- package/lib/network/network.js.map +1 -1
- package/lib/network/networkConfig.d.ts +12 -0
- package/lib/network/networkConfig.js +2 -0
- package/lib/network/networkConfig.js.map +1 -0
- package/lib/network/options.d.ts +1 -0
- package/lib/network/options.js +5 -0
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/discover.d.ts +8 -3
- package/lib/network/peers/discover.js +99 -14
- package/lib/network/peers/discover.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +10 -4
- package/lib/network/peers/peerManager.js +105 -19
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/peersData.d.ts +17 -3
- package/lib/network/peers/peersData.js.map +1 -1
- package/lib/network/peers/score/interface.d.ts +1 -1
- package/lib/network/peers/score/score.d.ts +2 -2
- package/lib/network/peers/score/score.js +4 -1
- package/lib/network/peers/score/score.js.map +1 -1
- package/lib/network/peers/score/store.d.ts +3 -1
- package/lib/network/peers/score/store.js +6 -2
- package/lib/network/peers/score/store.js.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts +7 -3
- package/lib/network/peers/utils/assertPeerRelevance.js +10 -1
- package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
- package/lib/network/peers/utils/prioritizePeers.d.ts +19 -7
- package/lib/network/peers/utils/prioritizePeers.js +42 -6
- package/lib/network/peers/utils/prioritizePeers.js.map +1 -1
- package/lib/network/processor/extractSlotRootFns.js +8 -1
- package/lib/network/processor/extractSlotRootFns.js.map +1 -1
- package/lib/network/processor/gossipHandlers.js +165 -16
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.js +5 -0
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/index.js +1 -0
- package/lib/network/processor/index.js.map +1 -1
- package/lib/network/reqresp/ReqRespBeaconNode.d.ts +2 -2
- package/lib/network/reqresp/ReqRespBeaconNode.js +36 -14
- package/lib/network/reqresp/ReqRespBeaconNode.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.d.ts +24 -4
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +259 -20
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +37 -6
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js +283 -28
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.d.ts +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js +3 -3
- package/lib/network/reqresp/handlers/beaconBlocksByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.d.ts +2 -2
- package/lib/network/reqresp/handlers/beaconBlocksByRoot.js.map +1 -1
- package/lib/network/reqresp/handlers/blobSidecarsByRange.d.ts +2 -2
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js +2 -3
- package/lib/network/reqresp/handlers/blobSidecarsByRange.js.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +8 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +73 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js.map +1 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.d.ts +6 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js +36 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -0
- package/lib/network/reqresp/handlers/index.js +13 -2
- package/lib/network/reqresp/handlers/index.js.map +1 -1
- package/lib/network/reqresp/protocols.d.ts +4 -0
- package/lib/network/reqresp/protocols.js +20 -0
- package/lib/network/reqresp/protocols.js.map +1 -1
- package/lib/network/reqresp/rateLimit.js +19 -3
- package/lib/network/reqresp/rateLimit.js.map +1 -1
- package/lib/network/reqresp/score.js +3 -0
- package/lib/network/reqresp/score.js.map +1 -1
- package/lib/network/reqresp/types.d.ts +13 -6
- package/lib/network/reqresp/types.js +14 -5
- package/lib/network/reqresp/types.js.map +1 -1
- package/lib/network/statusCache.d.ts +5 -5
- package/lib/network/statusCache.js.map +1 -1
- package/lib/network/subnets/interface.d.ts +3 -0
- package/lib/network/subnets/interface.js +14 -1
- package/lib/network/subnets/interface.js.map +1 -1
- package/lib/network/subnets/syncnetsService.js +4 -5
- package/lib/network/subnets/syncnetsService.js.map +1 -1
- package/lib/node/nodejs.js +1 -0
- package/lib/node/nodejs.js.map +1 -1
- package/lib/sync/constants.d.ts +18 -3
- package/lib/sync/constants.js +21 -3
- package/lib/sync/constants.js.map +1 -1
- package/lib/sync/interface.d.ts +2 -2
- package/lib/sync/interface.js +1 -1
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/range/batch.d.ts +17 -2
- package/lib/sync/range/batch.js +39 -7
- package/lib/sync/range/batch.js.map +1 -1
- package/lib/sync/range/chain.d.ts +15 -1
- package/lib/sync/range/chain.js +124 -33
- package/lib/sync/range/chain.js.map +1 -1
- package/lib/sync/range/range.d.ts +3 -2
- package/lib/sync/range/range.js +9 -3
- package/lib/sync/range/range.js.map +1 -1
- package/lib/sync/range/utils/chainTarget.d.ts +5 -1
- package/lib/sync/range/utils/chainTarget.js +26 -1
- package/lib/sync/range/utils/chainTarget.js.map +1 -1
- package/lib/sync/range/utils/peerBalancer.d.ts +19 -5
- package/lib/sync/range/utils/peerBalancer.js +104 -10
- package/lib/sync/range/utils/peerBalancer.js.map +1 -1
- package/lib/sync/sync.js +1 -1
- package/lib/sync/sync.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +54 -5
- package/lib/sync/unknownBlock.js +321 -61
- package/lib/sync/unknownBlock.js.map +1 -1
- package/lib/sync/utils/remoteSyncType.d.ts +4 -4
- package/lib/sync/utils/remoteSyncType.js.map +1 -1
- package/lib/util/blobs.d.ts +16 -4
- package/lib/util/blobs.js +122 -5
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/dataColumns.d.ts +137 -0
- package/lib/util/dataColumns.js +358 -0
- package/lib/util/dataColumns.js.map +1 -0
- package/lib/util/metadata.d.ts +5 -0
- package/lib/util/metadata.js +10 -0
- package/lib/util/metadata.js.map +1 -1
- package/lib/util/sszBytes.d.ts +1 -0
- package/lib/util/sszBytes.js +17 -0
- package/lib/util/sszBytes.js.map +1 -1
- package/lib/util/types.d.ts +7 -0
- package/lib/util/types.js +3 -0
- package/lib/util/types.js.map +1 -1
- package/package.json +18 -18
- package/lib/network/reqresp/handlers/status.d.ts +0 -4
- package/lib/network/reqresp/handlers/status.js +0 -11
- package/lib/network/reqresp/handlers/status.js.map +0 -1
|
@@ -57,6 +57,8 @@ function stringifyGossipTopicType(topic) {
|
|
|
57
57
|
return `${topic.type}_${topic.subnet}`;
|
|
58
58
|
case GossipType.blob_sidecar:
|
|
59
59
|
return `${topic.type}_${topic.subnet}`;
|
|
60
|
+
case GossipType.data_column_sidecar:
|
|
61
|
+
return `${topic.type}_${topic.subnet}`;
|
|
60
62
|
}
|
|
61
63
|
}
|
|
62
64
|
export function getGossipSSZType(topic) {
|
|
@@ -67,6 +69,8 @@ export function getGossipSSZType(topic) {
|
|
|
67
69
|
return ssz[fork].SignedBeaconBlock;
|
|
68
70
|
case GossipType.blob_sidecar:
|
|
69
71
|
return ssz.deneb.BlobSidecar;
|
|
72
|
+
case GossipType.data_column_sidecar:
|
|
73
|
+
return ssz.fulu.DataColumnSidecar;
|
|
70
74
|
case GossipType.beacon_aggregate_and_proof:
|
|
71
75
|
return sszTypesFor(fork).SignedAggregateAndProof;
|
|
72
76
|
case GossipType.beacon_attestation:
|
|
@@ -179,6 +183,13 @@ export function parseGossipTopic(forkDigestContext, topicStr) {
|
|
|
179
183
|
throw Error(`subnet ${subnetStr} is not a number`);
|
|
180
184
|
return { type: GossipType.blob_sidecar, subnet, boundary, encoding };
|
|
181
185
|
}
|
|
186
|
+
if (gossipTypeStr.startsWith(GossipType.data_column_sidecar)) {
|
|
187
|
+
const subnetStr = gossipTypeStr.slice(GossipType.data_column_sidecar.length + 1); // +1 for '_' concatenating the topic name and the subnet
|
|
188
|
+
const subnet = parseInt(subnetStr, 10);
|
|
189
|
+
if (Number.isNaN(subnet))
|
|
190
|
+
throw Error(`subnet ${subnetStr} is not a number`);
|
|
191
|
+
return { type: GossipType.data_column_sidecar, subnet, boundary, encoding };
|
|
192
|
+
}
|
|
182
193
|
throw Error(`Unknown gossip type ${gossipTypeStr}`);
|
|
183
194
|
}
|
|
184
195
|
catch (e) {
|
|
@@ -189,7 +200,7 @@ export function parseGossipTopic(forkDigestContext, topicStr) {
|
|
|
189
200
|
/**
|
|
190
201
|
* De-duplicate logic to pick fork topics between subscribeCoreTopicsAtFork and unsubscribeCoreTopicsAtFork
|
|
191
202
|
*/
|
|
192
|
-
export function getCoreTopicsAtFork(
|
|
203
|
+
export function getCoreTopicsAtFork(networkConfig, fork, opts) {
|
|
193
204
|
// Common topics for all forks
|
|
194
205
|
const topics = [
|
|
195
206
|
{ type: GossipType.beacon_block },
|
|
@@ -198,8 +209,13 @@ export function getCoreTopicsAtFork(config, fork, opts) {
|
|
|
198
209
|
{ type: GossipType.proposer_slashing },
|
|
199
210
|
{ type: GossipType.attester_slashing },
|
|
200
211
|
];
|
|
212
|
+
// After fulu also track data_column_sidecar_{index}
|
|
213
|
+
if (ForkSeq[fork] >= ForkSeq.fulu) {
|
|
214
|
+
topics.push(...getDataColumnSidecarTopics(networkConfig));
|
|
215
|
+
}
|
|
201
216
|
// After Deneb also track blob_sidecar_{subnet_id}
|
|
202
217
|
if (ForkSeq[fork] >= ForkSeq.deneb) {
|
|
218
|
+
const { config } = networkConfig;
|
|
203
219
|
const subnetCount = isForkPostElectra(fork)
|
|
204
220
|
? config.BLOB_SIDECAR_SUBNET_COUNT_ELECTRA
|
|
205
221
|
: config.BLOB_SIDECAR_SUBNET_COUNT;
|
|
@@ -231,6 +247,17 @@ export function getCoreTopicsAtFork(config, fork, opts) {
|
|
|
231
247
|
}
|
|
232
248
|
return topics;
|
|
233
249
|
}
|
|
250
|
+
/**
|
|
251
|
+
* Pick data column subnets to subscribe to post-fulu.
|
|
252
|
+
*/
|
|
253
|
+
export function getDataColumnSidecarTopics(networkConfig) {
|
|
254
|
+
const topics = [];
|
|
255
|
+
const subnets = networkConfig.custodyConfig.sampledSubnets;
|
|
256
|
+
for (const subnet of subnets) {
|
|
257
|
+
topics.push({ type: GossipType.data_column_sidecar, subnet });
|
|
258
|
+
}
|
|
259
|
+
return topics;
|
|
260
|
+
}
|
|
234
261
|
/**
|
|
235
262
|
* Validate that a `encodingStr` is a known `GossipEncoding`
|
|
236
263
|
*/
|
|
@@ -246,6 +273,7 @@ function parseEncodingStr(encodingStr) {
|
|
|
246
273
|
export const gossipTopicIgnoreDuplicatePublishError = {
|
|
247
274
|
[GossipType.beacon_block]: true,
|
|
248
275
|
[GossipType.blob_sidecar]: true,
|
|
276
|
+
[GossipType.data_column_sidecar]: true,
|
|
249
277
|
[GossipType.beacon_aggregate_and_proof]: true,
|
|
250
278
|
[GossipType.beacon_attestation]: true,
|
|
251
279
|
[GossipType.voluntary_exit]: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topic.js","sourceRoot":"","sources":["../../../src/network/gossip/topic.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EAExB,OAAO,EACP,2BAA2B,EAC3B,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAiC,GAAG,EAAE,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAEjF,OAAO,EAAC,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAC,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"topic.js","sourceRoot":"","sources":["../../../src/network/gossip/topic.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EAExB,OAAO,EACP,2BAA2B,EAC3B,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAiC,GAAG,EAAE,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAEjF,OAAO,EAAC,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAC,MAAM,wCAAwC,CAAC;AAExG,OAAO,EAAC,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAC,cAAc,EAAmC,UAAU,EAAuB,MAAM,gBAAgB,CAAC;AAMjH,MAAM,OAAO,gBAAgB;IAG3B,YAA6B,iBAAoC;QAApC,sBAAiB,GAAjB,iBAAiB,CAAmB;QAFzD,qBAAgB,GAAG,IAAI,GAAG,EAAiC,CAAC;IAEA,CAAC;IAErE,8EAA8E;IAC9E,QAAQ,CAAC,QAAgB;QACvB,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAC3D,kGAAkG;YAClG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8DAA8D;IAC9D,aAAa,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,QAAQ,CAAC,QAAgB,EAAE,KAAkB;QAC3C,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,KAAK,EAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,iBAAoC,EAAE,KAAkB;IAC3F,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,0BAA0B,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3F,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,gBAAgB,CAAC;IACpD,OAAO,SAAS,qBAAqB,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,KAAkB;IAClD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,UAAU,CAAC,YAAY,CAAC;QAC7B,KAAK,UAAU,CAAC,0BAA0B,CAAC;QAC3C,KAAK,UAAU,CAAC,cAAc,CAAC;QAC/B,KAAK,UAAU,CAAC,iBAAiB,CAAC;QAClC,KAAK,UAAU,CAAC,iBAAiB,CAAC;QAClC,KAAK,UAAU,CAAC,qCAAqC,CAAC;QACtD,KAAK,UAAU,CAAC,4BAA4B,CAAC;QAC7C,KAAK,UAAU,CAAC,8BAA8B,CAAC;QAC/C,KAAK,UAAU,CAAC,uBAAuB;YACrC,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,KAAK,UAAU,CAAC,kBAAkB,CAAC;QACnC,KAAK,UAAU,CAAC,cAAc;YAC5B,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACzC,KAAK,UAAU,CAAC,YAAY;YAC1B,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACzC,KAAK,UAAU,CAAC,mBAAmB;YACjC,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,MAAM,EAAC,IAAI,EAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC9B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,UAAU,CAAC,YAAY;YAC1B,kFAAkF;YAClF,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC;QACrC,KAAK,UAAU,CAAC,YAAY;YAC1B,OAAO,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QAC/B,KAAK,UAAU,CAAC,mBAAmB;YACjC,OAAO,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACpC,KAAK,UAAU,CAAC,0BAA0B;YACxC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,uBAAuB,CAAC;QACnD,KAAK,UAAU,CAAC,kBAAkB;YAChC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC;QAC7C,KAAK,UAAU,CAAC,iBAAiB;YAC/B,OAAO,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACrC,KAAK,UAAU,CAAC,iBAAiB;YAC/B,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC;QAC5C,KAAK,UAAU,CAAC,cAAc;YAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC;QACxC,KAAK,UAAU,CAAC,qCAAqC;YACnD,OAAO,GAAG,CAAC,MAAM,CAAC,0BAA0B,CAAC;QAC/C,KAAK,UAAU,CAAC,cAAc;YAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC;QACzC,KAAK,UAAU,CAAC,8BAA8B;YAC5C,OAAO,gBAAgB,CAAC,IAAI,CAAC;gBAC3B,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,2BAA2B;gBAC/C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,2BAA2B,CAAC;QAC7C,KAAK,UAAU,CAAC,4BAA4B;YAC1C,OAAO,gBAAgB,CAAC,IAAI,CAAC;gBAC3B,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,yBAAyB;gBAC7C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,yBAAyB,CAAC;QAC3C,KAAK,UAAU,CAAC,uBAAuB;YACrC,OAAO,GAAG,CAAC,OAAO,CAAC,0BAA0B,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAwB,KAAQ,EAAE,cAA0B;IACxF,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,WAAW,CAAC,cAAc,CAA4B,CAAC;IACxE,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAiB,CAAC,YAAY,CAAC,MAAM,EAAE,EAAC,IAAI,EAAE,eAAe,CAAC,mCAAmC,EAAC,CAAC,CAAC;IAChH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAc,EAAE,cAA0B;IAClF,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAiB,CAAC,YAAY,CAAC,MAAM,EAAE,EAAC,IAAI,EAAE,eAAe,CAAC,mCAAmC,EAAC,CAAC,CAAC;IAChH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,+BAA+B,CAAC,IAAc,EAAE,cAA0B;IACxF,IAAI,CAAC;QACH,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,cAAc,CAAsB,CAAC;IACxF,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAiB,CAAC,YAAY,CAAC,MAAM,EAAE,EAAC,IAAI,EAAE,eAAe,CAAC,mCAAmC,EAAC,CAAC,CAAC;IAChH,CAAC;AACH,CAAC;AAED,UAAU;AAEV,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,iBAAoC,EAAE,QAAgB;IACrF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACjD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC,oBAAoB,gBAAgB,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,CAAC,EAAE,qBAAqB,EAAE,aAAa,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC;QAEtE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAE/C,oHAAoH;QACpH,QAAQ,aAAa,EAAE,CAAC;YACtB,KAAK,UAAU,CAAC,YAAY,CAAC;YAC7B,KAAK,UAAU,CAAC,0BAA0B,CAAC;YAC3C,KAAK,UAAU,CAAC,cAAc,CAAC;YAC/B,KAAK,UAAU,CAAC,iBAAiB,CAAC;YAClC,KAAK,UAAU,CAAC,iBAAiB,CAAC;YAClC,KAAK,UAAU,CAAC,qCAAqC,CAAC;YACtD,KAAK,UAAU,CAAC,4BAA4B,CAAC;YAC7C,KAAK,UAAU,CAAC,8BAA8B,CAAC;YAC/C,KAAK,UAAU,CAAC,uBAAuB;gBACrC,OAAO,EAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAC,CAAC;QACrD,CAAC;QAED,KAAK,MAAM,UAAU,IAAI,CAAC,UAAU,CAAC,kBAA2B,EAAE,UAAU,CAAC,cAAuB,CAAC,EAAE,CAAC;YACtG,IAAI,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,yDAAyD;gBACvH,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBACvC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;oBAAE,MAAM,KAAK,CAAC,UAAU,SAAS,kBAAkB,CAAC,CAAC;gBAC7E,OAAO,EAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,IAAI,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACtD,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,yDAAyD;YACpI,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE,MAAM,KAAK,CAAC,UAAU,SAAS,kBAAkB,CAAC,CAAC;YAC7E,OAAO,EAAC,IAAI,EAAE,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,CAAC;QACrE,CAAC;QAED,IAAI,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,yDAAyD;YAC3I,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE,MAAM,KAAK,CAAC,UAAU,SAAS,kBAAkB,CAAC,CAAC;YAC7E,OAAO,EAAC,IAAI,EAAE,UAAU,CAAC,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,CAAC;QAC5E,CAAC;QAED,MAAM,KAAK,CAAC,uBAAuB,aAAa,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACV,CAAW,CAAC,OAAO,GAAG,wBAAwB,QAAQ,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC;QACnF,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,aAA4B,EAC5B,IAAc,EACd,IAAyE;IAEzE,8BAA8B;IAC9B,MAAM,MAAM,GAAmD;QAC7D,EAAC,IAAI,EAAE,UAAU,CAAC,YAAY,EAAC;QAC/B,EAAC,IAAI,EAAE,UAAU,CAAC,0BAA0B,EAAC;QAC7C,EAAC,IAAI,EAAE,UAAU,CAAC,cAAc,EAAC;QACjC,EAAC,IAAI,EAAE,UAAU,CAAC,iBAAiB,EAAC;QACpC,EAAC,IAAI,EAAE,UAAU,CAAC,iBAAiB,EAAC;KACrC,CAAC;IAEF,oDAAoD;IACpD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,GAAG,0BAA0B,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,kDAAkD;IAClD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,EAAC,MAAM,EAAC,GAAG,aAAa,CAAC;QAC/B,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC;YACzC,CAAC,CAAC,MAAM,CAAC,iCAAiC;YAC1C,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC;QAErC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,UAAU,CAAC,YAAY,EAAE,MAAM,EAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,UAAU;IACV,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,UAAU,CAAC,uBAAuB,EAAC,CAAC,CAAC;IAC1D,CAAC;IAED,iCAAiC;IACjC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,UAAU,CAAC,qCAAqC,EAAC,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,UAAU,CAAC,8BAA8B,EAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,UAAU,CAAC,4BAA4B,EAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,wBAAwB,EAAE,MAAM,EAAE,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,UAAU,CAAC,kBAAkB,EAAE,MAAM,EAAC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACpC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,2BAA2B,EAAE,MAAM,EAAE,EAAE,CAAC;gBACpE,MAAM,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,UAAU,CAAC,cAAc,EAAE,MAAM,EAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,aAA4B;IAE5B,MAAM,MAAM,GAAmD,EAAE,CAAC;IAElE,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC;IAC3D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,UAAU,CAAC,mBAAmB,EAAE,MAAM,EAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,cAAc,CAAC,UAAU;YAC5B,OAAO,WAAW,CAAC;QAErB;YACE,MAAM,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,MAAM,sCAAsC,GAAgC;IACjF,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,IAAI;IAC/B,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,IAAI;IAC/B,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,IAAI;IACtC,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,IAAI;IAC7C,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,IAAI;IACrC,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,IAAI;IACjC,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,qBAAqB;IAC5D,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,KAAK;IACrC,CAAC,UAAU,CAAC,qCAAqC,CAAC,EAAE,IAAI;IACxD,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,IAAI;IACjC,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE,KAAK;IAChD,CAAC,UAAU,CAAC,8BAA8B,CAAC,EAAE,KAAK;IAClD,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,IAAI;CAC3C,CAAC"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { Identify } from "@libp2p/identify";
|
|
2
2
|
import { ComponentLogger, ConnectionGater, ConnectionProtector, ContentRouting, Libp2pEvents, Metrics, NodeInfo, PeerId, PeerRouting, PeerStore, PrivateKey, TypedEventTarget, Upgrader } from "@libp2p/interface";
|
|
3
3
|
import type { AddressManager, ConnectionManager, Registrar, TransportManager } from "@libp2p/interface-internal";
|
|
4
|
-
import { AttesterSlashing, LightClientFinalityUpdate, LightClientOptimisticUpdate, SignedAggregateAndProof, SignedBeaconBlock, SingleAttestation, Slot, SlotRootHex, SubnetID, WithBytes, altair, capella, deneb, phase0 } from "@lodestar/types";
|
|
4
|
+
import { AttesterSlashing, LightClientFinalityUpdate, LightClientOptimisticUpdate, SignedAggregateAndProof, SignedBeaconBlock, SingleAttestation, Slot, SlotRootHex, SubnetID, WithBytes, altair, capella, deneb, fulu, phase0 } from "@lodestar/types";
|
|
5
5
|
import type { Datastore } from "interface-datastore";
|
|
6
6
|
import { Libp2p as ILibp2p } from "libp2p";
|
|
7
|
+
import { CustodyConfig } from "../util/dataColumns.js";
|
|
7
8
|
import { PeerIdStr } from "../util/peerId.js";
|
|
8
|
-
import { BlobSidecarsByRootRequest } from "../util/types.js";
|
|
9
|
+
import { BeaconBlocksByRootRequest, BlobSidecarsByRootRequest, DataColumnSidecarsByRootRequest } from "../util/types.js";
|
|
9
10
|
import { INetworkCorePublic } from "./core/types.js";
|
|
10
11
|
import { INetworkEventBus } from "./events.js";
|
|
11
12
|
import { GossipType } from "./gossip/interface.js";
|
|
12
13
|
import { PeerAction } from "./peers/index.js";
|
|
14
|
+
import { PeerSyncMeta } from "./peers/peersData.js";
|
|
13
15
|
import { PendingGossipsubMessage } from "./processor/types.js";
|
|
14
16
|
/**
|
|
15
17
|
* The architecture of the network looks like so:
|
|
@@ -20,9 +22,12 @@ import { PendingGossipsubMessage } from "./processor/types.js";
|
|
|
20
22
|
* - INetwork - This interface extends INetworkCore and crucially allows for a connection to the BeaconChain module.
|
|
21
23
|
*/
|
|
22
24
|
export interface INetwork extends INetworkCorePublic {
|
|
25
|
+
readonly peerId: PeerId;
|
|
26
|
+
readonly custodyConfig: CustodyConfig;
|
|
23
27
|
readonly closed: boolean;
|
|
24
28
|
events: INetworkEventBus;
|
|
25
29
|
getConnectedPeers(): PeerIdStr[];
|
|
30
|
+
getConnectedPeerSyncMeta(peerId: PeerIdStr): PeerSyncMeta;
|
|
26
31
|
getConnectedPeerCount(): number;
|
|
27
32
|
isSubscribedToGossipCoreTopics(): boolean;
|
|
28
33
|
reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
|
|
@@ -30,13 +35,16 @@ export interface INetwork extends INetworkCorePublic {
|
|
|
30
35
|
reStatusPeers(peers: PeerIdStr[]): Promise<void>;
|
|
31
36
|
searchUnknownSlotRoot(slotRoot: SlotRootHex, peer?: PeerIdStr): void;
|
|
32
37
|
sendBeaconBlocksByRange(peerId: PeerIdStr, request: phase0.BeaconBlocksByRangeRequest): Promise<WithBytes<SignedBeaconBlock>[]>;
|
|
33
|
-
sendBeaconBlocksByRoot(peerId: PeerIdStr, request:
|
|
38
|
+
sendBeaconBlocksByRoot(peerId: PeerIdStr, request: BeaconBlocksByRootRequest): Promise<WithBytes<SignedBeaconBlock>[]>;
|
|
34
39
|
sendBlobSidecarsByRange(peerId: PeerIdStr, request: deneb.BlobSidecarsByRangeRequest): Promise<deneb.BlobSidecar[]>;
|
|
35
40
|
sendBlobSidecarsByRoot(peerId: PeerIdStr, request: BlobSidecarsByRootRequest): Promise<deneb.BlobSidecar[]>;
|
|
41
|
+
sendDataColumnSidecarsByRange(peerId: PeerIdStr, request: fulu.DataColumnSidecarsByRangeRequest): Promise<fulu.DataColumnSidecar[]>;
|
|
42
|
+
sendDataColumnSidecarsByRoot(peerId: PeerIdStr, request: DataColumnSidecarsByRootRequest): Promise<fulu.DataColumnSidecar[]>;
|
|
36
43
|
publishBeaconBlock(signedBlock: SignedBeaconBlock): Promise<number>;
|
|
37
44
|
publishBlobSidecar(blobSidecar: deneb.BlobSidecar): Promise<number>;
|
|
38
45
|
publishBeaconAggregateAndProof(aggregateAndProof: SignedAggregateAndProof): Promise<number>;
|
|
39
46
|
publishBeaconAttestation(attestation: SingleAttestation, subnet: SubnetID): Promise<number>;
|
|
47
|
+
publishDataColumnSidecar(dataColumnSideCar: fulu.DataColumnSidecar): Promise<number>;
|
|
40
48
|
publishVoluntaryExit(voluntaryExit: phase0.SignedVoluntaryExit): Promise<number>;
|
|
41
49
|
publishBlsToExecutionChange(blsToExecutionChange: capella.SignedBLSToExecutionChange): Promise<number>;
|
|
42
50
|
publishProposerSlashing(proposerSlashing: phase0.ProposerSlashing): Promise<number>;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { BitArray } from "@chainsafe/ssz";
|
|
2
2
|
import { BeaconConfig } from "@lodestar/config";
|
|
3
|
-
import { Epoch,
|
|
3
|
+
import { Epoch, fulu, phase0 } from "@lodestar/types";
|
|
4
4
|
import { Logger } from "@lodestar/utils";
|
|
5
|
+
import { NetworkConfig } from "./networkConfig.js";
|
|
5
6
|
export declare enum ENRKey {
|
|
6
7
|
tcp = "tcp",
|
|
7
8
|
eth2 = "eth2",
|
|
8
9
|
attnets = "attnets",
|
|
9
10
|
syncnets = "syncnets",
|
|
11
|
+
cgc = "cgc",
|
|
10
12
|
nfd = "nfd"
|
|
11
13
|
}
|
|
12
14
|
export declare enum SubnetType {
|
|
@@ -14,10 +16,10 @@ export declare enum SubnetType {
|
|
|
14
16
|
syncnets = "syncnets"
|
|
15
17
|
}
|
|
16
18
|
export type MetadataOpts = {
|
|
17
|
-
metadata?:
|
|
19
|
+
metadata?: fulu.Metadata;
|
|
18
20
|
};
|
|
19
21
|
export type MetadataModules = {
|
|
20
|
-
|
|
22
|
+
networkConfig: NetworkConfig;
|
|
21
23
|
logger: Logger;
|
|
22
24
|
onSetValue: (key: string, value: Uint8Array) => void;
|
|
23
25
|
};
|
|
@@ -28,7 +30,7 @@ export type MetadataModules = {
|
|
|
28
30
|
*/
|
|
29
31
|
export declare class MetadataController {
|
|
30
32
|
private onSetValue;
|
|
31
|
-
private
|
|
33
|
+
private networkConfig;
|
|
32
34
|
private logger;
|
|
33
35
|
private _metadata;
|
|
34
36
|
constructor(opts: MetadataOpts, modules: MetadataModules);
|
|
@@ -38,8 +40,10 @@ export declare class MetadataController {
|
|
|
38
40
|
set syncnets(syncnets: BitArray);
|
|
39
41
|
get attnets(): BitArray;
|
|
40
42
|
set attnets(attnets: BitArray);
|
|
43
|
+
get custodyGroupCount(): number;
|
|
44
|
+
set custodyGroupCount(custodyGroupCount: number);
|
|
41
45
|
/** Consumers that need the phase0.Metadata type can just ignore the .syncnets property */
|
|
42
|
-
get json():
|
|
46
|
+
get json(): fulu.Metadata;
|
|
43
47
|
/**
|
|
44
48
|
* From spec:
|
|
45
49
|
* fork_digest is compute_fork_digest(current_fork_version, genesis_validators_root) where
|
package/lib/network/metadata.js
CHANGED
|
@@ -3,6 +3,7 @@ import { computeStartSlotAtEpoch } from "@lodestar/state-transition";
|
|
|
3
3
|
import { ssz } from "@lodestar/types";
|
|
4
4
|
import { toHex } from "@lodestar/utils";
|
|
5
5
|
import { FAR_FUTURE_EPOCH } from "../constants/index.js";
|
|
6
|
+
import { serializeCgc } from "../util/metadata.js";
|
|
6
7
|
import { getCurrentAndNextForkBoundary } from "./forks.js";
|
|
7
8
|
export var ENRKey;
|
|
8
9
|
(function (ENRKey) {
|
|
@@ -10,6 +11,7 @@ export var ENRKey;
|
|
|
10
11
|
ENRKey["eth2"] = "eth2";
|
|
11
12
|
ENRKey["attnets"] = "attnets";
|
|
12
13
|
ENRKey["syncnets"] = "syncnets";
|
|
14
|
+
ENRKey["cgc"] = "cgc";
|
|
13
15
|
ENRKey["nfd"] = "nfd";
|
|
14
16
|
})(ENRKey || (ENRKey = {}));
|
|
15
17
|
export var SubnetType;
|
|
@@ -24,20 +26,26 @@ export var SubnetType;
|
|
|
24
26
|
*/
|
|
25
27
|
export class MetadataController {
|
|
26
28
|
constructor(opts, modules) {
|
|
27
|
-
this.
|
|
29
|
+
this.networkConfig = modules.networkConfig;
|
|
28
30
|
this.logger = modules.logger;
|
|
29
31
|
this.onSetValue = modules.onSetValue;
|
|
30
|
-
this._metadata = opts.metadata
|
|
32
|
+
this._metadata = opts.metadata ?? {
|
|
33
|
+
...ssz.fulu.Metadata.defaultValue(),
|
|
34
|
+
custodyGroupCount: modules.networkConfig.custodyConfig.targetCustodyGroupCount,
|
|
35
|
+
};
|
|
31
36
|
}
|
|
32
37
|
upstreamValues(currentEpoch) {
|
|
33
38
|
// updateEth2Field() MUST be called with clock epoch
|
|
34
39
|
this.updateEth2Field(currentEpoch);
|
|
35
40
|
this.onSetValue(ENRKey.attnets, ssz.phase0.AttestationSubnets.serialize(this._metadata.attnets));
|
|
36
|
-
|
|
41
|
+
const config = this.networkConfig.config;
|
|
42
|
+
if (config.getForkSeq(computeStartSlotAtEpoch(currentEpoch)) >= ForkSeq.altair) {
|
|
37
43
|
// Only persist syncnets if altair fork is already activated. If currentFork is altair but head is phase0
|
|
38
44
|
// adding syncnets to the ENR is not a problem, we will just have a useless field for a few hours.
|
|
39
45
|
this.onSetValue(ENRKey.syncnets, ssz.phase0.AttestationSubnets.serialize(this._metadata.syncnets));
|
|
40
46
|
}
|
|
47
|
+
// Set CGC regardless of fork. It may be useful to clients before Fulu, and will be ignored otherwise.
|
|
48
|
+
this.onSetValue(ENRKey.cgc, serializeCgc(this._metadata.custodyGroupCount));
|
|
41
49
|
}
|
|
42
50
|
get seqNumber() {
|
|
43
51
|
return this._metadata.seqNumber;
|
|
@@ -57,6 +65,18 @@ export class MetadataController {
|
|
|
57
65
|
this._metadata.seqNumber++;
|
|
58
66
|
this._metadata.attnets = attnets;
|
|
59
67
|
}
|
|
68
|
+
get custodyGroupCount() {
|
|
69
|
+
return this._metadata.custodyGroupCount;
|
|
70
|
+
}
|
|
71
|
+
set custodyGroupCount(custodyGroupCount) {
|
|
72
|
+
if (custodyGroupCount === this._metadata.custodyGroupCount) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.onSetValue(ENRKey.cgc, serializeCgc(custodyGroupCount));
|
|
76
|
+
this.logger.debug("Updated cgc field in ENR", { custodyGroupCount });
|
|
77
|
+
this._metadata.seqNumber++;
|
|
78
|
+
this._metadata.custodyGroupCount = custodyGroupCount;
|
|
79
|
+
}
|
|
60
80
|
/** Consumers that need the phase0.Metadata type can just ignore the .syncnets property */
|
|
61
81
|
get json() {
|
|
62
82
|
return this._metadata;
|
|
@@ -74,7 +94,8 @@ export class MetadataController {
|
|
|
74
94
|
* Current Clock implementation ensures no race conditions, epoch is correct if re-fetched
|
|
75
95
|
*/
|
|
76
96
|
updateEth2Field(epoch) {
|
|
77
|
-
const
|
|
97
|
+
const config = this.networkConfig.config;
|
|
98
|
+
const enrForkId = getENRForkID(config, epoch);
|
|
78
99
|
const { forkDigest, nextForkVersion, nextForkEpoch } = enrForkId;
|
|
79
100
|
this.onSetValue(ENRKey.eth2, ssz.phase0.ENRForkID.serialize(enrForkId));
|
|
80
101
|
this.logger.debug("Updated eth2 field in ENR", {
|
|
@@ -83,7 +104,7 @@ export class MetadataController {
|
|
|
83
104
|
nextForkEpoch,
|
|
84
105
|
});
|
|
85
106
|
const nextForkDigest = nextForkEpoch !== FAR_FUTURE_EPOCH
|
|
86
|
-
?
|
|
107
|
+
? config.forkBoundary2ForkDigest(config.getForkBoundaryAtEpoch(nextForkEpoch))
|
|
87
108
|
: ssz.ForkDigest.defaultValue();
|
|
88
109
|
this.onSetValue(ENRKey.nfd, nextForkDigest);
|
|
89
110
|
this.logger.debug("Updated nfd field in ENR", { nextForkDigest: toHex(nextForkDigest) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/network/metadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAC,uBAAuB,EAAC,MAAM,4BAA4B,CAAC;AACnE,OAAO,
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/network/metadata.ts"],"names":[],"mappings":"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"}
|
package/lib/network/network.d.ts
CHANGED
|
@@ -3,18 +3,20 @@ import { PeerId, PrivateKey } from "@libp2p/interface";
|
|
|
3
3
|
import { routes } from "@lodestar/api";
|
|
4
4
|
import { BeaconConfig } from "@lodestar/config";
|
|
5
5
|
import { LoggerNode } from "@lodestar/logger/node";
|
|
6
|
-
import { AttesterSlashing, LightClientBootstrap, LightClientFinalityUpdate, LightClientOptimisticUpdate, LightClientUpdate, Root, SignedAggregateAndProof, SignedBeaconBlock, SingleAttestation, SlotRootHex, SubnetID, WithBytes, altair, capella, deneb, phase0 } from "@lodestar/types";
|
|
6
|
+
import { AttesterSlashing, LightClientBootstrap, LightClientFinalityUpdate, LightClientOptimisticUpdate, LightClientUpdate, Root, SignedAggregateAndProof, SignedBeaconBlock, SingleAttestation, SlotRootHex, SubnetID, WithBytes, altair, capella, deneb, fulu, phase0 } from "@lodestar/types";
|
|
7
7
|
import { IBeaconChain } from "../chain/index.js";
|
|
8
8
|
import { IBeaconDb } from "../db/interface.js";
|
|
9
9
|
import { Metrics } from "../metrics/index.js";
|
|
10
|
+
import { CustodyConfig } from "../util/dataColumns.js";
|
|
10
11
|
import { PeerIdStr } from "../util/peerId.js";
|
|
11
|
-
import { BlobSidecarsByRootRequest } from "../util/types.js";
|
|
12
|
+
import { BeaconBlocksByRootRequest, BlobSidecarsByRootRequest, DataColumnSidecarsByRootRequest } from "../util/types.js";
|
|
12
13
|
import { INetworkCore } from "./core/index.js";
|
|
13
14
|
import { INetworkEventBus, NetworkEventBus } from "./events.js";
|
|
14
15
|
import { GossipHandlers, GossipType } from "./gossip/index.js";
|
|
15
16
|
import { INetwork } from "./interface.js";
|
|
16
17
|
import { NetworkOptions } from "./options.js";
|
|
17
18
|
import { PeerAction, PeerScoreStats } from "./peers/index.js";
|
|
19
|
+
import { PeerSyncMeta } from "./peers/peersData.js";
|
|
18
20
|
import { AggregatorTracker } from "./processor/aggregatorTracker.js";
|
|
19
21
|
import { NetworkProcessor, PendingGossipsubMessage } from "./processor/index.js";
|
|
20
22
|
import { GetReqRespHandlerFn } from "./reqresp/types.js";
|
|
@@ -52,6 +54,7 @@ export type NetworkInitModules = {
|
|
|
52
54
|
*/
|
|
53
55
|
export declare class Network implements INetwork {
|
|
54
56
|
readonly peerId: PeerId;
|
|
57
|
+
readonly custodyConfig: CustodyConfig;
|
|
55
58
|
readonly events: INetworkEventBus;
|
|
56
59
|
private readonly logger;
|
|
57
60
|
private readonly config;
|
|
@@ -62,7 +65,7 @@ export declare class Network implements INetwork {
|
|
|
62
65
|
private readonly core;
|
|
63
66
|
private readonly aggregatorTracker;
|
|
64
67
|
private subscribedToCoreTopics;
|
|
65
|
-
private
|
|
68
|
+
private connectedPeersSyncMeta;
|
|
66
69
|
constructor(modules: NetworkModules);
|
|
67
70
|
static init({ opts, config, logger, metrics, chain, db, gossipHandlers, privateKey, peerStoreDir, getReqRespHandler, }: NetworkInitModules): Promise<Network>;
|
|
68
71
|
get closed(): boolean;
|
|
@@ -81,6 +84,7 @@ export declare class Network implements INetwork {
|
|
|
81
84
|
searchUnknownSlotRoot(slotRoot: SlotRootHex, peer?: PeerIdStr): void;
|
|
82
85
|
reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): Promise<void>;
|
|
83
86
|
getConnectedPeers(): PeerIdStr[];
|
|
87
|
+
getConnectedPeerSyncMeta(peerId: PeerIdStr): PeerSyncMeta;
|
|
84
88
|
getConnectedPeerCount(): number;
|
|
85
89
|
getNetworkIdentity(): Promise<routes.node.NetworkIdentity>;
|
|
86
90
|
/**
|
|
@@ -95,6 +99,7 @@ export declare class Network implements INetwork {
|
|
|
95
99
|
shouldAggregate(subnet: SubnetID, slot: number): boolean;
|
|
96
100
|
publishBeaconBlock(signedBlock: SignedBeaconBlock): Promise<number>;
|
|
97
101
|
publishBlobSidecar(blobSidecar: deneb.BlobSidecar): Promise<number>;
|
|
102
|
+
publishDataColumnSidecar(dataColumnSidecar: fulu.DataColumnSidecar): Promise<number>;
|
|
98
103
|
publishBeaconAggregateAndProof(aggregateAndProof: SignedAggregateAndProof): Promise<number>;
|
|
99
104
|
publishBeaconAttestation(attestation: SingleAttestation, subnet: SubnetID): Promise<number>;
|
|
100
105
|
publishVoluntaryExit(voluntaryExit: phase0.SignedVoluntaryExit): Promise<number>;
|
|
@@ -107,13 +112,15 @@ export declare class Network implements INetwork {
|
|
|
107
112
|
publishLightClientOptimisticUpdate(update: LightClientOptimisticUpdate): Promise<number>;
|
|
108
113
|
private publishGossip;
|
|
109
114
|
sendBeaconBlocksByRange(peerId: PeerIdStr, request: phase0.BeaconBlocksByRangeRequest): Promise<WithBytes<SignedBeaconBlock>[]>;
|
|
110
|
-
sendBeaconBlocksByRoot(peerId: PeerIdStr, request:
|
|
115
|
+
sendBeaconBlocksByRoot(peerId: PeerIdStr, request: BeaconBlocksByRootRequest): Promise<WithBytes<SignedBeaconBlock>[]>;
|
|
111
116
|
sendLightClientBootstrap(peerId: PeerIdStr, request: Root): Promise<LightClientBootstrap>;
|
|
112
117
|
sendLightClientOptimisticUpdate(peerId: PeerIdStr): Promise<LightClientOptimisticUpdate>;
|
|
113
118
|
sendLightClientFinalityUpdate(peerId: PeerIdStr): Promise<LightClientFinalityUpdate>;
|
|
114
119
|
sendLightClientUpdatesByRange(peerId: PeerIdStr, request: altair.LightClientUpdatesByRange): Promise<LightClientUpdate[]>;
|
|
115
120
|
sendBlobSidecarsByRange(peerId: PeerIdStr, request: deneb.BlobSidecarsByRangeRequest): Promise<deneb.BlobSidecar[]>;
|
|
116
121
|
sendBlobSidecarsByRoot(peerId: PeerIdStr, request: BlobSidecarsByRootRequest): Promise<deneb.BlobSidecar[]>;
|
|
122
|
+
sendDataColumnSidecarsByRange(peerId: PeerIdStr, request: fulu.DataColumnSidecarsByRangeRequest): Promise<fulu.DataColumnSidecar[]>;
|
|
123
|
+
sendDataColumnSidecarsByRoot(peerId: PeerIdStr, request: DataColumnSidecarsByRootRequest): Promise<fulu.DataColumnSidecar[]>;
|
|
117
124
|
private sendReqRespRequest;
|
|
118
125
|
connectToPeer(peer: string, multiaddr: string[]): Promise<void>;
|
|
119
126
|
disconnectPeer(peer: string): Promise<void>;
|
|
@@ -134,6 +141,9 @@ export declare class Network implements INetwork {
|
|
|
134
141
|
private onHead;
|
|
135
142
|
private onPeerConnected;
|
|
136
143
|
private onPeerDisconnected;
|
|
144
|
+
private onTargetGroupCountUpdated;
|
|
145
|
+
private onPublishDataColumns;
|
|
146
|
+
private onUpdateStatus;
|
|
137
147
|
}
|
|
138
148
|
export {};
|
|
139
149
|
//# sourceMappingURL=network.d.ts.map
|
package/lib/network/network.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { peerIdFromPrivateKey } from "@libp2p/peer-id";
|
|
2
2
|
import { routes } from "@lodestar/api";
|
|
3
|
-
import { ForkSeq } from "@lodestar/params";
|
|
3
|
+
import { ForkSeq, NUMBER_OF_COLUMNS } from "@lodestar/params";
|
|
4
4
|
import { computeEpochAtSlot, computeTimeAtSlot } from "@lodestar/state-transition";
|
|
5
|
-
import { sleep } from "@lodestar/utils";
|
|
5
|
+
import { prettyPrintIndices, sleep } from "@lodestar/utils";
|
|
6
|
+
import { ChainEvent } from "../chain/index.js";
|
|
7
|
+
import { computeSubnetForDataColumnSidecar } from "../chain/validation/dataColumnSidecar.js";
|
|
6
8
|
import { RegistryMetricCreator } from "../metrics/index.js";
|
|
7
9
|
import { peerIdToString } from "../util/peerId.js";
|
|
10
|
+
import { promiseAllMaybeAsync } from "../util/promises.js";
|
|
8
11
|
import { NetworkCore, WorkerNetworkCore } from "./core/index.js";
|
|
9
12
|
import { NetworkEvent, NetworkEventBus } from "./events.js";
|
|
10
13
|
import { getActiveForkBoundaries } from "./forks.js";
|
|
@@ -16,7 +19,7 @@ import { ReqRespMethod } from "./reqresp/index.js";
|
|
|
16
19
|
import { Version, requestSszTypeByMethod, responseSszTypeByMethod } from "./reqresp/types.js";
|
|
17
20
|
import { collectExactOneTyped, collectMaxResponseTyped, collectMaxResponseTypedWithBytes, } from "./reqresp/utils/collect.js";
|
|
18
21
|
import { collectSequentialBlocksInRange } from "./reqresp/utils/collectSequentialBlocksInRange.js";
|
|
19
|
-
import { isPublishToZeroPeersError } from "./util.js";
|
|
22
|
+
import { isPublishToZeroPeersError, prettyPrintPeerIdStr } from "./util.js";
|
|
20
23
|
/**
|
|
21
24
|
* Must support running both on worker and on main thread.
|
|
22
25
|
*
|
|
@@ -28,7 +31,7 @@ import { isPublishToZeroPeersError } from "./util.js";
|
|
|
28
31
|
export class Network {
|
|
29
32
|
constructor(modules) {
|
|
30
33
|
this.subscribedToCoreTopics = false;
|
|
31
|
-
this.
|
|
34
|
+
this.connectedPeersSyncMeta = new Map();
|
|
32
35
|
this.onLightClientFinalityUpdate = async (finalityUpdate) => {
|
|
33
36
|
// TODO: Review is OK to remove if (this.hasAttachedSyncCommitteeMember())
|
|
34
37
|
try {
|
|
@@ -67,16 +70,38 @@ export class Network {
|
|
|
67
70
|
await sleep(msToSlot, this.controller.signal);
|
|
68
71
|
};
|
|
69
72
|
this.onHead = async () => {
|
|
70
|
-
await this.
|
|
73
|
+
await this.onUpdateStatus();
|
|
71
74
|
};
|
|
72
75
|
this.onPeerConnected = (data) => {
|
|
73
|
-
|
|
76
|
+
const { peer, clientAgent, custodyGroups, status } = data;
|
|
77
|
+
const earliestAvailableSlot = status.earliestAvailableSlot;
|
|
78
|
+
this.logger.verbose("onPeerConnected", {
|
|
79
|
+
peer,
|
|
80
|
+
clientAgent,
|
|
81
|
+
custodyGroups: prettyPrintIndices(custodyGroups),
|
|
82
|
+
earliestAvailableSlot: earliestAvailableSlot ?? "pre-fulu",
|
|
83
|
+
});
|
|
84
|
+
this.connectedPeersSyncMeta.set(peer, {
|
|
85
|
+
client: clientAgent,
|
|
86
|
+
custodyGroups,
|
|
87
|
+
earliestAvailableSlot, // can be undefined pre-fulu
|
|
88
|
+
});
|
|
74
89
|
};
|
|
75
90
|
this.onPeerDisconnected = (data) => {
|
|
76
|
-
this.
|
|
91
|
+
this.connectedPeersSyncMeta.delete(data.peer);
|
|
92
|
+
};
|
|
93
|
+
this.onTargetGroupCountUpdated = (count) => {
|
|
94
|
+
this.core.setTargetGroupCount(count);
|
|
95
|
+
};
|
|
96
|
+
this.onPublishDataColumns = (sidecars) => {
|
|
97
|
+
return promiseAllMaybeAsync(sidecars.map((sidecar) => () => this.publishDataColumnSidecar(sidecar)));
|
|
98
|
+
};
|
|
99
|
+
this.onUpdateStatus = async () => {
|
|
100
|
+
await this.core.updateStatus(this.chain.getStatus());
|
|
77
101
|
};
|
|
78
102
|
this.peerId = peerIdFromPrivateKey(modules.privateKey);
|
|
79
103
|
this.config = modules.config;
|
|
104
|
+
this.custodyConfig = modules.chain.custodyConfig;
|
|
80
105
|
this.logger = modules.logger;
|
|
81
106
|
this.chain = modules.chain;
|
|
82
107
|
this.clock = modules.chain.clock;
|
|
@@ -90,12 +115,16 @@ export class Network {
|
|
|
90
115
|
this.chain.emitter.on(routes.events.EventType.head, this.onHead);
|
|
91
116
|
this.chain.emitter.on(routes.events.EventType.lightClientFinalityUpdate, ({ data }) => this.onLightClientFinalityUpdate(data));
|
|
92
117
|
this.chain.emitter.on(routes.events.EventType.lightClientOptimisticUpdate, ({ data }) => this.onLightClientOptimisticUpdate(data));
|
|
118
|
+
this.chain.emitter.on(ChainEvent.updateTargetCustodyGroupCount, this.onTargetGroupCountUpdated);
|
|
119
|
+
this.chain.emitter.on(ChainEvent.publishDataColumns, this.onPublishDataColumns);
|
|
120
|
+
this.chain.emitter.on(ChainEvent.updateStatus, this.onUpdateStatus);
|
|
93
121
|
}
|
|
94
122
|
static async init({ opts, config, logger, metrics, chain, db, gossipHandlers, privateKey, peerStoreDir, getReqRespHandler, }) {
|
|
95
123
|
const events = new NetworkEventBus();
|
|
96
124
|
const aggregatorTracker = new AggregatorTracker();
|
|
97
125
|
const activeValidatorCount = chain.getHeadState().epochCtx.currentShuffling.activeIndices.length;
|
|
98
126
|
const initialStatus = chain.getStatus();
|
|
127
|
+
const initialCustodyGroupCount = chain.custodyConfig.targetCustodyGroupCount;
|
|
99
128
|
if (opts.useWorker) {
|
|
100
129
|
logger.info("running libp2p instance in worker thread");
|
|
101
130
|
}
|
|
@@ -108,6 +137,7 @@ export class Network {
|
|
|
108
137
|
activeValidatorCount,
|
|
109
138
|
genesisTime: chain.genesisTime,
|
|
110
139
|
initialStatus,
|
|
140
|
+
initialCustodyGroupCount,
|
|
111
141
|
},
|
|
112
142
|
config,
|
|
113
143
|
privateKey,
|
|
@@ -127,6 +157,7 @@ export class Network {
|
|
|
127
157
|
getReqRespHandler,
|
|
128
158
|
metricsRegistry: metrics ? new RegistryMetricCreator() : null,
|
|
129
159
|
initialStatus,
|
|
160
|
+
initialCustodyGroupCount,
|
|
130
161
|
activeValidatorCount,
|
|
131
162
|
});
|
|
132
163
|
const networkProcessor = new NetworkProcessor({ chain, db, config, logger, metrics, events, gossipHandlers, core, aggregatorTracker }, opts);
|
|
@@ -157,6 +188,9 @@ export class Network {
|
|
|
157
188
|
this.chain.emitter.off(routes.events.EventType.head, this.onHead);
|
|
158
189
|
this.chain.emitter.off(routes.events.EventType.lightClientFinalityUpdate, this.onLightClientFinalityUpdate);
|
|
159
190
|
this.chain.emitter.off(routes.events.EventType.lightClientOptimisticUpdate, this.onLightClientOptimisticUpdate);
|
|
191
|
+
this.chain.emitter.off(ChainEvent.updateTargetCustodyGroupCount, this.onTargetGroupCountUpdated);
|
|
192
|
+
this.chain.emitter.off(ChainEvent.publishDataColumns, this.onPublishDataColumns);
|
|
193
|
+
this.chain.emitter.off(ChainEvent.updateStatus, this.onUpdateStatus);
|
|
160
194
|
await this.core.close();
|
|
161
195
|
// Used only for sleep() statements
|
|
162
196
|
this.controller.abort();
|
|
@@ -194,10 +228,17 @@ export class Network {
|
|
|
194
228
|
}
|
|
195
229
|
// REST API queries
|
|
196
230
|
getConnectedPeers() {
|
|
197
|
-
return Array.from(this.
|
|
231
|
+
return Array.from(this.connectedPeersSyncMeta.keys());
|
|
232
|
+
}
|
|
233
|
+
getConnectedPeerSyncMeta(peerId) {
|
|
234
|
+
const syncMeta = this.connectedPeersSyncMeta.get(peerId);
|
|
235
|
+
if (!syncMeta) {
|
|
236
|
+
throw new Error(`peerId=${prettyPrintPeerIdStr(peerId)} not in connectedPeerSyncMeta`);
|
|
237
|
+
}
|
|
238
|
+
return { peerId, ...syncMeta };
|
|
198
239
|
}
|
|
199
240
|
getConnectedPeerCount() {
|
|
200
|
-
return this.
|
|
241
|
+
return this.connectedPeersSyncMeta.size;
|
|
201
242
|
}
|
|
202
243
|
async getNetworkIdentity() {
|
|
203
244
|
return this.core.getNetworkIdentity();
|
|
@@ -243,6 +284,19 @@ export class Network {
|
|
|
243
284
|
ignoreDuplicatePublishError: true,
|
|
244
285
|
});
|
|
245
286
|
}
|
|
287
|
+
async publishDataColumnSidecar(dataColumnSidecar) {
|
|
288
|
+
const epoch = computeEpochAtSlot(dataColumnSidecar.signedBlockHeader.message.slot);
|
|
289
|
+
const boundary = this.config.getForkBoundaryAtEpoch(epoch);
|
|
290
|
+
const subnet = computeSubnetForDataColumnSidecar(this.config, dataColumnSidecar);
|
|
291
|
+
return this.publishGossip({ type: GossipType.data_column_sidecar, boundary, subnet }, dataColumnSidecar, {
|
|
292
|
+
ignoreDuplicatePublishError: true,
|
|
293
|
+
// we ensure having all topic peers via prioritizePeers() function
|
|
294
|
+
// in the worse case, if there is 0 peer on the topic, the overall publish operation could be still a success
|
|
295
|
+
// because supernode will rebuild and publish missing data column sidecars for us
|
|
296
|
+
// hence we want to track sent peers as 0 instead of an error
|
|
297
|
+
allowPublishToZeroTopicPeers: true,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
246
300
|
async publishBeaconAggregateAndProof(aggregateAndProof) {
|
|
247
301
|
const epoch = computeEpochAtSlot(aggregateAndProof.message.aggregate.data.slot);
|
|
248
302
|
const boundary = this.config.getForkBoundaryAtEpoch(epoch);
|
|
@@ -322,12 +376,12 @@ export class Network {
|
|
|
322
376
|
async sendBeaconBlocksByRange(peerId, request) {
|
|
323
377
|
return collectSequentialBlocksInRange(this.sendReqRespRequest(peerId, ReqRespMethod.BeaconBlocksByRange,
|
|
324
378
|
// Before altair, prioritize V2. After altair only request V2
|
|
325
|
-
this.config.getForkSeq(this.clock.currentSlot) >= ForkSeq.altair ? [Version.V2] : [
|
|
379
|
+
this.config.getForkSeq(this.clock.currentSlot) >= ForkSeq.altair ? [Version.V2] : [Version.V2, Version.V1], request), request);
|
|
326
380
|
}
|
|
327
381
|
async sendBeaconBlocksByRoot(peerId, request) {
|
|
328
382
|
return collectMaxResponseTypedWithBytes(this.sendReqRespRequest(peerId, ReqRespMethod.BeaconBlocksByRoot,
|
|
329
383
|
// Before altair, prioritize V2. After altair only request V2
|
|
330
|
-
this.config.getForkSeq(this.clock.currentSlot) >= ForkSeq.altair ? [Version.V2] : [
|
|
384
|
+
this.config.getForkSeq(this.clock.currentSlot) >= ForkSeq.altair ? [Version.V2] : [Version.V2, Version.V1], request), request.length, responseSszTypeByMethod[ReqRespMethod.BeaconBlocksByRoot]);
|
|
331
385
|
}
|
|
332
386
|
async sendLightClientBootstrap(peerId, request) {
|
|
333
387
|
return collectExactOneTyped(this.sendReqRespRequest(peerId, ReqRespMethod.LightClientBootstrap, [Version.V1], request), responseSszTypeByMethod[ReqRespMethod.LightClientBootstrap]);
|
|
@@ -350,6 +404,14 @@ export class Network {
|
|
|
350
404
|
async sendBlobSidecarsByRoot(peerId, request) {
|
|
351
405
|
return collectMaxResponseTyped(this.sendReqRespRequest(peerId, ReqRespMethod.BlobSidecarsByRoot, [Version.V1], request), request.length, responseSszTypeByMethod[ReqRespMethod.BlobSidecarsByRoot]);
|
|
352
406
|
}
|
|
407
|
+
async sendDataColumnSidecarsByRange(peerId, request) {
|
|
408
|
+
return collectMaxResponseTyped(this.sendReqRespRequest(peerId, ReqRespMethod.DataColumnSidecarsByRange, [Version.V1], request),
|
|
409
|
+
// request's count represent the slots, so the actual max count received could be slots * blobs per slot
|
|
410
|
+
request.count * NUMBER_OF_COLUMNS, responseSszTypeByMethod[ReqRespMethod.DataColumnSidecarsByRange]);
|
|
411
|
+
}
|
|
412
|
+
async sendDataColumnSidecarsByRoot(peerId, request) {
|
|
413
|
+
return collectMaxResponseTyped(this.sendReqRespRequest(peerId, ReqRespMethod.DataColumnSidecarsByRoot, [Version.V1], request), request.reduce((total, { columns }) => total + columns.length, 0), responseSszTypeByMethod[ReqRespMethod.DataColumnSidecarsByRoot]);
|
|
414
|
+
}
|
|
353
415
|
sendReqRespRequest(peerId, method, versions, request) {
|
|
354
416
|
const fork = this.config.getForkName(this.clock.currentSlot);
|
|
355
417
|
const requestType = requestSszTypeByMethod(fork, this.config)[method];
|