@aztec/p2p 0.0.1-commit.b655e406 → 0.0.1-commit.c2595eba
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/index.d.ts +1 -1
- package/dest/client/interface.d.ts +18 -3
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +16 -37
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +464 -126
- 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 +69 -60
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +23 -14
- package/dest/enr/generate-enr.d.ts +1 -1
- package/dest/enr/index.d.ts +1 -1
- package/dest/errors/attestation-pool.error.d.ts +7 -0
- package/dest/errors/attestation-pool.error.d.ts.map +1 -0
- package/dest/errors/attestation-pool.error.js +12 -0
- package/dest/errors/reqresp.error.d.ts +1 -1
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/index.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +77 -36
- 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 +241 -266
- package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +24 -14
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +123 -95
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +18 -12
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +91 -108
- package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -10
- 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/index.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts +9 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +37 -10
- 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 +33 -58
- 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 +11 -6
- 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 +30 -24
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -6
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +57 -24
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +76 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/index.js +1 -0
- 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/msg_seen_validator/msg_seen_validator.d.ts +1 -1
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +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/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/allowed_public_setup.d.ts +1 -1
- 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 +10 -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 +6 -4
- 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 +5 -3
- 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/discv5/discV5_service.d.ts +1 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- 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/gossipsub/scoring.d.ts +1 -1
- package/dest/services/index.d.ts +1 -1
- 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 +36 -71
- package/dest/services/libp2p/libp2p_service.d.ts +48 -81
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +926 -193
- package/dest/services/peer-manager/interface.d.ts +1 -1
- package/dest/services/peer-manager/metrics.d.ts +9 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +39 -16
- package/dest/services/peer-manager/peer_manager.d.ts +2 -33
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +6 -12
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +43 -2
- 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/config.d.ts +1 -1
- 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 -4
- 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/index.d.ts +1 -1
- 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.d.ts +1 -1
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block.js +3 -2
- 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 +14 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +17 -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 +34 -4
- package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.d.ts +1 -1
- package/dest/services/reqresp/protocols/ping.d.ts +1 -1
- package/dest/services/reqresp/protocols/status.d.ts +6 -5
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +7 -3
- 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/rate-limiter/index.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +2 -2
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts +6 -41
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +460 -46
- package/dest/services/reqresp/status.d.ts +2 -2
- package/dest/services/reqresp/status.d.ts.map +1 -1
- 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 +9 -12
- 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/slow_tx_collection.d.ts +4 -5
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +2 -1
- package/dest/services/tx_collection/tx_collection.d.ts +10 -10
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +5 -5
- package/dest/services/tx_collection/tx_collection_sink.d.ts +3 -3
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- 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_provider.d.ts +4 -2
- 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/generate-peer-id-private-keys.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts.map +1 -1
- 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/make-enrs.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts +2 -2
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.d.ts +4 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
- package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
- 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 -120
- package/dest/testbench/parse_log_file.d.ts +1 -1
- package/dest/testbench/testbench.d.ts +1 -1
- 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/dest/types/index.d.ts +1 -1
- package/dest/util.d.ts +2 -1
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +11 -2
- package/dest/versioning.d.ts +1 -1
- package/package.json +19 -18
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +11 -20
- package/src/client/interface.ts +20 -2
- package/src/client/p2p_client.ts +108 -155
- 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 +36 -20
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +86 -35
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +243 -278
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +175 -111
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +147 -136
- package/src/mem_pools/attestation_pool/mocks.ts +21 -15
- package/src/mem_pools/instrumentation.ts +48 -10
- 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 +367 -371
- 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 +11 -5
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +23 -17
- package/src/msg_validators/attestation_validator/attestation_validator.ts +45 -32
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +94 -0
- package/src/msg_validators/attestation_validator/index.ts +1 -0
- 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 +67 -25
- 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 +8 -4
- 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 +11 -5
- 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/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 +39 -71
- package/src/services/libp2p/libp2p_service.ts +628 -194
- package/src/services/peer-manager/metrics.ts +44 -16
- package/src/services/peer-manager/peer_manager.ts +7 -4
- package/src/services/peer-manager/peer_scoring.ts +45 -3
- 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 +3 -2
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +16 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -5
- package/src/services/reqresp/protocols/status.ts +16 -12
- 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 +39 -15
- 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/slow_tx_collection.ts +5 -4
- package/src/services/tx_collection/tx_collection.ts +10 -9
- package/src/services/tx_provider.ts +19 -3
- 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 -116
- package/src/testbench/worker_client_manager.ts +304 -42
- package/src/util.ts +12 -2
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
- 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 -238
- 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 -70
- 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 -283
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -81
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Attributes,
|
|
3
3
|
type Gauge,
|
|
4
|
+
type Histogram,
|
|
4
5
|
Metrics,
|
|
5
6
|
type TelemetryClient,
|
|
6
7
|
type Tracer,
|
|
7
8
|
type UpDownCounter,
|
|
8
|
-
|
|
9
|
+
createUpDownCounterWithDefault,
|
|
9
10
|
getTelemetryClient,
|
|
10
11
|
} from '@aztec/telemetry-client';
|
|
11
12
|
|
|
12
|
-
import
|
|
13
|
+
import type { PeerId } from '@libp2p/interface';
|
|
14
|
+
|
|
15
|
+
import { GoodByeReason, prettyGoodbyeReason } from '../reqresp/protocols/index.js';
|
|
13
16
|
|
|
14
17
|
export class PeerManagerMetrics {
|
|
15
18
|
private sentGoodbyes: UpDownCounter;
|
|
16
19
|
private receivedGoodbyes: UpDownCounter;
|
|
17
20
|
private peerCount: Gauge;
|
|
21
|
+
private lowScoreDisconnects: UpDownCounter;
|
|
22
|
+
private peerConnectionDuration: Histogram;
|
|
23
|
+
|
|
24
|
+
private peerConnectedAt: Map<string, number> = new Map<string, number>();
|
|
18
25
|
|
|
19
26
|
public readonly tracer: Tracer;
|
|
20
27
|
|
|
@@ -25,21 +32,27 @@ export class PeerManagerMetrics {
|
|
|
25
32
|
this.tracer = telemetryClient.getTracer(name);
|
|
26
33
|
|
|
27
34
|
const meter = telemetryClient.getMeter(name);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
this.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
const goodbyeReasonAttrs = {
|
|
36
|
+
[Attributes.P2P_GOODBYE_REASON]: [
|
|
37
|
+
prettyGoodbyeReason(GoodByeReason.SHUTDOWN),
|
|
38
|
+
prettyGoodbyeReason(GoodByeReason.MAX_PEERS),
|
|
39
|
+
prettyGoodbyeReason(GoodByeReason.LOW_SCORE),
|
|
40
|
+
prettyGoodbyeReason(GoodByeReason.BANNED),
|
|
41
|
+
prettyGoodbyeReason(GoodByeReason.WRONG_NETWORK),
|
|
42
|
+
prettyGoodbyeReason(GoodByeReason.UNKNOWN),
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
this.sentGoodbyes = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_GOODBYES_SENT, goodbyeReasonAttrs);
|
|
46
|
+
this.receivedGoodbyes = createUpDownCounterWithDefault(
|
|
47
|
+
meter,
|
|
48
|
+
Metrics.PEER_MANAGER_GOODBYES_RECEIVED,
|
|
49
|
+
goodbyeReasonAttrs,
|
|
50
|
+
);
|
|
51
|
+
this.peerCount = meter.createGauge(Metrics.PEER_MANAGER_PEER_COUNT);
|
|
52
|
+
this.lowScoreDisconnects = createUpDownCounterWithDefault(meter, Metrics.PEER_MANAGER_LOW_SCORE_DISCONNECTS, {
|
|
53
|
+
[Attributes.P2P_PEER_SCORE_STATE]: ['Banned', 'Disconnect'],
|
|
42
54
|
});
|
|
55
|
+
this.peerConnectionDuration = meter.createHistogram(Metrics.PEER_MANAGER_PEER_CONNECTION_DURATION);
|
|
43
56
|
}
|
|
44
57
|
|
|
45
58
|
public recordGoodbyeSent(reason: GoodByeReason) {
|
|
@@ -53,4 +66,19 @@ export class PeerManagerMetrics {
|
|
|
53
66
|
public recordPeerCount(count: number) {
|
|
54
67
|
this.peerCount.record(count);
|
|
55
68
|
}
|
|
69
|
+
|
|
70
|
+
public recordLowScoreDisconnect(scoreState: 'Banned' | 'Disconnect') {
|
|
71
|
+
this.lowScoreDisconnects.add(1, { [Attributes.P2P_PEER_SCORE_STATE]: scoreState });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public peerConnected(id: PeerId) {
|
|
75
|
+
this.peerConnectedAt.set(id.toString(), Date.now());
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public peerDisconnected(id: PeerId) {
|
|
79
|
+
const connectedAt = this.peerConnectedAt.get(id.toString());
|
|
80
|
+
if (connectedAt) {
|
|
81
|
+
this.peerConnectionDuration.record(Date.now() - connectedAt);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
56
84
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
-
import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto';
|
|
2
|
+
import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
3
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
4
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
5
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { bufferToHex } from '@aztec/foundation/string';
|
|
7
7
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
8
8
|
import type { PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
9
9
|
import type { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
10
|
-
import {
|
|
10
|
+
import type { TelemetryClient } from '@aztec/telemetry-client';
|
|
11
11
|
|
|
12
12
|
import type { Connection, PeerId } from '@libp2p/interface';
|
|
13
13
|
import { peerIdFromString } from '@libp2p/peer-id';
|
|
@@ -161,7 +161,6 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
161
161
|
return this.metrics.tracer;
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
-
@trackSpan('PeerManager.heartbeat')
|
|
165
164
|
public async heartbeat() {
|
|
166
165
|
this.heartbeatCounter++;
|
|
167
166
|
this.peerScoring.decayAllScores();
|
|
@@ -278,6 +277,7 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
278
277
|
private handleConnectedPeerEvent(e: CustomEvent<PeerId>) {
|
|
279
278
|
const peerId = e.detail;
|
|
280
279
|
this.logger.verbose(`Connected to peer ${peerId.toString()}`);
|
|
280
|
+
this.metrics.peerConnected(peerId);
|
|
281
281
|
if (this.config.p2pDisableStatusHandshake) {
|
|
282
282
|
return;
|
|
283
283
|
}
|
|
@@ -303,6 +303,7 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
303
303
|
*/
|
|
304
304
|
private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
|
|
305
305
|
const peerId = e.detail;
|
|
306
|
+
this.metrics.peerDisconnected(peerId);
|
|
306
307
|
this.logger.verbose(`Disconnected from peer ${peerId.toString()}`);
|
|
307
308
|
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerId.toString());
|
|
308
309
|
if (validatorAddress !== undefined) {
|
|
@@ -577,9 +578,11 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
577
578
|
const score = this.peerScoring.getScoreState(peer.remotePeer.toString());
|
|
578
579
|
switch (score) {
|
|
579
580
|
case PeerScoreState.Banned:
|
|
581
|
+
this.metrics.recordLowScoreDisconnect('Banned');
|
|
580
582
|
void this.goodbyeAndDisconnectPeer(peer.remotePeer, GoodByeReason.BANNED);
|
|
581
583
|
break;
|
|
582
584
|
case PeerScoreState.Disconnect:
|
|
585
|
+
this.metrics.recordLowScoreDisconnect('Disconnect');
|
|
583
586
|
void this.goodbyeAndDisconnectPeer(peer.remotePeer, GoodByeReason.LOW_SCORE);
|
|
584
587
|
break;
|
|
585
588
|
case PeerScoreState.Healthy:
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { median } from '@aztec/foundation/collection';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
4
|
+
import {
|
|
5
|
+
Attributes,
|
|
6
|
+
Metrics,
|
|
7
|
+
type TelemetryClient,
|
|
8
|
+
type UpDownCounter,
|
|
9
|
+
createUpDownCounterWithDefault,
|
|
10
|
+
getTelemetryClient,
|
|
11
|
+
} from '@aztec/telemetry-client';
|
|
4
12
|
|
|
5
13
|
import type { PeerId } from '@libp2p/interface';
|
|
6
14
|
|
|
@@ -30,7 +38,9 @@ export class PeerScoring {
|
|
|
30
38
|
private decayFactor = 0.9;
|
|
31
39
|
peerPenalties: { [key in PeerErrorSeverity]: number };
|
|
32
40
|
|
|
33
|
-
|
|
41
|
+
private peerStateCounter: UpDownCounter;
|
|
42
|
+
|
|
43
|
+
constructor(config: P2PConfig, telemetry: TelemetryClient = getTelemetryClient()) {
|
|
34
44
|
const orderedValues = config.peerPenaltyValues?.sort((a, b) => a - b);
|
|
35
45
|
this.peerPenalties = {
|
|
36
46
|
[PeerErrorSeverity.HighToleranceError]:
|
|
@@ -40,6 +50,12 @@ export class PeerScoring {
|
|
|
40
50
|
[PeerErrorSeverity.LowToleranceError]:
|
|
41
51
|
orderedValues?.[2] ?? DefaultPeerPenalties[PeerErrorSeverity.LowToleranceError],
|
|
42
52
|
};
|
|
53
|
+
|
|
54
|
+
const meter = telemetry.getMeter('PeerScoring');
|
|
55
|
+
|
|
56
|
+
this.peerStateCounter = createUpDownCounterWithDefault(meter, Metrics.P2P_PEER_STATE_COUNT, {
|
|
57
|
+
[Attributes.P2P_PEER_SCORE_STATE]: ['Healthy', 'Disconnect', 'Banned'],
|
|
58
|
+
});
|
|
43
59
|
}
|
|
44
60
|
|
|
45
61
|
public penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity) {
|
|
@@ -99,7 +115,33 @@ export class PeerScoring {
|
|
|
99
115
|
return PeerScoreState.Healthy;
|
|
100
116
|
}
|
|
101
117
|
|
|
102
|
-
getStats(): { medianScore: number } {
|
|
103
|
-
|
|
118
|
+
getStats(): { medianScore: number; healthyCount: number; disconnectCount: number; bannedCount: number } {
|
|
119
|
+
const stateCounts = { healthy: 0, disconnect: 0, banned: 0 };
|
|
120
|
+
|
|
121
|
+
for (const peerId of this.scores.keys()) {
|
|
122
|
+
const state = this.getScoreState(peerId);
|
|
123
|
+
switch (state) {
|
|
124
|
+
case PeerScoreState.Healthy:
|
|
125
|
+
stateCounts.healthy++;
|
|
126
|
+
break;
|
|
127
|
+
case PeerScoreState.Disconnect:
|
|
128
|
+
stateCounts.disconnect++;
|
|
129
|
+
break;
|
|
130
|
+
case PeerScoreState.Banned:
|
|
131
|
+
stateCounts.banned++;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
this.peerStateCounter.add(stateCounts.healthy, { [Attributes.P2P_PEER_SCORE_STATE]: 'Healthy' });
|
|
137
|
+
this.peerStateCounter.add(stateCounts.disconnect, { [Attributes.P2P_PEER_SCORE_STATE]: 'Disconnect' });
|
|
138
|
+
this.peerStateCounter.add(stateCounts.banned, { [Attributes.P2P_PEER_SCORE_STATE]: 'Banned' });
|
|
139
|
+
|
|
140
|
+
return {
|
|
141
|
+
medianScore: median(Array.from(this.scores.values())) ?? 0,
|
|
142
|
+
healthyCount: stateCounts.healthy,
|
|
143
|
+
disconnectCount: stateCounts.disconnect,
|
|
144
|
+
bannedCount: stateCounts.banned,
|
|
145
|
+
};
|
|
104
146
|
}
|
|
105
147
|
}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# BatchTxRequester
|
|
2
|
+
|
|
3
|
+
The `BatchTxRequester` is a specialized P2P service that aggressively fetches missing transactions from peers when a node receives a block proposal but lacks some of the referenced transactions. This is critical for validators who need all transactions to attest to a proposal.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
When a validator receives a block proposal, they must verify all transactions in the block. If some transactions are missing from the local mempool (e.g., due to gossip delays), the `BatchTxRequester` kicks in to fetch them via direct peer-to-peer requests before the attestation deadline.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
11
|
+
│ Block Proposal Received │
|
|
12
|
+
│ (contains hashes of N transactions) │
|
|
13
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
14
|
+
│
|
|
15
|
+
▼
|
|
16
|
+
┌─────────────────────────────────┐
|
|
17
|
+
│ Check local mempool for txs │
|
|
18
|
+
└─────────────────────────────────┘
|
|
19
|
+
│
|
|
20
|
+
┌─────────────────┴─────────────────┐
|
|
21
|
+
│ │
|
|
22
|
+
▼ ▼
|
|
23
|
+
┌─────────────────┐ ┌─────────────────┐
|
|
24
|
+
│ All txs found │ │ Missing M txs │
|
|
25
|
+
│ → Attest now │ │ │
|
|
26
|
+
└─────────────────┘ └─────────────────┘
|
|
27
|
+
│
|
|
28
|
+
▼
|
|
29
|
+
┌───────────────────────────────┐
|
|
30
|
+
│ BatchTxRequester.run() │
|
|
31
|
+
│ Fetch missing txs until │
|
|
32
|
+
│ deadline or all collected │
|
|
33
|
+
└───────────────────────────────┘
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Architecture
|
|
37
|
+
|
|
38
|
+
### Peer Classification
|
|
39
|
+
|
|
40
|
+
The requester classifies peers into three categories to optimize fetching:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
┌─────────────────────────────┐
|
|
44
|
+
│ All Known Peers │
|
|
45
|
+
└─────────────────────────────┘
|
|
46
|
+
│
|
|
47
|
+
┌────────────────────────────┼────────────────────────────┐
|
|
48
|
+
│ │ │
|
|
49
|
+
▼ ▼ ▼
|
|
50
|
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
51
|
+
│ Pinned Peer │ │ Dumb Peers │ │ Smart Peers │
|
|
52
|
+
│ │ │ │ │ │
|
|
53
|
+
│ The peer who │ │ Peers we query │ │ Peers that have │
|
|
54
|
+
│ sent us the │ │ blindly - we │ │ told us which │
|
|
55
|
+
│ block proposal. │ │ don't know what │ │ txs they have │
|
|
56
|
+
│ Should have ALL │ │ txs they have. │ │ via BitVector │
|
|
57
|
+
│ transactions. │ │ │ │ responses. │
|
|
58
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
59
|
+
│ │ │
|
|
60
|
+
│ │ │
|
|
61
|
+
▼ ▼ ▼
|
|
62
|
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
63
|
+
│ Queried in │ │ Queried with │ │ Queried with │
|
|
64
|
+
│ dedicated loop, │ │ full tx hashes │ │ BitVector only │
|
|
65
|
+
│ prioritizes │ │ (peer may not │ │ (peer has the │
|
|
66
|
+
│ least-requested │ │ have proposal) │ │ block proposal) │
|
|
67
|
+
│ transactions │ │ │ │ │
|
|
68
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Blind Phase → Smart Phase Transition
|
|
72
|
+
|
|
73
|
+
Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxsResponse` containing:
|
|
74
|
+
1. A matching `blockHash`
|
|
75
|
+
2. A non-empty `txIndices` BitVector indicating which transactions they have
|
|
76
|
+
3. At least one transaction we're still missing
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
┌──────────────────────────────────────────────────────────────────────────────┐
|
|
80
|
+
│ BLIND PHASE │
|
|
81
|
+
│ ┌────────────────────────────────────────────────────────────────────────┐ │
|
|
82
|
+
│ │ Initial State: All peers are "dumb" (except pinned peer) │ │
|
|
83
|
+
│ │ │ │
|
|
84
|
+
│ │ Request: [blockHash, txHashes (full list), txIndices (BitVector)] │ │
|
|
85
|
+
│ │ └─ Include full hashes because peer may not have proposal │ │
|
|
86
|
+
│ │ │ │
|
|
87
|
+
│ │ Response: [blockHash, txs[], txIndices (what peer has)] │ │
|
|
88
|
+
│ │ └─ Tells us exactly which txs this peer can provide │ │
|
|
89
|
+
│ └────────────────────────────────────────────────────────────────────────┘ │
|
|
90
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
91
|
+
│
|
|
92
|
+
│ Peer responds with valid txIndices
|
|
93
|
+
│ AND has txs we're missing
|
|
94
|
+
▼
|
|
95
|
+
┌──────────────────────────────────────────────────────────────────────────────┐
|
|
96
|
+
│ SMART PHASE │
|
|
97
|
+
│ ┌────────────────────────────────────────────────────────────────────────┐ │
|
|
98
|
+
│ │ Peer promoted to "smart" - we know exactly what they have │ │
|
|
99
|
+
│ │ │ │
|
|
100
|
+
│ │ Request: [blockHash, txIndices (BitVector only)] │ │
|
|
101
|
+
│ │ └─ No need for full hashes, peer has the proposal │ │
|
|
102
|
+
│ │ │ │
|
|
103
|
+
│ │ Response: [blockHash, txs[], txIndices (updated availability)] │ │
|
|
104
|
+
│ │ └─ May have received more txs since last response │ │
|
|
105
|
+
│ └────────────────────────────────────────────────────────────────────────┘ │
|
|
106
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Concurrent Worker Architecture
|
|
110
|
+
|
|
111
|
+
The `BatchTxRequester` runs three types of workers concurrently:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
┌─────────────────────────────────────┐
|
|
115
|
+
│ BatchTxRequester.run() │
|
|
116
|
+
│ │
|
|
117
|
+
│ ┌─────────────────────────────┐ │
|
|
118
|
+
│ │ txQueue (FifoMemoryQueue)│◄───┼──── Yields Tx objects
|
|
119
|
+
│ └─────────────────────────────┘ │ to caller
|
|
120
|
+
└─────────────────────────────────────┘
|
|
121
|
+
▲
|
|
122
|
+
│ put(tx)
|
|
123
|
+
┌──────────────────────────────┼────────────────────────────┐
|
|
124
|
+
│ │ │
|
|
125
|
+
│ │ │
|
|
126
|
+
┌──────────┴──────────┐ ┌───────────┴─────────┐ ┌──────────┴──────────┐
|
|
127
|
+
│ pinnedPeerRequester │ │ dumbRequester │ │ smartRequester │
|
|
128
|
+
│ │ │ │ │ │
|
|
129
|
+
│ Single dedicated │ │ N parallel workers │ │ M parallel workers │
|
|
130
|
+
│ loop for pinned │ │ (default: 10) │ │ (default: 10) │
|
|
131
|
+
│ peer │ │ │ │ │
|
|
132
|
+
│ │ │ Round-robin through │ │ Wait on semaphore │
|
|
133
|
+
│ Prioritizes txs │ │ available dumb │ │ until peers become │
|
|
134
|
+
│ that have been │ │ peers │ │ smart │
|
|
135
|
+
│ requested least │ │ │ │ │
|
|
136
|
+
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
|
|
137
|
+
│ │ │
|
|
138
|
+
└──────────────────────────────┼──────────────────────────────┘
|
|
139
|
+
│
|
|
140
|
+
▼
|
|
141
|
+
┌───────────────────────┐
|
|
142
|
+
│ requestTxBatch() │
|
|
143
|
+
│ │
|
|
144
|
+
│ sendRequestToPeer() │
|
|
145
|
+
│ via libp2p ReqResp │
|
|
146
|
+
└───────────────────────┘
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Wire Protocol
|
|
150
|
+
|
|
151
|
+
### BlockTxsRequest
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
class BlockTxsRequest {
|
|
155
|
+
blockHash: Fr; // 32-byte hash of the proposed block header
|
|
156
|
+
txHashes: TxHashArray; // Full tx hashes (for dumb peers without proposal)
|
|
157
|
+
txIndices: BitVector; // Which txs from proposal we're requesting (1 = want)
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### BlockTxsResponse
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
class BlockTxsResponse {
|
|
165
|
+
blockHash: Fr; // Echo back the block hash
|
|
166
|
+
txs: TxArray; // Actual transaction data
|
|
167
|
+
txIndices: BitVector; // Which txs the peer has available (1 = have)
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
The `BitVector` is a compact representation where each bit corresponds to a transaction index in the block proposal. This allows efficient capability advertisement without repeating full hashes.
|
|
172
|
+
|
|
173
|
+
## Key Files
|
|
174
|
+
|
|
175
|
+
| File | Description |
|
|
176
|
+
|------|-------------|
|
|
177
|
+
| `batch_tx_requester.ts` | Main orchestrator with worker loops |
|
|
178
|
+
| `missing_txs.ts` | Tracks metadata for each missing tx (request count, in-flight status, which peers have it) |
|
|
179
|
+
| `peer_collection.ts` | Manages peer classification (dumb/smart/bad) and rate limiting |
|
|
180
|
+
| `interface.ts` | Type definitions for dependencies |
|
|
181
|
+
| `../protocols/block_txs/` | Wire protocol definitions (`BlockTxsRequest`, `BlockTxsResponse`, `BitVector`) |
|
|
182
|
+
|
|
183
|
+
## Stopping Conditions
|
|
184
|
+
|
|
185
|
+
The `BatchTxRequester` stops when any of these conditions are met:
|
|
186
|
+
|
|
187
|
+
1. **All transactions fetched** - Success!
|
|
188
|
+
2. **Deadline exceeded** - Timeout configured by caller
|
|
189
|
+
3. **Abort signal** - External cancellation
|
|
190
|
+
4. **No transactions to fetch** - Nothing was missing
|
|
191
|
+
|
|
192
|
+
## Configuration
|
|
193
|
+
|
|
194
|
+
| Parameter | Default | Description |
|
|
195
|
+
|-----------|---------|-------------|
|
|
196
|
+
| `batchTxRequesterSmartParallelWorkerCount` | 10 | Max concurrent requests to smart peers |
|
|
197
|
+
| `batchTxRequesterDumbParallelWorkerCount` | 10 | Max concurrent requests to dumb peers |
|
|
198
|
+
| `batchTxRequesterTxBatchSize` | 8 | Max transactions per request |
|
|
199
|
+
| `batchTxRequesterBadPeerThreshold` | 2 | Penalties before marking peer as bad (see > threshold logic) |
|
|
200
|
+
| `RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL` | 1000ms | Cooldown after rate limit hit |
|
|
201
|
+
|
|
202
|
+
## Error Handling
|
|
203
|
+
|
|
204
|
+
### Peer States
|
|
205
|
+
|
|
206
|
+
- **Bad Peer**: After `batchTxRequesterBadPeerThreshold` penalties, peer is excluded from queries
|
|
207
|
+
- **Bad Peer Penalties**: A penalty is applied on `FAILURE`/`UNKNOWN` responses or when transaction validation fails
|
|
208
|
+
- **Rate Limited**: On `RATE_LIMIT_EXCEEDED` response, peer is temporarily excluded
|
|
209
|
+
- **Redemption**: A peer is removed from the bad set only after a successful response with all transactions valid (this clears the penalty counter)
|
|
210
|
+
- **Peer Scoring**: Each penalty is forwarded to the injected `peerScoring` service with a severity
|
|
211
|
+
|
|
212
|
+
### Failure Recovery
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
Request to peer fails
|
|
216
|
+
│
|
|
217
|
+
├── RATE_LIMIT_EXCEEDED → Mark peer rate-limited, sleep, retry later
|
|
218
|
+
│
|
|
219
|
+
├── FAILURE/UNKNOWN → Penalise peer (severity), increment penalty counter
|
|
220
|
+
│ │
|
|
221
|
+
│ ├── Counter < threshold → Continue querying
|
|
222
|
+
│ │
|
|
223
|
+
│ └── Counter ≥ threshold → Exclude peer
|
|
224
|
+
│
|
|
225
|
+
└── SUCCESS → Process response, if all transactions are valid clear penalties
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Usage Example
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
const requester = new BatchTxRequester(
|
|
232
|
+
missingTxHashes, // TxHash[] - what we need
|
|
233
|
+
blockProposal, // BlockProposal - the proposal we're attesting to
|
|
234
|
+
pinnedPeer, // PeerId | undefined - who sent us the proposal
|
|
235
|
+
timeoutMs, // number - how long to try
|
|
236
|
+
p2pService, // BatchTxRequesterLibP2PService
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
// Async generator yields transactions as they arrive
|
|
240
|
+
for await (const tx of requester.run()) {
|
|
241
|
+
// Process each transaction as it's fetched and validated
|
|
242
|
+
mempool.addTx(tx);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Or collect all at once
|
|
246
|
+
const txs = await BatchTxRequester.collectAllTxs(requester.run());
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## Integration with Broader Codebase
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
253
|
+
│ P2PClient │
|
|
254
|
+
│ │
|
|
255
|
+
│ Receives block proposals via gossipsub │
|
|
256
|
+
│ Triggers transaction collection when needed │
|
|
257
|
+
└───────────────────────────────────┬─────────────────────────────────────────┘
|
|
258
|
+
│
|
|
259
|
+
▼
|
|
260
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
261
|
+
│ TxCollection │
|
|
262
|
+
│ │
|
|
263
|
+
│ Coordinates Fast and Slow collection strategies │
|
|
264
|
+
│ Manages lifecycle of collection requests │
|
|
265
|
+
└───────────────────┬─────────────────────────────────┬───────────────────────┘
|
|
266
|
+
│ │
|
|
267
|
+
▼ ▼
|
|
268
|
+
┌───────────────────────────────────┐ ┌─────────────────────────────────────┐
|
|
269
|
+
│ FastTxCollection │ │ SlowTxCollection │
|
|
270
|
+
│ │ │ │
|
|
271
|
+
│ Time-critical: attestations │ │ Background: unproven blocks │
|
|
272
|
+
│ │ │ │
|
|
273
|
+
│ 1. Try RPC nodes first (fast) │ │ Periodic polling of RPC nodes │
|
|
274
|
+
│ 2. Fall back to BatchTxRequester │ │ and peers for missing txs │
|
|
275
|
+
│ │ │ │
|
|
276
|
+
└───────────────────┬───────────────┘ └─────────────────────────────────────┘
|
|
277
|
+
│
|
|
278
|
+
│ For 'proposal' requests
|
|
279
|
+
▼
|
|
280
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
281
|
+
│ BatchTxRequester │
|
|
282
|
+
│ │
|
|
283
|
+
│ Aggressive parallel fetching from multiple peers │
|
|
284
|
+
│ Uses BLOCK_TXS sub-protocol for efficient batching │
|
|
285
|
+
└───────────────────┬─────────────────────────────────────────────────────────┘
|
|
286
|
+
│
|
|
287
|
+
▼
|
|
288
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
289
|
+
│ ReqResp (libp2p) │
|
|
290
|
+
│ │
|
|
291
|
+
│ Low-level stream management │
|
|
292
|
+
│ sendRequestToPeer() → opens stream → sends request → awaits response │
|
|
293
|
+
└───────────────────┬─────────────────────────────────────────────────────────┘
|
|
294
|
+
│
|
|
295
|
+
▼
|
|
296
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
297
|
+
│ reqRespBlockTxsHandler (on peer) │
|
|
298
|
+
│ │
|
|
299
|
+
│ 1. Parse BlockTxsRequest │
|
|
300
|
+
│ 2. Look up block proposal in AttestationPool │
|
|
301
|
+
│ 3. Check TxPool for available transactions │
|
|
302
|
+
│ 4. Build BitVector of available tx indices │
|
|
303
|
+
│ 5. Return BlockTxsResponse with txs + availability info │
|
|
304
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
305
|
+
```
|