@aztec/p2p 0.0.1-commit.4d79d1f2d → 0.0.1-commit.4d9804df
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 +130 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +22 -6
- package/dest/client/factory.d.ts +9 -8
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +50 -34
- package/dest/client/interface.d.ts +59 -27
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +40 -34
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +162 -135
- package/dest/config.d.ts +164 -100
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +149 -49
- 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 +9 -16
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +10 -17
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +103 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +278 -196
- 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 +224 -65
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +7 -5
- 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 +12 -5
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +38 -17
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +32 -15
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +95 -24
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +8 -4
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +3 -2
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +2 -1
- 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 +54 -5
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +9 -7
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +1 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +60 -14
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +6 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +59 -15
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +116 -20
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +26 -3
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +79 -43
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +20 -7
- 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 +34 -12
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +29 -7
- 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 +473 -211
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
- 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/proposal_validator/block_proposal_validator.d.ts +12 -5
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +12 -5
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +36 -9
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +130 -48
- 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 +133 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +261 -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 +104 -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/timestamp_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- package/dest/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 +68 -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 +13 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +119 -23
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +18 -18
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +19 -20
- package/dest/services/encoding.d.ts +23 -6
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +41 -24
- package/dest/services/gossipsub/topic_score_params.d.ts +23 -17
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +36 -24
- 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 +57 -56
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +483 -373
- 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 +20 -3
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +83 -26
- package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +102 -13
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +5 -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 +95 -127
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +11 -11
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.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 +15 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +11 -0
- 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/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- 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 +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
- 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 +42 -24
- 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 +3 -13
- 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 +75 -216
- package/dest/services/service.d.ts +29 -14
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +8 -17
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +17 -40
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +25 -32
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +96 -87
- package/dest/services/tx_collection/file_store_tx_source.d.ts +17 -6
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +53 -10
- 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.js +1 -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 +39 -55
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +280 -108
- package/dest/services/tx_collection/tx_collection_sink.d.ts +7 -6
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +15 -24
- package/dest/services/tx_collection/tx_source.d.ts +13 -7
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +29 -7
- package/dest/services/tx_file_store/tx_file_store.d.ts +3 -4
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +13 -20
- 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 +26 -12
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +51 -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 +22 -16
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +56 -16
- 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 +111 -48
- 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 +13 -8
- 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 +16 -16
- package/src/bootstrap/bootstrap.ts +17 -3
- package/src/client/factory.ts +95 -51
- package/src/client/interface.ts +59 -35
- package/src/client/p2p_client.ts +186 -196
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +259 -57
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +13 -19
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +336 -242
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
- package/src/mem_pools/attestation_pool/mocks.ts +14 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +27 -17
- package/src/mem_pools/tx_pool_v2/README.md +52 -28
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +114 -27
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +8 -4
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +5 -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 +59 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
- package/src/mem_pools/tx_pool_v2/index.ts +1 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +61 -14
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +170 -28
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +91 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +54 -14
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +527 -207
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +155 -49
- package/src/msg_validators/tx_validator/README.md +129 -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 +413 -80
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +195 -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/timestamp_validator.ts +7 -7
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +126 -14
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +26 -45
- package/src/services/encoding.ts +40 -24
- package/src/services/gossipsub/README.md +59 -22
- package/src/services/gossipsub/topic_score_params.ts +58 -31
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +554 -428
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +91 -25
- package/src/services/peer-manager/peer_scoring.ts +102 -8
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +92 -138
- package/src/services/reqresp/batch-tx-requester/interface.ts +14 -10
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +19 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
- 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 +3 -13
- package/src/services/reqresp/reqresp.ts +87 -260
- package/src/services/service.ts +42 -30
- package/src/services/tx_collection/config.ts +24 -59
- package/src/services/tx_collection/file_store_tx_collection.ts +108 -107
- package/src/services/tx_collection/file_store_tx_source.ts +69 -10
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -1
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +342 -156
- package/src/services/tx_collection/tx_collection_sink.ts +17 -31
- package/src/services/tx_collection/tx_source.ts +29 -8
- package/src/services/tx_file_store/tx_file_store.ts +11 -21
- 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 +59 -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 +74 -31
- package/src/testbench/p2p_client_testbench_worker.ts +120 -63
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +40 -19
- 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/clock_tolerance.d.ts +0 -21
- package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
- package/dest/msg_validators/clock_tolerance.js +0 -37
- 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 -321
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -49
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -55
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -206
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -336
- 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/clock_tolerance.ts +0 -51
- 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 -366
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -112
- package/src/services/tx_collection/slow_tx_collection.ts +0 -262
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { times } from '@aztec/foundation/collection';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
-
import { RunningPromise } from '@aztec/foundation/promise';
|
|
4
3
|
import { sleep } from '@aztec/foundation/sleep';
|
|
5
|
-
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
|
+
import { DateProvider, elapsed } from '@aztec/foundation/timer';
|
|
6
5
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
7
6
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
8
|
-
import {
|
|
7
|
+
import { BatchTxRequester } from '../reqresp/batch-tx-requester/batch_tx_requester.js';
|
|
9
8
|
import { FileStoreTxCollection } from './file_store_tx_collection.js';
|
|
10
|
-
import {
|
|
9
|
+
import { RequestTracker } from './request_tracker.js';
|
|
11
10
|
import { TxCollectionSink } from './tx_collection_sink.js';
|
|
12
11
|
/**
|
|
13
|
-
* Coordinates tx collection from remote RPC nodes and
|
|
12
|
+
* Coordinates tx collection from remote RPC nodes, reqresp, and file store.
|
|
14
13
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* via events and notifies the slow and fast collection loops to stop collecting that tx, so that we don't
|
|
21
|
-
* collect the same tx multiple times.
|
|
14
|
+
* Runs a sequential pipeline: node RPC → reqresp → file store. Node collection starts immediately,
|
|
15
|
+
* reqresp starts after a configured delay, and file store (if configured) starts after a further
|
|
16
|
+
* delay. All paths send txs to the collection sink, which handles metrics and adds them to the
|
|
17
|
+
* tx pool. Whenever a tx is added to the sink or the pool, this service is notified and stops
|
|
18
|
+
* collecting that tx across all in-flight requests.
|
|
22
19
|
*/ export class TxCollection {
|
|
23
20
|
p2pService;
|
|
24
21
|
nodes;
|
|
@@ -27,15 +24,13 @@ import { TxCollectionSink } from './tx_collection_sink.js';
|
|
|
27
24
|
config;
|
|
28
25
|
dateProvider;
|
|
29
26
|
log;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
/**
|
|
34
|
-
/** Handles txs found by
|
|
27
|
+
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
28
|
+
requests;
|
|
29
|
+
/** The collector for txs via reqresp */ reqRespTxsCollector;
|
|
30
|
+
/** File store collection for the fast (proposal/proving) path */ fileStoreFastCollection;
|
|
31
|
+
/** Handles txs found by collection paths before adding to the pool */ txCollectionSink;
|
|
35
32
|
/** Handler for the txs-added event from the tx pool */ handleTxsAddedToPool;
|
|
36
33
|
/** Handler for the txs-added event from the tx collection sink */ handleTxsFound;
|
|
37
|
-
/** Whether the service has been started. */ started;
|
|
38
|
-
/** Whether file store sources are configured. */ hasFileStoreSources;
|
|
39
34
|
constructor(p2pService, nodes, constants, txPool, config, fileStoreSources = [], dateProvider = new DateProvider(), telemetryClient = getTelemetryClient(), log = createLogger('p2p:tx_collection_service')){
|
|
40
35
|
this.p2pService = p2pService;
|
|
41
36
|
this.nodes = nodes;
|
|
@@ -44,13 +39,14 @@ import { TxCollectionSink } from './tx_collection_sink.js';
|
|
|
44
39
|
this.config = config;
|
|
45
40
|
this.dateProvider = dateProvider;
|
|
46
41
|
this.log = log;
|
|
47
|
-
this.
|
|
42
|
+
this.requests = new Set();
|
|
48
43
|
this.txCollectionSink = new TxCollectionSink(this.txPool, telemetryClient, this.log);
|
|
49
|
-
this.
|
|
50
|
-
this.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
44
|
+
this.reqRespTxsCollector = (requestTracker, blockTxsSource, pinnedPeer)=>BatchTxRequester.collectAllTxs(new BatchTxRequester(requestTracker, blockTxsSource, pinnedPeer, this.p2pService, this.log, this.dateProvider).run());
|
|
45
|
+
this.fileStoreFastCollection = new FileStoreTxCollection(fileStoreSources, this.txCollectionSink, {
|
|
46
|
+
workerCount: config.txCollectionFileStoreFastWorkerCount,
|
|
47
|
+
backoffBaseMs: config.txCollectionFileStoreFastBackoffBaseMs,
|
|
48
|
+
backoffMaxMs: config.txCollectionFileStoreFastBackoffMaxMs
|
|
49
|
+
}, this.dateProvider, this.log);
|
|
54
50
|
this.handleTxsFound = (args)=>{
|
|
55
51
|
this.foundTxs(args.txs);
|
|
56
52
|
};
|
|
@@ -63,122 +59,298 @@ import { TxCollectionSink } from './tx_collection_sink.js';
|
|
|
63
59
|
};
|
|
64
60
|
this.txPool.on('txs-added', this.handleTxsAddedToPool);
|
|
65
61
|
}
|
|
66
|
-
/**
|
|
67
|
-
this.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
this.reconcileFoundTxsLoop.start();
|
|
71
|
-
// TODO(palla/txs): Collect mined unproven tx hashes for txs we dont have in the pool and populate missingTxs on startup
|
|
72
|
-
return Promise.resolve();
|
|
73
|
-
}
|
|
74
|
-
/** Stops all activity. */ async stop() {
|
|
75
|
-
this.started = false;
|
|
76
|
-
await Promise.all([
|
|
77
|
-
this.slowCollection.stop(),
|
|
78
|
-
this.fastCollection.stop(),
|
|
79
|
-
this.fileStoreCollection.stop(),
|
|
80
|
-
this.reconcileFoundTxsLoop.stop()
|
|
81
|
-
]);
|
|
62
|
+
/** Stops all activity. Cancels in-flight requests; file store workers self-terminate. */ stop() {
|
|
63
|
+
this.requests.forEach((request)=>{
|
|
64
|
+
request.requestTracker.cancel();
|
|
65
|
+
});
|
|
82
66
|
this.txPool.removeListener('txs-added', this.handleTxsAddedToPool);
|
|
83
67
|
this.txCollectionSink.removeListener('txs-added', this.handleTxsFound);
|
|
84
68
|
}
|
|
85
|
-
/** Force trigger the slow collection and reconciliation loops */ async trigger() {
|
|
86
|
-
await Promise.all([
|
|
87
|
-
this.reconcileFoundTxsLoop.trigger(),
|
|
88
|
-
this.slowCollection.trigger()
|
|
89
|
-
]);
|
|
90
|
-
}
|
|
91
69
|
/** Returns L1 rollup constants. */ getConstants() {
|
|
92
70
|
return this.constants;
|
|
93
71
|
}
|
|
94
|
-
/** Starts collecting the given tx hashes for the given L2Block in the slow loop */ startCollecting(block, txHashes) {
|
|
95
|
-
this.slowCollection.startCollecting(block, txHashes);
|
|
96
|
-
// Delay file store collection to give P2P methods time to find txs first
|
|
97
|
-
if (this.hasFileStoreSources) {
|
|
98
|
-
const context = {
|
|
99
|
-
type: 'mined',
|
|
100
|
-
block
|
|
101
|
-
};
|
|
102
|
-
sleep(this.config.txCollectionFileStoreSlowDelayMs).then(()=>{
|
|
103
|
-
if (this.started) {
|
|
104
|
-
// Only queue txs that are still missing after the delay
|
|
105
|
-
const stillMissing = new Set(this.slowCollection.getMissingTxHashes().map((h)=>h.toString()));
|
|
106
|
-
const remaining = txHashes.filter((h)=>stillMissing.has(h.toString()));
|
|
107
|
-
if (remaining.length > 0) {
|
|
108
|
-
this.fileStoreCollection.startCollecting(remaining, context);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}).catch((err)=>this.log.error('Error in file store slow delay', err));
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/** Collects the set of txs for the given block proposal as fast as possible */ collectFastForProposal(blockProposal, blockNumber, txHashes, opts) {
|
|
115
|
-
return this.collectFastFor({
|
|
116
|
-
type: 'proposal',
|
|
117
|
-
blockProposal,
|
|
118
|
-
blockNumber
|
|
119
|
-
}, txHashes, opts);
|
|
120
|
-
}
|
|
121
72
|
/** Collects the set of txs for the given mined block as fast as possible */ collectFastForBlock(block, txHashes, opts) {
|
|
122
73
|
return this.collectFastFor({
|
|
123
74
|
type: 'block',
|
|
124
75
|
block
|
|
125
76
|
}, txHashes, opts);
|
|
126
77
|
}
|
|
127
|
-
/** Collects the set of txs for the given proposal or block as fast as possible */ collectFastFor(input, txHashes, opts) {
|
|
78
|
+
/** Collects the set of txs for the given proposal or block as fast as possible */ async collectFastFor(input, txHashes, opts) {
|
|
79
|
+
const timeout = opts.deadline.getTime() - this.dateProvider.now();
|
|
80
|
+
if (timeout <= 0) {
|
|
81
|
+
this.log.warn(`Deadline for fast tx collection is in the past (${timeout}ms)`, {
|
|
82
|
+
deadline: opts.deadline.getTime(),
|
|
83
|
+
now: this.dateProvider.now()
|
|
84
|
+
});
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
128
87
|
const hashes = txHashes.map((h)=>typeof h === 'string' ? TxHash.fromString(h) : h);
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
88
|
+
const blockInfo = input.type === 'proposal' ? {
|
|
89
|
+
...input.blockProposal.toBlockInfo(),
|
|
90
|
+
blockNumber: input.blockNumber
|
|
91
|
+
} : {
|
|
92
|
+
...input.block.toBlockInfo()
|
|
93
|
+
};
|
|
94
|
+
const request = {
|
|
95
|
+
...input,
|
|
96
|
+
blockInfo,
|
|
97
|
+
requestTracker: RequestTracker.create(hashes, opts.deadline, this.dateProvider)
|
|
98
|
+
};
|
|
99
|
+
const [duration] = await elapsed(()=>this.collectFast(request, {
|
|
100
|
+
pinnedPeer: opts.pinnedPeer
|
|
101
|
+
}));
|
|
102
|
+
this.log.verbose(`Collected ${request.requestTracker.collectedTxs.length} txs out of ${hashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`, {
|
|
103
|
+
...blockInfo,
|
|
104
|
+
duration,
|
|
105
|
+
requestType: input.type,
|
|
106
|
+
missingTxs: [
|
|
107
|
+
...request.requestTracker.missingTxHashes
|
|
108
|
+
]
|
|
109
|
+
});
|
|
110
|
+
return request.requestTracker.collectedTxs;
|
|
111
|
+
}
|
|
112
|
+
async collectFast(request, opts) {
|
|
113
|
+
this.requests.add(request);
|
|
114
|
+
const { blockInfo } = request;
|
|
115
|
+
this.log.debug(`Starting fast collection of ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`, {
|
|
116
|
+
...blockInfo,
|
|
117
|
+
requestType: request.type,
|
|
118
|
+
deadline: request.requestTracker.deadline
|
|
119
|
+
});
|
|
120
|
+
try {
|
|
121
|
+
// 1. Start node collection in the background.
|
|
122
|
+
// Note: this will be a noop if no nodes are configured.
|
|
123
|
+
const nodeCollectionPromise = this.collectFastFromNodes(request);
|
|
124
|
+
// 2. Wait before starting reqresp, interruptible by cancellation or node exhaustion.
|
|
125
|
+
await Promise.race([
|
|
126
|
+
request.requestTracker.cancellationToken,
|
|
127
|
+
sleep(this.config.txCollectionFastNodesTimeoutBeforeReqRespMs),
|
|
128
|
+
nodeCollectionPromise
|
|
129
|
+
]);
|
|
130
|
+
// 3. Start reqresp in the background (runs in parallel with node collection).
|
|
131
|
+
// Note: this will be a noop if all TXs were already found.
|
|
132
|
+
const reqRespPromise = this.collectFastViaReqResp(request, opts);
|
|
133
|
+
// 4. Wait before starting file store, interruptible by cancellation.
|
|
134
|
+
await Promise.race([
|
|
135
|
+
request.requestTracker.cancellationToken,
|
|
136
|
+
sleep(this.config.txCollectionFileStoreFastDelayMs),
|
|
137
|
+
reqRespPromise
|
|
138
|
+
]);
|
|
139
|
+
// 5. Start file store collection in the background. Self-terminates on tracker cancel / all-found.
|
|
140
|
+
// Note: this will be a noop if all TXs were already found.
|
|
141
|
+
const fileStorePromise = this.fileStoreFastCollection.startCollecting(request.requestTracker, this.getAddContext(request));
|
|
142
|
+
// 6. Wait for all paths to settle.
|
|
143
|
+
// NOTE: The request will automatically be cancelled after `opt.deadline` is reached.
|
|
144
|
+
await Promise.allSettled([
|
|
145
|
+
reqRespPromise,
|
|
146
|
+
nodeCollectionPromise,
|
|
147
|
+
fileStorePromise
|
|
148
|
+
]);
|
|
149
|
+
} catch (err) {
|
|
150
|
+
this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, {
|
|
151
|
+
...blockInfo,
|
|
152
|
+
missingTxs: request.requestTracker.missingTxHashes.values().map((txHash)=>txHash.toString())
|
|
153
|
+
});
|
|
154
|
+
} finally{
|
|
155
|
+
request.requestTracker.cancel();
|
|
156
|
+
this.requests.delete(request);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Starts collecting txs from all configured nodes. We send `txCollectionFastMaxParallelRequestsPerNode` requests
|
|
161
|
+
* in parallel to each node. We keep track of the number of attempts made to collect each tx, so we can prioritize
|
|
162
|
+
* the txs that have been requested less often whenever we need to send a new batch of requests. We ensure that no
|
|
163
|
+
* tx is requested more than once at the same time to the same node.
|
|
164
|
+
*/ async collectFastFromNodes(request) {
|
|
165
|
+
if (this.nodes.length === 0) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// Keep a shared priority queue of all txs pending to be requested, sorted by the number of attempts made to collect them.
|
|
169
|
+
const attemptsPerTx = [
|
|
170
|
+
...request.requestTracker.missingTxHashes
|
|
171
|
+
].map((txHash)=>({
|
|
172
|
+
txHash,
|
|
173
|
+
attempts: 0,
|
|
174
|
+
found: false
|
|
175
|
+
}));
|
|
176
|
+
// Returns once we have finished all node loops. Each loop finishes when the deadline is hit, or all txs have been collected.
|
|
177
|
+
await Promise.allSettled(this.nodes.map((node)=>this.collectFastFromNode(request, node, attemptsPerTx)));
|
|
178
|
+
}
|
|
179
|
+
async collectFastFromNode(request, node, attemptsPerTx) {
|
|
180
|
+
const notFinished = ()=>!request.requestTracker.checkCancelled();
|
|
181
|
+
const maxParallelRequests = this.config.txCollectionFastMaxParallelRequestsPerNode;
|
|
182
|
+
const maxBatchSize = this.config.txCollectionNodeRpcMaxBatchSize;
|
|
183
|
+
const activeRequestsToThisNode = new Set(); // Track the txs being actively requested to this node
|
|
184
|
+
const processBatch = async ()=>{
|
|
185
|
+
while(notFinished()){
|
|
186
|
+
// Pull tx hashes from the attemptsPerTx array, which is sorted by attempts,
|
|
187
|
+
// so we prioritize txs that have been requested less often.
|
|
188
|
+
const batch = [];
|
|
189
|
+
let index = 0;
|
|
190
|
+
while(batch.length < maxBatchSize){
|
|
191
|
+
const txToRequest = attemptsPerTx[index++];
|
|
192
|
+
if (!txToRequest) {
|
|
193
|
+
break;
|
|
194
|
+
} else if (!request.requestTracker.isMissing(txToRequest.txHash)) {
|
|
195
|
+
// Mark as found if it was found somewhere else, we'll then remove it from the array.
|
|
196
|
+
// We don't delete it now since 'array.splice' is pretty expensive, so we do it after sorting.
|
|
197
|
+
txToRequest.found = true;
|
|
198
|
+
} else if (!activeRequestsToThisNode.has(txToRequest.txHash)) {
|
|
199
|
+
// If the tx is not already being requested to this node, add it to the current batch and increase attempts.
|
|
200
|
+
// Note that we increase the attempts *before* making the request, so the next `collectFastFromNode` that
|
|
201
|
+
// needs to grab txs to send, will pick txs that have been requested less often, instead of all requesting
|
|
202
|
+
// the same txs at the same time.
|
|
203
|
+
batch.push(txToRequest);
|
|
204
|
+
activeRequestsToThisNode.add(txToRequest.txHash);
|
|
205
|
+
txToRequest.attempts++;
|
|
206
|
+
}
|
|
135
207
|
}
|
|
136
|
-
|
|
208
|
+
// After modifying the array by removing txs or updating attempts, re-sort it and trim the found txs from the end.
|
|
209
|
+
attemptsPerTx.sort((a, b)=>a.found === b.found ? a.attempts - b.attempts : Number(a.found) - Number(b.found));
|
|
210
|
+
const firstFoundTxIndex = attemptsPerTx.findIndex((tx)=>tx.found);
|
|
211
|
+
if (firstFoundTxIndex !== -1) {
|
|
212
|
+
attemptsPerTx.length = firstFoundTxIndex;
|
|
213
|
+
}
|
|
214
|
+
// If we see no more txs to request, we can stop this "process" loop
|
|
215
|
+
if (batch.length === 0) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const txHashes = batch.map(({ txHash })=>txHash);
|
|
219
|
+
// Collect this batch from the node
|
|
220
|
+
await this.txCollectionSink.collect(async ()=>{
|
|
221
|
+
const result = await node.getTxsByHash(txHashes.map(TxHash.fromString));
|
|
222
|
+
for (const tx of result.validTxs){
|
|
223
|
+
request.requestTracker.markFetched(tx);
|
|
224
|
+
}
|
|
225
|
+
return result;
|
|
226
|
+
}, txHashes, {
|
|
227
|
+
description: `fast ${node.getInfo()}`,
|
|
228
|
+
node: node.getInfo(),
|
|
229
|
+
method: 'fast-node-rpc',
|
|
230
|
+
...request.blockInfo
|
|
231
|
+
}, this.getAddContext(request));
|
|
232
|
+
// Clear from the active requests the txs we just requested
|
|
233
|
+
for (const requestedTx of batch){
|
|
234
|
+
activeRequestsToThisNode.delete(requestedTx.txHash);
|
|
235
|
+
}
|
|
236
|
+
// Sleep a bit until hitting the node again, but wake up immediately on cancellation
|
|
237
|
+
if (notFinished()) {
|
|
238
|
+
await Promise.race([
|
|
239
|
+
sleep(this.config.txCollectionFastNodeIntervalMs),
|
|
240
|
+
request.requestTracker.cancellationToken
|
|
241
|
+
]);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
// Kick off N parallel requests to the node, up to the maxParallelRequests limit
|
|
246
|
+
await Promise.all(times(maxParallelRequests, processBatch));
|
|
247
|
+
}
|
|
248
|
+
async collectFastViaReqResp(request, opts) {
|
|
249
|
+
const pinnedPeer = opts.pinnedPeer;
|
|
250
|
+
const blockInfo = request.blockInfo;
|
|
251
|
+
const slotNumber = blockInfo.slotNumber;
|
|
252
|
+
if (request.requestTracker.timeoutMs < 100) {
|
|
253
|
+
this.log.warn(`Not initiating fast reqresp for txs for ${request.type} at slot ${blockInfo.slotNumber} due to timeout`, {
|
|
254
|
+
timeoutMs: request.requestTracker.timeoutMs,
|
|
255
|
+
...blockInfo
|
|
256
|
+
});
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (request.requestTracker.checkCancelled()) {
|
|
260
|
+
this.log.debug(`No txs to collect via reqresp for ${request.type} at slot ${blockInfo.slotNumber}`, {
|
|
261
|
+
...blockInfo
|
|
262
|
+
});
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
this.log.debug(`Starting fast reqresp for ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`, {
|
|
266
|
+
...blockInfo,
|
|
267
|
+
timeoutMs: request.requestTracker.timeoutMs,
|
|
268
|
+
pinnedPeer
|
|
269
|
+
});
|
|
270
|
+
try {
|
|
271
|
+
await this.txCollectionSink.collect(async ()=>{
|
|
272
|
+
let blockTxsSource;
|
|
273
|
+
if (request.type === 'proposal') {
|
|
274
|
+
blockTxsSource = request.blockProposal;
|
|
275
|
+
} else if (request.type === 'block') {
|
|
276
|
+
blockTxsSource = {
|
|
277
|
+
txHashes: request.block.body.txEffects.map((e)=>e.txHash),
|
|
278
|
+
archive: request.block.archive.root
|
|
279
|
+
};
|
|
280
|
+
} else {
|
|
281
|
+
throw new Error(`Unknown request type: ${request.type}`);
|
|
282
|
+
}
|
|
283
|
+
const result = await this.reqRespTxsCollector(request.requestTracker, blockTxsSource, pinnedPeer);
|
|
284
|
+
return {
|
|
285
|
+
validTxs: result,
|
|
286
|
+
invalidTxHashes: []
|
|
287
|
+
};
|
|
288
|
+
}, Array.from(request.requestTracker.missingTxHashes), {
|
|
289
|
+
description: `reqresp for slot ${slotNumber}`,
|
|
290
|
+
method: 'fast-req-resp',
|
|
291
|
+
...opts,
|
|
292
|
+
...request.blockInfo
|
|
293
|
+
}, this.getAddContext(request));
|
|
294
|
+
} catch (err) {
|
|
295
|
+
this.log.error(`Error sending fast reqresp request for txs`, err, {
|
|
296
|
+
txs: [
|
|
297
|
+
...request.requestTracker.missingTxHashes
|
|
298
|
+
],
|
|
299
|
+
...blockInfo
|
|
300
|
+
});
|
|
137
301
|
}
|
|
138
|
-
return this.fastCollection.collectFastFor(input, txHashes, opts);
|
|
139
302
|
}
|
|
140
|
-
/** Returns the TxAddContext for the given
|
|
141
|
-
if (
|
|
303
|
+
/** Returns the TxAddContext for the given request, used by the sink to add txs to the pool correctly. */ getAddContext(request) {
|
|
304
|
+
if (request.type === 'proposal') {
|
|
142
305
|
return {
|
|
143
306
|
type: 'proposal',
|
|
144
|
-
blockHeader:
|
|
307
|
+
blockHeader: request.blockProposal.blockHeader
|
|
145
308
|
};
|
|
146
309
|
} else {
|
|
147
310
|
return {
|
|
148
311
|
type: 'mined',
|
|
149
|
-
block:
|
|
312
|
+
block: request.block
|
|
150
313
|
};
|
|
151
314
|
}
|
|
152
315
|
}
|
|
153
|
-
/** Mark the given txs as found. Stops collecting them. */ foundTxs(txs) {
|
|
154
|
-
this.
|
|
155
|
-
|
|
156
|
-
|
|
316
|
+
/** Mark the given txs as found. Stops collecting them across all in-flight requests. */ foundTxs(txs) {
|
|
317
|
+
for (const request of this.requests){
|
|
318
|
+
for (const tx of txs){
|
|
319
|
+
if (request.requestTracker.markFetched(tx)) {
|
|
320
|
+
this.log.trace(`Found tx ${tx.txHash.toString()} for fast collection request`, {
|
|
321
|
+
...request.blockInfo,
|
|
322
|
+
txHash: tx.txHash.toString(),
|
|
323
|
+
type: request.type
|
|
324
|
+
});
|
|
325
|
+
if (request.requestTracker.allFetched()) {
|
|
326
|
+
this.log.trace(`All txs found for fast collection request`, {
|
|
327
|
+
...request.blockInfo,
|
|
328
|
+
type: request.type
|
|
329
|
+
});
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
157
335
|
}
|
|
158
336
|
/**
|
|
159
|
-
* Stop collecting all txs for blocks less than or
|
|
337
|
+
* Stop collecting all txs for blocks less than or equal to the block number specified.
|
|
160
338
|
* To be called when we no longer care about gathering txs up to a certain block, eg when they become proven or finalized.
|
|
161
339
|
*/ stopCollectingForBlocksUpTo(blockNumber) {
|
|
162
|
-
this.
|
|
163
|
-
|
|
164
|
-
|
|
340
|
+
for (const request of this.requests){
|
|
341
|
+
if (request.blockInfo.blockNumber <= blockNumber) {
|
|
342
|
+
request.requestTracker.cancel();
|
|
343
|
+
}
|
|
344
|
+
}
|
|
165
345
|
}
|
|
166
346
|
/**
|
|
167
347
|
* Stop collecting all txs for blocks greater than the block number specified.
|
|
168
348
|
* To be called when there is a chain prune and previously mined txs are no longer relevant.
|
|
169
349
|
*/ stopCollectingForBlocksAfter(blockNumber) {
|
|
170
|
-
this.
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
/** Every now and then, check if the pool has received one of the txs we are looking for, just to catch any race conditions */ async reconcileFoundTxsWithPool() {
|
|
175
|
-
const missingTxHashes = this.slowCollection.getMissingTxHashes();
|
|
176
|
-
const foundTxs = compactArray(await this.txPool.getTxsByHash(missingTxHashes));
|
|
177
|
-
if (foundTxs.length > 0) {
|
|
178
|
-
this.log.verbose(`Found ${foundTxs.length} txs in the pool during reconciliation`, {
|
|
179
|
-
foundTxs: foundTxs.map((t)=>t.getTxHash().toString())
|
|
180
|
-
});
|
|
181
|
-
this.foundTxs(foundTxs);
|
|
350
|
+
for (const request of this.requests){
|
|
351
|
+
if (request.blockInfo.blockNumber > blockNumber) {
|
|
352
|
+
request.requestTracker.cancel();
|
|
353
|
+
}
|
|
182
354
|
}
|
|
183
355
|
}
|
|
184
356
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { Logger } from '@aztec/foundation/log';
|
|
2
2
|
import type { TypedEventEmitter } from '@aztec/foundation/types';
|
|
3
3
|
import type { L2Block } from '@aztec/stdlib/block';
|
|
4
|
-
import type { BlockHeader, Tx
|
|
4
|
+
import type { BlockHeader, Tx } from '@aztec/stdlib/tx';
|
|
5
5
|
import type { TelemetryClient } from '@aztec/telemetry-client';
|
|
6
|
-
import type { TxPoolV2, TxPoolV2Events } from '../../mem_pools/
|
|
6
|
+
import type { TxPoolV2, TxPoolV2Events } from '../../mem_pools/index.js';
|
|
7
7
|
import type { CollectionMethod } from './tx_collection.js';
|
|
8
|
+
import type { TxSourceCollectionResult } from './tx_source.js';
|
|
8
9
|
/** Context determining how collected txs should be added to the pool. */
|
|
9
10
|
export type TxAddContext = {
|
|
10
11
|
type: 'proposal';
|
|
@@ -15,7 +16,7 @@ export type TxAddContext = {
|
|
|
15
16
|
};
|
|
16
17
|
declare const TxCollectionSink_base: new () => TypedEventEmitter<TxPoolV2Events>;
|
|
17
18
|
/**
|
|
18
|
-
* Executes collection requests from
|
|
19
|
+
* Executes collection requests from fast collection paths, and handles collected txs
|
|
19
20
|
* by adding them to the tx pool and emitting events, as well as handling logging and metrics.
|
|
20
21
|
*/
|
|
21
22
|
export declare class TxCollectionSink extends TxCollectionSink_base {
|
|
@@ -23,12 +24,12 @@ export declare class TxCollectionSink extends TxCollectionSink_base {
|
|
|
23
24
|
private readonly log;
|
|
24
25
|
private readonly instrumentation;
|
|
25
26
|
constructor(txPool: TxPoolV2, telemetryClient: TelemetryClient, log: Logger);
|
|
26
|
-
collect(collectValidTxsFn: (
|
|
27
|
+
collect(collectValidTxsFn: () => Promise<TxSourceCollectionResult>, requested: string[], info: Record<string, any> & {
|
|
27
28
|
description: string;
|
|
28
29
|
method: CollectionMethod;
|
|
29
30
|
}, context: TxAddContext): Promise<{
|
|
30
31
|
txs: Tx[];
|
|
31
|
-
requested:
|
|
32
|
+
requested: string[];
|
|
32
33
|
duration: number;
|
|
33
34
|
} | {
|
|
34
35
|
txs: Tx[];
|
|
@@ -36,4 +37,4 @@ export declare class TxCollectionSink extends TxCollectionSink_base {
|
|
|
36
37
|
private foundTxs;
|
|
37
38
|
}
|
|
38
39
|
export {};
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfY29sbGVjdGlvbl9zaW5rLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi90eF9jb2xsZWN0aW9uX3NpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJL0QsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpFLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRCx5RUFBeUU7QUFDekUsTUFBTSxNQUFNLFlBQVksR0FBRztJQUFFLElBQUksRUFBRSxVQUFVLENBQUM7SUFBQyxXQUFXLEVBQUUsV0FBVyxDQUFBO0NBQUUsR0FBRztJQUFFLElBQUksRUFBRSxPQUFPLENBQUM7SUFBQyxLQUFLLEVBQUUsT0FBTyxDQUFBO0NBQUUsQ0FBQzs7QUFFOUc7OztHQUdHO0FBQ0gscUJBQWEsZ0JBQWlCLFNBQVEscUJBQTZEO0lBSS9GLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQUV2QixPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUc7SUFMdEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQThCO0lBRTlELFlBQ21CLE1BQU0sRUFBRSxRQUFRLEVBQ2pDLGVBQWUsRUFBRSxlQUFlLEVBQ2YsR0FBRyxFQUFFLE1BQU0sRUFJN0I7SUFFWSxPQUFPLENBQ2xCLGlCQUFpQixFQUFFLE1BQU0sT0FBTyxDQUFDLHdCQUF3QixDQUFDLEVBQzFELFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFDbkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDO1FBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFBO0tBQUUsRUFDN0UsT0FBTyxFQUFFLFlBQVk7Ozs7OztPQXdEdEI7WUFFYSxRQUFRO0NBNkJ2QiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx_collection_sink.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_collection_sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"tx_collection_sink.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_collection_sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI/D,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;;AAE9G;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,qBAA6D;IAI/F,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IALtB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;IAE9D,YACmB,MAAM,EAAE,QAAQ,EACjC,eAAe,EAAE,eAAe,EACf,GAAG,EAAE,MAAM,EAI7B;IAEY,OAAO,CAClB,iBAAiB,EAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,EAC1D,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,EAC7E,OAAO,EAAE,YAAY;;;;;;OAwDtB;YAEa,QAAQ;CA6BvB"}
|
|
@@ -2,7 +2,7 @@ import { elapsed } from '@aztec/foundation/timer';
|
|
|
2
2
|
import EventEmitter from 'node:events';
|
|
3
3
|
import { TxCollectionInstrumentation } from './instrumentation.js';
|
|
4
4
|
/**
|
|
5
|
-
* Executes collection requests from
|
|
5
|
+
* Executes collection requests from fast collection paths, and handles collected txs
|
|
6
6
|
* by adding them to the tx pool and emitting events, as well as handling logging and metrics.
|
|
7
7
|
*/ export class TxCollectionSink extends EventEmitter {
|
|
8
8
|
txPool;
|
|
@@ -15,43 +15,34 @@ import { TxCollectionInstrumentation } from './instrumentation.js';
|
|
|
15
15
|
async collect(collectValidTxsFn, requested, info, context) {
|
|
16
16
|
this.log.trace(`Requesting ${requested.length} txs via ${info.description}`, {
|
|
17
17
|
...info,
|
|
18
|
-
requestedTxs: requested
|
|
18
|
+
requestedTxs: requested
|
|
19
19
|
});
|
|
20
20
|
// Execute collection function and measure the time taken, catching any errors.
|
|
21
|
-
const [duration,
|
|
21
|
+
const [duration, { validTxs, invalidTxHashes }] = await elapsed(async ()=>{
|
|
22
22
|
try {
|
|
23
|
-
|
|
24
|
-
return response.filter((tx)=>tx !== undefined);
|
|
23
|
+
return await collectValidTxsFn();
|
|
25
24
|
} catch (err) {
|
|
26
25
|
this.log.error(`Error collecting txs via ${info.description}`, err, {
|
|
27
26
|
...info,
|
|
28
|
-
requestedTxs: requested
|
|
27
|
+
requestedTxs: requested
|
|
29
28
|
});
|
|
30
|
-
return
|
|
29
|
+
return {
|
|
30
|
+
validTxs: [],
|
|
31
|
+
invalidTxHashes: []
|
|
32
|
+
};
|
|
31
33
|
}
|
|
32
34
|
});
|
|
33
|
-
if (
|
|
35
|
+
if (validTxs.length === 0 && invalidTxHashes.length === 0) {
|
|
34
36
|
this.log.trace(`No txs found via ${info.description}`, {
|
|
35
37
|
...info,
|
|
36
|
-
requestedTxs: requested
|
|
38
|
+
requestedTxs: requested
|
|
37
39
|
});
|
|
38
40
|
return {
|
|
39
|
-
txs,
|
|
41
|
+
txs: validTxs,
|
|
40
42
|
requested,
|
|
41
43
|
duration
|
|
42
44
|
};
|
|
43
45
|
}
|
|
44
|
-
// Validate tx hashes for all collected txs from external sources
|
|
45
|
-
const validTxs = [];
|
|
46
|
-
const invalidTxHashes = [];
|
|
47
|
-
await Promise.all(txs.map(async (tx)=>{
|
|
48
|
-
const isValid = await tx.validateTxHash();
|
|
49
|
-
if (isValid) {
|
|
50
|
-
validTxs.push(tx);
|
|
51
|
-
} else {
|
|
52
|
-
invalidTxHashes.push(tx.getTxHash().toString());
|
|
53
|
-
}
|
|
54
|
-
}));
|
|
55
46
|
if (invalidTxHashes.length > 0) {
|
|
56
47
|
this.log.warn(`Rejecting ${invalidTxHashes.length} txs with invalid hashes from ${info.description}`, {
|
|
57
48
|
...info,
|
|
@@ -61,7 +52,7 @@ import { TxCollectionInstrumentation } from './instrumentation.js';
|
|
|
61
52
|
if (validTxs.length === 0) {
|
|
62
53
|
this.log.trace(`No valid txs found via ${info.description} after validation`, {
|
|
63
54
|
...info,
|
|
64
|
-
requestedTxs: requested
|
|
55
|
+
requestedTxs: requested,
|
|
65
56
|
invalidTxHashes
|
|
66
57
|
});
|
|
67
58
|
return {
|
|
@@ -74,7 +65,7 @@ import { TxCollectionInstrumentation } from './instrumentation.js';
|
|
|
74
65
|
...info,
|
|
75
66
|
duration,
|
|
76
67
|
txs: validTxs.map((t)=>t.getTxHash().toString()),
|
|
77
|
-
requestedTxs: requested
|
|
68
|
+
requestedTxs: requested,
|
|
78
69
|
rejectedCount: invalidTxHashes.length
|
|
79
70
|
});
|
|
80
71
|
return await this.foundTxs(validTxs, {
|
|
@@ -85,7 +76,7 @@ import { TxCollectionInstrumentation } from './instrumentation.js';
|
|
|
85
76
|
async foundTxs(txs, info, context) {
|
|
86
77
|
// Report metrics for the collection
|
|
87
78
|
this.instrumentation.increaseTxsFor(info.method, txs.length, info.duration);
|
|
88
|
-
// Mark txs as found in
|
|
79
|
+
// Mark txs as found in all in-flight collection requests
|
|
89
80
|
this.emit('txs-added', {
|
|
90
81
|
txs
|
|
91
82
|
});
|
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
import type { ChainConfig } from '@aztec/stdlib/config';
|
|
2
2
|
import { type AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
3
|
-
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
3
|
+
import type { Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
|
|
4
4
|
import { type ComponentsVersions } from '@aztec/stdlib/versioning';
|
|
5
|
+
export type TxSourceCollectionResult = {
|
|
6
|
+
validTxs: Tx[];
|
|
7
|
+
invalidTxHashes: string[];
|
|
8
|
+
};
|
|
5
9
|
export interface TxSource {
|
|
6
10
|
getInfo(): string;
|
|
7
|
-
getTxsByHash(txHashes: TxHash[]): Promise<
|
|
11
|
+
getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult>;
|
|
8
12
|
}
|
|
9
13
|
export declare class NodeRpcTxSource implements TxSource {
|
|
10
14
|
private readonly client;
|
|
15
|
+
private readonly txValidator;
|
|
11
16
|
private readonly info;
|
|
12
|
-
constructor(client: Pick<AztecNode, 'getTxsByHash'>, info: string);
|
|
13
|
-
static fromUrl(nodeUrl: string, versions: ComponentsVersions): NodeRpcTxSource;
|
|
17
|
+
constructor(client: Pick<AztecNode, 'getTxsByHash'>, txValidator: TxValidator, info: string);
|
|
18
|
+
static fromUrl(nodeUrl: string, txValidator: TxValidator, versions: ComponentsVersions): NodeRpcTxSource;
|
|
14
19
|
getInfo(): string;
|
|
15
|
-
getTxsByHash(txHashes: TxHash[]): Promise<
|
|
20
|
+
getTxsByHash(txHashes: TxHash[]): Promise<TxSourceCollectionResult>;
|
|
21
|
+
private verifyTxs;
|
|
16
22
|
}
|
|
17
|
-
export declare function createNodeRpcTxSources(urls: string[], chainConfig: ChainConfig): NodeRpcTxSource[];
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
export declare function createNodeRpcTxSources(urls: string[], txValidator: TxValidator, chainConfig: ChainConfig): NodeRpcTxSource[];
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfc291cmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi90eF9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3hGLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQW1DLE1BQU0sMEJBQTBCLENBQUM7QUFHcEcsTUFBTSxNQUFNLHdCQUF3QixHQUFHO0lBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxDQUFBO0NBQUUsQ0FBQztBQUVyRixNQUFNLFdBQVcsUUFBUTtJQUN2QixPQUFPLElBQUksTUFBTSxDQUFDO0lBQ2xCLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7Q0FDckU7QUFFRCxxQkFBYSxlQUFnQixZQUFXLFFBQVE7SUFFNUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0lBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVztJQUM1QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUk7SUFIdkIsWUFDbUIsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQ3ZDLFdBQVcsRUFBRSxXQUFXLEVBQ3hCLElBQUksRUFBRSxNQUFNLEVBQzNCO0lBRUosT0FBYyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsR0FBRyxlQUFlLENBRzlHO0lBRU0sT0FBTyxXQUViO0lBRVksWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FHL0U7WUFFYSxTQUFTO0NBZ0J4QjtBQUVELHdCQUFnQixzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxxQkFHeEcifQ==
|