@aztec/p2p 0.0.1-commit.4d79d1f2d → 0.0.1-commit.4d9804df
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +22 -6
- package/dest/client/factory.d.ts +9 -8
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +50 -34
- package/dest/client/interface.d.ts +59 -27
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +40 -34
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +162 -135
- package/dest/config.d.ts +164 -100
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +149 -49
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +9 -16
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +10 -17
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +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 +103 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +278 -196
- 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 +224 -65
- 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 +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +12 -5
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +38 -17
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +32 -15
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +95 -24
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
- 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 +8 -4
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +3 -2
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +2 -1
- 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 +54 -5
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +9 -7
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
- 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 +16 -4
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
- 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 +3 -3
- package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +1 -1
- 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 +60 -14
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +6 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +59 -15
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +116 -20
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +26 -3
- 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 +79 -43
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +20 -7
- 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 +34 -12
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +29 -7
- 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 +473 -211
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
- 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/proposal_validator/block_proposal_validator.d.ts +12 -5
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +12 -5
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +36 -9
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +130 -48
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
- 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.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 +133 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +261 -61
- 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 +104 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +137 -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 +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/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 +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/timestamp_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- 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 +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 +5 -5
- package/dest/services/discv5/discV5_service.d.ts +13 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +119 -23
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +18 -18
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +19 -20
- package/dest/services/encoding.d.ts +23 -6
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +41 -24
- package/dest/services/gossipsub/topic_score_params.d.ts +23 -17
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +36 -24
- 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 +57 -56
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +483 -373
- 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 +20 -3
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +83 -26
- package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +102 -13
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +5 -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 +95 -127
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +11 -11
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
- 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 +15 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +11 -0
- 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/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- 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 +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
- 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 +42 -24
- 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 +3 -13
- 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 +75 -216
- package/dest/services/service.d.ts +29 -14
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +8 -17
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +17 -40
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +25 -32
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +96 -87
- package/dest/services/tx_collection/file_store_tx_source.d.ts +17 -6
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +53 -10
- 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.js +1 -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 +39 -55
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +280 -108
- package/dest/services/tx_collection/tx_collection_sink.d.ts +7 -6
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +15 -24
- package/dest/services/tx_collection/tx_source.d.ts +13 -7
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +29 -7
- package/dest/services/tx_file_store/tx_file_store.d.ts +3 -4
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +13 -20
- package/dest/services/tx_provider.d.ts +5 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +7 -4
- package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
- 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 +26 -12
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +51 -45
- 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 +17 -19
- 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 +22 -16
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +56 -16
- 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 +111 -48
- 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 +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 +16 -16
- package/src/bootstrap/bootstrap.ts +17 -3
- package/src/client/factory.ts +95 -51
- package/src/client/interface.ts +59 -35
- package/src/client/p2p_client.ts +186 -196
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +259 -57
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +13 -19
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +336 -242
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
- package/src/mem_pools/attestation_pool/mocks.ts +14 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +27 -17
- package/src/mem_pools/tx_pool_v2/README.md +52 -28
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +114 -27
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +8 -4
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +5 -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 +59 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
- package/src/mem_pools/tx_pool_v2/index.ts +1 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +61 -14
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +170 -28
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +91 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +54 -14
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +527 -207
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +155 -49
- package/src/msg_validators/tx_validator/README.md +129 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +6 -15
- 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 +413 -80
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +195 -54
- package/src/msg_validators/tx_validator/index.ts +4 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +126 -14
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +26 -45
- package/src/services/encoding.ts +40 -24
- package/src/services/gossipsub/README.md +59 -22
- package/src/services/gossipsub/topic_score_params.ts +58 -31
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +554 -428
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +91 -25
- package/src/services/peer-manager/peer_scoring.ts +102 -8
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +92 -138
- package/src/services/reqresp/batch-tx-requester/interface.ts +14 -10
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +19 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
- 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 +3 -13
- package/src/services/reqresp/reqresp.ts +87 -260
- package/src/services/service.ts +42 -30
- package/src/services/tx_collection/config.ts +24 -59
- package/src/services/tx_collection/file_store_tx_collection.ts +108 -107
- package/src/services/tx_collection/file_store_tx_source.ts +69 -10
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -1
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +342 -156
- package/src/services/tx_collection/tx_collection_sink.ts +17 -31
- package/src/services/tx_collection/tx_source.ts +29 -8
- package/src/services/tx_file_store/tx_file_store.ts +11 -21
- package/src/services/tx_provider.ts +7 -2
- package/src/test-helpers/make-test-p2p-clients.ts +4 -3
- package/src/test-helpers/mock-pubsub.ts +59 -66
- package/src/test-helpers/reqresp-nodes.ts +15 -28
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +74 -31
- package/src/testbench/p2p_client_testbench_worker.ts +120 -63
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +40 -19
- 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 -305
- 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/clock_tolerance.d.ts +0 -21
- package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
- package/dest/msg_validators/clock_tolerance.js +0 -37
- 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 -321
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -49
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -55
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -206
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -336
- 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/clock_tolerance.ts +0 -51
- 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 -366
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -112
- package/src/services/tx_collection/slow_tx_collection.ts +0 -262
|
@@ -2,20 +2,21 @@ import type { Logger } from '@aztec/foundation/log';
|
|
|
2
2
|
import { elapsed } from '@aztec/foundation/timer';
|
|
3
3
|
import type { TypedEventEmitter } from '@aztec/foundation/types';
|
|
4
4
|
import type { L2Block } from '@aztec/stdlib/block';
|
|
5
|
-
import type { BlockHeader, Tx
|
|
5
|
+
import type { BlockHeader, Tx } from '@aztec/stdlib/tx';
|
|
6
6
|
import type { TelemetryClient } from '@aztec/telemetry-client';
|
|
7
7
|
|
|
8
8
|
import EventEmitter from 'node:events';
|
|
9
9
|
|
|
10
|
-
import type { TxPoolV2, TxPoolV2Events } from '../../mem_pools/
|
|
10
|
+
import type { TxPoolV2, TxPoolV2Events } from '../../mem_pools/index.js';
|
|
11
11
|
import { TxCollectionInstrumentation } from './instrumentation.js';
|
|
12
12
|
import type { CollectionMethod } from './tx_collection.js';
|
|
13
|
+
import type { TxSourceCollectionResult } from './tx_source.js';
|
|
13
14
|
|
|
14
15
|
/** Context determining how collected txs should be added to the pool. */
|
|
15
16
|
export type TxAddContext = { type: 'proposal'; blockHeader: BlockHeader } | { type: 'mined'; block: L2Block };
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
|
-
* Executes collection requests from
|
|
19
|
+
* Executes collection requests from fast collection paths, and handles collected txs
|
|
19
20
|
* by adding them to the tx pool and emitting events, as well as handling logging and metrics.
|
|
20
21
|
*/
|
|
21
22
|
export class TxCollectionSink extends (EventEmitter as new () => TypedEventEmitter<TxPoolV2Events>) {
|
|
@@ -31,52 +32,37 @@ export class TxCollectionSink extends (EventEmitter as new () => TypedEventEmitt
|
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
public async collect(
|
|
34
|
-
collectValidTxsFn: (
|
|
35
|
-
requested:
|
|
35
|
+
collectValidTxsFn: () => Promise<TxSourceCollectionResult>,
|
|
36
|
+
requested: string[],
|
|
36
37
|
info: Record<string, any> & { description: string; method: CollectionMethod },
|
|
37
38
|
context: TxAddContext,
|
|
38
39
|
) {
|
|
39
40
|
this.log.trace(`Requesting ${requested.length} txs via ${info.description}`, {
|
|
40
41
|
...info,
|
|
41
|
-
requestedTxs: requested
|
|
42
|
+
requestedTxs: requested,
|
|
42
43
|
});
|
|
43
44
|
|
|
44
45
|
// Execute collection function and measure the time taken, catching any errors.
|
|
45
|
-
const [duration,
|
|
46
|
+
const [duration, { validTxs, invalidTxHashes }] = await elapsed(async () => {
|
|
46
47
|
try {
|
|
47
|
-
|
|
48
|
-
return response.filter(tx => tx !== undefined);
|
|
48
|
+
return await collectValidTxsFn();
|
|
49
49
|
} catch (err) {
|
|
50
50
|
this.log.error(`Error collecting txs via ${info.description}`, err, {
|
|
51
51
|
...info,
|
|
52
|
-
requestedTxs: requested
|
|
52
|
+
requestedTxs: requested,
|
|
53
53
|
});
|
|
54
|
-
return [] as Tx[];
|
|
54
|
+
return { validTxs: [] as Tx[], invalidTxHashes: [] as string[] };
|
|
55
55
|
}
|
|
56
56
|
});
|
|
57
57
|
|
|
58
|
-
if (
|
|
58
|
+
if (validTxs.length === 0 && invalidTxHashes.length === 0) {
|
|
59
59
|
this.log.trace(`No txs found via ${info.description}`, {
|
|
60
60
|
...info,
|
|
61
|
-
requestedTxs: requested
|
|
61
|
+
requestedTxs: requested,
|
|
62
62
|
});
|
|
63
|
-
return { txs, requested, duration };
|
|
63
|
+
return { txs: validTxs, requested, duration };
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
// Validate tx hashes for all collected txs from external sources
|
|
67
|
-
const validTxs: Tx[] = [];
|
|
68
|
-
const invalidTxHashes: string[] = [];
|
|
69
|
-
await Promise.all(
|
|
70
|
-
txs.map(async tx => {
|
|
71
|
-
const isValid = await tx.validateTxHash();
|
|
72
|
-
if (isValid) {
|
|
73
|
-
validTxs.push(tx);
|
|
74
|
-
} else {
|
|
75
|
-
invalidTxHashes.push(tx.getTxHash().toString());
|
|
76
|
-
}
|
|
77
|
-
}),
|
|
78
|
-
);
|
|
79
|
-
|
|
80
66
|
if (invalidTxHashes.length > 0) {
|
|
81
67
|
this.log.warn(`Rejecting ${invalidTxHashes.length} txs with invalid hashes from ${info.description}`, {
|
|
82
68
|
...info,
|
|
@@ -87,7 +73,7 @@ export class TxCollectionSink extends (EventEmitter as new () => TypedEventEmitt
|
|
|
87
73
|
if (validTxs.length === 0) {
|
|
88
74
|
this.log.trace(`No valid txs found via ${info.description} after validation`, {
|
|
89
75
|
...info,
|
|
90
|
-
requestedTxs: requested
|
|
76
|
+
requestedTxs: requested,
|
|
91
77
|
invalidTxHashes,
|
|
92
78
|
});
|
|
93
79
|
return { txs: [], requested, duration };
|
|
@@ -99,7 +85,7 @@ export class TxCollectionSink extends (EventEmitter as new () => TypedEventEmitt
|
|
|
99
85
|
...info,
|
|
100
86
|
duration,
|
|
101
87
|
txs: validTxs.map(t => t.getTxHash().toString()),
|
|
102
|
-
requestedTxs: requested
|
|
88
|
+
requestedTxs: requested,
|
|
103
89
|
rejectedCount: invalidTxHashes.length,
|
|
104
90
|
},
|
|
105
91
|
);
|
|
@@ -115,7 +101,7 @@ export class TxCollectionSink extends (EventEmitter as new () => TypedEventEmitt
|
|
|
115
101
|
// Report metrics for the collection
|
|
116
102
|
this.instrumentation.increaseTxsFor(info.method, txs.length, info.duration);
|
|
117
103
|
|
|
118
|
-
// Mark txs as found in
|
|
104
|
+
// Mark txs as found in all in-flight collection requests
|
|
119
105
|
this.emit('txs-added', { txs });
|
|
120
106
|
|
|
121
107
|
// Add the txs to the tx pool using the appropriate method based on context
|
|
@@ -2,36 +2,57 @@ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
|
2
2
|
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
3
3
|
import type { ChainConfig } from '@aztec/stdlib/config';
|
|
4
4
|
import { type AztecNode, createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
|
|
5
|
-
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
5
|
+
import type { Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
|
|
6
6
|
import { type ComponentsVersions, getComponentsVersionsFromConfig } from '@aztec/stdlib/versioning';
|
|
7
7
|
import { makeTracedFetch } from '@aztec/telemetry-client';
|
|
8
8
|
|
|
9
|
+
export type TxSourceCollectionResult = { validTxs: Tx[]; invalidTxHashes: string[] };
|
|
10
|
+
|
|
9
11
|
export interface TxSource {
|
|
10
12
|
getInfo(): string;
|
|
11
|
-
getTxsByHash(txHashes: TxHash[]): Promise<
|
|
13
|
+
getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult>;
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
export class NodeRpcTxSource implements TxSource {
|
|
15
17
|
constructor(
|
|
16
18
|
private readonly client: Pick<AztecNode, 'getTxsByHash'>,
|
|
19
|
+
private readonly txValidator: TxValidator,
|
|
17
20
|
private readonly info: string,
|
|
18
21
|
) {}
|
|
19
22
|
|
|
20
|
-
public static fromUrl(nodeUrl: string, versions: ComponentsVersions): NodeRpcTxSource {
|
|
23
|
+
public static fromUrl(nodeUrl: string, txValidator: TxValidator, versions: ComponentsVersions): NodeRpcTxSource {
|
|
21
24
|
const client = createAztecNodeClient(nodeUrl, versions, makeTracedFetch([1, 2, 3], false));
|
|
22
|
-
return new NodeRpcTxSource(client, nodeUrl);
|
|
25
|
+
return new NodeRpcTxSource(client, txValidator, nodeUrl);
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
public getInfo() {
|
|
26
29
|
return this.info;
|
|
27
30
|
}
|
|
28
31
|
|
|
29
|
-
public getTxsByHash(txHashes: TxHash[]): Promise<
|
|
30
|
-
|
|
32
|
+
public async getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult> {
|
|
33
|
+
// Collected txs feed block validation and proving, so we need their proofs.
|
|
34
|
+
return this.verifyTxs(await this.client.getTxsByHash(txHashes, { includeProof: true }));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private async verifyTxs(txs: Tx[]): Promise<TxSourceCollectionResult> {
|
|
38
|
+
// Validate tx hashes for all collected txs from external sources
|
|
39
|
+
const validTxs: Tx[] = [];
|
|
40
|
+
const invalidTxHashes: string[] = [];
|
|
41
|
+
await Promise.all(
|
|
42
|
+
txs.map(async tx => {
|
|
43
|
+
const validation = await this.txValidator.validateTx(tx);
|
|
44
|
+
if (validation.result === 'valid') {
|
|
45
|
+
validTxs.push(tx);
|
|
46
|
+
} else {
|
|
47
|
+
invalidTxHashes.push(tx.getTxHash().toString());
|
|
48
|
+
}
|
|
49
|
+
}),
|
|
50
|
+
);
|
|
51
|
+
return { validTxs: validTxs, invalidTxHashes: invalidTxHashes };
|
|
31
52
|
}
|
|
32
53
|
}
|
|
33
54
|
|
|
34
|
-
export function createNodeRpcTxSources(urls: string[], chainConfig: ChainConfig) {
|
|
55
|
+
export function createNodeRpcTxSources(urls: string[], txValidator: TxValidator, chainConfig: ChainConfig) {
|
|
35
56
|
const versions = getComponentsVersionsFromConfig(chainConfig, protocolContractsHash, getVKTreeRoot());
|
|
36
|
-
return urls.map(url => NodeRpcTxSource.fromUrl(url, versions));
|
|
57
|
+
return urls.map(url => NodeRpcTxSource.fromUrl(url, txValidator, versions));
|
|
37
58
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { FifoSet } from '@aztec/foundation/fifo-set';
|
|
1
2
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
2
3
|
import { RunningPromise } from '@aztec/foundation/promise';
|
|
3
4
|
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
@@ -10,6 +11,8 @@ import type { TxPoolV2 } from '../../mem_pools/index.js';
|
|
|
10
11
|
import type { TxFileStoreConfig } from './config.js';
|
|
11
12
|
import { TxFileStoreInstrumentation } from './instrumentation.js';
|
|
12
13
|
|
|
14
|
+
const MAX_RECENT_UPLOADS = 1000;
|
|
15
|
+
|
|
13
16
|
/**
|
|
14
17
|
* Uploads validated transactions to a file store as a fallback retrieval mechanism.
|
|
15
18
|
* Listens to TxPool txs-added events and uploads txs asynchronously with bounded concurrency.
|
|
@@ -21,9 +24,7 @@ export class TxFileStore {
|
|
|
21
24
|
private readonly handleTxsAdded: (args: { txs: Tx[]; source?: string }) => void;
|
|
22
25
|
|
|
23
26
|
/** Recently uploaded tx hashes for deduplication. */
|
|
24
|
-
private recentUploads
|
|
25
|
-
private recentUploadsOrder: string[] = [];
|
|
26
|
-
private readonly maxRecentUploads = 1000;
|
|
27
|
+
private recentUploads = FifoSet.withLimit<string>(MAX_RECENT_UPLOADS);
|
|
27
28
|
|
|
28
29
|
private constructor(
|
|
29
30
|
private readonly fileStore: FileStore,
|
|
@@ -31,6 +32,7 @@ export class TxFileStore {
|
|
|
31
32
|
private readonly config: TxFileStoreConfig,
|
|
32
33
|
private readonly instrumentation: TxFileStoreInstrumentation,
|
|
33
34
|
private readonly log: Logger,
|
|
35
|
+
private readonly basePath: string,
|
|
34
36
|
) {
|
|
35
37
|
this.handleTxsAdded = (args: { txs: Tx[]; source?: string }) => {
|
|
36
38
|
this.enqueueTxs(args.txs);
|
|
@@ -50,6 +52,7 @@ export class TxFileStore {
|
|
|
50
52
|
static async create(
|
|
51
53
|
txPool: TxPoolV2,
|
|
52
54
|
config: TxFileStoreConfig,
|
|
55
|
+
basePath: string,
|
|
53
56
|
log: Logger = createLogger('p2p:tx_file_store'),
|
|
54
57
|
telemetry: TelemetryClient = getTelemetryClient(),
|
|
55
58
|
fileStoreOverride?: FileStore,
|
|
@@ -71,8 +74,8 @@ export class TxFileStore {
|
|
|
71
74
|
}
|
|
72
75
|
|
|
73
76
|
const instrumentation = new TxFileStoreInstrumentation(telemetry, 'TxFileStore');
|
|
74
|
-
log.info('Created tx file store', { url: config.txFileStoreUrl });
|
|
75
|
-
return new TxFileStore(fileStore, txPool, config, instrumentation, log);
|
|
77
|
+
log.info('Created tx file store', { url: config.txFileStoreUrl, basePath });
|
|
78
|
+
return new TxFileStore(fileStore, txPool, config, instrumentation, log, basePath);
|
|
76
79
|
}
|
|
77
80
|
|
|
78
81
|
/** Starts listening to TxPool events and uploading txs. */
|
|
@@ -122,29 +125,16 @@ export class TxFileStore {
|
|
|
122
125
|
|
|
123
126
|
private async uploadTx(tx: Tx): Promise<void> {
|
|
124
127
|
const txHash = tx.getTxHash().toString();
|
|
125
|
-
const path =
|
|
128
|
+
const path = `${this.basePath}/txs/${txHash}.bin`;
|
|
126
129
|
const timer = new Timer();
|
|
127
130
|
|
|
128
|
-
if (this.recentUploads.
|
|
131
|
+
if (!this.recentUploads.addIfAbsent(txHash)) {
|
|
129
132
|
return;
|
|
130
133
|
}
|
|
131
134
|
|
|
132
135
|
try {
|
|
133
|
-
this.recentUploads.add(txHash);
|
|
134
|
-
this.recentUploadsOrder.push(txHash);
|
|
135
|
-
|
|
136
|
-
if (this.recentUploadsOrder.length > this.maxRecentUploads) {
|
|
137
|
-
// delete old entries in recentUploads
|
|
138
|
-
for (const txHashToRemove of this.recentUploadsOrder.splice(
|
|
139
|
-
0,
|
|
140
|
-
this.recentUploadsOrder.length - this.maxRecentUploads,
|
|
141
|
-
)) {
|
|
142
|
-
this.recentUploads.delete(txHashToRemove);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
136
|
await retry(
|
|
147
|
-
() => this.fileStore.save(path, tx.toBuffer(), { compress:
|
|
137
|
+
() => this.fileStore.save(path, tx.toBuffer(), { compress: true }),
|
|
148
138
|
`Uploading tx ${txHash}`,
|
|
149
139
|
makeBackoff([0.1, 0.5, 2]),
|
|
150
140
|
this.log,
|
|
@@ -25,13 +25,18 @@ export class TxProvider implements ITxProvider {
|
|
|
25
25
|
constructor(
|
|
26
26
|
private txCollection: TxCollection,
|
|
27
27
|
private txPool: TxPoolV2,
|
|
28
|
-
private
|
|
28
|
+
private blockProposalTransactionValidator: Pick<P2PClient, 'validateTxsReceivedInBlockProposal'>,
|
|
29
29
|
private log: Logger = createLogger('p2p:tx-collector'),
|
|
30
30
|
client: TelemetryClient = getTelemetryClient(),
|
|
31
31
|
) {
|
|
32
32
|
this.instrumentation = new TxProviderInstrumentation(client, 'TxProvider');
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
/** Returns whether each tx hash is currently in the local tx pool. */
|
|
36
|
+
public hasTxs(txHashes: TxHash[]): Promise<boolean[]> {
|
|
37
|
+
return this.txPool.hasTxs(txHashes);
|
|
38
|
+
}
|
|
39
|
+
|
|
35
40
|
/** Returns txs from the tx pool given their hashes.*/
|
|
36
41
|
public async getAvailableTxs(txHashes: TxHash[]): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
|
|
37
42
|
const response = await this.txPool.getTxsByHash(txHashes);
|
|
@@ -227,7 +232,7 @@ export class TxProvider implements ITxProvider {
|
|
|
227
232
|
if (txs.length === 0) {
|
|
228
233
|
return;
|
|
229
234
|
}
|
|
230
|
-
await this.
|
|
235
|
+
await this.blockProposalTransactionValidator.validateTxsReceivedInBlockProposal(txs);
|
|
231
236
|
await this.txPool.addProtectedTxs(txs, blockHeader);
|
|
232
237
|
}
|
|
233
238
|
}
|
|
@@ -4,10 +4,10 @@ import { SecretValue } from '@aztec/foundation/config';
|
|
|
4
4
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
6
6
|
import { sleep } from '@aztec/foundation/sleep';
|
|
7
|
-
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
8
7
|
import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
|
|
8
|
+
import { GasFees } from '@aztec/stdlib/gas';
|
|
9
9
|
import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
10
|
-
import {
|
|
10
|
+
import type { DataStoreConfig } from '@aztec/stdlib/kv-store';
|
|
11
11
|
|
|
12
12
|
import { createP2PClient } from '../client/index.js';
|
|
13
13
|
import type { P2PClient } from '../client/p2p_client.js';
|
|
@@ -98,12 +98,12 @@ export async function makeTestP2PClient(
|
|
|
98
98
|
const kvStore = await openTmpStore('test');
|
|
99
99
|
|
|
100
100
|
const client = await createP2PClient(
|
|
101
|
-
P2PClientType.Full,
|
|
102
101
|
config,
|
|
103
102
|
l2BlockSource,
|
|
104
103
|
proofVerifier,
|
|
105
104
|
mockWorldState,
|
|
106
105
|
mockEpochCache,
|
|
106
|
+
{ getCurrentMinFees: () => Promise.resolve(GasFees.empty()) },
|
|
107
107
|
'test-p2p-client',
|
|
108
108
|
undefined,
|
|
109
109
|
undefined,
|
|
@@ -114,6 +114,7 @@ export async function makeTestP2PClient(
|
|
|
114
114
|
logger,
|
|
115
115
|
p2pServiceFactory: mockGossipSubNetwork && getMockPubSubP2PServiceFactory(mockGossipSubNetwork),
|
|
116
116
|
},
|
|
117
|
+
await l2BlockSource.getInitialHeader().hash(),
|
|
117
118
|
);
|
|
118
119
|
|
|
119
120
|
return client;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
2
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
3
4
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
4
5
|
import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
5
6
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
7
|
+
import type { BlockMinFeesProvider } from '@aztec/stdlib/gas';
|
|
6
8
|
import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
7
|
-
import { P2PClientType } from '@aztec/stdlib/p2p';
|
|
8
9
|
import type { TelemetryClient } from '@aztec/telemetry-client';
|
|
9
10
|
|
|
10
11
|
import type { GossipsubEvents, GossipsubMessage } from '@chainsafe/libp2p-gossipsub';
|
|
@@ -22,15 +23,12 @@ import type { MemPools } from '../mem_pools/interface.js';
|
|
|
22
23
|
import { DummyPeerDiscoveryService, DummyPeerManager, LibP2PService } from '../services/index.js';
|
|
23
24
|
import type { P2PReqRespConfig } from '../services/reqresp/config.js';
|
|
24
25
|
import type { ConnectionSampler } from '../services/reqresp/connection-sampler/connection_sampler.js';
|
|
25
|
-
import {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
type ReqRespSubProtocolValidators,
|
|
32
|
-
type SubProtocolMap,
|
|
33
|
-
responseFromBuffer,
|
|
26
|
+
import type {
|
|
27
|
+
ReqRespInterface,
|
|
28
|
+
ReqRespResponse,
|
|
29
|
+
ReqRespSubProtocol,
|
|
30
|
+
ReqRespSubProtocolHandler,
|
|
31
|
+
ReqRespSubProtocolHandlers,
|
|
34
32
|
} from '../services/reqresp/interface.js';
|
|
35
33
|
import { ReqRespStatus } from '../services/reqresp/status.js';
|
|
36
34
|
import { GossipSubEvent } from '../types/index.js';
|
|
@@ -42,11 +40,10 @@ type GossipSubService = PubSubLibp2p['services']['pubsub'];
|
|
|
42
40
|
* Given a mock gossip sub network, returns a factory function that creates an instance LibP2PService connected to it.
|
|
43
41
|
* Designed to be used in tests in P2PClientDeps.p2pServiceFactory.
|
|
44
42
|
*/
|
|
45
|
-
export function getMockPubSubP2PServiceFactory
|
|
43
|
+
export function getMockPubSubP2PServiceFactory(
|
|
46
44
|
network: MockGossipSubNetwork,
|
|
47
|
-
): (...args: Parameters<(typeof LibP2PService
|
|
45
|
+
): (...args: Parameters<(typeof LibP2PService)['new']>) => Promise<LibP2PService> {
|
|
48
46
|
return (
|
|
49
|
-
clientType: P2PClientType,
|
|
50
47
|
config: P2PConfig,
|
|
51
48
|
peerId: PeerId,
|
|
52
49
|
deps: {
|
|
@@ -57,6 +54,7 @@ export function getMockPubSubP2PServiceFactory<T extends P2PClientType>(
|
|
|
57
54
|
proofVerifier: ClientProtocolCircuitVerifier;
|
|
58
55
|
worldStateSynchronizer: WorldStateSynchronizer;
|
|
59
56
|
peerStore: AztecAsyncKVStore;
|
|
57
|
+
blockMinFeesProvider: BlockMinFeesProvider;
|
|
60
58
|
telemetry: TelemetryClient;
|
|
61
59
|
logger: Logger;
|
|
62
60
|
},
|
|
@@ -66,8 +64,7 @@ export function getMockPubSubP2PServiceFactory<T extends P2PClientType>(
|
|
|
66
64
|
const peerManager = new DummyPeerManager(peerId, network);
|
|
67
65
|
const reqresp: ReqRespInterface = new MockReqResp(peerId, network);
|
|
68
66
|
const peerDiscoveryService = new DummyPeerDiscoveryService();
|
|
69
|
-
const service = new LibP2PService
|
|
70
|
-
clientType as T,
|
|
67
|
+
const service = new LibP2PService(
|
|
71
68
|
config,
|
|
72
69
|
libp2p,
|
|
73
70
|
peerDiscoveryService,
|
|
@@ -78,6 +75,7 @@ export function getMockPubSubP2PServiceFactory<T extends P2PClientType>(
|
|
|
78
75
|
deps.epochCache,
|
|
79
76
|
deps.proofVerifier,
|
|
80
77
|
deps.worldStateSynchronizer,
|
|
78
|
+
deps.blockMinFeesProvider,
|
|
81
79
|
deps.telemetry,
|
|
82
80
|
deps.logger,
|
|
83
81
|
);
|
|
@@ -88,8 +86,8 @@ export function getMockPubSubP2PServiceFactory<T extends P2PClientType>(
|
|
|
88
86
|
|
|
89
87
|
/**
|
|
90
88
|
* Mock implementation of ReqRespInterface that routes requests to other peers' handlers through the mock network.
|
|
91
|
-
* When a peer calls
|
|
92
|
-
*
|
|
89
|
+
* When a peer calls sendRequestToPeer, the mock looks up the target peer's registered handler for the
|
|
90
|
+
* sub-protocol and invokes it, simulating the request-response protocol without actual libp2p streams.
|
|
93
91
|
*/
|
|
94
92
|
class MockReqResp implements ReqRespInterface {
|
|
95
93
|
private handlers: Partial<ReqRespSubProtocolHandlers> = {};
|
|
@@ -103,20 +101,14 @@ class MockReqResp implements ReqRespInterface {
|
|
|
103
101
|
}
|
|
104
102
|
|
|
105
103
|
updateConfig(_config: Partial<P2PReqRespConfig>): void {}
|
|
104
|
+
setShouldRejectPeer(): void {}
|
|
106
105
|
|
|
107
|
-
start(
|
|
108
|
-
subProtocolHandlers: Partial<ReqRespSubProtocolHandlers>,
|
|
109
|
-
_subProtocolValidators: ReqRespSubProtocolValidators,
|
|
110
|
-
): Promise<void> {
|
|
106
|
+
start(subProtocolHandlers: Partial<ReqRespSubProtocolHandlers>): Promise<void> {
|
|
111
107
|
Object.assign(this.handlers, subProtocolHandlers);
|
|
112
108
|
return Promise.resolve();
|
|
113
109
|
}
|
|
114
110
|
|
|
115
|
-
addSubProtocol(
|
|
116
|
-
subProtocol: ReqRespSubProtocol,
|
|
117
|
-
handler: ReqRespSubProtocolHandler,
|
|
118
|
-
_validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
119
|
-
): Promise<void> {
|
|
111
|
+
addSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
120
112
|
this.handlers[subProtocol] = handler;
|
|
121
113
|
return Promise.resolve();
|
|
122
114
|
}
|
|
@@ -130,41 +122,6 @@ class MockReqResp implements ReqRespInterface {
|
|
|
130
122
|
return this.handlers[subProtocol];
|
|
131
123
|
}
|
|
132
124
|
|
|
133
|
-
async sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
|
|
134
|
-
subProtocol: SubProtocol,
|
|
135
|
-
requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
|
|
136
|
-
pinnedPeer: PeerId | undefined,
|
|
137
|
-
_timeoutMs?: number,
|
|
138
|
-
_maxPeers?: number,
|
|
139
|
-
_maxRetryAttempts?: number,
|
|
140
|
-
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
|
|
141
|
-
const responses: InstanceType<SubProtocolMap[SubProtocol]['response']>[] = [];
|
|
142
|
-
const peers = this.network.getReqRespPeers().filter(p => !p.peerId.equals(this.peerId));
|
|
143
|
-
const targetPeers = pinnedPeer ? peers.filter(p => p.peerId.equals(pinnedPeer)) : peers;
|
|
144
|
-
|
|
145
|
-
for (const request of requests) {
|
|
146
|
-
const requestBuffer = request.toBuffer();
|
|
147
|
-
for (const peer of targetPeers) {
|
|
148
|
-
const handler = peer.getHandler(subProtocol);
|
|
149
|
-
if (!handler) {
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
try {
|
|
153
|
-
const responseBuffer = await handler(this.peerId, requestBuffer);
|
|
154
|
-
if (responseBuffer.length > 0) {
|
|
155
|
-
const response = responseFromBuffer(subProtocol, responseBuffer);
|
|
156
|
-
responses.push(response as InstanceType<SubProtocolMap[SubProtocol]['response']>);
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
} catch (err) {
|
|
160
|
-
this.logger.debug(`Mock reqresp handler error from peer ${peer.peerId}`, { err });
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
return responses;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
125
|
async sendRequestToPeer(
|
|
169
126
|
peerId: PeerId,
|
|
170
127
|
subProtocol: ReqRespSubProtocol,
|
|
@@ -177,7 +134,12 @@ class MockReqResp implements ReqRespInterface {
|
|
|
177
134
|
return { status: ReqRespStatus.SUCCESS, data: Buffer.from([]) };
|
|
178
135
|
}
|
|
179
136
|
try {
|
|
137
|
+
const delayMs = this.network.getPropagationDelayMs();
|
|
138
|
+
if (delayMs > 0) {
|
|
139
|
+
await sleep(delayMs);
|
|
140
|
+
}
|
|
180
141
|
const data = await handler(this.peerId, payload);
|
|
142
|
+
|
|
181
143
|
return { status: ReqRespStatus.SUCCESS, data };
|
|
182
144
|
} catch {
|
|
183
145
|
return { status: ReqRespStatus.FAILURE };
|
|
@@ -215,6 +177,13 @@ export class MockPubSub implements PubSubLibp2p {
|
|
|
215
177
|
get services() {
|
|
216
178
|
return {
|
|
217
179
|
pubsub: this.gossipSub,
|
|
180
|
+
components: {
|
|
181
|
+
addressManager: {
|
|
182
|
+
addObservedAddr: () => {},
|
|
183
|
+
confirmObservedAddr: () => {},
|
|
184
|
+
removeObservedAddr: () => {},
|
|
185
|
+
},
|
|
186
|
+
},
|
|
218
187
|
};
|
|
219
188
|
}
|
|
220
189
|
|
|
@@ -245,10 +214,10 @@ class MockGossipSubService extends TypedEventEmitter<GossipsubEvents> implements
|
|
|
245
214
|
score: (_peerId: PeerIdStr) => 0,
|
|
246
215
|
};
|
|
247
216
|
|
|
248
|
-
publish(topic: TopicStr, data: Uint8Array, _opts?: PublishOpts): Promise<PublishResult> {
|
|
217
|
+
async publish(topic: TopicStr, data: Uint8Array, _opts?: PublishOpts): Promise<PublishResult> {
|
|
249
218
|
this.logger.debug(`Publishing message on topic ${topic}`, { topic, sender: this.peerId.toString() });
|
|
250
|
-
this.network.publishToPeers(topic, data, this.peerId);
|
|
251
|
-
return
|
|
219
|
+
await this.network.publishToPeers(topic, data, this.peerId);
|
|
220
|
+
return { recipients: this.network.getPeers().filter(peer => !this.peerId.equals(peer)) };
|
|
252
221
|
}
|
|
253
222
|
|
|
254
223
|
receive(msg: GossipsubMessage) {
|
|
@@ -270,11 +239,22 @@ class MockGossipSubService extends TypedEventEmitter<GossipsubEvents> implements
|
|
|
270
239
|
{ msgId, propagationSource, acceptance },
|
|
271
240
|
);
|
|
272
241
|
}
|
|
242
|
+
|
|
243
|
+
getMeshPeers(topic?: TopicStr): PeerIdStr[] {
|
|
244
|
+
if (topic && !this.subscribedTopics.has(topic)) {
|
|
245
|
+
return [];
|
|
246
|
+
}
|
|
247
|
+
return this.network
|
|
248
|
+
.getPeers()
|
|
249
|
+
.filter(peer => !this.peerId.equals(peer))
|
|
250
|
+
.map(peer => peer.toString());
|
|
251
|
+
}
|
|
273
252
|
}
|
|
274
253
|
|
|
275
254
|
/**
|
|
276
255
|
* Mock gossip sub network used for testing.
|
|
277
|
-
* All instances of MockGossipSubService connected to the same network
|
|
256
|
+
* All instances of MockGossipSubService connected to the same network receive the same messages,
|
|
257
|
+
* optionally delayed by a configurable propagation time.
|
|
278
258
|
*/
|
|
279
259
|
export class MockGossipSubNetwork {
|
|
280
260
|
private peers: MockGossipSubService[] = [];
|
|
@@ -283,6 +263,15 @@ export class MockGossipSubNetwork {
|
|
|
283
263
|
|
|
284
264
|
private logger = createLogger('p2p:test:mock-gossipsub-network');
|
|
285
265
|
|
|
266
|
+
constructor(
|
|
267
|
+
/** Artificial propagation delay in milliseconds applied to each message delivery. */
|
|
268
|
+
private propagationDelayMs: number = 0,
|
|
269
|
+
) {}
|
|
270
|
+
|
|
271
|
+
public getPropagationDelayMs(): number {
|
|
272
|
+
return this.propagationDelayMs;
|
|
273
|
+
}
|
|
274
|
+
|
|
286
275
|
public getPeers(): PeerId[] {
|
|
287
276
|
return this.peers.map(peer => peer.peerId);
|
|
288
277
|
}
|
|
@@ -299,7 +288,7 @@ export class MockGossipSubNetwork {
|
|
|
299
288
|
return this.reqRespPeers;
|
|
300
289
|
}
|
|
301
290
|
|
|
302
|
-
public publishToPeers(topic: TopicStr, data: Uint8Array, sender: PeerId): void {
|
|
291
|
+
public async publishToPeers(topic: TopicStr, data: Uint8Array, sender: PeerId): Promise<void> {
|
|
303
292
|
const msgId = (this.nextMsgId++).toString();
|
|
304
293
|
this.logger.debug(`Network is distributing message on topic ${topic}`, {
|
|
305
294
|
topic,
|
|
@@ -308,6 +297,10 @@ export class MockGossipSubNetwork {
|
|
|
308
297
|
msgId,
|
|
309
298
|
});
|
|
310
299
|
|
|
300
|
+
if (this.propagationDelayMs > 0) {
|
|
301
|
+
await sleep(this.propagationDelayMs);
|
|
302
|
+
}
|
|
303
|
+
|
|
311
304
|
const gossipSubMsg: GossipsubMessage = { msgId, msg: { type: 'unsigned', topic, data }, propagationSource: sender };
|
|
312
305
|
for (const peer of this.peers) {
|
|
313
306
|
if (peer.subscribedTopics.has(topic)) {
|