@aztec/p2p 0.0.1-commit.4d3c002 → 0.0.1-commit.4d9804df
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 +33 -24
- package/dest/client/interface.d.ts +40 -10
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +32 -18
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +97 -51
- package/dest/config.d.ts +143 -107
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +72 -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 +1 -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 +1 -7
- 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.js +1 -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 +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
- 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 +9 -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 +19 -8
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +17 -4
- 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 +208 -118
- 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 +117 -24
- 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 +15 -17
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +13 -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 +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 +31 -38
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +268 -248
- package/dest/services/peer-manager/peer_manager.d.ts +15 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +59 -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 +21 -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/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 +16 -9
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +36 -43
- 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 +11 -17
- 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 +7 -6
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +39 -10
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +16 -16
- package/src/bootstrap/bootstrap.ts +17 -3
- package/src/client/factory.ts +49 -25
- package/src/client/interface.ts +35 -16
- package/src/client/p2p_client.ts +116 -85
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +146 -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 +1 -9
- 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 +1 -1
- 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/invalid_txs_after_reorg_rule.ts +3 -3
- 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 +22 -8
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +233 -123
- 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 +124 -15
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +19 -43
- 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 +14 -0
- package/src/services/libp2p/libp2p_service.ts +311 -271
- package/src/services/peer-manager/peer_manager.ts +63 -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 +25 -30
- 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 +39 -60
- package/src/test-helpers/reqresp-nodes.ts +8 -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 +34 -12
- 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,30 @@
|
|
|
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 { RunningPromise } from '@aztec/foundation/promise';
|
|
6
9
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
7
10
|
import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
|
|
8
11
|
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
9
12
|
import {
|
|
13
|
+
type BlockData,
|
|
14
|
+
type BlockHash,
|
|
10
15
|
type CheckpointId,
|
|
11
16
|
type EthAddress,
|
|
17
|
+
EventDrivenL2BlockStream,
|
|
12
18
|
type L2Block,
|
|
13
19
|
type L2BlockId,
|
|
14
20
|
type L2BlockSource,
|
|
15
|
-
L2BlockStream,
|
|
16
21
|
type L2BlockStreamEvent,
|
|
17
|
-
type L2Tips,
|
|
18
22
|
type L2TipsStore,
|
|
23
|
+
type LocalL2Tips,
|
|
19
24
|
} from '@aztec/stdlib/block';
|
|
20
25
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
21
|
-
import {
|
|
26
|
+
import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
27
|
+
import { type GetTxByHashOptions, type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
|
|
22
28
|
import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
|
|
23
29
|
import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
24
30
|
import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
@@ -28,18 +34,15 @@ import type { ENR } from '@nethermindeth/enr';
|
|
|
28
34
|
|
|
29
35
|
import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
|
|
30
36
|
import { TxPoolError } from '../errors/tx-pool.error.js';
|
|
31
|
-
import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
37
|
+
import type { AttestationPoolApi, ProposalsForSlot } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
32
38
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
33
39
|
import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
|
|
34
40
|
import type { AuthRequest, StatusMessage } from '../services/index.js';
|
|
35
|
-
import {
|
|
36
|
-
ReqRespSubProtocol,
|
|
37
|
-
type ReqRespSubProtocolHandler,
|
|
38
|
-
type ReqRespSubProtocolValidators,
|
|
39
|
-
} from '../services/reqresp/interface.js';
|
|
41
|
+
import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
|
|
40
42
|
import type {
|
|
41
43
|
DuplicateAttestationInfo,
|
|
42
44
|
DuplicateProposalInfo,
|
|
45
|
+
OversizedProposalInfo,
|
|
43
46
|
P2PBlockReceivedCallback,
|
|
44
47
|
P2PCheckpointReceivedCallback,
|
|
45
48
|
P2PService,
|
|
@@ -71,7 +74,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
71
74
|
|
|
72
75
|
private config: P2PConfig;
|
|
73
76
|
|
|
74
|
-
private blockStream:
|
|
77
|
+
private blockStream: EventDrivenL2BlockStream | undefined;
|
|
75
78
|
|
|
76
79
|
private txProvider: TxProvider;
|
|
77
80
|
|
|
@@ -80,9 +83,6 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
80
83
|
/** Tracks the last slot for which we called prepareForSlot */
|
|
81
84
|
private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
|
|
82
85
|
|
|
83
|
-
/** Polls for slot changes and calls prepareForSlot on the tx pool */
|
|
84
|
-
private slotMonitor: RunningPromise | undefined;
|
|
85
|
-
|
|
86
86
|
constructor(
|
|
87
87
|
private store: AztecAsyncKVStore,
|
|
88
88
|
private l2BlockSource: L2BlockSource & ContractDataSource,
|
|
@@ -95,6 +95,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
95
95
|
private _dateProvider: DateProvider = new DateProvider(),
|
|
96
96
|
private telemetry: TelemetryClient = getTelemetryClient(),
|
|
97
97
|
private log = createLogger('p2p'),
|
|
98
|
+
initialBlockHash: BlockHash,
|
|
98
99
|
) {
|
|
99
100
|
super(telemetry, 'P2PClient');
|
|
100
101
|
|
|
@@ -110,7 +111,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
110
111
|
this.telemetry,
|
|
111
112
|
);
|
|
112
113
|
|
|
113
|
-
this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
|
|
114
|
+
this.l2Tips = new L2TipsKVStore(store, 'p2p_client', initialBlockHash);
|
|
114
115
|
this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
|
|
115
116
|
}
|
|
116
117
|
|
|
@@ -148,7 +149,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
148
149
|
this.p2pService.updateConfig(config);
|
|
149
150
|
}
|
|
150
151
|
|
|
151
|
-
public getL2Tips(): Promise<
|
|
152
|
+
public getL2Tips(): Promise<LocalL2Tips> {
|
|
152
153
|
return this.l2Tips.getL2Tips();
|
|
153
154
|
}
|
|
154
155
|
|
|
@@ -164,7 +165,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
164
165
|
const from = BlockNumber(oldFinalizedBlockNum + 1);
|
|
165
166
|
const limit = event.block.number - from + 1;
|
|
166
167
|
if (limit > 0) {
|
|
167
|
-
const oldBlocks = await this.l2BlockSource.
|
|
168
|
+
const oldBlocks = await this.l2BlockSource.getBlocksData({ from, limit });
|
|
168
169
|
await this.handleFinalizedL2Blocks(oldBlocks);
|
|
169
170
|
}
|
|
170
171
|
break;
|
|
@@ -174,10 +175,12 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
174
175
|
break;
|
|
175
176
|
case 'chain-pruned':
|
|
176
177
|
this.txCollection.stopCollectingForBlocksAfter(event.block.number);
|
|
177
|
-
await this.handlePruneL2Blocks(event.block, event.checkpoint);
|
|
178
|
+
await this.handlePruneL2Blocks(event.block, event.checkpointed.checkpoint);
|
|
178
179
|
break;
|
|
179
180
|
case 'chain-checkpointed':
|
|
180
181
|
break;
|
|
182
|
+
case 'chain-proposed':
|
|
183
|
+
break;
|
|
181
184
|
default: {
|
|
182
185
|
const _: never = event;
|
|
183
186
|
break;
|
|
@@ -257,33 +260,24 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
257
260
|
});
|
|
258
261
|
}
|
|
259
262
|
|
|
260
|
-
|
|
261
|
-
|
|
263
|
+
// Should never happen: all branches above call initBlockStream()
|
|
264
|
+
if (!this.blockStream) {
|
|
265
|
+
throw new Error('Block stream not initialized');
|
|
266
|
+
}
|
|
267
|
+
this.blockStream.start();
|
|
262
268
|
this.txFileStore?.start();
|
|
263
269
|
|
|
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
270
|
return this.syncPromise;
|
|
273
271
|
}
|
|
274
272
|
|
|
275
|
-
addReqRespSubProtocol(
|
|
276
|
-
subProtocol
|
|
277
|
-
handler: ReqRespSubProtocolHandler,
|
|
278
|
-
validator: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
279
|
-
): Promise<void> {
|
|
280
|
-
return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
|
|
273
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
274
|
+
return this.p2pService.addReqRespSubProtocol(subProtocol, handler);
|
|
281
275
|
}
|
|
282
276
|
|
|
283
277
|
private initBlockStream(startingBlock?: BlockNumber) {
|
|
284
278
|
if (!this.blockStream) {
|
|
285
279
|
const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
|
|
286
|
-
this.blockStream = new
|
|
280
|
+
this.blockStream = new EventDrivenL2BlockStream(
|
|
287
281
|
this.l2BlockSource,
|
|
288
282
|
this,
|
|
289
283
|
this,
|
|
@@ -299,8 +293,6 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
299
293
|
*/
|
|
300
294
|
public async stop() {
|
|
301
295
|
this.log.debug('Stopping p2p client...');
|
|
302
|
-
await this.slotMonitor?.stop();
|
|
303
|
-
this.log.debug('Stopped slot monitor');
|
|
304
296
|
await tryStop(this.txCollection);
|
|
305
297
|
this.log.debug('Stopped tx collection service');
|
|
306
298
|
await this.txFileStore?.stop();
|
|
@@ -319,7 +311,11 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
319
311
|
/** Triggers a sync to the archiver. Used for testing. */
|
|
320
312
|
public async sync() {
|
|
321
313
|
this.initBlockStream();
|
|
322
|
-
|
|
314
|
+
// Should never happen: initBlockStream() creates blockStream if absent
|
|
315
|
+
if (!this.blockStream) {
|
|
316
|
+
throw new Error('Block stream not initialized');
|
|
317
|
+
}
|
|
318
|
+
await this.blockStream.sync();
|
|
323
319
|
}
|
|
324
320
|
|
|
325
321
|
@trackSpan('p2pClient.broadcastProposal', async proposal => ({
|
|
@@ -357,8 +353,19 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
357
353
|
// Store our own last-block proposal so we can respond to req/resp requests for it.
|
|
358
354
|
await this.attestationPool.tryAddBlockProposal(blockProposal);
|
|
359
355
|
}
|
|
360
|
-
|
|
361
|
-
await this.
|
|
356
|
+
const checkpointCore = proposal.toCore();
|
|
357
|
+
const { count } = await this.attestationPool.tryAddCheckpointProposal(checkpointCore);
|
|
358
|
+
if (count > 1) {
|
|
359
|
+
if (this.config.broadcastEquivocatedProposals) {
|
|
360
|
+
this.log.warn(`Broadcasting equivocated checkpoint proposal for slot ${proposal.slotNumber}`, {
|
|
361
|
+
slot: proposal.slotNumber,
|
|
362
|
+
archive: proposal.archive.toString(),
|
|
363
|
+
count,
|
|
364
|
+
});
|
|
365
|
+
} else {
|
|
366
|
+
throw new Error(`Attempted to broadcast a duplicate checkpoint proposal for slot ${proposal.slotNumber}`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
362
369
|
return this.p2pService.propagate(proposal);
|
|
363
370
|
}
|
|
364
371
|
|
|
@@ -369,10 +376,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
369
376
|
|
|
370
377
|
public async getCheckpointAttestationsForSlot(
|
|
371
378
|
slot: SlotNumber,
|
|
372
|
-
|
|
379
|
+
proposalPayloadHash?: CheckpointProposalHash,
|
|
373
380
|
): Promise<CheckpointAttestation[]> {
|
|
374
|
-
return await (
|
|
375
|
-
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
381
|
+
return await (proposalPayloadHash
|
|
382
|
+
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
|
|
376
383
|
: this.attestationPool.getCheckpointAttestationsForSlot(slot));
|
|
377
384
|
}
|
|
378
385
|
|
|
@@ -380,10 +387,18 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
380
387
|
return this.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
381
388
|
}
|
|
382
389
|
|
|
390
|
+
public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
|
|
391
|
+
return this.attestationPool.getProposalsForSlot(slot);
|
|
392
|
+
}
|
|
393
|
+
|
|
383
394
|
public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
|
|
384
395
|
return this.attestationPool.hasBlockProposalsForSlot(slot);
|
|
385
396
|
}
|
|
386
397
|
|
|
398
|
+
public hasCheckpointProposalForSlot(slot: SlotNumber): Promise<boolean> {
|
|
399
|
+
return this.attestationPool.hasCheckpointProposalForSlot(slot);
|
|
400
|
+
}
|
|
401
|
+
|
|
387
402
|
// REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
388
403
|
// ^ This pattern is not my favorite (md)
|
|
389
404
|
public registerBlockProposalHandler(handler: P2PBlockReceivedCallback): void {
|
|
@@ -402,11 +417,19 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
402
417
|
this.p2pService.registerDuplicateProposalCallback(callback);
|
|
403
418
|
}
|
|
404
419
|
|
|
420
|
+
public registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void {
|
|
421
|
+
this.p2pService.registerOversizedProposalCallback(callback);
|
|
422
|
+
}
|
|
423
|
+
|
|
405
424
|
public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
|
|
406
425
|
this.p2pService.registerDuplicateAttestationCallback(callback);
|
|
407
426
|
}
|
|
408
427
|
|
|
409
|
-
public
|
|
428
|
+
public registerCheckpointAttestationCallback(callback: (attestation: CheckpointAttestation) => void): void {
|
|
429
|
+
this.p2pService.registerCheckpointAttestationCallback(callback);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
public async getPendingTxs(limit?: number, after?: TxHash, options?: GetTxByHashOptions): Promise<Tx[]> {
|
|
410
433
|
if (limit !== undefined && limit <= 0) {
|
|
411
434
|
throw new TypeError('limit must be greater than 0');
|
|
412
435
|
}
|
|
@@ -425,7 +448,9 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
425
448
|
const endIndex = limit !== undefined ? startIndex + limit : undefined;
|
|
426
449
|
txHashes = txHashes.slice(startIndex, endIndex);
|
|
427
450
|
|
|
428
|
-
|
|
451
|
+
// This is a public-facing API (exposed via both the node and the p2p RPC), so proofs are opt-in.
|
|
452
|
+
const includeProof = !!options?.includeProof;
|
|
453
|
+
const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash, { includeProof })));
|
|
429
454
|
return maybeTxs.filter((tx): tx is Tx => !!tx);
|
|
430
455
|
}
|
|
431
456
|
|
|
@@ -433,18 +458,22 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
433
458
|
return this.txPool.getPendingTxCount();
|
|
434
459
|
}
|
|
435
460
|
|
|
436
|
-
public
|
|
461
|
+
public hasEligiblePendingTxs(minCount: number): Promise<boolean> {
|
|
462
|
+
return this.txPool.hasEligiblePendingTxs(minCount);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
public async *iteratePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
|
|
437
466
|
for (const txHash of await this.txPool.getPendingTxHashes()) {
|
|
438
|
-
const tx = await this.txPool.getTxByHash(txHash);
|
|
467
|
+
const tx = await this.txPool.getTxByHash(txHash, opts);
|
|
439
468
|
if (tx) {
|
|
440
469
|
yield tx;
|
|
441
470
|
}
|
|
442
471
|
}
|
|
443
472
|
}
|
|
444
473
|
|
|
445
|
-
public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
|
|
474
|
+
public async *iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
|
|
446
475
|
for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
|
|
447
|
-
const tx = await this.txPool.getTxByHash(txHash);
|
|
476
|
+
const tx = await this.txPool.getTxByHash(txHash, opts);
|
|
448
477
|
if (tx) {
|
|
449
478
|
yield tx;
|
|
450
479
|
}
|
|
@@ -454,19 +483,21 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
454
483
|
/**
|
|
455
484
|
* Returns a transaction in the transaction pool by its hash.
|
|
456
485
|
* @param txHash - Hash of the transaction to look for in the pool.
|
|
486
|
+
* @param opts - Set `includeProof: false` to skip loading the tx proof from the DB.
|
|
457
487
|
* @returns A single tx or undefined.
|
|
458
488
|
*/
|
|
459
|
-
getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined> {
|
|
460
|
-
return this.txPool.getTxByHash(txHash);
|
|
489
|
+
getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined> {
|
|
490
|
+
return this.txPool.getTxByHash(txHash, opts);
|
|
461
491
|
}
|
|
462
492
|
|
|
463
493
|
/**
|
|
464
494
|
* Returns transactions in the transaction pool by hash.
|
|
465
495
|
* @param txHashes - Hashes of the transactions to look for.
|
|
496
|
+
* @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
|
|
466
497
|
* @returns The txs found, in the same order as the requested hashes. If a tx is not found, it will be undefined.
|
|
467
498
|
*/
|
|
468
|
-
getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
|
|
469
|
-
return this.txPool.getTxsByHash(txHashes);
|
|
499
|
+
getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]> {
|
|
500
|
+
return this.txPool.getTxsByHash(txHashes, opts);
|
|
470
501
|
}
|
|
471
502
|
|
|
472
503
|
hasTxsInPool(txHashes: TxHash[]): Promise<boolean[]> {
|
|
@@ -576,13 +607,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
576
607
|
*/
|
|
577
608
|
public async getStatus(): Promise<P2PSyncState> {
|
|
578
609
|
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());
|
|
610
|
+
const blockHash = await this.l2BlockSource
|
|
611
|
+
.getBlockData({ number: blockNumber })
|
|
612
|
+
.then(data => data?.header.hash())
|
|
613
|
+
.then(hash => hash?.toString());
|
|
586
614
|
|
|
587
615
|
return {
|
|
588
616
|
state: this.currentState,
|
|
@@ -611,15 +639,20 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
611
639
|
return;
|
|
612
640
|
}
|
|
613
641
|
|
|
614
|
-
await this.handleMinedBlocks(blocks);
|
|
615
|
-
await this.maybeCallPrepareForSlot();
|
|
616
|
-
await this.startCollectingMissingTxs(blocks);
|
|
617
642
|
const lastBlock = blocks.at(-1)!;
|
|
618
|
-
|
|
643
|
+
const lastSlot = lastBlock.header.getSlot();
|
|
644
|
+
|
|
645
|
+
// Mark txs mined before releasing protections: a block landing at this slot supersedes any
|
|
646
|
+
// protection for txs it includes, so mined-marking must run first to keep just-landed txs from
|
|
647
|
+
// being unprotected into pending where they could be evicted before they are recorded as mined.
|
|
648
|
+
await this.handleMinedBlocks(blocks);
|
|
649
|
+
await this.maybeCallPrepareForSlot(lastSlot);
|
|
650
|
+
await this.collectingMissingTxs(blocks);
|
|
651
|
+
await this.synchedLatestSlot.set(BigInt(lastSlot));
|
|
619
652
|
}
|
|
620
653
|
|
|
621
|
-
/** Request txs for unproven blocks so the prover node
|
|
622
|
-
private async
|
|
654
|
+
/** Request txs for unproven blocks so the prover node can prove. */
|
|
655
|
+
private async collectingMissingTxs(blocks: L2Block[]): Promise<void> {
|
|
623
656
|
try {
|
|
624
657
|
// TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
|
|
625
658
|
// be much lower than the actual one, and it does not update until the pending chain is
|
|
@@ -627,7 +660,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
627
660
|
// are already proven, but the archiver has not yet updated its state. Until this is properly
|
|
628
661
|
// fixed, it is mitigated by the expiration date of collection requests, which depends on
|
|
629
662
|
// the slot number of the block.
|
|
630
|
-
const provenBlockNumber = await this.l2BlockSource.
|
|
663
|
+
const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
|
|
631
664
|
const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
|
|
632
665
|
for (const block of unprovenBlocks) {
|
|
633
666
|
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
@@ -639,7 +672,17 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
639
672
|
`Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
|
|
640
673
|
{ missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
|
|
641
674
|
);
|
|
642
|
-
|
|
675
|
+
// Both `slashDataWithholdingToleranceSlots` and `p2pMissingTxCollectionDeadlineSlots`
|
|
676
|
+
// count *full slots after the block slot* — value N means collection runs until
|
|
677
|
+
// `slotStart(block.slot + N + 1)`. Take the larger of the two so collection never
|
|
678
|
+
// gives up before the data-withholding slash verdict is rendered.
|
|
679
|
+
const blockSlot = block.header.getSlot();
|
|
680
|
+
const toleranceSlots = this.config.slashDataWithholdingToleranceSlots;
|
|
681
|
+
const configuredSlots = this.config.p2pMissingTxCollectionDeadlineSlots ?? 0;
|
|
682
|
+
const deadlineSlot = SlotNumber(blockSlot + Math.max(toleranceSlots, configuredSlots) + 1);
|
|
683
|
+
const deadlineSeconds = getTimestampForSlot(deadlineSlot, this.epochCache.getL1Constants());
|
|
684
|
+
const deadline = new Date(Number(deadlineSeconds) * 1000);
|
|
685
|
+
await this.txCollection.collectFastForBlock(block, missingTxHashes, { deadline });
|
|
643
686
|
}
|
|
644
687
|
}
|
|
645
688
|
} catch (err) {
|
|
@@ -652,7 +695,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
652
695
|
* @param blocks - A list of finalized L2 blocks.
|
|
653
696
|
* @returns Empty promise.
|
|
654
697
|
*/
|
|
655
|
-
private async handleFinalizedL2Blocks(blocks:
|
|
698
|
+
private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
|
|
656
699
|
if (!blocks.length) {
|
|
657
700
|
return;
|
|
658
701
|
}
|
|
@@ -700,20 +743,8 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
700
743
|
return isEpochPrune;
|
|
701
744
|
}
|
|
702
745
|
|
|
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
|
-
}
|
|
746
|
+
/** Calls prepareForSlot for the given slot if it advances past the last slot we prepared for. */
|
|
747
|
+
private async maybeCallPrepareForSlot(slot: SlotNumber): Promise<void> {
|
|
717
748
|
if (slot <= this.lastSlotProcessed) {
|
|
718
749
|
return;
|
|
719
750
|
}
|
|
@@ -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.) |
|