@aztec/p2p 0.0.1-commit.c80b6263 → 0.0.1-commit.c949de6bc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/client/factory.d.ts +10 -10
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +40 -14
- package/dest/client/interface.d.ts +46 -33
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +41 -51
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +156 -200
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +8 -9
- package/dest/config.d.ts +30 -8
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +19 -7
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
- 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 +2 -2
- package/dest/mem_pools/index.d.ts +3 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/index.js +1 -1
- package/dest/mem_pools/interface.d.ts +5 -5
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +211 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +119 -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 +193 -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 +354 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +905 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- 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 +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +18 -5
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +2 -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 +114 -6
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +219 -58
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +58 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +73 -36
- package/dest/msg_validators/tx_validator/index.d.ts +2 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +1 -0
- package/dest/msg_validators/tx_validator/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/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/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +10 -6
- package/dest/services/dummy_service.d.ts +13 -5
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +10 -4
- package/dest/services/encoding.d.ts +3 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +11 -10
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +346 -0
- package/dest/services/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/libp2p_service.d.ts +94 -42
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +425 -342
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +25 -2
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +6 -5
- 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 +27 -54
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -6
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +10 -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 +25 -46
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +17 -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 +49 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
- package/dest/services/reqresp/interface.d.ts +10 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +15 -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 +17 -12
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +25 -14
- 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 +40 -24
- package/dest/services/reqresp/protocols/tx.d.ts +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +13 -5
- package/dest/services/service.d.ts +39 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +22 -4
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +49 -3
- package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -5
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +64 -48
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +90 -0
- package/dest/services/tx_collection/index.d.ts +3 -2
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -0
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +2 -1
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +15 -14
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +6 -6
- package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +60 -26
- package/dest/services/tx_collection/tx_collection.d.ts +23 -10
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +75 -3
- package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +26 -29
- package/dest/services/tx_collection/tx_source.d.ts +8 -3
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +19 -2
- package/dest/services/tx_file_store/config.d.ts +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +152 -0
- package/dest/services/tx_provider.d.ts +4 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +9 -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 +1 -2
- package/dest/test-helpers/mock-pubsub.d.ts +30 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +105 -4
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +4 -3
- package/dest/test-helpers/testbench-utils.d.ts +45 -38
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +130 -60
- package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +16 -16
- package/dest/util.d.ts +2 -2
- package/dest/util.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/client/factory.ts +77 -26
- package/src/client/interface.ts +56 -34
- package/src/client/p2p_client.ts +192 -247
- package/src/client/test/tx_proposal_collector/README.md +4 -4
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +21 -12
- package/src/config.ts +42 -11
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +496 -91
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +2 -1
- package/src/mem_pools/index.ts +4 -1
- package/src/mem_pools/interface.ts +4 -4
- package/src/mem_pools/tx_pool/README.md +1 -1
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/README.md +275 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +297 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1083 -0
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +2 -2
- package/src/msg_validators/tx_validator/README.md +115 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +18 -8
- package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
- package/src/msg_validators/tx_validator/factory.ts +353 -77
- package/src/msg_validators/tx_validator/gas_validator.ts +90 -27
- package/src/msg_validators/tx_validator/index.ts +1 -0
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
- package/src/services/data_store.ts +10 -7
- package/src/services/dummy_service.ts +18 -6
- package/src/services/encoding.ts +9 -9
- package/src/services/gossipsub/README.md +641 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +487 -0
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/libp2p_service.ts +450 -365
- package/src/services/peer-manager/peer_scoring.ts +25 -0
- package/src/services/reqresp/batch-tx-requester/README.md +14 -14
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +32 -60
- package/src/services/reqresp/batch-tx-requester/interface.ts +1 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +23 -71
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +63 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
- package/src/services/reqresp/interface.ts +26 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +24 -15
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -24
- package/src/services/reqresp/protocols/tx.ts +22 -0
- package/src/services/reqresp/reqresp.ts +16 -4
- package/src/services/service.ts +51 -2
- package/src/services/tx_collection/config.ts +74 -6
- package/src/services/tx_collection/fast_tx_collection.ts +74 -51
- package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
- package/src/services/tx_collection/file_store_tx_source.ts +117 -0
- package/src/services/tx_collection/index.ts +2 -1
- package/src/services/tx_collection/instrumentation.ts +7 -1
- package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
- package/src/services/tx_collection/proposal_tx_collector.ts +20 -21
- package/src/services/tx_collection/slow_tx_collection.ts +66 -33
- package/src/services/tx_collection/tx_collection.ts +113 -16
- package/src/services/tx_collection/tx_collection_sink.ts +30 -34
- package/src/services/tx_collection/tx_source.ts +22 -3
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +175 -0
- package/src/services/tx_provider.ts +10 -9
- package/src/test-helpers/make-test-p2p-clients.ts +3 -5
- package/src/test-helpers/mock-pubsub.ts +146 -9
- package/src/test-helpers/reqresp-nodes.ts +4 -6
- package/src/test-helpers/testbench-utils.ts +129 -71
- package/src/testbench/p2p_client_testbench_worker.ts +25 -22
- package/src/util.ts +7 -1
- 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/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
|
@@ -14,6 +14,21 @@ import type { PeerId } from '@libp2p/interface';
|
|
|
14
14
|
|
|
15
15
|
import type { P2PConfig } from '../../config.js';
|
|
16
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Application-level peer penalties.
|
|
19
|
+
*
|
|
20
|
+
* These scores are multiplied by appSpecificWeight (10) when contributing to gossipsub score.
|
|
21
|
+
* The values are designed to align with gossipsub thresholds:
|
|
22
|
+
*
|
|
23
|
+
* - LowToleranceError (50): 1 error → app score -50 → gossipsub -500 → gossipThreshold
|
|
24
|
+
* - MidToleranceError (10): 5 errors → app score -50 → gossipsub -500 → gossipThreshold
|
|
25
|
+
* - HighToleranceError (2): 25 errors → app score -50 → gossipsub -500 → gossipThreshold
|
|
26
|
+
*
|
|
27
|
+
* Examples of each severity:
|
|
28
|
+
* - LowToleranceError: Invalid messages, deserialization errors, manipulation attempts
|
|
29
|
+
* - MidToleranceError: Hash mismatches, protocol violations
|
|
30
|
+
* - HighToleranceError: Rate limit exceeded, failed responses, transient errors
|
|
31
|
+
*/
|
|
17
32
|
const DefaultPeerPenalties = {
|
|
18
33
|
[PeerErrorSeverity.LowToleranceError]: 50,
|
|
19
34
|
[PeerErrorSeverity.MidToleranceError]: 10,
|
|
@@ -26,6 +41,16 @@ export enum PeerScoreState {
|
|
|
26
41
|
Healthy,
|
|
27
42
|
}
|
|
28
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Score thresholds for peer states.
|
|
46
|
+
*
|
|
47
|
+
* These values align with gossipsub thresholds when multiplied by appSpecificWeight (10):
|
|
48
|
+
* - MIN_SCORE_BEFORE_DISCONNECT (-50) × 10 = -500 = gossipThreshold
|
|
49
|
+
* - MIN_SCORE_BEFORE_BAN (-100) × 10 = -1000 = publishThreshold
|
|
50
|
+
*
|
|
51
|
+
* This ensures that when a peer is disconnected at the application level,
|
|
52
|
+
* they also stop receiving gossip, and when banned, they cannot publish.
|
|
53
|
+
*/
|
|
29
54
|
// TODO: move into config / constants
|
|
30
55
|
const MIN_SCORE_BEFORE_BAN = -100;
|
|
31
56
|
const MIN_SCORE_BEFORE_DISCONNECT = -50;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# BatchTxRequester
|
|
2
2
|
|
|
3
|
-
The `BatchTxRequester` is a specialized P2P service that aggressively fetches missing transactions from peers when a node
|
|
3
|
+
The `BatchTxRequester` is a specialized P2P service that aggressively fetches missing transactions from peers when a node lacks some of the referenced transactions. It serves two pathways: (1) block proposals, where validators need all transactions to attest, and (2) block proving, where provers need all transactions to generate proofs.
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
|
-
When a validator receives a block proposal, they must
|
|
7
|
+
When a validator receives a block proposal or a prover needs to prove a block, they must have all transactions. If some transactions are missing from the local mempool (e.g., due to gossip delays), the `BatchTxRequester` kicks in to fetch them via direct peer-to-peer requests before the deadline.
|
|
8
8
|
|
|
9
9
|
```
|
|
10
10
|
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
11
|
-
│
|
|
11
|
+
│ Block Proposal or Block Received │
|
|
12
12
|
│ (contains hashes of N transactions) │
|
|
13
13
|
└─────────────────────────────────────────────────────────────────────────────┘
|
|
14
14
|
│
|
|
@@ -71,7 +71,7 @@ The requester classifies peers into three categories to optimize fetching:
|
|
|
71
71
|
### Blind Phase → Smart Phase Transition
|
|
72
72
|
|
|
73
73
|
Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxsResponse` containing:
|
|
74
|
-
1. A matching `
|
|
74
|
+
1. A matching `archiveRoot`
|
|
75
75
|
2. A non-empty `txIndices` BitVector indicating which transactions they have
|
|
76
76
|
3. At least one transaction we're still missing
|
|
77
77
|
|
|
@@ -81,10 +81,10 @@ Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxs
|
|
|
81
81
|
│ ┌────────────────────────────────────────────────────────────────────────┐ │
|
|
82
82
|
│ │ Initial State: All peers are "dumb" (except pinned peer) │ │
|
|
83
83
|
│ │ │ │
|
|
84
|
-
│ │ Request: [
|
|
84
|
+
│ │ Request: [archiveRoot, txHashes (full list), txIndices (BitVector)] │ │
|
|
85
85
|
│ │ └─ Include full hashes because peer may not have proposal │ │
|
|
86
86
|
│ │ │ │
|
|
87
|
-
│ │ Response: [
|
|
87
|
+
│ │ Response: [archiveRoot, txs[], txIndices (what peer has)] │ │
|
|
88
88
|
│ │ └─ Tells us exactly which txs this peer can provide │ │
|
|
89
89
|
│ └────────────────────────────────────────────────────────────────────────┘ │
|
|
90
90
|
└──────────────────────────────────────────────────────────────────────────────┘
|
|
@@ -97,10 +97,10 @@ Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxs
|
|
|
97
97
|
│ ┌────────────────────────────────────────────────────────────────────────┐ │
|
|
98
98
|
│ │ Peer promoted to "smart" - we know exactly what they have │ │
|
|
99
99
|
│ │ │ │
|
|
100
|
-
│ │ Request: [
|
|
100
|
+
│ │ Request: [archiveRoot, txIndices (BitVector only)] │ │
|
|
101
101
|
│ │ └─ No need for full hashes, peer has the proposal │ │
|
|
102
102
|
│ │ │ │
|
|
103
|
-
│ │ Response: [
|
|
103
|
+
│ │ Response: [archiveRoot, txs[], txIndices (updated availability)] │ │
|
|
104
104
|
│ │ └─ May have received more txs since last response │ │
|
|
105
105
|
│ └────────────────────────────────────────────────────────────────────────┘ │
|
|
106
106
|
└──────────────────────────────────────────────────────────────────────────────┘
|
|
@@ -152,7 +152,7 @@ The `BatchTxRequester` runs three types of workers concurrently:
|
|
|
152
152
|
|
|
153
153
|
```typescript
|
|
154
154
|
class BlockTxsRequest {
|
|
155
|
-
|
|
155
|
+
archiveRoot: Fr; // Archive root after the proposed block is applied
|
|
156
156
|
txHashes: TxHashArray; // Full tx hashes (for dumb peers without proposal)
|
|
157
157
|
txIndices: BitVector; // Which txs from proposal we're requesting (1 = want)
|
|
158
158
|
}
|
|
@@ -162,7 +162,7 @@ class BlockTxsRequest {
|
|
|
162
162
|
|
|
163
163
|
```typescript
|
|
164
164
|
class BlockTxsResponse {
|
|
165
|
-
|
|
165
|
+
archiveRoot: Fr; // Echo back the proposal archive root
|
|
166
166
|
txs: TxArray; // Actual transaction data
|
|
167
167
|
txIndices: BitVector; // Which txs the peer has available (1 = have)
|
|
168
168
|
}
|
|
@@ -230,8 +230,8 @@ Request to peer fails
|
|
|
230
230
|
```typescript
|
|
231
231
|
const requester = new BatchTxRequester(
|
|
232
232
|
missingTxHashes, // TxHash[] - what we need
|
|
233
|
-
|
|
234
|
-
pinnedPeer, // PeerId | undefined -
|
|
233
|
+
blockTxsSource, // BlockTxsSource - the proposal or block we need txs for
|
|
234
|
+
pinnedPeer, // PeerId | undefined - peer expected to have the txs
|
|
235
235
|
timeoutMs, // number - how long to try
|
|
236
236
|
p2pService, // BatchTxRequesterLibP2PService
|
|
237
237
|
);
|
|
@@ -268,14 +268,14 @@ const txs = await BatchTxRequester.collectAllTxs(requester.run());
|
|
|
268
268
|
┌───────────────────────────────────┐ ┌─────────────────────────────────────┐
|
|
269
269
|
│ FastTxCollection │ │ SlowTxCollection │
|
|
270
270
|
│ │ │ │
|
|
271
|
-
│ Time-critical:
|
|
271
|
+
│ Time-critical: proposals/proving │ │ Background: unproven blocks │
|
|
272
272
|
│ │ │ │
|
|
273
273
|
│ 1. Try RPC nodes first (fast) │ │ Periodic polling of RPC nodes │
|
|
274
274
|
│ 2. Fall back to BatchTxRequester │ │ and peers for missing txs │
|
|
275
275
|
│ │ │ │
|
|
276
276
|
└───────────────────┬───────────────┘ └─────────────────────────────────────┘
|
|
277
277
|
│
|
|
278
|
-
│ For 'proposal' requests
|
|
278
|
+
│ For 'proposal' and 'block' requests
|
|
279
279
|
▼
|
|
280
280
|
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
281
281
|
│ BatchTxRequester │
|
|
@@ -4,14 +4,14 @@ import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
|
4
4
|
import { FifoMemoryQueue, type ISemaphore, Semaphore } from '@aztec/foundation/queue';
|
|
5
5
|
import { sleep } from '@aztec/foundation/sleep';
|
|
6
6
|
import { DateProvider, executeTimeout } from '@aztec/foundation/timer';
|
|
7
|
-
import {
|
|
7
|
+
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
8
8
|
import { Tx, TxArray, TxHash } from '@aztec/stdlib/tx';
|
|
9
9
|
|
|
10
10
|
import type { PeerId } from '@libp2p/interface';
|
|
11
|
-
import { peerIdFromString } from '@libp2p/peer-id';
|
|
12
11
|
|
|
12
|
+
import type { IMissingTxsTracker } from '../../tx_collection/missing_txs_tracker.js';
|
|
13
13
|
import { ReqRespSubProtocol } from '.././interface.js';
|
|
14
|
-
import { BlockTxsRequest, BlockTxsResponse } from '.././protocols/index.js';
|
|
14
|
+
import { BlockTxsRequest, BlockTxsResponse, type BlockTxsSource } from '.././protocols/index.js';
|
|
15
15
|
import { ReqRespStatus } from '.././status.js';
|
|
16
16
|
import {
|
|
17
17
|
DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD,
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE,
|
|
21
21
|
} from './config.js';
|
|
22
22
|
import type { BatchTxRequesterLibP2PService, BatchTxRequesterOptions, ITxMetadataCollection } from './interface.js';
|
|
23
|
-
import {
|
|
23
|
+
import { MissingTxMetadataCollection } from './missing_txs.js';
|
|
24
24
|
import { type IPeerCollection, PeerCollection } from './peer_collection.js';
|
|
25
25
|
import { BatchRequestTxValidator, type IBatchRequestTxValidator } from './tx_validator.js';
|
|
26
26
|
|
|
@@ -42,7 +42,7 @@ import { BatchRequestTxValidator, type IBatchRequestTxValidator } from './tx_val
|
|
|
42
42
|
* - Is the peer which was unable to send us successful response N times in a row
|
|
43
43
|
* */
|
|
44
44
|
export class BatchTxRequester {
|
|
45
|
-
private readonly
|
|
45
|
+
private readonly blockTxsSource: BlockTxsSource;
|
|
46
46
|
private readonly pinnedPeer: PeerId | undefined;
|
|
47
47
|
private readonly timeoutMs: number;
|
|
48
48
|
private readonly p2pService: BatchTxRequesterLibP2PService;
|
|
@@ -60,8 +60,8 @@ export class BatchTxRequester {
|
|
|
60
60
|
private readonly txBatchSize: number;
|
|
61
61
|
|
|
62
62
|
constructor(
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
missingTxsTracker: IMissingTxsTracker,
|
|
64
|
+
blockTxsSource: BlockTxsSource,
|
|
65
65
|
pinnedPeer: PeerId | undefined,
|
|
66
66
|
timeoutMs: number,
|
|
67
67
|
p2pService: BatchTxRequesterLibP2PService,
|
|
@@ -69,7 +69,7 @@ export class BatchTxRequester {
|
|
|
69
69
|
dateProvider?: DateProvider,
|
|
70
70
|
opts?: BatchTxRequesterOptions,
|
|
71
71
|
) {
|
|
72
|
-
this.
|
|
72
|
+
this.blockTxsSource = blockTxsSource;
|
|
73
73
|
this.pinnedPeer = pinnedPeer;
|
|
74
74
|
this.timeoutMs = timeoutMs;
|
|
75
75
|
this.p2pService = p2pService;
|
|
@@ -89,18 +89,16 @@ export class BatchTxRequester {
|
|
|
89
89
|
if (this.opts.peerCollection) {
|
|
90
90
|
this.peers = this.opts.peerCollection;
|
|
91
91
|
} else {
|
|
92
|
-
const initialPeers = this.p2pService.connectionSampler.getPeerListSortedByConnectionCountAsc();
|
|
93
92
|
const badPeerThreshold = this.opts.badPeerThreshold ?? DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD;
|
|
94
93
|
this.peers = new PeerCollection(
|
|
95
|
-
|
|
94
|
+
this.p2pService.connectionSampler,
|
|
96
95
|
this.pinnedPeer,
|
|
97
96
|
this.dateProvider,
|
|
98
97
|
badPeerThreshold,
|
|
99
98
|
this.p2pService.peerScoring,
|
|
100
99
|
);
|
|
101
100
|
}
|
|
102
|
-
|
|
103
|
-
this.txsMetadata = new MissingTxMetadataCollection(entries, this.txBatchSize);
|
|
101
|
+
this.txsMetadata = new MissingTxMetadataCollection(missingTxsTracker, this.txBatchSize);
|
|
104
102
|
this.smartRequesterSemaphore = this.opts.semaphore ?? new Semaphore(0);
|
|
105
103
|
}
|
|
106
104
|
|
|
@@ -205,7 +203,7 @@ export class BatchTxRequester {
|
|
|
205
203
|
return;
|
|
206
204
|
}
|
|
207
205
|
|
|
208
|
-
const request = BlockTxsRequest.
|
|
206
|
+
const request = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
|
|
209
207
|
if (!request) {
|
|
210
208
|
return;
|
|
211
209
|
}
|
|
@@ -227,7 +225,6 @@ export class BatchTxRequester {
|
|
|
227
225
|
* Starts dumb worker loops
|
|
228
226
|
* */
|
|
229
227
|
private async dumbRequester() {
|
|
230
|
-
const nextPeerIndex = this.makeRoundRobinIndexer();
|
|
231
228
|
const nextBatchIndex = this.makeRoundRobinIndexer();
|
|
232
229
|
|
|
233
230
|
// Chunk missing tx hashes into batches of txBatchSize, wrapping around to ensure no peer gets less than txBatchSize
|
|
@@ -249,8 +246,8 @@ export class BatchTxRequester {
|
|
|
249
246
|
// If peer is dumb peer, we don't know yet if they received full blockProposal
|
|
250
247
|
// there is solid chance that peer didn't receive proposal yet, thus we must send full hashes
|
|
251
248
|
const includeFullHashesInRequestNotJustIndices = true;
|
|
252
|
-
const blockRequest = BlockTxsRequest.
|
|
253
|
-
this.
|
|
249
|
+
const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(
|
|
250
|
+
this.blockTxsSource,
|
|
254
251
|
txs,
|
|
255
252
|
includeFullHashesInRequestNotJustIndices,
|
|
256
253
|
);
|
|
@@ -263,15 +260,9 @@ export class BatchTxRequester {
|
|
|
263
260
|
return { blockRequest, txs };
|
|
264
261
|
};
|
|
265
262
|
|
|
266
|
-
const
|
|
267
|
-
const peers = this.peers.getDumbPeersToQuery();
|
|
268
|
-
const idx = nextPeerIndex(() => peers.length);
|
|
269
|
-
return idx === undefined ? undefined : peerIdFromString(peers[idx]);
|
|
270
|
-
};
|
|
271
|
-
|
|
272
|
-
const workerCount = Math.min(this.dumbParallelWorkerCount, this.peers.getAllPeers().size);
|
|
263
|
+
const workerCount = this.dumbParallelWorkerCount;
|
|
273
264
|
const workers = Array.from({ length: workerCount }, (_, index) =>
|
|
274
|
-
this.dumbWorkerLoop(
|
|
265
|
+
this.dumbWorkerLoop(this.peers.nextDumbPeerToQuery.bind(this.peers), makeRequest, index + 1),
|
|
275
266
|
);
|
|
276
267
|
|
|
277
268
|
await Promise.allSettled(workers);
|
|
@@ -332,17 +323,9 @@ export class BatchTxRequester {
|
|
|
332
323
|
* Starts smart worker loops
|
|
333
324
|
* */
|
|
334
325
|
private async smartRequester() {
|
|
335
|
-
const nextPeerIndex = this.makeRoundRobinIndexer();
|
|
336
|
-
|
|
337
|
-
const nextPeer = () => {
|
|
338
|
-
const peers = this.peers.getSmartPeersToQuery();
|
|
339
|
-
const idx = nextPeerIndex(() => peers.length);
|
|
340
|
-
return idx === undefined ? undefined : peerIdFromString(peers[idx]);
|
|
341
|
-
};
|
|
342
|
-
|
|
343
326
|
const makeRequest = (pid: PeerId) => {
|
|
344
327
|
const txs = this.txsMetadata.getTxsToRequestFromThePeer(pid);
|
|
345
|
-
const blockRequest = BlockTxsRequest.
|
|
328
|
+
const blockRequest = BlockTxsRequest.fromTxsSourceAndMissingTxs(this.blockTxsSource, txs);
|
|
346
329
|
if (!blockRequest) {
|
|
347
330
|
return undefined;
|
|
348
331
|
}
|
|
@@ -350,9 +333,8 @@ export class BatchTxRequester {
|
|
|
350
333
|
return { blockRequest, txs };
|
|
351
334
|
};
|
|
352
335
|
|
|
353
|
-
const workers = Array.from(
|
|
354
|
-
|
|
355
|
-
(_, index) => this.smartWorkerLoop(nextPeer, makeRequest, index + 1),
|
|
336
|
+
const workers = Array.from({ length: this.smartParallelWorkerCount }, (_, index) =>
|
|
337
|
+
this.smartWorkerLoop(this.peers.nextSmartPeerToQuery.bind(this.peers), makeRequest, index + 1),
|
|
356
338
|
);
|
|
357
339
|
|
|
358
340
|
await Promise.allSettled(workers);
|
|
@@ -387,26 +369,18 @@ export class BatchTxRequester {
|
|
|
387
369
|
if (weRanOutOfPeersToQuery) {
|
|
388
370
|
this.logger.debug(`Worker loop smart: No more peers to query`);
|
|
389
371
|
|
|
390
|
-
// If
|
|
391
|
-
|
|
392
|
-
const
|
|
393
|
-
if (
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
const thereAreSomeRateLimitedSmartPeers = nextSmartPeerDelay !== undefined;
|
|
397
|
-
if (thereAreSomeRateLimitedSmartPeers) {
|
|
398
|
-
await this.sleepClampedToDeadline(nextSmartPeerDelay);
|
|
399
|
-
continue;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
this.logger.debug(`Worker loop smart: No more smart peers to query killing ${workerIndex}`);
|
|
403
|
-
break;
|
|
372
|
+
// If we have rate limited peers wait for them.
|
|
373
|
+
const nextSmartPeerDelay = this.peers.getNextSmartPeerAvailabilityDelayMs();
|
|
374
|
+
const thereAreSomeRateLimitedSmartPeers = nextSmartPeerDelay !== undefined;
|
|
375
|
+
if (thereAreSomeRateLimitedSmartPeers) {
|
|
376
|
+
await this.sleepClampedToDeadline(nextSmartPeerDelay);
|
|
377
|
+
continue;
|
|
404
378
|
}
|
|
405
379
|
|
|
406
|
-
// Otherwise there are still some dumb peers that could become smart.
|
|
407
380
|
// We end up here when all known smart peers became temporarily unavailable via combination of
|
|
408
381
|
// (bad, in-flight, or rate-limited) or in some weird scenario all current smart peers turn bad which is permanent
|
|
409
|
-
// but dumb peers
|
|
382
|
+
// but there are dumb peers that could be promoted
|
|
383
|
+
// or new peer can join as dumb and be promoted later
|
|
410
384
|
//
|
|
411
385
|
// When a dumb peer responds with valid txIndices, it gets
|
|
412
386
|
// promoted to smart and releases the semaphore, waking this worker.
|
|
@@ -599,15 +573,13 @@ export class BatchTxRequester {
|
|
|
599
573
|
this.markTxsPeerHas(peerId, response);
|
|
600
574
|
|
|
601
575
|
// Unblock smart workers
|
|
602
|
-
|
|
603
|
-
this.smartRequesterSemaphore.release();
|
|
604
|
-
}
|
|
576
|
+
this.smartRequesterSemaphore.release();
|
|
605
577
|
}
|
|
606
578
|
|
|
607
579
|
private isBlockResponseValid(response: BlockTxsResponse): boolean {
|
|
608
|
-
const
|
|
580
|
+
const archiveRootsMatch = this.blockTxsSource.archive.toString() === response.archiveRoot.toString();
|
|
609
581
|
const peerHasSomeTxsFromProposal = !response.txIndices.isEmpty();
|
|
610
|
-
return
|
|
582
|
+
return archiveRootsMatch && peerHasSomeTxsFromProposal;
|
|
611
583
|
}
|
|
612
584
|
|
|
613
585
|
private peerHasSomeTxsWeAreMissing(_peerId: PeerId, response: BlockTxsResponse): boolean {
|
|
@@ -624,7 +596,7 @@ export class BatchTxRequester {
|
|
|
624
596
|
private extractHashesPeerHasFromResponse(response: BlockTxsResponse): Array<TxHash> {
|
|
625
597
|
const hashes: TxHash[] = [];
|
|
626
598
|
const indicesOfHashesPeerHas = new Set(response.txIndices.getTrueIndices());
|
|
627
|
-
this.
|
|
599
|
+
this.blockTxsSource.txHashes.forEach((hash, idx) => {
|
|
628
600
|
if (indicesOfHashesPeerHas.has(idx)) {
|
|
629
601
|
hashes.push(hash);
|
|
630
602
|
}
|
|
@@ -661,7 +633,7 @@ export class BatchTxRequester {
|
|
|
661
633
|
/*
|
|
662
634
|
* @returns true if all missing txs have been fetched */
|
|
663
635
|
private fetchedAllTxs() {
|
|
664
|
-
return
|
|
636
|
+
return this.txsMetadata.getMissingTxHashes().size == 0;
|
|
665
637
|
}
|
|
666
638
|
|
|
667
639
|
/*
|
|
@@ -679,7 +651,7 @@ export class BatchTxRequester {
|
|
|
679
651
|
this.unlockSmartRequesterSemaphores();
|
|
680
652
|
}
|
|
681
653
|
|
|
682
|
-
return aborted || this.
|
|
654
|
+
return aborted || this.fetchedAllTxs() || this.dateProvider.now() > this.deadline;
|
|
683
655
|
}
|
|
684
656
|
|
|
685
657
|
/*
|
|
@@ -6,7 +6,6 @@ import type { PeerId } from '@libp2p/interface';
|
|
|
6
6
|
|
|
7
7
|
import type { ConnectionSampler } from '../connection-sampler/connection_sampler.js';
|
|
8
8
|
import type { ReqRespInterface } from '../interface.js';
|
|
9
|
-
import type { MissingTxMetadata } from './missing_txs.js';
|
|
10
9
|
import type { IPeerCollection } from './peer_collection.js';
|
|
11
10
|
import type { BatchRequestTxValidatorConfig, IBatchRequestTxValidator } from './tx_validator.js';
|
|
12
11
|
|
|
@@ -15,18 +14,15 @@ export interface IPeerPenalizer {
|
|
|
15
14
|
}
|
|
16
15
|
|
|
17
16
|
export interface ITxMetadataCollection {
|
|
18
|
-
size: number;
|
|
19
|
-
values(): IterableIterator<MissingTxMetadata>;
|
|
20
17
|
getMissingTxHashes(): Set<string>;
|
|
18
|
+
markFetched(peerId: PeerId, tx: Tx): boolean;
|
|
21
19
|
getTxsToRequestFromThePeer(peer: PeerId): TxHash[];
|
|
22
20
|
markRequested(txHash: TxHash): void;
|
|
23
21
|
markInFlightBySmartPeer(txHash: TxHash): void;
|
|
24
22
|
markNotInFlightBySmartPeer(txHash: TxHash): void;
|
|
25
23
|
alreadyFetched(txHash: TxHash): boolean;
|
|
26
24
|
// Returns true if tx was marked as fetched, false if it was already marked as fetched
|
|
27
|
-
markFetched(peerId: PeerId, tx: Tx): boolean;
|
|
28
25
|
markPeerHas(peerId: PeerId, txHashes: TxHash[]): void;
|
|
29
|
-
getFetchedTxs(): Tx[];
|
|
30
26
|
}
|
|
31
27
|
|
|
32
28
|
/**
|
|
@@ -2,13 +2,13 @@ import { type Tx, TxHash } from '@aztec/stdlib/tx';
|
|
|
2
2
|
|
|
3
3
|
import type { PeerId } from '@libp2p/interface';
|
|
4
4
|
|
|
5
|
+
import type { IMissingTxsTracker } from '../../tx_collection/missing_txs_tracker.js';
|
|
5
6
|
import { DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE } from './config.js';
|
|
6
7
|
import type { ITxMetadataCollection } from './interface.js';
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
class MissingTxMetadata {
|
|
9
10
|
constructor(
|
|
10
|
-
public readonly txHash:
|
|
11
|
-
public fetched = false,
|
|
11
|
+
public readonly txHash: string,
|
|
12
12
|
public requestedCount = 0,
|
|
13
13
|
public inFlightCount = 0,
|
|
14
14
|
public tx: Tx | undefined = undefined,
|
|
@@ -30,24 +30,6 @@ export class MissingTxMetadata {
|
|
|
30
30
|
public isInFlight(): boolean {
|
|
31
31
|
return this.inFlightCount > 0;
|
|
32
32
|
}
|
|
33
|
-
|
|
34
|
-
//Returns true if this is the first time we mark it as fetched
|
|
35
|
-
public markAsFetched(peerId: PeerId, tx: Tx): boolean {
|
|
36
|
-
if (this.fetched) {
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
this.fetched = true;
|
|
41
|
-
this.tx = tx;
|
|
42
|
-
|
|
43
|
-
this.peers.add(peerId.toString());
|
|
44
|
-
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
public toString() {
|
|
49
|
-
return this.txHash.toString();
|
|
50
|
-
}
|
|
51
33
|
}
|
|
52
34
|
|
|
53
35
|
/*
|
|
@@ -55,21 +37,18 @@ export class MissingTxMetadata {
|
|
|
55
37
|
* This could be better optimized but given expected count of missing txs (N < 100)
|
|
56
38
|
* At the moment there is no need for it. And benefit is that we have everything in single store
|
|
57
39
|
* */
|
|
58
|
-
export class MissingTxMetadataCollection
|
|
40
|
+
export class MissingTxMetadataCollection implements ITxMetadataCollection {
|
|
41
|
+
private txMetadata = new Map<string, MissingTxMetadata>();
|
|
42
|
+
|
|
59
43
|
constructor(
|
|
60
|
-
|
|
44
|
+
private missingTxsTracker: IMissingTxsTracker,
|
|
61
45
|
private readonly txBatchSize: number = DEFAULT_BATCH_TX_REQUESTER_TX_BATCH_SIZE,
|
|
62
46
|
) {
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
public getSortedByRequestedCountAsc(txs: string[]): MissingTxMetadata[] {
|
|
66
|
-
return Array.from(this.values().filter(txMeta => txs.includes(txMeta.txHash.toString()))).sort(
|
|
67
|
-
(a, b) => a.requestedCount - b.requestedCount,
|
|
68
|
-
);
|
|
47
|
+
missingTxsTracker.missingTxHashes.forEach(hash => this.txMetadata.set(hash, new MissingTxMetadata(hash)));
|
|
69
48
|
}
|
|
70
49
|
|
|
71
50
|
public getPrioritizingNotInFlightAndLowerRequestCount(txs: string[]): MissingTxMetadata[] {
|
|
72
|
-
const filtered = Array.from(this.values()).filter(txMeta => txs.includes(txMeta.txHash.toString()));
|
|
51
|
+
const filtered = Array.from(this.txMetadata.values()).filter(txMeta => txs.includes(txMeta.txHash.toString()));
|
|
73
52
|
|
|
74
53
|
const [notInFlight, inFlight] = filtered.reduce<[MissingTxMetadata[], MissingTxMetadata[]]>(
|
|
75
54
|
(buckets, tx) => {
|
|
@@ -85,43 +64,15 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
|
|
|
85
64
|
return [...notInFlight, ...inFlight];
|
|
86
65
|
}
|
|
87
66
|
|
|
88
|
-
public getFetchedTxHashes(): Set<string> {
|
|
89
|
-
return new Set(
|
|
90
|
-
this.values()
|
|
91
|
-
.filter(t => t.fetched)
|
|
92
|
-
.map(t => t.txHash.toString()),
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
67
|
public getMissingTxHashes(): Set<string> {
|
|
97
|
-
return
|
|
98
|
-
this.values()
|
|
99
|
-
.filter(t => !t.fetched)
|
|
100
|
-
.map(t => t.txHash.toString()),
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
public getInFlightTxHashes(): Set<string> {
|
|
105
|
-
return new Set(
|
|
106
|
-
this.values()
|
|
107
|
-
.filter(t => t.isInFlight())
|
|
108
|
-
.map(t => t.txHash.toString()),
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
public getFetchedTxs(): Tx[] {
|
|
113
|
-
return Array.from(
|
|
114
|
-
this.values()
|
|
115
|
-
.map(t => t.tx)
|
|
116
|
-
.filter(t => !!t),
|
|
117
|
-
);
|
|
68
|
+
return this.missingTxsTracker.missingTxHashes;
|
|
118
69
|
}
|
|
119
70
|
|
|
120
71
|
public getTxsPeerHas(peer: PeerId): Set<string> {
|
|
121
72
|
const peerIdStr = peer.toString();
|
|
122
73
|
const txsPeerHas = new Set<string>();
|
|
123
74
|
|
|
124
|
-
this.values().forEach(txMeta => {
|
|
75
|
+
this.txMetadata.values().forEach(txMeta => {
|
|
125
76
|
if (txMeta.peers.has(peerIdStr)) {
|
|
126
77
|
txsPeerHas.add(txMeta.txHash.toString());
|
|
127
78
|
}
|
|
@@ -132,13 +83,13 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
|
|
|
132
83
|
|
|
133
84
|
public getTxsToRequestFromThePeer(peer: PeerId): TxHash[] {
|
|
134
85
|
const txsPeerHas = this.getTxsPeerHas(peer);
|
|
135
|
-
const
|
|
86
|
+
const missingTxHashes = this.getMissingTxHashes();
|
|
136
87
|
|
|
137
|
-
const txsToRequest = txsPeerHas.
|
|
88
|
+
const txsToRequest = txsPeerHas.intersection(missingTxHashes);
|
|
138
89
|
|
|
139
90
|
if (txsToRequest.size >= this.txBatchSize) {
|
|
140
91
|
return this.getPrioritizingNotInFlightAndLowerRequestCount(Array.from(txsToRequest))
|
|
141
|
-
.map(t => t.txHash)
|
|
92
|
+
.map(t => TxHash.fromString(t.txHash))
|
|
142
93
|
.slice(0, this.txBatchSize);
|
|
143
94
|
}
|
|
144
95
|
|
|
@@ -150,13 +101,13 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
|
|
|
150
101
|
Array.from(this.getMissingTxHashes().difference(txsToRequest)),
|
|
151
102
|
)
|
|
152
103
|
.slice(0, countToFill)
|
|
153
|
-
.map(t => t.txHash);
|
|
104
|
+
.map(t => TxHash.fromString(t.txHash));
|
|
154
105
|
|
|
155
106
|
return [...Array.from(txsToRequest).map(t => TxHash.fromString(t)), ...txsToFill];
|
|
156
107
|
}
|
|
157
108
|
|
|
158
109
|
public markRequested(txHash: TxHash) {
|
|
159
|
-
this.get(txHash.toString())?.markAsRequested();
|
|
110
|
+
this.txMetadata.get(txHash.toString())?.markAsRequested();
|
|
160
111
|
}
|
|
161
112
|
|
|
162
113
|
/*
|
|
@@ -165,7 +116,7 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
|
|
|
165
116
|
* "dumb" peer might return it, or might not - we don't know
|
|
166
117
|
* */
|
|
167
118
|
public markInFlightBySmartPeer(txHash: TxHash) {
|
|
168
|
-
this.get(txHash.toString())?.markInFlight();
|
|
119
|
+
this.txMetadata.get(txHash.toString())?.markInFlight();
|
|
169
120
|
}
|
|
170
121
|
|
|
171
122
|
/*
|
|
@@ -173,16 +124,16 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
|
|
|
173
124
|
* Because the smart peer should return this tx, whereas
|
|
174
125
|
* "dumb" peer might return it, or might not - we don't know*/
|
|
175
126
|
public markNotInFlightBySmartPeer(txHash: TxHash) {
|
|
176
|
-
this.get(txHash.toString())?.markNotInFlight();
|
|
127
|
+
this.txMetadata.get(txHash.toString())?.markNotInFlight();
|
|
177
128
|
}
|
|
178
129
|
|
|
179
130
|
public alreadyFetched(txHash: TxHash): boolean {
|
|
180
|
-
return this.
|
|
131
|
+
return !this.missingTxsTracker.isMissing(txHash.toString());
|
|
181
132
|
}
|
|
182
133
|
|
|
183
134
|
public markFetched(peerId: PeerId, tx: Tx): boolean {
|
|
184
135
|
const txHashStr = tx.txHash.toString();
|
|
185
|
-
const txMeta = this.get(txHashStr);
|
|
136
|
+
const txMeta = this.txMetadata.get(txHashStr);
|
|
186
137
|
if (!txMeta) {
|
|
187
138
|
//TODO: what to do about peer which sent txs we didn't request?
|
|
188
139
|
// 1. don't request from it in the scope of this batch request
|
|
@@ -192,7 +143,8 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
|
|
|
192
143
|
return false;
|
|
193
144
|
}
|
|
194
145
|
|
|
195
|
-
|
|
146
|
+
txMeta.peers.add(peerId.toString());
|
|
147
|
+
return this.missingTxsTracker.markFetched(tx);
|
|
196
148
|
}
|
|
197
149
|
|
|
198
150
|
public markPeerHas(peerId: PeerId, txHash: TxHash[]) {
|
|
@@ -200,7 +152,7 @@ export class MissingTxMetadataCollection extends Map<string, MissingTxMetadata>
|
|
|
200
152
|
txHash
|
|
201
153
|
.map(t => t.toString())
|
|
202
154
|
.forEach(txh => {
|
|
203
|
-
const txMeta = this.get(txh);
|
|
155
|
+
const txMeta = this.txMetadata.get(txh);
|
|
204
156
|
if (txMeta) {
|
|
205
157
|
txMeta.peers.add(peerIdStr);
|
|
206
158
|
}
|