@aztec/p2p 0.71.0 → 0.73.0
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/bootstrap/bootstrap.d.ts +2 -2
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +1 -1
- package/dest/client/factory.js +4 -4
- package/dest/client/p2p_client.d.ts +13 -16
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +55 -67
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +11 -19
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +6 -13
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +74 -80
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +5 -5
- package/dest/mem_pools/attestation_pool/mocks.d.ts +3 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +3 -3
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +9 -9
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +60 -54
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +7 -7
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +17 -18
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +7 -7
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +48 -47
- package/dest/mocks/index.d.ts +3 -3
- package/dest/mocks/index.d.ts.map +1 -1
- package/dest/mocks/index.js +19 -18
- package/dest/msg_validators/attestation_validator/attestation_validator.js +2 -2
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +2 -2
- package/dest/msg_validators/tx_validator/block_header_validator.js +3 -3
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +7 -7
- package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -3
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +9 -9
- package/dest/services/data_store.d.ts +4 -4
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +7 -7
- package/dest/services/dummy_service.d.ts +7 -0
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +10 -1
- package/dest/services/libp2p/libp2p_service.d.ts +19 -15
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +163 -134
- package/dest/services/peer-manager/metrics.d.ts +12 -0
- package/dest/services/peer-manager/metrics.d.ts.map +1 -0
- package/dest/services/peer-manager/metrics.js +26 -0
- package/dest/services/{peer_manager.d.ts → peer-manager/peer_manager.d.ts} +24 -8
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_manager.js +395 -0
- package/dest/services/{peer-scoring → peer-manager}/peer_scoring.d.ts +3 -0
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_scoring.js +84 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +45 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +81 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +61 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +175 -0
- package/dest/services/reqresp/interface.d.ts +17 -4
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +34 -11
- package/dest/services/reqresp/metrics.d.ts +15 -0
- package/dest/services/reqresp/metrics.d.ts.map +1 -0
- package/dest/services/reqresp/metrics.js +42 -0
- package/dest/services/reqresp/protocols/block.d.ts +4 -0
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block.js +9 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts +51 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/goodbye.js +92 -0
- package/dest/services/reqresp/protocols/index.d.ts +9 -0
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/index.js +9 -0
- package/dest/services/reqresp/protocols/ping.d.ts +9 -0
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/ping.js +9 -0
- package/dest/services/reqresp/{handlers.d.ts → protocols/status.d.ts} +1 -7
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/status.js +9 -0
- package/dest/services/reqresp/protocols/tx.d.ts +13 -0
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/tx.js +23 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
- package/dest/services/reqresp/{rate_limiter → rate-limiter}/index.js +1 -1
- package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.d.ts +3 -3
- package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.js +4 -4
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.js +55 -0
- package/dest/services/reqresp/reqresp.d.ts +33 -6
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +414 -249
- package/dest/services/service.d.ts +8 -0
- package/dest/services/service.d.ts.map +1 -1
- package/dest/util.d.ts +6 -2
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +2 -2
- package/package.json +8 -8
- package/src/bootstrap/bootstrap.ts +2 -2
- package/src/client/factory.ts +3 -3
- package/src/client/p2p_client.ts +68 -80
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +14 -22
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +100 -94
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +4 -4
- package/src/mem_pools/attestation_pool/mocks.ts +5 -5
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +84 -73
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +26 -23
- package/src/mem_pools/tx_pool/tx_pool.ts +7 -7
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +50 -47
- package/src/mocks/index.ts +19 -20
- package/src/msg_validators/attestation_validator/attestation_validator.ts +1 -1
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +1 -1
- package/src/msg_validators/tx_validator/block_header_validator.ts +2 -2
- package/src/msg_validators/tx_validator/data_validator.ts +12 -9
- package/src/msg_validators/tx_validator/double_spend_validator.ts +2 -2
- package/src/msg_validators/tx_validator/metadata_validator.ts +8 -8
- package/src/services/data_store.ts +9 -9
- package/src/services/dummy_service.ts +13 -0
- package/src/services/libp2p/libp2p_service.ts +212 -163
- package/src/services/peer-manager/metrics.ts +41 -0
- package/src/services/{peer_manager.ts → peer-manager/peer_manager.ts} +73 -23
- package/src/services/{peer-scoring → peer-manager}/peer_scoring.ts +16 -3
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +94 -0
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +211 -0
- package/src/services/reqresp/interface.ts +39 -16
- package/src/services/reqresp/metrics.ts +57 -0
- package/src/services/reqresp/protocols/block.ts +15 -0
- package/src/services/reqresp/protocols/goodbye.ts +101 -0
- package/src/services/reqresp/protocols/index.ts +8 -0
- package/src/services/reqresp/protocols/ping.ts +8 -0
- package/src/services/reqresp/{handlers.ts → protocols/status.ts} +0 -9
- package/src/services/reqresp/protocols/tx.ts +29 -0
- package/src/services/reqresp/{rate_limiter → rate-limiter}/rate_limiter.ts +3 -3
- package/src/services/reqresp/{rate_limiter → rate-limiter}/rate_limits.ts +24 -4
- package/src/services/reqresp/reqresp.ts +231 -26
- package/src/services/service.ts +12 -0
- package/src/util.ts +11 -4
- package/dest/services/peer-scoring/peer_scoring.d.ts.map +0 -1
- package/dest/services/peer-scoring/peer_scoring.js +0 -75
- package/dest/services/peer_manager.d.ts.map +0 -1
- package/dest/services/peer_manager.js +0 -358
- package/dest/services/reqresp/handlers.d.ts.map +0 -1
- package/dest/services/reqresp/handlers.js +0 -17
- package/dest/services/reqresp/rate_limiter/index.d.ts.map +0 -1
- package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
- package/dest/services/reqresp/rate_limiter/rate_limits.js +0 -35
- /package/dest/services/reqresp/{rate_limiter → rate-limiter}/index.d.ts +0 -0
- /package/dest/services/reqresp/{rate_limiter → rate-limiter}/rate_limits.d.ts +0 -0
- /package/src/services/reqresp/{rate_limiter → rate-limiter}/index.ts +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
-
import { BlockAttestation, BlockProposal, EpochProofQuote, MerkleTreeId, P2PClientType, PeerErrorSeverity, TopicTypeMap, Tx,
|
|
2
|
+
import { BlockAttestation, BlockProposal, EpochProofQuote, MerkleTreeId, P2PClientType, PeerErrorSeverity, TopicTypeMap, Tx, getTopicTypeForClientType, metricsTopicStrToLabels, } from '@aztec/circuit-types';
|
|
3
3
|
import { Fr } from '@aztec/circuits.js';
|
|
4
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
@@ -21,9 +21,11 @@ import { DataTxValidator, DoubleSpendTxValidator, MetadataTxValidator, TxProofVa
|
|
|
21
21
|
import { convertToMultiaddr } from '../../util.js';
|
|
22
22
|
import { AztecDatastore } from '../data_store.js';
|
|
23
23
|
import { SnappyTransform, fastMsgIdFn, getMsgIdFn, msgIdToStrFn } from '../encoding.js';
|
|
24
|
-
import { PeerManager } from '../peer_manager.js';
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
24
|
+
import { PeerManager } from '../peer-manager/peer_manager.js';
|
|
25
|
+
import { PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
26
|
+
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol } from '../reqresp/interface.js';
|
|
27
|
+
import { reqGoodbyeHandler } from '../reqresp/protocols/goodbye.js';
|
|
28
|
+
import { pingHandler, reqRespBlockHandler, reqRespTxHandler, statusHandler } from '../reqresp/protocols/index.js';
|
|
27
29
|
import { ReqResp } from '../reqresp/reqresp.js';
|
|
28
30
|
import { GossipSubEvent } from '../types.js';
|
|
29
31
|
/**
|
|
@@ -42,7 +44,7 @@ let LibP2PService = (() => {
|
|
|
42
44
|
let _validateBlockProposal_decorators;
|
|
43
45
|
let _validateEpochProofQuote_decorators;
|
|
44
46
|
return _a = class LibP2PService extends _classSuper {
|
|
45
|
-
constructor(clientType, config, node, peerDiscoveryService, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry,
|
|
47
|
+
constructor(clientType, config, node, peerDiscoveryService, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger = createLogger('p2p:libp2p_service')) {
|
|
46
48
|
super(telemetry, 'LibP2PService');
|
|
47
49
|
this.clientType = (__runInitializers(this, _instanceExtraInitializers), clientType);
|
|
48
50
|
this.config = config;
|
|
@@ -50,101 +52,26 @@ let LibP2PService = (() => {
|
|
|
50
52
|
this.peerDiscoveryService = peerDiscoveryService;
|
|
51
53
|
this.mempools = mempools;
|
|
52
54
|
this.l2BlockSource = l2BlockSource;
|
|
53
|
-
this.epochCache = epochCache;
|
|
54
55
|
this.proofVerifier = proofVerifier;
|
|
55
56
|
this.worldStateSynchronizer = worldStateSynchronizer;
|
|
56
|
-
this.telemetry = telemetry;
|
|
57
|
-
this.requestResponseHandlers = requestResponseHandlers;
|
|
58
57
|
this.logger = logger;
|
|
59
58
|
this.jobQueue = new SerialQueue();
|
|
60
|
-
|
|
59
|
+
const peerScoring = new PeerScoring(config);
|
|
60
|
+
this.reqresp = new ReqResp(config, node, peerScoring);
|
|
61
|
+
this.peerManager = new PeerManager(node, peerDiscoveryService, config, telemetry, logger, peerScoring, this.reqresp);
|
|
62
|
+
// Update gossipsub score params
|
|
61
63
|
this.node.services.pubsub.score.params.appSpecificScore = (peerId) => {
|
|
62
64
|
return this.peerManager.getPeerScore(peerId);
|
|
63
65
|
};
|
|
64
66
|
this.node.services.pubsub.score.params.appSpecificWeight = 10;
|
|
65
|
-
this.reqresp = new ReqResp(config, node, this.peerManager);
|
|
66
67
|
this.attestationValidator = new AttestationValidator(epochCache);
|
|
67
68
|
this.blockProposalValidator = new BlockProposalValidator(epochCache);
|
|
68
69
|
this.epochProofQuoteValidator = new EpochProofQuoteValidator(epochCache);
|
|
69
|
-
this.blockReceivedCallback = (block) => {
|
|
70
|
-
this.logger.
|
|
71
|
-
return
|
|
70
|
+
this.blockReceivedCallback = async (block) => {
|
|
71
|
+
this.logger.warn(`Handler not yet registered: Block received callback not set. Received block for slot ${block.slotNumber.toNumber()} from peer.`, { p2pMessageIdentifier: await block.p2pMessageIdentifier() });
|
|
72
|
+
return undefined;
|
|
72
73
|
};
|
|
73
74
|
}
|
|
74
|
-
/**
|
|
75
|
-
* Starts the LibP2P service.
|
|
76
|
-
* @returns An empty promise.
|
|
77
|
-
*/
|
|
78
|
-
async start() {
|
|
79
|
-
// Check if service is already started
|
|
80
|
-
if (this.node.status === 'started') {
|
|
81
|
-
throw new Error('P2P service already started');
|
|
82
|
-
}
|
|
83
|
-
// Get listen & announce addresses for logging
|
|
84
|
-
const { tcpListenAddress, tcpAnnounceAddress } = this.config;
|
|
85
|
-
if (!tcpAnnounceAddress) {
|
|
86
|
-
throw new Error('Announce address not provided.');
|
|
87
|
-
}
|
|
88
|
-
const announceTcpMultiaddr = convertToMultiaddr(tcpAnnounceAddress, 'tcp');
|
|
89
|
-
// Start job queue, peer discovery service and libp2p node
|
|
90
|
-
this.jobQueue.start();
|
|
91
|
-
await this.peerDiscoveryService.start();
|
|
92
|
-
await this.node.start();
|
|
93
|
-
// Subscribe to standard GossipSub topics by default
|
|
94
|
-
for (const topic of getTopicTypeForClientType(this.clientType)) {
|
|
95
|
-
this.subscribeToTopic(TopicTypeMap[topic].p2pTopic);
|
|
96
|
-
}
|
|
97
|
-
// Add p2p topic validators
|
|
98
|
-
// As they are stored within a kv pair, there is no need to register them conditionally
|
|
99
|
-
// based on the client type
|
|
100
|
-
const topicValidators = {
|
|
101
|
-
[Tx.p2pTopic]: this.validatePropagatedTxFromMessage.bind(this),
|
|
102
|
-
[BlockAttestation.p2pTopic]: this.validatePropagatedAttestationFromMessage.bind(this),
|
|
103
|
-
[BlockProposal.p2pTopic]: this.validatePropagatedBlockFromMessage.bind(this),
|
|
104
|
-
[EpochProofQuote.p2pTopic]: this.validatePropagatedEpochProofQuoteFromMessage.bind(this),
|
|
105
|
-
};
|
|
106
|
-
for (const [topic, validator] of Object.entries(topicValidators)) {
|
|
107
|
-
this.node.services.pubsub.topicValidators.set(topic, validator);
|
|
108
|
-
}
|
|
109
|
-
// add GossipSub listener
|
|
110
|
-
this.node.services.pubsub.addEventListener(GossipSubEvent.MESSAGE, this.handleGossipSubEvent.bind(this));
|
|
111
|
-
// Start running promise for peer discovery
|
|
112
|
-
this.discoveryRunningPromise = new RunningPromise(() => this.peerManager.heartbeat(), this.logger, this.config.peerCheckIntervalMS);
|
|
113
|
-
this.discoveryRunningPromise.start();
|
|
114
|
-
// Define the sub protocol validators - This is done within this start() method to gain a callback to the existing validateTx function
|
|
115
|
-
const reqrespSubProtocolValidators = {
|
|
116
|
-
...DEFAULT_SUB_PROTOCOL_VALIDATORS,
|
|
117
|
-
[TX_REQ_PROTOCOL]: this.validateRequestedTx.bind(this),
|
|
118
|
-
};
|
|
119
|
-
await this.reqresp.start(this.requestResponseHandlers, reqrespSubProtocolValidators);
|
|
120
|
-
this.logger.info(`Started P2P service`, {
|
|
121
|
-
listen: tcpListenAddress,
|
|
122
|
-
announce: announceTcpMultiaddr,
|
|
123
|
-
peerId: this.node.peerId.toString(),
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Stops the LibP2P service.
|
|
128
|
-
* @returns An empty promise.
|
|
129
|
-
*/
|
|
130
|
-
async stop() {
|
|
131
|
-
// Remove gossip sub listener
|
|
132
|
-
this.node.services.pubsub.removeEventListener(GossipSubEvent.MESSAGE, this.handleGossipSubEvent.bind(this));
|
|
133
|
-
// Stop peer manager
|
|
134
|
-
this.logger.debug('Stopping peer manager...');
|
|
135
|
-
this.peerManager.stop();
|
|
136
|
-
this.logger.debug('Stopping job queue...');
|
|
137
|
-
await this.jobQueue.end();
|
|
138
|
-
this.logger.debug('Stopping running promise...');
|
|
139
|
-
await this.discoveryRunningPromise?.stop();
|
|
140
|
-
this.logger.debug('Stopping peer discovery service...');
|
|
141
|
-
await this.peerDiscoveryService.stop();
|
|
142
|
-
this.logger.debug('Request response service stopped...');
|
|
143
|
-
await this.reqresp.stop();
|
|
144
|
-
this.logger.debug('Stopping LibP2P...');
|
|
145
|
-
await this.stopLibP2P();
|
|
146
|
-
this.logger.info('LibP2P service stopped');
|
|
147
|
-
}
|
|
148
75
|
/**
|
|
149
76
|
* Creates an instance of the LibP2P service.
|
|
150
77
|
* @param config - The configuration to use when creating the service.
|
|
@@ -229,34 +156,108 @@ let LibP2PService = (() => {
|
|
|
229
156
|
},
|
|
230
157
|
}),
|
|
231
158
|
}),
|
|
159
|
+
components: (components) => ({
|
|
160
|
+
connectionManager: components.connectionManager,
|
|
161
|
+
}),
|
|
232
162
|
},
|
|
233
163
|
});
|
|
164
|
+
return new _a(clientType, config, node, peerDiscoveryService, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Starts the LibP2P service.
|
|
168
|
+
* @returns An empty promise.
|
|
169
|
+
*/
|
|
170
|
+
async start() {
|
|
171
|
+
// Check if service is already started
|
|
172
|
+
if (this.node.status === 'started') {
|
|
173
|
+
throw new Error('P2P service already started');
|
|
174
|
+
}
|
|
175
|
+
// Get listen & announce addresses for logging
|
|
176
|
+
const { tcpListenAddress, tcpAnnounceAddress } = this.config;
|
|
177
|
+
if (!tcpAnnounceAddress) {
|
|
178
|
+
throw new Error('Announce address not provided.');
|
|
179
|
+
}
|
|
180
|
+
const announceTcpMultiaddr = convertToMultiaddr(tcpAnnounceAddress, 'tcp');
|
|
181
|
+
// Start job queue, peer discovery service and libp2p node
|
|
182
|
+
this.jobQueue.start();
|
|
183
|
+
await this.peerDiscoveryService.start();
|
|
184
|
+
await this.node.start();
|
|
185
|
+
// Subscribe to standard GossipSub topics by default
|
|
186
|
+
for (const topic of getTopicTypeForClientType(this.clientType)) {
|
|
187
|
+
this.subscribeToTopic(TopicTypeMap[topic].p2pTopic);
|
|
188
|
+
}
|
|
234
189
|
// Create request response protocol handlers
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
* @returns the tx response message
|
|
239
|
-
*/
|
|
240
|
-
const txHandler = (msg) => {
|
|
241
|
-
const txHash = TxHash.fromBuffer(msg);
|
|
242
|
-
const foundTx = mempools.txPool.getTxByHash(txHash);
|
|
243
|
-
const buf = foundTx ? foundTx.toBuffer() : Buffer.alloc(0);
|
|
244
|
-
return Promise.resolve(buf);
|
|
245
|
-
};
|
|
190
|
+
const txHandler = reqRespTxHandler(this.mempools);
|
|
191
|
+
const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
|
|
192
|
+
const blockHandler = reqRespBlockHandler(this.l2BlockSource);
|
|
246
193
|
const requestResponseHandlers = {
|
|
247
|
-
[
|
|
248
|
-
[
|
|
249
|
-
[
|
|
194
|
+
[ReqRespSubProtocol.PING]: pingHandler,
|
|
195
|
+
[ReqRespSubProtocol.STATUS]: statusHandler,
|
|
196
|
+
[ReqRespSubProtocol.TX]: txHandler.bind(this),
|
|
197
|
+
[ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this),
|
|
198
|
+
[ReqRespSubProtocol.BLOCK]: blockHandler.bind(this),
|
|
250
199
|
};
|
|
251
|
-
|
|
200
|
+
// Add p2p topic validators
|
|
201
|
+
// As they are stored within a kv pair, there is no need to register them conditionally
|
|
202
|
+
// based on the client type
|
|
203
|
+
const topicValidators = {
|
|
204
|
+
[Tx.p2pTopic]: this.validatePropagatedTxFromMessage.bind(this),
|
|
205
|
+
[BlockAttestation.p2pTopic]: this.validatePropagatedAttestationFromMessage.bind(this),
|
|
206
|
+
[BlockProposal.p2pTopic]: this.validatePropagatedBlockFromMessage.bind(this),
|
|
207
|
+
[EpochProofQuote.p2pTopic]: this.validatePropagatedEpochProofQuoteFromMessage.bind(this),
|
|
208
|
+
};
|
|
209
|
+
for (const [topic, validator] of Object.entries(topicValidators)) {
|
|
210
|
+
this.node.services.pubsub.topicValidators.set(topic, validator);
|
|
211
|
+
}
|
|
212
|
+
// add GossipSub listener
|
|
213
|
+
this.node.services.pubsub.addEventListener(GossipSubEvent.MESSAGE, this.handleGossipSubEvent.bind(this));
|
|
214
|
+
// Start running promise for peer discovery
|
|
215
|
+
this.discoveryRunningPromise = new RunningPromise(() => this.peerManager.heartbeat(), this.logger, this.config.peerCheckIntervalMS);
|
|
216
|
+
this.discoveryRunningPromise.start();
|
|
217
|
+
// Define the sub protocol validators - This is done within this start() method to gain a callback to the existing validateTx function
|
|
218
|
+
const reqrespSubProtocolValidators = {
|
|
219
|
+
...DEFAULT_SUB_PROTOCOL_VALIDATORS,
|
|
220
|
+
// TODO(#11336): A request validator for blocks
|
|
221
|
+
[ReqRespSubProtocol.TX]: this.validateRequestedTx.bind(this),
|
|
222
|
+
};
|
|
223
|
+
await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators);
|
|
224
|
+
this.logger.info(`Started P2P service`, {
|
|
225
|
+
listen: tcpListenAddress,
|
|
226
|
+
announce: announceTcpMultiaddr,
|
|
227
|
+
peerId: this.node.peerId.toString(),
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Stops the LibP2P service.
|
|
232
|
+
* @returns An empty promise.
|
|
233
|
+
*/
|
|
234
|
+
async stop() {
|
|
235
|
+
// Remove gossip sub listener
|
|
236
|
+
this.node.services.pubsub.removeEventListener(GossipSubEvent.MESSAGE, this.handleGossipSubEvent.bind(this));
|
|
237
|
+
// Stop peer manager
|
|
238
|
+
this.logger.debug('Stopping peer manager...');
|
|
239
|
+
await this.peerManager.stop();
|
|
240
|
+
this.logger.debug('Stopping job queue...');
|
|
241
|
+
await this.jobQueue.end();
|
|
242
|
+
this.logger.debug('Stopping running promise...');
|
|
243
|
+
await this.discoveryRunningPromise?.stop();
|
|
244
|
+
this.logger.debug('Stopping peer discovery service...');
|
|
245
|
+
await this.peerDiscoveryService.stop();
|
|
246
|
+
this.logger.debug('Request response service stopped...');
|
|
247
|
+
await this.reqresp.stop();
|
|
248
|
+
this.logger.debug('Stopping LibP2P...');
|
|
249
|
+
await this.stopLibP2P();
|
|
250
|
+
this.logger.info('LibP2P service stopped');
|
|
252
251
|
}
|
|
253
252
|
getPeers(includePending) {
|
|
254
253
|
return this.peerManager.getPeers(includePending);
|
|
255
254
|
}
|
|
256
|
-
|
|
255
|
+
handleGossipSubEvent(e) {
|
|
257
256
|
const { msg } = e.detail;
|
|
258
257
|
this.logger.trace(`Received PUBSUB message.`);
|
|
259
|
-
|
|
258
|
+
void this.jobQueue
|
|
259
|
+
.put(() => this.handleNewGossipMessage(msg))
|
|
260
|
+
.catch(err => this.logger.error(`Error processing gossip message`, err));
|
|
260
261
|
}
|
|
261
262
|
/**
|
|
262
263
|
* Send Request via the ReqResp service
|
|
@@ -271,6 +272,15 @@ let LibP2PService = (() => {
|
|
|
271
272
|
sendRequest(protocol, request) {
|
|
272
273
|
return this.reqresp.sendRequest(protocol, request);
|
|
273
274
|
}
|
|
275
|
+
/**
|
|
276
|
+
* Send a batch of requests to peers, and return the responses
|
|
277
|
+
* @param protocol - The request response protocol to use
|
|
278
|
+
* @param requests - The requests to send to the peers
|
|
279
|
+
* @returns The responses to the requests
|
|
280
|
+
*/
|
|
281
|
+
sendBatchRequest(protocol, requests) {
|
|
282
|
+
return this.reqresp.sendBatchRequest(protocol, requests);
|
|
283
|
+
}
|
|
274
284
|
/**
|
|
275
285
|
* Get the ENR of the node
|
|
276
286
|
* @returns The ENR of the node
|
|
@@ -325,7 +335,7 @@ let LibP2PService = (() => {
|
|
|
325
335
|
}
|
|
326
336
|
if (message.topic == EpochProofQuote.p2pTopic) {
|
|
327
337
|
const epochProofQuote = EpochProofQuote.fromBuffer(Buffer.from(message.data));
|
|
328
|
-
this.processEpochProofQuoteFromPeer(epochProofQuote);
|
|
338
|
+
await this.processEpochProofQuoteFromPeer(epochProofQuote);
|
|
329
339
|
}
|
|
330
340
|
return;
|
|
331
341
|
}
|
|
@@ -335,7 +345,12 @@ let LibP2PService = (() => {
|
|
|
335
345
|
* @param attestation - The attestation to process.
|
|
336
346
|
*/
|
|
337
347
|
async processAttestationFromPeer(attestation) {
|
|
338
|
-
this.logger.debug(`Received attestation ${attestation.
|
|
348
|
+
this.logger.debug(`Received attestation for block ${attestation.blockNumber.toNumber()} slot ${attestation.slotNumber.toNumber()} from external peer.`, {
|
|
349
|
+
p2pMessageIdentifier: await attestation.p2pMessageIdentifier(),
|
|
350
|
+
slot: attestation.slotNumber.toNumber(),
|
|
351
|
+
archive: attestation.archive.toString(),
|
|
352
|
+
block: attestation.blockNumber.toNumber(),
|
|
353
|
+
});
|
|
339
354
|
await this.mempools.attestationPool.addAttestations([attestation]);
|
|
340
355
|
}
|
|
341
356
|
/**Process block from peer
|
|
@@ -346,32 +361,46 @@ let LibP2PService = (() => {
|
|
|
346
361
|
*/
|
|
347
362
|
// REVIEW: callback pattern https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
348
363
|
async processBlockFromPeer(block) {
|
|
349
|
-
this.logger.verbose(`Received block ${block.
|
|
364
|
+
this.logger.verbose(`Received block ${block.blockNumber.toNumber()} for slot ${block.slotNumber.toNumber()} from external peer.`, {
|
|
365
|
+
p2pMessageIdentifier: await block.p2pMessageIdentifier(),
|
|
366
|
+
slot: block.slotNumber.toNumber(),
|
|
367
|
+
archive: block.archive.toString(),
|
|
368
|
+
block: block.blockNumber.toNumber(),
|
|
369
|
+
});
|
|
350
370
|
const attestation = await this.blockReceivedCallback(block);
|
|
351
371
|
// TODO: fix up this pattern - the abstraction is not nice
|
|
352
372
|
// The attestation can be undefined if no handler is registered / the validator deems the block invalid
|
|
353
373
|
if (attestation != undefined) {
|
|
354
|
-
this.logger.verbose(`Broadcasting attestation ${attestation.
|
|
355
|
-
|
|
374
|
+
this.logger.verbose(`Broadcasting attestation for block ${attestation.blockNumber.toNumber()} slot ${attestation.slotNumber.toNumber()}`, {
|
|
375
|
+
p2pMessageIdentifier: await attestation.p2pMessageIdentifier(),
|
|
376
|
+
slot: attestation.slotNumber.toNumber(),
|
|
377
|
+
archive: attestation.archive.toString(),
|
|
378
|
+
block: attestation.blockNumber.toNumber(),
|
|
379
|
+
});
|
|
380
|
+
await this.broadcastAttestation(attestation);
|
|
356
381
|
}
|
|
357
382
|
}
|
|
358
383
|
/**
|
|
359
384
|
* Broadcast an attestation to all peers.
|
|
360
385
|
* @param attestation - The attestation to broadcast.
|
|
361
386
|
*/
|
|
362
|
-
broadcastAttestation(attestation) {
|
|
363
|
-
this.propagate(attestation);
|
|
364
|
-
}
|
|
365
|
-
processEpochProofQuoteFromPeer(epochProofQuote) {
|
|
366
|
-
|
|
387
|
+
async broadcastAttestation(attestation) {
|
|
388
|
+
await this.propagate(attestation);
|
|
389
|
+
}
|
|
390
|
+
async processEpochProofQuoteFromPeer(epochProofQuote) {
|
|
391
|
+
const epoch = epochProofQuote.payload.epochToProve;
|
|
392
|
+
const prover = epochProofQuote.payload.prover.toString();
|
|
393
|
+
const p2pMessageIdentifier = await epochProofQuote.p2pMessageIdentifier();
|
|
394
|
+
this.logger.verbose(`Received epoch proof quote ${p2pMessageIdentifier} by prover ${prover} for epoch ${epoch} from external peer.`, { quote: epochProofQuote.toInspect(), p2pMessageIdentifier });
|
|
367
395
|
this.mempools.epochProofQuotePool.addQuote(epochProofQuote);
|
|
368
396
|
}
|
|
369
397
|
/**
|
|
370
398
|
* Propagates provided message to peers.
|
|
371
399
|
* @param message - The message to propagate.
|
|
372
400
|
*/
|
|
373
|
-
propagate(message) {
|
|
374
|
-
|
|
401
|
+
async propagate(message) {
|
|
402
|
+
const p2pMessageIdentifier = await message.p2pMessageIdentifier();
|
|
403
|
+
this.logger.trace(`Message ${p2pMessageIdentifier} queued`, { p2pMessageIdentifier });
|
|
375
404
|
void this.jobQueue.put(async () => {
|
|
376
405
|
await this.sendToPeers(message);
|
|
377
406
|
});
|
|
@@ -389,7 +418,7 @@ let LibP2PService = (() => {
|
|
|
389
418
|
* In order to perform this check, the tx proof must be verified.
|
|
390
419
|
*
|
|
391
420
|
* Note: This function is called from within `ReqResp.sendRequest` as part of the
|
|
392
|
-
*
|
|
421
|
+
* ReqRespSubProtocol.TX subprotocol validation.
|
|
393
422
|
*
|
|
394
423
|
* @param requestedTxHash - The hash of the tx that was requested.
|
|
395
424
|
* @param responseTx - The tx that was received as a response to the request.
|
|
@@ -400,7 +429,7 @@ let LibP2PService = (() => {
|
|
|
400
429
|
const proofValidator = new TxProofValidator(this.proofVerifier);
|
|
401
430
|
const validProof = await proofValidator.validateTx(responseTx);
|
|
402
431
|
// If the node returns the wrong data, we penalize it
|
|
403
|
-
if (!requestedTxHash.equals(responseTx.getTxHash())) {
|
|
432
|
+
if (!requestedTxHash.equals(await responseTx.getTxHash())) {
|
|
404
433
|
// Returning the wrong data is a low tolerance error
|
|
405
434
|
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
|
|
406
435
|
return false;
|
|
@@ -422,7 +451,7 @@ let LibP2PService = (() => {
|
|
|
422
451
|
const tx = Tx.fromBuffer(Buffer.from(msg.data));
|
|
423
452
|
const isValid = await this.validatePropagatedTx(tx, propagationSource);
|
|
424
453
|
this.logger.trace(`validatePropagatedTx: ${isValid}`, {
|
|
425
|
-
[Attributes.TX_HASH]: tx.getTxHash().toString(),
|
|
454
|
+
[Attributes.TX_HASH]: (await tx.getTxHash()).toString(),
|
|
426
455
|
[Attributes.P2P_ID]: propagationSource.toString(),
|
|
427
456
|
});
|
|
428
457
|
return isValid ? TopicValidatorResult.Accept : TopicValidatorResult.Reject;
|
|
@@ -627,15 +656,15 @@ let LibP2PService = (() => {
|
|
|
627
656
|
}
|
|
628
657
|
async sendToPeers(message) {
|
|
629
658
|
const parent = message.constructor;
|
|
630
|
-
const identifier = message.p2pMessageIdentifier().toString();
|
|
631
|
-
this.logger.trace(`Sending message ${identifier}
|
|
659
|
+
const identifier = await message.p2pMessageIdentifier().then(i => i.toString());
|
|
660
|
+
this.logger.trace(`Sending message ${identifier}`, { p2pMessageIdentifier: identifier });
|
|
632
661
|
const recipientsNum = await this.publishToTopic(parent.p2pTopic, message.toBuffer());
|
|
633
|
-
this.logger.debug(`Sent message ${identifier} to ${recipientsNum} peers
|
|
662
|
+
this.logger.debug(`Sent message ${identifier} to ${recipientsNum} peers`, { p2pMessageIdentifier: identifier });
|
|
634
663
|
}
|
|
635
664
|
// Libp2p seems to hang sometimes if new peers are initiating connections.
|
|
636
665
|
async stopLibP2P() {
|
|
637
666
|
const TIMEOUT_MS = 5000; // 5 seconds timeout
|
|
638
|
-
const timeout = new Promise((
|
|
667
|
+
const timeout = new Promise((_resolve, reject) => {
|
|
639
668
|
setTimeout(() => reject(new Error('Timeout during libp2p.stop()')), TIMEOUT_MS);
|
|
640
669
|
});
|
|
641
670
|
try {
|
|
@@ -649,29 +678,29 @@ let LibP2PService = (() => {
|
|
|
649
678
|
},
|
|
650
679
|
(() => {
|
|
651
680
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
652
|
-
_processAttestationFromPeer_decorators = [trackSpan('Libp2pService.processAttestationFromPeer', attestation => ({
|
|
681
|
+
_processAttestationFromPeer_decorators = [trackSpan('Libp2pService.processAttestationFromPeer', async (attestation) => ({
|
|
653
682
|
[Attributes.BLOCK_NUMBER]: attestation.payload.header.globalVariables.blockNumber.toNumber(),
|
|
654
683
|
[Attributes.SLOT_NUMBER]: attestation.payload.header.globalVariables.slotNumber.toNumber(),
|
|
655
684
|
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
656
|
-
[Attributes.P2P_ID]: attestation.p2pMessageIdentifier().toString(),
|
|
685
|
+
[Attributes.P2P_ID]: await attestation.p2pMessageIdentifier().then(i => i.toString()),
|
|
657
686
|
}))];
|
|
658
|
-
_processBlockFromPeer_decorators = [trackSpan('Libp2pService.processBlockFromPeer', block => ({
|
|
659
|
-
[Attributes.BLOCK_NUMBER]: block.
|
|
660
|
-
[Attributes.SLOT_NUMBER]: block.
|
|
687
|
+
_processBlockFromPeer_decorators = [trackSpan('Libp2pService.processBlockFromPeer', async (block) => ({
|
|
688
|
+
[Attributes.BLOCK_NUMBER]: block.blockNumber.toNumber(),
|
|
689
|
+
[Attributes.SLOT_NUMBER]: block.slotNumber.toNumber(),
|
|
661
690
|
[Attributes.BLOCK_ARCHIVE]: block.archive.toString(),
|
|
662
|
-
[Attributes.P2P_ID]: block.p2pMessageIdentifier().toString(),
|
|
691
|
+
[Attributes.P2P_ID]: await block.p2pMessageIdentifier().then(i => i.toString()),
|
|
663
692
|
}))];
|
|
664
|
-
_broadcastAttestation_decorators = [trackSpan('Libp2pService.broadcastAttestation', attestation => ({
|
|
693
|
+
_broadcastAttestation_decorators = [trackSpan('Libp2pService.broadcastAttestation', async (attestation) => ({
|
|
665
694
|
[Attributes.BLOCK_NUMBER]: attestation.payload.header.globalVariables.blockNumber.toNumber(),
|
|
666
695
|
[Attributes.SLOT_NUMBER]: attestation.payload.header.globalVariables.slotNumber.toNumber(),
|
|
667
696
|
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
668
|
-
[Attributes.P2P_ID]: attestation.p2pMessageIdentifier().toString(),
|
|
697
|
+
[Attributes.P2P_ID]: await attestation.p2pMessageIdentifier().then(i => i.toString()),
|
|
669
698
|
}))];
|
|
670
699
|
_validateRequestedTx_decorators = [trackSpan('Libp2pService.validateRequestedTx', (requestedTxHash, _responseTx) => ({
|
|
671
700
|
[Attributes.TX_HASH]: requestedTxHash.toString(),
|
|
672
701
|
}))];
|
|
673
|
-
_validatePropagatedTx_decorators = [trackSpan('Libp2pService.validatePropagatedTx', tx => ({
|
|
674
|
-
[Attributes.TX_HASH]: tx.getTxHash().toString(),
|
|
702
|
+
_validatePropagatedTx_decorators = [trackSpan('Libp2pService.validatePropagatedTx', async (tx) => ({
|
|
703
|
+
[Attributes.TX_HASH]: (await tx.getTxHash()).toString(),
|
|
675
704
|
}))];
|
|
676
705
|
_validateAttestation_decorators = [trackSpan('Libp2pService.validateAttestation', (_peerId, attestation) => ({
|
|
677
706
|
[Attributes.SLOT_NUMBER]: attestation.payload.header.globalVariables.slotNumber.toString(),
|
|
@@ -695,4 +724,4 @@ let LibP2PService = (() => {
|
|
|
695
724
|
_a;
|
|
696
725
|
})();
|
|
697
726
|
export { LibP2PService };
|
|
698
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvbGlicDJwL2xpYnAycF9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFFYixlQUFlLEVBR2YsWUFBWSxFQUNaLGFBQWEsRUFDYixpQkFBaUIsRUFHakIsWUFBWSxFQUNaLEVBQUUsRUFDRixNQUFNLEVBR04seUJBQXlCLEVBQ3pCLHVCQUF1QixHQUN4QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUF3QixVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdEgsT0FBTyxFQUlMLFNBQVMsR0FDVixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBNkIsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLEdB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
|
|
727
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvbGlicDJwL2xpYnAycF9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFFYixlQUFlLEVBR2YsWUFBWSxFQUNaLGFBQWEsRUFDYixpQkFBaUIsRUFHakIsWUFBWSxFQUNaLEVBQUUsRUFJRix5QkFBeUIsRUFDekIsdUJBQXVCLEdBQ3hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQXdCLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUd0SCxPQUFPLEVBSUwsU0FBUyxHQUNWLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUE2QixvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBGLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1B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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
|
|
2
|
+
import { type GoodByeReason } from '../reqresp/protocols/index.js';
|
|
3
|
+
export declare class PeerManagerMetrics {
|
|
4
|
+
readonly telemetryClient: TelemetryClient;
|
|
5
|
+
private sentGoodbyes;
|
|
6
|
+
private receivedGoodbyes;
|
|
7
|
+
readonly tracer: Tracer;
|
|
8
|
+
constructor(telemetryClient: TelemetryClient, name?: string);
|
|
9
|
+
recordGoodbyeSent(reason: GoodByeReason): void;
|
|
10
|
+
recordGoodbyeReceived(reason: GoodByeReason): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,aAAa,EAAuB,MAAM,+BAA+B,CAAC;AAExF,qBAAa,kBAAkB;aAMD,eAAe,EAAE,eAAe;IAL5D,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,gBAAgB,CAAgB;IAExC,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAEH,eAAe,EAAE,eAAe,EAAE,IAAI,SAAgB;IAgB3E,iBAAiB,CAAC,MAAM,EAAE,aAAa;IAIvC,qBAAqB,CAAC,MAAM,EAAE,aAAa;CAGnD"}
|