@aztec/p2p 0.0.1-commit.4ad48494d → 0.0.1-commit.4d3c002
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -3
- package/dest/client/factory.d.ts +7 -7
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +33 -29
- package/dest/client/interface.d.ts +18 -20
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +9 -19
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +72 -102
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +20 -10
- package/dest/config.d.ts +34 -15
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +86 -37
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +4 -4
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +11 -6
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +2 -2
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +16 -14
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +9 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -4
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +4 -4
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +5 -5
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +12 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +1 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +24 -10
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +4 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +54 -15
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +111 -19
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +5 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +38 -46
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -4
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +12 -5
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +12 -5
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +296 -153
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
- package/dest/msg_validators/clock_tolerance.d.ts +1 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +4 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +35 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +133 -6
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +247 -60
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
- package/dest/msg_validators/tx_validator/index.d.ts +3 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +2 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- package/dest/services/discv5/discV5_service.d.ts +1 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +5 -2
- package/dest/services/dummy_service.d.ts +7 -5
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +9 -5
- package/dest/services/encoding.d.ts +6 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +16 -9
- package/dest/services/gossipsub/topic_score_params.d.ts +18 -6
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +32 -10
- package/dest/services/libp2p/libp2p_service.d.ts +30 -22
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +241 -151
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +24 -9
- package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +28 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +83 -106
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +19 -10
- package/dest/services/service.d.ts +11 -4
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +65 -75
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +4 -2
- package/dest/services/tx_collection/file_store_tx_source.d.ts +16 -6
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +50 -9
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +2 -1
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +2 -2
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +10 -8
- package/dest/services/tx_collection/tx_collection.d.ts +5 -7
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +13 -22
- package/dest/services/tx_collection/tx_source.d.ts +13 -7
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +26 -7
- package/dest/services/tx_file_store/tx_file_store.js +1 -1
- package/dest/services/tx_provider.d.ts +3 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +4 -4
- package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +1 -2
- package/dest/test-helpers/mock-pubsub.d.ts +11 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +16 -3
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +7 -3
- package/dest/test-helpers/testbench-utils.d.ts +6 -3
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +23 -4
- package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +56 -26
- package/dest/testbench/worker_client_manager.d.ts +3 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +6 -3
- package/dest/util.d.ts +9 -5
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +2 -10
- package/package.json +14 -14
- package/src/client/factory.ts +56 -48
- package/src/client/interface.ts +20 -21
- package/src/client/p2p_client.ts +78 -132
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +33 -14
- package/src/config.ts +125 -43
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +12 -9
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
- package/src/mem_pools/attestation_pool/mocks.ts +2 -1
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +17 -13
- package/src/mem_pools/tx_pool_v2/README.md +10 -2
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +11 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -4
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +4 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +12 -9
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
- package/src/mem_pools/tx_pool_v2/index.ts +1 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +24 -10
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +159 -27
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -46
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +28 -8
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +330 -149
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
- package/src/msg_validators/clock_tolerance.ts +4 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
- package/src/msg_validators/tx_validator/README.md +119 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -3
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +42 -1
- package/src/msg_validators/tx_validator/factory.ts +394 -78
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
- package/src/services/discv5/discV5_service.ts +5 -2
- package/src/services/dummy_service.ts +12 -7
- package/src/services/encoding.ts +16 -8
- package/src/services/gossipsub/README.md +29 -14
- package/src/services/gossipsub/topic_score_params.ts +49 -13
- package/src/services/libp2p/libp2p_service.ts +262 -176
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +28 -9
- package/src/services/peer-manager/peer_scoring.ts +21 -5
- package/src/services/reqresp/README.md +229 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +79 -112
- package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/reqresp.ts +22 -12
- package/src/services/service.ts +20 -3
- package/src/services/tx_collection/fast_tx_collection.ts +71 -76
- package/src/services/tx_collection/file_store_tx_collection.ts +7 -3
- package/src/services/tx_collection/file_store_tx_source.ts +65 -9
- package/src/services/tx_collection/instrumentation.ts +7 -1
- package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/slow_tx_collection.ts +8 -9
- package/src/services/tx_collection/tx_collection.ts +5 -6
- package/src/services/tx_collection/tx_collection_sink.ts +15 -29
- package/src/services/tx_collection/tx_source.ts +28 -8
- package/src/services/tx_file_store/tx_file_store.ts +1 -1
- package/src/services/tx_provider.ts +2 -2
- package/src/test-helpers/make-test-p2p-clients.ts +1 -3
- package/src/test-helpers/mock-pubsub.ts +20 -6
- package/src/test-helpers/reqresp-nodes.ts +7 -6
- package/src/test-helpers/testbench-utils.ts +32 -6
- package/src/testbench/p2p_client_testbench_worker.ts +62 -29
- package/src/testbench/worker_client_manager.ts +13 -6
- package/src/util.ts +15 -16
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
|
@@ -9,6 +9,7 @@ import type { L2Block, L2BlockId, L2BlockSource } from '@aztec/stdlib/block';
|
|
|
9
9
|
import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
10
10
|
import { DatabasePublicStateSource } from '@aztec/stdlib/trees';
|
|
11
11
|
import { BlockHeader, Tx, TxHash, type TxValidator } from '@aztec/stdlib/tx';
|
|
12
|
+
import type { TelemetryClient } from '@aztec/telemetry-client';
|
|
12
13
|
|
|
13
14
|
import { TxArchive } from './archive/index.js';
|
|
14
15
|
import { DeletedPool } from './deleted_pool.js';
|
|
@@ -22,8 +23,12 @@ import {
|
|
|
22
23
|
LowPriorityPreAddRule,
|
|
23
24
|
NullifierConflictRule,
|
|
24
25
|
type PoolOperations,
|
|
26
|
+
type PreAddContext,
|
|
25
27
|
type PreAddPoolAccess,
|
|
28
|
+
TxPoolRejectionCode,
|
|
29
|
+
type TxPoolRejectionError,
|
|
26
30
|
} from './eviction/index.js';
|
|
31
|
+
import { TxPoolV2Instrumentation } from './instrumentation.js';
|
|
27
32
|
import {
|
|
28
33
|
type AddTxsResult,
|
|
29
34
|
DEFAULT_TX_POOL_V2_CONFIG,
|
|
@@ -40,6 +45,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
40
45
|
export interface TxPoolV2Callbacks {
|
|
41
46
|
onTxsAdded: (txs: Tx[], opts: { source?: string }) => void;
|
|
42
47
|
onTxsRemoved: (txHashes: string[] | bigint[]) => void;
|
|
48
|
+
onTxsMined: (txHashes: string[]) => void;
|
|
43
49
|
}
|
|
44
50
|
|
|
45
51
|
/**
|
|
@@ -56,6 +62,7 @@ export class TxPoolV2Impl {
|
|
|
56
62
|
#l2BlockSource: L2BlockSource;
|
|
57
63
|
#worldStateSynchronizer: WorldStateSynchronizer;
|
|
58
64
|
#createTxValidator: TxPoolV2Dependencies['createTxValidator'];
|
|
65
|
+
#checkAllowedSetupCalls: TxPoolV2Dependencies['checkAllowedSetupCalls'];
|
|
59
66
|
|
|
60
67
|
// === In-Memory Indices ===
|
|
61
68
|
#indices: TxPoolIndices = new TxPoolIndices();
|
|
@@ -66,6 +73,8 @@ export class TxPoolV2Impl {
|
|
|
66
73
|
#deletedPool: DeletedPool;
|
|
67
74
|
#evictionManager: EvictionManager;
|
|
68
75
|
#dateProvider: DateProvider;
|
|
76
|
+
#instrumentation: TxPoolV2Instrumentation;
|
|
77
|
+
#evictedTxHashes: Set<string> = new Set();
|
|
69
78
|
#log: Logger;
|
|
70
79
|
#callbacks: TxPoolV2Callbacks;
|
|
71
80
|
|
|
@@ -74,6 +83,7 @@ export class TxPoolV2Impl {
|
|
|
74
83
|
archiveStore: AztecAsyncKVStore,
|
|
75
84
|
deps: TxPoolV2Dependencies,
|
|
76
85
|
callbacks: TxPoolV2Callbacks,
|
|
86
|
+
telemetry: TelemetryClient,
|
|
77
87
|
config: Partial<TxPoolV2Config> = {},
|
|
78
88
|
dateProvider: DateProvider,
|
|
79
89
|
log: Logger,
|
|
@@ -84,11 +94,13 @@ export class TxPoolV2Impl {
|
|
|
84
94
|
this.#l2BlockSource = deps.l2BlockSource;
|
|
85
95
|
this.#worldStateSynchronizer = deps.worldStateSynchronizer;
|
|
86
96
|
this.#createTxValidator = deps.createTxValidator;
|
|
97
|
+
this.#checkAllowedSetupCalls = deps.checkAllowedSetupCalls;
|
|
87
98
|
|
|
88
99
|
this.#config = { ...DEFAULT_TX_POOL_V2_CONFIG, ...config };
|
|
89
100
|
this.#archive = new TxArchive(archiveStore, this.#config.archivedTxLimit, log);
|
|
90
101
|
this.#deletedPool = new DeletedPool(store, this.#txsDB, log);
|
|
91
102
|
this.#dateProvider = dateProvider;
|
|
103
|
+
this.#instrumentation = new TxPoolV2Instrumentation(telemetry, () => this.#indices.getTotalMetadataBytes());
|
|
92
104
|
this.#log = log;
|
|
93
105
|
this.#callbacks = callbacks;
|
|
94
106
|
|
|
@@ -171,13 +183,42 @@ export class TxPoolV2Impl {
|
|
|
171
183
|
this.#log.info(`Deleted ${toDelete.length} invalid/rejected transactions on startup`, { txHashes: toDelete });
|
|
172
184
|
}
|
|
173
185
|
|
|
174
|
-
async addPendingTxs(txs: Tx[], opts: { source?: string }): Promise<AddTxsResult> {
|
|
186
|
+
async addPendingTxs(txs: Tx[], opts: { source?: string; feeComparisonOnly?: boolean }): Promise<AddTxsResult> {
|
|
175
187
|
const accepted: TxHash[] = [];
|
|
176
188
|
const ignored: TxHash[] = [];
|
|
177
189
|
const rejected: TxHash[] = [];
|
|
190
|
+
const errors = new Map<string, TxPoolRejectionError>();
|
|
178
191
|
const acceptedPending = new Set<string>();
|
|
179
192
|
|
|
193
|
+
// Phase 1: Pre-compute all throwable I/O outside the transaction.
|
|
194
|
+
// If any pre-computation throws, the entire call fails before mutations happen.
|
|
195
|
+
const precomputed = new Map<string, { meta: TxMetaData; minedBlockId: L2BlockId | undefined; isValid: boolean }>();
|
|
196
|
+
|
|
197
|
+
const validator = await this.#createTxValidator();
|
|
198
|
+
|
|
199
|
+
for (const tx of txs) {
|
|
200
|
+
const txHash = tx.getTxHash();
|
|
201
|
+
const txHashStr = txHash.toString();
|
|
202
|
+
|
|
203
|
+
const meta = await buildTxMetaData(tx);
|
|
204
|
+
const minedBlockId = await this.#getMinedBlockId(txHash);
|
|
205
|
+
|
|
206
|
+
// Validate non-mined txs (mined and pre-protected txs bypass validation inside the transaction)
|
|
207
|
+
let isValid = true;
|
|
208
|
+
if (!minedBlockId) {
|
|
209
|
+
isValid = await this.#validateMeta(meta, validator);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
precomputed.set(txHashStr, { meta, minedBlockId, isValid });
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Phase 2: Apply mutations inside the transaction using only pre-computed results,
|
|
216
|
+
// in-memory reads, and buffered DB writes. Nothing here can throw an unhandled exception.
|
|
180
217
|
const poolAccess = this.#createPreAddPoolAccess();
|
|
218
|
+
const preAddContext: PreAddContext | undefined =
|
|
219
|
+
opts.feeComparisonOnly !== undefined
|
|
220
|
+
? { feeComparisonOnly: opts.feeComparisonOnly, priceBumpPercentage: this.#config.priceBumpPercentage }
|
|
221
|
+
: undefined;
|
|
181
222
|
|
|
182
223
|
await this.#store.transactionAsync(async () => {
|
|
183
224
|
for (const tx of txs) {
|
|
@@ -190,30 +231,46 @@ export class TxPoolV2Impl {
|
|
|
190
231
|
continue;
|
|
191
232
|
}
|
|
192
233
|
|
|
193
|
-
|
|
194
|
-
const minedBlockId = await this.#getMinedBlockId(txHash);
|
|
234
|
+
const { meta, minedBlockId, isValid } = precomputed.get(txHashStr)!;
|
|
195
235
|
const preProtectedSlot = this.#indices.getProtectionSlot(txHashStr);
|
|
196
236
|
|
|
197
237
|
if (minedBlockId) {
|
|
198
238
|
// Already mined - add directly (protection already set if pre-protected)
|
|
199
|
-
await this.#addTx(tx, { mined: minedBlockId }, opts);
|
|
239
|
+
await this.#addTx(tx, { mined: minedBlockId }, opts, meta);
|
|
200
240
|
accepted.push(txHash);
|
|
201
241
|
} else if (preProtectedSlot !== undefined) {
|
|
202
242
|
// Pre-protected and not mined - add as protected (bypass validation)
|
|
203
|
-
await this.#addTx(tx, { protected: preProtectedSlot }, opts);
|
|
243
|
+
await this.#addTx(tx, { protected: preProtectedSlot }, opts, meta);
|
|
204
244
|
accepted.push(txHash);
|
|
245
|
+
} else if (!isValid) {
|
|
246
|
+
// Failed pre-computed validation
|
|
247
|
+
rejected.push(txHash);
|
|
205
248
|
} else {
|
|
206
|
-
// Regular pending tx -
|
|
207
|
-
const result = await this.#tryAddRegularPendingTx(
|
|
249
|
+
// Regular pending tx - run pre-add rules using pre-computed metadata
|
|
250
|
+
const result = await this.#tryAddRegularPendingTx(
|
|
251
|
+
tx,
|
|
252
|
+
meta,
|
|
253
|
+
opts,
|
|
254
|
+
poolAccess,
|
|
255
|
+
acceptedPending,
|
|
256
|
+
ignored,
|
|
257
|
+
errors,
|
|
258
|
+
preAddContext,
|
|
259
|
+
);
|
|
208
260
|
if (result.status === 'accepted') {
|
|
209
261
|
acceptedPending.add(txHashStr);
|
|
210
|
-
} else if (result.status === 'rejected') {
|
|
211
|
-
rejected.push(txHash);
|
|
212
262
|
} else {
|
|
213
263
|
ignored.push(txHash);
|
|
214
264
|
}
|
|
215
265
|
}
|
|
216
266
|
}
|
|
267
|
+
|
|
268
|
+
// Run post-add eviction rules for pending txs (inside transaction for atomicity)
|
|
269
|
+
if (acceptedPending.size > 0) {
|
|
270
|
+
const feePayers = Array.from(acceptedPending).map(txHash => this.#indices.getMetadata(txHash)!.feePayer);
|
|
271
|
+
const uniqueFeePayers = new Set<string>(feePayers);
|
|
272
|
+
await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [...uniqueFeePayers]);
|
|
273
|
+
}
|
|
217
274
|
});
|
|
218
275
|
|
|
219
276
|
// Build final accepted list for pending txs (excludes intra-batch evictions)
|
|
@@ -221,99 +278,124 @@ export class TxPoolV2Impl {
|
|
|
221
278
|
accepted.push(TxHash.fromString(txHashStr));
|
|
222
279
|
}
|
|
223
280
|
|
|
224
|
-
//
|
|
225
|
-
if (
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
281
|
+
// Record metrics
|
|
282
|
+
if (ignored.length > 0) {
|
|
283
|
+
this.#instrumentation.recordIgnored(ignored.length);
|
|
284
|
+
}
|
|
285
|
+
if (rejected.length > 0) {
|
|
286
|
+
this.#instrumentation.recordRejected(rejected.length);
|
|
229
287
|
}
|
|
230
288
|
|
|
231
|
-
return { accepted, ignored, rejected };
|
|
289
|
+
return { accepted, ignored, rejected, ...(errors.size > 0 ? { errors } : {}) };
|
|
232
290
|
}
|
|
233
291
|
|
|
234
|
-
/**
|
|
292
|
+
/** Adds a validated pending tx, running pre-add rules and evicting conflicts. */
|
|
235
293
|
async #tryAddRegularPendingTx(
|
|
236
294
|
tx: Tx,
|
|
295
|
+
precomputedMeta: TxMetaData,
|
|
237
296
|
opts: { source?: string },
|
|
238
297
|
poolAccess: PreAddPoolAccess,
|
|
239
298
|
acceptedPending: Set<string>,
|
|
240
299
|
ignored: TxHash[],
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
// Build metadata and validate using metadata
|
|
246
|
-
const meta = await buildTxMetaData(tx);
|
|
247
|
-
if (!(await this.#validateMeta(meta))) {
|
|
248
|
-
return { status: 'rejected' };
|
|
249
|
-
}
|
|
300
|
+
errors: Map<string, TxPoolRejectionError>,
|
|
301
|
+
preAddContext?: PreAddContext,
|
|
302
|
+
): Promise<{ status: 'accepted' | 'ignored' }> {
|
|
303
|
+
const txHashStr = tx.getTxHash().toString();
|
|
250
304
|
|
|
251
305
|
// Run pre-add rules
|
|
252
|
-
const preAddResult = await this.#evictionManager.runPreAddRules(
|
|
306
|
+
const preAddResult = await this.#evictionManager.runPreAddRules(precomputedMeta, poolAccess, preAddContext);
|
|
253
307
|
|
|
254
308
|
if (preAddResult.shouldIgnore) {
|
|
255
|
-
this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason}`);
|
|
309
|
+
this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason?.message ?? 'unknown reason'}`);
|
|
310
|
+
if (preAddResult.reason && preAddResult.reason.code !== TxPoolRejectionCode.INTERNAL_ERROR) {
|
|
311
|
+
errors.set(txHashStr, preAddResult.reason);
|
|
312
|
+
}
|
|
256
313
|
return { status: 'ignored' };
|
|
257
314
|
}
|
|
258
315
|
|
|
259
|
-
// Evict conflicts
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
ignored.push(TxHash.fromString(evictHashStr));
|
|
316
|
+
// Evict conflicts, grouped by rule name for metrics
|
|
317
|
+
if (preAddResult.evictions && preAddResult.evictions.length > 0) {
|
|
318
|
+
const byReason = new Map<string, string[]>();
|
|
319
|
+
for (const { txHash: evictHash, reason } of preAddResult.evictions) {
|
|
320
|
+
const group = byReason.get(reason);
|
|
321
|
+
if (group) {
|
|
322
|
+
group.push(evictHash);
|
|
323
|
+
} else {
|
|
324
|
+
byReason.set(reason, [evictHash]);
|
|
325
|
+
}
|
|
270
326
|
}
|
|
327
|
+
for (const [reason, hashes] of byReason) {
|
|
328
|
+
await this.#evictTxs(hashes, reason);
|
|
329
|
+
}
|
|
330
|
+
for (const evictHashStr of preAddResult.txHashesToEvict) {
|
|
331
|
+
this.#log.debug(`Evicted tx ${evictHashStr} due to higher-fee tx ${txHashStr}`, {
|
|
332
|
+
evictedTxHash: evictHashStr,
|
|
333
|
+
replacementTxHash: txHashStr,
|
|
334
|
+
});
|
|
335
|
+
if (acceptedPending.has(evictHashStr)) {
|
|
336
|
+
// Evicted tx was from this batch - mark as ignored in result
|
|
337
|
+
acceptedPending.delete(evictHashStr);
|
|
338
|
+
ignored.push(TxHash.fromString(evictHashStr));
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Randomly drop the transaction for testing purposes (report as accepted so it propagates)
|
|
344
|
+
if (this.#config.dropTransactionsProbability > 0 && Math.random() < this.#config.dropTransactionsProbability) {
|
|
345
|
+
this.#log.debug(`Dropping tx ${txHashStr} (simulated drop for testing)`);
|
|
346
|
+
return { status: 'accepted' };
|
|
271
347
|
}
|
|
272
348
|
|
|
273
349
|
// Add the transaction
|
|
274
|
-
await this.#addTx(tx, 'pending', opts);
|
|
350
|
+
await this.#addTx(tx, 'pending', opts, precomputedMeta);
|
|
275
351
|
return { status: 'accepted' };
|
|
276
352
|
}
|
|
277
353
|
|
|
278
|
-
async canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'
|
|
354
|
+
async canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored'> {
|
|
279
355
|
const txHashStr = tx.getTxHash().toString();
|
|
280
356
|
|
|
281
357
|
// Check if already in pool
|
|
282
358
|
if (this.#indices.has(txHashStr)) {
|
|
359
|
+
this.#log.verbose(`canAddPendingTx: tx ${txHashStr} already in pool`);
|
|
283
360
|
return 'ignored';
|
|
284
361
|
}
|
|
285
362
|
|
|
286
|
-
// Build metadata and
|
|
363
|
+
// Build metadata and check pre-add rules
|
|
287
364
|
const meta = await buildTxMetaData(tx);
|
|
288
|
-
const validationResult = await this.#validateMeta(meta, undefined, 'can add pending');
|
|
289
|
-
if (validationResult !== true) {
|
|
290
|
-
return 'rejected';
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
// Use pre-add rules
|
|
294
365
|
const poolAccess = this.#createPreAddPoolAccess();
|
|
295
366
|
const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess);
|
|
296
367
|
|
|
297
|
-
|
|
368
|
+
if (preAddResult.shouldIgnore) {
|
|
369
|
+
this.#log.verbose(`canAddPendingTx: tx ${txHashStr} ignored by pre-add rule`, {
|
|
370
|
+
reason: preAddResult.reason?.message ?? 'no reason provided',
|
|
371
|
+
});
|
|
372
|
+
return 'ignored';
|
|
373
|
+
}
|
|
374
|
+
return 'accepted';
|
|
298
375
|
}
|
|
299
376
|
|
|
300
377
|
async addProtectedTxs(txs: Tx[], block: BlockHeader, opts: { source?: string }): Promise<void> {
|
|
301
378
|
const slotNumber = block.globalVariables.slotNumber;
|
|
302
379
|
|
|
380
|
+
// Precompute setup-call allow-list flags outside the store transaction
|
|
381
|
+
const allowedFlags = await Promise.all(txs.map(tx => this.#checkAllowedSetupCalls(tx)));
|
|
382
|
+
|
|
303
383
|
await this.#store.transactionAsync(async () => {
|
|
304
|
-
for (
|
|
384
|
+
for (let i = 0; i < txs.length; i++) {
|
|
385
|
+
const tx = txs[i];
|
|
305
386
|
const txHash = tx.getTxHash();
|
|
306
387
|
const txHashStr = txHash.toString();
|
|
307
388
|
const isNew = !this.#indices.has(txHashStr);
|
|
308
389
|
const minedBlockId = await this.#getMinedBlockId(txHash);
|
|
309
390
|
|
|
310
391
|
if (isNew) {
|
|
392
|
+
const meta = await buildTxMetaData(tx, allowedFlags[i]);
|
|
311
393
|
// New tx - add as mined or protected (callback emitted by #addTx)
|
|
312
394
|
if (minedBlockId) {
|
|
313
|
-
await this.#addTx(tx, { mined: minedBlockId }, opts);
|
|
395
|
+
await this.#addTx(tx, { mined: minedBlockId }, opts, meta);
|
|
314
396
|
this.#indices.setProtection(txHashStr, slotNumber);
|
|
315
397
|
} else {
|
|
316
|
-
await this.#addTx(tx, { protected: slotNumber }, opts);
|
|
398
|
+
await this.#addTx(tx, { protected: slotNumber }, opts, meta);
|
|
317
399
|
}
|
|
318
400
|
} else {
|
|
319
401
|
// Existing tx - update protection and mined status
|
|
@@ -327,23 +409,58 @@ export class TxPoolV2Impl {
|
|
|
327
409
|
});
|
|
328
410
|
}
|
|
329
411
|
|
|
330
|
-
protectTxs(txHashes: TxHash[], block: BlockHeader): TxHash[] {
|
|
412
|
+
async protectTxs(txHashes: TxHash[], block: BlockHeader): Promise<TxHash[]> {
|
|
331
413
|
const slotNumber = block.globalVariables.slotNumber;
|
|
332
414
|
const missing: TxHash[] = [];
|
|
415
|
+
let softDeletedHits = 0;
|
|
416
|
+
let missingPreviouslyEvicted = 0;
|
|
333
417
|
|
|
334
|
-
|
|
335
|
-
const
|
|
418
|
+
await this.#store.transactionAsync(async () => {
|
|
419
|
+
for (const txHash of txHashes) {
|
|
420
|
+
const txHashStr = txHash.toString();
|
|
336
421
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
422
|
+
if (this.#indices.has(txHashStr)) {
|
|
423
|
+
// Update protection for existing tx
|
|
424
|
+
this.#indices.updateProtection(txHashStr, slotNumber);
|
|
425
|
+
} else if (this.#deletedPool.isSoftDeleted(txHashStr)) {
|
|
426
|
+
// Resurrect soft-deleted tx as protected
|
|
427
|
+
const buffer = await this.#txsDB.getAsync(txHashStr);
|
|
428
|
+
if (buffer) {
|
|
429
|
+
const tx = Tx.fromBuffer(buffer);
|
|
430
|
+
await this.#addTx(tx, { protected: slotNumber });
|
|
431
|
+
softDeletedHits++;
|
|
432
|
+
} else {
|
|
433
|
+
// Data missing despite soft-delete flag — treat as truly missing
|
|
434
|
+
this.#indices.setProtection(txHashStr, slotNumber);
|
|
435
|
+
missing.push(txHash);
|
|
436
|
+
}
|
|
437
|
+
} else {
|
|
438
|
+
// Truly missing — pre-record protection for tx we don't have yet
|
|
439
|
+
this.#indices.setProtection(txHashStr, slotNumber);
|
|
440
|
+
missing.push(txHash);
|
|
441
|
+
if (this.#evictedTxHashes.has(txHashStr)) {
|
|
442
|
+
missingPreviouslyEvicted++;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
344
445
|
}
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
// Record metrics
|
|
449
|
+
if (softDeletedHits > 0) {
|
|
450
|
+
this.#instrumentation.recordSoftDeletedHits(softDeletedHits);
|
|
451
|
+
}
|
|
452
|
+
if (missing.length > 0) {
|
|
453
|
+
this.#log.debug(`protectTxs missing tx hashes: ${missing.map(h => h.toString()).join(', ')}`);
|
|
454
|
+
this.#instrumentation.recordMissingOnProtect(missing.length);
|
|
455
|
+
}
|
|
456
|
+
if (missingPreviouslyEvicted > 0) {
|
|
457
|
+
this.#instrumentation.recordMissingPreviouslyEvicted(missingPreviouslyEvicted);
|
|
345
458
|
}
|
|
346
459
|
|
|
460
|
+
this.#log.info(
|
|
461
|
+
`Protected ${txHashes.length} txs, missing: ${missing.length}, soft-deleted hits: ${softDeletedHits}`,
|
|
462
|
+
);
|
|
463
|
+
|
|
347
464
|
return missing;
|
|
348
465
|
}
|
|
349
466
|
|
|
@@ -387,57 +504,67 @@ export class TxPoolV2Impl {
|
|
|
387
504
|
}
|
|
388
505
|
}
|
|
389
506
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
507
|
+
await this.#store.transactionAsync(async () => {
|
|
508
|
+
// Step 4: Mark txs as mined (only those we have in the pool)
|
|
509
|
+
for (const meta of found) {
|
|
510
|
+
this.#indices.markAsMined(meta, blockId);
|
|
511
|
+
await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// Step 5: Run post-event eviction rules (inside transaction for atomicity)
|
|
515
|
+
await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
|
|
516
|
+
});
|
|
395
517
|
|
|
396
|
-
|
|
397
|
-
|
|
518
|
+
if (found.length > 0) {
|
|
519
|
+
this.#callbacks.onTxsMined(found.map(m => m.txHash));
|
|
520
|
+
}
|
|
398
521
|
|
|
399
522
|
this.#log.info(`Marked ${found.length} txs as mined in block ${blockId.number}`);
|
|
400
523
|
}
|
|
401
524
|
|
|
402
525
|
async prepareForSlot(slotNumber: SlotNumber): Promise<void> {
|
|
403
|
-
|
|
404
|
-
|
|
526
|
+
await this.#store.transactionAsync(async () => {
|
|
527
|
+
// Step 0: Clean up slot-deleted txs from previous slots
|
|
528
|
+
await this.#deletedPool.cleanupSlotDeleted(slotNumber);
|
|
405
529
|
|
|
406
|
-
|
|
407
|
-
|
|
530
|
+
// Step 1: Find expired protected txs
|
|
531
|
+
const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber);
|
|
408
532
|
|
|
409
|
-
|
|
410
|
-
|
|
533
|
+
// Step 2: Clear protection for all expired entries (including those without metadata)
|
|
534
|
+
this.#indices.clearProtection(expiredProtected);
|
|
411
535
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
536
|
+
// Step 3: Filter to only txs that have metadata and are not mined
|
|
537
|
+
const txsToRestore = this.#indices.filterRestorable(expiredProtected);
|
|
538
|
+
if (txsToRestore.length === 0) {
|
|
539
|
+
this.#log.debug(`Preparing for slot ${slotNumber}, no txs to unprotect`);
|
|
540
|
+
return;
|
|
541
|
+
}
|
|
417
542
|
|
|
418
|
-
|
|
543
|
+
this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`);
|
|
419
544
|
|
|
420
|
-
|
|
421
|
-
|
|
545
|
+
// Step 4: Validate for pending pool
|
|
546
|
+
const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
|
|
422
547
|
|
|
423
|
-
|
|
424
|
-
|
|
548
|
+
// Step 5: Resolve nullifier conflicts and add winners to pending indices
|
|
549
|
+
const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
|
|
425
550
|
|
|
426
|
-
|
|
427
|
-
|
|
551
|
+
// Step 6: Delete invalid txs and evict conflict losers
|
|
552
|
+
await this.#deleteTxsBatch(invalid);
|
|
553
|
+
await this.#evictTxs(toEvict, 'NullifierConflict');
|
|
428
554
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
555
|
+
// Step 7: Run eviction rules (enforce pool size limit)
|
|
556
|
+
if (added.length > 0) {
|
|
557
|
+
const feePayers = added.map(meta => meta.feePayer);
|
|
558
|
+
const uniqueFeePayers = new Set<string>(feePayers);
|
|
559
|
+
await this.#evictionManager.evictAfterNewTxs(
|
|
560
|
+
added.map(m => m.txHash),
|
|
561
|
+
[...uniqueFeePayers],
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
});
|
|
438
565
|
}
|
|
439
566
|
|
|
440
|
-
async handlePrunedBlocks(latestBlock: L2BlockId): Promise<void> {
|
|
567
|
+
async handlePrunedBlocks(latestBlock: L2BlockId, options?: { deleteAllTxs?: boolean }): Promise<void> {
|
|
441
568
|
// Step 1: Find transactions mined after the prune point
|
|
442
569
|
const txsToUnmine = this.#indices.findTxsMinedAfter(latestBlock.number);
|
|
443
570
|
if (txsToUnmine.length === 0) {
|
|
@@ -447,46 +574,60 @@ export class TxPoolV2Impl {
|
|
|
447
574
|
|
|
448
575
|
this.#log.info(`Handling prune to block ${latestBlock.number}: un-mining ${txsToUnmine.length} txs`);
|
|
449
576
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
577
|
+
await this.#store.transactionAsync(async () => {
|
|
578
|
+
// Step 2: Mark ALL un-mined txs with their original mined block number
|
|
579
|
+
// This ensures they get soft-deleted if removed later, and only hard-deleted
|
|
580
|
+
// when their original mined block is finalized
|
|
581
|
+
await this.#deletedPool.markFromPrunedBlock(
|
|
582
|
+
txsToUnmine.map(m => ({
|
|
583
|
+
txHash: m.txHash,
|
|
584
|
+
minedAtBlock: BlockNumber(m.minedL2BlockId!.number),
|
|
585
|
+
})),
|
|
586
|
+
);
|
|
459
587
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
588
|
+
// Step 3: Unmine - clear mined status from metadata
|
|
589
|
+
for (const meta of txsToUnmine) {
|
|
590
|
+
this.#indices.markAsUnmined(meta);
|
|
591
|
+
}
|
|
464
592
|
|
|
465
|
-
|
|
466
|
-
|
|
593
|
+
// If deleteAllTxs is set (epoch prune), delete all un-mined txs and return early
|
|
594
|
+
if (options?.deleteAllTxs) {
|
|
595
|
+
const allTxHashes = txsToUnmine.map(m => m.txHash);
|
|
596
|
+
await this.#deleteTxsBatch(allTxHashes);
|
|
597
|
+
this.#log.info(
|
|
598
|
+
`Handled prune to block ${latestBlock.number} with deleteAllTxs: deleted ${allTxHashes.length} txs`,
|
|
599
|
+
);
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
467
602
|
|
|
468
|
-
|
|
469
|
-
|
|
603
|
+
// Step 4: Filter out protected txs (they'll be handled by prepareForSlot)
|
|
604
|
+
const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine);
|
|
470
605
|
|
|
471
|
-
|
|
472
|
-
|
|
606
|
+
// Step 5: Validate for pending pool
|
|
607
|
+
const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks');
|
|
473
608
|
|
|
474
|
-
|
|
475
|
-
|
|
609
|
+
// Step 6: Resolve nullifier conflicts and add winners to pending indices
|
|
610
|
+
const { toEvict } = this.#applyNullifierConflictResolution(valid);
|
|
476
611
|
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
612
|
+
// Step 7: Delete invalid txs and evict conflict losers
|
|
613
|
+
await this.#deleteTxsBatch(invalid);
|
|
614
|
+
await this.#evictTxs(toEvict, 'NullifierConflict');
|
|
615
|
+
|
|
616
|
+
this.#log.info(
|
|
617
|
+
`Handled prune to block ${latestBlock.number}: ${valid.length} txs restored to pending, ${invalid.length} invalid, ${toEvict.length} evicted due to nullifier conflicts`,
|
|
618
|
+
{ txHashesRestored: valid.map(m => m.txHash), txHashesInvalid: invalid, txHashesEvicted: toEvict },
|
|
619
|
+
);
|
|
481
620
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
621
|
+
// Step 8: Run eviction rules for ALL pending txs (not just restored ones)
|
|
622
|
+
// This handles cases like existing pending txs with invalid fee payer balances
|
|
623
|
+
await this.#evictionManager.evictAfterChainPrune(latestBlock.number);
|
|
624
|
+
});
|
|
485
625
|
}
|
|
486
626
|
|
|
487
627
|
async handleFailedExecution(txHashes: TxHash[]): Promise<void> {
|
|
488
|
-
|
|
489
|
-
|
|
628
|
+
await this.#store.transactionAsync(async () => {
|
|
629
|
+
await this.#deleteTxsBatch(txHashes.map(h => h.toString()));
|
|
630
|
+
});
|
|
490
631
|
|
|
491
632
|
this.#log.info(`Deleted ${txHashes.length} failed txs`, { txHashes: txHashes.map(h => h.toString()) });
|
|
492
633
|
}
|
|
@@ -497,27 +638,29 @@ export class TxPoolV2Impl {
|
|
|
497
638
|
// Step 1: Find mined txs at or before finalized block
|
|
498
639
|
const minedTxsToFinalize = this.#indices.findTxsMinedAtOrBefore(blockNumber);
|
|
499
640
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
const
|
|
505
|
-
|
|
506
|
-
|
|
641
|
+
await this.#store.transactionAsync(async () => {
|
|
642
|
+
// Step 2: Collect mined txs for archiving (before deletion)
|
|
643
|
+
const txsToArchive: Tx[] = [];
|
|
644
|
+
if (this.#archive.isEnabled()) {
|
|
645
|
+
for (const txHashStr of minedTxsToFinalize) {
|
|
646
|
+
const buffer = await this.#txsDB.getAsync(txHashStr);
|
|
647
|
+
if (buffer) {
|
|
648
|
+
txsToArchive.push(Tx.fromBuffer(buffer));
|
|
649
|
+
}
|
|
507
650
|
}
|
|
508
651
|
}
|
|
509
|
-
}
|
|
510
652
|
|
|
511
|
-
|
|
512
|
-
|
|
653
|
+
// Step 3: Delete mined txs from active pool
|
|
654
|
+
await this.#deleteTxsBatch(minedTxsToFinalize);
|
|
513
655
|
|
|
514
|
-
|
|
515
|
-
|
|
656
|
+
// Step 4: Finalize soft-deleted txs
|
|
657
|
+
await this.#deletedPool.finalizeBlock(blockNumber);
|
|
516
658
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
659
|
+
// Step 5: Archive mined txs
|
|
660
|
+
if (txsToArchive.length > 0) {
|
|
661
|
+
await this.#archive.archiveTxs(txsToArchive);
|
|
662
|
+
}
|
|
663
|
+
});
|
|
521
664
|
|
|
522
665
|
if (minedTxsToFinalize.length > 0) {
|
|
523
666
|
this.#log.info(`Finalized ${minedTxsToFinalize.length} mined txs from blocks up to ${blockNumber}`, {
|
|
@@ -637,8 +780,17 @@ export class TxPoolV2Impl {
|
|
|
637
780
|
|
|
638
781
|
// === Metrics ===
|
|
639
782
|
|
|
640
|
-
countTxs(): {
|
|
641
|
-
|
|
783
|
+
countTxs(): {
|
|
784
|
+
pending: number;
|
|
785
|
+
protected: number;
|
|
786
|
+
mined: number;
|
|
787
|
+
softDeleted: number;
|
|
788
|
+
totalMetadataBytes: number;
|
|
789
|
+
} {
|
|
790
|
+
return {
|
|
791
|
+
...this.#indices.countTxs(),
|
|
792
|
+
softDeleted: this.#deletedPool.getSoftDeletedCount(),
|
|
793
|
+
};
|
|
642
794
|
}
|
|
643
795
|
|
|
644
796
|
// ============================================================================
|
|
@@ -653,9 +805,10 @@ export class TxPoolV2Impl {
|
|
|
653
805
|
tx: Tx,
|
|
654
806
|
state: 'pending' | { protected: SlotNumber } | { mined: L2BlockId },
|
|
655
807
|
opts: { source?: string } = {},
|
|
808
|
+
precomputedMeta?: TxMetaData,
|
|
656
809
|
): Promise<TxMetaData> {
|
|
657
810
|
const txHashStr = tx.getTxHash().toString();
|
|
658
|
-
const meta = await buildTxMetaData(tx);
|
|
811
|
+
const meta = precomputedMeta ?? (await buildTxMetaData(tx));
|
|
659
812
|
meta.receivedAt = this.#dateProvider.now();
|
|
660
813
|
|
|
661
814
|
await this.#txsDB.set(txHashStr, tx.toBuffer());
|
|
@@ -672,9 +825,11 @@ export class TxPoolV2Impl {
|
|
|
672
825
|
}
|
|
673
826
|
|
|
674
827
|
const stateStr = typeof state === 'string' ? state : Object.keys(state)[0];
|
|
675
|
-
this.#log.
|
|
828
|
+
this.#log.debug(`Added tx ${txHashStr} as ${stateStr}`, {
|
|
676
829
|
eventName: 'tx-added-to-pool',
|
|
830
|
+
txHash: txHashStr,
|
|
677
831
|
state: stateStr,
|
|
832
|
+
source: opts.source,
|
|
678
833
|
});
|
|
679
834
|
|
|
680
835
|
return meta;
|
|
@@ -702,6 +857,29 @@ export class TxPoolV2Impl {
|
|
|
702
857
|
}
|
|
703
858
|
}
|
|
704
859
|
|
|
860
|
+
/** Evicts transactions: records eviction metric with reason, caches hashes, then deletes. */
|
|
861
|
+
async #evictTxs(txHashes: string[], reason: string): Promise<void> {
|
|
862
|
+
if (txHashes.length === 0) {
|
|
863
|
+
return;
|
|
864
|
+
}
|
|
865
|
+
this.#instrumentation.recordEvictions(txHashes.length, reason);
|
|
866
|
+
for (const txHashStr of txHashes) {
|
|
867
|
+
this.#log.debug(`Evicting tx ${txHashStr}`, { txHash: txHashStr, reason });
|
|
868
|
+
this.#addToEvictedCache(txHashStr);
|
|
869
|
+
}
|
|
870
|
+
await this.#deleteTxsBatch(txHashes);
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
/** Adds a tx hash to the bounded evicted cache, evicting the oldest entry if at capacity. */
|
|
874
|
+
#addToEvictedCache(txHashStr: string): void {
|
|
875
|
+
if (this.#evictedTxHashes.size >= this.#config.evictedTxCacheSize) {
|
|
876
|
+
// FIFO eviction: remove the first (oldest) entry
|
|
877
|
+
const oldest = this.#evictedTxHashes.values().next().value!;
|
|
878
|
+
this.#evictedTxHashes.delete(oldest);
|
|
879
|
+
}
|
|
880
|
+
this.#evictedTxHashes.add(txHashStr);
|
|
881
|
+
}
|
|
882
|
+
|
|
705
883
|
// ============================================================================
|
|
706
884
|
// PRIVATE HELPERS - Validation & Conflict Resolution
|
|
707
885
|
// ============================================================================
|
|
@@ -812,7 +990,8 @@ export class TxPoolV2Impl {
|
|
|
812
990
|
|
|
813
991
|
try {
|
|
814
992
|
const tx = Tx.fromBuffer(buffer);
|
|
815
|
-
const
|
|
993
|
+
const allowedSetupCalls = await this.#checkAllowedSetupCalls(tx);
|
|
994
|
+
const meta = await buildTxMetaData(tx, allowedSetupCalls);
|
|
816
995
|
loaded.push({ tx, meta });
|
|
817
996
|
} catch (err) {
|
|
818
997
|
this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, { err });
|
|
@@ -857,7 +1036,9 @@ export class TxPoolV2Impl {
|
|
|
857
1036
|
if (preAddResult.shouldIgnore) {
|
|
858
1037
|
// Transaction rejected - mark for deletion from DB
|
|
859
1038
|
rejected.push(meta.txHash);
|
|
860
|
-
this.#log.debug(
|
|
1039
|
+
this.#log.debug(
|
|
1040
|
+
`Rejected tx ${meta.txHash} during rebuild: ${preAddResult.reason?.message ?? 'unknown reason'}`,
|
|
1041
|
+
);
|
|
861
1042
|
continue;
|
|
862
1043
|
}
|
|
863
1044
|
|
|
@@ -893,7 +1074,7 @@ export class TxPoolV2Impl {
|
|
|
893
1074
|
getFeePayerPendingTxs: (feePayer: string) => this.#indices.getFeePayerPendingTxs(feePayer),
|
|
894
1075
|
getPendingTxCount: () => this.#indices.getPendingTxCount(),
|
|
895
1076
|
getLowestPriorityPending: (limit: number) => this.#indices.getLowestPriorityPending(limit),
|
|
896
|
-
deleteTxs: (txHashes: string[]) => this.#
|
|
1077
|
+
deleteTxs: (txHashes: string[], reason?: string) => this.#evictTxs(txHashes, reason ?? 'unknown'),
|
|
897
1078
|
};
|
|
898
1079
|
}
|
|
899
1080
|
|