@aztec/p2p 0.0.1-commit.86469d5 → 0.0.1-commit.8655d4a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +9 -1
- package/dest/client/factory.d.ts +13 -12
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +61 -17
- package/dest/client/interface.d.ts +58 -36
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +52 -58
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +228 -235
- package/dest/config.d.ts +162 -89
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +153 -42
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +162 -106
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +511 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +507 -125
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts +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 +3 -3
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/index.js +1 -1
- package/dest/mem_pools/instrumentation.d.ts +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +33 -15
- package/dest/mem_pools/interface.d.ts +5 -5
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +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 +97 -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 +62 -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 → tx_pool_v2}/eviction/invalid_txs_after_mining_rule.js +16 -35
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +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 +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 +218 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -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 +108 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -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 +167 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -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 +914 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +8 -4
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +61 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -4
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +10 -4
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +21 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +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/block_header_validator.d.ts +16 -3
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- package/dest/msg_validators/tx_validator/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/double_spend_validator.d.ts +13 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
- package/dest/msg_validators/tx_validator/factory.d.ts +135 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +252 -61
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +99 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
- package/dest/msg_validators/tx_validator/index.d.ts +5 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +4 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +5 -5
- package/dest/services/discv5/discV5_service.d.ts +2 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +35 -8
- package/dest/services/dummy_service.d.ts +22 -18
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +22 -20
- package/dest/services/encoding.d.ts +7 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +18 -11
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +363 -0
- package/dest/services/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/instrumentation.d.ts +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 +102 -60
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +665 -530
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +40 -11
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +57 -12
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +14 -10
- 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 +104 -118
- 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 +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/interface.d.ts +25 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +23 -19
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +18 -11
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +21 -10
- 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 +27 -11
- 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 +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +21 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +53 -218
- package/dest/services/service.d.ts +46 -13
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +11 -14
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +26 -33
- 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 +3 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -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 +45 -51
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +296 -68
- package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +28 -31
- 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 +26 -7
- 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 +6 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +12 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -3
- package/dest/test-helpers/mock-pubsub.d.ts +46 -6
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +115 -14
- 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 +19 -20
- 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 +53 -50
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +171 -75
- 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 +94 -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 +15 -14
- package/src/bootstrap/bootstrap.ts +9 -1
- package/src/client/factory.ts +130 -30
- package/src/client/interface.ts +70 -44
- package/src/client/p2p_client.ts +273 -299
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +267 -46
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +575 -94
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +617 -141
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +14 -8
- package/src/mem_pools/index.ts +2 -2
- package/src/mem_pools/instrumentation.ts +22 -14
- package/src/mem_pools/interface.ts +4 -4
- 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 +120 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -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 +65 -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 +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +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 +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +250 -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 +430 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1090 -0
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +16 -9
- package/src/msg_validators/clock_tolerance.ts +79 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
- package/src/msg_validators/tx_validator/README.md +127 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
- 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/block_header_validator.ts +15 -3
- 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/double_spend_validator.ts +11 -6
- package/src/msg_validators/tx_validator/factory.ts +407 -80
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
- package/src/msg_validators/tx_validator/index.ts +4 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +38 -5
- package/src/services/dummy_service.ts +32 -45
- package/src/services/encoding.ts +18 -10
- package/src/services/gossipsub/README.md +641 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +519 -0
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +716 -586
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +46 -11
- package/src/services/peer-manager/peer_scoring.ts +52 -5
- package/src/services/reqresp/README.md +215 -0
- package/src/services/reqresp/batch-tx-requester/README.md +53 -14
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +108 -130
- 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 +2 -2
- package/src/services/reqresp/interface.ts +45 -46
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +25 -14
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +38 -15
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +23 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
- package/src/services/reqresp/reqresp.ts +61 -264
- package/src/services/service.ts +62 -29
- package/src/services/tx_collection/config.ts +40 -49
- 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 +2 -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 +362 -110
- package/src/services/tx_collection/tx_collection_sink.ts +32 -36
- package/src/services/tx_collection/tx_source.ts +28 -8
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +163 -0
- package/src/services/tx_provider.ts +15 -9
- package/src/test-helpers/make-test-p2p-clients.ts +7 -6
- package/src/test-helpers/mock-pubsub.ts +137 -14
- package/src/test-helpers/reqresp-nodes.ts +17 -29
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +177 -96
- package/src/testbench/p2p_client_testbench_worker.ts +100 -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/attestation_pool/kv_attestation_pool.d.ts +0 -40
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
- 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_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -53
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -311
- 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 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -53
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -177
- 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/attestation_pool/kv_attestation_pool.ts +0 -320
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -364
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -114
- package/src/services/tx_collection/slow_tx_collection.ts +0 -233
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
import { chunkWrapAround } from '@aztec/foundation/collection';
|
|
2
|
-
import { TimeoutError } from '@aztec/foundation/error';
|
|
3
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
3
|
import { FifoMemoryQueue, Semaphore } from '@aztec/foundation/queue';
|
|
5
4
|
import { sleep } from '@aztec/foundation/sleep';
|
|
6
|
-
import { DateProvider
|
|
5
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
7
6
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
8
7
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
9
|
-
import { peerIdFromString } from '@libp2p/peer-id';
|
|
10
8
|
import { ReqRespSubProtocol } from '.././interface.js';
|
|
11
9
|
import { BlockTxsRequest, BlockTxsResponse } from '.././protocols/index.js';
|
|
12
10
|
import { ReqRespStatus } from '.././status.js';
|
|
13
11
|
import { DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD, DEFAULT_BATCH_TX_REQUESTER_DUMB_PARALLEL_WORKER_COUNT, DEFAULT_BATCH_TX_REQUESTER_SMART_PARALLEL_WORKER_COUNT, DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE } from './config.js';
|
|
14
|
-
import {
|
|
12
|
+
import { MissingTxMetadataCollection } from './missing_txs.js';
|
|
15
13
|
import { PeerCollection } from './peer_collection.js';
|
|
16
|
-
import {
|
|
14
|
+
import { createBatchRequestTxValidator } from './tx_validator.js';
|
|
17
15
|
/*
|
|
18
16
|
* Tries to fetch all missing transaction until deadline is hit.
|
|
19
17
|
* Transactions are yield by calling run*() method
|
|
@@ -31,83 +29,64 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
31
29
|
* - Bad peer:
|
|
32
30
|
* - Is the peer which was unable to send us successful response N times in a row
|
|
33
31
|
* */ export class BatchTxRequester {
|
|
34
|
-
|
|
32
|
+
requestTracker;
|
|
33
|
+
blockTxsSource;
|
|
35
34
|
pinnedPeer;
|
|
36
|
-
timeoutMs;
|
|
37
35
|
p2pService;
|
|
38
36
|
logger;
|
|
39
|
-
dateProvider;
|
|
40
37
|
opts;
|
|
41
38
|
peers;
|
|
42
39
|
txsMetadata;
|
|
43
|
-
deadline;
|
|
44
40
|
smartRequesterSemaphore;
|
|
45
41
|
txQueue;
|
|
46
42
|
txValidator;
|
|
47
43
|
smartParallelWorkerCount;
|
|
48
44
|
dumbParallelWorkerCount;
|
|
49
45
|
txBatchSize;
|
|
50
|
-
constructor(
|
|
51
|
-
this.
|
|
46
|
+
constructor(requestTracker, blockTxsSource, pinnedPeer, p2pService, logger, dateProvider, opts){
|
|
47
|
+
this.requestTracker = requestTracker;
|
|
48
|
+
this.blockTxsSource = blockTxsSource;
|
|
52
49
|
this.pinnedPeer = pinnedPeer;
|
|
53
|
-
this.timeoutMs = timeoutMs;
|
|
54
50
|
this.p2pService = p2pService;
|
|
55
51
|
this.logger = logger ?? createLogger('p2p:reqresp_batch');
|
|
56
|
-
this.dateProvider = dateProvider ?? new DateProvider();
|
|
57
52
|
this.opts = opts ?? {};
|
|
58
53
|
this.smartParallelWorkerCount = this.opts.smartParallelWorkerCount ?? DEFAULT_BATCH_TX_REQUESTER_SMART_PARALLEL_WORKER_COUNT;
|
|
59
54
|
this.dumbParallelWorkerCount = this.opts.dumbParallelWorkerCount ?? DEFAULT_BATCH_TX_REQUESTER_DUMB_PARALLEL_WORKER_COUNT;
|
|
60
55
|
this.txBatchSize = this.opts.txBatchSize ?? DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE;
|
|
61
|
-
this.deadline = this.dateProvider.now() + this.timeoutMs;
|
|
62
56
|
this.txQueue = new FifoMemoryQueue(this.logger);
|
|
63
|
-
this.txValidator = this.opts.txValidator ??
|
|
57
|
+
this.txValidator = this.opts.txValidator ?? createBatchRequestTxValidator(this.p2pService.txValidatorConfig);
|
|
64
58
|
if (this.opts.peerCollection) {
|
|
65
59
|
this.peers = this.opts.peerCollection;
|
|
66
60
|
} else {
|
|
67
|
-
const initialPeers = this.p2pService.connectionSampler.getPeerListSortedByConnectionCountAsc();
|
|
68
61
|
const badPeerThreshold = this.opts.badPeerThreshold ?? DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD;
|
|
69
|
-
this.peers = new PeerCollection(
|
|
62
|
+
this.peers = new PeerCollection(this.p2pService.connectionSampler, this.pinnedPeer, dateProvider ?? new DateProvider(), badPeerThreshold, this.p2pService.peerScoring);
|
|
70
63
|
}
|
|
71
|
-
|
|
72
|
-
h.toString(),
|
|
73
|
-
new MissingTxMetadata(h)
|
|
74
|
-
]);
|
|
75
|
-
this.txsMetadata = new MissingTxMetadataCollection(entries, this.txBatchSize);
|
|
64
|
+
this.txsMetadata = new MissingTxMetadataCollection(requestTracker, this.txBatchSize);
|
|
76
65
|
this.smartRequesterSemaphore = this.opts.semaphore ?? new Semaphore(0);
|
|
77
66
|
}
|
|
78
67
|
/*
|
|
79
|
-
* Fetches all missing transactions and yields them
|
|
68
|
+
* Fetches all missing transactions and yields them one by one
|
|
80
69
|
* */ async *run() {
|
|
81
|
-
// Our timeout is represented in milliseconds but queue expects seconds
|
|
82
|
-
// We also want to make sure we wait at least 1 second in case of very low timeouts
|
|
83
|
-
const timeoutQueueAfter = Math.max(Math.ceil(this.timeoutMs / 1_000), 1);
|
|
84
70
|
try {
|
|
85
71
|
if (this.txsMetadata.getMissingTxHashes().size === 0) {
|
|
86
72
|
return undefined;
|
|
87
73
|
}
|
|
88
|
-
// Start workers in background
|
|
89
|
-
const workersPromise =
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
74
|
+
// Start workers in background. Workers stop themselves via requestTracker.checkCancelled().
|
|
75
|
+
const workersPromise = Promise.allSettled([
|
|
76
|
+
this.smartRequester(),
|
|
77
|
+
this.dumbRequester(),
|
|
78
|
+
this.pinnedPeerRequester()
|
|
79
|
+
]).finally(()=>{
|
|
94
80
|
this.txQueue.end();
|
|
95
81
|
});
|
|
82
|
+
// Yield txs as workers put them on the queue. The queue's end() drains remaining items
|
|
83
|
+
// before returning null, so we don't lose any txs.
|
|
96
84
|
while(true){
|
|
97
|
-
const tx = await this.txQueue.get(
|
|
98
|
-
// null indicates that the queue has ended
|
|
85
|
+
const tx = await this.txQueue.get();
|
|
99
86
|
if (tx === null) {
|
|
100
87
|
break;
|
|
101
88
|
}
|
|
102
89
|
yield tx;
|
|
103
|
-
if (this.shouldStop()) {
|
|
104
|
-
// Drain queue before ending
|
|
105
|
-
let remaining;
|
|
106
|
-
while((remaining = this.txQueue.getImmediate()) !== undefined){
|
|
107
|
-
yield remaining;
|
|
108
|
-
}
|
|
109
|
-
break;
|
|
110
|
-
}
|
|
111
90
|
}
|
|
112
91
|
this.unlockSmartRequesterSemaphores();
|
|
113
92
|
await workersPromise;
|
|
@@ -164,7 +143,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
164
143
|
this.logger.debug(`Pinned peer ${this.pinnedPeer.toString()} has no txs to request`);
|
|
165
144
|
return;
|
|
166
145
|
}
|
|
167
|
-
const request = BlockTxsRequest.
|
|
146
|
+
const request = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
|
|
168
147
|
if (!request) {
|
|
169
148
|
return;
|
|
170
149
|
}
|
|
@@ -181,7 +160,6 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
181
160
|
/*
|
|
182
161
|
* Starts dumb worker loops
|
|
183
162
|
* */ async dumbRequester() {
|
|
184
|
-
const nextPeerIndex = this.makeRoundRobinIndexer();
|
|
185
163
|
const nextBatchIndex = this.makeRoundRobinIndexer();
|
|
186
164
|
// Chunk missing tx hashes into batches of txBatchSize, wrapping around to ensure no peer gets less than txBatchSize
|
|
187
165
|
const txChunks = ()=>{
|
|
@@ -199,7 +177,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
199
177
|
// If peer is dumb peer, we don't know yet if they received full blockProposal
|
|
200
178
|
// there is solid chance that peer didn't receive proposal yet, thus we must send full hashes
|
|
201
179
|
const includeFullHashesInRequestNotJustIndices = true;
|
|
202
|
-
const blockRequest = BlockTxsRequest.
|
|
180
|
+
const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs, includeFullHashesInRequestNotJustIndices);
|
|
203
181
|
const blockRequestHasNoMissingTxsFromTheProposal = !blockRequest;
|
|
204
182
|
if (blockRequestHasNoMissingTxsFromTheProposal) {
|
|
205
183
|
return undefined;
|
|
@@ -209,15 +187,10 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
209
187
|
txs
|
|
210
188
|
};
|
|
211
189
|
};
|
|
212
|
-
const
|
|
213
|
-
const peers = this.peers.getDumbPeersToQuery();
|
|
214
|
-
const idx = nextPeerIndex(()=>peers.length);
|
|
215
|
-
return idx === undefined ? undefined : peerIdFromString(peers[idx]);
|
|
216
|
-
};
|
|
217
|
-
const workerCount = Math.min(this.dumbParallelWorkerCount, this.peers.getAllPeers().size);
|
|
190
|
+
const workerCount = this.dumbParallelWorkerCount;
|
|
218
191
|
const workers = Array.from({
|
|
219
192
|
length: workerCount
|
|
220
|
-
}, (_, index)=>this.dumbWorkerLoop(
|
|
193
|
+
}, (_, index)=>this.dumbWorkerLoop(this.peers.nextDumbPeerToQuery.bind(this.peers), makeRequest, index + 1));
|
|
221
194
|
await Promise.allSettled(workers);
|
|
222
195
|
}
|
|
223
196
|
/*
|
|
@@ -261,15 +234,9 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
261
234
|
/*
|
|
262
235
|
* Starts smart worker loops
|
|
263
236
|
* */ async smartRequester() {
|
|
264
|
-
const nextPeerIndex = this.makeRoundRobinIndexer();
|
|
265
|
-
const nextPeer = ()=>{
|
|
266
|
-
const peers = this.peers.getSmartPeersToQuery();
|
|
267
|
-
const idx = nextPeerIndex(()=>peers.length);
|
|
268
|
-
return idx === undefined ? undefined : peerIdFromString(peers[idx]);
|
|
269
|
-
};
|
|
270
237
|
const makeRequest = (pid)=>{
|
|
271
238
|
const txs = this.txsMetadata.getTxsToRequestFromThePeer(pid);
|
|
272
|
-
const blockRequest = BlockTxsRequest.
|
|
239
|
+
const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
|
|
273
240
|
if (!blockRequest) {
|
|
274
241
|
return undefined;
|
|
275
242
|
}
|
|
@@ -279,8 +246,8 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
279
246
|
};
|
|
280
247
|
};
|
|
281
248
|
const workers = Array.from({
|
|
282
|
-
length:
|
|
283
|
-
}, (_, index)=>this.smartWorkerLoop(
|
|
249
|
+
length: this.smartParallelWorkerCount
|
|
250
|
+
}, (_, index)=>this.smartWorkerLoop(this.peers.nextSmartPeerToQuery.bind(this.peers), makeRequest, index + 1));
|
|
284
251
|
await Promise.allSettled(workers);
|
|
285
252
|
}
|
|
286
253
|
/*
|
|
@@ -298,35 +265,40 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
298
265
|
* */ async smartWorkerLoop(pickNextPeer, request, workerIndex) {
|
|
299
266
|
try {
|
|
300
267
|
this.logger.trace(`Smart worker ${workerIndex} started`);
|
|
301
|
-
await
|
|
268
|
+
await Promise.race([
|
|
269
|
+
this.smartRequesterSemaphore.acquire(),
|
|
270
|
+
this.requestTracker.cancellationToken
|
|
271
|
+
]);
|
|
272
|
+
if (this.requestTracker.checkCancelled()) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
302
275
|
this.logger.trace(`Smart worker ${workerIndex} acquired semaphore`);
|
|
303
276
|
while(!this.shouldStop()){
|
|
304
277
|
const peerId = pickNextPeer();
|
|
305
278
|
const weRanOutOfPeersToQuery = peerId === undefined;
|
|
306
279
|
if (weRanOutOfPeersToQuery) {
|
|
307
280
|
this.logger.debug(`Worker loop smart: No more peers to query`);
|
|
308
|
-
// If
|
|
309
|
-
|
|
310
|
-
const
|
|
311
|
-
if (
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
const thereAreSomeRateLimitedSmartPeers = nextSmartPeerDelay !== undefined;
|
|
315
|
-
if (thereAreSomeRateLimitedSmartPeers) {
|
|
316
|
-
await this.sleepClampedToDeadline(nextSmartPeerDelay);
|
|
317
|
-
continue;
|
|
318
|
-
}
|
|
319
|
-
this.logger.debug(`Worker loop smart: No more smart peers to query killing ${workerIndex}`);
|
|
320
|
-
break;
|
|
281
|
+
// If we have rate limited peers wait for them.
|
|
282
|
+
const nextSmartPeerDelay = this.peers.getNextSmartPeerAvailabilityDelayMs();
|
|
283
|
+
const thereAreSomeRateLimitedSmartPeers = nextSmartPeerDelay !== undefined;
|
|
284
|
+
if (thereAreSomeRateLimitedSmartPeers) {
|
|
285
|
+
await this.sleepClampedToDeadline(nextSmartPeerDelay);
|
|
286
|
+
continue;
|
|
321
287
|
}
|
|
322
|
-
// Otherwise there are still some dumb peers that could become smart.
|
|
323
288
|
// We end up here when all known smart peers became temporarily unavailable via combination of
|
|
324
289
|
// (bad, in-flight, or rate-limited) or in some weird scenario all current smart peers turn bad which is permanent
|
|
325
|
-
// but dumb peers
|
|
290
|
+
// but there are dumb peers that could be promoted
|
|
291
|
+
// or new peer can join as dumb and be promoted later
|
|
326
292
|
//
|
|
327
293
|
// When a dumb peer responds with valid txIndices, it gets
|
|
328
294
|
// promoted to smart and releases the semaphore, waking this worker.
|
|
329
|
-
await
|
|
295
|
+
await Promise.race([
|
|
296
|
+
this.smartRequesterSemaphore.acquire(),
|
|
297
|
+
this.requestTracker.cancellationToken
|
|
298
|
+
]);
|
|
299
|
+
if (this.requestTracker.checkCancelled()) {
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
330
302
|
this.logger.debug(`Worker loop smart: acquired next smart peer`);
|
|
331
303
|
continue;
|
|
332
304
|
}
|
|
@@ -349,11 +321,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
349
321
|
});
|
|
350
322
|
}
|
|
351
323
|
} catch (err) {
|
|
352
|
-
|
|
353
|
-
this.logger.debug(`Smart worker ${workerIndex} timed out waiting for semaphore`);
|
|
354
|
-
} else {
|
|
355
|
-
this.logger.error(`Smart worker ${workerIndex} encountered an error: ${err}`);
|
|
356
|
-
}
|
|
324
|
+
this.logger.error(`Smart worker ${workerIndex} encountered an error: ${err}`);
|
|
357
325
|
} finally{
|
|
358
326
|
this.logger.debug(`Smart worker ${workerIndex} finished`);
|
|
359
327
|
}
|
|
@@ -373,6 +341,13 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
373
341
|
return;
|
|
374
342
|
}
|
|
375
343
|
const blockResponse = BlockTxsResponse.fromBuffer(response.data);
|
|
344
|
+
// Validate response. Peers will be penalised by the validator if they send invalid response.
|
|
345
|
+
const isValid = await this.p2pService.validateRequestedBlockTxsConsistency(request, blockResponse, peerId);
|
|
346
|
+
if (!isValid) {
|
|
347
|
+
this.logger.debug(`Peer ${peerId.toString()} sent invalid response`);
|
|
348
|
+
this.handleFailResponseFromPeer(peerId, ReqRespStatus.INTERNAL_ERROR);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
376
351
|
await this.handleSuccessResponseFromPeer(peerId, blockResponse);
|
|
377
352
|
} catch (err) {
|
|
378
353
|
this.logger.error(`Failed to get valid response from peer ${peerId.toString()}: ${err.message}`, {
|
|
@@ -388,12 +363,22 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
388
363
|
* Handles failed response form the peer
|
|
389
364
|
* There are 3 scenarios
|
|
390
365
|
* - RATE_LIMIT_EXCEEDED: We mark this and don't query this peer again for some_time
|
|
366
|
+
* - INTERNAL_ERROR: We use this to cover cases where the request-response consistency validation fails.
|
|
391
367
|
* - FAILURE and UNKNOWN: We penalise this, if peer has been penalised this way N times they are not queried again
|
|
392
368
|
* this implies we will query these peers couple of more times and give them a chance to "redeem" themselves before completely ignoring them
|
|
393
369
|
*/ handleFailResponseFromPeer(peerId, responseStatus) {
|
|
394
|
-
//TODO: Should we ban these peers?
|
|
395
370
|
if (responseStatus === ReqRespStatus.FAILURE || responseStatus === ReqRespStatus.UNKNOWN) {
|
|
396
371
|
this.peers.penalisePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
372
|
+
this.peers.markPeerDumb(peerId);
|
|
373
|
+
this.txsMetadata.clearPeerData(peerId);
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
// NOT_FOUND means the peer pruned its block proposal — it can no longer serve
|
|
377
|
+
// index-based requests, but this is a legitimate state so we don't penalize.
|
|
378
|
+
// We use INTERNAL_ERROR to cover cases where the request-response consistency validation fails.
|
|
379
|
+
if (responseStatus === ReqRespStatus.NOT_FOUND || responseStatus === ReqRespStatus.INTERNAL_ERROR) {
|
|
380
|
+
this.peers.markPeerDumb(peerId);
|
|
381
|
+
this.txsMetadata.clearPeerData(peerId);
|
|
397
382
|
return;
|
|
398
383
|
}
|
|
399
384
|
if (responseStatus === ReqRespStatus.RATE_LIMIT_EXCEEDED) {
|
|
@@ -413,16 +398,16 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
413
398
|
* Handles received txs.
|
|
414
399
|
* Transactions are validated and then put on async queue
|
|
415
400
|
* to be yielded by main running loop
|
|
416
|
-
|
|
401
|
+
*/ async handleReceivedTxs(peerId, txs) {
|
|
417
402
|
const newTxs = txs.filter((tx)=>!this.txsMetadata.alreadyFetched(tx.txHash));
|
|
418
403
|
if (newTxs.length === 0) {
|
|
419
404
|
return;
|
|
420
405
|
}
|
|
421
|
-
//TODO: this validation can be slow, maybe spawn worker just for validation
|
|
406
|
+
// TODO: this validation can be slow, maybe spawn worker just for validation
|
|
422
407
|
// We could use the async queue for communication.
|
|
423
408
|
const validationResults = await Promise.allSettled(newTxs.map(async (tx)=>({
|
|
424
409
|
tx,
|
|
425
|
-
isValid: (await this.txValidator.
|
|
410
|
+
isValid: (await this.txValidator.validateTx(tx)).result === 'valid'
|
|
426
411
|
})));
|
|
427
412
|
let hasInvalidTx = false;
|
|
428
413
|
validationResults.forEach((result)=>{
|
|
@@ -435,6 +420,9 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
435
420
|
}
|
|
436
421
|
});
|
|
437
422
|
if (hasInvalidTx) {
|
|
423
|
+
this.logger.warn(`Penalizing peer ${peerId.toString()} for sending invalid transactions in batch response`, {
|
|
424
|
+
peerId
|
|
425
|
+
});
|
|
438
426
|
this.peers.penalisePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
439
427
|
} else {
|
|
440
428
|
// If we have received successful response from the peer, they have "redeemed" themselves and not considered bad anymore
|
|
@@ -462,10 +450,9 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
462
450
|
if (smartPeersAreDisabled) {
|
|
463
451
|
return;
|
|
464
452
|
}
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
if (!this.isBlockResponseValid(response)) {
|
|
453
|
+
const hasArchiveRootMismatch = this.blockTxsSource.archive.toString() !== response.archiveRoot.toString();
|
|
454
|
+
if (hasArchiveRootMismatch) {
|
|
455
|
+
this.handleArchiveRootMismatch(peerId, response);
|
|
469
456
|
return;
|
|
470
457
|
}
|
|
471
458
|
// We mark peer as "smart" only if they have some txs we are missing
|
|
@@ -477,16 +464,24 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
477
464
|
this.peers.markPeerSmart(peerId);
|
|
478
465
|
this.markTxsPeerHas(peerId, response);
|
|
479
466
|
// Unblock smart workers
|
|
480
|
-
|
|
481
|
-
this.smartRequesterSemaphore.release();
|
|
482
|
-
}
|
|
467
|
+
this.smartRequesterSemaphore.release();
|
|
483
468
|
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
469
|
+
/**
|
|
470
|
+
* Handles an archive root mismatch between local state and peer response.
|
|
471
|
+
*
|
|
472
|
+
* - Response archive is Fr.ZERO (peer pruned proposal, legitimate): marks peer dumb.
|
|
473
|
+
* - Non-zero archive mismatch (malicious response): penalises + marks dumb.
|
|
474
|
+
*/ handleArchiveRootMismatch(peerId, response) {
|
|
475
|
+
if (!response.archiveRoot.isZero()) {
|
|
476
|
+
this.peers.penalisePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
477
|
+
}
|
|
478
|
+
this.peers.markPeerDumb(peerId);
|
|
479
|
+
this.txsMetadata.clearPeerData(peerId);
|
|
488
480
|
}
|
|
489
481
|
peerHasSomeTxsWeAreMissing(_peerId, response) {
|
|
482
|
+
if (response.txIndices.isEmpty()) {
|
|
483
|
+
return false;
|
|
484
|
+
}
|
|
490
485
|
const txsPeerHas = new Set(this.extractHashesPeerHasFromResponse(response).map((h)=>h.toString()));
|
|
491
486
|
return this.txsMetadata.getMissingTxHashes().intersection(txsPeerHas).size > 0;
|
|
492
487
|
}
|
|
@@ -498,7 +493,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
498
493
|
extractHashesPeerHasFromResponse(response) {
|
|
499
494
|
const hashes = [];
|
|
500
495
|
const indicesOfHashesPeerHas = new Set(response.txIndices.getTrueIndices());
|
|
501
|
-
this.
|
|
496
|
+
this.blockTxsSource.txHashes.forEach((hash, idx)=>{
|
|
502
497
|
if (indicesOfHashesPeerHas.has(idx)) {
|
|
503
498
|
hashes.push(hash);
|
|
504
499
|
}
|
|
@@ -527,23 +522,12 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
527
522
|
};
|
|
528
523
|
}
|
|
529
524
|
/*
|
|
530
|
-
*
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
/*
|
|
534
|
-
* Checks if the BatchTxRequester should stop fetching missing txs
|
|
535
|
-
* Conditions for stopping are:
|
|
536
|
-
* - There have been no missing transactions to start with
|
|
537
|
-
* - All transactions have been fetched
|
|
538
|
-
* - The deadline has been hit (no more time to fetch)
|
|
539
|
-
* - This process has been cancelled via abortSignal
|
|
540
|
-
*
|
|
541
|
-
* @returns true if BatchTxRequester should stop, otherwise false*/ shouldStop() {
|
|
542
|
-
const aborted = this.opts.abortSignal?.aborted ?? false;
|
|
543
|
-
if (aborted) {
|
|
525
|
+
* Checks if the BatchTxRequester should stop fetching missing txs.
|
|
526
|
+
* Delegates to requestTracker which covers: deadline hit, all txs fetched, or external cancellation. */ shouldStop() {
|
|
527
|
+
if (this.requestTracker.checkCancelled()) {
|
|
544
528
|
this.unlockSmartRequesterSemaphores();
|
|
545
529
|
}
|
|
546
|
-
return
|
|
530
|
+
return this.requestTracker.checkCancelled();
|
|
547
531
|
}
|
|
548
532
|
/*
|
|
549
533
|
* Helper function which unlocks all smart requester semaphores
|
|
@@ -557,10 +541,12 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
557
541
|
* Sleeps for the given duration, but clamped to the deadline.
|
|
558
542
|
* This ensures we don't sleep past the deadline.
|
|
559
543
|
* */ async sleepClampedToDeadline(durationMs) {
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
if (thereIsTimeRemaining) {
|
|
563
|
-
await sleep(Math.min(durationMs, remaining));
|
|
544
|
+
if (this.requestTracker.checkCancelled()) {
|
|
545
|
+
return;
|
|
564
546
|
}
|
|
547
|
+
await Promise.race([
|
|
548
|
+
sleep(durationMs),
|
|
549
|
+
this.requestTracker.cancellationToken
|
|
550
|
+
]);
|
|
565
551
|
}
|
|
566
552
|
}
|
|
@@ -1,40 +1,41 @@
|
|
|
1
1
|
import type { ISemaphore } from '@aztec/foundation/queue';
|
|
2
2
|
import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
3
|
-
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
3
|
+
import type { Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
|
|
4
4
|
import type { PeerId } from '@libp2p/interface';
|
|
5
5
|
import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
|
|
6
|
+
import type { BlockTxsRequest, BlockTxsResponse } from '../index.js';
|
|
6
7
|
import type { ReqRespInterface } from '../interface.js';
|
|
7
|
-
import type { MissingTxMetadata } from './missing_txs.js';
|
|
8
8
|
import type { IPeerCollection } from './peer_collection.js';
|
|
9
|
-
import type { BatchRequestTxValidatorConfig
|
|
9
|
+
import type { BatchRequestTxValidatorConfig } from './tx_validator.js';
|
|
10
10
|
export interface IPeerPenalizer {
|
|
11
11
|
penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity): void;
|
|
12
12
|
}
|
|
13
13
|
export interface ITxMetadataCollection {
|
|
14
|
-
size: number;
|
|
15
|
-
values(): IterableIterator<MissingTxMetadata>;
|
|
16
14
|
getMissingTxHashes(): Set<string>;
|
|
15
|
+
markFetched(peerId: PeerId, tx: Tx): boolean;
|
|
17
16
|
getTxsToRequestFromThePeer(peer: PeerId): TxHash[];
|
|
18
17
|
markRequested(txHash: TxHash): void;
|
|
19
18
|
markInFlightBySmartPeer(txHash: TxHash): void;
|
|
20
19
|
markNotInFlightBySmartPeer(txHash: TxHash): void;
|
|
21
20
|
alreadyFetched(txHash: TxHash): boolean;
|
|
22
|
-
markFetched(peerId: PeerId, tx: Tx): boolean;
|
|
23
21
|
markPeerHas(peerId: PeerId, txHashes: TxHash[]): void;
|
|
24
|
-
|
|
22
|
+
/** Remove all tx metadata associations for a peer (e.g. on demotion from smart to dumb). */
|
|
23
|
+
clearPeerData(peerId: PeerId): void;
|
|
25
24
|
}
|
|
26
25
|
/**
|
|
27
26
|
* Interface for BatchTxRequester dependencies that can be injected from upstream
|
|
28
27
|
*/
|
|
29
28
|
export interface BatchTxRequesterLibP2PService {
|
|
30
29
|
/** ReqResp interface for sending requests to peers */
|
|
31
|
-
reqResp: Pick<ReqRespInterface, '
|
|
30
|
+
reqResp: Pick<ReqRespInterface, 'sendRequestToPeer'>;
|
|
32
31
|
/** Connection sampler for getting peer lists */
|
|
33
32
|
connectionSampler: Pick<ConnectionSampler, 'getPeerListSortedByConnectionCountAsc'>;
|
|
34
33
|
/** Configuration needed for transaction validation */
|
|
35
34
|
txValidatorConfig: BatchRequestTxValidatorConfig;
|
|
36
35
|
/** Peer scoring for penalizing peers */
|
|
37
36
|
peerScoring: IPeerPenalizer;
|
|
37
|
+
/** Validate the requested block transactions request-response consistency */
|
|
38
|
+
validateRequestedBlockTxsConsistency: (request: BlockTxsRequest, response: BlockTxsResponse, peerId: PeerId) => Promise<boolean>;
|
|
38
39
|
}
|
|
39
40
|
export interface BatchTxRequesterOptions {
|
|
40
41
|
smartParallelWorkerCount?: number;
|
|
@@ -43,8 +44,7 @@ export interface BatchTxRequesterOptions {
|
|
|
43
44
|
badPeerThreshold?: number;
|
|
44
45
|
semaphore?: ISemaphore;
|
|
45
46
|
peerCollection?: IPeerCollection;
|
|
46
|
-
abortSignal?: AbortSignal;
|
|
47
47
|
/** Optional tx validator for testing - if not provided, one is created from p2pService.txValidatorConfig */
|
|
48
|
-
txValidator?:
|
|
48
|
+
txValidator?: TxValidator;
|
|
49
49
|
}
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVoRSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3JGLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFdkUsTUFBTSxXQUFXLGNBQWM7SUFDN0IsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixHQUFHLElBQUksQ0FBQztDQUNoRTtBQUVELE1BQU0sV0FBVyxxQkFBcUI7SUFDcEMsa0JBQWtCLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQzdDLDBCQUEwQixDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDbkQsYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3BDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQzlDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2pELGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUV4QyxXQUFXLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3RELDRGQUE0RjtJQUM1RixhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7Q0FDckM7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyw2QkFBNkI7SUFDNUMsc0RBQXNEO0lBQ3RELE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNyRCxnREFBZ0Q7SUFDaEQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLHVDQUF1QyxDQUFDLENBQUM7SUFDcEYsc0RBQXNEO0lBQ3RELGlCQUFpQixFQUFFLDZCQUE2QixDQUFDO0lBQ2pELHdDQUF3QztJQUN4QyxXQUFXLEVBQUUsY0FBYyxDQUFDO0lBQzVCLDZFQUE2RTtJQUM3RSxvQ0FBb0MsRUFBRSxDQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUN4QixRQUFRLEVBQUUsZ0JBQWdCLEVBQzFCLE1BQU0sRUFBRSxNQUFNLEtBQ1gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQ3ZCO0FBRUQsTUFBTSxXQUFXLHVCQUF1QjtJQUN0Qyx3QkFBd0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNsQyx1QkFBdUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNqQyxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDckIsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFMUIsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDO0lBQ3ZCLGNBQWMsQ0FBQyxFQUFFLGVBQWUsQ0FBQztJQUNqQyw0R0FBNEc7SUFDNUcsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0NBQzNCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAChE;AAED,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAC7C,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACnD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAExC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtD,4FAA4F;IAC5F,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,sDAAsD;IACtD,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IACrD,gDAAgD;IAChD,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,uCAAuC,CAAC,CAAC;IACpF,sDAAsD;IACtD,iBAAiB,EAAE,6BAA6B,CAAC;IACjD,wCAAwC;IACxC,WAAW,EAAE,cAAc,CAAC;IAC5B,6EAA6E;IAC7E,oCAAoC,EAAE,CACpC,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,4GAA4G;IAC5G,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B"}
|
|
@@ -1,30 +1,26 @@
|
|
|
1
1
|
import { type Tx, TxHash } from '@aztec/stdlib/tx';
|
|
2
2
|
import type { PeerId } from '@libp2p/interface';
|
|
3
|
+
import type { IRequestTracker } from '../../tx_collection/request_tracker.js';
|
|
3
4
|
import type { ITxMetadataCollection } from './interface.js';
|
|
4
|
-
|
|
5
|
-
readonly txHash:
|
|
6
|
-
fetched: boolean;
|
|
5
|
+
declare class MissingTxMetadata {
|
|
6
|
+
readonly txHash: string;
|
|
7
7
|
requestedCount: number;
|
|
8
8
|
inFlightCount: number;
|
|
9
9
|
tx: Tx | undefined;
|
|
10
10
|
readonly peers: Set<string>;
|
|
11
|
-
constructor(txHash:
|
|
11
|
+
constructor(txHash: string, requestedCount?: number, inFlightCount?: number, tx?: Tx | undefined, peers?: Set<string>);
|
|
12
12
|
markAsRequested(): void;
|
|
13
13
|
markInFlight(): void;
|
|
14
14
|
markNotInFlight(): void;
|
|
15
15
|
isInFlight(): boolean;
|
|
16
|
-
markAsFetched(peerId: PeerId, tx: Tx): boolean;
|
|
17
|
-
toString(): `0x${string}`;
|
|
18
16
|
}
|
|
19
|
-
export declare class MissingTxMetadataCollection
|
|
17
|
+
export declare class MissingTxMetadataCollection implements ITxMetadataCollection {
|
|
18
|
+
private requestTracker;
|
|
20
19
|
private readonly txBatchSize;
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
private txMetadata;
|
|
21
|
+
constructor(requestTracker: IRequestTracker, txBatchSize?: number);
|
|
23
22
|
getPrioritizingNotInFlightAndLowerRequestCount(txs: string[]): MissingTxMetadata[];
|
|
24
|
-
getFetchedTxHashes(): Set<string>;
|
|
25
23
|
getMissingTxHashes(): Set<string>;
|
|
26
|
-
getInFlightTxHashes(): Set<string>;
|
|
27
|
-
getFetchedTxs(): Tx[];
|
|
28
24
|
getTxsPeerHas(peer: PeerId): Set<string>;
|
|
29
25
|
getTxsToRequestFromThePeer(peer: PeerId): TxHash[];
|
|
30
26
|
markRequested(txHash: TxHash): void;
|
|
@@ -33,5 +29,7 @@ export declare class MissingTxMetadataCollection extends Map<string, MissingTxMe
|
|
|
33
29
|
alreadyFetched(txHash: TxHash): boolean;
|
|
34
30
|
markFetched(peerId: PeerId, tx: Tx): boolean;
|
|
35
31
|
markPeerHas(peerId: PeerId, txHash: TxHash[]): void;
|
|
32
|
+
clearPeerData(peerId: PeerId): void;
|
|
36
33
|
}
|
|
37
|
-
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzc2luZ190eHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9yZXFyZXNwL2JhdGNoLXR4LXJlcXVlc3Rlci9taXNzaW5nX3R4cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFOUUsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RCxjQUFNLGlCQUFpQjthQUVILE1BQU0sRUFBRSxNQUFNO0lBQ3ZCLGNBQWM7SUFDZCxhQUFhO0lBQ2IsRUFBRSxFQUFFLEVBQUUsR0FBRyxTQUFTO2FBQ1QsS0FBSztJQUx2QixZQUNrQixNQUFNLEVBQUUsTUFBTSxFQUN2QixjQUFjLFNBQUksRUFDbEIsYUFBYSxTQUFJLEVBQ2pCLEVBQUUsR0FBRSxFQUFFLEdBQUcsU0FBcUIsRUFDckIsS0FBSyxjQUFvQixFQUN2QztJQUVHLGVBQWUsU0FFckI7SUFFTSxZQUFZLFNBRWxCO0lBRU0sZUFBZSxTQUVyQjtJQUVNLFVBQVUsSUFBSSxPQUFPLENBRTNCO0NBQ0Y7QUFPRCxxQkFBYSwyQkFBNEIsWUFBVyxxQkFBcUI7SUFJckUsT0FBTyxDQUFDLGNBQWM7SUFDdEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXO0lBSjlCLE9BQU8sQ0FBQyxVQUFVLENBQXdDO0lBRTFELFlBQ1UsY0FBYyxFQUFFLGVBQWUsRUFDdEIsV0FBVyxHQUFFLE1BQWlELEVBR2hGO0lBRU0sOENBQThDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLGlCQUFpQixFQUFFLENBZXhGO0lBRU0sa0JBQWtCLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUV2QztJQUVNLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FXOUM7SUFFTSwwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxDQXVCeEQ7SUFFTSxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sUUFFbEM7SUFPTSx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxRQUU1QztJQU1NLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxNQUFNLFFBRS9DO0lBRU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUU3QztJQUVNLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQWNsRDtJQUVNLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFVbEQ7SUFFTSxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sUUFLbEM7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"missing_txs.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/missing_txs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"missing_txs.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/missing_txs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,cAAM,iBAAiB;aAEH,MAAM,EAAE,MAAM;IACvB,cAAc;IACd,aAAa;IACb,EAAE,EAAE,EAAE,GAAG,SAAS;aACT,KAAK;IALvB,YACkB,MAAM,EAAE,MAAM,EACvB,cAAc,SAAI,EAClB,aAAa,SAAI,EACjB,EAAE,GAAE,EAAE,GAAG,SAAqB,EACrB,KAAK,cAAoB,EACvC;IAEG,eAAe,SAErB;IAEM,YAAY,SAElB;IAEM,eAAe,SAErB;IAEM,UAAU,IAAI,OAAO,CAE3B;CACF;AAOD,qBAAa,2BAA4B,YAAW,qBAAqB;IAIrE,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ9B,OAAO,CAAC,UAAU,CAAwC;IAE1D,YACU,cAAc,EAAE,eAAe,EACtB,WAAW,GAAE,MAAiD,EAGhF;IAEM,8CAA8C,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAexF;IAEM,kBAAkB,IAAI,GAAG,CAAC,MAAM,CAAC,CAEvC;IAEM,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAW9C;IAEM,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBxD;IAEM,aAAa,CAAC,MAAM,EAAE,MAAM,QAElC;IAOM,uBAAuB,CAAC,MAAM,EAAE,MAAM,QAE5C;IAMM,0BAA0B,CAAC,MAAM,EAAE,MAAM,QAE/C;IAEM,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE7C;IAEM,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAclD;IAEM,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAUlD;IAEM,aAAa,CAAC,MAAM,EAAE,MAAM,QAKlC;CACF"}
|