@aztec/p2p 0.0.1-commit.7b97ef96e → 0.0.1-commit.7cbc774
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +9 -1
- package/dest/client/factory.d.ts +7 -7
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +39 -32
- package/dest/client/interface.d.ts +19 -17
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +16 -20
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +94 -105
- package/dest/config.d.ts +154 -106
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +134 -40
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +267 -197
- 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 +181 -65
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +6 -4
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +33 -15
- 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 +3 -2
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
- 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 +2 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
- 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 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +4 -4
- 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 +10 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
- 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 +8 -6
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
- 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 +2 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +18 -9
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +51 -11
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +90 -19
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
- 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 +26 -44
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +5 -3
- 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 +6 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +3 -2
- 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 +256 -220
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +61 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -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 +10 -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 +21 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
- 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 +25 -21
- 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/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +36 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +135 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +252 -61
- 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 +99 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
- package/dest/msg_validators/tx_validator/index.d.ts +5 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +4 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- 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 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
- 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 +5 -5
- package/dest/services/discv5/discV5_service.d.ts +2 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +35 -8
- package/dest/services/dummy_service.d.ts +12 -17
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +13 -20
- package/dest/services/encoding.d.ts +6 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +14 -8
- package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +21 -4
- package/dest/services/libp2p/instrumentation.d.ts +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -0
- package/dest/services/libp2p/libp2p_service.d.ts +47 -55
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +344 -308
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +40 -11
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +32 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +97 -107
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -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 +5 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- package/dest/services/reqresp/config.d.ts +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/interface.d.ts +16 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -20
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +4 -2
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +43 -215
- package/dest/services/service.d.ts +10 -13
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +2 -23
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +2 -55
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/index.d.ts +2 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +0 -1
- 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 +0 -2
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/tx_collection.d.ts +36 -55
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +275 -119
- package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +2 -2
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/services/tx_file_store/tx_file_store.d.ts +1 -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 +4 -14
- package/dest/services/tx_provider.d.ts +5 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +7 -4
- package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -3
- package/dest/test-helpers/mock-pubsub.d.ts +24 -11
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +45 -45
- package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +17 -19
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +13 -15
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +42 -15
- package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +88 -42
- package/dest/testbench/worker_client_manager.d.ts +12 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +57 -11
- package/dest/util.d.ts +12 -7
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +15 -14
- package/src/bootstrap/bootstrap.ts +9 -1
- package/src/client/factory.ts +74 -49
- package/src/client/interface.ts +20 -30
- package/src/client/p2p_client.ts +108 -156
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +227 -45
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +22 -14
- package/src/mem_pools/tx_pool_v2/README.md +9 -1
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +3 -2
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
- 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 +10 -6
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/index.ts +1 -1
- package/src/mem_pools/tx_pool_v2/interfaces.ts +19 -8
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +130 -23
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +17 -2
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +267 -229
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
- package/src/msg_validators/clock_tolerance.ts +79 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
- package/src/msg_validators/tx_validator/README.md +127 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +6 -15
- 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/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +44 -1
- package/src/msg_validators/tx_validator/factory.ts +407 -80
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
- package/src/msg_validators/tx_validator/index.ts +4 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +38 -5
- package/src/services/dummy_service.ts +15 -44
- package/src/services/encoding.ts +14 -7
- package/src/services/gossipsub/topic_score_params.ts +36 -4
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +390 -360
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +46 -11
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/README.md +215 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +97 -119
- package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +2 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -2
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +1 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
- package/src/services/reqresp/reqresp.ts +48 -261
- package/src/services/service.ts +13 -29
- package/src/services/tx_collection/config.ts +3 -80
- package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +331 -176
- package/src/services/tx_collection/tx_collection_sink.ts +2 -2
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +7 -2
- package/src/test-helpers/make-test-p2p-clients.ts +4 -3
- package/src/test-helpers/mock-pubsub.ts +49 -66
- package/src/test-helpers/reqresp-nodes.ts +15 -28
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +54 -29
- package/src/testbench/p2p_client_testbench_worker.ts +91 -61
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +33 -18
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -327
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -211
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -346
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -387
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { FifoSet } from '@aztec/foundation/fifo-set';
|
|
2
3
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
3
4
|
import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
4
5
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
@@ -6,11 +7,16 @@ import { DatabasePublicStateSource } from '@aztec/stdlib/trees';
|
|
|
6
7
|
import { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
7
8
|
import { TxArchive } from './archive/index.js';
|
|
8
9
|
import { DeletedPool } from './deleted_pool.js';
|
|
9
|
-
import { EvictionManager, FeePayerBalanceEvictionRule, FeePayerBalancePreAddRule, InvalidTxsAfterMiningRule, InvalidTxsAfterReorgRule, LowPriorityEvictionRule, LowPriorityPreAddRule, NullifierConflictRule, TxPoolRejectionCode } from './eviction/index.js';
|
|
10
|
+
import { EvictionManager, FeePayerBalanceEvictionRule, FeePayerBalancePreAddRule, InsufficientFeePerGasEvictionRule, InvalidTxsAfterMiningRule, InvalidTxsAfterReorgRule, LowPriorityEvictionRule, LowPriorityPreAddRule, NullifierConflictRule, TxPoolRejectionCode } from './eviction/index.js';
|
|
10
11
|
import { TxPoolV2Instrumentation } from './instrumentation.js';
|
|
11
12
|
import { DEFAULT_TX_POOL_V2_CONFIG } from './interfaces.js';
|
|
12
13
|
import { buildTxMetaData, checkNullifierConflict } from './tx_metadata.js';
|
|
13
14
|
import { TxPoolIndices } from './tx_pool_indices.js';
|
|
15
|
+
/**
|
|
16
|
+
* Maximum number of full transactions to load into memory at once when finalizing a block.
|
|
17
|
+
* Bounds peak memory while archiving and hard-deleting mined txs (~23k txs/epoch at 10 TPS would
|
|
18
|
+
* otherwise OOM the node).
|
|
19
|
+
*/ const FINALIZE_BLOCK_CHUNK_SIZE = 100;
|
|
14
20
|
/**
|
|
15
21
|
* Implementation of TxPoolV2 logic.
|
|
16
22
|
*
|
|
@@ -23,6 +29,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
23
29
|
#l2BlockSource;
|
|
24
30
|
#worldStateSynchronizer;
|
|
25
31
|
#createTxValidator;
|
|
32
|
+
#checkAllowedSetupCalls;
|
|
26
33
|
// === In-Memory Indices ===
|
|
27
34
|
#indices = new TxPoolIndices();
|
|
28
35
|
// === Config & Services ===
|
|
@@ -32,7 +39,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
32
39
|
#evictionManager;
|
|
33
40
|
#dateProvider;
|
|
34
41
|
#instrumentation;
|
|
35
|
-
#evictedTxHashes
|
|
42
|
+
#evictedTxHashes;
|
|
36
43
|
#log;
|
|
37
44
|
#callbacks;
|
|
38
45
|
constructor(store, archiveStore, deps, callbacks, telemetry, config = {}, dateProvider, log){
|
|
@@ -41,10 +48,12 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
41
48
|
this.#l2BlockSource = deps.l2BlockSource;
|
|
42
49
|
this.#worldStateSynchronizer = deps.worldStateSynchronizer;
|
|
43
50
|
this.#createTxValidator = deps.createTxValidator;
|
|
51
|
+
this.#checkAllowedSetupCalls = deps.checkAllowedSetupCalls;
|
|
44
52
|
this.#config = {
|
|
45
53
|
...DEFAULT_TX_POOL_V2_CONFIG,
|
|
46
54
|
...config
|
|
47
55
|
};
|
|
56
|
+
this.#evictedTxHashes = FifoSet.withLimit(this.#config.evictedTxCacheSize);
|
|
48
57
|
this.#archive = new TxArchive(archiveStore, this.#config.archivedTxLimit, log);
|
|
49
58
|
this.#deletedPool = new DeletedPool(store, this.#txsDB, log);
|
|
50
59
|
this.#dateProvider = dateProvider;
|
|
@@ -61,6 +70,7 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
61
70
|
}));
|
|
62
71
|
// Post-event eviction rules (run after events to check ALL pending txs)
|
|
63
72
|
this.#evictionManager.registerRule(new InvalidTxsAfterMiningRule());
|
|
73
|
+
this.#evictionManager.registerRule(new InsufficientFeePerGasEvictionRule(deps.blockMinFeesProvider));
|
|
64
74
|
this.#evictionManager.registerRule(new InvalidTxsAfterReorgRule(deps.worldStateSynchronizer));
|
|
65
75
|
this.#evictionManager.registerRule(new FeePayerBalanceEvictionRule(deps.worldStateSynchronizer));
|
|
66
76
|
// LowPriorityEvictionRule handles cases where txs become pending via prepareForSlot (unprotect)
|
|
@@ -81,30 +91,63 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
81
91
|
*/ async hydrateFromDatabase() {
|
|
82
92
|
// Step 0: Hydrate deleted pool state
|
|
83
93
|
await this.#deletedPool.hydrateFromDatabase();
|
|
84
|
-
// Step 1:
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
+
// Step 1: Stream txs from DB, building metadata and mined status one at a time.
|
|
95
|
+
const minedMetas = [];
|
|
96
|
+
const pendingMetas = [];
|
|
97
|
+
const deserializationErrors = [];
|
|
98
|
+
for await (const [txHashStr, buffer] of this.#txsDB.entriesAsync()){
|
|
99
|
+
// Skip soft-deleted transactions - they stay in DB but not in indices
|
|
100
|
+
if (this.#deletedPool.isSoftDeleted(txHashStr)) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
let meta;
|
|
104
|
+
let txEffect;
|
|
105
|
+
try {
|
|
106
|
+
const tx = Tx.fromBuffer(buffer);
|
|
107
|
+
// Resolve allowed-setup-calls and the tx effect concurrently
|
|
108
|
+
// getTxEffect failures are non-fatal (we just treat the tx as not-yet-mined), so
|
|
109
|
+
// its rejection is swallowed before the Promise.all so it can't fail-fast the batch.
|
|
110
|
+
const txEffectPromise = this.#l2BlockSource.getTxEffect(tx.getTxHash()).catch((err)=>{
|
|
111
|
+
this.#log.warn(`Failed to check mined status for tx ${txHashStr}`, {
|
|
112
|
+
err
|
|
113
|
+
});
|
|
114
|
+
return undefined;
|
|
115
|
+
});
|
|
116
|
+
const [allowedSetupCalls, fetchedTxEffect] = await Promise.all([
|
|
117
|
+
this.#checkAllowedSetupCalls(tx),
|
|
118
|
+
txEffectPromise
|
|
119
|
+
]);
|
|
120
|
+
meta = await buildTxMetaData(tx, allowedSetupCalls);
|
|
121
|
+
txEffect = fetchedTxEffect;
|
|
122
|
+
} catch (err) {
|
|
123
|
+
this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, {
|
|
124
|
+
err
|
|
125
|
+
});
|
|
126
|
+
deserializationErrors.push(txHashStr);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (txEffect) {
|
|
130
|
+
meta.minedL2BlockId = {
|
|
131
|
+
number: txEffect.l2BlockNumber,
|
|
132
|
+
hash: txEffect.l2BlockHash.toString()
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (meta.minedL2BlockId !== undefined) {
|
|
136
|
+
minedMetas.push(meta);
|
|
94
137
|
} else {
|
|
95
|
-
|
|
138
|
+
pendingMetas.push(meta);
|
|
96
139
|
}
|
|
97
140
|
}
|
|
98
|
-
// Step
|
|
99
|
-
const { valid, invalid } = await this.#revalidateMetadata(
|
|
100
|
-
// Step
|
|
101
|
-
for (const meta of
|
|
141
|
+
// Step 2: Validate non-mined transactions
|
|
142
|
+
const { valid, invalid } = await this.#revalidateMetadata(pendingMetas, 'on startup');
|
|
143
|
+
// Step 3: Populate mined indices (these don't need conflict resolution)
|
|
144
|
+
for (const meta of minedMetas){
|
|
102
145
|
this.#indices.addMined(meta);
|
|
103
146
|
}
|
|
104
|
-
// Step
|
|
147
|
+
// Step 4: Rebuild pending pool by running pre-add rules for each tx
|
|
105
148
|
// This resolves nullifier conflicts, fee payer balance issues, and pool size limits
|
|
106
149
|
const { rejected } = await this.#rebuildPendingPool(valid);
|
|
107
|
-
// Step
|
|
150
|
+
// Step 5: Delete invalid and rejected txs from DB only (indices were never populated for these)
|
|
108
151
|
const toDelete = [
|
|
109
152
|
...deserializationErrors,
|
|
110
153
|
...invalid,
|
|
@@ -128,9 +171,32 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
128
171
|
const rejected = [];
|
|
129
172
|
const errors = new Map();
|
|
130
173
|
const acceptedPending = new Set();
|
|
174
|
+
// Phase 1: Pre-compute all throwable I/O outside the transaction.
|
|
175
|
+
// If any pre-computation throws, the entire call fails before mutations happen.
|
|
176
|
+
const precomputed = new Map();
|
|
177
|
+
const validator = await this.#createTxValidator();
|
|
178
|
+
for (const tx of txs){
|
|
179
|
+
const txHash = tx.getTxHash();
|
|
180
|
+
const txHashStr = txHash.toString();
|
|
181
|
+
const meta = await buildTxMetaData(tx);
|
|
182
|
+
const minedBlockId = await this.#getMinedBlockId(txHash);
|
|
183
|
+
// Validate non-mined txs (mined and pre-protected txs bypass validation inside the transaction)
|
|
184
|
+
let isValid = true;
|
|
185
|
+
if (!minedBlockId) {
|
|
186
|
+
isValid = await this.#validateMeta(meta, validator);
|
|
187
|
+
}
|
|
188
|
+
precomputed.set(txHashStr, {
|
|
189
|
+
meta,
|
|
190
|
+
minedBlockId,
|
|
191
|
+
isValid
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
// Phase 2: Apply mutations inside the transaction using only pre-computed results,
|
|
195
|
+
// in-memory reads, and buffered DB writes. Nothing here can throw an unhandled exception.
|
|
131
196
|
const poolAccess = this.#createPreAddPoolAccess();
|
|
132
197
|
const preAddContext = opts.feeComparisonOnly !== undefined ? {
|
|
133
|
-
feeComparisonOnly: opts.feeComparisonOnly
|
|
198
|
+
feeComparisonOnly: opts.feeComparisonOnly,
|
|
199
|
+
priceBumpPercentage: this.#config.priceBumpPercentage
|
|
134
200
|
} : undefined;
|
|
135
201
|
await this.#store.transactionAsync(async ()=>{
|
|
136
202
|
for (const tx of txs){
|
|
@@ -141,33 +207,41 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
141
207
|
ignored.push(txHash);
|
|
142
208
|
continue;
|
|
143
209
|
}
|
|
144
|
-
|
|
145
|
-
const minedBlockId = await this.#getMinedBlockId(txHash);
|
|
210
|
+
const { meta, minedBlockId, isValid } = precomputed.get(txHashStr);
|
|
146
211
|
const preProtectedSlot = this.#indices.getProtectionSlot(txHashStr);
|
|
147
212
|
if (minedBlockId) {
|
|
148
213
|
// Already mined - add directly (protection already set if pre-protected)
|
|
149
214
|
await this.#addTx(tx, {
|
|
150
215
|
mined: minedBlockId
|
|
151
|
-
}, opts);
|
|
216
|
+
}, opts, meta);
|
|
152
217
|
accepted.push(txHash);
|
|
153
218
|
} else if (preProtectedSlot !== undefined) {
|
|
154
219
|
// Pre-protected and not mined - add as protected (bypass validation)
|
|
155
220
|
await this.#addTx(tx, {
|
|
156
221
|
protected: preProtectedSlot
|
|
157
|
-
}, opts);
|
|
222
|
+
}, opts, meta);
|
|
158
223
|
accepted.push(txHash);
|
|
224
|
+
} else if (!isValid) {
|
|
225
|
+
// Failed pre-computed validation
|
|
226
|
+
rejected.push(txHash);
|
|
159
227
|
} else {
|
|
160
|
-
// Regular pending tx -
|
|
161
|
-
const result = await this.#tryAddRegularPendingTx(tx, opts, poolAccess, acceptedPending, ignored, errors, preAddContext);
|
|
228
|
+
// Regular pending tx - run pre-add rules using pre-computed metadata
|
|
229
|
+
const result = await this.#tryAddRegularPendingTx(tx, meta, opts, poolAccess, acceptedPending, ignored, errors, preAddContext);
|
|
162
230
|
if (result.status === 'accepted') {
|
|
163
231
|
acceptedPending.add(txHashStr);
|
|
164
|
-
} else if (result.status === 'rejected') {
|
|
165
|
-
rejected.push(txHash);
|
|
166
232
|
} else {
|
|
167
233
|
ignored.push(txHash);
|
|
168
234
|
}
|
|
169
235
|
}
|
|
170
236
|
}
|
|
237
|
+
// Run post-add eviction rules for pending txs (inside transaction for atomicity)
|
|
238
|
+
if (acceptedPending.size > 0) {
|
|
239
|
+
const feePayers = Array.from(acceptedPending).map((txHash)=>this.#indices.getMetadata(txHash).feePayer);
|
|
240
|
+
const uniqueFeePayers = new Set(feePayers);
|
|
241
|
+
await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [
|
|
242
|
+
...uniqueFeePayers
|
|
243
|
+
]);
|
|
244
|
+
}
|
|
171
245
|
});
|
|
172
246
|
// Build final accepted list for pending txs (excludes intra-batch evictions)
|
|
173
247
|
for (const txHashStr of acceptedPending){
|
|
@@ -180,14 +254,6 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
180
254
|
if (rejected.length > 0) {
|
|
181
255
|
this.#instrumentation.recordRejected(rejected.length);
|
|
182
256
|
}
|
|
183
|
-
// Run post-add eviction rules for pending txs
|
|
184
|
-
if (acceptedPending.size > 0) {
|
|
185
|
-
const feePayers = Array.from(acceptedPending).map((txHash)=>this.#indices.getMetadata(txHash).feePayer);
|
|
186
|
-
const uniqueFeePayers = new Set(feePayers);
|
|
187
|
-
await this.#evictionManager.evictAfterNewTxs(Array.from(acceptedPending), [
|
|
188
|
-
...uniqueFeePayers
|
|
189
|
-
]);
|
|
190
|
-
}
|
|
191
257
|
return {
|
|
192
258
|
accepted,
|
|
193
259
|
ignored,
|
|
@@ -197,18 +263,10 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
197
263
|
} : {}
|
|
198
264
|
};
|
|
199
265
|
}
|
|
200
|
-
/**
|
|
201
|
-
const
|
|
202
|
-
const txHashStr = txHash.toString();
|
|
203
|
-
// Build metadata and validate using metadata
|
|
204
|
-
const meta = await buildTxMetaData(tx);
|
|
205
|
-
if (!await this.#validateMeta(meta)) {
|
|
206
|
-
return {
|
|
207
|
-
status: 'rejected'
|
|
208
|
-
};
|
|
209
|
-
}
|
|
266
|
+
/** Adds a validated pending tx, running pre-add rules and evicting conflicts. */ async #tryAddRegularPendingTx(tx, precomputedMeta, opts, poolAccess, acceptedPending, ignored, errors, preAddContext) {
|
|
267
|
+
const txHashStr = tx.getTxHash().toString();
|
|
210
268
|
// Run pre-add rules
|
|
211
|
-
const preAddResult = await this.#evictionManager.runPreAddRules(
|
|
269
|
+
const preAddResult = await this.#evictionManager.runPreAddRules(precomputedMeta, poolAccess, preAddContext);
|
|
212
270
|
if (preAddResult.shouldIgnore) {
|
|
213
271
|
this.#log.debug(`Ignoring tx ${txHashStr}: ${preAddResult.reason?.message ?? 'unknown reason'}`);
|
|
214
272
|
if (preAddResult.reason && preAddResult.reason.code !== TxPoolRejectionCode.INTERNAL_ERROR) {
|
|
@@ -246,8 +304,15 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
246
304
|
}
|
|
247
305
|
}
|
|
248
306
|
}
|
|
307
|
+
// Randomly drop the transaction for testing purposes (report as accepted so it propagates)
|
|
308
|
+
if (this.#config.dropTransactionsProbability > 0 && Math.random() < this.#config.dropTransactionsProbability) {
|
|
309
|
+
this.#log.debug(`Dropping tx ${txHashStr} (simulated drop for testing)`);
|
|
310
|
+
return {
|
|
311
|
+
status: 'accepted'
|
|
312
|
+
};
|
|
313
|
+
}
|
|
249
314
|
// Add the transaction
|
|
250
|
-
await this.#addTx(tx, 'pending', opts);
|
|
315
|
+
await this.#addTx(tx, 'pending', opts, precomputedMeta);
|
|
251
316
|
return {
|
|
252
317
|
status: 'accepted'
|
|
253
318
|
};
|
|
@@ -256,38 +321,44 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
256
321
|
const txHashStr = tx.getTxHash().toString();
|
|
257
322
|
// Check if already in pool
|
|
258
323
|
if (this.#indices.has(txHashStr)) {
|
|
324
|
+
this.#log.verbose(`canAddPendingTx: tx ${txHashStr} already in pool`);
|
|
259
325
|
return 'ignored';
|
|
260
326
|
}
|
|
261
|
-
// Build metadata and
|
|
327
|
+
// Build metadata and check pre-add rules
|
|
262
328
|
const meta = await buildTxMetaData(tx);
|
|
263
|
-
const validationResult = await this.#validateMeta(meta, undefined, 'can add pending');
|
|
264
|
-
if (validationResult !== true) {
|
|
265
|
-
return 'rejected';
|
|
266
|
-
}
|
|
267
|
-
// Use pre-add rules
|
|
268
329
|
const poolAccess = this.#createPreAddPoolAccess();
|
|
269
330
|
const preAddResult = await this.#evictionManager.runPreAddRules(meta, poolAccess);
|
|
270
|
-
|
|
331
|
+
if (preAddResult.shouldIgnore) {
|
|
332
|
+
this.#log.verbose(`canAddPendingTx: tx ${txHashStr} ignored by pre-add rule`, {
|
|
333
|
+
reason: preAddResult.reason?.message ?? 'no reason provided'
|
|
334
|
+
});
|
|
335
|
+
return 'ignored';
|
|
336
|
+
}
|
|
337
|
+
return 'accepted';
|
|
271
338
|
}
|
|
272
339
|
async addProtectedTxs(txs, block, opts) {
|
|
273
340
|
const slotNumber = block.globalVariables.slotNumber;
|
|
341
|
+
// Precompute setup-call allow-list flags outside the store transaction
|
|
342
|
+
const allowedFlags = await Promise.all(txs.map((tx)=>this.#checkAllowedSetupCalls(tx)));
|
|
274
343
|
await this.#store.transactionAsync(async ()=>{
|
|
275
|
-
for
|
|
344
|
+
for(let i = 0; i < txs.length; i++){
|
|
345
|
+
const tx = txs[i];
|
|
276
346
|
const txHash = tx.getTxHash();
|
|
277
347
|
const txHashStr = txHash.toString();
|
|
278
348
|
const isNew = !this.#indices.has(txHashStr);
|
|
279
349
|
const minedBlockId = await this.#getMinedBlockId(txHash);
|
|
280
350
|
if (isNew) {
|
|
351
|
+
const meta = await buildTxMetaData(tx, allowedFlags[i]);
|
|
281
352
|
// New tx - add as mined or protected (callback emitted by #addTx)
|
|
282
353
|
if (minedBlockId) {
|
|
283
354
|
await this.#addTx(tx, {
|
|
284
355
|
mined: minedBlockId
|
|
285
|
-
}, opts);
|
|
356
|
+
}, opts, meta);
|
|
286
357
|
this.#indices.setProtection(txHashStr, slotNumber);
|
|
287
358
|
} else {
|
|
288
359
|
await this.#addTx(tx, {
|
|
289
360
|
protected: slotNumber
|
|
290
|
-
}, opts);
|
|
361
|
+
}, opts, meta);
|
|
291
362
|
}
|
|
292
363
|
} else {
|
|
293
364
|
// Existing tx - update protection and mined status
|
|
@@ -305,34 +376,36 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
305
376
|
const missing = [];
|
|
306
377
|
let softDeletedHits = 0;
|
|
307
378
|
let missingPreviouslyEvicted = 0;
|
|
308
|
-
|
|
309
|
-
const
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
379
|
+
await this.#store.transactionAsync(async ()=>{
|
|
380
|
+
for (const txHash of txHashes){
|
|
381
|
+
const txHashStr = txHash.toString();
|
|
382
|
+
if (this.#indices.has(txHashStr)) {
|
|
383
|
+
// Update protection for existing tx
|
|
384
|
+
this.#indices.updateProtection(txHashStr, slotNumber);
|
|
385
|
+
} else if (this.#deletedPool.isSoftDeleted(txHashStr)) {
|
|
386
|
+
// Resurrect soft-deleted tx as protected
|
|
387
|
+
const buffer = await this.#txsDB.getAsync(txHashStr);
|
|
388
|
+
if (buffer) {
|
|
389
|
+
const tx = Tx.fromBuffer(buffer);
|
|
390
|
+
await this.#addTx(tx, {
|
|
391
|
+
protected: slotNumber
|
|
392
|
+
});
|
|
393
|
+
softDeletedHits++;
|
|
394
|
+
} else {
|
|
395
|
+
// Data missing despite soft-delete flag — treat as truly missing
|
|
396
|
+
this.#indices.setProtection(txHashStr, slotNumber);
|
|
397
|
+
missing.push(txHash);
|
|
398
|
+
}
|
|
322
399
|
} else {
|
|
323
|
-
//
|
|
400
|
+
// Truly missing — pre-record protection for tx we don't have yet
|
|
324
401
|
this.#indices.setProtection(txHashStr, slotNumber);
|
|
325
402
|
missing.push(txHash);
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
this.#indices.setProtection(txHashStr, slotNumber);
|
|
330
|
-
missing.push(txHash);
|
|
331
|
-
if (this.#evictedTxHashes.has(txHashStr)) {
|
|
332
|
-
missingPreviouslyEvicted++;
|
|
403
|
+
if (this.#evictedTxHashes.has(txHashStr)) {
|
|
404
|
+
missingPreviouslyEvicted++;
|
|
405
|
+
}
|
|
333
406
|
}
|
|
334
407
|
}
|
|
335
|
-
}
|
|
408
|
+
});
|
|
336
409
|
// Record metrics
|
|
337
410
|
if (softDeletedHits > 0) {
|
|
338
411
|
this.#instrumentation.recordSoftDeletedHits(softDeletedHits);
|
|
@@ -383,44 +456,51 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
383
456
|
found.push(meta);
|
|
384
457
|
}
|
|
385
458
|
}
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
459
|
+
await this.#store.transactionAsync(async ()=>{
|
|
460
|
+
// Step 4: Mark txs as mined (only those we have in the pool)
|
|
461
|
+
for (const meta of found){
|
|
462
|
+
this.#indices.markAsMined(meta, blockId);
|
|
463
|
+
await this.#deletedPool.clearIfMinedHigher(meta.txHash, blockId.number);
|
|
464
|
+
}
|
|
465
|
+
// Step 5: Run post-event eviction rules (inside transaction for atomicity)
|
|
466
|
+
await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
|
|
467
|
+
});
|
|
468
|
+
if (found.length > 0) {
|
|
469
|
+
this.#callbacks.onTxsMined(found.map((m)=>m.txHash));
|
|
390
470
|
}
|
|
391
|
-
// Step 5: Run eviction rules (remove pending txs with conflicting nullifiers/expired timestamps)
|
|
392
|
-
await this.#evictionManager.evictAfterNewBlock(block.header, nullifiers, feePayers);
|
|
393
471
|
this.#log.info(`Marked ${found.length} txs as mined in block ${blockId.number}`);
|
|
394
472
|
}
|
|
395
473
|
async prepareForSlot(slotNumber) {
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
474
|
+
await this.#store.transactionAsync(async ()=>{
|
|
475
|
+
// Step 0: Clean up slot-deleted txs from previous slots
|
|
476
|
+
await this.#deletedPool.cleanupSlotDeleted(slotNumber);
|
|
477
|
+
// Step 1: Find expired protected txs
|
|
478
|
+
const expiredProtected = this.#indices.findExpiredProtectedTxs(slotNumber);
|
|
479
|
+
// Step 2: Clear protection for all expired entries (including those without metadata)
|
|
480
|
+
this.#indices.clearProtection(expiredProtected);
|
|
481
|
+
// Step 3: Filter to only txs that have metadata and are not mined
|
|
482
|
+
const txsToRestore = this.#indices.filterRestorable(expiredProtected);
|
|
483
|
+
if (txsToRestore.length === 0) {
|
|
484
|
+
this.#log.debug(`Preparing for slot ${slotNumber}, no txs to unprotect`);
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
this.#log.info(`Preparing for slot ${slotNumber}: unprotecting ${txsToRestore.length} txs`);
|
|
488
|
+
// Step 4: Validate for pending pool
|
|
489
|
+
const { valid, invalid } = await this.#revalidateMetadata(txsToRestore, 'during prepareForSlot');
|
|
490
|
+
// Step 5: Resolve nullifier conflicts and add winners to pending indices
|
|
491
|
+
const { added, toEvict } = this.#applyNullifierConflictResolution(valid);
|
|
492
|
+
// Step 6: Delete invalid txs and evict conflict losers
|
|
493
|
+
await this.#deleteTxsBatch(invalid);
|
|
494
|
+
await this.#evictTxs(toEvict, 'NullifierConflict');
|
|
495
|
+
// Step 7: Run eviction rules (enforce pool size limit)
|
|
496
|
+
if (added.length > 0) {
|
|
497
|
+
const feePayers = added.map((meta)=>meta.feePayer);
|
|
498
|
+
const uniqueFeePayers = new Set(feePayers);
|
|
499
|
+
await this.#evictionManager.evictAfterNewTxs(added.map((m)=>m.txHash), [
|
|
500
|
+
...uniqueFeePayers
|
|
501
|
+
]);
|
|
502
|
+
}
|
|
503
|
+
});
|
|
424
504
|
}
|
|
425
505
|
async handlePrunedBlocks(latestBlock, options) {
|
|
426
506
|
// Step 1: Find transactions mined after the prune point
|
|
@@ -430,45 +510,48 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
430
510
|
return;
|
|
431
511
|
}
|
|
432
512
|
this.#log.info(`Handling prune to block ${latestBlock.number}: un-mining ${txsToUnmine.length} txs`);
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
513
|
+
await this.#store.transactionAsync(async ()=>{
|
|
514
|
+
// Step 2: Mark ALL un-mined txs with their original mined block number
|
|
515
|
+
// This ensures they get soft-deleted if removed later, and only hard-deleted
|
|
516
|
+
// when their original mined block is finalized
|
|
517
|
+
await this.#deletedPool.markFromPrunedBlock(txsToUnmine.map((m)=>({
|
|
518
|
+
txHash: m.txHash,
|
|
519
|
+
minedAtBlock: BlockNumber(m.minedL2BlockId.number)
|
|
520
|
+
})));
|
|
521
|
+
// Step 3: Unmine - clear mined status from metadata
|
|
522
|
+
for (const meta of txsToUnmine){
|
|
523
|
+
this.#indices.markAsUnmined(meta);
|
|
524
|
+
}
|
|
525
|
+
// If deleteAllTxs is set (epoch prune), delete all un-mined txs and return early
|
|
526
|
+
if (options?.deleteAllTxs) {
|
|
527
|
+
const allTxHashes = txsToUnmine.map((m)=>m.txHash);
|
|
528
|
+
await this.#deleteTxsBatch(allTxHashes);
|
|
529
|
+
this.#log.info(`Handled prune to block ${latestBlock.number} with deleteAllTxs: deleted ${allTxHashes.length} txs`);
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
// Step 4: Filter out protected txs (they'll be handled by prepareForSlot)
|
|
533
|
+
const unprotectedTxs = this.#indices.filterUnprotected(txsToUnmine);
|
|
534
|
+
// Step 5: Validate for pending pool
|
|
535
|
+
const { valid, invalid } = await this.#revalidateMetadata(unprotectedTxs, 'during handlePrunedBlocks');
|
|
536
|
+
// Step 6: Resolve nullifier conflicts and add winners to pending indices
|
|
537
|
+
const { toEvict } = this.#applyNullifierConflictResolution(valid);
|
|
538
|
+
// Step 7: Delete invalid txs and evict conflict losers
|
|
539
|
+
await this.#deleteTxsBatch(invalid);
|
|
540
|
+
await this.#evictTxs(toEvict, 'NullifierConflict');
|
|
541
|
+
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`, {
|
|
542
|
+
txHashesRestored: valid.map((m)=>m.txHash),
|
|
543
|
+
txHashesInvalid: invalid,
|
|
544
|
+
txHashesEvicted: toEvict
|
|
545
|
+
});
|
|
546
|
+
// Step 8: Run eviction rules for ALL pending txs (not just restored ones)
|
|
547
|
+
// This handles cases like existing pending txs with invalid fee payer balances
|
|
548
|
+
await this.#evictionManager.evictAfterChainPrune(latestBlock.number);
|
|
464
549
|
});
|
|
465
|
-
// Step 8: Run eviction rules for ALL pending txs (not just restored ones)
|
|
466
|
-
// This handles cases like existing pending txs with invalid fee payer balances
|
|
467
|
-
await this.#evictionManager.evictAfterChainPrune(latestBlock.number);
|
|
468
550
|
}
|
|
469
551
|
async handleFailedExecution(txHashes) {
|
|
470
|
-
|
|
471
|
-
|
|
552
|
+
await this.#store.transactionAsync(async ()=>{
|
|
553
|
+
await this.#deleteTxsBatch(txHashes.map((h)=>h.toString()));
|
|
554
|
+
});
|
|
472
555
|
this.#log.info(`Deleted ${txHashes.length} failed txs`, {
|
|
473
556
|
txHashes: txHashes.map((h)=>h.toString())
|
|
474
557
|
});
|
|
@@ -477,24 +560,29 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
477
560
|
const blockNumber = block.globalVariables.blockNumber;
|
|
478
561
|
// Step 1: Find mined txs at or before finalized block
|
|
479
562
|
const minedTxsToFinalize = this.#indices.findTxsMinedAtOrBefore(blockNumber);
|
|
480
|
-
// Step 2:
|
|
481
|
-
|
|
563
|
+
// Step 2: Archive in chunks if archiving is enabled. Hydrating an entire epoch's worth of
|
|
564
|
+
// mined txs at once would OOM under load. When archiving is disabled there is no need to hydrate the txs at all.
|
|
482
565
|
if (this.#archive.isEnabled()) {
|
|
483
|
-
for
|
|
484
|
-
const
|
|
485
|
-
|
|
486
|
-
|
|
566
|
+
for(let i = 0; i < minedTxsToFinalize.length; i += FINALIZE_BLOCK_CHUNK_SIZE){
|
|
567
|
+
const chunk = minedTxsToFinalize.slice(i, i + FINALIZE_BLOCK_CHUNK_SIZE);
|
|
568
|
+
const txsToArchive = [];
|
|
569
|
+
for (const txHashStr of chunk){
|
|
570
|
+
const buffer = await this.#txsDB.getAsync(txHashStr);
|
|
571
|
+
if (buffer) {
|
|
572
|
+
txsToArchive.push(Tx.fromBuffer(buffer));
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
if (txsToArchive.length > 0) {
|
|
576
|
+
await this.#archive.archiveTxs(txsToArchive);
|
|
487
577
|
}
|
|
488
578
|
}
|
|
489
579
|
}
|
|
490
|
-
// Step 3: Delete mined txs from active pool
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
await this.#archive.archiveTxs(txsToArchive);
|
|
497
|
-
}
|
|
580
|
+
// Step 3: Delete mined txs from the active pool and finalize soft-deleted txs in one
|
|
581
|
+
// transaction. Only tx hashes are touched here, so memory is bounded and atomicity is preserved.
|
|
582
|
+
await this.#store.transactionAsync(async ()=>{
|
|
583
|
+
await this.#deleteTxsBatch(minedTxsToFinalize);
|
|
584
|
+
await this.#deletedPool.finalizeBlock(blockNumber);
|
|
585
|
+
});
|
|
498
586
|
if (minedTxsToFinalize.length > 0) {
|
|
499
587
|
this.#log.info(`Finalized ${minedTxsToFinalize.length} mined txs from blocks up to ${blockNumber}`, {
|
|
500
588
|
txHashes: minedTxsToFinalize
|
|
@@ -610,9 +698,9 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
610
698
|
/**
|
|
611
699
|
* Adds a new transaction to the pool with the specified state.
|
|
612
700
|
* Emits onTxsAdded callback immediately after DB write.
|
|
613
|
-
*/ async #addTx(tx, state, opts = {}) {
|
|
701
|
+
*/ async #addTx(tx, state, opts = {}, precomputedMeta) {
|
|
614
702
|
const txHashStr = tx.getTxHash().toString();
|
|
615
|
-
const meta = await buildTxMetaData(tx);
|
|
703
|
+
const meta = precomputedMeta ?? await buildTxMetaData(tx);
|
|
616
704
|
meta.receivedAt = this.#dateProvider.now();
|
|
617
705
|
await this.#txsDB.set(txHashStr, tx.toBuffer());
|
|
618
706
|
await this.#deletedPool.clearSoftDeleted(txHashStr);
|
|
@@ -665,18 +753,10 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
665
753
|
txHash: txHashStr,
|
|
666
754
|
reason
|
|
667
755
|
});
|
|
668
|
-
this.#
|
|
756
|
+
this.#evictedTxHashes.add(txHashStr);
|
|
669
757
|
}
|
|
670
758
|
await this.#deleteTxsBatch(txHashes);
|
|
671
759
|
}
|
|
672
|
-
/** Adds a tx hash to the bounded evicted cache, evicting the oldest entry if at capacity. */ #addToEvictedCache(txHashStr) {
|
|
673
|
-
if (this.#evictedTxHashes.size >= this.#config.evictedTxCacheSize) {
|
|
674
|
-
// FIFO eviction: remove the first (oldest) entry
|
|
675
|
-
const oldest = this.#evictedTxHashes.values().next().value;
|
|
676
|
-
this.#evictedTxHashes.delete(oldest);
|
|
677
|
-
}
|
|
678
|
-
this.#evictedTxHashes.add(txHashStr);
|
|
679
|
-
}
|
|
680
760
|
// ============================================================================
|
|
681
761
|
// PRIVATE HELPERS - Validation & Conflict Resolution
|
|
682
762
|
// ============================================================================
|
|
@@ -757,50 +837,6 @@ import { TxPoolIndices } from './tx_pool_indices.js';
|
|
|
757
837
|
hash: txEffect.l2BlockHash.toString()
|
|
758
838
|
};
|
|
759
839
|
}
|
|
760
|
-
/** Loads all transactions from the database, returning loaded txs and deserialization errors */ async #loadAllTxsFromDb() {
|
|
761
|
-
const loaded = [];
|
|
762
|
-
const errors = [];
|
|
763
|
-
for await (const [txHashStr, buffer] of this.#txsDB.entriesAsync()){
|
|
764
|
-
// Skip soft-deleted transactions - they stay in DB but not in indices
|
|
765
|
-
if (this.#deletedPool.isSoftDeleted(txHashStr)) {
|
|
766
|
-
continue;
|
|
767
|
-
}
|
|
768
|
-
try {
|
|
769
|
-
const tx = Tx.fromBuffer(buffer);
|
|
770
|
-
const meta = await buildTxMetaData(tx);
|
|
771
|
-
loaded.push({
|
|
772
|
-
tx,
|
|
773
|
-
meta
|
|
774
|
-
});
|
|
775
|
-
} catch (err) {
|
|
776
|
-
this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, {
|
|
777
|
-
err
|
|
778
|
-
});
|
|
779
|
-
errors.push(txHashStr);
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
return {
|
|
783
|
-
loaded,
|
|
784
|
-
errors
|
|
785
|
-
};
|
|
786
|
-
}
|
|
787
|
-
/** Queries block source and marks mined status on transaction metadata */ async #markMinedStatusBatch(metas) {
|
|
788
|
-
for (const meta of metas){
|
|
789
|
-
try {
|
|
790
|
-
const txEffect = await this.#l2BlockSource.getTxEffect(TxHash.fromString(meta.txHash));
|
|
791
|
-
if (txEffect) {
|
|
792
|
-
meta.minedL2BlockId = {
|
|
793
|
-
number: txEffect.l2BlockNumber,
|
|
794
|
-
hash: txEffect.l2BlockHash.toString()
|
|
795
|
-
};
|
|
796
|
-
}
|
|
797
|
-
} catch (err) {
|
|
798
|
-
this.#log.warn(`Failed to check mined status for tx ${meta.txHash}`, {
|
|
799
|
-
err
|
|
800
|
-
});
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
}
|
|
804
840
|
/**
|
|
805
841
|
* Rebuilds the pending pool by processing each tx through pre-add rules.
|
|
806
842
|
* Starts with an empty pending pool and adds txs one by one, resolving conflicts.
|