@aztec/p2p 0.0.1-commit.f504929 → 0.0.1-commit.f5a9928
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +22 -6
- package/dest/client/factory.d.ts +5 -4
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +39 -16
- package/dest/client/interface.d.ts +52 -12
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +36 -20
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +142 -81
- package/dest/config.d.ts +163 -98
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +130 -20
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +9 -16
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +10 -17
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +101 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +272 -199
- 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 +224 -65
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +6 -4
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +9 -4
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +28 -9
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +10 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +29 -20
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -4
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +3 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +6 -7
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +6 -5
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +11 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +24 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +41 -9
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +29 -11
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +46 -16
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +55 -41
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +19 -4
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +86 -32
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +50 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +262 -131
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +11 -5
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +11 -5
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +35 -10
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +128 -56
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +21 -32
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +36 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +25 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +55 -16
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +53 -7
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
- package/dest/msg_validators/tx_validator/index.d.ts +4 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +3 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +49 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +5 -5
- package/dest/services/discv5/discV5_service.d.ts +13 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +119 -23
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +18 -16
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +21 -16
- package/dest/services/encoding.d.ts +23 -6
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +32 -16
- package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +4 -14
- package/dest/services/libp2p/instrumentation.d.ts +6 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +21 -0
- package/dest/services/libp2p/libp2p_service.d.ts +51 -51
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +499 -333
- package/dest/services/peer-manager/peer_manager.d.ts +31 -3
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +125 -25
- package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +102 -13
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +81 -86
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- package/dest/services/reqresp/config.d.ts +15 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +11 -0
- package/dest/services/reqresp/interface.d.ts +16 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -20
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +73 -215
- package/dest/services/service.d.ts +43 -18
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +2 -23
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +2 -55
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/index.d.ts +2 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +0 -1
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +0 -2
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/tx_collection.d.ts +36 -55
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +275 -119
- package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +2 -2
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +13 -8
- package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +4 -14
- package/dest/services/tx_provider.d.ts +3 -1
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +3 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -2
- package/dest/test-helpers/mock-pubsub.d.ts +33 -9
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +57 -44
- package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +16 -18
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +15 -14
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +49 -15
- package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +104 -41
- package/dest/testbench/worker_client_manager.d.ts +12 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +57 -11
- package/dest/util.d.ts +12 -7
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +17 -17
- package/src/bootstrap/bootstrap.ts +17 -3
- package/src/client/factory.ts +62 -9
- package/src/client/interface.ts +48 -18
- package/src/client/p2p_client.ts +159 -113
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +233 -20
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +13 -19
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +327 -242
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +18 -12
- package/src/mem_pools/tx_pool_v2/README.md +9 -1
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +4 -5
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -7
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -6
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +27 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +40 -8
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +72 -20
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +62 -41
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +107 -32
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +291 -137
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +150 -58
- package/src/msg_validators/tx_validator/README.md +17 -3
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +16 -35
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +44 -1
- package/src/msg_validators/tx_validator/factory.ts +66 -9
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +117 -39
- package/src/msg_validators/tx_validator/index.ts +3 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/phases_validator.ts +60 -1
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +126 -14
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +26 -40
- package/src/services/encoding.ts +35 -19
- package/src/services/gossipsub/README.md +33 -11
- package/src/services/gossipsub/topic_score_params.ts +9 -18
- package/src/services/libp2p/instrumentation.ts +22 -0
- package/src/services/libp2p/libp2p_service.ts +560 -369
- package/src/services/peer-manager/peer_manager.ts +138 -24
- package/src/services/peer-manager/peer_scoring.ts +102 -8
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +77 -95
- package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +19 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +1 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
- package/src/services/reqresp/reqresp.ts +84 -259
- package/src/services/service.ts +51 -35
- package/src/services/tx_collection/config.ts +3 -80
- package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +331 -176
- package/src/services/tx_collection/tx_collection_sink.ts +2 -2
- package/src/services/tx_collection/tx_source.ts +10 -8
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +5 -0
- package/src/test-helpers/make-test-p2p-clients.ts +4 -1
- package/src/test-helpers/mock-pubsub.ts +61 -60
- package/src/test-helpers/reqresp-nodes.ts +13 -23
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +63 -28
- package/src/testbench/p2p_client_testbench_worker.ts +111 -57
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +33 -18
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/msg_validators/clock_tolerance.d.ts +0 -21
- package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
- package/dest/msg_validators/clock_tolerance.js +0 -37
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -378
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -327
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -211
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/clock_tolerance.ts +0 -51
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -387
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// @attribution: lodestar impl for inspiration
|
|
2
|
-
import { compactArray } from '@aztec/foundation/collection';
|
|
3
2
|
import { AbortError, TimeoutError } from '@aztec/foundation/error';
|
|
4
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
4
|
import { executeTimeout } from '@aztec/foundation/timer';
|
|
@@ -11,31 +10,30 @@ import type { Libp2p } from 'libp2p';
|
|
|
11
10
|
import { pipeline } from 'node:stream/promises';
|
|
12
11
|
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
13
12
|
|
|
13
|
+
import { IndividualReqRespTimeoutError, OversizedReqRespRequestError } from '../../errors/reqresp.error.js';
|
|
14
14
|
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
DEFAULT_MAX_RESPONSE_SIZE_KB,
|
|
16
|
+
OversizedSnappyResponseError,
|
|
17
|
+
ResponseSizeLimitExceededError,
|
|
18
|
+
SnappyTransform,
|
|
19
|
+
} from '../encoding.js';
|
|
20
20
|
import type { PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
21
21
|
import {
|
|
22
22
|
DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS,
|
|
23
23
|
DEFAULT_REQRESP_DIAL_TIMEOUT_MS,
|
|
24
|
+
MAX_REQRESP_REQUEST_SIZE_BYTES,
|
|
24
25
|
type P2PReqRespConfig,
|
|
25
26
|
} from './config.js';
|
|
26
|
-
import { BatchConnectionSampler } from './connection-sampler/batch_connection_sampler.js';
|
|
27
27
|
import { ConnectionSampler, RandomSampler } from './connection-sampler/connection_sampler.js';
|
|
28
28
|
import {
|
|
29
|
-
DEFAULT_SUB_PROTOCOL_VALIDATORS,
|
|
30
29
|
type ReqRespInterface,
|
|
31
30
|
type ReqRespResponse,
|
|
32
31
|
ReqRespSubProtocol,
|
|
33
32
|
type ReqRespSubProtocolHandler,
|
|
34
33
|
type ReqRespSubProtocolHandlers,
|
|
35
34
|
type ReqRespSubProtocolRateLimits,
|
|
36
|
-
type
|
|
37
|
-
|
|
38
|
-
responseFromBuffer,
|
|
35
|
+
type ShouldRejectPeer,
|
|
36
|
+
UNAUTHENTICATED_ALLOWED_PROTOCOLS,
|
|
39
37
|
subProtocolSizeCalculators,
|
|
40
38
|
} from './interface.js';
|
|
41
39
|
import { ReqRespMetrics } from './metrics.js';
|
|
@@ -44,13 +42,13 @@ import {
|
|
|
44
42
|
RequestResponseRateLimiter,
|
|
45
43
|
prettyPrintRateLimitStatus,
|
|
46
44
|
} from './rate-limiter/rate_limiter.js';
|
|
47
|
-
import { ReqRespStatus, ReqRespStatusError, parseStatusChunk
|
|
45
|
+
import { ReqRespStatus, ReqRespStatusError, parseStatusChunk } from './status.js';
|
|
48
46
|
|
|
49
47
|
/**
|
|
50
48
|
* The Request Response Service
|
|
51
49
|
*
|
|
52
50
|
* It allows nodes to request specific information from their peers, its use case covers recovering
|
|
53
|
-
* information that was missed during a
|
|
51
|
+
* information that was missed during a synchronisation or a gossip event.
|
|
54
52
|
*
|
|
55
53
|
* This service implements the request response sub protocol, it is heavily inspired from
|
|
56
54
|
* ethereum implementations of the same name.
|
|
@@ -65,13 +63,14 @@ export class ReqResp implements ReqRespInterface {
|
|
|
65
63
|
private dialTimeoutMs: number = DEFAULT_REQRESP_DIAL_TIMEOUT_MS;
|
|
66
64
|
|
|
67
65
|
private subProtocolHandlers: Partial<ReqRespSubProtocolHandlers> = {};
|
|
68
|
-
private subProtocolValidators: Partial<ReqRespSubProtocolValidators> = {};
|
|
69
66
|
|
|
70
67
|
private connectionSampler: ConnectionSampler;
|
|
71
68
|
private rateLimiter: RequestResponseRateLimiter;
|
|
72
69
|
|
|
73
70
|
private snappyTransform: SnappyTransform;
|
|
74
71
|
|
|
72
|
+
private shouldRejectPeer: ShouldRejectPeer | undefined;
|
|
73
|
+
|
|
75
74
|
private metrics: ReqRespMetrics;
|
|
76
75
|
|
|
77
76
|
constructor(
|
|
@@ -108,6 +107,10 @@ export class ReqResp implements ReqRespInterface {
|
|
|
108
107
|
}
|
|
109
108
|
}
|
|
110
109
|
|
|
110
|
+
public setShouldRejectPeer(checker: ShouldRejectPeer): void {
|
|
111
|
+
this.shouldRejectPeer = checker;
|
|
112
|
+
}
|
|
113
|
+
|
|
111
114
|
get tracer() {
|
|
112
115
|
return this.metrics.tracer;
|
|
113
116
|
}
|
|
@@ -122,11 +125,11 @@ export class ReqResp implements ReqRespInterface {
|
|
|
122
125
|
/**
|
|
123
126
|
* Start the reqresp service
|
|
124
127
|
*/
|
|
125
|
-
async start(subProtocolHandlers: ReqRespSubProtocolHandlers
|
|
128
|
+
async start(subProtocolHandlers: ReqRespSubProtocolHandlers) {
|
|
126
129
|
Object.assign(this.subProtocolHandlers, subProtocolHandlers);
|
|
127
|
-
Object.assign(this.subProtocolValidators, subProtocolValidators);
|
|
128
130
|
|
|
129
|
-
// Register
|
|
131
|
+
// Register streamHandler with libp2p.
|
|
132
|
+
// The streamHandler is responsible for reading the incoming stream, determining the protocol, then triggering the appropriate handler.
|
|
130
133
|
for (const subProtocol of Object.keys(subProtocolHandlers)) {
|
|
131
134
|
this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
|
|
132
135
|
await this.libp2p.handle(
|
|
@@ -140,13 +143,8 @@ export class ReqResp implements ReqRespInterface {
|
|
|
140
143
|
this.rateLimiter.start();
|
|
141
144
|
}
|
|
142
145
|
|
|
143
|
-
async addSubProtocol(
|
|
144
|
-
subProtocol: ReqRespSubProtocol,
|
|
145
|
-
handler: ReqRespSubProtocolHandler,
|
|
146
|
-
validator: ReqRespSubProtocolValidators[ReqRespSubProtocol] = DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol],
|
|
147
|
-
): Promise<void> {
|
|
146
|
+
async addSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
148
147
|
this.subProtocolHandlers[subProtocol] = handler;
|
|
149
|
-
this.subProtocolValidators[subProtocol] = validator;
|
|
150
148
|
this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
|
|
151
149
|
await this.libp2p.handle(
|
|
152
150
|
subProtocol,
|
|
@@ -180,225 +178,6 @@ export class ReqResp implements ReqRespInterface {
|
|
|
180
178
|
// NOTE: We assume libp2p instance is managed by the caller
|
|
181
179
|
}
|
|
182
180
|
|
|
183
|
-
/**
|
|
184
|
-
* Request multiple messages over the same sub protocol, balancing the requests across peers.
|
|
185
|
-
*
|
|
186
|
-
* @devnote
|
|
187
|
-
* - The function prioritizes sending requests to free peers using a batch sampling strategy.
|
|
188
|
-
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
189
|
-
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
190
|
-
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
191
|
-
*
|
|
192
|
-
* Requests are sent in parallel to each peer, but multiple requests are sent to the same peer in series
|
|
193
|
-
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
194
|
-
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
195
|
-
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
196
|
-
*
|
|
197
|
-
* @param subProtocol
|
|
198
|
-
* @param requests
|
|
199
|
-
* @param timeoutMs
|
|
200
|
-
* @param maxPeers
|
|
201
|
-
* @returns
|
|
202
|
-
*
|
|
203
|
-
* @throws {CollectiveReqRespTimeoutError} - If the request batch exceeds the specified timeout (`timeoutMs`).
|
|
204
|
-
*/
|
|
205
|
-
@trackSpan(
|
|
206
|
-
'ReqResp.sendBatchRequest',
|
|
207
|
-
(subProtocol: ReqRespSubProtocol, requests: InstanceType<SubProtocolMap[ReqRespSubProtocol]['request']>[]) => ({
|
|
208
|
-
[Attributes.P2P_REQ_RESP_PROTOCOL]: subProtocol,
|
|
209
|
-
[Attributes.P2P_REQ_RESP_BATCH_REQUESTS_COUNT]: requests.length,
|
|
210
|
-
}),
|
|
211
|
-
)
|
|
212
|
-
async sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
|
|
213
|
-
subProtocol: SubProtocol,
|
|
214
|
-
requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
|
|
215
|
-
pinnedPeer: PeerId | undefined,
|
|
216
|
-
timeoutMs = 10000,
|
|
217
|
-
maxPeers = Math.max(10, Math.ceil(requests.length / 3)),
|
|
218
|
-
maxRetryAttempts = 3,
|
|
219
|
-
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
|
|
220
|
-
const responseValidator = this.subProtocolValidators[subProtocol] ?? DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol];
|
|
221
|
-
const responses: InstanceType<SubProtocolMap[SubProtocol]['response']>[] = new Array(requests.length);
|
|
222
|
-
const requestBuffers = requests.map(req => req.toBuffer());
|
|
223
|
-
const isEmptyResponse = (value: unknown): boolean => {
|
|
224
|
-
// Some responses serialize to a non-empty buffer even when they contain no items (e.g., empty TxArray).
|
|
225
|
-
if (!value || typeof value !== 'object') {
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
const length = (value as { length?: number }).length;
|
|
229
|
-
return typeof length === 'number' && length === 0;
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
const requestFunction = async (signal: AbortSignal) => {
|
|
233
|
-
// Track which requests still need to be processed
|
|
234
|
-
const pendingRequestIndices = new Set(requestBuffers.map((_, i) => i));
|
|
235
|
-
|
|
236
|
-
// Create batch sampler with the total number of requests and max peers
|
|
237
|
-
const batchSampler = new BatchConnectionSampler(
|
|
238
|
-
this.connectionSampler,
|
|
239
|
-
requests.length,
|
|
240
|
-
maxPeers,
|
|
241
|
-
compactArray([pinnedPeer]), // Exclude pinned peer from sampling, we will forcefully send all requests to it
|
|
242
|
-
createLogger(`${this.logger.module}:batch-connection-sampler`),
|
|
243
|
-
);
|
|
244
|
-
|
|
245
|
-
if (batchSampler.activePeerCount === 0 && !pinnedPeer) {
|
|
246
|
-
this.logger.warn('No active peers to send requests to');
|
|
247
|
-
return [];
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// This is where it gets fun
|
|
251
|
-
// The outer loop is the retry loop, we will continue to retry until we process all indices we have
|
|
252
|
-
// not received a response for, or we have reached the max retry attempts
|
|
253
|
-
|
|
254
|
-
// The inner loop is the batch loop, we will process all requests for each peer in parallel
|
|
255
|
-
// We will then process the results of the requests, and resample any peers that failed to respond
|
|
256
|
-
// We will continue to retry until we have processed all indices, or we have reached the max retry attempts
|
|
257
|
-
|
|
258
|
-
let retryAttempts = 0;
|
|
259
|
-
while (pendingRequestIndices.size > 0 && batchSampler.activePeerCount > 0 && retryAttempts < maxRetryAttempts) {
|
|
260
|
-
if (signal.aborted) {
|
|
261
|
-
throw new AbortError('Batch request aborted');
|
|
262
|
-
}
|
|
263
|
-
// Process requests in parallel for each available peer
|
|
264
|
-
type BatchEntry = { peerId: PeerId; indices: number[] };
|
|
265
|
-
const requestBatches = new Map<string, BatchEntry>();
|
|
266
|
-
|
|
267
|
-
// Group requests by peer
|
|
268
|
-
for (const requestIndex of pendingRequestIndices) {
|
|
269
|
-
const peer = batchSampler.getPeerForRequest(requestIndex);
|
|
270
|
-
if (!peer) {
|
|
271
|
-
// No peer available for this specific index (all peers exhausted for it)
|
|
272
|
-
// Skip this index for now - it stays in pendingRequestIndices for retry
|
|
273
|
-
continue;
|
|
274
|
-
}
|
|
275
|
-
const peerAsString = peer.toString();
|
|
276
|
-
if (!requestBatches.has(peerAsString)) {
|
|
277
|
-
requestBatches.set(peerAsString, { peerId: peer, indices: [] });
|
|
278
|
-
}
|
|
279
|
-
requestBatches.get(peerAsString)!.indices.push(requestIndex);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// If there is a pinned peer, we will always send every request to that peer
|
|
283
|
-
// We use the default limits for the subprotocol to avoid hitting the rate limiter
|
|
284
|
-
if (pinnedPeer) {
|
|
285
|
-
const limit = this.rateLimiter.getRateLimits(subProtocol).peerLimit.quotaCount;
|
|
286
|
-
requestBatches.set(pinnedPeer.toString(), {
|
|
287
|
-
peerId: pinnedPeer,
|
|
288
|
-
indices: Array.from(pendingRequestIndices.values()).slice(0, limit),
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// If no requests could be assigned (all peers exhausted for all indices), exit early
|
|
293
|
-
if (requestBatches.size === 0) {
|
|
294
|
-
this.logger.warn('No peers available for any pending request indices, stopping batch request');
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Make parallel requests for each peer's batch
|
|
299
|
-
// A batch entry will look something like this:
|
|
300
|
-
// PeerId0: [0, 1, 2, 3]
|
|
301
|
-
// PeerId1: [4, 5, 6, 7]
|
|
302
|
-
|
|
303
|
-
// Peer Id 0 will send requests 0, 1, 2, 3 in serial
|
|
304
|
-
// while simultaneously Peer Id 1 will send requests 4, 5, 6, 7 in serial
|
|
305
|
-
|
|
306
|
-
const batchResults = await Promise.all(
|
|
307
|
-
Array.from(requestBatches.entries()).map(async ([peerAsString, { peerId: peer, indices }]) => {
|
|
308
|
-
try {
|
|
309
|
-
const markIndexFailed = (index: number) => batchSampler.markPeerFailedForIndex(peer, index);
|
|
310
|
-
// Requests all going to the same peer are sent synchronously
|
|
311
|
-
const peerResults: { index: number; response: InstanceType<SubProtocolMap[SubProtocol]['response']> }[] =
|
|
312
|
-
[];
|
|
313
|
-
let shouldReplacePeer = false;
|
|
314
|
-
const handleFailure = (status: ReqRespStatus, index: number) => {
|
|
315
|
-
this.logger.warn(
|
|
316
|
-
`Request to peer ${peerAsString} failed with status ${prettyPrintReqRespStatus(status)}`,
|
|
317
|
-
);
|
|
318
|
-
markIndexFailed(index);
|
|
319
|
-
return status === ReqRespStatus.RATE_LIMIT_EXCEEDED;
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
for (const index of indices) {
|
|
323
|
-
this.logger.info(`Sending request ${index} to peer ${peerAsString}`);
|
|
324
|
-
const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffers[index]);
|
|
325
|
-
|
|
326
|
-
// Check the status of the response buffer
|
|
327
|
-
if (response.status !== ReqRespStatus.SUCCESS) {
|
|
328
|
-
shouldReplacePeer = handleFailure(response.status, index);
|
|
329
|
-
if (shouldReplacePeer) {
|
|
330
|
-
break;
|
|
331
|
-
}
|
|
332
|
-
continue;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
if (response.data.length === 0) {
|
|
336
|
-
markIndexFailed(index);
|
|
337
|
-
continue;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
const object = responseFromBuffer(subProtocol, response.data);
|
|
341
|
-
if (isEmptyResponse(object)) {
|
|
342
|
-
markIndexFailed(index);
|
|
343
|
-
continue;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
const isValid = await responseValidator(requests[index], object, peer);
|
|
347
|
-
if (!isValid) {
|
|
348
|
-
markIndexFailed(index);
|
|
349
|
-
continue;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
peerResults.push({ index, response: object });
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
// If peer had a hard failure (rate limit), replace it for future iterations
|
|
356
|
-
if (shouldReplacePeer) {
|
|
357
|
-
this.logger.warn(`Peer ${peerAsString} hit a hard failure, removing from sampler`);
|
|
358
|
-
batchSampler.removePeerAndReplace(peer);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
return { peer, results: peerResults };
|
|
362
|
-
} catch (error) {
|
|
363
|
-
this.logger.warn(`Failed batch request to peer ${peerAsString}:`, error);
|
|
364
|
-
batchSampler.removePeerAndReplace(peer);
|
|
365
|
-
return { peer, results: [] };
|
|
366
|
-
}
|
|
367
|
-
}),
|
|
368
|
-
);
|
|
369
|
-
|
|
370
|
-
// Process results
|
|
371
|
-
for (const { results } of batchResults) {
|
|
372
|
-
for (const { index, response } of results) {
|
|
373
|
-
if (response) {
|
|
374
|
-
responses[index] = response;
|
|
375
|
-
pendingRequestIndices.delete(index);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
retryAttempts++;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
if (retryAttempts >= maxRetryAttempts) {
|
|
384
|
-
this.logger.warn(`Max retry attempts ${maxRetryAttempts} reached for batch request`);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
return responses;
|
|
388
|
-
};
|
|
389
|
-
|
|
390
|
-
try {
|
|
391
|
-
return await executeTimeout<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>(
|
|
392
|
-
requestFunction,
|
|
393
|
-
timeoutMs,
|
|
394
|
-
() => new CollectiveReqRespTimeoutError(),
|
|
395
|
-
);
|
|
396
|
-
} catch (e: any) {
|
|
397
|
-
this.logger.warn(`${e.message} | subProtocol: ${subProtocol}`);
|
|
398
|
-
return [];
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
181
|
/**
|
|
403
182
|
* Sends a request to a specific peer
|
|
404
183
|
*
|
|
@@ -434,6 +213,11 @@ export class ReqResp implements ReqRespInterface {
|
|
|
434
213
|
payload: Buffer,
|
|
435
214
|
dialTimeout: number = this.dialTimeoutMs,
|
|
436
215
|
): Promise<ReqRespResponse> {
|
|
216
|
+
// Thrown before the try block so the generic error handling below does not penalize the peer for our own bug.
|
|
217
|
+
if (payload.length > MAX_REQRESP_REQUEST_SIZE_BYTES) {
|
|
218
|
+
throw new OversizedReqRespRequestError(subProtocol, payload.length, MAX_REQRESP_REQUEST_SIZE_BYTES);
|
|
219
|
+
}
|
|
220
|
+
|
|
437
221
|
let stream: Stream | undefined;
|
|
438
222
|
try {
|
|
439
223
|
this.metrics.recordRequestSent(subProtocol);
|
|
@@ -462,7 +246,7 @@ export class ReqResp implements ReqRespInterface {
|
|
|
462
246
|
);
|
|
463
247
|
return resp;
|
|
464
248
|
} catch (e: any) {
|
|
465
|
-
this.logger.
|
|
249
|
+
this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
|
|
466
250
|
// On error we immediately abort the stream, this is preferred way,
|
|
467
251
|
// because it signals to the sender that error happened, whereas
|
|
468
252
|
// closing the stream only closes our side and is much slower
|
|
@@ -518,6 +302,14 @@ export class ReqResp implements ReqRespInterface {
|
|
|
518
302
|
* - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
|
|
519
303
|
* - The second chunk should contain the response data
|
|
520
304
|
*
|
|
305
|
+
* To bound memory usage we abort reception as soon as the accumulated compressed bytes exceed a
|
|
306
|
+
* bound derived from `maxSizeKb`, before the full stream has been buffered. Without this a peer we
|
|
307
|
+
* dialed could stream data up to the request timeout, forcing us to buffer arbitrarily much (the
|
|
308
|
+
* `maxSizeKb` guard in `inboundTransformData` only runs after the whole compressed payload is
|
|
309
|
+
* concatenated, so it does nothing to cap reception memory). Snappy can expand incompressible input
|
|
310
|
+
* to ~1.17x its size, so we allow 2x `maxSizeKb`: comfortably above the worst-case expansion of a
|
|
311
|
+
* legitimate max-size response, while still capping buffered memory at twice the permitted size.
|
|
312
|
+
*
|
|
521
313
|
* @param source - The async iterable source of data chunks
|
|
522
314
|
* @param maxSizeKb - Optional maximum expected size in KB for the decompressed response
|
|
523
315
|
*/
|
|
@@ -525,10 +317,20 @@ export class ReqResp implements ReqRespInterface {
|
|
|
525
317
|
let status: ReqRespStatus | undefined;
|
|
526
318
|
const chunks: Uint8Array[] = [];
|
|
527
319
|
|
|
320
|
+
const maxAccumulatedBytes = (maxSizeKb ?? DEFAULT_MAX_RESPONSE_SIZE_KB) * 1024 * 2;
|
|
321
|
+
let accumulatedBytes = 0;
|
|
322
|
+
|
|
528
323
|
try {
|
|
529
324
|
for await (const chunk of source) {
|
|
530
325
|
const statusParsed = status !== undefined;
|
|
531
326
|
if (statusParsed) {
|
|
327
|
+
// Use `byteLength` (the logical length) rather than `chunk.subarray().length`: calling
|
|
328
|
+
// `subarray()` on a `Uint8ArrayList` consolidates its backing buffers into a single copy,
|
|
329
|
+
// which would materialize the very chunk we are trying to reject.
|
|
330
|
+
accumulatedBytes += chunk.byteLength;
|
|
331
|
+
if (accumulatedBytes > maxAccumulatedBytes) {
|
|
332
|
+
throw new ResponseSizeLimitExceededError(accumulatedBytes, maxAccumulatedBytes);
|
|
333
|
+
}
|
|
532
334
|
chunks.push(chunk.subarray());
|
|
533
335
|
continue;
|
|
534
336
|
}
|
|
@@ -553,16 +355,10 @@ export class ReqResp implements ReqRespInterface {
|
|
|
553
355
|
data: message,
|
|
554
356
|
};
|
|
555
357
|
} catch (e: any) {
|
|
358
|
+
// All errors (invalid status bytes, oversized snappy responses, corrupt data, etc.)
|
|
359
|
+
// are re-thrown so the caller can penalize the peer via handleResponseError.
|
|
556
360
|
this.logger.debug(`Reading message failed: ${e.message}`);
|
|
557
|
-
|
|
558
|
-
let status = ReqRespStatus.UNKNOWN;
|
|
559
|
-
if (e instanceof ReqRespStatusError) {
|
|
560
|
-
status = e.status;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
return {
|
|
564
|
-
status,
|
|
565
|
-
};
|
|
361
|
+
throw e;
|
|
566
362
|
}
|
|
567
363
|
}
|
|
568
364
|
|
|
@@ -602,6 +398,15 @@ export class ReqResp implements ReqRespInterface {
|
|
|
602
398
|
throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
|
|
603
399
|
}
|
|
604
400
|
|
|
401
|
+
// When p2pAllowOnlyValidators is enabled, reject unauthenticated peers on data protocols
|
|
402
|
+
if (
|
|
403
|
+
!UNAUTHENTICATED_ALLOWED_PROTOCOLS.has(protocol) &&
|
|
404
|
+
(this.shouldRejectPeer?.(connection.remotePeer.toString()) ?? false)
|
|
405
|
+
) {
|
|
406
|
+
this.logger.debug(`Rejecting unauthenticated peer ${connection.remotePeer} on gated protocol ${protocol}`);
|
|
407
|
+
throw new ReqRespStatusError(ReqRespStatus.FAILURE);
|
|
408
|
+
}
|
|
409
|
+
|
|
605
410
|
await this.processStream(protocol, incomingStream);
|
|
606
411
|
} catch (err: any) {
|
|
607
412
|
this.metrics.recordResponseError(protocol);
|
|
@@ -664,6 +469,9 @@ export class ReqResp implements ReqRespInterface {
|
|
|
664
469
|
await pipeline(
|
|
665
470
|
stream.source,
|
|
666
471
|
async function* (source: any) {
|
|
472
|
+
// Req/resp is one-request-one-response: an honest sender writes a single payload and half-closes.
|
|
473
|
+
// Process only the first chunk and return, so extra frames a peer queues on the same stream cannot
|
|
474
|
+
// drive further handler invocations that bypass the per-stream rate-limit check in streamHandler.
|
|
667
475
|
for await (const chunk of source) {
|
|
668
476
|
const response = await handler(connection.remotePeer, chunk.subarray());
|
|
669
477
|
|
|
@@ -678,6 +486,7 @@ export class ReqResp implements ReqRespInterface {
|
|
|
678
486
|
|
|
679
487
|
yield SUCCESS;
|
|
680
488
|
yield snappy.outboundTransformData(response);
|
|
489
|
+
return;
|
|
681
490
|
}
|
|
682
491
|
},
|
|
683
492
|
stream.sink,
|
|
@@ -746,13 +555,13 @@ export class ReqResp implements ReqRespInterface {
|
|
|
746
555
|
): PeerErrorSeverity | undefined {
|
|
747
556
|
const logTags = { peerId: peerId.toString(), subProtocol };
|
|
748
557
|
|
|
749
|
-
//Punishable error - peer should never send badly formed request
|
|
558
|
+
// Punishable error - peer should never send badly formed request
|
|
750
559
|
if (e instanceof ReqRespStatusError && e.status === ReqRespStatus.BADLY_FORMED_REQUEST) {
|
|
751
560
|
this.logger.debug(`Punishable error in ${subProtocol}: ${e.cause}`, logTags);
|
|
752
561
|
return PeerErrorSeverity.LowToleranceError;
|
|
753
562
|
}
|
|
754
563
|
|
|
755
|
-
//TODO: (mralj): think if we should penalize peer here based on connection errors
|
|
564
|
+
// TODO: (mralj): think if we should penalize peer here based on connection errors
|
|
756
565
|
return undefined;
|
|
757
566
|
}
|
|
758
567
|
|
|
@@ -774,10 +583,25 @@ export class ReqResp implements ReqRespInterface {
|
|
|
774
583
|
return undefined;
|
|
775
584
|
}
|
|
776
585
|
|
|
777
|
-
//
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
586
|
+
// Invalid status byte: the peer sent a status byte that doesn't match any known status code.
|
|
587
|
+
// This is a protocol violation, penalize harshly.
|
|
588
|
+
if (e instanceof ReqRespStatusError) {
|
|
589
|
+
this.logger.warn(`Invalid status byte from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
590
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
// Oversized snappy response: the peer is sending data that exceeds the allowed size.
|
|
594
|
+
// This is a protocol violation that wastes bandwidth, so penalize harshly.
|
|
595
|
+
if (e instanceof OversizedSnappyResponseError) {
|
|
596
|
+
this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
597
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// Response exceeded the reception buffer bound: the peer streamed more compressed data than the
|
|
601
|
+
// per-request size limit allows. Same protocol violation as above, penalize harshly.
|
|
602
|
+
if (e instanceof ResponseSizeLimitExceededError) {
|
|
603
|
+
this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
604
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
781
605
|
}
|
|
782
606
|
|
|
783
607
|
return this.categorizeConnectionErrors(e, peerId, subProtocol);
|
|
@@ -785,7 +609,8 @@ export class ReqResp implements ReqRespInterface {
|
|
|
785
609
|
|
|
786
610
|
/*
|
|
787
611
|
* Errors specific to connection handling
|
|
788
|
-
* These can happen both when sending request and response
|
|
612
|
+
* These can happen both when sending request and response.
|
|
613
|
+
*/
|
|
789
614
|
private categorizeConnectionErrors(
|
|
790
615
|
e: any,
|
|
791
616
|
peerId: PeerId,
|
package/src/services/service.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
-
import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
|
|
3
|
+
import type { P2PConnectivity, PeerInfo } from '@aztec/stdlib/interfaces/server';
|
|
4
4
|
import type {
|
|
5
|
-
BlockProposal,
|
|
6
5
|
CheckpointAttestation,
|
|
7
|
-
CheckpointProposalCore,
|
|
8
6
|
Gossipable,
|
|
9
7
|
TopicType,
|
|
8
|
+
ValidatedBlockProposal,
|
|
9
|
+
ValidatedCheckpointProposalCore,
|
|
10
10
|
} from '@aztec/stdlib/p2p';
|
|
11
11
|
import type { Tx } from '@aztec/stdlib/tx';
|
|
12
12
|
|
|
@@ -17,12 +17,7 @@ import type EventEmitter from 'events';
|
|
|
17
17
|
import type { BatchTxRequesterLibP2PService } from './reqresp/batch-tx-requester/interface.js';
|
|
18
18
|
import type { P2PReqRespConfig } from './reqresp/config.js';
|
|
19
19
|
import type { StatusMessage } from './reqresp/index.js';
|
|
20
|
-
import type {
|
|
21
|
-
ReqRespSubProtocol,
|
|
22
|
-
ReqRespSubProtocolHandler,
|
|
23
|
-
ReqRespSubProtocolValidators,
|
|
24
|
-
SubProtocolMap,
|
|
25
|
-
} from './reqresp/interface.js';
|
|
20
|
+
import type { ReqRespSubProtocol, ReqRespSubProtocolHandler } from './reqresp/interface.js';
|
|
26
21
|
import type { AuthRequest, AuthResponse } from './reqresp/protocols/auth.js';
|
|
27
22
|
|
|
28
23
|
export enum PeerDiscoveryState {
|
|
@@ -33,18 +28,21 @@ export enum PeerDiscoveryState {
|
|
|
33
28
|
/**
|
|
34
29
|
* Callback for when a block proposal is received.
|
|
35
30
|
* Validators validate but DO NOT attest to individual blocks - attestations are only for checkpoints.
|
|
31
|
+
* The proposal is passed as a ValidatedBlockProposal: it has already passed p2p ingress validation, and
|
|
32
|
+
* consumers are not expected to repeat it.
|
|
36
33
|
* @returns true if the proposal is valid, false otherwise
|
|
37
34
|
*/
|
|
38
|
-
export type P2PBlockReceivedCallback = (block:
|
|
35
|
+
export type P2PBlockReceivedCallback = (block: ValidatedBlockProposal, sender: PeerId) => Promise<boolean>;
|
|
39
36
|
|
|
40
37
|
/**
|
|
41
38
|
* Callback for when a checkpoint proposal is received.
|
|
42
|
-
* The checkpoint proposal is passed as
|
|
39
|
+
* The checkpoint proposal is passed as ValidatedCheckpointProposalCore (without lastBlock) since
|
|
43
40
|
* the lastBlock is extracted and stored separately as a BlockProposal, and the block
|
|
44
|
-
* callback is invoked and awaited before this checkpoint callback.
|
|
41
|
+
* callback is invoked and awaited before this checkpoint callback. As with block proposals, it has already
|
|
42
|
+
* passed p2p ingress validation.
|
|
45
43
|
*/
|
|
46
44
|
export type P2PCheckpointReceivedCallback = (
|
|
47
|
-
checkpoint:
|
|
45
|
+
checkpoint: ValidatedCheckpointProposalCore,
|
|
48
46
|
sender: PeerId,
|
|
49
47
|
) => Promise<CheckpointAttestation[] | undefined>;
|
|
50
48
|
|
|
@@ -63,6 +61,19 @@ export type DuplicateProposalInfo = {
|
|
|
63
61
|
*/
|
|
64
62
|
export type P2PDuplicateProposalCallback = (info: DuplicateProposalInfo) => void;
|
|
65
63
|
|
|
64
|
+
/** Minimal info passed to the oversized proposal callback. */
|
|
65
|
+
export type OversizedProposalInfo = {
|
|
66
|
+
slot: SlotNumber;
|
|
67
|
+
proposer: EthAddress;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Callback for when a block proposal whose index lands at or beyond the consensus per-checkpoint block
|
|
72
|
+
* limit is stored and re-broadcast as slashing evidence. May fire multiple times per (slot, proposer)
|
|
73
|
+
* if the proposer signed several oversized proposals; consumers are expected to dedup.
|
|
74
|
+
*/
|
|
75
|
+
export type P2POversizedProposalCallback = (info: OversizedProposalInfo) => void;
|
|
76
|
+
|
|
66
77
|
/** Minimal info passed to the duplicate attestation callback. */
|
|
67
78
|
export type DuplicateAttestationInfo = {
|
|
68
79
|
slot: SlotNumber;
|
|
@@ -76,6 +87,8 @@ export type DuplicateAttestationInfo = {
|
|
|
76
87
|
*/
|
|
77
88
|
export type P2PDuplicateAttestationCallback = (info: DuplicateAttestationInfo) => void;
|
|
78
89
|
|
|
90
|
+
export type P2PCheckpointAttestationCallback = (attestation: CheckpointAttestation) => void;
|
|
91
|
+
|
|
79
92
|
/**
|
|
80
93
|
* The interface for a P2P service implementation.
|
|
81
94
|
*/
|
|
@@ -98,26 +111,12 @@ export interface P2PService {
|
|
|
98
111
|
*/
|
|
99
112
|
propagate<T extends Gossipable>(message: T): Promise<void>;
|
|
100
113
|
|
|
101
|
-
/**
|
|
102
|
-
* Send a batch of requests to peers, and return the responses
|
|
103
|
-
*
|
|
104
|
-
* @param protocol - The request response protocol to use
|
|
105
|
-
* @param requests - The requests to send to the peers
|
|
106
|
-
* @returns The responses to the requests
|
|
107
|
-
*/
|
|
108
|
-
sendBatchRequest<Protocol extends ReqRespSubProtocol>(
|
|
109
|
-
protocol: Protocol,
|
|
110
|
-
requests: InstanceType<SubProtocolMap[Protocol]['request']>[],
|
|
111
|
-
pinnedPeerId?: PeerId,
|
|
112
|
-
timeoutMs?: number,
|
|
113
|
-
maxPeers?: number,
|
|
114
|
-
maxRetryAttempts?: number,
|
|
115
|
-
): Promise<InstanceType<SubProtocolMap[Protocol]['response']>[]>;
|
|
116
|
-
|
|
117
114
|
// Leaky abstraction: fix https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
118
115
|
registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
|
|
119
116
|
|
|
120
|
-
|
|
117
|
+
registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
|
|
118
|
+
|
|
119
|
+
registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
|
|
121
120
|
|
|
122
121
|
/**
|
|
123
122
|
* Registers a callback invoked when a duplicate proposal is detected (equivocation).
|
|
@@ -125,6 +124,12 @@ export interface P2PService {
|
|
|
125
124
|
*/
|
|
126
125
|
registerDuplicateProposalCallback(callback: P2PDuplicateProposalCallback): void;
|
|
127
126
|
|
|
127
|
+
/**
|
|
128
|
+
* Registers a callback invoked when an oversized block proposal (index at or beyond the consensus
|
|
129
|
+
* per-checkpoint block limit) is stored and re-broadcast as slashing evidence.
|
|
130
|
+
*/
|
|
131
|
+
registerOversizedProposalCallback(callback: P2POversizedProposalCallback): void;
|
|
132
|
+
|
|
128
133
|
/**
|
|
129
134
|
* Registers a callback invoked when a duplicate attestation is detected (equivocation).
|
|
130
135
|
* A validator signing attestations for different proposals at the same slot.
|
|
@@ -132,20 +137,28 @@ export interface P2PService {
|
|
|
132
137
|
*/
|
|
133
138
|
registerDuplicateAttestationCallback(callback: P2PDuplicateAttestationCallback): void;
|
|
134
139
|
|
|
140
|
+
registerCheckpointAttestationCallback(callback: P2PCheckpointAttestationCallback): void;
|
|
141
|
+
|
|
135
142
|
getEnr(): ENR | undefined;
|
|
136
143
|
|
|
137
144
|
getPeers(includePending?: boolean): PeerInfo[];
|
|
138
145
|
|
|
146
|
+
/**
|
|
147
|
+
* Returns whether this p2p service is a real p2p stack, and how many peers it is currently connected to.
|
|
148
|
+
* Implementations that do not run p2p at all report `enabled: false`.
|
|
149
|
+
*/
|
|
150
|
+
getP2PConnectivity(): P2PConnectivity;
|
|
151
|
+
|
|
139
152
|
/** Returns the number of peers in the GossipSub mesh for a given topic type. */
|
|
140
153
|
getGossipMeshPeerCount(topicType: TopicType): number;
|
|
141
154
|
|
|
155
|
+
/**
|
|
156
|
+
* Runs minimum integrity validation on txs carried in a block proposal.
|
|
157
|
+
* @throws InvalidBlockProposalTxsError - If any tx fails validation.
|
|
158
|
+
*/
|
|
142
159
|
validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
|
|
143
160
|
|
|
144
|
-
addReqRespSubProtocol(
|
|
145
|
-
subProtocol: ReqRespSubProtocol,
|
|
146
|
-
handler: ReqRespSubProtocolHandler,
|
|
147
|
-
validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
148
|
-
): Promise<void>;
|
|
161
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void>;
|
|
149
162
|
|
|
150
163
|
handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
151
164
|
|
|
@@ -196,6 +209,9 @@ export interface PeerDiscoveryService extends EventEmitter {
|
|
|
196
209
|
on(event: 'peer:discovered', listener: (enr: ENR) => void): this;
|
|
197
210
|
emit(event: 'peer:discovered', enr: ENR): boolean;
|
|
198
211
|
|
|
212
|
+
on(event: 'ip:changed', listener: (ip: string) => void): this;
|
|
213
|
+
emit(event: 'ip:changed', ip: string): boolean;
|
|
214
|
+
|
|
199
215
|
getStatus(): PeerDiscoveryState;
|
|
200
216
|
|
|
201
217
|
getEnr(): ENR | undefined;
|