@aztec/p2p 0.0.1-commit.85d7d01 → 0.0.1-commit.8655d4a
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 +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +9 -1
- package/dest/client/factory.d.ts +5 -4
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +33 -15
- package/dest/client/interface.d.ts +14 -5
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +13 -9
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +93 -49
- package/dest/config.d.ts +153 -102
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +134 -35
- 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/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +267 -197
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +181 -65
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +6 -4
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +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 +33 -15
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -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 +7 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +12 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +29 -11
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +46 -16
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -43
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +97 -88
- 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 +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +61 -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 +90 -44
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +36 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +27 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +47 -17
- 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 +48 -7
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
- package/dest/msg_validators/tx_validator/index.d.ts +4 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +3 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +5 -5
- package/dest/services/discv5/discV5_service.d.ts +2 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +35 -8
- package/dest/services/dummy_service.d.ts +11 -15
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +12 -16
- package/dest/services/encoding.d.ts +5 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +7 -1
- package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +21 -4
- 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 +14 -0
- package/dest/services/libp2p/libp2p_service.d.ts +36 -46
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +296 -244
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- package/dest/services/peer-manager/peer_manager.d.ts +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 +32 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +84 -71
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- package/dest/services/reqresp/config.d.ts +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/interface.d.ts +16 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -20
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- 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 +4 -2
- 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 +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -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 +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +41 -214
- package/dest/services/service.d.ts +9 -12
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +2 -23
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +2 -55
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/index.d.ts +2 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +0 -1
- 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 +0 -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 +36 -55
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +275 -119
- package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +2 -2
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +4 -14
- package/dest/services/tx_provider.d.ts +3 -1
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +3 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -2
- package/dest/test-helpers/mock-pubsub.d.ts +23 -9
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +44 -44
- package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +16 -18
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +12 -14
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +42 -15
- package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +85 -39
- package/dest/testbench/worker_client_manager.d.ts +12 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +57 -11
- package/dest/util.d.ts +12 -7
- 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 +9 -1
- package/src/client/factory.ts +57 -8
- package/src/client/interface.ts +15 -11
- package/src/client/p2p_client.ts +106 -70
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +226 -36
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +22 -14
- package/src/mem_pools/tx_pool_v2/README.md +9 -1
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -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 +11 -1
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/interfaces.ts +12 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +72 -20
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +16 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +101 -94
- 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 +14 -7
- package/src/msg_validators/clock_tolerance.ts +79 -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 +114 -47
- package/src/msg_validators/tx_validator/README.md +15 -3
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +44 -1
- package/src/msg_validators/tx_validator/factory.ts +61 -10
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +121 -39
- package/src/msg_validators/tx_validator/index.ts +3 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +38 -5
- package/src/services/dummy_service.ts +14 -39
- package/src/services/encoding.ts +9 -1
- package/src/services/gossipsub/topic_score_params.ts +36 -4
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +321 -276
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +46 -11
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/README.md +215 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +83 -77
- package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +2 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -2
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +1 -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 +45 -260
- package/src/services/service.ts +12 -28
- package/src/services/tx_collection/config.ts +3 -80
- package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +331 -176
- package/src/services/tx_collection/tx_collection_sink.ts +2 -2
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +5 -0
- package/src/test-helpers/make-test-p2p-clients.ts +4 -1
- package/src/test-helpers/mock-pubsub.ts +46 -60
- package/src/test-helpers/reqresp-nodes.ts +13 -23
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +53 -28
- package/src/testbench/p2p_client_testbench_worker.ts +89 -55
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +33 -18
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -327
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -211
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -387
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
|
@@ -37,9 +37,11 @@ export function reqRespBlockTxsHandler(
|
|
|
37
37
|
throw new ReqRespStatusError(ReqRespStatus.BADLY_FORMED_REQUEST, { cause: err });
|
|
38
38
|
}
|
|
39
39
|
// First try attestation pool, then fall back to archiver
|
|
40
|
-
let txHashes = (await attestationPool.
|
|
40
|
+
let txHashes = (await attestationPool.getBlockProposalByArchive(request.archiveRoot.toString()))?.txHashes;
|
|
41
41
|
if (!txHashes) {
|
|
42
|
-
txHashes = (await archiver.
|
|
42
|
+
txHashes = (await archiver.getBlock({ archive: request.archiveRoot }))?.body.txEffects.map(
|
|
43
|
+
effect => effect.txHash,
|
|
44
|
+
);
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
let requestedTxsHashes;
|
|
@@ -51,9 +51,7 @@ export function reqRespTxHandler(mempools: MemPools): ReqRespSubProtocolHandler
|
|
|
51
51
|
* Per: https://github.com/AztecProtocol/aztec-packages/issues/15149#issuecomment-2999054485
|
|
52
52
|
* we define Q as max number of transactions per batch, the comment explains why we use 8.
|
|
53
53
|
*/
|
|
54
|
-
|
|
55
|
-
//more info: https://github.com/AztecProtocol/aztec-packages/pull/15516#pullrequestreview-2995474321
|
|
56
|
-
export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 1): Array<TxHashArray> {
|
|
54
|
+
export function chunkTxHashesRequest(hashes: TxHash[], chunkSize = 8): Array<TxHashArray> {
|
|
57
55
|
return chunk(hashes, chunkSize).map(chunk => new TxHashArray(...chunk));
|
|
58
56
|
}
|
|
59
57
|
|
|
@@ -97,9 +97,10 @@ export function prettyPrintRateLimitStatus(status: RateLimitStatus) {
|
|
|
97
97
|
* 2. Individual rate limits for each peer.
|
|
98
98
|
*
|
|
99
99
|
* How it works:
|
|
100
|
-
* - When a request comes in, it first checks against the
|
|
101
|
-
* - If the
|
|
102
|
-
* - The request is only allowed if both the
|
|
100
|
+
* - When a request comes in, it first checks against the peer's individual rate limit.
|
|
101
|
+
* - If the peer limit allows, it then checks against the global rate limit.
|
|
102
|
+
* - The request is only allowed if both the peer-specific and global limits allow it.
|
|
103
|
+
* - Checking peer limit first ensures a rate-limited peer cannot exhaust the global quota.
|
|
103
104
|
* - It automatically creates and manages rate limiters for new peers as they make requests.
|
|
104
105
|
* - It periodically cleans up rate limiters for inactive peers to conserve memory.
|
|
105
106
|
*
|
|
@@ -119,10 +120,6 @@ export class SubProtocolRateLimiter {
|
|
|
119
120
|
}
|
|
120
121
|
|
|
121
122
|
allow(peerId: PeerId): RateLimitStatus {
|
|
122
|
-
if (!this.globalLimiter.allow()) {
|
|
123
|
-
return RateLimitStatus.DeniedGlobal;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
123
|
const peerIdStr = peerId.toString();
|
|
127
124
|
let peerLimiter: PeerRateLimiter | undefined = this.peerLimiters.get(peerIdStr);
|
|
128
125
|
if (!peerLimiter) {
|
|
@@ -135,10 +132,17 @@ export class SubProtocolRateLimiter {
|
|
|
135
132
|
} else {
|
|
136
133
|
peerLimiter.lastAccess = Date.now();
|
|
137
134
|
}
|
|
138
|
-
|
|
139
|
-
|
|
135
|
+
|
|
136
|
+
// Check peer limit first: a rate-limited peer must not consume global quota,
|
|
137
|
+
// otherwise one spamming peer can starve all others by exhausting the global bucket.
|
|
138
|
+
if (!peerLimiter.limiter.allow()) {
|
|
140
139
|
return RateLimitStatus.DeniedPeer;
|
|
141
140
|
}
|
|
141
|
+
|
|
142
|
+
if (!this.globalLimiter.allow()) {
|
|
143
|
+
return RateLimitStatus.DeniedGlobal;
|
|
144
|
+
}
|
|
145
|
+
|
|
142
146
|
return RateLimitStatus.Allowed;
|
|
143
147
|
}
|
|
144
148
|
|
|
@@ -42,16 +42,6 @@ export const DEFAULT_RATE_LIMITS: ReqRespSubProtocolRateLimits = {
|
|
|
42
42
|
quotaCount: 200,
|
|
43
43
|
},
|
|
44
44
|
},
|
|
45
|
-
[ReqRespSubProtocol.BLOCK]: {
|
|
46
|
-
peerLimit: {
|
|
47
|
-
quotaTimeMs: 1000,
|
|
48
|
-
quotaCount: 2,
|
|
49
|
-
},
|
|
50
|
-
globalLimit: {
|
|
51
|
-
quotaTimeMs: 1000,
|
|
52
|
-
quotaCount: 5,
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
45
|
[ReqRespSubProtocol.GOODBYE]: {
|
|
56
46
|
peerLimit: {
|
|
57
47
|
quotaTimeMs: 1000,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// @attribution: lodestar impl for inspiration
|
|
2
|
-
import { compactArray } from '@aztec/foundation/collection';
|
|
3
2
|
import { AbortError, TimeoutError } from '@aztec/foundation/error';
|
|
4
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
4
|
import { executeTimeout } from '@aztec/foundation/timer';
|
|
@@ -11,31 +10,24 @@ import type { Libp2p } from 'libp2p';
|
|
|
11
10
|
import { pipeline } from 'node:stream/promises';
|
|
12
11
|
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
13
12
|
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
IndividualReqRespTimeoutError,
|
|
17
|
-
InvalidResponseError,
|
|
18
|
-
} from '../../errors/reqresp.error.js';
|
|
19
|
-
import { SnappyTransform } from '../encoding.js';
|
|
13
|
+
import { IndividualReqRespTimeoutError } from '../../errors/reqresp.error.js';
|
|
14
|
+
import { OversizedSnappyResponseError, SnappyTransform } from '../encoding.js';
|
|
20
15
|
import type { PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
21
16
|
import {
|
|
22
17
|
DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS,
|
|
23
18
|
DEFAULT_REQRESP_DIAL_TIMEOUT_MS,
|
|
24
19
|
type P2PReqRespConfig,
|
|
25
20
|
} from './config.js';
|
|
26
|
-
import { BatchConnectionSampler } from './connection-sampler/batch_connection_sampler.js';
|
|
27
21
|
import { ConnectionSampler, RandomSampler } from './connection-sampler/connection_sampler.js';
|
|
28
22
|
import {
|
|
29
|
-
DEFAULT_SUB_PROTOCOL_VALIDATORS,
|
|
30
23
|
type ReqRespInterface,
|
|
31
24
|
type ReqRespResponse,
|
|
32
25
|
ReqRespSubProtocol,
|
|
33
26
|
type ReqRespSubProtocolHandler,
|
|
34
27
|
type ReqRespSubProtocolHandlers,
|
|
35
28
|
type ReqRespSubProtocolRateLimits,
|
|
36
|
-
type
|
|
37
|
-
|
|
38
|
-
responseFromBuffer,
|
|
29
|
+
type ShouldRejectPeer,
|
|
30
|
+
UNAUTHENTICATED_ALLOWED_PROTOCOLS,
|
|
39
31
|
subProtocolSizeCalculators,
|
|
40
32
|
} from './interface.js';
|
|
41
33
|
import { ReqRespMetrics } from './metrics.js';
|
|
@@ -44,13 +36,13 @@ import {
|
|
|
44
36
|
RequestResponseRateLimiter,
|
|
45
37
|
prettyPrintRateLimitStatus,
|
|
46
38
|
} from './rate-limiter/rate_limiter.js';
|
|
47
|
-
import { ReqRespStatus, ReqRespStatusError, parseStatusChunk
|
|
39
|
+
import { ReqRespStatus, ReqRespStatusError, parseStatusChunk } from './status.js';
|
|
48
40
|
|
|
49
41
|
/**
|
|
50
42
|
* The Request Response Service
|
|
51
43
|
*
|
|
52
44
|
* It allows nodes to request specific information from their peers, its use case covers recovering
|
|
53
|
-
* information that was missed during a
|
|
45
|
+
* information that was missed during a synchronisation or a gossip event.
|
|
54
46
|
*
|
|
55
47
|
* This service implements the request response sub protocol, it is heavily inspired from
|
|
56
48
|
* ethereum implementations of the same name.
|
|
@@ -65,13 +57,14 @@ export class ReqResp implements ReqRespInterface {
|
|
|
65
57
|
private dialTimeoutMs: number = DEFAULT_REQRESP_DIAL_TIMEOUT_MS;
|
|
66
58
|
|
|
67
59
|
private subProtocolHandlers: Partial<ReqRespSubProtocolHandlers> = {};
|
|
68
|
-
private subProtocolValidators: Partial<ReqRespSubProtocolValidators> = {};
|
|
69
60
|
|
|
70
61
|
private connectionSampler: ConnectionSampler;
|
|
71
62
|
private rateLimiter: RequestResponseRateLimiter;
|
|
72
63
|
|
|
73
64
|
private snappyTransform: SnappyTransform;
|
|
74
65
|
|
|
66
|
+
private shouldRejectPeer: ShouldRejectPeer | undefined;
|
|
67
|
+
|
|
75
68
|
private metrics: ReqRespMetrics;
|
|
76
69
|
|
|
77
70
|
constructor(
|
|
@@ -108,6 +101,10 @@ export class ReqResp implements ReqRespInterface {
|
|
|
108
101
|
}
|
|
109
102
|
}
|
|
110
103
|
|
|
104
|
+
public setShouldRejectPeer(checker: ShouldRejectPeer): void {
|
|
105
|
+
this.shouldRejectPeer = checker;
|
|
106
|
+
}
|
|
107
|
+
|
|
111
108
|
get tracer() {
|
|
112
109
|
return this.metrics.tracer;
|
|
113
110
|
}
|
|
@@ -122,11 +119,11 @@ export class ReqResp implements ReqRespInterface {
|
|
|
122
119
|
/**
|
|
123
120
|
* Start the reqresp service
|
|
124
121
|
*/
|
|
125
|
-
async start(subProtocolHandlers: ReqRespSubProtocolHandlers
|
|
122
|
+
async start(subProtocolHandlers: ReqRespSubProtocolHandlers) {
|
|
126
123
|
Object.assign(this.subProtocolHandlers, subProtocolHandlers);
|
|
127
|
-
Object.assign(this.subProtocolValidators, subProtocolValidators);
|
|
128
124
|
|
|
129
|
-
// Register
|
|
125
|
+
// Register streamHandler with libp2p.
|
|
126
|
+
// The streamHandler is responsible for reading the incoming stream, determining the protocol, then triggering the appropriate handler.
|
|
130
127
|
for (const subProtocol of Object.keys(subProtocolHandlers)) {
|
|
131
128
|
this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
|
|
132
129
|
await this.libp2p.handle(
|
|
@@ -140,13 +137,8 @@ export class ReqResp implements ReqRespInterface {
|
|
|
140
137
|
this.rateLimiter.start();
|
|
141
138
|
}
|
|
142
139
|
|
|
143
|
-
async addSubProtocol(
|
|
144
|
-
subProtocol: ReqRespSubProtocol,
|
|
145
|
-
handler: ReqRespSubProtocolHandler,
|
|
146
|
-
validator: ReqRespSubProtocolValidators[ReqRespSubProtocol] = DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol],
|
|
147
|
-
): Promise<void> {
|
|
140
|
+
async addSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
148
141
|
this.subProtocolHandlers[subProtocol] = handler;
|
|
149
|
-
this.subProtocolValidators[subProtocol] = validator;
|
|
150
142
|
this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
|
|
151
143
|
await this.libp2p.handle(
|
|
152
144
|
subProtocol,
|
|
@@ -180,225 +172,6 @@ export class ReqResp implements ReqRespInterface {
|
|
|
180
172
|
// NOTE: We assume libp2p instance is managed by the caller
|
|
181
173
|
}
|
|
182
174
|
|
|
183
|
-
/**
|
|
184
|
-
* Request multiple messages over the same sub protocol, balancing the requests across peers.
|
|
185
|
-
*
|
|
186
|
-
* @devnote
|
|
187
|
-
* - The function prioritizes sending requests to free peers using a batch sampling strategy.
|
|
188
|
-
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
189
|
-
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
190
|
-
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
191
|
-
*
|
|
192
|
-
* Requests are sent in parallel to each peer, but multiple requests are sent to the same peer in series
|
|
193
|
-
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
194
|
-
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
195
|
-
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
196
|
-
*
|
|
197
|
-
* @param subProtocol
|
|
198
|
-
* @param requests
|
|
199
|
-
* @param timeoutMs
|
|
200
|
-
* @param maxPeers
|
|
201
|
-
* @returns
|
|
202
|
-
*
|
|
203
|
-
* @throws {CollectiveReqRespTimeoutError} - If the request batch exceeds the specified timeout (`timeoutMs`).
|
|
204
|
-
*/
|
|
205
|
-
@trackSpan(
|
|
206
|
-
'ReqResp.sendBatchRequest',
|
|
207
|
-
(subProtocol: ReqRespSubProtocol, requests: InstanceType<SubProtocolMap[ReqRespSubProtocol]['request']>[]) => ({
|
|
208
|
-
[Attributes.P2P_REQ_RESP_PROTOCOL]: subProtocol,
|
|
209
|
-
[Attributes.P2P_REQ_RESP_BATCH_REQUESTS_COUNT]: requests.length,
|
|
210
|
-
}),
|
|
211
|
-
)
|
|
212
|
-
async sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
|
|
213
|
-
subProtocol: SubProtocol,
|
|
214
|
-
requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
|
|
215
|
-
pinnedPeer: PeerId | undefined,
|
|
216
|
-
timeoutMs = 10000,
|
|
217
|
-
maxPeers = Math.max(10, Math.ceil(requests.length / 3)),
|
|
218
|
-
maxRetryAttempts = 3,
|
|
219
|
-
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
|
|
220
|
-
const responseValidator = this.subProtocolValidators[subProtocol] ?? DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol];
|
|
221
|
-
const responses: InstanceType<SubProtocolMap[SubProtocol]['response']>[] = new Array(requests.length);
|
|
222
|
-
const requestBuffers = requests.map(req => req.toBuffer());
|
|
223
|
-
const isEmptyResponse = (value: unknown): boolean => {
|
|
224
|
-
// Some responses serialize to a non-empty buffer even when they contain no items (e.g., empty TxArray).
|
|
225
|
-
if (!value || typeof value !== 'object') {
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
const length = (value as { length?: number }).length;
|
|
229
|
-
return typeof length === 'number' && length === 0;
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
const requestFunction = async (signal: AbortSignal) => {
|
|
233
|
-
// Track which requests still need to be processed
|
|
234
|
-
const pendingRequestIndices = new Set(requestBuffers.map((_, i) => i));
|
|
235
|
-
|
|
236
|
-
// Create batch sampler with the total number of requests and max peers
|
|
237
|
-
const batchSampler = new BatchConnectionSampler(
|
|
238
|
-
this.connectionSampler,
|
|
239
|
-
requests.length,
|
|
240
|
-
maxPeers,
|
|
241
|
-
compactArray([pinnedPeer]), // Exclude pinned peer from sampling, we will forcefully send all requests to it
|
|
242
|
-
createLogger(`${this.logger.module}:batch-connection-sampler`),
|
|
243
|
-
);
|
|
244
|
-
|
|
245
|
-
if (batchSampler.activePeerCount === 0 && !pinnedPeer) {
|
|
246
|
-
this.logger.warn('No active peers to send requests to');
|
|
247
|
-
return [];
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// This is where it gets fun
|
|
251
|
-
// The outer loop is the retry loop, we will continue to retry until we process all indices we have
|
|
252
|
-
// not received a response for, or we have reached the max retry attempts
|
|
253
|
-
|
|
254
|
-
// The inner loop is the batch loop, we will process all requests for each peer in parallel
|
|
255
|
-
// We will then process the results of the requests, and resample any peers that failed to respond
|
|
256
|
-
// We will continue to retry until we have processed all indices, or we have reached the max retry attempts
|
|
257
|
-
|
|
258
|
-
let retryAttempts = 0;
|
|
259
|
-
while (pendingRequestIndices.size > 0 && batchSampler.activePeerCount > 0 && retryAttempts < maxRetryAttempts) {
|
|
260
|
-
if (signal.aborted) {
|
|
261
|
-
throw new AbortError('Batch request aborted');
|
|
262
|
-
}
|
|
263
|
-
// Process requests in parallel for each available peer
|
|
264
|
-
type BatchEntry = { peerId: PeerId; indices: number[] };
|
|
265
|
-
const requestBatches = new Map<string, BatchEntry>();
|
|
266
|
-
|
|
267
|
-
// Group requests by peer
|
|
268
|
-
for (const requestIndex of pendingRequestIndices) {
|
|
269
|
-
const peer = batchSampler.getPeerForRequest(requestIndex);
|
|
270
|
-
if (!peer) {
|
|
271
|
-
// No peer available for this specific index (all peers exhausted for it)
|
|
272
|
-
// Skip this index for now - it stays in pendingRequestIndices for retry
|
|
273
|
-
continue;
|
|
274
|
-
}
|
|
275
|
-
const peerAsString = peer.toString();
|
|
276
|
-
if (!requestBatches.has(peerAsString)) {
|
|
277
|
-
requestBatches.set(peerAsString, { peerId: peer, indices: [] });
|
|
278
|
-
}
|
|
279
|
-
requestBatches.get(peerAsString)!.indices.push(requestIndex);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// If there is a pinned peer, we will always send every request to that peer
|
|
283
|
-
// We use the default limits for the subprotocol to avoid hitting the rate limiter
|
|
284
|
-
if (pinnedPeer) {
|
|
285
|
-
const limit = this.rateLimiter.getRateLimits(subProtocol).peerLimit.quotaCount;
|
|
286
|
-
requestBatches.set(pinnedPeer.toString(), {
|
|
287
|
-
peerId: pinnedPeer,
|
|
288
|
-
indices: Array.from(pendingRequestIndices.values()).slice(0, limit),
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// If no requests could be assigned (all peers exhausted for all indices), exit early
|
|
293
|
-
if (requestBatches.size === 0) {
|
|
294
|
-
this.logger.warn('No peers available for any pending request indices, stopping batch request');
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Make parallel requests for each peer's batch
|
|
299
|
-
// A batch entry will look something like this:
|
|
300
|
-
// PeerId0: [0, 1, 2, 3]
|
|
301
|
-
// PeerId1: [4, 5, 6, 7]
|
|
302
|
-
|
|
303
|
-
// Peer Id 0 will send requests 0, 1, 2, 3 in serial
|
|
304
|
-
// while simultaneously Peer Id 1 will send requests 4, 5, 6, 7 in serial
|
|
305
|
-
|
|
306
|
-
const batchResults = await Promise.all(
|
|
307
|
-
Array.from(requestBatches.entries()).map(async ([peerAsString, { peerId: peer, indices }]) => {
|
|
308
|
-
try {
|
|
309
|
-
const markIndexFailed = (index: number) => batchSampler.markPeerFailedForIndex(peer, index);
|
|
310
|
-
// Requests all going to the same peer are sent synchronously
|
|
311
|
-
const peerResults: { index: number; response: InstanceType<SubProtocolMap[SubProtocol]['response']> }[] =
|
|
312
|
-
[];
|
|
313
|
-
let shouldReplacePeer = false;
|
|
314
|
-
const handleFailure = (status: ReqRespStatus, index: number) => {
|
|
315
|
-
this.logger.warn(
|
|
316
|
-
`Request to peer ${peerAsString} failed with status ${prettyPrintReqRespStatus(status)}`,
|
|
317
|
-
);
|
|
318
|
-
markIndexFailed(index);
|
|
319
|
-
return status === ReqRespStatus.RATE_LIMIT_EXCEEDED;
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
for (const index of indices) {
|
|
323
|
-
this.logger.info(`Sending request ${index} to peer ${peerAsString}`);
|
|
324
|
-
const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffers[index]);
|
|
325
|
-
|
|
326
|
-
// Check the status of the response buffer
|
|
327
|
-
if (response.status !== ReqRespStatus.SUCCESS) {
|
|
328
|
-
shouldReplacePeer = handleFailure(response.status, index);
|
|
329
|
-
if (shouldReplacePeer) {
|
|
330
|
-
break;
|
|
331
|
-
}
|
|
332
|
-
continue;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
if (response.data.length === 0) {
|
|
336
|
-
markIndexFailed(index);
|
|
337
|
-
continue;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
const object = responseFromBuffer(subProtocol, response.data);
|
|
341
|
-
if (isEmptyResponse(object)) {
|
|
342
|
-
markIndexFailed(index);
|
|
343
|
-
continue;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
const isValid = await responseValidator(requests[index], object, peer);
|
|
347
|
-
if (!isValid) {
|
|
348
|
-
markIndexFailed(index);
|
|
349
|
-
continue;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
peerResults.push({ index, response: object });
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
// If peer had a hard failure (rate limit), replace it for future iterations
|
|
356
|
-
if (shouldReplacePeer) {
|
|
357
|
-
this.logger.warn(`Peer ${peerAsString} hit a hard failure, removing from sampler`);
|
|
358
|
-
batchSampler.removePeerAndReplace(peer);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
return { peer, results: peerResults };
|
|
362
|
-
} catch (error) {
|
|
363
|
-
this.logger.warn(`Failed batch request to peer ${peerAsString}:`, error);
|
|
364
|
-
batchSampler.removePeerAndReplace(peer);
|
|
365
|
-
return { peer, results: [] };
|
|
366
|
-
}
|
|
367
|
-
}),
|
|
368
|
-
);
|
|
369
|
-
|
|
370
|
-
// Process results
|
|
371
|
-
for (const { results } of batchResults) {
|
|
372
|
-
for (const { index, response } of results) {
|
|
373
|
-
if (response) {
|
|
374
|
-
responses[index] = response;
|
|
375
|
-
pendingRequestIndices.delete(index);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
retryAttempts++;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
if (retryAttempts >= maxRetryAttempts) {
|
|
384
|
-
this.logger.warn(`Max retry attempts ${maxRetryAttempts} reached for batch request`);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
return responses;
|
|
388
|
-
};
|
|
389
|
-
|
|
390
|
-
try {
|
|
391
|
-
return await executeTimeout<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>(
|
|
392
|
-
requestFunction,
|
|
393
|
-
timeoutMs,
|
|
394
|
-
() => new CollectiveReqRespTimeoutError(),
|
|
395
|
-
);
|
|
396
|
-
} catch (e: any) {
|
|
397
|
-
this.logger.warn(`${e.message} | subProtocol: ${subProtocol}`);
|
|
398
|
-
return [];
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
175
|
/**
|
|
403
176
|
* Sends a request to a specific peer
|
|
404
177
|
*
|
|
@@ -462,7 +235,7 @@ export class ReqResp implements ReqRespInterface {
|
|
|
462
235
|
);
|
|
463
236
|
return resp;
|
|
464
237
|
} catch (e: any) {
|
|
465
|
-
this.logger.
|
|
238
|
+
this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
|
|
466
239
|
// On error we immediately abort the stream, this is preferred way,
|
|
467
240
|
// because it signals to the sender that error happened, whereas
|
|
468
241
|
// closing the stream only closes our side and is much slower
|
|
@@ -553,16 +326,10 @@ export class ReqResp implements ReqRespInterface {
|
|
|
553
326
|
data: message,
|
|
554
327
|
};
|
|
555
328
|
} catch (e: any) {
|
|
329
|
+
// All errors (invalid status bytes, oversized snappy responses, corrupt data, etc.)
|
|
330
|
+
// are re-thrown so the caller can penalize the peer via handleResponseError.
|
|
556
331
|
this.logger.debug(`Reading message failed: ${e.message}`);
|
|
557
|
-
|
|
558
|
-
let status = ReqRespStatus.UNKNOWN;
|
|
559
|
-
if (e instanceof ReqRespStatusError) {
|
|
560
|
-
status = e.status;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
return {
|
|
564
|
-
status,
|
|
565
|
-
};
|
|
332
|
+
throw e;
|
|
566
333
|
}
|
|
567
334
|
}
|
|
568
335
|
|
|
@@ -602,6 +369,15 @@ export class ReqResp implements ReqRespInterface {
|
|
|
602
369
|
throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
|
|
603
370
|
}
|
|
604
371
|
|
|
372
|
+
// When p2pAllowOnlyValidators is enabled, reject unauthenticated peers on data protocols
|
|
373
|
+
if (
|
|
374
|
+
!UNAUTHENTICATED_ALLOWED_PROTOCOLS.has(protocol) &&
|
|
375
|
+
(this.shouldRejectPeer?.(connection.remotePeer.toString()) ?? false)
|
|
376
|
+
) {
|
|
377
|
+
this.logger.debug(`Rejecting unauthenticated peer ${connection.remotePeer} on gated protocol ${protocol}`);
|
|
378
|
+
throw new ReqRespStatusError(ReqRespStatus.FAILURE);
|
|
379
|
+
}
|
|
380
|
+
|
|
605
381
|
await this.processStream(protocol, incomingStream);
|
|
606
382
|
} catch (err: any) {
|
|
607
383
|
this.metrics.recordResponseError(protocol);
|
|
@@ -746,13 +522,13 @@ export class ReqResp implements ReqRespInterface {
|
|
|
746
522
|
): PeerErrorSeverity | undefined {
|
|
747
523
|
const logTags = { peerId: peerId.toString(), subProtocol };
|
|
748
524
|
|
|
749
|
-
//Punishable error - peer should never send badly formed request
|
|
525
|
+
// Punishable error - peer should never send badly formed request
|
|
750
526
|
if (e instanceof ReqRespStatusError && e.status === ReqRespStatus.BADLY_FORMED_REQUEST) {
|
|
751
527
|
this.logger.debug(`Punishable error in ${subProtocol}: ${e.cause}`, logTags);
|
|
752
528
|
return PeerErrorSeverity.LowToleranceError;
|
|
753
529
|
}
|
|
754
530
|
|
|
755
|
-
//TODO: (mralj): think if we should penalize peer here based on connection errors
|
|
531
|
+
// TODO: (mralj): think if we should penalize peer here based on connection errors
|
|
756
532
|
return undefined;
|
|
757
533
|
}
|
|
758
534
|
|
|
@@ -774,10 +550,18 @@ export class ReqResp implements ReqRespInterface {
|
|
|
774
550
|
return undefined;
|
|
775
551
|
}
|
|
776
552
|
|
|
777
|
-
//
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
553
|
+
// Invalid status byte: the peer sent a status byte that doesn't match any known status code.
|
|
554
|
+
// This is a protocol violation, penalize harshly.
|
|
555
|
+
if (e instanceof ReqRespStatusError) {
|
|
556
|
+
this.logger.warn(`Invalid status byte from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
557
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
// Oversized snappy response: the peer is sending data that exceeds the allowed size.
|
|
561
|
+
// This is a protocol violation that wastes bandwidth, so penalize harshly.
|
|
562
|
+
if (e instanceof OversizedSnappyResponseError) {
|
|
563
|
+
this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
564
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
781
565
|
}
|
|
782
566
|
|
|
783
567
|
return this.categorizeConnectionErrors(e, peerId, subProtocol);
|
|
@@ -785,7 +569,8 @@ export class ReqResp implements ReqRespInterface {
|
|
|
785
569
|
|
|
786
570
|
/*
|
|
787
571
|
* Errors specific to connection handling
|
|
788
|
-
* These can happen both when sending request and response
|
|
572
|
+
* These can happen both when sending request and response.
|
|
573
|
+
*/
|
|
789
574
|
private categorizeConnectionErrors(
|
|
790
575
|
e: any,
|
|
791
576
|
peerId: PeerId,
|
package/src/services/service.ts
CHANGED
|
@@ -17,12 +17,7 @@ import type EventEmitter from 'events';
|
|
|
17
17
|
import type { BatchTxRequesterLibP2PService } from './reqresp/batch-tx-requester/interface.js';
|
|
18
18
|
import type { P2PReqRespConfig } from './reqresp/config.js';
|
|
19
19
|
import type { StatusMessage } from './reqresp/index.js';
|
|
20
|
-
import type {
|
|
21
|
-
ReqRespSubProtocol,
|
|
22
|
-
ReqRespSubProtocolHandler,
|
|
23
|
-
ReqRespSubProtocolValidators,
|
|
24
|
-
SubProtocolMap,
|
|
25
|
-
} from './reqresp/interface.js';
|
|
20
|
+
import type { ReqRespSubProtocol, ReqRespSubProtocolHandler } from './reqresp/interface.js';
|
|
26
21
|
import type { AuthRequest, AuthResponse } from './reqresp/protocols/auth.js';
|
|
27
22
|
|
|
28
23
|
export enum PeerDiscoveryState {
|
|
@@ -76,6 +71,8 @@ export type DuplicateAttestationInfo = {
|
|
|
76
71
|
*/
|
|
77
72
|
export type P2PDuplicateAttestationCallback = (info: DuplicateAttestationInfo) => void;
|
|
78
73
|
|
|
74
|
+
export type P2PCheckpointAttestationCallback = (attestation: CheckpointAttestation) => void;
|
|
75
|
+
|
|
79
76
|
/**
|
|
80
77
|
* The interface for a P2P service implementation.
|
|
81
78
|
*/
|
|
@@ -98,26 +95,12 @@ export interface P2PService {
|
|
|
98
95
|
*/
|
|
99
96
|
propagate<T extends Gossipable>(message: T): Promise<void>;
|
|
100
97
|
|
|
101
|
-
/**
|
|
102
|
-
* Send a batch of requests to peers, and return the responses
|
|
103
|
-
*
|
|
104
|
-
* @param protocol - The request response protocol to use
|
|
105
|
-
* @param requests - The requests to send to the peers
|
|
106
|
-
* @returns The responses to the requests
|
|
107
|
-
*/
|
|
108
|
-
sendBatchRequest<Protocol extends ReqRespSubProtocol>(
|
|
109
|
-
protocol: Protocol,
|
|
110
|
-
requests: InstanceType<SubProtocolMap[Protocol]['request']>[],
|
|
111
|
-
pinnedPeerId?: PeerId,
|
|
112
|
-
timeoutMs?: number,
|
|
113
|
-
maxPeers?: number,
|
|
114
|
-
maxRetryAttempts?: number,
|
|
115
|
-
): Promise<InstanceType<SubProtocolMap[Protocol]['response']>[]>;
|
|
116
|
-
|
|
117
98
|
// Leaky abstraction: fix https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
118
99
|
registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
|
|
119
100
|
|
|
120
|
-
|
|
101
|
+
registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
|
|
102
|
+
|
|
103
|
+
registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
|
|
121
104
|
|
|
122
105
|
/**
|
|
123
106
|
* Registers a callback invoked when a duplicate proposal is detected (equivocation).
|
|
@@ -132,6 +115,8 @@ export interface P2PService {
|
|
|
132
115
|
*/
|
|
133
116
|
registerDuplicateAttestationCallback(callback: P2PDuplicateAttestationCallback): void;
|
|
134
117
|
|
|
118
|
+
registerCheckpointAttestationCallback(callback: P2PCheckpointAttestationCallback): void;
|
|
119
|
+
|
|
135
120
|
getEnr(): ENR | undefined;
|
|
136
121
|
|
|
137
122
|
getPeers(includePending?: boolean): PeerInfo[];
|
|
@@ -141,11 +126,7 @@ export interface P2PService {
|
|
|
141
126
|
|
|
142
127
|
validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
|
|
143
128
|
|
|
144
|
-
addReqRespSubProtocol(
|
|
145
|
-
subProtocol: ReqRespSubProtocol,
|
|
146
|
-
handler: ReqRespSubProtocolHandler,
|
|
147
|
-
validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
148
|
-
): Promise<void>;
|
|
129
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void>;
|
|
149
130
|
|
|
150
131
|
handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
151
132
|
|
|
@@ -196,6 +177,9 @@ export interface PeerDiscoveryService extends EventEmitter {
|
|
|
196
177
|
on(event: 'peer:discovered', listener: (enr: ENR) => void): this;
|
|
197
178
|
emit(event: 'peer:discovered', enr: ENR): boolean;
|
|
198
179
|
|
|
180
|
+
on(event: 'ip:changed', listener: (ip: string) => void): this;
|
|
181
|
+
emit(event: 'ip:changed', ip: string): boolean;
|
|
182
|
+
|
|
199
183
|
getStatus(): PeerDiscoveryState;
|
|
200
184
|
|
|
201
185
|
getEnr(): ENR | undefined;
|