@aztec/p2p 0.0.1-commit.9ee6fcc6 → 0.0.1-commit.9ef841308
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 +1 -1
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +6 -5
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +14 -3
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +5 -1
- 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 +4 -2
- package/dest/services/libp2p/libp2p_service.d.ts +7 -2
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +115 -34
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +18 -6
- package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +28 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -1
- 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 +3 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/service.d.ts +7 -1
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/test-helpers/mock-pubsub.d.ts +6 -1
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +9 -1
- package/dest/testbench/p2p_client_testbench_worker.js +41 -12
- 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 +0 -1
- package/dest/util.d.ts +8 -3
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +2 -9
- package/package.json +14 -14
- package/src/client/factory.ts +8 -3
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +15 -3
- package/src/index.ts +0 -1
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +7 -1
- package/src/msg_validators/proposal_validator/README.md +1 -1
- package/src/services/discv5/discV5_service.ts +4 -2
- package/src/services/libp2p/libp2p_service.ts +117 -43
- package/src/services/peer-manager/peer_manager.ts +21 -6
- package/src/services/peer-manager/peer_scoring.ts +21 -5
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +3 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/service.ts +7 -0
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/test-helpers/mock-pubsub.ts +9 -0
- package/src/testbench/p2p_client_testbench_worker.ts +40 -9
- package/src/testbench/worker_client_manager.ts +0 -1
- package/src/util.ts +8 -12
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
|
@@ -393,6 +393,7 @@ 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';
|
|
396
397
|
import { ENR } from '@nethermindeth/enr';
|
|
397
398
|
import { createLibp2p } from 'libp2p';
|
|
398
399
|
import { BlockProposalValidator, CheckpointAttestationValidator, CheckpointProposalValidator, DoubleSpendTxValidator, FishermanAttestationValidator, getDefaultAllowedSetupFunctions } from '../../msg_validators/index.js';
|
|
@@ -512,6 +513,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
512
513
|
* @returns The attestations for the checkpoint, if any.
|
|
513
514
|
*/ checkpointReceivedCallback;
|
|
514
515
|
gossipSubEventHandler;
|
|
516
|
+
ipChangedHandler;
|
|
517
|
+
/** Discovered public IP address (set when queryForIp is enabled and no static IP was configured). */ discoveredP2pIp;
|
|
515
518
|
instrumentation;
|
|
516
519
|
telemetry;
|
|
517
520
|
logger;
|
|
@@ -709,7 +712,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
709
712
|
})
|
|
710
713
|
}),
|
|
711
714
|
components: (components)=>({
|
|
712
|
-
connectionManager: components.connectionManager
|
|
715
|
+
connectionManager: components.connectionManager,
|
|
716
|
+
addressManager: components.addressManager
|
|
713
717
|
})
|
|
714
718
|
},
|
|
715
719
|
logger: createLibp2pComponentLogger(logger.module, logger.getBindings())
|
|
@@ -736,10 +740,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
736
740
|
}
|
|
737
741
|
// Get listen & announce addresses for logging
|
|
738
742
|
const { p2pIp, p2pPort } = this.config;
|
|
739
|
-
if (!p2pIp) {
|
|
743
|
+
if (!p2pIp && !this.config.queryForIp) {
|
|
740
744
|
throw new Error('Announce address not provided.');
|
|
741
745
|
}
|
|
742
|
-
const announceTcpMultiaddr = convertToMultiaddr(p2pIp, p2pPort, 'tcp');
|
|
746
|
+
const announceTcpMultiaddr = p2pIp ? convertToMultiaddr(p2pIp, p2pPort, 'tcp') : undefined;
|
|
743
747
|
// Create request response protocol handlers
|
|
744
748
|
const txHandler = reqRespTxHandler(this.mempools);
|
|
745
749
|
const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
|
|
@@ -778,6 +782,29 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
778
782
|
if (!this.config.p2pDiscoveryDisabled) {
|
|
779
783
|
await this.peerDiscoveryService.start();
|
|
780
784
|
}
|
|
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
|
+
}
|
|
781
808
|
this.discoveryRunningPromise = new RunningPromise(async ()=>{
|
|
782
809
|
await this.peerManager.heartbeat();
|
|
783
810
|
}, this.logger, this.config.peerCheckIntervalMS);
|
|
@@ -785,7 +812,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
785
812
|
this.logger.info(`Started P2P service`, {
|
|
786
813
|
listen: this.config.listenAddress,
|
|
787
814
|
port: this.config.p2pPort,
|
|
788
|
-
announce: announceTcpMultiaddr,
|
|
815
|
+
announce: announceTcpMultiaddr ?? 'pending (queryForIp=true)',
|
|
789
816
|
peerId: this.node.peerId.toString()
|
|
790
817
|
});
|
|
791
818
|
}
|
|
@@ -795,6 +822,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
795
822
|
*/ async stop() {
|
|
796
823
|
// Remove gossip sub listener
|
|
797
824
|
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
|
+
}
|
|
798
830
|
// Stop peer manager
|
|
799
831
|
this.logger.debug('Stopping peer manager...');
|
|
800
832
|
await this.peerManager.stop();
|
|
@@ -1029,29 +1061,67 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1029
1061
|
return;
|
|
1030
1062
|
}
|
|
1031
1063
|
async validateReceivedMessage(validationFunc, msgId, source, topicType) {
|
|
1064
|
+
// Default to reject result with a penalty if validation function throws an error
|
|
1032
1065
|
let resultAndObj = {
|
|
1033
|
-
result: TopicValidatorResult.Reject
|
|
1066
|
+
result: TopicValidatorResult.Reject,
|
|
1067
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
1034
1068
|
};
|
|
1035
1069
|
const timer = new Timer();
|
|
1036
1070
|
try {
|
|
1037
1071
|
resultAndObj = await validationFunc();
|
|
1038
1072
|
} catch (err) {
|
|
1039
|
-
this.
|
|
1040
|
-
this.logger.error(`Error deserializing and validating gossipsub message`, err, {
|
|
1073
|
+
this.logger.error(`Error validating gossipsub message`, err, {
|
|
1041
1074
|
msgId,
|
|
1042
1075
|
source: source.toString(),
|
|
1043
1076
|
topicType
|
|
1044
1077
|
});
|
|
1045
1078
|
}
|
|
1046
1079
|
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
1080
|
+
this.logger.debug(`Message ${topicType} accepted by validator`, {
|
|
1081
|
+
msgId,
|
|
1082
|
+
source: source.toString(),
|
|
1083
|
+
topicType
|
|
1084
|
+
});
|
|
1047
1085
|
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
|
+
});
|
|
1048
1100
|
}
|
|
1049
1101
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
|
|
1050
1102
|
return resultAndObj;
|
|
1051
1103
|
}
|
|
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
|
+
}
|
|
1052
1116
|
async handleGossipedTx(payloadData, msgId, source) {
|
|
1053
1117
|
const validationFunc = async ()=>{
|
|
1054
|
-
const tx = Tx.fromBuffer(payloadData);
|
|
1118
|
+
const tx = this.tryDeserialize(()=>Tx.fromBuffer(payloadData), msgId, source);
|
|
1119
|
+
if (!tx) {
|
|
1120
|
+
return {
|
|
1121
|
+
result: TopicValidatorResult.Reject,
|
|
1122
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
1123
|
+
};
|
|
1124
|
+
}
|
|
1055
1125
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1056
1126
|
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1057
1127
|
// Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
|
|
@@ -1072,9 +1142,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1072
1142
|
severity,
|
|
1073
1143
|
source: source.toString()
|
|
1074
1144
|
});
|
|
1075
|
-
this.peerManager.penalizePeer(source, severity);
|
|
1076
1145
|
return {
|
|
1077
|
-
result: TopicValidatorResult.Reject
|
|
1146
|
+
result: TopicValidatorResult.Reject,
|
|
1147
|
+
severity
|
|
1078
1148
|
};
|
|
1079
1149
|
}
|
|
1080
1150
|
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
@@ -1098,9 +1168,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1098
1168
|
severity,
|
|
1099
1169
|
source: source.toString()
|
|
1100
1170
|
});
|
|
1101
|
-
this.peerManager.penalizePeer(source, severity);
|
|
1102
1171
|
return {
|
|
1103
|
-
result: TopicValidatorResult.Reject
|
|
1172
|
+
result: TopicValidatorResult.Reject,
|
|
1173
|
+
severity
|
|
1104
1174
|
};
|
|
1105
1175
|
}
|
|
1106
1176
|
// Pool add: persist the tx
|
|
@@ -1132,9 +1202,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1132
1202
|
source: source.toString(),
|
|
1133
1203
|
txHash: txHash.toString()
|
|
1134
1204
|
});
|
|
1135
|
-
this.peerManager.penalizePeer(source, PeerErrorSeverity.HighToleranceError);
|
|
1136
1205
|
return {
|
|
1137
|
-
result: TopicValidatorResult.Reject
|
|
1206
|
+
result: TopicValidatorResult.Reject,
|
|
1207
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1138
1208
|
};
|
|
1139
1209
|
}
|
|
1140
1210
|
};
|
|
@@ -1155,7 +1225,16 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1155
1225
|
* Process a checkpoint attestation from a peer.
|
|
1156
1226
|
* Validates the attestation and adds it to the pool.
|
|
1157
1227
|
*/ async processCheckpointAttestationFromPeer(payloadData, msgId, source) {
|
|
1158
|
-
const { result, obj: attestation } = await this.validateReceivedMessage(()=>
|
|
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);
|
|
1159
1238
|
if (result !== TopicValidatorResult.Accept || !attestation) {
|
|
1160
1239
|
return;
|
|
1161
1240
|
}
|
|
@@ -1170,9 +1249,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1170
1249
|
const validationResult = await this.checkpointAttestationValidator.validate(attestation);
|
|
1171
1250
|
if (validationResult.result === 'reject') {
|
|
1172
1251
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1173
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1174
1252
|
return {
|
|
1175
|
-
result: TopicValidatorResult.Reject
|
|
1253
|
+
result: TopicValidatorResult.Reject,
|
|
1254
|
+
severity: validationResult.severity
|
|
1176
1255
|
};
|
|
1177
1256
|
}
|
|
1178
1257
|
if (validationResult.result === 'ignore') {
|
|
@@ -1199,9 +1278,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1199
1278
|
obj: attestation
|
|
1200
1279
|
};
|
|
1201
1280
|
}
|
|
1202
|
-
// Could not add (cap reached for signer),
|
|
1281
|
+
// Could not add (cap reached for signer), penalize and do not re-broadcast
|
|
1203
1282
|
if (!added) {
|
|
1204
|
-
this.logger.warn(`
|
|
1283
|
+
this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
|
|
1205
1284
|
slot: slot.toString(),
|
|
1206
1285
|
archive: attestation.archive.toString(),
|
|
1207
1286
|
source: peerId.toString(),
|
|
@@ -1209,8 +1288,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1209
1288
|
count
|
|
1210
1289
|
});
|
|
1211
1290
|
return {
|
|
1212
|
-
result: TopicValidatorResult.
|
|
1213
|
-
|
|
1291
|
+
result: TopicValidatorResult.Reject,
|
|
1292
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1214
1293
|
};
|
|
1215
1294
|
}
|
|
1216
1295
|
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
@@ -1248,9 +1327,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1248
1327
|
const validationResult = await this.blockProposalValidator.validate(block);
|
|
1249
1328
|
if (validationResult.result === 'reject') {
|
|
1250
1329
|
this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1251
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1252
1330
|
return {
|
|
1253
|
-
result: TopicValidatorResult.Reject
|
|
1331
|
+
result: TopicValidatorResult.Reject,
|
|
1332
|
+
severity: validationResult.severity
|
|
1254
1333
|
};
|
|
1255
1334
|
}
|
|
1256
1335
|
if (validationResult.result === 'ignore') {
|
|
@@ -1280,7 +1359,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1280
1359
|
}
|
|
1281
1360
|
// Too many blocks received for this slot and index, penalize peer and do not re-broadcast
|
|
1282
1361
|
if (!added) {
|
|
1283
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1284
1362
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1285
1363
|
...block.toBlockInfo(),
|
|
1286
1364
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
@@ -1292,7 +1370,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1292
1370
|
result: TopicValidatorResult.Reject,
|
|
1293
1371
|
metadata: {
|
|
1294
1372
|
isEquivocated
|
|
1295
|
-
}
|
|
1373
|
+
},
|
|
1374
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1296
1375
|
};
|
|
1297
1376
|
}
|
|
1298
1377
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1366,9 +1445,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1366
1445
|
const validationResult = await this.checkpointProposalValidator.validate(checkpoint);
|
|
1367
1446
|
if (validationResult.result === 'reject') {
|
|
1368
1447
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1369
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1370
1448
|
return {
|
|
1371
|
-
result: TopicValidatorResult.Reject
|
|
1449
|
+
result: TopicValidatorResult.Reject,
|
|
1450
|
+
severity: validationResult.severity
|
|
1372
1451
|
};
|
|
1373
1452
|
}
|
|
1374
1453
|
if (validationResult.result === 'ignore') {
|
|
@@ -1385,18 +1464,20 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1385
1464
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1386
1465
|
[Attributes.P2P_ID]: peerId.toString()
|
|
1387
1466
|
});
|
|
1388
|
-
const
|
|
1389
|
-
|
|
1467
|
+
const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1468
|
+
const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
|
|
1469
|
+
if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1390
1470
|
this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
|
|
1391
1471
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1392
1472
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1393
1473
|
isEquivocated,
|
|
1394
|
-
result
|
|
1474
|
+
result: blockProposalResult.result
|
|
1395
1475
|
});
|
|
1396
1476
|
return {
|
|
1397
|
-
result: TopicValidatorResult.Reject
|
|
1477
|
+
result: TopicValidatorResult.Reject,
|
|
1478
|
+
severity: 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError
|
|
1398
1479
|
};
|
|
1399
|
-
} else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1480
|
+
} else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1400
1481
|
processBlock = true;
|
|
1401
1482
|
}
|
|
1402
1483
|
}
|
|
@@ -1423,7 +1504,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1423
1504
|
// Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
|
|
1424
1505
|
// Note: We still return the checkpoint obj so the lastBlock can be processed if valid
|
|
1425
1506
|
if (!added) {
|
|
1426
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1427
1507
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1428
1508
|
...checkpoint.toCheckpointInfo(),
|
|
1429
1509
|
count,
|
|
@@ -1435,7 +1515,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1435
1515
|
metadata: {
|
|
1436
1516
|
isEquivocated,
|
|
1437
1517
|
processBlock
|
|
1438
|
-
}
|
|
1518
|
+
},
|
|
1519
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1439
1520
|
};
|
|
1440
1521
|
}
|
|
1441
1522
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -53,11 +53,15 @@ 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 and stale failed-auth-handshake entries.
|
|
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.
|
|
61
65
|
*/
|
|
62
66
|
private cleanupExpiredTimeouts;
|
|
63
67
|
private processScheduledDisconnects;
|
|
@@ -171,4 +175,4 @@ export declare class PeerManager implements PeerManagerInterface {
|
|
|
171
175
|
handleAuthRequestFromPeer(_authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
172
176
|
private updateAuthenticatedPeers;
|
|
173
177
|
}
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
178
|
+
//# 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":"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;;;;;;;;;;OAUG;IACH,OAAO,CAAC,sBAAsB;YAsBhB,2BAA2B;IAsBzC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAuBhC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAmB5B,8BAA8B,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAEjE;IAED;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAQrB;;;OAGG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAM1C;IAED;;;OAGG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ1C;IAED;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAQrB;;;OAGG;IACI,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAK5C;IAED;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;;OAMG;IACI,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,QAM3D;IAEM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,QAE7D;IAEM,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1C;IAEM,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGrD;IAEM,QAAQ,CAAC,cAAc,UAAQ,GAAG,QAAQ,EAAE,CA+BlD;IAEM,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQlD;IASM,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAa1D;IAED;;OAEG;IACH,OAAO,CAAC,QAAQ;IAmEhB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,mBAAmB;IAsB3B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;YAyBT,wBAAwB;IAgCtC,OAAO,CAAC,qBAAqB;YAYf,cAAc;YAkBd,oBAAoB;YAoEpB,QAAQ;IA4BtB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,gBAAgB;YAsBV,mBAAmB;YAenB,uBAAuB;YA2CvB,qBAAqB;IA2FnC,OAAO,CAAC,uBAAuB;IA0B/B,OAAO,CAAC,wBAAwB;IAUhC;;;OAGG;IACU,IAAI,kBAWhB;IAED,OAAO,CAAC,uBAAuB;IAI/B;;;;;;;;;SASK;IACQ,yBAAyB,CAAC,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAOxG;YAEa,wBAAwB;CAwBvC"}
|
|
@@ -172,19 +172,27 @@ export class PeerManager {
|
|
|
172
172
|
this.initializedPreferredPeers = true;
|
|
173
173
|
}
|
|
174
174
|
/**
|
|
175
|
-
* Cleans up expired timeouts.
|
|
175
|
+
* Cleans up expired timeouts and stale failed-auth-handshake entries.
|
|
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.
|
|
180
184
|
*/ cleanupExpiredTimeouts() {
|
|
181
|
-
// Clean up expired timeouts
|
|
182
185
|
const now = this.dateProvider.now();
|
|
183
186
|
for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()){
|
|
184
187
|
if (now >= timedOutPeer.timeoutUntilMs) {
|
|
185
188
|
this.timedOutPeers.delete(peerId);
|
|
186
189
|
}
|
|
187
190
|
}
|
|
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
|
+
}
|
|
188
196
|
}
|
|
189
197
|
/**
|
|
190
198
|
* Processes scheduled disconnects during heartbeat.
|
|
@@ -238,13 +246,17 @@ export class PeerManager {
|
|
|
238
246
|
* @param e - The disconnected peer event.
|
|
239
247
|
*/ handleDisconnectedPeerEvent(e) {
|
|
240
248
|
const peerId = e.detail;
|
|
249
|
+
const peerIdStr = peerId.toString();
|
|
241
250
|
this.metrics.peerDisconnected(peerId);
|
|
242
|
-
this.logger.verbose(`Disconnected from peer ${
|
|
243
|
-
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(
|
|
251
|
+
this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
|
|
252
|
+
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
|
|
244
253
|
if (validatorAddress !== undefined) {
|
|
245
|
-
this.logger.info(`Removing authentication for validator ${validatorAddress} at peer id ${
|
|
254
|
+
this.logger.info(`Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`);
|
|
246
255
|
this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
|
|
247
|
-
this.authenticatedPeerIdToValidatorAddress.delete(
|
|
256
|
+
this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
|
|
257
|
+
}
|
|
258
|
+
if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
|
|
259
|
+
this.peerScoring.removePeer(peerIdStr);
|
|
248
260
|
}
|
|
249
261
|
}
|
|
250
262
|
registerThisValidatorAddresses(address) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
1
2
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
2
3
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
4
|
import type { PeerId } from '@libp2p/interface';
|
|
@@ -8,6 +9,7 @@ export declare enum PeerScoreState {
|
|
|
8
9
|
Healthy = 2
|
|
9
10
|
}
|
|
10
11
|
export declare class PeerScoring {
|
|
12
|
+
private readonly dateProvider;
|
|
11
13
|
private logger;
|
|
12
14
|
private scores;
|
|
13
15
|
private lastUpdateTime;
|
|
@@ -17,10 +19,11 @@ export declare class PeerScoring {
|
|
|
17
19
|
[key in PeerErrorSeverity]: number;
|
|
18
20
|
};
|
|
19
21
|
private peerStateCounter;
|
|
20
|
-
constructor(config: P2PConfig, telemetry?: TelemetryClient);
|
|
22
|
+
constructor(config: P2PConfig, telemetry?: TelemetryClient, dateProvider?: DateProvider);
|
|
21
23
|
penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity): number;
|
|
22
24
|
updateScore(peerId: string, scoreDelta: number): number;
|
|
23
25
|
decayAllScores(): void;
|
|
26
|
+
removePeer(peerId: string): void;
|
|
24
27
|
getScore(peerId: string): number;
|
|
25
28
|
getScoreState(peerId: string): PeerScoreState;
|
|
26
29
|
getStats(): {
|
|
@@ -30,4 +33,4 @@ export declare class PeerScoring {
|
|
|
30
33
|
bannedCount: number;
|
|
31
34
|
};
|
|
32
35
|
}
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9zY29yaW5nLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfc2NvcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUdMLEtBQUssZUFBZSxFQUlyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBdUJqRCxvQkFBWSxjQUFjO0lBQ3hCLE1BQU0sSUFBQTtJQUNOLFVBQVUsSUFBQTtJQUNWLE9BQU8sSUFBQTtDQUNSO0FBaUJELHFCQUFhLFdBQVc7SUFhcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZO0lBWi9CLE9BQU8sQ0FBQyxNQUFNLENBQW9DO0lBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQWtDO0lBQ2hELE9BQU8sQ0FBQyxjQUFjLENBQWtDO0lBQ3hELE9BQU8sQ0FBQyxhQUFhLENBQWE7SUFDbEMsT0FBTyxDQUFDLFdBQVcsQ0FBTztJQUMxQixhQUFhLEVBQUU7U0FBRyxHQUFHLElBQUksaUJBQWlCLEdBQUcsTUFBTTtLQUFFLENBQUM7SUFFdEQsT0FBTyxDQUFDLGdCQUFnQixDQUFnQjtJQUV4QyxZQUNFLE1BQU0sRUFBRSxTQUFTLEVBQ2pCLFNBQVMsR0FBRSxlQUFzQyxFQUNoQyxZQUFZLEdBQUUsWUFBaUMsRUFpQmpFO0lBRU0sWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixVQU03RDtJQUVELFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQWlCdEQ7SUFFRCxjQUFjLElBQUksSUFBSSxDQWlCckI7SUFFRCxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBRy9CO0lBRUQsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUUvQjtJQUVNLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLGNBQWMsQ0FVbkQ7SUFFRCxRQUFRLElBQUk7UUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDO1FBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQztRQUFDLGVBQWUsRUFBRSxNQUFNLENBQUM7UUFBQyxXQUFXLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0E0QnRHO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer_scoring.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_scoring.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAGL,KAAK,eAAe,EAIrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAuBjD,oBAAY,cAAc;IACxB,MAAM,IAAA;IACN,UAAU,IAAA;IACV,OAAO,IAAA;CACR;
|
|
1
|
+
{"version":3,"file":"peer_scoring.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_scoring.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAGL,KAAK,eAAe,EAIrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAuBjD,oBAAY,cAAc;IACxB,MAAM,IAAA;IACN,UAAU,IAAA;IACV,OAAO,IAAA;CACR;AAiBD,qBAAa,WAAW;IAapB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAZ/B,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,WAAW,CAAO;IAC1B,aAAa,EAAE;SAAG,GAAG,IAAI,iBAAiB,GAAG,MAAM;KAAE,CAAC;IAEtD,OAAO,CAAC,gBAAgB,CAAgB;IAExC,YACE,MAAM,EAAE,SAAS,EACjB,SAAS,GAAE,eAAsC,EAChC,YAAY,GAAE,YAAiC,EAiBjE;IAEM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,UAM7D;IAED,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAiBtD;IAED,cAAc,IAAI,IAAI,CAiBrB;IAED,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG/B;IAED,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/B;IAEM,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAUnD;IAED,QAAQ,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CA4BtG;CACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { median } from '@aztec/foundation/collection';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
3
4
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
4
5
|
import { Attributes, Metrics, createUpDownCounterWithDefault, getTelemetryClient } from '@aztec/telemetry-client';
|
|
5
6
|
/**
|
|
@@ -39,15 +40,23 @@ export var PeerScoreState = /*#__PURE__*/ function(PeerScoreState) {
|
|
|
39
40
|
*/ // TODO: move into config / constants
|
|
40
41
|
const MIN_SCORE_BEFORE_BAN = -100;
|
|
41
42
|
const MIN_SCORE_BEFORE_DISCONNECT = -50;
|
|
43
|
+
const SCORE_CLEANUP_THRESHOLD = 0.1;
|
|
42
44
|
export class PeerScoring {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
dateProvider;
|
|
46
|
+
logger;
|
|
47
|
+
scores;
|
|
48
|
+
lastUpdateTime;
|
|
49
|
+
decayInterval;
|
|
50
|
+
decayFactor;
|
|
48
51
|
peerPenalties;
|
|
49
52
|
peerStateCounter;
|
|
50
|
-
constructor(config, telemetry = getTelemetryClient()){
|
|
53
|
+
constructor(config, telemetry = getTelemetryClient(), dateProvider = new DateProvider()){
|
|
54
|
+
this.dateProvider = dateProvider;
|
|
55
|
+
this.logger = createLogger('p2p:peer-scoring');
|
|
56
|
+
this.scores = new Map();
|
|
57
|
+
this.lastUpdateTime = new Map();
|
|
58
|
+
this.decayInterval = 1000 * 60;
|
|
59
|
+
this.decayFactor = 0.9;
|
|
51
60
|
const orderedValues = config.peerPenaltyValues?.sort((a, b)=>a - b);
|
|
52
61
|
this.peerPenalties = {
|
|
53
62
|
[PeerErrorSeverity.HighToleranceError]: orderedValues?.[0] ?? DefaultPeerPenalties[PeerErrorSeverity.HighToleranceError],
|
|
@@ -71,7 +80,7 @@ export class PeerScoring {
|
|
|
71
80
|
return newScore;
|
|
72
81
|
}
|
|
73
82
|
updateScore(peerId, scoreDelta) {
|
|
74
|
-
const currentTime =
|
|
83
|
+
const currentTime = this.dateProvider.now();
|
|
75
84
|
const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
|
|
76
85
|
const timePassed = currentTime - lastUpdate;
|
|
77
86
|
const decayPeriods = Math.floor(timePassed / this.decayInterval);
|
|
@@ -85,18 +94,27 @@ export class PeerScoring {
|
|
|
85
94
|
return currentScore;
|
|
86
95
|
}
|
|
87
96
|
decayAllScores() {
|
|
88
|
-
const currentTime =
|
|
97
|
+
const currentTime = this.dateProvider.now();
|
|
89
98
|
for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()){
|
|
90
99
|
const timePassed = currentTime - lastUpdate;
|
|
91
100
|
const decayPeriods = Math.floor(timePassed / this.decayInterval);
|
|
92
101
|
if (decayPeriods > 0) {
|
|
93
102
|
let score = this.scores.get(peerId) || 0;
|
|
94
103
|
score *= Math.pow(this.decayFactor, decayPeriods);
|
|
95
|
-
|
|
96
|
-
|
|
104
|
+
if (Math.abs(score) < SCORE_CLEANUP_THRESHOLD) {
|
|
105
|
+
this.scores.delete(peerId);
|
|
106
|
+
this.lastUpdateTime.delete(peerId);
|
|
107
|
+
} else {
|
|
108
|
+
this.scores.set(peerId, score);
|
|
109
|
+
this.lastUpdateTime.set(peerId, currentTime);
|
|
110
|
+
}
|
|
97
111
|
}
|
|
98
112
|
}
|
|
99
113
|
}
|
|
114
|
+
removePeer(peerId) {
|
|
115
|
+
this.scores.delete(peerId);
|
|
116
|
+
this.lastUpdateTime.delete(peerId);
|
|
117
|
+
}
|
|
100
118
|
getScore(peerId) {
|
|
101
119
|
return this.scores.get(peerId) || 0;
|
|
102
120
|
}
|
|
@@ -48,4 +48,4 @@ export declare class BatchTxRequester {
|
|
|
48
48
|
private unlockSmartRequesterSemaphores;
|
|
49
49
|
private sleepClampedToDeadline;
|
|
50
50
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfdHhfcmVxdWVzdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvYmF0Y2hfdHhfcmVxdWVzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEVBQUUsRUFBbUIsTUFBTSxrQkFBa0IsQ0FBQztBQUV2RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUU5RSxPQUFPLEVBQXFDLEtBQUssY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFRakcsT0FBTyxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsdUJBQXVCLEVBQXlCLE1BQU0sZ0JBQWdCLENBQUM7QUFzQnBILHFCQUFhLGdCQUFnQjtJQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBa0I7SUFDakQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWlCO0lBQ2hELE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFxQjtJQUNoRCxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBZ0M7SUFDM0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQVM7SUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQTBCO0lBQy9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFrQjtJQUN4QyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBd0I7SUFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBYTtJQUNyRCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBc0I7SUFDOUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQTJCO0lBQ3ZELE9BQU8sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQVM7SUFDbEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBUztJQUNqRCxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBUztJQUVyQyxZQUNFLGNBQWMsRUFBRSxlQUFlLEVBQy9CLGNBQWMsRUFBRSxjQUFjLEVBQzlCLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUM5QixVQUFVLEVBQUUsNkJBQTZCLEVBQ3pDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFDZixZQUFZLENBQUMsRUFBRSxZQUFZLEVBQzNCLElBQUksQ0FBQyxFQUFFLHVCQUF1QixFQStCL0I7SUFLYSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQW1DL0Q7SUFLRCxPQUFvQixhQUFhLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLFNBQVMsRUFBRSxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FTdkc7WUFVYSxtQkFBbUI7WUFrRG5CLGFBQWE7WUFrRGIsY0FBYztZQWdEZCxjQUFjO1lBK0JkLGVBQWU7WUE0RWYsY0FBYztJQW1DNUIsT0FBTyxDQUFDLDBCQUEwQjtZQTBCcEIsNkJBQTZCO1lBWTdCLGlCQUFpQjtJQXdEL0IsT0FBTyxDQUFDLG1CQUFtQjtJQStCM0I7Ozs7O09BS0c7SUFDSCxPQUFPLENBQUMseUJBQXlCO0lBU2pDLE9BQU8sQ0FBQywwQkFBMEI7SUFRbEMsT0FBTyxDQUFDLGNBQWM7SUFNdEIsT0FBTyxDQUFDLGdDQUFnQztJQWdCeEMsT0FBTyxDQUFDLHFCQUFxQjtJQXdCN0IsT0FBTyxDQUFDLFVBQVU7SUFZbEIsT0FBTyxDQUFDLDhCQUE4QjtZQVV4QixzQkFBc0I7Q0FNckMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch_tx_requester.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/batch_tx_requester.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,EAAE,EAAmB,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQjG,OAAO,KAAK,EAAE,6BAA6B,EAAE,uBAAuB,EAAyB,MAAM,gBAAgB,CAAC;AAsBpH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2B;IACvD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YACE,cAAc,EAAE,eAAe,EAC/B,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,6BAA6B,EACzC,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,YAAY,EAC3B,IAAI,CAAC,EAAE,uBAAuB,EA+B/B;IAKa,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,CAmC/D;IAKD,OAAoB,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CASvG;YAUa,mBAAmB;YAkDnB,aAAa;YAkDb,cAAc;YAgDd,cAAc;YA+Bd,eAAe;YA4Ef,cAAc;IAmC5B,OAAO,CAAC,0BAA0B;YA0BpB,6BAA6B;YAY7B,iBAAiB;
|
|
1
|
+
{"version":3,"file":"batch_tx_requester.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/batch_tx_requester.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,EAAE,EAAmB,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQjG,OAAO,KAAK,EAAE,6BAA6B,EAAE,uBAAuB,EAAyB,MAAM,gBAAgB,CAAC;AAsBpH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2B;IACvD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YACE,cAAc,EAAE,eAAe,EAC/B,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,6BAA6B,EACzC,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,YAAY,EAC3B,IAAI,CAAC,EAAE,uBAAuB,EA+B/B;IAKa,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,CAmC/D;IAKD,OAAoB,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CASvG;YAUa,mBAAmB;YAkDnB,aAAa;YAkDb,cAAc;YAgDd,cAAc;YA+Bd,eAAe;YA4Ef,cAAc;IAmC5B,OAAO,CAAC,0BAA0B;YA0BpB,6BAA6B;YAY7B,iBAAiB;IAwD/B,OAAO,CAAC,mBAAmB;IA+B3B;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IASjC,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gCAAgC;IAgBxC,OAAO,CAAC,qBAAqB;IAwB7B,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,8BAA8B;YAUxB,sBAAsB;CAMrC"}
|
|
@@ -411,6 +411,9 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
411
411
|
}
|
|
412
412
|
});
|
|
413
413
|
if (hasInvalidTx) {
|
|
414
|
+
this.logger.warn(`Penalizing peer ${peerId.toString()} for sending invalid transactions in batch response`, {
|
|
415
|
+
peerId
|
|
416
|
+
});
|
|
414
417
|
this.peers.penalisePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
415
418
|
} else {
|
|
416
419
|
// If we have received successful response from the peer, they have "redeemed" themselves and not considered bad anymore
|
|
@@ -46,9 +46,10 @@ export declare function prettyPrintRateLimitStatus(status: RateLimitStatus): "Al
|
|
|
46
46
|
* 2. Individual rate limits for each peer.
|
|
47
47
|
*
|
|
48
48
|
* How it works:
|
|
49
|
-
* - When a request comes in, it first checks against the
|
|
50
|
-
* - If the
|
|
51
|
-
* - The request is only allowed if both the
|
|
49
|
+
* - When a request comes in, it first checks against the peer's individual rate limit.
|
|
50
|
+
* - If the peer limit allows, it then checks against the global rate limit.
|
|
51
|
+
* - The request is only allowed if both the peer-specific and global limits allow it.
|
|
52
|
+
* - Checking peer limit first ensures a rate-limited peer cannot exhaust the global quota.
|
|
52
53
|
* - It automatically creates and manages rate limiters for new peers as they make requests.
|
|
53
54
|
* - It periodically cleans up rate limiters for inactive peers to conserve memory.
|
|
54
55
|
*
|
|
@@ -101,4 +102,4 @@ export declare class RequestResponseRateLimiter {
|
|
|
101
102
|
stop(): void;
|
|
102
103
|
getRateLimits(protocol: ReqRespSubProtocol): ProtocolRateLimitQuota;
|
|
103
104
|
}
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZV9saW1pdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9yYXRlLWxpbWl0ZXIvcmF0ZV9saW1pdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLDRCQUE0QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFNaEg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxxQkFBYSxlQUFlO0lBRTFCLE9BQU8sQ0FBQyxHQUFHLENBQVM7SUFFcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBUztJQUUxQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBUztJQUV2Qzs7O09BR0c7SUFDSCxZQUFZLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFJbEQ7SUFFRCxLQUFLLElBQUksT0FBTyxDQVVmO0NBQ0Y7QUFTRCxvQkFBWSxlQUFlO0lBQ3pCLFlBQVksSUFBQTtJQUNaLFVBQVUsSUFBQTtJQUNWLE9BQU8sSUFBQTtDQUNSO0FBRUQsd0JBQWdCLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxlQUFlLDZDQVNqRTtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gscUJBQWEsc0JBQXNCO0lBQ2pDLE9BQU8sQ0FBQyxZQUFZLENBQTJDO0lBQy9ELE9BQU8sQ0FBQyxhQUFhLENBQWtCO0lBQ3ZDLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFTO0lBQ3hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFTO0lBRXpDLFlBQVksY0FBYyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBSy9HO0lBRUQsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsZUFBZSxDQXlCckM7SUFFRCxvQkFBb0IsU0FPbkI7Q0FDRjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gscUJBQWEsMEJBQTBCO0lBT25DLE9BQU8sQ0FBQyxXQUFXO0lBTnJCLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBa0Q7SUFDakYsT0FBTyxDQUFDLFVBQVUsQ0FBK0I7SUFFakQsT0FBTyxDQUFDLGVBQWUsQ0FBeUM7SUFFaEUsWUFDVSxXQUFXLEVBQUUsV0FBVyxFQUNoQyxVQUFVLEdBQUUsT0FBTyxDQUFDLDRCQUE0QixDQUFNLEVBZ0J2RDtJQUVELEtBQUssU0FJSjtJQUVELEtBQUssQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxlQUFlLENBV3RFO0lBRUQsb0JBQW9CLFNBRW5CO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFNBRUg7SUFFRCxhQUFhLENBQUMsUUFBUSxFQUFFLGtCQUFrQixHQUFHLHNCQUFzQixDQUVsRTtDQUNGIn0=
|