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