@aztec/p2p 0.0.1-commit.7b97ef96e → 0.0.1-commit.7cbc774
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +9 -1
- package/dest/client/factory.d.ts +7 -7
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +39 -32
- package/dest/client/interface.d.ts +19 -17
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +16 -20
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +94 -105
- package/dest/config.d.ts +154 -106
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +134 -40
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +267 -197
- 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 +181 -65
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +6 -4
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +33 -15
- 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 +3 -2
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
- 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 +2 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
- 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 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +4 -4
- 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 +10 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
- 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 +8 -6
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
- 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 +2 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +18 -9
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +51 -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 +90 -19
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
- 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 +26 -44
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +5 -3
- 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 +6 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +3 -2
- 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 +256 -220
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +61 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -4
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +10 -4
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +21 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +36 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +135 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +252 -61
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +99 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
- package/dest/msg_validators/tx_validator/index.d.ts +5 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +4 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +5 -5
- package/dest/services/discv5/discV5_service.d.ts +2 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +35 -8
- package/dest/services/dummy_service.d.ts +12 -17
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +13 -20
- package/dest/services/encoding.d.ts +6 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +14 -8
- package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +21 -4
- package/dest/services/libp2p/instrumentation.d.ts +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -0
- package/dest/services/libp2p/libp2p_service.d.ts +47 -55
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +344 -308
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +40 -11
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +32 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +97 -107
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -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 +5 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- package/dest/services/reqresp/config.d.ts +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/interface.d.ts +16 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -20
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +4 -2
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +43 -215
- package/dest/services/service.d.ts +10 -13
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +2 -23
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +2 -55
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/index.d.ts +2 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +0 -1
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +0 -2
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/tx_collection.d.ts +36 -55
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +275 -119
- package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +2 -2
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/services/tx_file_store/tx_file_store.d.ts +1 -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 +4 -14
- package/dest/services/tx_provider.d.ts +5 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +7 -4
- package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -3
- package/dest/test-helpers/mock-pubsub.d.ts +24 -11
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +45 -45
- package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +17 -19
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +13 -15
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +42 -15
- package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +88 -42
- package/dest/testbench/worker_client_manager.d.ts +12 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +57 -11
- package/dest/util.d.ts +12 -7
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +15 -14
- package/src/bootstrap/bootstrap.ts +9 -1
- package/src/client/factory.ts +74 -49
- package/src/client/interface.ts +20 -30
- package/src/client/p2p_client.ts +108 -156
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +227 -45
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +22 -14
- package/src/mem_pools/tx_pool_v2/README.md +9 -1
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +3 -2
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
- 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 +10 -6
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/index.ts +1 -1
- package/src/mem_pools/tx_pool_v2/interfaces.ts +19 -8
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +130 -23
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +17 -2
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +267 -229
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
- package/src/msg_validators/clock_tolerance.ts +79 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
- package/src/msg_validators/tx_validator/README.md +127 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +6 -15
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +44 -1
- package/src/msg_validators/tx_validator/factory.ts +407 -80
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
- package/src/msg_validators/tx_validator/index.ts +4 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +38 -5
- package/src/services/dummy_service.ts +15 -44
- package/src/services/encoding.ts +14 -7
- package/src/services/gossipsub/topic_score_params.ts +36 -4
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +390 -360
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +46 -11
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/README.md +215 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +97 -119
- package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +2 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -2
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +1 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
- package/src/services/reqresp/reqresp.ts +48 -261
- package/src/services/service.ts +13 -29
- package/src/services/tx_collection/config.ts +3 -80
- package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +331 -176
- package/src/services/tx_collection/tx_collection_sink.ts +2 -2
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +7 -2
- package/src/test-helpers/make-test-p2p-clients.ts +4 -3
- package/src/test-helpers/mock-pubsub.ts +49 -66
- package/src/test-helpers/reqresp-nodes.ts +15 -28
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +54 -29
- package/src/testbench/p2p_client_testbench_worker.ts +91 -61
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +33 -18
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -327
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -211
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -346
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -387
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
package/src/client/p2p_client.ts
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
|
|
2
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
3
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
BlockNumber,
|
|
4
|
+
CheckpointNumber,
|
|
5
|
+
type CheckpointProposalHash,
|
|
6
|
+
SlotNumber,
|
|
7
|
+
} from '@aztec/foundation/branded-types';
|
|
4
8
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
9
|
import { RunningPromise } from '@aztec/foundation/promise';
|
|
6
10
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
7
11
|
import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
|
|
8
12
|
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
9
13
|
import {
|
|
14
|
+
type BlockData,
|
|
15
|
+
type BlockHash,
|
|
10
16
|
type CheckpointId,
|
|
11
17
|
type EthAddress,
|
|
12
18
|
type L2Block,
|
|
@@ -20,13 +26,7 @@ import {
|
|
|
20
26
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
21
27
|
import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
22
28
|
import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
|
|
23
|
-
import {
|
|
24
|
-
type BlockProposal,
|
|
25
|
-
CheckpointAttestation,
|
|
26
|
-
type CheckpointProposal,
|
|
27
|
-
type P2PClientType,
|
|
28
|
-
type TopicType,
|
|
29
|
-
} from '@aztec/stdlib/p2p';
|
|
29
|
+
import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
|
|
30
30
|
import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
31
31
|
import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
32
32
|
|
|
@@ -35,16 +35,11 @@ import type { ENR } from '@nethermindeth/enr';
|
|
|
35
35
|
|
|
36
36
|
import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
|
|
37
37
|
import { TxPoolError } from '../errors/tx-pool.error.js';
|
|
38
|
-
import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
38
|
+
import type { AttestationPoolApi, ProposalsForSlot } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
39
39
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
40
40
|
import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
|
|
41
41
|
import type { AuthRequest, StatusMessage } from '../services/index.js';
|
|
42
|
-
import {
|
|
43
|
-
ReqRespSubProtocol,
|
|
44
|
-
type ReqRespSubProtocolHandler,
|
|
45
|
-
type ReqRespSubProtocolValidators,
|
|
46
|
-
} from '../services/reqresp/interface.js';
|
|
47
|
-
import { chunkTxHashesRequest } from '../services/reqresp/protocols/tx.js';
|
|
42
|
+
import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
|
|
48
43
|
import type {
|
|
49
44
|
DuplicateAttestationInfo,
|
|
50
45
|
DuplicateProposalInfo,
|
|
@@ -60,10 +55,7 @@ import { type P2P, P2PClientState, type P2PSyncState } from './interface.js';
|
|
|
60
55
|
/**
|
|
61
56
|
* The P2P client implementation.
|
|
62
57
|
*/
|
|
63
|
-
export class P2PClient
|
|
64
|
-
extends WithTracer
|
|
65
|
-
implements P2P, P2P<P2PClientType.Prover>
|
|
66
|
-
{
|
|
58
|
+
export class P2PClient extends WithTracer implements P2P {
|
|
67
59
|
/** The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped. */
|
|
68
60
|
private runningPromise!: Promise<void>;
|
|
69
61
|
|
|
@@ -95,7 +87,6 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
95
87
|
private slotMonitor: RunningPromise | undefined;
|
|
96
88
|
|
|
97
89
|
constructor(
|
|
98
|
-
_clientType: T,
|
|
99
90
|
private store: AztecAsyncKVStore,
|
|
100
91
|
private l2BlockSource: L2BlockSource & ContractDataSource,
|
|
101
92
|
mempools: MemPools,
|
|
@@ -107,6 +98,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
107
98
|
private _dateProvider: DateProvider = new DateProvider(),
|
|
108
99
|
private telemetry: TelemetryClient = getTelemetryClient(),
|
|
109
100
|
private log = createLogger('p2p'),
|
|
101
|
+
initialBlockHash: BlockHash,
|
|
110
102
|
) {
|
|
111
103
|
super(telemetry, 'P2PClient');
|
|
112
104
|
|
|
@@ -122,28 +114,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
122
114
|
this.telemetry,
|
|
123
115
|
);
|
|
124
116
|
|
|
125
|
-
|
|
126
|
-
// This can be overridden by the validator client to validate, and it will call getTxsForBlockProposal on its own
|
|
127
|
-
// Note: Validators do NOT attest to individual blocks - attestations are only for checkpoint proposals.
|
|
128
|
-
// TODO(palla/txs): We should not trigger a request for txs on a proposal before fully validating it. We need to bring
|
|
129
|
-
// validator-client code into here so we can validate a proposal is reasonable.
|
|
130
|
-
this.registerBlockProposalHandler(async (block, sender) => {
|
|
131
|
-
this.log.debug(`Received block proposal from ${sender.toString()}`);
|
|
132
|
-
// TODO(palla/txs): Need to subtract validatorReexecuteDeadlineMs from this deadline (see ValidatorClient.getReexecutionDeadline)
|
|
133
|
-
const constants = this.txCollection.getConstants();
|
|
134
|
-
const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(block.slotNumber + 1), constants));
|
|
135
|
-
const deadline = new Date(nextSlotTimestampSeconds * 1000);
|
|
136
|
-
const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.blockHeader.lastArchive.root);
|
|
137
|
-
if (!parentBlock) {
|
|
138
|
-
this.log.debug(`Cannot collect txs for proposal as parent block not found`);
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
const blockNumber = BlockNumber(parentBlock.getBlockNumber() + 1);
|
|
142
|
-
await this.txProvider.getTxsForBlockProposal(block, blockNumber, { pinnedPeer: sender, deadline });
|
|
143
|
-
return true;
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
|
|
117
|
+
this.l2Tips = new L2TipsKVStore(store, 'p2p_client', initialBlockHash);
|
|
147
118
|
this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
|
|
148
119
|
}
|
|
149
120
|
|
|
@@ -197,7 +168,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
197
168
|
const from = BlockNumber(oldFinalizedBlockNum + 1);
|
|
198
169
|
const limit = event.block.number - from + 1;
|
|
199
170
|
if (limit > 0) {
|
|
200
|
-
const oldBlocks = await this.l2BlockSource.
|
|
171
|
+
const oldBlocks = await this.l2BlockSource.getBlocksData({ from, limit });
|
|
201
172
|
await this.handleFinalizedL2Blocks(oldBlocks);
|
|
202
173
|
}
|
|
203
174
|
break;
|
|
@@ -290,8 +261,11 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
290
261
|
});
|
|
291
262
|
}
|
|
292
263
|
|
|
293
|
-
|
|
294
|
-
|
|
264
|
+
// Should never happen: all branches above call initBlockStream()
|
|
265
|
+
if (!this.blockStream) {
|
|
266
|
+
throw new Error('Block stream not initialized');
|
|
267
|
+
}
|
|
268
|
+
this.blockStream.start();
|
|
295
269
|
this.txFileStore?.start();
|
|
296
270
|
|
|
297
271
|
// Start slot monitor to call prepareForSlot when the slot changes
|
|
@@ -305,12 +279,8 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
305
279
|
return this.syncPromise;
|
|
306
280
|
}
|
|
307
281
|
|
|
308
|
-
addReqRespSubProtocol(
|
|
309
|
-
subProtocol
|
|
310
|
-
handler: ReqRespSubProtocolHandler,
|
|
311
|
-
validator: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
312
|
-
): Promise<void> {
|
|
313
|
-
return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
|
|
282
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
283
|
+
return this.p2pService.addReqRespSubProtocol(subProtocol, handler);
|
|
314
284
|
}
|
|
315
285
|
|
|
316
286
|
private initBlockStream(startingBlock?: BlockNumber) {
|
|
@@ -352,7 +322,11 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
352
322
|
/** Triggers a sync to the archiver. Used for testing. */
|
|
353
323
|
public async sync() {
|
|
354
324
|
this.initBlockStream();
|
|
355
|
-
|
|
325
|
+
// Should never happen: initBlockStream() creates blockStream if absent
|
|
326
|
+
if (!this.blockStream) {
|
|
327
|
+
throw new Error('Block stream not initialized');
|
|
328
|
+
}
|
|
329
|
+
await this.blockStream.sync();
|
|
356
330
|
}
|
|
357
331
|
|
|
358
332
|
@trackSpan('p2pClient.broadcastProposal', async proposal => ({
|
|
@@ -390,6 +364,19 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
390
364
|
// Store our own last-block proposal so we can respond to req/resp requests for it.
|
|
391
365
|
await this.attestationPool.tryAddBlockProposal(blockProposal);
|
|
392
366
|
}
|
|
367
|
+
const checkpointCore = proposal.toCore();
|
|
368
|
+
const { count } = await this.attestationPool.tryAddCheckpointProposal(checkpointCore);
|
|
369
|
+
if (count > 1) {
|
|
370
|
+
if (this.config.broadcastEquivocatedProposals) {
|
|
371
|
+
this.log.warn(`Broadcasting equivocated checkpoint proposal for slot ${proposal.slotNumber}`, {
|
|
372
|
+
slot: proposal.slotNumber,
|
|
373
|
+
archive: proposal.archive.toString(),
|
|
374
|
+
count,
|
|
375
|
+
});
|
|
376
|
+
} else {
|
|
377
|
+
throw new Error(`Attempted to broadcast a duplicate checkpoint proposal for slot ${proposal.slotNumber}`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
393
380
|
return this.p2pService.propagate(proposal);
|
|
394
381
|
}
|
|
395
382
|
|
|
@@ -400,10 +387,10 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
400
387
|
|
|
401
388
|
public async getCheckpointAttestationsForSlot(
|
|
402
389
|
slot: SlotNumber,
|
|
403
|
-
|
|
390
|
+
proposalPayloadHash?: CheckpointProposalHash,
|
|
404
391
|
): Promise<CheckpointAttestation[]> {
|
|
405
|
-
return await (
|
|
406
|
-
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
392
|
+
return await (proposalPayloadHash
|
|
393
|
+
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
|
|
407
394
|
: this.attestationPool.getCheckpointAttestationsForSlot(slot));
|
|
408
395
|
}
|
|
409
396
|
|
|
@@ -411,6 +398,10 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
411
398
|
return this.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
412
399
|
}
|
|
413
400
|
|
|
401
|
+
public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
|
|
402
|
+
return this.attestationPool.getProposalsForSlot(slot);
|
|
403
|
+
}
|
|
404
|
+
|
|
414
405
|
public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
|
|
415
406
|
return this.attestationPool.hasBlockProposalsForSlot(slot);
|
|
416
407
|
}
|
|
@@ -421,8 +412,12 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
421
412
|
this.p2pService.registerBlockReceivedCallback(handler);
|
|
422
413
|
}
|
|
423
414
|
|
|
424
|
-
public
|
|
425
|
-
this.p2pService.
|
|
415
|
+
public registerValidatorCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
416
|
+
this.p2pService.registerValidatorCheckpointReceivedCallback(handler);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
public registerAllNodesCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
420
|
+
this.p2pService.registerAllNodesCheckpointReceivedCallback(handler);
|
|
426
421
|
}
|
|
427
422
|
|
|
428
423
|
public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
|
|
@@ -433,34 +428,8 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
433
428
|
this.p2pService.registerDuplicateAttestationCallback(callback);
|
|
434
429
|
}
|
|
435
430
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
*/
|
|
439
|
-
private async requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<Tx[]> {
|
|
440
|
-
const timeoutMs = 8000; // Longer timeout for now
|
|
441
|
-
const maxRetryAttempts = 10; // Keep retrying within the timeout
|
|
442
|
-
const requests = chunkTxHashesRequest(txHashes);
|
|
443
|
-
const maxPeers = Math.min(Math.ceil(requests.length / 3), 10);
|
|
444
|
-
|
|
445
|
-
const txBatches = await this.p2pService.sendBatchRequest(
|
|
446
|
-
ReqRespSubProtocol.TX,
|
|
447
|
-
requests,
|
|
448
|
-
pinnedPeerId,
|
|
449
|
-
timeoutMs,
|
|
450
|
-
maxPeers,
|
|
451
|
-
maxRetryAttempts,
|
|
452
|
-
);
|
|
453
|
-
|
|
454
|
-
const txs = txBatches.flat();
|
|
455
|
-
if (txs.length > 0) {
|
|
456
|
-
await this.txPool.addPendingTxs(txs);
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
const txHashesStr = txHashes.map(tx => tx.toString()).join(', ');
|
|
460
|
-
this.log.debug(`Requested txs ${txHashesStr} (${txs.length} / ${txHashes.length}) from peers`);
|
|
461
|
-
|
|
462
|
-
// We return all transactions, even the not found ones to the caller, such they can handle missing items themselves.
|
|
463
|
-
return txs;
|
|
431
|
+
public registerCheckpointAttestationCallback(callback: (attestation: CheckpointAttestation) => void): void {
|
|
432
|
+
this.p2pService.registerCheckpointAttestationCallback(callback);
|
|
464
433
|
}
|
|
465
434
|
|
|
466
435
|
public async getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]> {
|
|
@@ -530,49 +499,6 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
530
499
|
return this.txPool.hasTxs(txHashes);
|
|
531
500
|
}
|
|
532
501
|
|
|
533
|
-
/**
|
|
534
|
-
* Returns transactions in the transaction pool by hash.
|
|
535
|
-
* If a transaction is not in the pool, it will be requested from the network.
|
|
536
|
-
* @param txHashes - Hashes of the transactions to look for.
|
|
537
|
-
* @returns The txs found, or undefined if not found in the order requested.
|
|
538
|
-
*/
|
|
539
|
-
async getTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<(Tx | undefined)[]> {
|
|
540
|
-
const txs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
|
|
541
|
-
const missingTxHashes = txs
|
|
542
|
-
.map((tx, index) => [tx, index] as const)
|
|
543
|
-
.filter(([tx, _index]) => !tx)
|
|
544
|
-
.map(([_tx, index]) => txHashes[index]);
|
|
545
|
-
|
|
546
|
-
if (missingTxHashes.length === 0) {
|
|
547
|
-
return txs as Tx[];
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
const missingTxs = await this.requestTxsByHash(missingTxHashes, pinnedPeerId);
|
|
551
|
-
// TODO: optimize
|
|
552
|
-
// Merge the found txs in order
|
|
553
|
-
const mergingTxs = txHashes.map(txHash => {
|
|
554
|
-
// Is it in the txs list from the mempool?
|
|
555
|
-
for (const tx of txs) {
|
|
556
|
-
if (tx !== undefined && tx.getTxHash().equals(txHash)) {
|
|
557
|
-
return tx;
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
// Is it in the fetched missing txs?
|
|
562
|
-
// Note: this is an O(n^2) operation, but we expect the number of missing txs to be small.
|
|
563
|
-
for (const tx of missingTxs) {
|
|
564
|
-
if (tx.getTxHash().equals(txHash)) {
|
|
565
|
-
return tx;
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
// Otherwise return undefined
|
|
570
|
-
return undefined;
|
|
571
|
-
});
|
|
572
|
-
|
|
573
|
-
return mergingTxs;
|
|
574
|
-
}
|
|
575
|
-
|
|
576
502
|
/**
|
|
577
503
|
* Returns an archived transaction in the transaction pool by its hash.
|
|
578
504
|
* @param txHash - Hash of the archived transaction to look for.
|
|
@@ -676,13 +602,10 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
676
602
|
*/
|
|
677
603
|
public async getStatus(): Promise<P2PSyncState> {
|
|
678
604
|
const blockNumber = await this.getSyncedLatestBlockNum();
|
|
679
|
-
const blockHash =
|
|
680
|
-
blockNumber
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
.getBlockHeader(blockNumber)
|
|
684
|
-
.then(header => header?.hash())
|
|
685
|
-
.then(hash => hash?.toString());
|
|
605
|
+
const blockHash = await this.l2BlockSource
|
|
606
|
+
.getBlockData({ number: blockNumber })
|
|
607
|
+
.then(data => data?.header.hash())
|
|
608
|
+
.then(hash => hash?.toString());
|
|
686
609
|
|
|
687
610
|
return {
|
|
688
611
|
state: this.currentState,
|
|
@@ -713,13 +636,13 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
713
636
|
|
|
714
637
|
await this.handleMinedBlocks(blocks);
|
|
715
638
|
await this.maybeCallPrepareForSlot();
|
|
716
|
-
await this.
|
|
639
|
+
await this.collectingMissingTxs(blocks);
|
|
717
640
|
const lastBlock = blocks.at(-1)!;
|
|
718
641
|
await this.synchedLatestSlot.set(BigInt(lastBlock.header.getSlot()));
|
|
719
642
|
}
|
|
720
643
|
|
|
721
|
-
/** Request txs for unproven blocks so the prover node
|
|
722
|
-
private async
|
|
644
|
+
/** Request txs for unproven blocks so the prover node can prove. */
|
|
645
|
+
private async collectingMissingTxs(blocks: L2Block[]): Promise<void> {
|
|
723
646
|
try {
|
|
724
647
|
// TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
|
|
725
648
|
// be much lower than the actual one, and it does not update until the pending chain is
|
|
@@ -727,7 +650,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
727
650
|
// are already proven, but the archiver has not yet updated its state. Until this is properly
|
|
728
651
|
// fixed, it is mitigated by the expiration date of collection requests, which depends on
|
|
729
652
|
// the slot number of the block.
|
|
730
|
-
const provenBlockNumber = await this.l2BlockSource.
|
|
653
|
+
const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
|
|
731
654
|
const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
|
|
732
655
|
for (const block of unprovenBlocks) {
|
|
733
656
|
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
@@ -739,7 +662,17 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
739
662
|
`Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
|
|
740
663
|
{ missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
|
|
741
664
|
);
|
|
742
|
-
|
|
665
|
+
// Both `slashDataWithholdingToleranceSlots` and `p2pMissingTxCollectionDeadlineSlots`
|
|
666
|
+
// count *full slots after the block slot* — value N means collection runs until
|
|
667
|
+
// `slotStart(block.slot + N + 1)`. Take the larger of the two so collection never
|
|
668
|
+
// gives up before the data-withholding slash verdict is rendered.
|
|
669
|
+
const blockSlot = block.header.getSlot();
|
|
670
|
+
const toleranceSlots = this.config.slashDataWithholdingToleranceSlots;
|
|
671
|
+
const configuredSlots = this.config.p2pMissingTxCollectionDeadlineSlots ?? 0;
|
|
672
|
+
const deadlineSlot = SlotNumber(blockSlot + Math.max(toleranceSlots, configuredSlots) + 1);
|
|
673
|
+
const deadlineSeconds = getTimestampForSlot(deadlineSlot, this.epochCache.getL1Constants());
|
|
674
|
+
const deadline = new Date(Number(deadlineSeconds) * 1000);
|
|
675
|
+
await this.txCollection.collectFastForBlock(block, missingTxHashes, { deadline });
|
|
743
676
|
}
|
|
744
677
|
}
|
|
745
678
|
} catch (err) {
|
|
@@ -752,7 +685,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
752
685
|
* @param blocks - A list of finalized L2 blocks.
|
|
753
686
|
* @returns Empty promise.
|
|
754
687
|
*/
|
|
755
|
-
private async handleFinalizedL2Blocks(blocks:
|
|
688
|
+
private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
|
|
756
689
|
if (!blocks.length) {
|
|
757
690
|
return;
|
|
758
691
|
}
|
|
@@ -775,31 +708,50 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
775
708
|
}
|
|
776
709
|
|
|
777
710
|
/**
|
|
778
|
-
* Returns true if the prune
|
|
779
|
-
* If the
|
|
780
|
-
* If they differ, the prune spans across checkpoints (epoch prune).
|
|
711
|
+
* Returns true if the prune is an epoch prune (new checkpoint number is less than old).
|
|
712
|
+
* If the checkpoint number stays the same or increases, the prune is within a checkpoint.
|
|
781
713
|
*/
|
|
782
714
|
private async isEpochPrune(newCheckpoint: CheckpointId): Promise<boolean> {
|
|
783
715
|
const tips = await this.l2Tips.getL2Tips();
|
|
784
716
|
const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
|
|
785
|
-
if (oldCheckpointNumber <= CheckpointNumber.
|
|
717
|
+
if (oldCheckpointNumber <= CheckpointNumber.INITIAL) {
|
|
786
718
|
return false;
|
|
787
719
|
}
|
|
788
|
-
const
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
720
|
+
const newCheckpointNumber = newCheckpoint.number;
|
|
721
|
+
// We check that the new checkpoint number is less than the old checkpoint number in order to consider it an epoch prune.
|
|
722
|
+
// To be more certain that it is an epoch prune, we will check that at least 2 checkpoints were removed.
|
|
723
|
+
// This means we should avoid thinking checkpoints removed by L1 re-orgs are epoch prunes
|
|
724
|
+
const thresholdForEpochPrune = CheckpointNumber(oldCheckpointNumber - 2);
|
|
725
|
+
const isEpochPrune = newCheckpointNumber <= thresholdForEpochPrune;
|
|
726
|
+
if (isEpochPrune) {
|
|
727
|
+
this.log.info(`Detected epoch prune to ${newCheckpointNumber}`, {
|
|
728
|
+
oldCheckpointNumber,
|
|
729
|
+
newCheckpointNumber,
|
|
730
|
+
thresholdForEpochPrune,
|
|
731
|
+
});
|
|
732
|
+
}
|
|
792
733
|
return isEpochPrune;
|
|
793
734
|
}
|
|
794
735
|
|
|
795
736
|
/** Checks if the slot has changed and calls prepareForSlot if so. */
|
|
796
737
|
private async maybeCallPrepareForSlot(): Promise<void> {
|
|
797
|
-
|
|
798
|
-
|
|
738
|
+
// If we have a proposed checkpoint available, we want to prepare the target slot - otherwise we prepare the current slot
|
|
739
|
+
const l2Tips = await this.l2Tips.getL2Tips();
|
|
740
|
+
const hasProposedCheckpoint = l2Tips.proposedCheckpoint.checkpoint.number > l2Tips.checkpointed.checkpoint.number;
|
|
741
|
+
|
|
742
|
+
let slot;
|
|
743
|
+
if (this.epochCache.isProposerPipeliningEnabled() && hasProposedCheckpoint) {
|
|
744
|
+
const { targetSlot } = this.epochCache.getTargetAndNextSlot();
|
|
745
|
+
slot = targetSlot;
|
|
746
|
+
} else {
|
|
747
|
+
const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
|
|
748
|
+
slot = currentSlot;
|
|
749
|
+
}
|
|
750
|
+
if (slot <= this.lastSlotProcessed) {
|
|
799
751
|
return;
|
|
800
752
|
}
|
|
801
|
-
this.lastSlotProcessed =
|
|
802
|
-
await this.txPool.prepareForSlot(
|
|
753
|
+
this.lastSlotProcessed = slot;
|
|
754
|
+
await this.txPool.prepareForSlot(slot);
|
|
803
755
|
}
|
|
804
756
|
|
|
805
757
|
private async startServiceIfSynched() {
|
|
@@ -839,8 +791,8 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
839
791
|
this.log.debug(`Moved from state ${P2PClientState[oldState]} to ${P2PClientState[this.currentState]}`);
|
|
840
792
|
}
|
|
841
793
|
|
|
842
|
-
public
|
|
843
|
-
return this.p2pService.
|
|
794
|
+
public validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void> {
|
|
795
|
+
return this.p2pService.validateTxsReceivedInBlockProposal(txs);
|
|
844
796
|
}
|
|
845
797
|
|
|
846
798
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# BatchTxRequester Benchmarks
|
|
2
2
|
|
|
3
|
-
This benchmark suite measures **how quickly a proposer node can fetch missing transactions from P2P peers** when building a block proposal
|
|
3
|
+
This benchmark suite measures **how quickly a proposer node can fetch missing transactions from P2P peers** when building a block proposal under several controlled "who-has-which-txs" distributions.
|
|
4
4
|
|
|
5
5
|
## Purpose
|
|
6
6
|
|
|
@@ -10,12 +10,6 @@ This benchmark answers:
|
|
|
10
10
|
|
|
11
11
|
- How long does it take to fetch **N missing txs** (N ∈ **{10, 50, 100, 500}**)?
|
|
12
12
|
- How do different **peer availability patterns** affect performance?
|
|
13
|
-
- Which collector strategy performs better under each pattern?
|
|
14
|
-
|
|
15
|
-
The suite compares two collectors:
|
|
16
|
-
|
|
17
|
-
- **`BatchTxRequesterCollector`** (collector type: `batch-requester`)
|
|
18
|
-
- **`SendBatchRequestCollector`** (collector type: `send-batch-request`)
|
|
19
13
|
|
|
20
14
|
## Architecture
|
|
21
15
|
|
|
@@ -24,7 +18,7 @@ The benchmark runs a small simulated network on localhost:
|
|
|
24
18
|
```
|
|
25
19
|
┌─────────────────────────────────────────────────────────────────────┐
|
|
26
20
|
│ Test Process (Driver) │
|
|
27
|
-
│ p2p_client.
|
|
21
|
+
│ p2p_client.batch_tx_requester.bench.test.ts │
|
|
28
22
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
29
23
|
│ │ WorkerClientManager │ │
|
|
30
24
|
│ │ (src/testbench/worker_client_manager.ts) │ │
|
|
@@ -34,7 +28,7 @@ The benchmark runs a small simulated network on localhost:
|
|
|
34
28
|
│ ▼ ▼ ▼ │
|
|
35
29
|
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
|
|
36
30
|
│ │ Worker 0 │◄──────►│ Worker 1 │◄──────►│ Worker N-1│ │
|
|
37
|
-
│ │
|
|
31
|
+
│ │(Aggregator│ P2P │(Responder)│ P2P │(Responder)│ │
|
|
38
32
|
│ │ Node) │ │ │ │ │ │
|
|
39
33
|
│ │ TxPool:[] │ │ TxPool: │ │ TxPool: │ │
|
|
40
34
|
│ │ │ │ [txs...] │ │ [txs...] │ │
|
|
@@ -54,12 +48,12 @@ Using separate OS processes makes the setup closer to real networking behavior (
|
|
|
54
48
|
|
|
55
49
|
The network is intentionally asymmetric:
|
|
56
50
|
|
|
57
|
-
- **Worker 0 is the
|
|
51
|
+
- **Worker 0 is the aggregator/proposer node**
|
|
58
52
|
- Starts with an **empty tx pool** (`[]`)
|
|
59
|
-
- Is the only worker instructed to run
|
|
53
|
+
- Is the only worker instructed to run `BatchTxRequester` for each `BENCH_REQRESP` command
|
|
60
54
|
- **Workers 1..N-1 are responder peers**
|
|
61
55
|
- Locally generate and filter txs according to the distribution pattern
|
|
62
|
-
- Respond to req/resp queries made by Worker 0's
|
|
56
|
+
- Respond to req/resp queries made by Worker 0's `BatchTxRequester`
|
|
63
57
|
|
|
64
58
|
This models a proposer that has only `txHashes` in a proposal and must fetch the full tx bodies from the network.
|
|
65
59
|
|
|
@@ -72,7 +66,7 @@ Each benchmark case generates `missingTxCount` mock txs and assigns them to peer
|
|
|
72
66
|
**Every responder peer has every transaction.**
|
|
73
67
|
|
|
74
68
|
- Simulates the best-case: high replication / high gossip success
|
|
75
|
-
- Expectation:
|
|
69
|
+
- Expectation: the requester should quickly succeed; differences mostly reflect requester overhead and batching strategy
|
|
76
70
|
|
|
77
71
|
### `sparse`
|
|
78
72
|
|
|
@@ -81,7 +75,7 @@ Each benchmark case generates `missingTxCount` mock txs and assigns them to peer
|
|
|
81
75
|
Each responder is bucketed and holds txs whose index falls into its bucket or the "next" bucket (striped by tx index).
|
|
82
76
|
|
|
83
77
|
- Simulates partial propagation, churn, or uneven mempool convergence
|
|
84
|
-
- Expectation:
|
|
78
|
+
- Expectation: the requester must query multiple peers and cope with "misses"
|
|
85
79
|
|
|
86
80
|
### `pinned-only`
|
|
87
81
|
|
|
@@ -92,33 +86,13 @@ Each responder is bucketed and holds txs whose index falls into its bucket or th
|
|
|
92
86
|
|
|
93
87
|
> **Guardrail:** the pinned peer index must be within `(0, numberOfPeers)` (Worker 0 cannot be pinned).
|
|
94
88
|
|
|
95
|
-
## Collectors Under Test
|
|
96
|
-
|
|
97
|
-
### `BatchTxRequesterCollector` (`batch-requester`)
|
|
98
|
-
|
|
99
|
-
```typescript
|
|
100
|
-
new BatchTxRequesterCollector(p2pService, logger, new DateProvider())
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
Uses the P2P service plus internal logic to fetch missing txs, coordinating requests in a batched or staged way.
|
|
104
|
-
|
|
105
|
-
### `SendBatchRequestCollector` (`send-batch-request`)
|
|
106
|
-
|
|
107
|
-
```typescript
|
|
108
|
-
const maxPeers = 10;
|
|
109
|
-
const maxRetryAttempts = Math.max(peerIds.length, 3);
|
|
110
|
-
new SendBatchRequestCollector(p2pService, maxPeers, maxRetryAttempts)
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
Explicitly caps the number of peers it will involve (`maxPeers`) and uses a retry budget derived from peer count.
|
|
114
|
-
|
|
115
89
|
## Test Parameters
|
|
116
90
|
|
|
117
91
|
| Parameter | Value | Description |
|
|
118
92
|
|-----------|-------|-------------|
|
|
119
93
|
| `PEERS_PER_RUN` | 30 | Number of worker processes spawned |
|
|
120
94
|
| `MISSING_TX_COUNTS` | 10, 50, 100, 500 | Number of missing transactions to fetch |
|
|
121
|
-
| `TIMEOUT_MS` | 30,000 ms |
|
|
95
|
+
| `TIMEOUT_MS` | 30,000 ms | Per-case timeout for the requester |
|
|
122
96
|
| `TEST_TIMEOUT_MS` | 600,000 ms | Overall Jest timeout (10 minutes) |
|
|
123
97
|
|
|
124
98
|
## Running
|
|
@@ -127,13 +101,13 @@ From the p2p package:
|
|
|
127
101
|
|
|
128
102
|
```bash
|
|
129
103
|
cd yarn-project/p2p
|
|
130
|
-
yarn test src/client/test/
|
|
104
|
+
yarn test src/client/test/p2p_client.batch_tx_requester.bench.test.ts
|
|
131
105
|
```
|
|
132
106
|
|
|
133
107
|
Or from repo root:
|
|
134
108
|
|
|
135
109
|
```bash
|
|
136
|
-
yarn test p2p_client.
|
|
110
|
+
yarn test p2p_client.batch_tx_requester.bench.test.ts
|
|
137
111
|
```
|
|
138
112
|
|
|
139
113
|
The benchmark is intentionally long due to spawning many processes and running multiple cases.
|
|
@@ -145,14 +119,12 @@ The benchmark is intentionally long due to spawning many processes and running m
|
|
|
145
119
|
If no env vars are set, the suite prints a table:
|
|
146
120
|
|
|
147
121
|
```
|
|
148
|
-
|
|
|
149
|
-
|
|
150
|
-
|
|
|
151
|
-
|
|
|
122
|
+
| Distribution | Missing | Duration (ms) | Fetched | Success |
|
|
123
|
+
|--------------|---------|---------------|---------|---------|
|
|
124
|
+
| pinned-only | 10 | 123 | 10 | Yes |
|
|
125
|
+
| pinned-only | 50 | 145 | 50 | Yes |
|
|
152
126
|
```
|
|
153
127
|
|
|
154
|
-
Plus a comparison summary stating which collector was faster per `(distribution, missing)` pair.
|
|
155
|
-
|
|
156
128
|
### JSON metrics (for CI/dashboards)
|
|
157
129
|
|
|
158
130
|
```bash
|
|
@@ -160,8 +132,8 @@ BENCH_OUTPUT=/path/results.json yarn test ...
|
|
|
160
132
|
```
|
|
161
133
|
|
|
162
134
|
Writes JSON metrics like:
|
|
163
|
-
- `
|
|
164
|
-
- `
|
|
135
|
+
- `BatchTxRequester/<distribution>/missing_<N>/duration` (ms)
|
|
136
|
+
- `BatchTxRequester/<distribution>/missing_<N>/fetched` (txs)
|
|
165
137
|
|
|
166
138
|
### Markdown file output
|
|
167
139
|
|
|
@@ -175,14 +147,14 @@ Writes the pretty table + summary to disk.
|
|
|
175
147
|
|
|
176
148
|
For each case the benchmark records:
|
|
177
149
|
|
|
178
|
-
- `durationMs`: wall-clock time spent inside the
|
|
179
|
-
- `fetchedCount`: how many txs were returned by the
|
|
150
|
+
- `durationMs`: wall-clock time spent inside the requester call
|
|
151
|
+
- `fetchedCount`: how many txs were returned by the requester
|
|
180
152
|
- `success`: `fetchedCount === missingTxCount`
|
|
181
153
|
|
|
182
154
|
**Guidelines:**
|
|
183
155
|
|
|
184
156
|
- **Always check `Success` first.** A faster run that fetched fewer txs is not a win.
|
|
185
|
-
- Compare
|
|
157
|
+
- Compare runs **within the same distribution + missing count** only.
|
|
186
158
|
- Expect `pinned-only` to highlight pinned-peer behavior (fast if pinned peer is used effectively; slow if the algorithm wastes time sampling other peers).
|
|
187
159
|
- Expect `sparse` to be the most "network-like" stress case, since many peers won't have each requested tx.
|
|
188
160
|
|
|
@@ -193,7 +165,7 @@ Inside each worker, the benchmark intentionally reduces variability:
|
|
|
193
165
|
- **Unlimited rate limits** are installed so the req/resp rate limiter doesn't dominate results
|
|
194
166
|
- **Deterministic tx generation** ensures all workers see the same tx set without large IPC payloads
|
|
195
167
|
|
|
196
|
-
This makes the benchmark better for
|
|
168
|
+
This makes the benchmark better for tracking regressions, but it is **not** a perfect model of production networking conditions.
|
|
197
169
|
|
|
198
170
|
## Limitations
|
|
199
171
|
|
|
@@ -207,9 +179,7 @@ This benchmark does **not** measure:
|
|
|
207
179
|
|
|
208
180
|
| File | Purpose |
|
|
209
181
|
|------|---------|
|
|
210
|
-
| `p2p_client.
|
|
211
|
-
| `proposal_tx_collector_worker.ts` | Collector-specific worker implementation |
|
|
212
|
-
| `proposal_tx_collector_worker_protocol.ts` | IPC message types and serialization |
|
|
182
|
+
| `p2p_client.batch_tx_requester.bench.test.ts` | Test suite (cases, distributions, output formatting) |
|
|
213
183
|
| `src/testbench/worker_client_manager.ts` | Worker process manager (forking, IPC, orchestration) |
|
|
214
184
|
| `src/testbench/p2p_client_testbench_worker.ts` | General testbench worker implementation |
|
|
215
185
|
| `src/test-helpers/testbench-utils.ts` | Shared mocks and utilities (InMemoryTxPool, InMemoryAttestationPool, etc.) |
|