@aztec/p2p 0.0.1-commit.3fd054f6 → 0.0.1-commit.431c48d
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 +7 -6
- 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 +35 -25
- package/dest/client/interface.d.ts +52 -12
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +36 -20
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +127 -54
- package/dest/config.d.ts +150 -107
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +77 -26
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +9 -16
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +10 -17
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +98 -56
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +269 -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 +218 -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 +9 -4
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +28 -9
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +10 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +29 -20
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +3 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +6 -7
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +6 -5
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +11 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +24 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +33 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -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 +15 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +31 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +16 -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 +83 -32
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +50 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +243 -127
- 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 +85 -15
- 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/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 +1 -0
- 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 +29 -16
- 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 +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +5 -5
- package/dest/services/discv5/discV5_service.d.ts +13 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +119 -23
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +18 -16
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +21 -16
- package/dest/services/encoding.d.ts +19 -6
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +25 -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 +6 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +21 -0
- package/dest/services/libp2p/libp2p_service.d.ts +49 -44
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +388 -279
- package/dest/services/peer-manager/peer_manager.d.ts +31 -3
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +121 -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 +35 -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 +15 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +11 -0
- package/dest/services/reqresp/interface.d.ts +16 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -20
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +59 -209
- package/dest/services/service.d.ts +43 -18
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +2 -23
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +2 -55
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/index.d.ts +2 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +0 -1
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +0 -2
- package/dest/services/tx_collection/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 +33 -9
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +57 -44
- package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +16 -18
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +15 -14
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +28 -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 +101 -39
- 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 +17 -17
- package/src/bootstrap/bootstrap.ts +17 -3
- package/src/client/factory.ts +53 -24
- package/src/client/interface.ts +48 -18
- package/src/client/p2p_client.ts +144 -86
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +159 -34
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +13 -19
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +324 -239
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +238 -63
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +18 -12
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -4
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -7
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -6
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +27 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +31 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +20 -8
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +35 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +94 -31
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +270 -133
- 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 +94 -12
- 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/data_validator.ts +2 -0
- package/src/msg_validators/tx_validator/factory.ts +37 -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 +2 -2
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +126 -14
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +26 -40
- package/src/services/encoding.ts +28 -20
- package/src/services/gossipsub/README.md +33 -11
- package/src/services/gossipsub/topic_score_params.ts +9 -18
- package/src/services/libp2p/instrumentation.ts +22 -0
- package/src/services/libp2p/libp2p_service.ts +456 -305
- package/src/services/peer-manager/peer_manager.ts +133 -22
- package/src/services/peer-manager/peer_scoring.ts +102 -8
- package/src/services/reqresp/README.md +2 -37
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +39 -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 +19 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +1 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
- package/src/services/reqresp/reqresp.ts +69 -252
- package/src/services/service.ts +51 -35
- package/src/services/tx_collection/config.ts +3 -80
- package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/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 +61 -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 +35 -26
- package/src/testbench/p2p_client_testbench_worker.ts +108 -53
- 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 -304
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -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 -343
- 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
package/src/client/interface.ts
CHANGED
|
@@ -9,15 +9,13 @@ import type { ENR } from '@nethermindeth/enr';
|
|
|
9
9
|
|
|
10
10
|
import type { P2PConfig } from '../config.js';
|
|
11
11
|
import type { AuthRequest, StatusMessage } from '../services/index.js';
|
|
12
|
-
import type {
|
|
13
|
-
ReqRespSubProtocol,
|
|
14
|
-
ReqRespSubProtocolHandler,
|
|
15
|
-
ReqRespSubProtocolValidators,
|
|
16
|
-
} from '../services/reqresp/interface.js';
|
|
12
|
+
import type { ReqRespSubProtocol, ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
|
|
17
13
|
import type {
|
|
18
14
|
DuplicateAttestationInfo,
|
|
19
15
|
DuplicateProposalInfo,
|
|
16
|
+
OversizedProposalInfo,
|
|
20
17
|
P2PBlockReceivedCallback,
|
|
18
|
+
P2PCheckpointAttestationCallback,
|
|
21
19
|
P2PCheckpointReceivedCallback,
|
|
22
20
|
} from '../services/service.js';
|
|
23
21
|
|
|
@@ -82,7 +80,15 @@ export type P2P = P2PClient & {
|
|
|
82
80
|
*
|
|
83
81
|
* @param handler - A function taking a received checkpoint proposal and producing attestations
|
|
84
82
|
*/
|
|
85
|
-
|
|
83
|
+
registerValidatorCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Registers a callback that runs for ALL nodes (not just validators) when a checkpoint proposal is received.
|
|
87
|
+
* Used to set the proposed checkpoint number on the archiver so the sequencer can build on top of it.
|
|
88
|
+
*
|
|
89
|
+
* @param handler - A function taking a received checkpoint proposal
|
|
90
|
+
*/
|
|
91
|
+
registerAllNodesCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
|
|
86
92
|
|
|
87
93
|
/**
|
|
88
94
|
* Registers a callback invoked when a duplicate proposal is detected (equivocation).
|
|
@@ -92,6 +98,14 @@ export type P2P = P2PClient & {
|
|
|
92
98
|
*/
|
|
93
99
|
registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void;
|
|
94
100
|
|
|
101
|
+
/**
|
|
102
|
+
* Registers a callback invoked when an oversized block proposal (index at or beyond the consensus
|
|
103
|
+
* per-checkpoint block limit) is stored and re-broadcast as slashing evidence.
|
|
104
|
+
*
|
|
105
|
+
* @param callback - Function called with info about the oversized proposal
|
|
106
|
+
*/
|
|
107
|
+
registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void;
|
|
108
|
+
|
|
95
109
|
/**
|
|
96
110
|
* Registers a callback invoked when a duplicate attestation is detected (equivocation).
|
|
97
111
|
* A validator signing attestations for different proposals at the same slot.
|
|
@@ -101,6 +115,9 @@ export type P2P = P2PClient & {
|
|
|
101
115
|
*/
|
|
102
116
|
registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void;
|
|
103
117
|
|
|
118
|
+
/** Registers a callback invoked when a valid checkpoint attestation is accepted into the pool. */
|
|
119
|
+
registerCheckpointAttestationCallback(callback: P2PCheckpointAttestationCallback): void;
|
|
120
|
+
|
|
104
121
|
/**
|
|
105
122
|
* Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
|
|
106
123
|
* @param tx - The transaction.
|
|
@@ -116,16 +133,18 @@ export type P2P = P2PClient & {
|
|
|
116
133
|
/**
|
|
117
134
|
* Returns a transaction in the transaction pool by its hash.
|
|
118
135
|
* @param txHash - Hash of tx to return.
|
|
136
|
+
* @param opts - Set `includeProof: false` to skip loading the tx proof from the DB.
|
|
119
137
|
* @returns A single tx or undefined.
|
|
120
138
|
*/
|
|
121
|
-
getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined>;
|
|
139
|
+
getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined>;
|
|
122
140
|
|
|
123
141
|
/**
|
|
124
142
|
* Returns transactions in the transaction pool by hash.
|
|
125
143
|
* @param txHashes - Hashes of txs to return.
|
|
144
|
+
* @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
|
|
126
145
|
* @returns An array of txs or undefined.
|
|
127
146
|
*/
|
|
128
|
-
getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
147
|
+
getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]>;
|
|
129
148
|
|
|
130
149
|
/**
|
|
131
150
|
* Checks if transactions exist in the pool
|
|
@@ -148,15 +167,27 @@ export type P2P = P2PClient & {
|
|
|
148
167
|
*/
|
|
149
168
|
getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined>;
|
|
150
169
|
|
|
151
|
-
/**
|
|
152
|
-
|
|
170
|
+
/**
|
|
171
|
+
* Returns an iterator over pending txs on the mempool.
|
|
172
|
+
* Set `includeProof: false` to skip loading tx proofs from the DB.
|
|
173
|
+
*/
|
|
174
|
+
iteratePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx>;
|
|
153
175
|
|
|
154
|
-
/**
|
|
155
|
-
|
|
176
|
+
/**
|
|
177
|
+
* Returns an iterator over pending txs that have been in the pool long enough to be eligible for block building.
|
|
178
|
+
* Set `includeProof: false` to skip loading tx proofs from the DB.
|
|
179
|
+
*/
|
|
180
|
+
iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx>;
|
|
156
181
|
|
|
157
182
|
/** Returns the number of pending txs in the mempool. */
|
|
158
183
|
getPendingTxCount(): Promise<number>;
|
|
159
184
|
|
|
185
|
+
/**
|
|
186
|
+
* Returns whether at least `minCount` pending txs have been in the pool long enough to be eligible for block
|
|
187
|
+
* building. Early-exits once the threshold is met instead of counting every eligible tx.
|
|
188
|
+
*/
|
|
189
|
+
hasEligiblePendingTxs(minCount: number): Promise<boolean>;
|
|
190
|
+
|
|
160
191
|
/**
|
|
161
192
|
* Protects existing transactions by hash for a given slot.
|
|
162
193
|
* Returns hashes of transactions that weren't found in the pool.
|
|
@@ -210,17 +241,16 @@ export type P2P = P2PClient & {
|
|
|
210
241
|
|
|
211
242
|
updateP2PConfig(config: Partial<P2PConfig>): Promise<void>;
|
|
212
243
|
|
|
213
|
-
/**
|
|
244
|
+
/**
|
|
245
|
+
* Validates a set of txs received in a block proposal.
|
|
246
|
+
* @throws InvalidBlockProposalTxsError - If any tx fails minimum integrity validation.
|
|
247
|
+
*/
|
|
214
248
|
validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
|
|
215
249
|
|
|
216
250
|
/** Clears the db. */
|
|
217
251
|
clear(): Promise<void>;
|
|
218
252
|
|
|
219
|
-
addReqRespSubProtocol(
|
|
220
|
-
subProtocol: ReqRespSubProtocol,
|
|
221
|
-
handler: ReqRespSubProtocolHandler,
|
|
222
|
-
validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
223
|
-
): Promise<void>;
|
|
253
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void>;
|
|
224
254
|
|
|
225
255
|
handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
226
256
|
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -1,24 +1,31 @@
|
|
|
1
|
-
import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
|
|
2
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
3
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
BlockNumber,
|
|
4
|
+
CheckpointNumber,
|
|
5
|
+
type CheckpointProposalHash,
|
|
6
|
+
SlotNumber,
|
|
7
|
+
} from '@aztec/foundation/branded-types';
|
|
4
8
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
|
-
import {
|
|
9
|
+
import { type PromiseWithResolvers, promiseWithResolvers } from '@aztec/foundation/promise';
|
|
6
10
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
7
11
|
import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
|
|
8
12
|
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
9
13
|
import {
|
|
14
|
+
type BlockData,
|
|
15
|
+
type BlockHash,
|
|
10
16
|
type CheckpointId,
|
|
11
17
|
type EthAddress,
|
|
18
|
+
EventDrivenL2BlockStream,
|
|
12
19
|
type L2Block,
|
|
13
20
|
type L2BlockId,
|
|
14
21
|
type L2BlockSource,
|
|
15
|
-
L2BlockStream,
|
|
16
22
|
type L2BlockStreamEvent,
|
|
17
|
-
type L2Tips,
|
|
18
23
|
type L2TipsStore,
|
|
24
|
+
type LocalL2Tips,
|
|
19
25
|
} from '@aztec/stdlib/block';
|
|
20
26
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
21
|
-
import {
|
|
27
|
+
import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
28
|
+
import { type GetTxByHashOptions, type P2PConnectivity, type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
|
|
22
29
|
import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
|
|
23
30
|
import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
24
31
|
import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
@@ -28,18 +35,15 @@ import type { ENR } from '@nethermindeth/enr';
|
|
|
28
35
|
|
|
29
36
|
import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
|
|
30
37
|
import { TxPoolError } from '../errors/tx-pool.error.js';
|
|
31
|
-
import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
38
|
+
import type { AttestationPoolApi, ProposalsForSlot } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
32
39
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
33
40
|
import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
|
|
34
41
|
import type { AuthRequest, StatusMessage } from '../services/index.js';
|
|
35
|
-
import {
|
|
36
|
-
ReqRespSubProtocol,
|
|
37
|
-
type ReqRespSubProtocolHandler,
|
|
38
|
-
type ReqRespSubProtocolValidators,
|
|
39
|
-
} from '../services/reqresp/interface.js';
|
|
42
|
+
import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
|
|
40
43
|
import type {
|
|
41
44
|
DuplicateAttestationInfo,
|
|
42
45
|
DuplicateProposalInfo,
|
|
46
|
+
OversizedProposalInfo,
|
|
43
47
|
P2PBlockReceivedCallback,
|
|
44
48
|
P2PCheckpointReceivedCallback,
|
|
45
49
|
P2PService,
|
|
@@ -58,7 +62,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
58
62
|
|
|
59
63
|
private currentState = P2PClientState.IDLE;
|
|
60
64
|
private syncPromise = Promise.resolve();
|
|
61
|
-
private
|
|
65
|
+
private syncResolvers?: PromiseWithResolvers<void> = undefined;
|
|
62
66
|
private latestBlockNumberAtStart = -1;
|
|
63
67
|
private provenBlockNumberAtStart = -1;
|
|
64
68
|
private finalizedBlockNumberAtStart = -1;
|
|
@@ -71,7 +75,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
71
75
|
|
|
72
76
|
private config: P2PConfig;
|
|
73
77
|
|
|
74
|
-
private blockStream:
|
|
78
|
+
private blockStream: EventDrivenL2BlockStream | undefined;
|
|
75
79
|
|
|
76
80
|
private txProvider: TxProvider;
|
|
77
81
|
|
|
@@ -80,9 +84,6 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
80
84
|
/** Tracks the last slot for which we called prepareForSlot */
|
|
81
85
|
private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
|
|
82
86
|
|
|
83
|
-
/** Polls for slot changes and calls prepareForSlot on the tx pool */
|
|
84
|
-
private slotMonitor: RunningPromise | undefined;
|
|
85
|
-
|
|
86
87
|
constructor(
|
|
87
88
|
private store: AztecAsyncKVStore,
|
|
88
89
|
private l2BlockSource: L2BlockSource & ContractDataSource,
|
|
@@ -95,6 +96,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
95
96
|
private _dateProvider: DateProvider = new DateProvider(),
|
|
96
97
|
private telemetry: TelemetryClient = getTelemetryClient(),
|
|
97
98
|
private log = createLogger('p2p'),
|
|
99
|
+
initialBlockHash: BlockHash,
|
|
98
100
|
) {
|
|
99
101
|
super(telemetry, 'P2PClient');
|
|
100
102
|
|
|
@@ -110,7 +112,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
110
112
|
this.telemetry,
|
|
111
113
|
);
|
|
112
114
|
|
|
113
|
-
this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
|
|
115
|
+
this.l2Tips = new L2TipsKVStore(store, 'p2p_client', initialBlockHash);
|
|
114
116
|
this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
|
|
115
117
|
}
|
|
116
118
|
|
|
@@ -135,6 +137,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
135
137
|
return Promise.resolve(this.p2pService.getPeers(includePending));
|
|
136
138
|
}
|
|
137
139
|
|
|
140
|
+
public getP2PConnectivity(): Promise<P2PConnectivity> {
|
|
141
|
+
return Promise.resolve(this.p2pService.getP2PConnectivity());
|
|
142
|
+
}
|
|
143
|
+
|
|
138
144
|
public getGossipMeshPeerCount(topicType: TopicType): Promise<number> {
|
|
139
145
|
return Promise.resolve(this.p2pService.getGossipMeshPeerCount(topicType));
|
|
140
146
|
}
|
|
@@ -148,7 +154,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
148
154
|
this.p2pService.updateConfig(config);
|
|
149
155
|
}
|
|
150
156
|
|
|
151
|
-
public getL2Tips(): Promise<
|
|
157
|
+
public getL2Tips(): Promise<LocalL2Tips> {
|
|
152
158
|
return this.l2Tips.getL2Tips();
|
|
153
159
|
}
|
|
154
160
|
|
|
@@ -164,7 +170,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
164
170
|
const from = BlockNumber(oldFinalizedBlockNum + 1);
|
|
165
171
|
const limit = event.block.number - from + 1;
|
|
166
172
|
if (limit > 0) {
|
|
167
|
-
const oldBlocks = await this.l2BlockSource.
|
|
173
|
+
const oldBlocks = await this.l2BlockSource.getBlocksData({ from, limit });
|
|
168
174
|
await this.handleFinalizedL2Blocks(oldBlocks);
|
|
169
175
|
}
|
|
170
176
|
break;
|
|
@@ -174,10 +180,12 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
174
180
|
break;
|
|
175
181
|
case 'chain-pruned':
|
|
176
182
|
this.txCollection.stopCollectingForBlocksAfter(event.block.number);
|
|
177
|
-
await this.handlePruneL2Blocks(event.block, event.checkpoint);
|
|
183
|
+
await this.handlePruneL2Blocks(event.block, event.checkpointed.checkpoint);
|
|
178
184
|
break;
|
|
179
185
|
case 'chain-checkpointed':
|
|
180
186
|
break;
|
|
187
|
+
case 'chain-proposed':
|
|
188
|
+
break;
|
|
181
189
|
default: {
|
|
182
190
|
const _: never = event;
|
|
183
191
|
break;
|
|
@@ -236,9 +244,8 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
236
244
|
// this gets resolved on `startServiceIfSynched`
|
|
237
245
|
this.initBlockStream();
|
|
238
246
|
this.setCurrentState(P2PClientState.SYNCHING);
|
|
239
|
-
this.
|
|
240
|
-
|
|
241
|
-
});
|
|
247
|
+
this.syncResolvers = promiseWithResolvers<void>();
|
|
248
|
+
this.syncPromise = this.syncResolvers.promise;
|
|
242
249
|
this.log.info(`Initiating p2p sync from ${syncedLatestBlock}`, {
|
|
243
250
|
syncedLatestBlock,
|
|
244
251
|
syncedProvenBlock,
|
|
@@ -257,33 +264,24 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
257
264
|
});
|
|
258
265
|
}
|
|
259
266
|
|
|
260
|
-
|
|
261
|
-
|
|
267
|
+
// Should never happen: all branches above call initBlockStream()
|
|
268
|
+
if (!this.blockStream) {
|
|
269
|
+
throw new Error('Block stream not initialized');
|
|
270
|
+
}
|
|
271
|
+
this.blockStream.start();
|
|
262
272
|
this.txFileStore?.start();
|
|
263
273
|
|
|
264
|
-
// Start slot monitor to call prepareForSlot when the slot changes
|
|
265
|
-
this.slotMonitor = new RunningPromise(
|
|
266
|
-
() => this.maybeCallPrepareForSlot(),
|
|
267
|
-
this.log,
|
|
268
|
-
this.config.slotCheckIntervalMS,
|
|
269
|
-
);
|
|
270
|
-
this.slotMonitor.start();
|
|
271
|
-
|
|
272
274
|
return this.syncPromise;
|
|
273
275
|
}
|
|
274
276
|
|
|
275
|
-
addReqRespSubProtocol(
|
|
276
|
-
subProtocol
|
|
277
|
-
handler: ReqRespSubProtocolHandler,
|
|
278
|
-
validator: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
279
|
-
): Promise<void> {
|
|
280
|
-
return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
|
|
277
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
278
|
+
return this.p2pService.addReqRespSubProtocol(subProtocol, handler);
|
|
281
279
|
}
|
|
282
280
|
|
|
283
281
|
private initBlockStream(startingBlock?: BlockNumber) {
|
|
284
282
|
if (!this.blockStream) {
|
|
285
283
|
const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
|
|
286
|
-
this.blockStream = new
|
|
284
|
+
this.blockStream = new EventDrivenL2BlockStream(
|
|
287
285
|
this.l2BlockSource,
|
|
288
286
|
this,
|
|
289
287
|
this,
|
|
@@ -299,8 +297,6 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
299
297
|
*/
|
|
300
298
|
public async stop() {
|
|
301
299
|
this.log.debug('Stopping p2p client...');
|
|
302
|
-
await this.slotMonitor?.stop();
|
|
303
|
-
this.log.debug('Stopped slot monitor');
|
|
304
300
|
await tryStop(this.txCollection);
|
|
305
301
|
this.log.debug('Stopped tx collection service');
|
|
306
302
|
await this.txFileStore?.stop();
|
|
@@ -319,7 +315,11 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
319
315
|
/** Triggers a sync to the archiver. Used for testing. */
|
|
320
316
|
public async sync() {
|
|
321
317
|
this.initBlockStream();
|
|
322
|
-
|
|
318
|
+
// Should never happen: initBlockStream() creates blockStream if absent
|
|
319
|
+
if (!this.blockStream) {
|
|
320
|
+
throw new Error('Block stream not initialized');
|
|
321
|
+
}
|
|
322
|
+
await this.blockStream.sync();
|
|
323
323
|
}
|
|
324
324
|
|
|
325
325
|
@trackSpan('p2pClient.broadcastProposal', async proposal => ({
|
|
@@ -357,6 +357,19 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
357
357
|
// Store our own last-block proposal so we can respond to req/resp requests for it.
|
|
358
358
|
await this.attestationPool.tryAddBlockProposal(blockProposal);
|
|
359
359
|
}
|
|
360
|
+
const checkpointCore = proposal.toCore();
|
|
361
|
+
const { count } = await this.attestationPool.tryAddCheckpointProposal(checkpointCore);
|
|
362
|
+
if (count > 1) {
|
|
363
|
+
if (this.config.broadcastEquivocatedProposals) {
|
|
364
|
+
this.log.warn(`Broadcasting equivocated checkpoint proposal for slot ${proposal.slotNumber}`, {
|
|
365
|
+
slot: proposal.slotNumber,
|
|
366
|
+
archive: proposal.archive.toString(),
|
|
367
|
+
count,
|
|
368
|
+
});
|
|
369
|
+
} else {
|
|
370
|
+
throw new Error(`Attempted to broadcast a duplicate checkpoint proposal for slot ${proposal.slotNumber}`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
360
373
|
return this.p2pService.propagate(proposal);
|
|
361
374
|
}
|
|
362
375
|
|
|
@@ -367,10 +380,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
367
380
|
|
|
368
381
|
public async getCheckpointAttestationsForSlot(
|
|
369
382
|
slot: SlotNumber,
|
|
370
|
-
|
|
383
|
+
proposalPayloadHash?: CheckpointProposalHash,
|
|
371
384
|
): Promise<CheckpointAttestation[]> {
|
|
372
|
-
return await (
|
|
373
|
-
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
385
|
+
return await (proposalPayloadHash
|
|
386
|
+
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
|
|
374
387
|
: this.attestationPool.getCheckpointAttestationsForSlot(slot));
|
|
375
388
|
}
|
|
376
389
|
|
|
@@ -378,29 +391,49 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
378
391
|
return this.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
379
392
|
}
|
|
380
393
|
|
|
394
|
+
public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
|
|
395
|
+
return this.attestationPool.getProposalsForSlot(slot);
|
|
396
|
+
}
|
|
397
|
+
|
|
381
398
|
public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
|
|
382
399
|
return this.attestationPool.hasBlockProposalsForSlot(slot);
|
|
383
400
|
}
|
|
384
401
|
|
|
402
|
+
public hasCheckpointProposalForSlot(slot: SlotNumber): Promise<boolean> {
|
|
403
|
+
return this.attestationPool.hasCheckpointProposalForSlot(slot);
|
|
404
|
+
}
|
|
405
|
+
|
|
385
406
|
// REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
386
407
|
// ^ This pattern is not my favorite (md)
|
|
387
408
|
public registerBlockProposalHandler(handler: P2PBlockReceivedCallback): void {
|
|
388
409
|
this.p2pService.registerBlockReceivedCallback(handler);
|
|
389
410
|
}
|
|
390
411
|
|
|
391
|
-
public
|
|
392
|
-
this.p2pService.
|
|
412
|
+
public registerValidatorCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
413
|
+
this.p2pService.registerValidatorCheckpointReceivedCallback(handler);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
public registerAllNodesCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
417
|
+
this.p2pService.registerAllNodesCheckpointReceivedCallback(handler);
|
|
393
418
|
}
|
|
394
419
|
|
|
395
420
|
public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
|
|
396
421
|
this.p2pService.registerDuplicateProposalCallback(callback);
|
|
397
422
|
}
|
|
398
423
|
|
|
424
|
+
public registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void {
|
|
425
|
+
this.p2pService.registerOversizedProposalCallback(callback);
|
|
426
|
+
}
|
|
427
|
+
|
|
399
428
|
public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
|
|
400
429
|
this.p2pService.registerDuplicateAttestationCallback(callback);
|
|
401
430
|
}
|
|
402
431
|
|
|
403
|
-
public
|
|
432
|
+
public registerCheckpointAttestationCallback(callback: (attestation: CheckpointAttestation) => void): void {
|
|
433
|
+
this.p2pService.registerCheckpointAttestationCallback(callback);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
public async getPendingTxs(limit?: number, after?: TxHash, options?: GetTxByHashOptions): Promise<Tx[]> {
|
|
404
437
|
if (limit !== undefined && limit <= 0) {
|
|
405
438
|
throw new TypeError('limit must be greater than 0');
|
|
406
439
|
}
|
|
@@ -419,7 +452,9 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
419
452
|
const endIndex = limit !== undefined ? startIndex + limit : undefined;
|
|
420
453
|
txHashes = txHashes.slice(startIndex, endIndex);
|
|
421
454
|
|
|
422
|
-
|
|
455
|
+
// This is a public-facing API (exposed via both the node and the p2p RPC), so proofs are opt-in.
|
|
456
|
+
const includeProof = !!options?.includeProof;
|
|
457
|
+
const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash, { includeProof })));
|
|
423
458
|
return maybeTxs.filter((tx): tx is Tx => !!tx);
|
|
424
459
|
}
|
|
425
460
|
|
|
@@ -427,18 +462,22 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
427
462
|
return this.txPool.getPendingTxCount();
|
|
428
463
|
}
|
|
429
464
|
|
|
430
|
-
public
|
|
465
|
+
public hasEligiblePendingTxs(minCount: number): Promise<boolean> {
|
|
466
|
+
return this.txPool.hasEligiblePendingTxs(minCount);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
public async *iteratePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
|
|
431
470
|
for (const txHash of await this.txPool.getPendingTxHashes()) {
|
|
432
|
-
const tx = await this.txPool.getTxByHash(txHash);
|
|
471
|
+
const tx = await this.txPool.getTxByHash(txHash, opts);
|
|
433
472
|
if (tx) {
|
|
434
473
|
yield tx;
|
|
435
474
|
}
|
|
436
475
|
}
|
|
437
476
|
}
|
|
438
477
|
|
|
439
|
-
public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
|
|
478
|
+
public async *iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
|
|
440
479
|
for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
|
|
441
|
-
const tx = await this.txPool.getTxByHash(txHash);
|
|
480
|
+
const tx = await this.txPool.getTxByHash(txHash, opts);
|
|
442
481
|
if (tx) {
|
|
443
482
|
yield tx;
|
|
444
483
|
}
|
|
@@ -448,19 +487,21 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
448
487
|
/**
|
|
449
488
|
* Returns a transaction in the transaction pool by its hash.
|
|
450
489
|
* @param txHash - Hash of the transaction to look for in the pool.
|
|
490
|
+
* @param opts - Set `includeProof: false` to skip loading the tx proof from the DB.
|
|
451
491
|
* @returns A single tx or undefined.
|
|
452
492
|
*/
|
|
453
|
-
getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined> {
|
|
454
|
-
return this.txPool.getTxByHash(txHash);
|
|
493
|
+
getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined> {
|
|
494
|
+
return this.txPool.getTxByHash(txHash, opts);
|
|
455
495
|
}
|
|
456
496
|
|
|
457
497
|
/**
|
|
458
498
|
* Returns transactions in the transaction pool by hash.
|
|
459
499
|
* @param txHashes - Hashes of the transactions to look for.
|
|
500
|
+
* @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
|
|
460
501
|
* @returns The txs found, in the same order as the requested hashes. If a tx is not found, it will be undefined.
|
|
461
502
|
*/
|
|
462
|
-
getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
|
|
463
|
-
return this.txPool.getTxsByHash(txHashes);
|
|
503
|
+
getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]> {
|
|
504
|
+
return this.txPool.getTxsByHash(txHashes, opts);
|
|
464
505
|
}
|
|
465
506
|
|
|
466
507
|
hasTxsInPool(txHashes: TxHash[]): Promise<boolean[]> {
|
|
@@ -570,13 +611,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
570
611
|
*/
|
|
571
612
|
public async getStatus(): Promise<P2PSyncState> {
|
|
572
613
|
const blockNumber = await this.getSyncedLatestBlockNum();
|
|
573
|
-
const blockHash =
|
|
574
|
-
blockNumber
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
.getBlockHeader(blockNumber)
|
|
578
|
-
.then(header => header?.hash())
|
|
579
|
-
.then(hash => hash?.toString());
|
|
614
|
+
const blockHash = await this.l2BlockSource
|
|
615
|
+
.getBlockData({ number: blockNumber })
|
|
616
|
+
.then(data => data?.header.hash())
|
|
617
|
+
.then(hash => hash?.toString());
|
|
580
618
|
|
|
581
619
|
return {
|
|
582
620
|
state: this.currentState,
|
|
@@ -605,15 +643,20 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
605
643
|
return;
|
|
606
644
|
}
|
|
607
645
|
|
|
608
|
-
await this.handleMinedBlocks(blocks);
|
|
609
|
-
await this.maybeCallPrepareForSlot();
|
|
610
|
-
await this.startCollectingMissingTxs(blocks);
|
|
611
646
|
const lastBlock = blocks.at(-1)!;
|
|
612
|
-
|
|
647
|
+
const lastSlot = lastBlock.header.getSlot();
|
|
648
|
+
|
|
649
|
+
// Mark txs mined before releasing protections: a block landing at this slot supersedes any
|
|
650
|
+
// protection for txs it includes, so mined-marking must run first to keep just-landed txs from
|
|
651
|
+
// being unprotected into pending where they could be evicted before they are recorded as mined.
|
|
652
|
+
await this.handleMinedBlocks(blocks);
|
|
653
|
+
await this.maybeCallPrepareForSlot(lastSlot);
|
|
654
|
+
await this.collectingMissingTxs(blocks);
|
|
655
|
+
await this.synchedLatestSlot.set(BigInt(lastSlot));
|
|
613
656
|
}
|
|
614
657
|
|
|
615
|
-
/** Request txs for unproven blocks so the prover node
|
|
616
|
-
private async
|
|
658
|
+
/** Request txs for unproven blocks so the prover node can prove. */
|
|
659
|
+
private async collectingMissingTxs(blocks: L2Block[]): Promise<void> {
|
|
617
660
|
try {
|
|
618
661
|
// TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
|
|
619
662
|
// be much lower than the actual one, and it does not update until the pending chain is
|
|
@@ -621,7 +664,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
621
664
|
// are already proven, but the archiver has not yet updated its state. Until this is properly
|
|
622
665
|
// fixed, it is mitigated by the expiration date of collection requests, which depends on
|
|
623
666
|
// the slot number of the block.
|
|
624
|
-
const provenBlockNumber = await this.l2BlockSource.
|
|
667
|
+
const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
|
|
625
668
|
const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
|
|
626
669
|
for (const block of unprovenBlocks) {
|
|
627
670
|
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
@@ -633,7 +676,17 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
633
676
|
`Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
|
|
634
677
|
{ missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
|
|
635
678
|
);
|
|
636
|
-
|
|
679
|
+
// Both `slashDataWithholdingToleranceSlots` and `p2pMissingTxCollectionDeadlineSlots`
|
|
680
|
+
// count *full slots after the block slot* — value N means collection runs until
|
|
681
|
+
// `slotStart(block.slot + N + 1)`. Take the larger of the two so collection never
|
|
682
|
+
// gives up before the data-withholding slash verdict is rendered.
|
|
683
|
+
const blockSlot = block.header.getSlot();
|
|
684
|
+
const toleranceSlots = this.config.slashDataWithholdingToleranceSlots;
|
|
685
|
+
const configuredSlots = this.config.p2pMissingTxCollectionDeadlineSlots ?? 0;
|
|
686
|
+
const deadlineSlot = SlotNumber(blockSlot + Math.max(toleranceSlots, configuredSlots) + 1);
|
|
687
|
+
const deadlineSeconds = getTimestampForSlot(deadlineSlot, this.epochCache.getL1Constants());
|
|
688
|
+
const deadline = new Date(Number(deadlineSeconds) * 1000);
|
|
689
|
+
await this.txCollection.collectFastForBlock(block, missingTxHashes, { deadline });
|
|
637
690
|
}
|
|
638
691
|
}
|
|
639
692
|
} catch (err) {
|
|
@@ -646,7 +699,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
646
699
|
* @param blocks - A list of finalized L2 blocks.
|
|
647
700
|
* @returns Empty promise.
|
|
648
701
|
*/
|
|
649
|
-
private async handleFinalizedL2Blocks(blocks:
|
|
702
|
+
private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
|
|
650
703
|
if (!blocks.length) {
|
|
651
704
|
return;
|
|
652
705
|
}
|
|
@@ -694,16 +747,13 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
694
747
|
return isEpochPrune;
|
|
695
748
|
}
|
|
696
749
|
|
|
697
|
-
/**
|
|
698
|
-
private async maybeCallPrepareForSlot(): Promise<void> {
|
|
699
|
-
|
|
700
|
-
// Knowledege of pending checkpoints is in the PR above
|
|
701
|
-
const { targetSlot } = this.epochCache.getTargetAndNextSlot();
|
|
702
|
-
if (targetSlot <= this.lastSlotProcessed) {
|
|
750
|
+
/** Calls prepareForSlot for the given slot if it advances past the last slot we prepared for. */
|
|
751
|
+
private async maybeCallPrepareForSlot(slot: SlotNumber): Promise<void> {
|
|
752
|
+
if (slot <= this.lastSlotProcessed) {
|
|
703
753
|
return;
|
|
704
754
|
}
|
|
705
|
-
this.lastSlotProcessed =
|
|
706
|
-
await this.txPool.prepareForSlot(
|
|
755
|
+
this.lastSlotProcessed = slot;
|
|
756
|
+
await this.txPool.prepareForSlot(slot);
|
|
707
757
|
}
|
|
708
758
|
|
|
709
759
|
private async startServiceIfSynched() {
|
|
@@ -726,9 +776,17 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
726
776
|
syncedFinalizedBlock,
|
|
727
777
|
});
|
|
728
778
|
this.setCurrentState(P2PClientState.RUNNING);
|
|
729
|
-
if (this.
|
|
730
|
-
|
|
731
|
-
|
|
779
|
+
if (this.syncResolvers !== undefined) {
|
|
780
|
+
// A throw here would be swallowed by the block stream event handler, so we reject the promise returned by
|
|
781
|
+
// start instead, which makes node startup fail rather than run on with a dead p2p stack.
|
|
782
|
+
try {
|
|
783
|
+
await this.p2pService.start();
|
|
784
|
+
} catch (err) {
|
|
785
|
+
this.log.fatal(`Failed to start p2p service`, { err, syncedLatestBlock });
|
|
786
|
+
this.syncResolvers.reject(err);
|
|
787
|
+
return;
|
|
788
|
+
}
|
|
789
|
+
this.syncResolvers.resolve();
|
|
732
790
|
}
|
|
733
791
|
}
|
|
734
792
|
}
|