@aztec/p2p 0.0.1-commit.7d4e6cd → 0.0.1-commit.8afd444
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 +1 -1
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +9 -6
- package/dest/client/p2p_client.d.ts +4 -2
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +16 -5
- 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 +14 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +7 -3
- 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 +20 -9
- package/dest/mem_pools/attestation_pool/mocks.d.ts +4 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +8 -5
- package/dest/mem_pools/instrumentation.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +2 -2
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +15 -10
- 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 +91 -50
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +19 -5
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +59 -3
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +79 -5
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +47 -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 +2 -2
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +4 -4
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- 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/msg_validators/attestation_validator/attestation_validator.d.ts +3 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +41 -10
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +18 -6
- 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/proposal_validator/proposal_validator.d.ts +3 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +55 -31
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +3 -3
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +93 -64
- 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 +5 -4
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +3 -2
- 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 +3 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +21 -11
- 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 +3 -2
- 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/timestamp_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
- 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 +13 -1
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +39 -0
- package/dest/services/encoding.d.ts +1 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +2 -3
- 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 +19 -8
- package/dest/services/libp2p/libp2p_service.d.ts +13 -7
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +60 -51
- package/dest/services/peer-manager/metrics.d.ts +2 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +20 -5
- 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 +8 -2
- 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 +3 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- 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 -5
- 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 +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +18 -6
- 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 +43 -13
- package/dest/services/reqresp/protocols/status.d.ts +1 -1
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +2 -1
- 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 +58 -22
- package/dest/services/service.d.ts +4 -1
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +4 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +9 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +16 -5
- 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 +9 -2
- 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 +50 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +3 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.d.ts +8 -8
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +5 -5
- package/dest/services/tx_file_store/config.d.ts +18 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +26 -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 +47 -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 +149 -0
- package/dest/services/tx_provider.d.ts +3 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +5 -5
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/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 +158 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +297 -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 +212 -132
- 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 -44
- package/package.json +16 -16
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +10 -10
- package/src/client/p2p_client.ts +20 -8
- 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 +15 -3
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +17 -9
- package/src/mem_pools/attestation_pool/mocks.ts +6 -4
- package/src/mem_pools/instrumentation.ts +2 -1
- package/src/mem_pools/tx_pool/README.md +28 -13
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +130 -75
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +66 -5
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +119 -4
- 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_reorg_rule.ts +4 -2
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -8
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +31 -31
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +91 -67
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +6 -5
- package/src/msg_validators/tx_validator/data_validator.ts +6 -2
- package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
- package/src/msg_validators/tx_validator/factory.ts +64 -23
- 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 +6 -3
- 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/timestamp_validator.ts +6 -3
- 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 +45 -0
- package/src/services/encoding.ts +2 -3
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +20 -7
- package/src/services/libp2p/libp2p_service.ts +97 -71
- package/src/services/peer-manager/metrics.ts +21 -4
- package/src/services/peer-manager/peer_scoring.ts +4 -1
- 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 +16 -0
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/interface.ts +3 -0
- package/src/services/reqresp/metrics.ts +34 -9
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +18 -4
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +51 -9
- package/src/services/reqresp/protocols/status.ts +5 -3
- package/src/services/reqresp/reqresp.ts +66 -19
- package/src/services/service.ts +4 -0
- package/src/services/tx_collection/config.ts +15 -1
- package/src/services/tx_collection/fast_tx_collection.ts +36 -13
- package/src/services/tx_collection/index.ts +5 -0
- package/src/services/tx_collection/instrumentation.ts +11 -2
- package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
- package/src/services/tx_collection/slow_tx_collection.ts +2 -2
- package/src/services/tx_collection/tx_collection.ts +8 -8
- package/src/services/tx_file_store/config.ts +43 -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 +173 -0
- package/src/services/tx_provider.ts +2 -2
- package/src/services/tx_provider_instrumentation.ts +11 -5
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +374 -0
- package/src/testbench/p2p_client_testbench_worker.ts +321 -126
- package/src/testbench/worker_client_manager.ts +304 -47
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +0 -15
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +0 -88
- package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +0 -108
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
2
|
+
import type { DateProvider } from '@aztec/foundation/timer';
|
|
3
|
+
import type { BlockProposal } from '@aztec/stdlib/p2p';
|
|
4
|
+
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
5
|
+
|
|
6
|
+
import type { PeerId } from '@libp2p/interface';
|
|
7
|
+
|
|
8
|
+
import { BatchTxRequester } from '../reqresp/batch-tx-requester/batch_tx_requester.js';
|
|
9
|
+
import type { BatchTxRequesterConfig } from '../reqresp/batch-tx-requester/config.js';
|
|
10
|
+
import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
|
|
11
|
+
import type { IBatchRequestTxValidator } from '../reqresp/batch-tx-requester/tx_validator.js';
|
|
12
|
+
import { ReqRespSubProtocol } from '../reqresp/interface.js';
|
|
13
|
+
import { chunkTxHashesRequest } from '../reqresp/protocols/tx.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Strategy interface for collecting transactions for block proposals.
|
|
17
|
+
* Allows swapping between different tx collection implementations for benchmarking.
|
|
18
|
+
*/
|
|
19
|
+
export interface ProposalTxCollector {
|
|
20
|
+
/**
|
|
21
|
+
* Collect transactions for a block proposal.
|
|
22
|
+
* @param txHashes - The transaction hashes to collect
|
|
23
|
+
* @param blockProposal - The block proposal containing the transactions
|
|
24
|
+
* @param pinnedPeer - Optional peer that sent the proposal (expected to have all txs)
|
|
25
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
26
|
+
* @returns The collected transactions
|
|
27
|
+
*/
|
|
28
|
+
collectTxs(
|
|
29
|
+
txHashes: TxHash[],
|
|
30
|
+
blockProposal: BlockProposal,
|
|
31
|
+
pinnedPeer: PeerId | undefined,
|
|
32
|
+
timeoutMs: number,
|
|
33
|
+
): Promise<Tx[]>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Collects transactions using the BatchTxRequester implementation.
|
|
38
|
+
* This uses a smart/dumb peer strategy with parallel workers.
|
|
39
|
+
*/
|
|
40
|
+
export class BatchTxRequesterCollector implements ProposalTxCollector {
|
|
41
|
+
constructor(
|
|
42
|
+
private p2pService: BatchTxRequesterLibP2PService,
|
|
43
|
+
private log: Logger,
|
|
44
|
+
private dateProvider: DateProvider,
|
|
45
|
+
private txValidator?: IBatchRequestTxValidator,
|
|
46
|
+
private batchTxRequesterConfig?: Partial<BatchTxRequesterConfig>,
|
|
47
|
+
) {}
|
|
48
|
+
|
|
49
|
+
async collectTxs(
|
|
50
|
+
txHashes: TxHash[],
|
|
51
|
+
blockProposal: BlockProposal,
|
|
52
|
+
pinnedPeer: PeerId | undefined,
|
|
53
|
+
timeoutMs: number,
|
|
54
|
+
): Promise<Tx[]> {
|
|
55
|
+
const {
|
|
56
|
+
batchTxRequesterSmartParallelWorkerCount: smartParallelWorkerCount,
|
|
57
|
+
batchTxRequesterDumbParallelWorkerCount: dumbParallelWorkerCount,
|
|
58
|
+
batchTxRequesterTxBatchSize: txBatchSize,
|
|
59
|
+
batchTxRequesterBadPeerThreshold: badPeerThreshold,
|
|
60
|
+
} = this.batchTxRequesterConfig ?? {};
|
|
61
|
+
|
|
62
|
+
const batchRequester = new BatchTxRequester(
|
|
63
|
+
txHashes,
|
|
64
|
+
blockProposal,
|
|
65
|
+
pinnedPeer,
|
|
66
|
+
timeoutMs,
|
|
67
|
+
this.p2pService,
|
|
68
|
+
this.log,
|
|
69
|
+
this.dateProvider,
|
|
70
|
+
{
|
|
71
|
+
smartParallelWorkerCount,
|
|
72
|
+
dumbParallelWorkerCount,
|
|
73
|
+
txBatchSize,
|
|
74
|
+
badPeerThreshold,
|
|
75
|
+
txValidator: this.txValidator,
|
|
76
|
+
},
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
return await BatchTxRequester.collectAllTxs(batchRequester.run());
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const DEFAULT_MAX_PEERS = 10;
|
|
84
|
+
const DEFAULT_MAX_RETRY_ATTEMPTS = 3;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Collects transactions using the sendBatchRequest implementation from ReqResp.
|
|
88
|
+
* This is the original implementation that balances requests across peers.
|
|
89
|
+
*/
|
|
90
|
+
export class SendBatchRequestCollector implements ProposalTxCollector {
|
|
91
|
+
constructor(
|
|
92
|
+
private p2pService: BatchTxRequesterLibP2PService,
|
|
93
|
+
private maxPeers: number = DEFAULT_MAX_PEERS,
|
|
94
|
+
private maxRetryAttempts: number = DEFAULT_MAX_RETRY_ATTEMPTS,
|
|
95
|
+
) {}
|
|
96
|
+
|
|
97
|
+
async collectTxs(
|
|
98
|
+
txHashes: TxHash[],
|
|
99
|
+
_blockProposal: BlockProposal,
|
|
100
|
+
pinnedPeer: PeerId | undefined,
|
|
101
|
+
timeoutMs: number,
|
|
102
|
+
): Promise<Tx[]> {
|
|
103
|
+
const txs = await this.p2pService.reqResp.sendBatchRequest<ReqRespSubProtocol.TX>(
|
|
104
|
+
ReqRespSubProtocol.TX,
|
|
105
|
+
chunkTxHashesRequest(txHashes),
|
|
106
|
+
pinnedPeer,
|
|
107
|
+
timeoutMs,
|
|
108
|
+
this.maxPeers,
|
|
109
|
+
this.maxRetryAttempts,
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
return txs.flat();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -4,7 +4,7 @@ import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
|
4
4
|
import { boundInclusive } from '@aztec/foundation/number';
|
|
5
5
|
import { RunningPromise } from '@aztec/foundation/promise';
|
|
6
6
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
7
|
-
import type {
|
|
7
|
+
import type { L2Block } from '@aztec/stdlib/block';
|
|
8
8
|
import { type L1RollupConstants, getEpochAtSlot, getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
9
9
|
import { type Tx, TxHash } from '@aztec/stdlib/tx';
|
|
10
10
|
|
|
@@ -76,7 +76,7 @@ export class SlowTxCollection {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
/** Starts collecting the given tx hashes for the given L2Block in the slow loop */
|
|
79
|
-
public startCollecting(block:
|
|
79
|
+
public startCollecting(block: L2Block, txHashes: TxHash[]) {
|
|
80
80
|
const slot = block.header.getSlot();
|
|
81
81
|
const deadline = this.getDeadlineForSlot(slot);
|
|
82
82
|
if (+deadline < this.dateProvider.now()) {
|
|
@@ -3,7 +3,7 @@ import { compactArray } from '@aztec/foundation/collection';
|
|
|
3
3
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { type PromiseWithResolvers, RunningPromise } from '@aztec/foundation/promise';
|
|
5
5
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
6
|
-
import type {
|
|
6
|
+
import type { L2Block, L2BlockInfo } from '@aztec/stdlib/block';
|
|
7
7
|
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
8
8
|
import type { BlockProposal } from '@aztec/stdlib/p2p';
|
|
9
9
|
import { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
@@ -13,7 +13,7 @@ import type { PeerId } from '@libp2p/interface';
|
|
|
13
13
|
|
|
14
14
|
import type { TxPool } from '../../mem_pools/index.js';
|
|
15
15
|
import type { TxPoolEvents } from '../../mem_pools/tx_pool/tx_pool.js';
|
|
16
|
-
import type {
|
|
16
|
+
import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
|
|
17
17
|
import type { TxCollectionConfig } from './config.js';
|
|
18
18
|
import { FastTxCollection } from './fast_tx_collection.js';
|
|
19
19
|
import { SlowTxCollection } from './slow_tx_collection.js';
|
|
@@ -25,7 +25,7 @@ export type CollectionMethod = 'fast-req-resp' | 'fast-node-rpc' | 'slow-req-res
|
|
|
25
25
|
export type MissingTxInfo = { blockNumber: BlockNumber; deadline: Date; readyForReqResp: boolean };
|
|
26
26
|
|
|
27
27
|
export type FastCollectionRequestInput =
|
|
28
|
-
| { type: 'block'; block:
|
|
28
|
+
| { type: 'block'; block: L2Block }
|
|
29
29
|
| { type: 'proposal'; blockProposal: BlockProposal; blockNumber: BlockNumber };
|
|
30
30
|
|
|
31
31
|
export type FastCollectionRequest = FastCollectionRequestInput & {
|
|
@@ -67,7 +67,7 @@ export class TxCollection {
|
|
|
67
67
|
protected readonly handleTxsFound: TxPoolEvents['txs-added'];
|
|
68
68
|
|
|
69
69
|
constructor(
|
|
70
|
-
private readonly
|
|
70
|
+
private readonly p2pService: BatchTxRequesterLibP2PService,
|
|
71
71
|
private readonly nodes: TxSource[],
|
|
72
72
|
private readonly constants: L1RollupConstants,
|
|
73
73
|
private readonly txPool: TxPool,
|
|
@@ -79,7 +79,7 @@ export class TxCollection {
|
|
|
79
79
|
this.txCollectionSink = new TxCollectionSink(this.txPool, telemetryClient, this.log);
|
|
80
80
|
|
|
81
81
|
this.fastCollection = new FastTxCollection(
|
|
82
|
-
this.
|
|
82
|
+
this.p2pService,
|
|
83
83
|
this.nodes,
|
|
84
84
|
this.txCollectionSink,
|
|
85
85
|
this.config,
|
|
@@ -88,7 +88,7 @@ export class TxCollection {
|
|
|
88
88
|
);
|
|
89
89
|
|
|
90
90
|
this.slowCollection = new SlowTxCollection(
|
|
91
|
-
this.reqResp,
|
|
91
|
+
this.p2pService.reqResp,
|
|
92
92
|
this.nodes,
|
|
93
93
|
this.txCollectionSink,
|
|
94
94
|
this.fastCollection,
|
|
@@ -146,7 +146,7 @@ export class TxCollection {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
/** Starts collecting the given tx hashes for the given L2Block in the slow loop */
|
|
149
|
-
public startCollecting(block:
|
|
149
|
+
public startCollecting(block: L2Block, txHashes: TxHash[]) {
|
|
150
150
|
return this.slowCollection.startCollecting(block, txHashes);
|
|
151
151
|
}
|
|
152
152
|
|
|
@@ -162,7 +162,7 @@ export class TxCollection {
|
|
|
162
162
|
|
|
163
163
|
/** Collects the set of txs for the given mined block as fast as possible */
|
|
164
164
|
public collectFastForBlock(
|
|
165
|
-
block:
|
|
165
|
+
block: L2Block,
|
|
166
166
|
txHashes: TxHash[] | string[],
|
|
167
167
|
opts: { deadline: Date; pinnedPeer?: PeerId },
|
|
168
168
|
) {
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
/** URL for downloading txs from file storage */
|
|
10
|
+
txFileStoreDownloadUrl?: string;
|
|
11
|
+
/** Max concurrent uploads */
|
|
12
|
+
txFileStoreUploadConcurrency: number;
|
|
13
|
+
/** Max queue size to prevent unbounded memory growth */
|
|
14
|
+
txFileStoreMaxQueueSize: number;
|
|
15
|
+
/** Enable tx file store upload */
|
|
16
|
+
txFileStoreEnabled: boolean;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const txFileStoreConfigMappings: ConfigMappingsType<TxFileStoreConfig> = {
|
|
20
|
+
txFileStoreUrl: {
|
|
21
|
+
env: 'TX_FILE_STORE_URL',
|
|
22
|
+
description: 'URL for uploading txs to file storage (s3://, gs://, file://)',
|
|
23
|
+
},
|
|
24
|
+
txFileStoreDownloadUrl: {
|
|
25
|
+
env: 'TX_FILE_STORE_DOWNLOAD_URL',
|
|
26
|
+
description: 'URL for downloading txs from file storage',
|
|
27
|
+
},
|
|
28
|
+
txFileStoreUploadConcurrency: {
|
|
29
|
+
env: 'TX_FILE_STORE_UPLOAD_CONCURRENCY',
|
|
30
|
+
description: 'Maximum number of concurrent tx uploads',
|
|
31
|
+
...numberConfigHelper(10),
|
|
32
|
+
},
|
|
33
|
+
txFileStoreMaxQueueSize: {
|
|
34
|
+
env: 'TX_FILE_STORE_MAX_QUEUE_SIZE',
|
|
35
|
+
description: 'Maximum queue size for pending uploads (oldest dropped when exceeded)',
|
|
36
|
+
...numberConfigHelper(1000),
|
|
37
|
+
},
|
|
38
|
+
txFileStoreEnabled: {
|
|
39
|
+
env: 'TX_FILE_STORE_ENABLED',
|
|
40
|
+
description: 'Enable uploading transactions to file storage',
|
|
41
|
+
...booleanConfigHelper(false),
|
|
42
|
+
},
|
|
43
|
+
};
|
|
@@ -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,173 @@
|
|
|
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 { TxPool, TxPoolEvents } from '../../mem_pools/tx_pool/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: TxPoolEvents['txs-added'];
|
|
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: TxPool,
|
|
31
|
+
private readonly config: TxFileStoreConfig,
|
|
32
|
+
private readonly instrumentation: TxFileStoreInstrumentation,
|
|
33
|
+
private readonly log: Logger,
|
|
34
|
+
) {
|
|
35
|
+
this.handleTxsAdded = (args: { txs: Tx[]; source?: string }) => {
|
|
36
|
+
this.enqueueTxs(args.txs);
|
|
37
|
+
};
|
|
38
|
+
this.queueProcessor = new RunningPromise(() => this.processQueueBatch(), this.log, 100);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Creates and initializes the file store.
|
|
43
|
+
* @param txPool - The transaction pool to listen to.
|
|
44
|
+
* @param config - The file store configuration.
|
|
45
|
+
* @param log - Optional logger.
|
|
46
|
+
* @param telemetry - Optional telemetry client.
|
|
47
|
+
* @param fileStoreOverride - Optional FileStore for testing (bypasses createFileStore).
|
|
48
|
+
* @returns The file store instance, or undefined if not configured/enabled.
|
|
49
|
+
*/
|
|
50
|
+
static async create(
|
|
51
|
+
txPool: TxPool,
|
|
52
|
+
config: TxFileStoreConfig,
|
|
53
|
+
log: Logger = createLogger('p2p:tx_file_store'),
|
|
54
|
+
telemetry: TelemetryClient = getTelemetryClient(),
|
|
55
|
+
fileStoreOverride?: FileStore,
|
|
56
|
+
): Promise<TxFileStore | undefined> {
|
|
57
|
+
if (!config.txFileStoreEnabled) {
|
|
58
|
+
log.debug('Tx file store is disabled');
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (!config.txFileStoreUrl) {
|
|
63
|
+
log.warn('Tx file store is enabled but URL is not configured');
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const fileStore = fileStoreOverride ?? (await createFileStore(config.txFileStoreUrl, log));
|
|
68
|
+
if (!fileStore) {
|
|
69
|
+
log.warn('Failed to create file store for tx file store');
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const instrumentation = new TxFileStoreInstrumentation(telemetry, 'TxFileStore');
|
|
74
|
+
log.info('Created tx file store', { url: config.txFileStoreUrl });
|
|
75
|
+
return new TxFileStore(fileStore, txPool, config, instrumentation, log);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Starts listening to TxPool events and uploading txs. */
|
|
79
|
+
public start(): void {
|
|
80
|
+
this.queueProcessor.start();
|
|
81
|
+
this.txPool.on('txs-added', this.handleTxsAdded);
|
|
82
|
+
this.log.info('Started tx file store', {
|
|
83
|
+
concurrency: this.config.txFileStoreUploadConcurrency,
|
|
84
|
+
maxQueueSize: this.config.txFileStoreMaxQueueSize,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Stops listening and waits for pending uploads to complete. */
|
|
89
|
+
public async stop(): Promise<void> {
|
|
90
|
+
this.txPool.removeListener('txs-added', this.handleTxsAdded);
|
|
91
|
+
await this.queueProcessor.stop();
|
|
92
|
+
this.log.info('Stopped tx file store');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private enqueueTxs(txs: Tx[]): void {
|
|
96
|
+
this.uploadQueue.push(...txs);
|
|
97
|
+
|
|
98
|
+
// Enforce max queue size by dropping oldest entries
|
|
99
|
+
const overflow = this.uploadQueue.length - this.config.txFileStoreMaxQueueSize;
|
|
100
|
+
if (overflow > 0) {
|
|
101
|
+
this.log.warn(`Upload queue overflow, dropping ${overflow} oldest txs`);
|
|
102
|
+
this.uploadQueue.splice(0, overflow);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
this.instrumentation.recordQueueSize(this.uploadQueue.length);
|
|
106
|
+
|
|
107
|
+
// Immediately start uploading txs
|
|
108
|
+
void this.queueProcessor.trigger();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private async processQueueBatch(): Promise<void> {
|
|
112
|
+
const batch = this.uploadQueue.splice(0, this.config.txFileStoreUploadConcurrency);
|
|
113
|
+
this.instrumentation.recordQueueSize(this.uploadQueue.length);
|
|
114
|
+
|
|
115
|
+
this.activeUploads += batch.length;
|
|
116
|
+
try {
|
|
117
|
+
await Promise.all(batch.map(tx => this.uploadTx(tx)));
|
|
118
|
+
} finally {
|
|
119
|
+
this.activeUploads -= batch.length;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
private async uploadTx(tx: Tx): Promise<void> {
|
|
124
|
+
const txHash = tx.getTxHash().toString();
|
|
125
|
+
const path = `txs/${txHash}.bin`;
|
|
126
|
+
const timer = new Timer();
|
|
127
|
+
|
|
128
|
+
if (this.recentUploads.has(txHash)) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
try {
|
|
133
|
+
this.recentUploads.add(txHash);
|
|
134
|
+
this.recentUploadsOrder.push(txHash);
|
|
135
|
+
|
|
136
|
+
if (this.recentUploadsOrder.length > this.maxRecentUploads) {
|
|
137
|
+
// delete old entries in recentUploads
|
|
138
|
+
for (const txHashToRemove of this.recentUploadsOrder.splice(
|
|
139
|
+
0,
|
|
140
|
+
this.recentUploadsOrder.length - this.maxRecentUploads,
|
|
141
|
+
)) {
|
|
142
|
+
this.recentUploads.delete(txHashToRemove);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
await retry(
|
|
147
|
+
() => this.fileStore.save(path, tx.toBuffer(), { compress: false }),
|
|
148
|
+
`Uploading tx ${txHash}`,
|
|
149
|
+
makeBackoff([0.1, 0.5, 2]),
|
|
150
|
+
this.log,
|
|
151
|
+
true, // failSilently - don't log errors during retries
|
|
152
|
+
);
|
|
153
|
+
const durationMs = Math.trunc(timer.ms());
|
|
154
|
+
this.log.debug(`Uploaded tx to file store`, { txHash, path, durationMs });
|
|
155
|
+
this.instrumentation.recordUploadSuccess(durationMs);
|
|
156
|
+
} catch (err) {
|
|
157
|
+
this.log.warn(`Failed to upload tx to file store after retries`, { txHash, error: err });
|
|
158
|
+
this.instrumentation.recordUploadFailed();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Waits for all queued and in-flight uploads to complete. For testing. */
|
|
163
|
+
public async flush(): Promise<void> {
|
|
164
|
+
while (this.uploadQueue.length > 0 || this.activeUploads > 0) {
|
|
165
|
+
await this.queueProcessor.trigger();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Returns the number of pending uploads (queued + in-flight). */
|
|
170
|
+
public getPendingUploadCount(): number {
|
|
171
|
+
return this.uploadQueue.length + this.activeUploads;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -2,7 +2,7 @@ import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
|
2
2
|
import { compactArray } from '@aztec/foundation/collection';
|
|
3
3
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { elapsed } from '@aztec/foundation/timer';
|
|
5
|
-
import type {
|
|
5
|
+
import type { L2Block, L2BlockInfo } from '@aztec/stdlib/block';
|
|
6
6
|
import type { ITxProvider } from '@aztec/stdlib/interfaces/server';
|
|
7
7
|
import type { BlockProposal } from '@aztec/stdlib/p2p';
|
|
8
8
|
import { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
@@ -68,7 +68,7 @@ export class TxProvider implements ITxProvider {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
/** Gathers txs from the tx pool, remote rpc nodes, and reqresp. */
|
|
71
|
-
public getTxsForBlock(block:
|
|
71
|
+
public getTxsForBlock(block: L2Block, opts: { deadline: Date }): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
|
|
72
72
|
return this.getOrderedTxsFromAllSources(
|
|
73
73
|
{ type: 'block', block },
|
|
74
74
|
block.toBlockInfo(),
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
type Histogram,
|
|
3
|
+
Metrics,
|
|
4
|
+
type TelemetryClient,
|
|
5
|
+
type UpDownCounter,
|
|
6
|
+
createUpDownCounterWithDefault,
|
|
7
|
+
} from '@aztec/telemetry-client';
|
|
2
8
|
|
|
3
9
|
export class TxProviderInstrumentation {
|
|
4
10
|
private txFromProposalCount: UpDownCounter;
|
|
@@ -12,13 +18,13 @@ export class TxProviderInstrumentation {
|
|
|
12
18
|
constructor(client: TelemetryClient, name: string) {
|
|
13
19
|
const meter = client.getMeter(name);
|
|
14
20
|
|
|
15
|
-
this.txFromProposalCount = meter
|
|
21
|
+
this.txFromProposalCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_PROPOSALS_COUNT);
|
|
16
22
|
|
|
17
|
-
this.txFromMempoolCount = meter
|
|
23
|
+
this.txFromMempoolCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_MEMPOOL_COUNT);
|
|
18
24
|
|
|
19
|
-
this.txFromP2PCount = meter
|
|
25
|
+
this.txFromP2PCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_TXS_FROM_P2P_COUNT);
|
|
20
26
|
|
|
21
|
-
this.missingTxsCount = meter
|
|
27
|
+
this.missingTxsCount = createUpDownCounterWithDefault(meter, Metrics.TX_PROVIDER_MISSING_TXS_COUNT);
|
|
22
28
|
|
|
23
29
|
this.fractionOfTxsRequestedFromP2P = meter.createHistogram(Metrics.TX_PROVIDER_P2P_TXS_REQUESTED_FRACTION);
|
|
24
30
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { L2Block } from '@aztec/stdlib/block';
|
|
3
|
+
import type { ITxProvider } from '@aztec/stdlib/interfaces/server';
|
|
4
|
+
import type { BlockProposal } from '@aztec/stdlib/p2p';
|
|
5
|
+
import { type Tx, TxHash } from '@aztec/stdlib/tx';
|
|
6
|
+
|
|
7
|
+
import type { PeerId } from '@libp2p/interface';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Test transaction provider that can be seeded with transactions.
|
|
11
|
+
* Returns seeded txs when requested by hash, useful for testing block
|
|
12
|
+
* proposal handling without requiring a full P2P network.
|
|
13
|
+
*/
|
|
14
|
+
export class TestTxProvider implements ITxProvider {
|
|
15
|
+
private txs: Map<string, Tx> = new Map();
|
|
16
|
+
|
|
17
|
+
/** Seed transactions that will be returned when requested. */
|
|
18
|
+
seed(txs: Tx[]) {
|
|
19
|
+
for (const tx of txs) {
|
|
20
|
+
this.txs.set(tx.getTxHash().toString(), tx);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Clear all seeded transactions. */
|
|
25
|
+
clear() {
|
|
26
|
+
this.txs.clear();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Returns txs from the seeded collection given their hashes. */
|
|
30
|
+
getAvailableTxs(txHashes: TxHash[]): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
|
|
31
|
+
return this.getTxsByHashes(txHashes);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Get txs for a block proposal, returning any seeded txs that match the requested hashes. */
|
|
35
|
+
getTxsForBlockProposal(
|
|
36
|
+
blockProposal: BlockProposal,
|
|
37
|
+
_blockNumber: BlockNumber,
|
|
38
|
+
_opts: { pinnedPeer: PeerId | undefined; deadline: Date },
|
|
39
|
+
): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
|
|
40
|
+
return this.getTxsByHashes(blockProposal.txHashes);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Get txs for a block, returning any seeded txs that match the tx effects in the block. */
|
|
44
|
+
getTxsForBlock(block: L2Block, _opts: { deadline: Date }): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
|
|
45
|
+
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
46
|
+
return this.getTxsByHashes(txHashes);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private getTxsByHashes(txHashes: TxHash[]): Promise<{ txs: Tx[]; missingTxs: TxHash[] }> {
|
|
50
|
+
const txs: Tx[] = [];
|
|
51
|
+
const missingTxs: TxHash[] = [];
|
|
52
|
+
|
|
53
|
+
for (const txHash of txHashes) {
|
|
54
|
+
const tx = this.txs.get(txHash.toString());
|
|
55
|
+
if (tx) {
|
|
56
|
+
txs.push(tx);
|
|
57
|
+
} else {
|
|
58
|
+
missingTxs.push(txHash);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return Promise.resolve({ txs, missingTxs });
|
|
63
|
+
}
|
|
64
|
+
}
|