@aztec/p2p 0.0.1-commit.f2ce05ee → 0.0.1-commit.f81dbcf
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 +8 -8
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +42 -13
- package/dest/client/interface.d.ts +39 -33
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +37 -50
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +144 -223
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -7
- package/dest/config.d.ts +47 -11
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +94 -31
- 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 +21 -12
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +67 -37
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +53 -53
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -1
- 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 +2 -1
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/interface.d.ts +3 -3
- 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/priority.d.ts +2 -2
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.js +4 -4
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
- 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 +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -2
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +2 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +22 -8
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +4 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +68 -11
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +132 -17
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +36 -14
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -4
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +11 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +13 -5
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +336 -185
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -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 +6 -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 +13 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +48 -36
- 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/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 +24 -20
- 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/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/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/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 +125 -6
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +233 -59
- 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 +67 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
- package/dest/msg_validators/tx_validator/index.d.ts +3 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +2 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +44 -23
- 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/dummy_service.d.ts +9 -5
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +7 -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/topic_score_params.d.ts +18 -6
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +32 -10
- package/dest/services/libp2p/libp2p_service.d.ts +25 -14
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +158 -123
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -3
- 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 +5 -9
- 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/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 +3 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
- 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 +15 -0
- 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 +11 -4
- package/dest/services/service.d.ts +22 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +19 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +46 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +56 -36
- 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 +2 -1
- 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 +7 -6
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
- 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 +1 -3
- package/dest/services/tx_file_store/config.d.ts.map +1 -1
- package/dest/services/tx_file_store/config.js +0 -4
- package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +9 -6
- 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 +2 -2
- package/dest/test-helpers/testbench-utils.d.ts +35 -24
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +95 -36
- 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 -15
- package/dest/testbench/worker_client_manager.d.ts +3 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +4 -1
- 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 -23
- package/src/client/interface.ts +43 -33
- package/src/client/p2p_client.ts +165 -265
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -10
- package/src/config.ts +139 -33
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +95 -44
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +57 -53
- package/src/mem_pools/attestation_pool/index.ts +3 -3
- package/src/mem_pools/attestation_pool/mocks.ts +2 -1
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/interface.ts +2 -2
- 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/priority.ts +4 -4
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
- package/src/mem_pools/tx_pool_v2/README.md +85 -11
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -2
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
- package/src/mem_pools/tx_pool_v2/index.ts +2 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +23 -8
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +189 -23
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -16
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +18 -7
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +379 -182
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +63 -40
- 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/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
- package/src/msg_validators/tx_validator/factory.ts +373 -77
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +51 -26
- package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
- package/src/services/dummy_service.ts +12 -6
- package/src/services/encoding.ts +9 -9
- package/src/services/gossipsub/README.md +29 -14
- package/src/services/gossipsub/topic_score_params.ts +49 -13
- package/src/services/libp2p/libp2p_service.ts +170 -132
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +6 -6
- 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/tx_validator.ts +2 -2
- package/src/services/reqresp/interface.ts +26 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
- package/src/services/reqresp/protocols/tx.ts +22 -0
- package/src/services/reqresp/reqresp.ts +13 -3
- package/src/services/service.ts +31 -2
- package/src/services/tx_collection/config.ts +68 -0
- package/src/services/tx_collection/fast_tx_collection.ts +65 -32
- 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 +1 -0
- 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 +8 -7
- 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 +0 -6
- package/src/services/tx_file_store/tx_file_store.ts +10 -8
- 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 +2 -5
- package/src/test-helpers/testbench-utils.ts +109 -40
- package/src/testbench/p2p_client_testbench_worker.ts +24 -20
- package/src/testbench/worker_client_manager.ts +11 -4
- package/src/util.ts +7 -1
- 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/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
|
@@ -370,15 +370,15 @@ function applyDecs2203RFactory() {
|
|
|
370
370
|
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
371
371
|
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
372
|
}
|
|
373
|
-
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8,
|
|
373
|
+
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _initProto;
|
|
374
374
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
375
|
-
import {
|
|
375
|
+
import { maxBy } from '@aztec/foundation/collection';
|
|
376
376
|
import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
377
377
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
378
378
|
import { Timer } from '@aztec/foundation/timer';
|
|
379
379
|
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
380
380
|
import { GasFees } from '@aztec/stdlib/gas';
|
|
381
|
-
import { BlockProposal, CheckpointAttestation, CheckpointProposal,
|
|
381
|
+
import { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PMessage, PeerErrorSeverity, PeerErrorSeverityByHarshness, TopicType, createTopicString, getTopicsForConfig, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
|
|
382
382
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
383
383
|
import { Tx } from '@aztec/stdlib/tx';
|
|
384
384
|
import { compressComponentVersions } from '@aztec/stdlib/versioning';
|
|
@@ -397,7 +397,7 @@ import { ENR } from '@nethermindeth/enr';
|
|
|
397
397
|
import { createLibp2p } from 'libp2p';
|
|
398
398
|
import { BlockProposalValidator, CheckpointAttestationValidator, CheckpointProposalValidator, DoubleSpendTxValidator, FishermanAttestationValidator, getDefaultAllowedSetupFunctions } from '../../msg_validators/index.js';
|
|
399
399
|
import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
|
|
400
|
-
import {
|
|
400
|
+
import { createFirstStageTxValidationsForGossipedTransactions, createSecondStageTxValidationsForGossipedTransactions, createTxValidatorForBlockProposalReceivedTxs, createTxValidatorForReqResponseReceivedTxs } from '../../msg_validators/tx_validator/factory.js';
|
|
401
401
|
import { GossipSubEvent } from '../../types/index.js';
|
|
402
402
|
import { convertToMultiaddr } from '../../util.js';
|
|
403
403
|
import { getVersions } from '../../versioning.js';
|
|
@@ -408,8 +408,7 @@ import { APP_SPECIFIC_WEIGHT, gossipScoreThresholds } from '../gossipsub/scoring
|
|
|
408
408
|
import { createAllTopicScoreParams } from '../gossipsub/topic_score_params.js';
|
|
409
409
|
import { PeerManager } from '../peer-manager/peer_manager.js';
|
|
410
410
|
import { PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
411
|
-
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError } from '../reqresp/index.js';
|
|
412
|
-
import { pingHandler, reqGoodbyeHandler, reqRespBlockHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
|
|
411
|
+
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler, reqRespBlockHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
|
|
413
412
|
import { ReqResp } from '../reqresp/reqresp.js';
|
|
414
413
|
import { P2PInstrumentation } from './instrumentation.js';
|
|
415
414
|
_dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId, attestation)=>({
|
|
@@ -433,9 +432,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
433
432
|
[Attributes.TX_HASH]: requestedTxHash.toString()
|
|
434
433
|
})), _dec7 = trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock)=>({
|
|
435
434
|
[Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString()
|
|
436
|
-
})), _dec8 = trackSpan('Libp2pService.
|
|
437
|
-
[Attributes.TX_HASH]: tx.getTxHash().toString()
|
|
438
|
-
})), _dec9 = trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation)=>({
|
|
435
|
+
})), _dec8 = trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation)=>({
|
|
439
436
|
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
440
437
|
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
441
438
|
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then((i)=>i.toString())
|
|
@@ -443,7 +440,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
443
440
|
/**
|
|
444
441
|
* Lib P2P implementation of the P2PService interface.
|
|
445
442
|
*/ export class LibP2PService extends WithTracer {
|
|
446
|
-
clientType;
|
|
447
443
|
config;
|
|
448
444
|
node;
|
|
449
445
|
peerDiscoveryService;
|
|
@@ -499,11 +495,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
499
495
|
[
|
|
500
496
|
_dec8,
|
|
501
497
|
2,
|
|
502
|
-
"validatePropagatedTx"
|
|
503
|
-
],
|
|
504
|
-
[
|
|
505
|
-
_dec9,
|
|
506
|
-
2,
|
|
507
498
|
"validateCheckpointAttestation"
|
|
508
499
|
]
|
|
509
500
|
], []));
|
|
@@ -518,6 +509,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
518
509
|
topicStrings;
|
|
519
510
|
feesCache;
|
|
520
511
|
/** Callback invoked when a duplicate proposal is detected (triggers slashing). */ duplicateProposalCallback;
|
|
512
|
+
/** Callback invoked when a duplicate attestation is detected (triggers slashing). */ duplicateAttestationCallback;
|
|
521
513
|
/**
|
|
522
514
|
* Callback for when a block is received from a peer.
|
|
523
515
|
* @param block - The block received from the peer.
|
|
@@ -532,8 +524,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
532
524
|
instrumentation;
|
|
533
525
|
telemetry;
|
|
534
526
|
logger;
|
|
535
|
-
constructor(
|
|
536
|
-
super(telemetry, 'LibP2PService'), this.
|
|
527
|
+
constructor(config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger = createLogger('p2p:libp2p_service')){
|
|
528
|
+
super(telemetry, 'LibP2PService'), this.config = config, this.node = node, this.peerDiscoveryService = peerDiscoveryService, this.reqresp = reqresp, this.peerManager = peerManager, this.mempools = mempools, this.archiver = archiver, this.epochCache = epochCache, this.proofVerifier = proofVerifier, this.worldStateSynchronizer = worldStateSynchronizer, this.msgIdSeenValidators = (_initProto(this), {}), this.protocolVersion = '', this.topicStrings = {};
|
|
537
529
|
this.telemetry = telemetry;
|
|
538
530
|
// Create child logger with fisherman prefix if in fisherman mode
|
|
539
531
|
this.logger = config.fishermanMode ? logger.createChild('[FISHERMAN]') : logger;
|
|
@@ -549,19 +541,19 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
549
541
|
this.topicStrings[TopicType.block_proposal] = createTopicString(TopicType.block_proposal, this.protocolVersion);
|
|
550
542
|
this.topicStrings[TopicType.checkpoint_proposal] = createTopicString(TopicType.checkpoint_proposal, this.protocolVersion);
|
|
551
543
|
this.topicStrings[TopicType.checkpoint_attestation] = createTopicString(TopicType.checkpoint_attestation, this.protocolVersion);
|
|
552
|
-
|
|
553
|
-
txsPermitted: !config.disableTransactions
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
544
|
+
const proposalValidatorOpts = {
|
|
545
|
+
txsPermitted: !config.disableTransactions,
|
|
546
|
+
maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint
|
|
547
|
+
};
|
|
548
|
+
this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
|
|
549
|
+
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
|
|
558
550
|
this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry) : new CheckpointAttestationValidator(epochCache);
|
|
559
551
|
this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
|
|
560
552
|
this.blockReceivedCallback = async (block)=>{
|
|
561
|
-
this.logger.
|
|
553
|
+
this.logger.warn(`Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`, {
|
|
562
554
|
p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier()
|
|
563
555
|
});
|
|
564
|
-
return
|
|
556
|
+
return true;
|
|
565
557
|
};
|
|
566
558
|
this.checkpointReceivedCallback = (checkpoint)=>{
|
|
567
559
|
this.logger.debug(`Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`);
|
|
@@ -576,7 +568,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
576
568
|
* @param config - The configuration to use when creating the service.
|
|
577
569
|
* @param txPool - The transaction pool to be accessed by the service.
|
|
578
570
|
* @returns The new service.
|
|
579
|
-
*/ static async new(
|
|
571
|
+
*/ static async new(config, peerId, deps) {
|
|
580
572
|
const { worldStateSynchronizer, epochCache, l2BlockSource, mempools, proofVerifier, peerStore, telemetry, logger, packageVersion } = deps;
|
|
581
573
|
const { p2pPort, maxPeerCount, listenAddress } = config;
|
|
582
574
|
const bindAddrTcp = convertToMultiaddr(listenAddress, p2pPort, 'tcp');
|
|
@@ -619,7 +611,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
619
611
|
slotDurationMs: l1Constants.slotDuration * 1000,
|
|
620
612
|
heartbeatIntervalMs: config.gossipsubInterval,
|
|
621
613
|
targetCommitteeSize: l1Constants.targetCommitteeSize,
|
|
622
|
-
blockDurationMs: config.blockDurationMs
|
|
614
|
+
blockDurationMs: config.blockDurationMs,
|
|
615
|
+
expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot
|
|
623
616
|
});
|
|
624
617
|
const node = await createLibp2p({
|
|
625
618
|
start: false,
|
|
@@ -740,7 +733,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
740
733
|
// Note: positive topic scores can offset penalties, so alignment is best-effort.
|
|
741
734
|
node.services.pubsub.score.params.appSpecificWeight = APP_SPECIFIC_WEIGHT;
|
|
742
735
|
node.services.pubsub.score.params.appSpecificScore = (peerId)=>peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
|
|
743
|
-
return new LibP2PService(
|
|
736
|
+
return new LibP2PService(config, node, peerDiscoveryService, reqresp, peerManager, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger);
|
|
744
737
|
}
|
|
745
738
|
/**
|
|
746
739
|
* Starts the LibP2P service.
|
|
@@ -785,7 +778,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
785
778
|
await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators);
|
|
786
779
|
await this.node.start();
|
|
787
780
|
// Subscribe to standard GossipSub topics by default
|
|
788
|
-
for (const topic of
|
|
781
|
+
for (const topic of getTopicsForConfig(this.config.disableTransactions)){
|
|
789
782
|
this.subscribeToTopic(this.topicStrings[topic]);
|
|
790
783
|
}
|
|
791
784
|
// add GossipSub listener
|
|
@@ -833,6 +826,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
833
826
|
getPeers(includePending) {
|
|
834
827
|
return this.peerManager.getPeers(includePending);
|
|
835
828
|
}
|
|
829
|
+
getGossipMeshPeerCount(topicType) {
|
|
830
|
+
return this.node.services.pubsub.getMeshPeers(this.topicStrings[topicType]).length;
|
|
831
|
+
}
|
|
836
832
|
handleGossipSubEvent(e) {
|
|
837
833
|
this.logger.trace(`Received PUBSUB message.`);
|
|
838
834
|
const safeJob = async ()=>{
|
|
@@ -874,6 +870,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
874
870
|
this.duplicateProposalCallback = callback;
|
|
875
871
|
}
|
|
876
872
|
/**
|
|
873
|
+
* Registers a callback to be invoked when a duplicate attestation is detected.
|
|
874
|
+
* A validator signing attestations for different proposals at the same slot.
|
|
875
|
+
* This callback is triggered on the first duplicate (when count goes from 1 to 2).
|
|
876
|
+
*/ registerDuplicateAttestationCallback(callback) {
|
|
877
|
+
this.duplicateAttestationCallback = callback;
|
|
878
|
+
}
|
|
879
|
+
/**
|
|
877
880
|
* Subscribes to a topic.
|
|
878
881
|
* @param topic - The topic to subscribe to.
|
|
879
882
|
*/ subscribeToTopic(topic) {
|
|
@@ -984,9 +987,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
984
987
|
if (msg.topic === this.topicStrings[TopicType.tx]) {
|
|
985
988
|
await this.handleGossipedTx(p2pMessage.payload, msgId, source);
|
|
986
989
|
} else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) {
|
|
987
|
-
|
|
988
|
-
await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
|
|
989
|
-
}
|
|
990
|
+
await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
|
|
990
991
|
} else if (msg.topic === this.topicStrings[TopicType.block_proposal]) {
|
|
991
992
|
await this.processBlockFromPeer(p2pMessage.payload, msgId, source);
|
|
992
993
|
} else if (msg.topic === this.topicStrings[TopicType.checkpoint_proposal]) {
|
|
@@ -1054,26 +1055,71 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1054
1055
|
async handleGossipedTx(payloadData, msgId, source) {
|
|
1055
1056
|
const validationFunc = async ()=>{
|
|
1056
1057
|
const tx = Tx.fromBuffer(payloadData);
|
|
1057
|
-
const
|
|
1058
|
-
const
|
|
1058
|
+
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1059
|
+
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1060
|
+
// Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
|
|
1061
|
+
const firstStageValidators = await this.createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp);
|
|
1062
|
+
const firstStageOutcome = await this.runValidations(tx, firstStageValidators);
|
|
1063
|
+
if (!firstStageOutcome.allPassed) {
|
|
1064
|
+
const { name } = firstStageOutcome.failure;
|
|
1065
|
+
let { severity } = firstStageOutcome.failure;
|
|
1066
|
+
// Double spend validator has a special case handler. We perform more detailed examination
|
|
1067
|
+
// as to how recently the nullifier was entered into the tree and if the transaction should
|
|
1068
|
+
// have 'known' the nullifier existed. This determines the severity of the penalty applied to the peer.
|
|
1069
|
+
if (name === 'doubleSpendValidator') {
|
|
1070
|
+
const txBlockNumber = BlockNumber(currentBlockNumber + 1);
|
|
1071
|
+
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
1072
|
+
}
|
|
1073
|
+
this.peerManager.penalizePeer(source, severity);
|
|
1074
|
+
return {
|
|
1075
|
+
result: TopicValidatorResult.Reject
|
|
1076
|
+
};
|
|
1077
|
+
}
|
|
1078
|
+
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
1079
|
+
const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
|
|
1080
|
+
if (canAdd === 'ignored') {
|
|
1081
|
+
return {
|
|
1082
|
+
result: TopicValidatorResult.Ignore,
|
|
1083
|
+
obj: tx
|
|
1084
|
+
};
|
|
1085
|
+
}
|
|
1086
|
+
// Stage 2: expensive proof verification
|
|
1087
|
+
const secondStageValidators = this.createSecondStageMessageValidators();
|
|
1088
|
+
const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
|
|
1089
|
+
if (!secondStageOutcome.allPassed) {
|
|
1090
|
+
const { severity } = secondStageOutcome.failure;
|
|
1091
|
+
this.peerManager.penalizePeer(source, severity);
|
|
1092
|
+
return {
|
|
1093
|
+
result: TopicValidatorResult.Reject
|
|
1094
|
+
};
|
|
1095
|
+
}
|
|
1096
|
+
// Pool add: persist the tx
|
|
1097
|
+
const txHash = tx.getTxHash();
|
|
1098
|
+
const addResult = await this.mempools.txPool.addPendingTxs([
|
|
1099
|
+
tx
|
|
1100
|
+
], {
|
|
1101
|
+
source: 'gossip'
|
|
1102
|
+
});
|
|
1103
|
+
const wasAccepted = addResult.accepted.some((h)=>h.equals(txHash));
|
|
1104
|
+
const wasIgnored = addResult.ignored.some((h)=>h.equals(txHash));
|
|
1059
1105
|
this.logger.trace(`Validate propagated tx`, {
|
|
1060
|
-
|
|
1061
|
-
|
|
1106
|
+
wasAccepted,
|
|
1107
|
+
wasIgnored,
|
|
1062
1108
|
[Attributes.P2P_ID]: source.toString()
|
|
1063
1109
|
});
|
|
1064
|
-
if (
|
|
1110
|
+
if (wasAccepted) {
|
|
1065
1111
|
return {
|
|
1066
|
-
result: TopicValidatorResult.
|
|
1112
|
+
result: TopicValidatorResult.Accept,
|
|
1113
|
+
obj: tx
|
|
1067
1114
|
};
|
|
1068
|
-
} else if (
|
|
1115
|
+
} else if (wasIgnored) {
|
|
1069
1116
|
return {
|
|
1070
1117
|
result: TopicValidatorResult.Ignore,
|
|
1071
1118
|
obj: tx
|
|
1072
1119
|
};
|
|
1073
1120
|
} else {
|
|
1074
1121
|
return {
|
|
1075
|
-
result: TopicValidatorResult.
|
|
1076
|
-
obj: tx
|
|
1122
|
+
result: TopicValidatorResult.Reject
|
|
1077
1123
|
};
|
|
1078
1124
|
}
|
|
1079
1125
|
};
|
|
@@ -1081,20 +1127,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1081
1127
|
if (result !== TopicValidatorResult.Accept || !tx) {
|
|
1082
1128
|
return;
|
|
1083
1129
|
}
|
|
1130
|
+
// Tx was accepted into pool and will be propagated - just log and record metrics
|
|
1084
1131
|
const txHash = tx.getTxHash();
|
|
1085
1132
|
const txHashString = txHash.toString();
|
|
1086
1133
|
this.logger.verbose(`Received tx ${txHashString} from external peer ${source.toString()} via gossip`, {
|
|
1087
1134
|
source: source.toString(),
|
|
1088
1135
|
txHash: txHashString
|
|
1089
1136
|
});
|
|
1090
|
-
if (this.config.dropTransactions && randomInt(1000) < this.config.dropTransactionsProbability * 1000) {
|
|
1091
|
-
this.logger.warn(`Intentionally dropping tx ${txHashString} (probability rule)`);
|
|
1092
|
-
return;
|
|
1093
|
-
}
|
|
1094
1137
|
this.instrumentation.incrementTxReceived(1);
|
|
1095
|
-
await this.mempools.txPool.addTxs([
|
|
1096
|
-
tx
|
|
1097
|
-
]);
|
|
1098
1138
|
}
|
|
1099
1139
|
/**
|
|
1100
1140
|
* Process a checkpoint attestation from a peer.
|
|
@@ -1126,38 +1166,56 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1126
1166
|
obj: attestation
|
|
1127
1167
|
};
|
|
1128
1168
|
}
|
|
1129
|
-
// Get committee size for the attestation's slot
|
|
1130
|
-
const slot = attestation.payload.header.slotNumber;
|
|
1131
|
-
const { committee } = await this.epochCache.getCommittee(slot);
|
|
1132
|
-
const committeeSize = committee?.length ?? 0;
|
|
1133
1169
|
// Try to add the attestation: this handles existence check, cap check, and adding in one call
|
|
1134
|
-
|
|
1170
|
+
// count is the number of attestations by this signer for this slot (for duplicate detection)
|
|
1171
|
+
const slot = attestation.payload.header.slotNumber;
|
|
1172
|
+
const { added, alreadyExists, count } = await this.mempools.attestationPool.tryAddCheckpointAttestation(attestation);
|
|
1135
1173
|
this.logger.trace(`Validate propagated checkpoint attestation`, {
|
|
1136
1174
|
added,
|
|
1137
1175
|
alreadyExists,
|
|
1176
|
+
count,
|
|
1138
1177
|
[Attributes.SLOT_NUMBER]: slot.toString(),
|
|
1139
1178
|
[Attributes.P2P_ID]: peerId.toString()
|
|
1140
1179
|
});
|
|
1141
|
-
//
|
|
1180
|
+
// Exact same attestation received, no need to re-broadcast
|
|
1142
1181
|
if (alreadyExists) {
|
|
1143
1182
|
return {
|
|
1144
1183
|
result: TopicValidatorResult.Ignore,
|
|
1145
1184
|
obj: attestation
|
|
1146
1185
|
};
|
|
1147
1186
|
}
|
|
1148
|
-
// Could not add (cap reached), no need to re-broadcast
|
|
1187
|
+
// Could not add (cap reached for signer), no need to re-broadcast
|
|
1149
1188
|
if (!added) {
|
|
1150
|
-
this.logger.warn(`Dropping checkpoint attestation due to
|
|
1189
|
+
this.logger.warn(`Dropping checkpoint attestation due to cap`, {
|
|
1151
1190
|
slot: slot.toString(),
|
|
1152
1191
|
archive: attestation.archive.toString(),
|
|
1153
|
-
source: peerId.toString()
|
|
1192
|
+
source: peerId.toString(),
|
|
1193
|
+
attester: attestation.getSender()?.toString(),
|
|
1194
|
+
count
|
|
1154
1195
|
});
|
|
1155
1196
|
return {
|
|
1156
1197
|
result: TopicValidatorResult.Ignore,
|
|
1157
1198
|
obj: attestation
|
|
1158
1199
|
};
|
|
1159
1200
|
}
|
|
1160
|
-
//
|
|
1201
|
+
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
1202
|
+
// count is the number of attestations by this signer for this slot
|
|
1203
|
+
if (count === 2) {
|
|
1204
|
+
const attester = attestation.getSender();
|
|
1205
|
+
if (attester) {
|
|
1206
|
+
this.logger.warn(`Detected duplicate attestation (equivocation) at slot ${slot}`, {
|
|
1207
|
+
slot: slot.toString(),
|
|
1208
|
+
archive: attestation.archive.toString(),
|
|
1209
|
+
source: peerId.toString(),
|
|
1210
|
+
attester: attester.toString()
|
|
1211
|
+
});
|
|
1212
|
+
this.duplicateAttestationCallback?.({
|
|
1213
|
+
slot,
|
|
1214
|
+
attester
|
|
1215
|
+
});
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
// Attestation was added successfully - accept it so other nodes can also detect the equivocation
|
|
1161
1219
|
return {
|
|
1162
1220
|
result: TopicValidatorResult.Accept,
|
|
1163
1221
|
obj: attestation
|
|
@@ -1187,8 +1245,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1187
1245
|
};
|
|
1188
1246
|
}
|
|
1189
1247
|
// Try to add the proposal: this handles existence check, cap check, and adding in one call
|
|
1190
|
-
const { added, alreadyExists,
|
|
1191
|
-
const isEquivocated =
|
|
1248
|
+
const { added, alreadyExists, count } = await this.mempools.attestationPool.tryAddBlockProposal(block);
|
|
1249
|
+
const isEquivocated = count !== undefined && count > 1;
|
|
1192
1250
|
// Duplicate proposal received, no need to re-broadcast
|
|
1193
1251
|
if (alreadyExists) {
|
|
1194
1252
|
this.logger.debug(`Ignoring duplicate block proposal received`, {
|
|
@@ -1211,7 +1269,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1211
1269
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1212
1270
|
...block.toBlockInfo(),
|
|
1213
1271
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
1214
|
-
|
|
1272
|
+
count,
|
|
1215
1273
|
proposer: block.getSender()?.toString(),
|
|
1216
1274
|
source: peerId.toString()
|
|
1217
1275
|
});
|
|
@@ -1232,7 +1290,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1232
1290
|
proposer: proposer?.toString()
|
|
1233
1291
|
});
|
|
1234
1292
|
// Invoke the duplicate callback on the first duplicate spotted only
|
|
1235
|
-
if (proposer &&
|
|
1293
|
+
if (proposer && count === 2) {
|
|
1236
1294
|
this.duplicateProposalCallback?.({
|
|
1237
1295
|
slot: block.slotNumber,
|
|
1238
1296
|
proposer,
|
|
@@ -1262,13 +1320,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1262
1320
|
source: sender.toString(),
|
|
1263
1321
|
...block.toBlockInfo()
|
|
1264
1322
|
});
|
|
1265
|
-
// Mark the txs in this proposal as
|
|
1266
|
-
await this.mempools.txPool.
|
|
1323
|
+
// Mark the txs in this proposal as protected
|
|
1324
|
+
await this.mempools.txPool.protectTxs(block.txHashes, block.blockHeader);
|
|
1267
1325
|
// Call the block received callback to validate the proposal.
|
|
1268
1326
|
// Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
|
|
1269
1327
|
const isValid = await this.blockReceivedCallback(block, sender);
|
|
1270
1328
|
if (!isValid) {
|
|
1271
|
-
this.logger.
|
|
1329
|
+
this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
|
|
1272
1330
|
}
|
|
1273
1331
|
}
|
|
1274
1332
|
/**
|
|
@@ -1330,8 +1388,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1330
1388
|
// Try to add the checkpoint proposal core: this handles existence check, cap check, and adding in one call
|
|
1331
1389
|
const checkpointCore = checkpoint.toCore();
|
|
1332
1390
|
const tryAddResult = await this.mempools.attestationPool.tryAddCheckpointProposal(checkpointCore);
|
|
1333
|
-
const { added, alreadyExists,
|
|
1334
|
-
const isEquivocated =
|
|
1391
|
+
const { added, alreadyExists, count } = tryAddResult;
|
|
1392
|
+
const isEquivocated = count !== undefined && count > 1;
|
|
1335
1393
|
// Duplicate proposal received, do not re-broadcast
|
|
1336
1394
|
if (alreadyExists) {
|
|
1337
1395
|
this.logger.debug(`Ignoring duplicate checkpoint proposal received`, {
|
|
@@ -1353,7 +1411,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1353
1411
|
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1354
1412
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1355
1413
|
...checkpoint.toCheckpointInfo(),
|
|
1356
|
-
|
|
1414
|
+
count,
|
|
1357
1415
|
source: peerId.toString()
|
|
1358
1416
|
});
|
|
1359
1417
|
return {
|
|
@@ -1375,7 +1433,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1375
1433
|
proposer: proposer?.toString()
|
|
1376
1434
|
});
|
|
1377
1435
|
// Invoke the duplicate callback on the first duplicate spotted only
|
|
1378
|
-
if (proposer &&
|
|
1436
|
+
if (proposer && count === 2) {
|
|
1379
1437
|
this.duplicateProposalCallback?.({
|
|
1380
1438
|
slot: checkpoint.slotNumber,
|
|
1381
1439
|
proposer,
|
|
@@ -1586,33 +1644,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1586
1644
|
}
|
|
1587
1645
|
}
|
|
1588
1646
|
createRequestedTxValidator() {
|
|
1589
|
-
return
|
|
1647
|
+
return createTxValidatorForReqResponseReceivedTxs(this.proofVerifier, {
|
|
1590
1648
|
l1ChainId: this.config.l1ChainId,
|
|
1591
1649
|
rollupVersion: this.config.rollupVersion
|
|
1592
1650
|
});
|
|
1593
1651
|
}
|
|
1594
|
-
async validatePropagatedTx(tx, peerId) {
|
|
1595
|
-
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1596
|
-
// We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
|
|
1597
|
-
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1598
|
-
const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
|
|
1599
|
-
for (const validator of messageValidators){
|
|
1600
|
-
const outcome = await this.runValidations(tx, validator);
|
|
1601
|
-
if (outcome.allPassed) {
|
|
1602
|
-
continue;
|
|
1603
|
-
}
|
|
1604
|
-
const { name } = outcome.failure;
|
|
1605
|
-
let { severity } = outcome.failure;
|
|
1606
|
-
// Double spend validator has a special case handler
|
|
1607
|
-
if (name === 'doubleSpendValidator') {
|
|
1608
|
-
const txBlockNumber = BlockNumber(currentBlockNumber + 1); // tx is expected to be in the next block
|
|
1609
|
-
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
1610
|
-
}
|
|
1611
|
-
this.peerManager.penalizePeer(peerId, severity);
|
|
1612
|
-
return false;
|
|
1613
|
-
}
|
|
1614
|
-
return true;
|
|
1615
|
-
}
|
|
1616
1652
|
async getGasFees(blockNumber) {
|
|
1617
1653
|
if (blockNumber === this.feesCache?.blockNumber) {
|
|
1618
1654
|
return this.feesCache.gasFees;
|
|
@@ -1639,38 +1675,35 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1639
1675
|
peerScoring: this.peerManager
|
|
1640
1676
|
};
|
|
1641
1677
|
}
|
|
1642
|
-
async
|
|
1643
|
-
const
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
await Promise.all(txs.map(async (tx)=>{
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
if (!outcome.allPassed) {
|
|
1651
|
-
throw new Error('Invalid tx detected', {
|
|
1652
|
-
cause: {
|
|
1653
|
-
outcome
|
|
1654
|
-
}
|
|
1655
|
-
});
|
|
1656
|
-
}
|
|
1657
|
-
}
|
|
1678
|
+
async validateTxsReceivedInBlockProposal(txs) {
|
|
1679
|
+
const validator = createTxValidatorForBlockProposalReceivedTxs(this.proofVerifier, {
|
|
1680
|
+
l1ChainId: this.config.l1ChainId,
|
|
1681
|
+
rollupVersion: this.config.rollupVersion
|
|
1682
|
+
}, this.logger.getBindings());
|
|
1683
|
+
const results = await Promise.all(txs.map(async (tx)=>{
|
|
1684
|
+
const result = await validator.validateTx(tx);
|
|
1685
|
+
return result.result !== 'invalid';
|
|
1658
1686
|
}));
|
|
1687
|
+
if (results.some((value)=>value === false)) {
|
|
1688
|
+
throw new Error('Invalid tx detected');
|
|
1689
|
+
}
|
|
1659
1690
|
}
|
|
1660
|
-
/**
|
|
1661
|
-
* Create message validators for the given block number and timestamp.
|
|
1662
|
-
*
|
|
1663
|
-
* Each validator is a pair of a validator and a severity.
|
|
1664
|
-
* If a validator fails, the peer is penalized with the severity of the validator.
|
|
1665
|
-
*
|
|
1666
|
-
* @param currentBlockNumber - The current synced block number.
|
|
1667
|
-
* @param nextSlotTimestamp - The timestamp of the next slot (used to validate txs are not expired).
|
|
1668
|
-
* @returns The message validators.
|
|
1669
|
-
*/ async createMessageValidators(currentBlockNumber, nextSlotTimestamp) {
|
|
1691
|
+
/** Creates the first stage (fast) validators for gossiped transactions. */ async createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp) {
|
|
1670
1692
|
const gasFees = await this.getGasFees(currentBlockNumber);
|
|
1671
|
-
const allowedInSetup =
|
|
1672
|
-
|
|
1673
|
-
|
|
1693
|
+
const allowedInSetup = [
|
|
1694
|
+
...await getDefaultAllowedSetupFunctions(),
|
|
1695
|
+
...this.config.txPublicSetupAllowListExtend ?? []
|
|
1696
|
+
];
|
|
1697
|
+
const blockNumber = BlockNumber(currentBlockNumber + 1);
|
|
1698
|
+
const l1Constants = await this.archiver.getL1Constants();
|
|
1699
|
+
return createFirstStageTxValidationsForGossipedTransactions(nextSlotTimestamp, blockNumber, this.worldStateSynchronizer, gasFees, this.config.l1ChainId, this.config.rollupVersion, protocolContractsHash, this.archiver, !this.config.disableTransactions, allowedInSetup, this.logger.getBindings(), {
|
|
1700
|
+
rollupManaLimit: l1Constants.rollupManaLimit,
|
|
1701
|
+
maxBlockL2Gas: this.config.validateMaxL2BlockGas,
|
|
1702
|
+
maxBlockDAGas: this.config.validateMaxDABlockGas
|
|
1703
|
+
});
|
|
1704
|
+
}
|
|
1705
|
+
/** Creates the second stage (expensive proof verification) validators for gossiped transactions. */ createSecondStageMessageValidators() {
|
|
1706
|
+
return createSecondStageTxValidationsForGossipedTransactions(this.proofVerifier, this.logger.getBindings());
|
|
1674
1707
|
}
|
|
1675
1708
|
/**
|
|
1676
1709
|
* Run validations on a tx.
|
|
@@ -1688,8 +1721,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1688
1721
|
});
|
|
1689
1722
|
// A promise that resolves when all validations have been run
|
|
1690
1723
|
const allValidations = await Promise.all(validationPromises);
|
|
1691
|
-
const
|
|
1692
|
-
if (
|
|
1724
|
+
const failures = allValidations.filter((x)=>!x.isValid);
|
|
1725
|
+
if (failures.length > 0) {
|
|
1726
|
+
// Pick the most severe failure (lowest tolerance = harshest penalty)
|
|
1727
|
+
const failed = maxBy(failures, (f)=>PeerErrorSeverityByHarshness.indexOf(f.severity));
|
|
1693
1728
|
return {
|
|
1694
1729
|
allPassed: false,
|
|
1695
1730
|
failure: {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type Logger } from '@aztec/foundation/log';
|
|
2
2
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
3
|
-
import { Tx
|
|
3
|
+
import { Tx } from '@aztec/stdlib/tx';
|
|
4
4
|
import type { PeerId } from '@libp2p/interface';
|
|
5
|
+
import type { IMissingTxsTracker } from '../../tx_collection/missing_txs_tracker.js';
|
|
5
6
|
import { type BlockTxsSource } from '.././protocols/index.js';
|
|
6
7
|
import type { BatchTxRequesterLibP2PService, BatchTxRequesterOptions } from './interface.js';
|
|
7
8
|
export declare class BatchTxRequester {
|
|
@@ -21,7 +22,7 @@ export declare class BatchTxRequester {
|
|
|
21
22
|
private readonly smartParallelWorkerCount;
|
|
22
23
|
private readonly dumbParallelWorkerCount;
|
|
23
24
|
private readonly txBatchSize;
|
|
24
|
-
constructor(
|
|
25
|
+
constructor(missingTxsTracker: IMissingTxsTracker, blockTxsSource: BlockTxsSource, pinnedPeer: PeerId | undefined, timeoutMs: number, p2pService: BatchTxRequesterLibP2PService, logger?: Logger, dateProvider?: DateProvider, opts?: BatchTxRequesterOptions);
|
|
25
26
|
run(): AsyncGenerator<Tx, Tx | undefined, unknown>;
|
|
26
27
|
static collectAllTxs(generator: AsyncGenerator<Tx, Tx | undefined, unknown>): Promise<Tx[]>;
|
|
27
28
|
private pinnedPeerRequester;
|
|
@@ -44,4 +45,4 @@ export declare class BatchTxRequester {
|
|
|
44
45
|
private unlockSmartRequesterSemaphores;
|
|
45
46
|
private sleepClampedToDeadline;
|
|
46
47
|
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfdHhfcmVxdWVzdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvYmF0Y2hfdHhfcmVxdWVzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBRXZFLE9BQU8sRUFBRSxFQUFFLEVBQW1CLE1BQU0sa0JBQWtCLENBQUM7QUFFdkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVyRixPQUFPLEVBQXFDLEtBQUssY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFRakcsT0FBTyxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsdUJBQXVCLEVBQXlCLE1BQU0sZ0JBQWdCLENBQUM7QUFzQnBILHFCQUFhLGdCQUFnQjtJQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBaUI7SUFDaEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQXFCO0lBQ2hELE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFTO0lBQ25DLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFnQztJQUMzRCxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBUztJQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBZTtJQUM1QyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBMEI7SUFDL0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQWtCO0lBQ3hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUF3QjtJQUNwRCxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBUztJQUNsQyxPQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFhO0lBQ3JELE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFzQjtJQUM5QyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBMkI7SUFDdkQsT0FBTyxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBUztJQUNsRCxPQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFTO0lBQ2pELE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFTO0lBRXJDLFlBQ0UsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQ3JDLGNBQWMsRUFBRSxjQUFjLEVBQzlCLFVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUM5QixTQUFTLEVBQUUsTUFBTSxFQUNqQixVQUFVLEVBQUUsNkJBQTZCLEVBQ3pDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFDZixZQUFZLENBQUMsRUFBRSxZQUFZLEVBQzNCLElBQUksQ0FBQyxFQUFFLHVCQUF1QixFQWtDL0I7SUFLYSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQTZDL0Q7SUFLRCxPQUFvQixhQUFhLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLFNBQVMsRUFBRSxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FTdkc7WUFVYSxtQkFBbUI7WUFrRG5CLGFBQWE7WUF5RGIsY0FBYztZQWdEZCxjQUFjO1lBd0NkLGVBQWU7WUFrRmYsY0FBYztJQW1DNUIsT0FBTyxDQUFDLDBCQUEwQjtZQWlCcEIsNkJBQTZCO1lBWTdCLGlCQUFpQjtJQXFEL0IsT0FBTyxDQUFDLG1CQUFtQjtJQWtDM0IsT0FBTyxDQUFDLG9CQUFvQjtJQU01QixPQUFPLENBQUMsMEJBQTBCO0lBS2xDLE9BQU8sQ0FBQyxjQUFjO0lBTXRCLE9BQU8sQ0FBQyxnQ0FBZ0M7SUFnQnhDLE9BQU8sQ0FBQyxxQkFBcUI7SUF1QjdCLE9BQU8sQ0FBQyxhQUFhO0lBYXJCLE9BQU8sQ0FBQyxVQUFVO0lBYWxCLE9BQU8sQ0FBQyw4QkFBOEI7WUFVeEIsc0JBQXNCO0NBT3JDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch_tx_requester.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/batch_tx_requester.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"batch_tx_requester.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/batch_tx_requester.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EAAE,EAAE,EAAmB,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAErF,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQjG,OAAO,KAAK,EAAE,6BAA6B,EAAE,uBAAuB,EAAyB,MAAM,gBAAgB,CAAC;AAsBpH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2B;IACvD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YACE,iBAAiB,EAAE,kBAAkB,EACrC,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,6BAA6B,EACzC,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,YAAY,EAC3B,IAAI,CAAC,EAAE,uBAAuB,EAkC/B;IAKa,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,CA6C/D;IAKD,OAAoB,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CASvG;YAUa,mBAAmB;YAkDnB,aAAa;YAyDb,cAAc;YAgDd,cAAc;YAwCd,eAAe;YAkFf,cAAc;IAmC5B,OAAO,CAAC,0BAA0B;YAiBpB,6BAA6B;YAY7B,iBAAiB;IAqD/B,OAAO,CAAC,mBAAmB;IAkC3B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,0BAA0B;IAKlC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gCAAgC;IAgBxC,OAAO,CAAC,qBAAqB;IAuB7B,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,8BAA8B;YAUxB,sBAAsB;CAOrC"}
|
|
@@ -11,7 +11,7 @@ import { ReqRespSubProtocol } from '.././interface.js';
|
|
|
11
11
|
import { BlockTxsRequest, BlockTxsResponse } from '.././protocols/index.js';
|
|
12
12
|
import { ReqRespStatus } from '.././status.js';
|
|
13
13
|
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 {
|
|
14
|
+
import { MissingTxMetadataCollection } from './missing_txs.js';
|
|
15
15
|
import { PeerCollection } from './peer_collection.js';
|
|
16
16
|
import { BatchRequestTxValidator } from './tx_validator.js';
|
|
17
17
|
/*
|
|
@@ -47,7 +47,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
47
47
|
smartParallelWorkerCount;
|
|
48
48
|
dumbParallelWorkerCount;
|
|
49
49
|
txBatchSize;
|
|
50
|
-
constructor(
|
|
50
|
+
constructor(missingTxsTracker, blockTxsSource, pinnedPeer, timeoutMs, p2pService, logger, dateProvider, opts){
|
|
51
51
|
this.blockTxsSource = blockTxsSource;
|
|
52
52
|
this.pinnedPeer = pinnedPeer;
|
|
53
53
|
this.timeoutMs = timeoutMs;
|
|
@@ -68,11 +68,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
68
68
|
const badPeerThreshold = this.opts.badPeerThreshold ?? DEFAULT_BATCH_TX_REQUESTER_BAD_PEER_THRESHOLD;
|
|
69
69
|
this.peers = new PeerCollection(initialPeers, this.pinnedPeer, this.dateProvider, badPeerThreshold, this.p2pService.peerScoring);
|
|
70
70
|
}
|
|
71
|
-
|
|
72
|
-
h.toString(),
|
|
73
|
-
new MissingTxMetadata(h)
|
|
74
|
-
]);
|
|
75
|
-
this.txsMetadata = new MissingTxMetadataCollection(entries, this.txBatchSize);
|
|
71
|
+
this.txsMetadata = new MissingTxMetadataCollection(missingTxsTracker, this.txBatchSize);
|
|
76
72
|
this.smartRequesterSemaphore = this.opts.semaphore ?? new Semaphore(0);
|
|
77
73
|
}
|
|
78
74
|
/*
|
|
@@ -528,7 +524,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
528
524
|
}
|
|
529
525
|
/*
|
|
530
526
|
* @returns true if all missing txs have been fetched */ fetchedAllTxs() {
|
|
531
|
-
return
|
|
527
|
+
return this.txsMetadata.getMissingTxHashes().size == 0;
|
|
532
528
|
}
|
|
533
529
|
/*
|
|
534
530
|
* Checks if the BatchTxRequester should stop fetching missing txs
|
|
@@ -543,7 +539,7 @@ import { BatchRequestTxValidator } from './tx_validator.js';
|
|
|
543
539
|
if (aborted) {
|
|
544
540
|
this.unlockSmartRequesterSemaphores();
|
|
545
541
|
}
|
|
546
|
-
return aborted || this.
|
|
542
|
+
return aborted || this.fetchedAllTxs() || this.dateProvider.now() > this.deadline;
|
|
547
543
|
}
|
|
548
544
|
/*
|
|
549
545
|
* Helper function which unlocks all smart requester semaphores
|