@aztec/p2p 0.0.1-commit.e558bd1c → 0.0.1-commit.e588bc7e5
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/client/factory.d.ts +9 -9
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +52 -14
- package/dest/client/interface.d.ts +47 -34
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +39 -51
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +164 -224
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +20 -10
- package/dest/config.d.ts +54 -17
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +102 -38
- 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/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +21 -12
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +75 -40
- 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 +57 -57
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -1
- 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 +2 -2
- package/dest/mem_pools/index.d.ts +2 -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 +16 -14
- package/dest/mem_pools/interface.d.ts +3 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +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 +7 -3
- 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 +2 -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 +1 -1
- 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 +7 -5
- 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 +3 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +2 -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 +30 -12
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +78 -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 +144 -19
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -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 +50 -45
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
- 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 +17 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
- 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 +364 -189
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
- package/dest/msg_validators/clock_tolerance.d.ts +1 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +4 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -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 +6 -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 +13 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
- 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 +24 -20
- 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/block_header_validator.d.ts +16 -3
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- 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 +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +35 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
- package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +247 -60
- 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 +67 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
- package/dest/msg_validators/tx_validator/index.d.ts +3 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +2 -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 +20 -4
- 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/services/dummy_service.d.ts +12 -6
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +12 -5
- package/dest/services/encoding.d.ts +7 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +18 -11
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +346 -0
- package/dest/services/libp2p/libp2p_service.d.ts +37 -23
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +291 -202
- 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 +24 -9
- package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +53 -12
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -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 +83 -106
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
- 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.js +2 -2
- package/dest/services/reqresp/interface.d.ts +10 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +15 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
- 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 +15 -0
- package/dest/services/reqresp/protocols/tx.d.ts +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +20 -0
- 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/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +30 -14
- package/dest/services/service.d.ts +26 -4
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +19 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +46 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +80 -76
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +100 -0
- package/dest/services/tx_collection/index.d.ts +2 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -0
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +2 -1
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
- 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/slow_tx_collection.d.ts +7 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +60 -26
- package/dest/services/tx_collection/tx_collection.d.ts +23 -13
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +75 -3
- package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +26 -29
- package/dest/services/tx_collection/tx_source.d.ts +13 -7
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +26 -7
- package/dest/services/tx_file_store/config.d.ts +1 -3
- package/dest/services/tx_file_store/config.d.ts.map +1 -1
- package/dest/services/tx_file_store/config.js +0 -4
- package/dest/services/tx_file_store/tx_file_store.d.ts +4 -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 +9 -6
- package/dest/services/tx_provider.d.ts +4 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +9 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +1 -2
- package/dest/test-helpers/mock-pubsub.d.ts +30 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +105 -4
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +4 -3
- package/dest/test-helpers/testbench-utils.d.ts +35 -24
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +124 -38
- package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +57 -27
- package/dest/testbench/worker_client_manager.d.ts +3 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +6 -3
- package/dest/util.d.ts +3 -3
- package/dest/util.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/client/factory.ts +102 -25
- package/src/client/interface.ts +52 -34
- package/src/client/p2p_client.ts +190 -266
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +33 -14
- package/src/config.ts +158 -44
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +104 -50
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +61 -57
- package/src/mem_pools/attestation_pool/index.ts +3 -3
- package/src/mem_pools/attestation_pool/mocks.ts +2 -1
- package/src/mem_pools/index.ts +1 -1
- package/src/mem_pools/instrumentation.ts +17 -13
- package/src/mem_pools/interface.ts +2 -2
- package/src/mem_pools/tx_pool_v2/README.md +85 -11
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- 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 +7 -3
- 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 +4 -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 +5 -5
- 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 +2 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +32 -12
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +209 -27
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +410 -187
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
- package/src/msg_validators/clock_tolerance.ts +4 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
- package/src/msg_validators/tx_validator/README.md +119 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
- 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/block_header_validator.ts +15 -3
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +42 -1
- package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
- package/src/msg_validators/tx_validator/factory.ts +394 -78
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
- package/src/msg_validators/tx_validator/index.ts +2 -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 +23 -18
- package/src/services/dummy_service.ts +18 -7
- package/src/services/encoding.ts +18 -10
- package/src/services/gossipsub/README.md +641 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +487 -0
- package/src/services/libp2p/libp2p_service.ts +307 -229
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +28 -9
- package/src/services/peer-manager/peer_scoring.ts +46 -5
- package/src/services/reqresp/README.md +229 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
- package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
- 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 +2 -2
- package/src/services/reqresp/interface.ts +26 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
- package/src/services/reqresp/protocols/tx.ts +22 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/reqresp.ts +35 -15
- package/src/services/service.ts +37 -3
- package/src/services/tx_collection/config.ts +68 -0
- package/src/services/tx_collection/fast_tx_collection.ts +83 -76
- package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
- package/src/services/tx_collection/file_store_tx_source.ts +129 -0
- package/src/services/tx_collection/index.ts +1 -0
- package/src/services/tx_collection/instrumentation.ts +7 -1
- package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/slow_tx_collection.ts +66 -33
- package/src/services/tx_collection/tx_collection.ts +114 -19
- package/src/services/tx_collection/tx_collection_sink.ts +30 -34
- package/src/services/tx_collection/tx_source.ts +28 -8
- package/src/services/tx_file_store/config.ts +0 -6
- package/src/services/tx_file_store/tx_file_store.ts +10 -8
- package/src/services/tx_provider.ts +10 -9
- package/src/test-helpers/make-test-p2p-clients.ts +4 -6
- package/src/test-helpers/mock-pubsub.ts +146 -9
- package/src/test-helpers/reqresp-nodes.ts +5 -7
- package/src/test-helpers/testbench-utils.ts +146 -43
- package/src/testbench/p2p_client_testbench_worker.ts +63 -30
- package/src/testbench/worker_client_manager.ts +13 -6
- package/src/util.ts +8 -2
- 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/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
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { times } from '@aztec/foundation/collection';
|
|
3
|
-
import { AbortError, TimeoutError } from '@aztec/foundation/error';
|
|
4
3
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
5
|
-
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
6
4
|
import { sleep } from '@aztec/foundation/sleep';
|
|
7
5
|
import { DateProvider, elapsed } from '@aztec/foundation/timer';
|
|
8
6
|
import type { L2BlockInfo } from '@aztec/stdlib/block';
|
|
9
|
-
import type { BlockProposal } from '@aztec/stdlib/p2p';
|
|
10
7
|
import { type Tx, TxHash } from '@aztec/stdlib/tx';
|
|
11
8
|
|
|
12
9
|
import type { PeerId } from '@libp2p/interface';
|
|
@@ -19,8 +16,9 @@ import {
|
|
|
19
16
|
type MissingTxsCollector,
|
|
20
17
|
SendBatchRequestCollector,
|
|
21
18
|
} from './proposal_tx_collector.js';
|
|
19
|
+
import { RequestTracker } from './request_tracker.js';
|
|
22
20
|
import type { FastCollectionRequest, FastCollectionRequestInput } from './tx_collection.js';
|
|
23
|
-
import type { TxCollectionSink } from './tx_collection_sink.js';
|
|
21
|
+
import type { TxAddContext, TxCollectionSink } from './tx_collection_sink.js';
|
|
24
22
|
import type { TxSource } from './tx_source.js';
|
|
25
23
|
|
|
26
24
|
export class FastTxCollection {
|
|
@@ -47,7 +45,9 @@ export class FastTxCollection {
|
|
|
47
45
|
}
|
|
48
46
|
|
|
49
47
|
public async stop() {
|
|
50
|
-
this.requests.forEach(request =>
|
|
48
|
+
this.requests.forEach(request => {
|
|
49
|
+
request.requestTracker.cancel();
|
|
50
|
+
});
|
|
51
51
|
await Promise.resolve();
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -74,81 +74,65 @@ export class FastTxCollection {
|
|
|
74
74
|
? { ...input.blockProposal.toBlockInfo(), blockNumber: input.blockNumber }
|
|
75
75
|
: { ...input.block.toBlockInfo() };
|
|
76
76
|
|
|
77
|
-
// This promise is used to await for the collection to finish during the main collectFast method.
|
|
78
|
-
// It gets resolved in `foundTxs` when all txs have been collected, or rejected if the request is aborted or hits the deadline.
|
|
79
|
-
const promise = promiseWithResolvers<void>();
|
|
80
|
-
setTimeout(() => promise.reject(new TimeoutError(`Timed out while collecting txs`)), timeout);
|
|
81
|
-
|
|
82
77
|
const request: FastCollectionRequest = {
|
|
83
78
|
...input,
|
|
84
79
|
blockInfo,
|
|
85
|
-
|
|
86
|
-
foundTxs: new Map<string, Tx>(),
|
|
87
|
-
missingTxHashes: new Set(txHashes.map(t => t.toString())),
|
|
88
|
-
deadline: opts.deadline,
|
|
80
|
+
requestTracker: RequestTracker.create(txHashes, opts.deadline, this.dateProvider),
|
|
89
81
|
};
|
|
90
82
|
|
|
91
83
|
const [duration] = await elapsed(() => this.collectFast(request, { ...opts }));
|
|
92
84
|
|
|
93
85
|
this.log.verbose(
|
|
94
|
-
`Collected ${request.
|
|
86
|
+
`Collected ${request.requestTracker.collectedTxs.length} txs out of ${txHashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`,
|
|
95
87
|
{
|
|
96
88
|
...blockInfo,
|
|
97
89
|
duration,
|
|
98
90
|
requestType: input.type,
|
|
99
|
-
missingTxs: [...request.missingTxHashes],
|
|
91
|
+
missingTxs: [...request.requestTracker.missingTxHashes],
|
|
100
92
|
},
|
|
101
93
|
);
|
|
102
|
-
return
|
|
94
|
+
return request.requestTracker.collectedTxs;
|
|
103
95
|
}
|
|
104
96
|
|
|
105
|
-
protected async collectFast(
|
|
106
|
-
request: FastCollectionRequest,
|
|
107
|
-
opts: { proposal?: BlockProposal; deadline: Date; pinnedPeer?: PeerId },
|
|
108
|
-
) {
|
|
97
|
+
protected async collectFast(request: FastCollectionRequest, opts: { pinnedPeer?: PeerId }) {
|
|
109
98
|
this.requests.add(request);
|
|
110
99
|
const { blockInfo } = request;
|
|
111
100
|
|
|
112
101
|
this.log.debug(
|
|
113
|
-
`Starting fast collection of ${request.
|
|
114
|
-
{ ...blockInfo, requestType: request.type, deadline:
|
|
102
|
+
`Starting fast collection of ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
|
|
103
|
+
{ ...blockInfo, requestType: request.type, deadline: request.requestTracker.deadline },
|
|
115
104
|
);
|
|
116
105
|
|
|
117
106
|
try {
|
|
118
107
|
// Start blasting all nodes for the txs. We give them a little time to respond before we start reqresp.
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
const nodeCollectionPromise = this.collectFastFromNodes(request
|
|
108
|
+
// We race against the cancellation token to exit as soon as all txs are collected, the deadline expires,
|
|
109
|
+
// or the request is externally cancelled.
|
|
110
|
+
const nodeCollectionPromise = this.collectFastFromNodes(request);
|
|
122
111
|
const waitBeforeReqResp = sleep(this.config.txCollectionFastNodesTimeoutBeforeReqRespMs);
|
|
123
|
-
await Promise.race([request.
|
|
112
|
+
await Promise.race([request.requestTracker.cancellationToken, waitBeforeReqResp]);
|
|
124
113
|
|
|
125
|
-
// If we have collected all txs, we can stop here
|
|
126
|
-
|
|
127
|
-
|
|
114
|
+
// If we have collected all txs or the request was cancelled, we can stop here.
|
|
115
|
+
// Wait for node collection to settle so inner tasks finish before we return.
|
|
116
|
+
if (request.requestTracker.checkCancelled()) {
|
|
117
|
+
if (request.requestTracker.allFetched()) {
|
|
118
|
+
this.log.debug(`All txs collected for slot ${blockInfo.slotNumber} without reqresp`, blockInfo);
|
|
119
|
+
}
|
|
120
|
+
await nodeCollectionPromise;
|
|
128
121
|
return;
|
|
129
122
|
}
|
|
130
123
|
|
|
131
124
|
// Start blasting reqresp for the remaining txs. Note that node collection keeps running in parallel.
|
|
132
125
|
// We stop when we have collected all txs, timed out, or both node collection and reqresp have given up.
|
|
133
|
-
|
|
134
|
-
await Promise.
|
|
126
|
+
// Inner tasks observe requestTracker.checkCancelled() and stop themselves, so this settles shortly after cancellation.
|
|
127
|
+
await Promise.allSettled([this.collectFastViaReqResp(request, opts), nodeCollectionPromise]);
|
|
135
128
|
} catch (err) {
|
|
136
|
-
|
|
137
|
-
const logCtx = {
|
|
129
|
+
this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, {
|
|
138
130
|
...blockInfo,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
};
|
|
142
|
-
if (err instanceof Error && err.name === 'TimeoutError') {
|
|
143
|
-
this.log.warn(`Timed out collecting txs for ${request.type} at slot ${blockInfo.slotNumber}`, logCtx);
|
|
144
|
-
} else if (err instanceof Error && err.name === 'AbortError') {
|
|
145
|
-
this.log.warn(`Aborted collecting txs for ${request.type} at slot ${blockInfo.slotNumber}`, logCtx);
|
|
146
|
-
} else {
|
|
147
|
-
this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, logCtx);
|
|
148
|
-
}
|
|
131
|
+
missingTxs: request.requestTracker.missingTxHashes.values().map(txHash => txHash.toString()),
|
|
132
|
+
});
|
|
149
133
|
} finally {
|
|
150
134
|
// Ensure no unresolved promises and remove the request from the set
|
|
151
|
-
request.
|
|
135
|
+
request.requestTracker.cancel();
|
|
152
136
|
this.requests.delete(request);
|
|
153
137
|
}
|
|
154
138
|
}
|
|
@@ -159,26 +143,28 @@ export class FastTxCollection {
|
|
|
159
143
|
* the txs that have been requested less often whenever we need to send a new batch of requests. We ensure that no
|
|
160
144
|
* tx is requested more than once at the same time to the same node.
|
|
161
145
|
*/
|
|
162
|
-
private async collectFastFromNodes(request: FastCollectionRequest
|
|
146
|
+
private async collectFastFromNodes(request: FastCollectionRequest): Promise<void> {
|
|
163
147
|
if (this.nodes.length === 0) {
|
|
164
148
|
return;
|
|
165
149
|
}
|
|
166
150
|
|
|
167
151
|
// Keep a shared priority queue of all txs pending to be requested, sorted by the number of attempts made to collect them.
|
|
168
|
-
const attemptsPerTx = [...request.missingTxHashes].map(txHash => ({
|
|
152
|
+
const attemptsPerTx = [...request.requestTracker.missingTxHashes].map(txHash => ({
|
|
153
|
+
txHash,
|
|
154
|
+
attempts: 0,
|
|
155
|
+
found: false,
|
|
156
|
+
}));
|
|
169
157
|
|
|
170
158
|
// Returns once we have finished all node loops. Each loop finishes when the deadline is hit, or all txs have been collected.
|
|
171
|
-
await Promise.allSettled(this.nodes.map(node => this.collectFastFromNode(request, node, attemptsPerTx
|
|
159
|
+
await Promise.allSettled(this.nodes.map(node => this.collectFastFromNode(request, node, attemptsPerTx)));
|
|
172
160
|
}
|
|
173
161
|
|
|
174
162
|
private async collectFastFromNode(
|
|
175
163
|
request: FastCollectionRequest,
|
|
176
164
|
node: TxSource,
|
|
177
165
|
attemptsPerTx: { txHash: string; attempts: number; found: boolean }[],
|
|
178
|
-
opts: { deadline: Date },
|
|
179
166
|
) {
|
|
180
|
-
const notFinished = () =>
|
|
181
|
-
this.dateProvider.now() <= +opts.deadline && request.missingTxHashes.size > 0 && this.requests.has(request);
|
|
167
|
+
const notFinished = () => !request.requestTracker.checkCancelled();
|
|
182
168
|
|
|
183
169
|
const maxParallelRequests = this.config.txCollectionFastMaxParallelRequestsPerNode;
|
|
184
170
|
const maxBatchSize = this.config.txCollectionNodeRpcMaxBatchSize;
|
|
@@ -195,7 +181,7 @@ export class FastTxCollection {
|
|
|
195
181
|
if (!txToRequest) {
|
|
196
182
|
// No more txs to process
|
|
197
183
|
break;
|
|
198
|
-
} else if (!request.
|
|
184
|
+
} else if (!request.requestTracker.isMissing(txToRequest.txHash)) {
|
|
199
185
|
// Mark as found if it was found somewhere else, we'll then remove it from the array.
|
|
200
186
|
// We don't delete it now since 'array.splice' is pretty expensive, so we do it after sorting.
|
|
201
187
|
txToRequest.found = true;
|
|
@@ -224,16 +210,24 @@ export class FastTxCollection {
|
|
|
224
210
|
return;
|
|
225
211
|
}
|
|
226
212
|
|
|
213
|
+
const txHashes = batch.map(({ txHash }) => txHash);
|
|
227
214
|
// Collect this batch from the node
|
|
228
215
|
await this.txCollectionSink.collect(
|
|
229
|
-
|
|
230
|
-
|
|
216
|
+
async () => {
|
|
217
|
+
const result = await node.getTxsByHash(txHashes.map(TxHash.fromString));
|
|
218
|
+
for (const tx of result.validTxs) {
|
|
219
|
+
request.requestTracker.markFetched(tx);
|
|
220
|
+
}
|
|
221
|
+
return result;
|
|
222
|
+
},
|
|
223
|
+
txHashes,
|
|
231
224
|
{
|
|
232
225
|
description: `fast ${node.getInfo()}`,
|
|
233
226
|
node: node.getInfo(),
|
|
234
227
|
method: 'fast-node-rpc',
|
|
235
228
|
...request.blockInfo,
|
|
236
229
|
},
|
|
230
|
+
this.getAddContext(request),
|
|
237
231
|
);
|
|
238
232
|
|
|
239
233
|
// Clear from the active requests the txs we just requested
|
|
@@ -241,9 +235,12 @@ export class FastTxCollection {
|
|
|
241
235
|
activeRequestsToThisNode.delete(requestedTx.txHash);
|
|
242
236
|
}
|
|
243
237
|
|
|
244
|
-
// Sleep a bit until hitting the node again
|
|
238
|
+
// Sleep a bit until hitting the node again, but wake up immediately on cancellation
|
|
245
239
|
if (notFinished()) {
|
|
246
|
-
await
|
|
240
|
+
await Promise.race([
|
|
241
|
+
sleep(this.config.txCollectionFastNodeIntervalMs),
|
|
242
|
+
request.requestTracker.cancellationToken,
|
|
243
|
+
]);
|
|
247
244
|
}
|
|
248
245
|
}
|
|
249
246
|
};
|
|
@@ -253,49 +250,64 @@ export class FastTxCollection {
|
|
|
253
250
|
}
|
|
254
251
|
|
|
255
252
|
private async collectFastViaReqResp(request: FastCollectionRequest, opts: { pinnedPeer?: PeerId }) {
|
|
256
|
-
const timeoutMs = +request.deadline - this.dateProvider.now();
|
|
257
253
|
const pinnedPeer = opts.pinnedPeer;
|
|
258
254
|
const blockInfo = request.blockInfo;
|
|
259
255
|
const slotNumber = blockInfo.slotNumber;
|
|
260
|
-
if (timeoutMs < 100) {
|
|
256
|
+
if (request.requestTracker.timeoutMs < 100) {
|
|
261
257
|
this.log.warn(
|
|
262
258
|
`Not initiating fast reqresp for txs for ${request.type} at slot ${blockInfo.slotNumber} due to timeout`,
|
|
263
|
-
{ timeoutMs, ...blockInfo },
|
|
259
|
+
{ timeoutMs: request.requestTracker.timeoutMs, ...blockInfo },
|
|
264
260
|
);
|
|
265
261
|
return;
|
|
266
262
|
}
|
|
267
263
|
|
|
268
264
|
this.log.debug(
|
|
269
|
-
`Starting fast reqresp for ${request.
|
|
270
|
-
{ ...blockInfo, timeoutMs, pinnedPeer },
|
|
265
|
+
`Starting fast reqresp for ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
|
|
266
|
+
{ ...blockInfo, timeoutMs: request.requestTracker.timeoutMs, pinnedPeer },
|
|
271
267
|
);
|
|
272
268
|
|
|
273
269
|
try {
|
|
274
270
|
await this.txCollectionSink.collect(
|
|
275
|
-
async
|
|
271
|
+
async () => {
|
|
272
|
+
let result: Tx[];
|
|
276
273
|
if (request.type === 'proposal') {
|
|
277
|
-
|
|
274
|
+
result = await this.missingTxsCollector.collectTxs(
|
|
275
|
+
request.requestTracker,
|
|
276
|
+
request.blockProposal,
|
|
277
|
+
pinnedPeer,
|
|
278
|
+
);
|
|
278
279
|
} else if (request.type === 'block') {
|
|
279
280
|
const blockTxsSource = {
|
|
280
281
|
txHashes: request.block.body.txEffects.map(e => e.txHash),
|
|
281
282
|
archive: request.block.archive.root,
|
|
282
283
|
};
|
|
283
|
-
|
|
284
|
+
result = await this.missingTxsCollector.collectTxs(request.requestTracker, blockTxsSource, pinnedPeer);
|
|
284
285
|
} else {
|
|
285
286
|
throw new Error(`Unknown request type: ${(request as any).type}`);
|
|
286
287
|
}
|
|
288
|
+
return { validTxs: result, invalidTxHashes: [] };
|
|
287
289
|
},
|
|
288
|
-
Array.from(request.missingTxHashes)
|
|
290
|
+
Array.from(request.requestTracker.missingTxHashes),
|
|
289
291
|
{ description: `reqresp for slot ${slotNumber}`, method: 'fast-req-resp', ...opts, ...request.blockInfo },
|
|
292
|
+
this.getAddContext(request),
|
|
290
293
|
);
|
|
291
294
|
} catch (err) {
|
|
292
295
|
this.log.error(`Error sending fast reqresp request for txs`, err, {
|
|
293
|
-
txs: [...request.missingTxHashes],
|
|
296
|
+
txs: [...request.requestTracker.missingTxHashes],
|
|
294
297
|
...blockInfo,
|
|
295
298
|
});
|
|
296
299
|
}
|
|
297
300
|
}
|
|
298
301
|
|
|
302
|
+
/** Returns the TxAddContext for the given request, used by the sink to add txs to the pool correctly. */
|
|
303
|
+
private getAddContext(request: FastCollectionRequest): TxAddContext {
|
|
304
|
+
if (request.type === 'proposal') {
|
|
305
|
+
return { type: 'proposal', blockHeader: request.blockProposal.blockHeader };
|
|
306
|
+
} else {
|
|
307
|
+
return { type: 'mined', block: request.block };
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
299
311
|
/**
|
|
300
312
|
* Handle txs by marking them as found for the requests that are waiting for them, and resolves the request if all its txs have been found.
|
|
301
313
|
* Called internally and from the main tx collection manager whenever the tx pool emits a tx-added event.
|
|
@@ -305,21 +317,18 @@ export class FastTxCollection {
|
|
|
305
317
|
for (const tx of txs) {
|
|
306
318
|
const txHash = tx.txHash.toString();
|
|
307
319
|
// Remove the tx hash from the missing set, and add it to the found set.
|
|
308
|
-
if (request.
|
|
309
|
-
request.missingTxHashes.delete(txHash);
|
|
310
|
-
request.foundTxs.set(txHash, tx);
|
|
320
|
+
if (request.requestTracker.markFetched(tx)) {
|
|
311
321
|
this.log.trace(`Found tx ${txHash} for fast collection request`, {
|
|
312
322
|
...request.blockInfo,
|
|
313
323
|
txHash: tx.txHash.toString(),
|
|
314
324
|
type: request.type,
|
|
315
325
|
});
|
|
316
|
-
|
|
317
|
-
if (request.missingTxHashes.size === 0) {
|
|
326
|
+
if (request.requestTracker.allFetched()) {
|
|
318
327
|
this.log.trace(`All txs found for fast collection request`, {
|
|
319
328
|
...request.blockInfo,
|
|
320
329
|
type: request.type,
|
|
321
330
|
});
|
|
322
|
-
|
|
331
|
+
break;
|
|
323
332
|
}
|
|
324
333
|
}
|
|
325
334
|
}
|
|
@@ -333,8 +342,7 @@ export class FastTxCollection {
|
|
|
333
342
|
public stopCollectingForBlocksUpTo(blockNumber: BlockNumber): void {
|
|
334
343
|
for (const request of this.requests) {
|
|
335
344
|
if (request.blockInfo.blockNumber <= blockNumber) {
|
|
336
|
-
request.
|
|
337
|
-
this.requests.delete(request);
|
|
345
|
+
request.requestTracker.cancel();
|
|
338
346
|
}
|
|
339
347
|
}
|
|
340
348
|
}
|
|
@@ -346,8 +354,7 @@ export class FastTxCollection {
|
|
|
346
354
|
public stopCollectingForBlocksAfter(blockNumber: BlockNumber): void {
|
|
347
355
|
for (const request of this.requests) {
|
|
348
356
|
if (request.blockInfo.blockNumber > blockNumber) {
|
|
349
|
-
request.
|
|
350
|
-
this.requests.delete(request);
|
|
357
|
+
request.requestTracker.cancel();
|
|
351
358
|
}
|
|
352
359
|
}
|
|
353
360
|
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { type PromiseWithResolvers, promiseWithResolvers } from '@aztec/foundation/promise';
|
|
3
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
4
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
5
|
+
import { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
6
|
+
|
|
7
|
+
import type { FileStoreTxSource } from './file_store_tx_source.js';
|
|
8
|
+
import type { TxAddContext, TxCollectionSink } from './tx_collection_sink.js';
|
|
9
|
+
|
|
10
|
+
/** Configuration for a FileStoreTxCollection instance. */
|
|
11
|
+
export type FileStoreCollectionConfig = {
|
|
12
|
+
workerCount: number;
|
|
13
|
+
backoffBaseMs: number;
|
|
14
|
+
backoffMaxMs: number;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
type FileStoreTxEntry = {
|
|
18
|
+
txHash: string;
|
|
19
|
+
context: TxAddContext;
|
|
20
|
+
deadline: Date;
|
|
21
|
+
attempts: number;
|
|
22
|
+
lastAttemptTime: number;
|
|
23
|
+
nextSourceIndex: number;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Collects txs from file stores as a fallback after P2P methods have been tried.
|
|
28
|
+
* Uses a shared worker pool that pulls entries with priority (fewest attempts first),
|
|
29
|
+
* retries with round-robin across sources, and applies exponential backoff between
|
|
30
|
+
* full cycles through all sources.
|
|
31
|
+
*/
|
|
32
|
+
export class FileStoreTxCollection {
|
|
33
|
+
/** Map from tx hash string to entry for all pending downloads. */
|
|
34
|
+
private entries = new Map<string, FileStoreTxEntry>();
|
|
35
|
+
|
|
36
|
+
/** Worker promises for the shared worker pool. */
|
|
37
|
+
private workers: Promise<void>[] = [];
|
|
38
|
+
|
|
39
|
+
/** Whether the worker pool is running. */
|
|
40
|
+
private running = false;
|
|
41
|
+
|
|
42
|
+
/** Signal used to wake sleeping workers when new entries arrive or stop is called. */
|
|
43
|
+
private wakeSignal: PromiseWithResolvers<void>;
|
|
44
|
+
|
|
45
|
+
constructor(
|
|
46
|
+
private readonly sources: FileStoreTxSource[],
|
|
47
|
+
private readonly txCollectionSink: TxCollectionSink,
|
|
48
|
+
private readonly config: FileStoreCollectionConfig,
|
|
49
|
+
private readonly dateProvider: DateProvider = new DateProvider(),
|
|
50
|
+
private readonly log: Logger = createLogger('p2p:file_store_tx_collection'),
|
|
51
|
+
) {
|
|
52
|
+
this.wakeSignal = promiseWithResolvers<void>();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Starts the shared worker pool. */
|
|
56
|
+
public start(): void {
|
|
57
|
+
if (this.sources.length === 0) {
|
|
58
|
+
this.log.debug('No file store sources configured');
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.running = true;
|
|
62
|
+
for (let i = 0; i < this.config.workerCount; i++) {
|
|
63
|
+
this.workers.push(this.workerLoop());
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Stops all workers and clears state. */
|
|
68
|
+
public async stop(): Promise<void> {
|
|
69
|
+
this.running = false;
|
|
70
|
+
this.wake();
|
|
71
|
+
await Promise.all(this.workers);
|
|
72
|
+
this.workers = [];
|
|
73
|
+
this.entries.clear();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Adds entries to the shared map and wakes workers. */
|
|
77
|
+
public startCollecting(txHashes: TxHash[], context: TxAddContext, deadline: Date): void {
|
|
78
|
+
if (this.sources.length === 0 || txHashes.length === 0) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (+deadline <= this.dateProvider.now()) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
for (const txHash of txHashes) {
|
|
86
|
+
const hashStr = txHash.toString();
|
|
87
|
+
if (!this.entries.has(hashStr)) {
|
|
88
|
+
this.entries.set(hashStr, {
|
|
89
|
+
txHash: hashStr,
|
|
90
|
+
context,
|
|
91
|
+
deadline,
|
|
92
|
+
attempts: 0,
|
|
93
|
+
lastAttemptTime: 0,
|
|
94
|
+
nextSourceIndex: Math.floor(Math.random() * this.sources.length),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
this.wake();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Removes entries for txs that have been found elsewhere. */
|
|
102
|
+
public foundTxs(txs: Tx[]): void {
|
|
103
|
+
for (const tx of txs) {
|
|
104
|
+
this.entries.delete(tx.getTxHash().toString());
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Clears all pending entries. */
|
|
109
|
+
public clearPending(): void {
|
|
110
|
+
this.entries.clear();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private async workerLoop(): Promise<void> {
|
|
114
|
+
while (this.running) {
|
|
115
|
+
const action = this.getNextAction();
|
|
116
|
+
if (action.type === 'sleep') {
|
|
117
|
+
await action.promise;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const entry = action.entry;
|
|
122
|
+
const source = this.sources[entry.nextSourceIndex % this.sources.length];
|
|
123
|
+
entry.nextSourceIndex++;
|
|
124
|
+
entry.attempts++;
|
|
125
|
+
entry.lastAttemptTime = this.dateProvider.now();
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
const result = await this.txCollectionSink.collect(
|
|
129
|
+
() => source.getTxsByHash([TxHash.fromString(entry.txHash)]),
|
|
130
|
+
[entry.txHash],
|
|
131
|
+
{
|
|
132
|
+
description: `file-store ${source.getInfo()}`,
|
|
133
|
+
method: 'file-store',
|
|
134
|
+
fileStore: source.getInfo(),
|
|
135
|
+
},
|
|
136
|
+
entry.context,
|
|
137
|
+
);
|
|
138
|
+
if (result.txs.length > 0) {
|
|
139
|
+
this.entries.delete(entry.txHash);
|
|
140
|
+
}
|
|
141
|
+
} catch (err) {
|
|
142
|
+
this.log.trace(`Error downloading tx ${entry.txHash} from ${source.getInfo()}`, { err });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Single-pass scan: removes expired entries, finds the best ready entry, or computes sleep time. */
|
|
148
|
+
private getNextAction(): { type: 'process'; entry: FileStoreTxEntry } | { type: 'sleep'; promise: Promise<void> } {
|
|
149
|
+
const now = this.dateProvider.now();
|
|
150
|
+
let best: FileStoreTxEntry | undefined;
|
|
151
|
+
let earliestReadyAt = Infinity;
|
|
152
|
+
|
|
153
|
+
for (const [key, entry] of this.entries) {
|
|
154
|
+
if (+entry.deadline <= now) {
|
|
155
|
+
this.entries.delete(key);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const backoffMs = this.getBackoffMs(entry);
|
|
159
|
+
const readyAt = entry.lastAttemptTime + backoffMs;
|
|
160
|
+
if (readyAt > now) {
|
|
161
|
+
earliestReadyAt = Math.min(earliestReadyAt, readyAt);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (!best || entry.attempts < best.attempts) {
|
|
165
|
+
best = entry;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (best) {
|
|
170
|
+
return { type: 'process', entry: best };
|
|
171
|
+
}
|
|
172
|
+
if (earliestReadyAt < Infinity) {
|
|
173
|
+
return { type: 'sleep', promise: this.sleepOrWake(earliestReadyAt - now) };
|
|
174
|
+
}
|
|
175
|
+
return { type: 'sleep', promise: this.waitForWake() };
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** Computes backoff for an entry. Backoff applies after a full cycle through all sources. */
|
|
179
|
+
private getBackoffMs(entry: FileStoreTxEntry): number {
|
|
180
|
+
const fullCycles = Math.floor(entry.attempts / this.sources.length);
|
|
181
|
+
if (fullCycles === 0) {
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
|
184
|
+
return Math.min(this.config.backoffBaseMs * Math.pow(2, fullCycles - 1), this.config.backoffMaxMs);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Resolves the current wake signal and creates a new one. */
|
|
188
|
+
private wake(): void {
|
|
189
|
+
this.wakeSignal.resolve();
|
|
190
|
+
this.wakeSignal = promiseWithResolvers<void>();
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** Waits until the wake signal is resolved. */
|
|
194
|
+
private async waitForWake(): Promise<void> {
|
|
195
|
+
await this.wakeSignal.promise;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** Sleeps for the given duration or until the wake signal is resolved. */
|
|
199
|
+
private async sleepOrWake(ms: number): Promise<void> {
|
|
200
|
+
await Promise.race([sleep(ms), this.wakeSignal.promise]);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { partitionAsync } from '@aztec/foundation/collection';
|
|
2
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
4
|
+
import { type ReadOnlyFileStore, createReadOnlyFileStore } from '@aztec/stdlib/file-store';
|
|
5
|
+
import { Tx, type TxHash, type TxValidator } from '@aztec/stdlib/tx';
|
|
6
|
+
import {
|
|
7
|
+
type Histogram,
|
|
8
|
+
Metrics,
|
|
9
|
+
type TelemetryClient,
|
|
10
|
+
type UpDownCounter,
|
|
11
|
+
getTelemetryClient,
|
|
12
|
+
} from '@aztec/telemetry-client';
|
|
13
|
+
|
|
14
|
+
import type { TxSource, TxSourceCollectionResult } from './tx_source.js';
|
|
15
|
+
|
|
16
|
+
/** TxSource implementation that downloads txs from a file store. */
|
|
17
|
+
export class FileStoreTxSource implements TxSource {
|
|
18
|
+
private downloadsSuccess: UpDownCounter;
|
|
19
|
+
private downloadsFailed: UpDownCounter;
|
|
20
|
+
private downloadDuration: Histogram;
|
|
21
|
+
private downloadSize: Histogram;
|
|
22
|
+
|
|
23
|
+
private constructor(
|
|
24
|
+
private readonly fileStore: ReadOnlyFileStore,
|
|
25
|
+
private readonly baseUrl: string,
|
|
26
|
+
private readonly basePath: string,
|
|
27
|
+
private readonly txValidator: TxValidator,
|
|
28
|
+
private readonly log: Logger,
|
|
29
|
+
telemetry: TelemetryClient,
|
|
30
|
+
) {
|
|
31
|
+
const meter = telemetry.getMeter('file-store-tx-source');
|
|
32
|
+
this.downloadsSuccess = meter.createUpDownCounter(Metrics.TX_FILE_STORE_DOWNLOADS_SUCCESS);
|
|
33
|
+
this.downloadsFailed = meter.createUpDownCounter(Metrics.TX_FILE_STORE_DOWNLOADS_FAILED);
|
|
34
|
+
this.downloadDuration = meter.createHistogram(Metrics.TX_FILE_STORE_DOWNLOAD_DURATION);
|
|
35
|
+
this.downloadSize = meter.createHistogram(Metrics.TX_FILE_STORE_DOWNLOAD_SIZE);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Creates a FileStoreTxSource from a URL.
|
|
40
|
+
* @param url - The file store URL (s3://, gs://, file://, http://, https://).
|
|
41
|
+
* @param basePath - Base path for tx files within the store.
|
|
42
|
+
* @param log - Optional logger.
|
|
43
|
+
* @param telemetry - Optional telemetry client.
|
|
44
|
+
* @returns The FileStoreTxSource instance, or undefined if creation fails.
|
|
45
|
+
*/
|
|
46
|
+
public static async create(
|
|
47
|
+
url: string,
|
|
48
|
+
basePath: string,
|
|
49
|
+
txValidator: TxValidator,
|
|
50
|
+
log: Logger = createLogger('p2p:file_store_tx_source'),
|
|
51
|
+
telemetry: TelemetryClient = getTelemetryClient(),
|
|
52
|
+
): Promise<FileStoreTxSource | undefined> {
|
|
53
|
+
try {
|
|
54
|
+
const fileStore = await createReadOnlyFileStore(url, log);
|
|
55
|
+
if (!fileStore) {
|
|
56
|
+
log.warn(`Failed to create file store for URL: ${url}`);
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
return new FileStoreTxSource(fileStore, url, basePath, txValidator, log, telemetry);
|
|
60
|
+
} catch (err) {
|
|
61
|
+
log.warn(`Error creating file store for URL: ${url}`, { error: err });
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public getInfo(): string {
|
|
67
|
+
return `file-store:${this.baseUrl}`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public async getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult> {
|
|
71
|
+
const results = await Promise.all(
|
|
72
|
+
txHashes.map(async txHash => {
|
|
73
|
+
const path = `${this.basePath}/txs/${txHash.toString()}.bin`;
|
|
74
|
+
const timer = new Timer();
|
|
75
|
+
try {
|
|
76
|
+
const buffer = await this.fileStore.read(path);
|
|
77
|
+
const tx = Tx.fromBuffer(buffer);
|
|
78
|
+
return { tx, downloadDuration: timer.ms(), downloadSize: buffer.length };
|
|
79
|
+
} catch {
|
|
80
|
+
this.downloadsFailed.add(1);
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
}),
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
const txs = results.filter(tx => tx !== undefined);
|
|
87
|
+
const [validTxs, invalidTxs] = await partitionAsync(
|
|
88
|
+
txs,
|
|
89
|
+
async ({ tx, downloadDuration, downloadSize }): Promise<boolean> => {
|
|
90
|
+
const valid = await this.txValidator.validateTx(tx);
|
|
91
|
+
if (valid.result === 'valid') {
|
|
92
|
+
this.downloadsSuccess.add(1);
|
|
93
|
+
this.downloadDuration.record(Math.ceil(downloadDuration));
|
|
94
|
+
this.downloadSize.record(downloadSize);
|
|
95
|
+
return true;
|
|
96
|
+
} else {
|
|
97
|
+
this.downloadsFailed.add(1);
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
validTxs: validTxs.map(({ tx }) => tx),
|
|
105
|
+
invalidTxHashes: invalidTxs.map(({ tx }) => tx.getTxHash().toString()),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Creates FileStoreTxSource instances from URLs.
|
|
112
|
+
* @param urls - Array of file store URLs.
|
|
113
|
+
* @param basePath - Base path for tx files within each store.
|
|
114
|
+
* @param log - Optional logger.
|
|
115
|
+
* @param telemetry - Optional telemetry client.
|
|
116
|
+
* @returns Array of successfully created FileStoreTxSource instances.
|
|
117
|
+
*/
|
|
118
|
+
export async function createFileStoreTxSources(
|
|
119
|
+
urls: string[],
|
|
120
|
+
basePath: string,
|
|
121
|
+
txValidator: TxValidator,
|
|
122
|
+
log: Logger = createLogger('p2p:file_store_tx_source'),
|
|
123
|
+
telemetry: TelemetryClient = getTelemetryClient(),
|
|
124
|
+
): Promise<FileStoreTxSource[]> {
|
|
125
|
+
const sources = await Promise.all(
|
|
126
|
+
urls.map(url => FileStoreTxSource.create(url, basePath, txValidator, log, telemetry)),
|
|
127
|
+
);
|
|
128
|
+
return sources.filter((s): s is FileStoreTxSource => s !== undefined);
|
|
129
|
+
}
|