@aztec/p2p 0.0.1-commit.d3ec352c → 0.0.1-commit.e3c1de76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +4 -4
- package/dest/client/factory.d.ts +2 -2
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +8 -8
- package/dest/client/interface.d.ts +18 -5
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +11 -14
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +459 -125
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +11 -8
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +12 -13
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +61 -42
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- 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 +239 -265
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -18
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +114 -109
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -16
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +89 -128
- package/dest/mem_pools/attestation_pool/mocks.d.ts +11 -8
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +17 -13
- package/dest/mem_pools/instrumentation.d.ts +7 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +31 -13
- package/dest/mem_pools/interface.d.ts +3 -4
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +35 -26
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +314 -335
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
- package/dest/mem_pools/tx_pool/index.d.ts +1 -2
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/index.js +0 -1
- package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.js +6 -1
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +8 -4
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +25 -20
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +52 -19
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -13
- package/dest/msg_validators/clock_tolerance.d.ts +21 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +37 -0
- package/dest/msg_validators/index.d.ts +2 -2
- package/dest/msg_validators/index.d.ts.map +1 -1
- package/dest/msg_validators/index.js +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +3 -2
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +4 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +9 -4
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +22 -12
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
- package/dest/msg_validators/tx_validator/index.d.ts +2 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- 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 -2
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +10 -6
- package/dest/services/discv5/discV5_service.js +1 -1
- package/dest/services/dummy_service.d.ts +18 -2
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +42 -0
- package/dest/services/encoding.d.ts +1 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +7 -6
- package/dest/services/libp2p/instrumentation.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +30 -72
- package/dest/services/libp2p/libp2p_service.d.ts +39 -16
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +750 -187
- package/dest/services/peer-manager/metrics.d.ts +7 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +33 -21
- package/dest/services/peer-manager/peer_manager.d.ts +2 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +4 -12
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +7 -4
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- package/dest/services/reqresp/interface.d.ts +4 -2
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +1 -1
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -21
- package/dest/services/reqresp/protocols/auth.d.ts +2 -2
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/auth.js +2 -2
- package/dest/services/reqresp/protocols/block.js +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
- 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 +16 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +19 -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 +44 -14
- package/dest/services/reqresp/protocols/status.d.ts +1 -1
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +4 -1
- package/dest/services/reqresp/protocols/tx.d.ts +2 -3
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.d.ts +6 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +460 -46
- package/dest/services/service.d.ts +19 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +4 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +10 -2
- package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +16 -5
- package/dest/services/tx_collection/index.d.ts +2 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -0
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +10 -13
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
- package/dest/services/tx_collection/tx_collection.d.ts +6 -6
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +6 -6
- package/dest/services/tx_provider.d.ts +4 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +11 -2
- package/dest/services/tx_provider_instrumentation.d.ts +5 -2
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +14 -14
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/mock-tx-helpers.js +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -2
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +158 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +297 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +218 -123
- package/dest/testbench/worker_client_manager.d.ts +51 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +226 -39
- package/package.json +16 -16
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +11 -20
- package/src/client/interface.ts +19 -4
- package/src/client/p2p_client.ts +92 -145
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +18 -19
- package/src/mem_pools/attestation_pool/attestation_pool.ts +68 -41
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +241 -289
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +163 -141
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +141 -164
- package/src/mem_pools/attestation_pool/mocks.ts +21 -15
- package/src/mem_pools/instrumentation.ts +39 -14
- package/src/mem_pools/interface.ts +2 -4
- package/src/mem_pools/tx_pool/README.md +270 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +362 -367
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
- package/src/mem_pools/tx_pool/index.ts +0 -1
- package/src/mem_pools/tx_pool/priority.ts +8 -1
- package/src/mem_pools/tx_pool/tx_pool.ts +8 -3
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +18 -13
- package/src/msg_validators/attestation_validator/attestation_validator.ts +37 -22
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +19 -16
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +6 -5
- package/src/msg_validators/tx_validator/data_validator.ts +18 -6
- package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
- package/src/msg_validators/tx_validator/factory.ts +65 -24
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
- package/src/msg_validators/tx_validator/index.ts +1 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +19 -8
- package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/test_utils.ts +1 -1
- package/src/msg_validators/tx_validator/timestamp_validator.ts +9 -4
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +1 -1
- package/src/services/dummy_service.ts +51 -0
- package/src/services/encoding.ts +6 -5
- package/src/services/libp2p/instrumentation.ts +32 -73
- package/src/services/libp2p/libp2p_service.ts +418 -173
- package/src/services/peer-manager/metrics.ts +39 -21
- package/src/services/peer-manager/peer_manager.ts +5 -4
- package/src/services/peer-manager/peer_scoring.ts +3 -4
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/interface.ts +4 -1
- package/src/services/reqresp/metrics.ts +36 -27
- package/src/services/reqresp/protocols/auth.ts +2 -2
- package/src/services/reqresp/protocols/block.ts +1 -1
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +18 -4
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +52 -10
- package/src/services/reqresp/protocols/status.ts +7 -4
- package/src/services/reqresp/protocols/tx.ts +1 -2
- package/src/services/reqresp/reqresp.ts +66 -19
- package/src/services/service.ts +23 -4
- package/src/services/tx_collection/config.ts +16 -2
- package/src/services/tx_collection/fast_tx_collection.ts +36 -13
- package/src/services/tx_collection/index.ts +5 -0
- package/src/services/tx_collection/instrumentation.ts +5 -13
- package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
- package/src/services/tx_collection/tx_collection.ts +7 -7
- package/src/services/tx_provider.ts +19 -4
- package/src/services/tx_provider_instrumentation.ts +24 -14
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/mock-pubsub.ts +1 -1
- package/src/test-helpers/mock-tx-helpers.ts +1 -1
- package/src/test-helpers/reqresp-nodes.ts +1 -1
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +374 -0
- package/src/testbench/p2p_client_testbench_worker.ts +338 -119
- package/src/testbench/worker_client_manager.ts +304 -42
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -81
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -239
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
- package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/index.js +0 -1
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -285
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
package/src/client/p2p_client.ts
CHANGED
|
@@ -1,31 +1,29 @@
|
|
|
1
|
-
import { GENESIS_BLOCK_HEADER_HASH
|
|
1
|
+
import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
|
|
2
2
|
import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
5
|
-
import type { AztecAsyncKVStore,
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
L2BlockSource,
|
|
5
|
+
import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
|
|
6
|
+
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
7
|
+
import {
|
|
8
|
+
type EthAddress,
|
|
9
|
+
type L2Block,
|
|
10
|
+
type L2BlockSource,
|
|
11
11
|
L2BlockStream,
|
|
12
|
-
L2BlockStreamEvent,
|
|
13
|
-
L2Tips,
|
|
14
|
-
|
|
12
|
+
type L2BlockStreamEvent,
|
|
13
|
+
type L2Tips,
|
|
14
|
+
type L2TipsStore,
|
|
15
15
|
} from '@aztec/stdlib/block';
|
|
16
16
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
17
17
|
import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
18
18
|
import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
|
|
19
|
-
import { BlockAttestation, type BlockProposal, type P2PClientType } from '@aztec/stdlib/p2p';
|
|
20
|
-
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
21
19
|
import {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
} from '@aztec/telemetry-client';
|
|
20
|
+
type BlockProposal,
|
|
21
|
+
CheckpointAttestation,
|
|
22
|
+
type CheckpointProposal,
|
|
23
|
+
type P2PClientType,
|
|
24
|
+
} from '@aztec/stdlib/p2p';
|
|
25
|
+
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
26
|
+
import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
29
27
|
|
|
30
28
|
import type { PeerId } from '@libp2p/interface';
|
|
31
29
|
import type { ENR } from '@nethermindeth/enr';
|
|
@@ -41,7 +39,7 @@ import {
|
|
|
41
39
|
type ReqRespSubProtocolValidators,
|
|
42
40
|
} from '../services/reqresp/interface.js';
|
|
43
41
|
import { chunkTxHashesRequest } from '../services/reqresp/protocols/tx.js';
|
|
44
|
-
import type { P2PBlockReceivedCallback, P2PService } from '../services/service.js';
|
|
42
|
+
import type { P2PBlockReceivedCallback, P2PCheckpointReceivedCallback, P2PService } from '../services/service.js';
|
|
45
43
|
import { TxCollection } from '../services/tx_collection/tx_collection.js';
|
|
46
44
|
import { TxProvider } from '../services/tx_provider.js';
|
|
47
45
|
import { type P2P, P2PClientState, type P2PSyncState } from './interface.js';
|
|
@@ -63,14 +61,11 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
63
61
|
private provenBlockNumberAtStart = -1;
|
|
64
62
|
private finalizedBlockNumberAtStart = -1;
|
|
65
63
|
|
|
66
|
-
private
|
|
67
|
-
private synchedLatestBlockNumber: AztecAsyncSingleton<BlockNumber>;
|
|
68
|
-
private synchedProvenBlockNumber: AztecAsyncSingleton<BlockNumber>;
|
|
69
|
-
private synchedFinalizedBlockNumber: AztecAsyncSingleton<BlockNumber>;
|
|
64
|
+
private l2Tips: L2TipsStore;
|
|
70
65
|
private synchedLatestSlot: AztecAsyncSingleton<bigint>;
|
|
71
66
|
|
|
72
67
|
private txPool: TxPool;
|
|
73
|
-
private attestationPool:
|
|
68
|
+
private attestationPool: AttestationPool;
|
|
74
69
|
|
|
75
70
|
private config: P2PConfig;
|
|
76
71
|
|
|
@@ -92,7 +87,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
92
87
|
_clientType: T,
|
|
93
88
|
private store: AztecAsyncKVStore,
|
|
94
89
|
private l2BlockSource: L2BlockSource & ContractDataSource,
|
|
95
|
-
mempools: MemPools
|
|
90
|
+
mempools: MemPools,
|
|
96
91
|
private p2pService: P2PService,
|
|
97
92
|
private txCollection: TxCollection,
|
|
98
93
|
config: Partial<P2PConfig> = {},
|
|
@@ -104,7 +99,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
104
99
|
|
|
105
100
|
this.config = { ...getP2PDefaultConfig(), ...config };
|
|
106
101
|
this.txPool = mempools.txPool;
|
|
107
|
-
this.attestationPool = mempools.attestationPool
|
|
102
|
+
this.attestationPool = mempools.attestationPool;
|
|
108
103
|
|
|
109
104
|
this.txProvider = new TxProvider(
|
|
110
105
|
this.txCollection,
|
|
@@ -115,7 +110,8 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
115
110
|
);
|
|
116
111
|
|
|
117
112
|
// Default to collecting all txs when we see a valid proposal
|
|
118
|
-
// This can be overridden by the validator client to
|
|
113
|
+
// This can be overridden by the validator client to validate, and it will call getTxsForBlockProposal on its own
|
|
114
|
+
// Note: Validators do NOT attest to individual blocks - attestations are only for checkpoint proposals.
|
|
119
115
|
// TODO(palla/txs): We should not trigger a request for txs on a proposal before fully validating it. We need to bring
|
|
120
116
|
// validator-client code into here so we can validate a proposal is reasonable.
|
|
121
117
|
this.registerBlockProposalHandler(async (block, sender) => {
|
|
@@ -124,21 +120,17 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
124
120
|
const constants = this.txCollection.getConstants();
|
|
125
121
|
const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(block.slotNumber + 1), constants));
|
|
126
122
|
const deadline = new Date(nextSlotTimestampSeconds * 1000);
|
|
127
|
-
const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.
|
|
123
|
+
const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.blockHeader.lastArchive.root);
|
|
128
124
|
if (!parentBlock) {
|
|
129
125
|
this.log.debug(`Cannot collect txs for proposal as parent block not found`);
|
|
130
|
-
return;
|
|
126
|
+
return false;
|
|
131
127
|
}
|
|
132
128
|
const blockNumber = BlockNumber(parentBlock.getBlockNumber() + 1);
|
|
133
129
|
await this.txProvider.getTxsForBlockProposal(block, blockNumber, { pinnedPeer: sender, deadline });
|
|
134
|
-
return
|
|
130
|
+
return true;
|
|
135
131
|
});
|
|
136
132
|
|
|
137
|
-
|
|
138
|
-
this.synchedBlockHashes = store.openMap('p2p_pool_block_hashes');
|
|
139
|
-
this.synchedLatestBlockNumber = store.openSingleton('p2p_pool_last_l2_block');
|
|
140
|
-
this.synchedProvenBlockNumber = store.openSingleton('p2p_pool_last_proven_l2_block');
|
|
141
|
-
this.synchedFinalizedBlockNumber = store.openSingleton('p2p_pool_last_finalized_l2_block');
|
|
133
|
+
this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
|
|
142
134
|
this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
|
|
143
135
|
}
|
|
144
136
|
|
|
@@ -164,7 +156,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
164
156
|
}
|
|
165
157
|
|
|
166
158
|
public getL2BlockHash(number: BlockNumber): Promise<string | undefined> {
|
|
167
|
-
return this.
|
|
159
|
+
return this.l2Tips.getL2BlockHash(number);
|
|
168
160
|
}
|
|
169
161
|
|
|
170
162
|
public updateP2PConfig(config: Partial<P2PConfig>): Promise<void> {
|
|
@@ -173,84 +165,45 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
173
165
|
return Promise.resolve();
|
|
174
166
|
}
|
|
175
167
|
|
|
176
|
-
public
|
|
177
|
-
|
|
178
|
-
let latestBlockHash: string | undefined;
|
|
179
|
-
|
|
180
|
-
const provenBlockNumber = await this.getSyncedProvenBlockNum();
|
|
181
|
-
let provenBlockHash: string | undefined;
|
|
182
|
-
|
|
183
|
-
const finalizedBlockNumber = await this.getSyncedFinalizedBlockNum();
|
|
184
|
-
let finalizedBlockHash: string | undefined;
|
|
185
|
-
|
|
186
|
-
if (latestBlockNumber > 0) {
|
|
187
|
-
latestBlockHash = await this.synchedBlockHashes.getAsync(latestBlockNumber);
|
|
188
|
-
if (typeof latestBlockHash === 'undefined') {
|
|
189
|
-
throw new Error(`Block hash for latest block ${latestBlockNumber} not found in p2p client`);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if (provenBlockNumber > 0) {
|
|
194
|
-
provenBlockHash = await this.synchedBlockHashes.getAsync(provenBlockNumber);
|
|
195
|
-
if (typeof provenBlockHash === 'undefined') {
|
|
196
|
-
throw new Error(`Block hash for proven block ${provenBlockNumber} not found in p2p client`);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
if (finalizedBlockNumber > 0) {
|
|
201
|
-
finalizedBlockHash = await this.synchedBlockHashes.getAsync(finalizedBlockNumber);
|
|
202
|
-
if (typeof finalizedBlockHash === 'undefined') {
|
|
203
|
-
throw new Error(`Block hash for finalized block ${finalizedBlockNumber} not found in p2p client`);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
const genesisHash = GENESIS_BLOCK_HEADER_HASH.toString();
|
|
208
|
-
|
|
209
|
-
return {
|
|
210
|
-
latest: { hash: latestBlockHash ?? genesisHash, number: latestBlockNumber },
|
|
211
|
-
proven: { hash: provenBlockHash ?? genesisHash, number: provenBlockNumber },
|
|
212
|
-
finalized: { hash: finalizedBlockHash ?? genesisHash, number: finalizedBlockNumber },
|
|
213
|
-
};
|
|
168
|
+
public getL2Tips(): Promise<L2Tips> {
|
|
169
|
+
return this.l2Tips.getL2Tips();
|
|
214
170
|
}
|
|
215
171
|
|
|
216
172
|
public async handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
|
|
217
173
|
this.log.debug(`Handling block stream event ${event.type}`);
|
|
174
|
+
|
|
218
175
|
switch (event.type) {
|
|
219
176
|
case 'blocks-added':
|
|
220
177
|
await this.handleLatestL2Blocks(event.blocks);
|
|
221
178
|
break;
|
|
222
179
|
case 'chain-finalized': {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
const from = BlockNumber((await this.getSyncedFinalizedBlockNum()) + 1);
|
|
180
|
+
const oldFinalizedBlockNum = await this.getSyncedFinalizedBlockNum();
|
|
181
|
+
const from = BlockNumber(oldFinalizedBlockNum + 1);
|
|
226
182
|
const limit = event.block.number - from + 1;
|
|
227
183
|
if (limit > 0) {
|
|
228
|
-
|
|
184
|
+
const oldBlocks = await this.l2BlockSource.getBlocks(from, limit);
|
|
185
|
+
await this.handleFinalizedL2Blocks(oldBlocks);
|
|
229
186
|
}
|
|
230
187
|
break;
|
|
231
188
|
}
|
|
232
|
-
case 'chain-proven':
|
|
233
|
-
await this.setBlockHash(event.block);
|
|
189
|
+
case 'chain-proven':
|
|
234
190
|
this.txCollection.stopCollectingForBlocksUpTo(event.block.number);
|
|
235
|
-
await this.synchedProvenBlockNumber.set(event.block.number);
|
|
236
191
|
break;
|
|
237
|
-
}
|
|
238
192
|
case 'chain-pruned':
|
|
239
|
-
await this.setBlockHash(event.block);
|
|
240
193
|
this.txCollection.stopCollectingForBlocksAfter(event.block.number);
|
|
241
194
|
await this.handlePruneL2Blocks(event.block.number);
|
|
242
195
|
break;
|
|
196
|
+
case 'chain-checkpointed':
|
|
197
|
+
break;
|
|
243
198
|
default: {
|
|
244
199
|
const _: never = event;
|
|
245
200
|
break;
|
|
246
201
|
}
|
|
247
202
|
}
|
|
248
|
-
}
|
|
249
203
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}
|
|
204
|
+
// Pass the event through to our l2 tips store
|
|
205
|
+
await this.l2Tips.handleBlockStreamEvent(event);
|
|
206
|
+
await this.startServiceIfSynched();
|
|
254
207
|
}
|
|
255
208
|
|
|
256
209
|
#assertIsReady() {
|
|
@@ -274,18 +227,15 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
274
227
|
|
|
275
228
|
// get the current latest block numbers
|
|
276
229
|
const latestBlockNumbers = await this.l2BlockSource.getL2Tips();
|
|
277
|
-
this.latestBlockNumberAtStart = latestBlockNumbers.
|
|
278
|
-
this.provenBlockNumberAtStart = latestBlockNumbers.proven.number;
|
|
279
|
-
this.finalizedBlockNumberAtStart = latestBlockNumbers.finalized.number;
|
|
230
|
+
this.latestBlockNumberAtStart = latestBlockNumbers.proposed.number;
|
|
231
|
+
this.provenBlockNumberAtStart = latestBlockNumbers.proven.block.number;
|
|
232
|
+
this.finalizedBlockNumberAtStart = latestBlockNumbers.finalized.block.number;
|
|
280
233
|
|
|
281
234
|
const syncedLatestBlock = (await this.getSyncedLatestBlockNum()) + 1;
|
|
282
235
|
const syncedProvenBlock = (await this.getSyncedProvenBlockNum()) + 1;
|
|
283
236
|
const syncedFinalizedBlock = (await this.getSyncedFinalizedBlockNum()) + 1;
|
|
284
237
|
|
|
285
|
-
if (
|
|
286
|
-
(await this.txPool.isEmpty()) &&
|
|
287
|
-
(this.attestationPool === undefined || (await this.attestationPool?.isEmpty()))
|
|
288
|
-
) {
|
|
238
|
+
if ((await this.txPool.isEmpty()) && (await this.attestationPool.isEmpty())) {
|
|
289
239
|
// if mempools are empty, we don't care about syncing prior blocks
|
|
290
240
|
this.initBlockStream(BlockNumber(this.latestBlockNumberAtStart));
|
|
291
241
|
this.setCurrentState(P2PClientState.RUNNING);
|
|
@@ -338,12 +288,10 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
338
288
|
private initBlockStream(startingBlock?: BlockNumber) {
|
|
339
289
|
if (!this.blockStream) {
|
|
340
290
|
const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
|
|
341
|
-
this.blockStream = new
|
|
291
|
+
this.blockStream = new L2BlockStream(
|
|
342
292
|
this.l2BlockSource,
|
|
343
293
|
this,
|
|
344
294
|
this,
|
|
345
|
-
this.telemetry.getTracer('P2PL2BlockStream'),
|
|
346
|
-
'P2PL2BlockStream',
|
|
347
295
|
createLogger(`${this.log.module}:l2-block-stream`),
|
|
348
296
|
{ batchSize, pollIntervalMS, startingBlock },
|
|
349
297
|
);
|
|
@@ -378,30 +326,39 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
378
326
|
[Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
|
|
379
327
|
[Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
|
|
380
328
|
}))
|
|
381
|
-
public broadcastProposal(proposal: BlockProposal): Promise<void> {
|
|
329
|
+
public async broadcastProposal(proposal: BlockProposal): Promise<void> {
|
|
382
330
|
this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber} to peers`);
|
|
331
|
+
// Store our own proposal so we can respond to req/resp requests for it
|
|
332
|
+
await this.attestationPool.addBlockProposal(proposal);
|
|
383
333
|
return this.p2pService.propagate(proposal);
|
|
384
334
|
}
|
|
385
335
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
336
|
+
@trackSpan('p2pClient.broadcastCheckpointProposal', async proposal => ({
|
|
337
|
+
[Attributes.SLOT_NUMBER]: proposal.slotNumber,
|
|
338
|
+
[Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
|
|
339
|
+
[Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
|
|
340
|
+
}))
|
|
341
|
+
public broadcastCheckpointProposal(proposal: CheckpointProposal): Promise<void> {
|
|
342
|
+
this.log.verbose(`Broadcasting checkpoint proposal for slot ${proposal.slotNumber} to peers`);
|
|
343
|
+
return this.p2pService.propagate(proposal);
|
|
389
344
|
}
|
|
390
345
|
|
|
391
|
-
public async
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
? this.attestationPool?.getAttestationsForSlotAndProposal(slot, proposalId)
|
|
395
|
-
: this.attestationPool?.getAttestationsForSlot(slot))) ?? []
|
|
396
|
-
);
|
|
346
|
+
public async broadcastCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
|
|
347
|
+
this.log.verbose(`Broadcasting ${attestations.length} checkpoint attestations to peers`);
|
|
348
|
+
await Promise.all(attestations.map(att => this.p2pService.propagate(att)));
|
|
397
349
|
}
|
|
398
350
|
|
|
399
|
-
public
|
|
400
|
-
|
|
351
|
+
public async getCheckpointAttestationsForSlot(
|
|
352
|
+
slot: SlotNumber,
|
|
353
|
+
proposalId?: string,
|
|
354
|
+
): Promise<CheckpointAttestation[]> {
|
|
355
|
+
return await (proposalId
|
|
356
|
+
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalId)
|
|
357
|
+
: this.attestationPool.getCheckpointAttestationsForSlot(slot));
|
|
401
358
|
}
|
|
402
359
|
|
|
403
|
-
public
|
|
404
|
-
return this.attestationPool
|
|
360
|
+
public addCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
|
|
361
|
+
return this.attestationPool.addCheckpointAttestations(attestations);
|
|
405
362
|
}
|
|
406
363
|
|
|
407
364
|
// REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
@@ -410,6 +367,10 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
410
367
|
this.p2pService.registerBlockReceivedCallback(handler);
|
|
411
368
|
}
|
|
412
369
|
|
|
370
|
+
public registerCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
371
|
+
this.p2pService.registerCheckpointReceivedCallback(handler);
|
|
372
|
+
}
|
|
373
|
+
|
|
413
374
|
/**
|
|
414
375
|
* Uses the batched Request Response protocol to request a set of transactions from the network.
|
|
415
376
|
*/
|
|
@@ -652,7 +613,8 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
652
613
|
* @returns Block number of latest L2 Block we've synced with.
|
|
653
614
|
*/
|
|
654
615
|
public async getSyncedLatestBlockNum(): Promise<BlockNumber> {
|
|
655
|
-
|
|
616
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
617
|
+
return tips.proposed.number;
|
|
656
618
|
}
|
|
657
619
|
|
|
658
620
|
/**
|
|
@@ -660,11 +622,13 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
660
622
|
* @returns Block number of latest proven L2 Block we've synced with.
|
|
661
623
|
*/
|
|
662
624
|
public async getSyncedProvenBlockNum(): Promise<BlockNumber> {
|
|
663
|
-
|
|
625
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
626
|
+
return tips.proven.block.number;
|
|
664
627
|
}
|
|
665
628
|
|
|
666
629
|
public async getSyncedFinalizedBlockNum(): Promise<BlockNumber> {
|
|
667
|
-
|
|
630
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
631
|
+
return tips.finalized.block.number;
|
|
668
632
|
}
|
|
669
633
|
|
|
670
634
|
/** Returns latest L2 slot for which we have seen an L2 block. */
|
|
@@ -700,7 +664,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
700
664
|
private async markTxsAsMinedFromBlocks(blocks: L2Block[]): Promise<void> {
|
|
701
665
|
for (const block of blocks) {
|
|
702
666
|
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
703
|
-
await this.txPool.markAsMined(txHashes, block.
|
|
667
|
+
await this.txPool.markAsMined(txHashes, block.header);
|
|
704
668
|
}
|
|
705
669
|
}
|
|
706
670
|
|
|
@@ -709,29 +673,18 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
709
673
|
* @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
|
|
710
674
|
* @returns Empty promise.
|
|
711
675
|
*/
|
|
712
|
-
private async handleLatestL2Blocks(blocks:
|
|
676
|
+
private async handleLatestL2Blocks(blocks: L2Block[]): Promise<void> {
|
|
713
677
|
if (!blocks.length) {
|
|
714
678
|
return Promise.resolve();
|
|
715
679
|
}
|
|
716
680
|
|
|
717
|
-
await this.markTxsAsMinedFromBlocks(blocks
|
|
718
|
-
await this.
|
|
719
|
-
|
|
720
|
-
const lastBlock = blocks.at(-1)!.block;
|
|
681
|
+
await this.markTxsAsMinedFromBlocks(blocks);
|
|
682
|
+
await this.txPool.clearNonEvictableTxs();
|
|
683
|
+
await this.startCollectingMissingTxs(blocks);
|
|
721
684
|
|
|
722
|
-
|
|
723
|
-
blocks.map(async block =>
|
|
724
|
-
this.setBlockHash({
|
|
725
|
-
number: block.block.number,
|
|
726
|
-
hash: await block.block.hash().then(h => h.toString()),
|
|
727
|
-
}),
|
|
728
|
-
),
|
|
729
|
-
);
|
|
730
|
-
|
|
731
|
-
await this.synchedLatestBlockNumber.set(lastBlock.number);
|
|
685
|
+
const lastBlock = blocks.at(-1)!;
|
|
732
686
|
await this.synchedLatestSlot.set(BigInt(lastBlock.header.getSlot()));
|
|
733
687
|
this.log.verbose(`Synched to latest block ${lastBlock.number}`);
|
|
734
|
-
await this.startServiceIfSynched();
|
|
735
688
|
}
|
|
736
689
|
|
|
737
690
|
/** Request txs for unproven blocks so the prover node has more chances to get them. */
|
|
@@ -782,12 +735,9 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
782
735
|
await this.txPool.deleteTxs(txHashes, { permanently: true });
|
|
783
736
|
await this.txPool.cleanupDeletedMinedTxs(lastBlockNum);
|
|
784
737
|
|
|
785
|
-
await this.attestationPool
|
|
738
|
+
await this.attestationPool.deleteCheckpointAttestationsOlderThan(lastBlockSlot);
|
|
786
739
|
|
|
787
|
-
await this.synchedFinalizedBlockNumber.set(lastBlockNum);
|
|
788
740
|
this.log.debug(`Synched to finalized block ${lastBlockNum} at slot ${lastBlockSlot}`);
|
|
789
|
-
|
|
790
|
-
await this.startServiceIfSynched();
|
|
791
741
|
}
|
|
792
742
|
|
|
793
743
|
/**
|
|
@@ -833,21 +783,18 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
833
783
|
this.log.info(`Deleting ${minedTxsFromReorg.length} mined txs from reorg`);
|
|
834
784
|
await this.txPool.deleteTxs(minedTxsFromReorg);
|
|
835
785
|
} else {
|
|
836
|
-
this.
|
|
837
|
-
await this.txPool.markMinedAsPending(minedTxsFromReorg);
|
|
786
|
+
await this.txPool.markMinedAsPending(minedTxsFromReorg, latestBlock);
|
|
838
787
|
}
|
|
839
|
-
|
|
840
|
-
await this.synchedLatestBlockNumber.set(latestBlock);
|
|
841
|
-
// no need to update block hashes, as they will be updated as new blocks are added
|
|
842
788
|
}
|
|
843
789
|
|
|
844
790
|
private async startServiceIfSynched() {
|
|
845
791
|
if (this.currentState !== P2PClientState.SYNCHING) {
|
|
846
792
|
return;
|
|
847
793
|
}
|
|
848
|
-
const
|
|
849
|
-
const
|
|
850
|
-
const
|
|
794
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
795
|
+
const syncedFinalizedBlock = tips.finalized.block.number;
|
|
796
|
+
const syncedProvenBlock = tips.proven.block.number;
|
|
797
|
+
const syncedLatestBlock = tips.proposed.number;
|
|
851
798
|
|
|
852
799
|
if (
|
|
853
800
|
syncedLatestBlock >= this.latestBlockNumberAtStart &&
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# ProposalTxCollector Benchmarks
|
|
2
|
+
|
|
3
|
+
This benchmark suite measures **how quickly a proposer node can fetch missing transactions from P2P peers** when building a block proposal. It compares two alternative transaction-collection implementations under several controlled "who-has-which-txs" distributions.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
When proposing a block, the node may have a block proposal containing a list of `txHashes`, but may be **missing the full `Tx` objects** locally. The node must fetch those missing txs from peers via the P2P req/resp layer.
|
|
8
|
+
|
|
9
|
+
This benchmark answers:
|
|
10
|
+
|
|
11
|
+
- How long does it take to fetch **N missing txs** (N ∈ **{10, 50, 100, 500}**)?
|
|
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
|
+
|
|
20
|
+
## Architecture
|
|
21
|
+
|
|
22
|
+
The benchmark runs a small simulated network on localhost:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
┌─────────────────────────────────────────────────────────────────────┐
|
|
26
|
+
│ Test Process (Driver) │
|
|
27
|
+
│ p2p_client.proposal_tx_collector.bench.test.ts │
|
|
28
|
+
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
29
|
+
│ │ WorkerClientManager │ │
|
|
30
|
+
│ │ (src/testbench/worker_client_manager.ts) │ │
|
|
31
|
+
│ └─────────────────────────────────────────────────────────────┘ │
|
|
32
|
+
│ │ IPC │
|
|
33
|
+
│ ┌────────────────────┼────────────────────┐ │
|
|
34
|
+
│ ▼ ▼ ▼ │
|
|
35
|
+
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
|
|
36
|
+
│ │ Worker 0 │◄──────►│ Worker 1 │◄──────►│ Worker N-1│ │
|
|
37
|
+
│ │ (Collector│ P2P │(Responder)│ P2P │(Responder)│ │
|
|
38
|
+
│ │ Node) │ │ │ │ │ │
|
|
39
|
+
│ │ TxPool:[] │ │ TxPool: │ │ TxPool: │ │
|
|
40
|
+
│ │ │ │ [txs...] │ │ [txs...] │ │
|
|
41
|
+
│ └───────────┘ └───────────┘ └───────────┘ │
|
|
42
|
+
└─────────────────────────────────────────────────────────────────────┘
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- **N worker processes** are spawned using Node's **`child_process.fork()`**
|
|
46
|
+
- Each worker runs a "light" **`P2PClient.Full`** node (enough to exercise the real P2P req/resp machinery)
|
|
47
|
+
- Workers communicate with the test process via **IPC messages** defined in `p2p_client_testbench_worker.ts`
|
|
48
|
+
|
|
49
|
+
### Why multiple processes?
|
|
50
|
+
|
|
51
|
+
Using separate OS processes makes the setup closer to real networking behavior (independent event loops, scheduling, IPC boundaries), and avoids many artifacts you'd get by running everything in one process.
|
|
52
|
+
|
|
53
|
+
### Worker roles
|
|
54
|
+
|
|
55
|
+
The network is intentionally asymmetric:
|
|
56
|
+
|
|
57
|
+
- **Worker 0 is the collector/proposer node**
|
|
58
|
+
- Starts with an **empty tx pool** (`[]`)
|
|
59
|
+
- Is the only worker instructed to run the collector for each `BENCH_REQRESP` command
|
|
60
|
+
- **Workers 1..N-1 are responder peers**
|
|
61
|
+
- Locally generate and filter txs according to the distribution pattern
|
|
62
|
+
- Respond to req/resp queries made by Worker 0's collector
|
|
63
|
+
|
|
64
|
+
This models a proposer that has only `txHashes` in a proposal and must fetch the full tx bodies from the network.
|
|
65
|
+
|
|
66
|
+
## Transaction Distribution Patterns
|
|
67
|
+
|
|
68
|
+
Each benchmark case generates `missingTxCount` mock txs and assigns them to peers using one of these patterns:
|
|
69
|
+
|
|
70
|
+
### `uniform`
|
|
71
|
+
|
|
72
|
+
**Every responder peer has every transaction.**
|
|
73
|
+
|
|
74
|
+
- Simulates the best-case: high replication / high gossip success
|
|
75
|
+
- Expectation: collector should quickly succeed; differences mostly reflect collector overhead and batching strategy
|
|
76
|
+
|
|
77
|
+
### `sparse`
|
|
78
|
+
|
|
79
|
+
**Each transaction exists on only a small subset of peers.**
|
|
80
|
+
|
|
81
|
+
Each responder is bucketed and holds txs whose index falls into its bucket or the "next" bucket (striped by tx index).
|
|
82
|
+
|
|
83
|
+
- Simulates partial propagation, churn, or uneven mempool convergence
|
|
84
|
+
- Expectation: collector must query multiple peers and cope with "misses"
|
|
85
|
+
|
|
86
|
+
### `pinned-only`
|
|
87
|
+
|
|
88
|
+
**Only a single "pinned" peer has the transactions; all other peers have none.**
|
|
89
|
+
|
|
90
|
+
- Simulates "I know exactly who has the txs" (or a topology where one peer is the source of truth)
|
|
91
|
+
- Useful to test whether "pinned peer" fast-paths work as intended
|
|
92
|
+
|
|
93
|
+
> **Guardrail:** the pinned peer index must be within `(0, numberOfPeers)` (Worker 0 cannot be pinned).
|
|
94
|
+
|
|
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
|
+
## Test Parameters
|
|
116
|
+
|
|
117
|
+
| Parameter | Value | Description |
|
|
118
|
+
|-----------|-------|-------------|
|
|
119
|
+
| `PEERS_PER_RUN` | 30 | Number of worker processes spawned |
|
|
120
|
+
| `MISSING_TX_COUNTS` | 10, 50, 100, 500 | Number of missing transactions to fetch |
|
|
121
|
+
| `TIMEOUT_MS` | 30,000 ms | Collector timeout per case |
|
|
122
|
+
| `TEST_TIMEOUT_MS` | 600,000 ms | Overall Jest timeout (10 minutes) |
|
|
123
|
+
|
|
124
|
+
## Running
|
|
125
|
+
|
|
126
|
+
From the p2p package:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
cd yarn-project/p2p
|
|
130
|
+
yarn test src/client/test/tx_proposal_collector/p2p_client.proposal_tx_collector.bench.test.ts
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Or from repo root:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
yarn test p2p_client.proposal_tx_collector.bench.test.ts
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
The benchmark is intentionally long due to spawning many processes and running multiple cases.
|
|
140
|
+
|
|
141
|
+
## Output Formats
|
|
142
|
+
|
|
143
|
+
### Default: Markdown table to stdout
|
|
144
|
+
|
|
145
|
+
If no env vars are set, the suite prints a table:
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
| Collector | Distribution | Missing | Duration (ms) | Fetched | Success |
|
|
149
|
+
|---------------------|--------------|---------|---------------|---------|---------|
|
|
150
|
+
| batch-requester | pinned-only | 10 | 123 | 10 | Yes |
|
|
151
|
+
| send-batch-request | pinned-only | 10 | 145 | 10 | Yes |
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Plus a comparison summary stating which collector was faster per `(distribution, missing)` pair.
|
|
155
|
+
|
|
156
|
+
### JSON metrics (for CI/dashboards)
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
BENCH_OUTPUT=/path/results.json yarn test ...
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Writes JSON metrics like:
|
|
163
|
+
- `ProposalTxCollector/<collector>/<distribution>/missing_<N>/duration` (ms)
|
|
164
|
+
- `ProposalTxCollector/<collector>/<distribution>/missing_<N>/fetched` (txs)
|
|
165
|
+
|
|
166
|
+
### Markdown file output
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
BENCH_OUTPUT_MD=/path/results.md yarn test ...
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Writes the pretty table + summary to disk.
|
|
173
|
+
|
|
174
|
+
## Interpreting Results
|
|
175
|
+
|
|
176
|
+
For each case the benchmark records:
|
|
177
|
+
|
|
178
|
+
- `durationMs`: wall-clock time spent inside the collector call
|
|
179
|
+
- `fetchedCount`: how many txs were returned by the collector
|
|
180
|
+
- `success`: `fetchedCount === missingTxCount`
|
|
181
|
+
|
|
182
|
+
**Guidelines:**
|
|
183
|
+
|
|
184
|
+
- **Always check `Success` first.** A faster run that fetched fewer txs is not a win.
|
|
185
|
+
- Compare collectors **within the same distribution + missing count** only.
|
|
186
|
+
- 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
|
+
- Expect `sparse` to be the most "network-like" stress case, since many peers won't have each requested tx.
|
|
188
|
+
|
|
189
|
+
## Determinism / Noise Reduction
|
|
190
|
+
|
|
191
|
+
Inside each worker, the benchmark intentionally reduces variability:
|
|
192
|
+
|
|
193
|
+
- **Unlimited rate limits** are installed so the req/resp rate limiter doesn't dominate results
|
|
194
|
+
- **Deterministic tx generation** ensures all workers see the same tx set without large IPC payloads
|
|
195
|
+
|
|
196
|
+
This makes the benchmark better for *comparing collectors* (A vs B), but it is **not** a perfect model of production networking conditions.
|
|
197
|
+
|
|
198
|
+
## Limitations
|
|
199
|
+
|
|
200
|
+
This benchmark does **not** measure:
|
|
201
|
+
|
|
202
|
+
- Real internet latency, NAT traversal, or adversarial peers (everything runs on localhost)
|
|
203
|
+
- End-to-end proposer behavior beyond tx fetching (block construction, proving, etc.)
|
|
204
|
+
- Gossip-based mempool convergence—tx availability is injected directly into each worker's in-memory tx pool
|
|
205
|
+
|
|
206
|
+
## Files
|
|
207
|
+
|
|
208
|
+
| File | Purpose |
|
|
209
|
+
|------|---------|
|
|
210
|
+
| `p2p_client.proposal_tx_collector.bench.test.ts` | Test suite (cases, distributions, output formatting) |
|
|
211
|
+
| `proposal_tx_collector_worker.ts` | Collector-specific worker implementation |
|
|
212
|
+
| `proposal_tx_collector_worker_protocol.ts` | IPC message types and serialization |
|
|
213
|
+
| `src/testbench/worker_client_manager.ts` | Worker process manager (forking, IPC, orchestration) |
|
|
214
|
+
| `src/testbench/p2p_client_testbench_worker.ts` | General testbench worker implementation |
|
|
215
|
+
| `src/test-helpers/testbench-utils.ts` | Shared mocks and utilities (InMemoryTxPool, InMemoryAttestationPool, etc.) |
|
|
216
|
+
|
|
217
|
+
## Implementation Notes
|
|
218
|
+
|
|
219
|
+
- Workers run TypeScript via `ts-node/esm` unless a compiled JS worker exists at `dest/testbench/p2p_client_testbench_worker.js`
|
|
220
|
+
- Request/response rate limits are overridden so the benchmark is not throttled
|
|
221
|
+
- Workers generate txs locally from a shared seed to avoid sending large tx payloads over IPC
|
|
222
|
+
|
|
223
|
+
## Practical Tips
|
|
224
|
+
|
|
225
|
+
- Run on an otherwise idle machine; CPU scheduling noise matters when spawning 30 node processes
|
|
226
|
+
- If you see intermittent failures, increase `TIMEOUT_MS` or reduce `PEERS_PER_RUN` for local iteration
|
|
227
|
+
- Use `BENCH_OUTPUT` in CI to track performance regressions over time
|