@aztec/p2p 0.0.1-commit.934299a21 → 0.0.1-commit.949a33fd8
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 +6 -6
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +29 -14
- package/dest/client/interface.d.ts +12 -5
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +6 -5
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +47 -39
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +21 -8
- package/dest/config.d.ts +128 -100
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +97 -34
- 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 +16 -9
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +6 -4
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +33 -15
- 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/fee_payer_balance_pre_add_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +2 -0
- 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/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/invalid_txs_after_reorg_rule.js +2 -2
- 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/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +12 -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 +44 -12
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +81 -22
- 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 -44
- 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 +6 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -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 +62 -29
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +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 +61 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +8 -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 +8 -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 +17 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +83 -48
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/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 +37 -11
- 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 +48 -7
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
- package/dest/msg_validators/tx_validator/index.d.ts +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 +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/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 +6 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +14 -8
- 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 +23 -32
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +202 -151
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +39 -11
- 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 +30 -12
- 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 +5 -6
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +4 -2
- package/dest/test-helpers/mock-pubsub.d.ts +12 -5
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +37 -12
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +6 -4
- 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.d.ts +1 -1
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +78 -21
- 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 +48 -19
- package/src/client/interface.ts +12 -10
- package/src/client/p2p_client.ts +52 -51
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +22 -11
- package/src/config.ts +146 -36
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +17 -12
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +22 -14
- 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/fee_payer_balance_pre_add_rule.ts +3 -0
- 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/interfaces.ts +11 -1
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
- 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/index.ts +1 -1
- package/src/mem_pools/tx_pool_v2/interfaces.ts +12 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +121 -27
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +16 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +70 -26
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +12 -2
- package/src/msg_validators/clock_tolerance.ts +79 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +22 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +33 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +99 -49
- package/src/msg_validators/tx_validator/README.md +15 -3
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/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 +46 -4
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +121 -39
- 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 +82 -27
- package/src/services/data_store.ts +5 -13
- package/src/services/dummy_service.ts +8 -2
- package/src/services/encoding.ts +14 -7
- 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 +206 -164
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +45 -11
- 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 +40 -13
- 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 +3 -3
- package/src/test-helpers/mock-pubsub.ts +37 -11
- package/src/test-helpers/reqresp-nodes.ts +7 -8
- package/src/test-helpers/testbench-utils.ts +30 -3
- package/src/testbench/p2p_client_testbench_worker.ts +77 -21
- 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 -23
- 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 -212
- 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 -230
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
|
@@ -370,14 +370,14 @@ function applyDecs2203RFactory() {
|
|
|
370
370
|
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
371
371
|
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
372
|
}
|
|
373
|
-
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6,
|
|
373
|
+
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _initProto;
|
|
374
374
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
375
|
+
import { maxBy, merge } from '@aztec/foundation/collection';
|
|
375
376
|
import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
376
377
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
377
378
|
import { Timer } from '@aztec/foundation/timer';
|
|
378
379
|
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
379
|
-
import {
|
|
380
|
-
import { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PClientType, P2PMessage, PeerErrorSeverity, TopicType, createTopicString, getTopicsForClientAndConfig, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
|
|
380
|
+
import { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PMessage, PeerErrorSeverity, PeerErrorSeverityByHarshness, TopicType, createTopicString, getTopicsForConfig, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
|
|
381
381
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
382
382
|
import { Tx } from '@aztec/stdlib/tx';
|
|
383
383
|
import { compressComponentVersions } from '@aztec/stdlib/versioning';
|
|
@@ -394,6 +394,7 @@ import { mplex } from '@libp2p/mplex';
|
|
|
394
394
|
import { tcp } from '@libp2p/tcp';
|
|
395
395
|
import { ENR } from '@nethermindeth/enr';
|
|
396
396
|
import { createLibp2p } from 'libp2p';
|
|
397
|
+
import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
|
|
397
398
|
import { BlockProposalValidator, CheckpointAttestationValidator, CheckpointProposalValidator, DoubleSpendTxValidator, FishermanAttestationValidator, getDefaultAllowedSetupFunctions } from '../../msg_validators/index.js';
|
|
398
399
|
import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
|
|
399
400
|
import { createFirstStageTxValidationsForGossipedTransactions, createSecondStageTxValidationsForGossipedTransactions, createTxValidatorForBlockProposalReceivedTxs, createTxValidatorForReqResponseReceivedTxs } from '../../msg_validators/tx_validator/factory.js';
|
|
@@ -407,7 +408,7 @@ import { APP_SPECIFIC_WEIGHT, gossipScoreThresholds } from '../gossipsub/scoring
|
|
|
407
408
|
import { createAllTopicScoreParams } from '../gossipsub/topic_score_params.js';
|
|
408
409
|
import { PeerManager } from '../peer-manager/peer_manager.js';
|
|
409
410
|
import { PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
410
|
-
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler,
|
|
411
|
+
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
|
|
411
412
|
import { ReqResp } from '../reqresp/reqresp.js';
|
|
412
413
|
import { P2PInstrumentation } from './instrumentation.js';
|
|
413
414
|
_dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId, attestation)=>({
|
|
@@ -429,17 +430,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
429
430
|
[Attributes.BLOCK_ARCHIVE]: request.archiveRoot.toString()
|
|
430
431
|
})), _dec6 = trackSpan('Libp2pService.validateRequestedTx', (requestedTxHash, _responseTx)=>({
|
|
431
432
|
[Attributes.TX_HASH]: requestedTxHash.toString()
|
|
432
|
-
})), _dec7 = trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock)=>({
|
|
433
|
-
[Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString()
|
|
434
|
-
})), _dec8 = trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation)=>({
|
|
435
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
436
|
-
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
437
|
-
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then((i)=>i.toString())
|
|
438
433
|
}));
|
|
439
434
|
/**
|
|
440
435
|
* Lib P2P implementation of the P2PService interface.
|
|
441
436
|
*/ export class LibP2PService extends WithTracer {
|
|
442
|
-
clientType;
|
|
443
437
|
config;
|
|
444
438
|
node;
|
|
445
439
|
peerDiscoveryService;
|
|
@@ -450,6 +444,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
450
444
|
epochCache;
|
|
451
445
|
proofVerifier;
|
|
452
446
|
worldStateSynchronizer;
|
|
447
|
+
blockMinFeesProvider;
|
|
453
448
|
static{
|
|
454
449
|
({ e: [_initProto] } = _apply_decs_2203_r(this, [
|
|
455
450
|
[
|
|
@@ -486,16 +481,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
486
481
|
_dec6,
|
|
487
482
|
2,
|
|
488
483
|
"validateRequestedTxs"
|
|
489
|
-
],
|
|
490
|
-
[
|
|
491
|
-
_dec7,
|
|
492
|
-
2,
|
|
493
|
-
"validateRequestedBlock"
|
|
494
|
-
],
|
|
495
|
-
[
|
|
496
|
-
_dec8,
|
|
497
|
-
2,
|
|
498
|
-
"validateCheckpointAttestation"
|
|
499
484
|
]
|
|
500
485
|
], []));
|
|
501
486
|
}
|
|
@@ -507,7 +492,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
507
492
|
checkpointAttestationValidator;
|
|
508
493
|
protocolVersion;
|
|
509
494
|
topicStrings;
|
|
510
|
-
feesCache;
|
|
511
495
|
/** Callback invoked when a duplicate proposal is detected (triggers slashing). */ duplicateProposalCallback;
|
|
512
496
|
/** Callback invoked when a duplicate attestation is detected (triggers slashing). */ duplicateAttestationCallback;
|
|
513
497
|
/**
|
|
@@ -519,13 +503,18 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
519
503
|
* Callback for when a checkpoint proposal is received from a peer.
|
|
520
504
|
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
521
505
|
* @returns The attestations for the checkpoint, if any.
|
|
522
|
-
*/
|
|
506
|
+
*/ allNodesCheckpointReceivedCallback;
|
|
507
|
+
/**
|
|
508
|
+
* Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
|
|
509
|
+
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
510
|
+
* @returns The attestations for the checkpoint, if any.
|
|
511
|
+
*/ validatorCheckpointReceivedCallback;
|
|
523
512
|
gossipSubEventHandler;
|
|
524
513
|
instrumentation;
|
|
525
514
|
telemetry;
|
|
526
515
|
logger;
|
|
527
|
-
constructor(
|
|
528
|
-
super(telemetry, 'LibP2PService'), this.
|
|
516
|
+
constructor(config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, blockMinFeesProvider, telemetry, logger = createLogger('p2p:libp2p_service')){
|
|
517
|
+
super(telemetry, 'LibP2PService'), this.config = config, this.node = node, this.peerDiscoveryService = peerDiscoveryService, this.reqresp = reqresp, this.peerManager = peerManager, this.mempools = mempools, this.archiver = archiver, this.epochCache = epochCache, this.proofVerifier = proofVerifier, this.worldStateSynchronizer = worldStateSynchronizer, this.blockMinFeesProvider = blockMinFeesProvider, this.msgIdSeenValidators = (_initProto(this), {}), this.protocolVersion = '', this.topicStrings = {};
|
|
529
518
|
this.telemetry = telemetry;
|
|
530
519
|
// Create child logger with fisherman prefix if in fisherman mode
|
|
531
520
|
this.logger = config.fishermanMode ? logger.createChild('[FISHERMAN]') : logger;
|
|
@@ -541,35 +530,49 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
541
530
|
this.topicStrings[TopicType.block_proposal] = createTopicString(TopicType.block_proposal, this.protocolVersion);
|
|
542
531
|
this.topicStrings[TopicType.checkpoint_proposal] = createTopicString(TopicType.checkpoint_proposal, this.protocolVersion);
|
|
543
532
|
this.topicStrings[TopicType.checkpoint_attestation] = createTopicString(TopicType.checkpoint_attestation, this.protocolVersion);
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
533
|
+
const p2pPropagationTime = config.attestationPropagationTime;
|
|
534
|
+
const proposalValidatorOpts = {
|
|
535
|
+
txsPermitted: !config.disableTransactions,
|
|
536
|
+
maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
|
|
537
|
+
p2pPropagationTime,
|
|
538
|
+
signatureContext: {
|
|
539
|
+
chainId: config.l1ChainId,
|
|
540
|
+
rollupAddress: config.l1Contracts.rollupAddress
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
|
|
544
|
+
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
|
|
545
|
+
const attestationValidatorOpts = {
|
|
546
|
+
l1PublishingTime: config.l1PublishingTime,
|
|
547
|
+
p2pPropagationTime,
|
|
548
|
+
signatureContext: proposalValidatorOpts.signatureContext
|
|
549
|
+
};
|
|
550
|
+
this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry, attestationValidatorOpts) : new CheckpointAttestationValidator(epochCache, attestationValidatorOpts);
|
|
551
551
|
this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
|
|
552
552
|
this.blockReceivedCallback = async (block)=>{
|
|
553
|
-
this.logger.
|
|
553
|
+
this.logger.warn(`Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`, {
|
|
554
554
|
p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier()
|
|
555
555
|
});
|
|
556
|
-
return
|
|
556
|
+
return true;
|
|
557
|
+
};
|
|
558
|
+
this.allNodesCheckpointReceivedCallback = (_checkpoint)=>{
|
|
559
|
+
throw new CheckpointProposalReceivedCallbackNotRegisteredError();
|
|
557
560
|
};
|
|
558
|
-
this.
|
|
559
|
-
this.logger.debug(`Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`);
|
|
561
|
+
this.validatorCheckpointReceivedCallback = (_checkpoint)=>{
|
|
560
562
|
return Promise.resolve(undefined);
|
|
561
563
|
};
|
|
562
564
|
}
|
|
563
565
|
updateConfig(config) {
|
|
564
566
|
this.reqresp.updateConfig(config);
|
|
567
|
+
this.config = merge(this.config, config);
|
|
565
568
|
}
|
|
566
569
|
/**
|
|
567
570
|
* Creates an instance of the LibP2P service.
|
|
568
571
|
* @param config - The configuration to use when creating the service.
|
|
569
572
|
* @param txPool - The transaction pool to be accessed by the service.
|
|
570
573
|
* @returns The new service.
|
|
571
|
-
*/ static async new(
|
|
572
|
-
const { worldStateSynchronizer, epochCache, l2BlockSource, mempools, proofVerifier, peerStore, telemetry, logger, packageVersion } = deps;
|
|
574
|
+
*/ static async new(config, peerId, deps) {
|
|
575
|
+
const { worldStateSynchronizer, epochCache, l2BlockSource, mempools, proofVerifier, peerStore, blockMinFeesProvider, telemetry, logger, packageVersion } = deps;
|
|
573
576
|
const { p2pPort, maxPeerCount, listenAddress } = config;
|
|
574
577
|
const bindAddrTcp = convertToMultiaddr(listenAddress, p2pPort, 'tcp');
|
|
575
578
|
const datastore = new AztecDatastore(peerStore);
|
|
@@ -609,9 +612,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
609
612
|
const l1Constants = epochCache.getL1Constants();
|
|
610
613
|
const topicScoreParams = createAllTopicScoreParams(protocolVersion, {
|
|
611
614
|
slotDurationMs: l1Constants.slotDuration * 1000,
|
|
615
|
+
ethereumSlotDuration: l1Constants.ethereumSlotDuration,
|
|
612
616
|
heartbeatIntervalMs: config.gossipsubInterval,
|
|
613
617
|
targetCommitteeSize: l1Constants.targetCommitteeSize,
|
|
614
618
|
blockDurationMs: config.blockDurationMs,
|
|
619
|
+
l1PublishingTime: config.l1PublishingTime,
|
|
620
|
+
p2pPropagationTime: config.attestationPropagationTime,
|
|
615
621
|
expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot
|
|
616
622
|
});
|
|
617
623
|
const node = await createLibp2p({
|
|
@@ -726,6 +732,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
726
732
|
const peerScoring = new PeerScoring(config, telemetry);
|
|
727
733
|
const reqresp = new ReqResp(config, node, peerScoring, createLogger(`${logger.module}:reqresp`));
|
|
728
734
|
const peerManager = new PeerManager(node, peerDiscoveryService, config, telemetry, createLogger(`${logger.module}:peer_manager`), peerScoring, reqresp, worldStateSynchronizer, protocolVersion, epochCache);
|
|
735
|
+
// Gate req/resp data protocols for unauthenticated peers when p2pAllowOnlyValidators is enabled
|
|
736
|
+
reqresp.setShouldRejectPeer((peerId)=>peerManager.shouldDisableP2PGossip(peerId));
|
|
729
737
|
// Configure application-specific scoring for gossipsub.
|
|
730
738
|
// The weight scales app score to align with gossipsub thresholds:
|
|
731
739
|
// - Disconnect (-50) × 10 = -500 = gossipThreshold (stops receiving gossip)
|
|
@@ -733,7 +741,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
733
741
|
// Note: positive topic scores can offset penalties, so alignment is best-effort.
|
|
734
742
|
node.services.pubsub.score.params.appSpecificWeight = APP_SPECIFIC_WEIGHT;
|
|
735
743
|
node.services.pubsub.score.params.appSpecificScore = (peerId)=>peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
|
|
736
|
-
return new LibP2PService(
|
|
744
|
+
return new LibP2PService(config, node, peerDiscoveryService, reqresp, peerManager, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, blockMinFeesProvider, telemetry, logger);
|
|
737
745
|
}
|
|
738
746
|
/**
|
|
739
747
|
* Starts the LibP2P service.
|
|
@@ -752,13 +760,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
752
760
|
// Create request response protocol handlers
|
|
753
761
|
const txHandler = reqRespTxHandler(this.mempools);
|
|
754
762
|
const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
|
|
755
|
-
const blockHandler = reqRespBlockHandler(this.archiver);
|
|
756
763
|
const statusHandler = reqRespStatusHandler(this.protocolVersion, this.worldStateSynchronizer, this.logger);
|
|
757
764
|
const requestResponseHandlers = {
|
|
758
765
|
[ReqRespSubProtocol.PING]: pingHandler,
|
|
759
766
|
[ReqRespSubProtocol.STATUS]: statusHandler.bind(this),
|
|
760
|
-
[ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this)
|
|
761
|
-
[ReqRespSubProtocol.BLOCK]: blockHandler.bind(this)
|
|
767
|
+
[ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this)
|
|
762
768
|
};
|
|
763
769
|
if (!this.config.disableTransactions) {
|
|
764
770
|
const blockTxsHandler = reqRespBlockTxsHandler(this.mempools.attestationPool, this.archiver, this.mempools.txPool);
|
|
@@ -771,14 +777,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
771
777
|
const reqrespSubProtocolValidators = {
|
|
772
778
|
...DEFAULT_SUB_PROTOCOL_VALIDATORS,
|
|
773
779
|
[ReqRespSubProtocol.TX]: this.validateRequestedTxs.bind(this),
|
|
774
|
-
[ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this)
|
|
775
|
-
[ReqRespSubProtocol.BLOCK]: this.validateRequestedBlock.bind(this)
|
|
780
|
+
[ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this)
|
|
776
781
|
};
|
|
777
782
|
await this.peerManager.initializePeers();
|
|
778
783
|
await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators);
|
|
779
784
|
await this.node.start();
|
|
780
785
|
// Subscribe to standard GossipSub topics by default
|
|
781
|
-
for (const topic of
|
|
786
|
+
for (const topic of getTopicsForConfig(this.config.disableTransactions)){
|
|
782
787
|
this.subscribeToTopic(this.topicStrings[topic]);
|
|
783
788
|
}
|
|
784
789
|
// add GossipSub listener
|
|
@@ -860,8 +865,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
860
865
|
registerBlockReceivedCallback(callback) {
|
|
861
866
|
this.blockReceivedCallback = callback;
|
|
862
867
|
}
|
|
863
|
-
|
|
864
|
-
this.
|
|
868
|
+
registerValidatorCheckpointReceivedCallback(callback) {
|
|
869
|
+
this.validatorCheckpointReceivedCallback = callback;
|
|
870
|
+
}
|
|
871
|
+
registerAllNodesCheckpointReceivedCallback(callback) {
|
|
872
|
+
this.allNodesCheckpointReceivedCallback = callback;
|
|
873
|
+
}
|
|
874
|
+
async notifyOwnCheckpointProposal(checkpoint) {
|
|
875
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
|
|
865
876
|
}
|
|
866
877
|
/**
|
|
867
878
|
* Registers a callback to be invoked when a duplicate proposal is detected.
|
|
@@ -927,6 +938,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
927
938
|
if (!validator || !validator.addMessage(msgId)) {
|
|
928
939
|
this.instrumentation.incMessagePrevalidationStatus(false, topicType);
|
|
929
940
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
|
|
941
|
+
if (topicType === TopicType.tx) {
|
|
942
|
+
this.logger.verbose(`Ignoring already-seen tx gossip message`, {
|
|
943
|
+
msgId,
|
|
944
|
+
source: source.toString()
|
|
945
|
+
});
|
|
946
|
+
}
|
|
930
947
|
return {
|
|
931
948
|
result: false,
|
|
932
949
|
topicType
|
|
@@ -984,12 +1001,17 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
984
1001
|
}
|
|
985
1002
|
// Process the message, optionally within a linked span for trace propagation
|
|
986
1003
|
const processMessage = async ()=>{
|
|
1004
|
+
if (this.config.skipIncomingProposals && (msg.topic === this.topicStrings[TopicType.block_proposal] || msg.topic === this.topicStrings[TopicType.checkpoint_proposal])) {
|
|
1005
|
+
this.logger.warn(`Ignoring incoming proposal (skipIncomingProposals is set)`, {
|
|
1006
|
+
topic: msg.topic
|
|
1007
|
+
});
|
|
1008
|
+
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
987
1011
|
if (msg.topic === this.topicStrings[TopicType.tx]) {
|
|
988
1012
|
await this.handleGossipedTx(p2pMessage.payload, msgId, source);
|
|
989
1013
|
} else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) {
|
|
990
|
-
|
|
991
|
-
await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
|
|
992
|
-
}
|
|
1014
|
+
await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
|
|
993
1015
|
} else if (msg.topic === this.topicStrings[TopicType.block_proposal]) {
|
|
994
1016
|
await this.processBlockFromPeer(p2pMessage.payload, msgId, source);
|
|
995
1017
|
} else if (msg.topic === this.topicStrings[TopicType.checkpoint_proposal]) {
|
|
@@ -1034,29 +1056,79 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1034
1056
|
return;
|
|
1035
1057
|
}
|
|
1036
1058
|
async validateReceivedMessage(validationFunc, msgId, source, topicType) {
|
|
1059
|
+
// Default to reject result with a penalty if validation function throws an error
|
|
1037
1060
|
let resultAndObj = {
|
|
1038
|
-
result: TopicValidatorResult.Reject
|
|
1061
|
+
result: TopicValidatorResult.Reject,
|
|
1062
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
1039
1063
|
};
|
|
1040
1064
|
const timer = new Timer();
|
|
1041
1065
|
try {
|
|
1042
1066
|
resultAndObj = await validationFunc();
|
|
1043
1067
|
} catch (err) {
|
|
1044
|
-
this.
|
|
1045
|
-
this.logger.error(`Error deserializing and validating gossipsub message`, err, {
|
|
1068
|
+
this.logger.error(`Error validating gossipsub message`, err, {
|
|
1046
1069
|
msgId,
|
|
1047
1070
|
source: source.toString(),
|
|
1048
1071
|
topicType
|
|
1049
1072
|
});
|
|
1050
1073
|
}
|
|
1074
|
+
const validationTimeMs = timer.ms();
|
|
1075
|
+
const mcacheWindowMs = this.config.gossipsubMcacheLength * this.config.gossipsubInterval;
|
|
1076
|
+
if (validationTimeMs > mcacheWindowMs * 0.75) {
|
|
1077
|
+
this.instrumentation.incSlowValidation(topicType);
|
|
1078
|
+
this.logger.warn(`Gossip validation for ${topicType} took ${validationTimeMs}ms, approaching mcache eviction window of ${mcacheWindowMs}ms. ` + `Message forwarding may be skipped if validation exceeds the window.`, {
|
|
1079
|
+
msgId,
|
|
1080
|
+
source: source.toString(),
|
|
1081
|
+
topicType,
|
|
1082
|
+
validationTimeMs,
|
|
1083
|
+
mcacheWindowMs
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1051
1086
|
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
1087
|
+
this.logger.debug(`Message ${topicType} accepted by validator`, {
|
|
1088
|
+
msgId,
|
|
1089
|
+
source: source.toString(),
|
|
1090
|
+
topicType
|
|
1091
|
+
});
|
|
1052
1092
|
this.instrumentation.recordMessageValidation(topicType, timer);
|
|
1093
|
+
} else if (resultAndObj.result === TopicValidatorResult.Reject) {
|
|
1094
|
+
this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
|
|
1095
|
+
msgId,
|
|
1096
|
+
source: source.toString(),
|
|
1097
|
+
topicType,
|
|
1098
|
+
severity: resultAndObj.severity
|
|
1099
|
+
});
|
|
1100
|
+
this.peerManager.penalizePeer(source, resultAndObj.severity);
|
|
1101
|
+
} else {
|
|
1102
|
+
this.logger.trace(`Message ${topicType} ignored by validator`, {
|
|
1103
|
+
msgId,
|
|
1104
|
+
source: source.toString(),
|
|
1105
|
+
topicType
|
|
1106
|
+
});
|
|
1053
1107
|
}
|
|
1054
1108
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
|
|
1055
1109
|
return resultAndObj;
|
|
1056
1110
|
}
|
|
1111
|
+
tryDeserialize(deserializeFunc, msgId, source) {
|
|
1112
|
+
try {
|
|
1113
|
+
return deserializeFunc();
|
|
1114
|
+
} catch (err) {
|
|
1115
|
+
this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
|
|
1116
|
+
err,
|
|
1117
|
+
msgId,
|
|
1118
|
+
source: source.toString()
|
|
1119
|
+
});
|
|
1120
|
+
return undefined;
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1057
1123
|
async handleGossipedTx(payloadData, msgId, source) {
|
|
1058
1124
|
const validationFunc = async ()=>{
|
|
1059
|
-
const tx = Tx.fromBuffer(payloadData);
|
|
1125
|
+
const tx = this.tryDeserialize(()=>Tx.fromBuffer(payloadData), msgId, source);
|
|
1126
|
+
if (!tx) {
|
|
1127
|
+
return {
|
|
1128
|
+
result: TopicValidatorResult.Reject,
|
|
1129
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
1130
|
+
};
|
|
1131
|
+
}
|
|
1060
1132
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1061
1133
|
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1062
1134
|
// Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
|
|
@@ -1072,14 +1144,22 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1072
1144
|
const txBlockNumber = BlockNumber(currentBlockNumber + 1);
|
|
1073
1145
|
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
1074
1146
|
}
|
|
1075
|
-
this.
|
|
1147
|
+
this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
|
|
1148
|
+
validator: name,
|
|
1149
|
+
severity,
|
|
1150
|
+
source: source.toString()
|
|
1151
|
+
});
|
|
1076
1152
|
return {
|
|
1077
|
-
result: TopicValidatorResult.Reject
|
|
1153
|
+
result: TopicValidatorResult.Reject,
|
|
1154
|
+
severity
|
|
1078
1155
|
};
|
|
1079
1156
|
}
|
|
1080
1157
|
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
1081
1158
|
const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
|
|
1082
1159
|
if (canAdd === 'ignored') {
|
|
1160
|
+
this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
|
|
1161
|
+
source: source.toString()
|
|
1162
|
+
});
|
|
1083
1163
|
return {
|
|
1084
1164
|
result: TopicValidatorResult.Ignore,
|
|
1085
1165
|
obj: tx
|
|
@@ -1089,10 +1169,15 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1089
1169
|
const secondStageValidators = this.createSecondStageMessageValidators();
|
|
1090
1170
|
const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
|
|
1091
1171
|
if (!secondStageOutcome.allPassed) {
|
|
1092
|
-
const { severity } = secondStageOutcome.failure;
|
|
1093
|
-
this.
|
|
1172
|
+
const { severity, name } = secondStageOutcome.failure;
|
|
1173
|
+
this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
|
|
1174
|
+
validator: name,
|
|
1175
|
+
severity,
|
|
1176
|
+
source: source.toString()
|
|
1177
|
+
});
|
|
1094
1178
|
return {
|
|
1095
|
-
result: TopicValidatorResult.Reject
|
|
1179
|
+
result: TopicValidatorResult.Reject,
|
|
1180
|
+
severity
|
|
1096
1181
|
};
|
|
1097
1182
|
}
|
|
1098
1183
|
// Pool add: persist the tx
|
|
@@ -1104,7 +1189,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1104
1189
|
});
|
|
1105
1190
|
const wasAccepted = addResult.accepted.some((h)=>h.equals(txHash));
|
|
1106
1191
|
const wasIgnored = addResult.ignored.some((h)=>h.equals(txHash));
|
|
1107
|
-
this.logger.
|
|
1192
|
+
this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
|
|
1108
1193
|
wasAccepted,
|
|
1109
1194
|
wasIgnored,
|
|
1110
1195
|
[Attributes.P2P_ID]: source.toString()
|
|
@@ -1120,8 +1205,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1120
1205
|
obj: tx
|
|
1121
1206
|
};
|
|
1122
1207
|
} else {
|
|
1208
|
+
this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
|
|
1209
|
+
source: source.toString(),
|
|
1210
|
+
txHash: txHash.toString()
|
|
1211
|
+
});
|
|
1123
1212
|
return {
|
|
1124
|
-
result: TopicValidatorResult.Reject
|
|
1213
|
+
result: TopicValidatorResult.Reject,
|
|
1214
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1125
1215
|
};
|
|
1126
1216
|
}
|
|
1127
1217
|
};
|
|
@@ -1142,7 +1232,16 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1142
1232
|
* Process a checkpoint attestation from a peer.
|
|
1143
1233
|
* Validates the attestation and adds it to the pool.
|
|
1144
1234
|
*/ async processCheckpointAttestationFromPeer(payloadData, msgId, source) {
|
|
1145
|
-
const { result, obj: attestation } = await this.validateReceivedMessage(()=>
|
|
1235
|
+
const { result, obj: attestation } = await this.validateReceivedMessage(()=>{
|
|
1236
|
+
const attestation = this.tryDeserialize(()=>CheckpointAttestation.fromBuffer(payloadData), msgId, source);
|
|
1237
|
+
if (!attestation) {
|
|
1238
|
+
return Promise.resolve({
|
|
1239
|
+
result: TopicValidatorResult.Reject,
|
|
1240
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
1241
|
+
});
|
|
1242
|
+
}
|
|
1243
|
+
return this.validateAndStoreCheckpointAttestation(source, attestation);
|
|
1244
|
+
}, msgId, source, TopicType.checkpoint_attestation);
|
|
1146
1245
|
if (result !== TopicValidatorResult.Accept || !attestation) {
|
|
1147
1246
|
return;
|
|
1148
1247
|
}
|
|
@@ -1157,9 +1256,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1157
1256
|
const validationResult = await this.checkpointAttestationValidator.validate(attestation);
|
|
1158
1257
|
if (validationResult.result === 'reject') {
|
|
1159
1258
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1160
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1161
1259
|
return {
|
|
1162
|
-
result: TopicValidatorResult.Reject
|
|
1260
|
+
result: TopicValidatorResult.Reject,
|
|
1261
|
+
severity: validationResult.severity
|
|
1163
1262
|
};
|
|
1164
1263
|
}
|
|
1165
1264
|
if (validationResult.result === 'ignore') {
|
|
@@ -1186,9 +1285,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1186
1285
|
obj: attestation
|
|
1187
1286
|
};
|
|
1188
1287
|
}
|
|
1189
|
-
// Could not add (cap reached for signer),
|
|
1288
|
+
// Could not add (cap reached for signer), penalize and do not re-broadcast
|
|
1190
1289
|
if (!added) {
|
|
1191
|
-
this.logger.warn(`
|
|
1290
|
+
this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
|
|
1192
1291
|
slot: slot.toString(),
|
|
1193
1292
|
archive: attestation.archive.toString(),
|
|
1194
1293
|
source: peerId.toString(),
|
|
@@ -1196,8 +1295,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1196
1295
|
count
|
|
1197
1296
|
});
|
|
1198
1297
|
return {
|
|
1199
|
-
result: TopicValidatorResult.
|
|
1200
|
-
|
|
1298
|
+
result: TopicValidatorResult.Reject,
|
|
1299
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1201
1300
|
};
|
|
1202
1301
|
}
|
|
1203
1302
|
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
@@ -1235,9 +1334,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1235
1334
|
const validationResult = await this.blockProposalValidator.validate(block);
|
|
1236
1335
|
if (validationResult.result === 'reject') {
|
|
1237
1336
|
this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1238
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1239
1337
|
return {
|
|
1240
|
-
result: TopicValidatorResult.Reject
|
|
1338
|
+
result: TopicValidatorResult.Reject,
|
|
1339
|
+
severity: validationResult.severity
|
|
1241
1340
|
};
|
|
1242
1341
|
}
|
|
1243
1342
|
if (validationResult.result === 'ignore') {
|
|
@@ -1267,7 +1366,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1267
1366
|
}
|
|
1268
1367
|
// Too many blocks received for this slot and index, penalize peer and do not re-broadcast
|
|
1269
1368
|
if (!added) {
|
|
1270
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1271
1369
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1272
1370
|
...block.toBlockInfo(),
|
|
1273
1371
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
@@ -1279,7 +1377,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1279
1377
|
result: TopicValidatorResult.Reject,
|
|
1280
1378
|
metadata: {
|
|
1281
1379
|
isEquivocated
|
|
1282
|
-
}
|
|
1380
|
+
},
|
|
1381
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1283
1382
|
};
|
|
1284
1383
|
}
|
|
1285
1384
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1328,7 +1427,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1328
1427
|
// Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
|
|
1329
1428
|
const isValid = await this.blockReceivedCallback(block, sender);
|
|
1330
1429
|
if (!isValid) {
|
|
1331
|
-
this.logger.
|
|
1430
|
+
this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
|
|
1332
1431
|
}
|
|
1333
1432
|
}
|
|
1334
1433
|
/**
|
|
@@ -1353,9 +1452,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1353
1452
|
const validationResult = await this.checkpointProposalValidator.validate(checkpoint);
|
|
1354
1453
|
if (validationResult.result === 'reject') {
|
|
1355
1454
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1356
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1357
1455
|
return {
|
|
1358
|
-
result: TopicValidatorResult.Reject
|
|
1456
|
+
result: TopicValidatorResult.Reject,
|
|
1457
|
+
severity: validationResult.severity
|
|
1359
1458
|
};
|
|
1360
1459
|
}
|
|
1361
1460
|
if (validationResult.result === 'ignore') {
|
|
@@ -1372,18 +1471,20 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1372
1471
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1373
1472
|
[Attributes.P2P_ID]: peerId.toString()
|
|
1374
1473
|
});
|
|
1375
|
-
const
|
|
1376
|
-
|
|
1474
|
+
const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1475
|
+
const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
|
|
1476
|
+
if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1377
1477
|
this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
|
|
1378
1478
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1379
1479
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1380
1480
|
isEquivocated,
|
|
1381
|
-
result
|
|
1481
|
+
result: blockProposalResult.result
|
|
1382
1482
|
});
|
|
1383
1483
|
return {
|
|
1384
|
-
result: TopicValidatorResult.Reject
|
|
1484
|
+
result: TopicValidatorResult.Reject,
|
|
1485
|
+
severity: 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError
|
|
1385
1486
|
};
|
|
1386
|
-
} else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1487
|
+
} else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1387
1488
|
processBlock = true;
|
|
1388
1489
|
}
|
|
1389
1490
|
}
|
|
@@ -1410,7 +1511,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1410
1511
|
// Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
|
|
1411
1512
|
// Note: We still return the checkpoint obj so the lastBlock can be processed if valid
|
|
1412
1513
|
if (!added) {
|
|
1413
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1414
1514
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1415
1515
|
...checkpoint.toCheckpointInfo(),
|
|
1416
1516
|
count,
|
|
@@ -1422,7 +1522,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1422
1522
|
metadata: {
|
|
1423
1523
|
isEquivocated,
|
|
1424
1524
|
processBlock
|
|
1425
|
-
}
|
|
1525
|
+
},
|
|
1526
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1426
1527
|
};
|
|
1427
1528
|
}
|
|
1428
1529
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1472,9 +1573,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1472
1573
|
archive: checkpoint.archive.toString(),
|
|
1473
1574
|
source: sender.toString()
|
|
1474
1575
|
});
|
|
1576
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
|
|
1475
1577
|
// Call the checkpoint received callback with the core version (without lastBlock)
|
|
1476
1578
|
// to validate and potentially generate attestations
|
|
1477
|
-
const attestations = await this.
|
|
1579
|
+
const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
|
|
1478
1580
|
if (attestations && attestations.length > 0) {
|
|
1479
1581
|
// If the callback returned attestations, add them to the pool and propagate them
|
|
1480
1582
|
await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
@@ -1594,45 +1696,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1594
1696
|
return false;
|
|
1595
1697
|
}
|
|
1596
1698
|
}
|
|
1597
|
-
/**
|
|
1598
|
-
* Validates a BLOCK response.
|
|
1599
|
-
*
|
|
1600
|
-
* If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
|
|
1601
|
-
* Penalizes on block number mismatch or hash mismatch.
|
|
1602
|
-
*
|
|
1603
|
-
* @param requestedBlockNumber - The requested block number.
|
|
1604
|
-
* @param responseBlock - The block returned by the peer.
|
|
1605
|
-
* @param peerId - The peer that returned the block.
|
|
1606
|
-
* @returns True if the response is valid, false otherwise.
|
|
1607
|
-
*/ async validateRequestedBlock(requestedBlockNumber, responseBlock, peerId) {
|
|
1608
|
-
try {
|
|
1609
|
-
const reqNum = Number(requestedBlockNumber.toString());
|
|
1610
|
-
if (responseBlock.number !== reqNum) {
|
|
1611
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
1612
|
-
return false;
|
|
1613
|
-
}
|
|
1614
|
-
const local = await this.archiver.getBlock(BlockNumber(reqNum));
|
|
1615
|
-
if (!local) {
|
|
1616
|
-
// We are missing the local block; we cannot verify the hash yet. Reject without penalizing.
|
|
1617
|
-
// TODO: Consider extending this validator to accept an expected hash or
|
|
1618
|
-
// performing quorum-based checks when using P2P syncing prior to L1 sync.
|
|
1619
|
-
this.logger.warn(`Local block ${reqNum} not found; rejecting BLOCK response without hash verification`);
|
|
1620
|
-
return false;
|
|
1621
|
-
}
|
|
1622
|
-
const [localHash, respHash] = await Promise.all([
|
|
1623
|
-
local.hash(),
|
|
1624
|
-
responseBlock.hash()
|
|
1625
|
-
]);
|
|
1626
|
-
if (!localHash.equals(respHash)) {
|
|
1627
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
|
|
1628
|
-
return false;
|
|
1629
|
-
}
|
|
1630
|
-
return true;
|
|
1631
|
-
} catch (e) {
|
|
1632
|
-
this.logger.warn(`Error validating requested block`, e);
|
|
1633
|
-
return false;
|
|
1634
|
-
}
|
|
1635
|
-
}
|
|
1636
1699
|
async validateRequestedTx(tx, peerId, txValidator, requested) {
|
|
1637
1700
|
const penalize = (severity)=>this.peerManager.penalizePeer(peerId, severity);
|
|
1638
1701
|
if (requested && !requested.has(tx.getTxHash().toString())) {
|
|
@@ -1651,17 +1714,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1651
1714
|
rollupVersion: this.config.rollupVersion
|
|
1652
1715
|
});
|
|
1653
1716
|
}
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
return this.feesCache.gasFees;
|
|
1657
|
-
}
|
|
1658
|
-
const header = await this.archiver.getBlockHeader(blockNumber);
|
|
1659
|
-
const gasFees = header?.globalVariables.gasFees ?? GasFees.empty();
|
|
1660
|
-
this.feesCache = {
|
|
1661
|
-
blockNumber,
|
|
1662
|
-
gasFees
|
|
1663
|
-
};
|
|
1664
|
-
return gasFees;
|
|
1717
|
+
getGasFees() {
|
|
1718
|
+
return this.blockMinFeesProvider.getCurrentMinFees();
|
|
1665
1719
|
}
|
|
1666
1720
|
/**
|
|
1667
1721
|
* Get the BatchTxRequesterLibP2PService dependencies for creating BatchTxRequester instances
|
|
@@ -1691,10 +1745,18 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1691
1745
|
}
|
|
1692
1746
|
}
|
|
1693
1747
|
/** Creates the first stage (fast) validators for gossiped transactions. */ async createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp) {
|
|
1694
|
-
const gasFees = await this.getGasFees(
|
|
1695
|
-
const allowedInSetup =
|
|
1748
|
+
const gasFees = await this.getGasFees();
|
|
1749
|
+
const allowedInSetup = [
|
|
1750
|
+
...await getDefaultAllowedSetupFunctions(),
|
|
1751
|
+
...this.config.txPublicSetupAllowListExtend ?? []
|
|
1752
|
+
];
|
|
1696
1753
|
const blockNumber = BlockNumber(currentBlockNumber + 1);
|
|
1697
|
-
|
|
1754
|
+
const l1Constants = await this.archiver.getL1Constants();
|
|
1755
|
+
return createFirstStageTxValidationsForGossipedTransactions(nextSlotTimestamp, blockNumber, this.worldStateSynchronizer, gasFees, this.config.l1ChainId, this.config.rollupVersion, protocolContractsHash, this.archiver, !this.config.disableTransactions, allowedInSetup, this.logger.getBindings(), {
|
|
1756
|
+
rollupManaLimit: l1Constants.rollupManaLimit,
|
|
1757
|
+
maxBlockL2Gas: this.config.validateMaxL2BlockGas,
|
|
1758
|
+
maxBlockDAGas: this.config.validateMaxDABlockGas
|
|
1759
|
+
});
|
|
1698
1760
|
}
|
|
1699
1761
|
/** Creates the second stage (expensive proof verification) validators for gossiped transactions. */ createSecondStageMessageValidators() {
|
|
1700
1762
|
return createSecondStageTxValidationsForGossipedTransactions(this.proofVerifier, this.logger.getBindings());
|
|
@@ -1715,8 +1777,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1715
1777
|
});
|
|
1716
1778
|
// A promise that resolves when all validations have been run
|
|
1717
1779
|
const allValidations = await Promise.all(validationPromises);
|
|
1718
|
-
const
|
|
1719
|
-
if (
|
|
1780
|
+
const failures = allValidations.filter((x)=>!x.isValid);
|
|
1781
|
+
if (failures.length > 0) {
|
|
1782
|
+
// Pick the most severe failure (lowest tolerance = harshest penalty)
|
|
1783
|
+
const failed = maxBy(failures, (f)=>PeerErrorSeverityByHarshness.indexOf(f.severity));
|
|
1720
1784
|
return {
|
|
1721
1785
|
allPassed: false,
|
|
1722
1786
|
failure: {
|
|
@@ -1763,19 +1827,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1763
1827
|
}
|
|
1764
1828
|
return PeerErrorSeverity.HighToleranceError;
|
|
1765
1829
|
}
|
|
1766
|
-
/**
|
|
1767
|
-
* Validate a checkpoint attestation.
|
|
1768
|
-
*
|
|
1769
|
-
* @param attestation - The checkpoint attestation to validate.
|
|
1770
|
-
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
1771
|
-
*/ async validateCheckpointAttestation(peerId, attestation) {
|
|
1772
|
-
const result = await this.checkpointAttestationValidator.validate(attestation);
|
|
1773
|
-
if (result.result === 'reject') {
|
|
1774
|
-
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1775
|
-
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1776
|
-
}
|
|
1777
|
-
return result;
|
|
1778
|
-
}
|
|
1779
1830
|
getPeerScore(peerId) {
|
|
1780
1831
|
return this.node.services.pubsub.score.score(peerId.toString());
|
|
1781
1832
|
}
|