@aztec/p2p 0.0.1-commit.993d52e → 0.0.1-commit.9a89641
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 +130 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +22 -6
- package/dest/client/factory.d.ts +5 -4
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +39 -16
- package/dest/client/interface.d.ts +52 -12
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +34 -19
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +120 -73
- package/dest/config.d.ts +160 -110
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +139 -49
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +9 -16
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +10 -17
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +101 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +274 -197
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +224 -65
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +6 -4
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +12 -5
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +38 -17
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -4
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +3 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +6 -7
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +6 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +41 -9
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +17 -8
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +20 -7
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +55 -41
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -4
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +23 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +17 -3
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +234 -120
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +11 -5
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +11 -5
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +35 -10
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +128 -56
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
- 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.js +1 -1
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +36 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +25 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +55 -16
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +53 -7
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
- package/dest/msg_validators/tx_validator/index.d.ts +4 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +3 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/msg_validators/tx_validator/timestamp_validator.js +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +5 -5
- package/dest/services/discv5/discV5_service.d.ts +13 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +119 -23
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +15 -15
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +15 -16
- package/dest/services/encoding.d.ts +23 -6
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +32 -16
- package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +4 -14
- package/dest/services/libp2p/instrumentation.d.ts +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -0
- package/dest/services/libp2p/libp2p_service.d.ts +46 -47
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +460 -320
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- package/dest/services/peer-manager/peer_manager.d.ts +20 -3
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +83 -26
- package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +102 -13
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +94 -122
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- package/dest/services/reqresp/config.d.ts +15 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +11 -0
- package/dest/services/reqresp/interface.d.ts +16 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -20
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +75 -216
- package/dest/services/service.d.ts +29 -12
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +2 -23
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +2 -55
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/index.d.ts +2 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +0 -1
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +0 -2
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/tx_collection.d.ts +36 -55
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +275 -119
- package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +2 -2
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +13 -8
- package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +4 -14
- package/dest/services/tx_provider.d.ts +3 -1
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +3 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -2
- package/dest/test-helpers/mock-pubsub.d.ts +23 -9
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +44 -44
- package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +16 -18
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +15 -14
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +51 -16
- package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +104 -41
- package/dest/testbench/worker_client_manager.d.ts +12 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +57 -11
- package/dest/util.d.ts +12 -7
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +15 -16
- package/src/bootstrap/bootstrap.ts +17 -3
- package/src/client/factory.ts +62 -9
- package/src/client/interface.ts +48 -18
- package/src/client/p2p_client.ts +140 -106
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +241 -57
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +13 -19
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +329 -243
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +27 -17
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +4 -5
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -7
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -6
- package/src/mem_pools/tx_pool_v2/interfaces.ts +40 -8
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +35 -13
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +62 -41
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +36 -7
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +260 -124
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +150 -58
- package/src/msg_validators/tx_validator/README.md +17 -3
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +44 -1
- package/src/msg_validators/tx_validator/factory.ts +66 -9
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +117 -39
- package/src/msg_validators/tx_validator/index.ts +3 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/timestamp_validator.ts +1 -1
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +126 -14
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +20 -39
- package/src/services/encoding.ts +35 -19
- package/src/services/gossipsub/README.md +33 -11
- package/src/services/gossipsub/topic_score_params.ts +9 -18
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +508 -358
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +91 -25
- package/src/services/peer-manager/peer_scoring.ts +102 -8
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +91 -137
- package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +19 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +1 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
- package/src/services/reqresp/reqresp.ts +87 -260
- package/src/services/service.ts +35 -28
- package/src/services/tx_collection/config.ts +3 -80
- package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +331 -176
- package/src/services/tx_collection/tx_collection_sink.ts +2 -2
- package/src/services/tx_collection/tx_source.ts +10 -8
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +5 -0
- package/src/test-helpers/make-test-p2p-clients.ts +4 -1
- package/src/test-helpers/mock-pubsub.ts +46 -60
- package/src/test-helpers/reqresp-nodes.ts +13 -23
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +64 -28
- package/src/testbench/p2p_client_testbench_worker.ts +111 -57
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +33 -18
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -304
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/msg_validators/clock_tolerance.d.ts +0 -21
- package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
- package/dest/msg_validators/clock_tolerance.js +0 -37
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -378
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -327
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -211
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/clock_tolerance.ts +0 -51
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -387
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
package/src/client/interface.ts
CHANGED
|
@@ -9,15 +9,13 @@ import type { ENR } from '@nethermindeth/enr';
|
|
|
9
9
|
|
|
10
10
|
import type { P2PConfig } from '../config.js';
|
|
11
11
|
import type { AuthRequest, StatusMessage } from '../services/index.js';
|
|
12
|
-
import type {
|
|
13
|
-
ReqRespSubProtocol,
|
|
14
|
-
ReqRespSubProtocolHandler,
|
|
15
|
-
ReqRespSubProtocolValidators,
|
|
16
|
-
} from '../services/reqresp/interface.js';
|
|
12
|
+
import type { ReqRespSubProtocol, ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
|
|
17
13
|
import type {
|
|
18
14
|
DuplicateAttestationInfo,
|
|
19
15
|
DuplicateProposalInfo,
|
|
16
|
+
OversizedProposalInfo,
|
|
20
17
|
P2PBlockReceivedCallback,
|
|
18
|
+
P2PCheckpointAttestationCallback,
|
|
21
19
|
P2PCheckpointReceivedCallback,
|
|
22
20
|
} from '../services/service.js';
|
|
23
21
|
|
|
@@ -82,7 +80,15 @@ export type P2P = P2PClient & {
|
|
|
82
80
|
*
|
|
83
81
|
* @param handler - A function taking a received checkpoint proposal and producing attestations
|
|
84
82
|
*/
|
|
85
|
-
|
|
83
|
+
registerValidatorCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Registers a callback that runs for ALL nodes (not just validators) when a checkpoint proposal is received.
|
|
87
|
+
* Used to set the proposed checkpoint number on the archiver so the sequencer can build on top of it.
|
|
88
|
+
*
|
|
89
|
+
* @param handler - A function taking a received checkpoint proposal
|
|
90
|
+
*/
|
|
91
|
+
registerAllNodesCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
|
|
86
92
|
|
|
87
93
|
/**
|
|
88
94
|
* Registers a callback invoked when a duplicate proposal is detected (equivocation).
|
|
@@ -92,6 +98,14 @@ export type P2P = P2PClient & {
|
|
|
92
98
|
*/
|
|
93
99
|
registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void;
|
|
94
100
|
|
|
101
|
+
/**
|
|
102
|
+
* Registers a callback invoked when an oversized block proposal (index at or beyond the consensus
|
|
103
|
+
* per-checkpoint block limit) is stored and re-broadcast as slashing evidence.
|
|
104
|
+
*
|
|
105
|
+
* @param callback - Function called with info about the oversized proposal
|
|
106
|
+
*/
|
|
107
|
+
registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void;
|
|
108
|
+
|
|
95
109
|
/**
|
|
96
110
|
* Registers a callback invoked when a duplicate attestation is detected (equivocation).
|
|
97
111
|
* A validator signing attestations for different proposals at the same slot.
|
|
@@ -101,6 +115,9 @@ export type P2P = P2PClient & {
|
|
|
101
115
|
*/
|
|
102
116
|
registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void;
|
|
103
117
|
|
|
118
|
+
/** Registers a callback invoked when a valid checkpoint attestation is accepted into the pool. */
|
|
119
|
+
registerCheckpointAttestationCallback(callback: P2PCheckpointAttestationCallback): void;
|
|
120
|
+
|
|
104
121
|
/**
|
|
105
122
|
* Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers.
|
|
106
123
|
* @param tx - The transaction.
|
|
@@ -116,16 +133,18 @@ export type P2P = P2PClient & {
|
|
|
116
133
|
/**
|
|
117
134
|
* Returns a transaction in the transaction pool by its hash.
|
|
118
135
|
* @param txHash - Hash of tx to return.
|
|
136
|
+
* @param opts - Set `includeProof: false` to skip loading the tx proof from the DB.
|
|
119
137
|
* @returns A single tx or undefined.
|
|
120
138
|
*/
|
|
121
|
-
getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined>;
|
|
139
|
+
getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined>;
|
|
122
140
|
|
|
123
141
|
/**
|
|
124
142
|
* Returns transactions in the transaction pool by hash.
|
|
125
143
|
* @param txHashes - Hashes of txs to return.
|
|
144
|
+
* @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
|
|
126
145
|
* @returns An array of txs or undefined.
|
|
127
146
|
*/
|
|
128
|
-
getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
147
|
+
getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]>;
|
|
129
148
|
|
|
130
149
|
/**
|
|
131
150
|
* Checks if transactions exist in the pool
|
|
@@ -148,15 +167,27 @@ export type P2P = P2PClient & {
|
|
|
148
167
|
*/
|
|
149
168
|
getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined>;
|
|
150
169
|
|
|
151
|
-
/**
|
|
152
|
-
|
|
170
|
+
/**
|
|
171
|
+
* Returns an iterator over pending txs on the mempool.
|
|
172
|
+
* Set `includeProof: false` to skip loading tx proofs from the DB.
|
|
173
|
+
*/
|
|
174
|
+
iteratePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx>;
|
|
153
175
|
|
|
154
|
-
/**
|
|
155
|
-
|
|
176
|
+
/**
|
|
177
|
+
* Returns an iterator over pending txs that have been in the pool long enough to be eligible for block building.
|
|
178
|
+
* Set `includeProof: false` to skip loading tx proofs from the DB.
|
|
179
|
+
*/
|
|
180
|
+
iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx>;
|
|
156
181
|
|
|
157
182
|
/** Returns the number of pending txs in the mempool. */
|
|
158
183
|
getPendingTxCount(): Promise<number>;
|
|
159
184
|
|
|
185
|
+
/**
|
|
186
|
+
* Returns whether at least `minCount` pending txs have been in the pool long enough to be eligible for block
|
|
187
|
+
* building. Early-exits once the threshold is met instead of counting every eligible tx.
|
|
188
|
+
*/
|
|
189
|
+
hasEligiblePendingTxs(minCount: number): Promise<boolean>;
|
|
190
|
+
|
|
160
191
|
/**
|
|
161
192
|
* Protects existing transactions by hash for a given slot.
|
|
162
193
|
* Returns hashes of transactions that weren't found in the pool.
|
|
@@ -210,17 +241,16 @@ export type P2P = P2PClient & {
|
|
|
210
241
|
|
|
211
242
|
updateP2PConfig(config: Partial<P2PConfig>): Promise<void>;
|
|
212
243
|
|
|
213
|
-
/**
|
|
244
|
+
/**
|
|
245
|
+
* Validates a set of txs received in a block proposal.
|
|
246
|
+
* @throws InvalidBlockProposalTxsError - If any tx fails minimum integrity validation.
|
|
247
|
+
*/
|
|
214
248
|
validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void>;
|
|
215
249
|
|
|
216
250
|
/** Clears the db. */
|
|
217
251
|
clear(): Promise<void>;
|
|
218
252
|
|
|
219
|
-
addReqRespSubProtocol(
|
|
220
|
-
subProtocol: ReqRespSubProtocol,
|
|
221
|
-
handler: ReqRespSubProtocolHandler,
|
|
222
|
-
validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
223
|
-
): Promise<void>;
|
|
253
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void>;
|
|
224
254
|
|
|
225
255
|
handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
226
256
|
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -1,25 +1,30 @@
|
|
|
1
|
-
import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
|
|
2
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
3
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
BlockNumber,
|
|
4
|
+
CheckpointNumber,
|
|
5
|
+
type CheckpointProposalHash,
|
|
6
|
+
SlotNumber,
|
|
7
|
+
} from '@aztec/foundation/branded-types';
|
|
4
8
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
|
-
import { RunningPromise } from '@aztec/foundation/promise';
|
|
6
9
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
7
10
|
import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
|
|
8
11
|
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
9
12
|
import {
|
|
13
|
+
type BlockData,
|
|
14
|
+
type BlockHash,
|
|
10
15
|
type CheckpointId,
|
|
11
16
|
type EthAddress,
|
|
17
|
+
EventDrivenL2BlockStream,
|
|
12
18
|
type L2Block,
|
|
13
19
|
type L2BlockId,
|
|
14
20
|
type L2BlockSource,
|
|
15
|
-
L2BlockStream,
|
|
16
21
|
type L2BlockStreamEvent,
|
|
17
|
-
type L2Tips,
|
|
18
22
|
type L2TipsStore,
|
|
23
|
+
type LocalL2Tips,
|
|
19
24
|
} from '@aztec/stdlib/block';
|
|
20
25
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
21
26
|
import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
22
|
-
import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
|
|
27
|
+
import { type GetTxByHashOptions, type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
|
|
23
28
|
import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
|
|
24
29
|
import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
25
30
|
import { Attributes, type TelemetryClient, WithTracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
@@ -29,18 +34,15 @@ import type { ENR } from '@nethermindeth/enr';
|
|
|
29
34
|
|
|
30
35
|
import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
|
|
31
36
|
import { TxPoolError } from '../errors/tx-pool.error.js';
|
|
32
|
-
import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
37
|
+
import type { AttestationPoolApi, ProposalsForSlot } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
33
38
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
34
39
|
import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
|
|
35
40
|
import type { AuthRequest, StatusMessage } from '../services/index.js';
|
|
36
|
-
import {
|
|
37
|
-
ReqRespSubProtocol,
|
|
38
|
-
type ReqRespSubProtocolHandler,
|
|
39
|
-
type ReqRespSubProtocolValidators,
|
|
40
|
-
} from '../services/reqresp/interface.js';
|
|
41
|
+
import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
|
|
41
42
|
import type {
|
|
42
43
|
DuplicateAttestationInfo,
|
|
43
44
|
DuplicateProposalInfo,
|
|
45
|
+
OversizedProposalInfo,
|
|
44
46
|
P2PBlockReceivedCallback,
|
|
45
47
|
P2PCheckpointReceivedCallback,
|
|
46
48
|
P2PService,
|
|
@@ -72,7 +74,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
72
74
|
|
|
73
75
|
private config: P2PConfig;
|
|
74
76
|
|
|
75
|
-
private blockStream:
|
|
77
|
+
private blockStream: EventDrivenL2BlockStream | undefined;
|
|
76
78
|
|
|
77
79
|
private txProvider: TxProvider;
|
|
78
80
|
|
|
@@ -81,9 +83,6 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
81
83
|
/** Tracks the last slot for which we called prepareForSlot */
|
|
82
84
|
private lastSlotProcessed: SlotNumber = SlotNumber.ZERO;
|
|
83
85
|
|
|
84
|
-
/** Polls for slot changes and calls prepareForSlot on the tx pool */
|
|
85
|
-
private slotMonitor: RunningPromise | undefined;
|
|
86
|
-
|
|
87
86
|
constructor(
|
|
88
87
|
private store: AztecAsyncKVStore,
|
|
89
88
|
private l2BlockSource: L2BlockSource & ContractDataSource,
|
|
@@ -96,6 +95,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
96
95
|
private _dateProvider: DateProvider = new DateProvider(),
|
|
97
96
|
private telemetry: TelemetryClient = getTelemetryClient(),
|
|
98
97
|
private log = createLogger('p2p'),
|
|
98
|
+
initialBlockHash: BlockHash,
|
|
99
99
|
) {
|
|
100
100
|
super(telemetry, 'P2PClient');
|
|
101
101
|
|
|
@@ -111,28 +111,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
111
111
|
this.telemetry,
|
|
112
112
|
);
|
|
113
113
|
|
|
114
|
-
|
|
115
|
-
// This can be overridden by the validator client to validate, and it will call getTxsForBlockProposal on its own
|
|
116
|
-
// Note: Validators do NOT attest to individual blocks - attestations are only for checkpoint proposals.
|
|
117
|
-
// TODO(palla/txs): We should not trigger a request for txs on a proposal before fully validating it. We need to bring
|
|
118
|
-
// validator-client code into here so we can validate a proposal is reasonable.
|
|
119
|
-
this.registerBlockProposalHandler(async (block, sender) => {
|
|
120
|
-
this.log.debug(`Received block proposal from ${sender.toString()}`);
|
|
121
|
-
// TODO(palla/txs): Need to subtract validatorReexecuteDeadlineMs from this deadline (see ValidatorClient.getReexecutionDeadline)
|
|
122
|
-
const constants = this.txCollection.getConstants();
|
|
123
|
-
const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(block.slotNumber + 1), constants));
|
|
124
|
-
const deadline = new Date(nextSlotTimestampSeconds * 1000);
|
|
125
|
-
const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.blockHeader.lastArchive.root);
|
|
126
|
-
if (!parentBlock) {
|
|
127
|
-
this.log.debug(`Cannot collect txs for proposal as parent block not found`);
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
const blockNumber = BlockNumber(parentBlock.getBlockNumber() + 1);
|
|
131
|
-
await this.txProvider.getTxsForBlockProposal(block, blockNumber, { pinnedPeer: sender, deadline });
|
|
132
|
-
return true;
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
|
|
114
|
+
this.l2Tips = new L2TipsKVStore(store, 'p2p_client', initialBlockHash);
|
|
136
115
|
this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
|
|
137
116
|
}
|
|
138
117
|
|
|
@@ -170,7 +149,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
170
149
|
this.p2pService.updateConfig(config);
|
|
171
150
|
}
|
|
172
151
|
|
|
173
|
-
public getL2Tips(): Promise<
|
|
152
|
+
public getL2Tips(): Promise<LocalL2Tips> {
|
|
174
153
|
return this.l2Tips.getL2Tips();
|
|
175
154
|
}
|
|
176
155
|
|
|
@@ -186,7 +165,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
186
165
|
const from = BlockNumber(oldFinalizedBlockNum + 1);
|
|
187
166
|
const limit = event.block.number - from + 1;
|
|
188
167
|
if (limit > 0) {
|
|
189
|
-
const oldBlocks = await this.l2BlockSource.
|
|
168
|
+
const oldBlocks = await this.l2BlockSource.getBlocksData({ from, limit });
|
|
190
169
|
await this.handleFinalizedL2Blocks(oldBlocks);
|
|
191
170
|
}
|
|
192
171
|
break;
|
|
@@ -196,10 +175,12 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
196
175
|
break;
|
|
197
176
|
case 'chain-pruned':
|
|
198
177
|
this.txCollection.stopCollectingForBlocksAfter(event.block.number);
|
|
199
|
-
await this.handlePruneL2Blocks(event.block, event.checkpoint);
|
|
178
|
+
await this.handlePruneL2Blocks(event.block, event.checkpointed.checkpoint);
|
|
200
179
|
break;
|
|
201
180
|
case 'chain-checkpointed':
|
|
202
181
|
break;
|
|
182
|
+
case 'chain-proposed':
|
|
183
|
+
break;
|
|
203
184
|
default: {
|
|
204
185
|
const _: never = event;
|
|
205
186
|
break;
|
|
@@ -279,33 +260,24 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
279
260
|
});
|
|
280
261
|
}
|
|
281
262
|
|
|
282
|
-
|
|
283
|
-
|
|
263
|
+
// Should never happen: all branches above call initBlockStream()
|
|
264
|
+
if (!this.blockStream) {
|
|
265
|
+
throw new Error('Block stream not initialized');
|
|
266
|
+
}
|
|
267
|
+
this.blockStream.start();
|
|
284
268
|
this.txFileStore?.start();
|
|
285
269
|
|
|
286
|
-
// Start slot monitor to call prepareForSlot when the slot changes
|
|
287
|
-
this.slotMonitor = new RunningPromise(
|
|
288
|
-
() => this.maybeCallPrepareForSlot(),
|
|
289
|
-
this.log,
|
|
290
|
-
this.config.slotCheckIntervalMS,
|
|
291
|
-
);
|
|
292
|
-
this.slotMonitor.start();
|
|
293
|
-
|
|
294
270
|
return this.syncPromise;
|
|
295
271
|
}
|
|
296
272
|
|
|
297
|
-
addReqRespSubProtocol(
|
|
298
|
-
subProtocol
|
|
299
|
-
handler: ReqRespSubProtocolHandler,
|
|
300
|
-
validator: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
301
|
-
): Promise<void> {
|
|
302
|
-
return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
|
|
273
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
274
|
+
return this.p2pService.addReqRespSubProtocol(subProtocol, handler);
|
|
303
275
|
}
|
|
304
276
|
|
|
305
277
|
private initBlockStream(startingBlock?: BlockNumber) {
|
|
306
278
|
if (!this.blockStream) {
|
|
307
279
|
const { blockRequestBatchSize: batchSize, blockCheckIntervalMS: pollIntervalMS } = this.config;
|
|
308
|
-
this.blockStream = new
|
|
280
|
+
this.blockStream = new EventDrivenL2BlockStream(
|
|
309
281
|
this.l2BlockSource,
|
|
310
282
|
this,
|
|
311
283
|
this,
|
|
@@ -321,8 +293,6 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
321
293
|
*/
|
|
322
294
|
public async stop() {
|
|
323
295
|
this.log.debug('Stopping p2p client...');
|
|
324
|
-
await this.slotMonitor?.stop();
|
|
325
|
-
this.log.debug('Stopped slot monitor');
|
|
326
296
|
await tryStop(this.txCollection);
|
|
327
297
|
this.log.debug('Stopped tx collection service');
|
|
328
298
|
await this.txFileStore?.stop();
|
|
@@ -341,7 +311,11 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
341
311
|
/** Triggers a sync to the archiver. Used for testing. */
|
|
342
312
|
public async sync() {
|
|
343
313
|
this.initBlockStream();
|
|
344
|
-
|
|
314
|
+
// Should never happen: initBlockStream() creates blockStream if absent
|
|
315
|
+
if (!this.blockStream) {
|
|
316
|
+
throw new Error('Block stream not initialized');
|
|
317
|
+
}
|
|
318
|
+
await this.blockStream.sync();
|
|
345
319
|
}
|
|
346
320
|
|
|
347
321
|
@trackSpan('p2pClient.broadcastProposal', async proposal => ({
|
|
@@ -379,6 +353,19 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
379
353
|
// Store our own last-block proposal so we can respond to req/resp requests for it.
|
|
380
354
|
await this.attestationPool.tryAddBlockProposal(blockProposal);
|
|
381
355
|
}
|
|
356
|
+
const checkpointCore = proposal.toCore();
|
|
357
|
+
const { count } = await this.attestationPool.tryAddCheckpointProposal(checkpointCore);
|
|
358
|
+
if (count > 1) {
|
|
359
|
+
if (this.config.broadcastEquivocatedProposals) {
|
|
360
|
+
this.log.warn(`Broadcasting equivocated checkpoint proposal for slot ${proposal.slotNumber}`, {
|
|
361
|
+
slot: proposal.slotNumber,
|
|
362
|
+
archive: proposal.archive.toString(),
|
|
363
|
+
count,
|
|
364
|
+
});
|
|
365
|
+
} else {
|
|
366
|
+
throw new Error(`Attempted to broadcast a duplicate checkpoint proposal for slot ${proposal.slotNumber}`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
382
369
|
return this.p2pService.propagate(proposal);
|
|
383
370
|
}
|
|
384
371
|
|
|
@@ -389,10 +376,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
389
376
|
|
|
390
377
|
public async getCheckpointAttestationsForSlot(
|
|
391
378
|
slot: SlotNumber,
|
|
392
|
-
|
|
379
|
+
proposalPayloadHash?: CheckpointProposalHash,
|
|
393
380
|
): Promise<CheckpointAttestation[]> {
|
|
394
|
-
return await (
|
|
395
|
-
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
381
|
+
return await (proposalPayloadHash
|
|
382
|
+
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
|
|
396
383
|
: this.attestationPool.getCheckpointAttestationsForSlot(slot));
|
|
397
384
|
}
|
|
398
385
|
|
|
@@ -400,29 +387,49 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
400
387
|
return this.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
401
388
|
}
|
|
402
389
|
|
|
390
|
+
public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
|
|
391
|
+
return this.attestationPool.getProposalsForSlot(slot);
|
|
392
|
+
}
|
|
393
|
+
|
|
403
394
|
public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
|
|
404
395
|
return this.attestationPool.hasBlockProposalsForSlot(slot);
|
|
405
396
|
}
|
|
406
397
|
|
|
398
|
+
public hasCheckpointProposalForSlot(slot: SlotNumber): Promise<boolean> {
|
|
399
|
+
return this.attestationPool.hasCheckpointProposalForSlot(slot);
|
|
400
|
+
}
|
|
401
|
+
|
|
407
402
|
// REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
408
403
|
// ^ This pattern is not my favorite (md)
|
|
409
404
|
public registerBlockProposalHandler(handler: P2PBlockReceivedCallback): void {
|
|
410
405
|
this.p2pService.registerBlockReceivedCallback(handler);
|
|
411
406
|
}
|
|
412
407
|
|
|
413
|
-
public
|
|
414
|
-
this.p2pService.
|
|
408
|
+
public registerValidatorCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
409
|
+
this.p2pService.registerValidatorCheckpointReceivedCallback(handler);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
public registerAllNodesCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
413
|
+
this.p2pService.registerAllNodesCheckpointReceivedCallback(handler);
|
|
415
414
|
}
|
|
416
415
|
|
|
417
416
|
public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
|
|
418
417
|
this.p2pService.registerDuplicateProposalCallback(callback);
|
|
419
418
|
}
|
|
420
419
|
|
|
420
|
+
public registerOversizedProposalCallback(callback: (info: OversizedProposalInfo) => void): void {
|
|
421
|
+
this.p2pService.registerOversizedProposalCallback(callback);
|
|
422
|
+
}
|
|
423
|
+
|
|
421
424
|
public registerDuplicateAttestationCallback(callback: (info: DuplicateAttestationInfo) => void): void {
|
|
422
425
|
this.p2pService.registerDuplicateAttestationCallback(callback);
|
|
423
426
|
}
|
|
424
427
|
|
|
425
|
-
public
|
|
428
|
+
public registerCheckpointAttestationCallback(callback: (attestation: CheckpointAttestation) => void): void {
|
|
429
|
+
this.p2pService.registerCheckpointAttestationCallback(callback);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
public async getPendingTxs(limit?: number, after?: TxHash, options?: GetTxByHashOptions): Promise<Tx[]> {
|
|
426
433
|
if (limit !== undefined && limit <= 0) {
|
|
427
434
|
throw new TypeError('limit must be greater than 0');
|
|
428
435
|
}
|
|
@@ -441,7 +448,9 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
441
448
|
const endIndex = limit !== undefined ? startIndex + limit : undefined;
|
|
442
449
|
txHashes = txHashes.slice(startIndex, endIndex);
|
|
443
450
|
|
|
444
|
-
|
|
451
|
+
// This is a public-facing API (exposed via both the node and the p2p RPC), so proofs are opt-in.
|
|
452
|
+
const includeProof = !!options?.includeProof;
|
|
453
|
+
const maybeTxs = await Promise.all(txHashes.map(txHash => this.txPool.getTxByHash(txHash, { includeProof })));
|
|
445
454
|
return maybeTxs.filter((tx): tx is Tx => !!tx);
|
|
446
455
|
}
|
|
447
456
|
|
|
@@ -449,18 +458,22 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
449
458
|
return this.txPool.getPendingTxCount();
|
|
450
459
|
}
|
|
451
460
|
|
|
452
|
-
public
|
|
461
|
+
public hasEligiblePendingTxs(minCount: number): Promise<boolean> {
|
|
462
|
+
return this.txPool.hasEligiblePendingTxs(minCount);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
public async *iteratePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
|
|
453
466
|
for (const txHash of await this.txPool.getPendingTxHashes()) {
|
|
454
|
-
const tx = await this.txPool.getTxByHash(txHash);
|
|
467
|
+
const tx = await this.txPool.getTxByHash(txHash, opts);
|
|
455
468
|
if (tx) {
|
|
456
469
|
yield tx;
|
|
457
470
|
}
|
|
458
471
|
}
|
|
459
472
|
}
|
|
460
473
|
|
|
461
|
-
public async *iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
|
|
474
|
+
public async *iterateEligiblePendingTxs(opts?: { includeProof?: boolean }): AsyncIterableIterator<Tx> {
|
|
462
475
|
for (const txHash of await this.txPool.getEligiblePendingTxHashes()) {
|
|
463
|
-
const tx = await this.txPool.getTxByHash(txHash);
|
|
476
|
+
const tx = await this.txPool.getTxByHash(txHash, opts);
|
|
464
477
|
if (tx) {
|
|
465
478
|
yield tx;
|
|
466
479
|
}
|
|
@@ -470,19 +483,21 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
470
483
|
/**
|
|
471
484
|
* Returns a transaction in the transaction pool by its hash.
|
|
472
485
|
* @param txHash - Hash of the transaction to look for in the pool.
|
|
486
|
+
* @param opts - Set `includeProof: false` to skip loading the tx proof from the DB.
|
|
473
487
|
* @returns A single tx or undefined.
|
|
474
488
|
*/
|
|
475
|
-
getTxByHashFromPool(txHash: TxHash): Promise<Tx | undefined> {
|
|
476
|
-
return this.txPool.getTxByHash(txHash);
|
|
489
|
+
getTxByHashFromPool(txHash: TxHash, opts?: { includeProof?: boolean }): Promise<Tx | undefined> {
|
|
490
|
+
return this.txPool.getTxByHash(txHash, opts);
|
|
477
491
|
}
|
|
478
492
|
|
|
479
493
|
/**
|
|
480
494
|
* Returns transactions in the transaction pool by hash.
|
|
481
495
|
* @param txHashes - Hashes of the transactions to look for.
|
|
496
|
+
* @param opts - Set `includeProof: false` to skip loading tx proofs from the DB.
|
|
482
497
|
* @returns The txs found, in the same order as the requested hashes. If a tx is not found, it will be undefined.
|
|
483
498
|
*/
|
|
484
|
-
getTxsByHashFromPool(txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
|
|
485
|
-
return this.txPool.getTxsByHash(txHashes);
|
|
499
|
+
getTxsByHashFromPool(txHashes: TxHash[], opts?: { includeProof?: boolean }): Promise<(Tx | undefined)[]> {
|
|
500
|
+
return this.txPool.getTxsByHash(txHashes, opts);
|
|
486
501
|
}
|
|
487
502
|
|
|
488
503
|
hasTxsInPool(txHashes: TxHash[]): Promise<boolean[]> {
|
|
@@ -592,13 +607,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
592
607
|
*/
|
|
593
608
|
public async getStatus(): Promise<P2PSyncState> {
|
|
594
609
|
const blockNumber = await this.getSyncedLatestBlockNum();
|
|
595
|
-
const blockHash =
|
|
596
|
-
blockNumber
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
.getBlockHeader(blockNumber)
|
|
600
|
-
.then(header => header?.hash())
|
|
601
|
-
.then(hash => hash?.toString());
|
|
610
|
+
const blockHash = await this.l2BlockSource
|
|
611
|
+
.getBlockData({ number: blockNumber })
|
|
612
|
+
.then(data => data?.header.hash())
|
|
613
|
+
.then(hash => hash?.toString());
|
|
602
614
|
|
|
603
615
|
return {
|
|
604
616
|
state: this.currentState,
|
|
@@ -627,15 +639,20 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
627
639
|
return;
|
|
628
640
|
}
|
|
629
641
|
|
|
630
|
-
await this.handleMinedBlocks(blocks);
|
|
631
|
-
await this.maybeCallPrepareForSlot();
|
|
632
|
-
await this.startCollectingMissingTxs(blocks);
|
|
633
642
|
const lastBlock = blocks.at(-1)!;
|
|
634
|
-
|
|
643
|
+
const lastSlot = lastBlock.header.getSlot();
|
|
644
|
+
|
|
645
|
+
// Mark txs mined before releasing protections: a block landing at this slot supersedes any
|
|
646
|
+
// protection for txs it includes, so mined-marking must run first to keep just-landed txs from
|
|
647
|
+
// being unprotected into pending where they could be evicted before they are recorded as mined.
|
|
648
|
+
await this.handleMinedBlocks(blocks);
|
|
649
|
+
await this.maybeCallPrepareForSlot(lastSlot);
|
|
650
|
+
await this.collectingMissingTxs(blocks);
|
|
651
|
+
await this.synchedLatestSlot.set(BigInt(lastSlot));
|
|
635
652
|
}
|
|
636
653
|
|
|
637
|
-
/** Request txs for unproven blocks so the prover node
|
|
638
|
-
private async
|
|
654
|
+
/** Request txs for unproven blocks so the prover node can prove. */
|
|
655
|
+
private async collectingMissingTxs(blocks: L2Block[]): Promise<void> {
|
|
639
656
|
try {
|
|
640
657
|
// TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
|
|
641
658
|
// be much lower than the actual one, and it does not update until the pending chain is
|
|
@@ -643,7 +660,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
643
660
|
// are already proven, but the archiver has not yet updated its state. Until this is properly
|
|
644
661
|
// fixed, it is mitigated by the expiration date of collection requests, which depends on
|
|
645
662
|
// the slot number of the block.
|
|
646
|
-
const provenBlockNumber = await this.l2BlockSource.
|
|
663
|
+
const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
|
|
647
664
|
const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
|
|
648
665
|
for (const block of unprovenBlocks) {
|
|
649
666
|
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
@@ -655,7 +672,17 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
655
672
|
`Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
|
|
656
673
|
{ missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
|
|
657
674
|
);
|
|
658
|
-
|
|
675
|
+
// Both `slashDataWithholdingToleranceSlots` and `p2pMissingTxCollectionDeadlineSlots`
|
|
676
|
+
// count *full slots after the block slot* — value N means collection runs until
|
|
677
|
+
// `slotStart(block.slot + N + 1)`. Take the larger of the two so collection never
|
|
678
|
+
// gives up before the data-withholding slash verdict is rendered.
|
|
679
|
+
const blockSlot = block.header.getSlot();
|
|
680
|
+
const toleranceSlots = this.config.slashDataWithholdingToleranceSlots;
|
|
681
|
+
const configuredSlots = this.config.p2pMissingTxCollectionDeadlineSlots ?? 0;
|
|
682
|
+
const deadlineSlot = SlotNumber(blockSlot + Math.max(toleranceSlots, configuredSlots) + 1);
|
|
683
|
+
const deadlineSeconds = getTimestampForSlot(deadlineSlot, this.epochCache.getL1Constants());
|
|
684
|
+
const deadline = new Date(Number(deadlineSeconds) * 1000);
|
|
685
|
+
await this.txCollection.collectFastForBlock(block, missingTxHashes, { deadline });
|
|
659
686
|
}
|
|
660
687
|
}
|
|
661
688
|
} catch (err) {
|
|
@@ -668,7 +695,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
668
695
|
* @param blocks - A list of finalized L2 blocks.
|
|
669
696
|
* @returns Empty promise.
|
|
670
697
|
*/
|
|
671
|
-
private async handleFinalizedL2Blocks(blocks:
|
|
698
|
+
private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
|
|
672
699
|
if (!blocks.length) {
|
|
673
700
|
return;
|
|
674
701
|
}
|
|
@@ -691,31 +718,38 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
691
718
|
}
|
|
692
719
|
|
|
693
720
|
/**
|
|
694
|
-
* Returns true if the prune
|
|
695
|
-
* If the
|
|
696
|
-
* If they differ, the prune spans across checkpoints (epoch prune).
|
|
721
|
+
* Returns true if the prune is an epoch prune (new checkpoint number is less than old).
|
|
722
|
+
* If the checkpoint number stays the same or increases, the prune is within a checkpoint.
|
|
697
723
|
*/
|
|
698
724
|
private async isEpochPrune(newCheckpoint: CheckpointId): Promise<boolean> {
|
|
699
725
|
const tips = await this.l2Tips.getL2Tips();
|
|
700
726
|
const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
|
|
701
|
-
if (oldCheckpointNumber <= CheckpointNumber.
|
|
727
|
+
if (oldCheckpointNumber <= CheckpointNumber.INITIAL) {
|
|
702
728
|
return false;
|
|
703
729
|
}
|
|
704
|
-
const
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
730
|
+
const newCheckpointNumber = newCheckpoint.number;
|
|
731
|
+
// We check that the new checkpoint number is less than the old checkpoint number in order to consider it an epoch prune.
|
|
732
|
+
// To be more certain that it is an epoch prune, we will check that at least 2 checkpoints were removed.
|
|
733
|
+
// This means we should avoid thinking checkpoints removed by L1 re-orgs are epoch prunes
|
|
734
|
+
const thresholdForEpochPrune = CheckpointNumber(oldCheckpointNumber - 2);
|
|
735
|
+
const isEpochPrune = newCheckpointNumber <= thresholdForEpochPrune;
|
|
736
|
+
if (isEpochPrune) {
|
|
737
|
+
this.log.info(`Detected epoch prune to ${newCheckpointNumber}`, {
|
|
738
|
+
oldCheckpointNumber,
|
|
739
|
+
newCheckpointNumber,
|
|
740
|
+
thresholdForEpochPrune,
|
|
741
|
+
});
|
|
742
|
+
}
|
|
708
743
|
return isEpochPrune;
|
|
709
744
|
}
|
|
710
745
|
|
|
711
|
-
/**
|
|
712
|
-
private async maybeCallPrepareForSlot(): Promise<void> {
|
|
713
|
-
|
|
714
|
-
if (currentSlot <= this.lastSlotProcessed) {
|
|
746
|
+
/** Calls prepareForSlot for the given slot if it advances past the last slot we prepared for. */
|
|
747
|
+
private async maybeCallPrepareForSlot(slot: SlotNumber): Promise<void> {
|
|
748
|
+
if (slot <= this.lastSlotProcessed) {
|
|
715
749
|
return;
|
|
716
750
|
}
|
|
717
|
-
this.lastSlotProcessed =
|
|
718
|
-
await this.txPool.prepareForSlot(
|
|
751
|
+
this.lastSlotProcessed = slot;
|
|
752
|
+
await this.txPool.prepareForSlot(slot);
|
|
719
753
|
}
|
|
720
754
|
|
|
721
755
|
private async startServiceIfSynched() {
|