@aztec/p2p 0.0.1-commit.b655e406 → 0.0.1-commit.b8a057fa
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -3
- package/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +26 -10
- package/dest/client/factory.d.ts +13 -12
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +70 -21
- package/dest/client/index.d.ts +1 -1
- package/dest/client/interface.d.ts +104 -39
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +76 -92
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +685 -344
- package/dest/config.d.ts +175 -87
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +180 -59
- package/dest/enr/generate-enr.d.ts +1 -1
- package/dest/enr/index.d.ts +1 -1
- package/dest/errors/attestation-pool.error.d.ts +7 -0
- package/dest/errors/attestation-pool.error.d.ts.map +1 -0
- package/dest/errors/attestation-pool.error.js +12 -0
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +9 -16
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +10 -17
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +156 -57
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +518 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +694 -294
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -10
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +19 -13
- package/dest/mem_pools/index.d.ts +3 -3
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/index.js +1 -1
- package/dest/mem_pools/instrumentation.d.ts +16 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +58 -10
- package/dest/mem_pools/interface.d.ts +6 -7
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +39 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +97 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +243 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +11 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +122 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +368 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +68 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +178 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +91 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1013 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +15 -7
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +82 -26
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +24 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +75 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/index.js +1 -0
- package/dest/msg_validators/index.d.ts +2 -2
- package/dest/msg_validators/index.d.ts.map +1 -1
- package/dest/msg_validators/index.js +1 -1
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +1 -1
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +16 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +16 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +26 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +40 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +186 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +4 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +40 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
- package/dest/msg_validators/tx_validator/factory.d.ts +138 -6
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +268 -58
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +105 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +146 -67
- package/dest/msg_validators/tx_validator/index.d.ts +6 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +5 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +6 -6
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +24 -3
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +78 -28
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +23 -5
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +4 -2
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +14 -10
- package/dest/services/discv5/discV5_service.d.ts +13 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +120 -24
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +40 -16
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +61 -14
- package/dest/services/encoding.d.ts +24 -7
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +48 -30
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +167 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +336 -0
- package/dest/services/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/instrumentation.d.ts +5 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +49 -70
- package/dest/services/libp2p/libp2p_service.d.ts +127 -110
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +1385 -447
- package/dest/services/peer-manager/interface.d.ts +1 -1
- package/dest/services/peer-manager/metrics.d.ts +11 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +45 -16
- package/dest/services/peer-manager/peer_manager.d.ts +21 -35
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +89 -38
- package/dest/services/peer-manager/peer_scoring.d.ts +39 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +168 -15
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
- package/dest/services/reqresp/config.d.ts +15 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +11 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- package/dest/services/reqresp/index.d.ts +1 -1
- package/dest/services/reqresp/interface.d.ts +27 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +23 -19
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +16 -21
- package/dest/services/reqresp/protocols/auth.d.ts +2 -2
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/auth.js +2 -2
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +8 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +15 -2
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +35 -14
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +37 -11
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +85 -21
- package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/ping.d.ts +1 -1
- package/dest/services/reqresp/protocols/status.d.ts +6 -5
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +7 -3
- package/dest/services/reqresp/protocols/tx.d.ts +8 -3
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +21 -3
- package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -5
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
- package/dest/services/reqresp/reqresp.d.ts +12 -69
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +480 -200
- package/dest/services/reqresp/status.d.ts +2 -2
- package/dest/services/reqresp/status.d.ts.map +1 -1
- package/dest/services/service.d.ts +78 -13
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +11 -11
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +28 -27
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +100 -0
- package/dest/services/tx_collection/index.d.ts +3 -2
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -0
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +9 -13
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/tx_collection.d.ts +51 -57
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +298 -70
- package/dest/services/tx_collection/tx_collection_sink.d.ts +20 -10
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +28 -31
- package/dest/services/tx_collection/tx_source.d.ts +13 -7
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +29 -7
- package/dest/services/tx_file_store/config.d.ts +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +142 -0
- package/dest/services/tx_provider.d.ts +9 -5
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +23 -10
- package/dest/services/tx_provider_instrumentation.d.ts +5 -2
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +14 -14
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts.map +1 -1
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/make-enrs.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -3
- package/dest/test-helpers/mock-pubsub.d.ts +48 -8
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +115 -14
- package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
- package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
- package/dest/test-helpers/mock-tx-helpers.js +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +19 -20
- package/dest/test-helpers/test_tx_provider.d.ts +42 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +44 -0
- package/dest/test-helpers/testbench-utils.d.ts +164 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +400 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +289 -128
- package/dest/testbench/parse_log_file.d.ts +1 -1
- package/dest/testbench/testbench.d.ts +1 -1
- package/dest/testbench/worker_client_manager.d.ts +57 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +277 -44
- package/dest/types/index.d.ts +1 -1
- package/dest/util.d.ts +14 -8
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +41 -11
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +21 -20
- package/src/bootstrap/bootstrap.ts +24 -7
- package/src/client/factory.ts +141 -46
- package/src/client/interface.ts +114 -47
- package/src/client/p2p_client.ts +356 -424
- package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
- package/src/config.ts +316 -67
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +13 -19
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +598 -56
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +796 -316
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +29 -17
- package/src/mem_pools/index.ts +2 -2
- package/src/mem_pools/instrumentation.ts +58 -10
- package/src/mem_pools/interface.ts +5 -7
- package/src/mem_pools/tx_pool_v2/README.md +283 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +112 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +274 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +465 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +252 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1215 -0
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +78 -33
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +102 -0
- package/src/msg_validators/attestation_validator/index.ts +1 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +32 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +49 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +198 -0
- package/src/msg_validators/tx_validator/README.md +129 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +2 -2
- package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +62 -7
- package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
- package/src/msg_validators/tx_validator/factory.ts +433 -58
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +206 -76
- package/src/msg_validators/tx_validator/index.ts +5 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +31 -12
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +90 -31
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/test_utils.ts +1 -1
- package/src/msg_validators/tx_validator/timestamp_validator.ts +30 -19
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +10 -3
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +14 -19
- package/src/services/discv5/discV5_service.ts +127 -15
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +82 -38
- package/src/services/encoding.ts +46 -29
- package/src/services/gossipsub/README.md +663 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +478 -0
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +54 -72
- package/src/services/libp2p/libp2p_service.ts +1152 -497
- package/src/services/peer-manager/metrics.ts +51 -16
- package/src/services/peer-manager/peer_manager.ts +98 -29
- package/src/services/peer-manager/peer_scoring.ts +170 -9
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +344 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +660 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
- package/src/services/reqresp/config.ts +19 -2
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/interface.ts +48 -46
- package/src/services/reqresp/metrics.ts +35 -27
- package/src/services/reqresp/protocols/auth.ts +2 -2
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +19 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +44 -17
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +109 -17
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/status.ts +16 -12
- package/src/services/reqresp/protocols/tx.ts +24 -5
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
- package/src/services/reqresp/reqresp.ts +107 -223
- package/src/services/service.ts +102 -31
- package/src/services/tx_collection/config.ts +42 -37
- package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
- package/src/services/tx_collection/file_store_tx_source.ts +129 -0
- package/src/services/tx_collection/index.ts +2 -1
- package/src/services/tx_collection/instrumentation.ts +5 -13
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +368 -115
- package/src/services/tx_collection/tx_collection_sink.ts +32 -36
- package/src/services/tx_collection/tx_source.ts +29 -8
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +163 -0
- package/src/services/tx_provider.ts +34 -12
- package/src/services/tx_provider_instrumentation.ts +24 -14
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/make-test-p2p-clients.ts +7 -6
- package/src/test-helpers/mock-pubsub.ts +138 -15
- package/src/test-helpers/mock-tx-helpers.ts +1 -1
- package/src/test-helpers/reqresp-nodes.ts +18 -30
- package/src/test-helpers/test_tx_provider.ts +69 -0
- package/src/test-helpers/testbench-utils.ts +465 -0
- package/src/testbench/p2p_client_testbench_worker.ts +406 -127
- package/src/testbench/worker_client_manager.ts +355 -46
- package/src/util.ts +47 -16
- package/src/versioning.ts +3 -33
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -30
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -190
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -25
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -197
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -150
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -617
- package/dest/mem_pools/tx_pool/index.d.ts +0 -4
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -3
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -238
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -8
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -10
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -122
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -394
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -70
- package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/index.js +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -92
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -31
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -56
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -300
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -54
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -176
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -256
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -253
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -750
- package/src/mem_pools/tx_pool/index.ts +0 -3
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -283
- package/src/mem_pools/tx_pool/priority.ts +0 -13
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -135
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -313
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -81
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -100
- package/src/services/reqresp/protocols/block.ts +0 -36
- package/src/services/tx_collection/fast_tx_collection.ts +0 -340
- package/src/services/tx_collection/slow_tx_collection.ts +0 -232
|
@@ -1,31 +1,403 @@
|
|
|
1
1
|
// @attribution: lodestar impl for inspiration
|
|
2
|
-
function
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
function applyDecs2203RFactory() {
|
|
3
|
+
function createAddInitializerMethod(initializers, decoratorFinishedRef) {
|
|
4
|
+
return function addInitializer(initializer) {
|
|
5
|
+
assertNotFinished(decoratorFinishedRef, "addInitializer");
|
|
6
|
+
assertCallable(initializer, "An initializer");
|
|
7
|
+
initializers.push(initializer);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
|
|
11
|
+
var kindStr;
|
|
12
|
+
switch(kind){
|
|
13
|
+
case 1:
|
|
14
|
+
kindStr = "accessor";
|
|
15
|
+
break;
|
|
16
|
+
case 2:
|
|
17
|
+
kindStr = "method";
|
|
18
|
+
break;
|
|
19
|
+
case 3:
|
|
20
|
+
kindStr = "getter";
|
|
21
|
+
break;
|
|
22
|
+
case 4:
|
|
23
|
+
kindStr = "setter";
|
|
24
|
+
break;
|
|
25
|
+
default:
|
|
26
|
+
kindStr = "field";
|
|
27
|
+
}
|
|
28
|
+
var ctx = {
|
|
29
|
+
kind: kindStr,
|
|
30
|
+
name: isPrivate ? "#" + name : name,
|
|
31
|
+
static: isStatic,
|
|
32
|
+
private: isPrivate,
|
|
33
|
+
metadata: metadata
|
|
34
|
+
};
|
|
35
|
+
var decoratorFinishedRef = {
|
|
36
|
+
v: false
|
|
37
|
+
};
|
|
38
|
+
ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
|
|
39
|
+
var get, set;
|
|
40
|
+
if (kind === 0) {
|
|
41
|
+
if (isPrivate) {
|
|
42
|
+
get = desc.get;
|
|
43
|
+
set = desc.set;
|
|
44
|
+
} else {
|
|
45
|
+
get = function() {
|
|
46
|
+
return this[name];
|
|
47
|
+
};
|
|
48
|
+
set = function(v) {
|
|
49
|
+
this[name] = v;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
} else if (kind === 2) {
|
|
53
|
+
get = function() {
|
|
54
|
+
return desc.value;
|
|
55
|
+
};
|
|
56
|
+
} else {
|
|
57
|
+
if (kind === 1 || kind === 3) {
|
|
58
|
+
get = function() {
|
|
59
|
+
return desc.get.call(this);
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (kind === 1 || kind === 4) {
|
|
63
|
+
set = function(v) {
|
|
64
|
+
desc.set.call(this, v);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
ctx.access = get && set ? {
|
|
69
|
+
get: get,
|
|
70
|
+
set: set
|
|
71
|
+
} : get ? {
|
|
72
|
+
get: get
|
|
73
|
+
} : {
|
|
74
|
+
set: set
|
|
75
|
+
};
|
|
76
|
+
try {
|
|
77
|
+
return dec(value, ctx);
|
|
78
|
+
} finally{
|
|
79
|
+
decoratorFinishedRef.v = true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function assertNotFinished(decoratorFinishedRef, fnName) {
|
|
83
|
+
if (decoratorFinishedRef.v) {
|
|
84
|
+
throw new Error("attempted to call " + fnName + " after decoration was finished");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function assertCallable(fn, hint) {
|
|
88
|
+
if (typeof fn !== "function") {
|
|
89
|
+
throw new TypeError(hint + " must be a function");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function assertValidReturnValue(kind, value) {
|
|
93
|
+
var type = typeof value;
|
|
94
|
+
if (kind === 1) {
|
|
95
|
+
if (type !== "object" || value === null) {
|
|
96
|
+
throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
|
|
97
|
+
}
|
|
98
|
+
if (value.get !== undefined) {
|
|
99
|
+
assertCallable(value.get, "accessor.get");
|
|
100
|
+
}
|
|
101
|
+
if (value.set !== undefined) {
|
|
102
|
+
assertCallable(value.set, "accessor.set");
|
|
103
|
+
}
|
|
104
|
+
if (value.init !== undefined) {
|
|
105
|
+
assertCallable(value.init, "accessor.init");
|
|
106
|
+
}
|
|
107
|
+
} else if (type !== "function") {
|
|
108
|
+
var hint;
|
|
109
|
+
if (kind === 0) {
|
|
110
|
+
hint = "field";
|
|
111
|
+
} else if (kind === 10) {
|
|
112
|
+
hint = "class";
|
|
113
|
+
} else {
|
|
114
|
+
hint = "method";
|
|
115
|
+
}
|
|
116
|
+
throw new TypeError(hint + " decorators must return a function or void 0");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
|
|
120
|
+
var decs = decInfo[0];
|
|
121
|
+
var desc, init, value;
|
|
122
|
+
if (isPrivate) {
|
|
123
|
+
if (kind === 0 || kind === 1) {
|
|
124
|
+
desc = {
|
|
125
|
+
get: decInfo[3],
|
|
126
|
+
set: decInfo[4]
|
|
127
|
+
};
|
|
128
|
+
} else if (kind === 3) {
|
|
129
|
+
desc = {
|
|
130
|
+
get: decInfo[3]
|
|
131
|
+
};
|
|
132
|
+
} else if (kind === 4) {
|
|
133
|
+
desc = {
|
|
134
|
+
set: decInfo[3]
|
|
135
|
+
};
|
|
136
|
+
} else {
|
|
137
|
+
desc = {
|
|
138
|
+
value: decInfo[3]
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
} else if (kind !== 0) {
|
|
142
|
+
desc = Object.getOwnPropertyDescriptor(base, name);
|
|
143
|
+
}
|
|
144
|
+
if (kind === 1) {
|
|
145
|
+
value = {
|
|
146
|
+
get: desc.get,
|
|
147
|
+
set: desc.set
|
|
148
|
+
};
|
|
149
|
+
} else if (kind === 2) {
|
|
150
|
+
value = desc.value;
|
|
151
|
+
} else if (kind === 3) {
|
|
152
|
+
value = desc.get;
|
|
153
|
+
} else if (kind === 4) {
|
|
154
|
+
value = desc.set;
|
|
155
|
+
}
|
|
156
|
+
var newValue, get, set;
|
|
157
|
+
if (typeof decs === "function") {
|
|
158
|
+
newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
|
|
159
|
+
if (newValue !== void 0) {
|
|
160
|
+
assertValidReturnValue(kind, newValue);
|
|
161
|
+
if (kind === 0) {
|
|
162
|
+
init = newValue;
|
|
163
|
+
} else if (kind === 1) {
|
|
164
|
+
init = newValue.init;
|
|
165
|
+
get = newValue.get || value.get;
|
|
166
|
+
set = newValue.set || value.set;
|
|
167
|
+
value = {
|
|
168
|
+
get: get,
|
|
169
|
+
set: set
|
|
170
|
+
};
|
|
171
|
+
} else {
|
|
172
|
+
value = newValue;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
} else {
|
|
176
|
+
for(var i = decs.length - 1; i >= 0; i--){
|
|
177
|
+
var dec = decs[i];
|
|
178
|
+
newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
|
|
179
|
+
if (newValue !== void 0) {
|
|
180
|
+
assertValidReturnValue(kind, newValue);
|
|
181
|
+
var newInit;
|
|
182
|
+
if (kind === 0) {
|
|
183
|
+
newInit = newValue;
|
|
184
|
+
} else if (kind === 1) {
|
|
185
|
+
newInit = newValue.init;
|
|
186
|
+
get = newValue.get || value.get;
|
|
187
|
+
set = newValue.set || value.set;
|
|
188
|
+
value = {
|
|
189
|
+
get: get,
|
|
190
|
+
set: set
|
|
191
|
+
};
|
|
192
|
+
} else {
|
|
193
|
+
value = newValue;
|
|
194
|
+
}
|
|
195
|
+
if (newInit !== void 0) {
|
|
196
|
+
if (init === void 0) {
|
|
197
|
+
init = newInit;
|
|
198
|
+
} else if (typeof init === "function") {
|
|
199
|
+
init = [
|
|
200
|
+
init,
|
|
201
|
+
newInit
|
|
202
|
+
];
|
|
203
|
+
} else {
|
|
204
|
+
init.push(newInit);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (kind === 0 || kind === 1) {
|
|
211
|
+
if (init === void 0) {
|
|
212
|
+
init = function(instance, init) {
|
|
213
|
+
return init;
|
|
214
|
+
};
|
|
215
|
+
} else if (typeof init !== "function") {
|
|
216
|
+
var ownInitializers = init;
|
|
217
|
+
init = function(instance, init) {
|
|
218
|
+
var value = init;
|
|
219
|
+
for(var i = 0; i < ownInitializers.length; i++){
|
|
220
|
+
value = ownInitializers[i].call(instance, value);
|
|
221
|
+
}
|
|
222
|
+
return value;
|
|
223
|
+
};
|
|
224
|
+
} else {
|
|
225
|
+
var originalInitializer = init;
|
|
226
|
+
init = function(instance, init) {
|
|
227
|
+
return originalInitializer.call(instance, init);
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
ret.push(init);
|
|
231
|
+
}
|
|
232
|
+
if (kind !== 0) {
|
|
233
|
+
if (kind === 1) {
|
|
234
|
+
desc.get = value.get;
|
|
235
|
+
desc.set = value.set;
|
|
236
|
+
} else if (kind === 2) {
|
|
237
|
+
desc.value = value;
|
|
238
|
+
} else if (kind === 3) {
|
|
239
|
+
desc.get = value;
|
|
240
|
+
} else if (kind === 4) {
|
|
241
|
+
desc.set = value;
|
|
242
|
+
}
|
|
243
|
+
if (isPrivate) {
|
|
244
|
+
if (kind === 1) {
|
|
245
|
+
ret.push(function(instance, args) {
|
|
246
|
+
return value.get.call(instance, args);
|
|
247
|
+
});
|
|
248
|
+
ret.push(function(instance, args) {
|
|
249
|
+
return value.set.call(instance, args);
|
|
250
|
+
});
|
|
251
|
+
} else if (kind === 2) {
|
|
252
|
+
ret.push(value);
|
|
253
|
+
} else {
|
|
254
|
+
ret.push(function(instance, args) {
|
|
255
|
+
return value.call(instance, args);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
} else {
|
|
259
|
+
Object.defineProperty(base, name, desc);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function applyMemberDecs(Class, decInfos, metadata) {
|
|
264
|
+
var ret = [];
|
|
265
|
+
var protoInitializers;
|
|
266
|
+
var staticInitializers;
|
|
267
|
+
var existingProtoNonFields = new Map();
|
|
268
|
+
var existingStaticNonFields = new Map();
|
|
269
|
+
for(var i = 0; i < decInfos.length; i++){
|
|
270
|
+
var decInfo = decInfos[i];
|
|
271
|
+
if (!Array.isArray(decInfo)) continue;
|
|
272
|
+
var kind = decInfo[1];
|
|
273
|
+
var name = decInfo[2];
|
|
274
|
+
var isPrivate = decInfo.length > 3;
|
|
275
|
+
var isStatic = kind >= 5;
|
|
276
|
+
var base;
|
|
277
|
+
var initializers;
|
|
278
|
+
if (isStatic) {
|
|
279
|
+
base = Class;
|
|
280
|
+
kind = kind - 5;
|
|
281
|
+
staticInitializers = staticInitializers || [];
|
|
282
|
+
initializers = staticInitializers;
|
|
283
|
+
} else {
|
|
284
|
+
base = Class.prototype;
|
|
285
|
+
protoInitializers = protoInitializers || [];
|
|
286
|
+
initializers = protoInitializers;
|
|
287
|
+
}
|
|
288
|
+
if (kind !== 0 && !isPrivate) {
|
|
289
|
+
var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
|
|
290
|
+
var existingKind = existingNonFields.get(name) || 0;
|
|
291
|
+
if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) {
|
|
292
|
+
throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
|
|
293
|
+
} else if (!existingKind && kind > 2) {
|
|
294
|
+
existingNonFields.set(name, kind);
|
|
295
|
+
} else {
|
|
296
|
+
existingNonFields.set(name, true);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
|
|
300
|
+
}
|
|
301
|
+
pushInitializers(ret, protoInitializers);
|
|
302
|
+
pushInitializers(ret, staticInitializers);
|
|
303
|
+
return ret;
|
|
304
|
+
}
|
|
305
|
+
function pushInitializers(ret, initializers) {
|
|
306
|
+
if (initializers) {
|
|
307
|
+
ret.push(function(instance) {
|
|
308
|
+
for(var i = 0; i < initializers.length; i++){
|
|
309
|
+
initializers[i].call(instance);
|
|
310
|
+
}
|
|
311
|
+
return instance;
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
function applyClassDecs(targetClass, classDecs, metadata) {
|
|
316
|
+
if (classDecs.length > 0) {
|
|
317
|
+
var initializers = [];
|
|
318
|
+
var newClass = targetClass;
|
|
319
|
+
var name = targetClass.name;
|
|
320
|
+
for(var i = classDecs.length - 1; i >= 0; i--){
|
|
321
|
+
var decoratorFinishedRef = {
|
|
322
|
+
v: false
|
|
323
|
+
};
|
|
324
|
+
try {
|
|
325
|
+
var nextNewClass = classDecs[i](newClass, {
|
|
326
|
+
kind: "class",
|
|
327
|
+
name: name,
|
|
328
|
+
addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
|
|
329
|
+
metadata
|
|
330
|
+
});
|
|
331
|
+
} finally{
|
|
332
|
+
decoratorFinishedRef.v = true;
|
|
333
|
+
}
|
|
334
|
+
if (nextNewClass !== undefined) {
|
|
335
|
+
assertValidReturnValue(10, nextNewClass);
|
|
336
|
+
newClass = nextNewClass;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return [
|
|
340
|
+
defineMetadata(newClass, metadata),
|
|
341
|
+
function() {
|
|
342
|
+
for(var i = 0; i < initializers.length; i++){
|
|
343
|
+
initializers[i].call(newClass);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
];
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
function defineMetadata(Class, metadata) {
|
|
350
|
+
return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
|
|
351
|
+
configurable: true,
|
|
352
|
+
enumerable: true,
|
|
353
|
+
value: metadata
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
|
|
357
|
+
if (parentClass !== void 0) {
|
|
358
|
+
var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
|
|
359
|
+
}
|
|
360
|
+
var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
|
|
361
|
+
var e = applyMemberDecs(targetClass, memberDecs, metadata);
|
|
362
|
+
if (!classDecs.length) defineMetadata(targetClass, metadata);
|
|
363
|
+
return {
|
|
364
|
+
e: e,
|
|
365
|
+
get c () {
|
|
366
|
+
return applyClassDecs(targetClass, classDecs, metadata);
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
};
|
|
7
370
|
}
|
|
8
|
-
|
|
371
|
+
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
372
|
+
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
373
|
+
}
|
|
374
|
+
var _dec, _dec1, _initProto;
|
|
9
375
|
import { AbortError, TimeoutError } from '@aztec/foundation/error';
|
|
10
376
|
import { createLogger } from '@aztec/foundation/log';
|
|
11
377
|
import { executeTimeout } from '@aztec/foundation/timer';
|
|
12
378
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
13
379
|
import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
14
380
|
import { pipeline } from 'node:stream/promises';
|
|
15
|
-
import {
|
|
16
|
-
import { SnappyTransform } from '../encoding.js';
|
|
17
|
-
import { DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS, DEFAULT_REQRESP_DIAL_TIMEOUT_MS } from './config.js';
|
|
18
|
-
import { BatchConnectionSampler } from './connection-sampler/batch_connection_sampler.js';
|
|
381
|
+
import { IndividualReqRespTimeoutError, OversizedReqRespRequestError } from '../../errors/reqresp.error.js';
|
|
382
|
+
import { DEFAULT_MAX_RESPONSE_SIZE_KB, OversizedSnappyResponseError, ResponseSizeLimitExceededError, SnappyTransform } from '../encoding.js';
|
|
383
|
+
import { DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS, DEFAULT_REQRESP_DIAL_TIMEOUT_MS, MAX_REQRESP_REQUEST_SIZE_BYTES } from './config.js';
|
|
19
384
|
import { ConnectionSampler, RandomSampler } from './connection-sampler/connection_sampler.js';
|
|
20
|
-
import {
|
|
385
|
+
import { ReqRespSubProtocol, UNAUTHENTICATED_ALLOWED_PROTOCOLS, subProtocolSizeCalculators } from './interface.js';
|
|
21
386
|
import { ReqRespMetrics } from './metrics.js';
|
|
22
387
|
import { RateLimitStatus, RequestResponseRateLimiter, prettyPrintRateLimitStatus } from './rate-limiter/rate_limiter.js';
|
|
23
|
-
import { ReqRespStatus, ReqRespStatusError, parseStatusChunk
|
|
388
|
+
import { ReqRespStatus, ReqRespStatusError, parseStatusChunk } from './status.js';
|
|
389
|
+
_dec = trackSpan('ReqResp.sendRequestToPeer', (peerId, subProtocol, _)=>({
|
|
390
|
+
[Attributes.P2P_ID]: peerId.toString(),
|
|
391
|
+
[Attributes.P2P_REQ_RESP_PROTOCOL]: subProtocol
|
|
392
|
+
})), _dec1 = trackSpan('ReqResp.streamHandler', (protocol, { connection })=>({
|
|
393
|
+
[Attributes.P2P_REQ_RESP_PROTOCOL]: protocol,
|
|
394
|
+
[Attributes.P2P_ID]: connection.remotePeer.toString()
|
|
395
|
+
}));
|
|
24
396
|
/**
|
|
25
397
|
* The Request Response Service
|
|
26
398
|
*
|
|
27
399
|
* It allows nodes to request specific information from their peers, its use case covers recovering
|
|
28
|
-
* information that was missed during a
|
|
400
|
+
* information that was missed during a synchronisation or a gossip event.
|
|
29
401
|
*
|
|
30
402
|
* This service implements the request response sub protocol, it is heavily inspired from
|
|
31
403
|
* ethereum implementations of the same name.
|
|
@@ -38,22 +410,35 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
38
410
|
libp2p;
|
|
39
411
|
peerScoring;
|
|
40
412
|
logger;
|
|
413
|
+
static{
|
|
414
|
+
({ e: [_initProto] } = _apply_decs_2203_r(this, [
|
|
415
|
+
[
|
|
416
|
+
_dec,
|
|
417
|
+
2,
|
|
418
|
+
"sendRequestToPeer"
|
|
419
|
+
],
|
|
420
|
+
[
|
|
421
|
+
_dec1,
|
|
422
|
+
2,
|
|
423
|
+
"streamHandler"
|
|
424
|
+
]
|
|
425
|
+
], []));
|
|
426
|
+
}
|
|
41
427
|
individualRequestTimeoutMs;
|
|
42
428
|
dialTimeoutMs;
|
|
43
429
|
subProtocolHandlers;
|
|
44
|
-
subProtocolValidators;
|
|
45
430
|
connectionSampler;
|
|
46
431
|
rateLimiter;
|
|
47
432
|
snappyTransform;
|
|
433
|
+
shouldRejectPeer;
|
|
48
434
|
metrics;
|
|
49
435
|
constructor(config, libp2p, peerScoring, logger = createLogger('p2p:reqresp'), rateLimits = {}, telemetryClient = getTelemetryClient()){
|
|
50
436
|
this.libp2p = libp2p;
|
|
51
437
|
this.peerScoring = peerScoring;
|
|
52
438
|
this.logger = logger;
|
|
53
|
-
this.individualRequestTimeoutMs = DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS;
|
|
439
|
+
this.individualRequestTimeoutMs = (_initProto(this), DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS);
|
|
54
440
|
this.dialTimeoutMs = DEFAULT_REQRESP_DIAL_TIMEOUT_MS;
|
|
55
441
|
this.subProtocolHandlers = {};
|
|
56
|
-
this.subProtocolValidators = {};
|
|
57
442
|
this.updateConfig(config);
|
|
58
443
|
this.rateLimiter = new RequestResponseRateLimiter(peerScoring, rateLimits);
|
|
59
444
|
// Connection sampler is used to sample our connected peers
|
|
@@ -69,24 +454,31 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
69
454
|
this.dialTimeoutMs = config.dialTimeoutMs;
|
|
70
455
|
}
|
|
71
456
|
}
|
|
457
|
+
setShouldRejectPeer(checker) {
|
|
458
|
+
this.shouldRejectPeer = checker;
|
|
459
|
+
}
|
|
72
460
|
get tracer() {
|
|
73
461
|
return this.metrics.tracer;
|
|
74
462
|
}
|
|
75
463
|
/**
|
|
464
|
+
* Get the connection sampler instance
|
|
465
|
+
*/ getConnectionSampler() {
|
|
466
|
+
return this.connectionSampler;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
76
469
|
* Start the reqresp service
|
|
77
|
-
*/ async start(subProtocolHandlers
|
|
470
|
+
*/ async start(subProtocolHandlers) {
|
|
78
471
|
Object.assign(this.subProtocolHandlers, subProtocolHandlers);
|
|
79
|
-
|
|
80
|
-
//
|
|
472
|
+
// Register streamHandler with libp2p.
|
|
473
|
+
// The streamHandler is responsible for reading the incoming stream, determining the protocol, then triggering the appropriate handler.
|
|
81
474
|
for (const subProtocol of Object.keys(subProtocolHandlers)){
|
|
82
475
|
this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
|
|
83
476
|
await this.libp2p.handle(subProtocol, (data)=>void this.streamHandler(subProtocol, data).catch((err)=>this.logger.error(`Error on libp2p subprotocol ${subProtocol} handler`, err)));
|
|
84
477
|
}
|
|
85
478
|
this.rateLimiter.start();
|
|
86
479
|
}
|
|
87
|
-
async addSubProtocol(subProtocol, handler
|
|
480
|
+
async addSubProtocol(subProtocol, handler) {
|
|
88
481
|
this.subProtocolHandlers[subProtocol] = handler;
|
|
89
|
-
this.subProtocolValidators[subProtocol] = validator;
|
|
90
482
|
this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
|
|
91
483
|
await this.libp2p.handle(subProtocol, (data)=>void this.streamHandler(subProtocol, data).catch((err)=>this.logger.error(`Error on libp2p subprotocol ${subProtocol} handler`, err)));
|
|
92
484
|
}
|
|
@@ -108,149 +500,6 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
108
500
|
// NOTE: We assume libp2p instance is managed by the caller
|
|
109
501
|
}
|
|
110
502
|
/**
|
|
111
|
-
* Request multiple messages over the same sub protocol, balancing the requests across peers.
|
|
112
|
-
*
|
|
113
|
-
* @devnote
|
|
114
|
-
* - The function prioritizes sending requests to free peers using a batch sampling strategy.
|
|
115
|
-
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
116
|
-
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
117
|
-
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
118
|
-
*
|
|
119
|
-
* Requests are sent in parallel to each peer, but multiple requests are sent to the same peer in series
|
|
120
|
-
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
121
|
-
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
122
|
-
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
123
|
-
*
|
|
124
|
-
* @param subProtocol
|
|
125
|
-
* @param requests
|
|
126
|
-
* @param timeoutMs
|
|
127
|
-
* @param maxPeers
|
|
128
|
-
* @returns
|
|
129
|
-
*
|
|
130
|
-
* @throws {CollectiveReqRespTimeoutError} - If the request batch exceeds the specified timeout (`timeoutMs`).
|
|
131
|
-
*/ async sendBatchRequest(subProtocol, requests, pinnedPeer, timeoutMs = 10000, maxPeers = Math.max(10, Math.ceil(requests.length / 3)), maxRetryAttempts = 3) {
|
|
132
|
-
const responseValidator = this.subProtocolValidators[subProtocol] ?? DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol];
|
|
133
|
-
const responses = new Array(requests.length);
|
|
134
|
-
const requestBuffers = requests.map((req)=>req.toBuffer());
|
|
135
|
-
const requestFunction = async (signal)=>{
|
|
136
|
-
// Track which requests still need to be processed
|
|
137
|
-
const pendingRequestIndices = new Set(requestBuffers.map((_, i)=>i));
|
|
138
|
-
// Create batch sampler with the total number of requests and max peers
|
|
139
|
-
const batchSampler = new BatchConnectionSampler(this.connectionSampler, requests.length, maxPeers, compactArray([
|
|
140
|
-
pinnedPeer
|
|
141
|
-
]), createLogger(`${this.logger.module}:batch-connection-sampler`));
|
|
142
|
-
if (batchSampler.activePeerCount === 0 && !pinnedPeer) {
|
|
143
|
-
this.logger.warn('No active peers to send requests to');
|
|
144
|
-
return [];
|
|
145
|
-
}
|
|
146
|
-
// This is where it gets fun
|
|
147
|
-
// The outer loop is the retry loop, we will continue to retry until we process all indices we have
|
|
148
|
-
// not received a response for, or we have reached the max retry attempts
|
|
149
|
-
// The inner loop is the batch loop, we will process all requests for each peer in parallel
|
|
150
|
-
// We will then process the results of the requests, and resample any peers that failed to respond
|
|
151
|
-
// We will continue to retry until we have processed all indices, or we have reached the max retry attempts
|
|
152
|
-
let retryAttempts = 0;
|
|
153
|
-
while(pendingRequestIndices.size > 0 && batchSampler.activePeerCount > 0 && retryAttempts < maxRetryAttempts){
|
|
154
|
-
if (signal.aborted) {
|
|
155
|
-
throw new AbortError('Batch request aborted');
|
|
156
|
-
}
|
|
157
|
-
const requestBatches = new Map();
|
|
158
|
-
// Group requests by peer
|
|
159
|
-
for (const requestIndex of pendingRequestIndices){
|
|
160
|
-
const peer = batchSampler.getPeerForRequest(requestIndex);
|
|
161
|
-
if (!peer) {
|
|
162
|
-
break;
|
|
163
|
-
}
|
|
164
|
-
const peerAsString = peer.toString();
|
|
165
|
-
if (!requestBatches.has(peerAsString)) {
|
|
166
|
-
requestBatches.set(peerAsString, {
|
|
167
|
-
peerId: peer,
|
|
168
|
-
indices: []
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
requestBatches.get(peerAsString).indices.push(requestIndex);
|
|
172
|
-
}
|
|
173
|
-
// If there is a pinned peer, we will always send every request to that peer
|
|
174
|
-
// We use the default limits for the subprotocol to avoid hitting the rate limiter
|
|
175
|
-
if (pinnedPeer) {
|
|
176
|
-
const limit = this.rateLimiter.getRateLimits(subProtocol).peerLimit.quotaCount;
|
|
177
|
-
requestBatches.set(pinnedPeer.toString(), {
|
|
178
|
-
peerId: pinnedPeer,
|
|
179
|
-
indices: Array.from(pendingRequestIndices.values()).slice(0, limit)
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
// Make parallel requests for each peer's batch
|
|
183
|
-
// A batch entry will look something like this:
|
|
184
|
-
// PeerId0: [0, 1, 2, 3]
|
|
185
|
-
// PeerId1: [4, 5, 6, 7]
|
|
186
|
-
// Peer Id 0 will send requests 0, 1, 2, 3 in serial
|
|
187
|
-
// while simultaneously Peer Id 1 will send requests 4, 5, 6, 7 in serial
|
|
188
|
-
const batchResults = await Promise.all(Array.from(requestBatches.entries()).map(async ([peerAsString, { peerId: peer, indices }])=>{
|
|
189
|
-
try {
|
|
190
|
-
// Requests all going to the same peer are sent synchronously
|
|
191
|
-
const peerResults = [];
|
|
192
|
-
for (const index of indices){
|
|
193
|
-
this.logger.trace(`Sending request ${index} to peer ${peerAsString}`);
|
|
194
|
-
const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffers[index]);
|
|
195
|
-
// Check the status of the response buffer
|
|
196
|
-
if (response.status !== ReqRespStatus.SUCCESS) {
|
|
197
|
-
this.logger.debug(`Request to peer ${peerAsString} failed with status ${prettyPrintReqRespStatus(response.status)}`);
|
|
198
|
-
// If we hit a rate limit or some failure, we remove the peer and return the results,
|
|
199
|
-
// they will be split among remaining peers and the new sampled peer
|
|
200
|
-
batchSampler.removePeerAndReplace(peer);
|
|
201
|
-
return {
|
|
202
|
-
peer,
|
|
203
|
-
results: peerResults
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
if (response && response.data.length > 0) {
|
|
207
|
-
const object = responseFromBuffer(subProtocol, response.data);
|
|
208
|
-
const isValid = await responseValidator(requests[index], object, peer);
|
|
209
|
-
if (isValid) {
|
|
210
|
-
peerResults.push({
|
|
211
|
-
index,
|
|
212
|
-
response: object
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
return {
|
|
218
|
-
peer,
|
|
219
|
-
results: peerResults
|
|
220
|
-
};
|
|
221
|
-
} catch (error) {
|
|
222
|
-
this.logger.debug(`Failed batch request to peer ${peerAsString}:`, error);
|
|
223
|
-
batchSampler.removePeerAndReplace(peer);
|
|
224
|
-
return {
|
|
225
|
-
peer,
|
|
226
|
-
results: []
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
}));
|
|
230
|
-
// Process results
|
|
231
|
-
for (const { results } of batchResults){
|
|
232
|
-
for (const { index, response } of results){
|
|
233
|
-
if (response) {
|
|
234
|
-
responses[index] = response;
|
|
235
|
-
pendingRequestIndices.delete(index);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
retryAttempts++;
|
|
240
|
-
}
|
|
241
|
-
if (retryAttempts >= maxRetryAttempts) {
|
|
242
|
-
this.logger.debug(`Max retry attempts ${maxRetryAttempts} reached for batch request`);
|
|
243
|
-
}
|
|
244
|
-
return responses;
|
|
245
|
-
};
|
|
246
|
-
try {
|
|
247
|
-
return await executeTimeout(requestFunction, timeoutMs, ()=>new CollectiveReqRespTimeoutError());
|
|
248
|
-
} catch (e) {
|
|
249
|
-
this.logger.debug(`${e.message} | subProtocol: ${subProtocol}`);
|
|
250
|
-
return [];
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
503
|
* Sends a request to a specific peer
|
|
255
504
|
*
|
|
256
505
|
* We first dial a particular protocol for the peer, this ensures that the peer knows
|
|
@@ -275,25 +524,34 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
275
524
|
* If the stream is not closed by the dialled peer, and a timeout occurs, then
|
|
276
525
|
* the stream is closed on the requester's end and sender (us) updates its peer score
|
|
277
526
|
*/ async sendRequestToPeer(peerId, subProtocol, payload, dialTimeout = this.dialTimeoutMs) {
|
|
527
|
+
// Thrown before the try block so the generic error handling below does not penalize the peer for our own bug.
|
|
528
|
+
if (payload.length > MAX_REQRESP_REQUEST_SIZE_BYTES) {
|
|
529
|
+
throw new OversizedReqRespRequestError(subProtocol, payload.length, MAX_REQRESP_REQUEST_SIZE_BYTES);
|
|
530
|
+
}
|
|
278
531
|
let stream;
|
|
279
532
|
try {
|
|
280
533
|
this.metrics.recordRequestSent(subProtocol);
|
|
534
|
+
// Calculate expected response size based on the request payload
|
|
535
|
+
const expectedSizeKb = subProtocolSizeCalculators[subProtocol](payload);
|
|
281
536
|
this.logger.trace(`Sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`);
|
|
282
537
|
stream = await this.connectionSampler.dialProtocol(peerId, subProtocol, dialTimeout);
|
|
283
538
|
this.logger.trace(`Opened stream ${stream.id} for sending request to peer ${peerId.toString()} on sub protocol ${subProtocol}`);
|
|
284
539
|
const timeoutErr = new IndividualReqRespTimeoutError();
|
|
540
|
+
// Create a wrapper to pass the expected size to readMessage
|
|
541
|
+
const readMessageWithSizeLimit = (source)=>this.readMessage(source, expectedSizeKb);
|
|
285
542
|
const [_, resp] = await executeTimeout((signal)=>Promise.all([
|
|
286
543
|
pipeline([
|
|
287
544
|
payload
|
|
288
545
|
], stream.sink, {
|
|
289
546
|
signal
|
|
290
547
|
}),
|
|
291
|
-
pipeline(stream.source,
|
|
548
|
+
pipeline(stream.source, readMessageWithSizeLimit, {
|
|
292
549
|
signal
|
|
293
550
|
})
|
|
294
551
|
]), this.individualRequestTimeoutMs, ()=>timeoutErr);
|
|
295
552
|
return resp;
|
|
296
553
|
} catch (e) {
|
|
554
|
+
this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
|
|
297
555
|
// On error we immediately abort the stream, this is preferred way,
|
|
298
556
|
// because it signals to the sender that error happened, whereas
|
|
299
557
|
// closing the stream only closes our side and is much slower
|
|
@@ -341,13 +599,33 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
341
599
|
* The message is split into two components
|
|
342
600
|
* - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
|
|
343
601
|
* - The second chunk should contain the response data
|
|
344
|
-
|
|
602
|
+
*
|
|
603
|
+
* To bound memory usage we abort reception as soon as the accumulated compressed bytes exceed a
|
|
604
|
+
* bound derived from `maxSizeKb`, before the full stream has been buffered. Without this a peer we
|
|
605
|
+
* dialed could stream data up to the request timeout, forcing us to buffer arbitrarily much (the
|
|
606
|
+
* `maxSizeKb` guard in `inboundTransformData` only runs after the whole compressed payload is
|
|
607
|
+
* concatenated, so it does nothing to cap reception memory). Snappy can expand incompressible input
|
|
608
|
+
* to ~1.17x its size, so we allow 2x `maxSizeKb`: comfortably above the worst-case expansion of a
|
|
609
|
+
* legitimate max-size response, while still capping buffered memory at twice the permitted size.
|
|
610
|
+
*
|
|
611
|
+
* @param source - The async iterable source of data chunks
|
|
612
|
+
* @param maxSizeKb - Optional maximum expected size in KB for the decompressed response
|
|
613
|
+
*/ async readMessage(source, maxSizeKb) {
|
|
345
614
|
let status;
|
|
346
615
|
const chunks = [];
|
|
616
|
+
const maxAccumulatedBytes = (maxSizeKb ?? DEFAULT_MAX_RESPONSE_SIZE_KB) * 1024 * 2;
|
|
617
|
+
let accumulatedBytes = 0;
|
|
347
618
|
try {
|
|
348
619
|
for await (const chunk of source){
|
|
349
620
|
const statusParsed = status !== undefined;
|
|
350
621
|
if (statusParsed) {
|
|
622
|
+
// Use `byteLength` (the logical length) rather than `chunk.subarray().length`: calling
|
|
623
|
+
// `subarray()` on a `Uint8ArrayList` consolidates its backing buffers into a single copy,
|
|
624
|
+
// which would materialize the very chunk we are trying to reject.
|
|
625
|
+
accumulatedBytes += chunk.byteLength;
|
|
626
|
+
if (accumulatedBytes > maxAccumulatedBytes) {
|
|
627
|
+
throw new ResponseSizeLimitExceededError(accumulatedBytes, maxAccumulatedBytes);
|
|
628
|
+
}
|
|
351
629
|
chunks.push(chunk.subarray());
|
|
352
630
|
continue;
|
|
353
631
|
}
|
|
@@ -362,20 +640,16 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
362
640
|
}
|
|
363
641
|
}
|
|
364
642
|
const messageData = Buffer.concat(chunks);
|
|
365
|
-
const message = this.snappyTransform.inboundTransformData(messageData);
|
|
643
|
+
const message = this.snappyTransform.inboundTransformData(messageData, undefined, maxSizeKb);
|
|
366
644
|
return {
|
|
367
645
|
status: status ?? ReqRespStatus.UNKNOWN,
|
|
368
646
|
data: message
|
|
369
647
|
};
|
|
370
648
|
} catch (e) {
|
|
649
|
+
// All errors (invalid status bytes, oversized snappy responses, corrupt data, etc.)
|
|
650
|
+
// are re-thrown so the caller can penalize the peer via handleResponseError.
|
|
371
651
|
this.logger.debug(`Reading message failed: ${e.message}`);
|
|
372
|
-
|
|
373
|
-
if (e instanceof ReqRespStatusError) {
|
|
374
|
-
status = e.status;
|
|
375
|
-
}
|
|
376
|
-
return {
|
|
377
|
-
status
|
|
378
|
-
};
|
|
652
|
+
throw e;
|
|
379
653
|
}
|
|
380
654
|
}
|
|
381
655
|
/**
|
|
@@ -403,6 +677,11 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
403
677
|
this.logger.verbose(`Rate limit exceeded ${prettyPrintRateLimitStatus(rateLimitStatus)} for ${protocol} from ${connection.remotePeer}`);
|
|
404
678
|
throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
|
|
405
679
|
}
|
|
680
|
+
// When p2pAllowOnlyValidators is enabled, reject unauthenticated peers on data protocols
|
|
681
|
+
if (!UNAUTHENTICATED_ALLOWED_PROTOCOLS.has(protocol) && (this.shouldRejectPeer?.(connection.remotePeer.toString()) ?? false)) {
|
|
682
|
+
this.logger.debug(`Rejecting unauthenticated peer ${connection.remotePeer} on gated protocol ${protocol}`);
|
|
683
|
+
throw new ReqRespStatusError(ReqRespStatus.FAILURE);
|
|
684
|
+
}
|
|
406
685
|
await this.processStream(protocol, incomingStream);
|
|
407
686
|
} catch (err) {
|
|
408
687
|
this.metrics.recordResponseError(protocol);
|
|
@@ -423,7 +702,8 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
423
702
|
// and that this stream should be dropped
|
|
424
703
|
const isMessageToNotWarn = err instanceof Error && [
|
|
425
704
|
'stream reset',
|
|
426
|
-
'Cannot push value onto an ended pushable'
|
|
705
|
+
'Cannot push value onto an ended pushable',
|
|
706
|
+
'read ECONNRESET'
|
|
427
707
|
].some((msg)=>err.message.includes(msg));
|
|
428
708
|
const level = isMessageToNotWarn ? 'debug' : 'warn';
|
|
429
709
|
this.logger[level]('Unknown stream error while handling the stream, aborting', {
|
|
@@ -452,6 +732,9 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
452
732
|
const snappy = this.snappyTransform;
|
|
453
733
|
const SUCCESS = Uint8Array.of(ReqRespStatus.SUCCESS);
|
|
454
734
|
await pipeline(stream.source, async function*(source) {
|
|
735
|
+
// Req/resp is one-request-one-response: an honest sender writes a single payload and half-closes.
|
|
736
|
+
// Process only the first chunk and return, so extra frames a peer queues on the same stream cannot
|
|
737
|
+
// drive further handler invocations that bypass the per-stream rate-limit check in streamHandler.
|
|
455
738
|
for await (const chunk of source){
|
|
456
739
|
const response = await handler(connection.remotePeer, chunk.subarray());
|
|
457
740
|
if (protocol === ReqRespSubProtocol.GOODBYE) {
|
|
@@ -463,6 +746,7 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
463
746
|
stream.metadata.written = true; // Mark the stream as written to;
|
|
464
747
|
yield SUCCESS;
|
|
465
748
|
yield snappy.outboundTransformData(response);
|
|
749
|
+
return;
|
|
466
750
|
}
|
|
467
751
|
}, stream.sink);
|
|
468
752
|
}
|
|
@@ -511,12 +795,12 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
511
795
|
peerId: peerId.toString(),
|
|
512
796
|
subProtocol
|
|
513
797
|
};
|
|
514
|
-
//Punishable error - peer should never send badly formed request
|
|
798
|
+
// Punishable error - peer should never send badly formed request
|
|
515
799
|
if (e instanceof ReqRespStatusError && e.status === ReqRespStatus.BADLY_FORMED_REQUEST) {
|
|
516
800
|
this.logger.debug(`Punishable error in ${subProtocol}: ${e.cause}`, logTags);
|
|
517
801
|
return PeerErrorSeverity.LowToleranceError;
|
|
518
802
|
}
|
|
519
|
-
//TODO: (mralj): think if we should penalize peer here based on connection errors
|
|
803
|
+
// TODO: (mralj): think if we should penalize peer here based on connection errors
|
|
520
804
|
return undefined;
|
|
521
805
|
}
|
|
522
806
|
/**
|
|
@@ -533,16 +817,30 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
533
817
|
this.logger.debug('Error encountered on goodbye sub protocol, no penalty', logTags);
|
|
534
818
|
return undefined;
|
|
535
819
|
}
|
|
536
|
-
//
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
820
|
+
// Invalid status byte: the peer sent a status byte that doesn't match any known status code.
|
|
821
|
+
// This is a protocol violation, penalize harshly.
|
|
822
|
+
if (e instanceof ReqRespStatusError) {
|
|
823
|
+
this.logger.warn(`Invalid status byte from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
824
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
825
|
+
}
|
|
826
|
+
// Oversized snappy response: the peer is sending data that exceeds the allowed size.
|
|
827
|
+
// This is a protocol violation that wastes bandwidth, so penalize harshly.
|
|
828
|
+
if (e instanceof OversizedSnappyResponseError) {
|
|
829
|
+
this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
830
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
831
|
+
}
|
|
832
|
+
// Response exceeded the reception buffer bound: the peer streamed more compressed data than the
|
|
833
|
+
// per-request size limit allows. Same protocol violation as above, penalize harshly.
|
|
834
|
+
if (e instanceof ResponseSizeLimitExceededError) {
|
|
835
|
+
this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
836
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
540
837
|
}
|
|
541
838
|
return this.categorizeConnectionErrors(e, peerId, subProtocol);
|
|
542
839
|
}
|
|
543
840
|
/*
|
|
544
841
|
* Errors specific to connection handling
|
|
545
|
-
* These can happen both when sending request and response
|
|
842
|
+
* These can happen both when sending request and response.
|
|
843
|
+
*/ categorizeConnectionErrors(e, peerId, subProtocol) {
|
|
546
844
|
const logTags = {
|
|
547
845
|
peerId: peerId.toString(),
|
|
548
846
|
subProtocol
|
|
@@ -587,21 +885,3 @@ import { ReqRespStatus, ReqRespStatusError, parseStatusChunk, prettyPrintReqResp
|
|
|
587
885
|
return PeerErrorSeverity.HighToleranceError;
|
|
588
886
|
}
|
|
589
887
|
}
|
|
590
|
-
_ts_decorate([
|
|
591
|
-
trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
592
|
-
[Attributes.P2P_REQ_RESP_PROTOCOL]: subProtocol,
|
|
593
|
-
[Attributes.P2P_REQ_RESP_BATCH_REQUESTS_COUNT]: requests.length
|
|
594
|
-
}))
|
|
595
|
-
], ReqResp.prototype, "sendBatchRequest", null);
|
|
596
|
-
_ts_decorate([
|
|
597
|
-
trackSpan('ReqResp.sendRequestToPeer', (peerId, subProtocol, _)=>({
|
|
598
|
-
[Attributes.P2P_ID]: peerId.toString(),
|
|
599
|
-
[Attributes.P2P_REQ_RESP_PROTOCOL]: subProtocol
|
|
600
|
-
}))
|
|
601
|
-
], ReqResp.prototype, "sendRequestToPeer", null);
|
|
602
|
-
_ts_decorate([
|
|
603
|
-
trackSpan('ReqResp.streamHandler', (protocol, { connection })=>({
|
|
604
|
-
[Attributes.P2P_REQ_RESP_PROTOCOL]: protocol,
|
|
605
|
-
[Attributes.P2P_ID]: connection.remotePeer.toString()
|
|
606
|
-
}))
|
|
607
|
-
], ReqResp.prototype, "streamHandler", null);
|