@aztec/p2p 0.0.1-commit.f504929 → 0.0.1-commit.f5d02921e
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/README.md +129 -3
- package/dest/client/factory.d.ts +2 -2
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +25 -11
- package/dest/client/interface.d.ts +9 -2
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +3 -2
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +37 -36
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +17 -6
- package/dest/config.d.ts +24 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +66 -7
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +4 -4
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +6 -5
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/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 +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +9 -5
- 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 +25 -10
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +38 -11
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -43
- 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 +3 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -1
- 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 +21 -6
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
- package/dest/msg_validators/clock_tolerance.d.ts +1 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +4 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +5 -4
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +5 -4
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +12 -9
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +51 -49
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +21 -32
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +35 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +23 -4
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +36 -10
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +13 -4
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +39 -9
- package/dest/msg_validators/tx_validator/index.d.ts +2 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +49 -2
- package/dest/services/dummy_service.d.ts +5 -3
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +5 -1
- package/dest/services/encoding.d.ts +5 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +7 -1
- package/dest/services/libp2p/libp2p_service.d.ts +14 -11
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +146 -74
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +22 -8
- package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +28 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +69 -65
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +3 -2
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +17 -9
- package/dest/services/service.d.ts +5 -2
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +57 -73
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +6 -7
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/slow_tx_collection.js +1 -1
- package/dest/services/tx_collection/tx_collection.d.ts +3 -6
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.d.ts +1 -1
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +22 -3
- package/dest/testbench/p2p_client_testbench_worker.js +46 -16
- package/dest/testbench/worker_client_manager.d.ts +3 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +6 -3
- package/dest/util.d.ts +1 -1
- package/package.json +14 -14
- package/src/client/factory.ts +43 -14
- package/src/client/interface.ts +9 -1
- package/src/client/p2p_client.ts +39 -36
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -9
- package/src/config.ts +92 -4
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +7 -5
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/tx_pool_v2/README.md +9 -1
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/interfaces.ts +9 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +59 -13
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +13 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +23 -6
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
- package/src/msg_validators/clock_tolerance.ts +4 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +13 -3
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +19 -6
- package/src/msg_validators/proposal_validator/proposal_validator.ts +63 -53
- package/src/msg_validators/tx_validator/README.md +5 -1
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +16 -35
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +42 -1
- package/src/msg_validators/tx_validator/factory.ts +43 -3
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +41 -8
- package/src/msg_validators/tx_validator/index.ts +1 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/phases_validator.ts +60 -1
- package/src/services/dummy_service.ts +7 -2
- package/src/services/encoding.ts +9 -1
- package/src/services/libp2p/libp2p_service.ts +147 -87
- package/src/services/peer-manager/peer_manager.ts +26 -8
- package/src/services/peer-manager/peer_scoring.ts +21 -5
- package/src/services/reqresp/README.md +229 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +64 -69
- package/src/services/reqresp/batch-tx-requester/interface.ts +2 -1
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/reqresp.ts +19 -11
- package/src/services/service.ts +6 -1
- package/src/services/tx_collection/fast_tx_collection.ts +57 -83
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/slow_tx_collection.ts +1 -1
- package/src/services/tx_collection/tx_collection.ts +3 -5
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/test-helpers/make-test-p2p-clients.ts +1 -1
- package/src/test-helpers/reqresp-nodes.ts +1 -1
- package/src/test-helpers/testbench-utils.ts +29 -3
- package/src/testbench/p2p_client_testbench_worker.ts +45 -15
- package/src/testbench/worker_client_manager.ts +13 -6
- package/src/util.ts +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -378
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
|
@@ -370,14 +370,15 @@ function applyDecs2203RFactory() {
|
|
|
370
370
|
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
371
371
|
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
372
|
}
|
|
373
|
-
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7,
|
|
373
|
+
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _initProto;
|
|
374
374
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
375
|
+
import { maxBy } from '@aztec/foundation/collection';
|
|
375
376
|
import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
376
377
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
377
378
|
import { Timer } from '@aztec/foundation/timer';
|
|
378
379
|
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
379
380
|
import { GasFees } from '@aztec/stdlib/gas';
|
|
380
|
-
import { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PMessage, PeerErrorSeverity, TopicType, createTopicString, getTopicsForConfig, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
|
|
381
|
+
import { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PMessage, PeerErrorSeverity, PeerErrorSeverityByHarshness, TopicType, createTopicString, getTopicsForConfig, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
|
|
381
382
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
382
383
|
import { Tx } from '@aztec/stdlib/tx';
|
|
383
384
|
import { compressComponentVersions } from '@aztec/stdlib/versioning';
|
|
@@ -394,6 +395,7 @@ import { mplex } from '@libp2p/mplex';
|
|
|
394
395
|
import { tcp } from '@libp2p/tcp';
|
|
395
396
|
import { ENR } from '@nethermindeth/enr';
|
|
396
397
|
import { createLibp2p } from 'libp2p';
|
|
398
|
+
import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
|
|
397
399
|
import { BlockProposalValidator, CheckpointAttestationValidator, CheckpointProposalValidator, DoubleSpendTxValidator, FishermanAttestationValidator, getDefaultAllowedSetupFunctions } from '../../msg_validators/index.js';
|
|
398
400
|
import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
|
|
399
401
|
import { createFirstStageTxValidationsForGossipedTransactions, createSecondStageTxValidationsForGossipedTransactions, createTxValidatorForBlockProposalReceivedTxs, createTxValidatorForReqResponseReceivedTxs } from '../../msg_validators/tx_validator/factory.js';
|
|
@@ -431,10 +433,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
431
433
|
[Attributes.TX_HASH]: requestedTxHash.toString()
|
|
432
434
|
})), _dec7 = trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock)=>({
|
|
433
435
|
[Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString()
|
|
434
|
-
})), _dec8 = trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation)=>({
|
|
435
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
436
|
-
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
437
|
-
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then((i)=>i.toString())
|
|
438
436
|
}));
|
|
439
437
|
/**
|
|
440
438
|
* Lib P2P implementation of the P2PService interface.
|
|
@@ -490,11 +488,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
490
488
|
_dec7,
|
|
491
489
|
2,
|
|
492
490
|
"validateRequestedBlock"
|
|
493
|
-
],
|
|
494
|
-
[
|
|
495
|
-
_dec8,
|
|
496
|
-
2,
|
|
497
|
-
"validateCheckpointAttestation"
|
|
498
491
|
]
|
|
499
492
|
], []));
|
|
500
493
|
}
|
|
@@ -518,7 +511,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
518
511
|
* Callback for when a checkpoint proposal is received from a peer.
|
|
519
512
|
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
520
513
|
* @returns The attestations for the checkpoint, if any.
|
|
521
|
-
*/
|
|
514
|
+
*/ allNodesCheckpointReceivedCallback;
|
|
515
|
+
/**
|
|
516
|
+
* Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
|
|
517
|
+
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
518
|
+
* @returns The attestations for the checkpoint, if any.
|
|
519
|
+
*/ validatorCheckpointReceivedCallback;
|
|
522
520
|
gossipSubEventHandler;
|
|
523
521
|
instrumentation;
|
|
524
522
|
telemetry;
|
|
@@ -540,24 +538,24 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
540
538
|
this.topicStrings[TopicType.block_proposal] = createTopicString(TopicType.block_proposal, this.protocolVersion);
|
|
541
539
|
this.topicStrings[TopicType.checkpoint_proposal] = createTopicString(TopicType.checkpoint_proposal, this.protocolVersion);
|
|
542
540
|
this.topicStrings[TopicType.checkpoint_attestation] = createTopicString(TopicType.checkpoint_attestation, this.protocolVersion);
|
|
543
|
-
|
|
544
|
-
txsPermitted: !config.disableTransactions,
|
|
545
|
-
maxTxsPerBlock: config.maxTxsPerBlock
|
|
546
|
-
});
|
|
547
|
-
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, {
|
|
541
|
+
const proposalValidatorOpts = {
|
|
548
542
|
txsPermitted: !config.disableTransactions,
|
|
549
|
-
maxTxsPerBlock: config.
|
|
550
|
-
}
|
|
543
|
+
maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint
|
|
544
|
+
};
|
|
545
|
+
this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
|
|
546
|
+
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
|
|
551
547
|
this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry) : new CheckpointAttestationValidator(epochCache);
|
|
552
548
|
this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
|
|
553
549
|
this.blockReceivedCallback = async (block)=>{
|
|
554
|
-
this.logger.
|
|
550
|
+
this.logger.warn(`Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`, {
|
|
555
551
|
p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier()
|
|
556
552
|
});
|
|
557
|
-
return
|
|
553
|
+
return true;
|
|
558
554
|
};
|
|
559
|
-
this.
|
|
560
|
-
|
|
555
|
+
this.allNodesCheckpointReceivedCallback = (_checkpoint)=>{
|
|
556
|
+
throw new CheckpointProposalReceivedCallbackNotRegisteredError();
|
|
557
|
+
};
|
|
558
|
+
this.validatorCheckpointReceivedCallback = (_checkpoint)=>{
|
|
561
559
|
return Promise.resolve(undefined);
|
|
562
560
|
};
|
|
563
561
|
}
|
|
@@ -861,8 +859,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
861
859
|
registerBlockReceivedCallback(callback) {
|
|
862
860
|
this.blockReceivedCallback = callback;
|
|
863
861
|
}
|
|
864
|
-
|
|
865
|
-
this.
|
|
862
|
+
registerValidatorCheckpointReceivedCallback(callback) {
|
|
863
|
+
this.validatorCheckpointReceivedCallback = callback;
|
|
864
|
+
}
|
|
865
|
+
registerAllNodesCheckpointReceivedCallback(callback) {
|
|
866
|
+
this.allNodesCheckpointReceivedCallback = callback;
|
|
867
|
+
}
|
|
868
|
+
async notifyOwnCheckpointProposal(checkpoint) {
|
|
869
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
|
|
866
870
|
}
|
|
867
871
|
/**
|
|
868
872
|
* Registers a callback to be invoked when a duplicate proposal is detected.
|
|
@@ -928,6 +932,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
928
932
|
if (!validator || !validator.addMessage(msgId)) {
|
|
929
933
|
this.instrumentation.incMessagePrevalidationStatus(false, topicType);
|
|
930
934
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
|
|
935
|
+
if (topicType === TopicType.tx) {
|
|
936
|
+
this.logger.verbose(`Ignoring already-seen tx gossip message`, {
|
|
937
|
+
msgId,
|
|
938
|
+
source: source.toString()
|
|
939
|
+
});
|
|
940
|
+
}
|
|
931
941
|
return {
|
|
932
942
|
result: false,
|
|
933
943
|
topicType
|
|
@@ -1033,29 +1043,67 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1033
1043
|
return;
|
|
1034
1044
|
}
|
|
1035
1045
|
async validateReceivedMessage(validationFunc, msgId, source, topicType) {
|
|
1046
|
+
// Default to reject result with a penalty if validation function throws an error
|
|
1036
1047
|
let resultAndObj = {
|
|
1037
|
-
result: TopicValidatorResult.Reject
|
|
1048
|
+
result: TopicValidatorResult.Reject,
|
|
1049
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
1038
1050
|
};
|
|
1039
1051
|
const timer = new Timer();
|
|
1040
1052
|
try {
|
|
1041
1053
|
resultAndObj = await validationFunc();
|
|
1042
1054
|
} catch (err) {
|
|
1043
|
-
this.
|
|
1044
|
-
this.logger.error(`Error deserializing and validating gossipsub message`, err, {
|
|
1055
|
+
this.logger.error(`Error validating gossipsub message`, err, {
|
|
1045
1056
|
msgId,
|
|
1046
1057
|
source: source.toString(),
|
|
1047
1058
|
topicType
|
|
1048
1059
|
});
|
|
1049
1060
|
}
|
|
1050
1061
|
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
1062
|
+
this.logger.debug(`Message ${topicType} accepted by validator`, {
|
|
1063
|
+
msgId,
|
|
1064
|
+
source: source.toString(),
|
|
1065
|
+
topicType
|
|
1066
|
+
});
|
|
1051
1067
|
this.instrumentation.recordMessageValidation(topicType, timer);
|
|
1068
|
+
} else if (resultAndObj.result === TopicValidatorResult.Reject) {
|
|
1069
|
+
this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
|
|
1070
|
+
msgId,
|
|
1071
|
+
source: source.toString(),
|
|
1072
|
+
topicType,
|
|
1073
|
+
severity: resultAndObj.severity
|
|
1074
|
+
});
|
|
1075
|
+
this.peerManager.penalizePeer(source, resultAndObj.severity);
|
|
1076
|
+
} else {
|
|
1077
|
+
this.logger.trace(`Message ${topicType} ignored by validator`, {
|
|
1078
|
+
msgId,
|
|
1079
|
+
source: source.toString(),
|
|
1080
|
+
topicType
|
|
1081
|
+
});
|
|
1052
1082
|
}
|
|
1053
1083
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
|
|
1054
1084
|
return resultAndObj;
|
|
1055
1085
|
}
|
|
1086
|
+
tryDeserialize(deserializeFunc, msgId, source) {
|
|
1087
|
+
try {
|
|
1088
|
+
return deserializeFunc();
|
|
1089
|
+
} catch (err) {
|
|
1090
|
+
this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
|
|
1091
|
+
err,
|
|
1092
|
+
msgId,
|
|
1093
|
+
source: source.toString()
|
|
1094
|
+
});
|
|
1095
|
+
return undefined;
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1056
1098
|
async handleGossipedTx(payloadData, msgId, source) {
|
|
1057
1099
|
const validationFunc = async ()=>{
|
|
1058
|
-
const tx = Tx.fromBuffer(payloadData);
|
|
1100
|
+
const tx = this.tryDeserialize(()=>Tx.fromBuffer(payloadData), msgId, source);
|
|
1101
|
+
if (!tx) {
|
|
1102
|
+
return {
|
|
1103
|
+
result: TopicValidatorResult.Reject,
|
|
1104
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
1105
|
+
};
|
|
1106
|
+
}
|
|
1059
1107
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1060
1108
|
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1061
1109
|
// Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
|
|
@@ -1071,14 +1119,22 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1071
1119
|
const txBlockNumber = BlockNumber(currentBlockNumber + 1);
|
|
1072
1120
|
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
1073
1121
|
}
|
|
1074
|
-
this.
|
|
1122
|
+
this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
|
|
1123
|
+
validator: name,
|
|
1124
|
+
severity,
|
|
1125
|
+
source: source.toString()
|
|
1126
|
+
});
|
|
1075
1127
|
return {
|
|
1076
|
-
result: TopicValidatorResult.Reject
|
|
1128
|
+
result: TopicValidatorResult.Reject,
|
|
1129
|
+
severity
|
|
1077
1130
|
};
|
|
1078
1131
|
}
|
|
1079
1132
|
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
1080
1133
|
const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
|
|
1081
1134
|
if (canAdd === 'ignored') {
|
|
1135
|
+
this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
|
|
1136
|
+
source: source.toString()
|
|
1137
|
+
});
|
|
1082
1138
|
return {
|
|
1083
1139
|
result: TopicValidatorResult.Ignore,
|
|
1084
1140
|
obj: tx
|
|
@@ -1088,10 +1144,15 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1088
1144
|
const secondStageValidators = this.createSecondStageMessageValidators();
|
|
1089
1145
|
const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
|
|
1090
1146
|
if (!secondStageOutcome.allPassed) {
|
|
1091
|
-
const { severity } = secondStageOutcome.failure;
|
|
1092
|
-
this.
|
|
1147
|
+
const { severity, name } = secondStageOutcome.failure;
|
|
1148
|
+
this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
|
|
1149
|
+
validator: name,
|
|
1150
|
+
severity,
|
|
1151
|
+
source: source.toString()
|
|
1152
|
+
});
|
|
1093
1153
|
return {
|
|
1094
|
-
result: TopicValidatorResult.Reject
|
|
1154
|
+
result: TopicValidatorResult.Reject,
|
|
1155
|
+
severity
|
|
1095
1156
|
};
|
|
1096
1157
|
}
|
|
1097
1158
|
// Pool add: persist the tx
|
|
@@ -1103,7 +1164,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1103
1164
|
});
|
|
1104
1165
|
const wasAccepted = addResult.accepted.some((h)=>h.equals(txHash));
|
|
1105
1166
|
const wasIgnored = addResult.ignored.some((h)=>h.equals(txHash));
|
|
1106
|
-
this.logger.
|
|
1167
|
+
this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
|
|
1107
1168
|
wasAccepted,
|
|
1108
1169
|
wasIgnored,
|
|
1109
1170
|
[Attributes.P2P_ID]: source.toString()
|
|
@@ -1119,8 +1180,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1119
1180
|
obj: tx
|
|
1120
1181
|
};
|
|
1121
1182
|
} else {
|
|
1183
|
+
this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
|
|
1184
|
+
source: source.toString(),
|
|
1185
|
+
txHash: txHash.toString()
|
|
1186
|
+
});
|
|
1122
1187
|
return {
|
|
1123
|
-
result: TopicValidatorResult.Reject
|
|
1188
|
+
result: TopicValidatorResult.Reject,
|
|
1189
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1124
1190
|
};
|
|
1125
1191
|
}
|
|
1126
1192
|
};
|
|
@@ -1141,7 +1207,16 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1141
1207
|
* Process a checkpoint attestation from a peer.
|
|
1142
1208
|
* Validates the attestation and adds it to the pool.
|
|
1143
1209
|
*/ async processCheckpointAttestationFromPeer(payloadData, msgId, source) {
|
|
1144
|
-
const { result, obj: attestation } = await this.validateReceivedMessage(()=>
|
|
1210
|
+
const { result, obj: attestation } = await this.validateReceivedMessage(()=>{
|
|
1211
|
+
const attestation = this.tryDeserialize(()=>CheckpointAttestation.fromBuffer(payloadData), msgId, source);
|
|
1212
|
+
if (!attestation) {
|
|
1213
|
+
return Promise.resolve({
|
|
1214
|
+
result: TopicValidatorResult.Reject,
|
|
1215
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
1216
|
+
});
|
|
1217
|
+
}
|
|
1218
|
+
return this.validateAndStoreCheckpointAttestation(source, attestation);
|
|
1219
|
+
}, msgId, source, TopicType.checkpoint_attestation);
|
|
1145
1220
|
if (result !== TopicValidatorResult.Accept || !attestation) {
|
|
1146
1221
|
return;
|
|
1147
1222
|
}
|
|
@@ -1156,9 +1231,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1156
1231
|
const validationResult = await this.checkpointAttestationValidator.validate(attestation);
|
|
1157
1232
|
if (validationResult.result === 'reject') {
|
|
1158
1233
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1159
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1160
1234
|
return {
|
|
1161
|
-
result: TopicValidatorResult.Reject
|
|
1235
|
+
result: TopicValidatorResult.Reject,
|
|
1236
|
+
severity: validationResult.severity
|
|
1162
1237
|
};
|
|
1163
1238
|
}
|
|
1164
1239
|
if (validationResult.result === 'ignore') {
|
|
@@ -1185,9 +1260,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1185
1260
|
obj: attestation
|
|
1186
1261
|
};
|
|
1187
1262
|
}
|
|
1188
|
-
// Could not add (cap reached for signer),
|
|
1263
|
+
// Could not add (cap reached for signer), penalize and do not re-broadcast
|
|
1189
1264
|
if (!added) {
|
|
1190
|
-
this.logger.warn(`
|
|
1265
|
+
this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
|
|
1191
1266
|
slot: slot.toString(),
|
|
1192
1267
|
archive: attestation.archive.toString(),
|
|
1193
1268
|
source: peerId.toString(),
|
|
@@ -1195,8 +1270,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1195
1270
|
count
|
|
1196
1271
|
});
|
|
1197
1272
|
return {
|
|
1198
|
-
result: TopicValidatorResult.
|
|
1199
|
-
|
|
1273
|
+
result: TopicValidatorResult.Reject,
|
|
1274
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1200
1275
|
};
|
|
1201
1276
|
}
|
|
1202
1277
|
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
@@ -1234,9 +1309,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1234
1309
|
const validationResult = await this.blockProposalValidator.validate(block);
|
|
1235
1310
|
if (validationResult.result === 'reject') {
|
|
1236
1311
|
this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1237
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1238
1312
|
return {
|
|
1239
|
-
result: TopicValidatorResult.Reject
|
|
1313
|
+
result: TopicValidatorResult.Reject,
|
|
1314
|
+
severity: validationResult.severity
|
|
1240
1315
|
};
|
|
1241
1316
|
}
|
|
1242
1317
|
if (validationResult.result === 'ignore') {
|
|
@@ -1266,7 +1341,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1266
1341
|
}
|
|
1267
1342
|
// Too many blocks received for this slot and index, penalize peer and do not re-broadcast
|
|
1268
1343
|
if (!added) {
|
|
1269
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1270
1344
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1271
1345
|
...block.toBlockInfo(),
|
|
1272
1346
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
@@ -1278,7 +1352,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1278
1352
|
result: TopicValidatorResult.Reject,
|
|
1279
1353
|
metadata: {
|
|
1280
1354
|
isEquivocated
|
|
1281
|
-
}
|
|
1355
|
+
},
|
|
1356
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1282
1357
|
};
|
|
1283
1358
|
}
|
|
1284
1359
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1327,7 +1402,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1327
1402
|
// Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
|
|
1328
1403
|
const isValid = await this.blockReceivedCallback(block, sender);
|
|
1329
1404
|
if (!isValid) {
|
|
1330
|
-
this.logger.
|
|
1405
|
+
this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
|
|
1331
1406
|
}
|
|
1332
1407
|
}
|
|
1333
1408
|
/**
|
|
@@ -1352,9 +1427,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1352
1427
|
const validationResult = await this.checkpointProposalValidator.validate(checkpoint);
|
|
1353
1428
|
if (validationResult.result === 'reject') {
|
|
1354
1429
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1355
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1356
1430
|
return {
|
|
1357
|
-
result: TopicValidatorResult.Reject
|
|
1431
|
+
result: TopicValidatorResult.Reject,
|
|
1432
|
+
severity: validationResult.severity
|
|
1358
1433
|
};
|
|
1359
1434
|
}
|
|
1360
1435
|
if (validationResult.result === 'ignore') {
|
|
@@ -1371,18 +1446,20 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1371
1446
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1372
1447
|
[Attributes.P2P_ID]: peerId.toString()
|
|
1373
1448
|
});
|
|
1374
|
-
const
|
|
1375
|
-
|
|
1449
|
+
const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1450
|
+
const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
|
|
1451
|
+
if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1376
1452
|
this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
|
|
1377
1453
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1378
1454
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1379
1455
|
isEquivocated,
|
|
1380
|
-
result
|
|
1456
|
+
result: blockProposalResult.result
|
|
1381
1457
|
});
|
|
1382
1458
|
return {
|
|
1383
|
-
result: TopicValidatorResult.Reject
|
|
1459
|
+
result: TopicValidatorResult.Reject,
|
|
1460
|
+
severity: 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError
|
|
1384
1461
|
};
|
|
1385
|
-
} else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1462
|
+
} else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1386
1463
|
processBlock = true;
|
|
1387
1464
|
}
|
|
1388
1465
|
}
|
|
@@ -1409,7 +1486,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1409
1486
|
// Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
|
|
1410
1487
|
// Note: We still return the checkpoint obj so the lastBlock can be processed if valid
|
|
1411
1488
|
if (!added) {
|
|
1412
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1413
1489
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1414
1490
|
...checkpoint.toCheckpointInfo(),
|
|
1415
1491
|
count,
|
|
@@ -1421,7 +1497,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1421
1497
|
metadata: {
|
|
1422
1498
|
isEquivocated,
|
|
1423
1499
|
processBlock
|
|
1424
|
-
}
|
|
1500
|
+
},
|
|
1501
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1425
1502
|
};
|
|
1426
1503
|
}
|
|
1427
1504
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1471,9 +1548,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1471
1548
|
archive: checkpoint.archive.toString(),
|
|
1472
1549
|
source: sender.toString()
|
|
1473
1550
|
});
|
|
1551
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
|
|
1474
1552
|
// Call the checkpoint received callback with the core version (without lastBlock)
|
|
1475
1553
|
// to validate and potentially generate attestations
|
|
1476
|
-
const attestations = await this.
|
|
1554
|
+
const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
|
|
1477
1555
|
if (attestations && attestations.length > 0) {
|
|
1478
1556
|
// If the callback returned attestations, add them to the pool and propagate them
|
|
1479
1557
|
await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
@@ -1696,7 +1774,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1696
1774
|
...this.config.txPublicSetupAllowListExtend ?? []
|
|
1697
1775
|
];
|
|
1698
1776
|
const blockNumber = BlockNumber(currentBlockNumber + 1);
|
|
1699
|
-
|
|
1777
|
+
const l1Constants = await this.archiver.getL1Constants();
|
|
1778
|
+
return createFirstStageTxValidationsForGossipedTransactions(nextSlotTimestamp, blockNumber, this.worldStateSynchronizer, gasFees, this.config.l1ChainId, this.config.rollupVersion, protocolContractsHash, this.archiver, !this.config.disableTransactions, allowedInSetup, this.logger.getBindings(), {
|
|
1779
|
+
rollupManaLimit: l1Constants.rollupManaLimit,
|
|
1780
|
+
maxBlockL2Gas: this.config.validateMaxL2BlockGas,
|
|
1781
|
+
maxBlockDAGas: this.config.validateMaxDABlockGas
|
|
1782
|
+
});
|
|
1700
1783
|
}
|
|
1701
1784
|
/** Creates the second stage (expensive proof verification) validators for gossiped transactions. */ createSecondStageMessageValidators() {
|
|
1702
1785
|
return createSecondStageTxValidationsForGossipedTransactions(this.proofVerifier, this.logger.getBindings());
|
|
@@ -1717,8 +1800,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1717
1800
|
});
|
|
1718
1801
|
// A promise that resolves when all validations have been run
|
|
1719
1802
|
const allValidations = await Promise.all(validationPromises);
|
|
1720
|
-
const
|
|
1721
|
-
if (
|
|
1803
|
+
const failures = allValidations.filter((x)=>!x.isValid);
|
|
1804
|
+
if (failures.length > 0) {
|
|
1805
|
+
// Pick the most severe failure (lowest tolerance = harshest penalty)
|
|
1806
|
+
const failed = maxBy(failures, (f)=>PeerErrorSeverityByHarshness.indexOf(f.severity));
|
|
1722
1807
|
return {
|
|
1723
1808
|
allPassed: false,
|
|
1724
1809
|
failure: {
|
|
@@ -1765,19 +1850,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1765
1850
|
}
|
|
1766
1851
|
return PeerErrorSeverity.HighToleranceError;
|
|
1767
1852
|
}
|
|
1768
|
-
/**
|
|
1769
|
-
* Validate a checkpoint attestation.
|
|
1770
|
-
*
|
|
1771
|
-
* @param attestation - The checkpoint attestation to validate.
|
|
1772
|
-
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
1773
|
-
*/ async validateCheckpointAttestation(peerId, attestation) {
|
|
1774
|
-
const result = await this.checkpointAttestationValidator.validate(attestation);
|
|
1775
|
-
if (result.result === 'reject') {
|
|
1776
|
-
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1777
|
-
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1778
|
-
}
|
|
1779
|
-
return result;
|
|
1780
|
-
}
|
|
1781
1853
|
getPeerScore(peerId) {
|
|
1782
1854
|
return this.node.services.pubsub.score.score(peerId.toString());
|
|
1783
1855
|
}
|
|
@@ -53,11 +53,15 @@ export declare class PeerManager implements PeerManagerInterface {
|
|
|
53
53
|
heartbeat(): Promise<void>;
|
|
54
54
|
setupDirectPeersIfValidator(): Promise<void>;
|
|
55
55
|
/**
|
|
56
|
-
* Cleans up expired timeouts.
|
|
56
|
+
* Cleans up expired timeouts and stale failed-auth-handshake entries.
|
|
57
57
|
*
|
|
58
58
|
* When peers fail to dial after a number of retries, they are temporarily timed out.
|
|
59
59
|
* This function removes any peers that have been in the timed out state for too long.
|
|
60
60
|
* To give them a chance to reconnect.
|
|
61
|
+
*
|
|
62
|
+
* Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
|
|
63
|
+
* Without this, peers that probe once and never reconnect would leave their entries in the
|
|
64
|
+
* map forever, causing an unbounded memory leak.
|
|
61
65
|
*/
|
|
62
66
|
private cleanupExpiredTimeouts;
|
|
63
67
|
private processScheduledDisconnects;
|
|
@@ -171,4 +175,4 @@ export declare class PeerManager implements PeerManagerInterface {
|
|
|
171
175
|
handleAuthRequestFromPeer(_authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
172
176
|
private updateAuthenticatedPeers;
|
|
173
177
|
}
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFjLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTTVELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQXVCLE1BQU0saUNBQWlDLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUFrQixLQUFLLFdBQVcsRUFBRSxNQUFNLG1C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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAc,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAM5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAgB,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAuB,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA2BrE,qBAAa,WAAY,YAAW,oBAAoB;IAyBpD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAlC/B,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,8BAA8B,CAAa;IACnD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,uBAAuB,CAAkB;IACjD,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,uBAAuB,CAAkB;IACjD,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,qCAAqC,CAAsC;IACnF,OAAO,CAAC,qCAAqC,CAAkC;IAC/E,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,oBAAoB,CAAoD;IAChF,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,yBAAyB,CAAkB;IAEnD,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAId;IAEF,YACU,UAAU,EAAE,UAAU,EACtB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,SAAS,EACzB,eAAe,EAAE,eAAe,EACxB,MAAM,oDAAmC,EACzC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,EACP,sBAAsB,EAAE,sBAAsB,EAC9C,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,mBAAmB,EAC/B,YAAY,GAAE,YAAiC,EAyBjE;IACD;;;;OAIG;IACG,eAAe,kBAmCpB;IAED,IAAI,MAAM,6CAET;IAEY,SAAS,kBAUrB;IAIK,2BAA2B,kBAgDhC;IAED
|
|
1
|
+
{"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ import { PeerScoreState } from './peer_scoring.js';
|
|
|
17
17
|
const MAX_DIAL_ATTEMPTS = 3;
|
|
18
18
|
const MAX_CACHED_PEERS = 100;
|
|
19
19
|
const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
20
|
-
const
|
|
20
|
+
const DEFAULT_FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
|
|
21
21
|
const GOODBYE_DIAL_TIMEOUT_MS = 1000;
|
|
22
22
|
const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
|
|
23
23
|
export class PeerManager {
|
|
@@ -172,19 +172,27 @@ export class PeerManager {
|
|
|
172
172
|
this.initializedPreferredPeers = true;
|
|
173
173
|
}
|
|
174
174
|
/**
|
|
175
|
-
* Cleans up expired timeouts.
|
|
175
|
+
* Cleans up expired timeouts and stale failed-auth-handshake entries.
|
|
176
176
|
*
|
|
177
177
|
* When peers fail to dial after a number of retries, they are temporarily timed out.
|
|
178
178
|
* This function removes any peers that have been in the timed out state for too long.
|
|
179
179
|
* To give them a chance to reconnect.
|
|
180
|
+
*
|
|
181
|
+
* Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
|
|
182
|
+
* Without this, peers that probe once and never reconnect would leave their entries in the
|
|
183
|
+
* map forever, causing an unbounded memory leak.
|
|
180
184
|
*/ cleanupExpiredTimeouts() {
|
|
181
|
-
// Clean up expired timeouts
|
|
182
185
|
const now = this.dateProvider.now();
|
|
183
186
|
for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()){
|
|
184
187
|
if (now >= timedOutPeer.timeoutUntilMs) {
|
|
185
188
|
this.timedOutPeers.delete(peerId);
|
|
186
189
|
}
|
|
187
190
|
}
|
|
191
|
+
for (const [id, entry] of this.failedAuthHandshakes.entries()){
|
|
192
|
+
if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
|
|
193
|
+
this.failedAuthHandshakes.delete(id);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
188
196
|
}
|
|
189
197
|
/**
|
|
190
198
|
* Processes scheduled disconnects during heartbeat.
|
|
@@ -238,13 +246,17 @@ export class PeerManager {
|
|
|
238
246
|
* @param e - The disconnected peer event.
|
|
239
247
|
*/ handleDisconnectedPeerEvent(e) {
|
|
240
248
|
const peerId = e.detail;
|
|
249
|
+
const peerIdStr = peerId.toString();
|
|
241
250
|
this.metrics.peerDisconnected(peerId);
|
|
242
|
-
this.logger.verbose(`Disconnected from peer ${
|
|
243
|
-
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(
|
|
251
|
+
this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
|
|
252
|
+
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
|
|
244
253
|
if (validatorAddress !== undefined) {
|
|
245
|
-
this.logger.info(`Removing authentication for validator ${validatorAddress} at peer id ${
|
|
254
|
+
this.logger.info(`Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`);
|
|
246
255
|
this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
|
|
247
|
-
this.authenticatedPeerIdToValidatorAddress.delete(
|
|
256
|
+
this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
|
|
257
|
+
}
|
|
258
|
+
if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
|
|
259
|
+
this.peerScoring.removePeer(peerIdStr);
|
|
248
260
|
}
|
|
249
261
|
}
|
|
250
262
|
registerThisValidatorAddresses(address) {
|
|
@@ -624,7 +636,7 @@ export class PeerManager {
|
|
|
624
636
|
// Add to timed out peers
|
|
625
637
|
this.timedOutPeers.set(id, {
|
|
626
638
|
peerId: id,
|
|
627
|
-
timeoutUntilMs: this.dateProvider.now() +
|
|
639
|
+
timeoutUntilMs: this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS)
|
|
628
640
|
});
|
|
629
641
|
}
|
|
630
642
|
}
|
|
@@ -774,6 +786,8 @@ export class PeerManager {
|
|
|
774
786
|
...logData,
|
|
775
787
|
address: sender.toString()
|
|
776
788
|
});
|
|
789
|
+
this.markAuthHandshakeFailed(peerId);
|
|
790
|
+
this.markPeerForDisconnect(peerId);
|
|
777
791
|
return;
|
|
778
792
|
}
|
|
779
793
|
this.markAuthHandshakeSuccess(peerId);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
1
2
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
2
3
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
4
|
import type { PeerId } from '@libp2p/interface';
|
|
@@ -8,6 +9,7 @@ export declare enum PeerScoreState {
|
|
|
8
9
|
Healthy = 2
|
|
9
10
|
}
|
|
10
11
|
export declare class PeerScoring {
|
|
12
|
+
private readonly dateProvider;
|
|
11
13
|
private logger;
|
|
12
14
|
private scores;
|
|
13
15
|
private lastUpdateTime;
|
|
@@ -17,10 +19,11 @@ export declare class PeerScoring {
|
|
|
17
19
|
[key in PeerErrorSeverity]: number;
|
|
18
20
|
};
|
|
19
21
|
private peerStateCounter;
|
|
20
|
-
constructor(config: P2PConfig, telemetry?: TelemetryClient);
|
|
22
|
+
constructor(config: P2PConfig, telemetry?: TelemetryClient, dateProvider?: DateProvider);
|
|
21
23
|
penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity): number;
|
|
22
24
|
updateScore(peerId: string, scoreDelta: number): number;
|
|
23
25
|
decayAllScores(): void;
|
|
26
|
+
removePeer(peerId: string): void;
|
|
24
27
|
getScore(peerId: string): number;
|
|
25
28
|
getScoreState(peerId: string): PeerScoreState;
|
|
26
29
|
getStats(): {
|
|
@@ -30,4 +33,4 @@ export declare class PeerScoring {
|
|
|
30
33
|
bannedCount: number;
|
|
31
34
|
};
|
|
32
35
|
}
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9zY29yaW5nLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfc2NvcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUdMLEtBQUssZUFBZSxFQUlyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBdUJqRCxvQkFBWSxjQUFjO0lBQ3hCLE1BQU0sSUFBQTtJQUNOLFVBQVUsSUFBQTtJQUNWLE9BQU8sSUFBQTtDQUNSO0FBaUJELHFCQUFhLFdBQVc7SUFhcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZO0lBWi9CLE9BQU8sQ0FBQyxNQUFNLENBQW9DO0lBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQWtDO0lBQ2hELE9BQU8sQ0FBQyxjQUFjLENBQWtDO0lBQ3hELE9BQU8sQ0FBQyxhQUFhLENBQWE7SUFDbEMsT0FBTyxDQUFDLFdBQVcsQ0FBTztJQUMxQixhQUFhLEVBQUU7U0FBRyxHQUFHLElBQUksaUJBQWlCLEdBQUcsTUFBTTtLQUFFLENBQUM7SUFFdEQsT0FBTyxDQUFDLGdCQUFnQixDQUFnQjtJQUV4QyxZQUNFLE1BQU0sRUFBRSxTQUFTLEVBQ2pCLFNBQVMsR0FBRSxlQUFzQyxFQUNoQyxZQUFZLEdBQUUsWUFBaUMsRUFpQmpFO0lBRU0sWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixVQU03RDtJQUVELFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQWlCdEQ7SUFFRCxjQUFjLElBQUksSUFBSSxDQWlCckI7SUFFRCxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBRy9CO0lBRUQsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUUvQjtJQUVNLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLGNBQWMsQ0FVbkQ7SUFFRCxRQUFRLElBQUk7UUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDO1FBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQztRQUFDLGVBQWUsRUFBRSxNQUFNLENBQUM7UUFBQyxXQUFXLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0E0QnRHO0NBQ0YifQ==
|