@aztec/p2p 0.0.1-commit.42ee6df9b → 0.0.1-commit.431c48d
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 +7 -6
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +22 -6
- package/dest/client/factory.d.ts +4 -3
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +32 -23
- package/dest/client/interface.d.ts +44 -11
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +34 -19
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +119 -59
- package/dest/config.d.ts +150 -107
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +77 -26
- package/dest/errors/reqresp.error.d.ts +9 -16
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +10 -17
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +98 -56
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +270 -198
- 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 +218 -59
- 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/instrumentation.d.ts +9 -4
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +28 -9
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +10 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +29 -20
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
- 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 -3
- 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 +3 -1
- 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 +64 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +6 -7
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
- 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 +6 -5
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +11 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +24 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +33 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +5 -2
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +8 -5
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -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 +31 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +16 -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 +83 -32
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +50 -6
- 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 +243 -127
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -16
- 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/proposal_validator/block_proposal_validator.d.ts +8 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +2 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +8 -3
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +8 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +25 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +85 -15
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
- 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/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 +1 -0
- package/dest/msg_validators/tx_validator/factory.d.ts +14 -15
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +29 -16
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +47 -10
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +65 -48
- 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/phases_validator.js +2 -2
- 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 +68 -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 +13 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +119 -23
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +18 -18
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +19 -18
- package/dest/services/encoding.d.ts +19 -6
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +25 -15
- package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +4 -14
- package/dest/services/libp2p/instrumentation.d.ts +6 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +21 -0
- package/dest/services/libp2p/libp2p_service.d.ts +40 -43
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +370 -276
- package/dest/services/peer-manager/peer_manager.d.ts +26 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +103 -17
- package/dest/services/peer-manager/peer_scoring.d.ts +30 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +74 -3
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -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 +35 -44
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +8 -5
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- 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 +15 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +11 -0
- 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/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- 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 +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
- 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 +42 -24
- 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_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 +3 -13
- 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 +59 -209
- package/dest/services/service.d.ts +41 -19
- 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/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/tx_collection.d.ts +35 -51
- 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 +1 -1
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +4 -1
- 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 +3 -1
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +3 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -2
- package/dest/test-helpers/mock-pubsub.d.ts +33 -9
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +57 -44
- package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +16 -18
- 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 +15 -14
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +28 -13
- 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 +60 -27
- package/dest/testbench/worker_client_manager.d.ts +10 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +51 -8
- package/dest/util.d.ts +11 -6
- 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 +17 -17
- package/src/bootstrap/bootstrap.ts +17 -3
- package/src/client/factory.ts +48 -24
- package/src/client/interface.ts +39 -17
- package/src/client/p2p_client.ts +135 -92
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +159 -34
- package/src/errors/reqresp.error.ts +13 -19
- package/src/mem_pools/attestation_pool/attestation_pool.ts +325 -242
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +238 -63
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/instrumentation.ts +18 -12
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -4
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
- 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 +67 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -7
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -6
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +27 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +31 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +13 -7
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +35 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +94 -31
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +270 -133
- package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -15
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +15 -3
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -3
- package/src/msg_validators/proposal_validator/proposal_validator.ts +94 -12
- package/src/msg_validators/tx_validator/README.md +13 -3
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
- 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/data_validator.ts +2 -0
- package/src/msg_validators/tx_validator/factory.ts +37 -20
- package/src/msg_validators/tx_validator/gas_validator.ts +99 -54
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +2 -2
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +126 -14
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +25 -44
- package/src/services/encoding.ts +28 -20
- package/src/services/gossipsub/README.md +33 -11
- package/src/services/gossipsub/topic_score_params.ts +9 -18
- package/src/services/libp2p/instrumentation.ts +22 -0
- package/src/services/libp2p/libp2p_service.ts +433 -302
- package/src/services/peer-manager/peer_manager.ts +112 -16
- package/src/services/peer-manager/peer_scoring.ts +81 -3
- package/src/services/reqresp/README.md +2 -37
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +39 -52
- package/src/services/reqresp/batch-tx-requester/interface.ts +11 -4
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +19 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
- 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_limits.ts +3 -13
- package/src/services/reqresp/reqresp.ts +69 -252
- package/src/services/service.ts +48 -37
- 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/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/tx_collection.ts +330 -173
- package/src/services/tx_collection/tx_collection_sink.ts +2 -2
- package/src/services/tx_collection/tx_source.ts +2 -1
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +5 -0
- package/src/test-helpers/make-test-p2p-clients.ts +3 -0
- package/src/test-helpers/mock-pubsub.ts +61 -60
- package/src/test-helpers/reqresp-nodes.ts +12 -22
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +35 -26
- package/src/testbench/p2p_client_testbench_worker.ts +68 -44
- package/src/testbench/worker_client_manager.ts +59 -19
- package/src/util.ts +32 -17
- 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 -315
- 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/msg_validators/clock_tolerance.d.ts +0 -21
- package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
- package/dest/msg_validators/clock_tolerance.js +0 -38
- 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 -51
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -311
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -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 -355
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/msg_validators/clock_tolerance.ts +0 -52
- 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 -361
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -108
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
package/src/client/p2p_client.ts
CHANGED
|
@@ -1,24 +1,31 @@
|
|
|
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
|
-
import {
|
|
9
|
+
import { type PromiseWithResolvers, promiseWithResolvers } 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,
|
|
18
|
+
EventDrivenL2BlockStream,
|
|
12
19
|
type L2Block,
|
|
13
20
|
type L2BlockId,
|
|
14
21
|
type L2BlockSource,
|
|
15
|
-
L2BlockStream,
|
|
16
22
|
type L2BlockStreamEvent,
|
|
17
|
-
type L2Tips,
|
|
18
23
|
type L2TipsStore,
|
|
24
|
+
type LocalL2Tips,
|
|
19
25
|
} from '@aztec/stdlib/block';
|
|
20
26
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
21
|
-
import {
|
|
27
|
+
import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
28
|
+
import { type GetTxByHashOptions, type P2PConnectivity, type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
|
|
22
29
|
import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
|
|
23
30
|
import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
24
31
|
import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
@@ -28,18 +35,15 @@ import type { ENR } from '@nethermindeth/enr';
|
|
|
28
35
|
|
|
29
36
|
import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
|
|
30
37
|
import { TxPoolError } from '../errors/tx-pool.error.js';
|
|
31
|
-
import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
38
|
+
import type { AttestationPoolApi, ProposalsForSlot } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
32
39
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
33
40
|
import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
|
|
34
41
|
import type { AuthRequest, StatusMessage } from '../services/index.js';
|
|
35
|
-
import {
|
|
36
|
-
ReqRespSubProtocol,
|
|
37
|
-
type ReqRespSubProtocolHandler,
|
|
38
|
-
type ReqRespSubProtocolValidators,
|
|
39
|
-
} from '../services/reqresp/interface.js';
|
|
42
|
+
import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
|
|
40
43
|
import type {
|
|
41
44
|
DuplicateAttestationInfo,
|
|
42
45
|
DuplicateProposalInfo,
|
|
46
|
+
OversizedProposalInfo,
|
|
43
47
|
P2PBlockReceivedCallback,
|
|
44
48
|
P2PCheckpointReceivedCallback,
|
|
45
49
|
P2PService,
|
|
@@ -58,7 +62,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
58
62
|
|
|
59
63
|
private currentState = P2PClientState.IDLE;
|
|
60
64
|
private syncPromise = Promise.resolve();
|
|
61
|
-
private
|
|
65
|
+
private syncResolvers?: PromiseWithResolvers<void> = undefined;
|
|
62
66
|
private latestBlockNumberAtStart = -1;
|
|
63
67
|
private provenBlockNumberAtStart = -1;
|
|
64
68
|
private finalizedBlockNumberAtStart = -1;
|
|
@@ -71,7 +75,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
71
75
|
|
|
72
76
|
private config: P2PConfig;
|
|
73
77
|
|
|
74
|
-
private blockStream:
|
|
78
|
+
private blockStream: EventDrivenL2BlockStream | undefined;
|
|
75
79
|
|
|
76
80
|
private txProvider: TxProvider;
|
|
77
81
|
|
|
@@ -80,9 +84,6 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
80
84
|
/** Tracks the last slot for which we called prepareForSlot */
|
|
81
85
|
private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
|
|
82
86
|
|
|
83
|
-
/** Polls for slot changes and calls prepareForSlot on the tx pool */
|
|
84
|
-
private slotMonitor: RunningPromise | undefined;
|
|
85
|
-
|
|
86
87
|
constructor(
|
|
87
88
|
private store: AztecAsyncKVStore,
|
|
88
89
|
private l2BlockSource: L2BlockSource & ContractDataSource,
|
|
@@ -95,6 +96,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
95
96
|
private _dateProvider: DateProvider = new DateProvider(),
|
|
96
97
|
private telemetry: TelemetryClient = getTelemetryClient(),
|
|
97
98
|
private log = createLogger('p2p'),
|
|
99
|
+
initialBlockHash: BlockHash,
|
|
98
100
|
) {
|
|
99
101
|
super(telemetry, 'P2PClient');
|
|
100
102
|
|
|
@@ -110,7 +112,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
110
112
|
this.telemetry,
|
|
111
113
|
);
|
|
112
114
|
|
|
113
|
-
this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
|
|
115
|
+
this.l2Tips = new L2TipsKVStore(store, 'p2p_client', initialBlockHash);
|
|
114
116
|
this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
|
|
115
117
|
}
|
|
116
118
|
|
|
@@ -135,6 +137,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
135
137
|
return Promise.resolve(this.p2pService.getPeers(includePending));
|
|
136
138
|
}
|
|
137
139
|
|
|
140
|
+
public getP2PConnectivity(): Promise<P2PConnectivity> {
|
|
141
|
+
return Promise.resolve(this.p2pService.getP2PConnectivity());
|
|
142
|
+
}
|
|
143
|
+
|
|
138
144
|
public getGossipMeshPeerCount(topicType: TopicType): Promise<number> {
|
|
139
145
|
return Promise.resolve(this.p2pService.getGossipMeshPeerCount(topicType));
|
|
140
146
|
}
|
|
@@ -148,7 +154,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
148
154
|
this.p2pService.updateConfig(config);
|
|
149
155
|
}
|
|
150
156
|
|
|
151
|
-
public getL2Tips(): Promise<
|
|
157
|
+
public getL2Tips(): Promise<LocalL2Tips> {
|
|
152
158
|
return this.l2Tips.getL2Tips();
|
|
153
159
|
}
|
|
154
160
|
|
|
@@ -164,7 +170,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
164
170
|
const from = BlockNumber(oldFinalizedBlockNum + 1);
|
|
165
171
|
const limit = event.block.number - from + 1;
|
|
166
172
|
if (limit > 0) {
|
|
167
|
-
const oldBlocks = await this.l2BlockSource.
|
|
173
|
+
const oldBlocks = await this.l2BlockSource.getBlocksData({ from, limit });
|
|
168
174
|
await this.handleFinalizedL2Blocks(oldBlocks);
|
|
169
175
|
}
|
|
170
176
|
break;
|
|
@@ -174,10 +180,12 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
174
180
|
break;
|
|
175
181
|
case 'chain-pruned':
|
|
176
182
|
this.txCollection.stopCollectingForBlocksAfter(event.block.number);
|
|
177
|
-
await this.handlePruneL2Blocks(event.block, event.checkpoint);
|
|
183
|
+
await this.handlePruneL2Blocks(event.block, event.checkpointed.checkpoint);
|
|
178
184
|
break;
|
|
179
185
|
case 'chain-checkpointed':
|
|
180
186
|
break;
|
|
187
|
+
case 'chain-proposed':
|
|
188
|
+
break;
|
|
181
189
|
default: {
|
|
182
190
|
const _: never = event;
|
|
183
191
|
break;
|
|
@@ -236,9 +244,8 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
236
244
|
// this gets resolved on `startServiceIfSynched`
|
|
237
245
|
this.initBlockStream();
|
|
238
246
|
this.setCurrentState(P2PClientState.SYNCHING);
|
|
239
|
-
this.
|
|
240
|
-
|
|
241
|
-
});
|
|
247
|
+
this.syncResolvers = promiseWithResolvers<void>();
|
|
248
|
+
this.syncPromise = this.syncResolvers.promise;
|
|
242
249
|
this.log.info(`Initiating p2p sync from ${syncedLatestBlock}`, {
|
|
243
250
|
syncedLatestBlock,
|
|
244
251
|
syncedProvenBlock,
|
|
@@ -257,33 +264,24 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
257
264
|
});
|
|
258
265
|
}
|
|
259
266
|
|
|
260
|
-
|
|
261
|
-
|
|
267
|
+
// Should never happen: all branches above call initBlockStream()
|
|
268
|
+
if (!this.blockStream) {
|
|
269
|
+
throw new Error('Block stream not initialized');
|
|
270
|
+
}
|
|
271
|
+
this.blockStream.start();
|
|
262
272
|
this.txFileStore?.start();
|
|
263
273
|
|
|
264
|
-
// Start slot monitor to call prepareForSlot when the slot changes
|
|
265
|
-
this.slotMonitor = new RunningPromise(
|
|
266
|
-
() => this.maybeCallPrepareForSlot(),
|
|
267
|
-
this.log,
|
|
268
|
-
this.config.slotCheckIntervalMS,
|
|
269
|
-
);
|
|
270
|
-
this.slotMonitor.start();
|
|
271
|
-
|
|
272
274
|
return this.syncPromise;
|
|
273
275
|
}
|
|
274
276
|
|
|
275
|
-
addReqRespSubProtocol(
|
|
276
|
-
subProtocol
|
|
277
|
-
handler: ReqRespSubProtocolHandler,
|
|
278
|
-
validator: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
279
|
-
): Promise<void> {
|
|
280
|
-
return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
|
|
277
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
278
|
+
return this.p2pService.addReqRespSubProtocol(subProtocol, handler);
|
|
281
279
|
}
|
|
282
280
|
|
|
283
281
|
private initBlockStream(startingBlock?: BlockNumber) {
|
|
284
282
|
if (!this.blockStream) {
|
|
285
283
|
const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
|
|
286
|
-
this.blockStream = new
|
|
284
|
+
this.blockStream = new EventDrivenL2BlockStream(
|
|
287
285
|
this.l2BlockSource,
|
|
288
286
|
this,
|
|
289
287
|
this,
|
|
@@ -299,8 +297,6 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
299
297
|
*/
|
|
300
298
|
public async stop() {
|
|
301
299
|
this.log.debug('Stopping p2p client...');
|
|
302
|
-
await this.slotMonitor?.stop();
|
|
303
|
-
this.log.debug('Stopped slot monitor');
|
|
304
300
|
await tryStop(this.txCollection);
|
|
305
301
|
this.log.debug('Stopped tx collection service');
|
|
306
302
|
await this.txFileStore?.stop();
|
|
@@ -319,7 +315,11 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
319
315
|
/** Triggers a sync to the archiver. Used for testing. */
|
|
320
316
|
public async sync() {
|
|
321
317
|
this.initBlockStream();
|
|
322
|
-
|
|
318
|
+
// Should never happen: initBlockStream() creates blockStream if absent
|
|
319
|
+
if (!this.blockStream) {
|
|
320
|
+
throw new Error('Block stream not initialized');
|
|
321
|
+
}
|
|
322
|
+
await this.blockStream.sync();
|
|
323
323
|
}
|
|
324
324
|
|
|
325
325
|
@trackSpan('p2pClient.broadcastProposal', async proposal => ({
|
|
@@ -357,8 +357,19 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
357
357
|
// Store our own last-block proposal so we can respond to req/resp requests for it.
|
|
358
358
|
await this.attestationPool.tryAddBlockProposal(blockProposal);
|
|
359
359
|
}
|
|
360
|
-
|
|
361
|
-
await this.
|
|
360
|
+
const checkpointCore = proposal.toCore();
|
|
361
|
+
const { count } = await this.attestationPool.tryAddCheckpointProposal(checkpointCore);
|
|
362
|
+
if (count > 1) {
|
|
363
|
+
if (this.config.broadcastEquivocatedProposals) {
|
|
364
|
+
this.log.warn(`Broadcasting equivocated checkpoint proposal for slot ${proposal.slotNumber}`, {
|
|
365
|
+
slot: proposal.slotNumber,
|
|
366
|
+
archive: proposal.archive.toString(),
|
|
367
|
+
count,
|
|
368
|
+
});
|
|
369
|
+
} else {
|
|
370
|
+
throw new Error(`Attempted to broadcast a duplicate checkpoint proposal for slot ${proposal.slotNumber}`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
362
373
|
return this.p2pService.propagate(proposal);
|
|
363
374
|
}
|
|
364
375
|
|
|
@@ -369,10 +380,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
369
380
|
|
|
370
381
|
public async getCheckpointAttestationsForSlot(
|
|
371
382
|
slot: SlotNumber,
|
|
372
|
-
|
|
383
|
+
proposalPayloadHash?: CheckpointProposalHash,
|
|
373
384
|
): Promise<CheckpointAttestation[]> {
|
|
374
|
-
return await (
|
|
375
|
-
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
385
|
+
return await (proposalPayloadHash
|
|
386
|
+
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
|
|
376
387
|
: this.attestationPool.getCheckpointAttestationsForSlot(slot));
|
|
377
388
|
}
|
|
378
389
|
|
|
@@ -380,10 +391,18 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
380
391
|
return this.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
381
392
|
}
|
|
382
393
|
|
|
394
|
+
public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
|
|
395
|
+
return this.attestationPool.getProposalsForSlot(slot);
|
|
396
|
+
}
|
|
397
|
+
|
|
383
398
|
public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
|
|
384
399
|
return this.attestationPool.hasBlockProposalsForSlot(slot);
|
|
385
400
|
}
|
|
386
401
|
|
|
402
|
+
public hasCheckpointProposalForSlot(slot: SlotNumber): Promise<boolean> {
|
|
403
|
+
return this.attestationPool.hasCheckpointProposalForSlot(slot);
|
|
404
|
+
}
|
|
405
|
+
|
|
387
406
|
// REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
388
407
|
// ^ This pattern is not my favorite (md)
|
|
389
408
|
public registerBlockProposalHandler(handler: P2PBlockReceivedCallback): void {
|
|
@@ -402,11 +421,19 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
402
421
|
this.p2pService.registerDuplicateProposalCallback(callback);
|
|
403
422
|
}
|
|
404
423
|
|
|
424
|
+
public registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void {
|
|
425
|
+
this.p2pService.registerOversizedProposalCallback(callback);
|
|
426
|
+
}
|
|
427
|
+
|
|
405
428
|
public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
|
|
406
429
|
this.p2pService.registerDuplicateAttestationCallback(callback);
|
|
407
430
|
}
|
|
408
431
|
|
|
409
|
-
public
|
|
432
|
+
public registerCheckpointAttestationCallback(callback: (attestation: CheckpointAttestation) => void): void {
|
|
433
|
+
this.p2pService.registerCheckpointAttestationCallback(callback);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
public async getPendingTxs(limit?: number, after?: TxHash, options?: GetTxByHashOptions): Promise<Tx[]> {
|
|
410
437
|
if (limit !== undefined && limit <= 0) {
|
|
411
438
|
throw new TypeError('limit must be greater than 0');
|
|
412
439
|
}
|
|
@@ -425,7 +452,9 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
425
452
|
const endIndex = limit !== undefined ? startIndex + limit : undefined;
|
|
426
453
|
txHashes = txHashes.slice(startIndex, endIndex);
|
|
427
454
|
|
|
428
|
-
|
|
455
|
+
// This is a public-facing API (exposed via both the node and the p2p RPC), so proofs are opt-in.
|
|
456
|
+
const includeProof = !!options?.includeProof;
|
|
457
|
+
const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash, { includeProof })));
|
|
429
458
|
return maybeTxs.filter((tx): tx is Tx => !!tx);
|
|
430
459
|
}
|
|
431
460
|
|
|
@@ -433,18 +462,22 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
433
462
|
return this.txPool.getPendingTxCount();
|
|
434
463
|
}
|
|
435
464
|
|
|
436
|
-
public
|
|
465
|
+
public hasEligiblePendingTxs(minCount: number): Promise<boolean> {
|
|
466
|
+
return this.txPool.hasEligiblePendingTxs(minCount);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
public async *iteratePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
|
|
437
470
|
for (const txHash of await this.txPool.getPendingTxHashes()) {
|
|
438
|
-
const tx = await this.txPool.getTxByHash(txHash);
|
|
471
|
+
const tx = await this.txPool.getTxByHash(txHash, opts);
|
|
439
472
|
if (tx) {
|
|
440
473
|
yield tx;
|
|
441
474
|
}
|
|
442
475
|
}
|
|
443
476
|
}
|
|
444
477
|
|
|
445
|
-
public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
|
|
478
|
+
public async *iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
|
|
446
479
|
for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
|
|
447
|
-
const tx = await this.txPool.getTxByHash(txHash);
|
|
480
|
+
const tx = await this.txPool.getTxByHash(txHash, opts);
|
|
448
481
|
if (tx) {
|
|
449
482
|
yield tx;
|
|
450
483
|
}
|
|
@@ -454,19 +487,21 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
454
487
|
/**
|
|
455
488
|
* Returns a transaction in the transaction pool by its hash.
|
|
456
489
|
* @param txHash - Hash of the transaction to look for in the pool.
|
|
490
|
+
* @param opts - Set `includeProof: false` to skip loading the tx proof from the DB.
|
|
457
491
|
* @returns A single tx or undefined.
|
|
458
492
|
*/
|
|
459
|
-
getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined> {
|
|
460
|
-
return this.txPool.getTxByHash(txHash);
|
|
493
|
+
getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined> {
|
|
494
|
+
return this.txPool.getTxByHash(txHash, opts);
|
|
461
495
|
}
|
|
462
496
|
|
|
463
497
|
/**
|
|
464
498
|
* Returns transactions in the transaction pool by hash.
|
|
465
499
|
* @param txHashes - Hashes of the transactions to look for.
|
|
500
|
+
* @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
|
|
466
501
|
* @returns The txs found, in the same order as the requested hashes. If a tx is not found, it will be undefined.
|
|
467
502
|
*/
|
|
468
|
-
getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
|
|
469
|
-
return this.txPool.getTxsByHash(txHashes);
|
|
503
|
+
getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]> {
|
|
504
|
+
return this.txPool.getTxsByHash(txHashes, opts);
|
|
470
505
|
}
|
|
471
506
|
|
|
472
507
|
hasTxsInPool(txHashes: TxHash[]): Promise<boolean[]> {
|
|
@@ -576,13 +611,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
576
611
|
*/
|
|
577
612
|
public async getStatus(): Promise<P2PSyncState> {
|
|
578
613
|
const blockNumber = await this.getSyncedLatestBlockNum();
|
|
579
|
-
const blockHash =
|
|
580
|
-
blockNumber
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
.getBlockHeader(blockNumber)
|
|
584
|
-
.then(header => header?.hash())
|
|
585
|
-
.then(hash => hash?.toString());
|
|
614
|
+
const blockHash = await this.l2BlockSource
|
|
615
|
+
.getBlockData({ number: blockNumber })
|
|
616
|
+
.then(data => data?.header.hash())
|
|
617
|
+
.then(hash => hash?.toString());
|
|
586
618
|
|
|
587
619
|
return {
|
|
588
620
|
state: this.currentState,
|
|
@@ -611,15 +643,20 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
611
643
|
return;
|
|
612
644
|
}
|
|
613
645
|
|
|
614
|
-
await this.handleMinedBlocks(blocks);
|
|
615
|
-
await this.maybeCallPrepareForSlot();
|
|
616
|
-
await this.startCollectingMissingTxs(blocks);
|
|
617
646
|
const lastBlock = blocks.at(-1)!;
|
|
618
|
-
|
|
647
|
+
const lastSlot = lastBlock.header.getSlot();
|
|
648
|
+
|
|
649
|
+
// Mark txs mined before releasing protections: a block landing at this slot supersedes any
|
|
650
|
+
// protection for txs it includes, so mined-marking must run first to keep just-landed txs from
|
|
651
|
+
// being unprotected into pending where they could be evicted before they are recorded as mined.
|
|
652
|
+
await this.handleMinedBlocks(blocks);
|
|
653
|
+
await this.maybeCallPrepareForSlot(lastSlot);
|
|
654
|
+
await this.collectingMissingTxs(blocks);
|
|
655
|
+
await this.synchedLatestSlot.set(BigInt(lastSlot));
|
|
619
656
|
}
|
|
620
657
|
|
|
621
|
-
/** Request txs for unproven blocks so the prover node
|
|
622
|
-
private async
|
|
658
|
+
/** Request txs for unproven blocks so the prover node can prove. */
|
|
659
|
+
private async collectingMissingTxs(blocks: L2Block[]): Promise<void> {
|
|
623
660
|
try {
|
|
624
661
|
// TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
|
|
625
662
|
// be much lower than the actual one, and it does not update until the pending chain is
|
|
@@ -627,7 +664,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
627
664
|
// are already proven, but the archiver has not yet updated its state. Until this is properly
|
|
628
665
|
// fixed, it is mitigated by the expiration date of collection requests, which depends on
|
|
629
666
|
// the slot number of the block.
|
|
630
|
-
const provenBlockNumber = await this.l2BlockSource.
|
|
667
|
+
const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
|
|
631
668
|
const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
|
|
632
669
|
for (const block of unprovenBlocks) {
|
|
633
670
|
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
@@ -639,7 +676,17 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
639
676
|
`Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
|
|
640
677
|
{ missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
|
|
641
678
|
);
|
|
642
|
-
|
|
679
|
+
// Both `slashDataWithholdingToleranceSlots` and `p2pMissingTxCollectionDeadlineSlots`
|
|
680
|
+
// count *full slots after the block slot* — value N means collection runs until
|
|
681
|
+
// `slotStart(block.slot + N + 1)`. Take the larger of the two so collection never
|
|
682
|
+
// gives up before the data-withholding slash verdict is rendered.
|
|
683
|
+
const blockSlot = block.header.getSlot();
|
|
684
|
+
const toleranceSlots = this.config.slashDataWithholdingToleranceSlots;
|
|
685
|
+
const configuredSlots = this.config.p2pMissingTxCollectionDeadlineSlots ?? 0;
|
|
686
|
+
const deadlineSlot = SlotNumber(blockSlot + Math.max(toleranceSlots, configuredSlots) + 1);
|
|
687
|
+
const deadlineSeconds = getTimestampForSlot(deadlineSlot, this.epochCache.getL1Constants());
|
|
688
|
+
const deadline = new Date(Number(deadlineSeconds) * 1000);
|
|
689
|
+
await this.txCollection.collectFastForBlock(block, missingTxHashes, { deadline });
|
|
643
690
|
}
|
|
644
691
|
}
|
|
645
692
|
} catch (err) {
|
|
@@ -652,7 +699,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
652
699
|
* @param blocks - A list of finalized L2 blocks.
|
|
653
700
|
* @returns Empty promise.
|
|
654
701
|
*/
|
|
655
|
-
private async handleFinalizedL2Blocks(blocks:
|
|
702
|
+
private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
|
|
656
703
|
if (!blocks.length) {
|
|
657
704
|
return;
|
|
658
705
|
}
|
|
@@ -700,20 +747,8 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
700
747
|
return isEpochPrune;
|
|
701
748
|
}
|
|
702
749
|
|
|
703
|
-
/**
|
|
704
|
-
private async maybeCallPrepareForSlot(): Promise<void> {
|
|
705
|
-
// If we have a proposed checkpoint available, we want to prepare the target slot - otherwise we prepare the current slot
|
|
706
|
-
const l2Tips = await this.l2Tips.getL2Tips();
|
|
707
|
-
const hasProposedCheckpoint = l2Tips.proposedCheckpoint.checkpoint.number > l2Tips.checkpointed.checkpoint.number;
|
|
708
|
-
|
|
709
|
-
let slot;
|
|
710
|
-
if (this.epochCache.isProposerPipeliningEnabled() && hasProposedCheckpoint) {
|
|
711
|
-
const { targetSlot } = this.epochCache.getTargetAndNextSlot();
|
|
712
|
-
slot = targetSlot;
|
|
713
|
-
} else {
|
|
714
|
-
const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
|
|
715
|
-
slot = currentSlot;
|
|
716
|
-
}
|
|
750
|
+
/** Calls prepareForSlot for the given slot if it advances past the last slot we prepared for. */
|
|
751
|
+
private async maybeCallPrepareForSlot(slot: SlotNumber): Promise<void> {
|
|
717
752
|
if (slot <= this.lastSlotProcessed) {
|
|
718
753
|
return;
|
|
719
754
|
}
|
|
@@ -741,9 +776,17 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
741
776
|
syncedFinalizedBlock,
|
|
742
777
|
});
|
|
743
778
|
this.setCurrentState(P2PClientState.RUNNING);
|
|
744
|
-
if (this.
|
|
745
|
-
|
|
746
|
-
|
|
779
|
+
if (this.syncResolvers !== undefined) {
|
|
780
|
+
// A throw here would be swallowed by the block stream event handler, so we reject the promise returned by
|
|
781
|
+
// start instead, which makes node startup fail rather than run on with a dead p2p stack.
|
|
782
|
+
try {
|
|
783
|
+
await this.p2pService.start();
|
|
784
|
+
} catch (err) {
|
|
785
|
+
this.log.fatal(`Failed to start p2p service`, { err, syncedLatestBlock });
|
|
786
|
+
this.syncResolvers.reject(err);
|
|
787
|
+
return;
|
|
788
|
+
}
|
|
789
|
+
this.syncResolvers.resolve();
|
|
747
790
|
}
|
|
748
791
|
}
|
|
749
792
|
}
|
|
@@ -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.) |
|