@aztec/p2p 0.0.1-commit.fcb71a6 → 0.0.1-commit.ff7989d6c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +4 -4
- package/dest/client/factory.d.ts +7 -6
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +53 -14
- package/dest/client/interface.d.ts +58 -25
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +46 -51
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +601 -259
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +35 -7
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +23 -9
- 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 +111 -76
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +527 -287
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts +9 -6
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +16 -12
- package/dest/mem_pools/index.d.ts +3 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/index.js +1 -1
- package/dest/mem_pools/instrumentation.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +5 -14
- package/dest/mem_pools/interface.d.ts +5 -5
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +15 -10
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +91 -50
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +19 -5
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +59 -3
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +79 -5
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +47 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +4 -4
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +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 +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +95 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/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 +211 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +97 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +152 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +355 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +896 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +51 -18
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -7
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -13
- package/dest/msg_validators/clock_tolerance.d.ts +21 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +37 -0
- package/dest/msg_validators/index.d.ts +2 -2
- package/dest/msg_validators/index.d.ts.map +1 -1
- package/dest/msg_validators/index.js +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +4 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
- package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +21 -11
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
- package/dest/msg_validators/tx_validator/index.d.ts +2 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +10 -6
- package/dest/services/discv5/discV5_service.js +1 -1
- package/dest/services/dummy_service.d.ts +28 -3
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +51 -0
- package/dest/services/encoding.d.ts +2 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +9 -7
- 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/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/instrumentation.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +30 -72
- package/dest/services/libp2p/libp2p_service.d.ts +106 -33
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +984 -317
- package/dest/services/peer-manager/metrics.d.ts +2 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +21 -26
- package/dest/services/peer-manager/peer_manager.d.ts +2 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +0 -10
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +32 -6
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +48 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +562 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +46 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +34 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +130 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- package/dest/services/reqresp/interface.d.ts +12 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +15 -1
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -21
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
- package/dest/services/reqresp/protocols/status.d.ts +1 -1
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +4 -1
- 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 +6 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +471 -50
- package/dest/services/service.d.ts +55 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +22 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +55 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +7 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +71 -44
- 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 +3 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +2 -0
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +11 -13
- 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 +49 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +9 -5
- 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 +29 -16
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +79 -7
- package/dest/services/tx_collection/tx_collection_sink.d.ts +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 +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +152 -0
- package/dest/services/tx_provider.d.ts +5 -5
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +5 -4
- package/dest/services/tx_provider_instrumentation.d.ts +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +7 -20
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.d.ts +29 -2
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +103 -2
- package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +2 -1
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +163 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +366 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +221 -127
- package/dest/testbench/worker_client_manager.d.ts +51 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +226 -39
- package/dest/util.d.ts +2 -2
- package/dest/util.d.ts.map +1 -1
- package/package.json +16 -16
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +96 -24
- package/src/client/interface.ts +76 -25
- package/src/client/p2p_client.ts +269 -290
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +346 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +49 -13
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +510 -78
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +612 -320
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +20 -13
- package/src/mem_pools/index.ts +4 -1
- package/src/mem_pools/instrumentation.ts +10 -18
- package/src/mem_pools/interface.ts +4 -4
- package/src/mem_pools/tx_pool/README.md +29 -14
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +130 -75
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +66 -5
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +119 -4
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
- package/src/mem_pools/tx_pool_v2/README.md +275 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +122 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +242 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1069 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +36 -21
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +21 -18
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
- package/src/msg_validators/tx_validator/data_validator.ts +18 -6
- package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
- package/src/msg_validators/tx_validator/factory.ts +64 -23
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
- package/src/msg_validators/tx_validator/index.ts +1 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +18 -7
- package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -19
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +1 -1
- package/src/services/dummy_service.ts +68 -1
- package/src/services/encoding.ts +8 -6
- 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/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +32 -73
- package/src/services/libp2p/libp2p_service.ts +651 -301
- package/src/services/peer-manager/metrics.ts +22 -26
- package/src/services/peer-manager/peer_manager.ts +1 -2
- package/src/services/peer-manager/peer_scoring.ts +28 -4
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +53 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +161 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/interface.ts +29 -1
- package/src/services/reqresp/metrics.ts +36 -27
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
- package/src/services/reqresp/protocols/status.ts +7 -4
- package/src/services/reqresp/protocols/tx.ts +22 -0
- package/src/services/reqresp/reqresp.ts +79 -22
- package/src/services/service.ts +72 -4
- package/src/services/tx_collection/config.ts +83 -1
- package/src/services/tx_collection/fast_tx_collection.ts +93 -47
- 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 +6 -0
- package/src/services/tx_collection/instrumentation.ts +11 -13
- package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
- package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
- package/src/services/tx_collection/slow_tx_collection.ts +68 -35
- package/src/services/tx_collection/tx_collection.ts +121 -24
- 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 +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +175 -0
- package/src/services/tx_provider.ts +10 -9
- package/src/services/tx_provider_instrumentation.ts +13 -20
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/make-test-p2p-clients.ts +3 -3
- package/src/test-helpers/mock-pubsub.ts +143 -3
- package/src/test-helpers/reqresp-nodes.ts +2 -1
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +430 -0
- package/src/testbench/p2p_client_testbench_worker.ts +348 -123
- package/src/testbench/worker_client_manager.ts +304 -42
- package/src/util.ts +7 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -37
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -213
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -30
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -219
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +0 -15
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +0 -88
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
- package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/index.js +0 -1
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -298
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -287
- package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +0 -108
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
|
|
3
|
+
import { type TxMetaData, comparePriority } from '../tx_metadata.js';
|
|
4
|
+
import {
|
|
5
|
+
type EvictionConfig,
|
|
6
|
+
type PreAddContext,
|
|
7
|
+
type PreAddPoolAccess,
|
|
8
|
+
type PreAddResult,
|
|
9
|
+
type PreAddRule,
|
|
10
|
+
TxPoolRejectionCode,
|
|
11
|
+
} from './interfaces.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Pre-add rule that checks if the pool is at capacity and handles low-priority eviction.
|
|
15
|
+
*
|
|
16
|
+
* When the pool is at capacity:
|
|
17
|
+
* - If incoming tx has higher priority than the lowest priority tx, evict the lowest and accept incoming
|
|
18
|
+
* - If incoming tx has equal or lower priority than the lowest, ignore incoming (it would be evicted anyway)
|
|
19
|
+
*/
|
|
20
|
+
export class LowPriorityPreAddRule implements PreAddRule {
|
|
21
|
+
public readonly name = 'LowPriorityPreAdd';
|
|
22
|
+
|
|
23
|
+
private log = createLogger('p2p:tx_pool_v2:low_priority_pre_add_rule');
|
|
24
|
+
private maxPoolSize: number;
|
|
25
|
+
|
|
26
|
+
constructor(config: { maxPoolSize: number }) {
|
|
27
|
+
this.maxPoolSize = config.maxPoolSize;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
check(incomingMeta: TxMetaData, poolAccess: PreAddPoolAccess, context?: PreAddContext): Promise<PreAddResult> {
|
|
31
|
+
// Skip if max pool size is disabled (0 = unlimited)
|
|
32
|
+
if (this.maxPoolSize === 0) {
|
|
33
|
+
return Promise.resolve({ shouldIgnore: false, txHashesToEvict: [] });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const currentCount = poolAccess.getPendingTxCount();
|
|
37
|
+
|
|
38
|
+
// If pool is not at capacity, accept the tx
|
|
39
|
+
if (currentCount < this.maxPoolSize) {
|
|
40
|
+
return Promise.resolve({ shouldIgnore: false, txHashesToEvict: [] });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Pool is at capacity - need to compare priorities
|
|
44
|
+
const lowestPriorityMeta = poolAccess.getLowestPriorityPendingTx();
|
|
45
|
+
if (!lowestPriorityMeta) {
|
|
46
|
+
// No pending txs (shouldn't happen if count > 0, but handle gracefully)
|
|
47
|
+
return Promise.resolve({ shouldIgnore: false, txHashesToEvict: [] });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Compare incoming tx against lowest priority tx.
|
|
51
|
+
// feeOnly mode (RPC): use strict fee comparison only — avoids churn from hash ordering
|
|
52
|
+
// Default (gossip): use full comparePriority (fee + tx hash tiebreaker) for determinism
|
|
53
|
+
const isHigherPriority = context?.feeComparisonOnly
|
|
54
|
+
? incomingMeta.priorityFee > lowestPriorityMeta.priorityFee
|
|
55
|
+
: comparePriority(incomingMeta, lowestPriorityMeta) > 0;
|
|
56
|
+
|
|
57
|
+
if (isHigherPriority) {
|
|
58
|
+
this.log.debug(
|
|
59
|
+
`Pool at capacity (${currentCount}/${this.maxPoolSize}), evicting ${lowestPriorityMeta.txHash} ` +
|
|
60
|
+
`(priority ${lowestPriorityMeta.priorityFee}) for ${incomingMeta.txHash} (priority ${incomingMeta.priorityFee})`,
|
|
61
|
+
);
|
|
62
|
+
return Promise.resolve({
|
|
63
|
+
shouldIgnore: false,
|
|
64
|
+
txHashesToEvict: [lowestPriorityMeta.txHash],
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Incoming tx has equal or lower priority - ignore it (it would be evicted anyway)
|
|
69
|
+
this.log.debug(
|
|
70
|
+
`Pool at capacity (${currentCount}/${this.maxPoolSize}), ignoring ${incomingMeta.txHash} ` +
|
|
71
|
+
`(priority ${incomingMeta.priorityFee}) - lower than existing minimum (priority ${lowestPriorityMeta.priorityFee})`,
|
|
72
|
+
);
|
|
73
|
+
return Promise.resolve({
|
|
74
|
+
shouldIgnore: true,
|
|
75
|
+
txHashesToEvict: [],
|
|
76
|
+
reason: {
|
|
77
|
+
code: TxPoolRejectionCode.LOW_PRIORITY_FEE,
|
|
78
|
+
message: `Tx does not meet minimum priority fee. Required: ${lowestPriorityMeta.priorityFee + 1n}, got: ${incomingMeta.priorityFee}`,
|
|
79
|
+
minimumPriorityFee: lowestPriorityMeta.priorityFee + 1n,
|
|
80
|
+
txPriorityFee: incomingMeta.priorityFee,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
updateConfig(config: EvictionConfig): void {
|
|
86
|
+
if (config.maxPendingTxCount !== undefined) {
|
|
87
|
+
this.maxPoolSize = config.maxPendingTxCount;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
|
|
3
|
+
import { type TxMetaData, checkNullifierConflict } from '../tx_metadata.js';
|
|
4
|
+
import type { PreAddContext, PreAddPoolAccess, PreAddResult, PreAddRule } from './interfaces.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Pre-add rule that checks for nullifier conflicts between incoming and existing transactions.
|
|
8
|
+
*
|
|
9
|
+
* When an incoming tx shares nullifiers with existing pending txs:
|
|
10
|
+
* - If the incoming tx has strictly higher priority, evict all conflicting txs
|
|
11
|
+
* - If any conflicting tx has equal or higher priority, ignore the incoming tx
|
|
12
|
+
*/
|
|
13
|
+
export class NullifierConflictRule implements PreAddRule {
|
|
14
|
+
public readonly name = 'NullifierConflict';
|
|
15
|
+
|
|
16
|
+
private log = createLogger('p2p:tx_pool_v2:nullifier_conflict_rule');
|
|
17
|
+
|
|
18
|
+
check(incomingMeta: TxMetaData, poolAccess: PreAddPoolAccess, _context?: PreAddContext): Promise<PreAddResult> {
|
|
19
|
+
const result = checkNullifierConflict(
|
|
20
|
+
incomingMeta,
|
|
21
|
+
nullifier => poolAccess.getTxHashByNullifier(nullifier),
|
|
22
|
+
txHash => poolAccess.getMetadata(txHash),
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
if (result.shouldIgnore) {
|
|
26
|
+
this.log.debug(`Ignoring tx ${incomingMeta.txHash}: ${result.reason?.message}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return Promise.resolve(result);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { AztecKVTxPoolV2 } from './tx_pool_v2.js';
|
|
2
|
+
export {
|
|
3
|
+
type TxPoolV2,
|
|
4
|
+
type TxPoolV2Config,
|
|
5
|
+
type TxPoolV2Events,
|
|
6
|
+
type AddTxsResult,
|
|
7
|
+
type PoolReadAccess,
|
|
8
|
+
DEFAULT_TX_POOL_V2_CONFIG,
|
|
9
|
+
} from './interfaces.js';
|
|
10
|
+
export { type TxMetaData, type TxState, buildTxMetaData, comparePriority } from './tx_metadata.js';
|
|
11
|
+
export { TxArchive } from './archive/index.js';
|
|
12
|
+
export { DeletedPool } from './deleted_pool.js';
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Attributes,
|
|
3
|
+
type Meter,
|
|
4
|
+
Metrics,
|
|
5
|
+
type ObservableGauge,
|
|
6
|
+
type ObservableResult,
|
|
7
|
+
type TelemetryClient,
|
|
8
|
+
type UpDownCounter,
|
|
9
|
+
createUpDownCounterWithDefault,
|
|
10
|
+
} from '@aztec/telemetry-client';
|
|
11
|
+
|
|
12
|
+
/** Callback that returns the current estimated metadata memory in bytes. */
|
|
13
|
+
export type MetadataMemoryCallback = () => number;
|
|
14
|
+
|
|
15
|
+
/** Instrumentation for TxPoolV2Impl internal operations. */
|
|
16
|
+
export class TxPoolV2Instrumentation {
|
|
17
|
+
#evictedCounter: UpDownCounter;
|
|
18
|
+
#ignoredCounter: UpDownCounter;
|
|
19
|
+
#rejectedCounter: UpDownCounter;
|
|
20
|
+
#softDeletedHitsCounter: UpDownCounter;
|
|
21
|
+
#missingOnProtectCounter: UpDownCounter;
|
|
22
|
+
#missingPreviouslyEvictedCounter: UpDownCounter;
|
|
23
|
+
#metadataMemoryGauge: ObservableGauge;
|
|
24
|
+
|
|
25
|
+
constructor(telemetry: TelemetryClient, metadataMemoryCallback: MetadataMemoryCallback) {
|
|
26
|
+
const meter: Meter = telemetry.getMeter('TxPoolV2Impl');
|
|
27
|
+
|
|
28
|
+
this.#evictedCounter = createUpDownCounterWithDefault(meter, Metrics.MEMPOOL_TX_POOL_V2_EVICTED_COUNT);
|
|
29
|
+
this.#ignoredCounter = createUpDownCounterWithDefault(meter, Metrics.MEMPOOL_TX_POOL_V2_IGNORED_COUNT);
|
|
30
|
+
this.#rejectedCounter = createUpDownCounterWithDefault(meter, Metrics.MEMPOOL_TX_POOL_V2_REJECTED_COUNT);
|
|
31
|
+
this.#softDeletedHitsCounter = createUpDownCounterWithDefault(meter, Metrics.MEMPOOL_TX_POOL_V2_SOFT_DELETED_HITS);
|
|
32
|
+
this.#missingOnProtectCounter = createUpDownCounterWithDefault(
|
|
33
|
+
meter,
|
|
34
|
+
Metrics.MEMPOOL_TX_POOL_V2_MISSING_ON_PROTECT,
|
|
35
|
+
);
|
|
36
|
+
this.#missingPreviouslyEvictedCounter = createUpDownCounterWithDefault(
|
|
37
|
+
meter,
|
|
38
|
+
Metrics.MEMPOOL_TX_POOL_V2_MISSING_PREVIOUSLY_EVICTED,
|
|
39
|
+
);
|
|
40
|
+
this.#metadataMemoryGauge = meter.createObservableGauge(Metrics.MEMPOOL_TX_POOL_V2_METADATA_MEMORY);
|
|
41
|
+
this.#metadataMemoryGauge.addCallback((result: ObservableResult) => {
|
|
42
|
+
result.observe(metadataMemoryCallback());
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
recordEvictions(count: number, reason: string) {
|
|
47
|
+
this.#evictedCounter.add(count, { [Attributes.TX_POOL_EVICTION_REASON]: reason });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
recordIgnored(count: number) {
|
|
51
|
+
this.#ignoredCounter.add(count);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
recordRejected(count: number) {
|
|
55
|
+
this.#rejectedCounter.add(count);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
recordSoftDeletedHits(count: number) {
|
|
59
|
+
this.#softDeletedHitsCounter.add(count);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
recordMissingOnProtect(count: number) {
|
|
63
|
+
this.#missingOnProtectCounter.add(count);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
recordMissingPreviouslyEvicted(count: number) {
|
|
67
|
+
this.#missingPreviouslyEvictedCounter.add(count);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { TypedEventEmitter } from '@aztec/foundation/types';
|
|
3
|
+
import type { L2Block, L2BlockId, L2BlockSource } from '@aztec/stdlib/block';
|
|
4
|
+
import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
5
|
+
import type { BlockHeader, Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
|
|
6
|
+
|
|
7
|
+
import type { TxPoolRejectionError } from './eviction/interfaces.js';
|
|
8
|
+
import type { TxMetaData, TxState } from './tx_metadata.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Result of adding transactions to the pending pool.
|
|
12
|
+
* Categorizes transactions by their outcome.
|
|
13
|
+
*/
|
|
14
|
+
export type AddTxsResult = {
|
|
15
|
+
/** Transactions successfully added to the pool */
|
|
16
|
+
accepted: TxHash[];
|
|
17
|
+
/** Transactions ignored because they're valid but undesirable (e.g., duplicate, lower priority nullifier conflict) */
|
|
18
|
+
ignored: TxHash[];
|
|
19
|
+
/** Transactions rejected because they failed validation (e.g., invalid proof, expired timestamp) */
|
|
20
|
+
rejected: TxHash[];
|
|
21
|
+
/** Optional rejection errors, only present when there are rejections with structured errors. */
|
|
22
|
+
errors?: Map<string, TxPoolRejectionError>;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Events emitted by TxPoolV2.
|
|
27
|
+
*/
|
|
28
|
+
export type TxPoolV2Events = {
|
|
29
|
+
/** Emitted when transactions are successfully added to the pool */
|
|
30
|
+
'txs-added': (args: { txs: Tx[]; source?: string }) => void;
|
|
31
|
+
/** Emitted when transactions are removed from the pool */
|
|
32
|
+
'txs-removed': (args: { txHashes: TxHash[] }) => void;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Configuration options for TxPoolV2.
|
|
37
|
+
*/
|
|
38
|
+
export type TxPoolV2Config = {
|
|
39
|
+
/** Maximum number of pending transactions before low-priority eviction */
|
|
40
|
+
maxPendingTxCount: number;
|
|
41
|
+
/** Maximum number of archived transactions to retain (0 = disabled) */
|
|
42
|
+
archivedTxLimit: number;
|
|
43
|
+
/** Minimum age (ms) a transaction must have been in the pool before it's eligible for block building */
|
|
44
|
+
minTxPoolAgeMs: number;
|
|
45
|
+
/** Maximum number of evicted tx hashes to remember for metrics tracking */
|
|
46
|
+
evictedTxCacheSize: number;
|
|
47
|
+
/** The probability (0-1) that a transaction is discarded. 0 disables dropping. For testing purposes only. */
|
|
48
|
+
dropTransactionsProbability: number;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Default configuration values for TxPoolV2.
|
|
53
|
+
*/
|
|
54
|
+
export const DEFAULT_TX_POOL_V2_CONFIG: TxPoolV2Config = {
|
|
55
|
+
maxPendingTxCount: 0, // 0 = disabled
|
|
56
|
+
archivedTxLimit: 0, // 0 = disabled
|
|
57
|
+
minTxPoolAgeMs: 2_000,
|
|
58
|
+
evictedTxCacheSize: 10_000,
|
|
59
|
+
dropTransactionsProbability: 0,
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Dependencies required by TxPoolV2.
|
|
64
|
+
*/
|
|
65
|
+
export type TxPoolV2Dependencies = {
|
|
66
|
+
/** Block source (Archiver) for checking mined status and verifying pruned blocks */
|
|
67
|
+
l2BlockSource: L2BlockSource;
|
|
68
|
+
/** World state synchronizer for validating transactions after chain prunes */
|
|
69
|
+
worldStateSynchronizer: WorldStateSynchronizer;
|
|
70
|
+
/** Factory that creates a validator for re-validating pool transactions using metadata */
|
|
71
|
+
createTxValidator: () => Promise<TxValidator<TxMetaData>>;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Read-only access to pool state for pre-add checks.
|
|
76
|
+
* Used by eviction rules to inspect pool state during transaction addition.
|
|
77
|
+
*/
|
|
78
|
+
export interface PoolReadAccess {
|
|
79
|
+
/** Get metadata for a transaction by its hash (as string) */
|
|
80
|
+
getMetadata(txHash: string): TxMetaData | undefined;
|
|
81
|
+
/** Get the transaction hash that uses a specific nullifier (as string) */
|
|
82
|
+
getTxHashByNullifier(nullifier: string): string | undefined;
|
|
83
|
+
/** Get all transaction hashes for a fee payer (as string) */
|
|
84
|
+
getTxHashesByFeePayer(feePayer: string): Set<string> | undefined;
|
|
85
|
+
/** Get the current pending transaction count */
|
|
86
|
+
getPendingTxCount(): number;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
*
|
|
91
|
+
* The pool manages transactions through a state machine:
|
|
92
|
+
* - Pending: Transaction is awaiting inclusion in a block
|
|
93
|
+
* - Protected: Transaction is being considered for a block proposal
|
|
94
|
+
* - Mined: Transaction has been included in a block
|
|
95
|
+
* - Deleted: Transaction has been removed from the pool
|
|
96
|
+
*
|
|
97
|
+
* All state-mutating operations are serialized through a handler queue
|
|
98
|
+
* to prevent race conditions.
|
|
99
|
+
*/
|
|
100
|
+
export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
|
|
101
|
+
// === Core Operations ===
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Adds transactions to the pending pool with challenge and validation.
|
|
105
|
+
* Handles nullifier conflicts via the challenge mechanism.
|
|
106
|
+
* @param txs - Transactions to add
|
|
107
|
+
* @param opts - Optional metadata (e.g., source for logging)
|
|
108
|
+
* @returns Result categorizing each transaction as accepted, rejected, or ignored
|
|
109
|
+
*/
|
|
110
|
+
addPendingTxs(txs: Tx[], opts?: { source?: string; feeComparisonOnly?: boolean }): Promise<AddTxsResult>;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Checks if a transaction can be added without modifying the pool.
|
|
114
|
+
* Performs the same validation as addPendingTxs but doesn't persist changes.
|
|
115
|
+
* @param tx - Transaction to check
|
|
116
|
+
* @returns Result: 'accepted', 'ignored' (if already in pool or undesirable), or 'rejected' (if validation fails)
|
|
117
|
+
*/
|
|
118
|
+
canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'>;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Adds transactions as immediately protected for a given slot.
|
|
122
|
+
* Used when receiving transactions from a block proposal we're validating.
|
|
123
|
+
* @param txs - Transactions to add as protected
|
|
124
|
+
* @param block - Block header providing slot context
|
|
125
|
+
* @param opts - Optional metadata (e.g., source for logging)
|
|
126
|
+
*/
|
|
127
|
+
addProtectedTxs(txs: Tx[], block: BlockHeader, opts?: { source?: string }): Promise<void>;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Protects existing transactions by hash for a given slot.
|
|
131
|
+
* Returns hashes of transactions that weren't found in the pool.
|
|
132
|
+
* Records unknown hashes for automatic protection when received via gossip.
|
|
133
|
+
* @param txHashes - Hashes of transactions to protect
|
|
134
|
+
* @param block - Block header providing slot context
|
|
135
|
+
* @returns Hashes of transactions not found in the pool
|
|
136
|
+
*/
|
|
137
|
+
protectTxs(txHashes: TxHash[], block: BlockHeader): Promise<TxHash[]>;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Adds transactions as already mined.
|
|
141
|
+
* Used by prover nodes fetching transactions via request/response.
|
|
142
|
+
* @param txs - Transactions to add as mined
|
|
143
|
+
* @param block - Block header the transactions were mined in
|
|
144
|
+
* @param opts - Optional metadata (e.g., source for logging)
|
|
145
|
+
*/
|
|
146
|
+
addMinedTxs(txs: Tx[], block: BlockHeader, opts?: { source?: string }): Promise<void>;
|
|
147
|
+
|
|
148
|
+
// === State Transition Handlers ===
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Handles a mined block - marks transactions as mined and evicts conflicting pending txs.
|
|
152
|
+
* Uses nullifiers directly from the block to evict pending transactions with conflicts.
|
|
153
|
+
* @param block - The complete mined block
|
|
154
|
+
*/
|
|
155
|
+
handleMinedBlock(block: L2Block): Promise<void>;
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Prepares the pool for a new slot.
|
|
159
|
+
* Unprotects transactions from earlier slots and validates them before
|
|
160
|
+
* returning to pending state.
|
|
161
|
+
* @param slotNumber - The slot number to prepare for
|
|
162
|
+
*/
|
|
163
|
+
prepareForSlot(slotNumber: SlotNumber): Promise<void>;
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Handles pruned blocks during a reorg.
|
|
167
|
+
* Un-mines all transactions mined in blocks beyond the given latest block
|
|
168
|
+
* and validates them before returning to pending.
|
|
169
|
+
* @param latestBlock - The latest valid block ID after the prune
|
|
170
|
+
*/
|
|
171
|
+
handlePrunedBlocks(latestBlock: L2BlockId, options?: { deleteAllTxs?: boolean }): Promise<void>;
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Handles failed transaction execution.
|
|
175
|
+
* Deletes transactions that failed during block building.
|
|
176
|
+
* @param txHashes - Hashes of transactions that failed
|
|
177
|
+
*/
|
|
178
|
+
handleFailedExecution(txHashes: TxHash[]): Promise<void>;
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Handles a finalized block.
|
|
182
|
+
* Permanently deletes mined transactions and optionally archives them.
|
|
183
|
+
* @param block - Header of the finalized block
|
|
184
|
+
*/
|
|
185
|
+
handleFinalizedBlock(block: BlockHeader): Promise<void>;
|
|
186
|
+
|
|
187
|
+
/** Gets a transaction by its hash */
|
|
188
|
+
getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
189
|
+
|
|
190
|
+
/** Gets multiple transactions by their hashes */
|
|
191
|
+
getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
192
|
+
|
|
193
|
+
/** Checks if transactions exist in the pool */
|
|
194
|
+
hasTxs(txHashes: TxHash[]): Promise<boolean[]>;
|
|
195
|
+
|
|
196
|
+
/** Gets the status of a transaction */
|
|
197
|
+
getTxStatus(txHash: TxHash): Promise<TxState | 'deleted' | undefined>;
|
|
198
|
+
|
|
199
|
+
/** Gets pending transaction hashes sorted by priority (highest first) */
|
|
200
|
+
getPendingTxHashes(): Promise<TxHash[]>;
|
|
201
|
+
|
|
202
|
+
/** Gets pending transaction hashes that have been in the pool long enough per minTxPoolAgeMs, sorted by priority (highest first) */
|
|
203
|
+
getEligiblePendingTxHashes(): Promise<TxHash[]>;
|
|
204
|
+
|
|
205
|
+
/** Gets the count of pending transactions */
|
|
206
|
+
getPendingTxCount(): Promise<number>;
|
|
207
|
+
|
|
208
|
+
/** Gets mined transaction hashes with their block IDs */
|
|
209
|
+
getMinedTxHashes(): Promise<[TxHash, L2BlockId][]>;
|
|
210
|
+
|
|
211
|
+
/** Gets the count of mined transactions */
|
|
212
|
+
getMinedTxCount(): Promise<number>;
|
|
213
|
+
|
|
214
|
+
/** Checks if the pool is empty */
|
|
215
|
+
isEmpty(): Promise<boolean>;
|
|
216
|
+
|
|
217
|
+
/** Gets an archived transaction by its hash */
|
|
218
|
+
getArchivedTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
219
|
+
|
|
220
|
+
/** Gets the lowest priority pending transactions */
|
|
221
|
+
getLowestPriorityPending(limit: number): Promise<TxHash[]>;
|
|
222
|
+
|
|
223
|
+
// === Configuration ===
|
|
224
|
+
|
|
225
|
+
/** Updates the pool configuration */
|
|
226
|
+
updateConfig(config: Partial<TxPoolV2Config>): Promise<void>;
|
|
227
|
+
|
|
228
|
+
// === Lifecycle ===
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Starts the pool and initializes state from persistence.
|
|
232
|
+
* Must be called before other operations.
|
|
233
|
+
* - Reads all transactions from the database
|
|
234
|
+
* - Checks each against the Archiver to determine mined status
|
|
235
|
+
* - Validates all non-mined transactions
|
|
236
|
+
* - Populates in-memory indices
|
|
237
|
+
*/
|
|
238
|
+
start(): Promise<void>;
|
|
239
|
+
|
|
240
|
+
/** Stops the pool and releases resources */
|
|
241
|
+
stop(): Promise<void>;
|
|
242
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
4
|
+
import { BlockHash, type L2BlockId } from '@aztec/stdlib/block';
|
|
5
|
+
import type { Tx } from '@aztec/stdlib/tx';
|
|
6
|
+
|
|
7
|
+
import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
|
|
8
|
+
import { getTxPriorityFee } from '../tx_pool/priority.js';
|
|
9
|
+
import { type PreAddResult, TxPoolRejectionCode } from './eviction/interfaces.js';
|
|
10
|
+
|
|
11
|
+
/** Validator-compatible data interface, mirroring the subset of PrivateKernelTailCircuitPublicInputs used by validators. */
|
|
12
|
+
export type TxMetaValidationData = {
|
|
13
|
+
getNonEmptyNullifiers(): Fr[];
|
|
14
|
+
expirationTimestamp: bigint;
|
|
15
|
+
constants: {
|
|
16
|
+
anchorBlockHeader: {
|
|
17
|
+
hash(): Promise<BlockHash>;
|
|
18
|
+
globalVariables: {
|
|
19
|
+
blockNumber: BlockNumber;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Lightweight in-memory representation of a transaction.
|
|
27
|
+
* Stored for every tx in the pool to enable efficient queries and challenges
|
|
28
|
+
* without deserializing full transaction data.
|
|
29
|
+
*
|
|
30
|
+
* Uses strings for txHash and nullifiers to enable fast Map/Set lookups
|
|
31
|
+
* without repeated .toString() conversions.
|
|
32
|
+
*/
|
|
33
|
+
export type TxMetaData = {
|
|
34
|
+
/** The transaction hash as hex string */
|
|
35
|
+
readonly txHash: string;
|
|
36
|
+
|
|
37
|
+
/** Block ID (number and hash) in which the transaction was mined (undefined if not mined) */
|
|
38
|
+
minedL2BlockId?: L2BlockId;
|
|
39
|
+
|
|
40
|
+
/** Hash of the block header the transaction uses as its anchor (hex string) */
|
|
41
|
+
readonly anchorBlockHeaderHash: string;
|
|
42
|
+
|
|
43
|
+
/** The total priority fee (used for ordering and challenges) */
|
|
44
|
+
readonly priorityFee: bigint;
|
|
45
|
+
|
|
46
|
+
/** The fee payer address as hex string */
|
|
47
|
+
readonly feePayer: string;
|
|
48
|
+
|
|
49
|
+
/** The claim amount for the fee payer */
|
|
50
|
+
readonly claimAmount: bigint;
|
|
51
|
+
|
|
52
|
+
/** The fee limit */
|
|
53
|
+
readonly feeLimit: bigint;
|
|
54
|
+
|
|
55
|
+
/** Non-empty nullifiers emitted by the transaction (hex strings) */
|
|
56
|
+
readonly nullifiers: readonly string[];
|
|
57
|
+
|
|
58
|
+
/** Timestamp by which the transaction must be included (for expiration checks) */
|
|
59
|
+
readonly expirationTimestamp: bigint;
|
|
60
|
+
|
|
61
|
+
/** Validator-compatible data, providing the same access patterns as Tx.data */
|
|
62
|
+
readonly data: TxMetaValidationData;
|
|
63
|
+
|
|
64
|
+
/** Timestamp (ms) when the tx was received into the pool. 0 for hydrated txs (always eligible). */
|
|
65
|
+
receivedAt: number;
|
|
66
|
+
|
|
67
|
+
/** Estimated memory footprint of this metadata object in bytes */
|
|
68
|
+
readonly estimatedSizeBytes: number;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/** Transaction state derived from TxMetaData fields and pool protection status */
|
|
72
|
+
export type TxState = 'pending' | 'protected' | 'mined' | 'deleted';
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Builds TxMetaData from a full Tx object.
|
|
76
|
+
* Extracts all relevant fields for efficient in-memory storage and querying.
|
|
77
|
+
* Fr values are captured in closures for zero-cost re-validation.
|
|
78
|
+
*/
|
|
79
|
+
export async function buildTxMetaData(tx: Tx): Promise<TxMetaData> {
|
|
80
|
+
const txHash = tx.getTxHash().toString();
|
|
81
|
+
const nullifierFrs = tx.data.getNonEmptyNullifiers();
|
|
82
|
+
const nullifiers = nullifierFrs.map(n => n.toString());
|
|
83
|
+
const anchorBlockHeaderHashFr = await tx.data.constants.anchorBlockHeader.hash();
|
|
84
|
+
const anchorBlockHeaderHash = anchorBlockHeaderHashFr.toString();
|
|
85
|
+
const expirationTimestamp = tx.data.expirationTimestamp;
|
|
86
|
+
const anchorBlockNumber = tx.data.constants.anchorBlockHeader.globalVariables.blockNumber;
|
|
87
|
+
const priorityFee = getTxPriorityFee(tx);
|
|
88
|
+
const feePayer = tx.data.feePayer.toString();
|
|
89
|
+
|
|
90
|
+
const { feeLimit, claimAmount } = await getFeePayerBalanceDelta(tx, ProtocolContractAddress.FeeJuice);
|
|
91
|
+
|
|
92
|
+
const estimatedSizeBytes = estimateTxMetaDataSize(nullifiers.length);
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
txHash,
|
|
96
|
+
anchorBlockHeaderHash,
|
|
97
|
+
priorityFee,
|
|
98
|
+
feePayer,
|
|
99
|
+
claimAmount,
|
|
100
|
+
feeLimit,
|
|
101
|
+
nullifiers,
|
|
102
|
+
expirationTimestamp,
|
|
103
|
+
receivedAt: 0,
|
|
104
|
+
estimatedSizeBytes,
|
|
105
|
+
data: {
|
|
106
|
+
getNonEmptyNullifiers: () => nullifierFrs,
|
|
107
|
+
expirationTimestamp,
|
|
108
|
+
constants: {
|
|
109
|
+
anchorBlockHeader: {
|
|
110
|
+
hash: () => Promise.resolve(anchorBlockHeaderHashFr),
|
|
111
|
+
globalVariables: { blockNumber: anchorBlockNumber },
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// V8 JS object overhead (~64 bytes for a plain object with hidden class).
|
|
119
|
+
// String overhead: ~32 bytes header + 1 byte per ASCII char (V8 one-byte strings).
|
|
120
|
+
// Hex string (0x + 64 hex chars = 66 chars): ~98 bytes per string.
|
|
121
|
+
// bigint: ~32 bytes. number: 8 bytes. Fr: ~80 bytes (32 data + object overhead).
|
|
122
|
+
const OBJECT_OVERHEAD = 64;
|
|
123
|
+
const HEX_STRING_BYTES = 98;
|
|
124
|
+
const BIGINT_BYTES = 32;
|
|
125
|
+
const FR_BYTES = 80;
|
|
126
|
+
// Fixed cost: object shell + txHash + anchorBlockHeaderHash + feePayer (3 hex strings)
|
|
127
|
+
// + priorityFee + claimAmount + feeLimit + includeByTimestamp (4 bigints)
|
|
128
|
+
// + receivedAt (number, 8 bytes) + estimatedSizeBytes (number, 8 bytes)
|
|
129
|
+
// + data closure object (~OBJECT_OVERHEAD + anchorBlockHeaderHashFr Fr + anchorBlockNumber number)
|
|
130
|
+
const FIXED_METADATA_BYTES =
|
|
131
|
+
OBJECT_OVERHEAD + 3 * HEX_STRING_BYTES + 4 * BIGINT_BYTES + 8 + 8 + OBJECT_OVERHEAD + FR_BYTES + 8;
|
|
132
|
+
|
|
133
|
+
/** Estimates the in-memory size of a TxMetaData object based on the number of nullifiers. */
|
|
134
|
+
function estimateTxMetaDataSize(nullifierCount: number): number {
|
|
135
|
+
// Per nullifier: one hex string in nullifiers[] + one Fr in the captured nullifierFrs[]
|
|
136
|
+
return FIXED_METADATA_BYTES + nullifierCount * (HEX_STRING_BYTES + FR_BYTES);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Minimal fields required for priority comparison. */
|
|
140
|
+
type PriorityComparable = Pick<TxMetaData, 'txHash' | 'priorityFee'>;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Compares two priority fees in ascending order.
|
|
144
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
145
|
+
*/
|
|
146
|
+
export function compareFee(a: bigint, b: bigint): number {
|
|
147
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Compares two tx hashes in ascending order.
|
|
152
|
+
* Uses field element comparison for deterministic ordering.
|
|
153
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
154
|
+
*/
|
|
155
|
+
export function compareTxHash(a: string, b: string): number {
|
|
156
|
+
const fieldA = Fr.fromHexString(a);
|
|
157
|
+
const fieldB = Fr.fromHexString(b);
|
|
158
|
+
return fieldA.cmp(fieldB);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Compares two transactions by priority fee, with txHash as tiebreaker.
|
|
163
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
164
|
+
* Use with sort() for ascending order, or negate/reverse for descending.
|
|
165
|
+
*/
|
|
166
|
+
export function comparePriority(a: PriorityComparable, b: PriorityComparable): number {
|
|
167
|
+
const feeComparison = compareFee(a.priorityFee, b.priorityFee);
|
|
168
|
+
if (feeComparison !== 0) {
|
|
169
|
+
return feeComparison;
|
|
170
|
+
}
|
|
171
|
+
return compareTxHash(a.txHash, b.txHash);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Checks for nullifier conflicts between an incoming transaction and existing pool state.
|
|
176
|
+
*
|
|
177
|
+
* When the incoming tx shares nullifiers with existing pending txs:
|
|
178
|
+
* - If the incoming tx has strictly higher priority, mark conflicting txs for eviction
|
|
179
|
+
* - If any conflicting tx has equal or higher priority, ignore the incoming tx
|
|
180
|
+
*
|
|
181
|
+
* @param incomingMeta - Metadata for the incoming transaction
|
|
182
|
+
* @param getTxHashByNullifier - Accessor to find which tx uses a nullifier
|
|
183
|
+
* @param getMetadata - Accessor to get metadata for a tx hash
|
|
184
|
+
*/
|
|
185
|
+
export function checkNullifierConflict(
|
|
186
|
+
incomingMeta: TxMetaData,
|
|
187
|
+
getTxHashByNullifier: (nullifier: string) => string | undefined,
|
|
188
|
+
getMetadata: (txHash: string) => TxMetaData | undefined,
|
|
189
|
+
): PreAddResult {
|
|
190
|
+
const txHashesToEvict: string[] = [];
|
|
191
|
+
|
|
192
|
+
for (const nullifier of incomingMeta.nullifiers) {
|
|
193
|
+
const conflictingHashStr = getTxHashByNullifier(nullifier);
|
|
194
|
+
|
|
195
|
+
if (!conflictingHashStr || conflictingHashStr === incomingMeta.txHash) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Skip if already marked for eviction
|
|
200
|
+
if (txHashesToEvict.includes(conflictingHashStr)) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const conflictingMeta = getMetadata(conflictingHashStr);
|
|
205
|
+
if (!conflictingMeta) {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// If incoming tx has strictly higher priority, mark for eviction
|
|
210
|
+
// Otherwise, ignore incoming tx (ties go to existing tx)
|
|
211
|
+
// Use comparePriority for deterministic ordering (includes txHash as tiebreaker)
|
|
212
|
+
if (comparePriority(incomingMeta, conflictingMeta) > 0) {
|
|
213
|
+
txHashesToEvict.push(conflictingHashStr);
|
|
214
|
+
} else {
|
|
215
|
+
return {
|
|
216
|
+
shouldIgnore: true,
|
|
217
|
+
txHashesToEvict: [],
|
|
218
|
+
reason: {
|
|
219
|
+
code: TxPoolRejectionCode.NULLIFIER_CONFLICT,
|
|
220
|
+
message: `Nullifier conflict with existing tx ${conflictingHashStr}`,
|
|
221
|
+
conflictingTxHash: conflictingHashStr,
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return { shouldIgnore: false, txHashesToEvict };
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** Creates a stub TxMetaValidationData for tests that don't exercise validators. */
|
|
231
|
+
export function stubTxMetaValidationData(overrides: { expirationTimestamp?: bigint } = {}): TxMetaValidationData {
|
|
232
|
+
return {
|
|
233
|
+
getNonEmptyNullifiers: () => [],
|
|
234
|
+
expirationTimestamp: overrides.expirationTimestamp ?? 0n,
|
|
235
|
+
constants: {
|
|
236
|
+
anchorBlockHeader: {
|
|
237
|
+
hash: () => Promise.resolve(new BlockHash(Fr.ZERO)),
|
|
238
|
+
globalVariables: { blockNumber: BlockNumber(0) },
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|