@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
|
@@ -370,7 +370,7 @@ function applyDecs2203RFactory() {
|
|
|
370
370
|
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
371
371
|
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
372
|
}
|
|
373
|
-
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _initProto;
|
|
373
|
+
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _initProto;
|
|
374
374
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
375
375
|
import { maxBy } from '@aztec/foundation/collection';
|
|
376
376
|
import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
@@ -393,7 +393,6 @@ import { identify } from '@libp2p/identify';
|
|
|
393
393
|
import { TopicValidatorResult } from '@libp2p/interface';
|
|
394
394
|
import { mplex } from '@libp2p/mplex';
|
|
395
395
|
import { tcp } from '@libp2p/tcp';
|
|
396
|
-
import { multiaddr } from '@multiformats/multiaddr';
|
|
397
396
|
import { ENR } from '@nethermindeth/enr';
|
|
398
397
|
import { createLibp2p } from 'libp2p';
|
|
399
398
|
import { BlockProposalValidator, CheckpointAttestationValidator, CheckpointProposalValidator, DoubleSpendTxValidator, FishermanAttestationValidator, getDefaultAllowedSetupFunctions } from '../../msg_validators/index.js';
|
|
@@ -433,6 +432,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
433
432
|
[Attributes.TX_HASH]: requestedTxHash.toString()
|
|
434
433
|
})), _dec7 = trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock)=>({
|
|
435
434
|
[Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString()
|
|
435
|
+
})), _dec8 = trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation)=>({
|
|
436
|
+
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
437
|
+
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
438
|
+
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then((i)=>i.toString())
|
|
436
439
|
}));
|
|
437
440
|
/**
|
|
438
441
|
* Lib P2P implementation of the P2PService interface.
|
|
@@ -488,6 +491,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
488
491
|
_dec7,
|
|
489
492
|
2,
|
|
490
493
|
"validateRequestedBlock"
|
|
494
|
+
],
|
|
495
|
+
[
|
|
496
|
+
_dec8,
|
|
497
|
+
2,
|
|
498
|
+
"validateCheckpointAttestation"
|
|
491
499
|
]
|
|
492
500
|
], []));
|
|
493
501
|
}
|
|
@@ -513,8 +521,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
513
521
|
* @returns The attestations for the checkpoint, if any.
|
|
514
522
|
*/ checkpointReceivedCallback;
|
|
515
523
|
gossipSubEventHandler;
|
|
516
|
-
ipChangedHandler;
|
|
517
|
-
/** Discovered public IP address (set when queryForIp is enabled and no static IP was configured). */ discoveredP2pIp;
|
|
518
524
|
instrumentation;
|
|
519
525
|
telemetry;
|
|
520
526
|
logger;
|
|
@@ -712,8 +718,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
712
718
|
})
|
|
713
719
|
}),
|
|
714
720
|
components: (components)=>({
|
|
715
|
-
connectionManager: components.connectionManager
|
|
716
|
-
addressManager: components.addressManager
|
|
721
|
+
connectionManager: components.connectionManager
|
|
717
722
|
})
|
|
718
723
|
},
|
|
719
724
|
logger: createLibp2pComponentLogger(logger.module, logger.getBindings())
|
|
@@ -740,10 +745,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
740
745
|
}
|
|
741
746
|
// Get listen & announce addresses for logging
|
|
742
747
|
const { p2pIp, p2pPort } = this.config;
|
|
743
|
-
if (!p2pIp
|
|
748
|
+
if (!p2pIp) {
|
|
744
749
|
throw new Error('Announce address not provided.');
|
|
745
750
|
}
|
|
746
|
-
const announceTcpMultiaddr =
|
|
751
|
+
const announceTcpMultiaddr = convertToMultiaddr(p2pIp, p2pPort, 'tcp');
|
|
747
752
|
// Create request response protocol handlers
|
|
748
753
|
const txHandler = reqRespTxHandler(this.mempools);
|
|
749
754
|
const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
|
|
@@ -782,29 +787,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
782
787
|
if (!this.config.p2pDiscoveryDisabled) {
|
|
783
788
|
await this.peerDiscoveryService.start();
|
|
784
789
|
}
|
|
785
|
-
// When queryForIp is enabled and no static IP was configured, bridge discv5 IP discovery to libp2p.
|
|
786
|
-
// Discv5 discovers our public IP via peer WHOAREYOU exchanges (enrUpdate=true) and emits 'ip:changed'.
|
|
787
|
-
// We confirm the discovered address in the libp2p AddressManager so it appears in getMultiaddrs()
|
|
788
|
-
// and is pushed to all connected peers via the identify protocol.
|
|
789
|
-
if (this.config.queryForIp && !p2pIp) {
|
|
790
|
-
this.ipChangedHandler = (ip)=>{
|
|
791
|
-
const addressManager = this.node.services.components.addressManager;
|
|
792
|
-
const newAddr = multiaddr(convertToMultiaddr(ip, this.config.p2pPort, 'tcp'));
|
|
793
|
-
// Remove old discovered IP if one exists
|
|
794
|
-
if (this.discoveredP2pIp) {
|
|
795
|
-
const oldAddr = multiaddr(convertToMultiaddr(this.discoveredP2pIp, this.config.p2pPort, 'tcp'));
|
|
796
|
-
addressManager.removeObservedAddr(oldAddr);
|
|
797
|
-
}
|
|
798
|
-
addressManager.addObservedAddr(newAddr);
|
|
799
|
-
addressManager.confirmObservedAddr(newAddr);
|
|
800
|
-
// Store discovered IP
|
|
801
|
-
this.discoveredP2pIp = ip;
|
|
802
|
-
this.logger.info('Public IP discovered via discv5', {
|
|
803
|
-
ip
|
|
804
|
-
});
|
|
805
|
-
};
|
|
806
|
-
this.peerDiscoveryService.on('ip:changed', this.ipChangedHandler);
|
|
807
|
-
}
|
|
808
790
|
this.discoveryRunningPromise = new RunningPromise(async ()=>{
|
|
809
791
|
await this.peerManager.heartbeat();
|
|
810
792
|
}, this.logger, this.config.peerCheckIntervalMS);
|
|
@@ -812,7 +794,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
812
794
|
this.logger.info(`Started P2P service`, {
|
|
813
795
|
listen: this.config.listenAddress,
|
|
814
796
|
port: this.config.p2pPort,
|
|
815
|
-
announce: announceTcpMultiaddr
|
|
797
|
+
announce: announceTcpMultiaddr,
|
|
816
798
|
peerId: this.node.peerId.toString()
|
|
817
799
|
});
|
|
818
800
|
}
|
|
@@ -822,11 +804,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
822
804
|
*/ async stop() {
|
|
823
805
|
// Remove gossip sub listener
|
|
824
806
|
this.node.services.pubsub.removeEventListener(GossipSubEvent.MESSAGE, this.gossipSubEventHandler);
|
|
825
|
-
// Remove ip:changed listener if registered
|
|
826
|
-
if (this.ipChangedHandler) {
|
|
827
|
-
this.peerDiscoveryService.off('ip:changed', this.ipChangedHandler);
|
|
828
|
-
this.ipChangedHandler = undefined;
|
|
829
|
-
}
|
|
830
807
|
// Stop peer manager
|
|
831
808
|
this.logger.debug('Stopping peer manager...');
|
|
832
809
|
await this.peerManager.stop();
|
|
@@ -950,12 +927,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
950
927
|
if (!validator || !validator.addMessage(msgId)) {
|
|
951
928
|
this.instrumentation.incMessagePrevalidationStatus(false, topicType);
|
|
952
929
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
|
|
953
|
-
if (topicType === TopicType.tx) {
|
|
954
|
-
this.logger.verbose(`Ignoring already-seen tx gossip message`, {
|
|
955
|
-
msgId,
|
|
956
|
-
source: source.toString()
|
|
957
|
-
});
|
|
958
|
-
}
|
|
959
930
|
return {
|
|
960
931
|
result: false,
|
|
961
932
|
topicType
|
|
@@ -1061,67 +1032,29 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1061
1032
|
return;
|
|
1062
1033
|
}
|
|
1063
1034
|
async validateReceivedMessage(validationFunc, msgId, source, topicType) {
|
|
1064
|
-
// Default to reject result with a penalty if validation function throws an error
|
|
1065
1035
|
let resultAndObj = {
|
|
1066
|
-
result: TopicValidatorResult.Reject
|
|
1067
|
-
severity: PeerErrorSeverity.MidToleranceError
|
|
1036
|
+
result: TopicValidatorResult.Reject
|
|
1068
1037
|
};
|
|
1069
1038
|
const timer = new Timer();
|
|
1070
1039
|
try {
|
|
1071
1040
|
resultAndObj = await validationFunc();
|
|
1072
1041
|
} catch (err) {
|
|
1073
|
-
this.
|
|
1042
|
+
this.peerManager.penalizePeer(source, PeerErrorSeverity.LowToleranceError);
|
|
1043
|
+
this.logger.error(`Error deserializing and validating gossipsub message`, err, {
|
|
1074
1044
|
msgId,
|
|
1075
1045
|
source: source.toString(),
|
|
1076
1046
|
topicType
|
|
1077
1047
|
});
|
|
1078
1048
|
}
|
|
1079
1049
|
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
1080
|
-
this.logger.debug(`Message ${topicType} accepted by validator`, {
|
|
1081
|
-
msgId,
|
|
1082
|
-
source: source.toString(),
|
|
1083
|
-
topicType
|
|
1084
|
-
});
|
|
1085
1050
|
this.instrumentation.recordMessageValidation(topicType, timer);
|
|
1086
|
-
} else if (resultAndObj.result === TopicValidatorResult.Reject) {
|
|
1087
|
-
this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
|
|
1088
|
-
msgId,
|
|
1089
|
-
source: source.toString(),
|
|
1090
|
-
topicType,
|
|
1091
|
-
severity: resultAndObj.severity
|
|
1092
|
-
});
|
|
1093
|
-
this.peerManager.penalizePeer(source, resultAndObj.severity);
|
|
1094
|
-
} else {
|
|
1095
|
-
this.logger.trace(`Message ${topicType} ignored by validator`, {
|
|
1096
|
-
msgId,
|
|
1097
|
-
source: source.toString(),
|
|
1098
|
-
topicType
|
|
1099
|
-
});
|
|
1100
1051
|
}
|
|
1101
1052
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
|
|
1102
1053
|
return resultAndObj;
|
|
1103
1054
|
}
|
|
1104
|
-
tryDeserialize(deserializeFunc, msgId, source) {
|
|
1105
|
-
try {
|
|
1106
|
-
return deserializeFunc();
|
|
1107
|
-
} catch (err) {
|
|
1108
|
-
this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
|
|
1109
|
-
err,
|
|
1110
|
-
msgId,
|
|
1111
|
-
source: source.toString()
|
|
1112
|
-
});
|
|
1113
|
-
return undefined;
|
|
1114
|
-
}
|
|
1115
|
-
}
|
|
1116
1055
|
async handleGossipedTx(payloadData, msgId, source) {
|
|
1117
1056
|
const validationFunc = async ()=>{
|
|
1118
|
-
const tx =
|
|
1119
|
-
if (!tx) {
|
|
1120
|
-
return {
|
|
1121
|
-
result: TopicValidatorResult.Reject,
|
|
1122
|
-
severity: PeerErrorSeverity.LowToleranceError
|
|
1123
|
-
};
|
|
1124
|
-
}
|
|
1057
|
+
const tx = Tx.fromBuffer(payloadData);
|
|
1125
1058
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1126
1059
|
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1127
1060
|
// Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
|
|
@@ -1137,22 +1070,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1137
1070
|
const txBlockNumber = BlockNumber(currentBlockNumber + 1);
|
|
1138
1071
|
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
1139
1072
|
}
|
|
1140
|
-
this.
|
|
1141
|
-
validator: name,
|
|
1142
|
-
severity,
|
|
1143
|
-
source: source.toString()
|
|
1144
|
-
});
|
|
1073
|
+
this.peerManager.penalizePeer(source, severity);
|
|
1145
1074
|
return {
|
|
1146
|
-
result: TopicValidatorResult.Reject
|
|
1147
|
-
severity
|
|
1075
|
+
result: TopicValidatorResult.Reject
|
|
1148
1076
|
};
|
|
1149
1077
|
}
|
|
1150
1078
|
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
1151
1079
|
const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
|
|
1152
1080
|
if (canAdd === 'ignored') {
|
|
1153
|
-
this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
|
|
1154
|
-
source: source.toString()
|
|
1155
|
-
});
|
|
1156
1081
|
return {
|
|
1157
1082
|
result: TopicValidatorResult.Ignore,
|
|
1158
1083
|
obj: tx
|
|
@@ -1162,15 +1087,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1162
1087
|
const secondStageValidators = this.createSecondStageMessageValidators();
|
|
1163
1088
|
const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
|
|
1164
1089
|
if (!secondStageOutcome.allPassed) {
|
|
1165
|
-
const { severity
|
|
1166
|
-
this.
|
|
1167
|
-
validator: name,
|
|
1168
|
-
severity,
|
|
1169
|
-
source: source.toString()
|
|
1170
|
-
});
|
|
1090
|
+
const { severity } = secondStageOutcome.failure;
|
|
1091
|
+
this.peerManager.penalizePeer(source, severity);
|
|
1171
1092
|
return {
|
|
1172
|
-
result: TopicValidatorResult.Reject
|
|
1173
|
-
severity
|
|
1093
|
+
result: TopicValidatorResult.Reject
|
|
1174
1094
|
};
|
|
1175
1095
|
}
|
|
1176
1096
|
// Pool add: persist the tx
|
|
@@ -1182,7 +1102,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1182
1102
|
});
|
|
1183
1103
|
const wasAccepted = addResult.accepted.some((h)=>h.equals(txHash));
|
|
1184
1104
|
const wasIgnored = addResult.ignored.some((h)=>h.equals(txHash));
|
|
1185
|
-
this.logger.
|
|
1105
|
+
this.logger.trace(`Validate propagated tx`, {
|
|
1186
1106
|
wasAccepted,
|
|
1187
1107
|
wasIgnored,
|
|
1188
1108
|
[Attributes.P2P_ID]: source.toString()
|
|
@@ -1202,9 +1122,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1202
1122
|
source: source.toString(),
|
|
1203
1123
|
txHash: txHash.toString()
|
|
1204
1124
|
});
|
|
1125
|
+
this.peerManager.penalizePeer(source, PeerErrorSeverity.HighToleranceError);
|
|
1205
1126
|
return {
|
|
1206
|
-
result: TopicValidatorResult.Reject
|
|
1207
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
1127
|
+
result: TopicValidatorResult.Reject
|
|
1208
1128
|
};
|
|
1209
1129
|
}
|
|
1210
1130
|
};
|
|
@@ -1225,16 +1145,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1225
1145
|
* Process a checkpoint attestation from a peer.
|
|
1226
1146
|
* Validates the attestation and adds it to the pool.
|
|
1227
1147
|
*/ async processCheckpointAttestationFromPeer(payloadData, msgId, source) {
|
|
1228
|
-
const { result, obj: attestation } = await this.validateReceivedMessage(()=>
|
|
1229
|
-
const attestation = this.tryDeserialize(()=>CheckpointAttestation.fromBuffer(payloadData), msgId, source);
|
|
1230
|
-
if (!attestation) {
|
|
1231
|
-
return Promise.resolve({
|
|
1232
|
-
result: TopicValidatorResult.Reject,
|
|
1233
|
-
severity: PeerErrorSeverity.LowToleranceError
|
|
1234
|
-
});
|
|
1235
|
-
}
|
|
1236
|
-
return this.validateAndStoreCheckpointAttestation(source, attestation);
|
|
1237
|
-
}, msgId, source, TopicType.checkpoint_attestation);
|
|
1148
|
+
const { result, obj: attestation } = await this.validateReceivedMessage(()=>this.validateAndStoreCheckpointAttestation(source, CheckpointAttestation.fromBuffer(payloadData)), msgId, source, TopicType.checkpoint_attestation);
|
|
1238
1149
|
if (result !== TopicValidatorResult.Accept || !attestation) {
|
|
1239
1150
|
return;
|
|
1240
1151
|
}
|
|
@@ -1249,9 +1160,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1249
1160
|
const validationResult = await this.checkpointAttestationValidator.validate(attestation);
|
|
1250
1161
|
if (validationResult.result === 'reject') {
|
|
1251
1162
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1163
|
+
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1252
1164
|
return {
|
|
1253
|
-
result: TopicValidatorResult.Reject
|
|
1254
|
-
severity: validationResult.severity
|
|
1165
|
+
result: TopicValidatorResult.Reject
|
|
1255
1166
|
};
|
|
1256
1167
|
}
|
|
1257
1168
|
if (validationResult.result === 'ignore') {
|
|
@@ -1278,9 +1189,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1278
1189
|
obj: attestation
|
|
1279
1190
|
};
|
|
1280
1191
|
}
|
|
1281
|
-
// Could not add (cap reached for signer),
|
|
1192
|
+
// Could not add (cap reached for signer), no need to re-broadcast
|
|
1282
1193
|
if (!added) {
|
|
1283
|
-
this.logger.warn(`
|
|
1194
|
+
this.logger.warn(`Dropping checkpoint attestation due to cap`, {
|
|
1284
1195
|
slot: slot.toString(),
|
|
1285
1196
|
archive: attestation.archive.toString(),
|
|
1286
1197
|
source: peerId.toString(),
|
|
@@ -1288,8 +1199,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1288
1199
|
count
|
|
1289
1200
|
});
|
|
1290
1201
|
return {
|
|
1291
|
-
result: TopicValidatorResult.
|
|
1292
|
-
|
|
1202
|
+
result: TopicValidatorResult.Ignore,
|
|
1203
|
+
obj: attestation
|
|
1293
1204
|
};
|
|
1294
1205
|
}
|
|
1295
1206
|
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
@@ -1327,9 +1238,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1327
1238
|
const validationResult = await this.blockProposalValidator.validate(block);
|
|
1328
1239
|
if (validationResult.result === 'reject') {
|
|
1329
1240
|
this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1241
|
+
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1330
1242
|
return {
|
|
1331
|
-
result: TopicValidatorResult.Reject
|
|
1332
|
-
severity: validationResult.severity
|
|
1243
|
+
result: TopicValidatorResult.Reject
|
|
1333
1244
|
};
|
|
1334
1245
|
}
|
|
1335
1246
|
if (validationResult.result === 'ignore') {
|
|
@@ -1359,6 +1270,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1359
1270
|
}
|
|
1360
1271
|
// Too many blocks received for this slot and index, penalize peer and do not re-broadcast
|
|
1361
1272
|
if (!added) {
|
|
1273
|
+
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1362
1274
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1363
1275
|
...block.toBlockInfo(),
|
|
1364
1276
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
@@ -1370,8 +1282,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1370
1282
|
result: TopicValidatorResult.Reject,
|
|
1371
1283
|
metadata: {
|
|
1372
1284
|
isEquivocated
|
|
1373
|
-
}
|
|
1374
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
1285
|
+
}
|
|
1375
1286
|
};
|
|
1376
1287
|
}
|
|
1377
1288
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1445,9 +1356,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1445
1356
|
const validationResult = await this.checkpointProposalValidator.validate(checkpoint);
|
|
1446
1357
|
if (validationResult.result === 'reject') {
|
|
1447
1358
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1359
|
+
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1448
1360
|
return {
|
|
1449
|
-
result: TopicValidatorResult.Reject
|
|
1450
|
-
severity: validationResult.severity
|
|
1361
|
+
result: TopicValidatorResult.Reject
|
|
1451
1362
|
};
|
|
1452
1363
|
}
|
|
1453
1364
|
if (validationResult.result === 'ignore') {
|
|
@@ -1464,20 +1375,18 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1464
1375
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1465
1376
|
[Attributes.P2P_ID]: peerId.toString()
|
|
1466
1377
|
});
|
|
1467
|
-
const
|
|
1468
|
-
|
|
1469
|
-
if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1378
|
+
const { result, obj, metadata: { isEquivocated } = {} } = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1379
|
+
if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1470
1380
|
this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
|
|
1471
1381
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1472
1382
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1473
1383
|
isEquivocated,
|
|
1474
|
-
result
|
|
1384
|
+
result
|
|
1475
1385
|
});
|
|
1476
1386
|
return {
|
|
1477
|
-
result: TopicValidatorResult.Reject
|
|
1478
|
-
severity: 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError
|
|
1387
|
+
result: TopicValidatorResult.Reject
|
|
1479
1388
|
};
|
|
1480
|
-
} else if (
|
|
1389
|
+
} else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1481
1390
|
processBlock = true;
|
|
1482
1391
|
}
|
|
1483
1392
|
}
|
|
@@ -1504,6 +1413,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1504
1413
|
// Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
|
|
1505
1414
|
// Note: We still return the checkpoint obj so the lastBlock can be processed if valid
|
|
1506
1415
|
if (!added) {
|
|
1416
|
+
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1507
1417
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1508
1418
|
...checkpoint.toCheckpointInfo(),
|
|
1509
1419
|
count,
|
|
@@ -1515,8 +1425,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1515
1425
|
metadata: {
|
|
1516
1426
|
isEquivocated,
|
|
1517
1427
|
processBlock
|
|
1518
|
-
}
|
|
1519
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
1428
|
+
}
|
|
1520
1429
|
};
|
|
1521
1430
|
}
|
|
1522
1431
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1867,6 +1776,19 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1867
1776
|
}
|
|
1868
1777
|
return PeerErrorSeverity.HighToleranceError;
|
|
1869
1778
|
}
|
|
1779
|
+
/**
|
|
1780
|
+
* Validate a checkpoint attestation.
|
|
1781
|
+
*
|
|
1782
|
+
* @param attestation - The checkpoint attestation to validate.
|
|
1783
|
+
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
1784
|
+
*/ async validateCheckpointAttestation(peerId, attestation) {
|
|
1785
|
+
const result = await this.checkpointAttestationValidator.validate(attestation);
|
|
1786
|
+
if (result.result === 'reject') {
|
|
1787
|
+
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1788
|
+
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1789
|
+
}
|
|
1790
|
+
return result;
|
|
1791
|
+
}
|
|
1870
1792
|
getPeerScore(peerId) {
|
|
1871
1793
|
return this.node.services.pubsub.score.score(peerId.toString());
|
|
1872
1794
|
}
|
|
@@ -6,7 +6,6 @@ export declare class PeerManagerMetrics {
|
|
|
6
6
|
private sentGoodbyes;
|
|
7
7
|
private receivedGoodbyes;
|
|
8
8
|
private peerCount;
|
|
9
|
-
private healthyPeerCount;
|
|
10
9
|
private lowScoreDisconnects;
|
|
11
10
|
private peerConnectionDuration;
|
|
12
11
|
private peerConnectedAt;
|
|
@@ -15,9 +14,8 @@ export declare class PeerManagerMetrics {
|
|
|
15
14
|
recordGoodbyeSent(reason: GoodByeReason): void;
|
|
16
15
|
recordGoodbyeReceived(reason: GoodByeReason): void;
|
|
17
16
|
recordPeerCount(count: number): void;
|
|
18
|
-
recordHealthyPeerCount(count: number): void;
|
|
19
17
|
recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect'): void;
|
|
20
18
|
peerConnected(id: PeerId): void;
|
|
21
19
|
peerDisconnected(id: PeerId): void;
|
|
22
20
|
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3BlZXItbWFuYWdlci9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFLTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyxNQUFNLEVBSVosTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsYUFBYSxFQUF1QixNQUFNLCtCQUErQixDQUFDO0FBRW5GLHFCQUFhLGtCQUFrQjthQVlYLGVBQWUsRUFBRSxlQUFlO0lBWGxELE9BQU8sQ0FBQyxZQUFZLENBQWdCO0lBQ3BDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBZ0I7SUFDeEMsT0FBTyxDQUFDLFNBQVMsQ0FBUTtJQUN6QixPQUFPLENBQUMsbUJBQW1CLENBQWdCO0lBQzNDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBWTtJQUUxQyxPQUFPLENBQUMsZUFBZSxDQUFrRDtJQUV6RSxTQUFnQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBRS9CLFlBQ2tCLGVBQWUsR0FBRSxlQUFzQyxFQUN2RSxJQUFJLFNBQWdCLEVBMEJyQjtJQUVNLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxhQUFhLFFBRTdDO0lBRU0scUJBQXFCLENBQUMsTUFBTSxFQUFFLGFBQWEsUUFFakQ7SUFFTSxlQUFlLENBQUMsS0FBSyxFQUFFLE1BQU0sUUFFbkM7SUFFTSx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsUUFBUSxHQUFHLFlBQVksUUFFbEU7SUFFTSxhQUFhLENBQUMsRUFBRSxFQUFFLE1BQU0sUUFFOUI7SUFFTSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxRQUtqQztDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,MAAM,EAIZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAuB,MAAM,+BAA+B,CAAC;AAEnF,qBAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,MAAM,EAIZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAuB,MAAM,+BAA+B,CAAC;AAEnF,qBAAa,kBAAkB;aAYX,eAAe,EAAE,eAAe;IAXlD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,sBAAsB,CAAY;IAE1C,OAAO,CAAC,eAAe,CAAkD;IAEzE,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,YACkB,eAAe,GAAE,eAAsC,EACvE,IAAI,SAAgB,EA0BrB;IAEM,iBAAiB,CAAC,MAAM,EAAE,aAAa,QAE7C;IAEM,qBAAqB,CAAC,MAAM,EAAE,aAAa,QAEjD;IAEM,eAAe,CAAC,KAAK,EAAE,MAAM,QAEnC;IAEM,wBAAwB,CAAC,UAAU,EAAE,QAAQ,GAAG,YAAY,QAElE;IAEM,aAAa,CAAC,EAAE,EAAE,MAAM,QAE9B;IAEM,gBAAgB,CAAC,EAAE,EAAE,MAAM,QAKjC;CACF"}
|
|
@@ -5,7 +5,6 @@ export class PeerManagerMetrics {
|
|
|
5
5
|
sentGoodbyes;
|
|
6
6
|
receivedGoodbyes;
|
|
7
7
|
peerCount;
|
|
8
|
-
healthyPeerCount;
|
|
9
8
|
lowScoreDisconnects;
|
|
10
9
|
peerConnectionDuration;
|
|
11
10
|
peerConnectedAt;
|
|
@@ -28,7 +27,6 @@ export class PeerManagerMetrics {
|
|
|
28
27
|
this.sentGoodbyes = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_GOODBYES_SENT, goodbyeReasonAttrs);
|
|
29
28
|
this.receivedGoodbyes = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_GOODBYES_RECEIVED, goodbyeReasonAttrs);
|
|
30
29
|
this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT);
|
|
31
|
-
this.healthyPeerCount = meter.createGauge(Metrics.PEER_MANAGER_HEALTHY_PEER_COUNT);
|
|
32
30
|
this.lowScoreDisconnects = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS, {
|
|
33
31
|
[Attributes.P2P_PEER_SCORE_STATE]: [
|
|
34
32
|
'Banned',
|
|
@@ -50,9 +48,6 @@ export class PeerManagerMetrics {
|
|
|
50
48
|
recordPeerCount(count) {
|
|
51
49
|
this.peerCount.record(count);
|
|
52
50
|
}
|
|
53
|
-
recordHealthyPeerCount(count) {
|
|
54
|
-
this.healthyPeerCount.record(count);
|
|
55
|
-
}
|
|
56
51
|
recordLowScoreDisconnect(scoreState) {
|
|
57
52
|
this.lowScoreDisconnects.add(1, {
|
|
58
53
|
[Attributes.P2P_PEER_SCORE_STATE]: scoreState
|
|
@@ -65,7 +60,6 @@ export class PeerManagerMetrics {
|
|
|
65
60
|
const connectedAt = this.peerConnectedAt.get(id.toString());
|
|
66
61
|
if (connectedAt) {
|
|
67
62
|
this.peerConnectionDuration.record(Date.now() - connectedAt);
|
|
68
|
-
this.peerConnectedAt.delete(id.toString());
|
|
69
63
|
}
|
|
70
64
|
}
|
|
71
65
|
}
|
|
@@ -53,15 +53,11 @@ export declare class PeerManager implements PeerManagerInterface {
|
|
|
53
53
|
heartbeat(): Promise<void>;
|
|
54
54
|
setupDirectPeersIfValidator(): Promise<void>;
|
|
55
55
|
/**
|
|
56
|
-
* Cleans up expired timeouts
|
|
56
|
+
* Cleans up expired timeouts.
|
|
57
57
|
*
|
|
58
58
|
* When peers fail to dial after a number of retries, they are temporarily timed out.
|
|
59
59
|
* This function removes any peers that have been in the timed out state for too long.
|
|
60
60
|
* To give them a chance to reconnect.
|
|
61
|
-
*
|
|
62
|
-
* Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
|
|
63
|
-
* Without this, peers that probe once and never reconnect would leave their entries in the
|
|
64
|
-
* map forever, causing an unbounded memory leak.
|
|
65
61
|
*/
|
|
66
62
|
private cleanupExpiredTimeouts;
|
|
67
63
|
private processScheduledDisconnects;
|
|
@@ -175,4 +171,4 @@ export declare class PeerManager implements PeerManagerInterface {
|
|
|
175
171
|
handleAuthRequestFromPeer(_authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
176
172
|
private updateAuthenticatedPeers;
|
|
177
173
|
}
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFjLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTTVELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQXVCLE1BQU0saUNBQWlDLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUFrQixLQUFLLFdBQVcsRUFBRSxNQUFNLG1C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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAc,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAM5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAgB,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAuB,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA2BrE,qBAAa,WAAY,YAAW,oBAAoB;IAyBpD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAlC/B,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,8BAA8B,CAAa;IACnD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,uBAAuB,CAAkB;IACjD,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,uBAAuB,CAAkB;IACjD,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,qCAAqC,CAAsC;IACnF,OAAO,CAAC,qCAAqC,CAAkC;IAC/E,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,oBAAoB,CAAoD;IAChF,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,yBAAyB,CAAkB;IAEnD,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAId;IAEF,YACU,UAAU,EAAE,UAAU,EACtB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,SAAS,EACzB,eAAe,EAAE,eAAe,EACxB,MAAM,oDAAmC,EACzC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,EACP,sBAAsB,EAAE,sBAAsB,EAC9C,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,mBAAmB,EAC/B,YAAY,GAAE,YAAiC,EAyBjE;IACD;;;;OAIG;IACG,eAAe,kBAmCpB;IAED,IAAI,MAAM,6CAET;IAEY,SAAS,kBAUrB;IAIK,2BAA2B,kBAgDhC;IAED
|
|
1
|
+
{"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ import { PeerScoreState } from './peer_scoring.js';
|
|
|
17
17
|
const MAX_DIAL_ATTEMPTS = 3;
|
|
18
18
|
const MAX_CACHED_PEERS = 100;
|
|
19
19
|
const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
20
|
-
const
|
|
20
|
+
const FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
|
|
21
21
|
const GOODBYE_DIAL_TIMEOUT_MS = 1000;
|
|
22
22
|
const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
|
|
23
23
|
export class PeerManager {
|
|
@@ -172,27 +172,19 @@ export class PeerManager {
|
|
|
172
172
|
this.initializedPreferredPeers = true;
|
|
173
173
|
}
|
|
174
174
|
/**
|
|
175
|
-
* Cleans up expired timeouts
|
|
175
|
+
* Cleans up expired timeouts.
|
|
176
176
|
*
|
|
177
177
|
* When peers fail to dial after a number of retries, they are temporarily timed out.
|
|
178
178
|
* This function removes any peers that have been in the timed out state for too long.
|
|
179
179
|
* To give them a chance to reconnect.
|
|
180
|
-
*
|
|
181
|
-
* Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
|
|
182
|
-
* Without this, peers that probe once and never reconnect would leave their entries in the
|
|
183
|
-
* map forever, causing an unbounded memory leak.
|
|
184
180
|
*/ cleanupExpiredTimeouts() {
|
|
181
|
+
// Clean up expired timeouts
|
|
185
182
|
const now = this.dateProvider.now();
|
|
186
183
|
for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()){
|
|
187
184
|
if (now >= timedOutPeer.timeoutUntilMs) {
|
|
188
185
|
this.timedOutPeers.delete(peerId);
|
|
189
186
|
}
|
|
190
187
|
}
|
|
191
|
-
for (const [id, entry] of this.failedAuthHandshakes.entries()){
|
|
192
|
-
if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
|
|
193
|
-
this.failedAuthHandshakes.delete(id);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
188
|
}
|
|
197
189
|
/**
|
|
198
190
|
* Processes scheduled disconnects during heartbeat.
|
|
@@ -246,17 +238,13 @@ export class PeerManager {
|
|
|
246
238
|
* @param e - The disconnected peer event.
|
|
247
239
|
*/ handleDisconnectedPeerEvent(e) {
|
|
248
240
|
const peerId = e.detail;
|
|
249
|
-
const peerIdStr = peerId.toString();
|
|
250
241
|
this.metrics.peerDisconnected(peerId);
|
|
251
|
-
this.logger.verbose(`Disconnected from peer ${
|
|
252
|
-
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(
|
|
242
|
+
this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
|
|
243
|
+
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
|
|
253
244
|
if (validatorAddress !== undefined) {
|
|
254
|
-
this.logger.info(`Removing authentication for validator ${validatorAddress} at peer id ${
|
|
245
|
+
this.logger.info(`Removing authentication for validator ${validatorAddress} at peer id ${peerId.toString()} due to disconnection`);
|
|
255
246
|
this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
|
|
256
|
-
this.authenticatedPeerIdToValidatorAddress.delete(
|
|
257
|
-
}
|
|
258
|
-
if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
|
|
259
|
-
this.peerScoring.removePeer(peerIdStr);
|
|
247
|
+
this.authenticatedPeerIdToValidatorAddress.delete(peerId.toString());
|
|
260
248
|
}
|
|
261
249
|
}
|
|
262
250
|
registerThisValidatorAddresses(address) {
|
|
@@ -418,8 +406,7 @@ export class PeerManager {
|
|
|
418
406
|
cachedPeers: this.cachedPeers.size,
|
|
419
407
|
...this.peerScoring.getStats()
|
|
420
408
|
});
|
|
421
|
-
this.metrics.recordPeerCount(
|
|
422
|
-
this.metrics.recordHealthyPeerCount(healthyConnections.length);
|
|
409
|
+
this.metrics.recordPeerCount(healthyConnections.length);
|
|
423
410
|
// Exit if no peers to connect
|
|
424
411
|
if (peersToConnect <= 0) {
|
|
425
412
|
return;
|
|
@@ -636,7 +623,7 @@ export class PeerManager {
|
|
|
636
623
|
// Add to timed out peers
|
|
637
624
|
this.timedOutPeers.set(id, {
|
|
638
625
|
peerId: id,
|
|
639
|
-
timeoutUntilMs: this.dateProvider.now() +
|
|
626
|
+
timeoutUntilMs: this.dateProvider.now() + FAILED_PEER_BAN_TIME_MS
|
|
640
627
|
});
|
|
641
628
|
}
|
|
642
629
|
}
|
|
@@ -786,8 +773,6 @@ export class PeerManager {
|
|
|
786
773
|
...logData,
|
|
787
774
|
address: sender.toString()
|
|
788
775
|
});
|
|
789
|
-
this.markAuthHandshakeFailed(peerId);
|
|
790
|
-
this.markPeerForDisconnect(peerId);
|
|
791
776
|
return;
|
|
792
777
|
}
|
|
793
778
|
this.markAuthHandshakeSuccess(peerId);
|