@aztec/p2p 0.86.0 → 0.87.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.map +1 -1
- package/dest/client/factory.d.ts +4 -1
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +16 -14
- package/dest/client/index.d.ts +1 -0
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +1 -0
- package/dest/client/interface.d.ts +155 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +9 -0
- package/dest/client/p2p_client.d.ts +26 -164
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +185 -114
- package/dest/config.d.ts +5 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +6 -11
- package/dest/enr/generate-enr.d.ts +9 -1
- package/dest/enr/generate-enr.d.ts.map +1 -1
- package/dest/enr/generate-enr.js +24 -2
- package/dest/index.d.ts +1 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +2 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +4 -4
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +1 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +8 -2
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +1 -0
- 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 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +2 -2
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +4 -0
- 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 +50 -14
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +3 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +9 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +9 -0
- 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 +13 -5
- package/dest/msg_validators/attestation_validator/attestation_validator.js +1 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +15 -14
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +0 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +2 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +14 -0
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/factory.js +62 -0
- package/dest/msg_validators/tx_validator/gas_validator.js +3 -3
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +8 -4
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +35 -17
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +1 -1
- package/dest/services/discv5/discV5_service.d.ts +2 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +9 -13
- package/dest/services/dummy_service.d.ts +3 -3
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +6 -1
- package/dest/services/encoding.d.ts +1 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.d.ts +4 -2
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +94 -88
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.d.ts +1 -1
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +11 -2
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -2
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +41 -21
- package/dest/services/reqresp/interface.d.ts +1 -3
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts +0 -2
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/goodbye.js +1 -1
- package/dest/services/reqresp/protocols/ping.d.ts +0 -2
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.d.ts +0 -2
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.d.ts +1 -3
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +13 -10
- package/dest/services/service.d.ts +4 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/test-helpers/get-ports.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +2 -2
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +11 -6
- package/dest/testbench/testbench.js +1 -1
- package/dest/testbench/worker_client_manager.d.ts +0 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +2 -2
- package/dest/types/index.d.ts +1 -0
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +1 -0
- package/dest/versioning.d.ts +2 -2
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +6 -1
- package/package.json +15 -15
- package/src/bootstrap/bootstrap.ts +1 -1
- package/src/client/factory.ts +38 -33
- package/src/client/index.ts +1 -0
- package/src/client/interface.ts +186 -0
- package/src/client/p2p_client.ts +226 -287
- package/src/config.ts +11 -18
- package/src/enr/generate-enr.ts +35 -3
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +3 -0
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +4 -4
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +11 -4
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +10 -3
- package/src/mem_pools/attestation_pool/mocks.ts +2 -2
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +79 -34
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +16 -1
- package/src/mem_pools/tx_pool/tx_pool.ts +12 -0
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +9 -3
- 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 +1 -1
- package/src/msg_validators/tx_validator/data_validator.ts +24 -18
- package/src/msg_validators/tx_validator/double_spend_validator.ts +2 -2
- package/src/msg_validators/tx_validator/factory.ts +94 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +3 -3
- package/src/msg_validators/tx_validator/metadata_validator.ts +50 -14
- package/src/msg_validators/tx_validator/phases_validator.ts +6 -2
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +1 -1
- package/src/services/discv5/discV5_service.ts +14 -12
- package/src/services/dummy_service.ts +8 -2
- package/src/services/libp2p/libp2p_service.ts +102 -111
- package/src/services/peer-manager/metrics.ts +4 -1
- package/src/services/peer-manager/peer_manager.ts +18 -1
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +5 -1
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +42 -19
- package/src/services/reqresp/metrics.ts +4 -1
- package/src/services/reqresp/protocols/goodbye.ts +1 -1
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +4 -1
- package/src/services/reqresp/reqresp.ts +12 -12
- package/src/services/service.ts +7 -1
- package/src/test-helpers/make-test-p2p-clients.ts +2 -1
- package/src/test-helpers/reqresp-nodes.ts +1 -1
- package/src/testbench/p2p_client_testbench_worker.ts +10 -4
- package/src/testbench/testbench.ts +1 -1
- package/src/testbench/worker_client_manager.ts +2 -2
- package/src/types/index.ts +1 -0
- package/src/versioning.ts +8 -1
|
@@ -4,14 +4,13 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
4
4
|
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
}
|
|
7
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
8
7
|
import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
9
8
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
10
9
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
11
|
-
import {
|
|
10
|
+
import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
|
|
12
11
|
import { GasFees } from '@aztec/stdlib/gas';
|
|
13
|
-
import { BlockAttestation, BlockProposal, P2PClientType, PeerErrorSeverity, TopicType, createTopicString, getTopicTypeForClientType, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
|
|
14
|
-
import {
|
|
12
|
+
import { BlockAttestation, BlockProposal, P2PClientType, P2PMessage, PeerErrorSeverity, TopicType, createTopicString, getTopicTypeForClientType, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
|
|
13
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
15
14
|
import { Tx } from '@aztec/stdlib/tx';
|
|
16
15
|
import { compressComponentVersions } from '@aztec/stdlib/versioning';
|
|
17
16
|
import { Attributes, OtelMetricsAdapter, WithTracer, trackSpan } from '@aztec/telemetry-client';
|
|
@@ -29,7 +28,8 @@ import { tcp } from '@libp2p/tcp';
|
|
|
29
28
|
import { createLibp2p } from 'libp2p';
|
|
30
29
|
import { AttestationValidator, BlockProposalValidator } from '../../msg_validators/index.js';
|
|
31
30
|
import { getDefaultAllowedSetupFunctions } from '../../msg_validators/tx_validator/allowed_public_setup.js';
|
|
32
|
-
import {
|
|
31
|
+
import { createTxMessageValidators } from '../../msg_validators/tx_validator/factory.js';
|
|
32
|
+
import { DoubleSpendTxValidator, TxProofValidator } from '../../msg_validators/tx_validator/index.js';
|
|
33
33
|
import { GossipSubEvent } from '../../types/index.js';
|
|
34
34
|
import { convertToMultiaddr } from '../../util.js';
|
|
35
35
|
import { getVersions } from '../../versioning.js';
|
|
@@ -137,7 +137,7 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
137
137
|
tcp({
|
|
138
138
|
maxConnections: config.maxPeerCount,
|
|
139
139
|
// socket option: the maximum length of the queue of pending connections
|
|
140
|
-
// https://nodejs.org/dist/latest-
|
|
140
|
+
// https://nodejs.org/dist/latest-v22.x/docs/api/net.html#serverlisten
|
|
141
141
|
// it's not safe if we increase this number
|
|
142
142
|
backlog: 5,
|
|
143
143
|
closeServerOnMaxConnections: {
|
|
@@ -178,6 +178,7 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
178
178
|
heartbeatInterval: config.gossipsubInterval,
|
|
179
179
|
mcacheLength: config.gossipsubMcacheLength,
|
|
180
180
|
mcacheGossip: config.gossipsubMcacheGossip,
|
|
181
|
+
seenTTL: config.gossipsubSeenTTL,
|
|
181
182
|
msgIdFn: getMsgIdFn,
|
|
182
183
|
msgIdToStrFn: msgIdToStrFn,
|
|
183
184
|
fastMsgIdFn: fastMsgIdFn,
|
|
@@ -346,13 +347,18 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
346
347
|
/**
|
|
347
348
|
* Publishes data to a topic.
|
|
348
349
|
* @param topic - The topic to publish to.
|
|
349
|
-
* @param data - The
|
|
350
|
+
* @param data - The message to publish.
|
|
350
351
|
* @returns The number of recipients the data was sent to.
|
|
351
|
-
*/ async publishToTopic(topic,
|
|
352
|
+
*/ async publishToTopic(topic, message) {
|
|
352
353
|
if (!this.node.services.pubsub) {
|
|
353
354
|
throw new Error('Pubsub service not available.');
|
|
354
355
|
}
|
|
355
|
-
const
|
|
356
|
+
const p2pMessage = await P2PMessage.fromGossipable(message);
|
|
357
|
+
this.logger.debug(`Publishing message`, {
|
|
358
|
+
topic,
|
|
359
|
+
messageId: p2pMessage.id
|
|
360
|
+
});
|
|
361
|
+
const result = await this.node.services.pubsub.publish(topic, p2pMessage.toMessageData());
|
|
356
362
|
return result.recipients.length;
|
|
357
363
|
}
|
|
358
364
|
/**
|
|
@@ -360,14 +366,22 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
360
366
|
* @param topic - The message's topic.
|
|
361
367
|
* @param data - The message data
|
|
362
368
|
*/ async handleNewGossipMessage(msg, msgId, source) {
|
|
369
|
+
const p2pMessage = P2PMessage.fromMessageData(Buffer.from(msg.data));
|
|
370
|
+
const currentTime = new Date();
|
|
371
|
+
const messageLatency = currentTime.getTime() - p2pMessage.publishTime.getTime();
|
|
372
|
+
this.logger.debug(`Received message`, {
|
|
373
|
+
topic: msg.topic,
|
|
374
|
+
messageId: p2pMessage.id,
|
|
375
|
+
messageLatency
|
|
376
|
+
});
|
|
363
377
|
if (msg.topic === this.topicStrings[TopicType.tx]) {
|
|
364
|
-
await this.handleGossipedTx(
|
|
378
|
+
await this.handleGossipedTx(p2pMessage.payload, msgId, source);
|
|
365
379
|
}
|
|
366
380
|
if (msg.topic === this.topicStrings[TopicType.block_attestation] && this.clientType === P2PClientType.Full) {
|
|
367
|
-
await this.processAttestationFromPeer(
|
|
381
|
+
await this.processAttestationFromPeer(p2pMessage.payload, msgId, source);
|
|
368
382
|
}
|
|
369
383
|
if (msg.topic === this.topicStrings[TopicType.block_proposal]) {
|
|
370
|
-
await this.processBlockFromPeer(
|
|
384
|
+
await this.processBlockFromPeer(p2pMessage.payload, msgId, source);
|
|
371
385
|
}
|
|
372
386
|
return;
|
|
373
387
|
}
|
|
@@ -384,9 +398,9 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
384
398
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result && resultAndObj.obj ? TopicValidatorResult.Accept : TopicValidatorResult.Reject);
|
|
385
399
|
return resultAndObj;
|
|
386
400
|
}
|
|
387
|
-
async handleGossipedTx(
|
|
401
|
+
async handleGossipedTx(payloadData, msgId, source) {
|
|
388
402
|
const validationFunc = async ()=>{
|
|
389
|
-
const tx = Tx.fromBuffer(
|
|
403
|
+
const tx = Tx.fromBuffer(payloadData);
|
|
390
404
|
const result = await this.validatePropagatedTx(tx, source);
|
|
391
405
|
return {
|
|
392
406
|
result,
|
|
@@ -409,12 +423,12 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
409
423
|
* When a proposal is received from a peer, we add it to the attestation pool, so it can be accessed by other services.
|
|
410
424
|
*
|
|
411
425
|
* @param attestation - The attestation to process.
|
|
412
|
-
*/ async processAttestationFromPeer(
|
|
426
|
+
*/ async processAttestationFromPeer(payloadData, msgId, source) {
|
|
413
427
|
const validationFunc = async ()=>{
|
|
414
|
-
const attestation = BlockAttestation.fromBuffer(
|
|
428
|
+
const attestation = BlockAttestation.fromBuffer(payloadData);
|
|
415
429
|
const result = await this.validateAttestation(source, attestation);
|
|
416
430
|
this.logger.trace(`validatePropagatedAttestation: ${result}`, {
|
|
417
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.
|
|
431
|
+
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber.toString(),
|
|
418
432
|
[Attributes.P2P_ID]: source.toString()
|
|
419
433
|
});
|
|
420
434
|
return {
|
|
@@ -436,12 +450,12 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
436
450
|
attestation
|
|
437
451
|
]);
|
|
438
452
|
}
|
|
439
|
-
async processBlockFromPeer(
|
|
453
|
+
async processBlockFromPeer(payloadData, msgId, source) {
|
|
440
454
|
const validationFunc = async ()=>{
|
|
441
|
-
const block = BlockProposal.fromBuffer(
|
|
455
|
+
const block = BlockProposal.fromBuffer(payloadData);
|
|
442
456
|
const result = await this.validateBlockProposal(source, block);
|
|
443
457
|
this.logger.trace(`validatePropagatedBlock: ${result}`, {
|
|
444
|
-
[Attributes.SLOT_NUMBER]: block.payload.header.
|
|
458
|
+
[Attributes.SLOT_NUMBER]: block.payload.header.slotNumber.toString(),
|
|
445
459
|
[Attributes.P2P_ID]: source.toString()
|
|
446
460
|
});
|
|
447
461
|
return {
|
|
@@ -463,6 +477,8 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
463
477
|
archive: block.archive.toString(),
|
|
464
478
|
block: block.blockNumber.toNumber()
|
|
465
479
|
});
|
|
480
|
+
// Mark the txs in this proposal as non-evictable
|
|
481
|
+
await this.mempools.txPool.markTxsAsNonEvictable(block.payload.txHashes);
|
|
466
482
|
const attestation = await this.blockReceivedCallback(block);
|
|
467
483
|
// TODO: fix up this pattern - the abstraction is not nice
|
|
468
484
|
// The attestation can be undefined if no handler is registered / the validator deems the block invalid
|
|
@@ -530,18 +546,21 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
530
546
|
async validatePropagatedTx(tx, peerId) {
|
|
531
547
|
const blockNumber = await this.archiver.getBlockNumber() + 1;
|
|
532
548
|
const messageValidators = await this.createMessageValidators(blockNumber);
|
|
533
|
-
const
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
549
|
+
for (const validator of messageValidators){
|
|
550
|
+
const outcome = await this.runValidations(tx, validator);
|
|
551
|
+
if (outcome.allPassed) {
|
|
552
|
+
continue;
|
|
553
|
+
}
|
|
554
|
+
const { name } = outcome.failure;
|
|
555
|
+
let { severity } = outcome.failure;
|
|
556
|
+
// Double spend validator has a special case handler
|
|
557
|
+
if (name === 'doubleSpendValidator') {
|
|
558
|
+
severity = await this.handleDoubleSpendFailure(tx, blockNumber);
|
|
559
|
+
}
|
|
560
|
+
this.peerManager.penalizePeer(peerId, severity);
|
|
561
|
+
return false;
|
|
542
562
|
}
|
|
543
|
-
|
|
544
|
-
return false;
|
|
563
|
+
return true;
|
|
545
564
|
}
|
|
546
565
|
async getGasFees(blockNumber) {
|
|
547
566
|
if (blockNumber === this.feesCache?.blockNumber) {
|
|
@@ -555,6 +574,22 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
555
574
|
};
|
|
556
575
|
return gasFees;
|
|
557
576
|
}
|
|
577
|
+
async validate(txs) {
|
|
578
|
+
const blockNumber = await this.archiver.getBlockNumber() + 1;
|
|
579
|
+
const messageValidators = await this.createMessageValidators(blockNumber);
|
|
580
|
+
await Promise.all(txs.map(async (tx)=>{
|
|
581
|
+
for (const validator of messageValidators){
|
|
582
|
+
const outcome = await this.runValidations(tx, validator);
|
|
583
|
+
if (!outcome.allPassed) {
|
|
584
|
+
throw new Error('Invalid tx detected', {
|
|
585
|
+
cause: {
|
|
586
|
+
outcome
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
}));
|
|
592
|
+
}
|
|
558
593
|
/**
|
|
559
594
|
* Create message validators for the given block number.
|
|
560
595
|
*
|
|
@@ -564,41 +599,9 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
564
599
|
* @param blockNumber - The block number to create validators for.
|
|
565
600
|
* @returns The message validators.
|
|
566
601
|
*/ async createMessageValidators(blockNumber) {
|
|
567
|
-
const merkleTree = this.worldStateSynchronizer.getCommitted();
|
|
568
602
|
const gasFees = await this.getGasFees(blockNumber - 1);
|
|
569
603
|
const allowedInSetup = this.config.txPublicSetupAllowList ?? await getDefaultAllowedSetupFunctions();
|
|
570
|
-
return
|
|
571
|
-
dataValidator: {
|
|
572
|
-
validator: new DataTxValidator(),
|
|
573
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
574
|
-
},
|
|
575
|
-
metadataValidator: {
|
|
576
|
-
validator: new MetadataTxValidator(new Fr(this.config.l1ChainId), new Fr(this.config.rollupVersion), new Fr(blockNumber)),
|
|
577
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
578
|
-
},
|
|
579
|
-
proofValidator: {
|
|
580
|
-
validator: new TxProofValidator(this.proofVerifier),
|
|
581
|
-
severity: PeerErrorSeverity.MidToleranceError
|
|
582
|
-
},
|
|
583
|
-
doubleSpendValidator: {
|
|
584
|
-
validator: new DoubleSpendTxValidator({
|
|
585
|
-
nullifiersExist: async (nullifiers)=>{
|
|
586
|
-
const merkleTree = this.worldStateSynchronizer.getCommitted();
|
|
587
|
-
const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
|
|
588
|
-
return indices.map((index)=>index !== undefined);
|
|
589
|
-
}
|
|
590
|
-
}),
|
|
591
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
592
|
-
},
|
|
593
|
-
gasValidator: {
|
|
594
|
-
validator: new GasTxValidator(new DatabasePublicStateSource(merkleTree), ProtocolContractAddress.FeeJuice, gasFees),
|
|
595
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
596
|
-
},
|
|
597
|
-
phasesValidator: {
|
|
598
|
-
validator: new PhasesTxValidator(this.archiver, allowedInSetup, blockNumber),
|
|
599
|
-
severity: PeerErrorSeverity.MidToleranceError
|
|
600
|
-
}
|
|
601
|
-
};
|
|
604
|
+
return createTxMessageValidators(blockNumber, this.worldStateSynchronizer, gasFees, this.config.l1ChainId, this.config.rollupVersion, protocolContractTreeRoot, this.archiver, this.proofVerifier, allowedInSetup);
|
|
602
605
|
}
|
|
603
606
|
/**
|
|
604
607
|
* Run validations on a tx.
|
|
@@ -615,24 +618,27 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
615
618
|
};
|
|
616
619
|
});
|
|
617
620
|
// A promise that resolves when all validations have been run
|
|
618
|
-
const allValidations = Promise.all(validationPromises);
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
621
|
+
const allValidations = await Promise.all(validationPromises);
|
|
622
|
+
const failed = allValidations.find((x)=>!x.isValid);
|
|
623
|
+
if (failed) {
|
|
624
|
+
return {
|
|
625
|
+
allPassed: false,
|
|
626
|
+
failure: {
|
|
627
|
+
isValid: {
|
|
628
|
+
result: 'invalid',
|
|
629
|
+
reason: [
|
|
630
|
+
'Failed validation'
|
|
631
|
+
]
|
|
632
|
+
},
|
|
633
|
+
name: failed.name,
|
|
634
|
+
severity: failed.severity
|
|
635
|
+
}
|
|
636
|
+
};
|
|
637
|
+
} else {
|
|
638
|
+
return {
|
|
639
|
+
allPassed: true
|
|
640
|
+
};
|
|
641
|
+
}
|
|
636
642
|
}
|
|
637
643
|
/**
|
|
638
644
|
* Handle a double spend failure.
|
|
@@ -697,7 +703,7 @@ import { ReqResp } from '../reqresp/reqresp.js';
|
|
|
697
703
|
this.logger.trace(`Sending message ${identifier}`, {
|
|
698
704
|
p2pMessageIdentifier: identifier
|
|
699
705
|
});
|
|
700
|
-
const recipientsNum = await this.publishToTopic(this.topicStrings[parent.p2pTopic], message
|
|
706
|
+
const recipientsNum = await this.publishToTopic(this.topicStrings[parent.p2pTopic], message);
|
|
701
707
|
this.logger.debug(`Sent message ${identifier} to ${recipientsNum} peers`, {
|
|
702
708
|
p2pMessageIdentifier: identifier,
|
|
703
709
|
sourcePeer: this.node.peerId.toString()
|
|
@@ -730,8 +736,8 @@ _ts_decorate([
|
|
|
730
736
|
], LibP2PService.prototype, "processValidBlockProposal", null);
|
|
731
737
|
_ts_decorate([
|
|
732
738
|
trackSpan('Libp2pService.broadcastAttestation', async (attestation)=>({
|
|
733
|
-
[Attributes.BLOCK_NUMBER]: attestation.
|
|
734
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.
|
|
739
|
+
[Attributes.BLOCK_NUMBER]: attestation.blockNumber.toNumber(),
|
|
740
|
+
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber.toNumber(),
|
|
735
741
|
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
736
742
|
[Attributes.P2P_ID]: await attestation.p2pMessageIdentifier().then((i)=>i.toString())
|
|
737
743
|
}))
|
|
@@ -748,14 +754,14 @@ _ts_decorate([
|
|
|
748
754
|
], LibP2PService.prototype, "validatePropagatedTx", null);
|
|
749
755
|
_ts_decorate([
|
|
750
756
|
trackSpan('Libp2pService.validateAttestation', async (_, attestation)=>({
|
|
751
|
-
[Attributes.BLOCK_NUMBER]: attestation.
|
|
752
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.
|
|
757
|
+
[Attributes.BLOCK_NUMBER]: attestation.blockNumber.toNumber(),
|
|
758
|
+
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber.toNumber(),
|
|
753
759
|
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
754
760
|
[Attributes.P2P_ID]: await attestation.p2pMessageIdentifier().then((i)=>i.toString())
|
|
755
761
|
}))
|
|
756
762
|
], LibP2PService.prototype, "validateAttestation", null);
|
|
757
763
|
_ts_decorate([
|
|
758
764
|
trackSpan('Libp2pService.validateBlockProposal', (_peerId, block)=>({
|
|
759
|
-
[Attributes.SLOT_NUMBER]: block.payload.header.
|
|
765
|
+
[Attributes.SLOT_NUMBER]: block.payload.header.slotNumber.toString()
|
|
760
766
|
}))
|
|
761
767
|
], LibP2PService.prototype, "validateBlockProposal", null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,MAAM,EAIZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,aAAa,EAAuB,MAAM,+BAA+B,CAAC;AAExF,qBAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,MAAM,EAIZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,aAAa,EAAuB,MAAM,+BAA+B,CAAC;AAExF,qBAAa,kBAAkB;aAQX,eAAe,EAAE,eAAe;IAPlD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,SAAS,CAAQ;IAEzB,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAGb,eAAe,GAAE,eAAsC,EACvE,IAAI,SAAgB;IAsBf,iBAAiB,CAAC,MAAM,EAAE,aAAa;IAIvC,qBAAqB,CAAC,MAAM,EAAE,aAAa;IAI3C,eAAe,CAAC,KAAK,EAAE,MAAM;CAGrC"}
|
|
@@ -25,7 +25,7 @@ export declare class PeerManager {
|
|
|
25
25
|
private privatePeersInitialized;
|
|
26
26
|
private metrics;
|
|
27
27
|
private handlers;
|
|
28
|
-
constructor(libP2PNode: PubSubLibp2p, peerDiscoveryService: PeerDiscoveryService, config: P2PConfig, telemetryClient: TelemetryClient, logger: import("@aztec/foundation/log").Logger, peerScoring: PeerScoring, reqresp: ReqResp);
|
|
28
|
+
constructor(libP2PNode: PubSubLibp2p, peerDiscoveryService: PeerDiscoveryService, config: P2PConfig, telemetryClient: TelemetryClient, logger: import("@aztec/foundation/log").Logger | undefined, peerScoring: PeerScoring, reqresp: ReqResp);
|
|
29
29
|
/**
|
|
30
30
|
* Initializes the trusted peers.
|
|
31
31
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,eAAe,EAAa,MAAM,yBAAyB,CAAC;AAG1E,OAAO,KAAK,EAAc,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,aAAa,EAAuB,MAAM,iCAAiC,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,eAAe,EAAa,MAAM,yBAAyB,CAAC;AAG1E,OAAO,KAAK,EAAc,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,aAAa,EAAuB,MAAM,iCAAiC,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAqBrE,qBAAa,WAAW;IAkBpB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;IAvBjB,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;IAEjD,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAId;gBAGQ,UAAU,EAAE,YAAY,EACxB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,SAAS,EACzB,eAAe,EAAE,eAAe,EACxB,MAAM,oDAAmC,EACzC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO;IAwB1B;;;;OAIG;IACG,eAAe;IA8BrB,IAAI,MAAM,6CAET;IAGM,SAAS;IAShB;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAShC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IASnC;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAQrB;;;OAGG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ3C;;;OAGG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAU3C;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAQrB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;;OAMG;IACI,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa;IAQrD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB;IAIvD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIpC,QAAQ,CAAC,cAAc,UAAQ,GAAG,QAAQ,EAAE;IAiCnD;;OAEG;IACH,OAAO,CAAC,QAAQ;IAkEhB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,mBAAmB;IAoB3B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAwBvB;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;YAuBb,wBAAwB;YA6BxB,cAAc;IAQ5B;;;OAGG;YACW,oBAAoB;YA8DpB,QAAQ;IA2BtB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,gBAAgB;IAsBxB;;;OAGG;IACU,IAAI;CAYlB"}
|
|
@@ -11,12 +11,14 @@ import { inspect } from 'util';
|
|
|
11
11
|
import { PeerEvent } from '../../types/index.js';
|
|
12
12
|
import { ReqRespSubProtocol } from '../reqresp/interface.js';
|
|
13
13
|
import { GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/goodbye.js';
|
|
14
|
+
import { ReqRespStatus } from '../reqresp/status.js';
|
|
14
15
|
import { PeerManagerMetrics } from './metrics.js';
|
|
15
16
|
import { PeerScoreState } from './peer_scoring.js';
|
|
16
17
|
const MAX_DIAL_ATTEMPTS = 3;
|
|
17
18
|
const MAX_CACHED_PEERS = 100;
|
|
18
19
|
const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
19
20
|
const FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
|
|
21
|
+
const GOODBYE_DIAL_TIMEOUT_MS = 1000;
|
|
20
22
|
export class PeerManager {
|
|
21
23
|
libP2PNode;
|
|
22
24
|
peerDiscoveryService;
|
|
@@ -356,9 +358,16 @@ export class PeerManager {
|
|
|
356
358
|
this.logger.debug(`Disconnecting peer ${peer.toString()} with reason ${prettyGoodbyeReason(reason)}`);
|
|
357
359
|
this.metrics.recordGoodbyeSent(reason);
|
|
358
360
|
try {
|
|
359
|
-
await this.reqresp.sendRequestToPeer(peer, ReqRespSubProtocol.GOODBYE, Buffer.from([
|
|
361
|
+
const resp = await this.reqresp.sendRequestToPeer(peer, ReqRespSubProtocol.GOODBYE, Buffer.from([
|
|
360
362
|
reason
|
|
361
|
-
]));
|
|
363
|
+
]), GOODBYE_DIAL_TIMEOUT_MS);
|
|
364
|
+
if (resp.status === ReqRespStatus.FAILURE) {
|
|
365
|
+
this.logger.debug(`Failed to send goodbye to peer ${peer.toString()}`);
|
|
366
|
+
} else if (resp.status === ReqRespStatus.SUCCESS) {
|
|
367
|
+
this.logger.verbose(`Sent goodbye to peer ${peer.toString()}`);
|
|
368
|
+
} else {
|
|
369
|
+
this.logger.debug(`Unexpected status sending goodbye to peer ${peer.toString()}: ${ReqRespStatus[resp.status]}`);
|
|
370
|
+
}
|
|
362
371
|
} catch (error) {
|
|
363
372
|
this.logger.debug(`Failed to send goodbye to peer ${peer.toString()}: ${error}`);
|
|
364
373
|
} finally{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch_connection_sampler.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/connection-sampler/batch_connection_sampler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,qBAAa,sBAAsB;
|
|
1
|
+
{"version":3,"file":"batch_connection_sampler.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/connection-sampler/batch_connection_sampler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,qBAAa,sBAAsB;IAM/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IALpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwD;IAC/E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAGtB,iBAAiB,EAAE,iBAAiB,EACrD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM;IAgBlB;;;;;OAKG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAUpD;;;;;OAKG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAmB1C;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;CACF"}
|
|
@@ -15,7 +15,7 @@ export declare class ConnectionSampler {
|
|
|
15
15
|
private readonly sampler;
|
|
16
16
|
private readonly logger;
|
|
17
17
|
private cleanupInterval;
|
|
18
|
-
private
|
|
18
|
+
private dialAttempts;
|
|
19
19
|
private readonly activeConnectionsCount;
|
|
20
20
|
private readonly streams;
|
|
21
21
|
private dialQueue;
|
|
@@ -62,7 +62,7 @@ export declare class ConnectionSampler {
|
|
|
62
62
|
* @param protocol - The protocol
|
|
63
63
|
* @returns The stream
|
|
64
64
|
*/
|
|
65
|
-
dialProtocol(peerId: PeerId, protocol: string): Promise<Stream>;
|
|
65
|
+
dialProtocol(peerId: PeerId, protocol: string, timeout?: number): Promise<Stream>;
|
|
66
66
|
/**
|
|
67
67
|
* Closes a stream and updates the active connections count
|
|
68
68
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection_sampler.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/connection-sampler/connection_sampler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAShE,qBAAa,aAAa;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM;CAGnB;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAY1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkD;IACzE,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"connection_sampler.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/connection-sampler/connection_sampler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAShE,qBAAa,aAAa;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM;CAGnB;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAY1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkD;IACzE,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,YAAY,CAAyB;IAE7C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAkC;IACzE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAGnE,OAAO,CAAC,SAAS,CAAkC;gBAGhC,MAAM,EAAE,MAAM,EACd,iBAAiB,GAAE,MAAc,EAAE,sBAAsB;IACzD,OAAO,GAAE,aAAmC;IAO/D;;OAEG;IACG,IAAI;IAgBV;;;;;OAKG;IACH,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS;IAO7D;;;;;;;;;;;OAWG;IACH,eAAe,CACb,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B;QACD,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QACzB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB;IAuCD;;;;;OAKG;IACH,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE;IAyClD;;;;;;OAMG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwCvF;;;;OAIG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B5C;;OAEG;YACW,uBAAuB;CAetC"}
|
|
@@ -18,7 +18,7 @@ export class RandomSampler {
|
|
|
18
18
|
sampler;
|
|
19
19
|
logger;
|
|
20
20
|
cleanupInterval;
|
|
21
|
-
|
|
21
|
+
dialAttempts;
|
|
22
22
|
activeConnectionsCount;
|
|
23
23
|
streams;
|
|
24
24
|
// Serial queue to ensure that we only dial one peer at a time
|
|
@@ -28,7 +28,7 @@ export class RandomSampler {
|
|
|
28
28
|
this.cleanupIntervalMs = cleanupIntervalMs;
|
|
29
29
|
this.sampler = sampler;
|
|
30
30
|
this.logger = createLogger('p2p:reqresp:connection-sampler');
|
|
31
|
-
this.
|
|
31
|
+
this.dialAttempts = [];
|
|
32
32
|
this.activeConnectionsCount = new Map();
|
|
33
33
|
this.streams = new Map();
|
|
34
34
|
this.dialQueue = new SerialQueue();
|
|
@@ -40,7 +40,10 @@ export class RandomSampler {
|
|
|
40
40
|
*/ async stop() {
|
|
41
41
|
this.logger.info('Stopping connection sampler');
|
|
42
42
|
clearInterval(this.cleanupInterval);
|
|
43
|
-
this.
|
|
43
|
+
for (const attempt of this.dialAttempts){
|
|
44
|
+
attempt.abort();
|
|
45
|
+
}
|
|
46
|
+
this.dialAttempts = [];
|
|
44
47
|
await this.dialQueue.end();
|
|
45
48
|
// Close all active streams
|
|
46
49
|
const closePromises = Array.from(this.streams.keys()).map((streamId)=>this.close(streamId));
|
|
@@ -157,25 +160,42 @@ export class RandomSampler {
|
|
|
157
160
|
* @param peerId - The peer id
|
|
158
161
|
* @param protocol - The protocol
|
|
159
162
|
* @returns The stream
|
|
160
|
-
*/ async dialProtocol(peerId, protocol) {
|
|
163
|
+
*/ async dialProtocol(peerId, protocol, timeout) {
|
|
161
164
|
// Dialling at the same time can cause race conditions where two different streams
|
|
162
165
|
// end up with the same id, hence a serial queue
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
166
|
+
this.logger.debug(`Dial queue length: ${this.dialQueue.length()}`);
|
|
167
|
+
const abortController = new AbortController();
|
|
168
|
+
this.dialAttempts.push(abortController);
|
|
169
|
+
let timeoutHandle;
|
|
170
|
+
if (timeout) {
|
|
171
|
+
timeoutHandle = setTimeout(()=>abortController.abort(), timeout);
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
const stream = await this.dialQueue.put(()=>this.libp2p.dialProtocol(peerId, protocol, {
|
|
175
|
+
signal: abortController.signal
|
|
176
|
+
}));
|
|
177
|
+
this.streams.set(stream.id, {
|
|
178
|
+
stream,
|
|
179
|
+
peerId
|
|
180
|
+
});
|
|
181
|
+
const updatedActiveConnectionsCount = (this.activeConnectionsCount.get(peerId) ?? 0) + 1;
|
|
182
|
+
this.activeConnectionsCount.set(peerId, updatedActiveConnectionsCount);
|
|
183
|
+
this.logger.trace('Dialed protocol', {
|
|
184
|
+
streamId: stream.id,
|
|
185
|
+
protocol,
|
|
186
|
+
peerId: peerId.toString(),
|
|
187
|
+
activeConnectionsCount: updatedActiveConnectionsCount
|
|
188
|
+
});
|
|
189
|
+
return stream;
|
|
190
|
+
} finally{
|
|
191
|
+
if (timeoutHandle) {
|
|
192
|
+
clearTimeout(timeoutHandle);
|
|
193
|
+
}
|
|
194
|
+
const idx = this.dialAttempts.indexOf(abortController);
|
|
195
|
+
if (idx > -1) {
|
|
196
|
+
this.dialAttempts.splice(idx, 1);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
179
199
|
}
|
|
180
200
|
/**
|
|
181
201
|
* Closes a stream and updates the active connections count
|
|
@@ -185,7 +205,7 @@ export class RandomSampler {
|
|
|
185
205
|
try {
|
|
186
206
|
const streamAndPeerId = this.streams.get(streamId);
|
|
187
207
|
if (!streamAndPeerId) {
|
|
188
|
-
this.logger.
|
|
208
|
+
this.logger.debug(`Stream ${streamId} not found`);
|
|
189
209
|
return;
|
|
190
210
|
}
|
|
191
211
|
const { stream, peerId } = streamAndPeerId;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
3
1
|
import type { PeerId } from '@libp2p/interface';
|
|
4
2
|
import type { ReqRespStatus } from './status.js';
|
|
5
3
|
export declare const PING_PROTOCOL = "/aztec/req/ping/0.1.0";
|
|
@@ -103,7 +101,7 @@ interface RequestResponsePair<Req extends {
|
|
|
103
101
|
export declare class RequestableBuffer {
|
|
104
102
|
buffer: Buffer;
|
|
105
103
|
constructor(buffer: Buffer);
|
|
106
|
-
toBuffer(): Buffer
|
|
104
|
+
toBuffer(): Buffer<ArrayBufferLike>;
|
|
107
105
|
static fromBuffer(buffer: Buffer): RequestableBuffer;
|
|
108
106
|
}
|
|
109
107
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/interface.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/interface.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,eAAO,MAAM,aAAa,0BAA0B,CAAC;AACrD,eAAO,MAAM,eAAe,4BAA4B,CAAC;AACzD,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAC3D,eAAO,MAAM,eAAe,wBAAwB,CAAC;AACrD,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAE3D,oBAAY,kBAAkB;IAC5B,IAAI,0BAAgB;IACpB,MAAM,4BAAkB;IACxB,OAAO,6BAAmB;IAC1B,EAAE,wBAAkB;IACpB,KAAK,2BAAqB;CAC3B;AAED;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEzF;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;AAE9F;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,SAAS,EAAE,cAAc,CAAC;IAC1B;;OAEG;IACH,WAAW,EAAE,cAAc,CAAC;CAC7B;AAED,eAAO,MAAM,aAAa,wBAA8B,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,CAAC;AAE/F,KAAK,iBAAiB,CAAC,iBAAiB,EAAE,QAAQ,IAAI,CACpD,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,MAAM,4BAA4B,GAAG;KACxC,CAAC,IAAI,kBAAkB,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,4BAM7C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;KAC1B,CAAC,IAAI,kBAAkB,GAAG,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC;CACzD,CAAC;AAUF;;GAEG;AACH,eAAO,MAAM,6BAA6B,EAAE,0BAM3C,CAAC;AAEF;;;GAGG;AACH,UAAU,mBAAmB,CAAC,GAAG,SAAS;IAAE,QAAQ,IAAI,MAAM,CAAA;CAAE,EAAE,GAAG;IACnE;;OAEG;IACH,OAAO,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IACrC;;OAEG;IACH,QAAQ,EAAE;QACR,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;QAC1B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;KACjC,CAAC;CACH;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IACT,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;IAEjC,QAAQ;IAIR,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM;CAGjC;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,cAqB5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/metrics.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAiB,MAAM,yBAAyB,CAAC;AAEtF,qBAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/metrics.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAiB,MAAM,yBAAyB,CAAC;AAEtF,qBAAa,cAAc;IAUvB,QAAQ,CAAC,eAAe,EAAE,eAAe;IAT3C,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgB;IAEjD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAgB;IACvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgB;gBAG3C,eAAe,EAAE,eAAe,EACzC,IAAI,SAAY;IA6BX,iBAAiB,CAAC,QAAQ,EAAE,MAAM;IAIlC,qBAAqB,CAAC,QAAQ,EAAE,MAAM;IAItC,kBAAkB,CAAC,QAAQ,EAAE,MAAM;IAInC,mBAAmB,CAAC,QAAQ,EAAE,MAAM;CAG5C"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
3
1
|
import type { PeerId } from '@libp2p/interface';
|
|
4
2
|
import type { PeerManager } from '../../peer-manager/peer_manager.js';
|
|
5
3
|
import { type ReqRespSubProtocolHandler } from '../interface.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goodbye.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/goodbye.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"goodbye.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/goodbye.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAsB,KAAK,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;GAEG;AACH,oBAAY,aAAa;IACvB,0FAA0F;IAC1F,QAAQ,IAAM;IACd,sIAAsI;IACtI,SAAS,IAAM;IACf,gFAAgF;IAChF,SAAS,IAAM;IACf,2EAA2E;IAC3E,MAAM,IAAM;IACZ,2BAA2B;IAC3B,aAAa,IAAM;IACnB,qBAAqB;IACrB,OAAO,IAAM;CACd;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAEjE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CASjE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAgBjE;AAED;;GAEG;AACH,qBAAa,sBAAsB;IAGrB,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,MAAM,CAAwC;gBAElC,OAAO,EAAE,OAAO;IAEvB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ/E;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,yBAAyB,CASrF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/ping.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/ping.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAExD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate_limiter.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/rate-limiter/rate_limiter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAMxF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,GAAG,CAAS;IAEpB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC;;;OAGG;gBACS,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAMnD,KAAK,IAAI,OAAO;CAWjB;AASD,oBAAY,eAAe;IACzB,YAAY,IAAA;IACZ,UAAU,IAAA;IACV,OAAO,IAAA;CACR;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,eAAe,6CASjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;IAOhH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;IAwBtC,oBAAoB;CAQrB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,0BAA0B;
|
|
1
|
+
{"version":3,"file":"rate_limiter.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/rate-limiter/rate_limiter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAMxF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,GAAG,CAAS;IAEpB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC;;;OAGG;gBACS,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAMnD,KAAK,IAAI,OAAO;CAWjB;AASD,oBAAY,eAAe;IACzB,YAAY,IAAA;IACZ,UAAU,IAAA;IACV,OAAO,IAAA;CACR;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,eAAe,6CASjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;IAOhH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;IAwBtC,oBAAoB;CAQrB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,0BAA0B;IAMnC,OAAO,CAAC,WAAW;IALrB,OAAO,CAAC,uBAAuB,CAAkD;IAEjF,OAAO,CAAC,eAAe,CAAyC;gBAGtD,WAAW,EAAE,WAAW,EAChC,UAAU,GAAE,4BAAkD;IAiBhE,KAAK;IAML,KAAK,CAAC,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe;IAavE,oBAAoB;IAIpB;;OAEG;IACH,IAAI;CAGL"}
|