@aztec/p2p 0.0.1-commit.b1c78909e → 0.0.1-commit.b2a5d0dd1
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/client/factory.d.ts +3 -2
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +19 -10
- package/dest/client/interface.d.ts +9 -2
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +3 -2
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +40 -14
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +21 -7
- package/dest/config.d.ts +107 -97
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +20 -5
- 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/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 +7 -5
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +11 -8
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- 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 +2 -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 +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +10 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +13 -3
- 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_v2.d.ts +4 -2
- 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 +3 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -1
- 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 +13 -5
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +54 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +2 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +2 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +19 -11
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- 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 +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +35 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +10 -2
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +26 -7
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +36 -4
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +50 -33
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +28 -1
- 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/dummy_service.d.ts +6 -3
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +6 -1
- package/dest/services/encoding.d.ts +5 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +7 -1
- package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +21 -4
- 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 +19 -27
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +141 -130
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +37 -10
- 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 +32 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -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 +69 -65
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +3 -2
- 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 +3 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
- package/dest/services/reqresp/config.d.ts +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/interface.d.ts +14 -9
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -11
- 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/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 +0 -10
- package/dest/services/reqresp/reqresp.d.ts +4 -2
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +28 -11
- package/dest/services/service.d.ts +5 -2
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +57 -73
- 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/proposal_tx_collector.d.ts +6 -7
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
- 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/slow_tx_collection.js +1 -1
- package/dest/services/tx_collection/tx_collection.d.ts +3 -6
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- 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 +9 -7
- 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 +4 -1
- package/dest/test-helpers/mock-pubsub.d.ts +11 -3
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +36 -11
- package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +5 -3
- package/dest/test-helpers/testbench-utils.d.ts +1 -1
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +21 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +73 -17
- package/dest/testbench/worker_client_manager.d.ts +8 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +49 -1
- package/package.json +14 -14
- package/src/client/factory.ts +31 -4
- package/src/client/interface.ts +9 -1
- package/src/client/p2p_client.ts +47 -15
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +20 -8
- package/src/config.ts +35 -6
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +12 -8
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
- 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 +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/interfaces.ts +9 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +31 -9
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +13 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +14 -4
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
- package/src/msg_validators/clock_tolerance.ts +72 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +4 -1
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +4 -1
- package/src/msg_validators/proposal_validator/proposal_validator.ts +17 -10
- package/src/msg_validators/tx_validator/README.md +15 -3
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +42 -1
- package/src/msg_validators/tx_validator/factory.ts +31 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +82 -33
- package/src/msg_validators/tx_validator/phases_validator.ts +31 -1
- package/src/services/data_store.ts +5 -13
- package/src/services/dummy_service.ts +8 -2
- package/src/services/encoding.ts +9 -1
- package/src/services/gossipsub/topic_score_params.ts +36 -4
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +141 -141
- package/src/services/peer-manager/peer_manager.ts +43 -10
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/README.md +229 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +64 -69
- package/src/services/reqresp/batch-tx-requester/interface.ts +2 -1
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
- package/src/services/reqresp/config.ts +2 -2
- package/src/services/reqresp/interface.ts +21 -11
- package/src/services/reqresp/metrics.ts +0 -1
- 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 +0 -10
- package/src/services/reqresp/reqresp.ts +37 -12
- package/src/services/service.ts +6 -1
- package/src/services/tx_collection/fast_tx_collection.ts +57 -83
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/slow_tx_collection.ts +1 -1
- package/src/services/tx_collection/tx_collection.ts +3 -5
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/test-helpers/make-test-p2p-clients.ts +2 -0
- package/src/test-helpers/mock-pubsub.ts +34 -5
- package/src/test-helpers/reqresp-nodes.ts +4 -2
- package/src/test-helpers/testbench-utils.ts +29 -3
- package/src/testbench/p2p_client_testbench_worker.ts +73 -14
- package/src/testbench/worker_client_manager.ts +55 -1
- 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 -16
- 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 -402
- 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/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/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 -23
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
2
|
import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { maxBy } from '@aztec/foundation/collection';
|
|
4
|
-
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
4
|
import { type Logger, createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
6
5
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
7
6
|
import { Timer } from '@aztec/foundation/timer';
|
|
8
7
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
9
8
|
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
10
|
-
import type { EthAddress,
|
|
9
|
+
import type { EthAddress, L2BlockSource } from '@aztec/stdlib/block';
|
|
11
10
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
12
|
-
import { GasFees } from '@aztec/stdlib/gas';
|
|
11
|
+
import { type BlockMinFeesProvider, GasFees } from '@aztec/stdlib/gas';
|
|
13
12
|
import type { ClientProtocolCircuitVerifier, PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
14
13
|
import {
|
|
15
14
|
BlockProposal,
|
|
@@ -18,7 +17,6 @@ import {
|
|
|
18
17
|
type CheckpointProposalCore,
|
|
19
18
|
type Gossipable,
|
|
20
19
|
P2PMessage,
|
|
21
|
-
type ValidationResult as P2PValidationResult,
|
|
22
20
|
PeerErrorSeverity,
|
|
23
21
|
PeerErrorSeverityByHarshness,
|
|
24
22
|
TopicType,
|
|
@@ -59,6 +57,7 @@ import { ENR } from '@nethermindeth/enr';
|
|
|
59
57
|
import { createLibp2p } from 'libp2p';
|
|
60
58
|
|
|
61
59
|
import type { P2PConfig } from '../../config.js';
|
|
60
|
+
import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
|
|
62
61
|
import type { MemPools } from '../../mem_pools/interface.js';
|
|
63
62
|
import {
|
|
64
63
|
BlockProposalValidator,
|
|
@@ -105,7 +104,6 @@ import {
|
|
|
105
104
|
ValidationError,
|
|
106
105
|
pingHandler,
|
|
107
106
|
reqGoodbyeHandler,
|
|
108
|
-
reqRespBlockHandler,
|
|
109
107
|
reqRespBlockTxsHandler,
|
|
110
108
|
reqRespStatusHandler,
|
|
111
109
|
reqRespTxHandler,
|
|
@@ -131,7 +129,7 @@ type ValidationOutcome = { allPassed: true } | { allPassed: false; failure: Vali
|
|
|
131
129
|
// REFACTOR: Unify with the type above
|
|
132
130
|
type ReceivedMessageValidationResult<T, M = undefined> =
|
|
133
131
|
| { obj: T; result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>; metadata?: M }
|
|
134
|
-
| { obj?: T; result: TopicValidatorResult.Reject; metadata?: M };
|
|
132
|
+
| { obj?: T; result: TopicValidatorResult.Reject; metadata?: M; severity: PeerErrorSeverity };
|
|
135
133
|
|
|
136
134
|
/**
|
|
137
135
|
* Lib P2P implementation of the P2PService interface.
|
|
@@ -148,8 +146,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
148
146
|
private protocolVersion = '';
|
|
149
147
|
private topicStrings: Record<TopicType, string> = {} as Record<TopicType, string>;
|
|
150
148
|
|
|
151
|
-
private feesCache: { blockNumber: BlockNumber; gasFees: GasFees } | undefined;
|
|
152
|
-
|
|
153
149
|
/** Callback invoked when a duplicate proposal is detected (triggers slashing). */
|
|
154
150
|
private duplicateProposalCallback?: (info: {
|
|
155
151
|
slot: SlotNumber;
|
|
@@ -172,7 +168,13 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
172
168
|
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
173
169
|
* @returns The attestations for the checkpoint, if any.
|
|
174
170
|
*/
|
|
175
|
-
private
|
|
171
|
+
private allNodesCheckpointReceivedCallback: P2PCheckpointReceivedCallback;
|
|
172
|
+
/**
|
|
173
|
+
* Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
|
|
174
|
+
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
175
|
+
* @returns The attestations for the checkpoint, if any.
|
|
176
|
+
*/
|
|
177
|
+
private validatorCheckpointReceivedCallback: P2PCheckpointReceivedCallback;
|
|
176
178
|
|
|
177
179
|
private gossipSubEventHandler: (e: CustomEvent<GossipsubMessage>) => void;
|
|
178
180
|
|
|
@@ -193,6 +195,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
193
195
|
private epochCache: EpochCacheInterface,
|
|
194
196
|
private proofVerifier: ClientProtocolCircuitVerifier,
|
|
195
197
|
private worldStateSynchronizer: WorldStateSynchronizer,
|
|
198
|
+
private blockMinFeesProvider: BlockMinFeesProvider,
|
|
196
199
|
telemetry: TelemetryClient,
|
|
197
200
|
logger: Logger = createLogger('p2p:libp2p_service'),
|
|
198
201
|
) {
|
|
@@ -224,15 +227,19 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
224
227
|
this.protocolVersion,
|
|
225
228
|
);
|
|
226
229
|
|
|
230
|
+
const p2pPropagationTime = config.attestationPropagationTime;
|
|
227
231
|
const proposalValidatorOpts = {
|
|
228
232
|
txsPermitted: !config.disableTransactions,
|
|
229
|
-
maxTxsPerBlock: config.validateMaxTxsPerBlock,
|
|
233
|
+
maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
|
|
234
|
+
p2pPropagationTime,
|
|
230
235
|
};
|
|
231
236
|
this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
|
|
232
237
|
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
|
|
233
238
|
this.checkpointAttestationValidator = config.fishermanMode
|
|
234
|
-
? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry
|
|
235
|
-
|
|
239
|
+
? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry, {
|
|
240
|
+
l1PublishingTime: config.l1PublishingTime,
|
|
241
|
+
})
|
|
242
|
+
: new CheckpointAttestationValidator(epochCache, { l1PublishingTime: config.l1PublishingTime });
|
|
236
243
|
|
|
237
244
|
this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
|
|
238
245
|
|
|
@@ -244,12 +251,15 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
244
251
|
return true;
|
|
245
252
|
};
|
|
246
253
|
|
|
247
|
-
this.
|
|
248
|
-
|
|
254
|
+
this.allNodesCheckpointReceivedCallback = (
|
|
255
|
+
_checkpoint: CheckpointProposalCore,
|
|
256
|
+
): Promise<CheckpointAttestation[] | undefined> => {
|
|
257
|
+
throw new CheckpointProposalReceivedCallbackNotRegisteredError();
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
this.validatorCheckpointReceivedCallback = (
|
|
261
|
+
_checkpoint: CheckpointProposalCore,
|
|
249
262
|
): Promise<CheckpointAttestation[] | undefined> => {
|
|
250
|
-
this.logger.debug(
|
|
251
|
-
`Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`,
|
|
252
|
-
);
|
|
253
263
|
return Promise.resolve(undefined);
|
|
254
264
|
};
|
|
255
265
|
}
|
|
@@ -274,6 +284,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
274
284
|
proofVerifier: ClientProtocolCircuitVerifier;
|
|
275
285
|
worldStateSynchronizer: WorldStateSynchronizer;
|
|
276
286
|
peerStore: AztecAsyncKVStore;
|
|
287
|
+
blockMinFeesProvider: BlockMinFeesProvider;
|
|
277
288
|
telemetry: TelemetryClient;
|
|
278
289
|
logger: Logger;
|
|
279
290
|
packageVersion: string;
|
|
@@ -286,6 +297,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
286
297
|
mempools,
|
|
287
298
|
proofVerifier,
|
|
288
299
|
peerStore,
|
|
300
|
+
blockMinFeesProvider,
|
|
289
301
|
telemetry,
|
|
290
302
|
logger,
|
|
291
303
|
packageVersion,
|
|
@@ -339,9 +351,12 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
339
351
|
const l1Constants = epochCache.getL1Constants();
|
|
340
352
|
const topicScoreParams = createAllTopicScoreParams(protocolVersion, {
|
|
341
353
|
slotDurationMs: l1Constants.slotDuration * 1000,
|
|
354
|
+
ethereumSlotDuration: l1Constants.ethereumSlotDuration,
|
|
342
355
|
heartbeatIntervalMs: config.gossipsubInterval,
|
|
343
356
|
targetCommitteeSize: l1Constants.targetCommitteeSize,
|
|
344
357
|
blockDurationMs: config.blockDurationMs,
|
|
358
|
+
l1PublishingTime: config.l1PublishingTime,
|
|
359
|
+
p2pPropagationTime: config.attestationPropagationTime,
|
|
345
360
|
expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot,
|
|
346
361
|
});
|
|
347
362
|
|
|
@@ -466,6 +481,9 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
466
481
|
epochCache,
|
|
467
482
|
);
|
|
468
483
|
|
|
484
|
+
// Gate req/resp data protocols for unauthenticated peers when p2pAllowOnlyValidators is enabled
|
|
485
|
+
reqresp.setShouldRejectPeer(peerId => peerManager.shouldDisableP2PGossip(peerId));
|
|
486
|
+
|
|
469
487
|
// Configure application-specific scoring for gossipsub.
|
|
470
488
|
// The weight scales app score to align with gossipsub thresholds:
|
|
471
489
|
// - Disconnect (-50) × 10 = -500 = gossipThreshold (stops receiving gossip)
|
|
@@ -486,6 +504,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
486
504
|
epochCache,
|
|
487
505
|
proofVerifier,
|
|
488
506
|
worldStateSynchronizer,
|
|
507
|
+
blockMinFeesProvider,
|
|
489
508
|
telemetry,
|
|
490
509
|
logger,
|
|
491
510
|
);
|
|
@@ -511,14 +530,12 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
511
530
|
// Create request response protocol handlers
|
|
512
531
|
const txHandler = reqRespTxHandler(this.mempools);
|
|
513
532
|
const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
|
|
514
|
-
const blockHandler = reqRespBlockHandler(this.archiver);
|
|
515
533
|
const statusHandler = reqRespStatusHandler(this.protocolVersion, this.worldStateSynchronizer, this.logger);
|
|
516
534
|
|
|
517
535
|
const requestResponseHandlers: Partial<ReqRespSubProtocolHandlers> = {
|
|
518
536
|
[ReqRespSubProtocol.PING]: pingHandler,
|
|
519
537
|
[ReqRespSubProtocol.STATUS]: statusHandler.bind(this),
|
|
520
538
|
[ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this),
|
|
521
|
-
[ReqRespSubProtocol.BLOCK]: blockHandler.bind(this),
|
|
522
539
|
};
|
|
523
540
|
|
|
524
541
|
if (!this.config.disableTransactions) {
|
|
@@ -539,7 +556,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
539
556
|
...DEFAULT_SUB_PROTOCOL_VALIDATORS,
|
|
540
557
|
[ReqRespSubProtocol.TX]: this.validateRequestedTxs.bind(this),
|
|
541
558
|
[ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this),
|
|
542
|
-
[ReqRespSubProtocol.BLOCK]: this.validateRequestedBlock.bind(this),
|
|
543
559
|
};
|
|
544
560
|
|
|
545
561
|
await this.peerManager.initializePeers();
|
|
@@ -667,8 +683,16 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
667
683
|
this.blockReceivedCallback = callback;
|
|
668
684
|
}
|
|
669
685
|
|
|
670
|
-
public
|
|
671
|
-
this.
|
|
686
|
+
public registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
|
|
687
|
+
this.validatorCheckpointReceivedCallback = callback;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
public registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
|
|
691
|
+
this.allNodesCheckpointReceivedCallback = callback;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
public async notifyOwnCheckpointProposal(checkpoint: CheckpointProposalCore): Promise<void> {
|
|
695
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
|
|
672
696
|
}
|
|
673
697
|
|
|
674
698
|
/**
|
|
@@ -883,30 +907,67 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
883
907
|
source: PeerId,
|
|
884
908
|
topicType: TopicType,
|
|
885
909
|
): Promise<ReceivedMessageValidationResult<T, M>> {
|
|
886
|
-
|
|
910
|
+
// Default to reject result with a penalty if validation function throws an error
|
|
911
|
+
let resultAndObj: ReceivedMessageValidationResult<T, M> = {
|
|
912
|
+
result: TopicValidatorResult.Reject,
|
|
913
|
+
severity: PeerErrorSeverity.MidToleranceError,
|
|
914
|
+
};
|
|
887
915
|
const timer = new Timer();
|
|
888
916
|
try {
|
|
889
917
|
resultAndObj = await validationFunc();
|
|
890
918
|
} catch (err) {
|
|
891
|
-
this.
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
919
|
+
this.logger.error(`Error validating gossipsub message`, err, { msgId, source: source.toString(), topicType });
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
const validationTimeMs = timer.ms();
|
|
923
|
+
const mcacheWindowMs = this.config.gossipsubMcacheLength * this.config.gossipsubInterval;
|
|
924
|
+
if (validationTimeMs > mcacheWindowMs * 0.75) {
|
|
925
|
+
this.instrumentation.incSlowValidation(topicType);
|
|
926
|
+
this.logger.warn(
|
|
927
|
+
`Gossip validation for ${topicType} took ${validationTimeMs}ms, approaching mcache eviction window of ${mcacheWindowMs}ms. ` +
|
|
928
|
+
`Message forwarding may be skipped if validation exceeds the window.`,
|
|
929
|
+
{ msgId, source: source.toString(), topicType, validationTimeMs, mcacheWindowMs },
|
|
930
|
+
);
|
|
897
931
|
}
|
|
898
932
|
|
|
899
933
|
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
934
|
+
this.logger.debug(`Message ${topicType} accepted by validator`, { msgId, source: source.toString(), topicType });
|
|
900
935
|
this.instrumentation.recordMessageValidation(topicType, timer);
|
|
936
|
+
} else if (resultAndObj.result === TopicValidatorResult.Reject) {
|
|
937
|
+
this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
|
|
938
|
+
msgId,
|
|
939
|
+
source: source.toString(),
|
|
940
|
+
topicType,
|
|
941
|
+
severity: resultAndObj.severity,
|
|
942
|
+
});
|
|
943
|
+
this.peerManager.penalizePeer(source, resultAndObj.severity);
|
|
944
|
+
} else {
|
|
945
|
+
this.logger.trace(`Message ${topicType} ignored by validator`, { msgId, source: source.toString(), topicType });
|
|
901
946
|
}
|
|
902
947
|
|
|
903
948
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
|
|
904
949
|
return resultAndObj;
|
|
905
950
|
}
|
|
906
951
|
|
|
952
|
+
private tryDeserialize<T>(deserializeFunc: () => T, msgId: string, source: PeerId): T | undefined {
|
|
953
|
+
try {
|
|
954
|
+
return deserializeFunc();
|
|
955
|
+
} catch (err) {
|
|
956
|
+
this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
|
|
957
|
+
err,
|
|
958
|
+
msgId,
|
|
959
|
+
source: source.toString(),
|
|
960
|
+
});
|
|
961
|
+
return undefined;
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
|
|
907
965
|
protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) {
|
|
908
966
|
const validationFunc: () => Promise<ReceivedMessageValidationResult<Tx>> = async () => {
|
|
909
|
-
const tx = Tx.fromBuffer(payloadData);
|
|
967
|
+
const tx = this.tryDeserialize(() => Tx.fromBuffer(payloadData), msgId, source);
|
|
968
|
+
if (!tx) {
|
|
969
|
+
return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.LowToleranceError };
|
|
970
|
+
}
|
|
910
971
|
|
|
911
972
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
912
973
|
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
@@ -931,8 +992,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
931
992
|
severity,
|
|
932
993
|
source: source.toString(),
|
|
933
994
|
});
|
|
934
|
-
|
|
935
|
-
return { result: TopicValidatorResult.Reject };
|
|
995
|
+
return { result: TopicValidatorResult.Reject, severity };
|
|
936
996
|
}
|
|
937
997
|
|
|
938
998
|
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
@@ -954,8 +1014,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
954
1014
|
severity,
|
|
955
1015
|
source: source.toString(),
|
|
956
1016
|
});
|
|
957
|
-
|
|
958
|
-
return { result: TopicValidatorResult.Reject };
|
|
1017
|
+
return { result: TopicValidatorResult.Reject, severity };
|
|
959
1018
|
}
|
|
960
1019
|
|
|
961
1020
|
// Pool add: persist the tx
|
|
@@ -976,7 +1035,11 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
976
1035
|
} else if (wasIgnored) {
|
|
977
1036
|
return { result: TopicValidatorResult.Ignore, obj: tx };
|
|
978
1037
|
} else {
|
|
979
|
-
|
|
1038
|
+
this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
|
|
1039
|
+
source: source.toString(),
|
|
1040
|
+
txHash: txHash.toString(),
|
|
1041
|
+
});
|
|
1042
|
+
return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
|
|
980
1043
|
}
|
|
981
1044
|
};
|
|
982
1045
|
|
|
@@ -1006,7 +1069,16 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1006
1069
|
source: PeerId,
|
|
1007
1070
|
): Promise<void> {
|
|
1008
1071
|
const { result, obj: attestation } = await this.validateReceivedMessage<CheckpointAttestation>(
|
|
1009
|
-
() =>
|
|
1072
|
+
() => {
|
|
1073
|
+
const attestation = this.tryDeserialize(() => CheckpointAttestation.fromBuffer(payloadData), msgId, source);
|
|
1074
|
+
if (!attestation) {
|
|
1075
|
+
return Promise.resolve({
|
|
1076
|
+
result: TopicValidatorResult.Reject,
|
|
1077
|
+
severity: PeerErrorSeverity.LowToleranceError,
|
|
1078
|
+
});
|
|
1079
|
+
}
|
|
1080
|
+
return this.validateAndStoreCheckpointAttestation(source, attestation);
|
|
1081
|
+
},
|
|
1010
1082
|
msgId,
|
|
1011
1083
|
source,
|
|
1012
1084
|
TopicType.checkpoint_attestation,
|
|
@@ -1039,8 +1111,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1039
1111
|
|
|
1040
1112
|
if (validationResult.result === 'reject') {
|
|
1041
1113
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1042
|
-
|
|
1043
|
-
return { result: TopicValidatorResult.Reject };
|
|
1114
|
+
return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
|
|
1044
1115
|
}
|
|
1045
1116
|
|
|
1046
1117
|
if (validationResult.result === 'ignore') {
|
|
@@ -1066,16 +1137,16 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1066
1137
|
return { result: TopicValidatorResult.Ignore, obj: attestation };
|
|
1067
1138
|
}
|
|
1068
1139
|
|
|
1069
|
-
// Could not add (cap reached for signer),
|
|
1140
|
+
// Could not add (cap reached for signer), penalize and do not re-broadcast
|
|
1070
1141
|
if (!added) {
|
|
1071
|
-
this.logger.warn(`
|
|
1142
|
+
this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
|
|
1072
1143
|
slot: slot.toString(),
|
|
1073
1144
|
archive: attestation.archive.toString(),
|
|
1074
1145
|
source: peerId.toString(),
|
|
1075
1146
|
attester: attestation.getSender()?.toString(),
|
|
1076
1147
|
count,
|
|
1077
1148
|
});
|
|
1078
|
-
return { result: TopicValidatorResult.
|
|
1149
|
+
return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
|
|
1079
1150
|
}
|
|
1080
1151
|
|
|
1081
1152
|
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
@@ -1130,8 +1201,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1130
1201
|
|
|
1131
1202
|
if (validationResult.result === 'reject') {
|
|
1132
1203
|
this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1133
|
-
|
|
1134
|
-
return { result: TopicValidatorResult.Reject };
|
|
1204
|
+
return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
|
|
1135
1205
|
}
|
|
1136
1206
|
|
|
1137
1207
|
if (validationResult.result === 'ignore') {
|
|
@@ -1155,7 +1225,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1155
1225
|
|
|
1156
1226
|
// Too many blocks received for this slot and index, penalize peer and do not re-broadcast
|
|
1157
1227
|
if (!added) {
|
|
1158
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1159
1228
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1160
1229
|
...block.toBlockInfo(),
|
|
1161
1230
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
@@ -1163,7 +1232,11 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1163
1232
|
proposer: block.getSender()?.toString(),
|
|
1164
1233
|
source: peerId.toString(),
|
|
1165
1234
|
});
|
|
1166
|
-
return {
|
|
1235
|
+
return {
|
|
1236
|
+
result: TopicValidatorResult.Reject,
|
|
1237
|
+
metadata: { isEquivocated },
|
|
1238
|
+
severity: PeerErrorSeverity.HighToleranceError,
|
|
1239
|
+
};
|
|
1167
1240
|
}
|
|
1168
1241
|
|
|
1169
1242
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1256,8 +1329,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1256
1329
|
|
|
1257
1330
|
if (validationResult.result === 'reject') {
|
|
1258
1331
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1259
|
-
|
|
1260
|
-
return { result: TopicValidatorResult.Reject };
|
|
1332
|
+
return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
|
|
1261
1333
|
}
|
|
1262
1334
|
|
|
1263
1335
|
if (validationResult.result === 'ignore') {
|
|
@@ -1272,20 +1344,21 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1272
1344
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1273
1345
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1274
1346
|
});
|
|
1275
|
-
const
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
metadata: { isEquivocated } = {},
|
|
1279
|
-
} = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1280
|
-
if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1347
|
+
const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1348
|
+
const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
|
|
1349
|
+
if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1281
1350
|
this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
|
|
1282
1351
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1283
1352
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1284
1353
|
isEquivocated,
|
|
1285
|
-
result,
|
|
1354
|
+
result: blockProposalResult.result,
|
|
1286
1355
|
});
|
|
1287
|
-
return {
|
|
1288
|
-
|
|
1356
|
+
return {
|
|
1357
|
+
result: TopicValidatorResult.Reject,
|
|
1358
|
+
severity:
|
|
1359
|
+
'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError,
|
|
1360
|
+
};
|
|
1361
|
+
} else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1289
1362
|
processBlock = true;
|
|
1290
1363
|
}
|
|
1291
1364
|
}
|
|
@@ -1312,13 +1385,17 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1312
1385
|
// Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
|
|
1313
1386
|
// Note: We still return the checkpoint obj so the lastBlock can be processed if valid
|
|
1314
1387
|
if (!added) {
|
|
1315
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1316
1388
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1317
1389
|
...checkpoint.toCheckpointInfo(),
|
|
1318
1390
|
count,
|
|
1319
1391
|
source: peerId.toString(),
|
|
1320
1392
|
});
|
|
1321
|
-
return {
|
|
1393
|
+
return {
|
|
1394
|
+
result: TopicValidatorResult.Reject,
|
|
1395
|
+
obj: checkpoint,
|
|
1396
|
+
metadata: { isEquivocated, processBlock },
|
|
1397
|
+
severity: PeerErrorSeverity.HighToleranceError,
|
|
1398
|
+
};
|
|
1322
1399
|
}
|
|
1323
1400
|
|
|
1324
1401
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1363,9 +1440,11 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1363
1440
|
source: sender.toString(),
|
|
1364
1441
|
});
|
|
1365
1442
|
|
|
1443
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
|
|
1444
|
+
|
|
1366
1445
|
// Call the checkpoint received callback with the core version (without lastBlock)
|
|
1367
1446
|
// to validate and potentially generate attestations
|
|
1368
|
-
const attestations = await this.
|
|
1447
|
+
const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
|
|
1369
1448
|
if (attestations && attestations.length > 0) {
|
|
1370
1449
|
// If the callback returned attestations, add them to the pool and propagate them
|
|
1371
1450
|
await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
@@ -1513,53 +1592,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1513
1592
|
}
|
|
1514
1593
|
}
|
|
1515
1594
|
|
|
1516
|
-
/**
|
|
1517
|
-
* Validates a BLOCK response.
|
|
1518
|
-
*
|
|
1519
|
-
* If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
|
|
1520
|
-
* Penalizes on block number mismatch or hash mismatch.
|
|
1521
|
-
*
|
|
1522
|
-
* @param requestedBlockNumber - The requested block number.
|
|
1523
|
-
* @param responseBlock - The block returned by the peer.
|
|
1524
|
-
* @param peerId - The peer that returned the block.
|
|
1525
|
-
* @returns True if the response is valid, false otherwise.
|
|
1526
|
-
*/
|
|
1527
|
-
@trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock) => ({
|
|
1528
|
-
[Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString(),
|
|
1529
|
-
}))
|
|
1530
|
-
protected async validateRequestedBlock(
|
|
1531
|
-
requestedBlockNumber: Fr,
|
|
1532
|
-
responseBlock: L2Block,
|
|
1533
|
-
peerId: PeerId,
|
|
1534
|
-
): Promise<boolean> {
|
|
1535
|
-
try {
|
|
1536
|
-
const reqNum = Number(requestedBlockNumber.toString());
|
|
1537
|
-
if (responseBlock.number !== reqNum) {
|
|
1538
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
1539
|
-
return false;
|
|
1540
|
-
}
|
|
1541
|
-
|
|
1542
|
-
const local = await this.archiver.getBlock(BlockNumber(reqNum));
|
|
1543
|
-
if (!local) {
|
|
1544
|
-
// We are missing the local block; we cannot verify the hash yet. Reject without penalizing.
|
|
1545
|
-
// TODO: Consider extending this validator to accept an expected hash or
|
|
1546
|
-
// performing quorum-based checks when using P2P syncing prior to L1 sync.
|
|
1547
|
-
this.logger.warn(`Local block ${reqNum} not found; rejecting BLOCK response without hash verification`);
|
|
1548
|
-
return false;
|
|
1549
|
-
}
|
|
1550
|
-
const [localHash, respHash] = await Promise.all([local.hash(), responseBlock.hash()]);
|
|
1551
|
-
if (!localHash.equals(respHash)) {
|
|
1552
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
|
|
1553
|
-
return false;
|
|
1554
|
-
}
|
|
1555
|
-
|
|
1556
|
-
return true;
|
|
1557
|
-
} catch (e) {
|
|
1558
|
-
this.logger.warn(`Error validating requested block`, e);
|
|
1559
|
-
return false;
|
|
1560
|
-
}
|
|
1561
|
-
}
|
|
1562
|
-
|
|
1563
1595
|
protected async validateRequestedTx(
|
|
1564
1596
|
tx: Tx,
|
|
1565
1597
|
peerId: PeerId,
|
|
@@ -1586,15 +1618,8 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1586
1618
|
});
|
|
1587
1619
|
}
|
|
1588
1620
|
|
|
1589
|
-
private
|
|
1590
|
-
|
|
1591
|
-
return this.feesCache.gasFees;
|
|
1592
|
-
}
|
|
1593
|
-
|
|
1594
|
-
const header = await this.archiver.getBlockHeader(blockNumber);
|
|
1595
|
-
const gasFees = header?.globalVariables.gasFees ?? GasFees.empty();
|
|
1596
|
-
this.feesCache = { blockNumber, gasFees };
|
|
1597
|
-
return gasFees;
|
|
1621
|
+
private getGasFees(): Promise<GasFees> {
|
|
1622
|
+
return this.blockMinFeesProvider.getCurrentMinFees();
|
|
1598
1623
|
}
|
|
1599
1624
|
|
|
1600
1625
|
/**
|
|
@@ -1636,7 +1661,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1636
1661
|
currentBlockNumber: BlockNumber,
|
|
1637
1662
|
nextSlotTimestamp: UInt64,
|
|
1638
1663
|
): Promise<Record<string, TransactionValidator>> {
|
|
1639
|
-
const gasFees = await this.getGasFees(
|
|
1664
|
+
const gasFees = await this.getGasFees();
|
|
1640
1665
|
const allowedInSetup = [
|
|
1641
1666
|
...(await getDefaultAllowedSetupFunctions()),
|
|
1642
1667
|
...(this.config.txPublicSetupAllowListExtend ?? []),
|
|
@@ -1742,31 +1767,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1742
1767
|
return PeerErrorSeverity.HighToleranceError;
|
|
1743
1768
|
}
|
|
1744
1769
|
|
|
1745
|
-
/**
|
|
1746
|
-
* Validate a checkpoint attestation.
|
|
1747
|
-
*
|
|
1748
|
-
* @param attestation - The checkpoint attestation to validate.
|
|
1749
|
-
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
1750
|
-
*/
|
|
1751
|
-
@trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation) => ({
|
|
1752
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
1753
|
-
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
1754
|
-
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then(i => i.toString()),
|
|
1755
|
-
}))
|
|
1756
|
-
public async validateCheckpointAttestation(
|
|
1757
|
-
peerId: PeerId,
|
|
1758
|
-
attestation: CheckpointAttestation,
|
|
1759
|
-
): Promise<P2PValidationResult> {
|
|
1760
|
-
const result = await this.checkpointAttestationValidator.validate(attestation);
|
|
1761
|
-
|
|
1762
|
-
if (result.result === 'reject') {
|
|
1763
|
-
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1764
|
-
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1765
|
-
}
|
|
1766
|
-
|
|
1767
|
-
return result;
|
|
1768
|
-
}
|
|
1769
|
-
|
|
1770
1770
|
public getPeerScore(peerId: PeerId): number {
|
|
1771
1771
|
return this.node.services.pubsub.score.score(peerId.toString());
|
|
1772
1772
|
}
|