@aztec/p2p 0.0.1-commit.2eb6648a → 0.0.1-commit.343b43af6
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/client/factory.d.ts +9 -9
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +43 -13
- package/dest/client/interface.d.ts +39 -33
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +37 -50
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +144 -223
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -7
- package/dest/config.d.ts +48 -17
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +92 -38
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +21 -12
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +72 -38
- 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 +53 -53
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +2 -2
- package/dest/mem_pools/index.d.ts +2 -1
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +16 -14
- package/dest/mem_pools/interface.d.ts +3 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
- package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.js +4 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -2
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +2 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +24 -8
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +70 -14
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +132 -17
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +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 +14 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +353 -185
- 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 +48 -36
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
- package/dest/msg_validators/tx_validator/factory.d.ts +125 -6
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +226 -58
- 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 +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +44 -23
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- package/dest/services/dummy_service.d.ts +9 -5
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +7 -4
- package/dest/services/encoding.d.ts +3 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +11 -10
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +346 -0
- package/dest/services/libp2p/libp2p_service.d.ts +25 -14
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +195 -153
- 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 +1 -1
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +2 -1
- 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 +25 -2
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -3
- 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 +19 -46
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -6
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +10 -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 +25 -46
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +17 -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 +49 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
- package/dest/services/reqresp/interface.d.ts +10 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +15 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +15 -0
- package/dest/services/reqresp/protocols/tx.d.ts +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +13 -5
- package/dest/services/service.d.ts +22 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +19 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +46 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +56 -36
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +90 -0
- package/dest/services/tx_collection/index.d.ts +2 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -0
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +2 -1
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -6
- 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/slow_tx_collection.d.ts +7 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +60 -26
- package/dest/services/tx_collection/tx_collection.d.ts +23 -10
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +75 -3
- package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +26 -29
- package/dest/services/tx_collection/tx_source.d.ts +8 -3
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +19 -2
- package/dest/services/tx_file_store/config.d.ts +1 -3
- package/dest/services/tx_file_store/config.d.ts.map +1 -1
- package/dest/services/tx_file_store/config.js +0 -4
- package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +9 -6
- package/dest/services/tx_provider.d.ts +4 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +9 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +1 -2
- package/dest/test-helpers/mock-pubsub.d.ts +30 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +105 -4
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +4 -3
- package/dest/test-helpers/testbench-utils.d.ts +35 -24
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +104 -36
- 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 +16 -15
- 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 -2
- package/dest/util.d.ts +3 -3
- package/dest/util.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/client/factory.ts +79 -24
- package/src/client/interface.ts +43 -33
- package/src/client/p2p_client.ts +165 -265
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +20 -11
- package/src/config.ts +141 -44
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +100 -48
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +57 -53
- package/src/mem_pools/attestation_pool/index.ts +3 -3
- package/src/mem_pools/attestation_pool/mocks.ts +2 -1
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/instrumentation.ts +17 -13
- package/src/mem_pools/interface.ts +2 -2
- package/src/mem_pools/tx_pool/README.md +1 -1
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
- package/src/mem_pools/tx_pool/priority.ts +6 -3
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
- package/src/mem_pools/tx_pool_v2/README.md +85 -11
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -2
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
- package/src/mem_pools/tx_pool_v2/index.ts +2 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +26 -8
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +191 -25
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +21 -7
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +398 -183
- 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 +63 -40
- package/src/msg_validators/tx_validator/README.md +115 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
- package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
- package/src/msg_validators/tx_validator/factory.ts +366 -77
- 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 +51 -26
- package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
- package/src/services/dummy_service.ts +12 -6
- package/src/services/encoding.ts +9 -9
- package/src/services/gossipsub/README.md +641 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +487 -0
- package/src/services/libp2p/libp2p_service.ts +206 -164
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +2 -1
- package/src/services/peer-manager/peer_scoring.ts +25 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +20 -48
- package/src/services/reqresp/batch-tx-requester/interface.ts +1 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +23 -71
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +63 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
- package/src/services/reqresp/interface.ts +26 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
- package/src/services/reqresp/protocols/tx.ts +22 -0
- package/src/services/reqresp/reqresp.ts +16 -4
- package/src/services/service.ts +31 -2
- package/src/services/tx_collection/config.ts +68 -0
- package/src/services/tx_collection/fast_tx_collection.ts +65 -32
- package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
- package/src/services/tx_collection/file_store_tx_source.ts +117 -0
- package/src/services/tx_collection/index.ts +1 -0
- package/src/services/tx_collection/instrumentation.ts +7 -1
- package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
- package/src/services/tx_collection/proposal_tx_collector.ts +8 -7
- package/src/services/tx_collection/slow_tx_collection.ts +66 -33
- package/src/services/tx_collection/tx_collection.ts +113 -16
- package/src/services/tx_collection/tx_collection_sink.ts +30 -34
- package/src/services/tx_collection/tx_source.ts +22 -3
- package/src/services/tx_file_store/config.ts +0 -6
- package/src/services/tx_file_store/tx_file_store.ts +10 -8
- package/src/services/tx_provider.ts +10 -9
- package/src/test-helpers/make-test-p2p-clients.ts +4 -6
- package/src/test-helpers/mock-pubsub.ts +146 -9
- package/src/test-helpers/reqresp-nodes.ts +5 -7
- package/src/test-helpers/testbench-utils.ts +118 -40
- package/src/testbench/p2p_client_testbench_worker.ts +25 -21
- package/src/testbench/worker_client_manager.ts +13 -5
- package/src/util.ts +8 -2
- 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/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
2
3
|
import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
3
4
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
5
|
import { DatabasePublicStateSource } from '@aztec/stdlib/trees';
|
|
5
6
|
import { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
6
7
|
import { TxArchive } from './archive/index.js';
|
|
7
|
-
import {
|
|
8
|
+
import { DeletedPool } from './deleted_pool.js';
|
|
9
|
+
import { EvictionManager, FeePayerBalanceEvictionRule, FeePayerBalancePreAddRule, InvalidTxsAfterMiningRule, InvalidTxsAfterReorgRule, LowPriorityEvictionRule, LowPriorityPreAddRule, NullifierConflictRule, TxPoolRejectionCode } from './eviction/index.js';
|
|
10
|
+
import { TxPoolV2Instrumentation } from './instrumentation.js';
|
|
8
11
|
import { DEFAULT_TX_POOL_V2_CONFIG } from './interfaces.js';
|
|
9
12
|
import { buildTxMetaData, checkNullifierConflict } from './tx_metadata.js';
|
|
10
13
|
import { TxPoolIndices } from './tx_pool_indices.js';
|
|
@@ -19,26 +22,33 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
19
22
|
// === Dependencies ===
|
|
20
23
|
#l2BlockSource;
|
|
21
24
|
#worldStateSynchronizer;
|
|
22
|
-
#
|
|
25
|
+
#createTxValidator;
|
|
23
26
|
// === In-Memory Indices ===
|
|
24
27
|
#indices = new TxPoolIndices();
|
|
25
28
|
// === Config & Services ===
|
|
26
29
|
#config;
|
|
27
30
|
#archive;
|
|
31
|
+
#deletedPool;
|
|
28
32
|
#evictionManager;
|
|
33
|
+
#dateProvider;
|
|
34
|
+
#instrumentation;
|
|
35
|
+
#evictedTxHashes = new Set();
|
|
29
36
|
#log;
|
|
30
37
|
#callbacks;
|
|
31
|
-
constructor(store, archiveStore, deps, callbacks, config = {}, log){
|
|
38
|
+
constructor(store, archiveStore, deps, callbacks, telemetry, config = {}, dateProvider, log){
|
|
32
39
|
this.#store = store;
|
|
33
40
|
this.#txsDB = store.openMap('txs');
|
|
34
41
|
this.#l2BlockSource = deps.l2BlockSource;
|
|
35
42
|
this.#worldStateSynchronizer = deps.worldStateSynchronizer;
|
|
36
|
-
this.#
|
|
43
|
+
this.#createTxValidator = deps.createTxValidator;
|
|
37
44
|
this.#config = {
|
|
38
45
|
...DEFAULT_TX_POOL_V2_CONFIG,
|
|
39
46
|
...config
|
|
40
47
|
};
|
|
41
48
|
this.#archive = new TxArchive(archiveStore, this.#config.archivedTxLimit, log);
|
|
49
|
+
this.#deletedPool = new DeletedPool(store, this.#txsDB, log);
|
|
50
|
+
this.#dateProvider = dateProvider;
|
|
51
|
+
this.#instrumentation = new TxPoolV2Instrumentation(telemetry, ()=>this.#indices.getTotalMetadataBytes());
|
|
42
52
|
this.#log = log;
|
|
43
53
|
this.#callbacks = callbacks;
|
|
44
54
|
// Setup eviction manager with rules
|
|
@@ -69,7 +79,9 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
69
79
|
* Note: Protected status is lost on restart. All non-mined txs are rebuilt as pending
|
|
70
80
|
* by running pre-add rules to resolve nullifier conflicts, balance checks, and pool size limits.
|
|
71
81
|
*/ async hydrateFromDatabase() {
|
|
72
|
-
// Step
|
|
82
|
+
// Step 0: Hydrate deleted pool state
|
|
83
|
+
await this.#deletedPool.hydrateFromDatabase();
|
|
84
|
+
// Step 1: Load all transactions from DB (excluding soft-deleted)
|
|
73
85
|
const { loaded, errors: deserializationErrors } = await this.#loadAllTxsFromDb();
|
|
74
86
|
// Step 2: Check mined status for each tx
|
|
75
87
|
await this.#markMinedStatusBatch(loaded.map((l)=>l.meta));
|
|
@@ -84,7 +96,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
84
96
|
}
|
|
85
97
|
}
|
|
86
98
|
// Step 4: Validate non-mined transactions
|
|
87
|
-
const { valid, invalid } = await this.#
|
|
99
|
+
const { valid, invalid } = await this.#revalidateMetadata(nonMined.map((e)=>e.meta), 'on startup');
|
|
88
100
|
// Step 5: Populate mined indices (these don't need conflict resolution)
|
|
89
101
|
for (const meta of mined){
|
|
90
102
|
this.#indices.addMined(meta);
|
|
@@ -106,14 +118,43 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
106
118
|
await this.#txsDB.delete(txHashStr);
|
|
107
119
|
}
|
|
108
120
|
});
|
|
109
|
-
this.#log.info(`Deleted ${toDelete.length} invalid/rejected transactions on startup
|
|
121
|
+
this.#log.info(`Deleted ${toDelete.length} invalid/rejected transactions on startup`, {
|
|
122
|
+
txHashes: toDelete
|
|
123
|
+
});
|
|
110
124
|
}
|
|
111
125
|
async addPendingTxs(txs, opts) {
|
|
112
126
|
const accepted = [];
|
|
113
127
|
const ignored = [];
|
|
114
128
|
const rejected = [];
|
|
129
|
+
const errors = new Map();
|
|
115
130
|
const acceptedPending = new Set();
|
|
131
|
+
// Phase 1: Pre-compute all throwable I/O outside the transaction.
|
|
132
|
+
// If any pre-computation throws, the entire call fails before mutations happen.
|
|
133
|
+
const precomputed = new Map();
|
|
134
|
+
const validator = await this.#createTxValidator();
|
|
135
|
+
for (const tx of txs){
|
|
136
|
+
const txHash = tx.getTxHash();
|
|
137
|
+
const txHashStr = txHash.toString();
|
|
138
|
+
const meta = await buildTxMetaData(tx);
|
|
139
|
+
const minedBlockId = await this.#getMinedBlockId(txHash);
|
|
140
|
+
// Validate non-mined txs (mined and pre-protected txs bypass validation inside the transaction)
|
|
141
|
+
let isValid = true;
|
|
142
|
+
if (!minedBlockId) {
|
|
143
|
+
isValid = await this.#validateMeta(meta, validator);
|
|
144
|
+
}
|
|
145
|
+
precomputed.set(txHashStr, {
|
|
146
|
+
meta,
|
|
147
|
+
minedBlockId,
|
|
148
|
+
isValid
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Phase 2: Apply mutations inside the transaction using only pre-computed results,
|
|
152
|
+
// in-memory reads, and buffered DB writes. Nothing here can throw an unhandled exception.
|
|
116
153
|
const poolAccess = this.#createPreAddPoolAccess();
|
|
154
|
+
const preAddContext = opts.feeComparisonOnly !== undefined ? {
|
|
155
|
+
feeComparisonOnly: opts.feeComparisonOnly,
|
|
156
|
+
priceBumpPercentage: this.#config.priceBumpPercentage
|
|
157
|
+
} : undefined;
|
|
117
158
|
await this.#store.transactionAsync(async ()=>{
|
|
118
159
|
for (const tx of txs){
|
|
119
160
|
const txHash = tx.getTxHash();
|
|
@@ -123,82 +164,112 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
123
164
|
ignored.push(txHash);
|
|
124
165
|
continue;
|
|
125
166
|
}
|
|
126
|
-
|
|
127
|
-
const minedBlockId = await this.#getMinedBlockId(txHash);
|
|
167
|
+
const { meta, minedBlockId, isValid } = precomputed.get(txHashStr);
|
|
128
168
|
const preProtectedSlot = this.#indices.getProtectionSlot(txHashStr);
|
|
129
169
|
if (minedBlockId) {
|
|
130
170
|
// Already mined - add directly (protection already set if pre-protected)
|
|
131
171
|
await this.#addTx(tx, {
|
|
132
172
|
mined: minedBlockId
|
|
133
|
-
}, opts);
|
|
173
|
+
}, opts, meta);
|
|
134
174
|
accepted.push(txHash);
|
|
135
175
|
} else if (preProtectedSlot !== undefined) {
|
|
136
176
|
// Pre-protected and not mined - add as protected (bypass validation)
|
|
137
177
|
await this.#addTx(tx, {
|
|
138
178
|
protected: preProtectedSlot
|
|
139
|
-
}, opts);
|
|
179
|
+
}, opts, meta);
|
|
140
180
|
accepted.push(txHash);
|
|
181
|
+
} else if (!isValid) {
|
|
182
|
+
// Failed pre-computed validation
|
|
183
|
+
rejected.push(txHash);
|
|
141
184
|
} else {
|
|
142
|
-
// Regular pending tx -
|
|
143
|
-
const result = await this.#tryAddRegularPendingTx(tx, opts, poolAccess, acceptedPending, ignored);
|
|
185
|
+
// Regular pending tx - run pre-add rules using pre-computed metadata
|
|
186
|
+
const result = await this.#tryAddRegularPendingTx(tx, meta, opts, poolAccess, acceptedPending, ignored, errors, preAddContext);
|
|
144
187
|
if (result.status === 'accepted') {
|
|
145
188
|
acceptedPending.add(txHashStr);
|
|
146
|
-
} else if (result.status === 'rejected') {
|
|
147
|
-
rejected.push(txHash);
|
|
148
189
|
} else {
|
|
149
190
|
ignored.push(txHash);
|
|
150
191
|
}
|
|
151
192
|
}
|
|
152
193
|
}
|
|
194
|
+
// Run post-add eviction rules for pending txs (inside transaction for atomicity)
|
|
195
|
+
if (acceptedPending.size > 0) {
|
|
196
|
+
const feePayers = Array.from(acceptedPending).map((txHash)=>this.#indices.getMetadata(txHash).feePayer);
|
|
197
|
+
const uniqueFeePayers = new Set(feePayers);
|
|
198
|
+
await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [
|
|
199
|
+
...uniqueFeePayers
|
|
200
|
+
]);
|
|
201
|
+
}
|
|
153
202
|
});
|
|
154
203
|
// Build final accepted list for pending txs (excludes intra-batch evictions)
|
|
155
204
|
for (const txHashStr of acceptedPending){
|
|
156
205
|
accepted.push(TxHash.fromString(txHashStr));
|
|
157
206
|
}
|
|
158
|
-
//
|
|
159
|
-
if (
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
]);
|
|
207
|
+
// Record metrics
|
|
208
|
+
if (ignored.length > 0) {
|
|
209
|
+
this.#instrumentation.recordIgnored(ignored.length);
|
|
210
|
+
}
|
|
211
|
+
if (rejected.length > 0) {
|
|
212
|
+
this.#instrumentation.recordRejected(rejected.length);
|
|
165
213
|
}
|
|
166
214
|
return {
|
|
167
215
|
accepted,
|
|
168
216
|
ignored,
|
|
169
|
-
rejected
|
|
217
|
+
rejected,
|
|
218
|
+
...errors.size > 0 ? {
|
|
219
|
+
errors
|
|
220
|
+
} : {}
|
|
170
221
|
};
|
|
171
222
|
}
|
|
172
|
-
/**
|
|
173
|
-
const
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
if (!await this.#validateTx(tx)) {
|
|
177
|
-
return {
|
|
178
|
-
status: 'rejected'
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
// Build metadata and run pre-add rules
|
|
182
|
-
const meta = await buildTxMetaData(tx);
|
|
183
|
-
const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess);
|
|
223
|
+
/** Adds a validated pending tx, running pre-add rules and evicting conflicts. */ async #tryAddRegularPendingTx(tx, precomputedMeta, opts, poolAccess, acceptedPending, ignored, errors, preAddContext) {
|
|
224
|
+
const txHashStr = tx.getTxHash().toString();
|
|
225
|
+
// Run pre-add rules
|
|
226
|
+
const preAddResult = await this.#evictionManager.runPreAddRules(precomputedMeta, poolAccess, preAddContext);
|
|
184
227
|
if (preAddResult.shouldIgnore) {
|
|
185
|
-
this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason}`);
|
|
228
|
+
this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason?.message ?? 'unknown reason'}`);
|
|
229
|
+
if (preAddResult.reason && preAddResult.reason.code !== TxPoolRejectionCode.INTERNAL_ERROR) {
|
|
230
|
+
errors.set(txHashStr, preAddResult.reason);
|
|
231
|
+
}
|
|
186
232
|
return {
|
|
187
233
|
status: 'ignored'
|
|
188
234
|
};
|
|
189
235
|
}
|
|
190
|
-
// Evict conflicts
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
236
|
+
// Evict conflicts, grouped by rule name for metrics
|
|
237
|
+
if (preAddResult.evictions && preAddResult.evictions.length > 0) {
|
|
238
|
+
const byReason = new Map();
|
|
239
|
+
for (const { txHash: evictHash, reason } of preAddResult.evictions){
|
|
240
|
+
const group = byReason.get(reason);
|
|
241
|
+
if (group) {
|
|
242
|
+
group.push(evictHash);
|
|
243
|
+
} else {
|
|
244
|
+
byReason.set(reason, [
|
|
245
|
+
evictHash
|
|
246
|
+
]);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
for (const [reason, hashes] of byReason){
|
|
250
|
+
await this.#evictTxs(hashes, reason);
|
|
251
|
+
}
|
|
252
|
+
for (const evictHashStr of preAddResult.txHashesToEvict){
|
|
253
|
+
this.#log.debug(`Evicted tx ${evictHashStr} due to higher-fee tx ${txHashStr}`, {
|
|
254
|
+
evictedTxHash: evictHashStr,
|
|
255
|
+
replacementTxHash: txHashStr
|
|
256
|
+
});
|
|
257
|
+
if (acceptedPending.has(evictHashStr)) {
|
|
258
|
+
// Evicted tx was from this batch - mark as ignored in result
|
|
259
|
+
acceptedPending.delete(evictHashStr);
|
|
260
|
+
ignored.push(TxHash.fromString(evictHashStr));
|
|
261
|
+
}
|
|
198
262
|
}
|
|
199
263
|
}
|
|
264
|
+
// Randomly drop the transaction for testing purposes (report as accepted so it propagates)
|
|
265
|
+
if (this.#config.dropTransactionsProbability > 0 && Math.random() < this.#config.dropTransactionsProbability) {
|
|
266
|
+
this.#log.debug(`Dropping tx ${txHashStr} (simulated drop for testing)`);
|
|
267
|
+
return {
|
|
268
|
+
status: 'accepted'
|
|
269
|
+
};
|
|
270
|
+
}
|
|
200
271
|
// Add the transaction
|
|
201
|
-
await this.#addTx(tx, 'pending', opts);
|
|
272
|
+
await this.#addTx(tx, 'pending', opts, precomputedMeta);
|
|
202
273
|
return {
|
|
203
274
|
status: 'accepted'
|
|
204
275
|
};
|
|
@@ -207,18 +278,20 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
207
278
|
const txHashStr = tx.getTxHash().toString();
|
|
208
279
|
// Check if already in pool
|
|
209
280
|
if (this.#indices.has(txHashStr)) {
|
|
281
|
+
this.#log.verbose(`canAddPendingTx: tx ${txHashStr} already in pool`);
|
|
210
282
|
return 'ignored';
|
|
211
283
|
}
|
|
212
|
-
//
|
|
213
|
-
const validationResult = await this.#pendingTxValidator.validateTx(tx);
|
|
214
|
-
if (validationResult.result !== 'valid') {
|
|
215
|
-
return 'rejected';
|
|
216
|
-
}
|
|
217
|
-
// Build metadata and use pre-add rules
|
|
284
|
+
// Build metadata and check pre-add rules
|
|
218
285
|
const meta = await buildTxMetaData(tx);
|
|
219
286
|
const poolAccess = this.#createPreAddPoolAccess();
|
|
220
287
|
const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess);
|
|
221
|
-
|
|
288
|
+
if (preAddResult.shouldIgnore) {
|
|
289
|
+
this.#log.verbose(`canAddPendingTx: tx ${txHashStr} ignored by pre-add rule`, {
|
|
290
|
+
reason: preAddResult.reason?.message ?? 'no reason provided'
|
|
291
|
+
});
|
|
292
|
+
return 'ignored';
|
|
293
|
+
}
|
|
294
|
+
return 'accepted';
|
|
222
295
|
}
|
|
223
296
|
async addProtectedTxs(txs, block, opts) {
|
|
224
297
|
const slotNumber = block.globalVariables.slotNumber;
|
|
@@ -251,20 +324,53 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
251
324
|
}
|
|
252
325
|
});
|
|
253
326
|
}
|
|
254
|
-
protectTxs(txHashes, block) {
|
|
327
|
+
async protectTxs(txHashes, block) {
|
|
255
328
|
const slotNumber = block.globalVariables.slotNumber;
|
|
256
329
|
const missing = [];
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
330
|
+
let softDeletedHits = 0;
|
|
331
|
+
let missingPreviouslyEvicted = 0;
|
|
332
|
+
await this.#store.transactionAsync(async ()=>{
|
|
333
|
+
for (const txHash of txHashes){
|
|
334
|
+
const txHashStr = txHash.toString();
|
|
335
|
+
if (this.#indices.has(txHashStr)) {
|
|
336
|
+
// Update protection for existing tx
|
|
337
|
+
this.#indices.updateProtection(txHashStr, slotNumber);
|
|
338
|
+
} else if (this.#deletedPool.isSoftDeleted(txHashStr)) {
|
|
339
|
+
// Resurrect soft-deleted tx as protected
|
|
340
|
+
const buffer = await this.#txsDB.getAsync(txHashStr);
|
|
341
|
+
if (buffer) {
|
|
342
|
+
const tx = Tx.fromBuffer(buffer);
|
|
343
|
+
await this.#addTx(tx, {
|
|
344
|
+
protected: slotNumber
|
|
345
|
+
});
|
|
346
|
+
softDeletedHits++;
|
|
347
|
+
} else {
|
|
348
|
+
// Data missing despite soft-delete flag — treat as truly missing
|
|
349
|
+
this.#indices.setProtection(txHashStr, slotNumber);
|
|
350
|
+
missing.push(txHash);
|
|
351
|
+
}
|
|
352
|
+
} else {
|
|
353
|
+
// Truly missing — pre-record protection for tx we don't have yet
|
|
354
|
+
this.#indices.setProtection(txHashStr, slotNumber);
|
|
355
|
+
missing.push(txHash);
|
|
356
|
+
if (this.#evictedTxHashes.has(txHashStr)) {
|
|
357
|
+
missingPreviouslyEvicted++;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
266
360
|
}
|
|
361
|
+
});
|
|
362
|
+
// Record metrics
|
|
363
|
+
if (softDeletedHits > 0) {
|
|
364
|
+
this.#instrumentation.recordSoftDeletedHits(softDeletedHits);
|
|
365
|
+
}
|
|
366
|
+
if (missing.length > 0) {
|
|
367
|
+
this.#log.debug(`protectTxs missing tx hashes: ${missing.map((h)=>h.toString()).join(', ')}`);
|
|
368
|
+
this.#instrumentation.recordMissingOnProtect(missing.length);
|
|
267
369
|
}
|
|
370
|
+
if (missingPreviouslyEvicted > 0) {
|
|
371
|
+
this.#instrumentation.recordMissingPreviouslyEvicted(missingPreviouslyEvicted);
|
|
372
|
+
}
|
|
373
|
+
this.#log.info(`Protected ${txHashes.length} txs, missing: ${missing.length}, soft-deleted hits: ${softDeletedHits}`);
|
|
268
374
|
return missing;
|
|
269
375
|
}
|
|
270
376
|
async addMinedTxs(txs, block, opts) {
|
|
@@ -283,6 +389,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
283
389
|
mined: blockId
|
|
284
390
|
}, opts);
|
|
285
391
|
}
|
|
392
|
+
await this.#deletedPool.clearIfMinedHigher(txHashStr, blockId.number);
|
|
286
393
|
}
|
|
287
394
|
});
|
|
288
395
|
}
|
|
@@ -302,44 +409,53 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
302
409
|
found.push(meta);
|
|
303
410
|
}
|
|
304
411
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
412
|
+
await this.#store.transactionAsync(async ()=>{
|
|
413
|
+
// Step 4: Mark txs as mined (only those we have in the pool)
|
|
414
|
+
for (const meta of found){
|
|
415
|
+
this.#indices.markAsMined(meta, blockId);
|
|
416
|
+
await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number);
|
|
417
|
+
}
|
|
418
|
+
// Step 5: Run post-event eviction rules (inside transaction for atomicity)
|
|
419
|
+
await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
|
|
420
|
+
});
|
|
421
|
+
if (found.length > 0) {
|
|
422
|
+
this.#callbacks.onTxsMined(found.map((m)=>m.txHash));
|
|
308
423
|
}
|
|
309
|
-
// Step 5: Run eviction rules (remove pending txs with conflicting nullifiers/expired timestamps)
|
|
310
|
-
await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
|
|
311
424
|
this.#log.info(`Marked ${found.length} txs as mined in block ${blockId.number}`);
|
|
312
425
|
}
|
|
313
426
|
async prepareForSlot(slotNumber) {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
427
|
+
await this.#store.transactionAsync(async ()=>{
|
|
428
|
+
// Step 0: Clean up slot-deleted txs from previous slots
|
|
429
|
+
await this.#deletedPool.cleanupSlotDeleted(slotNumber);
|
|
430
|
+
// Step 1: Find expired protected txs
|
|
431
|
+
const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber);
|
|
432
|
+
// Step 2: Clear protection for all expired entries (including those without metadata)
|
|
433
|
+
this.#indices.clearProtection(expiredProtected);
|
|
434
|
+
// Step 3: Filter to only txs that have metadata and are not mined
|
|
435
|
+
const txsToRestore = this.#indices.filterRestorable(expiredProtected);
|
|
436
|
+
if (txsToRestore.length === 0) {
|
|
437
|
+
this.#log.debug(`Preparing for slot ${slotNumber}, no txs to unprotect`);
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`);
|
|
441
|
+
// Step 4: Validate for pending pool
|
|
442
|
+
const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
|
|
443
|
+
// Step 5: Resolve nullifier conflicts and add winners to pending indices
|
|
444
|
+
const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
|
|
445
|
+
// Step 6: Delete invalid txs and evict conflict losers
|
|
446
|
+
await this.#deleteTxsBatch(invalid);
|
|
447
|
+
await this.#evictTxs(toEvict, 'NullifierConflict');
|
|
448
|
+
// Step 7: Run eviction rules (enforce pool size limit)
|
|
449
|
+
if (added.length > 0) {
|
|
450
|
+
const feePayers = added.map((meta)=>meta.feePayer);
|
|
451
|
+
const uniqueFeePayers = new Set(feePayers);
|
|
452
|
+
await this.#evictionManager.evictAfterNewTxs(added.map((m)=>m.txHash), [
|
|
453
|
+
...uniqueFeePayers
|
|
454
|
+
]);
|
|
455
|
+
}
|
|
456
|
+
});
|
|
341
457
|
}
|
|
342
|
-
async handlePrunedBlocks(latestBlock) {
|
|
458
|
+
async handlePrunedBlocks(latestBlock, options) {
|
|
343
459
|
// Step 1: Find transactions mined after the prune point
|
|
344
460
|
const txsToUnmine = this.#indices.findTxsMinedAfter(latestBlock.number);
|
|
345
461
|
if (txsToUnmine.length === 0) {
|
|
@@ -347,54 +463,81 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
347
463
|
return;
|
|
348
464
|
}
|
|
349
465
|
this.#log.info(`Handling prune to block ${latestBlock.number}: un-mining ${txsToUnmine.length} txs`);
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
466
|
+
await this.#store.transactionAsync(async ()=>{
|
|
467
|
+
// Step 2: Mark ALL un-mined txs with their original mined block number
|
|
468
|
+
// This ensures they get soft-deleted if removed later, and only hard-deleted
|
|
469
|
+
// when their original mined block is finalized
|
|
470
|
+
await this.#deletedPool.markFromPrunedBlock(txsToUnmine.map((m)=>({
|
|
471
|
+
txHash: m.txHash,
|
|
472
|
+
minedAtBlock: BlockNumber(m.minedL2BlockId.number)
|
|
473
|
+
})));
|
|
474
|
+
// Step 3: Unmine - clear mined status from metadata
|
|
475
|
+
for (const meta of txsToUnmine){
|
|
476
|
+
this.#indices.markAsUnmined(meta);
|
|
477
|
+
}
|
|
478
|
+
// If deleteAllTxs is set (epoch prune), delete all un-mined txs and return early
|
|
479
|
+
if (options?.deleteAllTxs) {
|
|
480
|
+
const allTxHashes = txsToUnmine.map((m)=>m.txHash);
|
|
481
|
+
await this.#deleteTxsBatch(allTxHashes);
|
|
482
|
+
this.#log.info(`Handled prune to block ${latestBlock.number} with deleteAllTxs: deleted ${allTxHashes.length} txs`);
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
// Step 4: Filter out protected txs (they'll be handled by prepareForSlot)
|
|
486
|
+
const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine);
|
|
487
|
+
// Step 5: Validate for pending pool
|
|
488
|
+
const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks');
|
|
489
|
+
// Step 6: Resolve nullifier conflicts and add winners to pending indices
|
|
490
|
+
const { toEvict } = this.#applyNullifierConflictResolution(valid);
|
|
491
|
+
// Step 7: Delete invalid txs and evict conflict losers
|
|
492
|
+
await this.#deleteTxsBatch(invalid);
|
|
493
|
+
await this.#evictTxs(toEvict, 'NullifierConflict');
|
|
494
|
+
this.#log.info(`Handled prune to block ${latestBlock.number}: ${valid.length} txs restored to pending, ${invalid.length} invalid, ${toEvict.length} evicted due to nullifier conflicts`, {
|
|
495
|
+
txHashesRestored: valid.map((m)=>m.txHash),
|
|
496
|
+
txHashesInvalid: invalid,
|
|
497
|
+
txHashesEvicted: toEvict
|
|
498
|
+
});
|
|
499
|
+
// Step 8: Run eviction rules for ALL pending txs (not just restored ones)
|
|
500
|
+
// This handles cases like existing pending txs with invalid fee payer balances
|
|
501
|
+
await this.#evictionManager.evictAfterChainPrune(latestBlock.number);
|
|
502
|
+
});
|
|
368
503
|
}
|
|
369
504
|
async handleFailedExecution(txHashes) {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
505
|
+
await this.#store.transactionAsync(async ()=>{
|
|
506
|
+
await this.#deleteTxsBatch(txHashes.map((h)=>h.toString()));
|
|
507
|
+
});
|
|
508
|
+
this.#log.info(`Deleted ${txHashes.length} failed txs`, {
|
|
509
|
+
txHashes: txHashes.map((h)=>h.toString())
|
|
510
|
+
});
|
|
373
511
|
}
|
|
374
512
|
async handleFinalizedBlock(block) {
|
|
375
513
|
const blockNumber = block.globalVariables.blockNumber;
|
|
376
|
-
// Step 1: Find txs
|
|
377
|
-
const
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
txsToArchive.push(Tx.fromBuffer(buffer));
|
|
514
|
+
// Step 1: Find mined txs at or before finalized block
|
|
515
|
+
const minedTxsToFinalize = this.#indices.findTxsMinedAtOrBefore(blockNumber);
|
|
516
|
+
await this.#store.transactionAsync(async ()=>{
|
|
517
|
+
// Step 2: Collect mined txs for archiving (before deletion)
|
|
518
|
+
const txsToArchive = [];
|
|
519
|
+
if (this.#archive.isEnabled()) {
|
|
520
|
+
for (const txHashStr of minedTxsToFinalize){
|
|
521
|
+
const buffer = await this.#txsDB.getAsync(txHashStr);
|
|
522
|
+
if (buffer) {
|
|
523
|
+
txsToArchive.push(Tx.fromBuffer(buffer));
|
|
524
|
+
}
|
|
388
525
|
}
|
|
389
526
|
}
|
|
527
|
+
// Step 3: Delete mined txs from active pool
|
|
528
|
+
await this.#deleteTxsBatch(minedTxsToFinalize);
|
|
529
|
+
// Step 4: Finalize soft-deleted txs
|
|
530
|
+
await this.#deletedPool.finalizeBlock(blockNumber);
|
|
531
|
+
// Step 5: Archive mined txs
|
|
532
|
+
if (txsToArchive.length > 0) {
|
|
533
|
+
await this.#archive.archiveTxs(txsToArchive);
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
if (minedTxsToFinalize.length > 0) {
|
|
537
|
+
this.#log.info(`Finalized ${minedTxsToFinalize.length} mined txs from blocks up to ${blockNumber}`, {
|
|
538
|
+
txHashes: minedTxsToFinalize
|
|
539
|
+
});
|
|
390
540
|
}
|
|
391
|
-
// Step 3: Delete from active pool
|
|
392
|
-
await this.#deleteTxsBatch(txsToFinalize);
|
|
393
|
-
// Step 4: Archive
|
|
394
|
-
if (txsToArchive.length > 0) {
|
|
395
|
-
await this.#archive.archiveTxs(txsToArchive);
|
|
396
|
-
}
|
|
397
|
-
this.#log.info(`Finalized ${txsToFinalize.length} txs from blocks up to ${blockNumber}`);
|
|
398
541
|
}
|
|
399
542
|
// === Query Methods ===
|
|
400
543
|
async getTxByHash(txHash) {
|
|
@@ -410,20 +553,34 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
410
553
|
return results;
|
|
411
554
|
}
|
|
412
555
|
hasTxs(txHashes) {
|
|
413
|
-
return txHashes.map((h)=>
|
|
556
|
+
return txHashes.map((h)=>{
|
|
557
|
+
const hashStr = h.toString();
|
|
558
|
+
return this.#indices.has(hashStr) || this.#deletedPool.isSoftDeleted(hashStr);
|
|
559
|
+
});
|
|
414
560
|
}
|
|
415
561
|
getTxStatus(txHash) {
|
|
416
|
-
const
|
|
417
|
-
|
|
418
|
-
|
|
562
|
+
const txHashStr = txHash.toString();
|
|
563
|
+
const meta = this.#indices.getMetadata(txHashStr);
|
|
564
|
+
if (meta) {
|
|
565
|
+
return this.#indices.getTxState(meta);
|
|
566
|
+
}
|
|
567
|
+
// Check if soft-deleted
|
|
568
|
+
if (this.#deletedPool.isSoftDeleted(txHashStr)) {
|
|
569
|
+
return 'deleted';
|
|
419
570
|
}
|
|
420
|
-
return
|
|
571
|
+
return undefined;
|
|
421
572
|
}
|
|
422
573
|
getPendingTxHashes() {
|
|
423
574
|
return [
|
|
424
575
|
...this.#indices.iteratePendingByPriority('desc')
|
|
425
576
|
].map((hash)=>TxHash.fromString(hash));
|
|
426
577
|
}
|
|
578
|
+
getEligiblePendingTxHashes() {
|
|
579
|
+
const maxReceivedAt = this.#dateProvider.now() - this.#config.minTxPoolAgeMs;
|
|
580
|
+
return [
|
|
581
|
+
...this.#indices.iterateEligiblePendingByPriority('desc', maxReceivedAt)
|
|
582
|
+
].map((hash)=>TxHash.fromString(hash));
|
|
583
|
+
}
|
|
427
584
|
getPendingTxCount() {
|
|
428
585
|
return this.#indices.getPendingTxCount();
|
|
429
586
|
}
|
|
@@ -463,6 +620,9 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
463
620
|
this.#config.archivedTxLimit = config.archivedTxLimit;
|
|
464
621
|
this.#archive.updateLimit(config.archivedTxLimit);
|
|
465
622
|
}
|
|
623
|
+
if (config.minTxPoolAgeMs !== undefined) {
|
|
624
|
+
this.#config.minTxPoolAgeMs = config.minTxPoolAgeMs;
|
|
625
|
+
}
|
|
466
626
|
// Update eviction rules with new config
|
|
467
627
|
this.#evictionManager.updateConfig(config);
|
|
468
628
|
}
|
|
@@ -477,7 +637,10 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
477
637
|
}
|
|
478
638
|
// === Metrics ===
|
|
479
639
|
countTxs() {
|
|
480
|
-
return
|
|
640
|
+
return {
|
|
641
|
+
...this.#indices.countTxs(),
|
|
642
|
+
softDeleted: this.#deletedPool.getSoftDeletedCount()
|
|
643
|
+
};
|
|
481
644
|
}
|
|
482
645
|
// ============================================================================
|
|
483
646
|
// PRIVATE HELPERS - Transaction Management
|
|
@@ -485,10 +648,12 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
485
648
|
/**
|
|
486
649
|
* Adds a new transaction to the pool with the specified state.
|
|
487
650
|
* Emits onTxsAdded callback immediately after DB write.
|
|
488
|
-
*/ async #addTx(tx, state, opts = {}) {
|
|
651
|
+
*/ async #addTx(tx, state, opts = {}, precomputedMeta) {
|
|
489
652
|
const txHashStr = tx.getTxHash().toString();
|
|
490
|
-
const meta = await buildTxMetaData(tx);
|
|
653
|
+
const meta = precomputedMeta ?? await buildTxMetaData(tx);
|
|
654
|
+
meta.receivedAt = this.#dateProvider.now();
|
|
491
655
|
await this.#txsDB.set(txHashStr, tx.toBuffer());
|
|
656
|
+
await this.#deletedPool.clearSoftDeleted(txHashStr);
|
|
492
657
|
this.#callbacks.onTxsAdded([
|
|
493
658
|
tx
|
|
494
659
|
], opts);
|
|
@@ -501,64 +666,74 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
501
666
|
this.#indices.addMined(meta);
|
|
502
667
|
}
|
|
503
668
|
const stateStr = typeof state === 'string' ? state : Object.keys(state)[0];
|
|
504
|
-
this.#log.
|
|
669
|
+
this.#log.debug(`Added tx ${txHashStr} as ${stateStr}`, {
|
|
505
670
|
eventName: 'tx-added-to-pool',
|
|
506
|
-
|
|
671
|
+
txHash: txHashStr,
|
|
672
|
+
state: stateStr,
|
|
673
|
+
source: opts.source
|
|
507
674
|
});
|
|
508
675
|
return meta;
|
|
509
676
|
}
|
|
510
677
|
/**
|
|
511
678
|
* Deletes a transaction from both indices and DB.
|
|
512
679
|
* Emits onTxsRemoved callback immediately after DB delete.
|
|
680
|
+
*/ /**
|
|
681
|
+
* Deletes a transaction from the pool.
|
|
682
|
+
* Delegates to DeletedPool which decides soft vs hard delete based on whether
|
|
683
|
+
* the tx is from a pruned block.
|
|
513
684
|
*/ async #deleteTx(txHashStr) {
|
|
514
685
|
this.#indices.remove(txHashStr);
|
|
515
|
-
await this.#txsDB.delete(txHashStr);
|
|
516
686
|
this.#callbacks.onTxsRemoved([
|
|
517
687
|
txHashStr
|
|
518
688
|
]);
|
|
689
|
+
await this.#deletedPool.deleteTx(txHashStr);
|
|
519
690
|
}
|
|
520
691
|
/** Deletes a batch of transactions, emitting callbacks individually for each. */ async #deleteTxsBatch(txHashes) {
|
|
521
692
|
for (const txHashStr of txHashes){
|
|
522
693
|
await this.#deleteTx(txHashStr);
|
|
523
694
|
}
|
|
524
695
|
}
|
|
696
|
+
/** Evicts transactions: records eviction metric with reason, caches hashes, then deletes. */ async #evictTxs(txHashes, reason) {
|
|
697
|
+
if (txHashes.length === 0) {
|
|
698
|
+
return;
|
|
699
|
+
}
|
|
700
|
+
this.#instrumentation.recordEvictions(txHashes.length, reason);
|
|
701
|
+
for (const txHashStr of txHashes){
|
|
702
|
+
this.#log.debug(`Evicting tx ${txHashStr}`, {
|
|
703
|
+
txHash: txHashStr,
|
|
704
|
+
reason
|
|
705
|
+
});
|
|
706
|
+
this.#addToEvictedCache(txHashStr);
|
|
707
|
+
}
|
|
708
|
+
await this.#deleteTxsBatch(txHashes);
|
|
709
|
+
}
|
|
710
|
+
/** Adds a tx hash to the bounded evicted cache, evicting the oldest entry if at capacity. */ #addToEvictedCache(txHashStr) {
|
|
711
|
+
if (this.#evictedTxHashes.size >= this.#config.evictedTxCacheSize) {
|
|
712
|
+
// FIFO eviction: remove the first (oldest) entry
|
|
713
|
+
const oldest = this.#evictedTxHashes.values().next().value;
|
|
714
|
+
this.#evictedTxHashes.delete(oldest);
|
|
715
|
+
}
|
|
716
|
+
this.#evictedTxHashes.add(txHashStr);
|
|
717
|
+
}
|
|
525
718
|
// ============================================================================
|
|
526
719
|
// PRIVATE HELPERS - Validation & Conflict Resolution
|
|
527
720
|
// ============================================================================
|
|
528
|
-
/** Validates
|
|
529
|
-
const
|
|
721
|
+
/** Validates transaction metadata, returning true if valid */ async #validateMeta(meta, validator, context) {
|
|
722
|
+
const txValidator = validator ?? await this.#createTxValidator();
|
|
723
|
+
const result = await txValidator.validateTx(meta);
|
|
530
724
|
if (result.result !== 'valid') {
|
|
531
725
|
const contextStr = context ? ` ${context}` : '';
|
|
532
|
-
this.#log.info(`Tx ${
|
|
726
|
+
this.#log.info(`Tx ${meta.txHash}${contextStr} failed validation: ${result.reason?.join(', ')}`);
|
|
533
727
|
return false;
|
|
534
728
|
}
|
|
535
729
|
return true;
|
|
536
730
|
}
|
|
537
|
-
/**
|
|
538
|
-
const loaded = [];
|
|
539
|
-
const missing = [];
|
|
540
|
-
for (const meta of metas){
|
|
541
|
-
const buffer = await this.#txsDB.getAsync(meta.txHash);
|
|
542
|
-
if (!buffer) {
|
|
543
|
-
this.#log.warn(`Tx ${meta.txHash} not found in DB`);
|
|
544
|
-
missing.push(meta.txHash);
|
|
545
|
-
continue;
|
|
546
|
-
}
|
|
547
|
-
loaded.push({
|
|
548
|
-
tx: Tx.fromBuffer(buffer),
|
|
549
|
-
meta
|
|
550
|
-
});
|
|
551
|
-
}
|
|
552
|
-
return {
|
|
553
|
-
loaded,
|
|
554
|
-
missing
|
|
555
|
-
};
|
|
556
|
-
}
|
|
557
|
-
/** Validates a batch of transactions, returning valid and invalid groups */ async #validateTxBatch(txs, context) {
|
|
731
|
+
/** Validates metadata directly */ async #revalidateMetadata(metas, context) {
|
|
558
732
|
const valid = [];
|
|
559
733
|
const invalid = [];
|
|
560
|
-
|
|
561
|
-
|
|
734
|
+
const validator = await this.#createTxValidator();
|
|
735
|
+
for (const meta of metas){
|
|
736
|
+
if (await this.#validateMeta(meta, validator, context)) {
|
|
562
737
|
valid.push(meta);
|
|
563
738
|
} else {
|
|
564
739
|
invalid.push(meta.txHash);
|
|
@@ -569,17 +744,6 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
569
744
|
invalid
|
|
570
745
|
};
|
|
571
746
|
}
|
|
572
|
-
/** Loads transactions from DB and validates them */ async #loadAndValidateTxs(metas, context) {
|
|
573
|
-
const { loaded, missing } = await this.#loadTxsFromDb(metas);
|
|
574
|
-
const { valid, invalid } = await this.#validateTxBatch(loaded, context);
|
|
575
|
-
return {
|
|
576
|
-
valid,
|
|
577
|
-
invalid: [
|
|
578
|
-
...missing,
|
|
579
|
-
...invalid
|
|
580
|
-
]
|
|
581
|
-
};
|
|
582
|
-
}
|
|
583
747
|
/**
|
|
584
748
|
* Resolves nullifier conflicts between incoming txs and existing pending txs.
|
|
585
749
|
* Modifies the pending indices during iteration to maintain consistent state
|
|
@@ -635,6 +799,10 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
635
799
|
const loaded = [];
|
|
636
800
|
const errors = [];
|
|
637
801
|
for await (const [txHashStr, buffer] of this.#txsDB.entriesAsync()){
|
|
802
|
+
// Skip soft-deleted transactions - they stay in DB but not in indices
|
|
803
|
+
if (this.#deletedPool.isSoftDeleted(txHashStr)) {
|
|
804
|
+
continue;
|
|
805
|
+
}
|
|
638
806
|
try {
|
|
639
807
|
const tx = Tx.fromBuffer(buffer);
|
|
640
808
|
const meta = await buildTxMetaData(tx);
|
|
@@ -685,7 +853,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
685
853
|
if (preAddResult.shouldIgnore) {
|
|
686
854
|
// Transaction rejected - mark for deletion from DB
|
|
687
855
|
rejected.push(meta.txHash);
|
|
688
|
-
this.#log.debug(`Rejected tx ${meta.txHash} during rebuild: ${preAddResult.reason}`);
|
|
856
|
+
this.#log.debug(`Rejected tx ${meta.txHash} during rebuild: ${preAddResult.reason?.message ?? 'unknown reason'}`);
|
|
689
857
|
continue;
|
|
690
858
|
}
|
|
691
859
|
// Evict any conflicting txs identified by pre-add rules
|
|
@@ -721,7 +889,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
721
889
|
getFeePayerPendingTxs: (feePayer)=>this.#indices.getFeePayerPendingTxs(feePayer),
|
|
722
890
|
getPendingTxCount: ()=>this.#indices.getPendingTxCount(),
|
|
723
891
|
getLowestPriorityPending: (limit)=>this.#indices.getLowestPriorityPending(limit),
|
|
724
|
-
deleteTxs: (txHashes)=>this.#
|
|
892
|
+
deleteTxs: (txHashes, reason)=>this.#evictTxs(txHashes, reason ?? 'unknown')
|
|
725
893
|
};
|
|
726
894
|
}
|
|
727
895
|
#createPreAddPoolAccess() {
|