@aztec/p2p 0.0.1-commit.f504929 → 0.0.1-commit.f650c0a5c
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 +2 -2
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +25 -11
- 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 +37 -36
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +17 -6
- package/dest/config.d.ts +24 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +66 -7
- 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 +4 -4
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +6 -5
- 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/interfaces.d.ts +7 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +9 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +25 -10
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +38 -11
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -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 +26 -43
- 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 +21 -6
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -4
- package/dest/msg_validators/clock_tolerance.d.ts +1 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +4 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +5 -4
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +5 -4
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +12 -9
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +51 -49
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -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 +21 -32
- 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/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 +23 -4
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +36 -10
- 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 +13 -4
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +49 -17
- package/dest/msg_validators/tx_validator/index.d.ts +2 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +1 -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 +21 -1
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +49 -2
- package/dest/services/dummy_service.d.ts +5 -3
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +5 -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/libp2p/libp2p_service.d.ts +15 -25
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +149 -126
- 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 +22 -8
- 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/interface.d.ts +1 -9
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +0 -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 +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +18 -10
- 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/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +0 -2
- 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 +23 -3
- package/dest/testbench/p2p_client_testbench_worker.js +68 -16
- package/dest/testbench/worker_client_manager.d.ts +10 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +55 -3
- package/dest/util.d.ts +1 -1
- package/package.json +14 -14
- package/src/client/factory.ts +43 -14
- package/src/client/interface.ts +9 -1
- package/src/client/p2p_client.ts +39 -36
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -9
- package/src/config.ts +92 -4
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +7 -5
- 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/README.md +9 -1
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/interfaces.ts +9 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +59 -13
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
- 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 +23 -6
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
- package/src/msg_validators/clock_tolerance.ts +4 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +13 -3
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +19 -6
- package/src/msg_validators/proposal_validator/proposal_validator.ts +63 -53
- package/src/msg_validators/tx_validator/README.md +5 -1
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +16 -35
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- 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 +43 -3
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +65 -16
- package/src/msg_validators/tx_validator/index.ts +1 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/phases_validator.ts +60 -1
- package/src/services/dummy_service.ts +7 -2
- package/src/services/encoding.ts +9 -1
- package/src/services/libp2p/libp2p_service.ts +148 -140
- package/src/services/peer-manager/peer_manager.ts +26 -8
- 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/interface.ts +0 -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 +20 -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 +1 -1
- package/src/test-helpers/reqresp-nodes.ts +1 -3
- package/src/test-helpers/testbench-utils.ts +30 -3
- package/src/testbench/p2p_client_testbench_worker.ts +72 -15
- package/src/testbench/worker_client_manager.ts +68 -6
- package/src/util.ts +1 -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 -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/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/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 -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/proposal_validator/proposal_validator_test_suite.ts +0 -373
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
2
|
import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
|
-
import {
|
|
3
|
+
import { maxBy } from '@aztec/foundation/collection';
|
|
4
4
|
import { type Logger, createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
6
6
|
import { Timer } from '@aztec/foundation/timer';
|
|
7
7
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
8
8
|
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
9
|
-
import type { EthAddress,
|
|
9
|
+
import type { EthAddress, L2BlockSource } from '@aztec/stdlib/block';
|
|
10
10
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
11
11
|
import { GasFees } from '@aztec/stdlib/gas';
|
|
12
12
|
import type { ClientProtocolCircuitVerifier, PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
@@ -17,8 +17,8 @@ import {
|
|
|
17
17
|
type CheckpointProposalCore,
|
|
18
18
|
type Gossipable,
|
|
19
19
|
P2PMessage,
|
|
20
|
-
type ValidationResult as P2PValidationResult,
|
|
21
20
|
PeerErrorSeverity,
|
|
21
|
+
PeerErrorSeverityByHarshness,
|
|
22
22
|
TopicType,
|
|
23
23
|
createTopicString,
|
|
24
24
|
getTopicsForConfig,
|
|
@@ -57,6 +57,7 @@ import { ENR } from '@nethermindeth/enr';
|
|
|
57
57
|
import { createLibp2p } from 'libp2p';
|
|
58
58
|
|
|
59
59
|
import type { P2PConfig } from '../../config.js';
|
|
60
|
+
import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
|
|
60
61
|
import type { MemPools } from '../../mem_pools/interface.js';
|
|
61
62
|
import {
|
|
62
63
|
BlockProposalValidator,
|
|
@@ -103,7 +104,6 @@ import {
|
|
|
103
104
|
ValidationError,
|
|
104
105
|
pingHandler,
|
|
105
106
|
reqGoodbyeHandler,
|
|
106
|
-
reqRespBlockHandler,
|
|
107
107
|
reqRespBlockTxsHandler,
|
|
108
108
|
reqRespStatusHandler,
|
|
109
109
|
reqRespTxHandler,
|
|
@@ -129,7 +129,7 @@ type ValidationOutcome = { allPassed: true } | { allPassed: false; failure: Vali
|
|
|
129
129
|
// REFACTOR: Unify with the type above
|
|
130
130
|
type ReceivedMessageValidationResult<T, M = undefined> =
|
|
131
131
|
| { obj: T; result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>; metadata?: M }
|
|
132
|
-
| { obj?: T; result: TopicValidatorResult.Reject; metadata?: M };
|
|
132
|
+
| { obj?: T; result: TopicValidatorResult.Reject; metadata?: M; severity: PeerErrorSeverity };
|
|
133
133
|
|
|
134
134
|
/**
|
|
135
135
|
* Lib P2P implementation of the P2PService interface.
|
|
@@ -170,7 +170,13 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
170
170
|
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
171
171
|
* @returns The attestations for the checkpoint, if any.
|
|
172
172
|
*/
|
|
173
|
-
private
|
|
173
|
+
private allNodesCheckpointReceivedCallback: P2PCheckpointReceivedCallback;
|
|
174
|
+
/**
|
|
175
|
+
* Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
|
|
176
|
+
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
177
|
+
* @returns The attestations for the checkpoint, if any.
|
|
178
|
+
*/
|
|
179
|
+
private validatorCheckpointReceivedCallback: P2PCheckpointReceivedCallback;
|
|
174
180
|
|
|
175
181
|
private gossipSubEventHandler: (e: CustomEvent<GossipsubMessage>) => void;
|
|
176
182
|
|
|
@@ -222,14 +228,12 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
222
228
|
this.protocolVersion,
|
|
223
229
|
);
|
|
224
230
|
|
|
225
|
-
|
|
226
|
-
txsPermitted: !config.disableTransactions,
|
|
227
|
-
maxTxsPerBlock: config.maxTxsPerBlock,
|
|
228
|
-
});
|
|
229
|
-
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, {
|
|
231
|
+
const proposalValidatorOpts = {
|
|
230
232
|
txsPermitted: !config.disableTransactions,
|
|
231
|
-
maxTxsPerBlock: config.
|
|
232
|
-
}
|
|
233
|
+
maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
|
|
234
|
+
};
|
|
235
|
+
this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
|
|
236
|
+
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
|
|
233
237
|
this.checkpointAttestationValidator = config.fishermanMode
|
|
234
238
|
? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry)
|
|
235
239
|
: new CheckpointAttestationValidator(epochCache);
|
|
@@ -237,19 +241,22 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
237
241
|
this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
|
|
238
242
|
|
|
239
243
|
this.blockReceivedCallback = async (block: BlockProposal): Promise<boolean> => {
|
|
240
|
-
this.logger.
|
|
241
|
-
`Handler not yet registered
|
|
244
|
+
this.logger.warn(
|
|
245
|
+
`Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`,
|
|
242
246
|
{ p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier() },
|
|
243
247
|
);
|
|
244
|
-
return
|
|
248
|
+
return true;
|
|
245
249
|
};
|
|
246
250
|
|
|
247
|
-
this.
|
|
248
|
-
|
|
251
|
+
this.allNodesCheckpointReceivedCallback = (
|
|
252
|
+
_checkpoint: CheckpointProposalCore,
|
|
253
|
+
): Promise<CheckpointAttestation[] | undefined> => {
|
|
254
|
+
throw new CheckpointProposalReceivedCallbackNotRegisteredError();
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
this.validatorCheckpointReceivedCallback = (
|
|
258
|
+
_checkpoint: CheckpointProposalCore,
|
|
249
259
|
): 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
260
|
return Promise.resolve(undefined);
|
|
254
261
|
};
|
|
255
262
|
}
|
|
@@ -511,14 +518,12 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
511
518
|
// Create request response protocol handlers
|
|
512
519
|
const txHandler = reqRespTxHandler(this.mempools);
|
|
513
520
|
const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
|
|
514
|
-
const blockHandler = reqRespBlockHandler(this.archiver);
|
|
515
521
|
const statusHandler = reqRespStatusHandler(this.protocolVersion, this.worldStateSynchronizer, this.logger);
|
|
516
522
|
|
|
517
523
|
const requestResponseHandlers: Partial<ReqRespSubProtocolHandlers> = {
|
|
518
524
|
[ReqRespSubProtocol.PING]: pingHandler,
|
|
519
525
|
[ReqRespSubProtocol.STATUS]: statusHandler.bind(this),
|
|
520
526
|
[ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this),
|
|
521
|
-
[ReqRespSubProtocol.BLOCK]: blockHandler.bind(this),
|
|
522
527
|
};
|
|
523
528
|
|
|
524
529
|
if (!this.config.disableTransactions) {
|
|
@@ -539,7 +544,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
539
544
|
...DEFAULT_SUB_PROTOCOL_VALIDATORS,
|
|
540
545
|
[ReqRespSubProtocol.TX]: this.validateRequestedTxs.bind(this),
|
|
541
546
|
[ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this),
|
|
542
|
-
[ReqRespSubProtocol.BLOCK]: this.validateRequestedBlock.bind(this),
|
|
543
547
|
};
|
|
544
548
|
|
|
545
549
|
await this.peerManager.initializePeers();
|
|
@@ -667,8 +671,16 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
667
671
|
this.blockReceivedCallback = callback;
|
|
668
672
|
}
|
|
669
673
|
|
|
670
|
-
public
|
|
671
|
-
this.
|
|
674
|
+
public registerValidatorCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
|
|
675
|
+
this.validatorCheckpointReceivedCallback = callback;
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
public registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
|
|
679
|
+
this.allNodesCheckpointReceivedCallback = callback;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
public async notifyOwnCheckpointProposal(checkpoint: CheckpointProposalCore): Promise<void> {
|
|
683
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
|
|
672
684
|
}
|
|
673
685
|
|
|
674
686
|
/**
|
|
@@ -754,6 +766,9 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
754
766
|
if (!validator || !validator.addMessage(msgId)) {
|
|
755
767
|
this.instrumentation.incMessagePrevalidationStatus(false, topicType);
|
|
756
768
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
|
|
769
|
+
if (topicType === TopicType.tx) {
|
|
770
|
+
this.logger.verbose(`Ignoring already-seen tx gossip message`, { msgId, source: source.toString() });
|
|
771
|
+
}
|
|
757
772
|
return { result: false, topicType };
|
|
758
773
|
}
|
|
759
774
|
|
|
@@ -880,30 +895,56 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
880
895
|
source: PeerId,
|
|
881
896
|
topicType: TopicType,
|
|
882
897
|
): Promise<ReceivedMessageValidationResult<T, M>> {
|
|
883
|
-
|
|
898
|
+
// Default to reject result with a penalty if validation function throws an error
|
|
899
|
+
let resultAndObj: ReceivedMessageValidationResult<T, M> = {
|
|
900
|
+
result: TopicValidatorResult.Reject,
|
|
901
|
+
severity: PeerErrorSeverity.MidToleranceError,
|
|
902
|
+
};
|
|
884
903
|
const timer = new Timer();
|
|
885
904
|
try {
|
|
886
905
|
resultAndObj = await validationFunc();
|
|
887
906
|
} catch (err) {
|
|
888
|
-
this.
|
|
889
|
-
this.logger.error(`Error deserializing and validating gossipsub message`, err, {
|
|
890
|
-
msgId,
|
|
891
|
-
source: source.toString(),
|
|
892
|
-
topicType,
|
|
893
|
-
});
|
|
907
|
+
this.logger.error(`Error validating gossipsub message`, err, { msgId, source: source.toString(), topicType });
|
|
894
908
|
}
|
|
895
909
|
|
|
896
910
|
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
911
|
+
this.logger.debug(`Message ${topicType} accepted by validator`, { msgId, source: source.toString(), topicType });
|
|
897
912
|
this.instrumentation.recordMessageValidation(topicType, timer);
|
|
913
|
+
} else if (resultAndObj.result === TopicValidatorResult.Reject) {
|
|
914
|
+
this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
|
|
915
|
+
msgId,
|
|
916
|
+
source: source.toString(),
|
|
917
|
+
topicType,
|
|
918
|
+
severity: resultAndObj.severity,
|
|
919
|
+
});
|
|
920
|
+
this.peerManager.penalizePeer(source, resultAndObj.severity);
|
|
921
|
+
} else {
|
|
922
|
+
this.logger.trace(`Message ${topicType} ignored by validator`, { msgId, source: source.toString(), topicType });
|
|
898
923
|
}
|
|
899
924
|
|
|
900
925
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
|
|
901
926
|
return resultAndObj;
|
|
902
927
|
}
|
|
903
928
|
|
|
929
|
+
private tryDeserialize<T>(deserializeFunc: () => T, msgId: string, source: PeerId): T | undefined {
|
|
930
|
+
try {
|
|
931
|
+
return deserializeFunc();
|
|
932
|
+
} catch (err) {
|
|
933
|
+
this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
|
|
934
|
+
err,
|
|
935
|
+
msgId,
|
|
936
|
+
source: source.toString(),
|
|
937
|
+
});
|
|
938
|
+
return undefined;
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
|
|
904
942
|
protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) {
|
|
905
943
|
const validationFunc: () => Promise<ReceivedMessageValidationResult<Tx>> = async () => {
|
|
906
|
-
const tx = Tx.fromBuffer(payloadData);
|
|
944
|
+
const tx = this.tryDeserialize(() => Tx.fromBuffer(payloadData), msgId, source);
|
|
945
|
+
if (!tx) {
|
|
946
|
+
return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.LowToleranceError };
|
|
947
|
+
}
|
|
907
948
|
|
|
908
949
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
909
950
|
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
@@ -923,13 +964,20 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
923
964
|
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
924
965
|
}
|
|
925
966
|
|
|
926
|
-
this.
|
|
927
|
-
|
|
967
|
+
this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
|
|
968
|
+
validator: name,
|
|
969
|
+
severity,
|
|
970
|
+
source: source.toString(),
|
|
971
|
+
});
|
|
972
|
+
return { result: TopicValidatorResult.Reject, severity };
|
|
928
973
|
}
|
|
929
974
|
|
|
930
975
|
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
931
976
|
const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
|
|
932
977
|
if (canAdd === 'ignored') {
|
|
978
|
+
this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
|
|
979
|
+
source: source.toString(),
|
|
980
|
+
});
|
|
933
981
|
return { result: TopicValidatorResult.Ignore, obj: tx };
|
|
934
982
|
}
|
|
935
983
|
|
|
@@ -937,9 +985,13 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
937
985
|
const secondStageValidators = this.createSecondStageMessageValidators();
|
|
938
986
|
const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
|
|
939
987
|
if (!secondStageOutcome.allPassed) {
|
|
940
|
-
const { severity } = secondStageOutcome.failure;
|
|
941
|
-
this.
|
|
942
|
-
|
|
988
|
+
const { severity, name } = secondStageOutcome.failure;
|
|
989
|
+
this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
|
|
990
|
+
validator: name,
|
|
991
|
+
severity,
|
|
992
|
+
source: source.toString(),
|
|
993
|
+
});
|
|
994
|
+
return { result: TopicValidatorResult.Reject, severity };
|
|
943
995
|
}
|
|
944
996
|
|
|
945
997
|
// Pool add: persist the tx
|
|
@@ -949,7 +1001,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
949
1001
|
const wasAccepted = addResult.accepted.some(h => h.equals(txHash));
|
|
950
1002
|
const wasIgnored = addResult.ignored.some(h => h.equals(txHash));
|
|
951
1003
|
|
|
952
|
-
this.logger.
|
|
1004
|
+
this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
|
|
953
1005
|
wasAccepted,
|
|
954
1006
|
wasIgnored,
|
|
955
1007
|
[Attributes.P2P_ID]: source.toString(),
|
|
@@ -960,7 +1012,11 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
960
1012
|
} else if (wasIgnored) {
|
|
961
1013
|
return { result: TopicValidatorResult.Ignore, obj: tx };
|
|
962
1014
|
} else {
|
|
963
|
-
|
|
1015
|
+
this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
|
|
1016
|
+
source: source.toString(),
|
|
1017
|
+
txHash: txHash.toString(),
|
|
1018
|
+
});
|
|
1019
|
+
return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
|
|
964
1020
|
}
|
|
965
1021
|
};
|
|
966
1022
|
|
|
@@ -990,7 +1046,16 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
990
1046
|
source: PeerId,
|
|
991
1047
|
): Promise<void> {
|
|
992
1048
|
const { result, obj: attestation } = await this.validateReceivedMessage<CheckpointAttestation>(
|
|
993
|
-
() =>
|
|
1049
|
+
() => {
|
|
1050
|
+
const attestation = this.tryDeserialize(() => CheckpointAttestation.fromBuffer(payloadData), msgId, source);
|
|
1051
|
+
if (!attestation) {
|
|
1052
|
+
return Promise.resolve({
|
|
1053
|
+
result: TopicValidatorResult.Reject,
|
|
1054
|
+
severity: PeerErrorSeverity.LowToleranceError,
|
|
1055
|
+
});
|
|
1056
|
+
}
|
|
1057
|
+
return this.validateAndStoreCheckpointAttestation(source, attestation);
|
|
1058
|
+
},
|
|
994
1059
|
msgId,
|
|
995
1060
|
source,
|
|
996
1061
|
TopicType.checkpoint_attestation,
|
|
@@ -1023,8 +1088,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1023
1088
|
|
|
1024
1089
|
if (validationResult.result === 'reject') {
|
|
1025
1090
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1026
|
-
|
|
1027
|
-
return { result: TopicValidatorResult.Reject };
|
|
1091
|
+
return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
|
|
1028
1092
|
}
|
|
1029
1093
|
|
|
1030
1094
|
if (validationResult.result === 'ignore') {
|
|
@@ -1050,16 +1114,16 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1050
1114
|
return { result: TopicValidatorResult.Ignore, obj: attestation };
|
|
1051
1115
|
}
|
|
1052
1116
|
|
|
1053
|
-
// Could not add (cap reached for signer),
|
|
1117
|
+
// Could not add (cap reached for signer), penalize and do not re-broadcast
|
|
1054
1118
|
if (!added) {
|
|
1055
|
-
this.logger.warn(`
|
|
1119
|
+
this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
|
|
1056
1120
|
slot: slot.toString(),
|
|
1057
1121
|
archive: attestation.archive.toString(),
|
|
1058
1122
|
source: peerId.toString(),
|
|
1059
1123
|
attester: attestation.getSender()?.toString(),
|
|
1060
1124
|
count,
|
|
1061
1125
|
});
|
|
1062
|
-
return { result: TopicValidatorResult.
|
|
1126
|
+
return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
|
|
1063
1127
|
}
|
|
1064
1128
|
|
|
1065
1129
|
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
@@ -1114,8 +1178,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1114
1178
|
|
|
1115
1179
|
if (validationResult.result === 'reject') {
|
|
1116
1180
|
this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1117
|
-
|
|
1118
|
-
return { result: TopicValidatorResult.Reject };
|
|
1181
|
+
return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
|
|
1119
1182
|
}
|
|
1120
1183
|
|
|
1121
1184
|
if (validationResult.result === 'ignore') {
|
|
@@ -1139,7 +1202,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1139
1202
|
|
|
1140
1203
|
// Too many blocks received for this slot and index, penalize peer and do not re-broadcast
|
|
1141
1204
|
if (!added) {
|
|
1142
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1143
1205
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1144
1206
|
...block.toBlockInfo(),
|
|
1145
1207
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
@@ -1147,7 +1209,11 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1147
1209
|
proposer: block.getSender()?.toString(),
|
|
1148
1210
|
source: peerId.toString(),
|
|
1149
1211
|
});
|
|
1150
|
-
return {
|
|
1212
|
+
return {
|
|
1213
|
+
result: TopicValidatorResult.Reject,
|
|
1214
|
+
metadata: { isEquivocated },
|
|
1215
|
+
severity: PeerErrorSeverity.HighToleranceError,
|
|
1216
|
+
};
|
|
1151
1217
|
}
|
|
1152
1218
|
|
|
1153
1219
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1192,7 +1258,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1192
1258
|
// Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
|
|
1193
1259
|
const isValid = await this.blockReceivedCallback(block, sender);
|
|
1194
1260
|
if (!isValid) {
|
|
1195
|
-
this.logger.
|
|
1261
|
+
this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
|
|
1196
1262
|
}
|
|
1197
1263
|
}
|
|
1198
1264
|
|
|
@@ -1240,8 +1306,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1240
1306
|
|
|
1241
1307
|
if (validationResult.result === 'reject') {
|
|
1242
1308
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1243
|
-
|
|
1244
|
-
return { result: TopicValidatorResult.Reject };
|
|
1309
|
+
return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
|
|
1245
1310
|
}
|
|
1246
1311
|
|
|
1247
1312
|
if (validationResult.result === 'ignore') {
|
|
@@ -1256,20 +1321,21 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1256
1321
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1257
1322
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1258
1323
|
});
|
|
1259
|
-
const
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
metadata: { isEquivocated } = {},
|
|
1263
|
-
} = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1264
|
-
if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1324
|
+
const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1325
|
+
const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
|
|
1326
|
+
if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1265
1327
|
this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
|
|
1266
1328
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1267
1329
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1268
1330
|
isEquivocated,
|
|
1269
|
-
result,
|
|
1331
|
+
result: blockProposalResult.result,
|
|
1270
1332
|
});
|
|
1271
|
-
return {
|
|
1272
|
-
|
|
1333
|
+
return {
|
|
1334
|
+
result: TopicValidatorResult.Reject,
|
|
1335
|
+
severity:
|
|
1336
|
+
'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError,
|
|
1337
|
+
};
|
|
1338
|
+
} else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1273
1339
|
processBlock = true;
|
|
1274
1340
|
}
|
|
1275
1341
|
}
|
|
@@ -1296,13 +1362,17 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1296
1362
|
// Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
|
|
1297
1363
|
// Note: We still return the checkpoint obj so the lastBlock can be processed if valid
|
|
1298
1364
|
if (!added) {
|
|
1299
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1300
1365
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1301
1366
|
...checkpoint.toCheckpointInfo(),
|
|
1302
1367
|
count,
|
|
1303
1368
|
source: peerId.toString(),
|
|
1304
1369
|
});
|
|
1305
|
-
return {
|
|
1370
|
+
return {
|
|
1371
|
+
result: TopicValidatorResult.Reject,
|
|
1372
|
+
obj: checkpoint,
|
|
1373
|
+
metadata: { isEquivocated, processBlock },
|
|
1374
|
+
severity: PeerErrorSeverity.HighToleranceError,
|
|
1375
|
+
};
|
|
1306
1376
|
}
|
|
1307
1377
|
|
|
1308
1378
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1347,9 +1417,11 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1347
1417
|
source: sender.toString(),
|
|
1348
1418
|
});
|
|
1349
1419
|
|
|
1420
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
|
|
1421
|
+
|
|
1350
1422
|
// Call the checkpoint received callback with the core version (without lastBlock)
|
|
1351
1423
|
// to validate and potentially generate attestations
|
|
1352
|
-
const attestations = await this.
|
|
1424
|
+
const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
|
|
1353
1425
|
if (attestations && attestations.length > 0) {
|
|
1354
1426
|
// If the callback returned attestations, add them to the pool and propagate them
|
|
1355
1427
|
await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
@@ -1497,53 +1569,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1497
1569
|
}
|
|
1498
1570
|
}
|
|
1499
1571
|
|
|
1500
|
-
/**
|
|
1501
|
-
* Validates a BLOCK response.
|
|
1502
|
-
*
|
|
1503
|
-
* If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
|
|
1504
|
-
* Penalizes on block number mismatch or hash mismatch.
|
|
1505
|
-
*
|
|
1506
|
-
* @param requestedBlockNumber - The requested block number.
|
|
1507
|
-
* @param responseBlock - The block returned by the peer.
|
|
1508
|
-
* @param peerId - The peer that returned the block.
|
|
1509
|
-
* @returns True if the response is valid, false otherwise.
|
|
1510
|
-
*/
|
|
1511
|
-
@trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock) => ({
|
|
1512
|
-
[Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString(),
|
|
1513
|
-
}))
|
|
1514
|
-
protected async validateRequestedBlock(
|
|
1515
|
-
requestedBlockNumber: Fr,
|
|
1516
|
-
responseBlock: L2Block,
|
|
1517
|
-
peerId: PeerId,
|
|
1518
|
-
): Promise<boolean> {
|
|
1519
|
-
try {
|
|
1520
|
-
const reqNum = Number(requestedBlockNumber.toString());
|
|
1521
|
-
if (responseBlock.number !== reqNum) {
|
|
1522
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
1523
|
-
return false;
|
|
1524
|
-
}
|
|
1525
|
-
|
|
1526
|
-
const local = await this.archiver.getBlock(BlockNumber(reqNum));
|
|
1527
|
-
if (!local) {
|
|
1528
|
-
// We are missing the local block; we cannot verify the hash yet. Reject without penalizing.
|
|
1529
|
-
// TODO: Consider extending this validator to accept an expected hash or
|
|
1530
|
-
// performing quorum-based checks when using P2P syncing prior to L1 sync.
|
|
1531
|
-
this.logger.warn(`Local block ${reqNum} not found; rejecting BLOCK response without hash verification`);
|
|
1532
|
-
return false;
|
|
1533
|
-
}
|
|
1534
|
-
const [localHash, respHash] = await Promise.all([local.hash(), responseBlock.hash()]);
|
|
1535
|
-
if (!localHash.equals(respHash)) {
|
|
1536
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
|
|
1537
|
-
return false;
|
|
1538
|
-
}
|
|
1539
|
-
|
|
1540
|
-
return true;
|
|
1541
|
-
} catch (e) {
|
|
1542
|
-
this.logger.warn(`Error validating requested block`, e);
|
|
1543
|
-
return false;
|
|
1544
|
-
}
|
|
1545
|
-
}
|
|
1546
|
-
|
|
1547
1572
|
protected async validateRequestedTx(
|
|
1548
1573
|
tx: Tx,
|
|
1549
1574
|
peerId: PeerId,
|
|
@@ -1626,6 +1651,7 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1626
1651
|
...(this.config.txPublicSetupAllowListExtend ?? []),
|
|
1627
1652
|
];
|
|
1628
1653
|
const blockNumber = BlockNumber(currentBlockNumber + 1);
|
|
1654
|
+
const l1Constants = await this.archiver.getL1Constants();
|
|
1629
1655
|
|
|
1630
1656
|
return createFirstStageTxValidationsForGossipedTransactions(
|
|
1631
1657
|
nextSlotTimestamp,
|
|
@@ -1639,6 +1665,11 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1639
1665
|
!this.config.disableTransactions,
|
|
1640
1666
|
allowedInSetup,
|
|
1641
1667
|
this.logger.getBindings(),
|
|
1668
|
+
{
|
|
1669
|
+
rollupManaLimit: l1Constants.rollupManaLimit,
|
|
1670
|
+
maxBlockL2Gas: this.config.validateMaxL2BlockGas,
|
|
1671
|
+
maxBlockDAGas: this.config.validateMaxDABlockGas,
|
|
1672
|
+
},
|
|
1642
1673
|
);
|
|
1643
1674
|
}
|
|
1644
1675
|
|
|
@@ -1664,8 +1695,10 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1664
1695
|
|
|
1665
1696
|
// A promise that resolves when all validations have been run
|
|
1666
1697
|
const allValidations = await Promise.all(validationPromises);
|
|
1667
|
-
const
|
|
1668
|
-
if (
|
|
1698
|
+
const failures = allValidations.filter(x => !x.isValid);
|
|
1699
|
+
if (failures.length > 0) {
|
|
1700
|
+
// Pick the most severe failure (lowest tolerance = harshest penalty)
|
|
1701
|
+
const failed = maxBy(failures, f => PeerErrorSeverityByHarshness.indexOf(f.severity))!;
|
|
1669
1702
|
return {
|
|
1670
1703
|
allPassed: false,
|
|
1671
1704
|
failure: {
|
|
@@ -1718,31 +1751,6 @@ export class LibP2PService extends WithTracer implements P2PService {
|
|
|
1718
1751
|
return PeerErrorSeverity.HighToleranceError;
|
|
1719
1752
|
}
|
|
1720
1753
|
|
|
1721
|
-
/**
|
|
1722
|
-
* Validate a checkpoint attestation.
|
|
1723
|
-
*
|
|
1724
|
-
* @param attestation - The checkpoint attestation to validate.
|
|
1725
|
-
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
1726
|
-
*/
|
|
1727
|
-
@trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation) => ({
|
|
1728
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
1729
|
-
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
1730
|
-
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then(i => i.toString()),
|
|
1731
|
-
}))
|
|
1732
|
-
public async validateCheckpointAttestation(
|
|
1733
|
-
peerId: PeerId,
|
|
1734
|
-
attestation: CheckpointAttestation,
|
|
1735
|
-
): Promise<P2PValidationResult> {
|
|
1736
|
-
const result = await this.checkpointAttestationValidator.validate(attestation);
|
|
1737
|
-
|
|
1738
|
-
if (result.result === 'reject') {
|
|
1739
|
-
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1740
|
-
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1741
|
-
}
|
|
1742
|
-
|
|
1743
|
-
return result;
|
|
1744
|
-
}
|
|
1745
|
-
|
|
1746
1754
|
public getPeerScore(peerId: PeerId): number {
|
|
1747
1755
|
return this.node.services.pubsub.score.score(peerId.toString());
|
|
1748
1756
|
}
|
|
@@ -32,7 +32,7 @@ import { PeerScoreState, type PeerScoring } from './peer_scoring.js';
|
|
|
32
32
|
const MAX_DIAL_ATTEMPTS = 3;
|
|
33
33
|
const MAX_CACHED_PEERS = 100;
|
|
34
34
|
const MAX_CACHED_PEER_AGE_MS = 5 * 60 * 1000; // 5 minutes
|
|
35
|
-
const
|
|
35
|
+
const DEFAULT_FAILED_PEER_BAN_TIME_MS = 5 * 60 * 1000; // 5 minutes timeout after failing MAX_DIAL_ATTEMPTS
|
|
36
36
|
const GOODBYE_DIAL_TIMEOUT_MS = 1000;
|
|
37
37
|
const FAILED_AUTH_HANDSHAKE_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
|
|
38
38
|
|
|
@@ -226,20 +226,30 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
226
226
|
}
|
|
227
227
|
|
|
228
228
|
/**
|
|
229
|
-
* Cleans up expired timeouts.
|
|
229
|
+
* Cleans up expired timeouts and stale failed-auth-handshake entries.
|
|
230
230
|
*
|
|
231
231
|
* When peers fail to dial after a number of retries, they are temporarily timed out.
|
|
232
232
|
* This function removes any peers that have been in the timed out state for too long.
|
|
233
233
|
* To give them a chance to reconnect.
|
|
234
|
+
*
|
|
235
|
+
* Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
|
|
236
|
+
* Without this, peers that probe once and never reconnect would leave their entries in the
|
|
237
|
+
* map forever, causing an unbounded memory leak.
|
|
234
238
|
*/
|
|
235
239
|
private cleanupExpiredTimeouts() {
|
|
236
|
-
// Clean up expired timeouts
|
|
237
240
|
const now = this.dateProvider.now();
|
|
241
|
+
|
|
238
242
|
for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()) {
|
|
239
243
|
if (now >= timedOutPeer.timeoutUntilMs) {
|
|
240
244
|
this.timedOutPeers.delete(peerId);
|
|
241
245
|
}
|
|
242
246
|
}
|
|
247
|
+
|
|
248
|
+
for (const [id, entry] of this.failedAuthHandshakes.entries()) {
|
|
249
|
+
if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
|
|
250
|
+
this.failedAuthHandshakes.delete(id);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
243
253
|
}
|
|
244
254
|
|
|
245
255
|
/**
|
|
@@ -303,15 +313,20 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
303
313
|
*/
|
|
304
314
|
private handleDisconnectedPeerEvent(e: CustomEvent<PeerId>) {
|
|
305
315
|
const peerId = e.detail;
|
|
316
|
+
const peerIdStr = peerId.toString();
|
|
306
317
|
this.metrics.peerDisconnected(peerId);
|
|
307
|
-
this.logger.verbose(`Disconnected from peer ${
|
|
308
|
-
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(
|
|
318
|
+
this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
|
|
319
|
+
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
|
|
309
320
|
if (validatorAddress !== undefined) {
|
|
310
321
|
this.logger.info(
|
|
311
|
-
`Removing authentication for validator ${validatorAddress} at peer id ${
|
|
322
|
+
`Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`,
|
|
312
323
|
);
|
|
313
324
|
this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
|
|
314
|
-
this.authenticatedPeerIdToValidatorAddress.delete(
|
|
325
|
+
this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
|
|
329
|
+
this.peerScoring.removePeer(peerIdStr);
|
|
315
330
|
}
|
|
316
331
|
}
|
|
317
332
|
|
|
@@ -776,7 +791,8 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
776
791
|
// Add to timed out peers
|
|
777
792
|
this.timedOutPeers.set(id, {
|
|
778
793
|
peerId: id,
|
|
779
|
-
timeoutUntilMs:
|
|
794
|
+
timeoutUntilMs:
|
|
795
|
+
this.dateProvider.now() + (this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS),
|
|
780
796
|
});
|
|
781
797
|
}
|
|
782
798
|
}
|
|
@@ -938,6 +954,8 @@ export class PeerManager implements PeerManagerInterface {
|
|
|
938
954
|
`Received auth for validator ${sender.toString()} from peer ${peerIdString}, but this validator is already authenticated to peer ${peerForAddress.toString()}`,
|
|
939
955
|
{ ...logData, address: sender.toString() },
|
|
940
956
|
);
|
|
957
|
+
this.markAuthHandshakeFailed(peerId);
|
|
958
|
+
this.markPeerForDisconnect(peerId);
|
|
941
959
|
return;
|
|
942
960
|
}
|
|
943
961
|
|