@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,7 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { sleep } from '@aztec/foundation/sleep';
|
|
3
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
3
5
|
import { type ComponentsVersions, checkCompressedComponentVersion } from '@aztec/stdlib/versioning';
|
|
4
6
|
import { OtelMetricsAdapter, type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
|
|
5
7
|
|
|
@@ -14,9 +16,13 @@ import { createNodeENR } from '../../enr/generate-enr.js';
|
|
|
14
16
|
import { AZTEC_ENR_KEY, Discv5Event, PeerEvent } from '../../types/index.js';
|
|
15
17
|
import { convertToMultiaddr } from '../../util.js';
|
|
16
18
|
import { type PeerDiscoveryService, PeerDiscoveryState } from '../service.js';
|
|
19
|
+
import { PersistedEnrStore } from './persisted_enr_store.js';
|
|
17
20
|
|
|
18
21
|
const delayBeforeStart = 2000; // 2sec
|
|
19
22
|
|
|
23
|
+
/** Upper bound on persisted peer ENRs, to keep the store bounded as peers churn. */
|
|
24
|
+
const MAX_PERSISTED_PEER_ENRS = 100;
|
|
25
|
+
|
|
20
26
|
/**
|
|
21
27
|
* Peer discovery service using Discv5.
|
|
22
28
|
*/
|
|
@@ -35,12 +41,19 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
35
41
|
private bootstrapNodePeerIds: PeerId[] = [];
|
|
36
42
|
public bootstrapNodeEnrs: ENR[] = [];
|
|
37
43
|
private trustedPeerEnrs: ENR[] = [];
|
|
44
|
+
/** Node IDs of all config-provided peers (bootstrap, trusted, private); these are never persisted. */
|
|
45
|
+
private readonly configProvidedNodeIds: Set<string>;
|
|
38
46
|
|
|
39
47
|
private startTime = 0;
|
|
40
48
|
|
|
49
|
+
private currentIp: string | undefined;
|
|
50
|
+
|
|
51
|
+
/** Persistent store of discovered peer ENRs, used to re-seed discovery after a restart. */
|
|
52
|
+
private readonly persistedEnrs?: PersistedEnrStore;
|
|
53
|
+
|
|
41
54
|
private handlers = {
|
|
42
55
|
onMultiaddrUpdated: this.onMultiaddrUpdated.bind(this),
|
|
43
|
-
|
|
56
|
+
onPeerDiscovered: this.onPeerDiscovered.bind(this),
|
|
44
57
|
onEnrAdded: this.onEnrAdded.bind(this),
|
|
45
58
|
};
|
|
46
59
|
|
|
@@ -50,14 +63,27 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
50
63
|
private readonly packageVersion: string,
|
|
51
64
|
telemetry: TelemetryClient = getTelemetryClient(),
|
|
52
65
|
private logger = createLogger('p2p:discv5_service'),
|
|
66
|
+
store?: AztecAsyncKVStore,
|
|
53
67
|
configOverrides: Partial<IDiscv5CreateOptions> = {},
|
|
68
|
+
private readonly dateProvider: DateProvider = new DateProvider(),
|
|
54
69
|
) {
|
|
55
70
|
super();
|
|
71
|
+
|
|
72
|
+
this.persistedEnrs = store
|
|
73
|
+
? new PersistedEnrStore(store, MAX_PERSISTED_PEER_ENRS, createLogger(`${this.logger.module}:enr-store`))
|
|
74
|
+
: undefined;
|
|
75
|
+
|
|
56
76
|
const { p2pIp, p2pPort, p2pBroadcastPort, bootstrapNodes, trustedPeers, privatePeers } = config;
|
|
57
77
|
|
|
78
|
+
this.currentIp = p2pIp;
|
|
58
79
|
this.bootstrapNodeEnrs = bootstrapNodes.map(x => ENR.decodeTxt(x));
|
|
59
80
|
const privatePeerEnrs = new Set(privatePeers);
|
|
60
81
|
this.trustedPeerEnrs = trustedPeers.filter(x => !privatePeerEnrs.has(x)).map(x => ENR.decodeTxt(x));
|
|
82
|
+
// Peers supplied via config are re-injected from config on every start, so they must never end up
|
|
83
|
+
// in the persisted (discovered-peer) store — private peers especially must not be written there.
|
|
84
|
+
this.configProvidedNodeIds = new Set(
|
|
85
|
+
[...bootstrapNodes, ...trustedPeers, ...privatePeers].map(x => ENR.decodeTxt(x).nodeId),
|
|
86
|
+
);
|
|
61
87
|
|
|
62
88
|
// If no overridden broadcast port is provided, use the p2p port as the broadcast port
|
|
63
89
|
if (!p2pBroadcastPort) {
|
|
@@ -96,7 +122,8 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
96
122
|
lookupTimeout: 2000,
|
|
97
123
|
requestTimeout: 2000,
|
|
98
124
|
allowUnverifiedSessions: true,
|
|
99
|
-
enrUpdate: !p2pIp
|
|
125
|
+
enrUpdate: config.queryForIp || !p2pIp,
|
|
126
|
+
pingInterval: config.queryForIp ? 10_000 : 300_000,
|
|
100
127
|
...configOverrides.config,
|
|
101
128
|
},
|
|
102
129
|
metricsRegistry,
|
|
@@ -121,17 +148,40 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
121
148
|
}
|
|
122
149
|
};
|
|
123
150
|
|
|
124
|
-
this.discv5.on(Discv5Event.DISCOVERED, this.handlers.
|
|
151
|
+
this.discv5.on(Discv5Event.DISCOVERED, this.handlers.onPeerDiscovered);
|
|
125
152
|
this.discv5.on(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded);
|
|
126
153
|
this.discv5.on(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated);
|
|
127
154
|
}
|
|
128
155
|
|
|
129
156
|
private onMultiaddrUpdated(m: Multiaddr) {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
157
|
+
const newIp = m.nodeAddress().address;
|
|
158
|
+
const previousIp = this.currentIp;
|
|
159
|
+
|
|
160
|
+
if (newIp === previousIp) {
|
|
161
|
+
this.logger.debug('Discv5 confirmed current IP (no change)', { ip: newIp });
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const multiAddrTcp = multiaddr(convertToMultiaddr(newIp, this.config.p2pBroadcastPort!, 'tcp'));
|
|
133
166
|
this.enr.setLocationMultiaddr(multiAddrTcp);
|
|
134
|
-
this.
|
|
167
|
+
this.currentIp = newIp;
|
|
168
|
+
|
|
169
|
+
if (previousIp) {
|
|
170
|
+
this.logger.info('IP address changed, ENR updated', {
|
|
171
|
+
previousIp,
|
|
172
|
+
newIp,
|
|
173
|
+
multiaddr: multiAddrTcp.toString(),
|
|
174
|
+
enr: this.enr.encodeTxt(),
|
|
175
|
+
});
|
|
176
|
+
} else {
|
|
177
|
+
this.logger.info('Initial IP discovered via discv5, ENR updated', {
|
|
178
|
+
ip: newIp,
|
|
179
|
+
multiaddr: multiAddrTcp.toString(),
|
|
180
|
+
enr: this.enr.encodeTxt(),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
this.emit('ip:changed', newIp);
|
|
135
185
|
}
|
|
136
186
|
|
|
137
187
|
public async start(): Promise<void> {
|
|
@@ -140,14 +190,19 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
140
190
|
}
|
|
141
191
|
this.logger.debug('Starting DiscV5');
|
|
142
192
|
await this.discv5.start();
|
|
143
|
-
this.startTime =
|
|
193
|
+
this.startTime = this.dateProvider.now();
|
|
144
194
|
|
|
195
|
+
const enrUpdateEnabled = this.config.queryForIp || !this.config.p2pIp;
|
|
145
196
|
this.logger.info(`DiscV5 service started`, {
|
|
146
197
|
nodeId: this.enr.nodeId,
|
|
147
198
|
peerId: this.peerId,
|
|
148
199
|
enrUdp: await this.enr.getFullMultiaddr('udp'),
|
|
149
200
|
enrTcp: await this.enr.getFullMultiaddr('tcp'),
|
|
150
201
|
versions: this.versions,
|
|
202
|
+
enrUpdateEnabled,
|
|
203
|
+
queryForIp: this.config.queryForIp,
|
|
204
|
+
configuredIp: this.config.p2pIp ?? 'none',
|
|
205
|
+
pingIntervalMs: this.config.queryForIp ? 10_000 : 300_000,
|
|
151
206
|
});
|
|
152
207
|
this.currentState = PeerDiscoveryState.RUNNING;
|
|
153
208
|
|
|
@@ -187,6 +242,26 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
187
242
|
this.discv5.addEnr(enr);
|
|
188
243
|
}
|
|
189
244
|
}
|
|
245
|
+
|
|
246
|
+
// Re-seed discovery from peers persisted on previous runs. This lets a node rejoin the network
|
|
247
|
+
// after a restart even when no bootstrap node is reachable: discv5 has no on-disk routing table,
|
|
248
|
+
// so without this its DHT would start empty and rediscovery would depend on inbound dials alone.
|
|
249
|
+
if (this.persistedEnrs) {
|
|
250
|
+
// Drop peers that are now config-provided (re-injected above) or fail version checks.
|
|
251
|
+
const enrs = await this.persistedEnrs.load(
|
|
252
|
+
enr => this.validateEnr(enr) && !this.configProvidedNodeIds.has(enr.nodeId),
|
|
253
|
+
);
|
|
254
|
+
for (const enr of enrs) {
|
|
255
|
+
try {
|
|
256
|
+
this.discv5.addEnr(enr);
|
|
257
|
+
} catch (err) {
|
|
258
|
+
this.logger.debug(`Error re-seeding persisted ENR ${enr.nodeId}`, err);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (enrs.length > 0) {
|
|
262
|
+
this.logger.info(`Re-seeded discovery with ${enrs.length} persisted peer ENRs`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
190
265
|
}
|
|
191
266
|
|
|
192
267
|
public async runRandomNodesQuery(): Promise<void> {
|
|
@@ -196,8 +271,8 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
196
271
|
|
|
197
272
|
// First, wait some time before starting the peer discovery
|
|
198
273
|
// reference: https://github.com/ChainSafe/lodestar/issues/3423
|
|
199
|
-
const msSinceStart =
|
|
200
|
-
if (
|
|
274
|
+
const msSinceStart = this.dateProvider.now() - this.startTime;
|
|
275
|
+
if (this.dateProvider.now() - this.startTime <= delayBeforeStart) {
|
|
201
276
|
await sleep(delayBeforeStart - msSinceStart);
|
|
202
277
|
}
|
|
203
278
|
|
|
@@ -232,7 +307,7 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
232
307
|
if (this.currentState !== PeerDiscoveryState.RUNNING) {
|
|
233
308
|
return;
|
|
234
309
|
}
|
|
235
|
-
await this.discv5.off(Discv5Event.DISCOVERED, this.handlers.
|
|
310
|
+
await this.discv5.off(Discv5Event.DISCOVERED, this.handlers.onPeerDiscovered);
|
|
236
311
|
await this.discv5.off(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded);
|
|
237
312
|
await this.discv5.off(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated);
|
|
238
313
|
|
|
@@ -242,12 +317,38 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
242
317
|
}
|
|
243
318
|
|
|
244
319
|
private async onEnrAdded(enr: ENR) {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
320
|
+
try {
|
|
321
|
+
const multiAddrTcp = await enr.getFullMultiaddr('tcp');
|
|
322
|
+
const multiAddrUdp = await enr.getFullMultiaddr('udp');
|
|
323
|
+
this.logger.debug(`Added ENR ${enr.encodeTxt()}`, { multiAddrTcp, multiAddrUdp, nodeId: enr.nodeId });
|
|
324
|
+
// A peer just entered the routing table — persist it so we can re-seed discovery after a restart.
|
|
325
|
+
if (this.persistedEnrs && this.shouldPersist(enr)) {
|
|
326
|
+
await this.persistedEnrs.persist(enr);
|
|
327
|
+
}
|
|
328
|
+
this.onDiscovered(enr);
|
|
329
|
+
} catch (err) {
|
|
330
|
+
// A malformed ENR address field (e.g. a 3-byte TCP port) makes @nethermindeth/enr throw while
|
|
331
|
+
// parsing the multiaddr. This is an async event listener, so an unhandled rejection would crash
|
|
332
|
+
// the process — catch, log, and drop the ENR instead.
|
|
333
|
+
this.logger.warn(`Dropping ENR with unparseable address`, { nodeId: enr.nodeId, err });
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
private async onPeerDiscovered(enr: ENR) {
|
|
338
|
+
// discv5 updates an existing routing-table entry on an ENR sequence bump without emitting enrAdded,
|
|
339
|
+
// so DISCOVERED is our only signal that a peer we already track may have changed address. Refresh
|
|
340
|
+
// the persisted copy (a no-op for peers we don't already store) so we don't keep dialing a stale ENR.
|
|
341
|
+
if (this.persistedEnrs && this.shouldPersist(enr)) {
|
|
342
|
+
await this.persistedEnrs.refresh(enr);
|
|
343
|
+
}
|
|
248
344
|
this.onDiscovered(enr);
|
|
249
345
|
}
|
|
250
346
|
|
|
347
|
+
/** Whether an ENR belongs in the persisted store: a validated, non-config peer that isn't ourselves. */
|
|
348
|
+
private shouldPersist(enr: ENR): boolean {
|
|
349
|
+
return !this.configProvidedNodeIds.has(enr.nodeId) && enr.nodeId !== this.enr.nodeId && this.validateEnr(enr);
|
|
350
|
+
}
|
|
351
|
+
|
|
251
352
|
private isOurBootnode(enr: ENR) {
|
|
252
353
|
return this.bootstrapNodeEnrs.some(x => x.nodeId === enr.nodeId);
|
|
253
354
|
}
|
|
@@ -281,6 +382,17 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
|
|
|
281
382
|
return false;
|
|
282
383
|
}
|
|
283
384
|
|
|
385
|
+
// A malformed TCP field (e.g. a non-2-byte port) makes @nethermindeth/enr throw while building the
|
|
386
|
+
// multiaddr. Reject such an ENR here so it's never emitted as a full peer or re-parsed by an
|
|
387
|
+
// unguarded listener (which would crash the process). A missing TCP addr is allowed — those peers
|
|
388
|
+
// are simply skipped at dial time.
|
|
389
|
+
try {
|
|
390
|
+
enr.getLocationMultiaddr('tcp');
|
|
391
|
+
} catch (err) {
|
|
392
|
+
this.logger.debug(`Peer node ${enr.nodeId} has an unparseable TCP address`, { err });
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
|
|
284
396
|
// And check it has the correct version
|
|
285
397
|
let compressedVersion;
|
|
286
398
|
try {
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
|
|
3
|
+
|
|
4
|
+
import { ENR } from '@nethermindeth/enr';
|
|
5
|
+
|
|
6
|
+
/** Map name under which discovered peer ENRs are persisted so discovery can be re-seeded after a restart. */
|
|
7
|
+
const PERSISTED_ENRS_MAP_NAME = 'discovered_peer_enrs';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A persisted peer entry: the ENR text plus a monotonic sequence number recording when the peer was
|
|
11
|
+
* last seen. The sequence orders the store as a FIFO so eviction drops the oldest-seen peers first.
|
|
12
|
+
*/
|
|
13
|
+
interface PersistedEnr {
|
|
14
|
+
enr: string;
|
|
15
|
+
seq: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function parsePersistedEnr(value: string): PersistedEnr | undefined {
|
|
19
|
+
try {
|
|
20
|
+
const parsed = JSON.parse(value);
|
|
21
|
+
if (typeof parsed?.enr === 'string' && typeof parsed?.seq === 'number') {
|
|
22
|
+
return parsed;
|
|
23
|
+
}
|
|
24
|
+
} catch {
|
|
25
|
+
// Unparseable entry; caller treats it as stale.
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* A bounded, transactional store of discovered peer ENRs used to re-seed discovery after a restart.
|
|
32
|
+
*
|
|
33
|
+
* Entries are keyed by nodeId (so re-seeing a peer dedups in place) and carry a monotonic sequence so
|
|
34
|
+
* the store behaves as a FIFO: when it exceeds its cap, the oldest-seen peers are evicted first. All
|
|
35
|
+
* writes run in a transaction so concurrent discovery events can't race the size check.
|
|
36
|
+
*/
|
|
37
|
+
export class PersistedEnrStore {
|
|
38
|
+
private readonly enrs: AztecAsyncMap<string, string>;
|
|
39
|
+
/** Monotonic sequence stamped on each entry; seeded from the store's max in {@link load}. */
|
|
40
|
+
private seq = 0;
|
|
41
|
+
|
|
42
|
+
constructor(
|
|
43
|
+
private readonly store: AztecAsyncKVStore,
|
|
44
|
+
private readonly maxEntries: number,
|
|
45
|
+
private readonly logger: Logger = createLogger('p2p:discv5:enr-store'),
|
|
46
|
+
) {
|
|
47
|
+
this.enrs = store.openMap(PERSISTED_ENRS_MAP_NAME);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Adds or replaces a peer's ENR, stamping it as most-recently-seen and evicting the oldest if over cap. */
|
|
51
|
+
public async persist(enr: ENR): Promise<void> {
|
|
52
|
+
const nodeId = enr.nodeId;
|
|
53
|
+
const enrTxt = enr.encodeTxt();
|
|
54
|
+
try {
|
|
55
|
+
await this.store.transactionAsync(async () => {
|
|
56
|
+
const seq = ++this.seq;
|
|
57
|
+
const others: { nodeId: string; seq: number }[] = [];
|
|
58
|
+
for await (const [id, value] of this.enrs.entriesAsync()) {
|
|
59
|
+
if (id !== nodeId) {
|
|
60
|
+
others.push({ nodeId: id, seq: parsePersistedEnr(value)?.seq ?? 0 });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const overflow = others.length + 1 - this.maxEntries;
|
|
64
|
+
if (overflow > 0) {
|
|
65
|
+
others.sort((a, b) => a.seq - b.seq); // oldest-seen (lowest sequence) first
|
|
66
|
+
for (let i = 0; i < overflow; i++) {
|
|
67
|
+
await this.enrs.delete(others[i].nodeId);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
await this.enrs.set(nodeId, JSON.stringify({ enr: enrTxt, seq }));
|
|
71
|
+
});
|
|
72
|
+
} catch (err) {
|
|
73
|
+
this.logger.warn(`Failed to persist discovered ENR ${nodeId}`, err);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Refreshes an already-persisted peer's stored ENR when a newer one (higher ENR sequence) is seen.
|
|
79
|
+
* A no-op for peers we don't already track — we never add new peers via this path, only update.
|
|
80
|
+
*
|
|
81
|
+
* This exists because discv5 updates an existing routing-table entry on an ENR sequence bump without
|
|
82
|
+
* emitting an `enrAdded` event, so a peer that changes address would otherwise keep its stale ENR
|
|
83
|
+
* persisted until evicted.
|
|
84
|
+
*/
|
|
85
|
+
public async refresh(enr: ENR): Promise<void> {
|
|
86
|
+
const nodeId = enr.nodeId;
|
|
87
|
+
try {
|
|
88
|
+
await this.store.transactionAsync(async () => {
|
|
89
|
+
const existing = await this.enrs.getAsync(nodeId);
|
|
90
|
+
if (!existing) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Two unrelated sequence numbers are in play:
|
|
94
|
+
// - the ENR sequence (`enr.seq` / `storedEnrSeq`) is set by the *peer* and bumped whenever it
|
|
95
|
+
// revises its record (e.g. changes address); we compare these to decide whether the incoming
|
|
96
|
+
// ENR is genuinely newer and worth keeping.
|
|
97
|
+
// - our storage sequence (`this.seq`) is an internal counter used only for FIFO eviction; we
|
|
98
|
+
// stamp a fresh one so this entry counts as most-recently-seen.
|
|
99
|
+
const storedEnrSeq = this.decodeStoredEnr(existing)?.seq;
|
|
100
|
+
if (storedEnrSeq !== undefined && enr.seq <= storedEnrSeq) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
await this.enrs.set(nodeId, JSON.stringify({ enr: enr.encodeTxt(), seq: ++this.seq }));
|
|
104
|
+
});
|
|
105
|
+
} catch (err) {
|
|
106
|
+
this.logger.warn(`Failed to refresh persisted ENR ${nodeId}`, err);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Loads all persisted ENRs, decoding each and keeping those the `accept` predicate allows. Entries
|
|
112
|
+
* that fail to decode or are rejected are removed from the store. The FIFO sequence resumes from the
|
|
113
|
+
* highest persisted value so eviction order survives restarts.
|
|
114
|
+
*/
|
|
115
|
+
public async load(accept: (enr: ENR) => boolean): Promise<ENR[]> {
|
|
116
|
+
const valid: ENR[] = [];
|
|
117
|
+
const stale: string[] = [];
|
|
118
|
+
let maxSeq = 0;
|
|
119
|
+
for await (const [nodeId, value] of this.enrs.entriesAsync()) {
|
|
120
|
+
const parsed = parsePersistedEnr(value);
|
|
121
|
+
let enr: ENR | undefined;
|
|
122
|
+
if (parsed) {
|
|
123
|
+
try {
|
|
124
|
+
enr = ENR.decodeTxt(parsed.enr);
|
|
125
|
+
} catch (err) {
|
|
126
|
+
this.logger.debug(`Dropping undecodable persisted ENR ${nodeId}`, err);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (!parsed || !enr || !accept(enr)) {
|
|
130
|
+
stale.push(nodeId);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
maxSeq = Math.max(maxSeq, parsed.seq);
|
|
134
|
+
valid.push(enr);
|
|
135
|
+
}
|
|
136
|
+
this.seq = maxSeq;
|
|
137
|
+
if (stale.length > 0) {
|
|
138
|
+
await this.store.transactionAsync(async () => {
|
|
139
|
+
for (const nodeId of stale) {
|
|
140
|
+
await this.enrs.delete(nodeId);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return valid;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
private decodeStoredEnr(value: string): ENR | undefined {
|
|
148
|
+
const parsed = parsePersistedEnr(value);
|
|
149
|
+
if (!parsed) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
return ENR.decodeTxt(parsed.enr);
|
|
154
|
+
} catch {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
-
import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
|
|
2
|
+
import type { P2PConnectivity, PeerInfo } from '@aztec/stdlib/interfaces/server';
|
|
3
3
|
import type { Gossipable, PeerErrorSeverity, TopicType } from '@aztec/stdlib/p2p';
|
|
4
4
|
import { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
5
5
|
|
|
@@ -18,16 +18,17 @@ import type {
|
|
|
18
18
|
ReqRespSubProtocol,
|
|
19
19
|
ReqRespSubProtocolHandler,
|
|
20
20
|
ReqRespSubProtocolHandlers,
|
|
21
|
-
ReqRespSubProtocolValidators,
|
|
22
21
|
SubProtocolMap,
|
|
23
22
|
} from './reqresp/interface.js';
|
|
24
23
|
import type { GoodByeReason } from './reqresp/protocols/goodbye.js';
|
|
25
24
|
import { ReqRespStatus } from './reqresp/status.js';
|
|
26
25
|
import {
|
|
27
26
|
type P2PBlockReceivedCallback,
|
|
27
|
+
type P2PCheckpointAttestationCallback,
|
|
28
28
|
type P2PCheckpointReceivedCallback,
|
|
29
29
|
type P2PDuplicateAttestationCallback,
|
|
30
30
|
type P2PDuplicateProposalCallback,
|
|
31
|
+
type P2POversizedProposalCallback,
|
|
31
32
|
type P2PService,
|
|
32
33
|
type PeerDiscoveryService,
|
|
33
34
|
PeerDiscoveryState,
|
|
@@ -37,6 +38,8 @@ import {
|
|
|
37
38
|
* A dummy implementation of the P2P Service.
|
|
38
39
|
*/
|
|
39
40
|
export class DummyP2PService implements P2PService {
|
|
41
|
+
private allNodesCheckpointReceivedCallback?: P2PCheckpointReceivedCallback;
|
|
42
|
+
|
|
40
43
|
updateConfig(_config: Partial<P2PReqRespConfig>): void {}
|
|
41
44
|
|
|
42
45
|
/** Returns an empty array for peers. */
|
|
@@ -44,6 +47,11 @@ export class DummyP2PService implements P2PService {
|
|
|
44
47
|
return [];
|
|
45
48
|
}
|
|
46
49
|
|
|
50
|
+
/** Reports p2p as disabled, since this service does not run a p2p stack. */
|
|
51
|
+
getP2PConnectivity(): P2PConnectivity {
|
|
52
|
+
return { enabled: false, connectedPeers: 0 };
|
|
53
|
+
}
|
|
54
|
+
|
|
47
55
|
getGossipMeshPeerCount(_topicType: TopicType): number {
|
|
48
56
|
return 0;
|
|
49
57
|
}
|
|
@@ -86,18 +94,28 @@ export class DummyP2PService implements P2PService {
|
|
|
86
94
|
/**
|
|
87
95
|
* Register a callback into the validator client for when a checkpoint proposal is received
|
|
88
96
|
*/
|
|
89
|
-
public
|
|
97
|
+
public registerValidatorCheckpointReceivedCallback(_callback: P2PCheckpointReceivedCallback) {}
|
|
98
|
+
public registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
|
|
99
|
+
this.allNodesCheckpointReceivedCallback = callback;
|
|
100
|
+
}
|
|
90
101
|
|
|
91
102
|
/**
|
|
92
103
|
* Register a callback for when a duplicate proposal is detected
|
|
93
104
|
*/
|
|
94
105
|
public registerDuplicateProposalCallback(_callback: P2PDuplicateProposalCallback): void {}
|
|
95
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Register a callback for when an oversized proposal is stored
|
|
109
|
+
*/
|
|
110
|
+
public registerOversizedProposalCallback(_callback: P2POversizedProposalCallback): void {}
|
|
111
|
+
|
|
96
112
|
/**
|
|
97
113
|
* Register a callback for when a duplicate attestation is detected
|
|
98
114
|
*/
|
|
99
115
|
public registerDuplicateAttestationCallback(_callback: P2PDuplicateAttestationCallback): void {}
|
|
100
116
|
|
|
117
|
+
public registerCheckpointAttestationCallback(_callback: P2PCheckpointAttestationCallback): void {}
|
|
118
|
+
|
|
101
119
|
/**
|
|
102
120
|
* Sends a request to a peer.
|
|
103
121
|
* @param _protocol - The protocol to send the request on.
|
|
@@ -111,19 +129,6 @@ export class DummyP2PService implements P2PService {
|
|
|
111
129
|
return Promise.resolve(undefined);
|
|
112
130
|
}
|
|
113
131
|
|
|
114
|
-
/**
|
|
115
|
-
* Sends a batch request to a peer.
|
|
116
|
-
* @param _protocol - The protocol to send the request on.
|
|
117
|
-
* @param _requests - The requests to send.
|
|
118
|
-
* @returns The responses from the peer, otherwise undefined.
|
|
119
|
-
*/
|
|
120
|
-
public sendBatchRequest<Protocol extends ReqRespSubProtocol>(
|
|
121
|
-
_protocol: Protocol,
|
|
122
|
-
_requests: InstanceType<SubProtocolMap[Protocol]['request']>[],
|
|
123
|
-
): Promise<InstanceType<SubProtocolMap[Protocol]['response']>[]> {
|
|
124
|
-
return Promise.resolve([]);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
132
|
public sendRequestToPeer(
|
|
128
133
|
_peerId: PeerId,
|
|
129
134
|
_subProtocol: ReqRespSubProtocol,
|
|
@@ -145,11 +150,7 @@ export class DummyP2PService implements P2PService {
|
|
|
145
150
|
return Promise.resolve();
|
|
146
151
|
}
|
|
147
152
|
|
|
148
|
-
addReqRespSubProtocol(
|
|
149
|
-
_subProtocol: ReqRespSubProtocol,
|
|
150
|
-
_handler: ReqRespSubProtocolHandler,
|
|
151
|
-
_validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
152
|
-
): Promise<void> {
|
|
153
|
+
addReqRespSubProtocol(_subProtocol: ReqRespSubProtocol, _handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
153
154
|
return Promise.resolve();
|
|
154
155
|
}
|
|
155
156
|
|
|
@@ -178,6 +179,7 @@ export class DummyP2PService implements P2PService {
|
|
|
178
179
|
peerScoring: {
|
|
179
180
|
penalizePeer: (_peerId, _penalty) => {},
|
|
180
181
|
},
|
|
182
|
+
validateRequestedBlockTxsConsistency: () => Promise.resolve(true),
|
|
181
183
|
};
|
|
182
184
|
}
|
|
183
185
|
}
|
|
@@ -282,10 +284,8 @@ export class DummyPeerManager implements PeerManagerInterface {
|
|
|
282
284
|
|
|
283
285
|
export class DummyReqResp implements ReqRespInterface {
|
|
284
286
|
updateConfig(_config: Partial<P2PReqRespConfig>): void {}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
_subProtocolValidators: ReqRespSubProtocolValidators,
|
|
288
|
-
): Promise<void> {
|
|
287
|
+
setShouldRejectPeer(): void {}
|
|
288
|
+
start(_subProtocolHandlers: ReqRespSubProtocolHandlers): Promise<void> {
|
|
289
289
|
return Promise.resolve();
|
|
290
290
|
}
|
|
291
291
|
stop(): Promise<void> {
|
|
@@ -297,16 +297,6 @@ export class DummyReqResp implements ReqRespInterface {
|
|
|
297
297
|
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined> {
|
|
298
298
|
return Promise.resolve(undefined);
|
|
299
299
|
}
|
|
300
|
-
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
|
|
301
|
-
_subProtocol: SubProtocol,
|
|
302
|
-
_requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
|
|
303
|
-
_pinnedPeer: PeerId | undefined,
|
|
304
|
-
_timeoutMs?: number,
|
|
305
|
-
_maxPeers?: number,
|
|
306
|
-
_maxRetryAttempts?: number,
|
|
307
|
-
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
|
|
308
|
-
return Promise.resolve([]);
|
|
309
|
-
}
|
|
310
300
|
public sendRequestToPeer(
|
|
311
301
|
_peerId: PeerId,
|
|
312
302
|
_subProtocol: ReqRespSubProtocol,
|
|
@@ -325,11 +315,7 @@ export class DummyReqResp implements ReqRespInterface {
|
|
|
325
315
|
};
|
|
326
316
|
}
|
|
327
317
|
|
|
328
|
-
addSubProtocol(
|
|
329
|
-
_subProtocol: ReqRespSubProtocol,
|
|
330
|
-
_handler: ReqRespSubProtocolHandler,
|
|
331
|
-
_validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
332
|
-
): Promise<void> {
|
|
318
|
+
addSubProtocol(_subProtocol: ReqRespSubProtocol, _handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
333
319
|
return Promise.resolve();
|
|
334
320
|
}
|
|
335
321
|
}
|
package/src/services/encoding.ts
CHANGED
|
@@ -2,33 +2,40 @@
|
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { MAX_TX_SIZE_KB, TopicType, getTopicFromString } from '@aztec/stdlib/p2p';
|
|
4
4
|
|
|
5
|
-
import type { RPC } from '@chainsafe/libp2p-gossipsub/message';
|
|
6
5
|
import type { DataTransform } from '@chainsafe/libp2p-gossipsub/types';
|
|
7
6
|
import type { Message } from '@libp2p/interface';
|
|
8
7
|
import { webcrypto } from 'node:crypto';
|
|
9
8
|
import { compressSync, uncompressSync } from 'snappy';
|
|
10
|
-
import xxhashFactory from 'xxhash-wasm';
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
10
|
+
/**
|
|
11
|
+
* Fallback maximum response size (in KB) applied when no explicit per-request bound is supplied.
|
|
12
|
+
* Used both as the `SnappyTransform` default and as the reception-side fallback in `readMessage`.
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_MAX_RESPONSE_SIZE_KB = 10 * 1024;
|
|
17
15
|
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
/** Thrown when a Snappy-compressed response exceeds the allowed decompressed size. */
|
|
17
|
+
export class OversizedSnappyResponseError extends Error {
|
|
18
|
+
constructor(decompressedSize: number, maxSizeKb: number) {
|
|
19
|
+
super(`Decompressed size ${decompressedSize} exceeds maximum allowed size of ${maxSizeKb}kb`);
|
|
20
|
+
this.name = 'OversizedSnappyResponseError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
20
23
|
|
|
21
24
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
25
|
+
* Thrown when the compressed bytes accumulated while reading a response stream exceed the reception
|
|
26
|
+
* bound, before the full payload is buffered. Distinct from {@link OversizedSnappyResponseError},
|
|
27
|
+
* which guards the decompressed size after the stream has already been fully received.
|
|
24
28
|
*/
|
|
25
|
-
export
|
|
26
|
-
|
|
27
|
-
|
|
29
|
+
export class ResponseSizeLimitExceededError extends Error {
|
|
30
|
+
constructor(accumulatedBytes: number, limitBytes: number) {
|
|
31
|
+
super(`Accumulated response size ${accumulatedBytes} bytes exceeds reception limit of ${limitBytes} bytes`);
|
|
32
|
+
this.name = 'ResponseSizeLimitExceededError';
|
|
28
33
|
}
|
|
29
|
-
return '0000000000000000';
|
|
30
34
|
}
|
|
31
35
|
|
|
36
|
+
// Shared buffer to convert msgId to string
|
|
37
|
+
const sharedMsgIdBuf = Buffer.alloc(20);
|
|
38
|
+
|
|
32
39
|
export function msgIdToStrFn(msgId: Uint8Array): string {
|
|
33
40
|
// This happens serially, no need to reallocate the buffer
|
|
34
41
|
sharedMsgIdBuf.set(msgId);
|
|
@@ -41,11 +48,20 @@ export function msgIdToStrFn(msgId: Uint8Array): string {
|
|
|
41
48
|
* Follows similarly to:
|
|
42
49
|
* https://github.com/ethereum/consensus-specs/blob/v1.1.0-alpha.7/specs/altair/p2p-interface.md#topics-and-messages
|
|
43
50
|
*
|
|
51
|
+
* The topic length is framed into the hash input (`uint32be(topicLen) || topic || data`) so the
|
|
52
|
+
* `(topic, data)` boundary is unambiguous. A raw `topic || data` concatenation is not injective —
|
|
53
|
+
* shifting bytes across the boundary (e.g. `(topic + data[0], data[1:])`) yields the same bytes and
|
|
54
|
+
* thus the same id, letting an unsubscribed-topic message pre-occupy a real message's seenCache slot
|
|
55
|
+
* and suppress it as a duplicate.
|
|
56
|
+
*
|
|
44
57
|
* @param message - The libp2p message
|
|
45
58
|
* @returns The message identifier
|
|
46
59
|
*/
|
|
47
|
-
export async function getMsgIdFn({ topic, data }: Message): Promise<Uint8Array> {
|
|
48
|
-
const
|
|
60
|
+
export async function getMsgIdFn({ topic, data }: Pick<Message, 'topic' | 'data'>): Promise<Uint8Array> {
|
|
61
|
+
const topicBytes = Buffer.from(topic);
|
|
62
|
+
const framedTopicLength = Buffer.allocUnsafe(4);
|
|
63
|
+
framedTopicLength.writeUInt32BE(topicBytes.length);
|
|
64
|
+
const buffer = Buffer.concat([framedTopicLength, topicBytes, data]);
|
|
49
65
|
const hash = await webcrypto.subtle.digest('SHA-256', buffer);
|
|
50
66
|
return Buffer.from(hash.slice(0, 20));
|
|
51
67
|
}
|
|
@@ -68,7 +84,7 @@ const DefaultMaxSizesKb: Record<TopicType, number> = {
|
|
|
68
84
|
export class SnappyTransform implements DataTransform {
|
|
69
85
|
constructor(
|
|
70
86
|
private maxSizesKb: Record<TopicType, number> = DefaultMaxSizesKb,
|
|
71
|
-
private defaultMaxSizeKb: number =
|
|
87
|
+
private defaultMaxSizeKb: number = DEFAULT_MAX_RESPONSE_SIZE_KB,
|
|
72
88
|
private logger = createLogger('p2p:snappy-transform'),
|
|
73
89
|
) {}
|
|
74
90
|
|
|
@@ -86,7 +102,7 @@ export class SnappyTransform implements DataTransform {
|
|
|
86
102
|
const { decompressedSize } = readSnappyPreamble(data);
|
|
87
103
|
if (decompressedSize > maxSizeKb * 1024) {
|
|
88
104
|
this.logger.warn(`Decompressed size ${decompressedSize} exceeds maximum allowed size of ${maxSizeKb}kb`);
|
|
89
|
-
throw new
|
|
105
|
+
throw new OversizedSnappyResponseError(decompressedSize, maxSizeKb);
|
|
90
106
|
}
|
|
91
107
|
|
|
92
108
|
return Buffer.from(uncompressSync(data, { asBuffer: true }));
|