@aztec/p2p 0.0.1-commit.2ed92850 → 0.0.1-commit.2f68f620
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -3
- package/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +13 -5
- package/dest/client/factory.d.ts +13 -12
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +65 -20
- package/dest/client/interface.d.ts +58 -36
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +52 -58
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +235 -235
- package/dest/config.d.ts +163 -84
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +155 -42
- 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 +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- 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 +162 -106
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +511 -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 +507 -125
- 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 +2 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +7 -5
- package/dest/mem_pools/index.d.ts +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 +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +35 -17
- package/dest/mem_pools/interface.d.ts +5 -5
- 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 → tx_pool_v2}/eviction/invalid_txs_after_mining_rule.js +16 -35
- 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 +218 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +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 +108 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +167 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +914 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +8 -4
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +11 -7
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +56 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -4
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +10 -4
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +21 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +93 -47
- 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 +5 -4
- 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 -5
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +259 -58
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +100 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +138 -53
- package/dest/msg_validators/tx_validator/index.d.ts +5 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +4 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
- 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 +75 -27
- package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/size_validator.js +4 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -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 +2 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +36 -9
- package/dest/services/dummy_service.d.ts +33 -17
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +56 -15
- package/dest/services/encoding.d.ts +7 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +18 -11
- 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 +184 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +363 -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 +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +28 -3
- package/dest/services/libp2p/libp2p_service.d.ts +107 -59
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +701 -569
- package/dest/services/peer-manager/metrics.d.ts +4 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +26 -5
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +40 -11
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +65 -14
- 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 +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
- 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/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 -5
- 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 +8 -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 +36 -8
- 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 +84 -20
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +21 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
- package/dest/services/reqresp/reqresp.d.ts +12 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +58 -187
- package/dest/services/service.d.ts +49 -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 +27 -26
- 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 +8 -2
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/tx_collection.d.ts +47 -53
- 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 +19 -9
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +28 -31
- package/dest/services/tx_collection/tx_source.d.ts +13 -7
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +26 -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 +6 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +12 -8
- package/dest/services/tx_provider_instrumentation.d.ts +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +5 -5
- 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-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 +46 -6
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +115 -14
- package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +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 +161 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +391 -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 +270 -143
- 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 -49
- package/dest/util.d.ts +13 -8
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +15 -14
- package/src/bootstrap/bootstrap.ts +16 -5
- package/src/client/factory.ts +135 -39
- package/src/client/interface.ts +70 -44
- package/src/client/p2p_client.ts +280 -299
- package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
- package/src/config.ts +272 -46
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +575 -94
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +617 -141
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +14 -8
- package/src/mem_pools/index.ts +2 -2
- package/src/mem_pools/instrumentation.ts +24 -15
- package/src/mem_pools/interface.ts +4 -4
- 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 +250 -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 +430 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1090 -0
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +24 -11
- package/src/msg_validators/clock_tolerance.ts +73 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +116 -49
- package/src/msg_validators/tx_validator/README.md +127 -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 +22 -11
- 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 +50 -3
- package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
- package/src/msg_validators/tx_validator/factory.ts +424 -56
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +203 -52
- package/src/msg_validators/tx_validator/index.ts +4 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +18 -7
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +87 -30
- package/src/msg_validators/tx_validator/size_validator.ts +6 -2
- package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
- 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 +39 -6
- package/src/services/dummy_service.ts +71 -39
- package/src/services/encoding.ts +18 -10
- package/src/services/gossipsub/README.md +641 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +519 -0
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +29 -2
- package/src/services/libp2p/libp2p_service.ts +775 -643
- package/src/services/peer-manager/metrics.ts +28 -4
- package/src/services/peer-manager/peer_manager.ts +46 -11
- package/src/services/peer-manager/peer_scoring.ts +56 -6
- package/src/services/reqresp/README.md +215 -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 +2 -2
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
- package/src/services/reqresp/interface.ts +48 -46
- package/src/services/reqresp/metrics.ts +33 -9
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +10 -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 +108 -16
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +23 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
- package/src/services/reqresp/reqresp.ts +68 -224
- package/src/services/service.ts +66 -29
- package/src/services/tx_collection/config.ts +41 -36
- 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 +11 -2
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +364 -112
- package/src/services/tx_collection/tx_collection_sink.ts +32 -36
- package/src/services/tx_collection/tx_source.ts +28 -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 +15 -9
- package/src/services/tx_provider_instrumentation.ts +11 -5
- 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 +137 -14
- package/src/test-helpers/reqresp-nodes.ts +17 -29
- package/src/test-helpers/test_tx_provider.ts +69 -0
- package/src/test-helpers/testbench-utils.ts +453 -0
- package/src/testbench/p2p_client_testbench_worker.ts +370 -134
- package/src/testbench/worker_client_manager.ts +355 -51
- package/src/util.ts +40 -19
- package/src/versioning.ts +3 -33
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
- 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 -218
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
- 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 -180
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -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 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
- 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 -53
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -177
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -100
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -341
- package/src/services/tx_collection/slow_tx_collection.ts +0 -233
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ISemaphore } from '@aztec/foundation/queue';
|
|
2
|
+
import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
3
|
+
import type { Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
|
|
4
|
+
|
|
5
|
+
import type { PeerId } from '@libp2p/interface';
|
|
6
|
+
|
|
7
|
+
import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
|
|
8
|
+
import type { BlockTxsRequest, BlockTxsResponse } from '../index.js';
|
|
9
|
+
import type { ReqRespInterface } from '../interface.js';
|
|
10
|
+
import type { IPeerCollection } from './peer_collection.js';
|
|
11
|
+
import type { BatchRequestTxValidatorConfig } from './tx_validator.js';
|
|
12
|
+
|
|
13
|
+
export interface IPeerPenalizer {
|
|
14
|
+
penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity): void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface ITxMetadataCollection {
|
|
18
|
+
getMissingTxHashes(): Set<string>;
|
|
19
|
+
markFetched(peerId: PeerId, tx: Tx): boolean;
|
|
20
|
+
getTxsToRequestFromThePeer(peer: PeerId): TxHash[];
|
|
21
|
+
markRequested(txHash: TxHash): void;
|
|
22
|
+
markInFlightBySmartPeer(txHash: TxHash): void;
|
|
23
|
+
markNotInFlightBySmartPeer(txHash: TxHash): void;
|
|
24
|
+
alreadyFetched(txHash: TxHash): boolean;
|
|
25
|
+
// Returns true if tx was marked as fetched, false if it was already marked as fetched
|
|
26
|
+
markPeerHas(peerId: PeerId, txHashes: TxHash[]): void;
|
|
27
|
+
/** Remove all tx metadata associations for a peer (e.g. on demotion from smart to dumb). */
|
|
28
|
+
clearPeerData(peerId: PeerId): void;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Interface for BatchTxRequester dependencies that can be injected from upstream
|
|
33
|
+
*/
|
|
34
|
+
export interface BatchTxRequesterLibP2PService {
|
|
35
|
+
/** ReqResp interface for sending requests to peers */
|
|
36
|
+
reqResp: Pick<ReqRespInterface, 'sendRequestToPeer'>;
|
|
37
|
+
/** Connection sampler for getting peer lists */
|
|
38
|
+
connectionSampler: Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>;
|
|
39
|
+
/** Configuration needed for transaction validation */
|
|
40
|
+
txValidatorConfig: BatchRequestTxValidatorConfig;
|
|
41
|
+
/** Peer scoring for penalizing peers */
|
|
42
|
+
peerScoring: IPeerPenalizer;
|
|
43
|
+
/** Validate the requested block transactions request-response consistency */
|
|
44
|
+
validateRequestedBlockTxsConsistency: (
|
|
45
|
+
request: BlockTxsRequest,
|
|
46
|
+
response: BlockTxsResponse,
|
|
47
|
+
peerId: PeerId,
|
|
48
|
+
) => Promise<boolean>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface BatchTxRequesterOptions {
|
|
52
|
+
smartParallelWorkerCount?: number;
|
|
53
|
+
dumbParallelWorkerCount?: number;
|
|
54
|
+
txBatchSize?: number;
|
|
55
|
+
badPeerThreshold?: number;
|
|
56
|
+
//Injectable for testing purposes
|
|
57
|
+
semaphore?: ISemaphore;
|
|
58
|
+
peerCollection?: IPeerCollection;
|
|
59
|
+
/** Optional tx validator for testing - if not provided, one is created from p2pService.txValidatorConfig */
|
|
60
|
+
txValidator?: TxValidator;
|
|
61
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { type Tx, TxHash } from '@aztec/stdlib/tx';
|
|
2
|
+
|
|
3
|
+
import type { PeerId } from '@libp2p/interface';
|
|
4
|
+
|
|
5
|
+
import type { IRequestTracker } from '../../tx_collection/request_tracker.js';
|
|
6
|
+
import { DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE } from './config.js';
|
|
7
|
+
import type { ITxMetadataCollection } from './interface.js';
|
|
8
|
+
|
|
9
|
+
class MissingTxMetadata {
|
|
10
|
+
constructor(
|
|
11
|
+
public readonly txHash: string,
|
|
12
|
+
public requestedCount = 0,
|
|
13
|
+
public inFlightCount = 0,
|
|
14
|
+
public tx: Tx | undefined = undefined,
|
|
15
|
+
public readonly peers = new Set<string>(),
|
|
16
|
+
) {}
|
|
17
|
+
|
|
18
|
+
public markAsRequested() {
|
|
19
|
+
this.requestedCount++;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public markInFlight() {
|
|
23
|
+
this.inFlightCount++;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public markNotInFlight() {
|
|
27
|
+
this.inFlightCount = Math.max(--this.inFlightCount, 0);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public isInFlight(): boolean {
|
|
31
|
+
return this.inFlightCount > 0;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/*
|
|
36
|
+
* Single source or truth for transactions we are fetching
|
|
37
|
+
* This could be better optimized but given expected count of missing txs (N < 100)
|
|
38
|
+
* At the moment there is no need for it. And benefit is that we have everything in single store
|
|
39
|
+
* */
|
|
40
|
+
export class MissingTxMetadataCollection implements ITxMetadataCollection {
|
|
41
|
+
private txMetadata = new Map<string, MissingTxMetadata>();
|
|
42
|
+
|
|
43
|
+
constructor(
|
|
44
|
+
private requestTracker: IRequestTracker,
|
|
45
|
+
private readonly txBatchSize: number = DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE,
|
|
46
|
+
) {
|
|
47
|
+
requestTracker.missingTxHashes.forEach(hash => this.txMetadata.set(hash, new MissingTxMetadata(hash)));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public getPrioritizingNotInFlightAndLowerRequestCount(txs: string[]): MissingTxMetadata[] {
|
|
51
|
+
const filtered = Array.from(this.txMetadata.values()).filter(txMeta => txs.includes(txMeta.txHash.toString()));
|
|
52
|
+
|
|
53
|
+
const [notInFlight, inFlight] = filtered.reduce<[MissingTxMetadata[], MissingTxMetadata[]]>(
|
|
54
|
+
(buckets, tx) => {
|
|
55
|
+
tx.isInFlight() ? buckets[1].push(tx) : buckets[0].push(tx);
|
|
56
|
+
return buckets;
|
|
57
|
+
},
|
|
58
|
+
[[], []],
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
notInFlight.sort((a, b) => a.requestedCount - b.requestedCount);
|
|
62
|
+
inFlight.sort((a, b) => a.inFlightCount - b.inFlightCount);
|
|
63
|
+
|
|
64
|
+
return [...notInFlight, ...inFlight];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public getMissingTxHashes(): Set<string> {
|
|
68
|
+
return this.requestTracker.missingTxHashes;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public getTxsPeerHas(peer: PeerId): Set<string> {
|
|
72
|
+
const peerIdStr = peer.toString();
|
|
73
|
+
const txsPeerHas = new Set<string>();
|
|
74
|
+
|
|
75
|
+
this.txMetadata.values().forEach(txMeta => {
|
|
76
|
+
if (txMeta.peers.has(peerIdStr)) {
|
|
77
|
+
txsPeerHas.add(txMeta.txHash.toString());
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return txsPeerHas;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public getTxsToRequestFromThePeer(peer: PeerId): TxHash[] {
|
|
85
|
+
const txsPeerHas = this.getTxsPeerHas(peer);
|
|
86
|
+
const missingTxHashes = this.getMissingTxHashes();
|
|
87
|
+
|
|
88
|
+
const txsToRequest = txsPeerHas.intersection(missingTxHashes);
|
|
89
|
+
|
|
90
|
+
if (txsToRequest.size >= this.txBatchSize) {
|
|
91
|
+
return this.getPrioritizingNotInFlightAndLowerRequestCount(Array.from(txsToRequest))
|
|
92
|
+
.map(t => TxHash.fromString(t.txHash))
|
|
93
|
+
.slice(0, this.txBatchSize);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Otherwise fill the txs to request till txBatchSize with random txs we are missing
|
|
97
|
+
// Who knows, maybe we get lucky and peer received these txs in the meantime
|
|
98
|
+
|
|
99
|
+
const countToFill = this.txBatchSize - txsToRequest.size;
|
|
100
|
+
const txsToFill = this.getPrioritizingNotInFlightAndLowerRequestCount(
|
|
101
|
+
Array.from(this.getMissingTxHashes().difference(txsToRequest)),
|
|
102
|
+
)
|
|
103
|
+
.slice(0, countToFill)
|
|
104
|
+
.map(t => TxHash.fromString(t.txHash));
|
|
105
|
+
|
|
106
|
+
return [...Array.from(txsToRequest).map(t => TxHash.fromString(t)), ...txsToFill];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
public markRequested(txHash: TxHash) {
|
|
110
|
+
this.txMetadata.get(txHash.toString())?.markAsRequested();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/*
|
|
114
|
+
* This should be called only when requesting tx from smart peer
|
|
115
|
+
* Because the smart peer should return this tx, whereas
|
|
116
|
+
* "dumb" peer might return it, or might not - we don't know
|
|
117
|
+
* */
|
|
118
|
+
public markInFlightBySmartPeer(txHash: TxHash) {
|
|
119
|
+
this.txMetadata.get(txHash.toString())?.markInFlight();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
* This should be called only when requesting tx from smart peer
|
|
124
|
+
* Because the smart peer should return this tx, whereas
|
|
125
|
+
* "dumb" peer might return it, or might not - we don't know*/
|
|
126
|
+
public markNotInFlightBySmartPeer(txHash: TxHash) {
|
|
127
|
+
this.txMetadata.get(txHash.toString())?.markNotInFlight();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
public alreadyFetched(txHash: TxHash): boolean {
|
|
131
|
+
return !this.requestTracker.isMissing(txHash.toString());
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public markFetched(peerId: PeerId, tx: Tx): boolean {
|
|
135
|
+
const txHashStr = tx.txHash.toString();
|
|
136
|
+
const txMeta = this.txMetadata.get(txHashStr);
|
|
137
|
+
if (!txMeta) {
|
|
138
|
+
//TODO: what to do about peer which sent txs we didn't request?
|
|
139
|
+
// 1. don't request from it in the scope of this batch request
|
|
140
|
+
// 2. ban it immediately?
|
|
141
|
+
// 3. track it and ban it?
|
|
142
|
+
//
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
txMeta.peers.add(peerId.toString());
|
|
147
|
+
return this.requestTracker.markFetched(tx);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public markPeerHas(peerId: PeerId, txHash: TxHash[]) {
|
|
151
|
+
const peerIdStr = peerId.toString();
|
|
152
|
+
txHash
|
|
153
|
+
.map(t => t.toString())
|
|
154
|
+
.forEach(txh => {
|
|
155
|
+
const txMeta = this.txMetadata.get(txh);
|
|
156
|
+
if (txMeta) {
|
|
157
|
+
txMeta.peers.add(peerIdStr);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
public clearPeerData(peerId: PeerId) {
|
|
163
|
+
const peerIdStr = peerId.toString();
|
|
164
|
+
for (const txMeta of this.txMetadata.values()) {
|
|
165
|
+
txMeta.peers.delete(peerIdStr);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import type { DateProvider } from '@aztec/foundation/timer';
|
|
2
|
+
import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
3
|
+
|
|
4
|
+
import type { PeerId } from '@libp2p/interface';
|
|
5
|
+
import { peerIdFromString } from '@libp2p/peer-id';
|
|
6
|
+
|
|
7
|
+
import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
|
|
8
|
+
import { DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD } from './config.js';
|
|
9
|
+
import type { IPeerPenalizer } from './interface.js';
|
|
10
|
+
|
|
11
|
+
export const RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL = 1000; // 1s
|
|
12
|
+
|
|
13
|
+
export interface IPeerCollection {
|
|
14
|
+
markPeerSmart(peerId: PeerId): void;
|
|
15
|
+
markPeerDumb(peerId: PeerId): void;
|
|
16
|
+
|
|
17
|
+
/** Sample next peer in round-robin fashion. No smart peers if returns undefined */
|
|
18
|
+
nextSmartPeerToQuery(): PeerId | undefined;
|
|
19
|
+
/** Sample next peer in round-robin fashion. No dumb peers if returns undefined */
|
|
20
|
+
nextDumbPeerToQuery(): PeerId | undefined;
|
|
21
|
+
|
|
22
|
+
thereAreSomeDumbRatelimitExceededPeers(): boolean;
|
|
23
|
+
penalisePeer(peerId: PeerId, severity: PeerErrorSeverity): void;
|
|
24
|
+
unMarkPeerAsBad(peerId: PeerId): void;
|
|
25
|
+
getBadPeers(): Set<string>;
|
|
26
|
+
markPeerInFlight(peerId: PeerId): void;
|
|
27
|
+
unMarkPeerInFlight(peerId: PeerId): void;
|
|
28
|
+
markPeerRateLimitExceeded(peerId: PeerId): void;
|
|
29
|
+
getRateLimitExceededPeers(): Set<string>;
|
|
30
|
+
getPeerRateLimitDelayMs(peerId: PeerId): number | undefined;
|
|
31
|
+
getNextDumbPeerAvailabilityDelayMs(): number | undefined;
|
|
32
|
+
getNextSmartPeerAvailabilityDelayMs(): number | undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class PeerCollection implements IPeerCollection {
|
|
36
|
+
private readonly smartPeers = new Set<string>();
|
|
37
|
+
private readonly inFlightPeers = new Set<string>();
|
|
38
|
+
private readonly rateLimitExceededPeers = new Map<string, number>();
|
|
39
|
+
private readonly peerPenaltyCounters = new Map<string, number>();
|
|
40
|
+
private readonly badPeers = new Set<string>();
|
|
41
|
+
|
|
42
|
+
constructor(
|
|
43
|
+
private readonly connectionSampler: Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>,
|
|
44
|
+
private readonly pinnedPeerId: PeerId | undefined,
|
|
45
|
+
private readonly dateProvider: DateProvider,
|
|
46
|
+
private readonly badPeerThreshold: number = DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD,
|
|
47
|
+
private readonly peerPenalizer?: IPeerPenalizer,
|
|
48
|
+
) {
|
|
49
|
+
// Pinned peer is treated specially, always mark it as in-flight
|
|
50
|
+
// and never return it as part of smart/dumb peers
|
|
51
|
+
if (this.pinnedPeerId) {
|
|
52
|
+
const peerIdStr = this.pinnedPeerId.toString();
|
|
53
|
+
this.inFlightPeers.add(peerIdStr);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public markPeerSmart(peerId: PeerId): void {
|
|
58
|
+
this.smartPeers.add(peerId.toString());
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public markPeerDumb(peerId: PeerId): void {
|
|
62
|
+
this.smartPeers.delete(peerId.toString());
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// We keep track of all peers that are queried for peer sampling algorithm
|
|
66
|
+
private queriedSmartPeers: Set<string> = new Set<string>();
|
|
67
|
+
private queriedDumbPeers: Set<string> = new Set<string>();
|
|
68
|
+
|
|
69
|
+
private static nextPeer(allPeers: Set<string>, queried: Set<string>): PeerId | undefined {
|
|
70
|
+
if (allPeers.size === 0) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
const availablePeers = allPeers.difference(queried);
|
|
74
|
+
let [first] = availablePeers;
|
|
75
|
+
if (first === undefined) {
|
|
76
|
+
// We queried all peers. Start over
|
|
77
|
+
[first] = allPeers;
|
|
78
|
+
queried.clear();
|
|
79
|
+
}
|
|
80
|
+
queried.add(first);
|
|
81
|
+
return peerIdFromString(first);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public nextSmartPeerToQuery(): PeerId | undefined {
|
|
85
|
+
return PeerCollection.nextPeer(this.availableSmartPeers, this.queriedSmartPeers);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public nextDumbPeerToQuery(): PeerId | undefined {
|
|
89
|
+
return PeerCollection.nextPeer(this.availableDumbPeers, this.queriedDumbPeers);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private get availableSmartPeers(): Set<string> {
|
|
93
|
+
return this.peers.intersection(
|
|
94
|
+
this.smartPeers.difference(this.getBadPeers().union(this.inFlightPeers).union(this.getRateLimitExceededPeers())),
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private get availableDumbPeers(): Set<string> {
|
|
99
|
+
return this.peers.difference(
|
|
100
|
+
this.smartPeers.union(this.getBadPeers()).union(this.inFlightPeers).union(this.getRateLimitExceededPeers()),
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public thereAreSomeDumbRatelimitExceededPeers(): boolean {
|
|
105
|
+
return (
|
|
106
|
+
this.getRateLimitExceededPeers().difference(this.smartPeers.union(this.badPeers).union(this.inFlightPeers)).size >
|
|
107
|
+
0
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public markPeerInFlight(peerId: PeerId) {
|
|
112
|
+
this.inFlightPeers.add(peerId.toString());
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public unMarkPeerInFlight(peerId: PeerId) {
|
|
116
|
+
// Never unmark the pinned peer as in-flight
|
|
117
|
+
if (this.pinnedPeerId && this.pinnedPeerId.toString() === peerId.toString()) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
this.inFlightPeers.delete(peerId.toString());
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public markPeerRateLimitExceeded(peerId: PeerId) {
|
|
124
|
+
const ttl = this.dateProvider.now() + RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL;
|
|
125
|
+
this.rateLimitExceededPeers.set(peerId.toString(), ttl);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public getRateLimitExceededPeers(): Set<string> {
|
|
129
|
+
const now = this.dateProvider.now();
|
|
130
|
+
const rateLimitedPeers = new Set<string>();
|
|
131
|
+
|
|
132
|
+
for (const [peerId, expirationTime] of this.rateLimitExceededPeers) {
|
|
133
|
+
if (expirationTime <= now) {
|
|
134
|
+
this.rateLimitExceededPeers.delete(peerId);
|
|
135
|
+
} else {
|
|
136
|
+
rateLimitedPeers.add(peerId);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return rateLimitedPeers;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
public penalisePeer(peerId: PeerId, severity: PeerErrorSeverity): void {
|
|
144
|
+
const key = peerId.toString();
|
|
145
|
+
const newPenaltyCount = (this.peerPenaltyCounters.get(key) ?? 0) + 1;
|
|
146
|
+
this.peerPenaltyCounters.set(key, newPenaltyCount);
|
|
147
|
+
this.peerPenalizer?.penalizePeer(peerId, severity);
|
|
148
|
+
if (newPenaltyCount > this.badPeerThreshold) {
|
|
149
|
+
this.badPeers.add(key);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
public unMarkPeerAsBad(peerId: PeerId) {
|
|
154
|
+
const key = peerId.toString();
|
|
155
|
+
this.badPeers.delete(key);
|
|
156
|
+
this.peerPenaltyCounters.delete(key);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
public getBadPeers(): Set<string> {
|
|
160
|
+
return new Set(this.badPeers);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
public getPeerRateLimitDelayMs(peerId: PeerId): number | undefined {
|
|
164
|
+
const key = peerId.toString();
|
|
165
|
+
const expiry = this.rateLimitExceededPeers.get(key);
|
|
166
|
+
const peerIsNotRateLimited = expiry === undefined;
|
|
167
|
+
if (peerIsNotRateLimited) {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const now = this.dateProvider.now();
|
|
172
|
+
const rateLimitHasExpired = expiry <= now;
|
|
173
|
+
if (rateLimitHasExpired) {
|
|
174
|
+
this.rateLimitExceededPeers.delete(key);
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
return expiry - now;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public getNextDumbPeerAvailabilityDelayMs(): number | undefined {
|
|
181
|
+
// Note: this _is_ suboptimal
|
|
182
|
+
// (we could've tracked rate limits ) per dumb/smart peers - different collections
|
|
183
|
+
// but everything is in memory and small scale so this, wile suboptimal is not slow
|
|
184
|
+
return this.getNextRateLimitDelayMs(
|
|
185
|
+
peerIdStr =>
|
|
186
|
+
!this.smartPeers.has(peerIdStr) &&
|
|
187
|
+
!this.getBadPeers().has(peerIdStr) &&
|
|
188
|
+
!this.inFlightPeers.has(peerIdStr) &&
|
|
189
|
+
this.peers.has(peerIdStr),
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
public getNextSmartPeerAvailabilityDelayMs(): number | undefined {
|
|
194
|
+
return this.getNextRateLimitDelayMs(
|
|
195
|
+
peerIdStr =>
|
|
196
|
+
this.smartPeers.has(peerIdStr) && !this.getBadPeers().has(peerIdStr) && !this.inFlightPeers.has(peerIdStr),
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
private getNextRateLimitDelayMs(filter: (peerIdStr: string) => boolean): number | undefined {
|
|
201
|
+
const now = this.dateProvider.now();
|
|
202
|
+
let minExpiry: number | undefined;
|
|
203
|
+
|
|
204
|
+
for (const [peerIdStr, expiry] of this.rateLimitExceededPeers) {
|
|
205
|
+
const rateLimitHasExpired = expiry <= now;
|
|
206
|
+
if (rateLimitHasExpired) {
|
|
207
|
+
this.rateLimitExceededPeers.delete(peerIdStr);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const peerDoesNotMatchFilter = !filter(peerIdStr);
|
|
212
|
+
if (peerDoesNotMatchFilter) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
minExpiry = minExpiry === undefined ? expiry : Math.min(minExpiry, expiry);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const noRateLimitedPeersMatchFilter = minExpiry === undefined;
|
|
220
|
+
if (noRateLimitedPeersMatchFilter) {
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return minExpiry! - now;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
private orderedPeers: Set<string> = new Set();
|
|
228
|
+
|
|
229
|
+
private get peers(): Set<string> {
|
|
230
|
+
const pinnedStr = this.pinnedPeerId?.toString();
|
|
231
|
+
const currentlyConnected = new Set(
|
|
232
|
+
this.connectionSampler
|
|
233
|
+
.getPeerListSortedByConnectionCountAsc()
|
|
234
|
+
.map(p => p.toString())
|
|
235
|
+
.filter(p => p !== pinnedStr),
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
// Remove disconnected peers, preserving order of the rest.
|
|
239
|
+
this.orderedPeers = this.orderedPeers.intersection(currentlyConnected);
|
|
240
|
+
|
|
241
|
+
// Append newly connected peers at the end (lowest priority).
|
|
242
|
+
for (const peer of currentlyConnected) {
|
|
243
|
+
if (!this.orderedPeers.has(peer)) {
|
|
244
|
+
this.orderedPeers.add(peer);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return this.orderedPeers;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server';
|
|
2
|
+
import type { TxValidator } from '@aztec/stdlib/tx';
|
|
3
|
+
|
|
4
|
+
import { createTxValidatorForOnDemandReceivedTxs } from '../../../msg_validators/index.js';
|
|
5
|
+
import type { TxValidationCache } from '../../../msg_validators/tx_validator/tx_validation_cache.js';
|
|
6
|
+
|
|
7
|
+
export interface BatchRequestTxValidatorConfig {
|
|
8
|
+
l1ChainId: number;
|
|
9
|
+
rollupVersion: number;
|
|
10
|
+
proofVerifier: ClientProtocolCircuitVerifier;
|
|
11
|
+
txValidationCache?: TxValidationCache;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function createBatchRequestTxValidator(config: BatchRequestTxValidatorConfig): TxValidator {
|
|
15
|
+
return createTxValidatorForOnDemandReceivedTxs(
|
|
16
|
+
config.proofVerifier,
|
|
17
|
+
{
|
|
18
|
+
l1ChainId: config.l1ChainId,
|
|
19
|
+
rollupVersion: config.rollupVersion,
|
|
20
|
+
},
|
|
21
|
+
/*bindings=*/ undefined,
|
|
22
|
+
config.txValidationCache,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type ConfigMappingsType, booleanConfigHelper, numberConfigHelper } from '@aztec/foundation/config';
|
|
2
2
|
|
|
3
3
|
export const DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS = 10_000;
|
|
4
4
|
export const DEFAULT_OVERALL_REQUEST_TIMEOUT_MS = 10_000; // Not currently used
|
|
@@ -27,7 +27,7 @@ export interface P2PReqRespConfig {
|
|
|
27
27
|
dialTimeoutMs: number;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
export const p2pReqRespConfigMappings:
|
|
30
|
+
export const p2pReqRespConfigMappings: ConfigMappingsType<P2PReqRespConfig> = {
|
|
31
31
|
overallRequestTimeoutMs: {
|
|
32
32
|
env: 'P2P_REQRESP_OVERALL_REQUEST_TIMEOUT_MS',
|
|
33
33
|
description: 'The overall timeout for a request response operation.',
|
|
@@ -125,6 +125,22 @@ export class ConnectionSampler {
|
|
|
125
125
|
return { peer: lastPeer, sampledPeers };
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
+
/*
|
|
129
|
+
* Returns all peers sorted by connection count ascending,
|
|
130
|
+
* meaning that the peers with the least number of active connections are earlier in an array
|
|
131
|
+
*
|
|
132
|
+
* @param: excluding - peers to exclude
|
|
133
|
+
* @return: list of peer ids
|
|
134
|
+
* */
|
|
135
|
+
public getPeerListSortedByConnectionCountAsc(excluding?: Set<string>): PeerId[] {
|
|
136
|
+
return this.libp2p
|
|
137
|
+
.getPeers()
|
|
138
|
+
.filter(id => !excluding?.has(id.toString()))
|
|
139
|
+
.map(id => ({ id, count: this.activeConnectionsCount.get(id.toString()) ?? 0 }))
|
|
140
|
+
.sort((a, b) => a.count - b.count)
|
|
141
|
+
.map(p => p.id);
|
|
142
|
+
}
|
|
143
|
+
|
|
128
144
|
/**
|
|
129
145
|
* Samples a batch of unique peers from the libp2p node, prioritizing peers without active connections
|
|
130
146
|
*
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
-
import { L2Block } from '@aztec/stdlib/block';
|
|
3
1
|
import { TxArray, TxHashArray } from '@aztec/stdlib/tx';
|
|
4
2
|
|
|
5
3
|
import type { PeerId } from '@libp2p/interface';
|
|
6
4
|
|
|
7
5
|
import type { P2PReqRespConfig } from './config.js';
|
|
6
|
+
import type { ConnectionSampler } from './connection-sampler/connection_sampler.js';
|
|
8
7
|
import { AuthRequest, AuthResponse } from './protocols/auth.js';
|
|
9
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
BlockTxsRequest,
|
|
10
|
+
BlockTxsResponse,
|
|
11
|
+
calculateBlockTxsResponseSize,
|
|
12
|
+
} from './protocols/block_txs/block_txs_reqresp.js';
|
|
10
13
|
import { StatusMessage } from './protocols/status.js';
|
|
14
|
+
import { calculateTxResponseSize } from './protocols/tx.js';
|
|
11
15
|
import type { ReqRespStatus } from './status.js';
|
|
12
16
|
|
|
13
17
|
/*
|
|
@@ -17,7 +21,6 @@ export const PING_PROTOCOL = '/aztec/req/ping/1.0.0';
|
|
|
17
21
|
export const STATUS_PROTOCOL = '/aztec/req/status/1.0.0';
|
|
18
22
|
export const GOODBYE_PROTOCOL = '/aztec/req/goodbye/1.0.0';
|
|
19
23
|
export const TX_REQ_PROTOCOL = '/aztec/req/tx/1.0.0';
|
|
20
|
-
export const BLOCK_REQ_PROTOCOL = '/aztec/req/block/1.0.0';
|
|
21
24
|
export const AUTH_PROTOCOL = '/aztec/req/auth/1.0.0';
|
|
22
25
|
export const BLOCK_TXS_REQ_PROTOCOL = '/aztec/req/block_txs/1.0.0';
|
|
23
26
|
|
|
@@ -26,7 +29,6 @@ export enum ReqRespSubProtocol {
|
|
|
26
29
|
STATUS = STATUS_PROTOCOL,
|
|
27
30
|
GOODBYE = GOODBYE_PROTOCOL,
|
|
28
31
|
TX = TX_REQ_PROTOCOL,
|
|
29
|
-
BLOCK = BLOCK_REQ_PROTOCOL,
|
|
30
32
|
AUTH = AUTH_PROTOCOL,
|
|
31
33
|
BLOCK_TXS = BLOCK_TXS_REQ_PROTOCOL,
|
|
32
34
|
}
|
|
@@ -76,32 +78,28 @@ export interface ProtocolRateLimitQuota {
|
|
|
76
78
|
globalLimit: RateLimitQuota;
|
|
77
79
|
}
|
|
78
80
|
|
|
79
|
-
export const noopValidator = () => Promise.resolve(true);
|
|
80
|
-
|
|
81
81
|
/**
|
|
82
82
|
* A type mapping from supprotocol to it's handling function
|
|
83
83
|
*/
|
|
84
84
|
export type ReqRespSubProtocolHandlers = Record<ReqRespSubProtocol, ReqRespSubProtocolHandler>;
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
86
|
+
/**
|
|
87
|
+
* Protocols that are always allowed without authentication, even when p2pAllowOnlyValidators is enabled.
|
|
88
|
+
* These are needed for the handshake and connection management flow.
|
|
89
|
+
* All other protocols require the remote peer to be authenticated.
|
|
90
|
+
*/
|
|
91
|
+
export const UNAUTHENTICATED_ALLOWED_PROTOCOLS: ReadonlySet<ReqRespSubProtocol> = new Set([
|
|
92
|
+
ReqRespSubProtocol.PING,
|
|
93
|
+
ReqRespSubProtocol.STATUS,
|
|
94
|
+
ReqRespSubProtocol.AUTH,
|
|
95
|
+
ReqRespSubProtocol.GOODBYE,
|
|
96
|
+
]);
|
|
95
97
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
[ReqRespSubProtocol.BLOCK]: noopValidator,
|
|
102
|
-
[ReqRespSubProtocol.AUTH]: noopValidator,
|
|
103
|
-
[ReqRespSubProtocol.BLOCK_TXS]: noopValidator,
|
|
104
|
-
};
|
|
98
|
+
/**
|
|
99
|
+
* Callback that checks whether a peer should be rejected from req/resp data protocols.
|
|
100
|
+
* Returns true if the peer should be rejected (i.e. p2pAllowOnlyValidators is on and peer is unauthenticated).
|
|
101
|
+
*/
|
|
102
|
+
export type ShouldRejectPeer = (peerId: string) => boolean;
|
|
105
103
|
|
|
106
104
|
/*
|
|
107
105
|
* Helper class to sub-protocol validation error*/
|
|
@@ -196,10 +194,6 @@ export const subProtocolMap = {
|
|
|
196
194
|
request: RequestableBuffer,
|
|
197
195
|
response: RequestableBuffer,
|
|
198
196
|
},
|
|
199
|
-
[ReqRespSubProtocol.BLOCK]: {
|
|
200
|
-
request: Fr, // block number
|
|
201
|
-
response: L2Block,
|
|
202
|
-
},
|
|
203
197
|
[ReqRespSubProtocol.AUTH]: {
|
|
204
198
|
request: AuthRequest,
|
|
205
199
|
response: AuthResponse,
|
|
@@ -210,25 +204,28 @@ export const subProtocolMap = {
|
|
|
210
204
|
},
|
|
211
205
|
};
|
|
212
206
|
|
|
207
|
+
/**
|
|
208
|
+
* Type for a function that calculates the expected response size in KB for a given request.
|
|
209
|
+
*/
|
|
210
|
+
export type ExpectedResponseSizeCalculator = (requestBuffer: Buffer) => number;
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Map of sub-protocols to their expected response size calculators.
|
|
214
|
+
* These are used to validate that responses don't exceed expected sizes based on request parameters.
|
|
215
|
+
*/
|
|
216
|
+
export const subProtocolSizeCalculators: Record<ReqRespSubProtocol, ExpectedResponseSizeCalculator> = {
|
|
217
|
+
[ReqRespSubProtocol.TX]: calculateTxResponseSize,
|
|
218
|
+
[ReqRespSubProtocol.BLOCK_TXS]: calculateBlockTxsResponseSize,
|
|
219
|
+
[ReqRespSubProtocol.STATUS]: () => 1,
|
|
220
|
+
[ReqRespSubProtocol.PING]: () => 1,
|
|
221
|
+
[ReqRespSubProtocol.AUTH]: () => 1,
|
|
222
|
+
[ReqRespSubProtocol.GOODBYE]: () => 1, // No response expected, but provide minimal limit
|
|
223
|
+
};
|
|
224
|
+
|
|
213
225
|
export interface ReqRespInterface {
|
|
214
|
-
start(
|
|
215
|
-
|
|
216
|
-
subProtocolValidators: ReqRespSubProtocolValidators,
|
|
217
|
-
): Promise<void>;
|
|
218
|
-
addSubProtocol(
|
|
219
|
-
subProtocol: ReqRespSubProtocol,
|
|
220
|
-
handler: ReqRespSubProtocolHandler,
|
|
221
|
-
validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
222
|
-
): Promise<void>;
|
|
226
|
+
start(subProtocolHandlers: Partial<ReqRespSubProtocolHandlers>): Promise<void>;
|
|
227
|
+
addSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void>;
|
|
223
228
|
stop(): Promise<void>;
|
|
224
|
-
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
|
|
225
|
-
subProtocol: SubProtocol,
|
|
226
|
-
requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
|
|
227
|
-
pinnedPeer: PeerId | undefined,
|
|
228
|
-
timeoutMs?: number,
|
|
229
|
-
maxPeers?: number,
|
|
230
|
-
maxRetryAttempts?: number,
|
|
231
|
-
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>;
|
|
232
229
|
sendRequestToPeer(
|
|
233
230
|
peerId: PeerId,
|
|
234
231
|
subProtocol: ReqRespSubProtocol,
|
|
@@ -237,4 +234,9 @@ export interface ReqRespInterface {
|
|
|
237
234
|
): Promise<ReqRespResponse>;
|
|
238
235
|
|
|
239
236
|
updateConfig(config: Partial<P2PReqRespConfig>): void;
|
|
237
|
+
|
|
238
|
+
/** Sets the callback used to reject unauthenticated peers on gated req/resp protocols. */
|
|
239
|
+
setShouldRejectPeer(checker: ShouldRejectPeer): void;
|
|
240
|
+
|
|
241
|
+
getConnectionSampler(): Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>;
|
|
240
242
|
}
|