@aztec/p2p 0.0.1-commit.9593d84 → 0.0.1-commit.967fc6998
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/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +4 -4
- package/dest/client/factory.d.ts +10 -10
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +45 -19
- package/dest/client/interface.d.ts +61 -35
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +52 -65
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +607 -318
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +304 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +38 -13
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +31 -20
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +111 -76
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
- 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 +529 -289
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts +11 -8
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +17 -13
- package/dest/mem_pools/index.d.ts +3 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/index.js +1 -1
- package/dest/mem_pools/instrumentation.d.ts +7 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +31 -13
- package/dest/mem_pools/interface.d.ts +6 -7
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +37 -27
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +314 -335
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
- package/dest/mem_pools/tx_pool/index.d.ts +1 -2
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/index.js +0 -1
- package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.js +6 -1
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +11 -6
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +30 -24
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +211 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +119 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +193 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +354 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +905 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +52 -19
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -7
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -13
- package/dest/msg_validators/clock_tolerance.d.ts +21 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +37 -0
- package/dest/msg_validators/index.d.ts +2 -2
- package/dest/msg_validators/index.d.ts.map +1 -1
- package/dest/msg_validators/index.js +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +4 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
- package/dest/msg_validators/tx_validator/factory.d.ts +120 -6
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +228 -57
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +59 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +84 -52
- 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/metadata_validator.d.ts +4 -3
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +23 -5
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- 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 -2
- 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 +10 -6
- package/dest/services/discv5/discV5_service.js +1 -1
- package/dest/services/dummy_service.d.ts +28 -4
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +49 -1
- package/dest/services/encoding.d.ts +3 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +16 -14
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +346 -0
- package/dest/services/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/instrumentation.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +30 -72
- package/dest/services/libp2p/libp2p_service.d.ts +117 -42
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +1022 -376
- package/dest/services/peer-manager/metrics.d.ts +7 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +33 -21
- package/dest/services/peer-manager/peer_manager.d.ts +2 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +4 -12
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +32 -6
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +48 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +539 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +46 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +34 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +130 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +60 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +173 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- package/dest/services/reqresp/interface.d.ts +13 -2
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +16 -2
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -21
- package/dest/services/reqresp/protocols/auth.d.ts +2 -2
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/auth.js +2 -2
- package/dest/services/reqresp/protocols/block.d.ts +1 -1
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block.js +3 -2
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
- 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 +27 -9
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +30 -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 +60 -14
- package/dest/services/reqresp/protocols/status.d.ts +5 -4
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +7 -3
- package/dest/services/reqresp/protocols/tx.d.ts +8 -3
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/reqresp.d.ts +6 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +473 -51
- package/dest/services/service.d.ts +56 -4
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +22 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +56 -2
- package/dest/services/tx_collection/fast_tx_collection.d.ts +10 -6
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +71 -44
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +90 -0
- package/dest/services/tx_collection/index.d.ts +3 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +2 -0
- 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 +11 -13
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +9 -4
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +60 -26
- package/dest/services/tx_collection/tx_collection.d.ts +31 -17
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +79 -7
- package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +26 -29
- package/dest/services/tx_collection/tx_source.d.ts +8 -3
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +19 -2
- package/dest/services/tx_file_store/config.d.ts +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +152 -0
- package/dest/services/tx_provider.d.ts +7 -5
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +20 -10
- package/dest/services/tx_provider_instrumentation.d.ts +5 -2
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +14 -14
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +1 -2
- package/dest/test-helpers/mock-pubsub.d.ts +30 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +105 -4
- package/dest/test-helpers/mock-tx-helpers.js +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +4 -3
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +163 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +366 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +225 -130
- package/dest/testbench/worker_client_manager.d.ts +51 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +226 -39
- package/dest/util.d.ts +2 -2
- package/dest/util.d.ts.map +1 -1
- package/package.json +18 -18
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +85 -43
- package/src/client/interface.ts +73 -36
- package/src/client/p2p_client.ts +273 -381
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +345 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +59 -29
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +510 -78
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +614 -322
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +22 -15
- package/src/mem_pools/index.ts +4 -1
- package/src/mem_pools/instrumentation.ts +39 -14
- package/src/mem_pools/interface.ts +5 -7
- package/src/mem_pools/tx_pool/README.md +270 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +367 -371
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
- package/src/mem_pools/tx_pool/index.ts +0 -1
- package/src/mem_pools/tx_pool/priority.ts +8 -1
- package/src/mem_pools/tx_pool/tx_pool.ts +11 -5
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +23 -17
- package/src/mem_pools/tx_pool_v2/README.md +275 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +297 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1083 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +37 -22
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +21 -18
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
- package/src/msg_validators/tx_validator/README.md +115 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
- package/src/msg_validators/tx_validator/data_validator.ts +18 -6
- package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
- package/src/msg_validators/tx_validator/factory.ts +375 -57
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +106 -54
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +19 -8
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/test_utils.ts +1 -1
- package/src/msg_validators/tx_validator/timestamp_validator.ts +30 -19
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +1 -1
- package/src/services/dummy_service.ts +65 -2
- package/src/services/encoding.ts +13 -12
- package/src/services/gossipsub/README.md +641 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +487 -0
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +32 -73
- package/src/services/libp2p/libp2p_service.ts +716 -386
- package/src/services/peer-manager/metrics.ts +39 -21
- package/src/services/peer-manager/peer_manager.ts +5 -4
- package/src/services/peer-manager/peer_scoring.ts +28 -4
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +678 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +53 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +161 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +244 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/interface.ts +30 -2
- package/src/services/reqresp/metrics.ts +36 -27
- package/src/services/reqresp/protocols/auth.ts +2 -2
- package/src/services/reqresp/protocols/block.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +75 -10
- package/src/services/reqresp/protocols/status.ts +16 -12
- package/src/services/reqresp/protocols/tx.ts +23 -2
- package/src/services/reqresp/reqresp.ts +82 -23
- package/src/services/service.ts +73 -5
- package/src/services/tx_collection/config.ts +84 -2
- package/src/services/tx_collection/fast_tx_collection.ts +96 -49
- package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
- package/src/services/tx_collection/file_store_tx_source.ts +117 -0
- package/src/services/tx_collection/index.ts +6 -0
- package/src/services/tx_collection/instrumentation.ts +11 -13
- package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
- package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
- package/src/services/tx_collection/slow_tx_collection.ts +69 -36
- package/src/services/tx_collection/tx_collection.ts +122 -24
- package/src/services/tx_collection/tx_collection_sink.ts +30 -34
- package/src/services/tx_collection/tx_source.ts +22 -3
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +175 -0
- package/src/services/tx_provider.ts +29 -12
- package/src/services/tx_provider_instrumentation.ts +24 -14
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/make-test-p2p-clients.ts +3 -5
- package/src/test-helpers/mock-pubsub.ts +147 -10
- package/src/test-helpers/mock-tx-helpers.ts +1 -1
- package/src/test-helpers/reqresp-nodes.ts +5 -7
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +430 -0
- package/src/testbench/p2p_client_testbench_worker.ts +350 -128
- package/src/testbench/worker_client_manager.ts +304 -42
- package/src/util.ts +7 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -37
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -213
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -30
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -219
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -238
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
- package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/index.js +0 -1
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -298
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -287
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -283
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
package/src/client/p2p_client.ts
CHANGED
|
@@ -1,58 +1,59 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
|
|
2
|
+
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
3
|
+
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { RunningPromise } from '@aztec/foundation/promise';
|
|
4
6
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
5
|
-
import type { AztecAsyncKVStore,
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
|
|
8
|
+
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
9
|
+
import {
|
|
10
|
+
type CheckpointId,
|
|
11
|
+
type EthAddress,
|
|
12
|
+
type L2Block,
|
|
13
|
+
type L2BlockId,
|
|
14
|
+
type L2BlockSource,
|
|
11
15
|
L2BlockStream,
|
|
12
|
-
L2BlockStreamEvent,
|
|
13
|
-
L2Tips,
|
|
14
|
-
|
|
16
|
+
type L2BlockStreamEvent,
|
|
17
|
+
type L2Tips,
|
|
18
|
+
type L2TipsStore,
|
|
15
19
|
} from '@aztec/stdlib/block';
|
|
16
20
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
17
21
|
import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
18
22
|
import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
|
|
19
|
-
import {
|
|
20
|
-
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
21
|
-
import {
|
|
22
|
-
Attributes,
|
|
23
|
-
type TelemetryClient,
|
|
24
|
-
TraceableL2BlockStream,
|
|
25
|
-
WithTracer,
|
|
26
|
-
getTelemetryClient,
|
|
27
|
-
trackSpan,
|
|
28
|
-
} from '@aztec/telemetry-client';
|
|
23
|
+
import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
|
|
24
|
+
import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
25
|
+
import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
29
26
|
|
|
30
27
|
import type { PeerId } from '@libp2p/interface';
|
|
31
28
|
import type { ENR } from '@nethermindeth/enr';
|
|
32
29
|
|
|
33
30
|
import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
|
|
34
|
-
import
|
|
31
|
+
import { TxPoolError } from '../errors/tx-pool.error.js';
|
|
32
|
+
import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
35
33
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
36
|
-
import type {
|
|
34
|
+
import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
|
|
37
35
|
import type { AuthRequest, StatusMessage } from '../services/index.js';
|
|
38
36
|
import {
|
|
39
37
|
ReqRespSubProtocol,
|
|
40
38
|
type ReqRespSubProtocolHandler,
|
|
41
39
|
type ReqRespSubProtocolValidators,
|
|
42
40
|
} from '../services/reqresp/interface.js';
|
|
43
|
-
import {
|
|
44
|
-
|
|
41
|
+
import type {
|
|
42
|
+
DuplicateAttestationInfo,
|
|
43
|
+
DuplicateProposalInfo,
|
|
44
|
+
P2PBlockReceivedCallback,
|
|
45
|
+
P2PCheckpointReceivedCallback,
|
|
46
|
+
P2PService,
|
|
47
|
+
} from '../services/service.js';
|
|
45
48
|
import { TxCollection } from '../services/tx_collection/tx_collection.js';
|
|
49
|
+
import type { TxFileStore } from '../services/tx_file_store/tx_file_store.js';
|
|
46
50
|
import { TxProvider } from '../services/tx_provider.js';
|
|
47
51
|
import { type P2P, P2PClientState, type P2PSyncState } from './interface.js';
|
|
48
52
|
|
|
49
53
|
/**
|
|
50
54
|
* The P2P client implementation.
|
|
51
55
|
*/
|
|
52
|
-
export class P2PClient
|
|
53
|
-
extends WithTracer
|
|
54
|
-
implements P2P, P2P<P2PClientType.Prover>
|
|
55
|
-
{
|
|
56
|
+
export class P2PClient extends WithTracer implements P2P {
|
|
56
57
|
/** The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped. */
|
|
57
58
|
private runningPromise!: Promise<void>;
|
|
58
59
|
|
|
@@ -63,14 +64,11 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
63
64
|
private provenBlockNumberAtStart = -1;
|
|
64
65
|
private finalizedBlockNumberAtStart = -1;
|
|
65
66
|
|
|
66
|
-
private
|
|
67
|
-
private synchedLatestBlockNumber: AztecAsyncSingleton<number>;
|
|
68
|
-
private synchedProvenBlockNumber: AztecAsyncSingleton<number>;
|
|
69
|
-
private synchedFinalizedBlockNumber: AztecAsyncSingleton<number>;
|
|
67
|
+
private l2Tips: L2TipsStore;
|
|
70
68
|
private synchedLatestSlot: AztecAsyncSingleton<bigint>;
|
|
71
69
|
|
|
72
|
-
private txPool:
|
|
73
|
-
private attestationPool:
|
|
70
|
+
private txPool: TxPoolV2;
|
|
71
|
+
private attestationPool: AttestationPoolApi;
|
|
74
72
|
|
|
75
73
|
private config: P2PConfig;
|
|
76
74
|
|
|
@@ -80,21 +78,20 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
80
78
|
|
|
81
79
|
private validatorAddresses: EthAddress[] = [];
|
|
82
80
|
|
|
83
|
-
/**
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
* @param log - A logger.
|
|
90
|
-
*/
|
|
81
|
+
/** Tracks the last slot for which we called prepareForSlot */
|
|
82
|
+
private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
|
|
83
|
+
|
|
84
|
+
/** Polls for slot changes and calls prepareForSlot on the tx pool */
|
|
85
|
+
private slotMonitor: RunningPromise | undefined;
|
|
86
|
+
|
|
91
87
|
constructor(
|
|
92
|
-
_clientType: T,
|
|
93
88
|
private store: AztecAsyncKVStore,
|
|
94
89
|
private l2BlockSource: L2BlockSource & ContractDataSource,
|
|
95
|
-
mempools: MemPools
|
|
90
|
+
mempools: MemPools,
|
|
96
91
|
private p2pService: P2PService,
|
|
97
92
|
private txCollection: TxCollection,
|
|
93
|
+
private txFileStore: TxFileStore | undefined,
|
|
94
|
+
private epochCache: EpochCacheInterface,
|
|
98
95
|
config: Partial<P2PConfig> = {},
|
|
99
96
|
private _dateProvider: DateProvider = new DateProvider(),
|
|
100
97
|
private telemetry: TelemetryClient = getTelemetryClient(),
|
|
@@ -104,7 +101,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
104
101
|
|
|
105
102
|
this.config = { ...getP2PDefaultConfig(), ...config };
|
|
106
103
|
this.txPool = mempools.txPool;
|
|
107
|
-
this.attestationPool = mempools.attestationPool
|
|
104
|
+
this.attestationPool = mempools.attestationPool;
|
|
108
105
|
|
|
109
106
|
this.txProvider = new TxProvider(
|
|
110
107
|
this.txCollection,
|
|
@@ -115,7 +112,8 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
115
112
|
);
|
|
116
113
|
|
|
117
114
|
// Default to collecting all txs when we see a valid proposal
|
|
118
|
-
// This can be overridden by the validator client to
|
|
115
|
+
// This can be overridden by the validator client to validate, and it will call getTxsForBlockProposal on its own
|
|
116
|
+
// Note: Validators do NOT attest to individual blocks - attestations are only for checkpoint proposals.
|
|
119
117
|
// TODO(palla/txs): We should not trigger a request for txs on a proposal before fully validating it. We need to bring
|
|
120
118
|
// validator-client code into here so we can validate a proposal is reasonable.
|
|
121
119
|
this.registerBlockProposalHandler(async (block, sender) => {
|
|
@@ -124,21 +122,17 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
124
122
|
const constants = this.txCollection.getConstants();
|
|
125
123
|
const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(block.slotNumber + 1), constants));
|
|
126
124
|
const deadline = new Date(nextSlotTimestampSeconds * 1000);
|
|
127
|
-
const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.
|
|
125
|
+
const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.blockHeader.lastArchive.root);
|
|
128
126
|
if (!parentBlock) {
|
|
129
127
|
this.log.debug(`Cannot collect txs for proposal as parent block not found`);
|
|
130
|
-
return;
|
|
128
|
+
return false;
|
|
131
129
|
}
|
|
132
|
-
const blockNumber = parentBlock.getBlockNumber() + 1;
|
|
130
|
+
const blockNumber = BlockNumber(parentBlock.getBlockNumber() + 1);
|
|
133
131
|
await this.txProvider.getTxsForBlockProposal(block, blockNumber, { pinnedPeer: sender, deadline });
|
|
134
|
-
return
|
|
132
|
+
return true;
|
|
135
133
|
});
|
|
136
134
|
|
|
137
|
-
|
|
138
|
-
this.synchedBlockHashes = store.openMap('p2p_pool_block_hashes');
|
|
139
|
-
this.synchedLatestBlockNumber = store.openSingleton('p2p_pool_last_l2_block');
|
|
140
|
-
this.synchedProvenBlockNumber = store.openSingleton('p2p_pool_last_proven_l2_block');
|
|
141
|
-
this.synchedFinalizedBlockNumber = store.openSingleton('p2p_pool_last_finalized_l2_block');
|
|
135
|
+
this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
|
|
142
136
|
this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
|
|
143
137
|
}
|
|
144
138
|
|
|
@@ -163,96 +157,61 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
163
157
|
return Promise.resolve(this.p2pService.getPeers(includePending));
|
|
164
158
|
}
|
|
165
159
|
|
|
166
|
-
public
|
|
167
|
-
return this.
|
|
160
|
+
public getGossipMeshPeerCount(topicType: TopicType): Promise<number> {
|
|
161
|
+
return Promise.resolve(this.p2pService.getGossipMeshPeerCount(topicType));
|
|
168
162
|
}
|
|
169
163
|
|
|
170
|
-
public
|
|
171
|
-
this.
|
|
172
|
-
this.p2pService.updateConfig(config);
|
|
173
|
-
return Promise.resolve();
|
|
164
|
+
public getL2BlockHash(number: BlockNumber): Promise<string | undefined> {
|
|
165
|
+
return this.l2Tips.getL2BlockHash(number);
|
|
174
166
|
}
|
|
175
167
|
|
|
176
|
-
public async
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
const provenBlockNumber = await this.getSyncedProvenBlockNum();
|
|
181
|
-
let provenBlockHash: string | undefined;
|
|
182
|
-
|
|
183
|
-
const finalizedBlockNumber = await this.getSyncedFinalizedBlockNum();
|
|
184
|
-
let finalizedBlockHash: string | undefined;
|
|
185
|
-
|
|
186
|
-
if (latestBlockNumber > 0) {
|
|
187
|
-
latestBlockHash = await this.synchedBlockHashes.getAsync(latestBlockNumber);
|
|
188
|
-
if (typeof latestBlockHash === 'undefined') {
|
|
189
|
-
throw new Error(`Block hash for latest block ${latestBlockNumber} not found in p2p client`);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if (provenBlockNumber > 0) {
|
|
194
|
-
provenBlockHash = await this.synchedBlockHashes.getAsync(provenBlockNumber);
|
|
195
|
-
if (typeof provenBlockHash === 'undefined') {
|
|
196
|
-
throw new Error(`Block hash for proven block ${provenBlockNumber} not found in p2p client`);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
if (finalizedBlockNumber > 0) {
|
|
201
|
-
finalizedBlockHash = await this.synchedBlockHashes.getAsync(finalizedBlockNumber);
|
|
202
|
-
if (typeof finalizedBlockHash === 'undefined') {
|
|
203
|
-
throw new Error(`Block hash for finalized block ${finalizedBlockNumber} not found in p2p client`);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
168
|
+
public async updateP2PConfig(config: Partial<P2PConfig>): Promise<void> {
|
|
169
|
+
await this.txPool.updateConfig(config);
|
|
170
|
+
this.p2pService.updateConfig(config);
|
|
171
|
+
}
|
|
206
172
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
proven: { hash: provenBlockHash!, number: provenBlockNumber },
|
|
210
|
-
finalized: { hash: finalizedBlockHash!, number: finalizedBlockNumber },
|
|
211
|
-
};
|
|
173
|
+
public getL2Tips(): Promise<L2Tips> {
|
|
174
|
+
return this.l2Tips.getL2Tips();
|
|
212
175
|
}
|
|
213
176
|
|
|
214
177
|
public async handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
|
|
215
178
|
this.log.debug(`Handling block stream event ${event.type}`);
|
|
179
|
+
|
|
216
180
|
switch (event.type) {
|
|
217
181
|
case 'blocks-added':
|
|
218
182
|
await this.handleLatestL2Blocks(event.blocks);
|
|
219
183
|
break;
|
|
220
184
|
case 'chain-finalized': {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
const from = (await this.getSyncedFinalizedBlockNum()) + 1;
|
|
185
|
+
const oldFinalizedBlockNum = await this.getSyncedFinalizedBlockNum();
|
|
186
|
+
const from = BlockNumber(oldFinalizedBlockNum + 1);
|
|
224
187
|
const limit = event.block.number - from + 1;
|
|
225
188
|
if (limit > 0) {
|
|
226
|
-
|
|
189
|
+
const oldBlocks = await this.l2BlockSource.getBlocks(from, limit);
|
|
190
|
+
await this.handleFinalizedL2Blocks(oldBlocks);
|
|
227
191
|
}
|
|
228
192
|
break;
|
|
229
193
|
}
|
|
230
|
-
case 'chain-proven':
|
|
231
|
-
await this.setBlockHash(event.block);
|
|
194
|
+
case 'chain-proven':
|
|
232
195
|
this.txCollection.stopCollectingForBlocksUpTo(event.block.number);
|
|
233
|
-
await this.synchedProvenBlockNumber.set(event.block.number);
|
|
234
196
|
break;
|
|
235
|
-
}
|
|
236
197
|
case 'chain-pruned':
|
|
237
|
-
await this.setBlockHash(event.block);
|
|
238
198
|
this.txCollection.stopCollectingForBlocksAfter(event.block.number);
|
|
239
|
-
await this.handlePruneL2Blocks(event.block.
|
|
199
|
+
await this.handlePruneL2Blocks(event.block, event.checkpoint);
|
|
200
|
+
break;
|
|
201
|
+
case 'chain-checkpointed':
|
|
240
202
|
break;
|
|
241
203
|
default: {
|
|
242
204
|
const _: never = event;
|
|
243
205
|
break;
|
|
244
206
|
}
|
|
245
207
|
}
|
|
246
|
-
}
|
|
247
208
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
209
|
+
// Pass the event through to our l2 tips store
|
|
210
|
+
await this.l2Tips.handleBlockStreamEvent(event);
|
|
211
|
+
await this.startServiceIfSynched();
|
|
252
212
|
}
|
|
253
213
|
|
|
254
214
|
#assertIsReady() {
|
|
255
|
-
// this.log.info('Checking if p2p client is ready, current state: ', this.currentState);
|
|
256
215
|
if (!this.isReady()) {
|
|
257
216
|
throw new Error('P2P client not ready');
|
|
258
217
|
}
|
|
@@ -270,22 +229,22 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
270
229
|
return this.syncPromise;
|
|
271
230
|
}
|
|
272
231
|
|
|
232
|
+
// Start the tx pool first, as it needs to hydrate state from persistence
|
|
233
|
+
await this.txPool.start();
|
|
234
|
+
|
|
273
235
|
// get the current latest block numbers
|
|
274
236
|
const latestBlockNumbers = await this.l2BlockSource.getL2Tips();
|
|
275
|
-
this.latestBlockNumberAtStart = latestBlockNumbers.
|
|
276
|
-
this.provenBlockNumberAtStart = latestBlockNumbers.proven.number;
|
|
277
|
-
this.finalizedBlockNumberAtStart = latestBlockNumbers.finalized.number;
|
|
237
|
+
this.latestBlockNumberAtStart = latestBlockNumbers.proposed.number;
|
|
238
|
+
this.provenBlockNumberAtStart = latestBlockNumbers.proven.block.number;
|
|
239
|
+
this.finalizedBlockNumberAtStart = latestBlockNumbers.finalized.block.number;
|
|
278
240
|
|
|
279
241
|
const syncedLatestBlock = (await this.getSyncedLatestBlockNum()) + 1;
|
|
280
242
|
const syncedProvenBlock = (await this.getSyncedProvenBlockNum()) + 1;
|
|
281
243
|
const syncedFinalizedBlock = (await this.getSyncedFinalizedBlockNum()) + 1;
|
|
282
244
|
|
|
283
|
-
if (
|
|
284
|
-
(await this.txPool.isEmpty()) &&
|
|
285
|
-
(this.attestationPool === undefined || (await this.attestationPool?.isEmpty()))
|
|
286
|
-
) {
|
|
245
|
+
if ((await this.txPool.isEmpty()) && (await this.attestationPool.isEmpty())) {
|
|
287
246
|
// if mempools are empty, we don't care about syncing prior blocks
|
|
288
|
-
this.initBlockStream(this.latestBlockNumberAtStart);
|
|
247
|
+
this.initBlockStream(BlockNumber(this.latestBlockNumberAtStart));
|
|
289
248
|
this.setCurrentState(P2PClientState.RUNNING);
|
|
290
249
|
this.syncPromise = Promise.resolve();
|
|
291
250
|
await this.p2pService.start();
|
|
@@ -322,6 +281,16 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
322
281
|
|
|
323
282
|
this.blockStream!.start();
|
|
324
283
|
await this.txCollection.start();
|
|
284
|
+
this.txFileStore?.start();
|
|
285
|
+
|
|
286
|
+
// Start slot monitor to call prepareForSlot when the slot changes
|
|
287
|
+
this.slotMonitor = new RunningPromise(
|
|
288
|
+
() => this.maybeCallPrepareForSlot(),
|
|
289
|
+
this.log,
|
|
290
|
+
this.config.slotCheckIntervalMS,
|
|
291
|
+
);
|
|
292
|
+
this.slotMonitor.start();
|
|
293
|
+
|
|
325
294
|
return this.syncPromise;
|
|
326
295
|
}
|
|
327
296
|
|
|
@@ -333,15 +302,13 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
333
302
|
return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
|
|
334
303
|
}
|
|
335
304
|
|
|
336
|
-
private initBlockStream(startingBlock?:
|
|
305
|
+
private initBlockStream(startingBlock?: BlockNumber) {
|
|
337
306
|
if (!this.blockStream) {
|
|
338
307
|
const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
|
|
339
|
-
this.blockStream = new
|
|
308
|
+
this.blockStream = new L2BlockStream(
|
|
340
309
|
this.l2BlockSource,
|
|
341
310
|
this,
|
|
342
311
|
this,
|
|
343
|
-
this.telemetry.getTracer('P2PL2BlockStream'),
|
|
344
|
-
'P2PL2BlockStream',
|
|
345
312
|
createLogger(`${this.log.module}:l2-block-stream`),
|
|
346
313
|
{ batchSize, pollIntervalMS, startingBlock },
|
|
347
314
|
);
|
|
@@ -354,12 +321,18 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
354
321
|
*/
|
|
355
322
|
public async stop() {
|
|
356
323
|
this.log.debug('Stopping p2p client...');
|
|
324
|
+
await this.slotMonitor?.stop();
|
|
325
|
+
this.log.debug('Stopped slot monitor');
|
|
357
326
|
await tryStop(this.txCollection);
|
|
358
327
|
this.log.debug('Stopped tx collection service');
|
|
328
|
+
await this.txFileStore?.stop();
|
|
329
|
+
this.log.debug('Stopped tx file store');
|
|
359
330
|
await this.p2pService.stop();
|
|
360
331
|
this.log.debug('Stopped p2p service');
|
|
361
332
|
await this.blockStream?.stop();
|
|
362
333
|
this.log.debug('Stopped block downloader');
|
|
334
|
+
await this.txPool.stop();
|
|
335
|
+
this.log.debug('Stopped tx pool');
|
|
363
336
|
await this.runningPromise;
|
|
364
337
|
this.setCurrentState(P2PClientState.STOPPED);
|
|
365
338
|
this.log.info('P2P client stopped');
|
|
@@ -376,30 +349,59 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
376
349
|
[Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
|
|
377
350
|
[Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
|
|
378
351
|
}))
|
|
379
|
-
public broadcastProposal(proposal: BlockProposal): Promise<void> {
|
|
352
|
+
public async broadcastProposal(proposal: BlockProposal): Promise<void> {
|
|
380
353
|
this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber} to peers`);
|
|
354
|
+
// Store our own proposal so we can respond to req/resp requests for it
|
|
355
|
+
const { count } = await this.attestationPool.tryAddBlockProposal(proposal);
|
|
356
|
+
if (count > 1) {
|
|
357
|
+
if (this.config.broadcastEquivocatedProposals) {
|
|
358
|
+
this.log.warn(`Broadcasting equivocated block proposal for slot ${proposal.slotNumber}`, {
|
|
359
|
+
slot: proposal.slotNumber,
|
|
360
|
+
archive: proposal.archive.toString(),
|
|
361
|
+
count,
|
|
362
|
+
});
|
|
363
|
+
} else {
|
|
364
|
+
throw new Error(`Attempted to broadcast a duplicate block proposal for slot ${proposal.slotNumber}`);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
381
367
|
return this.p2pService.propagate(proposal);
|
|
382
368
|
}
|
|
383
369
|
|
|
384
|
-
|
|
385
|
-
|
|
370
|
+
@trackSpan('p2pClient.broadcastCheckpointProposal', async proposal => ({
|
|
371
|
+
[Attributes.SLOT_NUMBER]: proposal.slotNumber,
|
|
372
|
+
[Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
|
|
373
|
+
[Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
|
|
374
|
+
}))
|
|
375
|
+
public async broadcastCheckpointProposal(proposal: CheckpointProposal): Promise<void> {
|
|
376
|
+
this.log.verbose(`Broadcasting checkpoint proposal for slot ${proposal.slotNumber} to peers`);
|
|
377
|
+
const blockProposal = proposal.getBlockProposal();
|
|
378
|
+
if (blockProposal) {
|
|
379
|
+
// Store our own last-block proposal so we can respond to req/resp requests for it.
|
|
380
|
+
await this.attestationPool.tryAddBlockProposal(blockProposal);
|
|
381
|
+
}
|
|
382
|
+
return this.p2pService.propagate(proposal);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
public async broadcastCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
|
|
386
|
+
this.log.verbose(`Broadcasting ${attestations.length} checkpoint attestations to peers`);
|
|
386
387
|
await Promise.all(attestations.map(att => this.p2pService.propagate(att)));
|
|
387
388
|
}
|
|
388
389
|
|
|
389
|
-
public async
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
390
|
+
public async getCheckpointAttestationsForSlot(
|
|
391
|
+
slot: SlotNumber,
|
|
392
|
+
proposalId?: string,
|
|
393
|
+
): Promise<CheckpointAttestation[]> {
|
|
394
|
+
return await (proposalId
|
|
395
|
+
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalId)
|
|
396
|
+
: this.attestationPool.getCheckpointAttestationsForSlot(slot));
|
|
395
397
|
}
|
|
396
398
|
|
|
397
|
-
public
|
|
398
|
-
return this.attestationPool
|
|
399
|
+
public addOwnCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
|
|
400
|
+
return this.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
399
401
|
}
|
|
400
402
|
|
|
401
|
-
public
|
|
402
|
-
return this.attestationPool
|
|
403
|
+
public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
|
|
404
|
+
return this.attestationPool.hasBlockProposalsForSlot(slot);
|
|
403
405
|
}
|
|
404
406
|
|
|
405
407
|
// REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
@@ -408,109 +410,61 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
408
410
|
this.p2pService.registerBlockReceivedCallback(handler);
|
|
409
411
|
}
|
|
410
412
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
*/
|
|
414
|
-
public async requestTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<Tx[]> {
|
|
415
|
-
const timeoutMs = 8000; // Longer timeout for now
|
|
416
|
-
const maxRetryAttempts = 10; // Keep retrying within the timeout
|
|
417
|
-
const requests = chunkTxHashesRequest(txHashes);
|
|
418
|
-
const maxPeers = Math.min(Math.ceil(requests.length / 3), 10);
|
|
419
|
-
|
|
420
|
-
const txBatches = await this.p2pService.sendBatchRequest(
|
|
421
|
-
ReqRespSubProtocol.TX,
|
|
422
|
-
requests,
|
|
423
|
-
pinnedPeerId,
|
|
424
|
-
timeoutMs,
|
|
425
|
-
maxPeers,
|
|
426
|
-
maxRetryAttempts,
|
|
427
|
-
);
|
|
428
|
-
|
|
429
|
-
const txs = txBatches.flat();
|
|
430
|
-
if (txs.length > 0) {
|
|
431
|
-
await this.txPool.addTxs(txs);
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
const txHashesStr = txHashes.map(tx => tx.toString()).join(', ');
|
|
435
|
-
this.log.debug(`Requested txs ${txHashesStr} (${txs.length} / ${txHashes.length}) from peers`);
|
|
436
|
-
|
|
437
|
-
// We return all transactions, even the not found ones to the caller, such they can handle missing items themselves.
|
|
438
|
-
return txs;
|
|
413
|
+
public registerCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
414
|
+
this.p2pService.registerCheckpointReceivedCallback(handler);
|
|
439
415
|
}
|
|
440
416
|
|
|
441
|
-
public
|
|
442
|
-
|
|
417
|
+
public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
|
|
418
|
+
this.p2pService.registerDuplicateProposalCallback(callback);
|
|
443
419
|
}
|
|
444
420
|
|
|
445
|
-
public
|
|
446
|
-
|
|
421
|
+
public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
|
|
422
|
+
this.p2pService.registerDuplicateAttestationCallback(callback);
|
|
447
423
|
}
|
|
448
424
|
|
|
449
|
-
public async
|
|
450
|
-
for (const txHash of await this.txPool.getPendingTxHashes()) {
|
|
451
|
-
const tx = await this.txPool.getTxByHash(txHash);
|
|
452
|
-
if (tx) {
|
|
453
|
-
yield tx;
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
/**
|
|
459
|
-
* Returns all transactions in the transaction pool.
|
|
460
|
-
* @param filter - The type of txs to return
|
|
461
|
-
* @param limit - How many txs to return
|
|
462
|
-
* @param after - If paginating, the last known tx hash. Will return txs after this hash
|
|
463
|
-
* @returns An array of Txs.
|
|
464
|
-
*/
|
|
465
|
-
public async getTxs(filter: 'all' | 'pending' | 'mined', limit?: number, after?: TxHash): Promise<Tx[]> {
|
|
425
|
+
public async getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]> {
|
|
466
426
|
if (limit !== undefined && limit <= 0) {
|
|
467
427
|
throw new TypeError('limit must be greater than 0');
|
|
468
428
|
}
|
|
469
429
|
|
|
470
|
-
let
|
|
471
|
-
let txHashes: TxHash[];
|
|
472
|
-
|
|
473
|
-
if (filter === 'all') {
|
|
474
|
-
txs = await this.txPool.getAllTxs();
|
|
475
|
-
txHashes = await Promise.all(txs.map(tx => tx.getTxHash()));
|
|
476
|
-
} else if (filter === 'mined') {
|
|
477
|
-
const minedTxHashes = await this.txPool.getMinedTxHashes();
|
|
478
|
-
txHashes = minedTxHashes.map(([txHash]) => txHash);
|
|
479
|
-
} else if (filter === 'pending') {
|
|
480
|
-
txHashes = await this.txPool.getPendingTxHashes();
|
|
481
|
-
} else {
|
|
482
|
-
const _: never = filter;
|
|
483
|
-
throw new Error(`Unknown filter ${filter}`);
|
|
484
|
-
}
|
|
430
|
+
let txHashes = await this.txPool.getPendingTxHashes();
|
|
485
431
|
|
|
486
432
|
let startIndex = 0;
|
|
487
|
-
let endIndex: number | undefined = undefined;
|
|
488
|
-
|
|
489
433
|
if (after) {
|
|
490
434
|
startIndex = txHashes.findIndex(txHash => after.equals(txHash));
|
|
491
|
-
|
|
492
|
-
// if we can't find the last tx in our set then return an empty array as pagination is no longer valid.
|
|
493
435
|
if (startIndex === -1) {
|
|
494
436
|
return [];
|
|
495
437
|
}
|
|
496
|
-
|
|
497
|
-
// increment by one because we don't want to return the same tx again
|
|
498
438
|
startIndex++;
|
|
499
439
|
}
|
|
500
440
|
|
|
501
|
-
|
|
502
|
-
endIndex = startIndex + limit;
|
|
503
|
-
}
|
|
504
|
-
|
|
441
|
+
const endIndex = limit !== undefined ? startIndex + limit : undefined;
|
|
505
442
|
txHashes = txHashes.slice(startIndex, endIndex);
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
443
|
+
|
|
444
|
+
const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
|
|
445
|
+
return maybeTxs.filter((tx): tx is Tx => !!tx);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
public getPendingTxCount(): Promise<number> {
|
|
449
|
+
return this.txPool.getPendingTxCount();
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
public async *iteratePendingTxs(): AsyncIterableIterator<Tx> {
|
|
453
|
+
for (const txHash of await this.txPool.getPendingTxHashes()) {
|
|
454
|
+
const tx = await this.txPool.getTxByHash(txHash);
|
|
455
|
+
if (tx) {
|
|
456
|
+
yield tx;
|
|
457
|
+
}
|
|
511
458
|
}
|
|
459
|
+
}
|
|
512
460
|
|
|
513
|
-
|
|
461
|
+
public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
|
|
462
|
+
for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
|
|
463
|
+
const tx = await this.txPool.getTxByHash(txHash);
|
|
464
|
+
if (tx) {
|
|
465
|
+
yield tx;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
514
468
|
}
|
|
515
469
|
|
|
516
470
|
/**
|
|
@@ -535,49 +489,6 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
535
489
|
return this.txPool.hasTxs(txHashes);
|
|
536
490
|
}
|
|
537
491
|
|
|
538
|
-
/**
|
|
539
|
-
* Returns transactions in the transaction pool by hash.
|
|
540
|
-
* If a transaction is not in the pool, it will be requested from the network.
|
|
541
|
-
* @param txHashes - Hashes of the transactions to look for.
|
|
542
|
-
* @returns The txs found, or undefined if not found in the order requested.
|
|
543
|
-
*/
|
|
544
|
-
async getTxsByHash(txHashes: TxHash[], pinnedPeerId: PeerId | undefined): Promise<(Tx | undefined)[]> {
|
|
545
|
-
const txs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
|
|
546
|
-
const missingTxHashes = txs
|
|
547
|
-
.map((tx, index) => [tx, index] as const)
|
|
548
|
-
.filter(([tx, _index]) => !tx)
|
|
549
|
-
.map(([_tx, index]) => txHashes[index]);
|
|
550
|
-
|
|
551
|
-
if (missingTxHashes.length === 0) {
|
|
552
|
-
return txs as Tx[];
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
const missingTxs = await this.requestTxsByHash(missingTxHashes, pinnedPeerId);
|
|
556
|
-
// TODO: optimize
|
|
557
|
-
// Merge the found txs in order
|
|
558
|
-
const mergingTxs = txHashes.map(txHash => {
|
|
559
|
-
// Is it in the txs list from the mempool?
|
|
560
|
-
for (const tx of txs) {
|
|
561
|
-
if (tx !== undefined && tx.getTxHash().equals(txHash)) {
|
|
562
|
-
return tx;
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
// Is it in the fetched missing txs?
|
|
567
|
-
// Note: this is an O(n^2) operation, but we expect the number of missing txs to be small.
|
|
568
|
-
for (const tx of missingTxs) {
|
|
569
|
-
if (tx.getTxHash().equals(txHash)) {
|
|
570
|
-
return tx;
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
// Otherwise return undefined
|
|
575
|
-
return undefined;
|
|
576
|
-
});
|
|
577
|
-
|
|
578
|
-
return mergingTxs;
|
|
579
|
-
}
|
|
580
|
-
|
|
581
492
|
/**
|
|
582
493
|
* Returns an archived transaction in the transaction pool by its hash.
|
|
583
494
|
* @param txHash - Hash of the archived transaction to look for.
|
|
@@ -588,25 +499,28 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
588
499
|
}
|
|
589
500
|
|
|
590
501
|
/**
|
|
591
|
-
*
|
|
592
|
-
* @param tx - The tx to
|
|
502
|
+
* Accepts a transaction, adds it to local tx pool and forwards it to other peers.
|
|
503
|
+
* @param tx - The tx to send.
|
|
593
504
|
* @returns Empty promise.
|
|
594
505
|
**/
|
|
595
506
|
public async sendTx(tx: Tx): Promise<void> {
|
|
596
|
-
|
|
597
|
-
const
|
|
598
|
-
if (
|
|
507
|
+
this.#assertIsReady();
|
|
508
|
+
const result = await this.txPool.addPendingTxs([tx], { feeComparisonOnly: true });
|
|
509
|
+
if (result.accepted.length === 1) {
|
|
599
510
|
await this.p2pService.propagate(tx);
|
|
511
|
+
return;
|
|
600
512
|
}
|
|
601
|
-
}
|
|
602
513
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
514
|
+
const txHashStr = tx.getTxHash().toString();
|
|
515
|
+
const reason = result.errors?.get(txHashStr);
|
|
516
|
+
if (reason) {
|
|
517
|
+
this.log.warn(`Tx ${txHashStr} not added to pool: ${reason.message}`);
|
|
518
|
+
throw new TxPoolError(reason);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
this.log.warn(
|
|
522
|
+
`Tx ${txHashStr} not propagated: accepted=${result.accepted.length} ignored=${result.ignored.length} rejected=${result.rejected.length}`,
|
|
523
|
+
);
|
|
610
524
|
}
|
|
611
525
|
|
|
612
526
|
/**
|
|
@@ -614,8 +528,9 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
614
528
|
* @param txHash - Hash of the tx to query.
|
|
615
529
|
* @returns Pending or mined depending on its status, or undefined if not found.
|
|
616
530
|
*/
|
|
617
|
-
public getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
|
|
618
|
-
|
|
531
|
+
public async getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
|
|
532
|
+
const status = await this.txPool.getTxStatus(txHash);
|
|
533
|
+
return status === 'protected' ? 'pending' : status;
|
|
619
534
|
}
|
|
620
535
|
|
|
621
536
|
public getEnr(): ENR | undefined {
|
|
@@ -627,14 +542,12 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
627
542
|
}
|
|
628
543
|
|
|
629
544
|
/**
|
|
630
|
-
*
|
|
631
|
-
*
|
|
632
|
-
* @param txHashes - Hashes of the transactions to delete.
|
|
633
|
-
* @returns Empty promise.
|
|
545
|
+
* Handles failed transaction execution by removing txs from the pool.
|
|
546
|
+
* @param txHashes - Hashes of the transactions that failed execution.
|
|
634
547
|
**/
|
|
635
|
-
public async
|
|
548
|
+
public async handleFailedExecution(txHashes: TxHash[]): Promise<void> {
|
|
636
549
|
this.#assertIsReady();
|
|
637
|
-
await this.txPool.
|
|
550
|
+
await this.txPool.handleFailedExecution(txHashes);
|
|
638
551
|
}
|
|
639
552
|
|
|
640
553
|
/**
|
|
@@ -649,20 +562,23 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
649
562
|
* Public function to check the latest block number that the P2P client is synced to.
|
|
650
563
|
* @returns Block number of latest L2 Block we've synced with.
|
|
651
564
|
*/
|
|
652
|
-
public async getSyncedLatestBlockNum(): Promise<
|
|
653
|
-
|
|
565
|
+
public async getSyncedLatestBlockNum(): Promise<BlockNumber> {
|
|
566
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
567
|
+
return tips.proposed.number;
|
|
654
568
|
}
|
|
655
569
|
|
|
656
570
|
/**
|
|
657
571
|
* Public function to check the latest proven block number that the P2P client is synced to.
|
|
658
572
|
* @returns Block number of latest proven L2 Block we've synced with.
|
|
659
573
|
*/
|
|
660
|
-
public async getSyncedProvenBlockNum(): Promise<
|
|
661
|
-
|
|
574
|
+
public async getSyncedProvenBlockNum(): Promise<BlockNumber> {
|
|
575
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
576
|
+
return tips.proven.block.number;
|
|
662
577
|
}
|
|
663
578
|
|
|
664
|
-
public async getSyncedFinalizedBlockNum(): Promise<
|
|
665
|
-
|
|
579
|
+
public async getSyncedFinalizedBlockNum(): Promise<BlockNumber> {
|
|
580
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
581
|
+
return tips.finalized.block.number;
|
|
666
582
|
}
|
|
667
583
|
|
|
668
584
|
/** Returns latest L2 slot for which we have seen an L2 block. */
|
|
@@ -678,7 +594,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
678
594
|
const blockNumber = await this.getSyncedLatestBlockNum();
|
|
679
595
|
const blockHash =
|
|
680
596
|
blockNumber === 0
|
|
681
|
-
?
|
|
597
|
+
? GENESIS_BLOCK_HEADER_HASH.toString()
|
|
682
598
|
: await this.l2BlockSource
|
|
683
599
|
.getBlockHeader(blockNumber)
|
|
684
600
|
.then(header => header?.hash())
|
|
@@ -686,19 +602,18 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
686
602
|
|
|
687
603
|
return {
|
|
688
604
|
state: this.currentState,
|
|
689
|
-
syncedToL2Block: { number: blockNumber, hash: blockHash },
|
|
690
|
-
}
|
|
605
|
+
syncedToL2Block: { number: blockNumber, hash: blockHash! },
|
|
606
|
+
};
|
|
691
607
|
}
|
|
692
608
|
|
|
693
609
|
/**
|
|
694
|
-
*
|
|
610
|
+
* Handles mined blocks by marking the txs in them as mined.
|
|
695
611
|
* @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
|
|
696
612
|
* @returns Empty promise.
|
|
697
613
|
*/
|
|
698
|
-
private async
|
|
614
|
+
private async handleMinedBlocks(blocks: L2Block[]): Promise<void> {
|
|
699
615
|
for (const block of blocks) {
|
|
700
|
-
|
|
701
|
-
await this.txPool.markAsMined(txHashes, block.getBlockHeader());
|
|
616
|
+
await this.txPool.handleMinedBlock(block);
|
|
702
617
|
}
|
|
703
618
|
}
|
|
704
619
|
|
|
@@ -707,29 +622,16 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
707
622
|
* @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
|
|
708
623
|
* @returns Empty promise.
|
|
709
624
|
*/
|
|
710
|
-
private async handleLatestL2Blocks(blocks:
|
|
625
|
+
private async handleLatestL2Blocks(blocks: L2Block[]): Promise<void> {
|
|
711
626
|
if (!blocks.length) {
|
|
712
|
-
return
|
|
627
|
+
return;
|
|
713
628
|
}
|
|
714
629
|
|
|
715
|
-
await this.
|
|
716
|
-
await this.
|
|
717
|
-
|
|
718
|
-
const lastBlock = blocks.at(-1)
|
|
719
|
-
|
|
720
|
-
await Promise.all(
|
|
721
|
-
blocks.map(async block =>
|
|
722
|
-
this.setBlockHash({
|
|
723
|
-
number: block.block.number,
|
|
724
|
-
hash: await block.block.hash().then(h => h.toString()),
|
|
725
|
-
}),
|
|
726
|
-
),
|
|
727
|
-
);
|
|
728
|
-
|
|
729
|
-
await this.synchedLatestBlockNumber.set(lastBlock.number);
|
|
630
|
+
await this.handleMinedBlocks(blocks);
|
|
631
|
+
await this.maybeCallPrepareForSlot();
|
|
632
|
+
await this.startCollectingMissingTxs(blocks);
|
|
633
|
+
const lastBlock = blocks.at(-1)!;
|
|
730
634
|
await this.synchedLatestSlot.set(BigInt(lastBlock.header.getSlot()));
|
|
731
|
-
this.log.verbose(`Synched to latest block ${lastBlock.number}`);
|
|
732
|
-
await this.startServiceIfSynched();
|
|
733
635
|
}
|
|
734
636
|
|
|
735
637
|
/** Request txs for unproven blocks so the prover node has more chances to get them. */
|
|
@@ -768,84 +670,62 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
768
670
|
*/
|
|
769
671
|
private async handleFinalizedL2Blocks(blocks: L2Block[]): Promise<void> {
|
|
770
672
|
if (!blocks.length) {
|
|
771
|
-
return
|
|
673
|
+
return;
|
|
772
674
|
}
|
|
773
|
-
this.log.debug(`Handling finalized blocks ${blocks.length} up to ${blocks.at(-1)?.number}`);
|
|
774
|
-
|
|
775
|
-
const lastBlockNum = blocks[blocks.length - 1].number;
|
|
776
|
-
const lastBlockSlot = blocks[blocks.length - 1].header.getSlot();
|
|
777
|
-
|
|
778
|
-
const txHashes = blocks.flatMap(block => block.body.txEffects.map(txEffect => txEffect.txHash));
|
|
779
|
-
this.log.debug(`Deleting ${txHashes.length} txs from pool from finalized blocks up to ${lastBlockNum}`);
|
|
780
|
-
await this.txPool.deleteTxs(txHashes, { permanently: true });
|
|
781
|
-
await this.txPool.cleanupDeletedMinedTxs(lastBlockNum);
|
|
782
|
-
|
|
783
|
-
await this.attestationPool?.deleteAttestationsOlderThan(lastBlockSlot);
|
|
784
|
-
|
|
785
|
-
await this.synchedFinalizedBlockNumber.set(lastBlockNum);
|
|
786
|
-
this.log.debug(`Synched to finalized block ${lastBlockNum} at slot ${lastBlockSlot}`);
|
|
787
675
|
|
|
788
|
-
|
|
676
|
+
// Finalization is monotonic, so we only need to call with the last block
|
|
677
|
+
const lastBlock = blocks.at(-1)!;
|
|
678
|
+
await this.txPool.handleFinalizedBlock(lastBlock.header);
|
|
679
|
+
await this.attestationPool.deleteOlderThan(lastBlock.header.getSlot());
|
|
789
680
|
}
|
|
790
681
|
|
|
791
682
|
/**
|
|
792
683
|
* Updates the tx pool after a chain prune.
|
|
793
|
-
*
|
|
684
|
+
* Detects epoch prunes (checkpoint number changed) and deletes all txs in that case.
|
|
685
|
+
* @param latestBlock - The block ID the chain was pruned to.
|
|
686
|
+
* @param newCheckpoint - The checkpoint ID after the prune.
|
|
794
687
|
*/
|
|
795
|
-
private async handlePruneL2Blocks(latestBlock:
|
|
796
|
-
const
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
// Find transactions that reference pruned blocks in their historical header
|
|
800
|
-
for (const tx of await this.txPool.getAllTxs()) {
|
|
801
|
-
// every tx that's been generated against a block that has now been pruned is no longer valid
|
|
802
|
-
if (tx.data.constants.anchorBlockHeader.globalVariables.blockNumber > latestBlock) {
|
|
803
|
-
const txHash = tx.getTxHash();
|
|
804
|
-
txsToDelete.set(txHash.toString(), txHash);
|
|
805
|
-
}
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
this.log.info(`Detected chain prune. Removing ${txsToDelete.size} txs built against pruned blocks.`, {
|
|
809
|
-
newLatestBlock: latestBlock,
|
|
810
|
-
previousLatestBlock: await this.getSyncedLatestBlockNum(),
|
|
811
|
-
txsToDelete: Array.from(txsToDelete.keys()),
|
|
812
|
-
});
|
|
688
|
+
private async handlePruneL2Blocks(latestBlock: L2BlockId, newCheckpoint: CheckpointId): Promise<void> {
|
|
689
|
+
const deleteAllTxs = this.config.txPoolDeleteTxsAfterReorg && (await this.isEpochPrune(newCheckpoint));
|
|
690
|
+
await this.txPool.handlePrunedBlocks(latestBlock, { deleteAllTxs });
|
|
691
|
+
}
|
|
813
692
|
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
// We keep the txsToDelete out of this list as they have already been deleted above
|
|
825
|
-
if (blockNumber > latestBlock && !txsToDelete.has(txHash.toString())) {
|
|
826
|
-
minedTxsFromReorg.push(txHash);
|
|
827
|
-
}
|
|
693
|
+
/**
|
|
694
|
+
* Returns true if the prune crossed a checkpoint boundary.
|
|
695
|
+
* If the old and new checkpoint numbers are the same, the prune is within a single checkpoint.
|
|
696
|
+
* If they differ, the prune spans across checkpoints (epoch prune).
|
|
697
|
+
*/
|
|
698
|
+
private async isEpochPrune(newCheckpoint: CheckpointId): Promise<boolean> {
|
|
699
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
700
|
+
const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
|
|
701
|
+
if (oldCheckpointNumber <= CheckpointNumber.ZERO) {
|
|
702
|
+
return false;
|
|
828
703
|
}
|
|
704
|
+
const isEpochPrune = oldCheckpointNumber !== newCheckpoint.number;
|
|
705
|
+
this.log.info(
|
|
706
|
+
`Detected epoch prune: ${isEpochPrune}. Old checkpoint: ${oldCheckpointNumber}, new checkpoint: ${newCheckpoint.number}`,
|
|
707
|
+
);
|
|
708
|
+
return isEpochPrune;
|
|
709
|
+
}
|
|
829
710
|
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
await this.txPool.markMinedAsPending(minedTxsFromReorg);
|
|
711
|
+
/** Checks if the slot has changed and calls prepareForSlot if so. */
|
|
712
|
+
private async maybeCallPrepareForSlot(): Promise<void> {
|
|
713
|
+
const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
|
|
714
|
+
if (currentSlot <= this.lastSlotProcessed) {
|
|
715
|
+
return;
|
|
836
716
|
}
|
|
837
|
-
|
|
838
|
-
await this.
|
|
839
|
-
// no need to update block hashes, as they will be updated as new blocks are added
|
|
717
|
+
this.lastSlotProcessed = currentSlot;
|
|
718
|
+
await this.txPool.prepareForSlot(currentSlot);
|
|
840
719
|
}
|
|
841
720
|
|
|
842
721
|
private async startServiceIfSynched() {
|
|
843
722
|
if (this.currentState !== P2PClientState.SYNCHING) {
|
|
844
723
|
return;
|
|
845
724
|
}
|
|
846
|
-
const
|
|
847
|
-
const
|
|
848
|
-
const
|
|
725
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
726
|
+
const syncedFinalizedBlock = tips.finalized.block.number;
|
|
727
|
+
const syncedProvenBlock = tips.proven.block.number;
|
|
728
|
+
const syncedLatestBlock = tips.proposed.number;
|
|
849
729
|
|
|
850
730
|
if (
|
|
851
731
|
syncedLatestBlock >= this.latestBlockNumberAtStart &&
|
|
@@ -875,16 +755,28 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
875
755
|
this.log.debug(`Moved from state ${P2PClientState[oldState]} to ${P2PClientState[this.currentState]}`);
|
|
876
756
|
}
|
|
877
757
|
|
|
878
|
-
public
|
|
879
|
-
return this.p2pService.
|
|
758
|
+
public validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void> {
|
|
759
|
+
return this.p2pService.validateTxsReceivedInBlockProposal(txs);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
/**
|
|
763
|
+
* Protects existing transactions by hash for a given slot.
|
|
764
|
+
* Returns hashes of transactions that weren't found in the pool.
|
|
765
|
+
* @param txHashes - Hashes of the transactions to protect.
|
|
766
|
+
* @param blockHeader - The block header providing slot context.
|
|
767
|
+
* @returns Hashes of transactions not found in the pool.
|
|
768
|
+
*/
|
|
769
|
+
public protectTxs(txHashes: TxHash[], blockHeader: BlockHeader): Promise<TxHash[]> {
|
|
770
|
+
return this.txPool.protectTxs(txHashes, blockHeader);
|
|
880
771
|
}
|
|
881
772
|
|
|
882
773
|
/**
|
|
883
|
-
*
|
|
884
|
-
*
|
|
774
|
+
* Prepares the pool for a new slot.
|
|
775
|
+
* Unprotects transactions from earlier slots and validates them.
|
|
776
|
+
* @param slotNumber - The slot number to prepare for
|
|
885
777
|
*/
|
|
886
|
-
public
|
|
887
|
-
|
|
778
|
+
public async prepareForSlot(slotNumber: SlotNumber): Promise<void> {
|
|
779
|
+
await this.txPool.prepareForSlot(slotNumber);
|
|
888
780
|
}
|
|
889
781
|
|
|
890
782
|
public handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage> {
|