@aztec-labs/p2p 6.0.0-nightly.20260829
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 +134 -0
- package/dest/bootstrap/bootstrap.d.ts +39 -0
- package/dest/bootstrap/bootstrap.d.ts.map +1 -0
- package/dest/bootstrap/bootstrap.js +152 -0
- package/dest/client/factory.d.ts +32 -0
- package/dest/client/factory.d.ts.map +1 -0
- package/dest/client/factory.js +125 -0
- package/dest/client/index.d.ts +4 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +3 -0
- package/dest/client/interface.d.ts +223 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +9 -0
- package/dest/client/p2p_client.d.ts +202 -0
- package/dest/client/p2p_client.d.ts.map +1 -0
- package/dest/client/p2p_client.js +1051 -0
- package/dest/config.d.ts +295 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +458 -0
- package/dest/enr/generate-enr.d.ts +17 -0
- package/dest/enr/generate-enr.d.ts.map +1 -0
- package/dest/enr/generate-enr.js +52 -0
- package/dest/enr/index.d.ts +2 -0
- package/dest/enr/index.d.ts.map +1 -0
- package/dest/enr/index.js +1 -0
- package/dest/errors/attestation-pool.error.d.ts +7 -0
- package/dest/errors/attestation-pool.error.d.ts.map +1 -0
- package/dest/errors/attestation-pool.error.js +12 -0
- package/dest/errors/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 +21 -0
- package/dest/errors/reqresp.error.d.ts.map +1 -0
- package/dest/errors/reqresp.error.js +23 -0
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +11 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +9 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +194 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.js +521 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +745 -0
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -0
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/index.js +1 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts +242 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/mocks.js +33 -0
- package/dest/mem_pools/index.d.ts +4 -0
- package/dest/mem_pools/index.d.ts.map +1 -0
- package/dest/mem_pools/index.js +1 -0
- package/dest/mem_pools/instrumentation.d.ts +41 -0
- package/dest/mem_pools/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/instrumentation.js +120 -0
- package/dest/mem_pools/interface.d.ts +10 -0
- package/dest/mem_pools/interface.d.ts.map +1 -0
- package/dest/mem_pools/interface.js +3 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +48 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +112 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +99 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -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 +180 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +64 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +92 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +79 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +25 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +67 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +243 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +11 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +122 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +368 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +75 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +218 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +122 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1039 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +17 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.js +111 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +24 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +75 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +3 -0
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/index.js +2 -0
- package/dest/msg_validators/index.d.ts +4 -0
- package/dest/msg_validators/index.d.ts.map +1 -0
- package/dest/msg_validators/index.js +3 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +16 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +16 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +26 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +40 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +186 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +7 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +25 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +4 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +31 -0
- 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.d.ts +14 -0
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +25 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/block_header_validator.js +27 -0
- 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 +9 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/data_validator.js +114 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +21 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.js +36 -0
- package/dest/msg_validators/tx_validator/factory.d.ts +148 -0
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/factory.js +302 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
- package/dest/msg_validators/tx_validator/gas_limits_validator.d.ts +73 -0
- package/dest/msg_validators/tx_validator/gas_limits_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/gas_limits_validator.js +107 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +65 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/gas_validator.js +107 -0
- package/dest/msg_validators/tx_validator/index.d.ts +20 -0
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/index.js +19 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.js +63 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +35 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/phases_validator.js +141 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/test_utils.js +22 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +30 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +11 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +28 -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 +27 -0
- package/dest/services/data_store.d.ts.map +1 -0
- package/dest/services/data_store.js +192 -0
- package/dest/services/discv5/discV5_service.d.ts +54 -0
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +337 -0
- 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 +150 -0
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/services/dummy_service.js +228 -0
- package/dest/services/encoding.d.ts +67 -0
- package/dest/services/encoding.d.ts.map +1 -0
- package/dest/services/encoding.js +152 -0
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +25 -0
- package/dest/services/gossipsub/scoring.d.ts.map +1 -0
- package/dest/services/gossipsub/scoring.js +27 -0
- package/dest/services/gossipsub/topic_score_params.d.ts +167 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +336 -0
- package/dest/services/index.d.ts +8 -0
- package/dest/services/index.d.ts.map +1 -0
- package/dest/services/index.js +7 -0
- package/dest/services/libp2p/instrumentation.d.ts +25 -0
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
- package/dest/services/libp2p/instrumentation.js +143 -0
- package/dest/services/libp2p/libp2p_service.d.ts +250 -0
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_service.js +1983 -0
- package/dest/services/peer-manager/interface.d.ts +23 -0
- package/dest/services/peer-manager/interface.d.ts.map +1 -0
- package/dest/services/peer-manager/interface.js +1 -0
- package/dest/services/peer-manager/metrics.d.ts +23 -0
- package/dest/services/peer-manager/metrics.d.ts.map +1 -0
- package/dest/services/peer-manager/metrics.js +71 -0
- package/dest/services/peer-manager/peer_manager.d.ts +202 -0
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_manager.js +1015 -0
- package/dest/services/peer-manager/peer_scoring.d.ts +65 -0
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_scoring.js +239 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
- package/dest/services/reqresp/config.d.ts +30 -0
- package/dest/services/reqresp/config.d.ts.map +1 -0
- package/dest/services/reqresp/config.js +45 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +76 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +251 -0
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- package/dest/services/reqresp/index.d.ts +7 -0
- package/dest/services/reqresp/index.d.ts.map +1 -0
- package/dest/services/reqresp/index.js +5 -0
- package/dest/services/reqresp/interface.d.ts +174 -0
- package/dest/services/reqresp/interface.d.ts.map +1 -0
- package/dest/services/reqresp/interface.js +107 -0
- package/dest/services/reqresp/metrics.d.ts +16 -0
- package/dest/services/reqresp/metrics.d.ts.map +1 -0
- package/dest/services/reqresp/metrics.js +50 -0
- package/dest/services/reqresp/protocols/auth.d.ts +43 -0
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/auth.js +71 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +35 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +88 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +13 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +60 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +75 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +139 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts +49 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/goodbye.js +87 -0
- package/dest/services/reqresp/protocols/index.d.ts +10 -0
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/index.js +8 -0
- package/dest/services/reqresp/protocols/ping.d.ts +7 -0
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/ping.js +7 -0
- package/dest/services/reqresp/protocols/status.d.ts +42 -0
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/status.js +78 -0
- package/dest/services/reqresp/protocols/tx.d.ts +29 -0
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/tx.js +66 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts +2 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/index.js +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +105 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +194 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +3 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.js +64 -0
- package/dest/services/reqresp/reqresp.d.ts +107 -0
- package/dest/services/reqresp/reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/reqresp.js +887 -0
- package/dest/services/reqresp/status.d.ts +37 -0
- package/dest/services/reqresp/status.d.ts.map +1 -0
- package/dest/services/reqresp/status.js +58 -0
- package/dest/services/service.d.ts +168 -0
- package/dest/services/service.d.ts.map +1 -0
- package/dest/services/service.js +5 -0
- package/dest/services/tx_collection/config.d.ts +25 -0
- package/dest/services/tx_collection/config.d.ts.map +1 -0
- package/dest/services/tx_collection/config.js +59 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +100 -0
- package/dest/services/tx_collection/index.d.ts +4 -0
- package/dest/services/tx_collection/index.d.ts.map +1 -0
- package/dest/services/tx_collection/index.js +3 -0
- package/dest/services/tx_collection/instrumentation.d.ts +10 -0
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_collection/instrumentation.js +30 -0
- 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 +104 -0
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection.js +356 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts +40 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection_sink.js +108 -0
- package/dest/services/tx_collection/tx_source.d.ts +24 -0
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_source.js +56 -0
- package/dest/services/tx_file_store/config.d.ts +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +142 -0
- package/dest/services/tx_provider.d.ts +53 -0
- package/dest/services/tx_provider.d.ts.map +1 -0
- package/dest/services/tx_provider.js +223 -0
- package/dest/services/tx_provider_instrumentation.d.ts +16 -0
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
- package/dest/services/tx_provider_instrumentation.js +34 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts +7 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts.map +1 -0
- package/dest/test-helpers/generate-peer-id-private-keys.js +13 -0
- package/dest/test-helpers/get-ports.d.ts +7 -0
- package/dest/test-helpers/get-ports.d.ts.map +1 -0
- package/dest/test-helpers/get-ports.js +8 -0
- package/dest/test-helpers/index.d.ts +9 -0
- package/dest/test-helpers/index.d.ts.map +1 -0
- package/dest/test-helpers/index.js +8 -0
- package/dest/test-helpers/make-enrs.d.ts +16 -0
- package/dest/test-helpers/make-enrs.d.ts.map +1 -0
- package/dest/test-helpers/make-enrs.js +31 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +63 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
- package/dest/test-helpers/make-test-p2p-clients.js +140 -0
- package/dest/test-helpers/mock-pubsub.d.ts +109 -0
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
- package/dest/test-helpers/mock-pubsub.js +244 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
- package/dest/test-helpers/mock-tx-helpers.js +19 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +68 -0
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
- package/dest/test-helpers/reqresp-nodes.js +240 -0
- package/dest/test-helpers/test_tx_provider.d.ts +42 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +44 -0
- package/dest/test-helpers/testbench-utils.d.ts +164 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +401 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -0
- package/dest/testbench/p2p_client_testbench_worker.js +364 -0
- package/dest/testbench/parse_log_file.d.ts +2 -0
- package/dest/testbench/parse_log_file.d.ts.map +1 -0
- package/dest/testbench/parse_log_file.js +131 -0
- package/dest/testbench/testbench.d.ts +2 -0
- package/dest/testbench/testbench.d.ts.map +1 -0
- package/dest/testbench/testbench.js +62 -0
- package/dest/testbench/worker_client_manager.d.ts +102 -0
- package/dest/testbench/worker_client_manager.d.ts.map +1 -0
- package/dest/testbench/worker_client_manager.js +492 -0
- package/dest/types/index.d.ts +34 -0
- package/dest/types/index.d.ts.map +1 -0
- package/dest/types/index.js +30 -0
- package/dest/util.d.ts +66 -0
- package/dest/util.d.ts.map +1 -0
- package/dest/util.js +167 -0
- package/dest/versioning.d.ts +9 -0
- package/dest/versioning.d.ts.map +1 -0
- package/dest/versioning.js +17 -0
- package/package.json +131 -0
- package/src/bootstrap/bootstrap.ts +178 -0
- package/src/client/factory.ts +282 -0
- package/src/client/index.ts +3 -0
- package/src/client/interface.ts +264 -0
- package/src/client/p2p_client.ts +846 -0
- package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
- package/src/config.ts +787 -0
- package/src/enr/generate-enr.ts +71 -0
- package/src/enr/index.ts +1 -0
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +29 -0
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +11 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +648 -0
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +896 -0
- package/src/mem_pools/attestation_pool/index.ts +9 -0
- package/src/mem_pools/attestation_pool/mocks.ts +56 -0
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/instrumentation.ts +160 -0
- package/src/mem_pools/interface.ts +10 -0
- package/src/mem_pools/tx_pool_v2/README.md +283 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +130 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +120 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +126 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -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 +219 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +72 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +99 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +90 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +96 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +274 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +465 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +300 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1242 -0
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +116 -0
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +107 -0
- package/src/msg_validators/attestation_validator/index.ts +2 -0
- package/src/msg_validators/index.ts +3 -0
- package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +37 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +49 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +198 -0
- package/src/msg_validators/tx_validator/README.md +137 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +24 -0
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +30 -0
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +38 -0
- 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 +173 -0
- package/src/msg_validators/tx_validator/double_spend_validator.ts +46 -0
- package/src/msg_validators/tx_validator/factory.ts +490 -0
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
- package/src/msg_validators/tx_validator/gas_limits_validator.ts +148 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +149 -0
- package/src/msg_validators/tx_validator/index.ts +19 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +104 -0
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +173 -0
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/test_utils.ts +43 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +61 -0
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +26 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +100 -0
- package/src/services/data_store.ts +229 -0
- package/src/services/discv5/discV5_service.ts +413 -0
- package/src/services/discv5/persisted_enr_store.ts +157 -0
- package/src/services/dummy_service.ts +320 -0
- package/src/services/encoding.ts +170 -0
- package/src/services/gossipsub/README.md +663 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +37 -0
- package/src/services/gossipsub/topic_score_params.ts +477 -0
- package/src/services/index.ts +7 -0
- package/src/services/libp2p/instrumentation.ts +147 -0
- package/src/services/libp2p/libp2p_service.ts +1972 -0
- package/src/services/peer-manager/interface.ts +28 -0
- package/src/services/peer-manager/metrics.ts +90 -0
- package/src/services/peer-manager/peer_manager.ts +1221 -0
- package/src/services/peer-manager/peer_scoring.ts +265 -0
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +344 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +659 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +60 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +167 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +248 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
- package/src/services/reqresp/config.ts +69 -0
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +287 -0
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/index.ts +6 -0
- package/src/services/reqresp/interface.ts +241 -0
- package/src/services/reqresp/metrics.ts +68 -0
- package/src/services/reqresp/protocols/auth.ts +83 -0
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +107 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +79 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +170 -0
- package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
- package/src/services/reqresp/protocols/goodbye.ts +102 -0
- package/src/services/reqresp/protocols/index.ts +9 -0
- package/src/services/reqresp/protocols/ping.ts +8 -0
- package/src/services/reqresp/protocols/status.ts +123 -0
- package/src/services/reqresp/protocols/tx.ts +76 -0
- package/src/services/reqresp/rate-limiter/index.ts +1 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +240 -0
- package/src/services/reqresp/rate-limiter/rate_limits.ts +65 -0
- package/src/services/reqresp/reqresp.ts +675 -0
- package/src/services/reqresp/status.ts +68 -0
- package/src/services/service.ts +219 -0
- package/src/services/tx_collection/config.ts +89 -0
- package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
- package/src/services/tx_collection/file_store_tx_source.ts +129 -0
- package/src/services/tx_collection/index.ts +3 -0
- package/src/services/tx_collection/instrumentation.ts +35 -0
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +467 -0
- package/src/services/tx_collection/tx_collection_sink.ts +124 -0
- package/src/services/tx_collection/tx_source.ts +61 -0
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +42 -0
- package/src/services/tx_file_store/tx_file_store.ts +163 -0
- package/src/services/tx_provider.ts +237 -0
- package/src/services/tx_provider_instrumentation.ts +54 -0
- package/src/test-helpers/generate-peer-id-private-keys.ts +15 -0
- package/src/test-helpers/get-ports.ts +8 -0
- package/src/test-helpers/index.ts +8 -0
- package/src/test-helpers/make-enrs.ts +42 -0
- package/src/test-helpers/make-test-p2p-clients.ts +213 -0
- package/src/test-helpers/mock-pubsub.ts +325 -0
- package/src/test-helpers/mock-tx-helpers.ts +24 -0
- package/src/test-helpers/reqresp-nodes.ts +327 -0
- package/src/test-helpers/test_tx_provider.ts +68 -0
- package/src/test-helpers/testbench-utils.ts +465 -0
- package/src/testbench/README.md +20 -0
- package/src/testbench/p2p_client_testbench_worker.ts +553 -0
- package/src/testbench/parse_log_file.ts +174 -0
- package/src/testbench/testbench.ts +66 -0
- package/src/testbench/worker_client_manager.ts +621 -0
- package/src/types/index.ts +38 -0
- package/src/util.ts +230 -0
- package/src/versioning.ts +26 -0
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
import { createLogger } from '@aztec-labs/foundation/log';
|
|
2
|
+
import { sleep } from '@aztec-labs/foundation/sleep';
|
|
3
|
+
import { DateProvider } from '@aztec-labs/foundation/timer';
|
|
4
|
+
import type { AztecAsyncKVStore } from '@aztec-labs/kv-store';
|
|
5
|
+
import { type ComponentsVersions, checkCompressedComponentVersion } from '@aztec-labs/stdlib/versioning';
|
|
6
|
+
import { OtelMetricsAdapter, type TelemetryClient, getTelemetryClient } from '@aztec-labs/telemetry-client';
|
|
7
|
+
import type { PeerId } from '@libp2p/interface';
|
|
8
|
+
import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
|
|
9
|
+
import { Discv5, type Discv5EventEmitter, type IDiscv5CreateOptions } from '@nethermindeth/discv5';
|
|
10
|
+
import { ENR, SignableENR } from '@nethermindeth/enr';
|
|
11
|
+
import EventEmitter from 'events';
|
|
12
|
+
|
|
13
|
+
import type { P2PConfig } from '../../config.js';
|
|
14
|
+
import { createNodeENR } from '../../enr/generate-enr.js';
|
|
15
|
+
import { AZTEC_ENR_KEY, Discv5Event, PeerEvent } from '../../types/index.js';
|
|
16
|
+
import { convertToMultiaddr } from '../../util.js';
|
|
17
|
+
import { type PeerDiscoveryService, PeerDiscoveryState } from '../service.js';
|
|
18
|
+
import { PersistedEnrStore } from './persisted_enr_store.js';
|
|
19
|
+
|
|
20
|
+
const delayBeforeStart = 2000; // 2sec
|
|
21
|
+
|
|
22
|
+
/** Upper bound on persisted peer ENRs, to keep the store bounded as peers churn. */
|
|
23
|
+
const MAX_PERSISTED_PEER_ENRS = 100;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Peer discovery service using Discv5.
|
|
27
|
+
*/
|
|
28
|
+
export class DiscV5Service extends EventEmitter implements PeerDiscoveryService {
|
|
29
|
+
/** The Discv5 instance */
|
|
30
|
+
private discv5: Discv5EventEmitter;
|
|
31
|
+
|
|
32
|
+
/** This instance's ENR */
|
|
33
|
+
private enr: SignableENR;
|
|
34
|
+
|
|
35
|
+
/** Version identifiers. */
|
|
36
|
+
private versions: ComponentsVersions;
|
|
37
|
+
|
|
38
|
+
private currentState = PeerDiscoveryState.STOPPED;
|
|
39
|
+
|
|
40
|
+
private bootstrapNodePeerIds: PeerId[] = [];
|
|
41
|
+
public bootstrapNodeEnrs: ENR[] = [];
|
|
42
|
+
private trustedPeerEnrs: ENR[] = [];
|
|
43
|
+
/** Node IDs of all config-provided peers (bootstrap, trusted, private); these are never persisted. */
|
|
44
|
+
private readonly configProvidedNodeIds: Set<string>;
|
|
45
|
+
|
|
46
|
+
private startTime = 0;
|
|
47
|
+
|
|
48
|
+
private currentIp: string | undefined;
|
|
49
|
+
|
|
50
|
+
/** Persistent store of discovered peer ENRs, used to re-seed discovery after a restart. */
|
|
51
|
+
private readonly persistedEnrs?: PersistedEnrStore;
|
|
52
|
+
|
|
53
|
+
private handlers = {
|
|
54
|
+
onMultiaddrUpdated: this.onMultiaddrUpdated.bind(this),
|
|
55
|
+
onPeerDiscovered: this.onPeerDiscovered.bind(this),
|
|
56
|
+
onEnrAdded: this.onEnrAdded.bind(this),
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
constructor(
|
|
60
|
+
private peerId: PeerId,
|
|
61
|
+
private config: P2PConfig,
|
|
62
|
+
private readonly packageVersion: string,
|
|
63
|
+
telemetry: TelemetryClient = getTelemetryClient(),
|
|
64
|
+
private logger = createLogger('p2p:discv5_service'),
|
|
65
|
+
store?: AztecAsyncKVStore,
|
|
66
|
+
configOverrides: Partial<IDiscv5CreateOptions> = {},
|
|
67
|
+
private readonly dateProvider: DateProvider = new DateProvider(),
|
|
68
|
+
) {
|
|
69
|
+
super();
|
|
70
|
+
|
|
71
|
+
this.persistedEnrs = store
|
|
72
|
+
? new PersistedEnrStore(store, MAX_PERSISTED_PEER_ENRS, createLogger(`${this.logger.module}:enr-store`))
|
|
73
|
+
: undefined;
|
|
74
|
+
|
|
75
|
+
const { p2pIp, p2pPort, p2pBroadcastPort, bootstrapNodes, trustedPeers, privatePeers } = config;
|
|
76
|
+
|
|
77
|
+
this.currentIp = p2pIp;
|
|
78
|
+
this.bootstrapNodeEnrs = bootstrapNodes.map(x => ENR.decodeTxt(x));
|
|
79
|
+
const privatePeerEnrs = new Set(privatePeers);
|
|
80
|
+
this.trustedPeerEnrs = trustedPeers.filter(x => !privatePeerEnrs.has(x)).map(x => ENR.decodeTxt(x));
|
|
81
|
+
// Peers supplied via config are re-injected from config on every start, so they must never end up
|
|
82
|
+
// in the persisted (discovered-peer) store — private peers especially must not be written there.
|
|
83
|
+
this.configProvidedNodeIds = new Set(
|
|
84
|
+
[...bootstrapNodes, ...trustedPeers, ...privatePeers].map(x => ENR.decodeTxt(x).nodeId),
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
// If no overridden broadcast port is provided, use the p2p port as the broadcast port
|
|
88
|
+
if (!p2pBroadcastPort) {
|
|
89
|
+
this.logger.warn('No p2pBroadcastPort provided, using p2pPort as broadcast port');
|
|
90
|
+
config.p2pBroadcastPort = p2pPort;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const bindAddrs: any = {
|
|
94
|
+
ip4: multiaddr(convertToMultiaddr(config.listenAddress, p2pPort, 'udp')),
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
let multiAddrUdp, multiAddrTcp;
|
|
98
|
+
if (p2pIp) {
|
|
99
|
+
multiAddrTcp = multiaddr(
|
|
100
|
+
`${convertToMultiaddr(p2pIp!, config.p2pBroadcastPort!, 'tcp')}/p2p/${peerId.toString()}`,
|
|
101
|
+
);
|
|
102
|
+
multiAddrUdp = multiaddr(
|
|
103
|
+
`${convertToMultiaddr(p2pIp!, config.p2pBroadcastPort!, 'udp')}/p2p/${peerId.toString()}`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
({ enr: this.enr, versions: this.versions } = createNodeENR(
|
|
108
|
+
peerId,
|
|
109
|
+
multiAddrUdp,
|
|
110
|
+
multiAddrTcp,
|
|
111
|
+
config,
|
|
112
|
+
this.packageVersion,
|
|
113
|
+
));
|
|
114
|
+
|
|
115
|
+
const metricsRegistry = new OtelMetricsAdapter(telemetry, this.logger.getBindings());
|
|
116
|
+
this.discv5 = Discv5.create({
|
|
117
|
+
enr: this.enr,
|
|
118
|
+
peerId,
|
|
119
|
+
bindAddrs,
|
|
120
|
+
config: {
|
|
121
|
+
lookupTimeout: 2000,
|
|
122
|
+
requestTimeout: 2000,
|
|
123
|
+
allowUnverifiedSessions: true,
|
|
124
|
+
enrUpdate: config.queryForIp || !p2pIp,
|
|
125
|
+
pingInterval: config.queryForIp ? 10_000 : 300_000,
|
|
126
|
+
...configOverrides.config,
|
|
127
|
+
},
|
|
128
|
+
metricsRegistry,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// Hook onto the onEstablished method to check the peer's version from the ENR,
|
|
132
|
+
// so we don't add it to our dht if it doesn't have the correct version.
|
|
133
|
+
// In addition, we'll hook onto onDiscovered to to repeat the same check there,
|
|
134
|
+
// just in case. Note that not adding the peer to the dht could lead to it
|
|
135
|
+
// being "readded" constantly, we'll need to keep an eye on whether this
|
|
136
|
+
// turns out to be a problem or not.
|
|
137
|
+
const origOnEstablished = this.discv5.onEstablished.bind(this.discv5);
|
|
138
|
+
this.discv5.onEstablished = (...args: unknown[]) => {
|
|
139
|
+
const enr = args[1] as ENR;
|
|
140
|
+
// A special case is for bootnodes. If this is a bootnode and we have been told to skip version checks
|
|
141
|
+
// then proceed straight to handling the event
|
|
142
|
+
if (!this.config.bootstrapNodeEnrVersionCheck && this.isOurBootnode(enr)) {
|
|
143
|
+
return origOnEstablished(...args);
|
|
144
|
+
}
|
|
145
|
+
if (this.validateEnr(enr)) {
|
|
146
|
+
return origOnEstablished(...args);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
this.discv5.on(Discv5Event.DISCOVERED, this.handlers.onPeerDiscovered);
|
|
151
|
+
this.discv5.on(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded);
|
|
152
|
+
this.discv5.on(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
private onMultiaddrUpdated(m: Multiaddr) {
|
|
156
|
+
const newIp = m.nodeAddress().address;
|
|
157
|
+
const previousIp = this.currentIp;
|
|
158
|
+
|
|
159
|
+
if (newIp === previousIp) {
|
|
160
|
+
this.logger.debug('Discv5 confirmed current IP (no change)', { ip: newIp });
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const multiAddrTcp = multiaddr(convertToMultiaddr(newIp, this.config.p2pBroadcastPort!, 'tcp'));
|
|
165
|
+
this.enr.setLocationMultiaddr(multiAddrTcp);
|
|
166
|
+
this.currentIp = newIp;
|
|
167
|
+
|
|
168
|
+
if (previousIp) {
|
|
169
|
+
this.logger.info('IP address changed, ENR updated', {
|
|
170
|
+
previousIp,
|
|
171
|
+
newIp,
|
|
172
|
+
multiaddr: multiAddrTcp.toString(),
|
|
173
|
+
enr: this.enr.encodeTxt(),
|
|
174
|
+
});
|
|
175
|
+
} else {
|
|
176
|
+
this.logger.info('Initial IP discovered via discv5, ENR updated', {
|
|
177
|
+
ip: newIp,
|
|
178
|
+
multiaddr: multiAddrTcp.toString(),
|
|
179
|
+
enr: this.enr.encodeTxt(),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
this.emit('ip:changed', newIp);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
public async start(): Promise<void> {
|
|
187
|
+
if (this.currentState === PeerDiscoveryState.RUNNING) {
|
|
188
|
+
throw new Error('DiscV5Service already started');
|
|
189
|
+
}
|
|
190
|
+
this.logger.debug('Starting DiscV5');
|
|
191
|
+
await this.discv5.start();
|
|
192
|
+
this.startTime = this.dateProvider.now();
|
|
193
|
+
|
|
194
|
+
const enrUpdateEnabled = this.config.queryForIp || !this.config.p2pIp;
|
|
195
|
+
this.logger.info(`DiscV5 service started`, {
|
|
196
|
+
nodeId: this.enr.nodeId,
|
|
197
|
+
peerId: this.peerId,
|
|
198
|
+
enrUdp: await this.enr.getFullMultiaddr('udp'),
|
|
199
|
+
enrTcp: await this.enr.getFullMultiaddr('tcp'),
|
|
200
|
+
versions: this.versions,
|
|
201
|
+
enrUpdateEnabled,
|
|
202
|
+
queryForIp: this.config.queryForIp,
|
|
203
|
+
configuredIp: this.config.p2pIp ?? 'none',
|
|
204
|
+
pingIntervalMs: this.config.queryForIp ? 10_000 : 300_000,
|
|
205
|
+
});
|
|
206
|
+
this.currentState = PeerDiscoveryState.RUNNING;
|
|
207
|
+
|
|
208
|
+
// Add bootnode ENR if provided
|
|
209
|
+
if (this.bootstrapNodeEnrs?.length) {
|
|
210
|
+
// Do this conversion once since it involves an async function call
|
|
211
|
+
this.bootstrapNodePeerIds = await Promise.all(this.bootstrapNodeEnrs.map(enr => enr.peerId()));
|
|
212
|
+
this.logger.info(
|
|
213
|
+
`Adding ${this.bootstrapNodeEnrs.length} bootstrap nodes ENRs: ${this.bootstrapNodeEnrs
|
|
214
|
+
.map(enr => enr.encodeTxt())
|
|
215
|
+
.join(', ')}`,
|
|
216
|
+
);
|
|
217
|
+
for (const enr of this.bootstrapNodeEnrs) {
|
|
218
|
+
try {
|
|
219
|
+
if (this.config.bootstrapNodeEnrVersionCheck) {
|
|
220
|
+
const value = enr.kvs.get(AZTEC_ENR_KEY);
|
|
221
|
+
if (!value) {
|
|
222
|
+
throw new Error('ENR does not contain aztec key');
|
|
223
|
+
}
|
|
224
|
+
checkCompressedComponentVersion(Buffer.from(value).toString(), this.versions);
|
|
225
|
+
}
|
|
226
|
+
this.discv5.addEnr(enr);
|
|
227
|
+
} catch (e) {
|
|
228
|
+
this.logger.error(`Error adding bootratrap node ${enr.encodeTxt()}`, e);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Add trusted peer ENRs if provided
|
|
234
|
+
if (this.trustedPeerEnrs?.length) {
|
|
235
|
+
this.logger.info(
|
|
236
|
+
`Adding ${this.trustedPeerEnrs.length} trusted peer ENRs: ${this.trustedPeerEnrs
|
|
237
|
+
.map(enr => enr.encodeTxt())
|
|
238
|
+
.join(', ')}`,
|
|
239
|
+
);
|
|
240
|
+
for (const enr of this.trustedPeerEnrs) {
|
|
241
|
+
this.discv5.addEnr(enr);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Re-seed discovery from peers persisted on previous runs. This lets a node rejoin the network
|
|
246
|
+
// after a restart even when no bootstrap node is reachable: discv5 has no on-disk routing table,
|
|
247
|
+
// so without this its DHT would start empty and rediscovery would depend on inbound dials alone.
|
|
248
|
+
if (this.persistedEnrs) {
|
|
249
|
+
// Drop peers that are now config-provided (re-injected above) or fail version checks.
|
|
250
|
+
const enrs = await this.persistedEnrs.load(
|
|
251
|
+
enr => this.validateEnr(enr) && !this.configProvidedNodeIds.has(enr.nodeId),
|
|
252
|
+
);
|
|
253
|
+
for (const enr of enrs) {
|
|
254
|
+
try {
|
|
255
|
+
this.discv5.addEnr(enr);
|
|
256
|
+
} catch (err) {
|
|
257
|
+
this.logger.debug(`Error re-seeding persisted ENR ${enr.nodeId}`, err);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (enrs.length > 0) {
|
|
261
|
+
this.logger.info(`Re-seeded discovery with ${enrs.length} persisted peer ENRs`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
public async runRandomNodesQuery(): Promise<void> {
|
|
267
|
+
if (this.currentState !== PeerDiscoveryState.RUNNING) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// First, wait some time before starting the peer discovery
|
|
272
|
+
// reference: https://github.com/ChainSafe/lodestar/issues/3423
|
|
273
|
+
const msSinceStart = this.dateProvider.now() - this.startTime;
|
|
274
|
+
if (this.dateProvider.now() - this.startTime <= delayBeforeStart) {
|
|
275
|
+
await sleep(delayBeforeStart - msSinceStart);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
try {
|
|
279
|
+
await this.discv5.findRandomNode();
|
|
280
|
+
} catch (err) {
|
|
281
|
+
this.logger.error(`Error running discV5 random node query: ${err}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
public getKadValues(): ENR[] {
|
|
286
|
+
return this.discv5.kadValues();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
public getEnr(): ENR {
|
|
290
|
+
return this.enr.toENR();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
public getPeerId(): PeerId {
|
|
294
|
+
return this.peerId;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
public getStatus(): PeerDiscoveryState {
|
|
298
|
+
return this.currentState;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
public isBootstrapPeer(peerId: PeerId): boolean {
|
|
302
|
+
return this.bootstrapNodePeerIds.some(node => node.equals(peerId));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
public async stop(): Promise<void> {
|
|
306
|
+
if (this.currentState !== PeerDiscoveryState.RUNNING) {
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
await this.discv5.off(Discv5Event.DISCOVERED, this.handlers.onPeerDiscovered);
|
|
310
|
+
await this.discv5.off(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded);
|
|
311
|
+
await this.discv5.off(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated);
|
|
312
|
+
|
|
313
|
+
await this.discv5.stop();
|
|
314
|
+
|
|
315
|
+
this.currentState = PeerDiscoveryState.STOPPED;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
private async onEnrAdded(enr: ENR) {
|
|
319
|
+
try {
|
|
320
|
+
const multiAddrTcp = await enr.getFullMultiaddr('tcp');
|
|
321
|
+
const multiAddrUdp = await enr.getFullMultiaddr('udp');
|
|
322
|
+
this.logger.debug(`Added ENR ${enr.encodeTxt()}`, { multiAddrTcp, multiAddrUdp, nodeId: enr.nodeId });
|
|
323
|
+
// A peer just entered the routing table — persist it so we can re-seed discovery after a restart.
|
|
324
|
+
if (this.persistedEnrs && this.shouldPersist(enr)) {
|
|
325
|
+
await this.persistedEnrs.persist(enr);
|
|
326
|
+
}
|
|
327
|
+
this.onDiscovered(enr);
|
|
328
|
+
} catch (err) {
|
|
329
|
+
// A malformed ENR address field (e.g. a 3-byte TCP port) makes @nethermindeth/enr throw while
|
|
330
|
+
// parsing the multiaddr. This is an async event listener, so an unhandled rejection would crash
|
|
331
|
+
// the process — catch, log, and drop the ENR instead.
|
|
332
|
+
this.logger.warn(`Dropping ENR with unparseable address`, { nodeId: enr.nodeId, err });
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
private async onPeerDiscovered(enr: ENR) {
|
|
337
|
+
// discv5 updates an existing routing-table entry on an ENR sequence bump without emitting enrAdded,
|
|
338
|
+
// so DISCOVERED is our only signal that a peer we already track may have changed address. Refresh
|
|
339
|
+
// the persisted copy (a no-op for peers we don't already store) so we don't keep dialing a stale ENR.
|
|
340
|
+
if (this.persistedEnrs && this.shouldPersist(enr)) {
|
|
341
|
+
await this.persistedEnrs.refresh(enr);
|
|
342
|
+
}
|
|
343
|
+
this.onDiscovered(enr);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/** Whether an ENR belongs in the persisted store: a validated, non-config peer that isn't ourselves. */
|
|
347
|
+
private shouldPersist(enr: ENR): boolean {
|
|
348
|
+
return !this.configProvidedNodeIds.has(enr.nodeId) && enr.nodeId !== this.enr.nodeId && this.validateEnr(enr);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
private isOurBootnode(enr: ENR) {
|
|
352
|
+
return this.bootstrapNodeEnrs.some(x => x.nodeId === enr.nodeId);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
private onDiscovered(enr: ENR) {
|
|
356
|
+
// Find out if this is one of our bootnodes
|
|
357
|
+
if (this.isOurBootnode(enr)) {
|
|
358
|
+
// it is, what we do here depends
|
|
359
|
+
if (!this.config.bootstrapNodesAsFullPeers) {
|
|
360
|
+
// we don't consider bootnodes as full peers, don't perform any checks and don't emit anything
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
if (!this.config.bootstrapNodeEnrVersionCheck) {
|
|
364
|
+
// we do consider bootnodes to be full peers and we have been told to NOT version check them, so emit
|
|
365
|
+
this.logger.trace(`Skipping version check for bootnode ${enr.nodeId}`);
|
|
366
|
+
this.emit(PeerEvent.DISCOVERED, enr);
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
// here, we do consider bootnodes as full peers and we must version check so we continue to regular validation
|
|
370
|
+
}
|
|
371
|
+
if (this.validateEnr(enr)) {
|
|
372
|
+
this.emit(PeerEvent.DISCOVERED, enr);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
private validateEnr(enr: ENR): boolean {
|
|
377
|
+
// Check the peer is an aztec peer
|
|
378
|
+
const value = enr.kvs.get(AZTEC_ENR_KEY);
|
|
379
|
+
if (!value) {
|
|
380
|
+
this.logger.debug(`Peer node ${enr.nodeId} does not have aztec key in ENR`);
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// A malformed TCP field (e.g. a non-2-byte port) makes @nethermindeth/enr throw while building the
|
|
385
|
+
// multiaddr. Reject such an ENR here so it's never emitted as a full peer or re-parsed by an
|
|
386
|
+
// unguarded listener (which would crash the process). A missing TCP addr is allowed — those peers
|
|
387
|
+
// are simply skipped at dial time.
|
|
388
|
+
try {
|
|
389
|
+
enr.getLocationMultiaddr('tcp');
|
|
390
|
+
} catch (err) {
|
|
391
|
+
this.logger.debug(`Peer node ${enr.nodeId} has an unparseable TCP address`, { err });
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// And check it has the correct version
|
|
396
|
+
let compressedVersion;
|
|
397
|
+
try {
|
|
398
|
+
compressedVersion = Buffer.from(value).toString();
|
|
399
|
+
checkCompressedComponentVersion(compressedVersion, this.versions);
|
|
400
|
+
return true;
|
|
401
|
+
} catch (err: any) {
|
|
402
|
+
if (err.name === 'ComponentsVersionsError') {
|
|
403
|
+
this.logger.debug(`Peer node ${enr.nodeId} has incorrect version: ${err.message}`, {
|
|
404
|
+
compressedVersion,
|
|
405
|
+
expected: this.versions,
|
|
406
|
+
});
|
|
407
|
+
} else {
|
|
408
|
+
this.logger.error(`Error checking peer version`, err);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { type Logger, createLogger } from '@aztec-labs/foundation/log';
|
|
2
|
+
import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec-labs/kv-store';
|
|
3
|
+
import { ENR } from '@nethermindeth/enr';
|
|
4
|
+
|
|
5
|
+
/** Map name under which discovered peer ENRs are persisted so discovery can be re-seeded after a restart. */
|
|
6
|
+
const PERSISTED_ENRS_MAP_NAME = 'discovered_peer_enrs';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A persisted peer entry: the ENR text plus a monotonic sequence number recording when the peer was
|
|
10
|
+
* last seen. The sequence orders the store as a FIFO so eviction drops the oldest-seen peers first.
|
|
11
|
+
*/
|
|
12
|
+
interface PersistedEnr {
|
|
13
|
+
enr: string;
|
|
14
|
+
seq: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function parsePersistedEnr(value: string): PersistedEnr | undefined {
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(value);
|
|
20
|
+
if (typeof parsed?.enr === 'string' && typeof parsed?.seq === 'number') {
|
|
21
|
+
return parsed;
|
|
22
|
+
}
|
|
23
|
+
} catch {
|
|
24
|
+
// Unparseable entry; caller treats it as stale.
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A bounded, transactional store of discovered peer ENRs used to re-seed discovery after a restart.
|
|
31
|
+
*
|
|
32
|
+
* Entries are keyed by nodeId (so re-seeing a peer dedups in place) and carry a monotonic sequence so
|
|
33
|
+
* the store behaves as a FIFO: when it exceeds its cap, the oldest-seen peers are evicted first. All
|
|
34
|
+
* writes run in a transaction so concurrent discovery events can't race the size check.
|
|
35
|
+
*/
|
|
36
|
+
export class PersistedEnrStore {
|
|
37
|
+
private readonly enrs: AztecAsyncMap<string, string>;
|
|
38
|
+
/** Monotonic sequence stamped on each entry; seeded from the store's max in {@link load}. */
|
|
39
|
+
private seq = 0;
|
|
40
|
+
|
|
41
|
+
constructor(
|
|
42
|
+
private readonly store: AztecAsyncKVStore,
|
|
43
|
+
private readonly maxEntries: number,
|
|
44
|
+
private readonly logger: Logger = createLogger('p2p:discv5:enr-store'),
|
|
45
|
+
) {
|
|
46
|
+
this.enrs = store.openMap(PERSISTED_ENRS_MAP_NAME);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Adds or replaces a peer's ENR, stamping it as most-recently-seen and evicting the oldest if over cap. */
|
|
50
|
+
public async persist(enr: ENR): Promise<void> {
|
|
51
|
+
const nodeId = enr.nodeId;
|
|
52
|
+
const enrTxt = enr.encodeTxt();
|
|
53
|
+
try {
|
|
54
|
+
await this.store.transactionAsync(async () => {
|
|
55
|
+
const seq = ++this.seq;
|
|
56
|
+
const others: { nodeId: string; seq: number }[] = [];
|
|
57
|
+
for await (const [id, value] of this.enrs.entriesAsync()) {
|
|
58
|
+
if (id !== nodeId) {
|
|
59
|
+
others.push({ nodeId: id, seq: parsePersistedEnr(value)?.seq ?? 0 });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const overflow = others.length + 1 - this.maxEntries;
|
|
63
|
+
if (overflow > 0) {
|
|
64
|
+
others.sort((a, b) => a.seq - b.seq); // oldest-seen (lowest sequence) first
|
|
65
|
+
for (let i = 0; i < overflow; i++) {
|
|
66
|
+
await this.enrs.delete(others[i].nodeId);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
await this.enrs.set(nodeId, JSON.stringify({ enr: enrTxt, seq }));
|
|
70
|
+
});
|
|
71
|
+
} catch (err) {
|
|
72
|
+
this.logger.warn(`Failed to persist discovered ENR ${nodeId}`, err);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Refreshes an already-persisted peer's stored ENR when a newer one (higher ENR sequence) is seen.
|
|
78
|
+
* A no-op for peers we don't already track — we never add new peers via this path, only update.
|
|
79
|
+
*
|
|
80
|
+
* This exists because discv5 updates an existing routing-table entry on an ENR sequence bump without
|
|
81
|
+
* emitting an `enrAdded` event, so a peer that changes address would otherwise keep its stale ENR
|
|
82
|
+
* persisted until evicted.
|
|
83
|
+
*/
|
|
84
|
+
public async refresh(enr: ENR): Promise<void> {
|
|
85
|
+
const nodeId = enr.nodeId;
|
|
86
|
+
try {
|
|
87
|
+
await this.store.transactionAsync(async () => {
|
|
88
|
+
const existing = await this.enrs.getAsync(nodeId);
|
|
89
|
+
if (!existing) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Two unrelated sequence numbers are in play:
|
|
93
|
+
// - the ENR sequence (`enr.seq` / `storedEnrSeq`) is set by the *peer* and bumped whenever it
|
|
94
|
+
// revises its record (e.g. changes address); we compare these to decide whether the incoming
|
|
95
|
+
// ENR is genuinely newer and worth keeping.
|
|
96
|
+
// - our storage sequence (`this.seq`) is an internal counter used only for FIFO eviction; we
|
|
97
|
+
// stamp a fresh one so this entry counts as most-recently-seen.
|
|
98
|
+
const storedEnrSeq = this.decodeStoredEnr(existing)?.seq;
|
|
99
|
+
if (storedEnrSeq !== undefined && enr.seq <= storedEnrSeq) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
await this.enrs.set(nodeId, JSON.stringify({ enr: enr.encodeTxt(), seq: ++this.seq }));
|
|
103
|
+
});
|
|
104
|
+
} catch (err) {
|
|
105
|
+
this.logger.warn(`Failed to refresh persisted ENR ${nodeId}`, err);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Loads all persisted ENRs, decoding each and keeping those the `accept` predicate allows. Entries
|
|
111
|
+
* that fail to decode or are rejected are removed from the store. The FIFO sequence resumes from the
|
|
112
|
+
* highest persisted value so eviction order survives restarts.
|
|
113
|
+
*/
|
|
114
|
+
public async load(accept: (enr: ENR) => boolean): Promise<ENR[]> {
|
|
115
|
+
const valid: ENR[] = [];
|
|
116
|
+
const stale: string[] = [];
|
|
117
|
+
let maxSeq = 0;
|
|
118
|
+
for await (const [nodeId, value] of this.enrs.entriesAsync()) {
|
|
119
|
+
const parsed = parsePersistedEnr(value);
|
|
120
|
+
let enr: ENR | undefined;
|
|
121
|
+
if (parsed) {
|
|
122
|
+
try {
|
|
123
|
+
enr = ENR.decodeTxt(parsed.enr);
|
|
124
|
+
} catch (err) {
|
|
125
|
+
this.logger.debug(`Dropping undecodable persisted ENR ${nodeId}`, err);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (!parsed || !enr || !accept(enr)) {
|
|
129
|
+
stale.push(nodeId);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
maxSeq = Math.max(maxSeq, parsed.seq);
|
|
133
|
+
valid.push(enr);
|
|
134
|
+
}
|
|
135
|
+
this.seq = maxSeq;
|
|
136
|
+
if (stale.length > 0) {
|
|
137
|
+
await this.store.transactionAsync(async () => {
|
|
138
|
+
for (const nodeId of stale) {
|
|
139
|
+
await this.enrs.delete(nodeId);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return valid;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private decodeStoredEnr(value: string): ENR | undefined {
|
|
147
|
+
const parsed = parsePersistedEnr(value);
|
|
148
|
+
if (!parsed) {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
return ENR.decodeTxt(parsed.enr);
|
|
153
|
+
} catch {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|