@aztec-labs/p2p 6.0.0-nightly.20260829
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 +134 -0
- package/dest/bootstrap/bootstrap.d.ts +39 -0
- package/dest/bootstrap/bootstrap.d.ts.map +1 -0
- package/dest/bootstrap/bootstrap.js +152 -0
- package/dest/client/factory.d.ts +32 -0
- package/dest/client/factory.d.ts.map +1 -0
- package/dest/client/factory.js +125 -0
- package/dest/client/index.d.ts +4 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +3 -0
- package/dest/client/interface.d.ts +223 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +9 -0
- package/dest/client/p2p_client.d.ts +202 -0
- package/dest/client/p2p_client.d.ts.map +1 -0
- package/dest/client/p2p_client.js +1051 -0
- package/dest/config.d.ts +295 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +458 -0
- package/dest/enr/generate-enr.d.ts +17 -0
- package/dest/enr/generate-enr.d.ts.map +1 -0
- package/dest/enr/generate-enr.js +52 -0
- package/dest/enr/index.d.ts +2 -0
- package/dest/enr/index.d.ts.map +1 -0
- package/dest/enr/index.js +1 -0
- package/dest/errors/attestation-pool.error.d.ts +7 -0
- package/dest/errors/attestation-pool.error.d.ts.map +1 -0
- package/dest/errors/attestation-pool.error.js +12 -0
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +21 -0
- package/dest/errors/reqresp.error.d.ts.map +1 -0
- package/dest/errors/reqresp.error.js +23 -0
- 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 +11 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +9 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +194 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.js +521 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +745 -0
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -0
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/index.js +1 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts +242 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/mocks.js +33 -0
- package/dest/mem_pools/index.d.ts +4 -0
- package/dest/mem_pools/index.d.ts.map +1 -0
- package/dest/mem_pools/index.js +1 -0
- package/dest/mem_pools/instrumentation.d.ts +41 -0
- package/dest/mem_pools/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/instrumentation.js +120 -0
- package/dest/mem_pools/interface.d.ts +10 -0
- package/dest/mem_pools/interface.d.ts.map +1 -0
- package/dest/mem_pools/interface.js +3 -0
- 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 +48 -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 +112 -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 +99 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -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 +64 -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 +92 -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 +79 -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 +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 +243 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +11 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +122 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +368 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +75 -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 +218 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +122 -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 +1039 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +17 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.js +111 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +24 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +75 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +3 -0
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/index.js +2 -0
- package/dest/msg_validators/index.d.ts +4 -0
- package/dest/msg_validators/index.d.ts.map +1 -0
- package/dest/msg_validators/index.js +3 -0
- 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 +16 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +16 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +26 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +40 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +186 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +7 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +25 -0
- 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 +25 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/block_header_validator.js +27 -0
- 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 +9 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/data_validator.js +114 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +21 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.js +36 -0
- 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 +302 -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_limits_validator.d.ts +73 -0
- package/dest/msg_validators/tx_validator/gas_limits_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/gas_limits_validator.js +107 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +65 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/gas_validator.js +107 -0
- package/dest/msg_validators/tx_validator/index.d.ts +20 -0
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/index.js +19 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.js +63 -0
- 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 +11 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +28 -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 +27 -0
- package/dest/services/data_store.d.ts.map +1 -0
- package/dest/services/data_store.js +192 -0
- package/dest/services/discv5/discV5_service.d.ts +54 -0
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +337 -0
- 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 +150 -0
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/services/dummy_service.js +228 -0
- package/dest/services/encoding.d.ts +67 -0
- package/dest/services/encoding.d.ts.map +1 -0
- package/dest/services/encoding.js +152 -0
- 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 +25 -0
- package/dest/services/gossipsub/scoring.d.ts.map +1 -0
- package/dest/services/gossipsub/scoring.js +27 -0
- package/dest/services/gossipsub/topic_score_params.d.ts +167 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +336 -0
- package/dest/services/index.d.ts +8 -0
- package/dest/services/index.d.ts.map +1 -0
- package/dest/services/index.js +7 -0
- package/dest/services/libp2p/instrumentation.d.ts +25 -0
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
- package/dest/services/libp2p/instrumentation.js +143 -0
- package/dest/services/libp2p/libp2p_service.d.ts +250 -0
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_service.js +1983 -0
- 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 +23 -0
- package/dest/services/peer-manager/metrics.d.ts.map +1 -0
- package/dest/services/peer-manager/metrics.js +71 -0
- package/dest/services/peer-manager/peer_manager.d.ts +202 -0
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_manager.js +1015 -0
- package/dest/services/peer-manager/peer_scoring.d.ts +65 -0
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_scoring.js +239 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
- package/dest/services/reqresp/config.d.ts +30 -0
- package/dest/services/reqresp/config.d.ts.map +1 -0
- package/dest/services/reqresp/config.js +45 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +76 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +251 -0
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- package/dest/services/reqresp/index.d.ts +7 -0
- package/dest/services/reqresp/index.d.ts.map +1 -0
- package/dest/services/reqresp/index.js +5 -0
- package/dest/services/reqresp/interface.d.ts +174 -0
- package/dest/services/reqresp/interface.d.ts.map +1 -0
- package/dest/services/reqresp/interface.js +107 -0
- package/dest/services/reqresp/metrics.d.ts +16 -0
- package/dest/services/reqresp/metrics.d.ts.map +1 -0
- package/dest/services/reqresp/metrics.js +50 -0
- 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_txs/bitvector.d.ts +35 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +88 -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 +60 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +75 -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 +139 -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 +49 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/goodbye.js +87 -0
- package/dest/services/reqresp/protocols/index.d.ts +10 -0
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/index.js +8 -0
- package/dest/services/reqresp/protocols/ping.d.ts +7 -0
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/ping.js +7 -0
- package/dest/services/reqresp/protocols/status.d.ts +42 -0
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/status.js +78 -0
- package/dest/services/reqresp/protocols/tx.d.ts +29 -0
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/tx.js +66 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts +2 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/index.js +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +105 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +194 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +3 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.js +64 -0
- package/dest/services/reqresp/reqresp.d.ts +107 -0
- package/dest/services/reqresp/reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/reqresp.js +887 -0
- package/dest/services/reqresp/status.d.ts +37 -0
- package/dest/services/reqresp/status.d.ts.map +1 -0
- package/dest/services/reqresp/status.js +58 -0
- package/dest/services/service.d.ts +168 -0
- package/dest/services/service.d.ts.map +1 -0
- package/dest/services/service.js +5 -0
- package/dest/services/tx_collection/config.d.ts +25 -0
- package/dest/services/tx_collection/config.d.ts.map +1 -0
- package/dest/services/tx_collection/config.js +59 -0
- 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 +4 -0
- package/dest/services/tx_collection/index.d.ts.map +1 -0
- package/dest/services/tx_collection/index.js +3 -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 +30 -0
- 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 +104 -0
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection.js +356 -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 +24 -0
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_source.js +56 -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 +46 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +142 -0
- package/dest/services/tx_provider.d.ts +53 -0
- package/dest/services/tx_provider.d.ts.map +1 -0
- package/dest/services/tx_provider.js +223 -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 +7 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts.map +1 -0
- package/dest/test-helpers/generate-peer-id-private-keys.js +13 -0
- package/dest/test-helpers/get-ports.d.ts +7 -0
- package/dest/test-helpers/get-ports.d.ts.map +1 -0
- package/dest/test-helpers/get-ports.js +8 -0
- package/dest/test-helpers/index.d.ts +9 -0
- package/dest/test-helpers/index.d.ts.map +1 -0
- package/dest/test-helpers/index.js +8 -0
- package/dest/test-helpers/make-enrs.d.ts +16 -0
- package/dest/test-helpers/make-enrs.d.ts.map +1 -0
- package/dest/test-helpers/make-enrs.js +31 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +63 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
- package/dest/test-helpers/make-test-p2p-clients.js +140 -0
- package/dest/test-helpers/mock-pubsub.d.ts +109 -0
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
- package/dest/test-helpers/mock-pubsub.js +244 -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 +68 -0
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
- package/dest/test-helpers/reqresp-nodes.js +240 -0
- package/dest/test-helpers/test_tx_provider.d.ts +42 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +44 -0
- package/dest/test-helpers/testbench-utils.d.ts +164 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +401 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -0
- package/dest/testbench/p2p_client_testbench_worker.js +364 -0
- package/dest/testbench/parse_log_file.d.ts +2 -0
- package/dest/testbench/parse_log_file.d.ts.map +1 -0
- package/dest/testbench/parse_log_file.js +131 -0
- package/dest/testbench/testbench.d.ts +2 -0
- package/dest/testbench/testbench.d.ts.map +1 -0
- package/dest/testbench/testbench.js +62 -0
- package/dest/testbench/worker_client_manager.d.ts +102 -0
- package/dest/testbench/worker_client_manager.d.ts.map +1 -0
- package/dest/testbench/worker_client_manager.js +492 -0
- package/dest/types/index.d.ts +34 -0
- package/dest/types/index.d.ts.map +1 -0
- package/dest/types/index.js +30 -0
- package/dest/util.d.ts +66 -0
- package/dest/util.d.ts.map +1 -0
- package/dest/util.js +167 -0
- package/dest/versioning.d.ts +9 -0
- package/dest/versioning.d.ts.map +1 -0
- package/dest/versioning.js +17 -0
- package/package.json +131 -0
- package/src/bootstrap/bootstrap.ts +178 -0
- package/src/client/factory.ts +282 -0
- package/src/client/index.ts +3 -0
- package/src/client/interface.ts +264 -0
- package/src/client/p2p_client.ts +846 -0
- package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
- package/src/config.ts +787 -0
- package/src/enr/generate-enr.ts +71 -0
- package/src/enr/index.ts +1 -0
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +29 -0
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +11 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +648 -0
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +896 -0
- package/src/mem_pools/attestation_pool/index.ts +9 -0
- package/src/mem_pools/attestation_pool/mocks.ts +56 -0
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/instrumentation.ts +160 -0
- package/src/mem_pools/interface.ts +10 -0
- 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 +130 -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 +120 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +126 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -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 +72 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +99 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +90 -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 +96 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +274 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +465 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +300 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1242 -0
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +116 -0
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +107 -0
- package/src/msg_validators/attestation_validator/index.ts +2 -0
- package/src/msg_validators/index.ts +3 -0
- 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 +37 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +49 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +198 -0
- package/src/msg_validators/tx_validator/README.md +137 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +24 -0
- 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 +38 -0
- 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 +173 -0
- package/src/msg_validators/tx_validator/double_spend_validator.ts +46 -0
- package/src/msg_validators/tx_validator/factory.ts +490 -0
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
- package/src/msg_validators/tx_validator/gas_limits_validator.ts +148 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +149 -0
- package/src/msg_validators/tx_validator/index.ts +19 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +104 -0
- 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 +61 -0
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +26 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +100 -0
- package/src/services/data_store.ts +229 -0
- package/src/services/discv5/discV5_service.ts +413 -0
- package/src/services/discv5/persisted_enr_store.ts +157 -0
- package/src/services/dummy_service.ts +320 -0
- package/src/services/encoding.ts +170 -0
- package/src/services/gossipsub/README.md +663 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +37 -0
- package/src/services/gossipsub/topic_score_params.ts +477 -0
- package/src/services/index.ts +7 -0
- package/src/services/libp2p/instrumentation.ts +147 -0
- package/src/services/libp2p/libp2p_service.ts +1972 -0
- package/src/services/peer-manager/interface.ts +28 -0
- package/src/services/peer-manager/metrics.ts +90 -0
- package/src/services/peer-manager/peer_manager.ts +1221 -0
- package/src/services/peer-manager/peer_scoring.ts +265 -0
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +344 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +659 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +60 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +167 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +248 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
- package/src/services/reqresp/config.ts +69 -0
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +287 -0
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/index.ts +6 -0
- package/src/services/reqresp/interface.ts +241 -0
- package/src/services/reqresp/metrics.ts +68 -0
- package/src/services/reqresp/protocols/auth.ts +83 -0
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +107 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +79 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +170 -0
- package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
- package/src/services/reqresp/protocols/goodbye.ts +102 -0
- package/src/services/reqresp/protocols/index.ts +9 -0
- package/src/services/reqresp/protocols/ping.ts +8 -0
- package/src/services/reqresp/protocols/status.ts +123 -0
- package/src/services/reqresp/protocols/tx.ts +76 -0
- package/src/services/reqresp/rate-limiter/index.ts +1 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +240 -0
- package/src/services/reqresp/rate-limiter/rate_limits.ts +65 -0
- package/src/services/reqresp/reqresp.ts +675 -0
- package/src/services/reqresp/status.ts +68 -0
- package/src/services/service.ts +219 -0
- package/src/services/tx_collection/config.ts +89 -0
- 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 +3 -0
- package/src/services/tx_collection/instrumentation.ts +35 -0
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +467 -0
- package/src/services/tx_collection/tx_collection_sink.ts +124 -0
- package/src/services/tx_collection/tx_source.ts +61 -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 +42 -0
- package/src/services/tx_file_store/tx_file_store.ts +163 -0
- package/src/services/tx_provider.ts +237 -0
- package/src/services/tx_provider_instrumentation.ts +54 -0
- package/src/test-helpers/generate-peer-id-private-keys.ts +15 -0
- package/src/test-helpers/get-ports.ts +8 -0
- package/src/test-helpers/index.ts +8 -0
- package/src/test-helpers/make-enrs.ts +42 -0
- package/src/test-helpers/make-test-p2p-clients.ts +213 -0
- 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 +327 -0
- package/src/test-helpers/test_tx_provider.ts +68 -0
- package/src/test-helpers/testbench-utils.ts +465 -0
- package/src/testbench/README.md +20 -0
- package/src/testbench/p2p_client_testbench_worker.ts +553 -0
- package/src/testbench/parse_log_file.ts +174 -0
- package/src/testbench/testbench.ts +66 -0
- package/src/testbench/worker_client_manager.ts +621 -0
- package/src/types/index.ts +38 -0
- package/src/util.ts +230 -0
- package/src/versioning.ts +26 -0
|
@@ -0,0 +1,675 @@
|
|
|
1
|
+
// @attribution: lodestar impl for inspiration
|
|
2
|
+
import { AbortError, TimeoutError } from '@aztec-labs/foundation/error';
|
|
3
|
+
import { createLogger } from '@aztec-labs/foundation/log';
|
|
4
|
+
import { executeTimeout } from '@aztec-labs/foundation/timer';
|
|
5
|
+
import { PeerErrorSeverity } from '@aztec-labs/stdlib/p2p';
|
|
6
|
+
import { Attributes, type TelemetryClient, getTelemetryClient, trackSpan } from '@aztec-labs/telemetry-client';
|
|
7
|
+
import type { IncomingStreamData, PeerId, Stream } from '@libp2p/interface';
|
|
8
|
+
import type { Libp2p } from 'libp2p';
|
|
9
|
+
import { pipeline } from 'node:stream/promises';
|
|
10
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
11
|
+
|
|
12
|
+
import { IndividualReqRespTimeoutError, OversizedReqRespRequestError } from '../../errors/reqresp.error.js';
|
|
13
|
+
import {
|
|
14
|
+
DEFAULT_MAX_RESPONSE_SIZE_KB,
|
|
15
|
+
OversizedSnappyResponseError,
|
|
16
|
+
ResponseSizeLimitExceededError,
|
|
17
|
+
SnappyTransform,
|
|
18
|
+
} from '../encoding.js';
|
|
19
|
+
import type { PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
20
|
+
import {
|
|
21
|
+
DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS,
|
|
22
|
+
DEFAULT_REQRESP_DIAL_TIMEOUT_MS,
|
|
23
|
+
MAX_REQRESP_REQUEST_SIZE_BYTES,
|
|
24
|
+
type P2PReqRespConfig,
|
|
25
|
+
} from './config.js';
|
|
26
|
+
import { ConnectionSampler, RandomSampler } from './connection-sampler/connection_sampler.js';
|
|
27
|
+
import {
|
|
28
|
+
type ReqRespInterface,
|
|
29
|
+
type ReqRespResponse,
|
|
30
|
+
ReqRespSubProtocol,
|
|
31
|
+
type ReqRespSubProtocolHandler,
|
|
32
|
+
type ReqRespSubProtocolHandlers,
|
|
33
|
+
type ReqRespSubProtocolRateLimits,
|
|
34
|
+
type ShouldRejectPeer,
|
|
35
|
+
UNAUTHENTICATED_ALLOWED_PROTOCOLS,
|
|
36
|
+
subProtocolSizeCalculators,
|
|
37
|
+
} from './interface.js';
|
|
38
|
+
import { ReqRespMetrics } from './metrics.js';
|
|
39
|
+
import {
|
|
40
|
+
RateLimitStatus,
|
|
41
|
+
RequestResponseRateLimiter,
|
|
42
|
+
prettyPrintRateLimitStatus,
|
|
43
|
+
} from './rate-limiter/rate_limiter.js';
|
|
44
|
+
import { ReqRespStatus, ReqRespStatusError, parseStatusChunk } from './status.js';
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The Request Response Service
|
|
48
|
+
*
|
|
49
|
+
* It allows nodes to request specific information from their peers, its use case covers recovering
|
|
50
|
+
* information that was missed during a synchronisation or a gossip event.
|
|
51
|
+
*
|
|
52
|
+
* This service implements the request response sub protocol, it is heavily inspired from
|
|
53
|
+
* ethereum implementations of the same name.
|
|
54
|
+
*
|
|
55
|
+
* Note, responses get compressed in streamHandler
|
|
56
|
+
* so they get decompressed in readMessage
|
|
57
|
+
*
|
|
58
|
+
* see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-reqresp-domain
|
|
59
|
+
*/
|
|
60
|
+
export class ReqResp implements ReqRespInterface {
|
|
61
|
+
private individualRequestTimeoutMs: number = DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS;
|
|
62
|
+
private dialTimeoutMs: number = DEFAULT_REQRESP_DIAL_TIMEOUT_MS;
|
|
63
|
+
|
|
64
|
+
private subProtocolHandlers: Partial<ReqRespSubProtocolHandlers> = {};
|
|
65
|
+
|
|
66
|
+
private connectionSampler: ConnectionSampler;
|
|
67
|
+
private rateLimiter: RequestResponseRateLimiter;
|
|
68
|
+
|
|
69
|
+
private snappyTransform: SnappyTransform;
|
|
70
|
+
|
|
71
|
+
private shouldRejectPeer: ShouldRejectPeer | undefined;
|
|
72
|
+
|
|
73
|
+
private metrics: ReqRespMetrics;
|
|
74
|
+
|
|
75
|
+
constructor(
|
|
76
|
+
config: P2PReqRespConfig,
|
|
77
|
+
private libp2p: Libp2p,
|
|
78
|
+
private peerScoring: PeerScoring,
|
|
79
|
+
private logger = createLogger('p2p:reqresp'),
|
|
80
|
+
rateLimits: Partial<ReqRespSubProtocolRateLimits> = {},
|
|
81
|
+
telemetryClient: TelemetryClient = getTelemetryClient(),
|
|
82
|
+
) {
|
|
83
|
+
this.updateConfig(config);
|
|
84
|
+
|
|
85
|
+
this.rateLimiter = new RequestResponseRateLimiter(peerScoring, rateLimits);
|
|
86
|
+
|
|
87
|
+
// Connection sampler is used to sample our connected peers
|
|
88
|
+
this.connectionSampler = new ConnectionSampler(
|
|
89
|
+
libp2p,
|
|
90
|
+
new RandomSampler(),
|
|
91
|
+
createLogger(`${logger.module}:connection-sampler`),
|
|
92
|
+
config,
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
this.snappyTransform = new SnappyTransform();
|
|
96
|
+
this.metrics = new ReqRespMetrics(telemetryClient);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
public updateConfig(config: Partial<P2PReqRespConfig>): void {
|
|
100
|
+
if (typeof config.individualRequestTimeoutMs === 'number') {
|
|
101
|
+
this.individualRequestTimeoutMs = config.individualRequestTimeoutMs;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (typeof config.dialTimeoutMs === 'number') {
|
|
105
|
+
this.dialTimeoutMs = config.dialTimeoutMs;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
public setShouldRejectPeer(checker: ShouldRejectPeer): void {
|
|
110
|
+
this.shouldRejectPeer = checker;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
get tracer() {
|
|
114
|
+
return this.metrics.tracer;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Get the connection sampler instance
|
|
119
|
+
*/
|
|
120
|
+
getConnectionSampler(): Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'> {
|
|
121
|
+
return this.connectionSampler;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Start the reqresp service
|
|
126
|
+
*/
|
|
127
|
+
async start(subProtocolHandlers: ReqRespSubProtocolHandlers) {
|
|
128
|
+
Object.assign(this.subProtocolHandlers, subProtocolHandlers);
|
|
129
|
+
|
|
130
|
+
// Register streamHandler with libp2p.
|
|
131
|
+
// The streamHandler is responsible for reading the incoming stream, determining the protocol, then triggering the appropriate handler.
|
|
132
|
+
for (const subProtocol of Object.keys(subProtocolHandlers)) {
|
|
133
|
+
this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
|
|
134
|
+
await this.libp2p.handle(
|
|
135
|
+
subProtocol,
|
|
136
|
+
(data: IncomingStreamData) =>
|
|
137
|
+
void this.streamHandler(subProtocol as ReqRespSubProtocol, data).catch(err =>
|
|
138
|
+
this.logger.error(`Error on libp2p subprotocol ${subProtocol} handler`, err),
|
|
139
|
+
),
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
this.rateLimiter.start();
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async addSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
146
|
+
this.subProtocolHandlers[subProtocol] = handler;
|
|
147
|
+
this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
|
|
148
|
+
await this.libp2p.handle(
|
|
149
|
+
subProtocol,
|
|
150
|
+
(data: IncomingStreamData) =>
|
|
151
|
+
void this.streamHandler(subProtocol as ReqRespSubProtocol, data).catch(err =>
|
|
152
|
+
this.logger.error(`Error on libp2p subprotocol ${subProtocol} handler`, err),
|
|
153
|
+
),
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Stop the reqresp service
|
|
159
|
+
*/
|
|
160
|
+
async stop() {
|
|
161
|
+
// Unregister handlers in parallel
|
|
162
|
+
const unregisterPromises = Object.keys(this.subProtocolHandlers).map(protocol => this.libp2p.unhandle(protocol));
|
|
163
|
+
await Promise.all(unregisterPromises);
|
|
164
|
+
|
|
165
|
+
// Close connection sampler
|
|
166
|
+
await this.connectionSampler.stop();
|
|
167
|
+
this.logger.debug('ReqResp: Connection sampler stopped');
|
|
168
|
+
|
|
169
|
+
// Close streams in parallel
|
|
170
|
+
const closeStreamPromises = this.libp2p.getConnections().map(connection => connection.close());
|
|
171
|
+
await Promise.all(closeStreamPromises);
|
|
172
|
+
this.logger.debug('ReqResp: All active streams closed');
|
|
173
|
+
|
|
174
|
+
this.rateLimiter.stop();
|
|
175
|
+
this.logger.debug('ReqResp: Rate limiter stopped');
|
|
176
|
+
|
|
177
|
+
// NOTE: We assume libp2p instance is managed by the caller
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Sends a request to a specific peer
|
|
182
|
+
*
|
|
183
|
+
* We first dial a particular protocol for the peer, this ensures that the peer knows
|
|
184
|
+
* what to respond with
|
|
185
|
+
*
|
|
186
|
+
*
|
|
187
|
+
* @param peerId - The peer to send the request to
|
|
188
|
+
* @param subProtocol - The protocol to use to request
|
|
189
|
+
* @param payload - The payload to send
|
|
190
|
+
* @param dialTimeout - If establishing a stream takes longer than this an error will be thrown
|
|
191
|
+
* @returns If the request is successful, the response is returned, otherwise undefined
|
|
192
|
+
*
|
|
193
|
+
* @description
|
|
194
|
+
* This method attempts to open a stream with the specified peer, send the payload,
|
|
195
|
+
* and await a response.
|
|
196
|
+
* If an error occurs, it penalizes the peer and returns undefined.
|
|
197
|
+
*
|
|
198
|
+
* The method performs the following steps:
|
|
199
|
+
* - Opens a stream with the peer using the specified sub-protocol.
|
|
200
|
+
* - Sends the payload and awaits a response with a timeout.
|
|
201
|
+
*
|
|
202
|
+
* If the stream is not closed by the dialled peer, and a timeout occurs, then
|
|
203
|
+
* the stream is closed on the requester's end and sender (us) updates its peer score
|
|
204
|
+
*/
|
|
205
|
+
@trackSpan('ReqResp.sendRequestToPeer', (peerId: PeerId, subProtocol: ReqRespSubProtocol, _: Buffer) => ({
|
|
206
|
+
[Attributes.P2P_ID]: peerId.toString(),
|
|
207
|
+
[Attributes.P2P_REQ_RESP_PROTOCOL]: subProtocol,
|
|
208
|
+
}))
|
|
209
|
+
public async sendRequestToPeer(
|
|
210
|
+
peerId: PeerId,
|
|
211
|
+
subProtocol: ReqRespSubProtocol,
|
|
212
|
+
payload: Buffer,
|
|
213
|
+
dialTimeout: number = this.dialTimeoutMs,
|
|
214
|
+
): Promise<ReqRespResponse> {
|
|
215
|
+
// Thrown before the try block so the generic error handling below does not penalize the peer for our own bug.
|
|
216
|
+
if (payload.length > MAX_REQRESP_REQUEST_SIZE_BYTES) {
|
|
217
|
+
throw new OversizedReqRespRequestError(subProtocol, payload.length, MAX_REQRESP_REQUEST_SIZE_BYTES);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
let stream: Stream | undefined;
|
|
221
|
+
try {
|
|
222
|
+
this.metrics.recordRequestSent(subProtocol);
|
|
223
|
+
|
|
224
|
+
// Calculate expected response size based on the request payload
|
|
225
|
+
const expectedSizeKb = subProtocolSizeCalculators[subProtocol](payload);
|
|
226
|
+
|
|
227
|
+
this.logger.trace(`Sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`);
|
|
228
|
+
stream = await this.connectionSampler.dialProtocol(peerId, subProtocol, dialTimeout);
|
|
229
|
+
this.logger.trace(
|
|
230
|
+
`Opened stream ${stream.id} for sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`,
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
const timeoutErr = new IndividualReqRespTimeoutError();
|
|
234
|
+
// Create a wrapper to pass the expected size to readMessage
|
|
235
|
+
const readMessageWithSizeLimit = (source: AsyncIterable<Uint8ArrayList>) =>
|
|
236
|
+
this.readMessage(source, expectedSizeKb);
|
|
237
|
+
const [_, resp] = await executeTimeout(
|
|
238
|
+
signal =>
|
|
239
|
+
Promise.all([
|
|
240
|
+
pipeline([payload], stream!.sink, { signal }),
|
|
241
|
+
pipeline(stream!.source, readMessageWithSizeLimit, { signal }),
|
|
242
|
+
]),
|
|
243
|
+
this.individualRequestTimeoutMs,
|
|
244
|
+
() => timeoutErr,
|
|
245
|
+
);
|
|
246
|
+
return resp;
|
|
247
|
+
} catch (e: any) {
|
|
248
|
+
this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
|
|
249
|
+
// On error we immediately abort the stream, this is preferred way,
|
|
250
|
+
// because it signals to the sender that error happened, whereas
|
|
251
|
+
// closing the stream only closes our side and is much slower
|
|
252
|
+
if (stream) {
|
|
253
|
+
stream!.abort(e);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
this.metrics.recordRequestError(subProtocol);
|
|
257
|
+
this.handleResponseError(e, peerId, subProtocol);
|
|
258
|
+
|
|
259
|
+
// If there is an exception, we return an unknown response
|
|
260
|
+
this.logger.debug(`Error sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}: ${e}`);
|
|
261
|
+
return { status: ReqRespStatus.FAILURE };
|
|
262
|
+
} finally {
|
|
263
|
+
// Only close the stream if we created it
|
|
264
|
+
// Note even if we aborted the stream, calling close on it is ok, it's just a no-op
|
|
265
|
+
if (stream) {
|
|
266
|
+
try {
|
|
267
|
+
this.logger.trace(
|
|
268
|
+
`Closing stream ${stream.id} for request to peer ${peerId.toString()} on sub protocol ${subProtocol}`,
|
|
269
|
+
);
|
|
270
|
+
await this.connectionSampler.close(stream);
|
|
271
|
+
} catch (closeError) {
|
|
272
|
+
this.logger.error(
|
|
273
|
+
`Error closing stream: ${closeError instanceof Error ? closeError.message : 'Unknown error'}`,
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Handle a response error
|
|
282
|
+
*
|
|
283
|
+
* ReqResp errors are punished differently depending on the severity of the offense
|
|
284
|
+
*
|
|
285
|
+
* @param e - The error
|
|
286
|
+
* @param peerId - The peer id
|
|
287
|
+
* @param subProtocol - The sub protocol
|
|
288
|
+
* @returns If the error is non pubishable, then undefined is returned, otherwise the peer is penalized
|
|
289
|
+
*/
|
|
290
|
+
private handleResponseError(e: any, peerId: PeerId, subProtocol: ReqRespSubProtocol): void {
|
|
291
|
+
const severity = this.categorizeResponseError(e, peerId, subProtocol);
|
|
292
|
+
if (severity) {
|
|
293
|
+
this.peerScoring.penalizePeer(peerId, severity);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Read a message returned from a stream into a single buffer
|
|
299
|
+
*
|
|
300
|
+
* The message is split into two components
|
|
301
|
+
* - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
|
|
302
|
+
* - The second chunk should contain the response data
|
|
303
|
+
*
|
|
304
|
+
* To bound memory usage we abort reception as soon as the accumulated compressed bytes exceed a
|
|
305
|
+
* bound derived from `maxSizeKb`, before the full stream has been buffered. Without this a peer we
|
|
306
|
+
* dialed could stream data up to the request timeout, forcing us to buffer arbitrarily much (the
|
|
307
|
+
* `maxSizeKb` guard in `inboundTransformData` only runs after the whole compressed payload is
|
|
308
|
+
* concatenated, so it does nothing to cap reception memory). Snappy can expand incompressible input
|
|
309
|
+
* to ~1.17x its size, so we allow 2x `maxSizeKb`: comfortably above the worst-case expansion of a
|
|
310
|
+
* legitimate max-size response, while still capping buffered memory at twice the permitted size.
|
|
311
|
+
*
|
|
312
|
+
* @param source - The async iterable source of data chunks
|
|
313
|
+
* @param maxSizeKb - Optional maximum expected size in KB for the decompressed response
|
|
314
|
+
*/
|
|
315
|
+
private async readMessage(source: AsyncIterable<Uint8ArrayList>, maxSizeKb?: number): Promise<ReqRespResponse> {
|
|
316
|
+
let status: ReqRespStatus | undefined;
|
|
317
|
+
const chunks: Uint8Array[] = [];
|
|
318
|
+
|
|
319
|
+
const maxAccumulatedBytes = (maxSizeKb ?? DEFAULT_MAX_RESPONSE_SIZE_KB) * 1024 * 2;
|
|
320
|
+
let accumulatedBytes = 0;
|
|
321
|
+
|
|
322
|
+
try {
|
|
323
|
+
for await (const chunk of source) {
|
|
324
|
+
const statusParsed = status !== undefined;
|
|
325
|
+
if (statusParsed) {
|
|
326
|
+
// Use `byteLength` (the logical length) rather than `chunk.subarray().length`: calling
|
|
327
|
+
// `subarray()` on a `Uint8ArrayList` consolidates its backing buffers into a single copy,
|
|
328
|
+
// which would materialize the very chunk we are trying to reject.
|
|
329
|
+
accumulatedBytes += chunk.byteLength;
|
|
330
|
+
if (accumulatedBytes > maxAccumulatedBytes) {
|
|
331
|
+
throw new ResponseSizeLimitExceededError(accumulatedBytes, maxAccumulatedBytes);
|
|
332
|
+
}
|
|
333
|
+
chunks.push(chunk.subarray());
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
const firstChunkBuffer = chunk.subarray();
|
|
338
|
+
status = parseStatusChunk(firstChunkBuffer);
|
|
339
|
+
|
|
340
|
+
// In case status is not SUCCESS, we do not expect any data in the response
|
|
341
|
+
// we can return early
|
|
342
|
+
if (status !== ReqRespStatus.SUCCESS) {
|
|
343
|
+
return {
|
|
344
|
+
status,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
const messageData = Buffer.concat(chunks);
|
|
350
|
+
const message: Buffer = this.snappyTransform.inboundTransformData(messageData, undefined, maxSizeKb);
|
|
351
|
+
|
|
352
|
+
return {
|
|
353
|
+
status: status ?? ReqRespStatus.UNKNOWN,
|
|
354
|
+
data: message,
|
|
355
|
+
};
|
|
356
|
+
} catch (e: any) {
|
|
357
|
+
// All errors (invalid status bytes, oversized snappy responses, corrupt data, etc.)
|
|
358
|
+
// are re-thrown so the caller can penalize the peer via handleResponseError.
|
|
359
|
+
this.logger.debug(`Reading message failed: ${e.message}`);
|
|
360
|
+
throw e;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Stream Handler
|
|
366
|
+
* Reads the incoming stream, determines the protocol, then triggers the appropriate handler
|
|
367
|
+
*
|
|
368
|
+
* @param protocol - The sub protocol to handle
|
|
369
|
+
* @param incomingStream - The incoming stream data containing the stream and connection
|
|
370
|
+
*
|
|
371
|
+
* @description
|
|
372
|
+
* An individual stream handler will be bound to each sub protocol, and handles returning data back
|
|
373
|
+
* to the requesting peer.
|
|
374
|
+
*
|
|
375
|
+
* The sub protocol handler interface is defined within `interface.ts` and will be assigned to the
|
|
376
|
+
* req resp service on start up.
|
|
377
|
+
*
|
|
378
|
+
* We check rate limits for each peer, note the peer will be penalised within the rate limiter implementation
|
|
379
|
+
* if they exceed their peer specific limits.
|
|
380
|
+
*/
|
|
381
|
+
@trackSpan('ReqResp.streamHandler', (protocol: ReqRespSubProtocol, { connection }: IncomingStreamData) => ({
|
|
382
|
+
[Attributes.P2P_REQ_RESP_PROTOCOL]: protocol,
|
|
383
|
+
[Attributes.P2P_ID]: connection.remotePeer.toString(),
|
|
384
|
+
}))
|
|
385
|
+
private async streamHandler(protocol: ReqRespSubProtocol, incomingStream: IncomingStreamData) {
|
|
386
|
+
const { stream, connection } = incomingStream;
|
|
387
|
+
try {
|
|
388
|
+
this.metrics.recordRequestReceived(protocol);
|
|
389
|
+
const rateLimitStatus = this.rateLimiter.allow(protocol, connection.remotePeer);
|
|
390
|
+
if (rateLimitStatus !== RateLimitStatus.Allowed) {
|
|
391
|
+
this.logger.verbose(
|
|
392
|
+
`Rate limit exceeded ${prettyPrintRateLimitStatus(rateLimitStatus)} for ${protocol} from ${
|
|
393
|
+
connection.remotePeer
|
|
394
|
+
}`,
|
|
395
|
+
);
|
|
396
|
+
|
|
397
|
+
throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// When p2pAllowOnlyValidators is enabled, reject unauthenticated peers on data protocols
|
|
401
|
+
if (
|
|
402
|
+
!UNAUTHENTICATED_ALLOWED_PROTOCOLS.has(protocol) &&
|
|
403
|
+
(this.shouldRejectPeer?.(connection.remotePeer.toString()) ?? false)
|
|
404
|
+
) {
|
|
405
|
+
this.logger.debug(`Rejecting unauthenticated peer ${connection.remotePeer} on gated protocol ${protocol}`);
|
|
406
|
+
throw new ReqRespStatusError(ReqRespStatus.FAILURE);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
await this.processStream(protocol, incomingStream);
|
|
410
|
+
} catch (err: any) {
|
|
411
|
+
this.metrics.recordResponseError(protocol);
|
|
412
|
+
this.handleRequestError(err, connection.remotePeer, protocol);
|
|
413
|
+
|
|
414
|
+
if (err instanceof ReqRespStatusError) {
|
|
415
|
+
const errorSent = await this.trySendError(stream, connection.remotePeer, protocol, err.status);
|
|
416
|
+
const logMessage = errorSent
|
|
417
|
+
? 'Protocol error sent successfully.'
|
|
418
|
+
: 'Stream already closed or poisoned, not sending error response.';
|
|
419
|
+
|
|
420
|
+
const isRateLimit = err.status === ReqRespStatus.RATE_LIMIT_EXCEEDED;
|
|
421
|
+
|
|
422
|
+
const level = isRateLimit ? 'debug' : 'warn';
|
|
423
|
+
this.logger[level](logMessage + ` Status: ${ReqRespStatus[err.status]}`, {
|
|
424
|
+
protocol,
|
|
425
|
+
err,
|
|
426
|
+
errorStatus: err.status,
|
|
427
|
+
cause: err.cause ?? 'Cause unknown',
|
|
428
|
+
});
|
|
429
|
+
} else {
|
|
430
|
+
// In erroneous case we abort the stream, this will signal the peer that something went wrong
|
|
431
|
+
// and that this stream should be dropped
|
|
432
|
+
const isMessageToNotWarn =
|
|
433
|
+
err instanceof Error &&
|
|
434
|
+
['stream reset', 'Cannot push value onto an ended pushable', 'read ECONNRESET'].some(msg =>
|
|
435
|
+
err.message.includes(msg),
|
|
436
|
+
);
|
|
437
|
+
const level = isMessageToNotWarn ? 'debug' : 'warn';
|
|
438
|
+
this.logger[level]('Unknown stream error while handling the stream, aborting', {
|
|
439
|
+
protocol,
|
|
440
|
+
err,
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
stream.abort(err);
|
|
444
|
+
}
|
|
445
|
+
} finally {
|
|
446
|
+
//NOTE: This is idempotent action, so it's ok to call it even if stream was aborted
|
|
447
|
+
await stream.close();
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Reads incoming data from the stream, processes it according to the sub protocol,
|
|
453
|
+
* and puts response back into the stream.
|
|
454
|
+
*
|
|
455
|
+
* @param protocol - The sub protocol to use for processing the stream
|
|
456
|
+
* @param incomingStream - The incoming stream data containing the stream and connection
|
|
457
|
+
*
|
|
458
|
+
* */
|
|
459
|
+
private async processStream(protocol: ReqRespSubProtocol, { stream, connection }: IncomingStreamData): Promise<void> {
|
|
460
|
+
const handler = this.subProtocolHandlers[protocol];
|
|
461
|
+
if (!handler) {
|
|
462
|
+
throw new Error(`No handler defined for reqresp subprotocol ${protocol}`);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
const snappy = this.snappyTransform;
|
|
466
|
+
const SUCCESS = Uint8Array.of(ReqRespStatus.SUCCESS);
|
|
467
|
+
|
|
468
|
+
await pipeline(
|
|
469
|
+
stream.source,
|
|
470
|
+
async function* (source: any) {
|
|
471
|
+
// Req/resp is one-request-one-response: an honest sender writes a single payload and half-closes.
|
|
472
|
+
// Process only the first chunk and return, so extra frames a peer queues on the same stream cannot
|
|
473
|
+
// drive further handler invocations that bypass the per-stream rate-limit check in streamHandler.
|
|
474
|
+
for await (const chunk of source) {
|
|
475
|
+
const response = await handler(connection.remotePeer, chunk.subarray());
|
|
476
|
+
|
|
477
|
+
if (protocol === ReqRespSubProtocol.GOODBYE) {
|
|
478
|
+
// NOTE: The stream was already closed by Goodbye handler
|
|
479
|
+
// peerManager.goodbyeReceived(peerId, reason); will call libp2p.hangUp closing all active streams and connections
|
|
480
|
+
// Don't try to respond
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
stream.metadata.written = true; // Mark the stream as written to;
|
|
485
|
+
|
|
486
|
+
yield SUCCESS;
|
|
487
|
+
yield snappy.outboundTransformData(response);
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
},
|
|
491
|
+
stream.sink,
|
|
492
|
+
);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* Try to send error status to the peer. We say try, because the stream,
|
|
497
|
+
* might already be closed
|
|
498
|
+
* @param stream - The stream opened between us and the peer
|
|
499
|
+
* @param status - The error status to send back to the peer
|
|
500
|
+
* @returns true if error was sent successfully, otherwise false
|
|
501
|
+
*
|
|
502
|
+
*/
|
|
503
|
+
private async trySendError(
|
|
504
|
+
stream: Stream,
|
|
505
|
+
peerId: PeerId,
|
|
506
|
+
protocol: ReqRespSubProtocol,
|
|
507
|
+
status: ReqRespStatus,
|
|
508
|
+
): Promise<boolean> {
|
|
509
|
+
const canWriteToStream =
|
|
510
|
+
// 'writing' is a bit weird naming, but it actually means that the stream is ready to write
|
|
511
|
+
// 'ready' means that stream ready to be opened for writing
|
|
512
|
+
stream.status === 'open' && (stream.writeStatus === 'writing' || stream.writeStatus === 'ready');
|
|
513
|
+
|
|
514
|
+
// Stream was already written to, we consider it poisoned, in a sense,
|
|
515
|
+
// that even if we write an error response, it will not be interpreted correctly by the peer
|
|
516
|
+
const streamPoisoned = stream.metadata.written === true;
|
|
517
|
+
const shouldWriteToStream = canWriteToStream && !streamPoisoned;
|
|
518
|
+
|
|
519
|
+
if (!shouldWriteToStream) {
|
|
520
|
+
return false;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
try {
|
|
524
|
+
await pipeline(function* () {
|
|
525
|
+
yield Uint8Array.of(status);
|
|
526
|
+
}, stream.sink);
|
|
527
|
+
|
|
528
|
+
return true;
|
|
529
|
+
} catch (e: any) {
|
|
530
|
+
this.logger.warn('Error while sending error response', e);
|
|
531
|
+
stream.abort(e);
|
|
532
|
+
|
|
533
|
+
this.handleRequestError(e, peerId, protocol);
|
|
534
|
+
return false;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
private handleRequestError(e: any, peerId: PeerId, subProtocol: ReqRespSubProtocol): void {
|
|
539
|
+
const severity = this.categorizeRequestError(e, peerId, subProtocol);
|
|
540
|
+
if (severity) {
|
|
541
|
+
this.peerScoring.penalizePeer(peerId, severity);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* Categorize the request error and log it.
|
|
547
|
+
*
|
|
548
|
+
* @returns Severity of the error, or undefined if the error is not punishable.
|
|
549
|
+
*/
|
|
550
|
+
private categorizeRequestError(
|
|
551
|
+
e: any,
|
|
552
|
+
peerId: PeerId,
|
|
553
|
+
subProtocol: ReqRespSubProtocol,
|
|
554
|
+
): PeerErrorSeverity | undefined {
|
|
555
|
+
const logTags = { peerId: peerId.toString(), subProtocol };
|
|
556
|
+
|
|
557
|
+
// Punishable error - peer should never send badly formed request
|
|
558
|
+
if (e instanceof ReqRespStatusError && e.status === ReqRespStatus.BADLY_FORMED_REQUEST) {
|
|
559
|
+
this.logger.debug(`Punishable error in ${subProtocol}: ${e.cause}`, logTags);
|
|
560
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// TODO: (mralj): think if we should penalize peer here based on connection errors
|
|
564
|
+
return undefined;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Categorize the response error and log it.
|
|
569
|
+
*
|
|
570
|
+
* @returns Severity of the error, or undefined if the error is not punishable.
|
|
571
|
+
*/
|
|
572
|
+
private categorizeResponseError(
|
|
573
|
+
e: any,
|
|
574
|
+
peerId: PeerId,
|
|
575
|
+
subProtocol: ReqRespSubProtocol,
|
|
576
|
+
): PeerErrorSeverity | undefined {
|
|
577
|
+
const logTags = { peerId: peerId.toString(), subProtocol };
|
|
578
|
+
|
|
579
|
+
// Non punishable errors - we do not expect a response for goodbye messages
|
|
580
|
+
if (subProtocol === ReqRespSubProtocol.GOODBYE) {
|
|
581
|
+
this.logger.debug('Error encountered on goodbye sub protocol, no penalty', logTags);
|
|
582
|
+
return undefined;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// Invalid status byte: the peer sent a status byte that doesn't match any known status code.
|
|
586
|
+
// This is a protocol violation, penalize harshly.
|
|
587
|
+
if (e instanceof ReqRespStatusError) {
|
|
588
|
+
this.logger.warn(`Invalid status byte from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
589
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// Oversized snappy response: the peer is sending data that exceeds the allowed size.
|
|
593
|
+
// This is a protocol violation that wastes bandwidth, so penalize harshly.
|
|
594
|
+
if (e instanceof OversizedSnappyResponseError) {
|
|
595
|
+
this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
596
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// Response exceeded the reception buffer bound: the peer streamed more compressed data than the
|
|
600
|
+
// per-request size limit allows. Same protocol violation as above, penalize harshly.
|
|
601
|
+
if (e instanceof ResponseSizeLimitExceededError) {
|
|
602
|
+
this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
603
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
return this.categorizeConnectionErrors(e, peerId, subProtocol);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/*
|
|
610
|
+
* Errors specific to connection handling
|
|
611
|
+
* These can happen both when sending request and response.
|
|
612
|
+
*/
|
|
613
|
+
private categorizeConnectionErrors(
|
|
614
|
+
e: any,
|
|
615
|
+
peerId: PeerId,
|
|
616
|
+
subProtocol: ReqRespSubProtocol,
|
|
617
|
+
): PeerErrorSeverity | undefined {
|
|
618
|
+
const logTags = { peerId: peerId.toString(), subProtocol };
|
|
619
|
+
// Do not punish if we are stopping the service
|
|
620
|
+
if (e instanceof AbortError || e?.code == 'ABORT_ERR') {
|
|
621
|
+
this.logger.debug(`Request aborted: ${e.message}`, logTags);
|
|
622
|
+
return undefined;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
// Do not punish if we are the ones closing the connection
|
|
626
|
+
if (
|
|
627
|
+
e?.code === 'ERR_CONNECTION_BEING_CLOSED' ||
|
|
628
|
+
e?.code === 'ERR_CONNECTION_CLOSED' ||
|
|
629
|
+
e?.code === 'ERR_TRANSIENT_CONNECTION' ||
|
|
630
|
+
e?.message?.includes('Muxer already closed') ||
|
|
631
|
+
e?.message?.includes('muxer closed') ||
|
|
632
|
+
e?.message?.includes('ended pushable')
|
|
633
|
+
) {
|
|
634
|
+
this.logger.debug(
|
|
635
|
+
`Connection closed to peer from our side: ${peerId.toString()} (${e?.message ?? 'missing error message'})`,
|
|
636
|
+
logTags,
|
|
637
|
+
);
|
|
638
|
+
return undefined;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// Pubishable errors
|
|
642
|
+
// Connection reset errors in the networking stack are punished with high severity
|
|
643
|
+
// it just signals an unreliable peer
|
|
644
|
+
// We assume that the requesting node has a functioning networking stack.
|
|
645
|
+
if (e?.code === 'ECONNRESET' || e?.code === 'EPIPE') {
|
|
646
|
+
this.logger.debug(`Connection reset: ${peerId.toString()}`, logTags);
|
|
647
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
if (e?.code === 'ECONNREFUSED') {
|
|
651
|
+
this.logger.debug(`Connection refused: ${peerId.toString()}`, logTags);
|
|
652
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
if (e?.code === 'ERR_UNEXPECTED_EOF') {
|
|
656
|
+
this.logger.debug(`Connection unexpected EOF: ${peerId.toString()}`, logTags);
|
|
657
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
if (e?.code === 'ERR_UNSUPPORTED_PROTOCOL') {
|
|
661
|
+
this.logger.debug(`Sub protocol not supported by peer: ${peerId.toString()}`, logTags);
|
|
662
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
// Timeout errors are punished with high tolerance, they can be due to a geographically far away or overloaded peer
|
|
666
|
+
if (e instanceof IndividualReqRespTimeoutError || e instanceof TimeoutError) {
|
|
667
|
+
this.logger.debug(`Timeout error in ${subProtocol}: ${e.message}`, logTags);
|
|
668
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
// Catch all error
|
|
672
|
+
this.logger.error(`Unexpected error in ReqResp protocol`, e, logTags);
|
|
673
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
674
|
+
}
|
|
675
|
+
}
|