@aztec/p2p 0.0.0-test.1 → 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
|
@@ -1,113 +1,483 @@
|
|
|
1
|
-
function
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
function applyDecs2203RFactory() {
|
|
2
|
+
function createAddInitializerMethod(initializers, decoratorFinishedRef) {
|
|
3
|
+
return function addInitializer(initializer) {
|
|
4
|
+
assertNotFinished(decoratorFinishedRef, "addInitializer");
|
|
5
|
+
assertCallable(initializer, "An initializer");
|
|
6
|
+
initializers.push(initializer);
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
|
|
10
|
+
var kindStr;
|
|
11
|
+
switch(kind){
|
|
12
|
+
case 1:
|
|
13
|
+
kindStr = "accessor";
|
|
14
|
+
break;
|
|
15
|
+
case 2:
|
|
16
|
+
kindStr = "method";
|
|
17
|
+
break;
|
|
18
|
+
case 3:
|
|
19
|
+
kindStr = "getter";
|
|
20
|
+
break;
|
|
21
|
+
case 4:
|
|
22
|
+
kindStr = "setter";
|
|
23
|
+
break;
|
|
24
|
+
default:
|
|
25
|
+
kindStr = "field";
|
|
26
|
+
}
|
|
27
|
+
var ctx = {
|
|
28
|
+
kind: kindStr,
|
|
29
|
+
name: isPrivate ? "#" + name : name,
|
|
30
|
+
static: isStatic,
|
|
31
|
+
private: isPrivate,
|
|
32
|
+
metadata: metadata
|
|
33
|
+
};
|
|
34
|
+
var decoratorFinishedRef = {
|
|
35
|
+
v: false
|
|
36
|
+
};
|
|
37
|
+
ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
|
|
38
|
+
var get, set;
|
|
39
|
+
if (kind === 0) {
|
|
40
|
+
if (isPrivate) {
|
|
41
|
+
get = desc.get;
|
|
42
|
+
set = desc.set;
|
|
43
|
+
} else {
|
|
44
|
+
get = function() {
|
|
45
|
+
return this[name];
|
|
46
|
+
};
|
|
47
|
+
set = function(v) {
|
|
48
|
+
this[name] = v;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
} else if (kind === 2) {
|
|
52
|
+
get = function() {
|
|
53
|
+
return desc.value;
|
|
54
|
+
};
|
|
55
|
+
} else {
|
|
56
|
+
if (kind === 1 || kind === 3) {
|
|
57
|
+
get = function() {
|
|
58
|
+
return desc.get.call(this);
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (kind === 1 || kind === 4) {
|
|
62
|
+
set = function(v) {
|
|
63
|
+
desc.set.call(this, v);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
ctx.access = get && set ? {
|
|
68
|
+
get: get,
|
|
69
|
+
set: set
|
|
70
|
+
} : get ? {
|
|
71
|
+
get: get
|
|
72
|
+
} : {
|
|
73
|
+
set: set
|
|
74
|
+
};
|
|
75
|
+
try {
|
|
76
|
+
return dec(value, ctx);
|
|
77
|
+
} finally{
|
|
78
|
+
decoratorFinishedRef.v = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function assertNotFinished(decoratorFinishedRef, fnName) {
|
|
82
|
+
if (decoratorFinishedRef.v) {
|
|
83
|
+
throw new Error("attempted to call " + fnName + " after decoration was finished");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function assertCallable(fn, hint) {
|
|
87
|
+
if (typeof fn !== "function") {
|
|
88
|
+
throw new TypeError(hint + " must be a function");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function assertValidReturnValue(kind, value) {
|
|
92
|
+
var type = typeof value;
|
|
93
|
+
if (kind === 1) {
|
|
94
|
+
if (type !== "object" || value === null) {
|
|
95
|
+
throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
|
|
96
|
+
}
|
|
97
|
+
if (value.get !== undefined) {
|
|
98
|
+
assertCallable(value.get, "accessor.get");
|
|
99
|
+
}
|
|
100
|
+
if (value.set !== undefined) {
|
|
101
|
+
assertCallable(value.set, "accessor.set");
|
|
102
|
+
}
|
|
103
|
+
if (value.init !== undefined) {
|
|
104
|
+
assertCallable(value.init, "accessor.init");
|
|
105
|
+
}
|
|
106
|
+
} else if (type !== "function") {
|
|
107
|
+
var hint;
|
|
108
|
+
if (kind === 0) {
|
|
109
|
+
hint = "field";
|
|
110
|
+
} else if (kind === 10) {
|
|
111
|
+
hint = "class";
|
|
112
|
+
} else {
|
|
113
|
+
hint = "method";
|
|
114
|
+
}
|
|
115
|
+
throw new TypeError(hint + " decorators must return a function or void 0");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
|
|
119
|
+
var decs = decInfo[0];
|
|
120
|
+
var desc, init, value;
|
|
121
|
+
if (isPrivate) {
|
|
122
|
+
if (kind === 0 || kind === 1) {
|
|
123
|
+
desc = {
|
|
124
|
+
get: decInfo[3],
|
|
125
|
+
set: decInfo[4]
|
|
126
|
+
};
|
|
127
|
+
} else if (kind === 3) {
|
|
128
|
+
desc = {
|
|
129
|
+
get: decInfo[3]
|
|
130
|
+
};
|
|
131
|
+
} else if (kind === 4) {
|
|
132
|
+
desc = {
|
|
133
|
+
set: decInfo[3]
|
|
134
|
+
};
|
|
135
|
+
} else {
|
|
136
|
+
desc = {
|
|
137
|
+
value: decInfo[3]
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
} else if (kind !== 0) {
|
|
141
|
+
desc = Object.getOwnPropertyDescriptor(base, name);
|
|
142
|
+
}
|
|
143
|
+
if (kind === 1) {
|
|
144
|
+
value = {
|
|
145
|
+
get: desc.get,
|
|
146
|
+
set: desc.set
|
|
147
|
+
};
|
|
148
|
+
} else if (kind === 2) {
|
|
149
|
+
value = desc.value;
|
|
150
|
+
} else if (kind === 3) {
|
|
151
|
+
value = desc.get;
|
|
152
|
+
} else if (kind === 4) {
|
|
153
|
+
value = desc.set;
|
|
154
|
+
}
|
|
155
|
+
var newValue, get, set;
|
|
156
|
+
if (typeof decs === "function") {
|
|
157
|
+
newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
|
|
158
|
+
if (newValue !== void 0) {
|
|
159
|
+
assertValidReturnValue(kind, newValue);
|
|
160
|
+
if (kind === 0) {
|
|
161
|
+
init = newValue;
|
|
162
|
+
} else if (kind === 1) {
|
|
163
|
+
init = newValue.init;
|
|
164
|
+
get = newValue.get || value.get;
|
|
165
|
+
set = newValue.set || value.set;
|
|
166
|
+
value = {
|
|
167
|
+
get: get,
|
|
168
|
+
set: set
|
|
169
|
+
};
|
|
170
|
+
} else {
|
|
171
|
+
value = newValue;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
for(var i = decs.length - 1; i >= 0; i--){
|
|
176
|
+
var dec = decs[i];
|
|
177
|
+
newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
|
|
178
|
+
if (newValue !== void 0) {
|
|
179
|
+
assertValidReturnValue(kind, newValue);
|
|
180
|
+
var newInit;
|
|
181
|
+
if (kind === 0) {
|
|
182
|
+
newInit = newValue;
|
|
183
|
+
} else if (kind === 1) {
|
|
184
|
+
newInit = newValue.init;
|
|
185
|
+
get = newValue.get || value.get;
|
|
186
|
+
set = newValue.set || value.set;
|
|
187
|
+
value = {
|
|
188
|
+
get: get,
|
|
189
|
+
set: set
|
|
190
|
+
};
|
|
191
|
+
} else {
|
|
192
|
+
value = newValue;
|
|
193
|
+
}
|
|
194
|
+
if (newInit !== void 0) {
|
|
195
|
+
if (init === void 0) {
|
|
196
|
+
init = newInit;
|
|
197
|
+
} else if (typeof init === "function") {
|
|
198
|
+
init = [
|
|
199
|
+
init,
|
|
200
|
+
newInit
|
|
201
|
+
];
|
|
202
|
+
} else {
|
|
203
|
+
init.push(newInit);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (kind === 0 || kind === 1) {
|
|
210
|
+
if (init === void 0) {
|
|
211
|
+
init = function(instance, init) {
|
|
212
|
+
return init;
|
|
213
|
+
};
|
|
214
|
+
} else if (typeof init !== "function") {
|
|
215
|
+
var ownInitializers = init;
|
|
216
|
+
init = function(instance, init) {
|
|
217
|
+
var value = init;
|
|
218
|
+
for(var i = 0; i < ownInitializers.length; i++){
|
|
219
|
+
value = ownInitializers[i].call(instance, value);
|
|
220
|
+
}
|
|
221
|
+
return value;
|
|
222
|
+
};
|
|
223
|
+
} else {
|
|
224
|
+
var originalInitializer = init;
|
|
225
|
+
init = function(instance, init) {
|
|
226
|
+
return originalInitializer.call(instance, init);
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
ret.push(init);
|
|
230
|
+
}
|
|
231
|
+
if (kind !== 0) {
|
|
232
|
+
if (kind === 1) {
|
|
233
|
+
desc.get = value.get;
|
|
234
|
+
desc.set = value.set;
|
|
235
|
+
} else if (kind === 2) {
|
|
236
|
+
desc.value = value;
|
|
237
|
+
} else if (kind === 3) {
|
|
238
|
+
desc.get = value;
|
|
239
|
+
} else if (kind === 4) {
|
|
240
|
+
desc.set = value;
|
|
241
|
+
}
|
|
242
|
+
if (isPrivate) {
|
|
243
|
+
if (kind === 1) {
|
|
244
|
+
ret.push(function(instance, args) {
|
|
245
|
+
return value.get.call(instance, args);
|
|
246
|
+
});
|
|
247
|
+
ret.push(function(instance, args) {
|
|
248
|
+
return value.set.call(instance, args);
|
|
249
|
+
});
|
|
250
|
+
} else if (kind === 2) {
|
|
251
|
+
ret.push(value);
|
|
252
|
+
} else {
|
|
253
|
+
ret.push(function(instance, args) {
|
|
254
|
+
return value.call(instance, args);
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
} else {
|
|
258
|
+
Object.defineProperty(base, name, desc);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function applyMemberDecs(Class, decInfos, metadata) {
|
|
263
|
+
var ret = [];
|
|
264
|
+
var protoInitializers;
|
|
265
|
+
var staticInitializers;
|
|
266
|
+
var existingProtoNonFields = new Map();
|
|
267
|
+
var existingStaticNonFields = new Map();
|
|
268
|
+
for(var i = 0; i < decInfos.length; i++){
|
|
269
|
+
var decInfo = decInfos[i];
|
|
270
|
+
if (!Array.isArray(decInfo)) continue;
|
|
271
|
+
var kind = decInfo[1];
|
|
272
|
+
var name = decInfo[2];
|
|
273
|
+
var isPrivate = decInfo.length > 3;
|
|
274
|
+
var isStatic = kind >= 5;
|
|
275
|
+
var base;
|
|
276
|
+
var initializers;
|
|
277
|
+
if (isStatic) {
|
|
278
|
+
base = Class;
|
|
279
|
+
kind = kind - 5;
|
|
280
|
+
staticInitializers = staticInitializers || [];
|
|
281
|
+
initializers = staticInitializers;
|
|
282
|
+
} else {
|
|
283
|
+
base = Class.prototype;
|
|
284
|
+
protoInitializers = protoInitializers || [];
|
|
285
|
+
initializers = protoInitializers;
|
|
286
|
+
}
|
|
287
|
+
if (kind !== 0 && !isPrivate) {
|
|
288
|
+
var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
|
|
289
|
+
var existingKind = existingNonFields.get(name) || 0;
|
|
290
|
+
if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) {
|
|
291
|
+
throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
|
|
292
|
+
} else if (!existingKind && kind > 2) {
|
|
293
|
+
existingNonFields.set(name, kind);
|
|
294
|
+
} else {
|
|
295
|
+
existingNonFields.set(name, true);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
|
|
299
|
+
}
|
|
300
|
+
pushInitializers(ret, protoInitializers);
|
|
301
|
+
pushInitializers(ret, staticInitializers);
|
|
302
|
+
return ret;
|
|
303
|
+
}
|
|
304
|
+
function pushInitializers(ret, initializers) {
|
|
305
|
+
if (initializers) {
|
|
306
|
+
ret.push(function(instance) {
|
|
307
|
+
for(var i = 0; i < initializers.length; i++){
|
|
308
|
+
initializers[i].call(instance);
|
|
309
|
+
}
|
|
310
|
+
return instance;
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
function applyClassDecs(targetClass, classDecs, metadata) {
|
|
315
|
+
if (classDecs.length > 0) {
|
|
316
|
+
var initializers = [];
|
|
317
|
+
var newClass = targetClass;
|
|
318
|
+
var name = targetClass.name;
|
|
319
|
+
for(var i = classDecs.length - 1; i >= 0; i--){
|
|
320
|
+
var decoratorFinishedRef = {
|
|
321
|
+
v: false
|
|
322
|
+
};
|
|
323
|
+
try {
|
|
324
|
+
var nextNewClass = classDecs[i](newClass, {
|
|
325
|
+
kind: "class",
|
|
326
|
+
name: name,
|
|
327
|
+
addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
|
|
328
|
+
metadata
|
|
329
|
+
});
|
|
330
|
+
} finally{
|
|
331
|
+
decoratorFinishedRef.v = true;
|
|
332
|
+
}
|
|
333
|
+
if (nextNewClass !== undefined) {
|
|
334
|
+
assertValidReturnValue(10, nextNewClass);
|
|
335
|
+
newClass = nextNewClass;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return [
|
|
339
|
+
defineMetadata(newClass, metadata),
|
|
340
|
+
function() {
|
|
341
|
+
for(var i = 0; i < initializers.length; i++){
|
|
342
|
+
initializers[i].call(newClass);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
];
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
function defineMetadata(Class, metadata) {
|
|
349
|
+
return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
|
|
350
|
+
configurable: true,
|
|
351
|
+
enumerable: true,
|
|
352
|
+
value: metadata
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
|
|
356
|
+
if (parentClass !== void 0) {
|
|
357
|
+
var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
|
|
358
|
+
}
|
|
359
|
+
var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
|
|
360
|
+
var e = applyMemberDecs(targetClass, memberDecs, metadata);
|
|
361
|
+
if (!classDecs.length) defineMetadata(targetClass, metadata);
|
|
362
|
+
return {
|
|
363
|
+
e: e,
|
|
364
|
+
get c () {
|
|
365
|
+
return applyClassDecs(targetClass, classDecs, metadata);
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
};
|
|
6
369
|
}
|
|
7
|
-
|
|
370
|
+
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
371
|
+
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
|
+
}
|
|
373
|
+
var _dec, _dec1, _initProto;
|
|
374
|
+
import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
|
|
375
|
+
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
8
376
|
import { createLogger } from '@aztec/foundation/log';
|
|
9
|
-
import {
|
|
377
|
+
import { RunningPromise } from '@aztec/foundation/promise';
|
|
378
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
379
|
+
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
380
|
+
import { L2BlockStream } from '@aztec/stdlib/block';
|
|
381
|
+
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
382
|
+
import { Attributes, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
10
383
|
import { getP2PDefaultConfig } from '../config.js';
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
384
|
+
import { TxPoolError } from '../errors/tx-pool.error.js';
|
|
385
|
+
import { TxProvider } from '../services/tx_provider.js';
|
|
386
|
+
import { P2PClientState } from './interface.js';
|
|
387
|
+
_dec = trackSpan('p2pClient.broadcastProposal', async (proposal)=>({
|
|
388
|
+
[Attributes.SLOT_NUMBER]: proposal.slotNumber,
|
|
389
|
+
[Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
|
|
390
|
+
[Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString()
|
|
391
|
+
})), _dec1 = trackSpan('p2pClient.broadcastCheckpointProposal', async (proposal)=>({
|
|
392
|
+
[Attributes.SLOT_NUMBER]: proposal.slotNumber,
|
|
393
|
+
[Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
|
|
394
|
+
[Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString()
|
|
395
|
+
}));
|
|
21
396
|
/**
|
|
22
397
|
* The P2P client implementation.
|
|
23
398
|
*/ export class P2PClient extends WithTracer {
|
|
399
|
+
store;
|
|
24
400
|
l2BlockSource;
|
|
25
401
|
p2pService;
|
|
402
|
+
txCollection;
|
|
403
|
+
txFileStore;
|
|
404
|
+
epochCache;
|
|
405
|
+
_dateProvider;
|
|
406
|
+
telemetry;
|
|
26
407
|
log;
|
|
408
|
+
static{
|
|
409
|
+
({ e: [_initProto] } = _apply_decs_2203_r(this, [
|
|
410
|
+
[
|
|
411
|
+
_dec,
|
|
412
|
+
2,
|
|
413
|
+
"broadcastProposal"
|
|
414
|
+
],
|
|
415
|
+
[
|
|
416
|
+
_dec1,
|
|
417
|
+
2,
|
|
418
|
+
"broadcastCheckpointProposal"
|
|
419
|
+
]
|
|
420
|
+
], []));
|
|
421
|
+
}
|
|
27
422
|
/** The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped. */ runningPromise;
|
|
28
423
|
currentState;
|
|
29
424
|
syncPromise;
|
|
30
425
|
syncResolve;
|
|
31
426
|
latestBlockNumberAtStart;
|
|
32
427
|
provenBlockNumberAtStart;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
428
|
+
finalizedBlockNumberAtStart;
|
|
429
|
+
l2Tips;
|
|
430
|
+
synchedLatestSlot;
|
|
36
431
|
txPool;
|
|
37
432
|
attestationPool;
|
|
38
|
-
|
|
39
|
-
/** How many slots to keep proven txs for. */ keepProvenTxsFor;
|
|
433
|
+
config;
|
|
40
434
|
blockStream;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
* @param log - A logger.
|
|
49
|
-
*/ constructor(_clientType, store, l2BlockSource, mempools, p2pService, config = {}, telemetry = getTelemetryClient(), log = createLogger('p2p')){
|
|
50
|
-
super(telemetry, 'P2PClient'), this.l2BlockSource = l2BlockSource, this.p2pService = p2pService, this.log = log, this.currentState = 0, this.syncPromise = Promise.resolve(), this.syncResolve = undefined, this.latestBlockNumberAtStart = -1, this.provenBlockNumberAtStart = -1;
|
|
51
|
-
const { keepProvenTxsInPoolFor, blockCheckIntervalMS, blockRequestBatchSize, keepAttestationsInPoolFor } = {
|
|
435
|
+
txProvider;
|
|
436
|
+
validatorAddresses;
|
|
437
|
+
/** Tracks the last slot for which we called prepareForSlot */ lastSlotProcessed;
|
|
438
|
+
/** Polls for slot changes and calls prepareForSlot on the tx pool */ slotMonitor;
|
|
439
|
+
constructor(store, l2BlockSource, mempools, p2pService, txCollection, txFileStore, epochCache, config = {}, _dateProvider = new DateProvider(), telemetry = getTelemetryClient(), log = createLogger('p2p')){
|
|
440
|
+
super(telemetry, 'P2PClient'), this.store = store, this.l2BlockSource = l2BlockSource, this.p2pService = p2pService, this.txCollection = txCollection, this.txFileStore = txFileStore, this.epochCache = epochCache, this._dateProvider = _dateProvider, this.telemetry = telemetry, this.log = log, this.currentState = (_initProto(this), P2PClientState.IDLE), this.syncPromise = Promise.resolve(), this.syncResolve = undefined, this.latestBlockNumberAtStart = -1, this.provenBlockNumberAtStart = -1, this.finalizedBlockNumberAtStart = -1, this.validatorAddresses = [], this.lastSlotProcessed = SlotNumber.ZERO;
|
|
441
|
+
this.config = {
|
|
52
442
|
...getP2PDefaultConfig(),
|
|
53
443
|
...config
|
|
54
444
|
};
|
|
55
|
-
this.keepProvenTxsFor = keepProvenTxsInPoolFor;
|
|
56
|
-
this.keepAttestationsInPoolFor = keepAttestationsInPoolFor;
|
|
57
|
-
const tracer = telemetry.getTracer('P2PL2BlockStream');
|
|
58
|
-
const logger = createLogger('p2p:l2-block-stream');
|
|
59
|
-
this.blockStream = new TraceableL2BlockStream(l2BlockSource, this, this, tracer, 'P2PL2BlockStream', logger, {
|
|
60
|
-
batchSize: blockRequestBatchSize,
|
|
61
|
-
pollIntervalMS: blockCheckIntervalMS
|
|
62
|
-
});
|
|
63
|
-
this.synchedBlockHashes = store.openMap('p2p_pool_block_hashes');
|
|
64
|
-
this.synchedLatestBlockNumber = store.openSingleton('p2p_pool_last_l2_block');
|
|
65
|
-
this.synchedProvenBlockNumber = store.openSingleton('p2p_pool_last_proven_l2_block');
|
|
66
445
|
this.txPool = mempools.txPool;
|
|
67
446
|
this.attestationPool = mempools.attestationPool;
|
|
447
|
+
this.txProvider = new TxProvider(this.txCollection, this.txPool, this, this.log.createChild('tx-provider'), this.telemetry);
|
|
448
|
+
this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
|
|
449
|
+
this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
|
|
450
|
+
}
|
|
451
|
+
registerThisValidatorAddresses(addresses) {
|
|
452
|
+
this.validatorAddresses = [
|
|
453
|
+
...addresses
|
|
454
|
+
];
|
|
455
|
+
this.p2pService.registerThisValidatorAddresses(this.validatorAddresses);
|
|
456
|
+
}
|
|
457
|
+
clear() {
|
|
458
|
+
return this.store.clear();
|
|
68
459
|
}
|
|
69
460
|
isP2PClient() {
|
|
70
461
|
return true;
|
|
71
462
|
}
|
|
463
|
+
getTxProvider() {
|
|
464
|
+
return this.txProvider;
|
|
465
|
+
}
|
|
72
466
|
getPeers(includePending) {
|
|
73
467
|
return Promise.resolve(this.p2pService.getPeers(includePending));
|
|
74
468
|
}
|
|
469
|
+
getGossipMeshPeerCount(topicType) {
|
|
470
|
+
return Promise.resolve(this.p2pService.getGossipMeshPeerCount(topicType));
|
|
471
|
+
}
|
|
75
472
|
getL2BlockHash(number) {
|
|
76
|
-
return this.
|
|
77
|
-
}
|
|
78
|
-
async
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
latestBlockHash = await this.synchedBlockHashes.getAsync(latestBlockNumber);
|
|
85
|
-
if (typeof latestBlockHash === 'undefined') {
|
|
86
|
-
this.log.warn(`Block hash for latest block ${latestBlockNumber} not found`);
|
|
87
|
-
throw new Error();
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
if (provenBlockNumber > 0) {
|
|
91
|
-
provenBlockHash = await this.synchedBlockHashes.getAsync(provenBlockNumber);
|
|
92
|
-
if (typeof provenBlockHash === 'undefined') {
|
|
93
|
-
this.log.warn(`Block hash for proven block ${provenBlockNumber} not found`);
|
|
94
|
-
throw new Error();
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return Promise.resolve({
|
|
98
|
-
latest: {
|
|
99
|
-
hash: latestBlockHash,
|
|
100
|
-
number: latestBlockNumber
|
|
101
|
-
},
|
|
102
|
-
proven: {
|
|
103
|
-
hash: provenBlockHash,
|
|
104
|
-
number: provenBlockNumber
|
|
105
|
-
},
|
|
106
|
-
finalized: {
|
|
107
|
-
hash: provenBlockHash,
|
|
108
|
-
number: provenBlockNumber
|
|
109
|
-
}
|
|
110
|
-
});
|
|
473
|
+
return this.l2Tips.getL2BlockHash(number);
|
|
474
|
+
}
|
|
475
|
+
async updateP2PConfig(config) {
|
|
476
|
+
await this.txPool.updateConfig(config);
|
|
477
|
+
this.p2pService.updateConfig(config);
|
|
478
|
+
}
|
|
479
|
+
getL2Tips() {
|
|
480
|
+
return this.l2Tips.getL2Tips();
|
|
111
481
|
}
|
|
112
482
|
async handleBlockStreamEvent(event) {
|
|
113
483
|
this.log.debug(`Handling block stream event ${event.type}`);
|
|
@@ -116,16 +486,24 @@ import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
|
116
486
|
await this.handleLatestL2Blocks(event.blocks);
|
|
117
487
|
break;
|
|
118
488
|
case 'chain-finalized':
|
|
119
|
-
break;
|
|
120
|
-
case 'chain-proven':
|
|
121
489
|
{
|
|
122
|
-
const
|
|
123
|
-
const
|
|
124
|
-
|
|
490
|
+
const oldFinalizedBlockNum = await this.getSyncedFinalizedBlockNum();
|
|
491
|
+
const from = BlockNumber(oldFinalizedBlockNum + 1);
|
|
492
|
+
const limit = event.block.number - from + 1;
|
|
493
|
+
if (limit > 0) {
|
|
494
|
+
const oldBlocks = await this.l2BlockSource.getBlocks(from, limit);
|
|
495
|
+
await this.handleFinalizedL2Blocks(oldBlocks);
|
|
496
|
+
}
|
|
125
497
|
break;
|
|
126
498
|
}
|
|
499
|
+
case 'chain-proven':
|
|
500
|
+
this.txCollection.stopCollectingForBlocksUpTo(event.block.number);
|
|
501
|
+
break;
|
|
127
502
|
case 'chain-pruned':
|
|
128
|
-
|
|
503
|
+
this.txCollection.stopCollectingForBlocksAfter(event.block.number);
|
|
504
|
+
await this.handlePruneL2Blocks(event.block, event.checkpoint);
|
|
505
|
+
break;
|
|
506
|
+
case 'chain-checkpointed':
|
|
129
507
|
break;
|
|
130
508
|
default:
|
|
131
509
|
{
|
|
@@ -133,9 +511,11 @@ import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
|
133
511
|
break;
|
|
134
512
|
}
|
|
135
513
|
}
|
|
514
|
+
// Pass the event through to our l2 tips store
|
|
515
|
+
await this.l2Tips.handleBlockStreamEvent(event);
|
|
516
|
+
await this.startServiceIfSynched();
|
|
136
517
|
}
|
|
137
518
|
#assertIsReady() {
|
|
138
|
-
// this.log.info('Checking if p2p client is ready, current state: ', this.currentState);
|
|
139
519
|
if (!this.isReady()) {
|
|
140
520
|
throw new Error('P2P client not ready');
|
|
141
521
|
}
|
|
@@ -144,107 +524,173 @@ import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
|
144
524
|
* Starts the P2P client.
|
|
145
525
|
* @returns An empty promise signalling the synching process.
|
|
146
526
|
*/ async start() {
|
|
147
|
-
if (this.currentState ===
|
|
527
|
+
if (this.currentState === P2PClientState.STOPPED) {
|
|
148
528
|
throw new Error('P2P client already stopped');
|
|
149
529
|
}
|
|
150
|
-
if (this.currentState !==
|
|
530
|
+
if (this.currentState !== P2PClientState.IDLE) {
|
|
151
531
|
return this.syncPromise;
|
|
152
532
|
}
|
|
533
|
+
// Start the tx pool first, as it needs to hydrate state from persistence
|
|
534
|
+
await this.txPool.start();
|
|
153
535
|
// get the current latest block numbers
|
|
154
|
-
|
|
155
|
-
this.
|
|
536
|
+
const latestBlockNumbers = await this.l2BlockSource.getL2Tips();
|
|
537
|
+
this.latestBlockNumberAtStart = latestBlockNumbers.proposed.number;
|
|
538
|
+
this.provenBlockNumberAtStart = latestBlockNumbers.proven.block.number;
|
|
539
|
+
this.finalizedBlockNumberAtStart = latestBlockNumbers.finalized.block.number;
|
|
156
540
|
const syncedLatestBlock = await this.getSyncedLatestBlockNum() + 1;
|
|
157
541
|
const syncedProvenBlock = await this.getSyncedProvenBlockNum() + 1;
|
|
158
|
-
|
|
159
|
-
if (
|
|
160
|
-
|
|
542
|
+
const syncedFinalizedBlock = await this.getSyncedFinalizedBlockNum() + 1;
|
|
543
|
+
if (await this.txPool.isEmpty() && await this.attestationPool.isEmpty()) {
|
|
544
|
+
// if mempools are empty, we don't care about syncing prior blocks
|
|
545
|
+
this.initBlockStream(BlockNumber(this.latestBlockNumberAtStart));
|
|
546
|
+
this.setCurrentState(P2PClientState.RUNNING);
|
|
547
|
+
this.syncPromise = Promise.resolve();
|
|
548
|
+
await this.p2pService.start();
|
|
549
|
+
this.log.info(`Starting p2p client from block ${this.latestBlockNumberAtStart} with empty mempools`);
|
|
550
|
+
} else if (syncedLatestBlock <= this.latestBlockNumberAtStart || syncedProvenBlock <= this.provenBlockNumberAtStart || syncedFinalizedBlock <= this.finalizedBlockNumberAtStart) {
|
|
551
|
+
// if there are blocks to be retrieved, go to a synching state
|
|
552
|
+
// this gets resolved on `startServiceIfSynched`
|
|
553
|
+
this.initBlockStream();
|
|
554
|
+
this.setCurrentState(P2PClientState.SYNCHING);
|
|
161
555
|
this.syncPromise = new Promise((resolve)=>{
|
|
162
556
|
this.syncResolve = resolve;
|
|
163
557
|
});
|
|
164
|
-
this.log.
|
|
558
|
+
this.log.info(`Initiating p2p sync from ${syncedLatestBlock}`, {
|
|
559
|
+
syncedLatestBlock,
|
|
560
|
+
syncedProvenBlock,
|
|
561
|
+
syncedFinalizedBlock
|
|
562
|
+
});
|
|
165
563
|
} else {
|
|
166
564
|
// if no blocks to be retrieved, go straight to running
|
|
167
|
-
this.
|
|
565
|
+
this.initBlockStream();
|
|
566
|
+
this.setCurrentState(P2PClientState.RUNNING);
|
|
168
567
|
this.syncPromise = Promise.resolve();
|
|
169
568
|
await this.p2pService.start();
|
|
170
|
-
this.log.
|
|
569
|
+
this.log.info(`Starting P2P client synced to ${syncedLatestBlock}`, {
|
|
570
|
+
syncedLatestBlock,
|
|
571
|
+
syncedProvenBlock,
|
|
572
|
+
syncedFinalizedBlock
|
|
573
|
+
});
|
|
171
574
|
}
|
|
172
575
|
this.blockStream.start();
|
|
173
|
-
this.
|
|
576
|
+
await this.txCollection.start();
|
|
577
|
+
this.txFileStore?.start();
|
|
578
|
+
// Start slot monitor to call prepareForSlot when the slot changes
|
|
579
|
+
this.slotMonitor = new RunningPromise(()=>this.maybeCallPrepareForSlot(), this.log, this.config.slotCheckIntervalMS);
|
|
580
|
+
this.slotMonitor.start();
|
|
174
581
|
return this.syncPromise;
|
|
175
582
|
}
|
|
583
|
+
addReqRespSubProtocol(subProtocol, handler, validator) {
|
|
584
|
+
return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
|
|
585
|
+
}
|
|
586
|
+
initBlockStream(startingBlock) {
|
|
587
|
+
if (!this.blockStream) {
|
|
588
|
+
const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
|
|
589
|
+
this.blockStream = new L2BlockStream(this.l2BlockSource, this, this, createLogger(`${this.log.module}:l2-block-stream`), {
|
|
590
|
+
batchSize,
|
|
591
|
+
pollIntervalMS,
|
|
592
|
+
startingBlock
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
}
|
|
176
596
|
/**
|
|
177
597
|
* Allows consumers to stop the instance of the P2P client.
|
|
178
598
|
* 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted.
|
|
179
599
|
*/ async stop() {
|
|
180
600
|
this.log.debug('Stopping p2p client...');
|
|
601
|
+
await this.slotMonitor?.stop();
|
|
602
|
+
this.log.debug('Stopped slot monitor');
|
|
603
|
+
await tryStop(this.txCollection);
|
|
604
|
+
this.log.debug('Stopped tx collection service');
|
|
605
|
+
await this.txFileStore?.stop();
|
|
606
|
+
this.log.debug('Stopped tx file store');
|
|
181
607
|
await this.p2pService.stop();
|
|
182
608
|
this.log.debug('Stopped p2p service');
|
|
183
|
-
await this.blockStream
|
|
609
|
+
await this.blockStream?.stop();
|
|
184
610
|
this.log.debug('Stopped block downloader');
|
|
611
|
+
await this.txPool.stop();
|
|
612
|
+
this.log.debug('Stopped tx pool');
|
|
185
613
|
await this.runningPromise;
|
|
186
|
-
this.setCurrentState(
|
|
187
|
-
this.log.info('P2P client stopped
|
|
614
|
+
this.setCurrentState(P2PClientState.STOPPED);
|
|
615
|
+
this.log.info('P2P client stopped');
|
|
616
|
+
}
|
|
617
|
+
/** Triggers a sync to the archiver. Used for testing. */ async sync() {
|
|
618
|
+
this.initBlockStream();
|
|
619
|
+
await this.blockStream.sync();
|
|
620
|
+
}
|
|
621
|
+
async broadcastProposal(proposal) {
|
|
622
|
+
this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber} to peers`);
|
|
623
|
+
// Store our own proposal so we can respond to req/resp requests for it
|
|
624
|
+
const { count } = await this.attestationPool.tryAddBlockProposal(proposal);
|
|
625
|
+
if (count > 1) {
|
|
626
|
+
if (this.config.broadcastEquivocatedProposals) {
|
|
627
|
+
this.log.warn(`Broadcasting equivocated block proposal for slot ${proposal.slotNumber}`, {
|
|
628
|
+
slot: proposal.slotNumber,
|
|
629
|
+
archive: proposal.archive.toString(),
|
|
630
|
+
count
|
|
631
|
+
});
|
|
632
|
+
} else {
|
|
633
|
+
throw new Error(`Attempted to broadcast a duplicate block proposal for slot ${proposal.slotNumber}`);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
return this.p2pService.propagate(proposal);
|
|
188
637
|
}
|
|
189
|
-
|
|
190
|
-
this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber
|
|
638
|
+
async broadcastCheckpointProposal(proposal) {
|
|
639
|
+
this.log.verbose(`Broadcasting checkpoint proposal for slot ${proposal.slotNumber} to peers`);
|
|
640
|
+
const blockProposal = proposal.getBlockProposal();
|
|
641
|
+
if (blockProposal) {
|
|
642
|
+
// Store our own last-block proposal so we can respond to req/resp requests for it.
|
|
643
|
+
await this.attestationPool.tryAddBlockProposal(blockProposal);
|
|
644
|
+
}
|
|
191
645
|
return this.p2pService.propagate(proposal);
|
|
192
646
|
}
|
|
193
|
-
async
|
|
194
|
-
|
|
647
|
+
async broadcastCheckpointAttestations(attestations) {
|
|
648
|
+
this.log.verbose(`Broadcasting ${attestations.length} checkpoint attestations to peers`);
|
|
649
|
+
await Promise.all(attestations.map((att)=>this.p2pService.propagate(att)));
|
|
650
|
+
}
|
|
651
|
+
async getCheckpointAttestationsForSlot(slot, proposalId) {
|
|
652
|
+
return await (proposalId ? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalId) : this.attestationPool.getCheckpointAttestationsForSlot(slot));
|
|
653
|
+
}
|
|
654
|
+
addOwnCheckpointAttestations(attestations) {
|
|
655
|
+
return this.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
656
|
+
}
|
|
657
|
+
hasBlockProposalsForSlot(slot) {
|
|
658
|
+
return this.attestationPool.hasBlockProposalsForSlot(slot);
|
|
195
659
|
}
|
|
196
660
|
// REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
197
661
|
// ^ This pattern is not my favorite (md)
|
|
198
662
|
registerBlockProposalHandler(handler) {
|
|
199
663
|
this.p2pService.registerBlockReceivedCallback(handler);
|
|
200
664
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
*
|
|
204
|
-
* If a transaction can be retrieved, it will be returned, if not an undefined
|
|
205
|
-
* will be returned. In place.
|
|
206
|
-
*
|
|
207
|
-
* @param txHashes - The hashes of the transactions to request.
|
|
208
|
-
* @returns A promise that resolves to an array of transactions or undefined.
|
|
209
|
-
*/ async requestTxs(txHashes) {
|
|
210
|
-
const res = await this.p2pService.sendBatchRequest(ReqRespSubProtocol.TX, txHashes);
|
|
211
|
-
return Promise.resolve(res ?? []);
|
|
665
|
+
registerCheckpointProposalHandler(handler) {
|
|
666
|
+
this.p2pService.registerCheckpointReceivedCallback(handler);
|
|
212
667
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
*
|
|
216
|
-
* If the underlying request response protocol fails, then we return undefined.
|
|
217
|
-
* If it succeeds then we add the transaction to our transaction pool and return.
|
|
218
|
-
*
|
|
219
|
-
* @param txHash - The hash of the transaction to request.
|
|
220
|
-
* @returns A promise that resolves to a transaction or undefined.
|
|
221
|
-
*/ async requestTxByHash(txHash) {
|
|
222
|
-
const tx = await this.p2pService.sendRequest(ReqRespSubProtocol.TX, txHash);
|
|
223
|
-
if (tx) {
|
|
224
|
-
this.log.debug(`Received tx ${txHash.toString()} from peer`);
|
|
225
|
-
await this.txPool.addTxs([
|
|
226
|
-
tx
|
|
227
|
-
]);
|
|
228
|
-
} else {
|
|
229
|
-
this.log.debug(`Failed to receive tx ${txHash.toString()} from peer`);
|
|
230
|
-
}
|
|
231
|
-
return tx;
|
|
668
|
+
registerDuplicateProposalCallback(callback) {
|
|
669
|
+
this.p2pService.registerDuplicateProposalCallback(callback);
|
|
232
670
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
*/ async requestTxsByHash(txHashes) {
|
|
236
|
-
const txs = await this.p2pService.sendBatchRequest(ReqRespSubProtocol.TX, txHashes) ?? [];
|
|
237
|
-
await this.txPool.addTxs(txs);
|
|
238
|
-
const txHashesStr = txHashes.map((tx)=>tx.toString()).join(', ');
|
|
239
|
-
this.log.debug(`Received batched txs ${txHashesStr} (${txs.length} / ${txHashes.length}}) from peers`);
|
|
240
|
-
return txs;
|
|
671
|
+
registerDuplicateAttestationCallback(callback) {
|
|
672
|
+
this.p2pService.registerDuplicateAttestationCallback(callback);
|
|
241
673
|
}
|
|
242
|
-
getPendingTxs() {
|
|
243
|
-
|
|
674
|
+
async getPendingTxs(limit, after) {
|
|
675
|
+
if (limit !== undefined && limit <= 0) {
|
|
676
|
+
throw new TypeError('limit must be greater than 0');
|
|
677
|
+
}
|
|
678
|
+
let txHashes = await this.txPool.getPendingTxHashes();
|
|
679
|
+
let startIndex = 0;
|
|
680
|
+
if (after) {
|
|
681
|
+
startIndex = txHashes.findIndex((txHash)=>after.equals(txHash));
|
|
682
|
+
if (startIndex === -1) {
|
|
683
|
+
return [];
|
|
684
|
+
}
|
|
685
|
+
startIndex++;
|
|
686
|
+
}
|
|
687
|
+
const endIndex = limit !== undefined ? startIndex + limit : undefined;
|
|
688
|
+
txHashes = txHashes.slice(startIndex, endIndex);
|
|
689
|
+
const maybeTxs = await Promise.all(txHashes.map((txHash)=>this.txPool.getTxByHash(txHash)));
|
|
690
|
+
return maybeTxs.filter((tx)=>!!tx);
|
|
244
691
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
return pendingTxs.length;
|
|
692
|
+
getPendingTxCount() {
|
|
693
|
+
return this.txPool.getPendingTxCount();
|
|
248
694
|
}
|
|
249
695
|
async *iteratePendingTxs() {
|
|
250
696
|
for (const txHash of (await this.txPool.getPendingTxHashes())){
|
|
@@ -254,23 +700,12 @@ import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
|
254
700
|
}
|
|
255
701
|
}
|
|
256
702
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
} else if (filter === 'mined') {
|
|
264
|
-
const minedHashes = await this.txPool.getMinedTxHashes();
|
|
265
|
-
const minedTx = await Promise.all(minedHashes.map(([txHash])=>this.txPool.getTxByHash(txHash)));
|
|
266
|
-
return minedTx.filter((tx)=>!!tx);
|
|
267
|
-
} else if (filter === 'pending') {
|
|
268
|
-
const pendingHashses = await this.txPool.getPendingTxHashes();
|
|
269
|
-
const pendingTxs = await Promise.all(pendingHashses.map((txHash)=>this.txPool.getTxByHash(txHash)));
|
|
270
|
-
return pendingTxs.filter((tx)=>!!tx);
|
|
271
|
-
} else {
|
|
272
|
-
const _ = filter;
|
|
273
|
-
throw new Error(`Unknown filter ${filter}`);
|
|
703
|
+
async *iterateEligiblePendingTxs() {
|
|
704
|
+
for (const txHash of (await this.txPool.getEligiblePendingTxHashes())){
|
|
705
|
+
const tx = await this.txPool.getTxByHash(txHash);
|
|
706
|
+
if (tx) {
|
|
707
|
+
yield tx;
|
|
708
|
+
}
|
|
274
709
|
}
|
|
275
710
|
}
|
|
276
711
|
/**
|
|
@@ -281,33 +716,14 @@ import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
|
281
716
|
return this.txPool.getTxByHash(txHash);
|
|
282
717
|
}
|
|
283
718
|
/**
|
|
284
|
-
* Returns a transaction in the transaction pool by its hash.
|
|
285
|
-
* If the transaction is not in the pool, it will be requested from the network.
|
|
286
|
-
* @param txHash - Hash of the transaction to look for in the pool.
|
|
287
|
-
* @returns A single tx or undefined.
|
|
288
|
-
*/ async getTxByHash(txHash) {
|
|
289
|
-
const tx = await this.txPool.getTxByHash(txHash);
|
|
290
|
-
if (tx) {
|
|
291
|
-
return tx;
|
|
292
|
-
}
|
|
293
|
-
return this.requestTxByHash(txHash);
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
719
|
* Returns transactions in the transaction pool by hash.
|
|
297
|
-
* If a transaction is not in the pool, it will be requested from the network.
|
|
298
720
|
* @param txHashes - Hashes of the transactions to look for.
|
|
299
|
-
* @returns The txs found,
|
|
300
|
-
*/
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
]).filter(([tx, _index])=>!tx).map(([_tx, index])=>txHashes[index]);
|
|
306
|
-
if (missingTxHashes.length === 0) {
|
|
307
|
-
return txs;
|
|
308
|
-
}
|
|
309
|
-
const missingTxs = await this.requestTxsByHash(missingTxHashes);
|
|
310
|
-
return txs.filter((tx)=>!!tx).concat(missingTxs);
|
|
721
|
+
* @returns The txs found, in the same order as the requested hashes. If a tx is not found, it will be undefined.
|
|
722
|
+
*/ getTxsByHashFromPool(txHashes) {
|
|
723
|
+
return this.txPool.getTxsByHash(txHashes);
|
|
724
|
+
}
|
|
725
|
+
hasTxsInPool(txHashes) {
|
|
726
|
+
return this.txPool.hasTxs(txHashes);
|
|
311
727
|
}
|
|
312
728
|
/**
|
|
313
729
|
* Returns an archived transaction in the transaction pool by its hash.
|
|
@@ -317,22 +733,35 @@ import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
|
317
733
|
return this.txPool.getArchivedTxByHash(txHash);
|
|
318
734
|
}
|
|
319
735
|
/**
|
|
320
|
-
*
|
|
321
|
-
* @param tx - The tx to
|
|
736
|
+
* Accepts a transaction, adds it to local tx pool and forwards it to other peers.
|
|
737
|
+
* @param tx - The tx to send.
|
|
322
738
|
* @returns Empty promise.
|
|
323
739
|
**/ async sendTx(tx) {
|
|
324
740
|
this.#assertIsReady();
|
|
325
|
-
await this.txPool.
|
|
741
|
+
const result = await this.txPool.addPendingTxs([
|
|
326
742
|
tx
|
|
327
|
-
]
|
|
328
|
-
|
|
743
|
+
], {
|
|
744
|
+
feeComparisonOnly: true
|
|
745
|
+
});
|
|
746
|
+
if (result.accepted.length === 1) {
|
|
747
|
+
await this.p2pService.propagate(tx);
|
|
748
|
+
return;
|
|
749
|
+
}
|
|
750
|
+
const txHashStr = tx.getTxHash().toString();
|
|
751
|
+
const reason = result.errors?.get(txHashStr);
|
|
752
|
+
if (reason) {
|
|
753
|
+
this.log.warn(`Tx ${txHashStr} not added to pool: ${reason.message}`);
|
|
754
|
+
throw new TxPoolError(reason);
|
|
755
|
+
}
|
|
756
|
+
this.log.warn(`Tx ${txHashStr} not propagated: accepted=${result.accepted.length} ignored=${result.ignored.length} rejected=${result.rejected.length}`);
|
|
329
757
|
}
|
|
330
758
|
/**
|
|
331
759
|
* Returns whether the given tx hash is flagged as pending or mined.
|
|
332
760
|
* @param txHash - Hash of the tx to query.
|
|
333
761
|
* @returns Pending or mined depending on its status, or undefined if not found.
|
|
334
|
-
*/ getTxStatus(txHash) {
|
|
335
|
-
|
|
762
|
+
*/ async getTxStatus(txHash) {
|
|
763
|
+
const status = await this.txPool.getTxStatus(txHash);
|
|
764
|
+
return status === 'protected' ? 'pending' : status;
|
|
336
765
|
}
|
|
337
766
|
getEnr() {
|
|
338
767
|
return this.p2pService.getEnr();
|
|
@@ -341,38 +770,45 @@ import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
|
341
770
|
return Promise.resolve(this.p2pService.getEnr()?.encodeTxt());
|
|
342
771
|
}
|
|
343
772
|
/**
|
|
344
|
-
*
|
|
345
|
-
*
|
|
346
|
-
|
|
347
|
-
* @returns Empty promise.
|
|
348
|
-
**/ async deleteTxs(txHashes) {
|
|
773
|
+
* Handles failed transaction execution by removing txs from the pool.
|
|
774
|
+
* @param txHashes - Hashes of the transactions that failed execution.
|
|
775
|
+
**/ async handleFailedExecution(txHashes) {
|
|
349
776
|
this.#assertIsReady();
|
|
350
|
-
await this.txPool.
|
|
777
|
+
await this.txPool.handleFailedExecution(txHashes);
|
|
351
778
|
}
|
|
352
779
|
/**
|
|
353
780
|
* Public function to check if the p2p client is fully synced and ready to receive txs.
|
|
354
781
|
* @returns True if the P2P client is ready to receive txs.
|
|
355
782
|
*/ isReady() {
|
|
356
|
-
return this.currentState ===
|
|
783
|
+
return this.currentState === P2PClientState.RUNNING;
|
|
357
784
|
}
|
|
358
785
|
/**
|
|
359
786
|
* Public function to check the latest block number that the P2P client is synced to.
|
|
360
787
|
* @returns Block number of latest L2 Block we've synced with.
|
|
361
788
|
*/ async getSyncedLatestBlockNum() {
|
|
362
|
-
|
|
789
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
790
|
+
return tips.proposed.number;
|
|
363
791
|
}
|
|
364
792
|
/**
|
|
365
793
|
* Public function to check the latest proven block number that the P2P client is synced to.
|
|
366
794
|
* @returns Block number of latest proven L2 Block we've synced with.
|
|
367
795
|
*/ async getSyncedProvenBlockNum() {
|
|
368
|
-
|
|
796
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
797
|
+
return tips.proven.block.number;
|
|
798
|
+
}
|
|
799
|
+
async getSyncedFinalizedBlockNum() {
|
|
800
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
801
|
+
return tips.finalized.block.number;
|
|
802
|
+
}
|
|
803
|
+
/** Returns latest L2 slot for which we have seen an L2 block. */ async getSyncedLatestSlot() {
|
|
804
|
+
return await this.synchedLatestSlot.getAsync() ?? BigInt(0);
|
|
369
805
|
}
|
|
370
806
|
/**
|
|
371
807
|
* Method to check the status the p2p client.
|
|
372
808
|
* @returns Information about p2p client status: state & syncedToBlockNum.
|
|
373
809
|
*/ async getStatus() {
|
|
374
810
|
const blockNumber = await this.getSyncedLatestBlockNum();
|
|
375
|
-
const blockHash = blockNumber === 0 ?
|
|
811
|
+
const blockHash = blockNumber === 0 ? GENESIS_BLOCK_HEADER_HASH.toString() : await this.l2BlockSource.getBlockHeader(blockNumber).then((header)=>header?.hash()).then((hash)=>hash?.toString());
|
|
376
812
|
return {
|
|
377
813
|
state: this.currentState,
|
|
378
814
|
syncedToL2Block: {
|
|
@@ -382,24 +818,12 @@ import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
|
382
818
|
};
|
|
383
819
|
}
|
|
384
820
|
/**
|
|
385
|
-
*
|
|
386
|
-
* @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
|
|
387
|
-
* @returns Empty promise.
|
|
388
|
-
*/ async markTxsAsMinedFromBlocks(blocks) {
|
|
389
|
-
for (const block of blocks){
|
|
390
|
-
const txHashes = block.body.txEffects.map((txEffect)=>txEffect.txHash);
|
|
391
|
-
await this.txPool.markAsMined(txHashes, block.number);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
/**
|
|
395
|
-
* Deletes txs from these blocks.
|
|
821
|
+
* Handles mined blocks by marking the txs in them as mined.
|
|
396
822
|
* @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with.
|
|
397
823
|
* @returns Empty promise.
|
|
398
|
-
*/ async
|
|
399
|
-
this.log.debug(`Deleting txs from blocks ${blocks[0].number} to ${blocks[blocks.length - 1].number}`);
|
|
824
|
+
*/ async handleMinedBlocks(blocks) {
|
|
400
825
|
for (const block of blocks){
|
|
401
|
-
|
|
402
|
-
await this.txPool.deleteTxs(txHashes);
|
|
826
|
+
await this.txPool.handleMinedBlock(block);
|
|
403
827
|
}
|
|
404
828
|
}
|
|
405
829
|
/**
|
|
@@ -408,78 +832,111 @@ import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
|
408
832
|
* @returns Empty promise.
|
|
409
833
|
*/ async handleLatestL2Blocks(blocks) {
|
|
410
834
|
if (!blocks.length) {
|
|
411
|
-
return
|
|
835
|
+
return;
|
|
836
|
+
}
|
|
837
|
+
await this.handleMinedBlocks(blocks);
|
|
838
|
+
await this.maybeCallPrepareForSlot();
|
|
839
|
+
await this.startCollectingMissingTxs(blocks);
|
|
840
|
+
const lastBlock = blocks.at(-1);
|
|
841
|
+
await this.synchedLatestSlot.set(BigInt(lastBlock.header.getSlot()));
|
|
842
|
+
}
|
|
843
|
+
/** Request txs for unproven blocks so the prover node has more chances to get them. */ async startCollectingMissingTxs(blocks) {
|
|
844
|
+
try {
|
|
845
|
+
// TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
|
|
846
|
+
// be much lower than the actual one, and it does not update until the pending chain is
|
|
847
|
+
// fully synced. This could lead to a ton of tx collection requests for blocks that
|
|
848
|
+
// are already proven, but the archiver has not yet updated its state. Until this is properly
|
|
849
|
+
// fixed, it is mitigated by the expiration date of collection requests, which depends on
|
|
850
|
+
// the slot number of the block.
|
|
851
|
+
const provenBlockNumber = await this.l2BlockSource.getProvenBlockNumber();
|
|
852
|
+
const unprovenBlocks = blocks.filter((block)=>block.number > provenBlockNumber);
|
|
853
|
+
for (const block of unprovenBlocks){
|
|
854
|
+
const txHashes = block.body.txEffects.map((txEffect)=>txEffect.txHash);
|
|
855
|
+
const missingTxHashes = await this.txPool.hasTxs(txHashes).then((availability)=>txHashes.filter((_, index)=>!availability[index]));
|
|
856
|
+
if (missingTxHashes.length > 0) {
|
|
857
|
+
this.log.verbose(`Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`, {
|
|
858
|
+
missingTxHashes,
|
|
859
|
+
blockNumber: block.number,
|
|
860
|
+
blockHash: await block.hash().then((h)=>h.toString())
|
|
861
|
+
});
|
|
862
|
+
this.txCollection.startCollecting(block, missingTxHashes);
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
} catch (err) {
|
|
866
|
+
this.log.error(`Error while starting collection of missing txs for unproven blocks`, err);
|
|
412
867
|
}
|
|
413
|
-
await this.markTxsAsMinedFromBlocks(blocks);
|
|
414
|
-
const lastBlockNum = blocks[blocks.length - 1].number;
|
|
415
|
-
await Promise.all(blocks.map(async (block)=>this.synchedBlockHashes.set(block.number, (await block.hash()).toString())));
|
|
416
|
-
await this.synchedLatestBlockNumber.set(lastBlockNum);
|
|
417
|
-
this.log.verbose(`Synched to latest block ${lastBlockNum}`);
|
|
418
|
-
await this.startServiceIfSynched();
|
|
419
868
|
}
|
|
420
869
|
/**
|
|
421
|
-
* Handles new
|
|
422
|
-
* @param blocks - A list of
|
|
870
|
+
* Handles new finalized blocks by deleting the txs and attestations in them.
|
|
871
|
+
* @param blocks - A list of finalized L2 blocks.
|
|
423
872
|
* @returns Empty promise.
|
|
424
|
-
*/ async
|
|
873
|
+
*/ async handleFinalizedL2Blocks(blocks) {
|
|
425
874
|
if (!blocks.length) {
|
|
426
|
-
return
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
const
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
if (this.keepProvenTxsFor === 0) {
|
|
433
|
-
await this.deleteTxsFromBlocks(blocks);
|
|
434
|
-
} else if (lastBlockNum - this.keepProvenTxsFor >= INITIAL_L2_BLOCK_NUM) {
|
|
435
|
-
const fromBlock = Math.max(INITIAL_L2_BLOCK_NUM, firstBlockNum - this.keepProvenTxsFor);
|
|
436
|
-
const toBlock = lastBlockNum - this.keepProvenTxsFor;
|
|
437
|
-
const limit = toBlock - fromBlock + 1;
|
|
438
|
-
const blocksToDeleteTxsFrom = await this.l2BlockSource.getBlocks(fromBlock, limit, true);
|
|
439
|
-
await this.deleteTxsFromBlocks(blocksToDeleteTxsFrom);
|
|
440
|
-
}
|
|
441
|
-
// We delete attestations older than the last block slot minus the number of slots we want to keep in the pool.
|
|
442
|
-
const lastBlockSlotMinusKeepAttestationsInPoolFor = lastBlockSlot - BigInt(this.keepAttestationsInPoolFor);
|
|
443
|
-
if (lastBlockSlotMinusKeepAttestationsInPoolFor >= BigInt(INITIAL_L2_BLOCK_NUM)) {
|
|
444
|
-
await this.attestationPool?.deleteAttestationsOlderThan(lastBlockSlotMinusKeepAttestationsInPoolFor);
|
|
445
|
-
}
|
|
446
|
-
await this.synchedProvenBlockNumber.set(lastBlockNum);
|
|
447
|
-
this.log.debug(`Synched to proven block ${lastBlockNum}`);
|
|
448
|
-
await this.startServiceIfSynched();
|
|
875
|
+
return;
|
|
876
|
+
}
|
|
877
|
+
// Finalization is monotonic, so we only need to call with the last block
|
|
878
|
+
const lastBlock = blocks.at(-1);
|
|
879
|
+
await this.txPool.handleFinalizedBlock(lastBlock.header);
|
|
880
|
+
await this.attestationPool.deleteOlderThan(lastBlock.header.getSlot());
|
|
449
881
|
}
|
|
450
882
|
/**
|
|
451
883
|
* Updates the tx pool after a chain prune.
|
|
452
|
-
*
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
884
|
+
* Detects epoch prunes (checkpoint number changed) and deletes all txs in that case.
|
|
885
|
+
* @param latestBlock - The block ID the chain was pruned to.
|
|
886
|
+
* @param newCheckpoint - The checkpoint ID after the prune.
|
|
887
|
+
*/ async handlePruneL2Blocks(latestBlock, newCheckpoint) {
|
|
888
|
+
const deleteAllTxs = this.config.txPoolDeleteTxsAfterReorg && await this.isEpochPrune(newCheckpoint);
|
|
889
|
+
await this.txPool.handlePrunedBlocks(latestBlock, {
|
|
890
|
+
deleteAllTxs
|
|
891
|
+
});
|
|
892
|
+
}
|
|
893
|
+
/**
|
|
894
|
+
* Returns true if the prune is an epoch prune (new checkpoint number is less than old).
|
|
895
|
+
* If the checkpoint number stays the same or increases, the prune is within a checkpoint.
|
|
896
|
+
*/ async isEpochPrune(newCheckpoint) {
|
|
897
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
898
|
+
const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
|
|
899
|
+
if (oldCheckpointNumber <= CheckpointNumber.INITIAL) {
|
|
900
|
+
return false;
|
|
460
901
|
}
|
|
461
|
-
|
|
462
|
-
//
|
|
463
|
-
|
|
464
|
-
//
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
}
|
|
902
|
+
const newCheckpointNumber = newCheckpoint.number;
|
|
903
|
+
// We check that the new checkpoint number is less than the old checkpoint number in order to consider it an epoch prune.
|
|
904
|
+
// To be more certain that it is an epoch prune, we will check that at least 2 checkpoints were removed.
|
|
905
|
+
// This means we should avoid thinking checkpoints removed by L1 re-orgs are epoch prunes
|
|
906
|
+
const thresholdForEpochPrune = CheckpointNumber(oldCheckpointNumber - 2);
|
|
907
|
+
const isEpochPrune = newCheckpointNumber <= thresholdForEpochPrune;
|
|
908
|
+
if (isEpochPrune) {
|
|
909
|
+
this.log.info(`Detected epoch prune to ${newCheckpointNumber}`, {
|
|
910
|
+
oldCheckpointNumber,
|
|
911
|
+
newCheckpointNumber,
|
|
912
|
+
thresholdForEpochPrune
|
|
913
|
+
});
|
|
473
914
|
}
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
915
|
+
return isEpochPrune;
|
|
916
|
+
}
|
|
917
|
+
/** Checks if the slot has changed and calls prepareForSlot if so. */ async maybeCallPrepareForSlot() {
|
|
918
|
+
const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
|
|
919
|
+
if (currentSlot <= this.lastSlotProcessed) {
|
|
920
|
+
return;
|
|
921
|
+
}
|
|
922
|
+
this.lastSlotProcessed = currentSlot;
|
|
923
|
+
await this.txPool.prepareForSlot(currentSlot);
|
|
478
924
|
}
|
|
479
925
|
async startServiceIfSynched() {
|
|
480
|
-
if (this.currentState
|
|
481
|
-
|
|
482
|
-
|
|
926
|
+
if (this.currentState !== P2PClientState.SYNCHING) {
|
|
927
|
+
return;
|
|
928
|
+
}
|
|
929
|
+
const tips = await this.l2Tips.getL2Tips();
|
|
930
|
+
const syncedFinalizedBlock = tips.finalized.block.number;
|
|
931
|
+
const syncedProvenBlock = tips.proven.block.number;
|
|
932
|
+
const syncedLatestBlock = tips.proposed.number;
|
|
933
|
+
if (syncedLatestBlock >= this.latestBlockNumberAtStart && syncedProvenBlock >= this.provenBlockNumberAtStart && syncedFinalizedBlock >= this.finalizedBlockNumberAtStart) {
|
|
934
|
+
this.log.info(`Completed P2P client sync to block ${syncedLatestBlock}. Starting service.`, {
|
|
935
|
+
syncedLatestBlock,
|
|
936
|
+
syncedProvenBlock,
|
|
937
|
+
syncedFinalizedBlock
|
|
938
|
+
});
|
|
939
|
+
this.setCurrentState(P2PClientState.RUNNING);
|
|
483
940
|
if (this.syncResolve !== undefined) {
|
|
484
941
|
this.syncResolve();
|
|
485
942
|
await this.p2pService.start();
|
|
@@ -494,12 +951,26 @@ import { ReqRespSubProtocol } from '../services/reqresp/interface.js';
|
|
|
494
951
|
this.currentState = newState;
|
|
495
952
|
this.log.debug(`Moved from state ${P2PClientState[oldState]} to ${P2PClientState[this.currentState]}`);
|
|
496
953
|
}
|
|
954
|
+
validateTxsReceivedInBlockProposal(txs) {
|
|
955
|
+
return this.p2pService.validateTxsReceivedInBlockProposal(txs);
|
|
956
|
+
}
|
|
957
|
+
/**
|
|
958
|
+
* Protects existing transactions by hash for a given slot.
|
|
959
|
+
* Returns hashes of transactions that weren't found in the pool.
|
|
960
|
+
* @param txHashes - Hashes of the transactions to protect.
|
|
961
|
+
* @param blockHeader - The block header providing slot context.
|
|
962
|
+
* @returns Hashes of transactions not found in the pool.
|
|
963
|
+
*/ protectTxs(txHashes, blockHeader) {
|
|
964
|
+
return this.txPool.protectTxs(txHashes, blockHeader);
|
|
965
|
+
}
|
|
966
|
+
/**
|
|
967
|
+
* Prepares the pool for a new slot.
|
|
968
|
+
* Unprotects transactions from earlier slots and validates them.
|
|
969
|
+
* @param slotNumber - The slot number to prepare for
|
|
970
|
+
*/ async prepareForSlot(slotNumber) {
|
|
971
|
+
await this.txPool.prepareForSlot(slotNumber);
|
|
972
|
+
}
|
|
973
|
+
handleAuthRequestFromPeer(authRequest, peerId) {
|
|
974
|
+
return this.p2pService.handleAuthRequestFromPeer(authRequest, peerId);
|
|
975
|
+
}
|
|
497
976
|
}
|
|
498
|
-
_ts_decorate([
|
|
499
|
-
trackSpan('p2pClient.broadcastProposal', async (proposal)=>({
|
|
500
|
-
[Attributes.BLOCK_NUMBER]: proposal.blockNumber.toNumber(),
|
|
501
|
-
[Attributes.SLOT_NUMBER]: proposal.slotNumber.toNumber(),
|
|
502
|
-
[Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
|
|
503
|
-
[Attributes.P2P_ID]: (await proposal.p2pMessageIdentifier()).toString()
|
|
504
|
-
}))
|
|
505
|
-
], P2PClient.prototype, "broadcastProposal", null);
|