@aztec/p2p 0.0.1-commit.87a0206 → 0.0.1-commit.8f9871590
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 +3 -3
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +42 -8
- package/dest/client/interface.d.ts +30 -15
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +33 -35
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +107 -137
- package/dest/config.d.ts +22 -4
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +16 -1
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +21 -12
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +67 -37
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- 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 +53 -53
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -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/index.d.ts +2 -1
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/interface.d.ts +3 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +102 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +242 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +3 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +5 -3
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +3 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +3 -1
- package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +7 -3
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +28 -4
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +37 -4
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +8 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +15 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +4 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +110 -78
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- package/dest/services/dummy_service.d.ts +6 -2
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +3 -0
- package/dest/services/encoding.d.ts +2 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +2 -2
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +161 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +324 -0
- package/dest/services/libp2p/libp2p_service.d.ts +11 -3
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +91 -67
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +25 -2
- package/dest/services/reqresp/interface.d.ts +10 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +15 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +15 -0
- package/dest/services/reqresp/protocols/tx.d.ts +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +11 -4
- package/dest/services/service.d.ts +18 -1
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +19 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +46 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +17 -3
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +165 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +28 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +59 -0
- package/dest/services/tx_collection/index.d.ts +2 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +6 -2
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +55 -23
- package/dest/services/tx_collection/tx_collection.d.ts +19 -7
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +75 -3
- package/dest/services/tx_collection/tx_collection_sink.d.ts +15 -6
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +13 -7
- package/dest/services/tx_file_store/config.d.ts +1 -3
- package/dest/services/tx_file_store/config.d.ts.map +1 -1
- package/dest/services/tx_file_store/config.js +0 -4
- package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +8 -5
- package/dest/services/tx_provider.d.ts +3 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +5 -4
- package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.d.ts +27 -1
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +97 -2
- package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +2 -1
- package/dest/test-helpers/testbench-utils.d.ts +32 -24
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +103 -36
- package/dest/testbench/p2p_client_testbench_worker.js +3 -3
- package/package.json +14 -14
- package/src/client/factory.ts +78 -9
- package/src/client/interface.ts +32 -13
- package/src/client/p2p_client.ts +135 -157
- package/src/config.ts +34 -2
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +95 -44
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +57 -53
- package/src/mem_pools/attestation_pool/index.ts +3 -3
- package/src/mem_pools/attestation_pool/mocks.ts +2 -1
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/interface.ts +2 -2
- package/src/mem_pools/tx_pool/README.md +1 -1
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/README.md +76 -10
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +310 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +3 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +1 -1
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +3 -1
- package/src/mem_pools/tx_pool_v2/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +8 -2
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +57 -7
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +18 -2
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +7 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +122 -80
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
- package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
- package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
- package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
- package/src/services/dummy_service.ts +6 -0
- package/src/services/encoding.ts +2 -2
- package/src/services/gossipsub/README.md +626 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +451 -0
- package/src/services/libp2p/libp2p_service.ts +91 -70
- package/src/services/peer-manager/peer_scoring.ts +25 -0
- package/src/services/reqresp/interface.ts +26 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
- package/src/services/reqresp/protocols/tx.ts +22 -0
- package/src/services/reqresp/reqresp.ts +13 -3
- package/src/services/service.ts +20 -0
- package/src/services/tx_collection/config.ts +68 -0
- package/src/services/tx_collection/fast_tx_collection.ts +14 -2
- package/src/services/tx_collection/file_store_tx_collection.ts +198 -0
- package/src/services/tx_collection/file_store_tx_source.ts +73 -0
- package/src/services/tx_collection/index.ts +1 -0
- package/src/services/tx_collection/slow_tx_collection.ts +64 -30
- package/src/services/tx_collection/tx_collection.ts +109 -13
- package/src/services/tx_collection/tx_collection_sink.ts +17 -7
- package/src/services/tx_file_store/config.ts +0 -6
- package/src/services/tx_file_store/tx_file_store.ts +9 -7
- package/src/services/tx_provider.ts +8 -7
- package/src/test-helpers/make-test-p2p-clients.ts +3 -3
- package/src/test-helpers/mock-pubsub.ts +133 -3
- package/src/test-helpers/reqresp-nodes.ts +2 -1
- package/src/test-helpers/testbench-utils.ts +117 -40
- package/src/testbench/p2p_client_testbench_worker.ts +3 -3
|
@@ -372,7 +372,6 @@ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
|
372
372
|
}
|
|
373
373
|
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _initProto;
|
|
374
374
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
375
|
-
import { randomInt } from '@aztec/foundation/crypto/random';
|
|
376
375
|
import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
377
376
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
378
377
|
import { Timer } from '@aztec/foundation/timer';
|
|
@@ -384,7 +383,7 @@ import { Tx } from '@aztec/stdlib/tx';
|
|
|
384
383
|
import { compressComponentVersions } from '@aztec/stdlib/versioning';
|
|
385
384
|
import { Attributes, OtelMetricsAdapter, SpanStatusCode, WithTracer, trackSpan } from '@aztec/telemetry-client';
|
|
386
385
|
import { gossipsub } from '@chainsafe/libp2p-gossipsub';
|
|
387
|
-
import { createPeerScoreParams
|
|
386
|
+
import { createPeerScoreParams } from '@chainsafe/libp2p-gossipsub/score';
|
|
388
387
|
import { SignaturePolicy } from '@chainsafe/libp2p-gossipsub/types';
|
|
389
388
|
import { noise } from '@chainsafe/libp2p-noise';
|
|
390
389
|
import { yamux } from '@chainsafe/libp2p-yamux';
|
|
@@ -404,7 +403,8 @@ import { getVersions } from '../../versioning.js';
|
|
|
404
403
|
import { AztecDatastore } from '../data_store.js';
|
|
405
404
|
import { DiscV5Service } from '../discv5/discV5_service.js';
|
|
406
405
|
import { SnappyTransform, fastMsgIdFn, getMsgIdFn, msgIdToStrFn } from '../encoding.js';
|
|
407
|
-
import { gossipScoreThresholds } from '../gossipsub/scoring.js';
|
|
406
|
+
import { APP_SPECIFIC_WEIGHT, gossipScoreThresholds } from '../gossipsub/scoring.js';
|
|
407
|
+
import { createAllTopicScoreParams } from '../gossipsub/topic_score_params.js';
|
|
408
408
|
import { PeerManager } from '../peer-manager/peer_manager.js';
|
|
409
409
|
import { PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
410
410
|
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError } from '../reqresp/index.js';
|
|
@@ -517,6 +517,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
517
517
|
topicStrings;
|
|
518
518
|
feesCache;
|
|
519
519
|
/** Callback invoked when a duplicate proposal is detected (triggers slashing). */ duplicateProposalCallback;
|
|
520
|
+
/** Callback invoked when a duplicate attestation is detected (triggers slashing). */ duplicateAttestationCallback;
|
|
520
521
|
/**
|
|
521
522
|
* Callback for when a block is received from a peer.
|
|
522
523
|
* @param block - The block received from the peer.
|
|
@@ -595,10 +596,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
595
596
|
}
|
|
596
597
|
const versions = getVersions(config);
|
|
597
598
|
const protocolVersion = compressComponentVersions(versions);
|
|
598
|
-
const txTopic = createTopicString(TopicType.tx, protocolVersion);
|
|
599
|
-
const blockProposalTopic = createTopicString(TopicType.block_proposal, protocolVersion);
|
|
600
|
-
const checkpointProposalTopic = createTopicString(TopicType.checkpoint_proposal, protocolVersion);
|
|
601
|
-
const checkpointAttestationTopic = createTopicString(TopicType.checkpoint_attestation, protocolVersion);
|
|
602
599
|
const preferredPeersEnrs = config.preferredPeers.map((enr)=>ENR.decodeTxt(enr));
|
|
603
600
|
const directPeers = (await Promise.all(preferredPeersEnrs.map(async (enr)=>{
|
|
604
601
|
const peerId = await enr.peerId();
|
|
@@ -616,6 +613,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
616
613
|
const announceTcpMultiaddr = config.p2pIp ? [
|
|
617
614
|
convertToMultiaddr(config.p2pIp, p2pPort, 'tcp')
|
|
618
615
|
] : [];
|
|
616
|
+
// Create dynamic topic score params based on network configuration
|
|
617
|
+
const l1Constants = epochCache.getL1Constants();
|
|
618
|
+
const topicScoreParams = createAllTopicScoreParams(protocolVersion, {
|
|
619
|
+
slotDurationMs: l1Constants.slotDuration * 1000,
|
|
620
|
+
heartbeatIntervalMs: config.gossipsubInterval,
|
|
621
|
+
targetCommitteeSize: l1Constants.targetCommitteeSize,
|
|
622
|
+
blockDurationMs: config.blockDurationMs
|
|
623
|
+
});
|
|
619
624
|
const node = await createLibp2p({
|
|
620
625
|
start: false,
|
|
621
626
|
peerId,
|
|
@@ -716,28 +721,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
716
721
|
scoreParams: createPeerScoreParams({
|
|
717
722
|
// IPColocation factor can be disabled for local testing - default to -5
|
|
718
723
|
IPColocationFactorWeight: config.debugDisableColocationPenalty ? 0 : -5.0,
|
|
719
|
-
topics:
|
|
720
|
-
[txTopic]: createTopicScoreParams({
|
|
721
|
-
topicWeight: 1,
|
|
722
|
-
invalidMessageDeliveriesWeight: -20,
|
|
723
|
-
invalidMessageDeliveriesDecay: 0.5
|
|
724
|
-
}),
|
|
725
|
-
[blockProposalTopic]: createTopicScoreParams({
|
|
726
|
-
topicWeight: 1,
|
|
727
|
-
invalidMessageDeliveriesWeight: -20,
|
|
728
|
-
invalidMessageDeliveriesDecay: 0.5
|
|
729
|
-
}),
|
|
730
|
-
[checkpointProposalTopic]: createTopicScoreParams({
|
|
731
|
-
topicWeight: 1,
|
|
732
|
-
invalidMessageDeliveriesWeight: -20,
|
|
733
|
-
invalidMessageDeliveriesDecay: 0.5
|
|
734
|
-
}),
|
|
735
|
-
[checkpointAttestationTopic]: createTopicScoreParams({
|
|
736
|
-
topicWeight: 1,
|
|
737
|
-
invalidMessageDeliveriesWeight: -20,
|
|
738
|
-
invalidMessageDeliveriesDecay: 0.5
|
|
739
|
-
})
|
|
740
|
-
}
|
|
724
|
+
topics: topicScoreParams
|
|
741
725
|
})
|
|
742
726
|
}),
|
|
743
727
|
components: (components)=>({
|
|
@@ -749,8 +733,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
749
733
|
const peerScoring = new PeerScoring(config, telemetry);
|
|
750
734
|
const reqresp = new ReqResp(config, node, peerScoring, createLogger(`${logger.module}:reqresp`));
|
|
751
735
|
const peerManager = new PeerManager(node, peerDiscoveryService, config, telemetry, createLogger(`${logger.module}:peer_manager`), peerScoring, reqresp, worldStateSynchronizer, protocolVersion, epochCache);
|
|
752
|
-
//
|
|
753
|
-
|
|
736
|
+
// Configure application-specific scoring for gossipsub.
|
|
737
|
+
// The weight scales app score to align with gossipsub thresholds:
|
|
738
|
+
// - Disconnect (-50) × 10 = -500 = gossipThreshold (stops receiving gossip)
|
|
739
|
+
// - Ban (-100) × 10 = -1000 = publishThreshold (cannot publish)
|
|
740
|
+
// Note: positive topic scores can offset penalties, so alignment is best-effort.
|
|
741
|
+
node.services.pubsub.score.params.appSpecificWeight = APP_SPECIFIC_WEIGHT;
|
|
754
742
|
node.services.pubsub.score.params.appSpecificScore = (peerId)=>peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
|
|
755
743
|
return new LibP2PService(clientType, config, node, peerDiscoveryService, reqresp, peerManager, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger);
|
|
756
744
|
}
|
|
@@ -886,6 +874,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
886
874
|
this.duplicateProposalCallback = callback;
|
|
887
875
|
}
|
|
888
876
|
/**
|
|
877
|
+
* Registers a callback to be invoked when a duplicate attestation is detected.
|
|
878
|
+
* A validator signing attestations for different proposals at the same slot.
|
|
879
|
+
* This callback is triggered on the first duplicate (when count goes from 1 to 2).
|
|
880
|
+
*/ registerDuplicateAttestationCallback(callback) {
|
|
881
|
+
this.duplicateAttestationCallback = callback;
|
|
882
|
+
}
|
|
883
|
+
/**
|
|
889
884
|
* Subscribes to a topic.
|
|
890
885
|
* @param topic - The topic to subscribe to.
|
|
891
886
|
*/ subscribeToTopic(topic) {
|
|
@@ -1067,25 +1062,42 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1067
1062
|
const validationFunc = async ()=>{
|
|
1068
1063
|
const tx = Tx.fromBuffer(payloadData);
|
|
1069
1064
|
const isValid = await this.validatePropagatedTx(tx, source);
|
|
1070
|
-
|
|
1065
|
+
if (!isValid) {
|
|
1066
|
+
this.logger.trace(`Rejecting invalid propagated tx`, {
|
|
1067
|
+
[Attributes.P2P_ID]: source.toString()
|
|
1068
|
+
});
|
|
1069
|
+
return {
|
|
1070
|
+
result: TopicValidatorResult.Reject
|
|
1071
|
+
};
|
|
1072
|
+
}
|
|
1073
|
+
// Propagate only on pool acceptance
|
|
1074
|
+
const txHash = tx.getTxHash();
|
|
1075
|
+
const addResult = await this.mempools.txPool.addPendingTxs([
|
|
1076
|
+
tx
|
|
1077
|
+
], {
|
|
1078
|
+
source: 'gossip'
|
|
1079
|
+
});
|
|
1080
|
+
const wasAccepted = addResult.accepted.some((h)=>h.equals(txHash));
|
|
1081
|
+
const wasIgnored = addResult.ignored.some((h)=>h.equals(txHash));
|
|
1071
1082
|
this.logger.trace(`Validate propagated tx`, {
|
|
1072
1083
|
isValid,
|
|
1073
|
-
|
|
1084
|
+
wasAccepted,
|
|
1085
|
+
wasIgnored,
|
|
1074
1086
|
[Attributes.P2P_ID]: source.toString()
|
|
1075
1087
|
});
|
|
1076
|
-
if (
|
|
1088
|
+
if (wasAccepted) {
|
|
1077
1089
|
return {
|
|
1078
|
-
result: TopicValidatorResult.
|
|
1090
|
+
result: TopicValidatorResult.Accept,
|
|
1091
|
+
obj: tx
|
|
1079
1092
|
};
|
|
1080
|
-
} else if (
|
|
1093
|
+
} else if (wasIgnored) {
|
|
1081
1094
|
return {
|
|
1082
1095
|
result: TopicValidatorResult.Ignore,
|
|
1083
1096
|
obj: tx
|
|
1084
1097
|
};
|
|
1085
1098
|
} else {
|
|
1086
1099
|
return {
|
|
1087
|
-
result: TopicValidatorResult.
|
|
1088
|
-
obj: tx
|
|
1100
|
+
result: TopicValidatorResult.Reject
|
|
1089
1101
|
};
|
|
1090
1102
|
}
|
|
1091
1103
|
};
|
|
@@ -1093,20 +1105,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1093
1105
|
if (result !== TopicValidatorResult.Accept || !tx) {
|
|
1094
1106
|
return;
|
|
1095
1107
|
}
|
|
1108
|
+
// Tx was accepted into pool and will be propagated - just log and record metrics
|
|
1096
1109
|
const txHash = tx.getTxHash();
|
|
1097
1110
|
const txHashString = txHash.toString();
|
|
1098
1111
|
this.logger.verbose(`Received tx ${txHashString} from external peer ${source.toString()} via gossip`, {
|
|
1099
1112
|
source: source.toString(),
|
|
1100
1113
|
txHash: txHashString
|
|
1101
1114
|
});
|
|
1102
|
-
if (this.config.dropTransactions && randomInt(1000) < this.config.dropTransactionsProbability * 1000) {
|
|
1103
|
-
this.logger.warn(`Intentionally dropping tx ${txHashString} (probability rule)`);
|
|
1104
|
-
return;
|
|
1105
|
-
}
|
|
1106
1115
|
this.instrumentation.incrementTxReceived(1);
|
|
1107
|
-
await this.mempools.txPool.addTxs([
|
|
1108
|
-
tx
|
|
1109
|
-
]);
|
|
1110
1116
|
}
|
|
1111
1117
|
/**
|
|
1112
1118
|
* Process a checkpoint attestation from a peer.
|
|
@@ -1138,38 +1144,56 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1138
1144
|
obj: attestation
|
|
1139
1145
|
};
|
|
1140
1146
|
}
|
|
1141
|
-
// Get committee size for the attestation's slot
|
|
1142
|
-
const slot = attestation.payload.header.slotNumber;
|
|
1143
|
-
const { committee } = await this.epochCache.getCommittee(slot);
|
|
1144
|
-
const committeeSize = committee?.length ?? 0;
|
|
1145
1147
|
// Try to add the attestation: this handles existence check, cap check, and adding in one call
|
|
1146
|
-
|
|
1148
|
+
// count is the number of attestations by this signer for this slot (for duplicate detection)
|
|
1149
|
+
const slot = attestation.payload.header.slotNumber;
|
|
1150
|
+
const { added, alreadyExists, count } = await this.mempools.attestationPool.tryAddCheckpointAttestation(attestation);
|
|
1147
1151
|
this.logger.trace(`Validate propagated checkpoint attestation`, {
|
|
1148
1152
|
added,
|
|
1149
1153
|
alreadyExists,
|
|
1154
|
+
count,
|
|
1150
1155
|
[Attributes.SLOT_NUMBER]: slot.toString(),
|
|
1151
1156
|
[Attributes.P2P_ID]: peerId.toString()
|
|
1152
1157
|
});
|
|
1153
|
-
//
|
|
1158
|
+
// Exact same attestation received, no need to re-broadcast
|
|
1154
1159
|
if (alreadyExists) {
|
|
1155
1160
|
return {
|
|
1156
1161
|
result: TopicValidatorResult.Ignore,
|
|
1157
1162
|
obj: attestation
|
|
1158
1163
|
};
|
|
1159
1164
|
}
|
|
1160
|
-
// Could not add (cap reached), no need to re-broadcast
|
|
1165
|
+
// Could not add (cap reached for signer), no need to re-broadcast
|
|
1161
1166
|
if (!added) {
|
|
1162
|
-
this.logger.warn(`Dropping checkpoint attestation due to
|
|
1167
|
+
this.logger.warn(`Dropping checkpoint attestation due to cap`, {
|
|
1163
1168
|
slot: slot.toString(),
|
|
1164
1169
|
archive: attestation.archive.toString(),
|
|
1165
|
-
source: peerId.toString()
|
|
1170
|
+
source: peerId.toString(),
|
|
1171
|
+
attester: attestation.getSender()?.toString(),
|
|
1172
|
+
count
|
|
1166
1173
|
});
|
|
1167
1174
|
return {
|
|
1168
1175
|
result: TopicValidatorResult.Ignore,
|
|
1169
1176
|
obj: attestation
|
|
1170
1177
|
};
|
|
1171
1178
|
}
|
|
1172
|
-
//
|
|
1179
|
+
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
1180
|
+
// count is the number of attestations by this signer for this slot
|
|
1181
|
+
if (count === 2) {
|
|
1182
|
+
const attester = attestation.getSender();
|
|
1183
|
+
if (attester) {
|
|
1184
|
+
this.logger.warn(`Detected duplicate attestation (equivocation) at slot ${slot}`, {
|
|
1185
|
+
slot: slot.toString(),
|
|
1186
|
+
archive: attestation.archive.toString(),
|
|
1187
|
+
source: peerId.toString(),
|
|
1188
|
+
attester: attester.toString()
|
|
1189
|
+
});
|
|
1190
|
+
this.duplicateAttestationCallback?.({
|
|
1191
|
+
slot,
|
|
1192
|
+
attester
|
|
1193
|
+
});
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
// Attestation was added successfully - accept it so other nodes can also detect the equivocation
|
|
1173
1197
|
return {
|
|
1174
1198
|
result: TopicValidatorResult.Accept,
|
|
1175
1199
|
obj: attestation
|
|
@@ -1199,8 +1223,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1199
1223
|
};
|
|
1200
1224
|
}
|
|
1201
1225
|
// Try to add the proposal: this handles existence check, cap check, and adding in one call
|
|
1202
|
-
const { added, alreadyExists,
|
|
1203
|
-
const isEquivocated =
|
|
1226
|
+
const { added, alreadyExists, count } = await this.mempools.attestationPool.tryAddBlockProposal(block);
|
|
1227
|
+
const isEquivocated = count !== undefined && count > 1;
|
|
1204
1228
|
// Duplicate proposal received, no need to re-broadcast
|
|
1205
1229
|
if (alreadyExists) {
|
|
1206
1230
|
this.logger.debug(`Ignoring duplicate block proposal received`, {
|
|
@@ -1223,7 +1247,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1223
1247
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1224
1248
|
...block.toBlockInfo(),
|
|
1225
1249
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
1226
|
-
|
|
1250
|
+
count,
|
|
1227
1251
|
proposer: block.getSender()?.toString(),
|
|
1228
1252
|
source: peerId.toString()
|
|
1229
1253
|
});
|
|
@@ -1244,7 +1268,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1244
1268
|
proposer: proposer?.toString()
|
|
1245
1269
|
});
|
|
1246
1270
|
// Invoke the duplicate callback on the first duplicate spotted only
|
|
1247
|
-
if (proposer &&
|
|
1271
|
+
if (proposer && count === 2) {
|
|
1248
1272
|
this.duplicateProposalCallback?.({
|
|
1249
1273
|
slot: block.slotNumber,
|
|
1250
1274
|
proposer,
|
|
@@ -1274,8 +1298,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1274
1298
|
source: sender.toString(),
|
|
1275
1299
|
...block.toBlockInfo()
|
|
1276
1300
|
});
|
|
1277
|
-
// Mark the txs in this proposal as
|
|
1278
|
-
await this.mempools.txPool.
|
|
1301
|
+
// Mark the txs in this proposal as protected
|
|
1302
|
+
await this.mempools.txPool.protectTxs(block.txHashes, block.blockHeader);
|
|
1279
1303
|
// Call the block received callback to validate the proposal.
|
|
1280
1304
|
// Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
|
|
1281
1305
|
const isValid = await this.blockReceivedCallback(block, sender);
|
|
@@ -1342,8 +1366,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1342
1366
|
// Try to add the checkpoint proposal core: this handles existence check, cap check, and adding in one call
|
|
1343
1367
|
const checkpointCore = checkpoint.toCore();
|
|
1344
1368
|
const tryAddResult = await this.mempools.attestationPool.tryAddCheckpointProposal(checkpointCore);
|
|
1345
|
-
const { added, alreadyExists,
|
|
1346
|
-
const isEquivocated =
|
|
1369
|
+
const { added, alreadyExists, count } = tryAddResult;
|
|
1370
|
+
const isEquivocated = count !== undefined && count > 1;
|
|
1347
1371
|
// Duplicate proposal received, do not re-broadcast
|
|
1348
1372
|
if (alreadyExists) {
|
|
1349
1373
|
this.logger.debug(`Ignoring duplicate checkpoint proposal received`, {
|
|
@@ -1365,7 +1389,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1365
1389
|
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1366
1390
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1367
1391
|
...checkpoint.toCheckpointInfo(),
|
|
1368
|
-
|
|
1392
|
+
count,
|
|
1369
1393
|
source: peerId.toString()
|
|
1370
1394
|
});
|
|
1371
1395
|
return {
|
|
@@ -1387,7 +1411,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1387
1411
|
proposer: proposer?.toString()
|
|
1388
1412
|
});
|
|
1389
1413
|
// Invoke the duplicate callback on the first duplicate spotted only
|
|
1390
|
-
if (proposer &&
|
|
1414
|
+
if (proposer && count === 2) {
|
|
1391
1415
|
this.duplicateProposalCallback?.({
|
|
1392
1416
|
slot: checkpoint.slotNumber,
|
|
1393
1417
|
proposer,
|
|
@@ -1605,7 +1629,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1605
1629
|
}
|
|
1606
1630
|
async validatePropagatedTx(tx, peerId) {
|
|
1607
1631
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1608
|
-
// We accept transactions if they are not expired by the next slot (checked based on the
|
|
1632
|
+
// We accept transactions if they are not expired by the next slot (checked based on the ExpirationTimestamp field)
|
|
1609
1633
|
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1610
1634
|
const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
|
|
1611
1635
|
for (const validator of messageValidators){
|
|
@@ -1653,7 +1677,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1653
1677
|
}
|
|
1654
1678
|
async validate(txs) {
|
|
1655
1679
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1656
|
-
// We accept transactions if they are not expired by the next slot (checked based on the
|
|
1680
|
+
// We accept transactions if they are not expired by the next slot (checked based on the ExpirationTimestamp field)
|
|
1657
1681
|
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1658
1682
|
const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
|
|
1659
1683
|
await Promise.all(txs.map(async (tx)=>{
|
|
@@ -30,4 +30,4 @@ export declare class PeerScoring {
|
|
|
30
30
|
bannedCount: number;
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9zY29yaW5nLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfc2NvcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBR0wsS0FBSyxlQUFlLEVBSXJCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUF1QmpELG9CQUFZLGNBQWM7SUFDeEIsTUFBTSxJQUFBO0lBQ04sVUFBVSxJQUFBO0lBQ1YsT0FBTyxJQUFBO0NBQ1I7QUFnQkQscUJBQWEsV0FBVztJQUN0QixPQUFPLENBQUMsTUFBTSxDQUFvQztJQUNsRCxPQUFPLENBQUMsTUFBTSxDQUFrQztJQUNoRCxPQUFPLENBQUMsY0FBYyxDQUFrQztJQUN4RCxPQUFPLENBQUMsYUFBYSxDQUFhO0lBQ2xDLE9BQU8sQ0FBQyxXQUFXLENBQU87SUFDMUIsYUFBYSxFQUFFO1NBQUcsR0FBRyxJQUFJLGlCQUFpQixHQUFHLE1BQU07S0FBRSxDQUFDO0lBRXRELE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBZ0I7SUFFeEMsWUFBWSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsR0FBRSxlQUFzQyxFQWdCL0U7SUFFTSxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsaUJBQWlCLFVBTTdEO0lBRUQsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBaUJ0RDtJQUVELGNBQWMsSUFBSSxJQUFJLENBWXJCO0lBRUQsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUUvQjtJQUVNLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLGNBQWMsQ0FVbkQ7SUFFRCxRQUFRLElBQUk7UUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDO1FBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQztRQUFDLGVBQWUsRUFBRSxNQUFNLENBQUM7UUFBQyxXQUFXLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0E0QnRHO0NBQ0YifQ==
|
|
@@ -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;
|
|
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;AAgBD,qBAAa,WAAW;IACtB,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,YAAY,MAAM,EAAE,SAAS,EAAE,SAAS,GAAE,eAAsC,EAgB/E;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,CAYrB;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"}
|
|
@@ -2,7 +2,21 @@ import { median } from '@aztec/foundation/collection';
|
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
4
4
|
import { Attributes, Metrics, createUpDownCounterWithDefault, getTelemetryClient } from '@aztec/telemetry-client';
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Application-level peer penalties.
|
|
7
|
+
*
|
|
8
|
+
* These scores are multiplied by appSpecificWeight (10) when contributing to gossipsub score.
|
|
9
|
+
* The values are designed to align with gossipsub thresholds:
|
|
10
|
+
*
|
|
11
|
+
* - LowToleranceError (50): 1 error → app score -50 → gossipsub -500 → gossipThreshold
|
|
12
|
+
* - MidToleranceError (10): 5 errors → app score -50 → gossipsub -500 → gossipThreshold
|
|
13
|
+
* - HighToleranceError (2): 25 errors → app score -50 → gossipsub -500 → gossipThreshold
|
|
14
|
+
*
|
|
15
|
+
* Examples of each severity:
|
|
16
|
+
* - LowToleranceError: Invalid messages, deserialization errors, manipulation attempts
|
|
17
|
+
* - MidToleranceError: Hash mismatches, protocol violations
|
|
18
|
+
* - HighToleranceError: Rate limit exceeded, failed responses, transient errors
|
|
19
|
+
*/ const DefaultPeerPenalties = {
|
|
6
20
|
[PeerErrorSeverity.LowToleranceError]: 50,
|
|
7
21
|
[PeerErrorSeverity.MidToleranceError]: 10,
|
|
8
22
|
[PeerErrorSeverity.HighToleranceError]: 2
|
|
@@ -13,7 +27,16 @@ export var PeerScoreState = /*#__PURE__*/ function(PeerScoreState) {
|
|
|
13
27
|
PeerScoreState[PeerScoreState["Healthy"] = 2] = "Healthy";
|
|
14
28
|
return PeerScoreState;
|
|
15
29
|
}({});
|
|
16
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Score thresholds for peer states.
|
|
32
|
+
*
|
|
33
|
+
* These values align with gossipsub thresholds when multiplied by appSpecificWeight (10):
|
|
34
|
+
* - MIN_SCORE_BEFORE_DISCONNECT (-50) × 10 = -500 = gossipThreshold
|
|
35
|
+
* - MIN_SCORE_BEFORE_BAN (-100) × 10 = -1000 = publishThreshold
|
|
36
|
+
*
|
|
37
|
+
* This ensures that when a peer is disconnected at the application level,
|
|
38
|
+
* they also stop receiving gossip, and when banned, they cannot publish.
|
|
39
|
+
*/ // TODO: move into config / constants
|
|
17
40
|
const MIN_SCORE_BEFORE_BAN = -100;
|
|
18
41
|
const MIN_SCORE_BEFORE_DISCONNECT = -50;
|
|
19
42
|
export class PeerScoring {
|
|
@@ -154,6 +154,15 @@ export declare const subProtocolMap: {
|
|
|
154
154
|
response: typeof BlockTxsResponse;
|
|
155
155
|
};
|
|
156
156
|
};
|
|
157
|
+
/**
|
|
158
|
+
* Type for a function that calculates the expected response size in KB for a given request.
|
|
159
|
+
*/
|
|
160
|
+
export type ExpectedResponseSizeCalculator = (requestBuffer: Buffer) => number;
|
|
161
|
+
/**
|
|
162
|
+
* Map of sub-protocols to their expected response size calculators.
|
|
163
|
+
* These are used to validate that responses don't exceed expected sizes based on request parameters.
|
|
164
|
+
*/
|
|
165
|
+
export declare const subProtocolSizeCalculators: Record<ReqRespSubProtocol, ExpectedResponseSizeCalculator>;
|
|
157
166
|
export interface ReqRespInterface {
|
|
158
167
|
start(subProtocolHandlers: Partial<ReqRespSubProtocolHandlers>, subProtocolValidators: ReqRespSubProtocolValidators): Promise<void>;
|
|
159
168
|
addSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler, validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol]): Promise<void>;
|
|
@@ -164,4 +173,4 @@ export interface ReqRespInterface {
|
|
|
164
173
|
getConnectionSampler(): Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>;
|
|
165
174
|
}
|
|
166
175
|
export {};
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXhELE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLGdCQUFnQixFQUVqQixNQUFNLDRDQUE0QyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFLakQsZUFBTyxNQUFNLGFBQWEsMEJBQTBCLENBQUM7QUFDckQsZUFBTyxNQUFNLGVBQWUsNEJBQTRCLENBQUM7QUFDekQsZUFBTyxNQUFNLGdCQUFnQiw2QkFBNkIsQ0FBQztBQUMzRCxlQUFPLE1BQU0sZUFBZSx3QkFBd0IsQ0FBQztBQUNyRCxlQUFPLE1BQU0sa0JBQWtCLDJCQUEyQixDQUFDO0FBQzNELGVBQU8sTUFBTSxhQUFhLDBCQUEwQixDQUFDO0FBQ3JELGVBQU8sTUFBTSxzQkFBc0IsK0JBQStCLENBQUM7QUFFbkUsb0JBQVksa0JBQWtCO0lBQzVCLElBQUksMEJBQWdCO0lBQ3BCLE1BQU0s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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
2
|
import { L2Block } from '@aztec/stdlib/block';
|
|
3
|
+
import { MAX_L2_BLOCK_SIZE_KB } from '@aztec/stdlib/p2p';
|
|
3
4
|
import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
|
|
4
5
|
import { AuthRequest, AuthResponse } from './protocols/auth.js';
|
|
5
|
-
import { BlockTxsRequest, BlockTxsResponse } from './protocols/block_txs/block_txs_reqresp.js';
|
|
6
|
+
import { BlockTxsRequest, BlockTxsResponse, calculateBlockTxsResponseSize } from './protocols/block_txs/block_txs_reqresp.js';
|
|
6
7
|
import { StatusMessage } from './protocols/status.js';
|
|
8
|
+
import { calculateTxResponseSize } from './protocols/tx.js';
|
|
7
9
|
/*
|
|
8
10
|
* Request Response Sub Protocols
|
|
9
11
|
*/ export const PING_PROTOCOL = '/aztec/req/ping/1.0.0';
|
|
@@ -101,3 +103,15 @@ export const DEFAULT_SUB_PROTOCOL_VALIDATORS = {
|
|
|
101
103
|
response: BlockTxsResponse
|
|
102
104
|
}
|
|
103
105
|
};
|
|
106
|
+
/**
|
|
107
|
+
* Map of sub-protocols to their expected response size calculators.
|
|
108
|
+
* These are used to validate that responses don't exceed expected sizes based on request parameters.
|
|
109
|
+
*/ export const subProtocolSizeCalculators = {
|
|
110
|
+
[ReqRespSubProtocol.TX]: calculateTxResponseSize,
|
|
111
|
+
[ReqRespSubProtocol.BLOCK_TXS]: calculateBlockTxsResponseSize,
|
|
112
|
+
[ReqRespSubProtocol.BLOCK]: ()=>MAX_L2_BLOCK_SIZE_KB,
|
|
113
|
+
[ReqRespSubProtocol.STATUS]: ()=>1,
|
|
114
|
+
[ReqRespSubProtocol.PING]: ()=>1,
|
|
115
|
+
[ReqRespSubProtocol.AUTH]: ()=>1,
|
|
116
|
+
[ReqRespSubProtocol.GOODBYE]: ()=>1
|
|
117
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
2
2
|
import type { AttestationPoolApi } from '../../../../mem_pools/attestation_pool/attestation_pool.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { TxPoolV2 } from '../../../../mem_pools/tx_pool_v2/interfaces.js';
|
|
4
4
|
import type { ReqRespSubProtocolHandler } from '../../interface.js';
|
|
5
5
|
/**
|
|
6
6
|
* Handler for block txs requests
|
|
@@ -9,5 +9,5 @@ import type { ReqRespSubProtocolHandler } from '../../interface.js';
|
|
|
9
9
|
* @param txPool - the tx pool to fetch transactions from
|
|
10
10
|
* @returns the BlockTxs request handler
|
|
11
11
|
*/
|
|
12
|
-
export declare function reqRespBlockTxsHandler(attestationPool: AttestationPoolApi, archiver: L2BlockSource, txPool:
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
export declare function reqRespBlockTxsHandler(attestationPool: AttestationPoolApi, archiver: L2BlockSource, txPool: TxPoolV2): ReqRespSubProtocolHandler;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfdHhzX2hhbmRsZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9yZXFyZXNwL3Byb3RvY29scy9ibG9ja190eHMvYmxvY2tfdHhzX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFLekQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUNyRyxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUMvRSxPQUFPLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBS3BFOzs7Ozs7R0FNRztBQUNILHdCQUFnQixzQkFBc0IsQ0FDcEMsZUFBZSxFQUFFLGtCQUFrQixFQUNuQyxRQUFRLEVBQUUsYUFBYSxFQUN2QixNQUFNLEVBQUUsUUFBUSxHQUNmLHlCQUF5QixDQW1EM0IifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_txs_handler.d.ts","sourceRoot":"","sources":["../../../../../src/services/reqresp/protocols/block_txs/block_txs_handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4DAA4D,CAAC;AACrG,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"block_txs_handler.d.ts","sourceRoot":"","sources":["../../../../../src/services/reqresp/protocols/block_txs/block_txs_handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4DAA4D,CAAC;AACrG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAKpE;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,kBAAkB,EACnC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,QAAQ,GACf,yBAAyB,CAmD3B"}
|
|
@@ -61,4 +61,10 @@ export declare class BlockTxsResponse {
|
|
|
61
61
|
toBuffer(): Buffer;
|
|
62
62
|
static empty(): BlockTxsResponse;
|
|
63
63
|
}
|
|
64
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Calculate the expected response size for a BLOCK_TXS request.
|
|
66
|
+
* @param requestBuffer - The serialized request buffer containing BlockTxsRequest
|
|
67
|
+
* @returns Expected response size in KB
|
|
68
|
+
*/
|
|
69
|
+
export declare function calculateBlockTxsResponseSize(requestBuffer: Buffer): number;
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfdHhzX3JlcXJlc3AuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9yZXFyZXNwL3Byb3RvY29scy9ibG9ja190eHMvYmxvY2tfdHhzX3JlcXJlc3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQXFCLE1BQU0sNkJBQTZCLENBQUM7QUFFOUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0Msd0ZBQXdGO0FBQ3hGLE1BQU0sV0FBVyxjQUFjO0lBQzdCLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNuQixPQUFPLEVBQUUsRUFBRSxDQUFDO0NBQ2I7QUFFRDs7R0FFRztBQUNILHFCQUFhLGVBQWU7SUFHeEIsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFO0lBRXhCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsV0FBVztJQUs5QixRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVM7SUFUL0IsWUFFVyxXQUFXLEVBQUUsRUFBRSxFQUVmLFFBQVEsRUFBRSxXQUFXLEVBS3JCLFNBQVMsRUFBRSxTQUFTLEVBQzNCO0lBRUo7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUFDLDBCQUEwQixDQUMvQixjQUFjLEVBQUUsY0FBYyxFQUM5QixlQUFlLEVBQUUsTUFBTSxFQUFFLEVBQ3pCLG1CQUFtQixVQUFRLEdBQzFCLGVBQWUsR0FBRyxTQUFTLENBb0I3QjtJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsWUFBWSxHQUFHLGVBQWUsQ0FPaEU7SUFFRDs7O09BR0c7SUFDSCxRQUFRLElBQUksTUFBTSxDQUVqQjtDQUNGO0FBRUQ7O0dBRUc7QUFDSCxxQkFBYSxnQkFBZ0I7SUFFekIsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFO0lBQ3hCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsT0FBTztJQUdyQixRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVM7SUFML0IsWUFDVyxXQUFXLEVBQUUsRUFBRSxFQUNmLEdBQUcsRUFBRSxPQUFPLEVBR1osU0FBUyxFQUFFLFNBQVMsRUFDM0I7SUFFSjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFlBQVksR0FBRyxnQkFBZ0IsQ0FPakU7SUFFRDs7Ozs7T0FLRztJQUNILFFBQVEsSUFBSSxNQUFNLENBRWpCO0lBRUQsTUFBTSxDQUFDLEtBQUssSUFBSSxnQkFBZ0IsQ0FFL0I7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCx3QkFBZ0IsNkJBQTZCLENBQUMsYUFBYSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBUzNFIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_txs_reqresp.d.ts","sourceRoot":"","sources":["../../../../../src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"block_txs_reqresp.d.ts","sourceRoot":"","sources":["../../../../../src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAE9E,OAAO,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,wFAAwF;AACxF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,EAAE,CAAC;CACb;AAED;;GAEG;AACH,qBAAa,eAAe;IAGxB,QAAQ,CAAC,WAAW,EAAE,EAAE;IAExB,QAAQ,CAAC,QAAQ,EAAE,WAAW;IAK9B,QAAQ,CAAC,SAAS,EAAE,SAAS;IAT/B,YAEW,WAAW,EAAE,EAAE,EAEf,QAAQ,EAAE,WAAW,EAKrB,SAAS,EAAE,SAAS,EAC3B;IAEJ;;;;;;;;;OASG;IACH,MAAM,CAAC,0BAA0B,CAC/B,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,MAAM,EAAE,EACzB,mBAAmB,UAAQ,GAC1B,eAAe,GAAG,SAAS,CAoB7B;IAED;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,eAAe,CAOhE;IAED;;;OAGG;IACH,QAAQ,IAAI,MAAM,CAEjB;CACF;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAEzB,QAAQ,CAAC,WAAW,EAAE,EAAE;IACxB,QAAQ,CAAC,GAAG,EAAE,OAAO;IAGrB,QAAQ,CAAC,SAAS,EAAE,SAAS;IAL/B,YACW,WAAW,EAAE,EAAE,EACf,GAAG,EAAE,OAAO,EAGZ,SAAS,EAAE,SAAS,EAC3B;IAEJ;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,gBAAgB,CAOjE;IAED;;;;;OAKG;IACH,QAAQ,IAAI,MAAM,CAEjB;IAED,MAAM,CAAC,KAAK,IAAI,gBAAgB,CAE/B;CACF;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAS3E"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
2
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
3
|
+
import { MAX_TX_SIZE_KB } from '@aztec/stdlib/p2p';
|
|
3
4
|
import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
|
|
4
5
|
import { BitVector } from './bitvector.js';
|
|
5
6
|
/**
|
|
@@ -104,3 +105,17 @@ import { BitVector } from './bitvector.js';
|
|
|
104
105
|
return new BlockTxsResponse(Fr.ZERO, new TxArray(), BitVector.init(0, []));
|
|
105
106
|
}
|
|
106
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Calculate the expected response size for a BLOCK_TXS request.
|
|
110
|
+
* @param requestBuffer - The serialized request buffer containing BlockTxsRequest
|
|
111
|
+
* @returns Expected response size in KB
|
|
112
|
+
*/ export function calculateBlockTxsResponseSize(requestBuffer) {
|
|
113
|
+
try {
|
|
114
|
+
const request = BlockTxsRequest.fromBuffer(requestBuffer);
|
|
115
|
+
const requestedTxCount = request.txIndices.getTrueIndices().length;
|
|
116
|
+
return requestedTxCount * MAX_TX_SIZE_KB + 1; // +1 KB overhead for serialization
|
|
117
|
+
} catch {
|
|
118
|
+
// If we can't parse the request, fall back to allowing a single transaction response
|
|
119
|
+
return MAX_TX_SIZE_KB + 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -20,4 +20,10 @@ export declare function reqRespTxHandler(mempools: MemPools): ReqRespSubProtocol
|
|
|
20
20
|
* we define Q as max number of transactions per batch, the comment explains why we use 8.
|
|
21
21
|
*/
|
|
22
22
|
export declare function chunkTxHashesRequest(hashes: TxHash[], chunkSize?: number): Array<TxHashArray>;
|
|
23
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Calculate the expected response size for a TX request.
|
|
25
|
+
* @param requestBuffer - The serialized request buffer containing TxHashArray
|
|
26
|
+
* @returns Expected response size in KB
|
|
27
|
+
*/
|
|
28
|
+
export declare function calculateTxResponseSize(requestBuffer: Buffer): number;
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9yZXFyZXNwL3Byb3RvY29scy90eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQVcsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSWhFLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHakU7Ozs7Ozs7R0FPRztBQUNILHdCQUFnQixnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxHQUFHLHlCQUF5QixDQXdCOUU7QUFFRDs7Ozs7Ozs7R0FRRztBQUdILHdCQUFnQixvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsU0FBUyxTQUFJLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUV4RjtBQUVEOzs7O0dBSUc7QUFDSCx3QkFBZ0IsdUJBQXVCLENBQUMsYUFBYSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBY3JFIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/tx.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tx.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/protocols/tx.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIhE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAGjE;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,yBAAyB,CAwB9E;AAED;;;;;;;;GAQG;AAGH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,SAAI,GAAG,KAAK,CAAC,WAAW,CAAC,CAExF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAcrE"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { chunk } from '@aztec/foundation/collection';
|
|
2
|
+
import { MAX_TX_SIZE_KB } from '@aztec/stdlib/p2p';
|
|
2
3
|
import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
|
|
3
4
|
import { ReqRespStatus, ReqRespStatusError } from '../status.js';
|
|
4
5
|
/**
|
|
@@ -46,3 +47,22 @@ import { ReqRespStatus, ReqRespStatusError } from '../status.js';
|
|
|
46
47
|
export function chunkTxHashesRequest(hashes, chunkSize = 1) {
|
|
47
48
|
return chunk(hashes, chunkSize).map((chunk)=>new TxHashArray(...chunk));
|
|
48
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Calculate the expected response size for a TX request.
|
|
52
|
+
* @param requestBuffer - The serialized request buffer containing TxHashArray
|
|
53
|
+
* @returns Expected response size in KB
|
|
54
|
+
*/ export function calculateTxResponseSize(requestBuffer) {
|
|
55
|
+
try {
|
|
56
|
+
const txHashes = TxHashArray.fromBuffer(requestBuffer);
|
|
57
|
+
// TxHashArray.fromBuffer returns empty array on parse failure, so check for that
|
|
58
|
+
if (txHashes.length === 0 && requestBuffer.length > 0) {
|
|
59
|
+
// If we got an empty array but had a non-empty buffer, parsing likely failed
|
|
60
|
+
// Fall back to allowing a single transaction response
|
|
61
|
+
return MAX_TX_SIZE_KB + 1;
|
|
62
|
+
}
|
|
63
|
+
return Math.max(txHashes.length, 1) * MAX_TX_SIZE_KB + 1; // +1 KB overhead, at least 1 tx
|
|
64
|
+
} catch {
|
|
65
|
+
// If we can't parse the request, fall back to allowing a single transaction response
|
|
66
|
+
return MAX_TX_SIZE_KB + 1;
|
|
67
|
+
}
|
|
68
|
+
}
|