@aztec/p2p 0.0.1-commit.9ef841308 → 0.0.1-commit.a89ec08
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/dest/client/factory.d.ts +2 -2
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +1 -2
- package/dest/client/p2p_client.d.ts +1 -1
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +4 -6
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -17
- package/dest/config.d.ts +6 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +6 -6
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +4 -4
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +4 -8
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
- package/dest/mem_pools/index.d.ts +2 -1
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +2 -4
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +14 -16
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +125 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +596 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +123 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
- package/dest/mem_pools/tx_pool/index.d.ts +3 -0
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/index.js +2 -0
- package/dest/mem_pools/tx_pool/priority.d.ts +12 -0
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/priority.js +15 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +127 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool.js +3 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +7 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +402 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +5 -7
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +0 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +6 -5
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +1 -5
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +43 -26
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +0 -3
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1 -18
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +4 -5
- package/dest/msg_validators/clock_tolerance.d.ts +1 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +3 -4
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +5 -5
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/services/discv5/discV5_service.d.ts +1 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +2 -4
- package/dest/services/libp2p/libp2p_service.d.ts +9 -7
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +59 -137
- package/dest/services/peer-manager/metrics.d.ts +1 -3
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +0 -6
- package/dest/services/peer-manager/peer_manager.d.ts +2 -6
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +9 -24
- package/dest/services/peer-manager/peer_scoring.d.ts +2 -5
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +10 -28
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +8 -11
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +101 -82
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -3
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +4 -5
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +7 -13
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +11 -19
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +15 -52
- package/dest/services/reqresp/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +3 -4
- package/dest/services/service.d.ts +1 -7
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +4 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +73 -57
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -6
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
- package/dest/services/tx_collection/slow_tx_collection.js +1 -1
- package/dest/services/tx_collection/tx_collection.d.ts +6 -3
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.d.ts +1 -6
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +1 -9
- package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.d.ts +1 -1
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +2 -20
- package/dest/testbench/p2p_client_testbench_worker.js +15 -44
- package/dest/testbench/worker_client_manager.d.ts +1 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +2 -2
- package/dest/util.d.ts +4 -9
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +9 -2
- package/package.json +14 -14
- package/src/client/factory.ts +2 -3
- package/src/client/p2p_client.ts +4 -6
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +9 -19
- package/src/config.ts +10 -10
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +7 -8
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/instrumentation.ts +13 -17
- package/src/mem_pools/tx_pool/README.md +270 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +746 -0
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +163 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
- package/src/mem_pools/tx_pool/index.ts +2 -0
- package/src/mem_pools/tx_pool/priority.ts +20 -0
- package/src/mem_pools/tx_pool/tx_pool.ts +141 -0
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +321 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +4 -7
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +5 -11
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -29
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +0 -3
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1 -19
- package/src/msg_validators/attestation_validator/README.md +1 -1
- package/src/msg_validators/attestation_validator/attestation_validator.ts +4 -5
- package/src/msg_validators/clock_tolerance.ts +3 -4
- package/src/msg_validators/proposal_validator/README.md +4 -4
- package/src/msg_validators/proposal_validator/proposal_validator.ts +5 -6
- package/src/msg_validators/tx_validator/metadata_validator.ts +4 -12
- package/src/services/discv5/discV5_service.ts +2 -4
- package/src/services/libp2p/libp2p_service.ts +71 -135
- package/src/services/peer-manager/metrics.ts +0 -7
- package/src/services/peer-manager/peer_manager.ts +9 -28
- package/src/services/peer-manager/peer_scoring.ts +5 -21
- package/src/services/reqresp/batch-tx-requester/README.md +7 -46
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +111 -78
- package/src/services/reqresp/batch-tx-requester/interface.ts +1 -2
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +6 -13
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +24 -68
- package/src/services/reqresp/reqresp.ts +3 -5
- package/src/services/service.ts +0 -7
- package/src/services/tx_collection/fast_tx_collection.ts +83 -57
- package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
- package/src/services/tx_collection/proposal_tx_collector.ts +13 -8
- package/src/services/tx_collection/slow_tx_collection.ts +1 -1
- package/src/services/tx_collection/tx_collection.ts +5 -3
- package/src/test-helpers/make-test-p2p-clients.ts +1 -1
- package/src/test-helpers/mock-pubsub.ts +0 -9
- package/src/test-helpers/reqresp-nodes.ts +1 -1
- package/src/test-helpers/testbench-utils.ts +3 -28
- package/src/testbench/p2p_client_testbench_worker.ts +15 -44
- package/src/testbench/worker_client_manager.ts +2 -2
- package/src/util.ts +13 -9
- package/dest/services/tx_collection/request_tracker.d.ts +0 -53
- package/dest/services/tx_collection/request_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/request_tracker.js +0 -84
- package/src/services/tx_collection/request_tracker.ts +0 -127
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
type CheckpointProposalCore,
|
|
19
19
|
type Gossipable,
|
|
20
20
|
P2PMessage,
|
|
21
|
+
type ValidationResult as P2PValidationResult,
|
|
21
22
|
PeerErrorSeverity,
|
|
22
23
|
PeerErrorSeverityByHarshness,
|
|
23
24
|
TopicType,
|
|
@@ -51,10 +52,9 @@ import { yamux } from '@chainsafe/libp2p-yamux';
|
|
|
51
52
|
import { bootstrap } from '@libp2p/bootstrap';
|
|
52
53
|
import { identify } from '@libp2p/identify';
|
|
53
54
|
import { type Message, type MultiaddrConnection, type PeerId, TopicValidatorResult } from '@libp2p/interface';
|
|
54
|
-
import type {
|
|
55
|
+
import type { ConnectionManager } from '@libp2p/interface-internal';
|
|
55
56
|
import { mplex } from '@libp2p/mplex';
|
|
56
57
|
import { tcp } from '@libp2p/tcp';
|
|
57
|
-
import { multiaddr } from '@multiformats/multiaddr';
|
|
58
58
|
import { ENR } from '@nethermindeth/enr';
|
|
59
59
|
import { createLibp2p } from 'libp2p';
|
|
60
60
|
|
|
@@ -131,7 +131,7 @@ type ValidationOutcome = { allPassed: true } | { allPassed: false; failure: Vali
|
|
|
131
131
|
// REFACTOR: Unify with the type above
|
|
132
132
|
type ReceivedMessageValidationResult<T, M = undefined> =
|
|
133
133
|
| { obj: T; result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>; metadata?: M }
|
|
134
|
-
| { obj?: T; result: TopicValidatorResult.Reject; metadata?: M
|
|
134
|
+
| { obj?: T; result: TopicValidatorResult.Reject; metadata?: M };
|
|
135
135
|
|
|
136
136
|
/**
|
|
137
137
|
* Lib P2P implementation of the P2PService interface.
|
|
@@ -175,10 +175,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
175
175
|
private checkpointReceivedCallback: P2PCheckpointReceivedCallback;
|
|
176
176
|
|
|
177
177
|
private gossipSubEventHandler: (e: CustomEvent<GossipsubMessage>) => void;
|
|
178
|
-
private ipChangedHandler?: (ip: string) => void;
|
|
179
|
-
|
|
180
|
-
/** Discovered public IP address (set when queryForIp is enabled and no static IP was configured). */
|
|
181
|
-
private discoveredP2pIp?: string;
|
|
182
178
|
|
|
183
179
|
private instrumentation: P2PInstrumentation;
|
|
184
180
|
|
|
@@ -447,9 +443,8 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
447
443
|
topics: topicScoreParams,
|
|
448
444
|
}),
|
|
449
445
|
}) as (components: GossipSubComponents) => GossipSub,
|
|
450
|
-
components: (components: { connectionManager: ConnectionManager
|
|
446
|
+
components: (components: { connectionManager: ConnectionManager }) => ({
|
|
451
447
|
connectionManager: components.connectionManager,
|
|
452
|
-
addressManager: components.addressManager,
|
|
453
448
|
}),
|
|
454
449
|
},
|
|
455
450
|
logger: createLibp2pComponentLogger(logger.module, logger.getBindings()),
|
|
@@ -508,10 +503,10 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
508
503
|
|
|
509
504
|
// Get listen & announce addresses for logging
|
|
510
505
|
const { p2pIp, p2pPort } = this.config;
|
|
511
|
-
if (!p2pIp
|
|
506
|
+
if (!p2pIp) {
|
|
512
507
|
throw new Error('Announce address not provided.');
|
|
513
508
|
}
|
|
514
|
-
const announceTcpMultiaddr =
|
|
509
|
+
const announceTcpMultiaddr = convertToMultiaddr(p2pIp, p2pPort, 'tcp');
|
|
515
510
|
|
|
516
511
|
// Create request response protocol handlers
|
|
517
512
|
const txHandler = reqRespTxHandler(this.mempools);
|
|
@@ -565,31 +560,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
565
560
|
if (!this.config.p2pDiscoveryDisabled) {
|
|
566
561
|
await this.peerDiscoveryService.start();
|
|
567
562
|
}
|
|
568
|
-
|
|
569
|
-
// When queryForIp is enabled and no static IP was configured, bridge discv5 IP discovery to libp2p.
|
|
570
|
-
// Discv5 discovers our public IP via peer WHOAREYOU exchanges (enrUpdate=true) and emits 'ip:changed'.
|
|
571
|
-
// We confirm the discovered address in the libp2p AddressManager so it appears in getMultiaddrs()
|
|
572
|
-
// and is pushed to all connected peers via the identify protocol.
|
|
573
|
-
if (this.config.queryForIp && !p2pIp) {
|
|
574
|
-
this.ipChangedHandler = (ip: string) => {
|
|
575
|
-
const addressManager = this.node.services.components.addressManager;
|
|
576
|
-
const newAddr = multiaddr(convertToMultiaddr(ip, this.config.p2pPort, 'tcp'));
|
|
577
|
-
|
|
578
|
-
// Remove old discovered IP if one exists
|
|
579
|
-
if (this.discoveredP2pIp) {
|
|
580
|
-
const oldAddr = multiaddr(convertToMultiaddr(this.discoveredP2pIp, this.config.p2pPort, 'tcp'));
|
|
581
|
-
addressManager.removeObservedAddr(oldAddr);
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
addressManager.addObservedAddr(newAddr);
|
|
585
|
-
addressManager.confirmObservedAddr(newAddr);
|
|
586
|
-
// Store discovered IP
|
|
587
|
-
this.discoveredP2pIp = ip;
|
|
588
|
-
this.logger.info('Public IP discovered via discv5', { ip });
|
|
589
|
-
};
|
|
590
|
-
this.peerDiscoveryService.on('ip:changed', this.ipChangedHandler);
|
|
591
|
-
}
|
|
592
|
-
|
|
593
563
|
this.discoveryRunningPromise = new RunningPromise(
|
|
594
564
|
async () => {
|
|
595
565
|
await this.peerManager.heartbeat();
|
|
@@ -602,7 +572,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
602
572
|
this.logger.info(`Started P2P service`, {
|
|
603
573
|
listen: this.config.listenAddress,
|
|
604
574
|
port: this.config.p2pPort,
|
|
605
|
-
announce: announceTcpMultiaddr
|
|
575
|
+
announce: announceTcpMultiaddr,
|
|
606
576
|
peerId: this.node.peerId.toString(),
|
|
607
577
|
});
|
|
608
578
|
}
|
|
@@ -615,12 +585,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
615
585
|
// Remove gossip sub listener
|
|
616
586
|
this.node.services.pubsub.removeEventListener(GossipSubEvent.MESSAGE, this.gossipSubEventHandler);
|
|
617
587
|
|
|
618
|
-
// Remove ip:changed listener if registered
|
|
619
|
-
if (this.ipChangedHandler) {
|
|
620
|
-
this.peerDiscoveryService.off('ip:changed', this.ipChangedHandler);
|
|
621
|
-
this.ipChangedHandler = undefined;
|
|
622
|
-
}
|
|
623
|
-
|
|
624
588
|
// Stop peer manager
|
|
625
589
|
this.logger.debug('Stopping peer manager...');
|
|
626
590
|
await this.peerManager.stop();
|
|
@@ -790,9 +754,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
790
754
|
if (!validator || !validator.addMessage(msgId)) {
|
|
791
755
|
this.instrumentation.incMessagePrevalidationStatus(false, topicType);
|
|
792
756
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
|
|
793
|
-
if (topicType === TopicType.tx) {
|
|
794
|
-
this.logger.verbose(`Ignoring already-seen tx gossip message`, { msgId, source: source.toString() });
|
|
795
|
-
}
|
|
796
757
|
return { result: false, topicType };
|
|
797
758
|
}
|
|
798
759
|
|
|
@@ -919,56 +880,30 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
919
880
|
source: PeerId,
|
|
920
881
|
topicType: TopicType,
|
|
921
882
|
): Promise<ReceivedMessageValidationResult<T, M>> {
|
|
922
|
-
|
|
923
|
-
let resultAndObj: ReceivedMessageValidationResult<T, M> = {
|
|
924
|
-
result: TopicValidatorResult.Reject,
|
|
925
|
-
severity: PeerErrorSeverity.MidToleranceError,
|
|
926
|
-
};
|
|
883
|
+
let resultAndObj: ReceivedMessageValidationResult<T, M> = { result: TopicValidatorResult.Reject };
|
|
927
884
|
const timer = new Timer();
|
|
928
885
|
try {
|
|
929
886
|
resultAndObj = await validationFunc();
|
|
930
887
|
} catch (err) {
|
|
931
|
-
this.
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
935
|
-
this.logger.debug(`Message ${topicType} accepted by validator`, { msgId, source: source.toString(), topicType });
|
|
936
|
-
this.instrumentation.recordMessageValidation(topicType, timer);
|
|
937
|
-
} else if (resultAndObj.result === TopicValidatorResult.Reject) {
|
|
938
|
-
this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
|
|
888
|
+
this.peerManager.penalizePeer(source, PeerErrorSeverity.LowToleranceError);
|
|
889
|
+
this.logger.error(`Error deserializing and validating gossipsub message`, err, {
|
|
939
890
|
msgId,
|
|
940
891
|
source: source.toString(),
|
|
941
892
|
topicType,
|
|
942
|
-
severity: resultAndObj.severity,
|
|
943
893
|
});
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
897
|
+
this.instrumentation.recordMessageValidation(topicType, timer);
|
|
947
898
|
}
|
|
948
899
|
|
|
949
900
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
|
|
950
901
|
return resultAndObj;
|
|
951
902
|
}
|
|
952
903
|
|
|
953
|
-
private tryDeserialize<T>(deserializeFunc: () => T, msgId: string, source: PeerId): T | undefined {
|
|
954
|
-
try {
|
|
955
|
-
return deserializeFunc();
|
|
956
|
-
} catch (err) {
|
|
957
|
-
this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
|
|
958
|
-
err,
|
|
959
|
-
msgId,
|
|
960
|
-
source: source.toString(),
|
|
961
|
-
});
|
|
962
|
-
return undefined;
|
|
963
|
-
}
|
|
964
|
-
}
|
|
965
|
-
|
|
966
904
|
protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) {
|
|
967
905
|
const validationFunc: () => Promise<ReceivedMessageValidationResult<Tx>> = async () => {
|
|
968
|
-
const tx =
|
|
969
|
-
if (!tx) {
|
|
970
|
-
return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.LowToleranceError };
|
|
971
|
-
}
|
|
906
|
+
const tx = Tx.fromBuffer(payloadData);
|
|
972
907
|
|
|
973
908
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
974
909
|
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
@@ -988,20 +923,13 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
988
923
|
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
989
924
|
}
|
|
990
925
|
|
|
991
|
-
this.
|
|
992
|
-
|
|
993
|
-
severity,
|
|
994
|
-
source: source.toString(),
|
|
995
|
-
});
|
|
996
|
-
return { result: TopicValidatorResult.Reject, severity };
|
|
926
|
+
this.peerManager.penalizePeer(source, severity);
|
|
927
|
+
return { result: TopicValidatorResult.Reject };
|
|
997
928
|
}
|
|
998
929
|
|
|
999
930
|
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
1000
931
|
const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
|
|
1001
932
|
if (canAdd === 'ignored') {
|
|
1002
|
-
this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
|
|
1003
|
-
source: source.toString(),
|
|
1004
|
-
});
|
|
1005
933
|
return { result: TopicValidatorResult.Ignore, obj: tx };
|
|
1006
934
|
}
|
|
1007
935
|
|
|
@@ -1009,13 +937,9 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1009
937
|
const secondStageValidators = this.createSecondStageMessageValidators();
|
|
1010
938
|
const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
|
|
1011
939
|
if (!secondStageOutcome.allPassed) {
|
|
1012
|
-
const { severity
|
|
1013
|
-
this.
|
|
1014
|
-
|
|
1015
|
-
severity,
|
|
1016
|
-
source: source.toString(),
|
|
1017
|
-
});
|
|
1018
|
-
return { result: TopicValidatorResult.Reject, severity };
|
|
940
|
+
const { severity } = secondStageOutcome.failure;
|
|
941
|
+
this.peerManager.penalizePeer(source, severity);
|
|
942
|
+
return { result: TopicValidatorResult.Reject };
|
|
1019
943
|
}
|
|
1020
944
|
|
|
1021
945
|
// Pool add: persist the tx
|
|
@@ -1025,7 +949,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1025
949
|
const wasAccepted = addResult.accepted.some(h => h.equals(txHash));
|
|
1026
950
|
const wasIgnored = addResult.ignored.some(h => h.equals(txHash));
|
|
1027
951
|
|
|
1028
|
-
this.logger.
|
|
952
|
+
this.logger.trace(`Validate propagated tx`, {
|
|
1029
953
|
wasAccepted,
|
|
1030
954
|
wasIgnored,
|
|
1031
955
|
[Attributes.P2P_ID]: source.toString(),
|
|
@@ -1040,7 +964,8 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1040
964
|
source: source.toString(),
|
|
1041
965
|
txHash: txHash.toString(),
|
|
1042
966
|
});
|
|
1043
|
-
|
|
967
|
+
this.peerManager.penalizePeer(source, PeerErrorSeverity.HighToleranceError);
|
|
968
|
+
return { result: TopicValidatorResult.Reject };
|
|
1044
969
|
}
|
|
1045
970
|
};
|
|
1046
971
|
|
|
@@ -1070,16 +995,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1070
995
|
source: PeerId,
|
|
1071
996
|
): Promise<void> {
|
|
1072
997
|
const { result, obj: attestation } = await this.validateReceivedMessage<CheckpointAttestation>(
|
|
1073
|
-
() =>
|
|
1074
|
-
const attestation = this.tryDeserialize(() => CheckpointAttestation.fromBuffer(payloadData), msgId, source);
|
|
1075
|
-
if (!attestation) {
|
|
1076
|
-
return Promise.resolve({
|
|
1077
|
-
result: TopicValidatorResult.Reject,
|
|
1078
|
-
severity: PeerErrorSeverity.LowToleranceError,
|
|
1079
|
-
});
|
|
1080
|
-
}
|
|
1081
|
-
return this.validateAndStoreCheckpointAttestation(source, attestation);
|
|
1082
|
-
},
|
|
998
|
+
() => this.validateAndStoreCheckpointAttestation(source, CheckpointAttestation.fromBuffer(payloadData)),
|
|
1083
999
|
msgId,
|
|
1084
1000
|
source,
|
|
1085
1001
|
TopicType.checkpoint_attestation,
|
|
@@ -1112,7 +1028,8 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1112
1028
|
|
|
1113
1029
|
if (validationResult.result === 'reject') {
|
|
1114
1030
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1115
|
-
|
|
1031
|
+
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1032
|
+
return { result: TopicValidatorResult.Reject };
|
|
1116
1033
|
}
|
|
1117
1034
|
|
|
1118
1035
|
if (validationResult.result === 'ignore') {
|
|
@@ -1138,16 +1055,16 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1138
1055
|
return { result: TopicValidatorResult.Ignore, obj: attestation };
|
|
1139
1056
|
}
|
|
1140
1057
|
|
|
1141
|
-
// Could not add (cap reached for signer),
|
|
1058
|
+
// Could not add (cap reached for signer), no need to re-broadcast
|
|
1142
1059
|
if (!added) {
|
|
1143
|
-
this.logger.warn(`
|
|
1060
|
+
this.logger.warn(`Dropping checkpoint attestation due to cap`, {
|
|
1144
1061
|
slot: slot.toString(),
|
|
1145
1062
|
archive: attestation.archive.toString(),
|
|
1146
1063
|
source: peerId.toString(),
|
|
1147
1064
|
attester: attestation.getSender()?.toString(),
|
|
1148
1065
|
count,
|
|
1149
1066
|
});
|
|
1150
|
-
return { result: TopicValidatorResult.
|
|
1067
|
+
return { result: TopicValidatorResult.Ignore, obj: attestation };
|
|
1151
1068
|
}
|
|
1152
1069
|
|
|
1153
1070
|
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
@@ -1202,7 +1119,8 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1202
1119
|
|
|
1203
1120
|
if (validationResult.result === 'reject') {
|
|
1204
1121
|
this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1205
|
-
|
|
1122
|
+
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1123
|
+
return { result: TopicValidatorResult.Reject };
|
|
1206
1124
|
}
|
|
1207
1125
|
|
|
1208
1126
|
if (validationResult.result === 'ignore') {
|
|
@@ -1226,6 +1144,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1226
1144
|
|
|
1227
1145
|
// Too many blocks received for this slot and index, penalize peer and do not re-broadcast
|
|
1228
1146
|
if (!added) {
|
|
1147
|
+
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1229
1148
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1230
1149
|
...block.toBlockInfo(),
|
|
1231
1150
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
@@ -1233,11 +1152,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1233
1152
|
proposer: block.getSender()?.toString(),
|
|
1234
1153
|
source: peerId.toString(),
|
|
1235
1154
|
});
|
|
1236
|
-
return {
|
|
1237
|
-
result: TopicValidatorResult.Reject,
|
|
1238
|
-
metadata: { isEquivocated },
|
|
1239
|
-
severity: PeerErrorSeverity.HighToleranceError,
|
|
1240
|
-
};
|
|
1155
|
+
return { result: TopicValidatorResult.Reject, metadata: { isEquivocated } };
|
|
1241
1156
|
}
|
|
1242
1157
|
|
|
1243
1158
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1330,7 +1245,8 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1330
1245
|
|
|
1331
1246
|
if (validationResult.result === 'reject') {
|
|
1332
1247
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1333
|
-
|
|
1248
|
+
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1249
|
+
return { result: TopicValidatorResult.Reject };
|
|
1334
1250
|
}
|
|
1335
1251
|
|
|
1336
1252
|
if (validationResult.result === 'ignore') {
|
|
@@ -1345,21 +1261,20 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1345
1261
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1346
1262
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1347
1263
|
});
|
|
1348
|
-
const
|
|
1349
|
-
|
|
1350
|
-
|
|
1264
|
+
const {
|
|
1265
|
+
result,
|
|
1266
|
+
obj,
|
|
1267
|
+
metadata: { isEquivocated } = {},
|
|
1268
|
+
} = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1269
|
+
if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1351
1270
|
this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
|
|
1352
1271
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1353
1272
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1354
1273
|
isEquivocated,
|
|
1355
|
-
result
|
|
1274
|
+
result,
|
|
1356
1275
|
});
|
|
1357
|
-
return {
|
|
1358
|
-
|
|
1359
|
-
severity:
|
|
1360
|
-
'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError,
|
|
1361
|
-
};
|
|
1362
|
-
} else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1276
|
+
return { result: TopicValidatorResult.Reject };
|
|
1277
|
+
} else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1363
1278
|
processBlock = true;
|
|
1364
1279
|
}
|
|
1365
1280
|
}
|
|
@@ -1386,17 +1301,13 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1386
1301
|
// Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
|
|
1387
1302
|
// Note: We still return the checkpoint obj so the lastBlock can be processed if valid
|
|
1388
1303
|
if (!added) {
|
|
1304
|
+
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1389
1305
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1390
1306
|
...checkpoint.toCheckpointInfo(),
|
|
1391
1307
|
count,
|
|
1392
1308
|
source: peerId.toString(),
|
|
1393
1309
|
});
|
|
1394
|
-
return {
|
|
1395
|
-
result: TopicValidatorResult.Reject,
|
|
1396
|
-
obj: checkpoint,
|
|
1397
|
-
metadata: { isEquivocated, processBlock },
|
|
1398
|
-
severity: PeerErrorSeverity.HighToleranceError,
|
|
1399
|
-
};
|
|
1310
|
+
return { result: TopicValidatorResult.Reject, obj: checkpoint, metadata: { isEquivocated, processBlock } };
|
|
1400
1311
|
}
|
|
1401
1312
|
|
|
1402
1313
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1820,6 +1731,31 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1820
1731
|
return PeerErrorSeverity.HighToleranceError;
|
|
1821
1732
|
}
|
|
1822
1733
|
|
|
1734
|
+
/**
|
|
1735
|
+
* Validate a checkpoint attestation.
|
|
1736
|
+
*
|
|
1737
|
+
* @param attestation - The checkpoint attestation to validate.
|
|
1738
|
+
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
1739
|
+
*/
|
|
1740
|
+
@trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation) => ({
|
|
1741
|
+
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
1742
|
+
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
1743
|
+
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then(i => i.toString()),
|
|
1744
|
+
}))
|
|
1745
|
+
public async validateCheckpointAttestation(
|
|
1746
|
+
peerId: PeerId,
|
|
1747
|
+
attestation: CheckpointAttestation,
|
|
1748
|
+
): Promise<P2PValidationResult> {
|
|
1749
|
+
const result = await this.checkpointAttestationValidator.validate(attestation);
|
|
1750
|
+
|
|
1751
|
+
if (result.result === 'reject') {
|
|
1752
|
+
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1753
|
+
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1754
|
+
}
|
|
1755
|
+
|
|
1756
|
+
return result;
|
|
1757
|
+
}
|
|
1758
|
+
|
|
1823
1759
|
public getPeerScore(peerId: PeerId): number {
|
|
1824
1760
|
return this.node.services.pubsub.score.score(peerId.toString());
|
|
1825
1761
|
}
|
|
@@ -18,7 +18,6 @@ export class PeerManagerMetrics {
|
|
|
18
18
|
private sentGoodbyes: UpDownCounter;
|
|
19
19
|
private receivedGoodbyes: UpDownCounter;
|
|
20
20
|
private peerCount: Gauge;
|
|
21
|
-
private healthyPeerCount: Gauge;
|
|
22
21
|
private lowScoreDisconnects: UpDownCounter;
|
|
23
22
|
private peerConnectionDuration: Histogram;
|
|
24
23
|
|
|
@@ -50,7 +49,6 @@ export class PeerManagerMetrics {
|
|
|
50
49
|
goodbyeReasonAttrs,
|
|
51
50
|
);
|
|
52
51
|
this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT);
|
|
53
|
-
this.healthyPeerCount = meter.createGauge(Metrics.PEER_MANAGER_HEALTHY_PEER_COUNT);
|
|
54
52
|
this.lowScoreDisconnects = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS, {
|
|
55
53
|
[Attributes.P2P_PEER_SCORE_STATE]: ['Banned', 'Disconnect'],
|
|
56
54
|
});
|
|
@@ -69,10 +67,6 @@ export class PeerManagerMetrics {
|
|
|
69
67
|
this.peerCount.record(count);
|
|
70
68
|
}
|
|
71
69
|
|
|
72
|
-
public recordHealthyPeerCount(count: number) {
|
|
73
|
-
this.healthyPeerCount.record(count);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
70
|
public recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect') {
|
|
77
71
|
this.lowScoreDisconnects.add(1, { [Attributes.P2P_PEER_SCORE_STATE]: scoreState });
|
|
78
72
|
}
|
|
@@ -85,7 +79,6 @@ export class PeerManagerMetrics {
|
|
|
85
79
|
const connectedAt = this.peerConnectedAt.get(id.toString());
|
|
86
80
|
if (connectedAt) {
|
|
87
81
|
this.peerConnectionDuration.record(Date.now() - connectedAt);
|
|
88
|
-
this.peerConnectedAt.delete(id.toString());
|
|
89
82
|
}
|
|
90
83
|
}
|
|
91
84
|
}
|
|
@@ -32,7 +32,7 @@ import { PeerScoreState, type PeerScoring } from './peer_scoring.js';
|
|
|
32
32
|
const MAX_DIAL_ATTEMPTS = 3;
|
|
33
33
|
const MAX_CACHED_PEERS = 100;
|
|
34
34
|
const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
35
|
-
const
|
|
35
|
+
const FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
|
|
36
36
|
const GOODBYE_DIAL_TIMEOUT_MS = 1000;
|
|
37
37
|
const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
|
|
38
38
|
|
|
@@ -226,30 +226,20 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
226
226
|
}
|
|
227
227
|
|
|
228
228
|
/**
|
|
229
|
-
* Cleans up expired timeouts
|
|
229
|
+
* Cleans up expired timeouts.
|
|
230
230
|
*
|
|
231
231
|
* When peers fail to dial after a number of retries, they are temporarily timed out.
|
|
232
232
|
* This function removes any peers that have been in the timed out state for too long.
|
|
233
233
|
* To give them a chance to reconnect.
|
|
234
|
-
*
|
|
235
|
-
* Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
|
|
236
|
-
* Without this, peers that probe once and never reconnect would leave their entries in the
|
|
237
|
-
* map forever, causing an unbounded memory leak.
|
|
238
234
|
*/
|
|
239
235
|
private cleanupExpiredTimeouts() {
|
|
236
|
+
// Clean up expired timeouts
|
|
240
237
|
const now = this.dateProvider.now();
|
|
241
|
-
|
|
242
238
|
for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
|
|
243
239
|
if (now >= timedOutPeer.timeoutUntilMs) {
|
|
244
240
|
this.timedOutPeers.delete(peerId);
|
|
245
241
|
}
|
|
246
242
|
}
|
|
247
|
-
|
|
248
|
-
for (const [id, entry] of this.failedAuthHandshakes.entries()) {
|
|
249
|
-
if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
|
|
250
|
-
this.failedAuthHandshakes.delete(id);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
243
|
}
|
|
254
244
|
|
|
255
245
|
/**
|
|
@@ -313,20 +303,15 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
313
303
|
*/
|
|
314
304
|
private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
|
|
315
305
|
const peerId = e.detail;
|
|
316
|
-
const peerIdStr = peerId.toString();
|
|
317
306
|
this.metrics.peerDisconnected(peerId);
|
|
318
|
-
this.logger.verbose(`Disconnected from peer ${
|
|
319
|
-
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(
|
|
307
|
+
this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
|
|
308
|
+
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
|
|
320
309
|
if (validatorAddress !== undefined) {
|
|
321
310
|
this.logger.info(
|
|
322
|
-
`Removing authentication for validator ${validatorAddress} at peer id ${
|
|
311
|
+
`Removing authentication for validator ${validatorAddress} at peer id ${peerId.toString()} due to disconnection`,
|
|
323
312
|
);
|
|
324
313
|
this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
|
|
325
|
-
this.authenticatedPeerIdToValidatorAddress.delete(
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
|
|
329
|
-
this.peerScoring.removePeer(peerIdStr);
|
|
314
|
+
this.authenticatedPeerIdToValidatorAddress.delete(peerId.toString());
|
|
330
315
|
}
|
|
331
316
|
}
|
|
332
317
|
|
|
@@ -530,8 +515,7 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
530
515
|
...this.peerScoring.getStats(),
|
|
531
516
|
});
|
|
532
517
|
|
|
533
|
-
this.metrics.recordPeerCount(
|
|
534
|
-
this.metrics.recordHealthyPeerCount(healthyConnections.length);
|
|
518
|
+
this.metrics.recordPeerCount(healthyConnections.length);
|
|
535
519
|
|
|
536
520
|
// Exit if no peers to connect
|
|
537
521
|
if (peersToConnect <= 0) {
|
|
@@ -791,8 +775,7 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
791
775
|
// Add to timed out peers
|
|
792
776
|
this.timedOutPeers.set(id, {
|
|
793
777
|
peerId: id,
|
|
794
|
-
timeoutUntilMs:
|
|
795
|
-
this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS),
|
|
778
|
+
timeoutUntilMs: this.dateProvider.now() + FAILED_PEER_BAN_TIME_MS,
|
|
796
779
|
});
|
|
797
780
|
}
|
|
798
781
|
}
|
|
@@ -954,8 +937,6 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
954
937
|
`Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
|
|
955
938
|
{ ...logData, address: sender.toString() },
|
|
956
939
|
);
|
|
957
|
-
this.markAuthHandshakeFailed(peerId);
|
|
958
|
-
this.markPeerForDisconnect(peerId);
|
|
959
940
|
return;
|
|
960
941
|
}
|
|
961
942
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { median } from '@aztec/foundation/collection';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
-
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
3
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
5
4
|
import {
|
|
6
5
|
Attributes,
|
|
@@ -55,7 +54,6 @@ export enum PeerScoreState {
|
|
|
55
54
|
// TODO: move into config / constants
|
|
56
55
|
const MIN_SCORE_BEFORE_BAN = -100;
|
|
57
56
|
const MIN_SCORE_BEFORE_DISCONNECT = -50;
|
|
58
|
-
const SCORE_CLEANUP_THRESHOLD = 0.1;
|
|
59
57
|
|
|
60
58
|
export class PeerScoring {
|
|
61
59
|
private logger = createLogger('p2p:peer-scoring');
|
|
@@ -67,11 +65,7 @@ export class PeerScoring {
|
|
|
67
65
|
|
|
68
66
|
private peerStateCounter: UpDownCounter;
|
|
69
67
|
|
|
70
|
-
constructor(
|
|
71
|
-
config: P2PConfig,
|
|
72
|
-
telemetry: TelemetryClient = getTelemetryClient(),
|
|
73
|
-
private readonly dateProvider: DateProvider = new DateProvider(),
|
|
74
|
-
) {
|
|
68
|
+
constructor(config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient()) {
|
|
75
69
|
const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
|
|
76
70
|
this.peerPenalties = {
|
|
77
71
|
[PeerErrorSeverity.HighToleranceError]:
|
|
@@ -98,7 +92,7 @@ export class PeerScoring {
|
|
|
98
92
|
}
|
|
99
93
|
|
|
100
94
|
updateScore(peerId: string, scoreDelta: number): number {
|
|
101
|
-
const currentTime =
|
|
95
|
+
const currentTime = Date.now();
|
|
102
96
|
const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
|
|
103
97
|
const timePassed = currentTime - lastUpdate;
|
|
104
98
|
const decayPeriods = Math.floor(timePassed / this.decayInterval);
|
|
@@ -117,29 +111,19 @@ export class PeerScoring {
|
|
|
117
111
|
}
|
|
118
112
|
|
|
119
113
|
decayAllScores(): void {
|
|
120
|
-
const currentTime =
|
|
114
|
+
const currentTime = Date.now();
|
|
121
115
|
for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
|
|
122
116
|
const timePassed = currentTime - lastUpdate;
|
|
123
117
|
const decayPeriods = Math.floor(timePassed / this.decayInterval);
|
|
124
118
|
if (decayPeriods > 0) {
|
|
125
119
|
let score = this.scores.get(peerId) || 0;
|
|
126
120
|
score *= Math.pow(this.decayFactor, decayPeriods);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
this.lastUpdateTime.delete(peerId);
|
|
130
|
-
} else {
|
|
131
|
-
this.scores.set(peerId, score);
|
|
132
|
-
this.lastUpdateTime.set(peerId, currentTime);
|
|
133
|
-
}
|
|
121
|
+
this.scores.set(peerId, score);
|
|
122
|
+
this.lastUpdateTime.set(peerId, currentTime);
|
|
134
123
|
}
|
|
135
124
|
}
|
|
136
125
|
}
|
|
137
126
|
|
|
138
|
-
removePeer(peerId: string): void {
|
|
139
|
-
this.scores.delete(peerId);
|
|
140
|
-
this.lastUpdateTime.delete(peerId);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
127
|
getScore(peerId: string): number {
|
|
144
128
|
return this.scores.get(peerId) || 0;
|
|
145
129
|
}
|