@aztec/p2p 0.0.1-commit.b655e406 → 0.0.1-commit.b8a057fa
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 +130 -3
- package/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +26 -10
- package/dest/client/factory.d.ts +13 -12
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +70 -21
- package/dest/client/index.d.ts +1 -1
- package/dest/client/interface.d.ts +104 -39
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +76 -92
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +685 -344
- package/dest/config.d.ts +175 -87
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +180 -59
- package/dest/enr/generate-enr.d.ts +1 -1
- package/dest/enr/index.d.ts +1 -1
- package/dest/errors/attestation-pool.error.d.ts +7 -0
- package/dest/errors/attestation-pool.error.d.ts.map +1 -0
- package/dest/errors/attestation-pool.error.js +12 -0
- 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/errors/reqresp.error.d.ts +9 -16
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +10 -17
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +156 -57
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +518 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
- 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 +694 -294
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -10
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +19 -13
- package/dest/mem_pools/index.d.ts +3 -3
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/index.js +1 -1
- package/dest/mem_pools/instrumentation.d.ts +16 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +58 -10
- package/dest/mem_pools/interface.d.ts +6 -7
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +39 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +97 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -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 +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +243 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +11 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +122 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +368 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +68 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +178 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +91 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1013 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +15 -7
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +82 -26
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +24 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +75 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/index.js +1 -0
- package/dest/msg_validators/index.d.ts +2 -2
- package/dest/msg_validators/index.d.ts.map +1 -1
- package/dest/msg_validators/index.js +1 -1
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +1 -1
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +16 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +16 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +26 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +40 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +186 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -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 +25 -21
- 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/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -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 +4 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +40 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
- package/dest/msg_validators/tx_validator/factory.d.ts +138 -6
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +268 -58
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +105 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +146 -67
- package/dest/msg_validators/tx_validator/index.d.ts +6 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +5 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +6 -6
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +24 -3
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +78 -28
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +23 -5
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +4 -2
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +14 -10
- package/dest/services/discv5/discV5_service.d.ts +13 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +120 -24
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +40 -16
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +61 -14
- package/dest/services/encoding.d.ts +24 -7
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +48 -30
- 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 +167 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +336 -0
- package/dest/services/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/instrumentation.d.ts +5 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +49 -70
- package/dest/services/libp2p/libp2p_service.d.ts +127 -110
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +1385 -447
- package/dest/services/peer-manager/interface.d.ts +1 -1
- package/dest/services/peer-manager/metrics.d.ts +11 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +45 -16
- package/dest/services/peer-manager/peer_manager.d.ts +21 -35
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +89 -38
- package/dest/services/peer-manager/peer_scoring.d.ts +39 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +168 -15
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
- package/dest/services/reqresp/config.d.ts +15 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +11 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- package/dest/services/reqresp/index.d.ts +1 -1
- package/dest/services/reqresp/interface.d.ts +27 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +23 -19
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +16 -21
- package/dest/services/reqresp/protocols/auth.d.ts +2 -2
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/auth.js +2 -2
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +8 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +15 -2
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +35 -14
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +37 -11
- 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 +85 -21
- package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/ping.d.ts +1 -1
- package/dest/services/reqresp/protocols/status.d.ts +6 -5
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +7 -3
- package/dest/services/reqresp/protocols/tx.d.ts +8 -3
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +21 -3
- package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -5
- 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/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
- package/dest/services/reqresp/reqresp.d.ts +12 -69
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +480 -200
- package/dest/services/reqresp/status.d.ts +2 -2
- package/dest/services/reqresp/status.d.ts.map +1 -1
- package/dest/services/service.d.ts +78 -13
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +11 -11
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +28 -27
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -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 +127 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -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 +100 -0
- package/dest/services/tx_collection/index.d.ts +3 -2
- 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/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +9 -13
- 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/tx_collection.d.ts +51 -57
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +298 -70
- package/dest/services/tx_collection/tx_collection_sink.d.ts +20 -10
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +28 -31
- package/dest/services/tx_collection/tx_source.d.ts +13 -7
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +29 -7
- package/dest/services/tx_file_store/config.d.ts +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +142 -0
- package/dest/services/tx_provider.d.ts +9 -5
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +23 -10
- package/dest/services/tx_provider_instrumentation.d.ts +5 -2
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +14 -14
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts.map +1 -1
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/make-enrs.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -3
- package/dest/test-helpers/mock-pubsub.d.ts +48 -8
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +115 -14
- package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
- package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
- package/dest/test-helpers/mock-tx-helpers.js +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +19 -20
- package/dest/test-helpers/test_tx_provider.d.ts +42 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +44 -0
- package/dest/test-helpers/testbench-utils.d.ts +164 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +400 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +289 -128
- package/dest/testbench/parse_log_file.d.ts +1 -1
- package/dest/testbench/testbench.d.ts +1 -1
- package/dest/testbench/worker_client_manager.d.ts +57 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +277 -44
- package/dest/types/index.d.ts +1 -1
- package/dest/util.d.ts +14 -8
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +41 -11
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +21 -20
- package/src/bootstrap/bootstrap.ts +24 -7
- package/src/client/factory.ts +141 -46
- package/src/client/interface.ts +114 -47
- package/src/client/p2p_client.ts +356 -424
- package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
- package/src/config.ts +316 -67
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +13 -19
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +598 -56
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +796 -316
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +29 -17
- package/src/mem_pools/index.ts +2 -2
- package/src/mem_pools/instrumentation.ts +58 -10
- package/src/mem_pools/interface.ts +5 -7
- package/src/mem_pools/tx_pool_v2/README.md +283 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +112 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +274 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +465 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +252 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1215 -0
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +78 -33
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +102 -0
- package/src/msg_validators/attestation_validator/index.ts +1 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +32 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +49 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +198 -0
- package/src/msg_validators/tx_validator/README.md +129 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +2 -2
- package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +62 -7
- package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
- package/src/msg_validators/tx_validator/factory.ts +433 -58
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +206 -76
- package/src/msg_validators/tx_validator/index.ts +5 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +31 -12
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +90 -31
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/test_utils.ts +1 -1
- package/src/msg_validators/tx_validator/timestamp_validator.ts +30 -19
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +10 -3
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +14 -19
- package/src/services/discv5/discV5_service.ts +127 -15
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +82 -38
- package/src/services/encoding.ts +46 -29
- package/src/services/gossipsub/README.md +663 -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 +478 -0
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +54 -72
- package/src/services/libp2p/libp2p_service.ts +1152 -497
- package/src/services/peer-manager/metrics.ts +51 -16
- package/src/services/peer-manager/peer_manager.ts +98 -29
- package/src/services/peer-manager/peer_scoring.ts +170 -9
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +344 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +660 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
- package/src/services/reqresp/config.ts +19 -2
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/interface.ts +48 -46
- package/src/services/reqresp/metrics.ts +35 -27
- package/src/services/reqresp/protocols/auth.ts +2 -2
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +19 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +44 -17
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +109 -17
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/status.ts +16 -12
- package/src/services/reqresp/protocols/tx.ts +24 -5
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
- package/src/services/reqresp/reqresp.ts +107 -223
- package/src/services/service.ts +102 -31
- package/src/services/tx_collection/config.ts +42 -37
- package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
- package/src/services/tx_collection/file_store_tx_source.ts +129 -0
- package/src/services/tx_collection/index.ts +2 -1
- package/src/services/tx_collection/instrumentation.ts +5 -13
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +368 -115
- package/src/services/tx_collection/tx_collection_sink.ts +32 -36
- package/src/services/tx_collection/tx_source.ts +29 -8
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +163 -0
- package/src/services/tx_provider.ts +34 -12
- package/src/services/tx_provider_instrumentation.ts +24 -14
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/make-test-p2p-clients.ts +7 -6
- package/src/test-helpers/mock-pubsub.ts +138 -15
- package/src/test-helpers/mock-tx-helpers.ts +1 -1
- package/src/test-helpers/reqresp-nodes.ts +18 -30
- package/src/test-helpers/test_tx_provider.ts +69 -0
- package/src/test-helpers/testbench-utils.ts +465 -0
- package/src/testbench/p2p_client_testbench_worker.ts +406 -127
- package/src/testbench/worker_client_manager.ts +355 -46
- package/src/util.ts +47 -16
- package/src/versioning.ts +3 -33
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -30
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -190
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -25
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -197
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -150
- 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 -617
- package/dest/mem_pools/tx_pool/index.d.ts +0 -4
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -3
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -238
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -8
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -10
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -122
- 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 -394
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -70
- package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/index.js +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -92
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -31
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -56
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -300
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -54
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -176
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -256
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -253
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -750
- package/src/mem_pools/tx_pool/index.ts +0 -3
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -283
- package/src/mem_pools/tx_pool/priority.ts +0 -13
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -135
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -313
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -81
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -100
- package/src/services/reqresp/protocols/block.ts +0 -36
- package/src/services/tx_collection/fast_tx_collection.ts +0 -340
- package/src/services/tx_collection/slow_tx_collection.ts +0 -232
|
@@ -1,20 +1,28 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Attributes,
|
|
3
3
|
type Gauge,
|
|
4
|
+
type Histogram,
|
|
4
5
|
Metrics,
|
|
5
6
|
type TelemetryClient,
|
|
6
7
|
type Tracer,
|
|
7
8
|
type UpDownCounter,
|
|
8
|
-
|
|
9
|
+
createUpDownCounterWithDefault,
|
|
9
10
|
getTelemetryClient,
|
|
10
11
|
} from '@aztec/telemetry-client';
|
|
11
12
|
|
|
12
|
-
import
|
|
13
|
+
import type { PeerId } from '@libp2p/interface';
|
|
14
|
+
|
|
15
|
+
import { GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/index.js';
|
|
13
16
|
|
|
14
17
|
export class PeerManagerMetrics {
|
|
15
18
|
private sentGoodbyes: UpDownCounter;
|
|
16
19
|
private receivedGoodbyes: UpDownCounter;
|
|
17
20
|
private peerCount: Gauge;
|
|
21
|
+
private healthyPeerCount: Gauge;
|
|
22
|
+
private lowScoreDisconnects: UpDownCounter;
|
|
23
|
+
private peerConnectionDuration: Histogram;
|
|
24
|
+
|
|
25
|
+
private peerConnectedAt: Map<string, number> = new Map<string, number>();
|
|
18
26
|
|
|
19
27
|
public readonly tracer: Tracer;
|
|
20
28
|
|
|
@@ -25,21 +33,28 @@ export class PeerManagerMetrics {
|
|
|
25
33
|
this.tracer = telemetryClient.getTracer(name);
|
|
26
34
|
|
|
27
35
|
const meter = telemetryClient.getMeter(name);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
this.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
const goodbyeReasonAttrs = {
|
|
37
|
+
[Attributes.P2P_GOODBYE_REASON]: [
|
|
38
|
+
prettyGoodbyeReason(GoodByeReason.SHUTDOWN),
|
|
39
|
+
prettyGoodbyeReason(GoodByeReason.MAX_PEERS),
|
|
40
|
+
prettyGoodbyeReason(GoodByeReason.LOW_SCORE),
|
|
41
|
+
prettyGoodbyeReason(GoodByeReason.BANNED),
|
|
42
|
+
prettyGoodbyeReason(GoodByeReason.WRONG_NETWORK),
|
|
43
|
+
prettyGoodbyeReason(GoodByeReason.UNKNOWN),
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
this.sentGoodbyes = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_GOODBYES_SENT, goodbyeReasonAttrs);
|
|
47
|
+
this.receivedGoodbyes = createUpDownCounterWithDefault(
|
|
48
|
+
meter,
|
|
49
|
+
Metrics.PEER_MANAGER_GOODBYES_RECEIVED,
|
|
50
|
+
goodbyeReasonAttrs,
|
|
51
|
+
);
|
|
52
|
+
this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT);
|
|
53
|
+
this.healthyPeerCount = meter.createGauge(Metrics.PEER_MANAGER_HEALTHY_PEER_COUNT);
|
|
54
|
+
this.lowScoreDisconnects = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS, {
|
|
55
|
+
[Attributes.P2P_PEER_SCORE_STATE]: ['Banned', 'Disconnect'],
|
|
42
56
|
});
|
|
57
|
+
this.peerConnectionDuration = meter.createHistogram(Metrics.PEER_MANAGER_PEER_CONNECTION_DURATION);
|
|
43
58
|
}
|
|
44
59
|
|
|
45
60
|
public recordGoodbyeSent(reason: GoodByeReason) {
|
|
@@ -53,4 +68,24 @@ export class PeerManagerMetrics {
|
|
|
53
68
|
public recordPeerCount(count: number) {
|
|
54
69
|
this.peerCount.record(count);
|
|
55
70
|
}
|
|
71
|
+
|
|
72
|
+
public recordHealthyPeerCount(count: number) {
|
|
73
|
+
this.healthyPeerCount.record(count);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect') {
|
|
77
|
+
this.lowScoreDisconnects.add(1, { [Attributes.P2P_PEER_SCORE_STATE]: scoreState });
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public peerConnected(id: PeerId) {
|
|
81
|
+
this.peerConnectedAt.set(id.toString(), Date.now());
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public peerDisconnected(id: PeerId) {
|
|
85
|
+
const connectedAt = this.peerConnectedAt.get(id.toString());
|
|
86
|
+
if (connectedAt) {
|
|
87
|
+
this.peerConnectionDuration.record(Date.now() - connectedAt);
|
|
88
|
+
this.peerConnectedAt.delete(id.toString());
|
|
89
|
+
}
|
|
90
|
+
}
|
|
56
91
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
-
import {
|
|
2
|
+
import { compactArray } from '@aztec/foundation/collection';
|
|
3
|
+
import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
4
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
5
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
5
6
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
7
|
import { bufferToHex } from '@aztec/foundation/string';
|
|
7
8
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
8
9
|
import type { PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
9
10
|
import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
10
|
-
import {
|
|
11
|
+
import type { TelemetryClient } from '@aztec/telemetry-client';
|
|
11
12
|
|
|
12
13
|
import type { Connection, PeerId } from '@libp2p/interface';
|
|
13
14
|
import { peerIdFromString } from '@libp2p/peer-id';
|
|
@@ -32,7 +33,7 @@ import { PeerScoreState, type PeerScoring } from './peer_scoring.js';
|
|
|
32
33
|
const MAX_DIAL_ATTEMPTS = 3;
|
|
33
34
|
const MAX_CACHED_PEERS = 100;
|
|
34
35
|
const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
35
|
-
const
|
|
36
|
+
const DEFAULT_FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
|
|
36
37
|
const GOODBYE_DIAL_TIMEOUT_MS = 1000;
|
|
37
38
|
const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
|
|
38
39
|
|
|
@@ -161,10 +162,10 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
161
162
|
return this.metrics.tracer;
|
|
162
163
|
}
|
|
163
164
|
|
|
164
|
-
@trackSpan('PeerManager.heartbeat')
|
|
165
165
|
public async heartbeat() {
|
|
166
166
|
this.heartbeatCounter++;
|
|
167
167
|
this.peerScoring.decayAllScores();
|
|
168
|
+
this.peerScoring.pruneExpiredBans();
|
|
168
169
|
this.cleanupExpiredTimeouts();
|
|
169
170
|
|
|
170
171
|
await this.setupDirectPeersIfValidator();
|
|
@@ -199,21 +200,27 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
199
200
|
.then(peerIds => peerIds.forEach(peerId => this.preferredPeers.add(peerId.toString())))
|
|
200
201
|
.catch(e => this.logger.error('Error initializing preferred peers', e));
|
|
201
202
|
|
|
202
|
-
const directPeers = (
|
|
203
|
+
const directPeers = compactArray(
|
|
203
204
|
await Promise.all(
|
|
204
205
|
preferredPeersEnrs.map(async enr => {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
206
|
+
try {
|
|
207
|
+
const peerId = await enr.peerId();
|
|
208
|
+
const address = enr.getLocationMultiaddr('tcp');
|
|
209
|
+
if (address === undefined) {
|
|
210
|
+
throw new Error(`Direct peer ${peerId.toString()} has no TCP address, ENR: ${enr.encodeTxt()}`);
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
id: peerId,
|
|
214
|
+
addrs: [address],
|
|
215
|
+
};
|
|
216
|
+
} catch (err) {
|
|
217
|
+
// A malformed configured ENR shouldn't abort preferred-peer setup — skip it and log.
|
|
218
|
+
this.logger.warn(`Skipping preferred peer with invalid ENR`, { err });
|
|
219
|
+
return undefined;
|
|
209
220
|
}
|
|
210
|
-
return {
|
|
211
|
-
id: peerId,
|
|
212
|
-
addrs: [address],
|
|
213
|
-
};
|
|
214
221
|
}),
|
|
215
|
-
)
|
|
216
|
-
)
|
|
222
|
+
),
|
|
223
|
+
);
|
|
217
224
|
|
|
218
225
|
await Promise.all(
|
|
219
226
|
directPeers.map(peer => {
|
|
@@ -227,20 +234,30 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
227
234
|
}
|
|
228
235
|
|
|
229
236
|
/**
|
|
230
|
-
* Cleans up expired timeouts.
|
|
237
|
+
* Cleans up expired timeouts and stale failed-auth-handshake entries.
|
|
231
238
|
*
|
|
232
239
|
* When peers fail to dial after a number of retries, they are temporarily timed out.
|
|
233
240
|
* This function removes any peers that have been in the timed out state for too long.
|
|
234
241
|
* To give them a chance to reconnect.
|
|
242
|
+
*
|
|
243
|
+
* Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
|
|
244
|
+
* Without this, peers that probe once and never reconnect would leave their entries in the
|
|
245
|
+
* map forever, causing an unbounded memory leak.
|
|
235
246
|
*/
|
|
236
247
|
private cleanupExpiredTimeouts() {
|
|
237
|
-
// Clean up expired timeouts
|
|
238
248
|
const now = this.dateProvider.now();
|
|
249
|
+
|
|
239
250
|
for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
|
|
240
251
|
if (now >= timedOutPeer.timeoutUntilMs) {
|
|
241
252
|
this.timedOutPeers.delete(peerId);
|
|
242
253
|
}
|
|
243
254
|
}
|
|
255
|
+
|
|
256
|
+
for (const [id, entry] of this.failedAuthHandshakes.entries()) {
|
|
257
|
+
if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
|
|
258
|
+
this.failedAuthHandshakes.delete(id);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
244
261
|
}
|
|
245
262
|
|
|
246
263
|
/**
|
|
@@ -278,6 +295,7 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
278
295
|
private handleConnectedPeerEvent(e: CustomEvent<PeerId>) {
|
|
279
296
|
const peerId = e.detail;
|
|
280
297
|
this.logger.verbose(`Connected to peer ${peerId.toString()}`);
|
|
298
|
+
this.metrics.peerConnected(peerId);
|
|
281
299
|
if (this.config.p2pDisableStatusHandshake) {
|
|
282
300
|
return;
|
|
283
301
|
}
|
|
@@ -303,14 +321,20 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
303
321
|
*/
|
|
304
322
|
private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
|
|
305
323
|
const peerId = e.detail;
|
|
306
|
-
|
|
307
|
-
|
|
324
|
+
const peerIdStr = peerId.toString();
|
|
325
|
+
this.metrics.peerDisconnected(peerId);
|
|
326
|
+
this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
|
|
327
|
+
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
|
|
308
328
|
if (validatorAddress !== undefined) {
|
|
309
329
|
this.logger.info(
|
|
310
|
-
`Removing authentication for validator ${validatorAddress} at peer id ${
|
|
330
|
+
`Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`,
|
|
311
331
|
);
|
|
312
332
|
this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
|
|
313
|
-
this.authenticatedPeerIdToValidatorAddress.delete(
|
|
333
|
+
this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
|
|
337
|
+
this.peerScoring.removePeer(peerIdStr);
|
|
314
338
|
}
|
|
315
339
|
}
|
|
316
340
|
|
|
@@ -478,15 +502,38 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
478
502
|
*
|
|
479
503
|
* @returns: True if node is allowed to connect, otherwise false
|
|
480
504
|
* */
|
|
481
|
-
|
|
482
|
-
|
|
505
|
+
/**
|
|
506
|
+
* Whether a peer is allowed to connect, given its peer id. Rejects peers serving an active ban and
|
|
507
|
+
* peers that have exceeded the failed auth-handshake limit. Use this once the peer id is known —
|
|
508
|
+
* i.e. for the encrypted-inbound gater and when dialing.
|
|
509
|
+
*/
|
|
510
|
+
public isPeerAllowedToConnect(peerId: string | PeerId): boolean {
|
|
511
|
+
const id = peerId.toString();
|
|
512
|
+
if (this.peerScoring.getScoreState(id) === PeerScoreState.Banned) {
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
return this.isWithinFailedAuthLimit(id);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Whether a connection from an address is allowed. Bans are keyed by peer id, which isn't known at
|
|
520
|
+
* the raw-inbound layer, so only the failed auth-handshake limit (also tracked per address) is
|
|
521
|
+
* enforced here; the ban is applied once the peer id is known via {@link isPeerAllowedToConnect}.
|
|
522
|
+
*/
|
|
523
|
+
public isAddressAllowedToConnect(address: string): boolean {
|
|
524
|
+
return this.isWithinFailedAuthLimit(address);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/** Whether the failed auth-handshake count for a peer id or address is below the configured limit. */
|
|
528
|
+
private isWithinFailedAuthLimit(key: string): boolean {
|
|
529
|
+
const entry = this.failedAuthHandshakes.get(key);
|
|
483
530
|
if (!entry) {
|
|
484
531
|
return true;
|
|
485
532
|
}
|
|
486
533
|
|
|
487
534
|
// In case entry is too old, remove it and allow connection
|
|
488
535
|
if (this.dateProvider.now() - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
|
|
489
|
-
this.failedAuthHandshakes.delete(
|
|
536
|
+
this.failedAuthHandshakes.delete(key);
|
|
490
537
|
return true;
|
|
491
538
|
}
|
|
492
539
|
|
|
@@ -511,10 +558,12 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
511
558
|
protectedConnections: protectedPeerCount,
|
|
512
559
|
maxPeerCount: this.config.maxPeerCount,
|
|
513
560
|
cachedPeers: this.cachedPeers.size,
|
|
561
|
+
discv5KadPeers: this.peerDiscoveryService.getKadValues().length,
|
|
514
562
|
...this.peerScoring.getStats(),
|
|
515
563
|
});
|
|
516
564
|
|
|
517
|
-
this.metrics.recordPeerCount(
|
|
565
|
+
this.metrics.recordPeerCount(connections.length);
|
|
566
|
+
this.metrics.recordHealthyPeerCount(healthyConnections.length);
|
|
518
567
|
|
|
519
568
|
// Exit if no peers to connect
|
|
520
569
|
if (peersToConnect <= 0) {
|
|
@@ -577,9 +626,11 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
577
626
|
const score = this.peerScoring.getScoreState(peer.remotePeer.toString());
|
|
578
627
|
switch (score) {
|
|
579
628
|
case PeerScoreState.Banned:
|
|
629
|
+
this.metrics.recordLowScoreDisconnect('Banned');
|
|
580
630
|
void this.goodbyeAndDisconnectPeer(peer.remotePeer, GoodByeReason.BANNED);
|
|
581
631
|
break;
|
|
582
632
|
case PeerScoreState.Disconnect:
|
|
633
|
+
this.metrics.recordLowScoreDisconnect('Disconnect');
|
|
583
634
|
void this.goodbyeAndDisconnectPeer(peer.remotePeer, GoodByeReason.LOW_SCORE);
|
|
584
635
|
break;
|
|
585
636
|
case PeerScoreState.Healthy:
|
|
@@ -709,6 +760,12 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
709
760
|
return;
|
|
710
761
|
}
|
|
711
762
|
|
|
763
|
+
// Don't dial banned peers or those that have exceeded the auth failure threshold
|
|
764
|
+
if (!this.isPeerAllowedToConnect(peerId)) {
|
|
765
|
+
this.logger.trace(`Skipping peer ${peerId} due to ban or failed auth handshake attempts`);
|
|
766
|
+
return;
|
|
767
|
+
}
|
|
768
|
+
|
|
712
769
|
const [multiaddrTcp] = await Promise.all([enr.getFullMultiaddr('tcp')]);
|
|
713
770
|
|
|
714
771
|
this.logger.trace(`Handling discovered peer ${peerId} at ${multiaddrTcp?.toString() ?? 'undefined address'}`);
|
|
@@ -772,7 +829,8 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
772
829
|
// Add to timed out peers
|
|
773
830
|
this.timedOutPeers.set(id, {
|
|
774
831
|
peerId: id,
|
|
775
|
-
timeoutUntilMs:
|
|
832
|
+
timeoutUntilMs:
|
|
833
|
+
this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS),
|
|
776
834
|
});
|
|
777
835
|
}
|
|
778
836
|
}
|
|
@@ -934,6 +992,8 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
934
992
|
`Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
|
|
935
993
|
{ ...logData, address: sender.toString() },
|
|
936
994
|
);
|
|
995
|
+
this.markAuthHandshakeFailed(peerId);
|
|
996
|
+
this.markPeerForDisconnect(peerId);
|
|
937
997
|
return;
|
|
938
998
|
}
|
|
939
999
|
|
|
@@ -963,14 +1023,14 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
963
1023
|
const peerIdStr = peerId.toString();
|
|
964
1024
|
|
|
965
1025
|
const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
|
|
1026
|
+
const failureCount = (existingEntry?.count || 0) + 1;
|
|
966
1027
|
this.failedAuthHandshakes.set(peerIdStr, {
|
|
967
|
-
count:
|
|
1028
|
+
count: failureCount,
|
|
968
1029
|
lastFailureTimestamp: now,
|
|
969
1030
|
});
|
|
970
1031
|
|
|
971
1032
|
const connections = this.libP2PNode.getConnections(peerId);
|
|
972
1033
|
connections.forEach(conn => {
|
|
973
|
-
// We mark the IP address
|
|
974
1034
|
const address = conn.remoteAddr.nodeAddress().address;
|
|
975
1035
|
const existingAddressEntry = this.failedAuthHandshakes.get(address);
|
|
976
1036
|
this.failedAuthHandshakes.set(address, {
|
|
@@ -978,6 +1038,15 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
978
1038
|
lastFailureTimestamp: now,
|
|
979
1039
|
});
|
|
980
1040
|
});
|
|
1041
|
+
|
|
1042
|
+
// Ban the peer from being re-dialed for a cooldown period (exponential backoff)
|
|
1043
|
+
const banTimeMs = this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS;
|
|
1044
|
+
const backoffMs = banTimeMs * Math.pow(2, Math.min(failureCount - 1, 5));
|
|
1045
|
+
this.timedOutPeers.set(peerIdStr, {
|
|
1046
|
+
peerId: peerIdStr,
|
|
1047
|
+
timeoutUntilMs: now + backoffMs,
|
|
1048
|
+
});
|
|
1049
|
+
this.cachedPeers.delete(peerIdStr);
|
|
981
1050
|
}
|
|
982
1051
|
|
|
983
1052
|
/*
|
|
@@ -1,11 +1,35 @@
|
|
|
1
1
|
import { median } from '@aztec/foundation/collection';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
3
4
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
5
|
+
import {
|
|
6
|
+
Attributes,
|
|
7
|
+
Metrics,
|
|
8
|
+
type TelemetryClient,
|
|
9
|
+
type UpDownCounter,
|
|
10
|
+
createUpDownCounterWithDefault,
|
|
11
|
+
getTelemetryClient,
|
|
12
|
+
} from '@aztec/telemetry-client';
|
|
4
13
|
|
|
5
14
|
import type { PeerId } from '@libp2p/interface';
|
|
6
15
|
|
|
7
16
|
import type { P2PConfig } from '../../config.js';
|
|
8
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Application-level peer penalties.
|
|
20
|
+
*
|
|
21
|
+
* These scores are multiplied by appSpecificWeight (10) when contributing to gossipsub score.
|
|
22
|
+
* The values are designed to align with gossipsub thresholds:
|
|
23
|
+
*
|
|
24
|
+
* - LowToleranceError (50): 1 error → app score -50 → gossipsub -500 → gossipThreshold
|
|
25
|
+
* - MidToleranceError (10): 5 errors → app score -50 → gossipsub -500 → gossipThreshold
|
|
26
|
+
* - HighToleranceError (2): 25 errors → app score -50 → gossipsub -500 → gossipThreshold
|
|
27
|
+
*
|
|
28
|
+
* Examples of each severity:
|
|
29
|
+
* - LowToleranceError: Invalid messages, deserialization errors, manipulation attempts
|
|
30
|
+
* - MidToleranceError: Hash mismatches, protocol violations
|
|
31
|
+
* - HighToleranceError: Rate limit exceeded, failed responses, transient errors
|
|
32
|
+
*/
|
|
9
33
|
const DefaultPeerPenalties = {
|
|
10
34
|
[PeerErrorSeverity.LowToleranceError]: 50,
|
|
11
35
|
[PeerErrorSeverity.MidToleranceError]: 10,
|
|
@@ -18,9 +42,23 @@ export enum PeerScoreState {
|
|
|
18
42
|
Healthy,
|
|
19
43
|
}
|
|
20
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Score thresholds for peer states.
|
|
47
|
+
*
|
|
48
|
+
* These values align with gossipsub thresholds when multiplied by appSpecificWeight (10):
|
|
49
|
+
* - MIN_SCORE_BEFORE_DISCONNECT (-50) × 10 = -500 = gossipThreshold
|
|
50
|
+
* - MIN_SCORE_BEFORE_BAN (-100) × 10 = -1000 = publishThreshold
|
|
51
|
+
*
|
|
52
|
+
* This ensures that when a peer is disconnected at the application level,
|
|
53
|
+
* they also stop receiving gossip, and when banned, they cannot publish.
|
|
54
|
+
*/
|
|
21
55
|
// TODO: move into config / constants
|
|
22
56
|
const MIN_SCORE_BEFORE_BAN = -100;
|
|
23
57
|
const MIN_SCORE_BEFORE_DISCONNECT = -50;
|
|
58
|
+
const SCORE_CLEANUP_THRESHOLD = 0.1;
|
|
59
|
+
|
|
60
|
+
/** An active ban: the score the peer held when banned, and the timestamp at which the ban lifts. */
|
|
61
|
+
type BanRecord = { score: number; expiry: number };
|
|
24
62
|
|
|
25
63
|
export class PeerScoring {
|
|
26
64
|
private logger = createLogger('p2p:peer-scoring');
|
|
@@ -30,7 +68,23 @@ export class PeerScoring {
|
|
|
30
68
|
private decayFactor = 0.9;
|
|
31
69
|
peerPenalties: { [key in PeerErrorSeverity]: number };
|
|
32
70
|
|
|
33
|
-
|
|
71
|
+
private peerStateCounter: UpDownCounter;
|
|
72
|
+
|
|
73
|
+
/** Active bans, keyed by peer id. Held in memory only, so they are cleared on restart. */
|
|
74
|
+
private bannedPeers: Map<string, BanRecord> = new Map();
|
|
75
|
+
/**
|
|
76
|
+
* How long a peer remains banned once its score crosses MIN_SCORE_BEFORE_BAN. While banned, the
|
|
77
|
+
* peer's ban score is returned by getScore regardless of decay, so it cannot recover its way out
|
|
78
|
+
* of the ban early. After the ban expires the live (decayed) score takes over again.
|
|
79
|
+
*/
|
|
80
|
+
private readonly banDurationMs: number;
|
|
81
|
+
|
|
82
|
+
constructor(
|
|
83
|
+
config: P2PConfig,
|
|
84
|
+
telemetry: TelemetryClient = getTelemetryClient(),
|
|
85
|
+
private readonly dateProvider: DateProvider = new DateProvider(),
|
|
86
|
+
) {
|
|
87
|
+
this.banDurationMs = config.peerBanDurationSeconds * 1000;
|
|
34
88
|
const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
|
|
35
89
|
this.peerPenalties = {
|
|
36
90
|
[PeerErrorSeverity.HighToleranceError]:
|
|
@@ -40,6 +94,12 @@ export class PeerScoring {
|
|
|
40
94
|
[PeerErrorSeverity.LowToleranceError]:
|
|
41
95
|
orderedValues?.[2] ?? DefaultPeerPenalties[PeerErrorSeverity.LowToleranceError],
|
|
42
96
|
};
|
|
97
|
+
|
|
98
|
+
const meter = telemetry.getMeter('PeerScoring');
|
|
99
|
+
|
|
100
|
+
this.peerStateCounter = createUpDownCounterWithDefault(meter, Metrics.P2P_PEER_STATE_COUNT, {
|
|
101
|
+
[Attributes.P2P_PEER_SCORE_STATE]: ['Healthy', 'Disconnect', 'Banned'],
|
|
102
|
+
});
|
|
43
103
|
}
|
|
44
104
|
|
|
45
105
|
public penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity) {
|
|
@@ -51,7 +111,7 @@ export class PeerScoring {
|
|
|
51
111
|
}
|
|
52
112
|
|
|
53
113
|
updateScore(peerId: string, scoreDelta: number): number {
|
|
54
|
-
const currentTime =
|
|
114
|
+
const currentTime = this.dateProvider.now();
|
|
55
115
|
const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
|
|
56
116
|
const timePassed = currentTime - lastUpdate;
|
|
57
117
|
const decayPeriods = Math.floor(timePassed / this.decayInterval);
|
|
@@ -66,29 +126,102 @@ export class PeerScoring {
|
|
|
66
126
|
|
|
67
127
|
this.scores.set(peerId, currentScore);
|
|
68
128
|
this.lastUpdateTime.set(peerId, currentTime);
|
|
129
|
+
|
|
130
|
+
this.maybeBanPeer(peerId, currentScore);
|
|
131
|
+
|
|
69
132
|
return currentScore;
|
|
70
133
|
}
|
|
71
134
|
|
|
135
|
+
/**
|
|
136
|
+
* Records a ban for a peer whose score has crossed the ban threshold, with an expiry banDurationMs
|
|
137
|
+
* in the future. No-op if the score is above the threshold or the peer is already serving an active
|
|
138
|
+
* ban (an existing ban is not extended; the original window stands). A previously expired ban does
|
|
139
|
+
* not block a fresh one — getActiveBanScore prunes it first.
|
|
140
|
+
*/
|
|
141
|
+
private maybeBanPeer(peerId: string, score: number): void {
|
|
142
|
+
if (score >= MIN_SCORE_BEFORE_BAN || this.getActiveBanScore(peerId) !== undefined) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const record: BanRecord = { score, expiry: this.dateProvider.now() + this.banDurationMs };
|
|
146
|
+
this.bannedPeers.set(peerId, record);
|
|
147
|
+
this.logger.verbose(`Banning peer ${peerId} until ${new Date(record.expiry).toISOString()}`, {
|
|
148
|
+
peerId,
|
|
149
|
+
score,
|
|
150
|
+
expiry: record.expiry,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
72
154
|
decayAllScores(): void {
|
|
73
|
-
const currentTime =
|
|
155
|
+
const currentTime = this.dateProvider.now();
|
|
74
156
|
for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
|
|
75
157
|
const timePassed = currentTime - lastUpdate;
|
|
76
158
|
const decayPeriods = Math.floor(timePassed / this.decayInterval);
|
|
77
159
|
if (decayPeriods > 0) {
|
|
78
160
|
let score = this.scores.get(peerId) || 0;
|
|
79
161
|
score *= Math.pow(this.decayFactor, decayPeriods);
|
|
80
|
-
|
|
81
|
-
|
|
162
|
+
if (Math.abs(score) < SCORE_CLEANUP_THRESHOLD) {
|
|
163
|
+
this.scores.delete(peerId);
|
|
164
|
+
this.lastUpdateTime.delete(peerId);
|
|
165
|
+
} else {
|
|
166
|
+
this.scores.set(peerId, score);
|
|
167
|
+
this.lastUpdateTime.set(peerId, currentTime);
|
|
168
|
+
}
|
|
82
169
|
}
|
|
83
170
|
}
|
|
84
171
|
}
|
|
85
172
|
|
|
173
|
+
/**
|
|
174
|
+
* Removes bans whose window has elapsed. Expired bans are otherwise only pruned lazily when their
|
|
175
|
+
* peer's score is next queried, so a banned peer that disconnects and is never queried again would
|
|
176
|
+
* linger in the map. Called periodically (per heartbeat) to bound the ban map's size.
|
|
177
|
+
*/
|
|
178
|
+
pruneExpiredBans(): void {
|
|
179
|
+
const now = this.dateProvider.now();
|
|
180
|
+
const expired = [...this.bannedPeers.entries()].filter(([, ban]) => ban.expiry <= now).map(([peerId]) => peerId);
|
|
181
|
+
for (const peerId of expired) {
|
|
182
|
+
this.bannedPeers.delete(peerId);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** Resets all peer scores. Useful for benchmarks to prevent cross-case contamination. */
|
|
187
|
+
resetAllScores(): void {
|
|
188
|
+
this.scores.clear();
|
|
189
|
+
this.lastUpdateTime.clear();
|
|
190
|
+
this.bannedPeers.clear();
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
removePeer(peerId: string): void {
|
|
194
|
+
this.scores.delete(peerId);
|
|
195
|
+
this.lastUpdateTime.delete(peerId);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* The single source of truth for whether a peer is banned. Returns the ban score while the ban is
|
|
200
|
+
* active, or undefined if the peer is not banned. A ban that has expired is lazily lifted before
|
|
201
|
+
* returning undefined, so callers never see a stale ban.
|
|
202
|
+
*/
|
|
203
|
+
private getActiveBanScore(peerId: string): number | undefined {
|
|
204
|
+
const ban = this.bannedPeers.get(peerId);
|
|
205
|
+
if (ban === undefined) {
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
if (ban.expiry > this.dateProvider.now()) {
|
|
209
|
+
return ban.score;
|
|
210
|
+
}
|
|
211
|
+
// Ban expired: lift it so the peer can recover.
|
|
212
|
+
this.bannedPeers.delete(peerId);
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
|
|
86
216
|
getScore(peerId: string): number {
|
|
87
|
-
|
|
217
|
+
// While a ban is active its ban score is returned regardless of how the live score has decayed,
|
|
218
|
+
// so the peer stays banned for the full duration.
|
|
219
|
+
return this.getActiveBanScore(peerId) ?? this.scores.get(peerId) ?? 0;
|
|
88
220
|
}
|
|
89
221
|
|
|
90
222
|
public getScoreState(peerId: string): PeerScoreState {
|
|
91
|
-
//
|
|
223
|
+
// A banned peer stays banned for the full ban duration regardless of score decay (see getScore /
|
|
224
|
+
// maybeBanPeer), rather than silently recovering once its decayed score is cleaned up.
|
|
92
225
|
const score = this.getScore(peerId);
|
|
93
226
|
if (score < MIN_SCORE_BEFORE_BAN) {
|
|
94
227
|
return PeerScoreState.Banned;
|
|
@@ -99,7 +232,35 @@ export class PeerScoring {
|
|
|
99
232
|
return PeerScoreState.Healthy;
|
|
100
233
|
}
|
|
101
234
|
|
|
102
|
-
getStats(): { medianScore: number } {
|
|
103
|
-
|
|
235
|
+
getStats(): { medianScore: number; healthyCount: number; disconnectCount: number; bannedCount: number } {
|
|
236
|
+
const stateCounts = { healthy: 0, disconnect: 0, banned: 0 };
|
|
237
|
+
|
|
238
|
+
// Include banned peers whose live score may have been decayed away but whose ban is still active.
|
|
239
|
+
const peerIds = new Set([...this.scores.keys(), ...this.bannedPeers.keys()]);
|
|
240
|
+
for (const peerId of peerIds) {
|
|
241
|
+
const state = this.getScoreState(peerId);
|
|
242
|
+
switch (state) {
|
|
243
|
+
case PeerScoreState.Healthy:
|
|
244
|
+
stateCounts.healthy++;
|
|
245
|
+
break;
|
|
246
|
+
case PeerScoreState.Disconnect:
|
|
247
|
+
stateCounts.disconnect++;
|
|
248
|
+
break;
|
|
249
|
+
case PeerScoreState.Banned:
|
|
250
|
+
stateCounts.banned++;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
this.peerStateCounter.add(stateCounts.healthy, { [Attributes.P2P_PEER_SCORE_STATE]: 'Healthy' });
|
|
256
|
+
this.peerStateCounter.add(stateCounts.disconnect, { [Attributes.P2P_PEER_SCORE_STATE]: 'Disconnect' });
|
|
257
|
+
this.peerStateCounter.add(stateCounts.banned, { [Attributes.P2P_PEER_SCORE_STATE]: 'Banned' });
|
|
258
|
+
|
|
259
|
+
return {
|
|
260
|
+
medianScore: median(Array.from(this.scores.values())) ?? 0,
|
|
261
|
+
healthyCount: stateCounts.healthy,
|
|
262
|
+
disconnectCount: stateCounts.disconnect,
|
|
263
|
+
bannedCount: stateCounts.banned,
|
|
264
|
+
};
|
|
104
265
|
}
|
|
105
266
|
}
|