@aztec/p2p 0.0.1-commit.f2ce05ee → 0.0.1-commit.f5a9928
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 +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +22 -6
- package/dest/client/factory.d.ts +11 -10
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +64 -17
- package/dest/client/interface.d.ts +86 -40
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +67 -64
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +251 -251
- package/dest/config.d.ts +173 -94
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +158 -44
- 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 +106 -55
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +302 -195
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +274 -115
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +7 -5
- package/dest/mem_pools/index.d.ts +2 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +12 -5
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +38 -17
- package/dest/mem_pools/interface.d.ts +3 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +10 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +29 -20
- 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 +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
- 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 +8 -4
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +15 -5
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +3 -2
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +2 -1
- 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 +64 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +6 -5
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +9 -8
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +15 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
- 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 +16 -4
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
- 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 +3 -3
- package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +2 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +25 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +67 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +62 -16
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +6 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +81 -15
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +147 -19
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +26 -3
- 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 +79 -43
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +27 -7
- 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 +94 -32
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +62 -9
- 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 +537 -246
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +12 -5
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +12 -5
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +36 -9
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +130 -48
- 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.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- package/dest/msg_validators/tx_validator/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 +2 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +36 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
- package/dest/msg_validators/tx_validator/factory.d.ts +133 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +261 -61
- 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 +104 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
- package/dest/msg_validators/tx_validator/index.d.ts +5 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +4 -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/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 +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
- 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 +5 -5
- 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 +119 -23
- 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 +25 -19
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +28 -20
- package/dest/services/encoding.d.ts +24 -7
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +43 -26
- package/dest/services/gossipsub/topic_score_params.d.ts +23 -17
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +36 -24
- package/dest/services/libp2p/instrumentation.d.ts +6 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +21 -0
- package/dest/services/libp2p/libp2p_service.d.ts +71 -60
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +602 -407
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- package/dest/services/peer-manager/peer_manager.d.ts +31 -3
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +127 -26
- package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +102 -13
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +5 -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 +95 -127
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +11 -11
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- 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/interface.d.ts +25 -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 +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +18 -7
- 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 +57 -24
- 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/tx.d.ts +7 -1
- 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/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/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 +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +85 -219
- package/dest/services/service.d.ts +63 -19
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +11 -14
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +26 -33
- 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 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -1
- package/dest/services/tx_collection/instrumentation.js +1 -2
- 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 +45 -51
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +296 -68
- package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
- 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 +1 -3
- package/dest/services/tx_file_store/config.d.ts.map +1 -1
- package/dest/services/tx_file_store/config.js +0 -4
- package/dest/services/tx_file_store/tx_file_store.d.ts +4 -5
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +13 -20
- package/dest/services/tx_provider.d.ts +6 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +12 -8
- 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 +56 -6
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +128 -14
- 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 +17 -19
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +49 -37
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +142 -50
- package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +112 -49
- package/dest/testbench/worker_client_manager.d.ts +12 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +57 -11
- package/dest/util.d.ts +13 -8
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +17 -17
- package/src/bootstrap/bootstrap.ts +17 -3
- package/src/client/factory.ts +129 -28
- package/src/client/interface.ts +88 -48
- package/src/client/p2p_client.ts +284 -317
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +280 -49
- 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 +373 -236
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +298 -119
- package/src/mem_pools/attestation_pool/index.ts +3 -3
- package/src/mem_pools/attestation_pool/mocks.ts +14 -8
- package/src/mem_pools/index.ts +1 -1
- package/src/mem_pools/instrumentation.ts +27 -17
- package/src/mem_pools/interface.ts +2 -2
- package/src/mem_pools/tx_pool_v2/README.md +85 -11
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +6 -4
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +21 -6
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +5 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +4 -6
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -10
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -10
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
- package/src/mem_pools/tx_pool_v2/index.ts +2 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +96 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +63 -16
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +215 -27
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +91 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +122 -33
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +602 -242
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +155 -49
- 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 +1 -1
- package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
- 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 +44 -1
- package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
- package/src/msg_validators/tx_validator/factory.ts +413 -80
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +195 -54
- package/src/msg_validators/tx_validator/index.ts +4 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +126 -14
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +38 -46
- package/src/services/encoding.ts +42 -26
- package/src/services/gossipsub/README.md +59 -22
- package/src/services/gossipsub/topic_score_params.ts +58 -31
- package/src/services/libp2p/instrumentation.ts +22 -0
- package/src/services/libp2p/libp2p_service.ts +687 -466
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +140 -25
- package/src/services/peer-manager/peer_scoring.ts +102 -8
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +92 -138
- package/src/services/reqresp/batch-tx-requester/interface.ts +14 -10
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +19 -2
- package/src/services/reqresp/interface.ts +45 -46
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +36 -32
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +64 -20
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +23 -3
- 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 +100 -263
- package/src/services/service.ts +80 -35
- package/src/services/tx_collection/config.ts +40 -49
- 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 -6
- package/src/services/tx_collection/instrumentation.ts +1 -1
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +362 -110
- 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 +0 -6
- package/src/services/tx_file_store/tx_file_store.ts +15 -25
- package/src/services/tx_provider.ts +15 -9
- package/src/test-helpers/make-test-p2p-clients.ts +7 -6
- package/src/test-helpers/mock-pubsub.ts +152 -14
- package/src/test-helpers/reqresp-nodes.ts +15 -28
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +171 -68
- package/src/testbench/p2p_client_testbench_worker.ts +121 -64
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +40 -19
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- 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/clock_tolerance.d.ts +0 -21
- package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
- package/dest/msg_validators/clock_tolerance.js +0 -37
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
- 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 -212
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- 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 -151
- 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 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -52
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -307
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -49
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -53
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -177
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -336
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- 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/clock_tolerance.ts +0 -51
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -354
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -112
- package/src/services/tx_collection/slow_tx_collection.ts +0 -233
|
@@ -18,6 +18,7 @@ export class PeerManagerMetrics {
|
|
|
18
18
|
private sentGoodbyes: UpDownCounter;
|
|
19
19
|
private receivedGoodbyes: UpDownCounter;
|
|
20
20
|
private peerCount: Gauge;
|
|
21
|
+
private healthyPeerCount: Gauge;
|
|
21
22
|
private lowScoreDisconnects: UpDownCounter;
|
|
22
23
|
private peerConnectionDuration: Histogram;
|
|
23
24
|
|
|
@@ -49,6 +50,7 @@ export class PeerManagerMetrics {
|
|
|
49
50
|
goodbyeReasonAttrs,
|
|
50
51
|
);
|
|
51
52
|
this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT);
|
|
53
|
+
this.healthyPeerCount = meter.createGauge(Metrics.PEER_MANAGER_HEALTHY_PEER_COUNT);
|
|
52
54
|
this.lowScoreDisconnects = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS, {
|
|
53
55
|
[Attributes.P2P_PEER_SCORE_STATE]: ['Banned', 'Disconnect'],
|
|
54
56
|
});
|
|
@@ -67,6 +69,10 @@ export class PeerManagerMetrics {
|
|
|
67
69
|
this.peerCount.record(count);
|
|
68
70
|
}
|
|
69
71
|
|
|
72
|
+
public recordHealthyPeerCount(count: number) {
|
|
73
|
+
this.healthyPeerCount.record(count);
|
|
74
|
+
}
|
|
75
|
+
|
|
70
76
|
public recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect') {
|
|
71
77
|
this.lowScoreDisconnects.add(1, { [Attributes.P2P_PEER_SCORE_STATE]: scoreState });
|
|
72
78
|
}
|
|
@@ -79,6 +85,7 @@ export class PeerManagerMetrics {
|
|
|
79
85
|
const connectedAt = this.peerConnectedAt.get(id.toString());
|
|
80
86
|
if (connectedAt) {
|
|
81
87
|
this.peerConnectionDuration.record(Date.now() - connectedAt);
|
|
88
|
+
this.peerConnectedAt.delete(id.toString());
|
|
82
89
|
}
|
|
83
90
|
}
|
|
84
91
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
+
import { compactArray } from '@aztec/foundation/collection';
|
|
2
3
|
import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
3
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
5
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
@@ -32,9 +33,11 @@ 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
|
|
39
|
+
const ZERO_PEER_WARNING_THRESHOLD_HEARTBEATS = 3; // tolerate transient dips, such as at startup
|
|
40
|
+
const ZERO_PEER_WARNING_REPEAT_INTERVAL_MS = 60 * 1000;
|
|
38
41
|
|
|
39
42
|
type CachedPeer = {
|
|
40
43
|
peerId: PeerId;
|
|
@@ -70,6 +73,10 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
70
73
|
private failedAuthHandshakes: Map<string, FailedAuthHandshakeEntry> = new Map();
|
|
71
74
|
private validatorAddresses: EthAddress[] = [];
|
|
72
75
|
private initializedPreferredPeers: boolean = false;
|
|
76
|
+
private consecutiveZeroPeerHeartbeats: number = 0;
|
|
77
|
+
private zeroPeerWarningHeartbeats: number = 0;
|
|
78
|
+
private zeroPeerWarningIssued: boolean = false;
|
|
79
|
+
private lastConnectedPeerAtMs: number | undefined;
|
|
73
80
|
|
|
74
81
|
private metrics: PeerManagerMetrics;
|
|
75
82
|
private handlers: {
|
|
@@ -114,6 +121,10 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
114
121
|
|
|
115
122
|
// Display peer counts every 60 seconds
|
|
116
123
|
this.displayPeerCountsPeerHeartbeat = Math.floor(60_000 / this.config.peerCheckIntervalMS);
|
|
124
|
+
this.zeroPeerWarningHeartbeats = Math.max(
|
|
125
|
+
1,
|
|
126
|
+
Math.floor(ZERO_PEER_WARNING_REPEAT_INTERVAL_MS / this.config.peerCheckIntervalMS),
|
|
127
|
+
);
|
|
117
128
|
}
|
|
118
129
|
/**
|
|
119
130
|
* Initializes the trusted peers.
|
|
@@ -164,6 +175,7 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
164
175
|
public async heartbeat() {
|
|
165
176
|
this.heartbeatCounter++;
|
|
166
177
|
this.peerScoring.decayAllScores();
|
|
178
|
+
this.peerScoring.pruneExpiredBans();
|
|
167
179
|
this.cleanupExpiredTimeouts();
|
|
168
180
|
|
|
169
181
|
await this.setupDirectPeersIfValidator();
|
|
@@ -171,6 +183,45 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
171
183
|
await this.processScheduledDisconnects();
|
|
172
184
|
|
|
173
185
|
this.discover();
|
|
186
|
+
this.checkPeerConnectivity();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Flags a node that has been left without any connected peers, since it can neither gossip nor propagate txs.
|
|
191
|
+
*
|
|
192
|
+
* Warnings only start after a few consecutive zero-peer heartbeats so that startup or a transient dip stays quiet,
|
|
193
|
+
* and then repeat roughly once a minute instead of on every heartbeat. Recovery is logged once.
|
|
194
|
+
*/
|
|
195
|
+
private checkPeerConnectivity() {
|
|
196
|
+
const connectedPeerCount = this.libP2PNode.getPeers().length;
|
|
197
|
+
const now = this.dateProvider.now();
|
|
198
|
+
|
|
199
|
+
if (connectedPeerCount > 0) {
|
|
200
|
+
if (this.zeroPeerWarningIssued) {
|
|
201
|
+
this.logger.info(`Peer connectivity restored with ${connectedPeerCount} connected peers`, {
|
|
202
|
+
connectedPeerCount,
|
|
203
|
+
zeroPeerHeartbeats: this.consecutiveZeroPeerHeartbeats,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
this.consecutiveZeroPeerHeartbeats = 0;
|
|
207
|
+
this.zeroPeerWarningIssued = false;
|
|
208
|
+
this.lastConnectedPeerAtMs = now;
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
this.consecutiveZeroPeerHeartbeats++;
|
|
213
|
+
const heartbeatsSinceThreshold = this.consecutiveZeroPeerHeartbeats - ZERO_PEER_WARNING_THRESHOLD_HEARTBEATS;
|
|
214
|
+
if (heartbeatsSinceThreshold < 0 || heartbeatsSinceThreshold % this.zeroPeerWarningHeartbeats !== 0) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
this.zeroPeerWarningIssued = true;
|
|
219
|
+
this.logger.warn('Node has no connected peers; gossip and tx propagation are unavailable', {
|
|
220
|
+
zeroPeerHeartbeats: this.consecutiveZeroPeerHeartbeats,
|
|
221
|
+
peerCheckIntervalMS: this.config.peerCheckIntervalMS,
|
|
222
|
+
msSinceLastConnectedPeer: this.lastConnectedPeerAtMs === undefined ? undefined : now - this.lastConnectedPeerAtMs,
|
|
223
|
+
cachedPeers: this.cachedPeers.size,
|
|
224
|
+
});
|
|
174
225
|
}
|
|
175
226
|
|
|
176
227
|
/*
|
|
@@ -198,21 +249,27 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
198
249
|
.then(peerIds => peerIds.forEach(peerId => this.preferredPeers.add(peerId.toString())))
|
|
199
250
|
.catch(e => this.logger.error('Error initializing preferred peers', e));
|
|
200
251
|
|
|
201
|
-
const directPeers = (
|
|
252
|
+
const directPeers = compactArray(
|
|
202
253
|
await Promise.all(
|
|
203
254
|
preferredPeersEnrs.map(async enr => {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
255
|
+
try {
|
|
256
|
+
const peerId = await enr.peerId();
|
|
257
|
+
const address = enr.getLocationMultiaddr('tcp');
|
|
258
|
+
if (address === undefined) {
|
|
259
|
+
throw new Error(`Direct peer ${peerId.toString()} has no TCP address, ENR: ${enr.encodeTxt()}`);
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
id: peerId,
|
|
263
|
+
addrs: [address],
|
|
264
|
+
};
|
|
265
|
+
} catch (err) {
|
|
266
|
+
// A malformed configured ENR shouldn't abort preferred-peer setup — skip it and log.
|
|
267
|
+
this.logger.warn(`Skipping preferred peer with invalid ENR`, { err });
|
|
268
|
+
return undefined;
|
|
208
269
|
}
|
|
209
|
-
return {
|
|
210
|
-
id: peerId,
|
|
211
|
-
addrs: [address],
|
|
212
|
-
};
|
|
213
270
|
}),
|
|
214
|
-
)
|
|
215
|
-
)
|
|
271
|
+
),
|
|
272
|
+
);
|
|
216
273
|
|
|
217
274
|
await Promise.all(
|
|
218
275
|
directPeers.map(peer => {
|
|
@@ -226,20 +283,30 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
226
283
|
}
|
|
227
284
|
|
|
228
285
|
/**
|
|
229
|
-
* Cleans up expired timeouts.
|
|
286
|
+
* Cleans up expired timeouts and stale failed-auth-handshake entries.
|
|
230
287
|
*
|
|
231
288
|
* When peers fail to dial after a number of retries, they are temporarily timed out.
|
|
232
289
|
* This function removes any peers that have been in the timed out state for too long.
|
|
233
290
|
* To give them a chance to reconnect.
|
|
291
|
+
*
|
|
292
|
+
* Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
|
|
293
|
+
* Without this, peers that probe once and never reconnect would leave their entries in the
|
|
294
|
+
* map forever, causing an unbounded memory leak.
|
|
234
295
|
*/
|
|
235
296
|
private cleanupExpiredTimeouts() {
|
|
236
|
-
// Clean up expired timeouts
|
|
237
297
|
const now = this.dateProvider.now();
|
|
298
|
+
|
|
238
299
|
for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
|
|
239
300
|
if (now >= timedOutPeer.timeoutUntilMs) {
|
|
240
301
|
this.timedOutPeers.delete(peerId);
|
|
241
302
|
}
|
|
242
303
|
}
|
|
304
|
+
|
|
305
|
+
for (const [id, entry] of this.failedAuthHandshakes.entries()) {
|
|
306
|
+
if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
|
|
307
|
+
this.failedAuthHandshakes.delete(id);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
243
310
|
}
|
|
244
311
|
|
|
245
312
|
/**
|
|
@@ -303,15 +370,20 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
303
370
|
*/
|
|
304
371
|
private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
|
|
305
372
|
const peerId = e.detail;
|
|
373
|
+
const peerIdStr = peerId.toString();
|
|
306
374
|
this.metrics.peerDisconnected(peerId);
|
|
307
|
-
this.logger.verbose(`Disconnected from peer ${
|
|
308
|
-
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(
|
|
375
|
+
this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
|
|
376
|
+
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
|
|
309
377
|
if (validatorAddress !== undefined) {
|
|
310
378
|
this.logger.info(
|
|
311
|
-
`Removing authentication for validator ${validatorAddress} at peer id ${
|
|
379
|
+
`Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`,
|
|
312
380
|
);
|
|
313
381
|
this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
|
|
314
|
-
this.authenticatedPeerIdToValidatorAddress.delete(
|
|
382
|
+
this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
|
|
386
|
+
this.peerScoring.removePeer(peerIdStr);
|
|
315
387
|
}
|
|
316
388
|
}
|
|
317
389
|
|
|
@@ -479,15 +551,38 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
479
551
|
*
|
|
480
552
|
* @returns: True if node is allowed to connect, otherwise false
|
|
481
553
|
* */
|
|
482
|
-
|
|
483
|
-
|
|
554
|
+
/**
|
|
555
|
+
* Whether a peer is allowed to connect, given its peer id. Rejects peers serving an active ban and
|
|
556
|
+
* peers that have exceeded the failed auth-handshake limit. Use this once the peer id is known —
|
|
557
|
+
* i.e. for the encrypted-inbound gater and when dialing.
|
|
558
|
+
*/
|
|
559
|
+
public isPeerAllowedToConnect(peerId: string | PeerId): boolean {
|
|
560
|
+
const id = peerId.toString();
|
|
561
|
+
if (this.peerScoring.getScoreState(id) === PeerScoreState.Banned) {
|
|
562
|
+
return false;
|
|
563
|
+
}
|
|
564
|
+
return this.isWithinFailedAuthLimit(id);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Whether a connection from an address is allowed. Bans are keyed by peer id, which isn't known at
|
|
569
|
+
* the raw-inbound layer, so only the failed auth-handshake limit (also tracked per address) is
|
|
570
|
+
* enforced here; the ban is applied once the peer id is known via {@link isPeerAllowedToConnect}.
|
|
571
|
+
*/
|
|
572
|
+
public isAddressAllowedToConnect(address: string): boolean {
|
|
573
|
+
return this.isWithinFailedAuthLimit(address);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/** Whether the failed auth-handshake count for a peer id or address is below the configured limit. */
|
|
577
|
+
private isWithinFailedAuthLimit(key: string): boolean {
|
|
578
|
+
const entry = this.failedAuthHandshakes.get(key);
|
|
484
579
|
if (!entry) {
|
|
485
580
|
return true;
|
|
486
581
|
}
|
|
487
582
|
|
|
488
583
|
// In case entry is too old, remove it and allow connection
|
|
489
584
|
if (this.dateProvider.now() - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
|
|
490
|
-
this.failedAuthHandshakes.delete(
|
|
585
|
+
this.failedAuthHandshakes.delete(key);
|
|
491
586
|
return true;
|
|
492
587
|
}
|
|
493
588
|
|
|
@@ -512,10 +607,12 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
512
607
|
protectedConnections: protectedPeerCount,
|
|
513
608
|
maxPeerCount: this.config.maxPeerCount,
|
|
514
609
|
cachedPeers: this.cachedPeers.size,
|
|
610
|
+
discv5KadPeers: this.peerDiscoveryService.getKadValues().length,
|
|
515
611
|
...this.peerScoring.getStats(),
|
|
516
612
|
});
|
|
517
613
|
|
|
518
|
-
this.metrics.recordPeerCount(
|
|
614
|
+
this.metrics.recordPeerCount(connections.length);
|
|
615
|
+
this.metrics.recordHealthyPeerCount(healthyConnections.length);
|
|
519
616
|
|
|
520
617
|
// Exit if no peers to connect
|
|
521
618
|
if (peersToConnect <= 0) {
|
|
@@ -712,6 +809,12 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
712
809
|
return;
|
|
713
810
|
}
|
|
714
811
|
|
|
812
|
+
// Don't dial banned peers or those that have exceeded the auth failure threshold
|
|
813
|
+
if (!this.isPeerAllowedToConnect(peerId)) {
|
|
814
|
+
this.logger.trace(`Skipping peer ${peerId} due to ban or failed auth handshake attempts`);
|
|
815
|
+
return;
|
|
816
|
+
}
|
|
817
|
+
|
|
715
818
|
const [multiaddrTcp] = await Promise.all([enr.getFullMultiaddr('tcp')]);
|
|
716
819
|
|
|
717
820
|
this.logger.trace(`Handling discovered peer ${peerId} at ${multiaddrTcp?.toString() ?? 'undefined address'}`);
|
|
@@ -775,7 +878,8 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
775
878
|
// Add to timed out peers
|
|
776
879
|
this.timedOutPeers.set(id, {
|
|
777
880
|
peerId: id,
|
|
778
|
-
timeoutUntilMs:
|
|
881
|
+
timeoutUntilMs:
|
|
882
|
+
this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS),
|
|
779
883
|
});
|
|
780
884
|
}
|
|
781
885
|
}
|
|
@@ -937,6 +1041,8 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
937
1041
|
`Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
|
|
938
1042
|
{ ...logData, address: sender.toString() },
|
|
939
1043
|
);
|
|
1044
|
+
this.markAuthHandshakeFailed(peerId);
|
|
1045
|
+
this.markPeerForDisconnect(peerId);
|
|
940
1046
|
return;
|
|
941
1047
|
}
|
|
942
1048
|
|
|
@@ -966,14 +1072,14 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
966
1072
|
const peerIdStr = peerId.toString();
|
|
967
1073
|
|
|
968
1074
|
const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
|
|
1075
|
+
const failureCount = (existingEntry?.count || 0) + 1;
|
|
969
1076
|
this.failedAuthHandshakes.set(peerIdStr, {
|
|
970
|
-
count:
|
|
1077
|
+
count: failureCount,
|
|
971
1078
|
lastFailureTimestamp: now,
|
|
972
1079
|
});
|
|
973
1080
|
|
|
974
1081
|
const connections = this.libP2PNode.getConnections(peerId);
|
|
975
1082
|
connections.forEach(conn => {
|
|
976
|
-
// We mark the IP address
|
|
977
1083
|
const address = conn.remoteAddr.nodeAddress().address;
|
|
978
1084
|
const existingAddressEntry = this.failedAuthHandshakes.get(address);
|
|
979
1085
|
this.failedAuthHandshakes.set(address, {
|
|
@@ -981,6 +1087,15 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
981
1087
|
lastFailureTimestamp: now,
|
|
982
1088
|
});
|
|
983
1089
|
});
|
|
1090
|
+
|
|
1091
|
+
// Ban the peer from being re-dialed for a cooldown period (exponential backoff)
|
|
1092
|
+
const banTimeMs = this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS;
|
|
1093
|
+
const backoffMs = banTimeMs * Math.pow(2, Math.min(failureCount - 1, 5));
|
|
1094
|
+
this.timedOutPeers.set(peerIdStr, {
|
|
1095
|
+
peerId: peerIdStr,
|
|
1096
|
+
timeoutUntilMs: now + backoffMs,
|
|
1097
|
+
});
|
|
1098
|
+
this.cachedPeers.delete(peerIdStr);
|
|
984
1099
|
}
|
|
985
1100
|
|
|
986
1101
|
/*
|
|
@@ -1,5 +1,6 @@
|
|
|
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';
|
|
4
5
|
import {
|
|
5
6
|
Attributes,
|
|
@@ -54,6 +55,10 @@ export enum PeerScoreState {
|
|
|
54
55
|
// TODO: move into config / constants
|
|
55
56
|
const MIN_SCORE_BEFORE_BAN = -100;
|
|
56
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 };
|
|
57
62
|
|
|
58
63
|
export class PeerScoring {
|
|
59
64
|
private logger = createLogger('p2p:peer-scoring');
|
|
@@ -65,7 +70,21 @@ export class PeerScoring {
|
|
|
65
70
|
|
|
66
71
|
private peerStateCounter: UpDownCounter;
|
|
67
72
|
|
|
68
|
-
|
|
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;
|
|
69
88
|
const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
|
|
70
89
|
this.peerPenalties = {
|
|
71
90
|
[PeerErrorSeverity.HighToleranceError]:
|
|
@@ -92,7 +111,7 @@ export class PeerScoring {
|
|
|
92
111
|
}
|
|
93
112
|
|
|
94
113
|
updateScore(peerId: string, scoreDelta: number): number {
|
|
95
|
-
const currentTime =
|
|
114
|
+
const currentTime = this.dateProvider.now();
|
|
96
115
|
const lastUpdate = this.lastUpdateTime.get(peerId) || currentTime;
|
|
97
116
|
const timePassed = currentTime - lastUpdate;
|
|
98
117
|
const decayPeriods = Math.floor(timePassed / this.decayInterval);
|
|
@@ -107,29 +126,102 @@ export class PeerScoring {
|
|
|
107
126
|
|
|
108
127
|
this.scores.set(peerId, currentScore);
|
|
109
128
|
this.lastUpdateTime.set(peerId, currentTime);
|
|
129
|
+
|
|
130
|
+
this.maybeBanPeer(peerId, currentScore);
|
|
131
|
+
|
|
110
132
|
return currentScore;
|
|
111
133
|
}
|
|
112
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
|
+
|
|
113
154
|
decayAllScores(): void {
|
|
114
|
-
const currentTime =
|
|
155
|
+
const currentTime = this.dateProvider.now();
|
|
115
156
|
for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()) {
|
|
116
157
|
const timePassed = currentTime - lastUpdate;
|
|
117
158
|
const decayPeriods = Math.floor(timePassed / this.decayInterval);
|
|
118
159
|
if (decayPeriods > 0) {
|
|
119
160
|
let score = this.scores.get(peerId) || 0;
|
|
120
161
|
score *= Math.pow(this.decayFactor, decayPeriods);
|
|
121
|
-
|
|
122
|
-
|
|
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
|
+
}
|
|
123
169
|
}
|
|
124
170
|
}
|
|
125
171
|
}
|
|
126
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
|
+
|
|
127
216
|
getScore(peerId: string): number {
|
|
128
|
-
|
|
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;
|
|
129
220
|
}
|
|
130
221
|
|
|
131
222
|
public getScoreState(peerId: string): PeerScoreState {
|
|
132
|
-
//
|
|
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.
|
|
133
225
|
const score = this.getScore(peerId);
|
|
134
226
|
if (score < MIN_SCORE_BEFORE_BAN) {
|
|
135
227
|
return PeerScoreState.Banned;
|
|
@@ -143,7 +235,9 @@ export class PeerScoring {
|
|
|
143
235
|
getStats(): { medianScore: number; healthyCount: number; disconnectCount: number; bannedCount: number } {
|
|
144
236
|
const stateCounts = { healthy: 0, disconnect: 0, banned: 0 };
|
|
145
237
|
|
|
146
|
-
|
|
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) {
|
|
147
241
|
const state = this.getScoreState(peerId);
|
|
148
242
|
switch (state) {
|
|
149
243
|
case PeerScoreState.Healthy:
|