@lodestar/beacon-node 1.33.0 → 1.34.0-dev.25bf0b65b8
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 +113 -29
- package/lib/api/impl/beacon/blocks/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 +6 -0
- package/lib/api/impl/validator/index.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 +91 -23
- 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/verifyBlocksDataAvailability.js +21 -10
- package/lib/chain/blocks/verifyBlocksDataAvailability.js.map +1 -1
- package/lib/chain/blocks/writeBlockInputToDb.js +89 -15
- package/lib/chain/blocks/writeBlockInputToDb.js.map +1 -1
- package/lib/chain/chain.d.ts +17 -28
- package/lib/chain/chain.js +70 -5
- 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 +10 -4
- 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/produceBlock/produceBlockBody.d.ts +4 -2
- package/lib/chain/produceBlock/produceBlockBody.js +7 -2
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.d.ts +3 -2
- package/lib/chain/produceBlock/validateBlobsAndKzgCommitments.js +25 -2
- 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 +28 -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/dataColumnSidecars.d.ts +47 -0
- package/lib/db/repositories/dataColumnSidecars.js +40 -0
- package/lib/db/repositories/dataColumnSidecars.js.map +1 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.d.ts +15 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.js +23 -0
- package/lib/db/repositories/dataColumnSidecarsArchive.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/engine/http.d.ts +6 -3
- package/lib/execution/engine/http.js +56 -42
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +4 -2
- 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 +10 -0
- package/lib/execution/engine/types.js +6 -0
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/metrics/metrics/beacon.d.ts +14 -0
- package/lib/metrics/metrics/beacon.js +57 -0
- package/lib/metrics/metrics/beacon.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +23 -1
- package/lib/metrics/metrics/lodestar.js +39 -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 +10 -4
- package/lib/network/core/networkCore.js +31 -11
- 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/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/topic.d.ts +1047 -1031
- package/lib/network/gossip/topic.js +20 -1
- package/lib/network/gossip/topic.js.map +1 -1
- package/lib/network/interface.d.ts +9 -1
- 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 +12 -2
- package/lib/network/network.js +68 -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 +90 -13
- 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 +18 -7
- package/lib/network/peers/utils/prioritizePeers.js +43 -7
- 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 +149 -9
- 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 +21 -4
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js +225 -14
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRange.js.map +1 -1
- package/lib/network/reqresp/beaconBlocksMaybeBlobsByRoot.d.ts +32 -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.map +1 -1
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.d.ts +8 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRange.js +92 -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 +50 -0
- package/lib/network/reqresp/handlers/dataColumnSidecarsByRoot.js.map +1 -0
- package/lib/network/reqresp/handlers/index.js +10 -0
- 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 +11 -1
- 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 +11 -4
- package/lib/network/reqresp/types.js +12 -3
- 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 +17 -5
- package/lib/sync/range/utils/peerBalancer.js +85 -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 +8 -1
- package/lib/sync/unknownBlock.js +226 -69
- 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 +23 -1
- package/lib/util/blobs.js +156 -1
- package/lib/util/blobs.js.map +1 -1
- package/lib/util/dataColumns.d.ts +135 -0
- package/lib/util/dataColumns.js +353 -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/package.json +14 -14
- 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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ATTESTATION_SUBNET_COUNT, ForkSeq, SYNC_COMMITTEE_SUBNET_COUNT, isForkPostAltair, isForkPostElectra, } from "@lodestar/params";
|
|
1
|
+
import { ATTESTATION_SUBNET_COUNT, DATA_COLUMN_SIDECAR_SUBNET_COUNT, ForkSeq, SYNC_COMMITTEE_SUBNET_COUNT, isForkPostAltair, isForkPostElectra, } from "@lodestar/params";
|
|
2
2
|
import { ssz, sszTypesFor } from "@lodestar/types";
|
|
3
3
|
import { GossipAction, GossipActionError, GossipErrorCode } from "../../chain/errors/gossipValidation.js";
|
|
4
4
|
import { DEFAULT_ENCODING } from "./constants.js";
|
|
@@ -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) {
|
|
@@ -198,6 +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
|
+
// TODO: @matthewkeil check if this needs to be updated for custody groups
|
|
215
|
+
for (let subnet = 0; subnet < DATA_COLUMN_SIDECAR_SUBNET_COUNT; subnet++) {
|
|
216
|
+
topics.push({ type: GossipType.data_column_sidecar, subnet });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
201
219
|
// After Deneb also track blob_sidecar_{subnet_id}
|
|
202
220
|
if (ForkSeq[fork] >= ForkSeq.deneb) {
|
|
203
221
|
const subnetCount = isForkPostElectra(fork)
|
|
@@ -246,6 +264,7 @@ function parseEncodingStr(encodingStr) {
|
|
|
246
264
|
export const gossipTopicIgnoreDuplicatePublishError = {
|
|
247
265
|
[GossipType.beacon_block]: true,
|
|
248
266
|
[GossipType.blob_sidecar]: true,
|
|
267
|
+
[GossipType.data_column_sidecar]: true,
|
|
249
268
|
[GossipType.beacon_aggregate_and_proof]: true,
|
|
250
269
|
[GossipType.beacon_attestation]: true,
|
|
251
270
|
[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,
|
|
1
|
+
{"version":3,"file":"topic.js","sourceRoot":"","sources":["../../../src/network/gossip/topic.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
9
|
import { BlobSidecarsByRootRequest } 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;
|
|
@@ -33,10 +38,13 @@ export interface INetwork extends INetworkCorePublic {
|
|
|
33
38
|
sendBeaconBlocksByRoot(peerId: PeerIdStr, request: phase0.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: fulu.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":"AAEA,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAC,uBAAuB,EAAC,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAsB,GAAG,EAAC,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAS,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAC,6BAA6B,EAAC,MAAM,YAAY,CAAC;AAGzD,MAAM,CAAN,IAAY,MAOX;AAPD,WAAY,MAAM;IAChB,qBAAW,CAAA;IACX,uBAAa,CAAA;IACb,6BAAmB,CAAA;IACnB,+BAAqB,CAAA;IACrB,qBAAW,CAAA;IACX,qBAAW,CAAA;AACb,CAAC,EAPW,MAAM,KAAN,MAAM,QAOjB;AACD,MAAM,CAAN,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,iCAAmB,CAAA;IACnB,mCAAqB,CAAA;AACvB,CAAC,EAHW,UAAU,KAAV,UAAU,QAGrB;AAYD;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IAM7B,YAAY,IAAkB,EAAE,OAAwB;QACtD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,IAAI;YAChC,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;YACnC,iBAAiB,EAAE,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,uBAAuB;SAC/E,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,YAAmB;QAChC,oDAAoD;QACpD,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAEnC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAEjG,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAEzC,IAAI,MAAM,CAAC,UAAU,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC/E,yGAAyG;YACzG,kGAAkG;YAClG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrG,CAAC;QAED,sGAAsG;QACtG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;IAClC,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED,IAAI,QAAQ,CAAC,QAAkB;QAC7B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACrC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IAChC,CAAC;IAED,IAAI,OAAO,CAAC,OAAiB;QAC3B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;IACnC,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;IAC1C,CAAC;IAED,IAAI,iBAAiB,CAAC,iBAAyB;QAC7C,IAAI,iBAAiB,KAAK,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAC,iBAAiB,EAAC,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IACvD,CAAC;IAED,0FAA0F;IAC1F,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,KAAY;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACzC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,EAAC,UAAU,EAAE,eAAe,EAAE,aAAa,EAAC,GAAG,SAAS,CAAC;QAC/D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;YAC7C,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC;YAC7B,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC;YACvC,aAAa;SACd,CAAC,CAAC;QAEH,MAAM,cAAc,GAClB,aAAa,KAAK,gBAAgB;YAChC,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;YAC9E,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAC,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,EAAC,CAAC,CAAC;IACzF,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,MAAoB,EAAE,UAAiB;IAClE,MAAM,EAAC,eAAe,EAAE,YAAY,EAAC,GAAG,6BAA6B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE1F,OAAO;QACL,sBAAsB;QACtB,UAAU,EAAE,MAAM,CAAC,uBAAuB,CAAC,eAAe,CAAC;QAC3D,4BAA4B;QAC5B,eAAe,EAAE,YAAY;YAC3B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO;YACzC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO;QAC9C,kBAAkB;QAClB,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB;KACpE,CAAC;AACJ,CAAC"}
|
package/lib/network/network.d.ts
CHANGED
|
@@ -3,10 +3,11 @@ 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
12
|
import { BlobSidecarsByRootRequest } from "../util/types.js";
|
|
12
13
|
import { INetworkCore } from "./core/index.js";
|
|
@@ -15,6 +16,7 @@ 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>;
|
|
@@ -114,6 +119,8 @@ export declare class Network implements INetwork {
|
|
|
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: fulu.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,14 @@ 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(dataColumnSidecar);
|
|
291
|
+
return this.publishGossip({ type: GossipType.data_column_sidecar, boundary, subnet }, dataColumnSidecar, {
|
|
292
|
+
ignoreDuplicatePublishError: true,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
246
295
|
async publishBeaconAggregateAndProof(aggregateAndProof) {
|
|
247
296
|
const epoch = computeEpochAtSlot(aggregateAndProof.message.aggregate.data.slot);
|
|
248
297
|
const boundary = this.config.getForkBoundaryAtEpoch(epoch);
|
|
@@ -322,12 +371,12 @@ export class Network {
|
|
|
322
371
|
async sendBeaconBlocksByRange(peerId, request) {
|
|
323
372
|
return collectSequentialBlocksInRange(this.sendReqRespRequest(peerId, ReqRespMethod.BeaconBlocksByRange,
|
|
324
373
|
// Before altair, prioritize V2. After altair only request V2
|
|
325
|
-
this.config.getForkSeq(this.clock.currentSlot) >= ForkSeq.altair ? [Version.V2] : [
|
|
374
|
+
this.config.getForkSeq(this.clock.currentSlot) >= ForkSeq.altair ? [Version.V2] : [Version.V2, Version.V1], request), request);
|
|
326
375
|
}
|
|
327
376
|
async sendBeaconBlocksByRoot(peerId, request) {
|
|
328
377
|
return collectMaxResponseTypedWithBytes(this.sendReqRespRequest(peerId, ReqRespMethod.BeaconBlocksByRoot,
|
|
329
378
|
// Before altair, prioritize V2. After altair only request V2
|
|
330
|
-
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.length, responseSszTypeByMethod[ReqRespMethod.BeaconBlocksByRoot]);
|
|
331
380
|
}
|
|
332
381
|
async sendLightClientBootstrap(peerId, request) {
|
|
333
382
|
return collectExactOneTyped(this.sendReqRespRequest(peerId, ReqRespMethod.LightClientBootstrap, [Version.V1], request), responseSszTypeByMethod[ReqRespMethod.LightClientBootstrap]);
|
|
@@ -350,6 +399,14 @@ export class Network {
|
|
|
350
399
|
async sendBlobSidecarsByRoot(peerId, request) {
|
|
351
400
|
return collectMaxResponseTyped(this.sendReqRespRequest(peerId, ReqRespMethod.BlobSidecarsByRoot, [Version.V1], request), request.length, responseSszTypeByMethod[ReqRespMethod.BlobSidecarsByRoot]);
|
|
352
401
|
}
|
|
402
|
+
async sendDataColumnSidecarsByRange(peerId, request) {
|
|
403
|
+
return collectMaxResponseTyped(this.sendReqRespRequest(peerId, ReqRespMethod.DataColumnSidecarsByRange, [Version.V1], request),
|
|
404
|
+
// request's count represent the slots, so the actual max count received could be slots * blobs per slot
|
|
405
|
+
request.count * NUMBER_OF_COLUMNS, responseSszTypeByMethod[ReqRespMethod.DataColumnSidecarsByRange]);
|
|
406
|
+
}
|
|
407
|
+
async sendDataColumnSidecarsByRoot(peerId, request) {
|
|
408
|
+
return collectMaxResponseTyped(this.sendReqRespRequest(peerId, ReqRespMethod.DataColumnSidecarsByRoot, [Version.V1], request), request.reduce((total, { columns }) => total + columns.length, 0), responseSszTypeByMethod[ReqRespMethod.DataColumnSidecarsByRoot]);
|
|
409
|
+
}
|
|
353
410
|
sendReqRespRequest(peerId, method, versions, request) {
|
|
354
411
|
const fork = this.config.getForkName(this.clock.currentSlot);
|
|
355
412
|
const requestType = requestSszTypeByMethod(fork, this.config)[method];
|