@aztec/p2p 0.0.1-commit.21caa21 → 0.0.1-commit.21ecf947b
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/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +4 -4
- package/dest/client/factory.d.ts +5 -5
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +50 -14
- package/dest/client/interface.d.ts +53 -18
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +49 -51
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +578 -258
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +36 -9
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +31 -15
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +111 -76
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +529 -289
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts +11 -8
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +17 -13
- package/dest/mem_pools/index.d.ts +3 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/index.js +1 -1
- package/dest/mem_pools/instrumentation.d.ts +7 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +31 -13
- package/dest/mem_pools/interface.d.ts +6 -7
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +37 -27
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +314 -335
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
- package/dest/mem_pools/tx_pool/index.d.ts +1 -2
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/index.js +0 -1
- package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.js +6 -1
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +11 -6
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +30 -24
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +102 -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 +242 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +119 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +89 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +131 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +72 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +63 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +201 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +7 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +95 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +128 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +105 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +345 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +57 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +160 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +71 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +780 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +52 -19
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -7
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -13
- package/dest/msg_validators/clock_tolerance.d.ts +21 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +37 -0
- package/dest/msg_validators/index.d.ts +2 -2
- package/dest/msg_validators/index.d.ts.map +1 -1
- package/dest/msg_validators/index.js +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +4 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
- package/dest/msg_validators/tx_validator/factory.d.ts +10 -4
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +22 -12
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
- package/dest/msg_validators/tx_validator/index.d.ts +2 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +23 -5
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
- 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 +10 -6
- package/dest/services/discv5/discV5_service.js +1 -1
- package/dest/services/dummy_service.d.ts +26 -2
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +48 -0
- package/dest/services/encoding.d.ts +2 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +9 -8
- 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 +161 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +324 -0
- package/dest/services/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/instrumentation.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +30 -72
- package/dest/services/libp2p/libp2p_service.d.ts +108 -36
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +984 -326
- package/dest/services/peer-manager/metrics.d.ts +7 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +33 -21
- package/dest/services/peer-manager/peer_manager.d.ts +2 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +4 -12
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +32 -6
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- package/dest/services/reqresp/interface.d.ts +13 -2
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +16 -2
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -21
- package/dest/services/reqresp/protocols/auth.d.ts +2 -2
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/auth.js +2 -2
- package/dest/services/reqresp/protocols/block.d.ts +1 -1
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block.js +3 -2
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +30 -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 +60 -14
- package/dest/services/reqresp/protocols/status.d.ts +5 -4
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +7 -3
- package/dest/services/reqresp/protocols/tx.d.ts +8 -3
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/reqresp.d.ts +6 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +471 -50
- package/dest/services/service.d.ts +53 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +22 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +56 -2
- package/dest/services/tx_collection/fast_tx_collection.d.ts +10 -6
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +34 -13
- 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 +165 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +28 -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 +59 -0
- package/dest/services/tx_collection/index.d.ts +3 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +2 -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 +10 -13
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +49 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +8 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +55 -23
- package/dest/services/tx_collection/tx_collection.d.ts +27 -14
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +79 -7
- package/dest/services/tx_collection/tx_collection_sink.d.ts +15 -6
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +13 -7
- package/dest/services/tx_file_store/config.d.ts +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +152 -0
- package/dest/services/tx_provider.d.ts +6 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +16 -6
- package/dest/services/tx_provider_instrumentation.d.ts +5 -2
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +14 -14
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.d.ts +27 -1
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +97 -2
- package/dest/test-helpers/mock-tx-helpers.js +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -2
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +2 -1
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +160 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +366 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +219 -124
- package/dest/testbench/worker_client_manager.d.ts +51 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +226 -39
- package/package.json +18 -18
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +92 -29
- package/src/client/interface.ts +63 -17
- package/src/client/p2p_client.ts +251 -302
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +58 -20
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +510 -78
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +614 -322
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +22 -15
- package/src/mem_pools/index.ts +4 -1
- package/src/mem_pools/instrumentation.ts +39 -14
- package/src/mem_pools/interface.ts +5 -7
- package/src/mem_pools/tx_pool/README.md +270 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +367 -371
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
- package/src/mem_pools/tx_pool/index.ts +0 -1
- package/src/mem_pools/tx_pool/priority.ts +8 -1
- package/src/mem_pools/tx_pool/tx_pool.ts +11 -5
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +23 -17
- package/src/mem_pools/tx_pool_v2/README.md +275 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +310 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +147 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +111 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +23 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +164 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +88 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +72 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +233 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +211 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +433 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +218 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +924 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +37 -22
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +21 -18
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
- package/src/msg_validators/tx_validator/data_validator.ts +18 -6
- package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
- package/src/msg_validators/tx_validator/factory.ts +67 -25
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
- package/src/msg_validators/tx_validator/index.ts +1 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +19 -8
- package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/test_utils.ts +1 -1
- package/src/msg_validators/tx_validator/timestamp_validator.ts +30 -19
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +1 -1
- package/src/services/dummy_service.ts +63 -0
- package/src/services/encoding.ts +8 -7
- package/src/services/gossipsub/README.md +626 -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 +451 -0
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +32 -73
- package/src/services/libp2p/libp2p_service.ts +656 -316
- package/src/services/peer-manager/metrics.ts +39 -21
- package/src/services/peer-manager/peer_manager.ts +5 -4
- package/src/services/peer-manager/peer_scoring.ts +28 -4
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/interface.ts +30 -2
- package/src/services/reqresp/metrics.ts +36 -27
- package/src/services/reqresp/protocols/auth.ts +2 -2
- package/src/services/reqresp/protocols/block.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +75 -10
- package/src/services/reqresp/protocols/status.ts +16 -12
- package/src/services/reqresp/protocols/tx.ts +23 -2
- package/src/services/reqresp/reqresp.ts +79 -22
- package/src/services/service.ts +63 -4
- package/src/services/tx_collection/config.ts +84 -2
- package/src/services/tx_collection/fast_tx_collection.ts +47 -21
- package/src/services/tx_collection/file_store_tx_collection.ts +198 -0
- package/src/services/tx_collection/file_store_tx_source.ts +73 -0
- package/src/services/tx_collection/index.ts +6 -0
- package/src/services/tx_collection/instrumentation.ts +5 -13
- package/src/services/tx_collection/proposal_tx_collector.ts +112 -0
- package/src/services/tx_collection/slow_tx_collection.ts +67 -33
- package/src/services/tx_collection/tx_collection.ts +118 -21
- package/src/services/tx_collection/tx_collection_sink.ts +17 -7
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +175 -0
- package/src/services/tx_provider.ts +27 -10
- package/src/services/tx_provider_instrumentation.ts +24 -14
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/make-test-p2p-clients.ts +3 -3
- package/src/test-helpers/mock-pubsub.ts +134 -4
- package/src/test-helpers/mock-tx-helpers.ts +1 -1
- package/src/test-helpers/reqresp-nodes.ts +3 -2
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +430 -0
- package/src/testbench/p2p_client_testbench_worker.ts +339 -120
- package/src/testbench/worker_client_manager.ts +304 -42
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -37
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -213
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -30
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -219
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -238
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
- package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/index.js +0 -1
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -298
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -287
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -283
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { compactArray } from '@aztec/foundation/collection';
|
|
2
3
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
3
4
|
import { type PromiseWithResolvers, RunningPromise } from '@aztec/foundation/promise';
|
|
5
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
4
6
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
5
7
|
import type { L2Block, L2BlockInfo } from '@aztec/stdlib/block';
|
|
6
8
|
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
@@ -10,22 +12,23 @@ import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-clien
|
|
|
10
12
|
|
|
11
13
|
import type { PeerId } from '@libp2p/interface';
|
|
12
14
|
|
|
13
|
-
import type {
|
|
14
|
-
import type {
|
|
15
|
-
import type { ReqRespInterface } from '../reqresp/interface.js';
|
|
15
|
+
import type { TxPoolV2, TxPoolV2Events } from '../../mem_pools/tx_pool_v2/interfaces.js';
|
|
16
|
+
import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
|
|
16
17
|
import type { TxCollectionConfig } from './config.js';
|
|
17
18
|
import { FastTxCollection } from './fast_tx_collection.js';
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
19
|
+
import { FileStoreTxCollection } from './file_store_tx_collection.js';
|
|
20
|
+
import type { FileStoreTxSource } from './file_store_tx_source.js';
|
|
21
|
+
import { SlowTxCollection, getProofDeadlineForSlot } from './slow_tx_collection.js';
|
|
22
|
+
import { type TxAddContext, TxCollectionSink } from './tx_collection_sink.js';
|
|
20
23
|
import type { TxSource } from './tx_source.js';
|
|
21
24
|
|
|
22
|
-
export type CollectionMethod = 'fast-req-resp' | 'fast-node-rpc' | 'slow-req-resp' | 'slow-node-rpc';
|
|
25
|
+
export type CollectionMethod = 'fast-req-resp' | 'fast-node-rpc' | 'slow-req-resp' | 'slow-node-rpc' | 'file-store';
|
|
23
26
|
|
|
24
|
-
export type MissingTxInfo = { blockNumber:
|
|
27
|
+
export type MissingTxInfo = { block: L2Block; blockNumber: BlockNumber; deadline: Date; readyForReqResp: boolean };
|
|
25
28
|
|
|
26
29
|
export type FastCollectionRequestInput =
|
|
27
30
|
| { type: 'block'; block: L2Block }
|
|
28
|
-
| { type: 'proposal'; blockProposal: BlockProposal; blockNumber:
|
|
31
|
+
| { type: 'proposal'; blockProposal: BlockProposal; blockNumber: BlockNumber };
|
|
29
32
|
|
|
30
33
|
export type FastCollectionRequest = FastCollectionRequestInput & {
|
|
31
34
|
missingTxHashes: Set<string>;
|
|
@@ -53,6 +56,12 @@ export class TxCollection {
|
|
|
53
56
|
/** Fast collection methods */
|
|
54
57
|
protected readonly fastCollection: FastTxCollection;
|
|
55
58
|
|
|
59
|
+
/** File store collection for slow (mined block) path */
|
|
60
|
+
protected readonly fileStoreSlowCollection: FileStoreTxCollection;
|
|
61
|
+
|
|
62
|
+
/** File store collection for fast (proposal/proving) path */
|
|
63
|
+
protected readonly fileStoreFastCollection: FileStoreTxCollection;
|
|
64
|
+
|
|
56
65
|
/** Loop for periodically reconciling found transactions from the tx pool in case we missed some */
|
|
57
66
|
private readonly reconcileFoundTxsLoop: RunningPromise;
|
|
58
67
|
|
|
@@ -60,17 +69,24 @@ export class TxCollection {
|
|
|
60
69
|
private readonly txCollectionSink: TxCollectionSink;
|
|
61
70
|
|
|
62
71
|
/** Handler for the txs-added event from the tx pool */
|
|
63
|
-
protected readonly handleTxsAddedToPool:
|
|
72
|
+
protected readonly handleTxsAddedToPool: TxPoolV2Events['txs-added'];
|
|
64
73
|
|
|
65
74
|
/** Handler for the txs-added event from the tx collection sink */
|
|
66
|
-
protected readonly handleTxsFound:
|
|
75
|
+
protected readonly handleTxsFound: TxPoolV2Events['txs-added'];
|
|
76
|
+
|
|
77
|
+
/** Whether the service has been started. */
|
|
78
|
+
private started = false;
|
|
79
|
+
|
|
80
|
+
/** Whether file store sources are configured. */
|
|
81
|
+
private readonly hasFileStoreSources: boolean;
|
|
67
82
|
|
|
68
83
|
constructor(
|
|
69
|
-
private readonly
|
|
84
|
+
private readonly p2pService: BatchTxRequesterLibP2PService,
|
|
70
85
|
private readonly nodes: TxSource[],
|
|
71
86
|
private readonly constants: L1RollupConstants,
|
|
72
|
-
private readonly txPool:
|
|
87
|
+
private readonly txPool: TxPoolV2,
|
|
73
88
|
private readonly config: TxCollectionConfig,
|
|
89
|
+
fileStoreSources: FileStoreTxSource[] = [],
|
|
74
90
|
private readonly dateProvider: DateProvider = new DateProvider(),
|
|
75
91
|
telemetryClient: TelemetryClient = getTelemetryClient(),
|
|
76
92
|
private readonly log: Logger = createLogger('p2p:tx_collection_service'),
|
|
@@ -78,7 +94,7 @@ export class TxCollection {
|
|
|
78
94
|
this.txCollectionSink = new TxCollectionSink(this.txPool, telemetryClient, this.log);
|
|
79
95
|
|
|
80
96
|
this.fastCollection = new FastTxCollection(
|
|
81
|
-
this.
|
|
97
|
+
this.p2pService,
|
|
82
98
|
this.nodes,
|
|
83
99
|
this.txCollectionSink,
|
|
84
100
|
this.config,
|
|
@@ -87,7 +103,7 @@ export class TxCollection {
|
|
|
87
103
|
);
|
|
88
104
|
|
|
89
105
|
this.slowCollection = new SlowTxCollection(
|
|
90
|
-
this.reqResp,
|
|
106
|
+
this.p2pService.reqResp,
|
|
91
107
|
this.nodes,
|
|
92
108
|
this.txCollectionSink,
|
|
93
109
|
this.fastCollection,
|
|
@@ -97,18 +113,42 @@ export class TxCollection {
|
|
|
97
113
|
this.log,
|
|
98
114
|
);
|
|
99
115
|
|
|
116
|
+
this.hasFileStoreSources = fileStoreSources.length > 0;
|
|
117
|
+
this.fileStoreSlowCollection = new FileStoreTxCollection(
|
|
118
|
+
fileStoreSources,
|
|
119
|
+
this.txCollectionSink,
|
|
120
|
+
{
|
|
121
|
+
workerCount: config.txCollectionFileStoreSlowWorkerCount,
|
|
122
|
+
backoffBaseMs: config.txCollectionFileStoreSlowBackoffBaseMs,
|
|
123
|
+
backoffMaxMs: config.txCollectionFileStoreSlowBackoffMaxMs,
|
|
124
|
+
},
|
|
125
|
+
this.dateProvider,
|
|
126
|
+
this.log,
|
|
127
|
+
);
|
|
128
|
+
this.fileStoreFastCollection = new FileStoreTxCollection(
|
|
129
|
+
fileStoreSources,
|
|
130
|
+
this.txCollectionSink,
|
|
131
|
+
{
|
|
132
|
+
workerCount: config.txCollectionFileStoreFastWorkerCount,
|
|
133
|
+
backoffBaseMs: config.txCollectionFileStoreFastBackoffBaseMs,
|
|
134
|
+
backoffMaxMs: config.txCollectionFileStoreFastBackoffMaxMs,
|
|
135
|
+
},
|
|
136
|
+
this.dateProvider,
|
|
137
|
+
this.log,
|
|
138
|
+
);
|
|
139
|
+
|
|
100
140
|
this.reconcileFoundTxsLoop = new RunningPromise(
|
|
101
141
|
() => this.reconcileFoundTxsWithPool(),
|
|
102
142
|
this.log,
|
|
103
143
|
this.config.txCollectionReconcileIntervalMs,
|
|
104
144
|
);
|
|
105
145
|
|
|
106
|
-
this.handleTxsFound = (args: Parameters<
|
|
146
|
+
this.handleTxsFound = (args: Parameters<TxPoolV2Events['txs-added']>[0]) => {
|
|
107
147
|
this.foundTxs(args.txs);
|
|
108
148
|
};
|
|
109
149
|
this.txCollectionSink.on('txs-added', this.handleTxsFound);
|
|
110
150
|
|
|
111
|
-
this.handleTxsAddedToPool = (args: Parameters<
|
|
151
|
+
this.handleTxsAddedToPool = (args: Parameters<TxPoolV2Events['txs-added']>[0]) => {
|
|
112
152
|
const { txs, source } = args;
|
|
113
153
|
if (source !== 'tx-collection') {
|
|
114
154
|
this.foundTxs(txs);
|
|
@@ -119,7 +159,10 @@ export class TxCollection {
|
|
|
119
159
|
|
|
120
160
|
/** Starts all collection loops. */
|
|
121
161
|
public start(): Promise<void> {
|
|
162
|
+
this.started = true;
|
|
122
163
|
this.slowCollection.start();
|
|
164
|
+
this.fileStoreSlowCollection.start();
|
|
165
|
+
this.fileStoreFastCollection.start();
|
|
123
166
|
this.reconcileFoundTxsLoop.start();
|
|
124
167
|
|
|
125
168
|
// TODO(palla/txs): Collect mined unproven tx hashes for txs we dont have in the pool and populate missingTxs on startup
|
|
@@ -128,7 +171,14 @@ export class TxCollection {
|
|
|
128
171
|
|
|
129
172
|
/** Stops all activity. */
|
|
130
173
|
public async stop() {
|
|
131
|
-
|
|
174
|
+
this.started = false;
|
|
175
|
+
await Promise.all([
|
|
176
|
+
this.slowCollection.stop(),
|
|
177
|
+
this.fastCollection.stop(),
|
|
178
|
+
this.fileStoreSlowCollection.stop(),
|
|
179
|
+
this.fileStoreFastCollection.stop(),
|
|
180
|
+
this.reconcileFoundTxsLoop.stop(),
|
|
181
|
+
]);
|
|
132
182
|
|
|
133
183
|
this.txPool.removeListener('txs-added', this.handleTxsAddedToPool);
|
|
134
184
|
this.txCollectionSink.removeListener('txs-added', this.handleTxsFound);
|
|
@@ -146,13 +196,31 @@ export class TxCollection {
|
|
|
146
196
|
|
|
147
197
|
/** Starts collecting the given tx hashes for the given L2Block in the slow loop */
|
|
148
198
|
public startCollecting(block: L2Block, txHashes: TxHash[]) {
|
|
149
|
-
|
|
199
|
+
this.slowCollection.startCollecting(block, txHashes);
|
|
200
|
+
|
|
201
|
+
// Delay file store collection to give P2P methods time to find txs first
|
|
202
|
+
if (this.hasFileStoreSources) {
|
|
203
|
+
const context: TxAddContext = { type: 'mined', block };
|
|
204
|
+
const deadline = getProofDeadlineForSlot(block.header.getSlot(), this.constants);
|
|
205
|
+
sleep(this.config.txCollectionFileStoreSlowDelayMs)
|
|
206
|
+
.then(() => {
|
|
207
|
+
if (this.started) {
|
|
208
|
+
// Only queue txs that are still missing after the delay
|
|
209
|
+
const stillMissing = new Set(this.slowCollection.getMissingTxHashes().map(h => h.toString()));
|
|
210
|
+
const remaining = txHashes.filter(h => stillMissing.has(h.toString()));
|
|
211
|
+
if (remaining.length > 0) {
|
|
212
|
+
this.fileStoreSlowCollection.startCollecting(remaining, context, deadline);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
})
|
|
216
|
+
.catch(err => this.log.error('Error in file store slow delay', err));
|
|
217
|
+
}
|
|
150
218
|
}
|
|
151
219
|
|
|
152
220
|
/** Collects the set of txs for the given block proposal as fast as possible */
|
|
153
221
|
public collectFastForProposal(
|
|
154
222
|
blockProposal: BlockProposal,
|
|
155
|
-
blockNumber:
|
|
223
|
+
blockNumber: BlockNumber,
|
|
156
224
|
txHashes: TxHash[] | string[],
|
|
157
225
|
opts: { deadline: Date; pinnedPeer?: PeerId },
|
|
158
226
|
) {
|
|
@@ -174,31 +242,60 @@ export class TxCollection {
|
|
|
174
242
|
txHashes: TxHash[] | string[],
|
|
175
243
|
opts: { deadline: Date; pinnedPeer?: PeerId },
|
|
176
244
|
) {
|
|
245
|
+
const hashes = txHashes.map(h => (typeof h === 'string' ? TxHash.fromString(h) : h));
|
|
246
|
+
|
|
247
|
+
// Delay file store collection to give P2P methods time to find txs first
|
|
248
|
+
if (this.hasFileStoreSources) {
|
|
249
|
+
const context = this.getAddContextForInput(input);
|
|
250
|
+
sleep(this.config.txCollectionFileStoreFastDelayMs)
|
|
251
|
+
.then(() => {
|
|
252
|
+
if (this.started) {
|
|
253
|
+
this.fileStoreFastCollection.startCollecting(hashes, context, opts.deadline);
|
|
254
|
+
}
|
|
255
|
+
})
|
|
256
|
+
.catch(err => this.log.error('Error in file store fast delay', err));
|
|
257
|
+
}
|
|
258
|
+
|
|
177
259
|
return this.fastCollection.collectFastFor(input, txHashes, opts);
|
|
178
260
|
}
|
|
179
261
|
|
|
262
|
+
/** Returns the TxAddContext for the given fast collection request input */
|
|
263
|
+
private getAddContextForInput(input: FastCollectionRequestInput): TxAddContext {
|
|
264
|
+
if (input.type === 'proposal') {
|
|
265
|
+
return { type: 'proposal', blockHeader: input.blockProposal.blockHeader };
|
|
266
|
+
} else {
|
|
267
|
+
return { type: 'mined', block: input.block };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
180
271
|
/** Mark the given txs as found. Stops collecting them. */
|
|
181
272
|
private foundTxs(txs: Tx[]) {
|
|
182
273
|
this.slowCollection.foundTxs(txs);
|
|
183
274
|
this.fastCollection.foundTxs(txs);
|
|
275
|
+
this.fileStoreSlowCollection.foundTxs(txs);
|
|
276
|
+
this.fileStoreFastCollection.foundTxs(txs);
|
|
184
277
|
}
|
|
185
278
|
|
|
186
279
|
/**
|
|
187
280
|
* Stop collecting all txs for blocks less than or requal to the block number specified.
|
|
188
281
|
* To be called when we no longer care about gathering txs up to a certain block, eg when they become proven or finalized.
|
|
189
282
|
*/
|
|
190
|
-
public stopCollectingForBlocksUpTo(blockNumber:
|
|
283
|
+
public stopCollectingForBlocksUpTo(blockNumber: BlockNumber): void {
|
|
191
284
|
this.slowCollection.stopCollectingForBlocksUpTo(blockNumber);
|
|
192
285
|
this.fastCollection.stopCollectingForBlocksUpTo(blockNumber);
|
|
286
|
+
this.fileStoreSlowCollection.clearPending();
|
|
287
|
+
this.fileStoreFastCollection.clearPending();
|
|
193
288
|
}
|
|
194
289
|
|
|
195
290
|
/**
|
|
196
291
|
* Stop collecting all txs for blocks greater than the block number specified.
|
|
197
292
|
* To be called when there is a chain prune and previously mined txs are no longer relevant.
|
|
198
293
|
*/
|
|
199
|
-
public stopCollectingForBlocksAfter(blockNumber:
|
|
294
|
+
public stopCollectingForBlocksAfter(blockNumber: BlockNumber): void {
|
|
200
295
|
this.slowCollection.stopCollectingForBlocksAfter(blockNumber);
|
|
201
296
|
this.fastCollection.stopCollectingForBlocksAfter(blockNumber);
|
|
297
|
+
this.fileStoreSlowCollection.clearPending();
|
|
298
|
+
this.fileStoreFastCollection.clearPending();
|
|
202
299
|
}
|
|
203
300
|
|
|
204
301
|
/** Every now and then, check if the pool has received one of the txs we are looking for, just to catch any race conditions */
|
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
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
|
-
import {
|
|
4
|
+
import type { L2Block } from '@aztec/stdlib/block';
|
|
5
|
+
import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
5
6
|
import type { TelemetryClient } from '@aztec/telemetry-client';
|
|
6
7
|
|
|
7
8
|
import EventEmitter from 'node:events';
|
|
8
9
|
|
|
9
|
-
import type {
|
|
10
|
+
import type { TxPoolV2, TxPoolV2Events } from '../../mem_pools/tx_pool_v2/interfaces.js';
|
|
10
11
|
import { TxCollectionInstrumentation } from './instrumentation.js';
|
|
11
12
|
import type { CollectionMethod } from './tx_collection.js';
|
|
12
13
|
|
|
14
|
+
/** Context determining how collected txs should be added to the pool. */
|
|
15
|
+
export type TxAddContext = { type: 'proposal'; blockHeader: BlockHeader } | { type: 'mined'; block: L2Block };
|
|
16
|
+
|
|
13
17
|
/**
|
|
14
18
|
* Executes collection requests from the fast and slow collection loops, and handles collected txs
|
|
15
19
|
* by adding them to the tx pool and emitting events, as well as handling logging and metrics.
|
|
16
20
|
*/
|
|
17
|
-
export class TxCollectionSink extends (EventEmitter as new () => TypedEventEmitter<
|
|
21
|
+
export class TxCollectionSink extends (EventEmitter as new () => TypedEventEmitter<TxPoolV2Events>) {
|
|
18
22
|
private readonly instrumentation: TxCollectionInstrumentation;
|
|
19
23
|
|
|
20
24
|
constructor(
|
|
21
|
-
private readonly txPool:
|
|
25
|
+
private readonly txPool: TxPoolV2,
|
|
22
26
|
telemetryClient: TelemetryClient,
|
|
23
27
|
private readonly log: Logger,
|
|
24
28
|
) {
|
|
@@ -30,6 +34,7 @@ export class TxCollectionSink extends (EventEmitter as new () => TypedEventEmitt
|
|
|
30
34
|
collectValidTxsFn: (txHashes: TxHash[]) => Promise<(Tx | undefined)[]>,
|
|
31
35
|
requested: TxHash[],
|
|
32
36
|
info: Record<string, any> & { description: string; method: CollectionMethod },
|
|
37
|
+
context: TxAddContext,
|
|
33
38
|
) {
|
|
34
39
|
this.log.trace(`Requesting ${requested.length} txs via ${info.description}`, {
|
|
35
40
|
...info,
|
|
@@ -99,12 +104,13 @@ export class TxCollectionSink extends (EventEmitter as new () => TypedEventEmitt
|
|
|
99
104
|
},
|
|
100
105
|
);
|
|
101
106
|
|
|
102
|
-
return await this.foundTxs(validTxs, { ...info, duration });
|
|
107
|
+
return await this.foundTxs(validTxs, { ...info, duration }, context);
|
|
103
108
|
}
|
|
104
109
|
|
|
105
110
|
private async foundTxs(
|
|
106
111
|
txs: Tx[],
|
|
107
112
|
info: Record<string, any> & { description: string; method: CollectionMethod; duration: number },
|
|
113
|
+
context: TxAddContext,
|
|
108
114
|
) {
|
|
109
115
|
// Report metrics for the collection
|
|
110
116
|
this.instrumentation.increaseTxsFor(info.method, txs.length, info.duration);
|
|
@@ -112,9 +118,13 @@ export class TxCollectionSink extends (EventEmitter as new () => TypedEventEmitt
|
|
|
112
118
|
// Mark txs as found in the slow missing txs set and all fast requests
|
|
113
119
|
this.emit('txs-added', { txs });
|
|
114
120
|
|
|
115
|
-
// Add the txs to the tx pool
|
|
121
|
+
// Add the txs to the tx pool using the appropriate method based on context
|
|
116
122
|
try {
|
|
117
|
-
|
|
123
|
+
if (context.type === 'mined') {
|
|
124
|
+
await this.txPool.addMinedTxs(txs, context.block.header, { source: 'tx-collection' });
|
|
125
|
+
} else {
|
|
126
|
+
await this.txPool.addProtectedTxs(txs, context.blockHeader, { source: 'tx-collection' });
|
|
127
|
+
}
|
|
118
128
|
} catch (err) {
|
|
119
129
|
this.log.error(`Error adding txs to the pool via ${info.description}`, err, {
|
|
120
130
|
...info,
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type ConfigMappingsType, booleanConfigHelper, numberConfigHelper } from '@aztec/foundation/config';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Configuration for the TxFileStore service.
|
|
5
|
+
*/
|
|
6
|
+
export type TxFileStoreConfig = {
|
|
7
|
+
/** URL for uploading txs to file storage (s3://, gs://, file://) */
|
|
8
|
+
txFileStoreUrl?: string;
|
|
9
|
+
/** Max concurrent uploads */
|
|
10
|
+
txFileStoreUploadConcurrency: number;
|
|
11
|
+
/** Max queue size to prevent unbounded memory growth */
|
|
12
|
+
txFileStoreMaxQueueSize: number;
|
|
13
|
+
/** Enable tx file store upload */
|
|
14
|
+
txFileStoreEnabled: boolean;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const txFileStoreConfigMappings: ConfigMappingsType<TxFileStoreConfig> = {
|
|
18
|
+
txFileStoreUrl: {
|
|
19
|
+
env: 'TX_FILE_STORE_URL',
|
|
20
|
+
description: 'URL for uploading txs to file storage (s3://, gs://, file://)',
|
|
21
|
+
},
|
|
22
|
+
txFileStoreUploadConcurrency: {
|
|
23
|
+
env: 'TX_FILE_STORE_UPLOAD_CONCURRENCY',
|
|
24
|
+
description: 'Maximum number of concurrent tx uploads',
|
|
25
|
+
...numberConfigHelper(10),
|
|
26
|
+
},
|
|
27
|
+
txFileStoreMaxQueueSize: {
|
|
28
|
+
env: 'TX_FILE_STORE_MAX_QUEUE_SIZE',
|
|
29
|
+
description: 'Maximum queue size for pending uploads (oldest dropped when exceeded)',
|
|
30
|
+
...numberConfigHelper(1000),
|
|
31
|
+
},
|
|
32
|
+
txFileStoreEnabled: {
|
|
33
|
+
env: 'TX_FILE_STORE_ENABLED',
|
|
34
|
+
description: 'Enable uploading transactions to file storage',
|
|
35
|
+
...booleanConfigHelper(false),
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Gauge, type Histogram, Metrics, type TelemetryClient, type UpDownCounter } from '@aztec/telemetry-client';
|
|
2
|
+
|
|
3
|
+
/** Instrumentation for the TxFileStore service. */
|
|
4
|
+
export class TxFileStoreInstrumentation {
|
|
5
|
+
private uploadsSuccess: UpDownCounter;
|
|
6
|
+
private uploadsFailed: UpDownCounter;
|
|
7
|
+
private uploadsSkipped: UpDownCounter;
|
|
8
|
+
private uploadDuration: Histogram;
|
|
9
|
+
private queueSize: Gauge;
|
|
10
|
+
|
|
11
|
+
constructor(client: TelemetryClient, name: string) {
|
|
12
|
+
const meter = client.getMeter(name);
|
|
13
|
+
this.uploadsSuccess = meter.createUpDownCounter(Metrics.TX_FILE_STORE_UPLOADS_SUCCESS);
|
|
14
|
+
this.uploadsFailed = meter.createUpDownCounter(Metrics.TX_FILE_STORE_UPLOADS_FAILED);
|
|
15
|
+
this.uploadsSkipped = meter.createUpDownCounter(Metrics.TX_FILE_STORE_UPLOADS_SKIPPED);
|
|
16
|
+
this.uploadDuration = meter.createHistogram(Metrics.TX_FILE_STORE_UPLOAD_DURATION);
|
|
17
|
+
this.queueSize = meter.createGauge(Metrics.TX_FILE_STORE_QUEUE_SIZE);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
recordUploadSuccess(durationMs: number) {
|
|
21
|
+
this.uploadsSuccess.add(1);
|
|
22
|
+
this.uploadDuration.record(durationMs);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
recordUploadFailed() {
|
|
26
|
+
this.uploadsFailed.add(1);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
recordUploadSkipped() {
|
|
30
|
+
this.uploadsSkipped.add(1);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
recordQueueSize(size: number) {
|
|
34
|
+
this.queueSize.record(size);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { RunningPromise } from '@aztec/foundation/promise';
|
|
3
|
+
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
4
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
5
|
+
import { type FileStore, createFileStore } from '@aztec/stdlib/file-store';
|
|
6
|
+
import type { Tx } from '@aztec/stdlib/tx';
|
|
7
|
+
import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
|
|
8
|
+
|
|
9
|
+
import type { TxPoolV2 } from '../../mem_pools/index.js';
|
|
10
|
+
import type { TxFileStoreConfig } from './config.js';
|
|
11
|
+
import { TxFileStoreInstrumentation } from './instrumentation.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Uploads validated transactions to a file store as a fallback retrieval mechanism.
|
|
15
|
+
* Listens to TxPool txs-added events and uploads txs asynchronously with bounded concurrency.
|
|
16
|
+
*/
|
|
17
|
+
export class TxFileStore {
|
|
18
|
+
private uploadQueue: Tx[] = [];
|
|
19
|
+
private activeUploads = 0;
|
|
20
|
+
private readonly queueProcessor: RunningPromise;
|
|
21
|
+
private readonly handleTxsAdded: (args: { txs: Tx[]; source?: string }) => void;
|
|
22
|
+
|
|
23
|
+
/** Recently uploaded tx hashes for deduplication. */
|
|
24
|
+
private recentUploads: Set<string> = new Set();
|
|
25
|
+
private recentUploadsOrder: string[] = [];
|
|
26
|
+
private readonly maxRecentUploads = 1000;
|
|
27
|
+
|
|
28
|
+
private constructor(
|
|
29
|
+
private readonly fileStore: FileStore,
|
|
30
|
+
private readonly txPool: TxPoolV2,
|
|
31
|
+
private readonly config: TxFileStoreConfig,
|
|
32
|
+
private readonly instrumentation: TxFileStoreInstrumentation,
|
|
33
|
+
private readonly log: Logger,
|
|
34
|
+
private readonly basePath: string,
|
|
35
|
+
) {
|
|
36
|
+
this.handleTxsAdded = (args: { txs: Tx[]; source?: string }) => {
|
|
37
|
+
this.enqueueTxs(args.txs);
|
|
38
|
+
};
|
|
39
|
+
this.queueProcessor = new RunningPromise(() => this.processQueueBatch(), this.log, 100);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Creates and initializes the file store.
|
|
44
|
+
* @param txPool - The transaction pool to listen to.
|
|
45
|
+
* @param config - The file store configuration.
|
|
46
|
+
* @param log - Optional logger.
|
|
47
|
+
* @param telemetry - Optional telemetry client.
|
|
48
|
+
* @param fileStoreOverride - Optional FileStore for testing (bypasses createFileStore).
|
|
49
|
+
* @returns The file store instance, or undefined if not configured/enabled.
|
|
50
|
+
*/
|
|
51
|
+
static async create(
|
|
52
|
+
txPool: TxPoolV2,
|
|
53
|
+
config: TxFileStoreConfig,
|
|
54
|
+
basePath: string,
|
|
55
|
+
log: Logger = createLogger('p2p:tx_file_store'),
|
|
56
|
+
telemetry: TelemetryClient = getTelemetryClient(),
|
|
57
|
+
fileStoreOverride?: FileStore,
|
|
58
|
+
): Promise<TxFileStore | undefined> {
|
|
59
|
+
if (!config.txFileStoreEnabled) {
|
|
60
|
+
log.debug('Tx file store is disabled');
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (!config.txFileStoreUrl) {
|
|
65
|
+
log.warn('Tx file store is enabled but URL is not configured');
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const fileStore = fileStoreOverride ?? (await createFileStore(config.txFileStoreUrl, log));
|
|
70
|
+
if (!fileStore) {
|
|
71
|
+
log.warn('Failed to create file store for tx file store');
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const instrumentation = new TxFileStoreInstrumentation(telemetry, 'TxFileStore');
|
|
76
|
+
log.info('Created tx file store', { url: config.txFileStoreUrl, basePath });
|
|
77
|
+
return new TxFileStore(fileStore, txPool, config, instrumentation, log, basePath);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Starts listening to TxPool events and uploading txs. */
|
|
81
|
+
public start(): void {
|
|
82
|
+
this.queueProcessor.start();
|
|
83
|
+
this.txPool.on('txs-added', this.handleTxsAdded);
|
|
84
|
+
this.log.info('Started tx file store', {
|
|
85
|
+
concurrency: this.config.txFileStoreUploadConcurrency,
|
|
86
|
+
maxQueueSize: this.config.txFileStoreMaxQueueSize,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Stops listening and waits for pending uploads to complete. */
|
|
91
|
+
public async stop(): Promise<void> {
|
|
92
|
+
this.txPool.removeListener('txs-added', this.handleTxsAdded);
|
|
93
|
+
await this.queueProcessor.stop();
|
|
94
|
+
this.log.info('Stopped tx file store');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private enqueueTxs(txs: Tx[]): void {
|
|
98
|
+
this.uploadQueue.push(...txs);
|
|
99
|
+
|
|
100
|
+
// Enforce max queue size by dropping oldest entries
|
|
101
|
+
const overflow = this.uploadQueue.length - this.config.txFileStoreMaxQueueSize;
|
|
102
|
+
if (overflow > 0) {
|
|
103
|
+
this.log.warn(`Upload queue overflow, dropping ${overflow} oldest txs`);
|
|
104
|
+
this.uploadQueue.splice(0, overflow);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
this.instrumentation.recordQueueSize(this.uploadQueue.length);
|
|
108
|
+
|
|
109
|
+
// Immediately start uploading txs
|
|
110
|
+
void this.queueProcessor.trigger();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private async processQueueBatch(): Promise<void> {
|
|
114
|
+
const batch = this.uploadQueue.splice(0, this.config.txFileStoreUploadConcurrency);
|
|
115
|
+
this.instrumentation.recordQueueSize(this.uploadQueue.length);
|
|
116
|
+
|
|
117
|
+
this.activeUploads += batch.length;
|
|
118
|
+
try {
|
|
119
|
+
await Promise.all(batch.map(tx => this.uploadTx(tx)));
|
|
120
|
+
} finally {
|
|
121
|
+
this.activeUploads -= batch.length;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private async uploadTx(tx: Tx): Promise<void> {
|
|
126
|
+
const txHash = tx.getTxHash().toString();
|
|
127
|
+
const path = `${this.basePath}/txs/${txHash}.bin`;
|
|
128
|
+
const timer = new Timer();
|
|
129
|
+
|
|
130
|
+
if (this.recentUploads.has(txHash)) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
this.recentUploads.add(txHash);
|
|
136
|
+
this.recentUploadsOrder.push(txHash);
|
|
137
|
+
|
|
138
|
+
if (this.recentUploadsOrder.length > this.maxRecentUploads) {
|
|
139
|
+
// delete old entries in recentUploads
|
|
140
|
+
for (const txHashToRemove of this.recentUploadsOrder.splice(
|
|
141
|
+
0,
|
|
142
|
+
this.recentUploadsOrder.length - this.maxRecentUploads,
|
|
143
|
+
)) {
|
|
144
|
+
this.recentUploads.delete(txHashToRemove);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
await retry(
|
|
149
|
+
() => this.fileStore.save(path, tx.toBuffer(), { compress: false }),
|
|
150
|
+
`Uploading tx ${txHash}`,
|
|
151
|
+
makeBackoff([0.1, 0.5, 2]),
|
|
152
|
+
this.log,
|
|
153
|
+
true, // failSilently - don't log errors during retries
|
|
154
|
+
);
|
|
155
|
+
const durationMs = Math.trunc(timer.ms());
|
|
156
|
+
this.log.debug(`Uploaded tx to file store`, { txHash, path, durationMs });
|
|
157
|
+
this.instrumentation.recordUploadSuccess(durationMs);
|
|
158
|
+
} catch (err) {
|
|
159
|
+
this.log.warn(`Failed to upload tx to file store after retries`, { txHash, error: err });
|
|
160
|
+
this.instrumentation.recordUploadFailed();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Waits for all queued and in-flight uploads to complete. For testing. */
|
|
165
|
+
public async flush(): Promise<void> {
|
|
166
|
+
while (this.uploadQueue.length > 0 || this.activeUploads > 0) {
|
|
167
|
+
await this.queueProcessor.trigger();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Returns the number of pending uploads (queued + in-flight). */
|
|
172
|
+
public getPendingUploadCount(): number {
|
|
173
|
+
return this.uploadQueue.length + this.activeUploads;
|
|
174
|
+
}
|
|
175
|
+
}
|