@aztec-labs/p2p 6.0.0-nightly.20260829
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 +134 -0
- package/dest/bootstrap/bootstrap.d.ts +39 -0
- package/dest/bootstrap/bootstrap.d.ts.map +1 -0
- package/dest/bootstrap/bootstrap.js +152 -0
- package/dest/client/factory.d.ts +32 -0
- package/dest/client/factory.d.ts.map +1 -0
- package/dest/client/factory.js +125 -0
- package/dest/client/index.d.ts +4 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +3 -0
- package/dest/client/interface.d.ts +223 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +9 -0
- package/dest/client/p2p_client.d.ts +202 -0
- package/dest/client/p2p_client.d.ts.map +1 -0
- package/dest/client/p2p_client.js +1051 -0
- package/dest/config.d.ts +295 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +458 -0
- package/dest/enr/generate-enr.d.ts +17 -0
- package/dest/enr/generate-enr.d.ts.map +1 -0
- package/dest/enr/generate-enr.js +52 -0
- package/dest/enr/index.d.ts +2 -0
- package/dest/enr/index.d.ts.map +1 -0
- package/dest/enr/index.js +1 -0
- package/dest/errors/attestation-pool.error.d.ts +7 -0
- package/dest/errors/attestation-pool.error.d.ts.map +1 -0
- package/dest/errors/attestation-pool.error.js +12 -0
- 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 +21 -0
- package/dest/errors/reqresp.error.d.ts.map +1 -0
- package/dest/errors/reqresp.error.js +23 -0
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +11 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +9 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +194 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.js +521 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +745 -0
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -0
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/index.js +1 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts +242 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/mocks.js +33 -0
- package/dest/mem_pools/index.d.ts +4 -0
- package/dest/mem_pools/index.d.ts.map +1 -0
- package/dest/mem_pools/index.js +1 -0
- package/dest/mem_pools/instrumentation.d.ts +41 -0
- package/dest/mem_pools/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/instrumentation.js +120 -0
- package/dest/mem_pools/interface.d.ts +10 -0
- package/dest/mem_pools/interface.d.ts.map +1 -0
- package/dest/mem_pools/interface.js +3 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +48 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +112 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +99 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -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 +64 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +64 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +92 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +79 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +25 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +67 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +243 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +11 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +122 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +368 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +75 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +218 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +122 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1039 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +17 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.js +111 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +24 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +75 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +3 -0
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/index.js +2 -0
- package/dest/msg_validators/index.d.ts +4 -0
- package/dest/msg_validators/index.d.ts.map +1 -0
- package/dest/msg_validators/index.js +3 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +16 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +16 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +26 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +40 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +186 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +7 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +25 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +4 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +31 -0
- 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.d.ts +14 -0
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +25 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/block_header_validator.js +27 -0
- 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 +9 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/data_validator.js +114 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +21 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.js +36 -0
- package/dest/msg_validators/tx_validator/factory.d.ts +148 -0
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/factory.js +302 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
- package/dest/msg_validators/tx_validator/gas_limits_validator.d.ts +73 -0
- package/dest/msg_validators/tx_validator/gas_limits_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/gas_limits_validator.js +107 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +65 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/gas_validator.js +107 -0
- package/dest/msg_validators/tx_validator/index.d.ts +20 -0
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/index.js +19 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.js +63 -0
- 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 +35 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/phases_validator.js +141 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/test_utils.js +22 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +30 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +11 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +28 -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 +27 -0
- package/dest/services/data_store.d.ts.map +1 -0
- package/dest/services/data_store.js +192 -0
- package/dest/services/discv5/discV5_service.d.ts +54 -0
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +337 -0
- 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 +150 -0
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/services/dummy_service.js +228 -0
- package/dest/services/encoding.d.ts +67 -0
- package/dest/services/encoding.d.ts.map +1 -0
- package/dest/services/encoding.js +152 -0
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +25 -0
- package/dest/services/gossipsub/scoring.d.ts.map +1 -0
- package/dest/services/gossipsub/scoring.js +27 -0
- package/dest/services/gossipsub/topic_score_params.d.ts +167 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +336 -0
- package/dest/services/index.d.ts +8 -0
- package/dest/services/index.d.ts.map +1 -0
- package/dest/services/index.js +7 -0
- package/dest/services/libp2p/instrumentation.d.ts +25 -0
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
- package/dest/services/libp2p/instrumentation.js +143 -0
- package/dest/services/libp2p/libp2p_service.d.ts +250 -0
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_service.js +1983 -0
- package/dest/services/peer-manager/interface.d.ts +23 -0
- package/dest/services/peer-manager/interface.d.ts.map +1 -0
- package/dest/services/peer-manager/interface.js +1 -0
- package/dest/services/peer-manager/metrics.d.ts +23 -0
- package/dest/services/peer-manager/metrics.d.ts.map +1 -0
- package/dest/services/peer-manager/metrics.js +71 -0
- package/dest/services/peer-manager/peer_manager.d.ts +202 -0
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_manager.js +1015 -0
- package/dest/services/peer-manager/peer_scoring.d.ts +65 -0
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_scoring.js +239 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
- package/dest/services/reqresp/config.d.ts +30 -0
- package/dest/services/reqresp/config.d.ts.map +1 -0
- package/dest/services/reqresp/config.js +45 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +76 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +251 -0
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- package/dest/services/reqresp/index.d.ts +7 -0
- package/dest/services/reqresp/index.d.ts.map +1 -0
- package/dest/services/reqresp/index.js +5 -0
- package/dest/services/reqresp/interface.d.ts +174 -0
- package/dest/services/reqresp/interface.d.ts.map +1 -0
- package/dest/services/reqresp/interface.js +107 -0
- package/dest/services/reqresp/metrics.d.ts +16 -0
- package/dest/services/reqresp/metrics.d.ts.map +1 -0
- package/dest/services/reqresp/metrics.js +50 -0
- package/dest/services/reqresp/protocols/auth.d.ts +43 -0
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/auth.js +71 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +35 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +88 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +13 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +60 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +75 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +139 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts +49 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/goodbye.js +87 -0
- package/dest/services/reqresp/protocols/index.d.ts +10 -0
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/index.js +8 -0
- package/dest/services/reqresp/protocols/ping.d.ts +7 -0
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/ping.js +7 -0
- package/dest/services/reqresp/protocols/status.d.ts +42 -0
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/status.js +78 -0
- package/dest/services/reqresp/protocols/tx.d.ts +29 -0
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/tx.js +66 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts +2 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/index.js +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +105 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +194 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +3 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.js +64 -0
- package/dest/services/reqresp/reqresp.d.ts +107 -0
- package/dest/services/reqresp/reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/reqresp.js +887 -0
- package/dest/services/reqresp/status.d.ts +37 -0
- package/dest/services/reqresp/status.d.ts.map +1 -0
- package/dest/services/reqresp/status.js +58 -0
- package/dest/services/service.d.ts +168 -0
- package/dest/services/service.d.ts.map +1 -0
- package/dest/services/service.js +5 -0
- package/dest/services/tx_collection/config.d.ts +25 -0
- package/dest/services/tx_collection/config.d.ts.map +1 -0
- package/dest/services/tx_collection/config.js +59 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +100 -0
- package/dest/services/tx_collection/index.d.ts +4 -0
- package/dest/services/tx_collection/index.d.ts.map +1 -0
- package/dest/services/tx_collection/index.js +3 -0
- package/dest/services/tx_collection/instrumentation.d.ts +10 -0
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_collection/instrumentation.js +30 -0
- 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 +104 -0
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection.js +356 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts +40 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection_sink.js +108 -0
- package/dest/services/tx_collection/tx_source.d.ts +24 -0
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_source.js +56 -0
- package/dest/services/tx_file_store/config.d.ts +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +142 -0
- package/dest/services/tx_provider.d.ts +53 -0
- package/dest/services/tx_provider.d.ts.map +1 -0
- package/dest/services/tx_provider.js +223 -0
- package/dest/services/tx_provider_instrumentation.d.ts +16 -0
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
- package/dest/services/tx_provider_instrumentation.js +34 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts +7 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts.map +1 -0
- package/dest/test-helpers/generate-peer-id-private-keys.js +13 -0
- package/dest/test-helpers/get-ports.d.ts +7 -0
- package/dest/test-helpers/get-ports.d.ts.map +1 -0
- package/dest/test-helpers/get-ports.js +8 -0
- package/dest/test-helpers/index.d.ts +9 -0
- package/dest/test-helpers/index.d.ts.map +1 -0
- package/dest/test-helpers/index.js +8 -0
- package/dest/test-helpers/make-enrs.d.ts +16 -0
- package/dest/test-helpers/make-enrs.d.ts.map +1 -0
- package/dest/test-helpers/make-enrs.js +31 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +63 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
- package/dest/test-helpers/make-test-p2p-clients.js +140 -0
- package/dest/test-helpers/mock-pubsub.d.ts +109 -0
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
- package/dest/test-helpers/mock-pubsub.js +244 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
- package/dest/test-helpers/mock-tx-helpers.js +19 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +68 -0
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
- package/dest/test-helpers/reqresp-nodes.js +240 -0
- package/dest/test-helpers/test_tx_provider.d.ts +42 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +44 -0
- package/dest/test-helpers/testbench-utils.d.ts +164 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +401 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -0
- package/dest/testbench/p2p_client_testbench_worker.js +364 -0
- package/dest/testbench/parse_log_file.d.ts +2 -0
- package/dest/testbench/parse_log_file.d.ts.map +1 -0
- package/dest/testbench/parse_log_file.js +131 -0
- package/dest/testbench/testbench.d.ts +2 -0
- package/dest/testbench/testbench.d.ts.map +1 -0
- package/dest/testbench/testbench.js +62 -0
- package/dest/testbench/worker_client_manager.d.ts +102 -0
- package/dest/testbench/worker_client_manager.d.ts.map +1 -0
- package/dest/testbench/worker_client_manager.js +492 -0
- package/dest/types/index.d.ts +34 -0
- package/dest/types/index.d.ts.map +1 -0
- package/dest/types/index.js +30 -0
- package/dest/util.d.ts +66 -0
- package/dest/util.d.ts.map +1 -0
- package/dest/util.js +167 -0
- package/dest/versioning.d.ts +9 -0
- package/dest/versioning.d.ts.map +1 -0
- package/dest/versioning.js +17 -0
- package/package.json +131 -0
- package/src/bootstrap/bootstrap.ts +178 -0
- package/src/client/factory.ts +282 -0
- package/src/client/index.ts +3 -0
- package/src/client/interface.ts +264 -0
- package/src/client/p2p_client.ts +846 -0
- package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
- package/src/config.ts +787 -0
- package/src/enr/generate-enr.ts +71 -0
- package/src/enr/index.ts +1 -0
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +29 -0
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +11 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +648 -0
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +896 -0
- package/src/mem_pools/attestation_pool/index.ts +9 -0
- package/src/mem_pools/attestation_pool/mocks.ts +56 -0
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/instrumentation.ts +160 -0
- package/src/mem_pools/interface.ts +10 -0
- package/src/mem_pools/tx_pool_v2/README.md +283 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +130 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +120 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +126 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +72 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +99 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +90 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +96 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +274 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +465 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +300 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1242 -0
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +116 -0
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +107 -0
- package/src/msg_validators/attestation_validator/index.ts +2 -0
- package/src/msg_validators/index.ts +3 -0
- package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +37 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +49 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +198 -0
- package/src/msg_validators/tx_validator/README.md +137 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +24 -0
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +30 -0
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +38 -0
- 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 +173 -0
- package/src/msg_validators/tx_validator/double_spend_validator.ts +46 -0
- package/src/msg_validators/tx_validator/factory.ts +490 -0
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
- package/src/msg_validators/tx_validator/gas_limits_validator.ts +148 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +149 -0
- package/src/msg_validators/tx_validator/index.ts +19 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +104 -0
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +173 -0
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/test_utils.ts +43 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +61 -0
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +26 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +100 -0
- package/src/services/data_store.ts +229 -0
- package/src/services/discv5/discV5_service.ts +413 -0
- package/src/services/discv5/persisted_enr_store.ts +157 -0
- package/src/services/dummy_service.ts +320 -0
- package/src/services/encoding.ts +170 -0
- package/src/services/gossipsub/README.md +663 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +37 -0
- package/src/services/gossipsub/topic_score_params.ts +477 -0
- package/src/services/index.ts +7 -0
- package/src/services/libp2p/instrumentation.ts +147 -0
- package/src/services/libp2p/libp2p_service.ts +1972 -0
- package/src/services/peer-manager/interface.ts +28 -0
- package/src/services/peer-manager/metrics.ts +90 -0
- package/src/services/peer-manager/peer_manager.ts +1221 -0
- package/src/services/peer-manager/peer_scoring.ts +265 -0
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +344 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +659 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +60 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +167 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +248 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
- package/src/services/reqresp/config.ts +69 -0
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +287 -0
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/index.ts +6 -0
- package/src/services/reqresp/interface.ts +241 -0
- package/src/services/reqresp/metrics.ts +68 -0
- package/src/services/reqresp/protocols/auth.ts +83 -0
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +107 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +79 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +170 -0
- package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
- package/src/services/reqresp/protocols/goodbye.ts +102 -0
- package/src/services/reqresp/protocols/index.ts +9 -0
- package/src/services/reqresp/protocols/ping.ts +8 -0
- package/src/services/reqresp/protocols/status.ts +123 -0
- package/src/services/reqresp/protocols/tx.ts +76 -0
- package/src/services/reqresp/rate-limiter/index.ts +1 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +240 -0
- package/src/services/reqresp/rate-limiter/rate_limits.ts +65 -0
- package/src/services/reqresp/reqresp.ts +675 -0
- package/src/services/reqresp/status.ts +68 -0
- package/src/services/service.ts +219 -0
- package/src/services/tx_collection/config.ts +89 -0
- package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
- package/src/services/tx_collection/file_store_tx_source.ts +129 -0
- package/src/services/tx_collection/index.ts +3 -0
- package/src/services/tx_collection/instrumentation.ts +35 -0
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +467 -0
- package/src/services/tx_collection/tx_collection_sink.ts +124 -0
- package/src/services/tx_collection/tx_source.ts +61 -0
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +42 -0
- package/src/services/tx_file_store/tx_file_store.ts +163 -0
- package/src/services/tx_provider.ts +237 -0
- package/src/services/tx_provider_instrumentation.ts +54 -0
- package/src/test-helpers/generate-peer-id-private-keys.ts +15 -0
- package/src/test-helpers/get-ports.ts +8 -0
- package/src/test-helpers/index.ts +8 -0
- package/src/test-helpers/make-enrs.ts +42 -0
- package/src/test-helpers/make-test-p2p-clients.ts +213 -0
- package/src/test-helpers/mock-pubsub.ts +325 -0
- package/src/test-helpers/mock-tx-helpers.ts +24 -0
- package/src/test-helpers/reqresp-nodes.ts +327 -0
- package/src/test-helpers/test_tx_provider.ts +68 -0
- package/src/test-helpers/testbench-utils.ts +465 -0
- package/src/testbench/README.md +20 -0
- package/src/testbench/p2p_client_testbench_worker.ts +553 -0
- package/src/testbench/parse_log_file.ts +174 -0
- package/src/testbench/testbench.ts +66 -0
- package/src/testbench/worker_client_manager.ts +621 -0
- package/src/types/index.ts +38 -0
- package/src/util.ts +230 -0
- package/src/versioning.ts +26 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Attributes,
|
|
3
|
+
type Histogram,
|
|
4
|
+
Metrics,
|
|
5
|
+
type TelemetryClient,
|
|
6
|
+
type UpDownCounter,
|
|
7
|
+
createUpDownCounterWithDefault,
|
|
8
|
+
} from '@aztec-labs/telemetry-client';
|
|
9
|
+
|
|
10
|
+
import type { CollectionMethod } from './tx_collection.js';
|
|
11
|
+
|
|
12
|
+
export class TxCollectionInstrumentation {
|
|
13
|
+
private txsCollected: UpDownCounter;
|
|
14
|
+
private collectionDurationPerTx: Histogram;
|
|
15
|
+
private collectionDurationPerRequest: Histogram;
|
|
16
|
+
|
|
17
|
+
constructor(client: TelemetryClient, name: string) {
|
|
18
|
+
const meter = client.getMeter(name);
|
|
19
|
+
|
|
20
|
+
this.txsCollected = createUpDownCounterWithDefault(meter, Metrics.TX_COLLECTOR_COUNT, {
|
|
21
|
+
[Attributes.TX_COLLECTION_METHOD]: ['fast-req-resp', 'fast-node-rpc', 'file-store'],
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
this.collectionDurationPerTx = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_TX);
|
|
25
|
+
|
|
26
|
+
this.collectionDurationPerRequest = meter.createHistogram(Metrics.TX_COLLECTOR_DURATION_PER_REQUEST);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
increaseTxsFor(what: CollectionMethod, count: number, duration: number) {
|
|
30
|
+
const durationPerTx = Math.ceil(duration / count);
|
|
31
|
+
this.collectionDurationPerTx.record(durationPerTx, { [Attributes.TX_COLLECTION_METHOD]: what });
|
|
32
|
+
this.collectionDurationPerRequest.record(Math.ceil(duration), { [Attributes.TX_COLLECTION_METHOD]: what });
|
|
33
|
+
this.txsCollected.add(count, { [Attributes.TX_COLLECTION_METHOD]: what });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { type PromiseWithResolvers, promiseWithResolvers } from '@aztec-labs/foundation/promise';
|
|
2
|
+
import type { DateProvider } from '@aztec-labs/foundation/timer';
|
|
3
|
+
import { TxHash } from '@aztec-labs/stdlib/tx';
|
|
4
|
+
import type { Tx } from '@aztec-labs/stdlib/tx';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Tracks which transactions are still missing and need to be fetched.
|
|
8
|
+
* Manages the request deadline and serves as the sole source of cancellation signal.
|
|
9
|
+
* The request is cancelled when all txs are fetched or the deadline expires.
|
|
10
|
+
*/
|
|
11
|
+
export interface IRequestTracker {
|
|
12
|
+
/** Returns the set of transaction hashes that are still missing. */
|
|
13
|
+
get missingTxHashes(): Set<string>;
|
|
14
|
+
/** Size of this.missingTxHashes */
|
|
15
|
+
get numberOfMissingTxs(): number;
|
|
16
|
+
/** Are all requested txs fetched */
|
|
17
|
+
allFetched(): boolean;
|
|
18
|
+
/** Checks that transaction is still missing */
|
|
19
|
+
isMissing(txHash: string): boolean;
|
|
20
|
+
/** Marks a transaction as fetched. Returns true if it was previously missing. */
|
|
21
|
+
markFetched(tx: Tx): boolean;
|
|
22
|
+
/** Get list of collected txs */
|
|
23
|
+
get collectedTxs(): Tx[];
|
|
24
|
+
/** The deadline for this request. */
|
|
25
|
+
get deadline(): Date;
|
|
26
|
+
/** Remaining time in milliseconds until deadline. Returns 0 if already past. */
|
|
27
|
+
get timeoutMs(): number;
|
|
28
|
+
/** Checks whether the request is cancelled (deadline expired or all fetched). May trigger cancellation if deadline has passed. */
|
|
29
|
+
checkCancelled(): boolean;
|
|
30
|
+
/** Resolves when deadline expires or all txs are fetched. */
|
|
31
|
+
get cancellationToken(): Promise<void>;
|
|
32
|
+
/** Externally cancel the request. */
|
|
33
|
+
cancel(): void;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export class RequestTracker implements IRequestTracker {
|
|
37
|
+
public readonly collectedTxs: Tx[] = [];
|
|
38
|
+
private done = false;
|
|
39
|
+
private readonly cancellationTokenPromise: PromiseWithResolvers<void>;
|
|
40
|
+
private readonly deadlineTimer: ReturnType<typeof setTimeout> | undefined;
|
|
41
|
+
|
|
42
|
+
private constructor(
|
|
43
|
+
public readonly missingTxHashes: Set<string>,
|
|
44
|
+
public readonly deadline: Date,
|
|
45
|
+
private readonly dateProvider?: DateProvider,
|
|
46
|
+
) {
|
|
47
|
+
this.cancellationTokenPromise = promiseWithResolvers<void>();
|
|
48
|
+
|
|
49
|
+
if (missingTxHashes.size === 0) {
|
|
50
|
+
this.finish();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const now = this.dateProvider?.now() ?? Date.now();
|
|
55
|
+
const remaining = deadline.getTime() - now;
|
|
56
|
+
if (remaining <= 0) {
|
|
57
|
+
this.finish();
|
|
58
|
+
} else {
|
|
59
|
+
this.deadlineTimer = setTimeout(() => this.finish(), remaining);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public static create(hashes: TxHash[] | string[], deadline: Date, dateProvider?: DateProvider) {
|
|
64
|
+
return new RequestTracker(new Set(hashes.map(hash => hash.toString())), deadline, dateProvider);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
markFetched(tx: Tx): boolean {
|
|
68
|
+
if (this.missingTxHashes.delete(tx.txHash.toString())) {
|
|
69
|
+
this.collectedTxs.push(tx);
|
|
70
|
+
if (this.allFetched()) {
|
|
71
|
+
this.finish();
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
get numberOfMissingTxs(): number {
|
|
79
|
+
return this.missingTxHashes.size;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
allFetched(): boolean {
|
|
83
|
+
return this.numberOfMissingTxs === 0;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
isMissing(txHash: string): boolean {
|
|
87
|
+
return this.missingTxHashes.has(txHash.toString());
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
get timeoutMs(): number {
|
|
91
|
+
const now = this.dateProvider?.now() ?? Date.now();
|
|
92
|
+
return Math.max(0, this.deadline.getTime() - now);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
checkCancelled(): boolean {
|
|
96
|
+
if (this.done) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
// Synchronous fallback: check deadline even if setTimeout hasn't fired yet.
|
|
100
|
+
// This prevents macrotask starvation in tight async loops from blocking cancellation.
|
|
101
|
+
const now = this.dateProvider?.now() ?? Date.now();
|
|
102
|
+
if (now >= this.deadline.getTime()) {
|
|
103
|
+
this.finish();
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
get cancellationToken(): Promise<void> {
|
|
110
|
+
return this.cancellationTokenPromise.promise;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
cancel(): void {
|
|
114
|
+
this.finish();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private finish() {
|
|
118
|
+
if (this.done) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.done = true;
|
|
122
|
+
if (this.deadlineTimer) {
|
|
123
|
+
clearTimeout(this.deadlineTimer);
|
|
124
|
+
}
|
|
125
|
+
this.cancellationTokenPromise.resolve();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import { BlockNumber } from '@aztec-labs/foundation/branded-types';
|
|
2
|
+
import { times } from '@aztec-labs/foundation/collection';
|
|
3
|
+
import { type Logger, createLogger } from '@aztec-labs/foundation/log';
|
|
4
|
+
import { sleep } from '@aztec-labs/foundation/sleep';
|
|
5
|
+
import { DateProvider, elapsed } from '@aztec-labs/foundation/timer';
|
|
6
|
+
import type { L2Block, L2BlockInfo } from '@aztec-labs/stdlib/block';
|
|
7
|
+
import type { L1RollupConstants } from '@aztec-labs/stdlib/epoch-helpers';
|
|
8
|
+
import type { BlockProposal } from '@aztec-labs/stdlib/p2p';
|
|
9
|
+
import type { Tx } from '@aztec-labs/stdlib/tx';
|
|
10
|
+
import { TxHash } from '@aztec-labs/stdlib/tx';
|
|
11
|
+
import { type TelemetryClient, getTelemetryClient } from '@aztec-labs/telemetry-client';
|
|
12
|
+
import type { PeerId } from '@libp2p/interface';
|
|
13
|
+
|
|
14
|
+
import type { TxPoolV2, TxPoolV2Events } from '../../mem_pools/tx_pool_v2/interfaces.js';
|
|
15
|
+
import { BatchTxRequester } from '../reqresp/batch-tx-requester/batch_tx_requester.js';
|
|
16
|
+
import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
|
|
17
|
+
import type { BlockTxsSource } from '../reqresp/index.js';
|
|
18
|
+
import type { TxCollectionConfig } from './config.js';
|
|
19
|
+
import { FileStoreTxCollection } from './file_store_tx_collection.js';
|
|
20
|
+
import type { FileStoreTxSource } from './file_store_tx_source.js';
|
|
21
|
+
import { type IRequestTracker, RequestTracker } from './request_tracker.js';
|
|
22
|
+
import { type TxAddContext, TxCollectionSink } from './tx_collection_sink.js';
|
|
23
|
+
import type { TxSource } from './tx_source.js';
|
|
24
|
+
|
|
25
|
+
export type CollectionMethod = 'fast-req-resp' | 'fast-node-rpc' | 'file-store';
|
|
26
|
+
|
|
27
|
+
export type FastCollectionRequestInput =
|
|
28
|
+
| { type: 'block'; block: L2Block }
|
|
29
|
+
| { type: 'proposal'; blockProposal: BlockProposal; blockNumber: BlockNumber };
|
|
30
|
+
|
|
31
|
+
export type FastCollectionRequest = FastCollectionRequestInput & {
|
|
32
|
+
requestTracker: IRequestTracker;
|
|
33
|
+
blockInfo: L2BlockInfo;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Collect missing transactions for a block or proposal via reqresp.
|
|
38
|
+
* @param requestTracker - The missing transactions tracker
|
|
39
|
+
* @param blockTxsSource - The block or proposal containing the transactions
|
|
40
|
+
* @param pinnedPeer - Optional peer expected to have the transactions
|
|
41
|
+
* @returns The collected transactions
|
|
42
|
+
*/
|
|
43
|
+
export type IReqRespTxsCollector = (
|
|
44
|
+
requestTracker: IRequestTracker,
|
|
45
|
+
blockTxsSource: BlockTxsSource,
|
|
46
|
+
pinnedPeer: PeerId | undefined,
|
|
47
|
+
) => Promise<Tx[]>;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Coordinates tx collection from remote RPC nodes, reqresp, and file store.
|
|
51
|
+
*
|
|
52
|
+
* Runs a sequential pipeline: node RPC → reqresp → file store. Node collection starts immediately,
|
|
53
|
+
* reqresp starts after a configured delay, and file store (if configured) starts after a further
|
|
54
|
+
* delay. All paths send txs to the collection sink, which handles metrics and adds them to the
|
|
55
|
+
* tx pool. Whenever a tx is added to the sink or the pool, this service is notified and stops
|
|
56
|
+
* collecting that tx across all in-flight requests.
|
|
57
|
+
*/
|
|
58
|
+
export class TxCollection {
|
|
59
|
+
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
60
|
+
protected requests: Set<FastCollectionRequest> = new Set();
|
|
61
|
+
|
|
62
|
+
/** The collector for txs via reqresp */
|
|
63
|
+
protected reqRespTxsCollector?: IReqRespTxsCollector;
|
|
64
|
+
|
|
65
|
+
/** File store collection for the fast (proposal/proving) path */
|
|
66
|
+
protected readonly fileStoreFastCollection: FileStoreTxCollection;
|
|
67
|
+
|
|
68
|
+
/** Handles txs found by collection paths before adding to the pool */
|
|
69
|
+
private readonly txCollectionSink: TxCollectionSink;
|
|
70
|
+
|
|
71
|
+
/** Handler for the txs-added event from the tx pool */
|
|
72
|
+
protected readonly handleTxsAddedToPool: TxPoolV2Events['txs-added'];
|
|
73
|
+
|
|
74
|
+
/** Handler for the txs-added event from the tx collection sink */
|
|
75
|
+
protected readonly handleTxsFound: TxPoolV2Events['txs-added'];
|
|
76
|
+
|
|
77
|
+
constructor(
|
|
78
|
+
private readonly p2pService: BatchTxRequesterLibP2PService,
|
|
79
|
+
private readonly nodes: TxSource[],
|
|
80
|
+
private readonly constants: L1RollupConstants,
|
|
81
|
+
private readonly txPool: TxPoolV2,
|
|
82
|
+
private readonly config: TxCollectionConfig,
|
|
83
|
+
fileStoreSources: FileStoreTxSource[] = [],
|
|
84
|
+
private readonly dateProvider: DateProvider = new DateProvider(),
|
|
85
|
+
telemetryClient: TelemetryClient = getTelemetryClient(),
|
|
86
|
+
private readonly log: Logger = createLogger('p2p:tx_collection_service'),
|
|
87
|
+
) {
|
|
88
|
+
this.txCollectionSink = new TxCollectionSink(this.txPool, telemetryClient, this.log);
|
|
89
|
+
|
|
90
|
+
this.reqRespTxsCollector = (requestTracker, blockTxsSource, pinnedPeer) =>
|
|
91
|
+
BatchTxRequester.collectAllTxs(
|
|
92
|
+
new BatchTxRequester(
|
|
93
|
+
requestTracker,
|
|
94
|
+
blockTxsSource,
|
|
95
|
+
pinnedPeer,
|
|
96
|
+
this.p2pService,
|
|
97
|
+
this.log,
|
|
98
|
+
this.dateProvider,
|
|
99
|
+
).run(),
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
this.fileStoreFastCollection = new FileStoreTxCollection(
|
|
103
|
+
fileStoreSources,
|
|
104
|
+
this.txCollectionSink,
|
|
105
|
+
{
|
|
106
|
+
workerCount: config.txCollectionFileStoreFastWorkerCount,
|
|
107
|
+
backoffBaseMs: config.txCollectionFileStoreFastBackoffBaseMs,
|
|
108
|
+
backoffMaxMs: config.txCollectionFileStoreFastBackoffMaxMs,
|
|
109
|
+
},
|
|
110
|
+
this.dateProvider,
|
|
111
|
+
this.log,
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
this.handleTxsFound = (args: Parameters<TxPoolV2Events['txs-added']>[0]) => {
|
|
115
|
+
this.foundTxs(args.txs);
|
|
116
|
+
};
|
|
117
|
+
this.txCollectionSink.on('txs-added', this.handleTxsFound);
|
|
118
|
+
|
|
119
|
+
this.handleTxsAddedToPool = (args: Parameters<TxPoolV2Events['txs-added']>[0]) => {
|
|
120
|
+
const { txs, source } = args;
|
|
121
|
+
if (source !== 'tx-collection') {
|
|
122
|
+
this.foundTxs(txs);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
this.txPool.on('txs-added', this.handleTxsAddedToPool);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Stops all activity. Cancels in-flight requests; file store workers self-terminate. */
|
|
129
|
+
public stop() {
|
|
130
|
+
this.requests.forEach(request => {
|
|
131
|
+
request.requestTracker.cancel();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
this.txPool.removeListener('txs-added', this.handleTxsAddedToPool);
|
|
135
|
+
this.txCollectionSink.removeListener('txs-added', this.handleTxsFound);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Returns L1 rollup constants. */
|
|
139
|
+
public getConstants(): L1RollupConstants {
|
|
140
|
+
return this.constants;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Collects the set of txs for the given mined block as fast as possible */
|
|
144
|
+
public collectFastForBlock(
|
|
145
|
+
block: L2Block,
|
|
146
|
+
txHashes: TxHash[] | string[],
|
|
147
|
+
opts: { deadline: Date; pinnedPeer?: PeerId },
|
|
148
|
+
) {
|
|
149
|
+
return this.collectFastFor({ type: 'block', block }, txHashes, opts);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Collects the set of txs for the given proposal or block as fast as possible */
|
|
153
|
+
public async collectFastFor(
|
|
154
|
+
input: FastCollectionRequestInput,
|
|
155
|
+
txHashes: TxHash[] | string[],
|
|
156
|
+
opts: { deadline: Date; pinnedPeer?: PeerId },
|
|
157
|
+
) {
|
|
158
|
+
const timeout = opts.deadline.getTime() - this.dateProvider.now();
|
|
159
|
+
if (timeout <= 0) {
|
|
160
|
+
this.log.warn(`Deadline for fast tx collection is in the past (${timeout}ms)`, {
|
|
161
|
+
deadline: opts.deadline.getTime(),
|
|
162
|
+
now: this.dateProvider.now(),
|
|
163
|
+
});
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const hashes = txHashes.map(h => (typeof h === 'string' ? TxHash.fromString(h) : h));
|
|
168
|
+
|
|
169
|
+
const blockInfo: L2BlockInfo =
|
|
170
|
+
input.type === 'proposal'
|
|
171
|
+
? { ...input.blockProposal.toBlockInfo(), blockNumber: input.blockNumber }
|
|
172
|
+
: { ...input.block.toBlockInfo() };
|
|
173
|
+
|
|
174
|
+
const request: FastCollectionRequest = {
|
|
175
|
+
...input,
|
|
176
|
+
blockInfo,
|
|
177
|
+
requestTracker: RequestTracker.create(hashes, opts.deadline, this.dateProvider),
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
const [duration] = await elapsed(() => this.collectFast(request, { pinnedPeer: opts.pinnedPeer }));
|
|
181
|
+
|
|
182
|
+
this.log.verbose(
|
|
183
|
+
`Collected ${request.requestTracker.collectedTxs.length} txs out of ${hashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`,
|
|
184
|
+
{
|
|
185
|
+
...blockInfo,
|
|
186
|
+
duration,
|
|
187
|
+
requestType: input.type,
|
|
188
|
+
missingTxs: [...request.requestTracker.missingTxHashes],
|
|
189
|
+
},
|
|
190
|
+
);
|
|
191
|
+
return request.requestTracker.collectedTxs;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
protected async collectFast(request: FastCollectionRequest, opts: { pinnedPeer?: PeerId }) {
|
|
195
|
+
this.requests.add(request);
|
|
196
|
+
const { blockInfo } = request;
|
|
197
|
+
|
|
198
|
+
this.log.debug(
|
|
199
|
+
`Starting fast collection of ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
|
|
200
|
+
{ ...blockInfo, requestType: request.type, deadline: request.requestTracker.deadline },
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
try {
|
|
204
|
+
// 1. Start node collection in the background.
|
|
205
|
+
// Note: this will be a noop if no nodes are configured.
|
|
206
|
+
const nodeCollectionPromise = this.collectFastFromNodes(request);
|
|
207
|
+
|
|
208
|
+
// 2. Wait before starting reqresp, interruptible by cancellation or node exhaustion.
|
|
209
|
+
await Promise.race([
|
|
210
|
+
request.requestTracker.cancellationToken,
|
|
211
|
+
sleep(this.config.txCollectionFastNodesTimeoutBeforeReqRespMs),
|
|
212
|
+
nodeCollectionPromise, // If node collection has finished (or if there are no nodes configured), we can exit early.
|
|
213
|
+
]);
|
|
214
|
+
|
|
215
|
+
// 3. Start reqresp in the background (runs in parallel with node collection).
|
|
216
|
+
// Note: this will be a noop if all TXs were already found.
|
|
217
|
+
const reqRespPromise = this.collectFastViaReqResp(request, opts);
|
|
218
|
+
|
|
219
|
+
// 4. Wait before starting file store, interruptible by cancellation.
|
|
220
|
+
await Promise.race([
|
|
221
|
+
request.requestTracker.cancellationToken,
|
|
222
|
+
sleep(this.config.txCollectionFileStoreFastDelayMs),
|
|
223
|
+
reqRespPromise, // If reqresp has finished, we can exit early.
|
|
224
|
+
]);
|
|
225
|
+
|
|
226
|
+
// 5. Start file store collection in the background. Self-terminates on tracker cancel / all-found.
|
|
227
|
+
// Note: this will be a noop if all TXs were already found.
|
|
228
|
+
const fileStorePromise = this.fileStoreFastCollection.startCollecting(
|
|
229
|
+
request.requestTracker,
|
|
230
|
+
this.getAddContext(request),
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
// 6. Wait for all paths to settle.
|
|
234
|
+
// NOTE: The request will automatically be cancelled after `opt.deadline` is reached.
|
|
235
|
+
await Promise.allSettled([reqRespPromise, nodeCollectionPromise, fileStorePromise]);
|
|
236
|
+
} catch (err) {
|
|
237
|
+
this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, {
|
|
238
|
+
...blockInfo,
|
|
239
|
+
missingTxs: request.requestTracker.missingTxHashes.values().map(txHash => txHash.toString()),
|
|
240
|
+
});
|
|
241
|
+
} finally {
|
|
242
|
+
request.requestTracker.cancel();
|
|
243
|
+
this.requests.delete(request);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Starts collecting txs from all configured nodes. We send `txCollectionFastMaxParallelRequestsPerNode` requests
|
|
249
|
+
* in parallel to each node. We keep track of the number of attempts made to collect each tx, so we can prioritize
|
|
250
|
+
* the txs that have been requested less often whenever we need to send a new batch of requests. We ensure that no
|
|
251
|
+
* tx is requested more than once at the same time to the same node.
|
|
252
|
+
*/
|
|
253
|
+
private async collectFastFromNodes(request: FastCollectionRequest): Promise<void> {
|
|
254
|
+
if (this.nodes.length === 0) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Keep a shared priority queue of all txs pending to be requested, sorted by the number of attempts made to collect them.
|
|
259
|
+
const attemptsPerTx = [...request.requestTracker.missingTxHashes].map(txHash => ({
|
|
260
|
+
txHash,
|
|
261
|
+
attempts: 0,
|
|
262
|
+
found: false,
|
|
263
|
+
}));
|
|
264
|
+
|
|
265
|
+
// Returns once we have finished all node loops. Each loop finishes when the deadline is hit, or all txs have been collected.
|
|
266
|
+
await Promise.allSettled(this.nodes.map(node => this.collectFastFromNode(request, node, attemptsPerTx)));
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
private async collectFastFromNode(
|
|
270
|
+
request: FastCollectionRequest,
|
|
271
|
+
node: TxSource,
|
|
272
|
+
attemptsPerTx: { txHash: string; attempts: number; found: boolean }[],
|
|
273
|
+
) {
|
|
274
|
+
const notFinished = () => !request.requestTracker.checkCancelled();
|
|
275
|
+
|
|
276
|
+
const maxParallelRequests = this.config.txCollectionFastMaxParallelRequestsPerNode;
|
|
277
|
+
const maxBatchSize = this.config.txCollectionNodeRpcMaxBatchSize;
|
|
278
|
+
const activeRequestsToThisNode = new Set<string>(); // Track the txs being actively requested to this node
|
|
279
|
+
|
|
280
|
+
const processBatch = async () => {
|
|
281
|
+
while (notFinished()) {
|
|
282
|
+
// Pull tx hashes from the attemptsPerTx array, which is sorted by attempts,
|
|
283
|
+
// so we prioritize txs that have been requested less often.
|
|
284
|
+
const batch = [];
|
|
285
|
+
let index = 0;
|
|
286
|
+
while (batch.length < maxBatchSize) {
|
|
287
|
+
const txToRequest = attemptsPerTx[index++];
|
|
288
|
+
if (!txToRequest) {
|
|
289
|
+
// No more txs to process
|
|
290
|
+
break;
|
|
291
|
+
} else if (!request.requestTracker.isMissing(txToRequest.txHash)) {
|
|
292
|
+
// Mark as found if it was found somewhere else, we'll then remove it from the array.
|
|
293
|
+
// We don't delete it now since 'array.splice' is pretty expensive, so we do it after sorting.
|
|
294
|
+
txToRequest.found = true;
|
|
295
|
+
} else if (!activeRequestsToThisNode.has(txToRequest.txHash)) {
|
|
296
|
+
// If the tx is not already being requested to this node, add it to the current batch and increase attempts.
|
|
297
|
+
// Note that we increase the attempts *before* making the request, so the next `collectFastFromNode` that
|
|
298
|
+
// needs to grab txs to send, will pick txs that have been requested less often, instead of all requesting
|
|
299
|
+
// the same txs at the same time.
|
|
300
|
+
batch.push(txToRequest);
|
|
301
|
+
activeRequestsToThisNode.add(txToRequest.txHash);
|
|
302
|
+
txToRequest.attempts++;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// After modifying the array by removing txs or updating attempts, re-sort it and trim the found txs from the end.
|
|
307
|
+
attemptsPerTx.sort((a, b) =>
|
|
308
|
+
a.found === b.found ? a.attempts - b.attempts : Number(a.found) - Number(b.found),
|
|
309
|
+
);
|
|
310
|
+
const firstFoundTxIndex = attemptsPerTx.findIndex(tx => tx.found);
|
|
311
|
+
if (firstFoundTxIndex !== -1) {
|
|
312
|
+
attemptsPerTx.length = firstFoundTxIndex;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// If we see no more txs to request, we can stop this "process" loop
|
|
316
|
+
if (batch.length === 0) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const txHashes = batch.map(({ txHash }) => txHash);
|
|
321
|
+
// Collect this batch from the node
|
|
322
|
+
await this.txCollectionSink.collect(
|
|
323
|
+
async () => {
|
|
324
|
+
const result = await node.getTxsByHash(txHashes.map(TxHash.fromString));
|
|
325
|
+
for (const tx of result.validTxs) {
|
|
326
|
+
request.requestTracker.markFetched(tx);
|
|
327
|
+
}
|
|
328
|
+
return result;
|
|
329
|
+
},
|
|
330
|
+
txHashes,
|
|
331
|
+
{
|
|
332
|
+
description: `fast ${node.getInfo()}`,
|
|
333
|
+
node: node.getInfo(),
|
|
334
|
+
method: 'fast-node-rpc',
|
|
335
|
+
...request.blockInfo,
|
|
336
|
+
},
|
|
337
|
+
this.getAddContext(request),
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
// Clear from the active requests the txs we just requested
|
|
341
|
+
for (const requestedTx of batch) {
|
|
342
|
+
activeRequestsToThisNode.delete(requestedTx.txHash);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// Sleep a bit until hitting the node again, but wake up immediately on cancellation
|
|
346
|
+
if (notFinished()) {
|
|
347
|
+
await Promise.race([
|
|
348
|
+
sleep(this.config.txCollectionFastNodeIntervalMs),
|
|
349
|
+
request.requestTracker.cancellationToken,
|
|
350
|
+
]);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
// Kick off N parallel requests to the node, up to the maxParallelRequests limit
|
|
356
|
+
await Promise.all(times(maxParallelRequests, processBatch));
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
private async collectFastViaReqResp(request: FastCollectionRequest, opts: { pinnedPeer?: PeerId }) {
|
|
360
|
+
const pinnedPeer = opts.pinnedPeer;
|
|
361
|
+
const blockInfo = request.blockInfo;
|
|
362
|
+
const slotNumber = blockInfo.slotNumber;
|
|
363
|
+
if (request.requestTracker.timeoutMs < 100) {
|
|
364
|
+
this.log.warn(
|
|
365
|
+
`Not initiating fast reqresp for txs for ${request.type} at slot ${blockInfo.slotNumber} due to timeout`,
|
|
366
|
+
{ timeoutMs: request.requestTracker.timeoutMs, ...blockInfo },
|
|
367
|
+
);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
if (request.requestTracker.checkCancelled()) {
|
|
372
|
+
this.log.debug(`No txs to collect via reqresp for ${request.type} at slot ${blockInfo.slotNumber}`, {
|
|
373
|
+
...blockInfo,
|
|
374
|
+
});
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
this.log.debug(
|
|
379
|
+
`Starting fast reqresp for ${request.requestTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`,
|
|
380
|
+
{ ...blockInfo, timeoutMs: request.requestTracker.timeoutMs, pinnedPeer },
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
try {
|
|
384
|
+
await this.txCollectionSink.collect(
|
|
385
|
+
async () => {
|
|
386
|
+
let blockTxsSource: BlockTxsSource;
|
|
387
|
+
if (request.type === 'proposal') {
|
|
388
|
+
blockTxsSource = request.blockProposal;
|
|
389
|
+
} else if (request.type === 'block') {
|
|
390
|
+
blockTxsSource = {
|
|
391
|
+
txHashes: request.block.body.txEffects.map(e => e.txHash),
|
|
392
|
+
archive: request.block.archive.root,
|
|
393
|
+
};
|
|
394
|
+
} else {
|
|
395
|
+
throw new Error(`Unknown request type: ${(request as { type: string }).type}`);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
const result = await this.reqRespTxsCollector!(request.requestTracker, blockTxsSource, pinnedPeer);
|
|
399
|
+
return { validTxs: result, invalidTxHashes: [] };
|
|
400
|
+
},
|
|
401
|
+
Array.from(request.requestTracker.missingTxHashes),
|
|
402
|
+
{ description: `reqresp for slot ${slotNumber}`, method: 'fast-req-resp', ...opts, ...request.blockInfo },
|
|
403
|
+
this.getAddContext(request),
|
|
404
|
+
);
|
|
405
|
+
} catch (err) {
|
|
406
|
+
this.log.error(`Error sending fast reqresp request for txs`, err, {
|
|
407
|
+
txs: [...request.requestTracker.missingTxHashes],
|
|
408
|
+
...blockInfo,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/** Returns the TxAddContext for the given request, used by the sink to add txs to the pool correctly. */
|
|
414
|
+
private getAddContext(request: FastCollectionRequest): TxAddContext {
|
|
415
|
+
if (request.type === 'proposal') {
|
|
416
|
+
return { type: 'proposal', blockHeader: request.blockProposal.blockHeader };
|
|
417
|
+
} else {
|
|
418
|
+
return { type: 'mined', block: request.block };
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/** Mark the given txs as found. Stops collecting them across all in-flight requests. */
|
|
423
|
+
private foundTxs(txs: Tx[]) {
|
|
424
|
+
for (const request of this.requests) {
|
|
425
|
+
for (const tx of txs) {
|
|
426
|
+
if (request.requestTracker.markFetched(tx)) {
|
|
427
|
+
this.log.trace(`Found tx ${tx.txHash.toString()} for fast collection request`, {
|
|
428
|
+
...request.blockInfo,
|
|
429
|
+
txHash: tx.txHash.toString(),
|
|
430
|
+
type: request.type,
|
|
431
|
+
});
|
|
432
|
+
if (request.requestTracker.allFetched()) {
|
|
433
|
+
this.log.trace(`All txs found for fast collection request`, {
|
|
434
|
+
...request.blockInfo,
|
|
435
|
+
type: request.type,
|
|
436
|
+
});
|
|
437
|
+
break;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Stop collecting all txs for blocks less than or equal to the block number specified.
|
|
446
|
+
* To be called when we no longer care about gathering txs up to a certain block, eg when they become proven or finalized.
|
|
447
|
+
*/
|
|
448
|
+
public stopCollectingForBlocksUpTo(blockNumber: BlockNumber): void {
|
|
449
|
+
for (const request of this.requests) {
|
|
450
|
+
if (request.blockInfo.blockNumber <= blockNumber) {
|
|
451
|
+
request.requestTracker.cancel();
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* Stop collecting all txs for blocks greater than the block number specified.
|
|
458
|
+
* To be called when there is a chain prune and previously mined txs are no longer relevant.
|
|
459
|
+
*/
|
|
460
|
+
public stopCollectingForBlocksAfter(blockNumber: BlockNumber): void {
|
|
461
|
+
for (const request of this.requests) {
|
|
462
|
+
if (request.blockInfo.blockNumber > blockNumber) {
|
|
463
|
+
request.requestTracker.cancel();
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|