@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.017a351
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 +129 -3
- package/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +34 -13
- package/dest/client/factory.d.ts +23 -12
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +106 -26
- package/dest/client/index.d.ts +2 -1
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +1 -0
- package/dest/client/interface.d.ts +192 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +9 -0
- package/dest/client/p2p_client.d.ts +97 -221
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +818 -289
- package/dest/config.d.ts +235 -133
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +295 -36
- package/dest/enr/generate-enr.d.ts +11 -3
- package/dest/enr/generate-enr.d.ts.map +1 -1
- package/dest/enr/generate-enr.js +27 -5
- package/dest/enr/index.d.ts +1 -1
- package/dest/errors/attestation-pool.error.d.ts +7 -0
- package/dest/errors/attestation-pool.error.d.ts.map +1 -0
- package/dest/errors/attestation-pool.error.js +12 -0
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- 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 +5 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +3 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +165 -30
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +511 -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 +680 -173
- 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 +234 -11
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +21 -21
- package/dest/mem_pools/index.d.ts +3 -3
- 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 +18 -12
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +74 -41
- 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_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 +39 -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 +97 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +12 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +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 +75 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +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 +218 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +223 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +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 +337 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -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 +167 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -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 +914 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +14 -6
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +106 -12
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +24 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +75 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/index.js +1 -0
- package/dest/msg_validators/clock_tolerance.d.ts +32 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +90 -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/msg_seen_validator/msg_seen_validator.d.ts +10 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +15 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +14 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +15 -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 +20 -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 +26 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +150 -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 +11 -18
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +4 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +31 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +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 +7 -6
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +4 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +94 -87
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -6
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +24 -29
- package/dest/msg_validators/tx_validator/factory.d.ts +149 -0
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/factory.js +275 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +24 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +108 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/gas_validator.js +194 -0
- package/dest/msg_validators/tx_validator/index.d.ts +13 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +12 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -5
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +40 -21
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +35 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/phases_validator.js +141 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/test_utils.js +22 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +30 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -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 +10 -7
- 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 +14 -10
- package/dest/services/discv5/discV5_service.d.ts +11 -9
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +92 -38
- package/dest/services/dummy_service.d.ts +77 -18
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +139 -12
- package/dest/services/encoding.d.ts +30 -7
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +88 -12
- 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 +184 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +363 -0
- package/dest/services/index.d.ts +6 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +5 -0
- package/dest/services/libp2p/instrumentation.d.ts +22 -0
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
- package/dest/services/libp2p/instrumentation.js +136 -0
- package/dest/services/libp2p/libp2p_service.d.ts +165 -111
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +1517 -379
- package/dest/services/peer-manager/interface.d.ts +23 -0
- package/dest/services/peer-manager/interface.d.ts.map +1 -0
- package/dest/services/peer-manager/interface.js +1 -0
- package/dest/services/peer-manager/metrics.d.ts +14 -3
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +50 -12
- package/dest/services/peer-manager/peer_manager.d.ts +108 -24
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +583 -85
- package/dest/services/peer-manager/peer_scoring.d.ts +12 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +99 -13
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +44 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +534 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +35 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +136 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +176 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +7 -0
- package/dest/services/reqresp/config.d.ts +13 -11
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +18 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +32 -17
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +154 -84
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- package/dest/services/reqresp/index.d.ts +3 -2
- package/dest/services/reqresp/index.d.ts.map +1 -1
- package/dest/services/reqresp/index.js +2 -1
- package/dest/services/reqresp/interface.d.ts +88 -30
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +61 -38
- 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 +16 -21
- package/dest/services/reqresp/protocols/auth.d.ts +43 -0
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/auth.js +71 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +35 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +88 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +13 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +60 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +75 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +139 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/goodbye.js +7 -7
- package/dest/services/reqresp/protocols/index.d.ts +3 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +2 -1
- package/dest/services/reqresp/protocols/ping.d.ts +1 -3
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.d.ts +40 -7
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +76 -5
- package/dest/services/reqresp/protocols/tx.d.ts +20 -4
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +52 -6
- package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +10 -7
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +20 -10
- 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 +16 -6
- package/dest/services/reqresp/reqresp.d.ts +32 -91
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +695 -355
- package/dest/services/reqresp/status.d.ts +10 -4
- package/dest/services/reqresp/status.d.ts.map +1 -1
- package/dest/services/reqresp/status.js +9 -2
- package/dest/services/service.d.ts +76 -23
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +25 -0
- package/dest/services/tx_collection/config.d.ts.map +1 -0
- package/dest/services/tx_collection/config.js +59 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +100 -0
- package/dest/services/tx_collection/index.d.ts +4 -0
- package/dest/services/tx_collection/index.d.ts.map +1 -0
- package/dest/services/tx_collection/index.js +3 -0
- package/dest/services/tx_collection/instrumentation.d.ts +10 -0
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_collection/instrumentation.js +30 -0
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/tx_collection.d.ts +104 -0
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection.js +356 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts +40 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection_sink.js +108 -0
- package/dest/services/tx_collection/tx_source.d.ts +24 -0
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_source.js +50 -0
- package/dest/services/tx_file_store/config.d.ts +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +46 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +142 -0
- package/dest/services/tx_provider.d.ts +53 -0
- package/dest/services/tx_provider.d.ts.map +1 -0
- package/dest/services/tx_provider.js +223 -0
- package/dest/services/tx_provider_instrumentation.d.ts +16 -0
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
- package/dest/services/tx_provider_instrumentation.js +34 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts.map +1 -1
- package/dest/test-helpers/index.d.ts +4 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +3 -0
- package/dest/test-helpers/make-enrs.d.ts +1 -1
- package/dest/test-helpers/make-enrs.d.ts.map +1 -1
- package/dest/test-helpers/make-enrs.js +4 -5
- package/dest/test-helpers/make-test-p2p-clients.d.ts +35 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +89 -17
- package/dest/test-helpers/mock-pubsub.d.ts +99 -0
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
- package/dest/test-helpers/mock-pubsub.js +231 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
- package/dest/test-helpers/mock-tx-helpers.js +19 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +17 -15
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +73 -40
- package/dest/test-helpers/test_tx_provider.d.ts +42 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +44 -0
- package/dest/test-helpers/testbench-utils.d.ts +161 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +391 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +310 -95
- package/dest/testbench/parse_log_file.d.ts +1 -1
- package/dest/testbench/parse_log_file.js +4 -4
- package/dest/testbench/testbench.d.ts +1 -1
- package/dest/testbench/testbench.js +4 -4
- package/dest/testbench/worker_client_manager.d.ts +57 -11
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +283 -58
- package/dest/types/index.d.ts +4 -2
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +2 -0
- package/dest/util.d.ts +33 -20
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +98 -71
- package/dest/versioning.d.ts +6 -9
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +9 -25
- package/package.json +33 -27
- package/src/bootstrap/bootstrap.ts +42 -15
- package/src/client/factory.ts +242 -60
- package/src/client/index.ts +1 -0
- package/src/client/interface.ts +239 -0
- package/src/client/p2p_client.ts +527 -460
- package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
- package/src/config.ts +518 -127
- package/src/enr/generate-enr.ts +39 -6
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +5 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +605 -29
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +828 -201
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +32 -19
- package/src/mem_pools/index.ts +2 -2
- package/src/mem_pools/instrumentation.ts +79 -47
- package/src/mem_pools/interface.ts +5 -7
- package/src/mem_pools/tx_pool_v2/README.md +283 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +112 -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 +122 -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 +28 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +219 -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 +99 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +250 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +430 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1090 -0
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +105 -15
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +101 -0
- package/src/msg_validators/attestation_validator/index.ts +1 -0
- package/src/msg_validators/clock_tolerance.ts +121 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +30 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +41 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +159 -0
- package/src/msg_validators/tx_validator/README.md +127 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +30 -0
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +23 -10
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +138 -71
- package/src/msg_validators/tx_validator/double_spend_validator.ts +31 -23
- package/src/msg_validators/tx_validator/factory.ts +478 -0
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +268 -0
- package/src/msg_validators/tx_validator/index.ts +12 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +80 -24
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +173 -0
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/test_utils.ts +43 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +57 -0
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +16 -8
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +14 -19
- package/src/services/discv5/discV5_service.ts +118 -39
- package/src/services/dummy_service.ts +196 -20
- package/src/services/encoding.ts +95 -11
- 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 +519 -0
- package/src/services/index.ts +5 -0
- package/src/services/libp2p/instrumentation.ts +140 -0
- package/src/services/libp2p/libp2p_service.ts +1373 -438
- package/src/services/peer-manager/interface.ts +29 -0
- package/src/services/peer-manager/metrics.ts +62 -12
- package/src/services/peer-manager/peer_manager.ts +695 -83
- package/src/services/peer-manager/peer_scoring.ts +96 -7
- package/src/services/reqresp/README.md +215 -0
- package/src/services/reqresp/batch-tx-requester/README.md +344 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +660 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
- package/src/services/reqresp/config.ts +27 -10
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +166 -95
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/index.ts +2 -0
- package/src/services/reqresp/interface.ts +116 -59
- package/src/services/reqresp/metrics.ts +39 -28
- package/src/services/reqresp/protocols/auth.ts +83 -0
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +107 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +80 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +171 -0
- package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
- package/src/services/reqresp/protocols/goodbye.ts +9 -7
- package/src/services/reqresp/protocols/index.ts +2 -1
- package/src/services/reqresp/protocols/status.ts +121 -5
- package/src/services/reqresp/protocols/tx.ts +56 -8
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +25 -12
- package/src/services/reqresp/rate-limiter/rate_limits.ts +16 -6
- package/src/services/reqresp/reqresp.ts +397 -422
- package/src/services/reqresp/status.ts +12 -3
- package/src/services/service.ts +104 -28
- package/src/services/tx_collection/config.ts +89 -0
- package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
- package/src/services/tx_collection/file_store_tx_source.ts +129 -0
- package/src/services/tx_collection/index.ts +3 -0
- package/src/services/tx_collection/instrumentation.ts +35 -0
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +468 -0
- package/src/services/tx_collection/tx_collection_sink.ts +125 -0
- package/src/services/tx_collection/tx_source.ts +57 -0
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +163 -0
- package/src/services/tx_provider.ts +238 -0
- package/src/services/tx_provider_instrumentation.ts +54 -0
- package/src/test-helpers/index.ts +3 -0
- package/src/test-helpers/make-enrs.ts +4 -5
- package/src/test-helpers/make-test-p2p-clients.ts +117 -26
- package/src/test-helpers/mock-pubsub.ts +311 -0
- package/src/test-helpers/mock-tx-helpers.ts +24 -0
- package/src/test-helpers/reqresp-nodes.ts +101 -62
- package/src/test-helpers/test_tx_provider.ts +69 -0
- package/src/test-helpers/testbench-utils.ts +453 -0
- package/src/testbench/p2p_client_testbench_worker.ts +477 -95
- package/src/testbench/parse_log_file.ts +4 -4
- package/src/testbench/testbench.ts +4 -4
- package/src/testbench/worker_client_manager.ts +366 -63
- package/src/types/index.ts +2 -0
- package/src/util.ts +128 -93
- package/src/versioning.ts +11 -34
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -22
- 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 -112
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -17
- 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 -129
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -66
- 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 -245
- package/dest/mem_pools/tx_pool/index.d.ts +0 -4
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -3
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
- 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 -141
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -8
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -10
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -66
- 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 -169
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
- 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 -21
- 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/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
- 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 -88
- package/dest/services/reqresp/protocols/block.d.ts +0 -4
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -8
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -159
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -161
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -309
- package/src/mem_pools/tx_pool/index.ts +0 -3
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
- package/src/mem_pools/tx_pool/priority.ts +0 -13
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -76
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -130
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -94
- package/src/services/reqresp/protocols/block.ts +0 -15
package/src/client/p2p_client.ts
CHANGED
|
@@ -1,173 +1,61 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
+
import {
|
|
3
|
+
BlockNumber,
|
|
4
|
+
CheckpointNumber,
|
|
5
|
+
type CheckpointProposalHash,
|
|
6
|
+
SlotNumber,
|
|
7
|
+
} from '@aztec/foundation/branded-types';
|
|
2
8
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import type {
|
|
6
|
-
import
|
|
7
|
-
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
9
|
+
import { RunningPromise } from '@aztec/foundation/promise';
|
|
10
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
11
|
+
import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
|
|
12
|
+
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
8
13
|
import {
|
|
9
|
-
|
|
10
|
-
type
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
type BlockData,
|
|
15
|
+
type BlockHash,
|
|
16
|
+
type CheckpointId,
|
|
17
|
+
type EthAddress,
|
|
18
|
+
type L2Block,
|
|
19
|
+
type L2BlockId,
|
|
20
|
+
type L2BlockSource,
|
|
21
|
+
L2BlockStream,
|
|
22
|
+
type L2BlockStreamEvent,
|
|
23
|
+
type L2Tips,
|
|
24
|
+
type L2TipsStore,
|
|
25
|
+
} from '@aztec/stdlib/block';
|
|
26
|
+
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
27
|
+
import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
28
|
+
import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
|
|
29
|
+
import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
|
|
30
|
+
import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
31
|
+
import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
32
|
+
|
|
33
|
+
import type { PeerId } from '@libp2p/interface';
|
|
34
|
+
import type { ENR } from '@nethermindeth/enr';
|
|
18
35
|
|
|
19
36
|
import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
|
|
20
|
-
import
|
|
37
|
+
import { TxPoolError } from '../errors/tx-pool.error.js';
|
|
38
|
+
import type { AttestationPoolApi, ProposalsForSlot } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
21
39
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
22
|
-
import type {
|
|
23
|
-
import {
|
|
24
|
-
import type
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* The synchronization status of the P2P client.
|
|
38
|
-
*/
|
|
39
|
-
export interface P2PSyncState {
|
|
40
|
-
/**
|
|
41
|
-
* The current state of the p2p client.
|
|
42
|
-
*/
|
|
43
|
-
state: P2PClientState;
|
|
44
|
-
/**
|
|
45
|
-
* The block number that the p2p client is synced to.
|
|
46
|
-
*/
|
|
47
|
-
syncedToL2Block: L2BlockId;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Interface of a P2P client.
|
|
52
|
-
**/
|
|
53
|
-
export type P2P<T extends P2PClientType = P2PClientType.Full> = ProverCoordination &
|
|
54
|
-
P2PApi<T> & {
|
|
55
|
-
/**
|
|
56
|
-
* Broadcasts a block proposal to other peers.
|
|
57
|
-
*
|
|
58
|
-
* @param proposal - the block proposal
|
|
59
|
-
*/
|
|
60
|
-
broadcastProposal(proposal: BlockProposal): void;
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Registers a callback from the validator client that determines how to behave when
|
|
64
|
-
* foreign block proposals are received
|
|
65
|
-
*
|
|
66
|
-
* @param handler - A function taking a received block proposal and producing an attestation
|
|
67
|
-
*/
|
|
68
|
-
// REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
69
|
-
// ^ This pattern is not my favorite (md)
|
|
70
|
-
registerBlockProposalHandler(handler: (block: BlockProposal) => Promise<BlockAttestation | undefined>): void;
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Request a list of transactions from another peer by their tx hashes.
|
|
74
|
-
* @param txHashes - Hashes of the txs to query.
|
|
75
|
-
* @returns A list of transactions or undefined if the transactions are not found.
|
|
76
|
-
*/
|
|
77
|
-
requestTxs(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Request a transaction from another peer by its tx hash.
|
|
81
|
-
* @param txHash - Hash of the tx to query.
|
|
82
|
-
*/
|
|
83
|
-
requestTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
|
|
87
|
-
* @param tx - The transaction.
|
|
88
|
-
**/
|
|
89
|
-
sendTx(tx: Tx): Promise<void>;
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Deletes 'txs' from the pool, given hashes.
|
|
93
|
-
* NOT used if we use sendTx as reconcileTxPool will handle this.
|
|
94
|
-
* @param txHashes - Hashes to check.
|
|
95
|
-
**/
|
|
96
|
-
deleteTxs(txHashes: TxHash[]): Promise<void>;
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Returns a transaction in the transaction pool by its hash.
|
|
100
|
-
* @param txHash - Hash of tx to return.
|
|
101
|
-
* @returns A single tx or undefined.
|
|
102
|
-
*/
|
|
103
|
-
getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined>;
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Returns a transaction in the transaction pool by its hash, requesting it from the network if it is not found.
|
|
107
|
-
* @param txHash - Hash of tx to return.
|
|
108
|
-
* @returns A single tx or undefined.
|
|
109
|
-
*/
|
|
110
|
-
getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Returns an archived transaction from the transaction pool by its hash.
|
|
114
|
-
* @param txHash - Hash of tx to return.
|
|
115
|
-
* @returns A single tx or undefined.
|
|
116
|
-
*/
|
|
117
|
-
getArchivedTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Returns whether the given tx hash is flagged as pending or mined.
|
|
121
|
-
* @param txHash - Hash of the tx to query.
|
|
122
|
-
* @returns Pending or mined depending on its status, or undefined if not found.
|
|
123
|
-
*/
|
|
124
|
-
getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | undefined>;
|
|
125
|
-
|
|
126
|
-
/** Returns an iterator over pending txs on the mempool. */
|
|
127
|
-
iteratePendingTxs(): AsyncIterableIterator<Tx>;
|
|
128
|
-
|
|
129
|
-
/** Returns the number of pending txs in the mempool. */
|
|
130
|
-
getPendingTxCount(): Promise<number>;
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Starts the p2p client.
|
|
134
|
-
* @returns A promise signalling the completion of the block sync.
|
|
135
|
-
*/
|
|
136
|
-
start(): Promise<void>;
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Stops the p2p client.
|
|
140
|
-
* @returns A promise signalling the completion of the stop process.
|
|
141
|
-
*/
|
|
142
|
-
stop(): Promise<void>;
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Indicates if the p2p client is ready for transaction submission.
|
|
146
|
-
* @returns A boolean flag indicating readiness.
|
|
147
|
-
*/
|
|
148
|
-
isReady(): boolean;
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Returns the current status of the p2p client.
|
|
152
|
-
*/
|
|
153
|
-
getStatus(): Promise<P2PSyncState>;
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Returns the ENR of this node, if any.
|
|
157
|
-
*/
|
|
158
|
-
getEnr(): ENR | undefined;
|
|
159
|
-
|
|
160
|
-
/** Identifies a p2p client. */
|
|
161
|
-
isP2PClient(): true;
|
|
162
|
-
};
|
|
40
|
+
import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
|
|
41
|
+
import type { AuthRequest, StatusMessage } from '../services/index.js';
|
|
42
|
+
import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
|
|
43
|
+
import type {
|
|
44
|
+
DuplicateAttestationInfo,
|
|
45
|
+
DuplicateProposalInfo,
|
|
46
|
+
P2PBlockReceivedCallback,
|
|
47
|
+
P2PCheckpointReceivedCallback,
|
|
48
|
+
P2PService,
|
|
49
|
+
} from '../services/service.js';
|
|
50
|
+
import { TxCollection } from '../services/tx_collection/tx_collection.js';
|
|
51
|
+
import type { TxFileStore } from '../services/tx_file_store/tx_file_store.js';
|
|
52
|
+
import { TxProvider } from '../services/tx_provider.js';
|
|
53
|
+
import { type P2P, P2PClientState, type P2PSyncState } from './interface.js';
|
|
163
54
|
|
|
164
55
|
/**
|
|
165
56
|
* The P2P client implementation.
|
|
166
57
|
*/
|
|
167
|
-
export class P2PClient
|
|
168
|
-
extends WithTracer
|
|
169
|
-
implements P2P, P2P<P2PClientType.Prover>
|
|
170
|
-
{
|
|
58
|
+
export class P2PClient extends WithTracer implements P2P {
|
|
171
59
|
/** The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped. */
|
|
172
60
|
private runningPromise!: Promise<void>;
|
|
173
61
|
|
|
@@ -176,132 +64,136 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
176
64
|
private syncResolve?: () => void = undefined;
|
|
177
65
|
private latestBlockNumberAtStart = -1;
|
|
178
66
|
private provenBlockNumberAtStart = -1;
|
|
67
|
+
private finalizedBlockNumberAtStart = -1;
|
|
179
68
|
|
|
180
|
-
private
|
|
181
|
-
private
|
|
182
|
-
private synchedProvenBlockNumber: AztecAsyncSingleton<number>;
|
|
69
|
+
private l2Tips: L2TipsStore;
|
|
70
|
+
private synchedLatestSlot: AztecAsyncSingleton<bigint>;
|
|
183
71
|
|
|
184
|
-
private txPool:
|
|
185
|
-
private attestationPool:
|
|
72
|
+
private txPool: TxPoolV2;
|
|
73
|
+
private attestationPool: AttestationPoolApi;
|
|
186
74
|
|
|
187
|
-
|
|
188
|
-
private keepAttestationsInPoolFor: number;
|
|
189
|
-
/** How many slots to keep proven txs for. */
|
|
190
|
-
private keepProvenTxsFor: number;
|
|
75
|
+
private config: P2PConfig;
|
|
191
76
|
|
|
192
|
-
private blockStream;
|
|
77
|
+
private blockStream: L2BlockStream | undefined;
|
|
78
|
+
|
|
79
|
+
private txProvider: TxProvider;
|
|
80
|
+
|
|
81
|
+
private validatorAddresses: EthAddress[] = [];
|
|
82
|
+
|
|
83
|
+
/** Tracks the last slot for which we called prepareForSlot */
|
|
84
|
+
private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
|
|
85
|
+
|
|
86
|
+
/** Polls for slot changes and calls prepareForSlot on the tx pool */
|
|
87
|
+
private slotMonitor: RunningPromise | undefined;
|
|
193
88
|
|
|
194
|
-
/**
|
|
195
|
-
* In-memory P2P client constructor.
|
|
196
|
-
* @param store - The client's instance of the KV store.
|
|
197
|
-
* @param l2BlockSource - P2P client's source for fetching existing blocks.
|
|
198
|
-
* @param txPool - The client's instance of a transaction pool. Defaults to in-memory implementation.
|
|
199
|
-
* @param p2pService - The concrete instance of p2p networking to use.
|
|
200
|
-
* @param keepProvenTxsFor - How many blocks have to pass after a block is proven before its txs are deleted (zero to delete immediately once proven).
|
|
201
|
-
* @param log - A logger.
|
|
202
|
-
*/
|
|
203
89
|
constructor(
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
mempools: MemPools<T>,
|
|
90
|
+
private store: AztecAsyncKVStore,
|
|
91
|
+
private l2BlockSource: L2BlockSource & ContractDataSource,
|
|
92
|
+
mempools: MemPools,
|
|
208
93
|
private p2pService: P2PService,
|
|
94
|
+
private txCollection: TxCollection,
|
|
95
|
+
private txFileStore: TxFileStore | undefined,
|
|
96
|
+
private epochCache: EpochCacheInterface,
|
|
209
97
|
config: Partial<P2PConfig> = {},
|
|
210
|
-
|
|
98
|
+
private _dateProvider: DateProvider = new DateProvider(),
|
|
99
|
+
private telemetry: TelemetryClient = getTelemetryClient(),
|
|
211
100
|
private log = createLogger('p2p'),
|
|
101
|
+
initialBlockHash: BlockHash,
|
|
212
102
|
) {
|
|
213
103
|
super(telemetry, 'P2PClient');
|
|
214
104
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
this.
|
|
220
|
-
|
|
105
|
+
this.config = { ...getP2PDefaultConfig(), ...config };
|
|
106
|
+
this.txPool = mempools.txPool;
|
|
107
|
+
this.attestationPool = mempools.attestationPool;
|
|
108
|
+
|
|
109
|
+
this.txProvider = new TxProvider(
|
|
110
|
+
this.txCollection,
|
|
111
|
+
this.txPool,
|
|
112
|
+
this,
|
|
113
|
+
this.log.createChild('tx-provider'),
|
|
114
|
+
this.telemetry,
|
|
115
|
+
);
|
|
221
116
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
batchSize: blockRequestBatchSize,
|
|
226
|
-
pollIntervalMS: blockCheckIntervalMS,
|
|
227
|
-
});
|
|
117
|
+
this.l2Tips = new L2TipsKVStore(store, 'p2p_client', initialBlockHash);
|
|
118
|
+
this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
|
|
119
|
+
}
|
|
228
120
|
|
|
229
|
-
|
|
230
|
-
this.
|
|
231
|
-
this.
|
|
121
|
+
public registerThisValidatorAddresses(addresses: EthAddress[]): void {
|
|
122
|
+
this.validatorAddresses = [...addresses];
|
|
123
|
+
this.p2pService.registerThisValidatorAddresses(this.validatorAddresses);
|
|
124
|
+
}
|
|
232
125
|
|
|
233
|
-
|
|
234
|
-
this.
|
|
126
|
+
public clear(): Promise<void> {
|
|
127
|
+
return this.store.clear();
|
|
235
128
|
}
|
|
236
129
|
|
|
237
130
|
public isP2PClient(): true {
|
|
238
131
|
return true;
|
|
239
132
|
}
|
|
240
133
|
|
|
134
|
+
public getTxProvider(): TxProvider {
|
|
135
|
+
return this.txProvider;
|
|
136
|
+
}
|
|
137
|
+
|
|
241
138
|
public getPeers(includePending?: boolean): Promise<PeerInfo[]> {
|
|
242
139
|
return Promise.resolve(this.p2pService.getPeers(includePending));
|
|
243
140
|
}
|
|
244
141
|
|
|
245
|
-
public
|
|
246
|
-
return this.
|
|
142
|
+
public getGossipMeshPeerCount(topicType: TopicType): Promise<number> {
|
|
143
|
+
return Promise.resolve(this.p2pService.getGossipMeshPeerCount(topicType));
|
|
247
144
|
}
|
|
248
145
|
|
|
249
|
-
public
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
const provenBlockNumber = await this.getSyncedProvenBlockNum();
|
|
253
|
-
let provenBlockHash: string | undefined;
|
|
254
|
-
|
|
255
|
-
if (latestBlockNumber > 0) {
|
|
256
|
-
latestBlockHash = await this.synchedBlockHashes.getAsync(latestBlockNumber);
|
|
257
|
-
if (typeof latestBlockHash === 'undefined') {
|
|
258
|
-
this.log.warn(`Block hash for latest block ${latestBlockNumber} not found`);
|
|
259
|
-
throw new Error();
|
|
260
|
-
}
|
|
261
|
-
}
|
|
146
|
+
public getL2BlockHash(number: BlockNumber): Promise<string | undefined> {
|
|
147
|
+
return this.l2Tips.getL2BlockHash(number);
|
|
148
|
+
}
|
|
262
149
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
throw new Error();
|
|
268
|
-
}
|
|
269
|
-
}
|
|
150
|
+
public async updateP2PConfig(config: Partial<P2PConfig>): Promise<void> {
|
|
151
|
+
await this.txPool.updateConfig(config);
|
|
152
|
+
this.p2pService.updateConfig(config);
|
|
153
|
+
}
|
|
270
154
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
proven: { hash: provenBlockHash!, number: provenBlockNumber },
|
|
274
|
-
finalized: { hash: provenBlockHash!, number: provenBlockNumber },
|
|
275
|
-
});
|
|
155
|
+
public getL2Tips(): Promise<L2Tips> {
|
|
156
|
+
return this.l2Tips.getL2Tips();
|
|
276
157
|
}
|
|
277
158
|
|
|
278
159
|
public async handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
|
|
279
160
|
this.log.debug(`Handling block stream event ${event.type}`);
|
|
161
|
+
|
|
280
162
|
switch (event.type) {
|
|
281
163
|
case 'blocks-added':
|
|
282
164
|
await this.handleLatestL2Blocks(event.blocks);
|
|
283
165
|
break;
|
|
284
|
-
case 'chain-finalized':
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
166
|
+
case 'chain-finalized': {
|
|
167
|
+
const oldFinalizedBlockNum = await this.getSyncedFinalizedBlockNum();
|
|
168
|
+
const from = BlockNumber(oldFinalizedBlockNum + 1);
|
|
169
|
+
const limit = event.block.number - from + 1;
|
|
170
|
+
if (limit > 0) {
|
|
171
|
+
const oldBlocks = await this.l2BlockSource.getBlocksData({ from, limit });
|
|
172
|
+
await this.handleFinalizedL2Blocks(oldBlocks);
|
|
173
|
+
}
|
|
291
174
|
break;
|
|
292
175
|
}
|
|
176
|
+
case 'chain-proven':
|
|
177
|
+
this.txCollection.stopCollectingForBlocksUpTo(event.block.number);
|
|
178
|
+
break;
|
|
293
179
|
case 'chain-pruned':
|
|
294
|
-
|
|
180
|
+
this.txCollection.stopCollectingForBlocksAfter(event.block.number);
|
|
181
|
+
await this.handlePruneL2Blocks(event.block, event.checkpoint);
|
|
182
|
+
break;
|
|
183
|
+
case 'chain-checkpointed':
|
|
295
184
|
break;
|
|
296
185
|
default: {
|
|
297
186
|
const _: never = event;
|
|
298
187
|
break;
|
|
299
188
|
}
|
|
300
189
|
}
|
|
190
|
+
|
|
191
|
+
// Pass the event through to our l2 tips store
|
|
192
|
+
await this.l2Tips.handleBlockStreamEvent(event);
|
|
193
|
+
await this.startServiceIfSynched();
|
|
301
194
|
}
|
|
302
195
|
|
|
303
196
|
#assertIsReady() {
|
|
304
|
-
// this.log.info('Checking if p2p client is ready, current state: ', this.currentState);
|
|
305
197
|
if (!this.isReady()) {
|
|
306
198
|
throw new Error('P2P client not ready');
|
|
307
199
|
}
|
|
@@ -319,124 +211,252 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
319
211
|
return this.syncPromise;
|
|
320
212
|
}
|
|
321
213
|
|
|
214
|
+
// Start the tx pool first, as it needs to hydrate state from persistence
|
|
215
|
+
await this.txPool.start();
|
|
216
|
+
|
|
322
217
|
// get the current latest block numbers
|
|
323
|
-
|
|
324
|
-
this.
|
|
218
|
+
const latestBlockNumbers = await this.l2BlockSource.getL2Tips();
|
|
219
|
+
this.latestBlockNumberAtStart = latestBlockNumbers.proposed.number;
|
|
220
|
+
this.provenBlockNumberAtStart = latestBlockNumbers.proven.block.number;
|
|
221
|
+
this.finalizedBlockNumberAtStart = latestBlockNumbers.finalized.block.number;
|
|
325
222
|
|
|
326
223
|
const syncedLatestBlock = (await this.getSyncedLatestBlockNum()) + 1;
|
|
327
224
|
const syncedProvenBlock = (await this.getSyncedProvenBlockNum()) + 1;
|
|
225
|
+
const syncedFinalizedBlock = (await this.getSyncedFinalizedBlockNum()) + 1;
|
|
328
226
|
|
|
329
|
-
|
|
330
|
-
|
|
227
|
+
if ((await this.txPool.isEmpty()) && (await this.attestationPool.isEmpty())) {
|
|
228
|
+
// if mempools are empty, we don't care about syncing prior blocks
|
|
229
|
+
this.initBlockStream(BlockNumber(this.latestBlockNumberAtStart));
|
|
230
|
+
this.setCurrentState(P2PClientState.RUNNING);
|
|
231
|
+
this.syncPromise = Promise.resolve();
|
|
232
|
+
await this.p2pService.start();
|
|
233
|
+
this.log.info(`Starting p2p client from block ${this.latestBlockNumberAtStart} with empty mempools`);
|
|
234
|
+
} else if (
|
|
235
|
+
syncedLatestBlock <= this.latestBlockNumberAtStart ||
|
|
236
|
+
syncedProvenBlock <= this.provenBlockNumberAtStart ||
|
|
237
|
+
syncedFinalizedBlock <= this.finalizedBlockNumberAtStart
|
|
238
|
+
) {
|
|
239
|
+
// if there are blocks to be retrieved, go to a synching state
|
|
240
|
+
// this gets resolved on `startServiceIfSynched`
|
|
241
|
+
this.initBlockStream();
|
|
331
242
|
this.setCurrentState(P2PClientState.SYNCHING);
|
|
332
243
|
this.syncPromise = new Promise(resolve => {
|
|
333
244
|
this.syncResolve = resolve;
|
|
334
245
|
});
|
|
335
|
-
this.log.
|
|
246
|
+
this.log.info(`Initiating p2p sync from ${syncedLatestBlock}`, {
|
|
247
|
+
syncedLatestBlock,
|
|
248
|
+
syncedProvenBlock,
|
|
249
|
+
syncedFinalizedBlock,
|
|
250
|
+
});
|
|
336
251
|
} else {
|
|
337
252
|
// if no blocks to be retrieved, go straight to running
|
|
253
|
+
this.initBlockStream();
|
|
338
254
|
this.setCurrentState(P2PClientState.RUNNING);
|
|
339
255
|
this.syncPromise = Promise.resolve();
|
|
340
256
|
await this.p2pService.start();
|
|
341
|
-
this.log.
|
|
257
|
+
this.log.info(`Starting P2P client synced to ${syncedLatestBlock}`, {
|
|
258
|
+
syncedLatestBlock,
|
|
259
|
+
syncedProvenBlock,
|
|
260
|
+
syncedFinalizedBlock,
|
|
261
|
+
});
|
|
342
262
|
}
|
|
343
263
|
|
|
264
|
+
// Should never happen: all branches above call initBlockStream()
|
|
265
|
+
if (!this.blockStream) {
|
|
266
|
+
throw new Error('Block stream not initialized');
|
|
267
|
+
}
|
|
344
268
|
this.blockStream.start();
|
|
345
|
-
this.
|
|
269
|
+
this.txFileStore?.start();
|
|
270
|
+
|
|
271
|
+
// Start slot monitor to call prepareForSlot when the slot changes
|
|
272
|
+
this.slotMonitor = new RunningPromise(
|
|
273
|
+
() => this.maybeCallPrepareForSlot(),
|
|
274
|
+
this.log,
|
|
275
|
+
this.config.slotCheckIntervalMS,
|
|
276
|
+
);
|
|
277
|
+
this.slotMonitor.start();
|
|
346
278
|
|
|
347
279
|
return this.syncPromise;
|
|
348
280
|
}
|
|
349
281
|
|
|
282
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
283
|
+
return this.p2pService.addReqRespSubProtocol(subProtocol, handler);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
private initBlockStream(startingBlock?: BlockNumber) {
|
|
287
|
+
if (!this.blockStream) {
|
|
288
|
+
const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
|
|
289
|
+
this.blockStream = new L2BlockStream(
|
|
290
|
+
this.l2BlockSource,
|
|
291
|
+
this,
|
|
292
|
+
this,
|
|
293
|
+
createLogger(`${this.log.module}:l2-block-stream`),
|
|
294
|
+
{ batchSize, pollIntervalMS, startingBlock },
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
350
299
|
/**
|
|
351
300
|
* Allows consumers to stop the instance of the P2P client.
|
|
352
301
|
* 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted.
|
|
353
302
|
*/
|
|
354
303
|
public async stop() {
|
|
355
304
|
this.log.debug('Stopping p2p client...');
|
|
305
|
+
await this.slotMonitor?.stop();
|
|
306
|
+
this.log.debug('Stopped slot monitor');
|
|
307
|
+
await tryStop(this.txCollection);
|
|
308
|
+
this.log.debug('Stopped tx collection service');
|
|
309
|
+
await this.txFileStore?.stop();
|
|
310
|
+
this.log.debug('Stopped tx file store');
|
|
356
311
|
await this.p2pService.stop();
|
|
357
312
|
this.log.debug('Stopped p2p service');
|
|
358
|
-
await this.blockStream
|
|
313
|
+
await this.blockStream?.stop();
|
|
359
314
|
this.log.debug('Stopped block downloader');
|
|
315
|
+
await this.txPool.stop();
|
|
316
|
+
this.log.debug('Stopped tx pool');
|
|
360
317
|
await this.runningPromise;
|
|
361
318
|
this.setCurrentState(P2PClientState.STOPPED);
|
|
362
|
-
this.log.info('P2P client stopped
|
|
319
|
+
this.log.info('P2P client stopped');
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/** Triggers a sync to the archiver. Used for testing. */
|
|
323
|
+
public async sync() {
|
|
324
|
+
this.initBlockStream();
|
|
325
|
+
// Should never happen: initBlockStream() creates blockStream if absent
|
|
326
|
+
if (!this.blockStream) {
|
|
327
|
+
throw new Error('Block stream not initialized');
|
|
328
|
+
}
|
|
329
|
+
await this.blockStream.sync();
|
|
363
330
|
}
|
|
364
331
|
|
|
365
332
|
@trackSpan('p2pClient.broadcastProposal', async proposal => ({
|
|
366
|
-
[Attributes.
|
|
367
|
-
[Attributes.SLOT_NUMBER]: proposal.slotNumber.toNumber(),
|
|
333
|
+
[Attributes.SLOT_NUMBER]: proposal.slotNumber,
|
|
368
334
|
[Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
|
|
369
|
-
[Attributes.P2P_ID]: (await proposal.
|
|
335
|
+
[Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
|
|
370
336
|
}))
|
|
371
|
-
public broadcastProposal(proposal: BlockProposal): void {
|
|
372
|
-
this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber
|
|
337
|
+
public async broadcastProposal(proposal: BlockProposal): Promise<void> {
|
|
338
|
+
this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber} to peers`);
|
|
339
|
+
// Store our own proposal so we can respond to req/resp requests for it
|
|
340
|
+
const { count } = await this.attestationPool.tryAddBlockProposal(proposal);
|
|
341
|
+
if (count > 1) {
|
|
342
|
+
if (this.config.broadcastEquivocatedProposals) {
|
|
343
|
+
this.log.warn(`Broadcasting equivocated block proposal for slot ${proposal.slotNumber}`, {
|
|
344
|
+
slot: proposal.slotNumber,
|
|
345
|
+
archive: proposal.archive.toString(),
|
|
346
|
+
count,
|
|
347
|
+
});
|
|
348
|
+
} else {
|
|
349
|
+
throw new Error(`Attempted to broadcast a duplicate block proposal for slot ${proposal.slotNumber}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
373
352
|
return this.p2pService.propagate(proposal);
|
|
374
353
|
}
|
|
375
354
|
|
|
376
|
-
|
|
377
|
-
|
|
355
|
+
@trackSpan('p2pClient.broadcastCheckpointProposal', async proposal => ({
|
|
356
|
+
[Attributes.SLOT_NUMBER]: proposal.slotNumber,
|
|
357
|
+
[Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
|
|
358
|
+
[Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
|
|
359
|
+
}))
|
|
360
|
+
public async broadcastCheckpointProposal(proposal: CheckpointProposal): Promise<void> {
|
|
361
|
+
this.log.verbose(`Broadcasting checkpoint proposal for slot ${proposal.slotNumber} to peers`);
|
|
362
|
+
const blockProposal = proposal.getBlockProposal();
|
|
363
|
+
if (blockProposal) {
|
|
364
|
+
// Store our own last-block proposal so we can respond to req/resp requests for it.
|
|
365
|
+
await this.attestationPool.tryAddBlockProposal(blockProposal);
|
|
366
|
+
}
|
|
367
|
+
const checkpointCore = proposal.toCore();
|
|
368
|
+
const { count } = await this.attestationPool.tryAddCheckpointProposal(checkpointCore);
|
|
369
|
+
if (count > 1) {
|
|
370
|
+
if (this.config.broadcastEquivocatedProposals) {
|
|
371
|
+
this.log.warn(`Broadcasting equivocated checkpoint proposal for slot ${proposal.slotNumber}`, {
|
|
372
|
+
slot: proposal.slotNumber,
|
|
373
|
+
archive: proposal.archive.toString(),
|
|
374
|
+
count,
|
|
375
|
+
});
|
|
376
|
+
} else {
|
|
377
|
+
throw new Error(`Attempted to broadcast a duplicate checkpoint proposal for slot ${proposal.slotNumber}`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return this.p2pService.propagate(proposal);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
public async broadcastCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
|
|
384
|
+
this.log.verbose(`Broadcasting ${attestations.length} checkpoint attestations to peers`);
|
|
385
|
+
await Promise.all(attestations.map(att => this.p2pService.propagate(att)));
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
public async getCheckpointAttestationsForSlot(
|
|
389
|
+
slot: SlotNumber,
|
|
390
|
+
proposalPayloadHash?: CheckpointProposalHash,
|
|
391
|
+
): Promise<CheckpointAttestation[]> {
|
|
392
|
+
return await (proposalPayloadHash
|
|
393
|
+
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
|
|
394
|
+
: this.attestationPool.getCheckpointAttestationsForSlot(slot));
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
public addOwnCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
|
|
398
|
+
return this.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
|
|
402
|
+
return this.attestationPool.getProposalsForSlot(slot);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
|
|
406
|
+
return this.attestationPool.hasBlockProposalsForSlot(slot);
|
|
378
407
|
}
|
|
379
408
|
|
|
380
409
|
// REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
381
410
|
// ^ This pattern is not my favorite (md)
|
|
382
|
-
public registerBlockProposalHandler(handler:
|
|
411
|
+
public registerBlockProposalHandler(handler: P2PBlockReceivedCallback): void {
|
|
383
412
|
this.p2pService.registerBlockReceivedCallback(handler);
|
|
384
413
|
}
|
|
385
414
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
*
|
|
389
|
-
* If a transaction can be retrieved, it will be returned, if not an undefined
|
|
390
|
-
* will be returned. In place.
|
|
391
|
-
*
|
|
392
|
-
* @param txHashes - The hashes of the transactions to request.
|
|
393
|
-
* @returns A promise that resolves to an array of transactions or undefined.
|
|
394
|
-
*/
|
|
395
|
-
public async requestTxs(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
|
|
396
|
-
const res = await this.p2pService.sendBatchRequest(ReqRespSubProtocol.TX, txHashes);
|
|
397
|
-
return Promise.resolve(res ?? []);
|
|
415
|
+
public registerValidatorCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
416
|
+
this.p2pService.registerValidatorCheckpointReceivedCallback(handler);
|
|
398
417
|
}
|
|
399
418
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
* If the underlying request response protocol fails, then we return undefined.
|
|
404
|
-
* If it succeeds then we add the transaction to our transaction pool and return.
|
|
405
|
-
*
|
|
406
|
-
* @param txHash - The hash of the transaction to request.
|
|
407
|
-
* @returns A promise that resolves to a transaction or undefined.
|
|
408
|
-
*/
|
|
409
|
-
public async requestTxByHash(txHash: TxHash): Promise<Tx | undefined> {
|
|
410
|
-
const tx = await this.p2pService.sendRequest(ReqRespSubProtocol.TX, txHash);
|
|
419
|
+
public registerAllNodesCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
420
|
+
this.p2pService.registerAllNodesCheckpointReceivedCallback(handler);
|
|
421
|
+
}
|
|
411
422
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
} else {
|
|
416
|
-
this.log.debug(`Failed to receive tx ${txHash.toString()} from peer`);
|
|
417
|
-
}
|
|
423
|
+
public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
|
|
424
|
+
this.p2pService.registerDuplicateProposalCallback(callback);
|
|
425
|
+
}
|
|
418
426
|
|
|
419
|
-
|
|
427
|
+
public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
|
|
428
|
+
this.p2pService.registerDuplicateAttestationCallback(callback);
|
|
420
429
|
}
|
|
421
430
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
*/
|
|
425
|
-
public async requestTxsByHash(txHashes: TxHash[]): Promise<Tx[]> {
|
|
426
|
-
const txs = (await this.p2pService.sendBatchRequest(ReqRespSubProtocol.TX, txHashes)) ?? [];
|
|
427
|
-
await this.txPool.addTxs(txs);
|
|
428
|
-
const txHashesStr = txHashes.map(tx => tx.toString()).join(', ');
|
|
429
|
-
this.log.debug(`Received batched txs ${txHashesStr} (${txs.length} / ${txHashes.length}}) from peers`);
|
|
430
|
-
return txs as Tx[];
|
|
431
|
+
public registerCheckpointAttestationCallback(callback: (attestation: CheckpointAttestation) => void): void {
|
|
432
|
+
this.p2pService.registerCheckpointAttestationCallback(callback);
|
|
431
433
|
}
|
|
432
434
|
|
|
433
|
-
public getPendingTxs(): Promise<Tx[]> {
|
|
434
|
-
|
|
435
|
+
public async getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]> {
|
|
436
|
+
if (limit !== undefined && limit <= 0) {
|
|
437
|
+
throw new TypeError('limit must be greater than 0');
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
let txHashes = await this.txPool.getPendingTxHashes();
|
|
441
|
+
|
|
442
|
+
let startIndex = 0;
|
|
443
|
+
if (after) {
|
|
444
|
+
startIndex = txHashes.findIndex(txHash => after.equals(txHash));
|
|
445
|
+
if (startIndex === -1) {
|
|
446
|
+
return [];
|
|
447
|
+
}
|
|
448
|
+
startIndex++;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
const endIndex = limit !== undefined ? startIndex + limit : undefined;
|
|
452
|
+
txHashes = txHashes.slice(startIndex, endIndex);
|
|
453
|
+
|
|
454
|
+
const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash)));
|
|
455
|
+
return maybeTxs.filter((tx): tx is Tx => !!tx);
|
|
435
456
|
}
|
|
436
457
|
|
|
437
|
-
public
|
|
438
|
-
|
|
439
|
-
return pendingTxs.length;
|
|
458
|
+
public getPendingTxCount(): Promise<number> {
|
|
459
|
+
return this.txPool.getPendingTxCount();
|
|
440
460
|
}
|
|
441
461
|
|
|
442
462
|
public async *iteratePendingTxs(): AsyncIterableIterator<Tx> {
|
|
@@ -448,24 +468,12 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
448
468
|
}
|
|
449
469
|
}
|
|
450
470
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
return this.txPool.getAllTxs();
|
|
458
|
-
} else if (filter === 'mined') {
|
|
459
|
-
const minedHashes = await this.txPool.getMinedTxHashes();
|
|
460
|
-
const minedTx = await Promise.all(minedHashes.map(([txHash]) => this.txPool.getTxByHash(txHash)));
|
|
461
|
-
return minedTx.filter((tx): tx is Tx => !!tx);
|
|
462
|
-
} else if (filter === 'pending') {
|
|
463
|
-
const pendingHashses = await this.txPool.getPendingTxHashes();
|
|
464
|
-
const pendingTxs = await Promise.all(pendingHashses.map(txHash => this.txPool.getTxByHash(txHash)));
|
|
465
|
-
return pendingTxs.filter((tx): tx is Tx => !!tx);
|
|
466
|
-
} else {
|
|
467
|
-
const _: never = filter;
|
|
468
|
-
throw new Error(`Unknown filter ${filter}`);
|
|
471
|
+
public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
|
|
472
|
+
for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
|
|
473
|
+
const tx = await this.txPool.getTxByHash(txHash);
|
|
474
|
+
if (tx) {
|
|
475
|
+
yield tx;
|
|
476
|
+
}
|
|
469
477
|
}
|
|
470
478
|
}
|
|
471
479
|
|
|
@@ -478,39 +486,17 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
478
486
|
return this.txPool.getTxByHash(txHash);
|
|
479
487
|
}
|
|
480
488
|
|
|
481
|
-
/**
|
|
482
|
-
* Returns a transaction in the transaction pool by its hash.
|
|
483
|
-
* If the transaction is not in the pool, it will be requested from the network.
|
|
484
|
-
* @param txHash - Hash of the transaction to look for in the pool.
|
|
485
|
-
* @returns A single tx or undefined.
|
|
486
|
-
*/
|
|
487
|
-
async getTxByHash(txHash: TxHash): Promise<Tx | undefined> {
|
|
488
|
-
const tx = await this.txPool.getTxByHash(txHash);
|
|
489
|
-
if (tx) {
|
|
490
|
-
return tx;
|
|
491
|
-
}
|
|
492
|
-
return this.requestTxByHash(txHash);
|
|
493
|
-
}
|
|
494
|
-
|
|
495
489
|
/**
|
|
496
490
|
* Returns transactions in the transaction pool by hash.
|
|
497
|
-
* If a transaction is not in the pool, it will be requested from the network.
|
|
498
491
|
* @param txHashes - Hashes of the transactions to look for.
|
|
499
|
-
* @returns The txs found,
|
|
492
|
+
* @returns The txs found, in the same order as the requested hashes. If a tx is not found, it will be undefined.
|
|
500
493
|
*/
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
.map((tx, index) => [tx, index] as const)
|
|
505
|
-
.filter(([tx, _index]) => !tx)
|
|
506
|
-
.map(([_tx, index]) => txHashes[index]);
|
|
507
|
-
|
|
508
|
-
if (missingTxHashes.length === 0) {
|
|
509
|
-
return txs as Tx[];
|
|
510
|
-
}
|
|
494
|
+
getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
|
|
495
|
+
return this.txPool.getTxsByHash(txHashes);
|
|
496
|
+
}
|
|
511
497
|
|
|
512
|
-
|
|
513
|
-
return
|
|
498
|
+
hasTxsInPool(txHashes: TxHash[]): Promise<boolean[]> {
|
|
499
|
+
return this.txPool.hasTxs(txHashes);
|
|
514
500
|
}
|
|
515
501
|
|
|
516
502
|
/**
|
|
@@ -523,14 +509,28 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
523
509
|
}
|
|
524
510
|
|
|
525
511
|
/**
|
|
526
|
-
*
|
|
527
|
-
* @param tx - The tx to
|
|
512
|
+
* Accepts a transaction, adds it to local tx pool and forwards it to other peers.
|
|
513
|
+
* @param tx - The tx to send.
|
|
528
514
|
* @returns Empty promise.
|
|
529
515
|
**/
|
|
530
516
|
public async sendTx(tx: Tx): Promise<void> {
|
|
531
517
|
this.#assertIsReady();
|
|
532
|
-
await this.txPool.
|
|
533
|
-
|
|
518
|
+
const result = await this.txPool.addPendingTxs([tx], { feeComparisonOnly: true });
|
|
519
|
+
if (result.accepted.length === 1) {
|
|
520
|
+
await this.p2pService.propagate(tx);
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
const txHashStr = tx.getTxHash().toString();
|
|
525
|
+
const reason = result.errors?.get(txHashStr);
|
|
526
|
+
if (reason) {
|
|
527
|
+
this.log.warn(`Tx ${txHashStr} not added to pool: ${reason.message}`);
|
|
528
|
+
throw new TxPoolError(reason);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
this.log.warn(
|
|
532
|
+
`Tx ${txHashStr} not propagated: accepted=${result.accepted.length} ignored=${result.ignored.length} rejected=${result.rejected.length}`,
|
|
533
|
+
);
|
|
534
534
|
}
|
|
535
535
|
|
|
536
536
|
/**
|
|
@@ -538,8 +538,9 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
538
538
|
* @param txHash - Hash of the tx to query.
|
|
539
539
|
* @returns Pending or mined depending on its status, or undefined if not found.
|
|
540
540
|
*/
|
|
541
|
-
public getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | undefined> {
|
|
542
|
-
|
|
541
|
+
public async getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined> {
|
|
542
|
+
const status = await this.txPool.getTxStatus(txHash);
|
|
543
|
+
return status === 'protected' ? 'pending' : status;
|
|
543
544
|
}
|
|
544
545
|
|
|
545
546
|
public getEnr(): ENR | undefined {
|
|
@@ -551,14 +552,12 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
551
552
|
}
|
|
552
553
|
|
|
553
554
|
/**
|
|
554
|
-
*
|
|
555
|
-
*
|
|
556
|
-
* @param txHashes - Hashes of the transactions to delete.
|
|
557
|
-
* @returns Empty promise.
|
|
555
|
+
* Handles failed transaction execution by removing txs from the pool.
|
|
556
|
+
* @param txHashes - Hashes of the transactions that failed execution.
|
|
558
557
|
**/
|
|
559
|
-
public async
|
|
558
|
+
public async handleFailedExecution(txHashes: TxHash[]): Promise<void> {
|
|
560
559
|
this.#assertIsReady();
|
|
561
|
-
await this.txPool.
|
|
560
|
+
await this.txPool.handleFailedExecution(txHashes);
|
|
562
561
|
}
|
|
563
562
|
|
|
564
563
|
/**
|
|
@@ -573,16 +572,28 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
573
572
|
* Public function to check the latest block number that the P2P client is synced to.
|
|
574
573
|
* @returns Block number of latest L2 Block we've synced with.
|
|
575
574
|
*/
|
|
576
|
-
public async getSyncedLatestBlockNum(): Promise<
|
|
577
|
-
|
|
575
|
+
public async getSyncedLatestBlockNum(): Promise<BlockNumber> {
|
|
576
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
577
|
+
return tips.proposed.number;
|
|
578
578
|
}
|
|
579
579
|
|
|
580
580
|
/**
|
|
581
581
|
* Public function to check the latest proven block number that the P2P client is synced to.
|
|
582
582
|
* @returns Block number of latest proven L2 Block we've synced with.
|
|
583
583
|
*/
|
|
584
|
-
public async getSyncedProvenBlockNum(): Promise<
|
|
585
|
-
|
|
584
|
+
public async getSyncedProvenBlockNum(): Promise<BlockNumber> {
|
|
585
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
586
|
+
return tips.proven.block.number;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
public async getSyncedFinalizedBlockNum(): Promise<BlockNumber> {
|
|
590
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
591
|
+
return tips.finalized.block.number;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/** Returns latest L2 slot for which we have seen an L2 block. */
|
|
595
|
+
public async getSyncedLatestSlot(): Promise<bigint> {
|
|
596
|
+
return (await this.synchedLatestSlot.getAsync()) ?? BigInt(0);
|
|
586
597
|
}
|
|
587
598
|
|
|
588
599
|
/**
|
|
@@ -591,42 +602,25 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
591
602
|
*/
|
|
592
603
|
public async getStatus(): Promise<P2PSyncState> {
|
|
593
604
|
const blockNumber = await this.getSyncedLatestBlockNum();
|
|
594
|
-
const blockHash =
|
|
595
|
-
blockNumber
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
.getBlockHeader(blockNumber)
|
|
599
|
-
.then(header => header?.hash())
|
|
600
|
-
.then(hash => hash?.toString());
|
|
605
|
+
const blockHash = await this.l2BlockSource
|
|
606
|
+
.getBlockData({ number: blockNumber })
|
|
607
|
+
.then(data => data?.header.hash())
|
|
608
|
+
.then(hash => hash?.toString());
|
|
601
609
|
|
|
602
610
|
return {
|
|
603
611
|
state: this.currentState,
|
|
604
|
-
syncedToL2Block: { number: blockNumber, hash: blockHash },
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
/**
|
|
609
|
-
* Mark all txs from these blocks as mined.
|
|
610
|
-
* @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
|
|
611
|
-
* @returns Empty promise.
|
|
612
|
-
*/
|
|
613
|
-
private async markTxsAsMinedFromBlocks(blocks: L2Block[]): Promise<void> {
|
|
614
|
-
for (const block of blocks) {
|
|
615
|
-
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
616
|
-
await this.txPool.markAsMined(txHashes, block.number);
|
|
617
|
-
}
|
|
612
|
+
syncedToL2Block: { number: blockNumber, hash: blockHash! },
|
|
613
|
+
};
|
|
618
614
|
}
|
|
619
615
|
|
|
620
616
|
/**
|
|
621
|
-
*
|
|
617
|
+
* Handles mined blocks by marking the txs in them as mined.
|
|
622
618
|
* @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
|
|
623
619
|
* @returns Empty promise.
|
|
624
620
|
*/
|
|
625
|
-
private async
|
|
626
|
-
this.log.debug(`Deleting txs from blocks ${blocks[0].number} to ${blocks[blocks.length - 1].number}`);
|
|
621
|
+
private async handleMinedBlocks(blocks: L2Block[]): Promise<void> {
|
|
627
622
|
for (const block of blocks) {
|
|
628
|
-
|
|
629
|
-
await this.txPool.deleteTxs(txHashes);
|
|
623
|
+
await this.txPool.handleMinedBlock(block);
|
|
630
624
|
}
|
|
631
625
|
}
|
|
632
626
|
|
|
@@ -637,103 +631,148 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
637
631
|
*/
|
|
638
632
|
private async handleLatestL2Blocks(blocks: L2Block[]): Promise<void> {
|
|
639
633
|
if (!blocks.length) {
|
|
640
|
-
return
|
|
634
|
+
return;
|
|
641
635
|
}
|
|
642
636
|
|
|
643
|
-
await this.
|
|
644
|
-
|
|
645
|
-
await
|
|
646
|
-
|
|
647
|
-
);
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
637
|
+
await this.handleMinedBlocks(blocks);
|
|
638
|
+
await this.maybeCallPrepareForSlot();
|
|
639
|
+
await this.collectingMissingTxs(blocks);
|
|
640
|
+
const lastBlock = blocks.at(-1)!;
|
|
641
|
+
await this.synchedLatestSlot.set(BigInt(lastBlock.header.getSlot()));
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/** Request txs for unproven blocks so the prover node can prove. */
|
|
645
|
+
private async collectingMissingTxs(blocks: L2Block[]): Promise<void> {
|
|
646
|
+
try {
|
|
647
|
+
// TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
|
|
648
|
+
// be much lower than the actual one, and it does not update until the pending chain is
|
|
649
|
+
// fully synced. This could lead to a ton of tx collection requests for blocks that
|
|
650
|
+
// are already proven, but the archiver has not yet updated its state. Until this is properly
|
|
651
|
+
// fixed, it is mitigated by the expiration date of collection requests, which depends on
|
|
652
|
+
// the slot number of the block.
|
|
653
|
+
const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
|
|
654
|
+
const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
|
|
655
|
+
for (const block of unprovenBlocks) {
|
|
656
|
+
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
657
|
+
const missingTxHashes = await this.txPool
|
|
658
|
+
.hasTxs(txHashes)
|
|
659
|
+
.then(availability => txHashes.filter((_, index) => !availability[index]));
|
|
660
|
+
if (missingTxHashes.length > 0) {
|
|
661
|
+
this.log.verbose(
|
|
662
|
+
`Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
|
|
663
|
+
{ missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
|
|
664
|
+
);
|
|
665
|
+
// Both `slashDataWithholdingToleranceSlots` and `p2pMissingTxCollectionDeadlineSlots`
|
|
666
|
+
// count *full slots after the block slot* — value N means collection runs until
|
|
667
|
+
// `slotStart(block.slot + N + 1)`. Take the larger of the two so collection never
|
|
668
|
+
// gives up before the data-withholding slash verdict is rendered.
|
|
669
|
+
const blockSlot = block.header.getSlot();
|
|
670
|
+
const toleranceSlots = this.config.slashDataWithholdingToleranceSlots;
|
|
671
|
+
const configuredSlots = this.config.p2pMissingTxCollectionDeadlineSlots ?? 0;
|
|
672
|
+
const deadlineSlot = SlotNumber(blockSlot + Math.max(toleranceSlots, configuredSlots) + 1);
|
|
673
|
+
const deadlineSeconds = getTimestampForSlot(deadlineSlot, this.epochCache.getL1Constants());
|
|
674
|
+
const deadline = new Date(Number(deadlineSeconds) * 1000);
|
|
675
|
+
await this.txCollection.collectFastForBlock(block, missingTxHashes, { deadline });
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
} catch (err) {
|
|
679
|
+
this.log.error(`Error while starting collection of missing txs for unproven blocks`, err);
|
|
680
|
+
}
|
|
651
681
|
}
|
|
652
682
|
|
|
653
683
|
/**
|
|
654
|
-
* Handles new
|
|
655
|
-
* @param blocks - A list of
|
|
684
|
+
* Handles new finalized blocks by deleting the txs and attestations in them.
|
|
685
|
+
* @param blocks - A list of finalized L2 blocks.
|
|
656
686
|
* @returns Empty promise.
|
|
657
687
|
*/
|
|
658
|
-
private async
|
|
688
|
+
private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
|
|
659
689
|
if (!blocks.length) {
|
|
660
|
-
return
|
|
661
|
-
}
|
|
662
|
-
|
|
663
|
-
const firstBlockNum = blocks[0].number;
|
|
664
|
-
const lastBlockNum = blocks[blocks.length - 1].number;
|
|
665
|
-
const lastBlockSlot = blocks[blocks.length - 1].header.globalVariables.slotNumber.toBigInt();
|
|
666
|
-
|
|
667
|
-
// If keepProvenTxsFor is 0, we delete all txs from all proven blocks.
|
|
668
|
-
if (this.keepProvenTxsFor === 0) {
|
|
669
|
-
await this.deleteTxsFromBlocks(blocks);
|
|
670
|
-
} else if (lastBlockNum - this.keepProvenTxsFor >= INITIAL_L2_BLOCK_NUM) {
|
|
671
|
-
const fromBlock = Math.max(INITIAL_L2_BLOCK_NUM, firstBlockNum - this.keepProvenTxsFor);
|
|
672
|
-
const toBlock = lastBlockNum - this.keepProvenTxsFor;
|
|
673
|
-
const limit = toBlock - fromBlock + 1;
|
|
674
|
-
const blocksToDeleteTxsFrom = await this.l2BlockSource.getBlocks(fromBlock, limit, true);
|
|
675
|
-
await this.deleteTxsFromBlocks(blocksToDeleteTxsFrom);
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
// We delete attestations older than the last block slot minus the number of slots we want to keep in the pool.
|
|
679
|
-
const lastBlockSlotMinusKeepAttestationsInPoolFor = lastBlockSlot - BigInt(this.keepAttestationsInPoolFor);
|
|
680
|
-
if (lastBlockSlotMinusKeepAttestationsInPoolFor >= BigInt(INITIAL_L2_BLOCK_NUM)) {
|
|
681
|
-
await this.attestationPool?.deleteAttestationsOlderThan(lastBlockSlotMinusKeepAttestationsInPoolFor);
|
|
690
|
+
return;
|
|
682
691
|
}
|
|
683
692
|
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
await this.
|
|
693
|
+
// Finalization is monotonic, so we only need to call with the last block
|
|
694
|
+
const lastBlock = blocks.at(-1)!;
|
|
695
|
+
await this.txPool.handleFinalizedBlock(lastBlock.header);
|
|
696
|
+
await this.attestationPool.deleteOlderThan(lastBlock.header.getSlot());
|
|
688
697
|
}
|
|
689
698
|
|
|
690
699
|
/**
|
|
691
700
|
* Updates the tx pool after a chain prune.
|
|
692
|
-
*
|
|
701
|
+
* Detects epoch prunes (checkpoint number changed) and deletes all txs in that case.
|
|
702
|
+
* @param latestBlock - The block ID the chain was pruned to.
|
|
703
|
+
* @param newCheckpoint - The checkpoint ID after the prune.
|
|
693
704
|
*/
|
|
694
|
-
private async handlePruneL2Blocks(latestBlock:
|
|
695
|
-
const
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
if (tx.data.constants.historicalHeader.globalVariables.blockNumber.toNumber() > latestBlock) {
|
|
699
|
-
txsToDelete.push(await tx.getTxHash());
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
this.log.info(
|
|
704
|
-
`Detected chain prune. Removing invalid txs count=${
|
|
705
|
-
txsToDelete.length
|
|
706
|
-
} newLatestBlock=${latestBlock} previousLatestBlock=${this.getSyncedLatestBlockNum()}`,
|
|
707
|
-
);
|
|
705
|
+
private async handlePruneL2Blocks(latestBlock: L2BlockId, newCheckpoint: CheckpointId): Promise<void> {
|
|
706
|
+
const deleteAllTxs = this.config.txPoolDeleteTxsAfterReorg && (await this.isEpochPrune(newCheckpoint));
|
|
707
|
+
await this.txPool.handlePrunedBlocks(latestBlock, { deleteAllTxs });
|
|
708
|
+
}
|
|
708
709
|
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
if (blockNumber > latestBlock) {
|
|
719
|
-
txsToMoveToPending.push(txHash);
|
|
720
|
-
}
|
|
710
|
+
/**
|
|
711
|
+
* Returns true if the prune is an epoch prune (new checkpoint number is less than old).
|
|
712
|
+
* If the checkpoint number stays the same or increases, the prune is within a checkpoint.
|
|
713
|
+
*/
|
|
714
|
+
private async isEpochPrune(newCheckpoint: CheckpointId): Promise<boolean> {
|
|
715
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
716
|
+
const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
|
|
717
|
+
if (oldCheckpointNumber <= CheckpointNumber.INITIAL) {
|
|
718
|
+
return false;
|
|
721
719
|
}
|
|
720
|
+
const newCheckpointNumber = newCheckpoint.number;
|
|
721
|
+
// We check that the new checkpoint number is less than the old checkpoint number in order to consider it an epoch prune.
|
|
722
|
+
// To be more certain that it is an epoch prune, we will check that at least 2 checkpoints were removed.
|
|
723
|
+
// This means we should avoid thinking checkpoints removed by L1 re-orgs are epoch prunes
|
|
724
|
+
const thresholdForEpochPrune = CheckpointNumber(oldCheckpointNumber - 2);
|
|
725
|
+
const isEpochPrune = newCheckpointNumber <= thresholdForEpochPrune;
|
|
726
|
+
if (isEpochPrune) {
|
|
727
|
+
this.log.info(`Detected epoch prune to ${newCheckpointNumber}`, {
|
|
728
|
+
oldCheckpointNumber,
|
|
729
|
+
newCheckpointNumber,
|
|
730
|
+
thresholdForEpochPrune,
|
|
731
|
+
});
|
|
732
|
+
}
|
|
733
|
+
return isEpochPrune;
|
|
734
|
+
}
|
|
722
735
|
|
|
723
|
-
|
|
724
|
-
|
|
736
|
+
/** Checks if the slot has changed and calls prepareForSlot if so. */
|
|
737
|
+
private async maybeCallPrepareForSlot(): Promise<void> {
|
|
738
|
+
// If we have a proposed checkpoint available, we want to prepare the target slot - otherwise we prepare the current slot
|
|
739
|
+
const l2Tips = await this.l2Tips.getL2Tips();
|
|
740
|
+
const hasProposedCheckpoint = l2Tips.proposedCheckpoint.checkpoint.number > l2Tips.checkpointed.checkpoint.number;
|
|
725
741
|
|
|
726
|
-
|
|
727
|
-
|
|
742
|
+
let slot;
|
|
743
|
+
if (hasProposedCheckpoint) {
|
|
744
|
+
const { targetSlot } = this.epochCache.getTargetAndNextSlot();
|
|
745
|
+
slot = targetSlot;
|
|
746
|
+
} else {
|
|
747
|
+
const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
|
|
748
|
+
slot = currentSlot;
|
|
749
|
+
}
|
|
750
|
+
if (slot <= this.lastSlotProcessed) {
|
|
751
|
+
return;
|
|
752
|
+
}
|
|
753
|
+
this.lastSlotProcessed = slot;
|
|
754
|
+
await this.txPool.prepareForSlot(slot);
|
|
728
755
|
}
|
|
729
756
|
|
|
730
757
|
private async startServiceIfSynched() {
|
|
758
|
+
if (this.currentState !== P2PClientState.SYNCHING) {
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
761
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
762
|
+
const syncedFinalizedBlock = tips.finalized.block.number;
|
|
763
|
+
const syncedProvenBlock = tips.proven.block.number;
|
|
764
|
+
const syncedLatestBlock = tips.proposed.number;
|
|
765
|
+
|
|
731
766
|
if (
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
767
|
+
syncedLatestBlock >= this.latestBlockNumberAtStart &&
|
|
768
|
+
syncedProvenBlock >= this.provenBlockNumberAtStart &&
|
|
769
|
+
syncedFinalizedBlock >= this.finalizedBlockNumberAtStart
|
|
735
770
|
) {
|
|
736
|
-
this.log.
|
|
771
|
+
this.log.info(`Completed P2P client sync to block ${syncedLatestBlock}. Starting service.`, {
|
|
772
|
+
syncedLatestBlock,
|
|
773
|
+
syncedProvenBlock,
|
|
774
|
+
syncedFinalizedBlock,
|
|
775
|
+
});
|
|
737
776
|
this.setCurrentState(P2PClientState.RUNNING);
|
|
738
777
|
if (this.syncResolve !== undefined) {
|
|
739
778
|
this.syncResolve();
|
|
@@ -751,4 +790,32 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
751
790
|
this.currentState = newState;
|
|
752
791
|
this.log.debug(`Moved from state ${P2PClientState[oldState]} to ${P2PClientState[this.currentState]}`);
|
|
753
792
|
}
|
|
793
|
+
|
|
794
|
+
public validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void> {
|
|
795
|
+
return this.p2pService.validateTxsReceivedInBlockProposal(txs);
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
/**
|
|
799
|
+
* Protects existing transactions by hash for a given slot.
|
|
800
|
+
* Returns hashes of transactions that weren't found in the pool.
|
|
801
|
+
* @param txHashes - Hashes of the transactions to protect.
|
|
802
|
+
* @param blockHeader - The block header providing slot context.
|
|
803
|
+
* @returns Hashes of transactions not found in the pool.
|
|
804
|
+
*/
|
|
805
|
+
public protectTxs(txHashes: TxHash[], blockHeader: BlockHeader): Promise<TxHash[]> {
|
|
806
|
+
return this.txPool.protectTxs(txHashes, blockHeader);
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
/**
|
|
810
|
+
* Prepares the pool for a new slot.
|
|
811
|
+
* Unprotects transactions from earlier slots and validates them.
|
|
812
|
+
* @param slotNumber - The slot number to prepare for
|
|
813
|
+
*/
|
|
814
|
+
public async prepareForSlot(slotNumber: SlotNumber): Promise<void> {
|
|
815
|
+
await this.txPool.prepareForSlot(slotNumber);
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
public handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage> {
|
|
819
|
+
return this.p2pService.handleAuthRequestFromPeer(authRequest, peerId);
|
|
820
|
+
}
|
|
754
821
|
}
|