@lodestar/beacon-node 1.51.0-dev.e4b4f615e6 → 1.51.0-dev.e757bec248
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.d.ts.map +1 -1
- package/lib/api/impl/beacon/blocks/index.js +17 -27
- package/lib/api/impl/beacon/blocks/index.js.map +1 -1
- package/lib/api/impl/beacon/pool/index.d.ts.map +1 -1
- package/lib/api/impl/beacon/pool/index.js +5 -2
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.d.ts.map +1 -1
- package/lib/chain/GetBlobsTracker.js +4 -2
- package/lib/chain/GetBlobsTracker.js.map +1 -1
- package/lib/chain/archiveStore/archiveStore.d.ts.map +1 -1
- package/lib/chain/archiveStore/archiveStore.js +1 -0
- package/lib/chain/archiveStore/archiveStore.js.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.d.ts +2 -10
- package/lib/chain/blocks/importExecutionPayload.d.ts.map +1 -1
- package/lib/chain/blocks/importExecutionPayload.js +7 -15
- package/lib/chain/blocks/importExecutionPayload.js.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts +10 -7
- package/lib/chain/blocks/payloadEnvelopeProcessor.d.ts.map +1 -1
- package/lib/chain/blocks/payloadEnvelopeProcessor.js +22 -17
- package/lib/chain/blocks/payloadEnvelopeProcessor.js.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.d.ts.map +1 -1
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js +1 -3
- package/lib/chain/blocks/verifyPayloadsDataAvailability.js.map +1 -1
- package/lib/chain/bls/multithread/index.js +5 -5
- package/lib/chain/bls/multithread/index.js.map +1 -1
- package/lib/chain/bls/multithread/types.d.ts +1 -1
- package/lib/chain/bls/multithread/types.d.ts.map +1 -1
- package/lib/chain/bls/multithread/worker.js +1 -1
- package/lib/chain/bls/multithread/worker.js.map +1 -1
- package/lib/chain/bls/singleThread.js +1 -1
- package/lib/chain/bls/singleThread.js.map +1 -1
- package/lib/chain/bls/utils.js +1 -1
- package/lib/chain/bls/utils.js.map +1 -1
- package/lib/chain/chain.d.ts +1 -1
- package/lib/chain/chain.d.ts.map +1 -1
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/interface.d.ts +2 -3
- package/lib/chain/interface.d.ts.map +1 -1
- package/lib/chain/interface.js.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/aggregatedAttestationPool.js +23 -10
- package/lib/chain/opPools/aggregatedAttestationPool.js.map +1 -1
- package/lib/chain/opPools/attestationPool.d.ts +1 -1
- package/lib/chain/opPools/attestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/attestationPool.js +15 -4
- package/lib/chain/opPools/attestationPool.js.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.d.ts.map +1 -1
- package/lib/chain/opPools/payloadAttestationPool.js +17 -7
- package/lib/chain/opPools/payloadAttestationPool.js.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.d.ts.map +1 -1
- package/lib/chain/opPools/syncCommitteeMessagePool.js +9 -3
- package/lib/chain/opPools/syncCommitteeMessagePool.js.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.d.ts.map +1 -1
- package/lib/chain/opPools/syncContributionAndProofPool.js +11 -3
- package/lib/chain/opPools/syncContributionAndProofPool.js.map +1 -1
- package/lib/chain/opPools/utils.d.ts +1 -1
- package/lib/chain/opPools/utils.d.ts.map +1 -1
- package/lib/chain/opPools/utils.js +1 -1
- package/lib/chain/opPools/utils.js.map +1 -1
- package/lib/chain/options.d.ts +0 -1
- package/lib/chain/options.d.ts.map +1 -1
- package/lib/chain/options.js +0 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/validation/executionPayloadBid.js +13 -13
- package/lib/chain/validation/executionPayloadBid.js.map +1 -1
- package/lib/db/flatFileStore/flatFileStore.js +5 -5
- package/lib/db/flatFileStore/flatFileStore.js.map +1 -1
- package/lib/db/flatFileStore/slotIndex.d.ts.map +1 -1
- package/lib/db/flatFileStore/slotIndex.js +2 -2
- package/lib/db/flatFileStore/slotIndex.js.map +1 -1
- package/lib/execution/engine/index.d.ts +1 -1
- package/lib/execution/engine/index.d.ts.map +1 -1
- package/lib/execution/engine/index.js +1 -1
- package/lib/execution/engine/index.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +1 -1
- package/lib/execution/engine/interface.d.ts.map +1 -1
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/types.d.ts.map +1 -1
- package/lib/execution/engine/types.js +2 -2
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +3 -0
- package/lib/metrics/metrics/lodestar.d.ts.map +1 -1
- package/lib/metrics/metrics/lodestar.js +5 -0
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/monitoring/service.js +1 -1
- package/lib/monitoring/service.js.map +1 -1
- package/lib/network/core/networkCore.d.ts +2 -0
- package/lib/network/core/networkCore.d.ts.map +1 -1
- package/lib/network/core/networkCore.js +3 -0
- package/lib/network/core/networkCore.js.map +1 -1
- package/lib/network/core/networkCoreWorker.js +1 -0
- package/lib/network/core/networkCoreWorker.js.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.d.ts +2 -0
- package/lib/network/core/networkCoreWorkerHandler.d.ts.map +1 -1
- package/lib/network/core/networkCoreWorkerHandler.js +3 -0
- package/lib/network/core/networkCoreWorkerHandler.js.map +1 -1
- package/lib/network/core/types.d.ts +2 -0
- package/lib/network/core/types.d.ts.map +1 -1
- package/lib/network/interface.d.ts +2 -0
- package/lib/network/interface.d.ts.map +1 -1
- package/lib/network/libp2p/index.d.ts.map +1 -1
- package/lib/network/libp2p/index.js +5 -1
- package/lib/network/libp2p/index.js.map +1 -1
- package/lib/network/network.d.ts +2 -0
- package/lib/network/network.d.ts.map +1 -1
- package/lib/network/network.js +6 -1
- package/lib/network/network.js.map +1 -1
- package/lib/network/options.d.ts +2 -0
- package/lib/network/options.d.ts.map +1 -1
- package/lib/network/options.js.map +1 -1
- package/lib/network/peers/peerManager.d.ts +2 -1
- package/lib/network/peers/peerManager.d.ts.map +1 -1
- package/lib/network/peers/peerManager.js.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts +9 -1
- package/lib/network/peers/utils/assertPeerRelevance.d.ts.map +1 -1
- package/lib/network/peers/utils/assertPeerRelevance.js +32 -21
- package/lib/network/peers/utils/assertPeerRelevance.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts.map +1 -1
- package/lib/network/processor/gossipHandlers.js +3 -5
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/node/nodejs.d.ts +1 -1
- package/lib/node/nodejs.d.ts.map +1 -1
- package/lib/node/nodejs.js +1 -1
- package/lib/node/nodejs.js.map +1 -1
- package/lib/node/options.d.ts +1 -1
- package/lib/node/options.d.ts.map +1 -1
- package/lib/node/options.js +1 -1
- package/lib/node/options.js.map +1 -1
- package/lib/sync/interface.d.ts.map +1 -1
- package/lib/sync/interface.js.map +1 -1
- package/lib/sync/sync.d.ts +7 -0
- package/lib/sync/sync.d.ts.map +1 -1
- package/lib/sync/sync.js +61 -3
- package/lib/sync/sync.js.map +1 -1
- package/lib/util/file.d.ts.map +1 -1
- package/lib/util/file.js +8 -9
- package/lib/util/file.js.map +1 -1
- package/lib/util/queue/itemQueue.js +1 -1
- package/lib/util/queue/itemQueue.js.map +1 -1
- package/lib/util/sszBytes.js +2 -2
- package/lib/util/sszBytes.js.map +1 -1
- package/package.json +16 -17
- package/src/api/impl/beacon/blocks/index.ts +35 -45
- package/src/api/impl/beacon/pool/index.ts +5 -1
- package/src/api/impl/beacon/state/utils.ts +1 -1
- package/src/chain/GetBlobsTracker.ts +4 -2
- package/src/chain/archiveStore/archiveStore.ts +1 -0
- package/src/chain/blocks/importExecutionPayload.ts +9 -21
- package/src/chain/blocks/payloadEnvelopeProcessor.ts +33 -22
- package/src/chain/blocks/verifyPayloadsDataAvailability.ts +1 -3
- package/src/chain/bls/multithread/index.ts +5 -5
- package/src/chain/bls/multithread/types.ts +1 -1
- package/src/chain/bls/multithread/worker.ts +1 -5
- package/src/chain/bls/singleThread.ts +1 -1
- package/src/chain/bls/utils.ts +1 -1
- package/src/chain/chain.ts +1 -1
- package/src/chain/interface.ts +2 -3
- package/src/chain/opPools/aggregatedAttestationPool.ts +25 -9
- package/src/chain/opPools/attestationPool.ts +16 -4
- package/src/chain/opPools/payloadAttestationPool.ts +18 -7
- package/src/chain/opPools/syncCommitteeMessagePool.ts +10 -3
- package/src/chain/opPools/syncContributionAndProofPool.ts +13 -3
- package/src/chain/opPools/utils.ts +1 -1
- package/src/chain/options.ts +0 -2
- package/src/chain/validation/executionPayloadBid.ts +14 -13
- package/src/db/flatFileStore/flatFileStore.ts +7 -7
- package/src/db/flatFileStore/slotIndex.ts +4 -3
- package/src/execution/engine/index.ts +1 -1
- package/src/execution/engine/interface.ts +1 -1
- package/src/execution/engine/types.ts +3 -1
- package/src/metrics/metrics/lodestar.ts +5 -0
- package/src/monitoring/service.ts +1 -1
- package/src/network/core/networkCore.ts +5 -0
- package/src/network/core/networkCoreWorker.ts +1 -0
- package/src/network/core/networkCoreWorkerHandler.ts +4 -0
- package/src/network/core/types.ts +2 -0
- package/src/network/interface.ts +2 -0
- package/src/network/libp2p/index.ts +5 -1
- package/src/network/network.ts +8 -1
- package/src/network/options.ts +2 -0
- package/src/network/peers/peerManager.ts +1 -1
- package/src/network/peers/utils/assertPeerRelevance.ts +39 -23
- package/src/network/processor/gossipHandlers.ts +3 -5
- package/src/node/nodejs.ts +6 -6
- package/src/node/options.ts +4 -5
- package/src/sync/interface.ts +1 -0
- package/src/sync/sync.ts +65 -4
- package/src/util/file.ts +8 -9
- package/src/util/queue/itemQueue.ts +1 -1
- package/src/util/sszBytes.ts +2 -2
|
@@ -342,7 +342,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
342
342
|
} else {
|
|
343
343
|
this.jobs.push(job);
|
|
344
344
|
}
|
|
345
|
-
callInNextEventLoop(this.runJob);
|
|
345
|
+
callInNextEventLoop(() => void this.runJob());
|
|
346
346
|
}
|
|
347
347
|
}
|
|
348
348
|
|
|
@@ -377,7 +377,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
377
377
|
let completedJobsCount = 0;
|
|
378
378
|
|
|
379
379
|
if (this.jobs.length > 0) {
|
|
380
|
-
callInNextEventLoop(this.runJob);
|
|
380
|
+
callInNextEventLoop(() => void this.runJob());
|
|
381
381
|
}
|
|
382
382
|
|
|
383
383
|
try {
|
|
@@ -423,7 +423,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
423
423
|
if (workReqs.length === 0) {
|
|
424
424
|
worker.status = {code: WorkerStatusCode.idle, workerApi};
|
|
425
425
|
this.workersBusy--;
|
|
426
|
-
callInNextEventLoop(this.runJob);
|
|
426
|
+
callInNextEventLoop(() => void this.runJob());
|
|
427
427
|
return;
|
|
428
428
|
}
|
|
429
429
|
|
|
@@ -499,7 +499,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
499
499
|
this.workersBusy--;
|
|
500
500
|
|
|
501
501
|
// Potentially run a new job
|
|
502
|
-
callInNextEventLoop(this.runJob);
|
|
502
|
+
callInNextEventLoop(() => void this.runJob());
|
|
503
503
|
};
|
|
504
504
|
|
|
505
505
|
/**
|
|
@@ -542,7 +542,7 @@ export class BlsMultiThreadWorkerPool implements IBlsVerifier {
|
|
|
542
542
|
this.jobs.unshift(job);
|
|
543
543
|
}
|
|
544
544
|
this.bufferedJobs = null;
|
|
545
|
-
callInNextEventLoop(this.runJob);
|
|
545
|
+
callInNextEventLoop(() => void this.runJob());
|
|
546
546
|
}
|
|
547
547
|
};
|
|
548
548
|
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import worker from "node:worker_threads";
|
|
2
|
-
import {
|
|
3
|
-
type BlsSignatureSet,
|
|
4
|
-
verifySignatureSets,
|
|
5
|
-
verifySignatureSetsSameMessage,
|
|
6
|
-
} from "@chainsafe/lodestar-z/bls-verifier";
|
|
7
2
|
import {expose} from "@chainsafe/threads/worker";
|
|
3
|
+
import {type BlsSignatureSet, verifySignatureSets, verifySignatureSetsSameMessage} from "@lodestar/native/bls-verifier";
|
|
8
4
|
import {
|
|
9
5
|
BlsWorkReq,
|
|
10
6
|
BlsWorkResult,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {verifySignatureSetsSameMessage} from "@
|
|
1
|
+
import {verifySignatureSetsSameMessage} from "@lodestar/native/bls-verifier";
|
|
2
2
|
import {ISignatureSet} from "@lodestar/state-transition";
|
|
3
3
|
import {Metrics} from "../../metrics/index.js";
|
|
4
4
|
import {IBlsVerifier, SameMessageSignatureSet} from "./interface.js";
|
package/src/chain/bls/utils.ts
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
BLS_VERIFIER_MAX_BATCH_SIZE,
|
|
3
3
|
BLS_VERIFIER_MAX_SAME_MESSAGE_BATCH_SIZE,
|
|
4
4
|
verifySignatureSets,
|
|
5
|
-
} from "@
|
|
5
|
+
} from "@lodestar/native/bls-verifier";
|
|
6
6
|
import {ISignatureSet, SignatureSetType, toBlsSignatureSet} from "@lodestar/state-transition";
|
|
7
7
|
import {SameMessageSignatureSet} from "./interface.js";
|
|
8
8
|
|
package/src/chain/chain.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import {PrivateKey} from "@libp2p/interface";
|
|
3
|
-
import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
|
|
4
3
|
import {Type} from "@chainsafe/ssz";
|
|
5
4
|
import {routes} from "@lodestar/api";
|
|
6
5
|
import {BeaconConfig} from "@lodestar/config";
|
|
@@ -14,6 +13,7 @@ import {
|
|
|
14
13
|
UpdateHeadOpt,
|
|
15
14
|
} from "@lodestar/fork-choice";
|
|
16
15
|
import {LoggerNode} from "@lodestar/logger/node";
|
|
16
|
+
import {type PubkeyCache} from "@lodestar/native/pubkeys";
|
|
17
17
|
import {
|
|
18
18
|
EFFECTIVE_BALANCE_INCREMENT,
|
|
19
19
|
type ForkPostFulu,
|
package/src/chain/interface.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {type PubkeyCache} from "@chainsafe/lodestar-z/pubkeys";
|
|
2
1
|
import {Type} from "@chainsafe/ssz";
|
|
3
2
|
import {BeaconConfig} from "@lodestar/config";
|
|
4
3
|
import {CheckpointWithHex, IForkChoice, ProtoBlock} from "@lodestar/fork-choice";
|
|
4
|
+
import {type PubkeyCache} from "@lodestar/native/pubkeys";
|
|
5
5
|
import {EpochShuffling, IBeaconStateView} from "@lodestar/state-transition";
|
|
6
6
|
import {
|
|
7
7
|
BeaconBlock,
|
|
@@ -77,8 +77,7 @@ import {PayloadEnvelopeInput, SeenPayloadEnvelopeInput} from "./seenCache/seenPa
|
|
|
77
77
|
import {ShufflingCache} from "./shufflingCache.js";
|
|
78
78
|
import {ValidatorMonitor} from "./validatorMonitor.js";
|
|
79
79
|
|
|
80
|
-
export {BlockType, type
|
|
81
|
-
export {type ProposerPreparationData};
|
|
80
|
+
export {type AssembledBlockType, BlockType, type ProposerPreparationData};
|
|
82
81
|
export type BlockHash = RootHex;
|
|
83
82
|
|
|
84
83
|
export type StateGetOpts = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {Signature, aggregateSignatures} from "@chainsafe/lodestar-z/blst";
|
|
2
1
|
import {BitArray} from "@chainsafe/ssz";
|
|
3
2
|
import {BeaconConfig} from "@lodestar/config";
|
|
4
3
|
import {IForkChoice} from "@lodestar/fork-choice";
|
|
4
|
+
import {Signature, aggregateSignatures} from "@lodestar/native/blst";
|
|
5
5
|
import {
|
|
6
6
|
ForkName,
|
|
7
7
|
ForkSeq,
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
} from "@lodestar/params";
|
|
21
21
|
import {
|
|
22
22
|
EffectiveBalanceIncrements,
|
|
23
|
+
G2_POINT_AT_INFINITY,
|
|
23
24
|
IBeaconStateView,
|
|
24
25
|
RootCache,
|
|
25
26
|
computeEpochAtSlot,
|
|
@@ -30,7 +31,7 @@ import {
|
|
|
30
31
|
isStatePostGloas,
|
|
31
32
|
} from "@lodestar/state-transition";
|
|
32
33
|
import {Attestation, Epoch, RootHex, Slot, electra, isElectraAttestation, phase0, ssz} from "@lodestar/types";
|
|
33
|
-
import {Logger, MapDef, assert, toRootHex} from "@lodestar/utils";
|
|
34
|
+
import {Logger, MapDef, assert, byteArrayEquals, toRootHex} from "@lodestar/utils";
|
|
34
35
|
import {Metrics} from "../../metrics/metrics.js";
|
|
35
36
|
import {IntersectResult, intersectUint8Arrays} from "../../util/bitArray.js";
|
|
36
37
|
import {getShufflingDependentRoot} from "../../util/dependentRoot.js";
|
|
@@ -409,20 +410,34 @@ export class AggregatedAttestationPool {
|
|
|
409
410
|
|
|
410
411
|
const sortedConsolidationsByScore = Array.from(consolidations.entries())
|
|
411
412
|
.sort((a, b) => b[1] - a[1])
|
|
412
|
-
.map(([consolidation, _]) => consolidation)
|
|
413
|
-
.slice(0, MAX_ATTESTATIONS_ELECTRA);
|
|
413
|
+
.map(([consolidation, _]) => consolidation);
|
|
414
414
|
|
|
415
415
|
// on chain aggregation is expensive, only do it after all
|
|
416
416
|
const packedAttestationsMetrics = this.metrics?.opPool.aggregatedAttestationPool.packedAttestations;
|
|
417
|
-
const packedAttestations: electra.Attestation[] =
|
|
418
|
-
for (const
|
|
419
|
-
packedAttestations
|
|
417
|
+
const packedAttestations: electra.Attestation[] = [];
|
|
418
|
+
for (const consolidation of sortedConsolidationsByScore) {
|
|
419
|
+
if (packedAttestations.length >= MAX_ATTESTATIONS_ELECTRA) {
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
const attestation = aggregateConsolidation(consolidation);
|
|
424
|
+
// The point at infinity is not a valid aggregate signature, exclude it from the block
|
|
425
|
+
if (byteArrayEquals(attestation.signature, G2_POINT_AT_INFINITY)) {
|
|
426
|
+
this.logger?.debug("Excluding aggregate with infinity signature", {
|
|
427
|
+
slot: stateSlot,
|
|
428
|
+
attestationSlot: attestation.data.slot,
|
|
429
|
+
committees: consolidation.byCommittee.size,
|
|
430
|
+
});
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
const i = packedAttestations.push(attestation) - 1;
|
|
420
435
|
|
|
421
436
|
// record metrics of packed attestations
|
|
422
437
|
packedAttestationsMetrics?.committeeCount.set({index: i}, consolidation.byCommittee.size);
|
|
423
438
|
packedAttestationsMetrics?.totalAttesters.set({index: i}, consolidation.totalAttesters);
|
|
424
439
|
packedAttestationsMetrics?.nonParticipation.set({index: i}, consolidation.notSeenAttesters);
|
|
425
|
-
packedAttestationsMetrics?.inclusionDistance.set({index: i}, stateSlot -
|
|
440
|
+
packedAttestationsMetrics?.inclusionDistance.set({index: i}, stateSlot - attestation.data.slot);
|
|
426
441
|
packedAttestationsMetrics?.newSeenAttesters.set({index: i}, consolidation.newSeenAttesters);
|
|
427
442
|
packedAttestationsMetrics?.totalEffectiveBalance.set({index: i}, consolidation.totalNewSeenEffectiveBalance);
|
|
428
443
|
}
|
|
@@ -462,7 +477,8 @@ export class AggregatedAttestationPool {
|
|
|
462
477
|
attestations.push(...attestationGroup.getAttestations());
|
|
463
478
|
}
|
|
464
479
|
}
|
|
465
|
-
|
|
480
|
+
// The point at infinity is not a valid aggregate signature, do not serve such an aggregate
|
|
481
|
+
return attestations.filter((attestation) => !byteArrayEquals(attestation.signature, G2_POINT_AT_INFINITY));
|
|
466
482
|
}
|
|
467
483
|
|
|
468
484
|
private onScrapeMetrics(metrics: Metrics): void {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {Signature, aggregateSignatures} from "@chainsafe/lodestar-z/blst";
|
|
2
1
|
import {BitArray} from "@chainsafe/ssz";
|
|
3
2
|
import {ChainForkConfig} from "@lodestar/config";
|
|
3
|
+
import {Signature, aggregateSignatures} from "@lodestar/native/blst";
|
|
4
4
|
import {MAX_COMMITTEES_PER_SLOT, isForkPostElectra} from "@lodestar/params";
|
|
5
|
+
import {G2_POINT_AT_INFINITY} from "@lodestar/state-transition";
|
|
5
6
|
import {Attestation, RootHex, SingleAttestation, Slot, isElectraSingleAttestation} from "@lodestar/types";
|
|
6
|
-
import {MapDef, assert} from "@lodestar/utils";
|
|
7
|
+
import {MapDef, assert, byteArrayEquals} from "@lodestar/utils";
|
|
7
8
|
import {Metrics} from "../../metrics/metrics.js";
|
|
8
9
|
import {IClock} from "../../util/clock.js";
|
|
9
10
|
import {InsertOutcome, OpPoolError, OpPoolErrorCode} from "./types.js";
|
|
@@ -180,7 +181,13 @@ export class AttestationPool {
|
|
|
180
181
|
assert.true(!isElectraAggregate(aggregate), "Aggregate should be type AggregateFastPhase0");
|
|
181
182
|
}
|
|
182
183
|
|
|
183
|
-
|
|
184
|
+
const attestation = fastToAttestation(aggregate);
|
|
185
|
+
// The point at infinity is not a valid aggregate signature, do not serve such an aggregate
|
|
186
|
+
if (byteArrayEquals(attestation.signature, G2_POINT_AT_INFINITY)) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return attestation;
|
|
184
191
|
}
|
|
185
192
|
|
|
186
193
|
/**
|
|
@@ -209,7 +216,12 @@ export class AttestationPool {
|
|
|
209
216
|
if (aggregateByRoot) {
|
|
210
217
|
for (const aggFastByIndex of aggregateByRoot.values()) {
|
|
211
218
|
for (const aggFast of aggFastByIndex.values()) {
|
|
212
|
-
|
|
219
|
+
const attestation = fastToAttestation(aggFast);
|
|
220
|
+
// The point at infinity is not a valid aggregate signature, do not serve such an aggregate
|
|
221
|
+
if (byteArrayEquals(attestation.signature, G2_POINT_AT_INFINITY)) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
attestations.push(attestation);
|
|
213
225
|
}
|
|
214
226
|
}
|
|
215
227
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {Signature, aggregateSignatures} from "@chainsafe/lodestar-z/blst";
|
|
2
1
|
import {BitArray} from "@chainsafe/ssz";
|
|
3
2
|
import {ChainForkConfig} from "@lodestar/config";
|
|
3
|
+
import {Signature, aggregateSignatures} from "@lodestar/native/blst";
|
|
4
4
|
import {MAX_COMMITTEES_PER_SLOT, MAX_PAYLOAD_ATTESTATIONS, PTC_SIZE} from "@lodestar/params";
|
|
5
|
+
import {G2_POINT_AT_INFINITY} from "@lodestar/state-transition";
|
|
5
6
|
import {RootHex, Slot, gloas} from "@lodestar/types";
|
|
6
|
-
import {MapDef, toRootHex} from "@lodestar/utils";
|
|
7
|
+
import {MapDef, byteArrayEquals, toRootHex} from "@lodestar/utils";
|
|
7
8
|
import {Metrics} from "../../metrics/metrics.js";
|
|
8
9
|
import {IClock} from "../../util/clock.js";
|
|
9
10
|
import {InsertOutcome, OpPoolError, OpPoolErrorCode} from "./types.js";
|
|
@@ -112,11 +113,19 @@ export class PayloadAttestationPool {
|
|
|
112
113
|
return [];
|
|
113
114
|
}
|
|
114
115
|
|
|
115
|
-
|
|
116
|
-
|
|
116
|
+
const payloadAttestations: gloas.PayloadAttestation[] = [];
|
|
117
|
+
for (const aggregate of aggregateByDataRoot.values()) {
|
|
118
|
+
const payloadAttestation = fastToPayloadAttestation(aggregate);
|
|
119
|
+
// The point at infinity is not a valid aggregate signature, exclude it from the block
|
|
120
|
+
if (byteArrayEquals(payloadAttestation.signature, G2_POINT_AT_INFINITY)) {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
payloadAttestations.push(payloadAttestation);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return payloadAttestations
|
|
117
127
|
.sort((a, b) => b.aggregationBits.getTrueBitIndexes().length - a.aggregationBits.getTrueBitIndexes().length)
|
|
118
|
-
.slice(0, MAX_PAYLOAD_ATTESTATIONS)
|
|
119
|
-
.map(fastToPayloadAttestation);
|
|
128
|
+
.slice(0, MAX_PAYLOAD_ATTESTATIONS);
|
|
120
129
|
}
|
|
121
130
|
|
|
122
131
|
getAll(slot?: Slot): gloas.PayloadAttestation[] {
|
|
@@ -139,9 +148,11 @@ export class PayloadAttestationPool {
|
|
|
139
148
|
}
|
|
140
149
|
}
|
|
141
150
|
|
|
151
|
+
// The point at infinity is not a valid aggregate signature, do not serve such an aggregate
|
|
142
152
|
return aggregates
|
|
143
153
|
.sort((a, b) => b.aggregationBits.getTrueBitIndexes().length - a.aggregationBits.getTrueBitIndexes().length)
|
|
144
|
-
.map(fastToPayloadAttestation)
|
|
154
|
+
.map(fastToPayloadAttestation)
|
|
155
|
+
.filter((attestation) => !byteArrayEquals(attestation.signature, G2_POINT_AT_INFINITY));
|
|
145
156
|
}
|
|
146
157
|
|
|
147
158
|
prune(clockSlot: Slot): void {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {Signature, aggregateSignatures} from "@chainsafe/lodestar-z/blst";
|
|
2
1
|
import {BitArray} from "@chainsafe/ssz";
|
|
3
2
|
import {ChainForkConfig} from "@lodestar/config";
|
|
3
|
+
import {Signature, aggregateSignatures} from "@lodestar/native/blst";
|
|
4
4
|
import {SYNC_COMMITTEE_SIZE, SYNC_COMMITTEE_SUBNET_COUNT} from "@lodestar/params";
|
|
5
|
+
import {G2_POINT_AT_INFINITY} from "@lodestar/state-transition";
|
|
5
6
|
import {Root, Slot, SubcommitteeIndex, SubnetID, altair} from "@lodestar/types";
|
|
6
|
-
import {MapDef, toRootHex} from "@lodestar/utils";
|
|
7
|
+
import {MapDef, byteArrayEquals, toRootHex} from "@lodestar/utils";
|
|
7
8
|
import {IClock} from "../../util/clock.js";
|
|
8
9
|
import {InsertOutcome, OpPoolError, OpPoolErrorCode} from "./types.js";
|
|
9
10
|
import {pruneBySlot, signatureFromBytesNoCheck} from "./utils.js";
|
|
@@ -110,10 +111,16 @@ export class SyncCommitteeMessagePool {
|
|
|
110
111
|
return null;
|
|
111
112
|
}
|
|
112
113
|
|
|
114
|
+
const signature = contribution.signature.toBytes();
|
|
115
|
+
// The point at infinity is not a valid contribution signature, do not serve such a contribution
|
|
116
|
+
if (byteArrayEquals(signature, G2_POINT_AT_INFINITY)) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
|
|
113
120
|
return {
|
|
114
121
|
...contribution,
|
|
115
122
|
aggregationBits: contribution.aggregationBits,
|
|
116
|
-
signature
|
|
123
|
+
signature,
|
|
117
124
|
};
|
|
118
125
|
}
|
|
119
126
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {Signature, aggregateSignatures} from "@chainsafe/lodestar-z/blst";
|
|
2
1
|
import {BitArray} from "@chainsafe/ssz";
|
|
3
2
|
import {ChainForkConfig} from "@lodestar/config";
|
|
3
|
+
import {Signature, aggregateSignatures} from "@lodestar/native/blst";
|
|
4
4
|
import {SYNC_COMMITTEE_SIZE, SYNC_COMMITTEE_SUBNET_SIZE} from "@lodestar/params";
|
|
5
5
|
import {G2_POINT_AT_INFINITY} from "@lodestar/state-transition";
|
|
6
6
|
import {Root, Slot, SubnetID, altair, ssz} from "@lodestar/types";
|
|
7
|
-
import {Logger, MapDef, toRootHex} from "@lodestar/utils";
|
|
7
|
+
import {Logger, MapDef, byteArrayEquals, toRootHex} from "@lodestar/utils";
|
|
8
8
|
import {Metrics} from "../../metrics/metrics.js";
|
|
9
9
|
import {IClock} from "../../util/clock.js";
|
|
10
10
|
import {InsertOutcome, OpPoolError, OpPoolErrorCode} from "./types.js";
|
|
@@ -234,8 +234,18 @@ export function aggregate(
|
|
|
234
234
|
}
|
|
235
235
|
|
|
236
236
|
metrics?.opPool.syncContributionAndProofPool.getAggregateParticipants.set(participationCount);
|
|
237
|
+
|
|
238
|
+
const syncCommitteeSignature = aggregateSignatures(signatures).toBytes();
|
|
239
|
+
// The point at infinity is only a valid sync aggregate signature with empty participation bits
|
|
240
|
+
if (byteArrayEquals(syncCommitteeSignature, G2_POINT_AT_INFINITY)) {
|
|
241
|
+
return {
|
|
242
|
+
syncCommitteeBits: BitArray.fromBitLen(SYNC_COMMITTEE_SIZE),
|
|
243
|
+
syncCommitteeSignature,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
|
|
237
247
|
return {
|
|
238
248
|
syncCommitteeBits,
|
|
239
|
-
syncCommitteeSignature
|
|
249
|
+
syncCommitteeSignature,
|
|
240
250
|
};
|
|
241
251
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {Signature} from "@chainsafe/lodestar-z/blst";
|
|
2
1
|
import {BeaconConfig} from "@lodestar/config";
|
|
3
2
|
import {DbBatch, Id, Repository} from "@lodestar/db";
|
|
3
|
+
import {Signature} from "@lodestar/native/blst";
|
|
4
4
|
import {BLS_WITHDRAWAL_PREFIX, DOMAIN_BEACON_ATTESTER, DOMAIN_BEACON_PROPOSER} from "@lodestar/params";
|
|
5
5
|
import {IBeaconStateView, computeStartSlotAtEpoch} from "@lodestar/state-transition";
|
|
6
6
|
import {AttesterSlashing, Domain, Slot, capella, phase0} from "@lodestar/types";
|
package/src/chain/options.ts
CHANGED
|
@@ -48,7 +48,6 @@ export type IChainOptions = BlockProcessOpts &
|
|
|
48
48
|
/** Max number of produced block roots (blinded or full) cached for broadcast validations */
|
|
49
49
|
maxCachedProducedRoots?: number;
|
|
50
50
|
initialCustodyGroupCount?: number;
|
|
51
|
-
broadcastValidationStrictness?: string;
|
|
52
51
|
minSameMessageSignatureSetsToBatch: number;
|
|
53
52
|
archiveDateEpochs?: number;
|
|
54
53
|
nHistoricalStatesFileDataStore?: boolean;
|
|
@@ -121,7 +120,6 @@ export const defaultChainOptions: IChainOptions = {
|
|
|
121
120
|
// for attestation validation, having this value ensures we don't have to regen states most of the time
|
|
122
121
|
maxSkipSlots: 32,
|
|
123
122
|
disableProposerSlashings: false,
|
|
124
|
-
broadcastValidationStrictness: "warn",
|
|
125
123
|
// should be less than or equal to MIN_SIGNATURE_SETS_TO_BATCH_VERIFY
|
|
126
124
|
// batching too much may block the I/O thread so if useWorker=false, suggest this value to be 32
|
|
127
125
|
// since this batch attestation work is designed to work with useWorker=true, make this the lowest value
|
|
@@ -179,6 +179,20 @@ async function validateExecutionPayloadBid(
|
|
|
179
179
|
});
|
|
180
180
|
}
|
|
181
181
|
|
|
182
|
+
// [IGNORE] this bid is the highest value bid seen for the tuple
|
|
183
|
+
// `(bid.slot, bid.parent_block_hash, bid.parent_block_root)`.
|
|
184
|
+
// As a DoS prevention measure, the bid must also exceed the current highest bid by a minimum
|
|
185
|
+
// increment, see https://github.com/ethereum/consensus-specs/pull/4831. This prevents spam
|
|
186
|
+
// from builders submitting numerous bids with minimal value increments.
|
|
187
|
+
const bestBid = chain.executionPayloadBidPool.getBestBid(bid.slot, bidParentBlockHash, bidParentBlockRoot);
|
|
188
|
+
if (bestBid !== null && bid.value < getMinBidValue(bestBid.signedBid.message.value)) {
|
|
189
|
+
throw new ExecutionPayloadBidError(GossipAction.IGNORE, {
|
|
190
|
+
code: ExecutionPayloadBidErrorCode.BID_TOO_LOW,
|
|
191
|
+
bidValue: bid.value,
|
|
192
|
+
currentHighestBid: bestBid.signedBid.message.value,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
182
196
|
// [IGNORE] `bid.parent_block_root` is the hash tree root of a known beacon block in fork choice.
|
|
183
197
|
// Moved earlier than the spec ordering so we can derive the proposer dependent root for the
|
|
184
198
|
// proposer-preferences lookup below from a known fork-choice block.
|
|
@@ -352,19 +366,6 @@ async function validateExecutionPayloadBid(
|
|
|
352
366
|
});
|
|
353
367
|
}
|
|
354
368
|
|
|
355
|
-
// [IGNORE] this bid is the highest value bid seen for the tuple
|
|
356
|
-
// `(bid.slot, bid.parent_block_hash, bid.parent_block_root)`.
|
|
357
|
-
// As a DoS prevention measure, the bid must also exceed the current highest bid by a minimum
|
|
358
|
-
// increment, see https://github.com/ethereum/consensus-specs/pull/4831. This prevents spam
|
|
359
|
-
// from builders submitting numerous bids with minimal value increments.
|
|
360
|
-
const bestBid = chain.executionPayloadBidPool.getBestBid(bid.slot, bidParentBlockHash, bidParentBlockRoot);
|
|
361
|
-
if (bestBid !== null && bid.value < getMinBidValue(bestBid.signedBid.message.value)) {
|
|
362
|
-
throw new ExecutionPayloadBidError(GossipAction.IGNORE, {
|
|
363
|
-
code: ExecutionPayloadBidErrorCode.BID_TOO_LOW,
|
|
364
|
-
bidValue: bid.value,
|
|
365
|
-
currentHighestBid: bestBid.signedBid.message.value,
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
369
|
// [IGNORE] `bid.value` is less or equal than the builder's excess balance --
|
|
369
370
|
// i.e. `can_builder_cover_bid(state, builder_index, amount)` returns `True`.
|
|
370
371
|
if (!state.canBuilderCoverBid(bid.builderIndex, bid.value)) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {type FileHandle, open, readFile, rm} from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import {ChainForkConfig} from "@lodestar/config";
|
|
4
4
|
import {ForkPostFulu} from "@lodestar/params";
|
|
@@ -172,7 +172,7 @@ export class FlatFileStore implements IFlatFileStore {
|
|
|
172
172
|
for (const slot of slotsToPrune) {
|
|
173
173
|
const release = await this.acquireMutationLock(slot);
|
|
174
174
|
try {
|
|
175
|
-
await
|
|
175
|
+
await rm(path.join(this.dataColumnDir, padSlot(slot)), {recursive: true, force: true});
|
|
176
176
|
this.slotIndex.remove(slot);
|
|
177
177
|
this.metrics?.prunedDirectories.inc();
|
|
178
178
|
} finally {
|
|
@@ -212,7 +212,7 @@ export class FlatFileStore implements IFlatFileStore {
|
|
|
212
212
|
|
|
213
213
|
private async readFile(slot: Slot, rootHex: RootHex): Promise<Uint8Array | null> {
|
|
214
214
|
try {
|
|
215
|
-
return await
|
|
215
|
+
return await readFile(this.filePath(slot, rootHex));
|
|
216
216
|
} catch (e) {
|
|
217
217
|
if (!isFsNotFoundError(e)) throw e;
|
|
218
218
|
return null;
|
|
@@ -224,9 +224,9 @@ export class FlatFileStore implements IFlatFileStore {
|
|
|
224
224
|
rootHex: RootHex,
|
|
225
225
|
indices: number[]
|
|
226
226
|
): Promise<(Uint8Array | undefined)[] | null> {
|
|
227
|
-
let fd:
|
|
227
|
+
let fd: FileHandle;
|
|
228
228
|
try {
|
|
229
|
-
fd = await
|
|
229
|
+
fd = await open(this.filePath(slot, rootHex), "r");
|
|
230
230
|
} catch (e) {
|
|
231
231
|
if (!isFsNotFoundError(e)) throw e;
|
|
232
232
|
return null;
|
|
@@ -270,7 +270,7 @@ export class FlatFileStore implements IFlatFileStore {
|
|
|
270
270
|
await observeFlatFileStoreOperation(this.metrics, FlatFileStoreOperation.delete, async () => {
|
|
271
271
|
const release = await this.acquireMutationLock(slot);
|
|
272
272
|
try {
|
|
273
|
-
await
|
|
273
|
+
await rm(this.filePath(slot, rootHex), {force: true});
|
|
274
274
|
} finally {
|
|
275
275
|
release();
|
|
276
276
|
}
|
|
@@ -294,7 +294,7 @@ function validateDcolHeader(header: DcolHeader, slot: Slot, rootHex: RootHex): v
|
|
|
294
294
|
}
|
|
295
295
|
}
|
|
296
296
|
|
|
297
|
-
async function readExactly(fd:
|
|
297
|
+
async function readExactly(fd: FileHandle, buffer: Uint8Array, position: number): Promise<void> {
|
|
298
298
|
let totalRead = 0;
|
|
299
299
|
while (totalRead < buffer.length) {
|
|
300
300
|
const {bytesRead} = await fd.read(buffer, totalRead, buffer.length - totalRead, position + totalRead);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type {Dirent} from "node:fs";
|
|
2
|
+
import {readdir} from "node:fs/promises";
|
|
2
3
|
import {Slot} from "@lodestar/types";
|
|
3
4
|
import {isFsNotFoundError} from "./errors.js";
|
|
4
5
|
import {padSlot} from "./path.js";
|
|
@@ -33,9 +34,9 @@ export class SlotIndex {
|
|
|
33
34
|
|
|
34
35
|
async rebuildFromDisk(columnsDir: string): Promise<SlotIndexRebuildStats> {
|
|
35
36
|
this.slots.clear();
|
|
36
|
-
let entries:
|
|
37
|
+
let entries: Dirent[];
|
|
37
38
|
try {
|
|
38
|
-
entries = await
|
|
39
|
+
entries = await readdir(columnsDir, {withFileTypes: true});
|
|
39
40
|
} catch (e) {
|
|
40
41
|
if (!isFsNotFoundError(e)) throw e;
|
|
41
42
|
return {slots: 0, ignoredEntries: 0};
|
|
@@ -17,8 +17,8 @@ import {EngineRestHttpClient} from "./restHttpClient.js";
|
|
|
17
17
|
import {RestEngineTransport, formatClientVersionHeader} from "./restTransport.js";
|
|
18
18
|
import {ExecutionEngineMockJsonRpcClient, JsonRpcBackend} from "./utils.js";
|
|
19
19
|
|
|
20
|
-
export {ExecutionEngineHttp, ExecutionEngineDisabled, defaultExecutionEngineHttpOpts, engineApiModes};
|
|
21
20
|
export type {EngineApiMode};
|
|
21
|
+
export {ExecutionEngineDisabled, ExecutionEngineHttp, defaultExecutionEngineHttpOpts, engineApiModes};
|
|
22
22
|
|
|
23
23
|
export type ExecutionEngineOpts =
|
|
24
24
|
| ({mode?: "http"} & ExecutionEngineHttpOpts)
|
|
@@ -25,7 +25,7 @@ import {PayloadId, PayloadIdCache, WithdrawalV1} from "./payloadIdCache.js";
|
|
|
25
25
|
import {ExecutionPayloadBodyV2} from "./types.js";
|
|
26
26
|
import {DATA} from "./utils.js";
|
|
27
27
|
|
|
28
|
-
export {
|
|
28
|
+
export {type PayloadId, PayloadIdCache, type WithdrawalV1};
|
|
29
29
|
export type ClientVersion = routes.node.ClientVersion;
|
|
30
30
|
export const ClientCode = routes.node.ClientCode;
|
|
31
31
|
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
DEPOSIT_REQUEST_TYPE,
|
|
10
10
|
FIELD_ELEMENTS_PER_BLOB,
|
|
11
11
|
ForkName,
|
|
12
|
+
ForkPostElectra,
|
|
12
13
|
ForkSeq,
|
|
13
14
|
WITHDRAWAL_REQUEST_TYPE,
|
|
14
15
|
} from "@lodestar/params";
|
|
@@ -23,6 +24,7 @@ import {
|
|
|
23
24
|
deneb,
|
|
24
25
|
gloas,
|
|
25
26
|
ssz,
|
|
27
|
+
sszTypesFor,
|
|
26
28
|
} from "@lodestar/types";
|
|
27
29
|
import {BlobAndProof} from "@lodestar/types/deneb";
|
|
28
30
|
import {BlobAndProofV2} from "@lodestar/types/fulu";
|
|
@@ -628,7 +630,7 @@ export function deserializeExecutionRequestsFromBytes(fork: ForkName, serialized
|
|
|
628
630
|
|
|
629
631
|
switch (currentRequestType) {
|
|
630
632
|
case DEPOSIT_REQUEST_TYPE: {
|
|
631
|
-
result.deposits =
|
|
633
|
+
result.deposits = sszTypesFor(fork as ForkPostElectra).DepositRequests.deserialize(requests);
|
|
632
634
|
break;
|
|
633
635
|
}
|
|
634
636
|
case WITHDRAWAL_REQUEST_TYPE: {
|
|
@@ -645,6 +645,11 @@ export function createLodestarMetrics(
|
|
|
645
645
|
help: "Count of peers by sync type [FullySynced, Advanced, Behind]",
|
|
646
646
|
labelNames: ["syncType"],
|
|
647
647
|
}),
|
|
648
|
+
syncPeerFinalizedCheckpointMismatch: register.counter<{reason: string}>({
|
|
649
|
+
name: "lodestar_sync_peer_finalized_checkpoint_mismatch_total",
|
|
650
|
+
help: "Total behind peers whose Status finalized checkpoint is not in our chain, by reason",
|
|
651
|
+
labelNames: ["reason"],
|
|
652
|
+
}),
|
|
648
653
|
syncSwitchGossipSubscriptions: register.gauge<{action: string}>({
|
|
649
654
|
name: "lodestar_sync_switch_gossip_subscriptions",
|
|
650
655
|
help: "Sync switched gossip subscriptions on/off",
|
|
@@ -101,7 +101,7 @@ export class MonitoringService {
|
|
|
101
101
|
if (this.monitoringInterval) {
|
|
102
102
|
clearTimeout(this.monitoringInterval);
|
|
103
103
|
}
|
|
104
|
-
if (this.pendingRequest) {
|
|
104
|
+
if (this.pendingRequest !== undefined) {
|
|
105
105
|
this.fetchAbortController?.abort(FetchAbortReason.Close);
|
|
106
106
|
await this.pendingRequest;
|
|
107
107
|
}
|
|
@@ -10,6 +10,7 @@ import {isForkPostFulu} from "@lodestar/params";
|
|
|
10
10
|
import {ResponseIncoming} from "@lodestar/reqresp";
|
|
11
11
|
import {Epoch, Status, fulu, sszTypesFor} from "@lodestar/types";
|
|
12
12
|
import {formatNodePeer} from "../../api/impl/node/utils.js";
|
|
13
|
+
import {GoodByeReasonCode} from "../../constants/index.js";
|
|
13
14
|
import {RegistryMetricCreator} from "../../metrics/index.js";
|
|
14
15
|
import {ClockEvent, IClock} from "../../util/clock.js";
|
|
15
16
|
import {CustodyConfig} from "../../util/dataColumns.js";
|
|
@@ -332,6 +333,10 @@ export class NetworkCore implements INetworkCore {
|
|
|
332
333
|
this.peerManager.reStatusPeers(peers);
|
|
333
334
|
}
|
|
334
335
|
|
|
336
|
+
async goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void> {
|
|
337
|
+
await this.peerManager.goodbyeAndDisconnect(peerIdFromString(peer), reason);
|
|
338
|
+
}
|
|
339
|
+
|
|
335
340
|
/**
|
|
336
341
|
* Request att subnets up `toSlot`. Network will ensure to mantain some peers for each
|
|
337
342
|
*/
|
|
@@ -138,6 +138,7 @@ const libp2pWorkerApi: NetworkWorkerApi = {
|
|
|
138
138
|
prepareSyncCommitteeSubnets: (subscriptions) => core.prepareSyncCommitteeSubnets(subscriptions),
|
|
139
139
|
reportPeer: (peer, action, actionName) => core.reportPeer(peer, action, actionName),
|
|
140
140
|
reStatusPeers: (peers) => core.reStatusPeers(peers),
|
|
141
|
+
goodbyeAndDisconnect: (peer, reason) => core.goodbyeAndDisconnect(peer, reason),
|
|
141
142
|
subscribeGossipCoreTopics: () => core.subscribeGossipCoreTopics(),
|
|
142
143
|
unsubscribeGossipCoreTopics: () => core.unsubscribeGossipCoreTopics(),
|
|
143
144
|
|
|
@@ -11,6 +11,7 @@ import type {LoggerNode} from "@lodestar/logger/node";
|
|
|
11
11
|
import {ResponseIncoming, ResponseOutgoing} from "@lodestar/reqresp";
|
|
12
12
|
import {Status} from "@lodestar/types";
|
|
13
13
|
import {withTimeout} from "@lodestar/utils";
|
|
14
|
+
import {GoodByeReasonCode} from "../../constants/index.js";
|
|
14
15
|
import {Metrics} from "../../metrics/index.js";
|
|
15
16
|
import {AsyncIterableBridgeCaller, AsyncIterableBridgeHandler} from "../../util/asyncIterableToEvents.js";
|
|
16
17
|
import {PeerIdStr, peerIdFromString} from "../../util/peerId.js";
|
|
@@ -205,6 +206,9 @@ export class WorkerNetworkCore implements INetworkCore {
|
|
|
205
206
|
reStatusPeers(peers: PeerIdStr[]): Promise<void> {
|
|
206
207
|
return this.getApi().reStatusPeers(peers);
|
|
207
208
|
}
|
|
209
|
+
goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void> {
|
|
210
|
+
return this.getApi().goodbyeAndDisconnect(peer, reason);
|
|
211
|
+
}
|
|
208
212
|
reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): Promise<void> {
|
|
209
213
|
return this.getApi().reportPeer(peer, action, actionName);
|
|
210
214
|
}
|
|
@@ -5,6 +5,7 @@ import {SpecJson} from "@lodestar/config";
|
|
|
5
5
|
import {LoggerNodeOpts} from "@lodestar/logger/node";
|
|
6
6
|
import {ResponseIncoming} from "@lodestar/reqresp";
|
|
7
7
|
import {Status} from "@lodestar/types";
|
|
8
|
+
import {GoodByeReasonCode} from "../../constants/index.js";
|
|
8
9
|
import {PeerIdStr} from "../../util/peerId.js";
|
|
9
10
|
import {NetworkOptions} from "../options.js";
|
|
10
11
|
import {PeerAction, PeerScoreStats} from "../peers/index.js";
|
|
@@ -53,6 +54,7 @@ export interface INetworkCore extends INetworkCorePublic {
|
|
|
53
54
|
// Sync method
|
|
54
55
|
reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
|
|
55
56
|
reStatusPeers(peers: PeerIdStr[]): Promise<void>;
|
|
57
|
+
goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void>;
|
|
56
58
|
|
|
57
59
|
// TODO: Duplicated methods with INetwork interface
|
|
58
60
|
getConnectedPeers(): Promise<PeerIdStr[]>;
|
package/src/network/interface.ts
CHANGED
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
phase0,
|
|
38
38
|
} from "@lodestar/types";
|
|
39
39
|
import {BlockInputSource} from "../chain/blocks/blockInput/types.js";
|
|
40
|
+
import {GoodByeReasonCode} from "../constants/index.js";
|
|
40
41
|
import {CustodyConfig} from "../util/dataColumns.js";
|
|
41
42
|
import {PeerIdStr} from "../util/peerId.js";
|
|
42
43
|
import {
|
|
@@ -74,6 +75,7 @@ export interface INetwork extends INetworkCorePublic {
|
|
|
74
75
|
reportPeer(peer: PeerIdStr, action: PeerAction, actionName: string): void;
|
|
75
76
|
shouldAggregate(subnet: SubnetID, slot: Slot): boolean;
|
|
76
77
|
reStatusPeers(peers: PeerIdStr[]): Promise<void>;
|
|
78
|
+
goodbyeAndDisconnect(peer: PeerIdStr, reason: GoodByeReasonCode): Promise<void>;
|
|
77
79
|
searchUnknownBlock(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
|
|
78
80
|
searchUnknownEnvelope(slotRoot: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
|
|
79
81
|
// ReqResp
|