@aztec/p2p 0.0.0-test.0 → 0.0.1-commit.001888fc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -3
- package/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +26 -13
- package/dest/client/factory.d.ts +21 -11
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +101 -26
- package/dest/client/index.d.ts +2 -1
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +1 -0
- package/dest/client/interface.d.ts +183 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +9 -0
- package/dest/client/p2p_client.d.ts +93 -221
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +760 -289
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +304 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +192 -126
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +240 -36
- package/dest/enr/generate-enr.d.ts +11 -3
- package/dest/enr/generate-enr.d.ts.map +1 -1
- package/dest/enr/generate-enr.js +27 -5
- 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/reqresp.error.d.ts +1 -1
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- 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 +5 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +3 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +125 -30
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +445 -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 +564 -173
- 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 -11
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +19 -21
- package/dest/mem_pools/index.d.ts +3 -2
- 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 +18 -12
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +58 -41
- 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/aztec_kv_tx_pool.d.ts +75 -16
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +493 -142
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +123 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
- package/dest/mem_pools/tx_pool/index.d.ts +1 -2
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/index.js +0 -1
- package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.js +8 -3
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +72 -11
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +279 -46
- 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 +43 -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 +103 -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 +10 -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 +11 -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 +215 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +134 -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 +216 -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 +108 -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 +337 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -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 +167 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -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 +923 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -5
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +79 -10
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -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 +76 -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/clock_tolerance.d.ts +21 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +37 -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 +10 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +11 -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 +11 -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 +20 -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 +18 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +116 -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 +3 -3
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +4 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +31 -0
- 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 +14 -0
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
- 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 +7 -6
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +60 -87
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -6
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +24 -29
- package/dest/msg_validators/tx_validator/factory.d.ts +148 -0
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/factory.js +265 -0
- 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 +76 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/gas_validator.js +177 -0
- package/dest/msg_validators/tx_validator/index.d.ts +11 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +10 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -5
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +40 -21
- 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 +35 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/phases_validator.js +141 -0
- 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 +17 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/test_utils.js +22 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +30 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -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 +8 -7
- 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 +10 -6
- package/dest/services/discv5/discV5_service.d.ts +10 -9
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +64 -37
- package/dest/services/dummy_service.d.ts +74 -11
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +136 -5
- package/dest/services/encoding.d.ts +26 -7
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +82 -12
- 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 +173 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +346 -0
- package/dest/services/index.d.ts +6 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +5 -0
- package/dest/services/libp2p/instrumentation.d.ts +20 -0
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
- package/dest/services/libp2p/instrumentation.js +122 -0
- package/dest/services/libp2p/libp2p_service.d.ts +165 -101
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +1478 -350
- package/dest/services/peer-manager/interface.d.ts +23 -0
- package/dest/services/peer-manager/interface.d.ts.map +1 -0
- package/dest/services/peer-manager/interface.js +1 -0
- package/dest/services/peer-manager/metrics.d.ts +14 -3
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +50 -12
- package/dest/services/peer-manager/peer_manager.d.ts +103 -23
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +552 -82
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +68 -4
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +54 -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 +556 -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 +48 -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 +20 -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 +21 -0
- package/dest/services/reqresp/config.d.ts +11 -9
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +18 -4
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +23 -4
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +73 -10
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +32 -17
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +154 -84
- 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 +3 -2
- package/dest/services/reqresp/index.d.ts.map +1 -1
- package/dest/services/reqresp/index.js +2 -1
- package/dest/services/reqresp/interface.d.ts +84 -24
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +60 -27
- 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 +17 -21
- package/dest/services/reqresp/protocols/auth.d.ts +43 -0
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/auth.js +71 -0
- package/dest/services/reqresp/protocols/block.d.ts +6 -1
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block.js +30 -6
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +34 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +87 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +13 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +57 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +70 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +121 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/goodbye.js +7 -7
- package/dest/services/reqresp/protocols/index.d.ts +3 -1
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +2 -0
- package/dest/services/reqresp/protocols/ping.d.ts +1 -3
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.d.ts +40 -7
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +76 -5
- package/dest/services/reqresp/protocols/tx.d.ts +20 -4
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +54 -6
- package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
- 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 +21 -1
- package/dest/services/reqresp/reqresp.d.ts +29 -66
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +762 -249
- package/dest/services/reqresp/status.d.ts +10 -4
- package/dest/services/reqresp/status.d.ts.map +1 -1
- package/dest/services/reqresp/status.js +9 -2
- package/dest/services/service.d.ts +76 -20
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +46 -0
- package/dest/services/tx_collection/config.d.ts.map +1 -0
- package/dest/services/tx_collection/config.js +112 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts +54 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/fast_tx_collection.js +327 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -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 +90 -0
- package/dest/services/tx_collection/index.d.ts +5 -0
- package/dest/services/tx_collection/index.d.ts.map +1 -0
- package/dest/services/tx_collection/index.js +4 -0
- package/dest/services/tx_collection/instrumentation.d.ts +10 -0
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_collection/instrumentation.js +32 -0
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +57 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/slow_tx_collection.js +211 -0
- package/dest/services/tx_collection/tx_collection.d.ts +123 -0
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection.js +200 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts +40 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection_sink.js +108 -0
- package/dest/services/tx_collection/tx_source.d.ts +23 -0
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_source.js +48 -0
- 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 +48 -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 +152 -0
- package/dest/services/tx_provider.d.ts +51 -0
- package/dest/services/tx_provider.d.ts.map +1 -0
- package/dest/services/tx_provider.js +220 -0
- package/dest/services/tx_provider_instrumentation.d.ts +16 -0
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
- package/dest/services/tx_provider_instrumentation.js +34 -0
- 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 +4 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +3 -0
- package/dest/test-helpers/make-enrs.d.ts +1 -1
- package/dest/test-helpers/make-enrs.d.ts.map +1 -1
- package/dest/test-helpers/make-enrs.js +4 -5
- package/dest/test-helpers/make-test-p2p-clients.d.ts +35 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +86 -17
- package/dest/test-helpers/mock-pubsub.d.ts +85 -0
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
- package/dest/test-helpers/mock-pubsub.js +231 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
- package/dest/test-helpers/mock-tx-helpers.js +19 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +15 -12
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +63 -28
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +163 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +367 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +261 -91
- package/dest/testbench/parse_log_file.d.ts +1 -1
- package/dest/testbench/parse_log_file.js +4 -4
- package/dest/testbench/testbench.d.ts +1 -1
- package/dest/testbench/testbench.js +4 -4
- package/dest/testbench/worker_client_manager.d.ts +53 -11
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +237 -54
- package/dest/types/index.d.ts +4 -2
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +2 -0
- package/dest/util.d.ts +25 -17
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +75 -69
- package/dest/versioning.d.ts +4 -4
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +8 -3
- package/package.json +32 -27
- package/src/bootstrap/bootstrap.ts +34 -15
- package/src/client/factory.ts +215 -58
- package/src/client/index.ts +1 -0
- package/src/client/interface.ts +235 -0
- package/src/client/p2p_client.ts +474 -457
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +345 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +409 -135
- package/src/enr/generate-enr.ts +39 -6
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +5 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +530 -29
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +692 -201
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +25 -17
- package/src/mem_pools/index.ts +4 -1
- package/src/mem_pools/instrumentation.ts +75 -47
- package/src/mem_pools/interface.ts +5 -7
- package/src/mem_pools/tx_pool/README.md +270 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +580 -143
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +163 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
- package/src/mem_pools/tx_pool/index.ts +0 -1
- package/src/mem_pools/tx_pool/priority.ts +10 -3
- package/src/mem_pools/tx_pool/tx_pool.ts +75 -10
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +228 -37
- 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 +120 -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 +27 -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 +247 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +337 -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 +430 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1105 -0
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +72 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +94 -0
- package/src/msg_validators/attestation_validator/index.ts +1 -0
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +20 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +115 -0
- package/src/msg_validators/tx_validator/README.md +119 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +30 -0
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +23 -10
- package/src/msg_validators/tx_validator/data_validator.ts +95 -71
- package/src/msg_validators/tx_validator/double_spend_validator.ts +31 -23
- package/src/msg_validators/tx_validator/factory.ts +460 -0
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +219 -0
- package/src/msg_validators/tx_validator/index.ts +10 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +80 -24
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +173 -0
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/test_utils.ts +43 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +57 -0
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +14 -8
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +85 -39
- package/src/services/dummy_service.ts +210 -9
- package/src/services/encoding.ts +87 -11
- package/src/services/gossipsub/README.md +641 -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 +487 -0
- package/src/services/index.ts +5 -0
- package/src/services/libp2p/instrumentation.ts +126 -0
- package/src/services/libp2p/libp2p_service.ts +1335 -402
- package/src/services/peer-manager/interface.ts +29 -0
- package/src/services/peer-manager/metrics.ts +62 -12
- package/src/services/peer-manager/peer_manager.ts +658 -80
- package/src/services/peer-manager/peer_scoring.ts +70 -3
- package/src/services/reqresp/README.md +229 -0
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +698 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +55 -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 +37 -0
- package/src/services/reqresp/config.ts +26 -9
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +77 -10
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +166 -95
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/index.ts +2 -0
- package/src/services/reqresp/interface.ts +120 -37
- package/src/services/reqresp/metrics.ts +40 -28
- package/src/services/reqresp/protocols/auth.ts +83 -0
- package/src/services/reqresp/protocols/block.ts +26 -4
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +106 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +76 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +144 -0
- package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
- package/src/services/reqresp/protocols/goodbye.ts +9 -7
- package/src/services/reqresp/protocols/index.ts +2 -0
- package/src/services/reqresp/protocols/status.ts +121 -5
- package/src/services/reqresp/protocols/tx.ts +58 -8
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
- package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
- package/src/services/reqresp/reqresp.ts +462 -272
- package/src/services/reqresp/status.ts +12 -3
- package/src/services/service.ts +114 -22
- package/src/services/tx_collection/config.ts +166 -0
- package/src/services/tx_collection/fast_tx_collection.ts +387 -0
- package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
- package/src/services/tx_collection/file_store_tx_source.ts +117 -0
- package/src/services/tx_collection/index.ts +8 -0
- package/src/services/tx_collection/instrumentation.ts +41 -0
- package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
- package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
- package/src/services/tx_collection/slow_tx_collection.ts +266 -0
- package/src/services/tx_collection/tx_collection.ts +313 -0
- package/src/services/tx_collection/tx_collection_sink.ts +125 -0
- package/src/services/tx_collection/tx_source.ts +56 -0
- 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 +175 -0
- package/src/services/tx_provider.ts +233 -0
- package/src/services/tx_provider_instrumentation.ts +54 -0
- package/src/test-helpers/index.ts +3 -0
- package/src/test-helpers/make-enrs.ts +4 -5
- package/src/test-helpers/make-test-p2p-clients.ts +114 -26
- package/src/test-helpers/mock-pubsub.ts +325 -0
- package/src/test-helpers/mock-tx-helpers.ts +24 -0
- package/src/test-helpers/reqresp-nodes.ts +91 -42
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +431 -0
- package/src/testbench/p2p_client_testbench_worker.ts +442 -93
- package/src/testbench/parse_log_file.ts +4 -4
- package/src/testbench/testbench.ts +4 -4
- package/src/testbench/worker_client_manager.ts +323 -59
- package/src/types/index.ts +2 -0
- package/src/util.ts +112 -92
- package/src/versioning.ts +11 -4
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -22
- 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 -112
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -17
- 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 -129
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
- 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 -141
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
- 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 -21
- 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/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -159
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -161
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
|
@@ -1,20 +1,31 @@
|
|
|
1
|
+
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
+
import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
3
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
+
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
1
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
-
import
|
|
6
|
+
import { bufferToHex } from '@aztec/foundation/string';
|
|
7
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
8
|
+
import type { PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
3
9
|
import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
4
|
-
import {
|
|
10
|
+
import type { TelemetryClient } from '@aztec/telemetry-client';
|
|
5
11
|
|
|
6
|
-
import type { ENR } from '@chainsafe/enr';
|
|
7
12
|
import type { Connection, PeerId } from '@libp2p/interface';
|
|
13
|
+
import { peerIdFromString } from '@libp2p/peer-id';
|
|
8
14
|
import type { Multiaddr } from '@multiformats/multiaddr';
|
|
15
|
+
import { ENR } from '@nethermindeth/enr';
|
|
9
16
|
import { inspect } from 'util';
|
|
10
17
|
|
|
11
18
|
import type { P2PConfig } from '../../config.js';
|
|
12
19
|
import { PeerEvent } from '../../types/index.js';
|
|
13
|
-
import type {
|
|
20
|
+
import type { FullLibp2p } from '../../util.js';
|
|
14
21
|
import { ReqRespSubProtocol } from '../reqresp/interface.js';
|
|
22
|
+
import { AuthRequest, AuthResponse } from '../reqresp/protocols/auth.js';
|
|
15
23
|
import { GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/goodbye.js';
|
|
24
|
+
import { StatusMessage } from '../reqresp/protocols/status.js';
|
|
16
25
|
import type { ReqResp } from '../reqresp/reqresp.js';
|
|
26
|
+
import { ReqRespStatus } from '../reqresp/status.js';
|
|
17
27
|
import type { PeerDiscoveryService } from '../service.js';
|
|
28
|
+
import type { PeerManagerInterface } from './interface.js';
|
|
18
29
|
import { PeerManagerMetrics } from './metrics.js';
|
|
19
30
|
import { PeerScoreState, type PeerScoring } from './peer_scoring.js';
|
|
20
31
|
|
|
@@ -22,6 +33,8 @@ const MAX_DIAL_ATTEMPTS = 3;
|
|
|
22
33
|
const MAX_CACHED_PEERS = 100;
|
|
23
34
|
const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
24
35
|
const FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
|
|
36
|
+
const GOODBYE_DIAL_TIMEOUT_MS = 1000;
|
|
37
|
+
const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
|
|
25
38
|
|
|
26
39
|
type CachedPeer = {
|
|
27
40
|
peerId: PeerId;
|
|
@@ -36,55 +49,182 @@ type TimedOutPeer = {
|
|
|
36
49
|
timeoutUntilMs: number;
|
|
37
50
|
};
|
|
38
51
|
|
|
39
|
-
|
|
52
|
+
type FailedAuthHandshakeEntry = {
|
|
53
|
+
count: number;
|
|
54
|
+
lastFailureTimestamp: number;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export class PeerManager implements PeerManagerInterface {
|
|
40
58
|
private cachedPeers: Map<string, CachedPeer> = new Map();
|
|
41
59
|
private heartbeatCounter: number = 0;
|
|
42
60
|
private displayPeerCountsPeerHeartbeat: number = 0;
|
|
43
61
|
private timedOutPeers: Map<string, TimedOutPeer> = new Map();
|
|
62
|
+
private trustedPeers: Set<string> = new Set();
|
|
63
|
+
private trustedPeersInitialized: boolean = false;
|
|
64
|
+
private privatePeers: Set<string> = new Set();
|
|
65
|
+
private privatePeersInitialized: boolean = false;
|
|
66
|
+
private preferredPeers: Set<string> = new Set();
|
|
67
|
+
private authenticatedPeerIdToValidatorAddress: Map<string, EthAddress> = new Map();
|
|
68
|
+
private authenticatedValidatorAddressToPeerId: Map<string, PeerId> = new Map();
|
|
69
|
+
private peersToBeDisconnected: Set<string> = new Set();
|
|
70
|
+
private failedAuthHandshakes: Map<string, FailedAuthHandshakeEntry> = new Map();
|
|
71
|
+
private validatorAddresses: EthAddress[] = [];
|
|
72
|
+
private initializedPreferredPeers: boolean = false;
|
|
44
73
|
|
|
45
74
|
private metrics: PeerManagerMetrics;
|
|
46
|
-
private
|
|
75
|
+
private handlers: {
|
|
76
|
+
handleConnectedPeerEvent: (e: CustomEvent<PeerId>) => void;
|
|
77
|
+
handleDisconnectedPeerEvent: (e: CustomEvent<PeerId>) => void;
|
|
78
|
+
handleDiscoveredPeer: (enr: ENR) => Promise<void>;
|
|
79
|
+
};
|
|
47
80
|
|
|
48
81
|
constructor(
|
|
49
|
-
private libP2PNode:
|
|
82
|
+
private libP2PNode: FullLibp2p,
|
|
50
83
|
private peerDiscoveryService: PeerDiscoveryService,
|
|
51
84
|
private config: P2PConfig,
|
|
52
85
|
telemetryClient: TelemetryClient,
|
|
53
86
|
private logger = createLogger('p2p:peer-manager'),
|
|
54
87
|
private peerScoring: PeerScoring,
|
|
55
88
|
private reqresp: ReqResp,
|
|
89
|
+
private readonly worldStateSynchronizer: WorldStateSynchronizer,
|
|
90
|
+
private readonly protocolVersion: string,
|
|
91
|
+
private readonly epochCache: EpochCacheInterface,
|
|
92
|
+
private readonly dateProvider: DateProvider = new DateProvider(),
|
|
56
93
|
) {
|
|
94
|
+
if (this.config.p2pDisableStatusHandshake && this.config.p2pAllowOnlyValidators) {
|
|
95
|
+
throw new Error('Status handshake disabled but is required to allow only validators to connect.');
|
|
96
|
+
}
|
|
57
97
|
this.metrics = new PeerManagerMetrics(telemetryClient, 'PeerManager');
|
|
58
98
|
|
|
99
|
+
// Handle Discovered peers
|
|
100
|
+
this.handlers = {
|
|
101
|
+
handleConnectedPeerEvent: this.handleConnectedPeerEvent.bind(this),
|
|
102
|
+
handleDisconnectedPeerEvent: this.handleDisconnectedPeerEvent.bind(this),
|
|
103
|
+
handleDiscoveredPeer: (enr: ENR) =>
|
|
104
|
+
this.handleDiscoveredPeer(enr).catch(e => this.logger.error('Error handling discovered peer', e)),
|
|
105
|
+
};
|
|
106
|
+
|
|
59
107
|
// Handle new established connections
|
|
60
|
-
this.libP2PNode.addEventListener(PeerEvent.CONNECTED, this.handleConnectedPeerEvent
|
|
108
|
+
this.libP2PNode.addEventListener(PeerEvent.CONNECTED, this.handlers.handleConnectedPeerEvent);
|
|
61
109
|
// Handle lost connections
|
|
62
|
-
this.libP2PNode.addEventListener(PeerEvent.DISCONNECTED, this.handleDisconnectedPeerEvent
|
|
110
|
+
this.libP2PNode.addEventListener(PeerEvent.DISCONNECTED, this.handlers.handleDisconnectedPeerEvent);
|
|
63
111
|
|
|
64
|
-
// Handle Discovered peers
|
|
65
|
-
this.discoveredPeerHandler = (enr: ENR) =>
|
|
66
|
-
this.handleDiscoveredPeer(enr).catch(e => this.logger.error('Error handling discovered peer', e));
|
|
67
112
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
68
|
-
this.peerDiscoveryService
|
|
113
|
+
this.peerDiscoveryService?.on(PeerEvent.DISCOVERED, this.handlers.handleDiscoveredPeer);
|
|
69
114
|
|
|
70
115
|
// Display peer counts every 60 seconds
|
|
71
116
|
this.displayPeerCountsPeerHeartbeat = Math.floor(60_000 / this.config.peerCheckIntervalMS);
|
|
72
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Initializes the trusted peers.
|
|
120
|
+
*
|
|
121
|
+
* This function is called when the peer manager is initialized.
|
|
122
|
+
*/
|
|
123
|
+
async initializePeers() {
|
|
124
|
+
if (this.config.trustedPeers) {
|
|
125
|
+
const trustedPeersEnrs: ENR[] = this.config.trustedPeers.map(enr => ENR.decodeTxt(enr));
|
|
126
|
+
await Promise.all(trustedPeersEnrs.map(enr => enr.peerId()))
|
|
127
|
+
.then(peerIds => peerIds.forEach(peerId => this.trustedPeers.add(peerId.toString())))
|
|
128
|
+
.finally(() => {
|
|
129
|
+
this.trustedPeersInitialized = true;
|
|
130
|
+
})
|
|
131
|
+
.catch(e => this.logger.error('Error initializing trusted peers', e));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (this.config.privatePeers) {
|
|
135
|
+
const privatePeersEnrs: ENR[] = this.config.privatePeers.map(enr => ENR.decodeTxt(enr));
|
|
136
|
+
await Promise.all(privatePeersEnrs.map(enr => enr.peerId()))
|
|
137
|
+
.then(peerIds =>
|
|
138
|
+
peerIds.forEach(peerId => {
|
|
139
|
+
this.trustedPeers.add(peerId.toString());
|
|
140
|
+
this.privatePeers.add(peerId.toString());
|
|
141
|
+
}),
|
|
142
|
+
)
|
|
143
|
+
.finally(() => {
|
|
144
|
+
if (!this.config.trustedPeers) {
|
|
145
|
+
this.trustedPeersInitialized = true;
|
|
146
|
+
}
|
|
147
|
+
this.privatePeersInitialized = true;
|
|
148
|
+
})
|
|
149
|
+
.catch(e => this.logger.error('Error initializing private peers', e));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (this.config.preferredPeers) {
|
|
153
|
+
const preferredPeersEnrs: ENR[] = this.config.preferredPeers.map(enr => ENR.decodeTxt(enr));
|
|
154
|
+
await Promise.all(preferredPeersEnrs.map(enr => enr.peerId()))
|
|
155
|
+
.then(peerIds => peerIds.forEach(peerId => this.preferredPeers.add(peerId.toString())))
|
|
156
|
+
.catch(e => this.logger.error('Error initializing preferred peers', e));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
73
159
|
|
|
74
160
|
get tracer() {
|
|
75
161
|
return this.metrics.tracer;
|
|
76
162
|
}
|
|
77
163
|
|
|
78
|
-
|
|
79
|
-
public heartbeat() {
|
|
164
|
+
public async heartbeat() {
|
|
80
165
|
this.heartbeatCounter++;
|
|
81
166
|
this.peerScoring.decayAllScores();
|
|
82
|
-
|
|
83
167
|
this.cleanupExpiredTimeouts();
|
|
84
168
|
|
|
169
|
+
await this.setupDirectPeersIfValidator();
|
|
170
|
+
await this.updateAuthenticatedPeers();
|
|
171
|
+
await this.processScheduledDisconnects();
|
|
172
|
+
|
|
85
173
|
this.discover();
|
|
86
174
|
}
|
|
87
175
|
|
|
176
|
+
/*
|
|
177
|
+
* If this node is connecting to preferred peers, make sure it is registered validator */
|
|
178
|
+
async setupDirectPeersIfValidator() {
|
|
179
|
+
if (!this.config.preferredPeers) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Already initialized preferred peers, don't wastefully repeat the same work
|
|
184
|
+
if (this.initializedPreferredPeers) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const registeredValidators = await this.epochCache.getRegisteredValidators();
|
|
189
|
+
const validatorSet = new Set(registeredValidators.map(v => v.toString()));
|
|
190
|
+
const isThisNodePartOfValidatorSet = this.validatorAddresses.some(v => validatorSet.has(v.toString()));
|
|
191
|
+
|
|
192
|
+
if (!isThisNodePartOfValidatorSet) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const preferredPeersEnrs: ENR[] = this.config.preferredPeers.map(enr => ENR.decodeTxt(enr));
|
|
197
|
+
await Promise.all(preferredPeersEnrs.map(enr => enr.peerId()))
|
|
198
|
+
.then(peerIds => peerIds.forEach(peerId => this.preferredPeers.add(peerId.toString())))
|
|
199
|
+
.catch(e => this.logger.error('Error initializing preferred peers', e));
|
|
200
|
+
|
|
201
|
+
const directPeers = (
|
|
202
|
+
await Promise.all(
|
|
203
|
+
preferredPeersEnrs.map(async enr => {
|
|
204
|
+
const peerId = await enr.peerId();
|
|
205
|
+
const address = enr.getLocationMultiaddr('tcp');
|
|
206
|
+
if (address === undefined) {
|
|
207
|
+
throw new Error(`Direct peer ${peerId.toString()} has no TCP address, ENR: ${enr.encodeTxt()}`);
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
id: peerId,
|
|
211
|
+
addrs: [address],
|
|
212
|
+
};
|
|
213
|
+
}),
|
|
214
|
+
)
|
|
215
|
+
).filter(peer => peer !== undefined);
|
|
216
|
+
|
|
217
|
+
await Promise.all(
|
|
218
|
+
directPeers.map(peer => {
|
|
219
|
+
this.libP2PNode.services.pubsub.direct.add(peer.id.toString());
|
|
220
|
+
|
|
221
|
+
return this.libP2PNode.peerStore.merge(peer.id, { multiaddrs: peer.addrs });
|
|
222
|
+
}),
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
this.initializedPreferredPeers = true;
|
|
226
|
+
}
|
|
227
|
+
|
|
88
228
|
/**
|
|
89
229
|
* Cleans up expired timeouts.
|
|
90
230
|
*
|
|
@@ -94,7 +234,7 @@ export class PeerManager {
|
|
|
94
234
|
*/
|
|
95
235
|
private cleanupExpiredTimeouts() {
|
|
96
236
|
// Clean up expired timeouts
|
|
97
|
-
const now =
|
|
237
|
+
const now = this.dateProvider.now();
|
|
98
238
|
for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
|
|
99
239
|
if (now >= timedOutPeer.timeoutUntilMs) {
|
|
100
240
|
this.timedOutPeers.delete(peerId);
|
|
@@ -103,16 +243,58 @@ export class PeerManager {
|
|
|
103
243
|
}
|
|
104
244
|
|
|
105
245
|
/**
|
|
106
|
-
*
|
|
246
|
+
* Processes scheduled disconnects during heartbeat.
|
|
247
|
+
*
|
|
248
|
+
* This batch processes all peers that have been marked for disconnect.
|
|
249
|
+
* preventing immediate disconnects that could cause libp2p state corruption.
|
|
250
|
+
*/
|
|
251
|
+
private async processScheduledDisconnects() {
|
|
252
|
+
if (this.peersToBeDisconnected.size === 0) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const peersToDisconnect = Array.from(this.peersToBeDisconnected);
|
|
257
|
+
|
|
258
|
+
this.logger.debug(`Processing ${peersToDisconnect.length} scheduled disconnects`);
|
|
259
|
+
try {
|
|
260
|
+
await Promise.all(
|
|
261
|
+
peersToDisconnect.map(async peerIdStr => {
|
|
262
|
+
if (await this.disconnectPeer(peerIdFromString(peerIdStr))) {
|
|
263
|
+
this.peersToBeDisconnected.delete(peerIdStr);
|
|
264
|
+
}
|
|
265
|
+
}),
|
|
266
|
+
);
|
|
267
|
+
this.logger.verbose(`Disconnected ${peersToDisconnect.length} peers`, { peersToDisconnect });
|
|
268
|
+
} catch (error) {
|
|
269
|
+
this.logger.error('Error when disconnecting from peers', error);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Performs Status Handshake with a connected peer.
|
|
107
275
|
* @param e - The connected peer event.
|
|
108
276
|
*/
|
|
109
277
|
private handleConnectedPeerEvent(e: CustomEvent<PeerId>) {
|
|
110
278
|
const peerId = e.detail;
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
279
|
+
this.logger.verbose(`Connected to peer ${peerId.toString()}`);
|
|
280
|
+
this.metrics.peerConnected(peerId);
|
|
281
|
+
if (this.config.p2pDisableStatusHandshake) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
// If we are not configured to only allow validators then perform a status handshake
|
|
285
|
+
if (!this.config.p2pAllowOnlyValidators) {
|
|
286
|
+
void this.exchangeStatusHandshake(peerId);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// We are configured to only allow validators, but this doesn't apply to trusted, private peers or preferred peers
|
|
291
|
+
if (this.isProtectedPeer(peerId)) {
|
|
292
|
+
void this.exchangeStatusHandshake(peerId);
|
|
293
|
+
return;
|
|
115
294
|
}
|
|
295
|
+
|
|
296
|
+
// Initiate auth handshake
|
|
297
|
+
void this.exchangeAuthHandshake(peerId);
|
|
116
298
|
}
|
|
117
299
|
|
|
118
300
|
/**
|
|
@@ -121,11 +303,102 @@ export class PeerManager {
|
|
|
121
303
|
*/
|
|
122
304
|
private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
|
|
123
305
|
const peerId = e.detail;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
306
|
+
this.metrics.peerDisconnected(peerId);
|
|
307
|
+
this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
|
|
308
|
+
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
|
|
309
|
+
if (validatorAddress !== undefined) {
|
|
310
|
+
this.logger.info(
|
|
311
|
+
`Removing authentication for validator ${validatorAddress} at peer id ${peerId.toString()} due to disconnection`,
|
|
312
|
+
);
|
|
313
|
+
this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
|
|
314
|
+
this.authenticatedPeerIdToValidatorAddress.delete(peerId.toString());
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
public registerThisValidatorAddresses(address: EthAddress[]): void {
|
|
319
|
+
this.validatorAddresses = [...address];
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Checks if a peer is trusted.
|
|
324
|
+
* @param peerId - The peer ID.
|
|
325
|
+
* @returns True if the peer is trusted, false otherwise.
|
|
326
|
+
* Note: This function will return false and log a warning if the trusted peers are not initialized.
|
|
327
|
+
*/
|
|
328
|
+
private isTrustedPeer(peerId: PeerId): boolean {
|
|
329
|
+
if (!this.trustedPeersInitialized) {
|
|
330
|
+
this.logger.warn('Trusted peers not initialized, returning false');
|
|
331
|
+
return false;
|
|
128
332
|
}
|
|
333
|
+
return this.trustedPeers.has(peerId.toString());
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Adds a peer to the trusted peers set.
|
|
338
|
+
* @param peerId - The peer ID to add to trusted peers.
|
|
339
|
+
*/
|
|
340
|
+
public addTrustedPeer(peerId: PeerId): void {
|
|
341
|
+
const peerIdStr = peerId.toString();
|
|
342
|
+
|
|
343
|
+
this.trustedPeers.add(peerIdStr);
|
|
344
|
+
this.trustedPeersInitialized = true;
|
|
345
|
+
this.logger.verbose(`Added trusted peer ${peerIdStr}`);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Adds a peer to the private peers set.
|
|
350
|
+
* @param peerId - The peer ID to add to private peers.
|
|
351
|
+
*/
|
|
352
|
+
public addPrivatePeer(peerId: PeerId): void {
|
|
353
|
+
const peerIdStr = peerId.toString();
|
|
354
|
+
|
|
355
|
+
this.trustedPeers.add(peerIdStr);
|
|
356
|
+
this.privatePeers.add(peerIdStr);
|
|
357
|
+
this.trustedPeersInitialized = true;
|
|
358
|
+
this.privatePeersInitialized = true;
|
|
359
|
+
this.logger.verbose(`Added private peer ${peerIdStr}`);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Checks if a peer is private.
|
|
364
|
+
* @param peerId - The peer ID.
|
|
365
|
+
* @returns True if the peer is private, false otherwise.
|
|
366
|
+
*/
|
|
367
|
+
private isPrivatePeer(peerId: PeerId): boolean {
|
|
368
|
+
if (!this.privatePeersInitialized) {
|
|
369
|
+
this.logger.warn('Private peers not initialized, returning false');
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
return this.privatePeers.has(peerId.toString());
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Adds a peer to the preferred peers set.
|
|
377
|
+
* @param peerId - The peer ID to add to preferred peers.
|
|
378
|
+
*/
|
|
379
|
+
public addPreferredPeer(peerId: PeerId): void {
|
|
380
|
+
const peerIdStr = peerId.toString();
|
|
381
|
+
|
|
382
|
+
this.preferredPeers.add(peerIdStr);
|
|
383
|
+
this.logger.verbose(`Added preferred peer ${peerIdStr}`);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Checks if a peer is preferred.
|
|
388
|
+
* @param peerId - The peer ID.
|
|
389
|
+
* @returns True if the peer is preferred, false otherwise.
|
|
390
|
+
*/
|
|
391
|
+
private isPreferredPeer(peerId: PeerId): boolean {
|
|
392
|
+
return this.preferredPeers.has(peerId.toString());
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Checks if a peer is protected (either trusted or private).
|
|
397
|
+
* @param peerId - The peer ID.
|
|
398
|
+
* @returns True if the peer is protected, false otherwise.
|
|
399
|
+
*/
|
|
400
|
+
private isProtectedPeer(peerId: PeerId): boolean {
|
|
401
|
+
return this.isTrustedPeer(peerId) || this.isPrivatePeer(peerId) || this.isPreferredPeer(peerId);
|
|
129
402
|
}
|
|
130
403
|
|
|
131
404
|
/**
|
|
@@ -140,7 +413,7 @@ export class PeerManager {
|
|
|
140
413
|
|
|
141
414
|
this.metrics.recordGoodbyeReceived(reason);
|
|
142
415
|
|
|
143
|
-
|
|
416
|
+
this.markPeerForDisconnect(peerId);
|
|
144
417
|
}
|
|
145
418
|
|
|
146
419
|
public penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity) {
|
|
@@ -151,6 +424,11 @@ export class PeerManager {
|
|
|
151
424
|
return this.peerScoring.getScore(peerId);
|
|
152
425
|
}
|
|
153
426
|
|
|
427
|
+
public shouldDisableP2PGossip(peerId: string): boolean {
|
|
428
|
+
const isAuthenticated = this.isAuthenticatedPeer(peerIdFromString(peerId));
|
|
429
|
+
return (this.config.p2pAllowOnlyValidators ?? false) && !isAuthenticated;
|
|
430
|
+
}
|
|
431
|
+
|
|
154
432
|
public getPeers(includePending = false): PeerInfo[] {
|
|
155
433
|
const connected = this.libP2PNode
|
|
156
434
|
.getPeers()
|
|
@@ -184,25 +462,62 @@ export class PeerManager {
|
|
|
184
462
|
return [...connected, ...dialQueue, ...cachedPeers];
|
|
185
463
|
}
|
|
186
464
|
|
|
465
|
+
public isAuthenticatedPeer(peerId: PeerId): boolean {
|
|
466
|
+
const peerIdAsString = peerId.toString();
|
|
467
|
+
return (
|
|
468
|
+
this.privatePeers.has(peerIdAsString) ||
|
|
469
|
+
this.trustedPeers.has(peerIdAsString) ||
|
|
470
|
+
this.preferredPeers.has(peerIdAsString) ||
|
|
471
|
+
this.authenticatedPeerIdToValidatorAddress.has(peerIdAsString)
|
|
472
|
+
);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/*
|
|
476
|
+
* Checks whether peer is allowed to connect
|
|
477
|
+
*
|
|
478
|
+
* @param id: Address of the node or it's peerId
|
|
479
|
+
*
|
|
480
|
+
* @returns: True if node is allowed to connect, otherwise false
|
|
481
|
+
* */
|
|
482
|
+
public isNodeAllowedToConnect(id: string | PeerId): boolean {
|
|
483
|
+
const entry = this.failedAuthHandshakes.get(id.toString());
|
|
484
|
+
if (!entry) {
|
|
485
|
+
return true;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// In case entry is too old, remove it and allow connection
|
|
489
|
+
if (this.dateProvider.now() - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
|
|
490
|
+
this.failedAuthHandshakes.delete(id.toString());
|
|
491
|
+
return true;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
return entry.count <= this.config.p2pMaxFailedAuthAttemptsAllowed;
|
|
495
|
+
}
|
|
496
|
+
|
|
187
497
|
/**
|
|
188
498
|
* Discovers peers.
|
|
189
499
|
*/
|
|
190
500
|
private discover() {
|
|
191
501
|
const connections = this.libP2PNode.getConnections();
|
|
192
502
|
|
|
193
|
-
const healthyConnections = this.prioritizePeers(this.pruneUnhealthyPeers(this.
|
|
503
|
+
const healthyConnections = this.prioritizePeers(this.pruneUnhealthyPeers(this.getNonProtectedPeers(connections)));
|
|
194
504
|
|
|
195
505
|
// Calculate how many connections we're looking to make
|
|
196
|
-
const
|
|
506
|
+
const protectedPeerCount = this.getProtectedPeerCount();
|
|
507
|
+
const peersToConnect = this.config.maxPeerCount - healthyConnections.length - protectedPeerCount;
|
|
197
508
|
|
|
198
509
|
const logLevel = this.heartbeatCounter % this.displayPeerCountsPeerHeartbeat === 0 ? 'info' : 'debug';
|
|
199
|
-
this.logger[logLevel](`Connected to ${healthyConnections.length} peers`, {
|
|
200
|
-
|
|
510
|
+
this.logger[logLevel](`Connected to ${healthyConnections.length + this.trustedPeers.size} peers`, {
|
|
511
|
+
discoveredConnections: healthyConnections.length,
|
|
512
|
+
protectedConnections: protectedPeerCount,
|
|
201
513
|
maxPeerCount: this.config.maxPeerCount,
|
|
202
514
|
cachedPeers: this.cachedPeers.size,
|
|
203
515
|
...this.peerScoring.getStats(),
|
|
204
516
|
});
|
|
205
517
|
|
|
518
|
+
this.metrics.recordPeerCount(connections.length);
|
|
519
|
+
this.metrics.recordHealthyPeerCount(healthyConnections.length);
|
|
520
|
+
|
|
206
521
|
// Exit if no peers to connect
|
|
207
522
|
if (peersToConnect <= 0) {
|
|
208
523
|
return;
|
|
@@ -217,13 +532,14 @@ export class PeerManager {
|
|
|
217
532
|
.filter(Boolean) as string[],
|
|
218
533
|
);
|
|
219
534
|
|
|
535
|
+
const now = this.dateProvider.now();
|
|
220
536
|
for (const [id, peerData] of this.cachedPeers.entries()) {
|
|
221
537
|
// if already dialling or connected to, remove from cache
|
|
222
538
|
if (
|
|
223
539
|
pendingDials.has(id) ||
|
|
224
540
|
healthyConnections.some(conn => conn.remotePeer.equals(peerData.peerId)) ||
|
|
225
541
|
// if peer has been in cache for the max cache age, remove from cache
|
|
226
|
-
|
|
542
|
+
now - peerData.addedUnixMs > MAX_CACHED_PEER_AGE_MS
|
|
227
543
|
) {
|
|
228
544
|
this.cachedPeers.delete(id);
|
|
229
545
|
} else {
|
|
@@ -248,6 +564,14 @@ export class PeerManager {
|
|
|
248
564
|
}
|
|
249
565
|
}
|
|
250
566
|
|
|
567
|
+
private getNonProtectedPeers(connections: Connection[]): Connection[] {
|
|
568
|
+
return connections.filter(conn => !this.isProtectedPeer(conn.remotePeer));
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
private getProtectedPeerCount(): number {
|
|
572
|
+
return this.trustedPeers.size + this.privatePeers.size + this.preferredPeers.size;
|
|
573
|
+
}
|
|
574
|
+
|
|
251
575
|
private pruneUnhealthyPeers(connections: Connection[]): Connection[] {
|
|
252
576
|
const connectedHealthyPeers: Connection[] = [];
|
|
253
577
|
|
|
@@ -255,9 +579,11 @@ export class PeerManager {
|
|
|
255
579
|
const score = this.peerScoring.getScoreState(peer.remotePeer.toString());
|
|
256
580
|
switch (score) {
|
|
257
581
|
case PeerScoreState.Banned:
|
|
582
|
+
this.metrics.recordLowScoreDisconnect('Banned');
|
|
258
583
|
void this.goodbyeAndDisconnectPeer(peer.remotePeer, GoodByeReason.BANNED);
|
|
259
584
|
break;
|
|
260
585
|
case PeerScoreState.Disconnect:
|
|
586
|
+
this.metrics.recordLowScoreDisconnect('Disconnect');
|
|
261
587
|
void this.goodbyeAndDisconnectPeer(peer.remotePeer, GoodByeReason.LOW_SCORE);
|
|
262
588
|
break;
|
|
263
589
|
case PeerScoreState.Healthy:
|
|
@@ -275,75 +601,85 @@ export class PeerManager {
|
|
|
275
601
|
* @returns The pruned list of connections.
|
|
276
602
|
*/
|
|
277
603
|
private prioritizePeers(connections: Connection[]): Connection[] {
|
|
278
|
-
|
|
279
|
-
|
|
604
|
+
const protectedPeerCount = this.getProtectedPeerCount();
|
|
605
|
+
if (connections.length > this.config.maxPeerCount - protectedPeerCount) {
|
|
606
|
+
// Sort the regular peer scores from highest to lowest
|
|
280
607
|
const prioritizedConnections = connections.sort((connectionA, connectionB) => {
|
|
281
608
|
const connectionScoreA = this.peerScoring.getScore(connectionA.remotePeer.toString());
|
|
282
609
|
const connectionScoreB = this.peerScoring.getScore(connectionB.remotePeer.toString());
|
|
283
610
|
return connectionScoreB - connectionScoreA;
|
|
284
611
|
});
|
|
285
612
|
|
|
286
|
-
//
|
|
287
|
-
|
|
613
|
+
// Calculate how many regular peers we can keep
|
|
614
|
+
const peersToKeep = Math.max(0, this.config.maxPeerCount - protectedPeerCount);
|
|
615
|
+
|
|
616
|
+
// Disconnect from the lowest scoring regular connections that exceed our limit
|
|
617
|
+
for (const conn of prioritizedConnections.slice(peersToKeep)) {
|
|
288
618
|
void this.goodbyeAndDisconnectPeer(conn.remotePeer, GoodByeReason.MAX_PEERS);
|
|
289
619
|
}
|
|
290
|
-
|
|
620
|
+
|
|
621
|
+
// Return trusted connections plus the highest scoring regular connections up to the max peer count
|
|
622
|
+
return prioritizedConnections.slice(0, peersToKeep);
|
|
291
623
|
} else {
|
|
292
624
|
return connections;
|
|
293
625
|
}
|
|
294
626
|
}
|
|
295
627
|
|
|
296
|
-
/**
|
|
297
|
-
* If multiple connections to the same peer are found, the oldest connection is kept and the duplicates are pruned.
|
|
298
|
-
*
|
|
299
|
-
* This is necessary to resolve a race condition where multiple connections to the same peer are established if
|
|
300
|
-
* they are discovered at the same time.
|
|
301
|
-
*
|
|
302
|
-
* @param connections - The list of connections to prune duplicate peers from.
|
|
303
|
-
* @returns The pruned list of connections.
|
|
304
|
-
*/
|
|
305
|
-
private pruneDuplicatePeers(connections: Connection[]): Connection[] {
|
|
306
|
-
const peerConnections = new Map<string, Connection>();
|
|
307
|
-
|
|
308
|
-
for (const conn of connections) {
|
|
309
|
-
const peerId = conn.remotePeer.toString();
|
|
310
|
-
const existingConnection = peerConnections.get(peerId);
|
|
311
|
-
if (!existingConnection) {
|
|
312
|
-
peerConnections.set(peerId, conn);
|
|
313
|
-
} else {
|
|
314
|
-
// Keep the oldest connection for each peer
|
|
315
|
-
this.logger.debug(`Found duplicate connection to peer ${peerId}, keeping oldest connection`);
|
|
316
|
-
if (conn.timeline.open < existingConnection.timeline.open) {
|
|
317
|
-
peerConnections.set(peerId, conn);
|
|
318
|
-
void existingConnection.close();
|
|
319
|
-
} else {
|
|
320
|
-
void conn.close();
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
return [...peerConnections.values()];
|
|
326
|
-
}
|
|
327
|
-
|
|
328
628
|
private async goodbyeAndDisconnectPeer(peer: PeerId, reason: GoodByeReason) {
|
|
329
629
|
this.logger.debug(`Disconnecting peer ${peer.toString()} with reason ${prettyGoodbyeReason(reason)}`);
|
|
330
630
|
|
|
331
631
|
this.metrics.recordGoodbyeSent(reason);
|
|
332
632
|
|
|
333
633
|
try {
|
|
334
|
-
await this.reqresp.sendRequestToPeer(
|
|
634
|
+
const resp = await this.reqresp.sendRequestToPeer(
|
|
635
|
+
peer,
|
|
636
|
+
ReqRespSubProtocol.GOODBYE,
|
|
637
|
+
Buffer.from([reason]),
|
|
638
|
+
GOODBYE_DIAL_TIMEOUT_MS,
|
|
639
|
+
);
|
|
640
|
+
|
|
641
|
+
if (resp.status === ReqRespStatus.FAILURE) {
|
|
642
|
+
this.logger.debug(`Failed to send goodbye to peer ${peer.toString()}`);
|
|
643
|
+
} else if (resp.status === ReqRespStatus.SUCCESS) {
|
|
644
|
+
this.logger.verbose(`Sent goodbye to peer ${peer.toString()}`);
|
|
645
|
+
} else {
|
|
646
|
+
this.logger.debug(
|
|
647
|
+
`Unexpected status sending goodbye to peer ${peer.toString()}: ${ReqRespStatus[resp.status]}`,
|
|
648
|
+
);
|
|
649
|
+
}
|
|
335
650
|
} catch (error) {
|
|
336
651
|
this.logger.debug(`Failed to send goodbye to peer ${peer.toString()}: ${error}`);
|
|
337
652
|
} finally {
|
|
338
|
-
|
|
653
|
+
this.markPeerForDisconnect(peer);
|
|
339
654
|
}
|
|
340
655
|
}
|
|
341
656
|
|
|
342
|
-
|
|
657
|
+
/*
|
|
658
|
+
* Marks peer to be disconnected on the next heartbeat
|
|
659
|
+
* */
|
|
660
|
+
private markPeerForDisconnect(peer: PeerId) {
|
|
661
|
+
const peerIdStr = peer.toString();
|
|
662
|
+
this.logger.debug(`Scheduling peer ${peerIdStr} for disconnection`);
|
|
663
|
+
this.peersToBeDisconnected.add(peerIdStr);
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
* Performs the actual disconnection of a peer.
|
|
668
|
+
* This is called during heartbeat processing to avoid immediate disconnections.
|
|
669
|
+
*
|
|
670
|
+
* @returns True if peer was disconnect, otherwise false
|
|
671
|
+
*/
|
|
672
|
+
private async disconnectPeer(peer: PeerId): Promise<boolean> {
|
|
673
|
+
const peerIdStr = peer.toString();
|
|
674
|
+
|
|
343
675
|
try {
|
|
344
676
|
await this.libP2PNode.hangUp(peer);
|
|
677
|
+
|
|
678
|
+
this.logger.debug(`Successfully disconnected peer ${peerIdStr}`);
|
|
679
|
+
return true;
|
|
345
680
|
} catch (error) {
|
|
346
|
-
this.logger.
|
|
681
|
+
this.logger.warn(`Failed to disconnect peer ${peerIdStr}`, { error });
|
|
682
|
+
return false;
|
|
347
683
|
}
|
|
348
684
|
}
|
|
349
685
|
|
|
@@ -356,10 +692,16 @@ export class PeerManager {
|
|
|
356
692
|
const peerId = await enr.peerId();
|
|
357
693
|
const peerIdString = peerId.toString();
|
|
358
694
|
|
|
695
|
+
// Don't attempt to connect to peers scheduled for disconnection
|
|
696
|
+
if (this.peersToBeDisconnected.has(peerIdString)) {
|
|
697
|
+
this.logger.trace(`Skipping peer scheduled for disconnection ${peerId}`);
|
|
698
|
+
return;
|
|
699
|
+
}
|
|
700
|
+
|
|
359
701
|
// Check if peer is temporarily timed out
|
|
360
702
|
const timedOutPeer = this.timedOutPeers.get(peerIdString);
|
|
361
703
|
if (timedOutPeer) {
|
|
362
|
-
if (
|
|
704
|
+
if (this.dateProvider.now() < timedOutPeer.timeoutUntilMs) {
|
|
363
705
|
this.logger.trace(`Skipping timed out peer ${peerId}`);
|
|
364
706
|
return;
|
|
365
707
|
}
|
|
@@ -399,7 +741,7 @@ export class PeerManager {
|
|
|
399
741
|
enr,
|
|
400
742
|
multiaddrTcp,
|
|
401
743
|
dialAttempts: 0,
|
|
402
|
-
addedUnixMs:
|
|
744
|
+
addedUnixMs: this.dateProvider.now(),
|
|
403
745
|
};
|
|
404
746
|
|
|
405
747
|
// Determine if we should dial immediately or not
|
|
@@ -434,7 +776,7 @@ export class PeerManager {
|
|
|
434
776
|
// Add to timed out peers
|
|
435
777
|
this.timedOutPeers.set(id, {
|
|
436
778
|
peerId: id,
|
|
437
|
-
timeoutUntilMs:
|
|
779
|
+
timeoutUntilMs: this.dateProvider.now() + FAILED_PEER_BAN_TIME_MS,
|
|
438
780
|
});
|
|
439
781
|
}
|
|
440
782
|
}
|
|
@@ -458,7 +800,12 @@ export class PeerManager {
|
|
|
458
800
|
}
|
|
459
801
|
|
|
460
802
|
// Remove the oldest peers
|
|
461
|
-
for (const key of this.cachedPeers.
|
|
803
|
+
for (const [key, value] of this.cachedPeers.entries()) {
|
|
804
|
+
if (this.isProtectedPeer(value.peerId)) {
|
|
805
|
+
this.logger.debug(`Not pruning trusted peer ${key}`);
|
|
806
|
+
continue;
|
|
807
|
+
}
|
|
808
|
+
|
|
462
809
|
this.cachedPeers.delete(key);
|
|
463
810
|
this.logger.trace(`Pruning peer ${key} from cache`);
|
|
464
811
|
peersToDelete--;
|
|
@@ -468,21 +815,252 @@ export class PeerManager {
|
|
|
468
815
|
}
|
|
469
816
|
}
|
|
470
817
|
|
|
818
|
+
private async createStatusMessage() {
|
|
819
|
+
const syncSummary = (await this.worldStateSynchronizer.status()).syncSummary;
|
|
820
|
+
return StatusMessage.fromWorldStateSyncStatus(this.protocolVersion, syncSummary);
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
/**
|
|
824
|
+
* Performs status Handshake with the Peer
|
|
825
|
+
* The way the protocol is designed is that each peer will call this method on newly established p2p connection.
|
|
826
|
+
* Both peers request Status message and both peers perform validation of the received Status message.
|
|
827
|
+
* If this validation fails on any end that peer will initiate disconnect.
|
|
828
|
+
* Note: It's important for both peers to request and perform Status validation,
|
|
829
|
+
* Because one of the peers can be _bad peer_ and this peer can simply skip the check.
|
|
830
|
+
* If we don't implement validation on both ends the _bad peer_ remains connected.
|
|
831
|
+
* @param: peerId The Id of the peer to request the Status from.
|
|
832
|
+
* */
|
|
833
|
+
private async exchangeStatusHandshake(peerId: PeerId) {
|
|
834
|
+
try {
|
|
835
|
+
const ourStatus = await this.createStatusMessage();
|
|
836
|
+
//Note: Technically we don't have to send out status to peer as well, but we do.
|
|
837
|
+
//It will be easier to update protocol in the future this way if need be.
|
|
838
|
+
this.logger.trace(`Initiating status handshake with peer ${peerId}`);
|
|
839
|
+
const response = await this.reqresp.sendRequestToPeer(peerId, ReqRespSubProtocol.STATUS, ourStatus.toBuffer());
|
|
840
|
+
const { status } = response;
|
|
841
|
+
if (status !== ReqRespStatus.SUCCESS) {
|
|
842
|
+
//TODO: maybe hard ban these peers in the future.
|
|
843
|
+
//We could allow this to happen up to N times, and then hard ban?
|
|
844
|
+
//Hard ban: Disallow connection via e.g. libp2p's Gater
|
|
845
|
+
this.logger.debug(`Disconnecting peer ${peerId} who failed to respond status handshake`, {
|
|
846
|
+
peerId,
|
|
847
|
+
status: ReqRespStatus[status],
|
|
848
|
+
});
|
|
849
|
+
this.markPeerForDisconnect(peerId);
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
const { data } = response;
|
|
854
|
+
const logData = { peerId, status: ReqRespStatus[status], data: data ? bufferToHex(data) : undefined };
|
|
855
|
+
const peerStatusMessage = StatusMessage.fromBuffer(data);
|
|
856
|
+
if (!ourStatus.validate(peerStatusMessage)) {
|
|
857
|
+
this.logger.debug(`Disconnecting peer ${peerId} due to failed status handshake.`, logData);
|
|
858
|
+
this.markPeerForDisconnect(peerId);
|
|
859
|
+
return;
|
|
860
|
+
}
|
|
861
|
+
this.logger.debug(`Successfully completed status handshake with peer ${peerId}`, logData);
|
|
862
|
+
} catch (err: any) {
|
|
863
|
+
//TODO: maybe hard ban these peers in the future
|
|
864
|
+
this.logger.debug(`Disconnecting peer ${peerId} due to error during status handshake: ${err.message ?? err}`, {
|
|
865
|
+
peerId,
|
|
866
|
+
});
|
|
867
|
+
this.markPeerForDisconnect(peerId);
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
/**
|
|
872
|
+
* Performs auth Handshake with the Peer
|
|
873
|
+
* A superset of the status handshake. Also includes a challenge that needs to be signed by the peer's validator key.
|
|
874
|
+
* @param: peerId The Id of the peer to request the Status from.
|
|
875
|
+
* */
|
|
876
|
+
private async exchangeAuthHandshake(peerId: PeerId) {
|
|
877
|
+
const peerIdString = peerId.toString();
|
|
878
|
+
|
|
879
|
+
try {
|
|
880
|
+
const ourStatus = await this.createStatusMessage();
|
|
881
|
+
const authRequest = new AuthRequest(ourStatus, Fr.random());
|
|
882
|
+
|
|
883
|
+
// Note: Technically we don't have to send our status to peer as well, but we do.
|
|
884
|
+
// It will be easier to update protocol in the future this way if need be.
|
|
885
|
+
// We also need to send the challenge at least, so that the peer can sign it.
|
|
886
|
+
this.logger.debug(`Initiating auth handshake with peer ${peerId}`);
|
|
887
|
+
const response = await this.reqresp.sendRequestToPeer(peerId, ReqRespSubProtocol.AUTH, authRequest.toBuffer());
|
|
888
|
+
const { status } = response;
|
|
889
|
+
if (status !== ReqRespStatus.SUCCESS) {
|
|
890
|
+
this.logger.verbose(`Disconnecting peer ${peerId} who failed to respond auth handshake`, {
|
|
891
|
+
peerId,
|
|
892
|
+
status: ReqRespStatus[status],
|
|
893
|
+
});
|
|
894
|
+
this.markAuthHandshakeFailed(peerId);
|
|
895
|
+
this.markPeerForDisconnect(peerId);
|
|
896
|
+
return;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
const { data } = response;
|
|
900
|
+
const logData = { peerId, status: ReqRespStatus[status], data: data ? bufferToHex(data) : undefined };
|
|
901
|
+
|
|
902
|
+
const peerAuthResponse = AuthResponse.fromBuffer(data);
|
|
903
|
+
|
|
904
|
+
const peerStatusMessage = peerAuthResponse.status;
|
|
905
|
+
if (!ourStatus.validate(peerStatusMessage)) {
|
|
906
|
+
this.logger.verbose(`Disconnecting peer ${peerId} due to failed status handshake as part of auth.`, logData);
|
|
907
|
+
this.markAuthHandshakeFailed(peerId);
|
|
908
|
+
this.markPeerForDisconnect(peerId);
|
|
909
|
+
return;
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
const hashToRecover = authRequest.getPayloadToSign();
|
|
913
|
+
const ethSignedHash = makeEthSignDigest(hashToRecover);
|
|
914
|
+
const sender = tryRecoverAddress(ethSignedHash, peerAuthResponse.signature);
|
|
915
|
+
if (!sender) {
|
|
916
|
+
this.logger.verbose(`Disconnecting peer ${peerId} due to failed auth handshake, invalid signature.`, logData);
|
|
917
|
+
this.markAuthHandshakeFailed(peerId);
|
|
918
|
+
this.markPeerForDisconnect(peerId);
|
|
919
|
+
return;
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
const registeredValidators = await this.epochCache.getRegisteredValidators();
|
|
923
|
+
const found = registeredValidators.find(v => v.toString() === sender.toString()) !== undefined;
|
|
924
|
+
if (!found) {
|
|
925
|
+
this.logger.verbose(
|
|
926
|
+
`Disconnecting peer ${peerId} due to failed auth handshake, peer is not a registered validator.`,
|
|
927
|
+
{ ...logData, address: sender.toString() },
|
|
928
|
+
);
|
|
929
|
+
this.markAuthHandshakeFailed(peerId);
|
|
930
|
+
this.markPeerForDisconnect(peerId);
|
|
931
|
+
return;
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
// Check to see that this validator address isn't already allocated to a different peer
|
|
935
|
+
const peerForAddress = this.authenticatedValidatorAddressToPeerId.get(sender.toString());
|
|
936
|
+
if (peerForAddress !== undefined && peerForAddress.toString() !== peerIdString) {
|
|
937
|
+
this.logger.verbose(
|
|
938
|
+
`Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
|
|
939
|
+
{ ...logData, address: sender.toString() },
|
|
940
|
+
);
|
|
941
|
+
return;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
this.markAuthHandshakeSuccess(peerId);
|
|
945
|
+
this.authenticatedPeerIdToValidatorAddress.set(peerIdString, sender);
|
|
946
|
+
this.authenticatedValidatorAddressToPeerId.set(sender.toString(), peerId);
|
|
947
|
+
this.logger.info(
|
|
948
|
+
`Successfully completed auth handshake with peer ${peerId}, validator address ${sender.toString()}`,
|
|
949
|
+
{ ...logData, address: sender.toString() },
|
|
950
|
+
);
|
|
951
|
+
} catch (err: any) {
|
|
952
|
+
//TODO: maybe hard ban these peers in the future
|
|
953
|
+
this.logger.verbose(`Disconnecting peer ${peerId} due to error during auth handshake: ${err.message}`, {
|
|
954
|
+
peerId,
|
|
955
|
+
err,
|
|
956
|
+
});
|
|
957
|
+
this.markAuthHandshakeFailed(peerId);
|
|
958
|
+
this.markPeerForDisconnect(peerId);
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
/*
|
|
963
|
+
* Marks when peer fails auth handshake
|
|
964
|
+
* */
|
|
965
|
+
private markAuthHandshakeFailed(peerId: PeerId) {
|
|
966
|
+
const now = this.dateProvider.now();
|
|
967
|
+
const peerIdStr = peerId.toString();
|
|
968
|
+
|
|
969
|
+
const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
|
|
970
|
+
this.failedAuthHandshakes.set(peerIdStr, {
|
|
971
|
+
count: (existingEntry?.count || 0) + 1,
|
|
972
|
+
lastFailureTimestamp: now,
|
|
973
|
+
});
|
|
974
|
+
|
|
975
|
+
const connections = this.libP2PNode.getConnections(peerId);
|
|
976
|
+
connections.forEach(conn => {
|
|
977
|
+
// We mark the IP address
|
|
978
|
+
const address = conn.remoteAddr.nodeAddress().address;
|
|
979
|
+
const existingAddressEntry = this.failedAuthHandshakes.get(address);
|
|
980
|
+
this.failedAuthHandshakes.set(address, {
|
|
981
|
+
count: (existingAddressEntry?.count || 0) + 1,
|
|
982
|
+
lastFailureTimestamp: now,
|
|
983
|
+
});
|
|
984
|
+
});
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
/*
|
|
988
|
+
* Marks when peer exchanges auth handshake
|
|
989
|
+
* Removes any failed previous attempts
|
|
990
|
+
* */
|
|
991
|
+
private markAuthHandshakeSuccess(peerId: PeerId) {
|
|
992
|
+
this.failedAuthHandshakes.delete(peerId.toString());
|
|
993
|
+
|
|
994
|
+
const connections = this.libP2PNode.getConnections(peerId);
|
|
995
|
+
connections.forEach(conn => {
|
|
996
|
+
const address = conn.remoteAddr.nodeAddress().address;
|
|
997
|
+
this.failedAuthHandshakes.delete(address);
|
|
998
|
+
});
|
|
999
|
+
}
|
|
1000
|
+
|
|
471
1001
|
/**
|
|
472
1002
|
* Stops the peer manager.
|
|
473
1003
|
* Removing all event listeners.
|
|
474
1004
|
*/
|
|
475
1005
|
public async stop() {
|
|
476
1006
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
477
|
-
this.peerDiscoveryService.off(PeerEvent.DISCOVERED, this.
|
|
1007
|
+
this.peerDiscoveryService.off(PeerEvent.DISCOVERED, this.handlers.handleDiscoveredPeer);
|
|
478
1008
|
|
|
479
1009
|
// Send goodbyes to all peers
|
|
480
1010
|
await Promise.all(
|
|
481
1011
|
this.libP2PNode.getPeers().map(peer => this.goodbyeAndDisconnectPeer(peer, GoodByeReason.SHUTDOWN)),
|
|
482
1012
|
);
|
|
483
1013
|
|
|
484
|
-
this.libP2PNode.removeEventListener(PeerEvent.CONNECTED, this.handleConnectedPeerEvent);
|
|
485
|
-
this.libP2PNode.removeEventListener(PeerEvent.DISCONNECTED, this.handleDisconnectedPeerEvent);
|
|
1014
|
+
this.libP2PNode.removeEventListener(PeerEvent.CONNECTED, this.handlers.handleConnectedPeerEvent);
|
|
1015
|
+
this.libP2PNode.removeEventListener(PeerEvent.DISCONNECTED, this.handlers.handleDisconnectedPeerEvent);
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
private shouldTrustWithIdentity(peerId: PeerId): boolean {
|
|
1019
|
+
return this.isProtectedPeer(peerId);
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
/**
|
|
1023
|
+
* Performs auth request verification from peer. An auth request is valid if requested by an authorized peer (a peer we trust).
|
|
1024
|
+
*
|
|
1025
|
+
* @param: _authRequest - Auth request (unused)
|
|
1026
|
+
* @param: peerId - The ID of the peer that requested the auth handshake
|
|
1027
|
+
*
|
|
1028
|
+
* @returns: StatusMessage if peer is trusted
|
|
1029
|
+
*
|
|
1030
|
+
* @throws: If peer is unauthorized
|
|
1031
|
+
* */
|
|
1032
|
+
public async handleAuthRequestFromPeer(_authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage> {
|
|
1033
|
+
if (!this.shouldTrustWithIdentity(peerId)) {
|
|
1034
|
+
this.logger.warn(`Received auth request from untrusted peer ${peerId.toString()}`);
|
|
1035
|
+
throw new Error('Unauthorised');
|
|
1036
|
+
}
|
|
1037
|
+
this.logger.debug(`Received auth request from trusted peer ${peerId.toString()}`);
|
|
1038
|
+
return await this.createStatusMessage();
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
private async updateAuthenticatedPeers(): Promise<void> {
|
|
1042
|
+
const registeredValidators = await this.epochCache.getRegisteredValidators();
|
|
1043
|
+
const validatorSet = new Set(registeredValidators.map(v => v.toString()));
|
|
1044
|
+
|
|
1045
|
+
const peersToDelete: Set<string> = new Set();
|
|
1046
|
+
const addressesToDelete: Set<string> = new Set();
|
|
1047
|
+
for (const [peer, address] of this.authenticatedPeerIdToValidatorAddress.entries()) {
|
|
1048
|
+
const addressString = address.toString();
|
|
1049
|
+
if (!validatorSet.has(addressString)) {
|
|
1050
|
+
peersToDelete.add(peer);
|
|
1051
|
+
addressesToDelete.add(addressString);
|
|
1052
|
+
this.logger.info(
|
|
1053
|
+
`Removing authentication for peer ${peer.toString()} at address ${addressString} due to no longer being a registered validator`,
|
|
1054
|
+
);
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
for (const peer of peersToDelete) {
|
|
1059
|
+
this.authenticatedPeerIdToValidatorAddress.delete(peer);
|
|
1060
|
+
}
|
|
1061
|
+
for (const address of addressesToDelete) {
|
|
1062
|
+
this.authenticatedValidatorAddressToPeerId.delete(address);
|
|
1063
|
+
}
|
|
486
1064
|
}
|
|
487
1065
|
}
|
|
488
1066
|
|