@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
|
@@ -371,30 +371,25 @@ function applyDecs2203RFactory() {
|
|
|
371
371
|
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
372
372
|
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
373
373
|
}
|
|
374
|
-
var _dec, _dec1,
|
|
375
|
-
import { compactArray } from '@aztec/foundation/collection';
|
|
374
|
+
var _dec, _dec1, _initProto;
|
|
376
375
|
import { AbortError, TimeoutError } from '@aztec/foundation/error';
|
|
377
376
|
import { createLogger } from '@aztec/foundation/log';
|
|
378
377
|
import { executeTimeout } from '@aztec/foundation/timer';
|
|
379
378
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
380
379
|
import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
381
380
|
import { pipeline } from 'node:stream/promises';
|
|
382
|
-
import {
|
|
383
|
-
import { SnappyTransform } from '../encoding.js';
|
|
384
|
-
import { DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS, DEFAULT_REQRESP_DIAL_TIMEOUT_MS } from './config.js';
|
|
385
|
-
import { BatchConnectionSampler } from './connection-sampler/batch_connection_sampler.js';
|
|
381
|
+
import { IndividualReqRespTimeoutError, OversizedReqRespRequestError } from '../../errors/reqresp.error.js';
|
|
382
|
+
import { DEFAULT_MAX_RESPONSE_SIZE_KB, OversizedSnappyResponseError, ResponseSizeLimitExceededError, SnappyTransform } from '../encoding.js';
|
|
383
|
+
import { DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS, DEFAULT_REQRESP_DIAL_TIMEOUT_MS, MAX_REQRESP_REQUEST_SIZE_BYTES } from './config.js';
|
|
386
384
|
import { ConnectionSampler, RandomSampler } from './connection-sampler/connection_sampler.js';
|
|
387
|
-
import {
|
|
385
|
+
import { ReqRespSubProtocol, UNAUTHENTICATED_ALLOWED_PROTOCOLS, subProtocolSizeCalculators } from './interface.js';
|
|
388
386
|
import { ReqRespMetrics } from './metrics.js';
|
|
389
387
|
import { RateLimitStatus, RequestResponseRateLimiter, prettyPrintRateLimitStatus } from './rate-limiter/rate_limiter.js';
|
|
390
|
-
import { ReqRespStatus, ReqRespStatusError, parseStatusChunk
|
|
391
|
-
_dec = trackSpan('ReqResp.
|
|
392
|
-
[Attributes.P2P_REQ_RESP_PROTOCOL]: subProtocol,
|
|
393
|
-
[Attributes.P2P_REQ_RESP_BATCH_REQUESTS_COUNT]: requests.length
|
|
394
|
-
})), _dec1 = trackSpan('ReqResp.sendRequestToPeer', (peerId, subProtocol, _)=>({
|
|
388
|
+
import { ReqRespStatus, ReqRespStatusError, parseStatusChunk } from './status.js';
|
|
389
|
+
_dec = trackSpan('ReqResp.sendRequestToPeer', (peerId, subProtocol, _)=>({
|
|
395
390
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
396
391
|
[Attributes.P2P_REQ_RESP_PROTOCOL]: subProtocol
|
|
397
|
-
})),
|
|
392
|
+
})), _dec1 = trackSpan('ReqResp.streamHandler', (protocol, { connection })=>({
|
|
398
393
|
[Attributes.P2P_REQ_RESP_PROTOCOL]: protocol,
|
|
399
394
|
[Attributes.P2P_ID]: connection.remotePeer.toString()
|
|
400
395
|
}));
|
|
@@ -402,7 +397,7 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
402
397
|
* The Request Response Service
|
|
403
398
|
*
|
|
404
399
|
* It allows nodes to request specific information from their peers, its use case covers recovering
|
|
405
|
-
* information that was missed during a
|
|
400
|
+
* information that was missed during a synchronisation or a gossip event.
|
|
406
401
|
*
|
|
407
402
|
* This service implements the request response sub protocol, it is heavily inspired from
|
|
408
403
|
* ethereum implementations of the same name.
|
|
@@ -420,15 +415,10 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
420
415
|
[
|
|
421
416
|
_dec,
|
|
422
417
|
2,
|
|
423
|
-
"sendBatchRequest"
|
|
424
|
-
],
|
|
425
|
-
[
|
|
426
|
-
_dec1,
|
|
427
|
-
2,
|
|
428
418
|
"sendRequestToPeer"
|
|
429
419
|
],
|
|
430
420
|
[
|
|
431
|
-
|
|
421
|
+
_dec1,
|
|
432
422
|
2,
|
|
433
423
|
"streamHandler"
|
|
434
424
|
]
|
|
@@ -437,10 +427,10 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
437
427
|
individualRequestTimeoutMs;
|
|
438
428
|
dialTimeoutMs;
|
|
439
429
|
subProtocolHandlers;
|
|
440
|
-
subProtocolValidators;
|
|
441
430
|
connectionSampler;
|
|
442
431
|
rateLimiter;
|
|
443
432
|
snappyTransform;
|
|
433
|
+
shouldRejectPeer;
|
|
444
434
|
metrics;
|
|
445
435
|
constructor(config, libp2p, peerScoring, logger = createLogger('p2p:reqresp'), rateLimits = {}, telemetryClient = getTelemetryClient()){
|
|
446
436
|
this.libp2p = libp2p;
|
|
@@ -449,7 +439,6 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
449
439
|
this.individualRequestTimeoutMs = (_initProto(this), DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS);
|
|
450
440
|
this.dialTimeoutMs = DEFAULT_REQRESP_DIAL_TIMEOUT_MS;
|
|
451
441
|
this.subProtocolHandlers = {};
|
|
452
|
-
this.subProtocolValidators = {};
|
|
453
442
|
this.updateConfig(config);
|
|
454
443
|
this.rateLimiter = new RequestResponseRateLimiter(peerScoring, rateLimits);
|
|
455
444
|
// Connection sampler is used to sample our connected peers
|
|
@@ -465,6 +454,9 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
465
454
|
this.dialTimeoutMs = config.dialTimeoutMs;
|
|
466
455
|
}
|
|
467
456
|
}
|
|
457
|
+
setShouldRejectPeer(checker) {
|
|
458
|
+
this.shouldRejectPeer = checker;
|
|
459
|
+
}
|
|
468
460
|
get tracer() {
|
|
469
461
|
return this.metrics.tracer;
|
|
470
462
|
}
|
|
@@ -475,19 +467,18 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
475
467
|
}
|
|
476
468
|
/**
|
|
477
469
|
* Start the reqresp service
|
|
478
|
-
*/ async start(subProtocolHandlers
|
|
470
|
+
*/ async start(subProtocolHandlers) {
|
|
479
471
|
Object.assign(this.subProtocolHandlers, subProtocolHandlers);
|
|
480
|
-
|
|
481
|
-
//
|
|
472
|
+
// Register streamHandler with libp2p.
|
|
473
|
+
// The streamHandler is responsible for reading the incoming stream, determining the protocol, then triggering the appropriate handler.
|
|
482
474
|
for (const subProtocol of Object.keys(subProtocolHandlers)){
|
|
483
475
|
this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
|
|
484
476
|
await this.libp2p.handle(subProtocol, (data)=>void this.streamHandler(subProtocol, data).catch((err)=>this.logger.error(`Error on libp2p subprotocol ${subProtocol} handler`, err)));
|
|
485
477
|
}
|
|
486
478
|
this.rateLimiter.start();
|
|
487
479
|
}
|
|
488
|
-
async addSubProtocol(subProtocol, handler
|
|
480
|
+
async addSubProtocol(subProtocol, handler) {
|
|
489
481
|
this.subProtocolHandlers[subProtocol] = handler;
|
|
490
|
-
this.subProtocolValidators[subProtocol] = validator;
|
|
491
482
|
this.logger.debug(`Registering handler for sub protocol ${subProtocol}`);
|
|
492
483
|
await this.libp2p.handle(subProtocol, (data)=>void this.streamHandler(subProtocol, data).catch((err)=>this.logger.error(`Error on libp2p subprotocol ${subProtocol} handler`, err)));
|
|
493
484
|
}
|
|
@@ -509,179 +500,6 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
509
500
|
// NOTE: We assume libp2p instance is managed by the caller
|
|
510
501
|
}
|
|
511
502
|
/**
|
|
512
|
-
* Request multiple messages over the same sub protocol, balancing the requests across peers.
|
|
513
|
-
*
|
|
514
|
-
* @devnote
|
|
515
|
-
* - The function prioritizes sending requests to free peers using a batch sampling strategy.
|
|
516
|
-
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
517
|
-
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
518
|
-
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
519
|
-
*
|
|
520
|
-
* Requests are sent in parallel to each peer, but multiple requests are sent to the same peer in series
|
|
521
|
-
* - If a peer fails to respond or returns an invalid response, it is removed from the sampling pool and replaced.
|
|
522
|
-
* - The function stops retrying once all requests are processed, no active peers remain, or the maximum retry attempts are reached.
|
|
523
|
-
* - Responses are validated using a custom validator for the sub-protocol.*
|
|
524
|
-
*
|
|
525
|
-
* @param subProtocol
|
|
526
|
-
* @param requests
|
|
527
|
-
* @param timeoutMs
|
|
528
|
-
* @param maxPeers
|
|
529
|
-
* @returns
|
|
530
|
-
*
|
|
531
|
-
* @throws {CollectiveReqRespTimeoutError} - If the request batch exceeds the specified timeout (`timeoutMs`).
|
|
532
|
-
*/ async sendBatchRequest(subProtocol, requests, pinnedPeer, timeoutMs = 10000, maxPeers = Math.max(10, Math.ceil(requests.length / 3)), maxRetryAttempts = 3) {
|
|
533
|
-
const responseValidator = this.subProtocolValidators[subProtocol] ?? DEFAULT_SUB_PROTOCOL_VALIDATORS[subProtocol];
|
|
534
|
-
const responses = new Array(requests.length);
|
|
535
|
-
const requestBuffers = requests.map((req)=>req.toBuffer());
|
|
536
|
-
const isEmptyResponse = (value)=>{
|
|
537
|
-
// Some responses serialize to a non-empty buffer even when they contain no items (e.g., empty TxArray).
|
|
538
|
-
if (!value || typeof value !== 'object') {
|
|
539
|
-
return false;
|
|
540
|
-
}
|
|
541
|
-
const length = value.length;
|
|
542
|
-
return typeof length === 'number' && length === 0;
|
|
543
|
-
};
|
|
544
|
-
const requestFunction = async (signal)=>{
|
|
545
|
-
// Track which requests still need to be processed
|
|
546
|
-
const pendingRequestIndices = new Set(requestBuffers.map((_, i)=>i));
|
|
547
|
-
// Create batch sampler with the total number of requests and max peers
|
|
548
|
-
const batchSampler = new BatchConnectionSampler(this.connectionSampler, requests.length, maxPeers, compactArray([
|
|
549
|
-
pinnedPeer
|
|
550
|
-
]), createLogger(`${this.logger.module}:batch-connection-sampler`));
|
|
551
|
-
if (batchSampler.activePeerCount === 0 && !pinnedPeer) {
|
|
552
|
-
this.logger.warn('No active peers to send requests to');
|
|
553
|
-
return [];
|
|
554
|
-
}
|
|
555
|
-
// This is where it gets fun
|
|
556
|
-
// The outer loop is the retry loop, we will continue to retry until we process all indices we have
|
|
557
|
-
// not received a response for, or we have reached the max retry attempts
|
|
558
|
-
// The inner loop is the batch loop, we will process all requests for each peer in parallel
|
|
559
|
-
// We will then process the results of the requests, and resample any peers that failed to respond
|
|
560
|
-
// We will continue to retry until we have processed all indices, or we have reached the max retry attempts
|
|
561
|
-
let retryAttempts = 0;
|
|
562
|
-
while(pendingRequestIndices.size > 0 && batchSampler.activePeerCount > 0 && retryAttempts < maxRetryAttempts){
|
|
563
|
-
if (signal.aborted) {
|
|
564
|
-
throw new AbortError('Batch request aborted');
|
|
565
|
-
}
|
|
566
|
-
const requestBatches = new Map();
|
|
567
|
-
// Group requests by peer
|
|
568
|
-
for (const requestIndex of pendingRequestIndices){
|
|
569
|
-
const peer = batchSampler.getPeerForRequest(requestIndex);
|
|
570
|
-
if (!peer) {
|
|
571
|
-
continue;
|
|
572
|
-
}
|
|
573
|
-
const peerAsString = peer.toString();
|
|
574
|
-
if (!requestBatches.has(peerAsString)) {
|
|
575
|
-
requestBatches.set(peerAsString, {
|
|
576
|
-
peerId: peer,
|
|
577
|
-
indices: []
|
|
578
|
-
});
|
|
579
|
-
}
|
|
580
|
-
requestBatches.get(peerAsString).indices.push(requestIndex);
|
|
581
|
-
}
|
|
582
|
-
// If there is a pinned peer, we will always send every request to that peer
|
|
583
|
-
// We use the default limits for the subprotocol to avoid hitting the rate limiter
|
|
584
|
-
if (pinnedPeer) {
|
|
585
|
-
const limit = this.rateLimiter.getRateLimits(subProtocol).peerLimit.quotaCount;
|
|
586
|
-
requestBatches.set(pinnedPeer.toString(), {
|
|
587
|
-
peerId: pinnedPeer,
|
|
588
|
-
indices: Array.from(pendingRequestIndices.values()).slice(0, limit)
|
|
589
|
-
});
|
|
590
|
-
}
|
|
591
|
-
// If no requests could be assigned (all peers exhausted for all indices), exit early
|
|
592
|
-
if (requestBatches.size === 0) {
|
|
593
|
-
this.logger.warn('No peers available for any pending request indices, stopping batch request');
|
|
594
|
-
break;
|
|
595
|
-
}
|
|
596
|
-
// Make parallel requests for each peer's batch
|
|
597
|
-
// A batch entry will look something like this:
|
|
598
|
-
// PeerId0: [0, 1, 2, 3]
|
|
599
|
-
// PeerId1: [4, 5, 6, 7]
|
|
600
|
-
// Peer Id 0 will send requests 0, 1, 2, 3 in serial
|
|
601
|
-
// while simultaneously Peer Id 1 will send requests 4, 5, 6, 7 in serial
|
|
602
|
-
const batchResults = await Promise.all(Array.from(requestBatches.entries()).map(async ([peerAsString, { peerId: peer, indices }])=>{
|
|
603
|
-
try {
|
|
604
|
-
const markIndexFailed = (index)=>batchSampler.markPeerFailedForIndex(peer, index);
|
|
605
|
-
// Requests all going to the same peer are sent synchronously
|
|
606
|
-
const peerResults = [];
|
|
607
|
-
let shouldReplacePeer = false;
|
|
608
|
-
const handleFailure = (status, index)=>{
|
|
609
|
-
this.logger.warn(`Request to peer ${peerAsString} failed with status ${prettyPrintReqRespStatus(status)}`);
|
|
610
|
-
markIndexFailed(index);
|
|
611
|
-
return status === ReqRespStatus.RATE_LIMIT_EXCEEDED;
|
|
612
|
-
};
|
|
613
|
-
for (const index of indices){
|
|
614
|
-
this.logger.info(`Sending request ${index} to peer ${peerAsString}`);
|
|
615
|
-
const response = await this.sendRequestToPeer(peer, subProtocol, requestBuffers[index]);
|
|
616
|
-
// Check the status of the response buffer
|
|
617
|
-
if (response.status !== ReqRespStatus.SUCCESS) {
|
|
618
|
-
shouldReplacePeer = handleFailure(response.status, index);
|
|
619
|
-
if (shouldReplacePeer) {
|
|
620
|
-
break;
|
|
621
|
-
}
|
|
622
|
-
continue;
|
|
623
|
-
}
|
|
624
|
-
if (response.data.length === 0) {
|
|
625
|
-
markIndexFailed(index);
|
|
626
|
-
continue;
|
|
627
|
-
}
|
|
628
|
-
const object = responseFromBuffer(subProtocol, response.data);
|
|
629
|
-
if (isEmptyResponse(object)) {
|
|
630
|
-
markIndexFailed(index);
|
|
631
|
-
continue;
|
|
632
|
-
}
|
|
633
|
-
const isValid = await responseValidator(requests[index], object, peer);
|
|
634
|
-
if (!isValid) {
|
|
635
|
-
markIndexFailed(index);
|
|
636
|
-
continue;
|
|
637
|
-
}
|
|
638
|
-
peerResults.push({
|
|
639
|
-
index,
|
|
640
|
-
response: object
|
|
641
|
-
});
|
|
642
|
-
}
|
|
643
|
-
// If peer had a hard failure (rate limit), replace it for future iterations
|
|
644
|
-
if (shouldReplacePeer) {
|
|
645
|
-
this.logger.warn(`Peer ${peerAsString} hit a hard failure, removing from sampler`);
|
|
646
|
-
batchSampler.removePeerAndReplace(peer);
|
|
647
|
-
}
|
|
648
|
-
return {
|
|
649
|
-
peer,
|
|
650
|
-
results: peerResults
|
|
651
|
-
};
|
|
652
|
-
} catch (error) {
|
|
653
|
-
this.logger.warn(`Failed batch request to peer ${peerAsString}:`, error);
|
|
654
|
-
batchSampler.removePeerAndReplace(peer);
|
|
655
|
-
return {
|
|
656
|
-
peer,
|
|
657
|
-
results: []
|
|
658
|
-
};
|
|
659
|
-
}
|
|
660
|
-
}));
|
|
661
|
-
// Process results
|
|
662
|
-
for (const { results } of batchResults){
|
|
663
|
-
for (const { index, response } of results){
|
|
664
|
-
if (response) {
|
|
665
|
-
responses[index] = response;
|
|
666
|
-
pendingRequestIndices.delete(index);
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
retryAttempts++;
|
|
671
|
-
}
|
|
672
|
-
if (retryAttempts >= maxRetryAttempts) {
|
|
673
|
-
this.logger.warn(`Max retry attempts ${maxRetryAttempts} reached for batch request`);
|
|
674
|
-
}
|
|
675
|
-
return responses;
|
|
676
|
-
};
|
|
677
|
-
try {
|
|
678
|
-
return await executeTimeout(requestFunction, timeoutMs, ()=>new CollectiveReqRespTimeoutError());
|
|
679
|
-
} catch (e) {
|
|
680
|
-
this.logger.warn(`${e.message} | subProtocol: ${subProtocol}`);
|
|
681
|
-
return [];
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
/**
|
|
685
503
|
* Sends a request to a specific peer
|
|
686
504
|
*
|
|
687
505
|
* We first dial a particular protocol for the peer, this ensures that the peer knows
|
|
@@ -706,6 +524,10 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
706
524
|
* If the stream is not closed by the dialled peer, and a timeout occurs, then
|
|
707
525
|
* the stream is closed on the requester's end and sender (us) updates its peer score
|
|
708
526
|
*/ async sendRequestToPeer(peerId, subProtocol, payload, dialTimeout = this.dialTimeoutMs) {
|
|
527
|
+
// Thrown before the try block so the generic error handling below does not penalize the peer for our own bug.
|
|
528
|
+
if (payload.length > MAX_REQRESP_REQUEST_SIZE_BYTES) {
|
|
529
|
+
throw new OversizedReqRespRequestError(subProtocol, payload.length, MAX_REQRESP_REQUEST_SIZE_BYTES);
|
|
530
|
+
}
|
|
709
531
|
let stream;
|
|
710
532
|
try {
|
|
711
533
|
this.metrics.recordRequestSent(subProtocol);
|
|
@@ -729,7 +551,7 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
729
551
|
]), this.individualRequestTimeoutMs, ()=>timeoutErr);
|
|
730
552
|
return resp;
|
|
731
553
|
} catch (e) {
|
|
732
|
-
this.logger.
|
|
554
|
+
this.logger.debug(`SUBPROTOCOL: ${subProtocol}\n`, e);
|
|
733
555
|
// On error we immediately abort the stream, this is preferred way,
|
|
734
556
|
// because it signals to the sender that error happened, whereas
|
|
735
557
|
// closing the stream only closes our side and is much slower
|
|
@@ -778,15 +600,32 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
778
600
|
* - The first chunk should contain a control byte, indicating the status of the response see `ReqRespStatus`
|
|
779
601
|
* - The second chunk should contain the response data
|
|
780
602
|
*
|
|
603
|
+
* To bound memory usage we abort reception as soon as the accumulated compressed bytes exceed a
|
|
604
|
+
* bound derived from `maxSizeKb`, before the full stream has been buffered. Without this a peer we
|
|
605
|
+
* dialed could stream data up to the request timeout, forcing us to buffer arbitrarily much (the
|
|
606
|
+
* `maxSizeKb` guard in `inboundTransformData` only runs after the whole compressed payload is
|
|
607
|
+
* concatenated, so it does nothing to cap reception memory). Snappy can expand incompressible input
|
|
608
|
+
* to ~1.17x its size, so we allow 2x `maxSizeKb`: comfortably above the worst-case expansion of a
|
|
609
|
+
* legitimate max-size response, while still capping buffered memory at twice the permitted size.
|
|
610
|
+
*
|
|
781
611
|
* @param source - The async iterable source of data chunks
|
|
782
612
|
* @param maxSizeKb - Optional maximum expected size in KB for the decompressed response
|
|
783
613
|
*/ async readMessage(source, maxSizeKb) {
|
|
784
614
|
let status;
|
|
785
615
|
const chunks = [];
|
|
616
|
+
const maxAccumulatedBytes = (maxSizeKb ?? DEFAULT_MAX_RESPONSE_SIZE_KB) * 1024 * 2;
|
|
617
|
+
let accumulatedBytes = 0;
|
|
786
618
|
try {
|
|
787
619
|
for await (const chunk of source){
|
|
788
620
|
const statusParsed = status !== undefined;
|
|
789
621
|
if (statusParsed) {
|
|
622
|
+
// Use `byteLength` (the logical length) rather than `chunk.subarray().length`: calling
|
|
623
|
+
// `subarray()` on a `Uint8ArrayList` consolidates its backing buffers into a single copy,
|
|
624
|
+
// which would materialize the very chunk we are trying to reject.
|
|
625
|
+
accumulatedBytes += chunk.byteLength;
|
|
626
|
+
if (accumulatedBytes > maxAccumulatedBytes) {
|
|
627
|
+
throw new ResponseSizeLimitExceededError(accumulatedBytes, maxAccumulatedBytes);
|
|
628
|
+
}
|
|
790
629
|
chunks.push(chunk.subarray());
|
|
791
630
|
continue;
|
|
792
631
|
}
|
|
@@ -807,14 +646,10 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
807
646
|
data: message
|
|
808
647
|
};
|
|
809
648
|
} catch (e) {
|
|
649
|
+
// All errors (invalid status bytes, oversized snappy responses, corrupt data, etc.)
|
|
650
|
+
// are re-thrown so the caller can penalize the peer via handleResponseError.
|
|
810
651
|
this.logger.debug(`Reading message failed: ${e.message}`);
|
|
811
|
-
|
|
812
|
-
if (e instanceof ReqRespStatusError) {
|
|
813
|
-
status = e.status;
|
|
814
|
-
}
|
|
815
|
-
return {
|
|
816
|
-
status
|
|
817
|
-
};
|
|
652
|
+
throw e;
|
|
818
653
|
}
|
|
819
654
|
}
|
|
820
655
|
/**
|
|
@@ -842,6 +677,11 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
842
677
|
this.logger.verbose(`Rate limit exceeded ${prettyPrintRateLimitStatus(rateLimitStatus)} for ${protocol} from ${connection.remotePeer}`);
|
|
843
678
|
throw new ReqRespStatusError(ReqRespStatus.RATE_LIMIT_EXCEEDED);
|
|
844
679
|
}
|
|
680
|
+
// When p2pAllowOnlyValidators is enabled, reject unauthenticated peers on data protocols
|
|
681
|
+
if (!UNAUTHENTICATED_ALLOWED_PROTOCOLS.has(protocol) && (this.shouldRejectPeer?.(connection.remotePeer.toString()) ?? false)) {
|
|
682
|
+
this.logger.debug(`Rejecting unauthenticated peer ${connection.remotePeer} on gated protocol ${protocol}`);
|
|
683
|
+
throw new ReqRespStatusError(ReqRespStatus.FAILURE);
|
|
684
|
+
}
|
|
845
685
|
await this.processStream(protocol, incomingStream);
|
|
846
686
|
} catch (err) {
|
|
847
687
|
this.metrics.recordResponseError(protocol);
|
|
@@ -892,6 +732,9 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
892
732
|
const snappy = this.snappyTransform;
|
|
893
733
|
const SUCCESS = Uint8Array.of(ReqRespStatus.SUCCESS);
|
|
894
734
|
await pipeline(stream.source, async function*(source) {
|
|
735
|
+
// Req/resp is one-request-one-response: an honest sender writes a single payload and half-closes.
|
|
736
|
+
// Process only the first chunk and return, so extra frames a peer queues on the same stream cannot
|
|
737
|
+
// drive further handler invocations that bypass the per-stream rate-limit check in streamHandler.
|
|
895
738
|
for await (const chunk of source){
|
|
896
739
|
const response = await handler(connection.remotePeer, chunk.subarray());
|
|
897
740
|
if (protocol === ReqRespSubProtocol.GOODBYE) {
|
|
@@ -903,6 +746,7 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
903
746
|
stream.metadata.written = true; // Mark the stream as written to;
|
|
904
747
|
yield SUCCESS;
|
|
905
748
|
yield snappy.outboundTransformData(response);
|
|
749
|
+
return;
|
|
906
750
|
}
|
|
907
751
|
}, stream.sink);
|
|
908
752
|
}
|
|
@@ -951,12 +795,12 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
951
795
|
peerId: peerId.toString(),
|
|
952
796
|
subProtocol
|
|
953
797
|
};
|
|
954
|
-
//Punishable error - peer should never send badly formed request
|
|
798
|
+
// Punishable error - peer should never send badly formed request
|
|
955
799
|
if (e instanceof ReqRespStatusError && e.status === ReqRespStatus.BADLY_FORMED_REQUEST) {
|
|
956
800
|
this.logger.debug(`Punishable error in ${subProtocol}: ${e.cause}`, logTags);
|
|
957
801
|
return PeerErrorSeverity.LowToleranceError;
|
|
958
802
|
}
|
|
959
|
-
//TODO: (mralj): think if we should penalize peer here based on connection errors
|
|
803
|
+
// TODO: (mralj): think if we should penalize peer here based on connection errors
|
|
960
804
|
return undefined;
|
|
961
805
|
}
|
|
962
806
|
/**
|
|
@@ -973,16 +817,30 @@ _dec = trackSpan('ReqResp.sendBatchRequest', (subProtocol, requests)=>({
|
|
|
973
817
|
this.logger.debug('Error encountered on goodbye sub protocol, no penalty', logTags);
|
|
974
818
|
return undefined;
|
|
975
819
|
}
|
|
976
|
-
//
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
820
|
+
// Invalid status byte: the peer sent a status byte that doesn't match any known status code.
|
|
821
|
+
// This is a protocol violation, penalize harshly.
|
|
822
|
+
if (e instanceof ReqRespStatusError) {
|
|
823
|
+
this.logger.warn(`Invalid status byte from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
824
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
825
|
+
}
|
|
826
|
+
// Oversized snappy response: the peer is sending data that exceeds the allowed size.
|
|
827
|
+
// This is a protocol violation that wastes bandwidth, so penalize harshly.
|
|
828
|
+
if (e instanceof OversizedSnappyResponseError) {
|
|
829
|
+
this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
830
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
831
|
+
}
|
|
832
|
+
// Response exceeded the reception buffer bound: the peer streamed more compressed data than the
|
|
833
|
+
// per-request size limit allows. Same protocol violation as above, penalize harshly.
|
|
834
|
+
if (e instanceof ResponseSizeLimitExceededError) {
|
|
835
|
+
this.logger.warn(`Oversized response from peer ${peerId.toString()} in ${subProtocol}: ${e.message}`, logTags);
|
|
836
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
980
837
|
}
|
|
981
838
|
return this.categorizeConnectionErrors(e, peerId, subProtocol);
|
|
982
839
|
}
|
|
983
840
|
/*
|
|
984
841
|
* Errors specific to connection handling
|
|
985
|
-
* These can happen both when sending request and response
|
|
842
|
+
* These can happen both when sending request and response.
|
|
843
|
+
*/ categorizeConnectionErrors(e, peerId, subProtocol) {
|
|
986
844
|
const logTags = {
|
|
987
845
|
peerId: peerId.toString(),
|
|
988
846
|
subProtocol
|
|
@@ -1,7 +1,7 @@
|
|
|
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';
|
|
4
|
-
import type {
|
|
3
|
+
import type { P2PConnectivity, PeerInfo } from '@aztec/stdlib/interfaces/server';
|
|
4
|
+
import type { CheckpointAttestation, Gossipable, TopicType, ValidatedBlockProposal, ValidatedCheckpointProposalCore } from '@aztec/stdlib/p2p';
|
|
5
5
|
import type { Tx } from '@aztec/stdlib/tx';
|
|
6
6
|
import type { PeerId } from '@libp2p/interface';
|
|
7
7
|
import type { ENR } from '@nethermindeth/enr';
|
|
@@ -9,7 +9,7 @@ import type EventEmitter from 'events';
|
|
|
9
9
|
import type { BatchTxRequesterLibP2PService } from './reqresp/batch-tx-requester/interface.js';
|
|
10
10
|
import type { P2PReqRespConfig } from './reqresp/config.js';
|
|
11
11
|
import type { StatusMessage } from './reqresp/index.js';
|
|
12
|
-
import type { ReqRespSubProtocol, ReqRespSubProtocolHandler
|
|
12
|
+
import type { ReqRespSubProtocol, ReqRespSubProtocolHandler } from './reqresp/interface.js';
|
|
13
13
|
import type { AuthRequest, AuthResponse } from './reqresp/protocols/auth.js';
|
|
14
14
|
export declare enum PeerDiscoveryState {
|
|
15
15
|
RUNNING = "running",
|
|
@@ -18,16 +18,19 @@ export declare enum PeerDiscoveryState {
|
|
|
18
18
|
/**
|
|
19
19
|
* Callback for when a block proposal is received.
|
|
20
20
|
* Validators validate but DO NOT attest to individual blocks - attestations are only for checkpoints.
|
|
21
|
+
* The proposal is passed as a ValidatedBlockProposal: it has already passed p2p ingress validation, and
|
|
22
|
+
* consumers are not expected to repeat it.
|
|
21
23
|
* @returns true if the proposal is valid, false otherwise
|
|
22
24
|
*/
|
|
23
|
-
export type P2PBlockReceivedCallback = (block:
|
|
25
|
+
export type P2PBlockReceivedCallback = (block: ValidatedBlockProposal, sender: PeerId) => Promise<boolean>;
|
|
24
26
|
/**
|
|
25
27
|
* Callback for when a checkpoint proposal is received.
|
|
26
|
-
* The checkpoint proposal is passed as
|
|
28
|
+
* The checkpoint proposal is passed as ValidatedCheckpointProposalCore (without lastBlock) since
|
|
27
29
|
* the lastBlock is extracted and stored separately as a BlockProposal, and the block
|
|
28
|
-
* callback is invoked and awaited before this checkpoint callback.
|
|
30
|
+
* callback is invoked and awaited before this checkpoint callback. As with block proposals, it has already
|
|
31
|
+
* passed p2p ingress validation.
|
|
29
32
|
*/
|
|
30
|
-
export type P2PCheckpointReceivedCallback = (checkpoint:
|
|
33
|
+
export type P2PCheckpointReceivedCallback = (checkpoint: ValidatedCheckpointProposalCore, sender: PeerId) => Promise<CheckpointAttestation[] | undefined>;
|
|
31
34
|
export type AuthReceivedCallback = (peerId: PeerId, authRequest: AuthRequest) => Promise<AuthResponse | undefined>;
|
|
32
35
|
/** Minimal info passed to the duplicate proposal callback. */
|
|
33
36
|
export type DuplicateProposalInfo = {
|
|
@@ -40,6 +43,17 @@ export type DuplicateProposalInfo = {
|
|
|
40
43
|
* Invoked on the first duplicate (when count goes from 1 to 2).
|
|
41
44
|
*/
|
|
42
45
|
export type P2PDuplicateProposalCallback = (info: DuplicateProposalInfo) => void;
|
|
46
|
+
/** Minimal info passed to the oversized proposal callback. */
|
|
47
|
+
export type OversizedProposalInfo = {
|
|
48
|
+
slot: SlotNumber;
|
|
49
|
+
proposer: EthAddress;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Callback for when a block proposal whose index lands at or beyond the consensus per-checkpoint block
|
|
53
|
+
* limit is stored and re-broadcast as slashing evidence. May fire multiple times per (slot, proposer)
|
|
54
|
+
* if the proposer signed several oversized proposals; consumers are expected to dedup.
|
|
55
|
+
*/
|
|
56
|
+
export type P2POversizedProposalCallback = (info: OversizedProposalInfo) => void;
|
|
43
57
|
/** Minimal info passed to the duplicate attestation callback. */
|
|
44
58
|
export type DuplicateAttestationInfo = {
|
|
45
59
|
slot: SlotNumber;
|
|
@@ -51,6 +65,7 @@ export type DuplicateAttestationInfo = {
|
|
|
51
65
|
* Invoked on the first duplicate (when count goes from 1 to 2).
|
|
52
66
|
*/
|
|
53
67
|
export type P2PDuplicateAttestationCallback = (info: DuplicateAttestationInfo) => void;
|
|
68
|
+
export type P2PCheckpointAttestationCallback = (attestation: CheckpointAttestation) => void;
|
|
54
69
|
/**
|
|
55
70
|
* The interface for a P2P service implementation.
|
|
56
71
|
*/
|
|
@@ -70,33 +85,41 @@ export interface P2PService {
|
|
|
70
85
|
* @param message - The message to be propagated.
|
|
71
86
|
*/
|
|
72
87
|
propagate<T extends Gossipable>(message: T): Promise<void>;
|
|
73
|
-
/**
|
|
74
|
-
* Send a batch of requests to peers, and return the responses
|
|
75
|
-
*
|
|
76
|
-
* @param protocol - The request response protocol to use
|
|
77
|
-
* @param requests - The requests to send to the peers
|
|
78
|
-
* @returns The responses to the requests
|
|
79
|
-
*/
|
|
80
|
-
sendBatchRequest<Protocol extends ReqRespSubProtocol>(protocol: Protocol, requests: InstanceType<SubProtocolMap[Protocol]['request']>[], pinnedPeerId?: PeerId, timeoutMs?: number, maxPeers?: number, maxRetryAttempts?: number): Promise<InstanceType<SubProtocolMap[Protocol]['response']>[]>;
|
|
81
88
|
registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
|
|
82
|
-
|
|
89
|
+
registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
|
|
90
|
+
registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
|
|
83
91
|
/**
|
|
84
92
|
* Registers a callback invoked when a duplicate proposal is detected (equivocation).
|
|
85
93
|
* The callback is triggered on the first duplicate (when count goes from 1 to 2).
|
|
86
94
|
*/
|
|
87
95
|
registerDuplicateProposalCallback(callback: P2PDuplicateProposalCallback): void;
|
|
96
|
+
/**
|
|
97
|
+
* Registers a callback invoked when an oversized block proposal (index at or beyond the consensus
|
|
98
|
+
* per-checkpoint block limit) is stored and re-broadcast as slashing evidence.
|
|
99
|
+
*/
|
|
100
|
+
registerOversizedProposalCallback(callback: P2POversizedProposalCallback): void;
|
|
88
101
|
/**
|
|
89
102
|
* Registers a callback invoked when a duplicate attestation is detected (equivocation).
|
|
90
103
|
* A validator signing attestations for different proposals at the same slot.
|
|
91
104
|
* The callback is triggered on the first duplicate (when count goes from 1 to 2).
|
|
92
105
|
*/
|
|
93
106
|
registerDuplicateAttestationCallback(callback: P2PDuplicateAttestationCallback): void;
|
|
107
|
+
registerCheckpointAttestationCallback(callback: P2PCheckpointAttestationCallback): void;
|
|
94
108
|
getEnr(): ENR | undefined;
|
|
95
109
|
getPeers(includePending?: boolean): PeerInfo[];
|
|
110
|
+
/**
|
|
111
|
+
* Returns whether this p2p service is a real p2p stack, and how many peers it is currently connected to.
|
|
112
|
+
* Implementations that do not run p2p at all report `enabled: false`.
|
|
113
|
+
*/
|
|
114
|
+
getP2PConnectivity(): P2PConnectivity;
|
|
96
115
|
/** Returns the number of peers in the GossipSub mesh for a given topic type. */
|
|
97
116
|
getGossipMeshPeerCount(topicType: TopicType): number;
|
|
117
|
+
/**
|
|
118
|
+
* Runs minimum integrity validation on txs carried in a block proposal.
|
|
119
|
+
* @throws InvalidBlockProposalTxsError - If any tx fails validation.
|
|
120
|
+
*/
|
|
98
121
|
validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
|
|
99
|
-
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler
|
|
122
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void>;
|
|
100
123
|
handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
101
124
|
updateConfig(config: Partial<P2PReqRespConfig>): void;
|
|
102
125
|
/** If node running this P2P stack is validator, passes in validator address to P2P layer */
|
|
@@ -136,8 +159,10 @@ export interface PeerDiscoveryService extends EventEmitter {
|
|
|
136
159
|
*/
|
|
137
160
|
on(event: 'peer:discovered', listener: (enr: ENR) => void): this;
|
|
138
161
|
emit(event: 'peer:discovered', enr: ENR): boolean;
|
|
162
|
+
on(event: 'ip:changed', listener: (ip: string) => void): this;
|
|
163
|
+
emit(event: 'ip:changed', ip: string): boolean;
|
|
139
164
|
getStatus(): PeerDiscoveryState;
|
|
140
165
|
getEnr(): ENR | undefined;
|
|
141
166
|
bootstrapNodeEnrs: ENR[];
|
|
142
167
|
}
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pGLE9BQU8sS0FBSyxFQUNWLHFCQUFxQixFQUNyQixVQUFVLEVBQ1YsU0FBUyxFQUNULHNCQUFzQixFQUN0QiwrQkFBK0IsRUFDaEMsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUzQyxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEtBQUssWUFBWSxNQUFNLFFBQVEsQ0FBQztBQUV2QyxPQUFPLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQy9GLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RixPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0Usb0JBQVksa0JBQWtCO0lBQzVCLE9BQU8sWUFBWTtJQUNuQixPQUFPLFlBQVk7Q0FDcEI7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE1B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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/services/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/services/service.ts"],"names":[],"mappings":"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"}
|