@aztec/p2p 5.0.0-private.20260319 → 5.0.0-rc.2
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 +4 -1
- 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 +4 -3
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +33 -24
- package/dest/client/interface.d.ts +43 -11
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +33 -19
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +100 -44
- package/dest/config.d.ts +137 -107
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +64 -23
- 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 +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- 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 +98 -56
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +265 -196
- 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 +175 -59
- 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 +1 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +17 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -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 +1 -7
- 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.js +1 -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 +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +22 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +5 -2
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +13 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +7 -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 +10 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +8 -3
- 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 +7 -4
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +8 -3
- 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 +153 -111
- 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 -16
- 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 +8 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +2 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +8 -3
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +8 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +25 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +77 -14
- 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.js +3 -3
- 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 +14 -15
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +36 -17
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +47 -10
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +65 -48
- package/dest/msg_validators/tx_validator/index.d.ts +3 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +2 -0
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- 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 +15 -15
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +15 -16
- package/dest/services/encoding.d.ts +8 -8
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +11 -15
- 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 +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -0
- package/dest/services/libp2p/libp2p_service.d.ts +44 -39
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +383 -278
- package/dest/services/peer-manager/peer_manager.d.ts +20 -3
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +79 -23
- 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 +1 -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 +38 -44
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +8 -5
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- 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 +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- 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 +0 -10
- 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 +26 -207
- package/dest/services/service.d.ts +25 -12
- 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/tx_collection.d.ts +35 -51
- 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 +23 -9
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +44 -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 +14 -14
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +25 -13
- 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 +102 -41
- package/dest/testbench/worker_client_manager.d.ts +10 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +51 -9
- package/dest/util.d.ts +11 -6
- 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 +16 -16
- package/src/bootstrap/bootstrap.ts +17 -3
- package/src/client/factory.ts +52 -24
- package/src/client/interface.ts +38 -17
- package/src/client/p2p_client.ts +118 -76
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +130 -31
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +319 -238
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +198 -62
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +5 -1
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
- 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 +1 -1
- 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 +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/interfaces.ts +18 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +20 -8
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +12 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +8 -4
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +163 -117
- package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -15
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
- package/src/msg_validators/proposal_validator/README.md +1 -1
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +15 -3
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +26 -3
- package/src/msg_validators/proposal_validator/proposal_validator.ts +89 -11
- package/src/msg_validators/tx_validator/README.md +13 -3
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
- 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 +44 -20
- package/src/msg_validators/tx_validator/gas_validator.ts +99 -54
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +3 -3
- 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 +20 -39
- package/src/services/encoding.ts +11 -21
- package/src/services/gossipsub/README.md +33 -11
- package/src/services/gossipsub/topic_score_params.ts +9 -18
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +436 -311
- package/src/services/peer-manager/peer_manager.ts +86 -22
- package/src/services/peer-manager/peer_scoring.ts +102 -8
- package/src/services/reqresp/README.md +0 -14
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +42 -52
- package/src/services/reqresp/batch-tx-requester/interface.ts +11 -4
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +2 -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 +0 -10
- package/src/services/reqresp/reqresp.ts +29 -252
- package/src/services/service.ts +31 -28
- 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/tx_collection.ts +330 -173
- 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 +3 -0
- package/src/test-helpers/mock-pubsub.ts +46 -60
- package/src/test-helpers/reqresp-nodes.ts +12 -22
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +31 -26
- package/src/testbench/p2p_client_testbench_worker.ts +110 -55
- package/src/testbench/worker_client_manager.ts +59 -20
- package/src/util.ts +32 -17
- 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 -305
- 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 -123
- 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 -402
- 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 -38
- 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 -51
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -311
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
- 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 -344
- 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 -163
- 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 -321
- package/src/msg_validators/clock_tolerance.ts +0 -52
- 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 -361
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -108
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Tx, TxValidationResult } from '@aztec/stdlib/tx';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal interface consumed by {@link CachedTxValidator}.
|
|
4
|
+
* Keeping the dependency on an interface lets callers (and tests) substitute any cache implementation.
|
|
5
|
+
*/
|
|
6
|
+
export interface ITxValidationCache {
|
|
7
|
+
/** Returns the cached promise if present, otherwise calls `validate`, caches its promise, and returns it. */
|
|
8
|
+
getOrValidate(validatorSymbol: symbol, tx: Tx, validate: () => Promise<TxValidationResult>): Promise<TxValidationResult>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Caches per-validator tx validation results to avoid redundant work across repeated validation calls.
|
|
12
|
+
*
|
|
13
|
+
* The cache key is composed from the validator symbol and tx hash, ensuring results are
|
|
14
|
+
* scoped to the specific validator that produced them.
|
|
15
|
+
*
|
|
16
|
+
* Promises are stored before they are awaited, so concurrent calls for the same pair share
|
|
17
|
+
* a single in-flight validation rather than launching duplicate work.
|
|
18
|
+
*
|
|
19
|
+
* Entries are evicted in least-recently-used order once the cache reaches `maxSize`.
|
|
20
|
+
*/
|
|
21
|
+
export declare class TxValidationCache implements ITxValidationCache {
|
|
22
|
+
#private;
|
|
23
|
+
private readonly entries;
|
|
24
|
+
private readonly txHashesCache;
|
|
25
|
+
constructor(maxSize: number);
|
|
26
|
+
/**
|
|
27
|
+
* Computes the cache key scoping a validation result to a specific validator and tx.
|
|
28
|
+
*
|
|
29
|
+
* @param validatorSymbol - The symbol of the validator.
|
|
30
|
+
* @param tx - The tx to compute the key for.
|
|
31
|
+
* @returns The cache key.
|
|
32
|
+
*
|
|
33
|
+
* Note: the key should NOT use the tx.hash because it can't be trusted at this point.
|
|
34
|
+
*/
|
|
35
|
+
key(validatorSymbol: symbol, tx: Tx): string;
|
|
36
|
+
/** Returns the cached promise for the given key, or undefined if not cached. Refreshes recency. */
|
|
37
|
+
get(key: string): Promise<TxValidationResult> | undefined;
|
|
38
|
+
/** Stores a validation promise under the given key, evicting the LRU entry if at capacity. */
|
|
39
|
+
set(key: string, result: Promise<TxValidationResult>): void;
|
|
40
|
+
/** Removes the cached validation promise for the given key. */
|
|
41
|
+
delete(key: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Returns the cached promise if present, otherwise calls `validate`, stores its promise
|
|
44
|
+
* immediately (before awaiting), and returns it.
|
|
45
|
+
*/
|
|
46
|
+
getOrValidate(validatorSymbol: symbol, tx: Tx, validate: () => Promise<TxValidationResult>): Promise<TxValidationResult>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfdmFsaWRhdGlvbl9jYWNoZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci90eF92YWxpZGF0aW9uX2NhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSS9EOzs7R0FHRztBQUNILE1BQU0sV0FBVyxrQkFBa0I7SUFDakMsNkdBQTZHO0lBQzdHLGFBQWEsQ0FDWCxlQUFlLEVBQUUsTUFBTSxFQUN2QixFQUFFLEVBQUUsRUFBRSxFQUNOLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUMxQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztDQUNoQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxxQkFBYSxpQkFBa0IsWUFBVyxrQkFBa0I7O0lBRzFELE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUE4QztJQUd0RSxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBc0M7SUFFcEUsWUFBWSxPQUFPLEVBQUUsTUFBTSxFQUcxQjtJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksR0FBRyxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBUWxEO0lBRUQsbUdBQW1HO0lBQzVGLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLFNBQVMsQ0FFL0Q7SUFFRCw4RkFBOEY7SUFDdkYsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLElBQUksQ0FFakU7SUFFRCwrREFBK0Q7SUFDeEQsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUUvQjtJQUVEOzs7T0FHRztJQUNJLGFBQWEsQ0FDbEIsZUFBZSxFQUFFLE1BQU0sRUFDdkIsRUFBRSxFQUFFLEVBQUUsRUFDTixRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUMsR0FDMUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBYzdCO0NBQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_validation_cache.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/tx_validation_cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAI/D;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,6GAA6G;IAC7G,aAAa,CACX,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,GAC1C,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAChC;AAED;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,YAAW,kBAAkB;;IAG1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8C;IAGtE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsC;IAEpE,YAAY,OAAO,EAAE,MAAM,EAG1B;IAED;;;;;;;;OAQG;IACI,GAAG,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,MAAM,CAQlD;IAED,mGAAmG;IAC5F,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAE/D;IAED,8FAA8F;IACvF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAEjE;IAED,+DAA+D;IACxD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE/B;IAED;;;OAGG;IACI,aAAa,CAClB,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,GAC1C,OAAO,CAAC,kBAAkB,CAAC,CAc7B;CACF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { LruMap } from '@aztec/foundation/collection';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
/**
|
|
5
|
+
* Caches per-validator tx validation results to avoid redundant work across repeated validation calls.
|
|
6
|
+
*
|
|
7
|
+
* The cache key is composed from the validator symbol and tx hash, ensuring results are
|
|
8
|
+
* scoped to the specific validator that produced them.
|
|
9
|
+
*
|
|
10
|
+
* Promises are stored before they are awaited, so concurrent calls for the same pair share
|
|
11
|
+
* a single in-flight validation rather than launching duplicate work.
|
|
12
|
+
*
|
|
13
|
+
* Entries are evicted in least-recently-used order once the cache reaches `maxSize`.
|
|
14
|
+
*/ export class TxValidationCache {
|
|
15
|
+
#log;
|
|
16
|
+
entries;
|
|
17
|
+
// Remember hashes for known Tx object references to skip rehashing on subsequent lookups.
|
|
18
|
+
// WeakMap holds keys weakly, so an entry doesn't keep the Tx alive once nothing else references it.
|
|
19
|
+
txHashesCache = new WeakMap();
|
|
20
|
+
constructor(maxSize){
|
|
21
|
+
this.entries = new LruMap(maxSize);
|
|
22
|
+
this.#log = createLogger('p2p:tx_validation_cache');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Computes the cache key scoping a validation result to a specific validator and tx.
|
|
26
|
+
*
|
|
27
|
+
* @param validatorSymbol - The symbol of the validator.
|
|
28
|
+
* @param tx - The tx to compute the key for.
|
|
29
|
+
* @returns The cache key.
|
|
30
|
+
*
|
|
31
|
+
* Note: the key should NOT use the tx.hash because it can't be trusted at this point.
|
|
32
|
+
*/ key(validatorSymbol, tx) {
|
|
33
|
+
// Serializing the tx dominates cost (~5 ms). If we have already hashed this object, skip toBuffer + hash.
|
|
34
|
+
let hash = this.txHashesCache.get(tx);
|
|
35
|
+
if (hash === undefined) {
|
|
36
|
+
hash = createHash('sha256').update(tx.toBuffer()).digest('hex');
|
|
37
|
+
this.txHashesCache.set(tx, hash);
|
|
38
|
+
}
|
|
39
|
+
return `${Symbol.keyFor(validatorSymbol) ?? validatorSymbol.toString()}:${hash}`;
|
|
40
|
+
}
|
|
41
|
+
/** Returns the cached promise for the given key, or undefined if not cached. Refreshes recency. */ get(key) {
|
|
42
|
+
return this.entries.get(key);
|
|
43
|
+
}
|
|
44
|
+
/** Stores a validation promise under the given key, evicting the LRU entry if at capacity. */ set(key, result) {
|
|
45
|
+
this.entries.set(key, result);
|
|
46
|
+
}
|
|
47
|
+
/** Removes the cached validation promise for the given key. */ delete(key) {
|
|
48
|
+
this.entries.delete(key);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Returns the cached promise if present, otherwise calls `validate`, stores its promise
|
|
52
|
+
* immediately (before awaiting), and returns it.
|
|
53
|
+
*/ getOrValidate(validatorSymbol, tx, validate) {
|
|
54
|
+
const key = this.key(validatorSymbol, tx);
|
|
55
|
+
const cached = this.get(key);
|
|
56
|
+
if (cached !== undefined) {
|
|
57
|
+
this.#log.debug('Returning cached tx validation result', {
|
|
58
|
+
validator: validatorSymbol.toString(),
|
|
59
|
+
txHash: tx.txHash.toString(),
|
|
60
|
+
key: key
|
|
61
|
+
});
|
|
62
|
+
return cached;
|
|
63
|
+
}
|
|
64
|
+
const promise = validate();
|
|
65
|
+
this.set(key, promise);
|
|
66
|
+
return promise;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -24,4 +24,4 @@ export declare class AztecDatastore implements Datastore {
|
|
|
24
24
|
*/
|
|
25
25
|
private pruneMemoryDatastore;
|
|
26
26
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9zdG9yZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2RhdGFfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFFeEUsT0FBTyxFQUFFLEtBQUssS0FBSyxFQUFFLEtBQUssU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRSxLQUFLLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVHLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBcUJyRCxxQkFBYSxjQUFlLFlBQVcsU0FBUzs7SUFLOUMsT0FBTyxDQUFDLGNBQWMsQ0FBUztJQUUvQixZQUFZLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLGNBQWMsRUFBRTs7S0FBeUIsRUFLN0U7SUFFSyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBRXBDO0lBRUssR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQWN2QztJQUVELEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUUzQztJQUVNLE9BQU8sQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FLOUQ7SUFFTSxPQUFPLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBTzlEO0lBRU0sVUFBVSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUtoRTtJQUVLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FHcEM7SUFFRCxLQUFLLElBQUksS0FBSyxDQXNCYjtJQUVELEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0EwQm5DO0lBRUQsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQXlCekM7WUFFYSxJQUFJO1lBcUJILEdBQUc7SUFrQmxCOztPQUVHO0lBQ0gsT0FBTyxDQUFDLG9CQUFvQjtDQWlCN0IifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data_store.d.ts","sourceRoot":"","sources":["../../src/services/data_store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,GAAG,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAqBrD,qBAAa,cAAe,YAAW,SAAS;;
|
|
1
|
+
{"version":3,"file":"data_store.d.ts","sourceRoot":"","sources":["../../src/services/data_store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,GAAG,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAqBrD,qBAAa,cAAe,YAAW,SAAS;;IAK9C,OAAO,CAAC,cAAc,CAAS;IAE/B,YAAY,EAAE,EAAE,iBAAiB,EAAE,EAAE,cAAc,EAAE;;KAAyB,EAK7E;IAEK,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpC;IAEK,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAcvC;IAED,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAE3C;IAEM,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAK9D;IAEM,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAO9D;IAEM,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAKhE;IAEK,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpC;IAED,KAAK,IAAI,KAAK,CAsBb;IAED,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CA0BnC;IAED,SAAS,CAAC,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAyBzC;YAEa,IAAI;YAqBH,GAAG;IAkBlB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAiB7B"}
|
|
@@ -11,7 +11,6 @@ export class AztecDatastore {
|
|
|
11
11
|
#db;
|
|
12
12
|
#memoryDatastore;
|
|
13
13
|
#dbDatastore;
|
|
14
|
-
#batchOps = [];
|
|
15
14
|
maxMemoryItems;
|
|
16
15
|
constructor(db, { maxMemoryItems } = {
|
|
17
16
|
maxMemoryItems: 50
|
|
@@ -65,23 +64,24 @@ export class AztecDatastore {
|
|
|
65
64
|
await this.#dbDatastore.delete(key.toString());
|
|
66
65
|
}
|
|
67
66
|
batch() {
|
|
67
|
+
const ops = [];
|
|
68
68
|
return {
|
|
69
69
|
put: (key, value)=>{
|
|
70
|
-
|
|
70
|
+
ops.push({
|
|
71
71
|
type: 'put',
|
|
72
72
|
key,
|
|
73
73
|
value
|
|
74
74
|
});
|
|
75
75
|
},
|
|
76
76
|
delete: (key)=>{
|
|
77
|
-
|
|
77
|
+
ops.push({
|
|
78
78
|
type: 'del',
|
|
79
79
|
key
|
|
80
80
|
});
|
|
81
81
|
},
|
|
82
82
|
commit: async ()=>{
|
|
83
83
|
await this.#db.transactionAsync(async ()=>{
|
|
84
|
-
for (const op of
|
|
84
|
+
for (const op of ops){
|
|
85
85
|
if (op.type === 'put' && op.value) {
|
|
86
86
|
await this.put(op.key, op.value);
|
|
87
87
|
} else if (op.type === 'del') {
|
|
@@ -89,7 +89,7 @@ export class AztecDatastore {
|
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
});
|
|
92
|
-
|
|
92
|
+
ops.length = 0;
|
|
93
93
|
}
|
|
94
94
|
};
|
|
95
95
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
2
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
1
3
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
2
4
|
import type { PeerId } from '@libp2p/interface';
|
|
3
5
|
import { type IDiscv5CreateOptions } from '@nethermindeth/discv5';
|
|
@@ -13,6 +15,7 @@ export declare class DiscV5Service extends EventEmitter implements PeerDiscovery
|
|
|
13
15
|
private config;
|
|
14
16
|
private readonly packageVersion;
|
|
15
17
|
private logger;
|
|
18
|
+
private readonly dateProvider;
|
|
16
19
|
/** The Discv5 instance */
|
|
17
20
|
private discv5;
|
|
18
21
|
/** This instance's ENR */
|
|
@@ -23,9 +26,14 @@ export declare class DiscV5Service extends EventEmitter implements PeerDiscovery
|
|
|
23
26
|
private bootstrapNodePeerIds;
|
|
24
27
|
bootstrapNodeEnrs: ENR[];
|
|
25
28
|
private trustedPeerEnrs;
|
|
29
|
+
/** Node IDs of all config-provided peers (bootstrap, trusted, private); these are never persisted. */
|
|
30
|
+
private readonly configProvidedNodeIds;
|
|
26
31
|
private startTime;
|
|
32
|
+
private currentIp;
|
|
33
|
+
/** Persistent store of discovered peer ENRs, used to re-seed discovery after a restart. */
|
|
34
|
+
private readonly persistedEnrs?;
|
|
27
35
|
private handlers;
|
|
28
|
-
constructor(peerId: PeerId, config: P2PConfig, packageVersion: string, telemetry?: TelemetryClient, logger?: import("@aztec/foundation/log").Logger, configOverrides?: Partial<IDiscv5CreateOptions
|
|
36
|
+
constructor(peerId: PeerId, config: P2PConfig, packageVersion: string, telemetry?: TelemetryClient, logger?: import("@aztec/foundation/log").Logger, store?: AztecAsyncKVStore, configOverrides?: Partial<IDiscv5CreateOptions>, dateProvider?: DateProvider);
|
|
29
37
|
private onMultiaddrUpdated;
|
|
30
38
|
start(): Promise<void>;
|
|
31
39
|
runRandomNodesQuery(): Promise<void>;
|
|
@@ -36,8 +44,11 @@ export declare class DiscV5Service extends EventEmitter implements PeerDiscovery
|
|
|
36
44
|
isBootstrapPeer(peerId: PeerId): boolean;
|
|
37
45
|
stop(): Promise<void>;
|
|
38
46
|
private onEnrAdded;
|
|
47
|
+
private onPeerDiscovered;
|
|
48
|
+
/** Whether an ENR belongs in the persisted store: a validated, non-config peer that isn't ourselves. */
|
|
49
|
+
private shouldPersist;
|
|
39
50
|
private isOurBootnode;
|
|
40
51
|
private onDiscovered;
|
|
41
52
|
private validateEnr;
|
|
42
53
|
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY1Y1X3NlcnZpY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9kaXNjdjUvZGlzY1Y1X3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFzQixLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RyxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRCxPQUFPLEVBQW1DLEtBQUssb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsR0FBRyxFQUFlLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxZQUFZLE1BQU0sUUFBUSxDQUFDO0FBRWxDLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSWpELE9BQU8sRUFBRSxLQUFLLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUTlFOztHQUVHO0FBQ0gscUJBQWEsYUFBYyxTQUFRLFlBQWEsWUFBVyxvQkFBb0I7SUFnQzNFLE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWM7SUFFL0IsT0FBTyxDQUFDLE1BQU07SUFHZCxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVk7SUF0Qy9CLDBCQUEwQjtJQUMxQixPQUFPLENBQUMsTUFBTSxDQUFxQjtJQUVuQywwQkFBMEI7SUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBYztJQUV6QiwyQkFBMkI7SUFDM0IsT0FBTyxDQUFDLFFBQVEsQ0FBcUI7SUFFckMsT0FBTyxDQUFDLFlBQVksQ0FBOEI7SUFFbEQsT0FBTyxDQUFDLG9CQUFvQixDQUFnQjtJQUNyQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsQ0FBTTtJQUNyQyxPQUFPLENBQUMsZUFBZSxDQUFhO0lBQ3BDLHNHQUFzRztJQUN0RyxPQUFPLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFjO0lBRXBELE9BQU8sQ0FBQyxTQUFTLENBQUs7SUFFdEIsT0FBTyxDQUFDLFNBQVMsQ0FBcUI7SUFFdEMsMkZBQTJGO0lBQzNGLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQW9CO0lBRW5ELE9BQU8sQ0FBQyxRQUFRLENBSWQ7SUFFRixZQUNVLE1BQU0sRUFBRSxNQUFNLEVBQ2QsTUFBTSxFQUFFLFNBQVMsRUFDUixjQUFjLEVBQUUsTUFBTSxFQUN2QyxTQUFTLEdBQUUsZUFBc0MsRUFDekMsTUFBTSx5Q0FBcUMsRUFDbkQsS0FBSyxDQUFDLEVBQUUsaUJBQWlCLEVBQ3pCLGVBQWUsR0FBRSxPQUFPLENBQUMsb0JBQW9CLENBQU0sRUFDbEMsWUFBWSxHQUFFLFlBQWlDLEVBc0ZqRTtJQUVELE9BQU8sQ0FBQyxrQkFBa0I7SUErQmIsS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0E4RWxDO0lBRVksbUJBQW1CLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQWlCaEQ7SUFFTSxZQUFZLElBQUksR0FBRyxFQUFFLENBRTNCO0lBRU0sTUFBTSxJQUFJLEdBQUcsQ0FFbkI7SUFFTSxTQUFTLElBQUksTUFBTSxDQUV6QjtJQUVNLFNBQVMsSUFBSSxrQkFBa0IsQ0FFckM7SUFFTSxlQUFlLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBRTlDO0lBRVksSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FXakM7WUFFYSxVQUFVO1lBa0JWLGdCQUFnQjtJQVU5Qix3R0FBd0c7SUFDeEcsT0FBTyxDQUFDLGFBQWE7SUFJckIsT0FBTyxDQUFDLGFBQWE7SUFJckIsT0FBTyxDQUFDLFlBQVk7SUFxQnBCLE9BQU8sQ0FBQyxXQUFXO0NBcUNwQiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discV5_service.d.ts","sourceRoot":"","sources":["../../../src/services/discv5/discV5_service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"discV5_service.d.ts","sourceRoot":"","sources":["../../../src/services/discv5/discV5_service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAsB,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAEvG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAmC,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACnG,OAAO,EAAE,GAAG,EAAe,MAAM,oBAAoB,CAAC;AACtD,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,OAAO,EAAE,KAAK,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAQ9E;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAa,YAAW,oBAAoB;IAgC3E,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,MAAM;IAGd,OAAO,CAAC,QAAQ,CAAC,YAAY;IAtC/B,0BAA0B;IAC1B,OAAO,CAAC,MAAM,CAAqB;IAEnC,0BAA0B;IAC1B,OAAO,CAAC,GAAG,CAAc;IAEzB,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAqB;IAErC,OAAO,CAAC,YAAY,CAA8B;IAElD,OAAO,CAAC,oBAAoB,CAAgB;IACrC,iBAAiB,EAAE,GAAG,EAAE,CAAM;IACrC,OAAO,CAAC,eAAe,CAAa;IACpC,sGAAsG;IACtG,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAc;IAEpD,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,SAAS,CAAqB;IAEtC,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAoB;IAEnD,OAAO,CAAC,QAAQ,CAId;IAEF,YACU,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACR,cAAc,EAAE,MAAM,EACvC,SAAS,GAAE,eAAsC,EACzC,MAAM,yCAAqC,EACnD,KAAK,CAAC,EAAE,iBAAiB,EACzB,eAAe,GAAE,OAAO,CAAC,oBAAoB,CAAM,EAClC,YAAY,GAAE,YAAiC,EAsFjE;IAED,OAAO,CAAC,kBAAkB;IA+Bb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA8ElC;IAEY,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBhD;IAEM,YAAY,IAAI,GAAG,EAAE,CAE3B;IAEM,MAAM,IAAI,GAAG,CAEnB;IAEM,SAAS,IAAI,MAAM,CAEzB;IAEM,SAAS,IAAI,kBAAkB,CAErC;IAEM,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE9C;IAEY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAWjC;YAEa,UAAU;YAkBV,gBAAgB;IAU9B,wGAAwG;IACxG,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,WAAW;CAqCpB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { sleep } from '@aztec/foundation/sleep';
|
|
3
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
3
4
|
import { checkCompressedComponentVersion } from '@aztec/stdlib/versioning';
|
|
4
5
|
import { OtelMetricsAdapter, getTelemetryClient } from '@aztec/telemetry-client';
|
|
5
6
|
import { multiaddr } from '@multiformats/multiaddr';
|
|
@@ -10,7 +11,9 @@ import { createNodeENR } from '../../enr/generate-enr.js';
|
|
|
10
11
|
import { AZTEC_ENR_KEY, Discv5Event, PeerEvent } from '../../types/index.js';
|
|
11
12
|
import { convertToMultiaddr } from '../../util.js';
|
|
12
13
|
import { PeerDiscoveryState } from '../service.js';
|
|
14
|
+
import { PersistedEnrStore } from './persisted_enr_store.js';
|
|
13
15
|
const delayBeforeStart = 2000; // 2sec
|
|
16
|
+
/** Upper bound on persisted peer ENRs, to keep the store bounded as peers churn. */ const MAX_PERSISTED_PEER_ENRS = 100;
|
|
14
17
|
/**
|
|
15
18
|
* Peer discovery service using Discv5.
|
|
16
19
|
*/ export class DiscV5Service extends EventEmitter {
|
|
@@ -18,6 +21,7 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
18
21
|
config;
|
|
19
22
|
packageVersion;
|
|
20
23
|
logger;
|
|
24
|
+
dateProvider;
|
|
21
25
|
/** The Discv5 instance */ discv5;
|
|
22
26
|
/** This instance's ENR */ enr;
|
|
23
27
|
/** Version identifiers. */ versions;
|
|
@@ -25,18 +29,30 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
25
29
|
bootstrapNodePeerIds;
|
|
26
30
|
bootstrapNodeEnrs;
|
|
27
31
|
trustedPeerEnrs;
|
|
32
|
+
/** Node IDs of all config-provided peers (bootstrap, trusted, private); these are never persisted. */ configProvidedNodeIds;
|
|
28
33
|
startTime;
|
|
34
|
+
currentIp;
|
|
35
|
+
/** Persistent store of discovered peer ENRs, used to re-seed discovery after a restart. */ persistedEnrs;
|
|
29
36
|
handlers;
|
|
30
|
-
constructor(peerId, config, packageVersion, telemetry = getTelemetryClient(), logger = createLogger('p2p:discv5_service'), configOverrides = {}){
|
|
31
|
-
super(), this.peerId = peerId, this.config = config, this.packageVersion = packageVersion, this.logger = logger, this.currentState = PeerDiscoveryState.STOPPED, this.bootstrapNodePeerIds = [], this.bootstrapNodeEnrs = [], this.trustedPeerEnrs = [], this.startTime = 0, this.handlers = {
|
|
37
|
+
constructor(peerId, config, packageVersion, telemetry = getTelemetryClient(), logger = createLogger('p2p:discv5_service'), store, configOverrides = {}, dateProvider = new DateProvider()){
|
|
38
|
+
super(), this.peerId = peerId, this.config = config, this.packageVersion = packageVersion, this.logger = logger, this.dateProvider = dateProvider, this.currentState = PeerDiscoveryState.STOPPED, this.bootstrapNodePeerIds = [], this.bootstrapNodeEnrs = [], this.trustedPeerEnrs = [], this.startTime = 0, this.handlers = {
|
|
32
39
|
onMultiaddrUpdated: this.onMultiaddrUpdated.bind(this),
|
|
33
|
-
|
|
40
|
+
onPeerDiscovered: this.onPeerDiscovered.bind(this),
|
|
34
41
|
onEnrAdded: this.onEnrAdded.bind(this)
|
|
35
42
|
};
|
|
43
|
+
this.persistedEnrs = store ? new PersistedEnrStore(store, MAX_PERSISTED_PEER_ENRS, createLogger(`${this.logger.module}:enr-store`)) : undefined;
|
|
36
44
|
const { p2pIp, p2pPort, p2pBroadcastPort, bootstrapNodes, trustedPeers, privatePeers } = config;
|
|
45
|
+
this.currentIp = p2pIp;
|
|
37
46
|
this.bootstrapNodeEnrs = bootstrapNodes.map((x)=>ENR.decodeTxt(x));
|
|
38
47
|
const privatePeerEnrs = new Set(privatePeers);
|
|
39
48
|
this.trustedPeerEnrs = trustedPeers.filter((x)=>!privatePeerEnrs.has(x)).map((x)=>ENR.decodeTxt(x));
|
|
49
|
+
// Peers supplied via config are re-injected from config on every start, so they must never end up
|
|
50
|
+
// in the persisted (discovered-peer) store — private peers especially must not be written there.
|
|
51
|
+
this.configProvidedNodeIds = new Set([
|
|
52
|
+
...bootstrapNodes,
|
|
53
|
+
...trustedPeers,
|
|
54
|
+
...privatePeers
|
|
55
|
+
].map((x)=>ENR.decodeTxt(x).nodeId));
|
|
40
56
|
// If no overridden broadcast port is provided, use the p2p port as the broadcast port
|
|
41
57
|
if (!p2pBroadcastPort) {
|
|
42
58
|
this.logger.warn('No p2pBroadcastPort provided, using p2pPort as broadcast port');
|
|
@@ -60,7 +76,8 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
60
76
|
lookupTimeout: 2000,
|
|
61
77
|
requestTimeout: 2000,
|
|
62
78
|
allowUnverifiedSessions: true,
|
|
63
|
-
enrUpdate: !p2pIp
|
|
79
|
+
enrUpdate: config.queryForIp || !p2pIp,
|
|
80
|
+
pingInterval: config.queryForIp ? 10_000 : 300_000,
|
|
64
81
|
...configOverrides.config
|
|
65
82
|
},
|
|
66
83
|
metricsRegistry
|
|
@@ -83,18 +100,37 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
83
100
|
return origOnEstablished(...args);
|
|
84
101
|
}
|
|
85
102
|
};
|
|
86
|
-
this.discv5.on(Discv5Event.DISCOVERED, this.handlers.
|
|
103
|
+
this.discv5.on(Discv5Event.DISCOVERED, this.handlers.onPeerDiscovered);
|
|
87
104
|
this.discv5.on(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded);
|
|
88
105
|
this.discv5.on(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated);
|
|
89
106
|
}
|
|
90
107
|
onMultiaddrUpdated(m) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
108
|
+
const newIp = m.nodeAddress().address;
|
|
109
|
+
const previousIp = this.currentIp;
|
|
110
|
+
if (newIp === previousIp) {
|
|
111
|
+
this.logger.debug('Discv5 confirmed current IP (no change)', {
|
|
112
|
+
ip: newIp
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const multiAddrTcp = multiaddr(convertToMultiaddr(newIp, this.config.p2pBroadcastPort, 'tcp'));
|
|
94
117
|
this.enr.setLocationMultiaddr(multiAddrTcp);
|
|
95
|
-
this.
|
|
96
|
-
|
|
97
|
-
|
|
118
|
+
this.currentIp = newIp;
|
|
119
|
+
if (previousIp) {
|
|
120
|
+
this.logger.info('IP address changed, ENR updated', {
|
|
121
|
+
previousIp,
|
|
122
|
+
newIp,
|
|
123
|
+
multiaddr: multiAddrTcp.toString(),
|
|
124
|
+
enr: this.enr.encodeTxt()
|
|
125
|
+
});
|
|
126
|
+
} else {
|
|
127
|
+
this.logger.info('Initial IP discovered via discv5, ENR updated', {
|
|
128
|
+
ip: newIp,
|
|
129
|
+
multiaddr: multiAddrTcp.toString(),
|
|
130
|
+
enr: this.enr.encodeTxt()
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
this.emit('ip:changed', newIp);
|
|
98
134
|
}
|
|
99
135
|
async start() {
|
|
100
136
|
if (this.currentState === PeerDiscoveryState.RUNNING) {
|
|
@@ -102,13 +138,18 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
102
138
|
}
|
|
103
139
|
this.logger.debug('Starting DiscV5');
|
|
104
140
|
await this.discv5.start();
|
|
105
|
-
this.startTime =
|
|
141
|
+
this.startTime = this.dateProvider.now();
|
|
142
|
+
const enrUpdateEnabled = this.config.queryForIp || !this.config.p2pIp;
|
|
106
143
|
this.logger.info(`DiscV5 service started`, {
|
|
107
144
|
nodeId: this.enr.nodeId,
|
|
108
145
|
peerId: this.peerId,
|
|
109
146
|
enrUdp: await this.enr.getFullMultiaddr('udp'),
|
|
110
147
|
enrTcp: await this.enr.getFullMultiaddr('tcp'),
|
|
111
|
-
versions: this.versions
|
|
148
|
+
versions: this.versions,
|
|
149
|
+
enrUpdateEnabled,
|
|
150
|
+
queryForIp: this.config.queryForIp,
|
|
151
|
+
configuredIp: this.config.p2pIp ?? 'none',
|
|
152
|
+
pingIntervalMs: this.config.queryForIp ? 10_000 : 300_000
|
|
112
153
|
});
|
|
113
154
|
this.currentState = PeerDiscoveryState.RUNNING;
|
|
114
155
|
// Add bootnode ENR if provided
|
|
@@ -138,6 +179,23 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
138
179
|
this.discv5.addEnr(enr);
|
|
139
180
|
}
|
|
140
181
|
}
|
|
182
|
+
// Re-seed discovery from peers persisted on previous runs. This lets a node rejoin the network
|
|
183
|
+
// after a restart even when no bootstrap node is reachable: discv5 has no on-disk routing table,
|
|
184
|
+
// so without this its DHT would start empty and rediscovery would depend on inbound dials alone.
|
|
185
|
+
if (this.persistedEnrs) {
|
|
186
|
+
// Drop peers that are now config-provided (re-injected above) or fail version checks.
|
|
187
|
+
const enrs = await this.persistedEnrs.load((enr)=>this.validateEnr(enr) && !this.configProvidedNodeIds.has(enr.nodeId));
|
|
188
|
+
for (const enr of enrs){
|
|
189
|
+
try {
|
|
190
|
+
this.discv5.addEnr(enr);
|
|
191
|
+
} catch (err) {
|
|
192
|
+
this.logger.debug(`Error re-seeding persisted ENR ${enr.nodeId}`, err);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (enrs.length > 0) {
|
|
196
|
+
this.logger.info(`Re-seeded discovery with ${enrs.length} persisted peer ENRs`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
141
199
|
}
|
|
142
200
|
async runRandomNodesQuery() {
|
|
143
201
|
if (this.currentState !== PeerDiscoveryState.RUNNING) {
|
|
@@ -145,8 +203,8 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
145
203
|
}
|
|
146
204
|
// First, wait some time before starting the peer discovery
|
|
147
205
|
// reference: https://github.com/ChainSafe/lodestar/issues/3423
|
|
148
|
-
const msSinceStart =
|
|
149
|
-
if (
|
|
206
|
+
const msSinceStart = this.dateProvider.now() - this.startTime;
|
|
207
|
+
if (this.dateProvider.now() - this.startTime <= delayBeforeStart) {
|
|
150
208
|
await sleep(delayBeforeStart - msSinceStart);
|
|
151
209
|
}
|
|
152
210
|
try {
|
|
@@ -174,22 +232,48 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
174
232
|
if (this.currentState !== PeerDiscoveryState.RUNNING) {
|
|
175
233
|
return;
|
|
176
234
|
}
|
|
177
|
-
await this.discv5.off(Discv5Event.DISCOVERED, this.handlers.
|
|
235
|
+
await this.discv5.off(Discv5Event.DISCOVERED, this.handlers.onPeerDiscovered);
|
|
178
236
|
await this.discv5.off(Discv5Event.ENR_ADDED, this.handlers.onEnrAdded);
|
|
179
237
|
await this.discv5.off(Discv5Event.MULTIADDR_UPDATED, this.handlers.onMultiaddrUpdated);
|
|
180
238
|
await this.discv5.stop();
|
|
181
239
|
this.currentState = PeerDiscoveryState.STOPPED;
|
|
182
240
|
}
|
|
183
241
|
async onEnrAdded(enr) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
242
|
+
try {
|
|
243
|
+
const multiAddrTcp = await enr.getFullMultiaddr('tcp');
|
|
244
|
+
const multiAddrUdp = await enr.getFullMultiaddr('udp');
|
|
245
|
+
this.logger.debug(`Added ENR ${enr.encodeTxt()}`, {
|
|
246
|
+
multiAddrTcp,
|
|
247
|
+
multiAddrUdp,
|
|
248
|
+
nodeId: enr.nodeId
|
|
249
|
+
});
|
|
250
|
+
// A peer just entered the routing table — persist it so we can re-seed discovery after a restart.
|
|
251
|
+
if (this.persistedEnrs && this.shouldPersist(enr)) {
|
|
252
|
+
await this.persistedEnrs.persist(enr);
|
|
253
|
+
}
|
|
254
|
+
this.onDiscovered(enr);
|
|
255
|
+
} catch (err) {
|
|
256
|
+
// A malformed ENR address field (e.g. a 3-byte TCP port) makes @nethermindeth/enr throw while
|
|
257
|
+
// parsing the multiaddr. This is an async event listener, so an unhandled rejection would crash
|
|
258
|
+
// the process — catch, log, and drop the ENR instead.
|
|
259
|
+
this.logger.warn(`Dropping ENR with unparseable address`, {
|
|
260
|
+
nodeId: enr.nodeId,
|
|
261
|
+
err
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async onPeerDiscovered(enr) {
|
|
266
|
+
// discv5 updates an existing routing-table entry on an ENR sequence bump without emitting enrAdded,
|
|
267
|
+
// so DISCOVERED is our only signal that a peer we already track may have changed address. Refresh
|
|
268
|
+
// the persisted copy (a no-op for peers we don't already store) so we don't keep dialing a stale ENR.
|
|
269
|
+
if (this.persistedEnrs && this.shouldPersist(enr)) {
|
|
270
|
+
await this.persistedEnrs.refresh(enr);
|
|
271
|
+
}
|
|
191
272
|
this.onDiscovered(enr);
|
|
192
273
|
}
|
|
274
|
+
/** Whether an ENR belongs in the persisted store: a validated, non-config peer that isn't ourselves. */ shouldPersist(enr) {
|
|
275
|
+
return !this.configProvidedNodeIds.has(enr.nodeId) && enr.nodeId !== this.enr.nodeId && this.validateEnr(enr);
|
|
276
|
+
}
|
|
193
277
|
isOurBootnode(enr) {
|
|
194
278
|
return this.bootstrapNodeEnrs.some((x)=>x.nodeId === enr.nodeId);
|
|
195
279
|
}
|
|
@@ -220,6 +304,18 @@ const delayBeforeStart = 2000; // 2sec
|
|
|
220
304
|
this.logger.debug(`Peer node ${enr.nodeId} does not have aztec key in ENR`);
|
|
221
305
|
return false;
|
|
222
306
|
}
|
|
307
|
+
// A malformed TCP field (e.g. a non-2-byte port) makes @nethermindeth/enr throw while building the
|
|
308
|
+
// multiaddr. Reject such an ENR here so it's never emitted as a full peer or re-parsed by an
|
|
309
|
+
// unguarded listener (which would crash the process). A missing TCP addr is allowed — those peers
|
|
310
|
+
// are simply skipped at dial time.
|
|
311
|
+
try {
|
|
312
|
+
enr.getLocationMultiaddr('tcp');
|
|
313
|
+
} catch (err) {
|
|
314
|
+
this.logger.debug(`Peer node ${enr.nodeId} has an unparseable TCP address`, {
|
|
315
|
+
err
|
|
316
|
+
});
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
223
319
|
// And check it has the correct version
|
|
224
320
|
let compressedVersion;
|
|
225
321
|
try {
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
2
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
3
|
+
import { ENR } from '@nethermindeth/enr';
|
|
4
|
+
/**
|
|
5
|
+
* A bounded, transactional store of discovered peer ENRs used to re-seed discovery after a restart.
|
|
6
|
+
*
|
|
7
|
+
* Entries are keyed by nodeId (so re-seeing a peer dedups in place) and carry a monotonic sequence so
|
|
8
|
+
* the store behaves as a FIFO: when it exceeds its cap, the oldest-seen peers are evicted first. All
|
|
9
|
+
* writes run in a transaction so concurrent discovery events can't race the size check.
|
|
10
|
+
*/
|
|
11
|
+
export declare class PersistedEnrStore {
|
|
12
|
+
private readonly store;
|
|
13
|
+
private readonly maxEntries;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
private readonly enrs;
|
|
16
|
+
/** Monotonic sequence stamped on each entry; seeded from the store's max in {@link load}. */
|
|
17
|
+
private seq;
|
|
18
|
+
constructor(store: AztecAsyncKVStore, maxEntries: number, logger?: Logger);
|
|
19
|
+
/** Adds or replaces a peer's ENR, stamping it as most-recently-seen and evicting the oldest if over cap. */
|
|
20
|
+
persist(enr: ENR): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Refreshes an already-persisted peer's stored ENR when a newer one (higher ENR sequence) is seen.
|
|
23
|
+
* A no-op for peers we don't already track — we never add new peers via this path, only update.
|
|
24
|
+
*
|
|
25
|
+
* This exists because discv5 updates an existing routing-table entry on an ENR sequence bump without
|
|
26
|
+
* emitting an `enrAdded` event, so a peer that changes address would otherwise keep its stale ENR
|
|
27
|
+
* persisted until evicted.
|
|
28
|
+
*/
|
|
29
|
+
refresh(enr: ENR): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Loads all persisted ENRs, decoding each and keeping those the `accept` predicate allows. Entries
|
|
32
|
+
* that fail to decode or are rejected are removed from the store. The FIFO sequence resumes from the
|
|
33
|
+
* highest persisted value so eviction order survives restarts.
|
|
34
|
+
*/
|
|
35
|
+
load(accept: (enr: ENR) => boolean): Promise<ENR[]>;
|
|
36
|
+
private decodeStoredEnr;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVkX2Vucl9zdG9yZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2Rpc2N2NS9wZXJzaXN0ZWRfZW5yX3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUV4RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUEwQnpDOzs7Ozs7R0FNRztBQUNILHFCQUFhLGlCQUFpQjtJQU0xQixPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUs7SUFDdEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVO0lBQzNCLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQVB6QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBZ0M7SUFDckQsNkZBQTZGO0lBQzdGLE9BQU8sQ0FBQyxHQUFHLENBQUs7SUFFaEIsWUFDbUIsS0FBSyxFQUFFLGlCQUFpQixFQUN4QixVQUFVLEVBQUUsTUFBTSxFQUNsQixNQUFNLEdBQUUsTUFBNkMsRUFHdkU7SUFFRCw0R0FBNEc7SUFDL0YsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQXdCNUM7SUFFRDs7Ozs7OztPQU9HO0lBQ1UsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQXVCNUM7SUFFRDs7OztPQUlHO0lBQ1UsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQThCL0Q7SUFFRCxPQUFPLENBQUMsZUFBZTtDQVd4QiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persisted_enr_store.d.ts","sourceRoot":"","sources":["../../../src/services/discv5/persisted_enr_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AA0BzC;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IACrD,6FAA6F;IAC7F,OAAO,CAAC,GAAG,CAAK;IAEhB,YACmB,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAA6C,EAGvE;IAED,4GAA4G;IAC/F,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB5C;IAED;;;;;;;OAOG;IACU,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5C;IAED;;;;OAIG;IACU,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CA8B/D;IAED,OAAO,CAAC,eAAe;CAWxB"}
|