@aztec/p2p 0.0.1-commit.4ad48494d → 0.0.1-commit.4d3c002
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 +7 -7
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +33 -29
- package/dest/client/interface.d.ts +18 -20
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +9 -19
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +72 -102
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +20 -10
- package/dest/config.d.ts +34 -15
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +86 -37
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +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 +11 -6
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +2 -2
- 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 +16 -14
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +9 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -4
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
- 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 +12 -4
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
- 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 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +4 -4
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +5 -5
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +12 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
- 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 +16 -4
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
- 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 +3 -3
- 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/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +24 -10
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +4 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +54 -15
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +111 -19
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +5 -2
- 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 +38 -46
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -4
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +12 -5
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +12 -5
- 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 +296 -153
- 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 +6 -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 +6 -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 +13 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +53 -41
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +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/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 +133 -6
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +247 -60
- 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 +67 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
- package/dest/msg_validators/tx_validator/index.d.ts +3 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +2 -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/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- package/dest/services/discv5/discV5_service.d.ts +1 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +5 -2
- package/dest/services/dummy_service.d.ts +7 -5
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +9 -5
- package/dest/services/encoding.d.ts +6 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +16 -9
- package/dest/services/gossipsub/topic_score_params.d.ts +18 -6
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +32 -10
- package/dest/services/libp2p/libp2p_service.d.ts +30 -22
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +241 -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 +24 -9
- package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +28 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +12 -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 +83 -106
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +4 -7
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
- 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/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +19 -10
- package/dest/services/service.d.ts +11 -4
- 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 +65 -75
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +4 -2
- package/dest/services/tx_collection/file_store_tx_source.d.ts +16 -6
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +50 -9
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +2 -1
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -7
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +5 -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.d.ts +2 -2
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +10 -8
- package/dest/services/tx_collection/tx_collection.d.ts +5 -7
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.d.ts +6 -5
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +13 -22
- package/dest/services/tx_collection/tx_source.d.ts +13 -7
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +26 -7
- package/dest/services/tx_file_store/tx_file_store.js +1 -1
- package/dest/services/tx_provider.d.ts +3 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +4 -4
- 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 +1 -2
- package/dest/test-helpers/mock-pubsub.d.ts +11 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +16 -3
- 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 +7 -3
- package/dest/test-helpers/testbench-utils.d.ts +6 -3
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +23 -4
- package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +56 -26
- package/dest/testbench/worker_client_manager.d.ts +3 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +6 -3
- package/dest/util.d.ts +9 -5
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +2 -10
- package/package.json +14 -14
- package/src/client/factory.ts +56 -48
- package/src/client/interface.ts +20 -21
- package/src/client/p2p_client.ts +78 -132
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +33 -14
- package/src/config.ts +125 -43
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +12 -9
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
- package/src/mem_pools/attestation_pool/mocks.ts +2 -1
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +17 -13
- package/src/mem_pools/tx_pool_v2/README.md +10 -2
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +11 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -4
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +4 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +12 -9
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
- package/src/mem_pools/tx_pool_v2/index.ts +1 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +24 -10
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +159 -27
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -46
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +28 -8
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +330 -149
- 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 +14 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -45
- package/src/msg_validators/tx_validator/README.md +119 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -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/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 +394 -78
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/timestamp_validator.ts +7 -7
- package/src/services/discv5/discV5_service.ts +5 -2
- package/src/services/dummy_service.ts +12 -7
- package/src/services/encoding.ts +16 -8
- package/src/services/gossipsub/README.md +29 -14
- package/src/services/gossipsub/topic_score_params.ts +49 -13
- package/src/services/libp2p/libp2p_service.ts +262 -176
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +28 -9
- package/src/services/peer-manager/peer_scoring.ts +21 -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 +79 -112
- package/src/services/reqresp/batch-tx-requester/interface.ts +3 -6
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/reqresp.ts +22 -12
- package/src/services/service.ts +20 -3
- package/src/services/tx_collection/fast_tx_collection.ts +71 -76
- package/src/services/tx_collection/file_store_tx_collection.ts +7 -3
- package/src/services/tx_collection/file_store_tx_source.ts +65 -9
- package/src/services/tx_collection/instrumentation.ts +7 -1
- package/src/services/tx_collection/proposal_tx_collector.ts +9 -13
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/slow_tx_collection.ts +8 -9
- package/src/services/tx_collection/tx_collection.ts +5 -6
- package/src/services/tx_collection/tx_collection_sink.ts +15 -29
- package/src/services/tx_collection/tx_source.ts +28 -8
- package/src/services/tx_file_store/tx_file_store.ts +1 -1
- package/src/services/tx_provider.ts +2 -2
- package/src/test-helpers/make-test-p2p-clients.ts +1 -3
- package/src/test-helpers/mock-pubsub.ts +20 -6
- package/src/test-helpers/reqresp-nodes.ts +7 -6
- package/src/test-helpers/testbench-utils.ts +32 -6
- package/src/testbench/p2p_client_testbench_worker.ts +62 -29
- package/src/testbench/worker_client_manager.ts +13 -6
- package/src/util.ts +15 -16
- 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/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
|
@@ -370,14 +370,15 @@ 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, _dec7,
|
|
373
|
+
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _initProto;
|
|
374
374
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
375
|
+
import { maxBy } 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
380
|
import { GasFees } from '@aztec/stdlib/gas';
|
|
380
|
-
import { BlockProposal, CheckpointAttestation, CheckpointProposal,
|
|
381
|
+
import { BlockProposal, CheckpointAttestation, CheckpointProposal, P2PMessage, PeerErrorSeverity, PeerErrorSeverityByHarshness, TopicType, createTopicString, getTopicsForConfig, metricsTopicStrToLabels } from '@aztec/stdlib/p2p';
|
|
381
382
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
382
383
|
import { Tx } from '@aztec/stdlib/tx';
|
|
383
384
|
import { compressComponentVersions } from '@aztec/stdlib/versioning';
|
|
@@ -392,11 +393,13 @@ import { identify } from '@libp2p/identify';
|
|
|
392
393
|
import { TopicValidatorResult } from '@libp2p/interface';
|
|
393
394
|
import { mplex } from '@libp2p/mplex';
|
|
394
395
|
import { tcp } from '@libp2p/tcp';
|
|
396
|
+
import { multiaddr } from '@multiformats/multiaddr';
|
|
395
397
|
import { ENR } from '@nethermindeth/enr';
|
|
396
398
|
import { createLibp2p } from 'libp2p';
|
|
399
|
+
import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
|
|
397
400
|
import { BlockProposalValidator, CheckpointAttestationValidator, CheckpointProposalValidator, DoubleSpendTxValidator, FishermanAttestationValidator, getDefaultAllowedSetupFunctions } from '../../msg_validators/index.js';
|
|
398
401
|
import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
|
|
399
|
-
import {
|
|
402
|
+
import { createFirstStageTxValidationsForGossipedTransactions, createSecondStageTxValidationsForGossipedTransactions, createTxValidatorForBlockProposalReceivedTxs, createTxValidatorForReqResponseReceivedTxs } from '../../msg_validators/tx_validator/factory.js';
|
|
400
403
|
import { GossipSubEvent } from '../../types/index.js';
|
|
401
404
|
import { convertToMultiaddr } from '../../util.js';
|
|
402
405
|
import { getVersions } from '../../versioning.js';
|
|
@@ -407,8 +410,7 @@ import { APP_SPECIFIC_WEIGHT, gossipScoreThresholds } from '../gossipsub/scoring
|
|
|
407
410
|
import { createAllTopicScoreParams } from '../gossipsub/topic_score_params.js';
|
|
408
411
|
import { PeerManager } from '../peer-manager/peer_manager.js';
|
|
409
412
|
import { PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
410
|
-
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError } from '../reqresp/index.js';
|
|
411
|
-
import { pingHandler, reqGoodbyeHandler, reqRespBlockHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
|
|
413
|
+
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler, reqRespBlockHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
|
|
412
414
|
import { ReqResp } from '../reqresp/reqresp.js';
|
|
413
415
|
import { P2PInstrumentation } from './instrumentation.js';
|
|
414
416
|
_dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId, attestation)=>({
|
|
@@ -432,17 +434,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
432
434
|
[Attributes.TX_HASH]: requestedTxHash.toString()
|
|
433
435
|
})), _dec7 = trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock)=>({
|
|
434
436
|
[Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString()
|
|
435
|
-
})), _dec8 = trackSpan('Libp2pService.validatePropagatedTx', (tx)=>({
|
|
436
|
-
[Attributes.TX_HASH]: tx.getTxHash().toString()
|
|
437
|
-
})), _dec9 = trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation)=>({
|
|
438
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
439
|
-
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
440
|
-
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then((i)=>i.toString())
|
|
441
437
|
}));
|
|
442
438
|
/**
|
|
443
439
|
* Lib P2P implementation of the P2PService interface.
|
|
444
440
|
*/ export class LibP2PService extends WithTracer {
|
|
445
|
-
clientType;
|
|
446
441
|
config;
|
|
447
442
|
node;
|
|
448
443
|
peerDiscoveryService;
|
|
@@ -494,16 +489,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
494
489
|
_dec7,
|
|
495
490
|
2,
|
|
496
491
|
"validateRequestedBlock"
|
|
497
|
-
],
|
|
498
|
-
[
|
|
499
|
-
_dec8,
|
|
500
|
-
2,
|
|
501
|
-
"validatePropagatedTx"
|
|
502
|
-
],
|
|
503
|
-
[
|
|
504
|
-
_dec9,
|
|
505
|
-
2,
|
|
506
|
-
"validateCheckpointAttestation"
|
|
507
492
|
]
|
|
508
493
|
], []));
|
|
509
494
|
}
|
|
@@ -527,13 +512,20 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
527
512
|
* Callback for when a checkpoint proposal is received from a peer.
|
|
528
513
|
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
529
514
|
* @returns The attestations for the checkpoint, if any.
|
|
530
|
-
*/
|
|
515
|
+
*/ allNodesCheckpointReceivedCallback;
|
|
516
|
+
/**
|
|
517
|
+
* Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
|
|
518
|
+
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
519
|
+
* @returns The attestations for the checkpoint, if any.
|
|
520
|
+
*/ validatorCheckpointReceivedCallback;
|
|
531
521
|
gossipSubEventHandler;
|
|
522
|
+
ipChangedHandler;
|
|
523
|
+
discoveredP2pIp;
|
|
532
524
|
instrumentation;
|
|
533
525
|
telemetry;
|
|
534
526
|
logger;
|
|
535
|
-
constructor(
|
|
536
|
-
super(telemetry, 'LibP2PService'), this.
|
|
527
|
+
constructor(config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger = createLogger('p2p:libp2p_service')){
|
|
528
|
+
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.msgIdSeenValidators = (_initProto(this), {}), this.protocolVersion = '', this.topicStrings = {};
|
|
537
529
|
this.telemetry = telemetry;
|
|
538
530
|
// Create child logger with fisherman prefix if in fisherman mode
|
|
539
531
|
this.logger = config.fishermanMode ? logger.createChild('[FISHERMAN]') : logger;
|
|
@@ -549,22 +541,24 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
549
541
|
this.topicStrings[TopicType.block_proposal] = createTopicString(TopicType.block_proposal, this.protocolVersion);
|
|
550
542
|
this.topicStrings[TopicType.checkpoint_proposal] = createTopicString(TopicType.checkpoint_proposal, this.protocolVersion);
|
|
551
543
|
this.topicStrings[TopicType.checkpoint_attestation] = createTopicString(TopicType.checkpoint_attestation, this.protocolVersion);
|
|
552
|
-
|
|
553
|
-
txsPermitted: !config.disableTransactions
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
544
|
+
const proposalValidatorOpts = {
|
|
545
|
+
txsPermitted: !config.disableTransactions,
|
|
546
|
+
maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint
|
|
547
|
+
};
|
|
548
|
+
this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
|
|
549
|
+
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
|
|
558
550
|
this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry) : new CheckpointAttestationValidator(epochCache);
|
|
559
551
|
this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
|
|
560
552
|
this.blockReceivedCallback = async (block)=>{
|
|
561
|
-
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.`, {
|
|
562
554
|
p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier()
|
|
563
555
|
});
|
|
564
|
-
return
|
|
556
|
+
return true;
|
|
557
|
+
};
|
|
558
|
+
this.allNodesCheckpointReceivedCallback = (_checkpoint)=>{
|
|
559
|
+
throw new CheckpointProposalReceivedCallbackNotRegisteredError();
|
|
565
560
|
};
|
|
566
|
-
this.
|
|
567
|
-
this.logger.debug(`Handler not yet registered: Checkpoint received callback not set. Received checkpoint for slot ${checkpoint.slotNumber} from peer.`);
|
|
561
|
+
this.validatorCheckpointReceivedCallback = (_checkpoint)=>{
|
|
568
562
|
return Promise.resolve(undefined);
|
|
569
563
|
};
|
|
570
564
|
}
|
|
@@ -576,7 +570,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
576
570
|
* @param config - The configuration to use when creating the service.
|
|
577
571
|
* @param txPool - The transaction pool to be accessed by the service.
|
|
578
572
|
* @returns The new service.
|
|
579
|
-
*/ static async new(
|
|
573
|
+
*/ static async new(config, peerId, deps) {
|
|
580
574
|
const { worldStateSynchronizer, epochCache, l2BlockSource, mempools, proofVerifier, peerStore, telemetry, logger, packageVersion } = deps;
|
|
581
575
|
const { p2pPort, maxPeerCount, listenAddress } = config;
|
|
582
576
|
const bindAddrTcp = convertToMultiaddr(listenAddress, p2pPort, 'tcp');
|
|
@@ -619,7 +613,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
619
613
|
slotDurationMs: l1Constants.slotDuration * 1000,
|
|
620
614
|
heartbeatIntervalMs: config.gossipsubInterval,
|
|
621
615
|
targetCommitteeSize: l1Constants.targetCommitteeSize,
|
|
622
|
-
blockDurationMs: config.blockDurationMs
|
|
616
|
+
blockDurationMs: config.blockDurationMs,
|
|
617
|
+
expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot
|
|
623
618
|
});
|
|
624
619
|
const node = await createLibp2p({
|
|
625
620
|
start: false,
|
|
@@ -725,7 +720,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
725
720
|
})
|
|
726
721
|
}),
|
|
727
722
|
components: (components)=>({
|
|
728
|
-
connectionManager: components.connectionManager
|
|
723
|
+
connectionManager: components.connectionManager,
|
|
724
|
+
addressManager: components.addressManager
|
|
729
725
|
})
|
|
730
726
|
},
|
|
731
727
|
logger: createLibp2pComponentLogger(logger.module, logger.getBindings())
|
|
@@ -740,7 +736,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
740
736
|
// Note: positive topic scores can offset penalties, so alignment is best-effort.
|
|
741
737
|
node.services.pubsub.score.params.appSpecificWeight = APP_SPECIFIC_WEIGHT;
|
|
742
738
|
node.services.pubsub.score.params.appSpecificScore = (peerId)=>peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
|
|
743
|
-
return new LibP2PService(
|
|
739
|
+
return new LibP2PService(config, node, peerDiscoveryService, reqresp, peerManager, mempools, l2BlockSource, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger);
|
|
744
740
|
}
|
|
745
741
|
/**
|
|
746
742
|
* Starts the LibP2P service.
|
|
@@ -750,12 +746,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
750
746
|
if (this.node.status === 'started') {
|
|
751
747
|
throw new Error('P2P service already started');
|
|
752
748
|
}
|
|
753
|
-
// Get listen & announce addresses for logging
|
|
754
749
|
const { p2pIp, p2pPort } = this.config;
|
|
755
|
-
if (!p2pIp) {
|
|
756
|
-
throw new Error('Announce address not provided.');
|
|
750
|
+
if (!p2pIp && !this.config.queryForIp) {
|
|
751
|
+
throw new Error('Announce address not provided and queryForIp is not enabled.');
|
|
757
752
|
}
|
|
758
|
-
const announceTcpMultiaddr = convertToMultiaddr(p2pIp, p2pPort, 'tcp');
|
|
753
|
+
const announceTcpMultiaddr = p2pIp ? convertToMultiaddr(p2pIp, p2pPort, 'tcp') : undefined;
|
|
759
754
|
// Create request response protocol handlers
|
|
760
755
|
const txHandler = reqRespTxHandler(this.mempools);
|
|
761
756
|
const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
|
|
@@ -785,7 +780,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
785
780
|
await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators);
|
|
786
781
|
await this.node.start();
|
|
787
782
|
// Subscribe to standard GossipSub topics by default
|
|
788
|
-
for (const topic of
|
|
783
|
+
for (const topic of getTopicsForConfig(this.config.disableTransactions)){
|
|
789
784
|
this.subscribeToTopic(this.topicStrings[topic]);
|
|
790
785
|
}
|
|
791
786
|
// add GossipSub listener
|
|
@@ -794,6 +789,24 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
794
789
|
if (!this.config.p2pDiscoveryDisabled) {
|
|
795
790
|
await this.peerDiscoveryService.start();
|
|
796
791
|
}
|
|
792
|
+
// Bridge discv5 IP changes to libp2p's AddressManager so peers see the updated address
|
|
793
|
+
if (this.config.queryForIp) {
|
|
794
|
+
this.ipChangedHandler = (ip)=>{
|
|
795
|
+
const addressManager = this.node.services.components.addressManager;
|
|
796
|
+
const newAddr = multiaddr(convertToMultiaddr(ip, this.config.p2pPort, 'tcp'));
|
|
797
|
+
if (this.discoveredP2pIp) {
|
|
798
|
+
const oldAddr = multiaddr(convertToMultiaddr(this.discoveredP2pIp, this.config.p2pPort, 'tcp'));
|
|
799
|
+
addressManager.removeObservedAddr(oldAddr);
|
|
800
|
+
}
|
|
801
|
+
addressManager.addObservedAddr(newAddr);
|
|
802
|
+
addressManager.confirmObservedAddr(newAddr);
|
|
803
|
+
this.discoveredP2pIp = ip;
|
|
804
|
+
this.logger.info('Public IP discovered via discv5', {
|
|
805
|
+
ip
|
|
806
|
+
});
|
|
807
|
+
};
|
|
808
|
+
this.peerDiscoveryService.on('ip:changed', this.ipChangedHandler);
|
|
809
|
+
}
|
|
797
810
|
this.discoveryRunningPromise = new RunningPromise(async ()=>{
|
|
798
811
|
await this.peerManager.heartbeat();
|
|
799
812
|
}, this.logger, this.config.peerCheckIntervalMS);
|
|
@@ -811,6 +824,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
811
824
|
*/ async stop() {
|
|
812
825
|
// Remove gossip sub listener
|
|
813
826
|
this.node.services.pubsub.removeEventListener(GossipSubEvent.MESSAGE, this.gossipSubEventHandler);
|
|
827
|
+
if (this.ipChangedHandler) {
|
|
828
|
+
this.peerDiscoveryService.removeListener('ip:changed', this.ipChangedHandler);
|
|
829
|
+
this.ipChangedHandler = undefined;
|
|
830
|
+
}
|
|
814
831
|
// Stop peer manager
|
|
815
832
|
this.logger.debug('Stopping peer manager...');
|
|
816
833
|
await this.peerManager.stop();
|
|
@@ -833,6 +850,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
833
850
|
getPeers(includePending) {
|
|
834
851
|
return this.peerManager.getPeers(includePending);
|
|
835
852
|
}
|
|
853
|
+
getGossipMeshPeerCount(topicType) {
|
|
854
|
+
return this.node.services.pubsub.getMeshPeers(this.topicStrings[topicType]).length;
|
|
855
|
+
}
|
|
836
856
|
handleGossipSubEvent(e) {
|
|
837
857
|
this.logger.trace(`Received PUBSUB message.`);
|
|
838
858
|
const safeJob = async ()=>{
|
|
@@ -864,8 +884,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
864
884
|
registerBlockReceivedCallback(callback) {
|
|
865
885
|
this.blockReceivedCallback = callback;
|
|
866
886
|
}
|
|
867
|
-
|
|
868
|
-
this.
|
|
887
|
+
registerValidatorCheckpointReceivedCallback(callback) {
|
|
888
|
+
this.validatorCheckpointReceivedCallback = callback;
|
|
889
|
+
}
|
|
890
|
+
registerAllNodesCheckpointReceivedCallback(callback) {
|
|
891
|
+
this.allNodesCheckpointReceivedCallback = callback;
|
|
892
|
+
}
|
|
893
|
+
async notifyOwnCheckpointProposal(checkpoint) {
|
|
894
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
|
|
869
895
|
}
|
|
870
896
|
/**
|
|
871
897
|
* Registers a callback to be invoked when a duplicate proposal is detected.
|
|
@@ -931,6 +957,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
931
957
|
if (!validator || !validator.addMessage(msgId)) {
|
|
932
958
|
this.instrumentation.incMessagePrevalidationStatus(false, topicType);
|
|
933
959
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
|
|
960
|
+
if (topicType === TopicType.tx) {
|
|
961
|
+
this.logger.verbose(`Ignoring already-seen tx gossip message`, {
|
|
962
|
+
msgId,
|
|
963
|
+
source: source.toString()
|
|
964
|
+
});
|
|
965
|
+
}
|
|
934
966
|
return {
|
|
935
967
|
result: false,
|
|
936
968
|
topicType
|
|
@@ -991,9 +1023,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
991
1023
|
if (msg.topic === this.topicStrings[TopicType.tx]) {
|
|
992
1024
|
await this.handleGossipedTx(p2pMessage.payload, msgId, source);
|
|
993
1025
|
} else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) {
|
|
994
|
-
|
|
995
|
-
await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
|
|
996
|
-
}
|
|
1026
|
+
await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
|
|
997
1027
|
} else if (msg.topic === this.topicStrings[TopicType.block_proposal]) {
|
|
998
1028
|
await this.processBlockFromPeer(p2pMessage.payload, msgId, source);
|
|
999
1029
|
} else if (msg.topic === this.topicStrings[TopicType.checkpoint_proposal]) {
|
|
@@ -1038,39 +1068,119 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1038
1068
|
return;
|
|
1039
1069
|
}
|
|
1040
1070
|
async validateReceivedMessage(validationFunc, msgId, source, topicType) {
|
|
1071
|
+
// Default to reject result with a penalty if validation function throws an error
|
|
1041
1072
|
let resultAndObj = {
|
|
1042
|
-
result: TopicValidatorResult.Reject
|
|
1073
|
+
result: TopicValidatorResult.Reject,
|
|
1074
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
1043
1075
|
};
|
|
1044
1076
|
const timer = new Timer();
|
|
1045
1077
|
try {
|
|
1046
1078
|
resultAndObj = await validationFunc();
|
|
1047
1079
|
} catch (err) {
|
|
1048
|
-
this.
|
|
1049
|
-
this.logger.error(`Error deserializing and validating gossipsub message`, err, {
|
|
1080
|
+
this.logger.error(`Error validating gossipsub message`, err, {
|
|
1050
1081
|
msgId,
|
|
1051
1082
|
source: source.toString(),
|
|
1052
1083
|
topicType
|
|
1053
1084
|
});
|
|
1054
1085
|
}
|
|
1055
1086
|
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
1087
|
+
this.logger.debug(`Message ${topicType} accepted by validator`, {
|
|
1088
|
+
msgId,
|
|
1089
|
+
source: source.toString(),
|
|
1090
|
+
topicType
|
|
1091
|
+
});
|
|
1056
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
|
+
});
|
|
1057
1107
|
}
|
|
1058
1108
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
|
|
1059
1109
|
return resultAndObj;
|
|
1060
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
|
+
}
|
|
1061
1123
|
async handleGossipedTx(payloadData, msgId, source) {
|
|
1062
1124
|
const validationFunc = async ()=>{
|
|
1063
|
-
const tx = Tx.fromBuffer(payloadData);
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
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
|
+
}
|
|
1132
|
+
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1133
|
+
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1134
|
+
// Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
|
|
1135
|
+
const firstStageValidators = await this.createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp);
|
|
1136
|
+
const firstStageOutcome = await this.runValidations(tx, firstStageValidators);
|
|
1137
|
+
if (!firstStageOutcome.allPassed) {
|
|
1138
|
+
const { name } = firstStageOutcome.failure;
|
|
1139
|
+
let { severity } = firstStageOutcome.failure;
|
|
1140
|
+
// Double spend validator has a special case handler. We perform more detailed examination
|
|
1141
|
+
// as to how recently the nullifier was entered into the tree and if the transaction should
|
|
1142
|
+
// have 'known' the nullifier existed. This determines the severity of the penalty applied to the peer.
|
|
1143
|
+
if (name === 'doubleSpendValidator') {
|
|
1144
|
+
const txBlockNumber = BlockNumber(currentBlockNumber + 1);
|
|
1145
|
+
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
1146
|
+
}
|
|
1147
|
+
this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
|
|
1148
|
+
validator: name,
|
|
1149
|
+
severity,
|
|
1150
|
+
source: source.toString()
|
|
1068
1151
|
});
|
|
1069
1152
|
return {
|
|
1070
|
-
result: TopicValidatorResult.Reject
|
|
1153
|
+
result: TopicValidatorResult.Reject,
|
|
1154
|
+
severity
|
|
1071
1155
|
};
|
|
1072
1156
|
}
|
|
1073
|
-
//
|
|
1157
|
+
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
1158
|
+
const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
|
|
1159
|
+
if (canAdd === 'ignored') {
|
|
1160
|
+
this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
|
|
1161
|
+
source: source.toString()
|
|
1162
|
+
});
|
|
1163
|
+
return {
|
|
1164
|
+
result: TopicValidatorResult.Ignore,
|
|
1165
|
+
obj: tx
|
|
1166
|
+
};
|
|
1167
|
+
}
|
|
1168
|
+
// Stage 2: expensive proof verification
|
|
1169
|
+
const secondStageValidators = this.createSecondStageMessageValidators();
|
|
1170
|
+
const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
|
|
1171
|
+
if (!secondStageOutcome.allPassed) {
|
|
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
|
+
});
|
|
1178
|
+
return {
|
|
1179
|
+
result: TopicValidatorResult.Reject,
|
|
1180
|
+
severity
|
|
1181
|
+
};
|
|
1182
|
+
}
|
|
1183
|
+
// Pool add: persist the tx
|
|
1074
1184
|
const txHash = tx.getTxHash();
|
|
1075
1185
|
const addResult = await this.mempools.txPool.addPendingTxs([
|
|
1076
1186
|
tx
|
|
@@ -1079,8 +1189,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1079
1189
|
});
|
|
1080
1190
|
const wasAccepted = addResult.accepted.some((h)=>h.equals(txHash));
|
|
1081
1191
|
const wasIgnored = addResult.ignored.some((h)=>h.equals(txHash));
|
|
1082
|
-
this.logger.
|
|
1083
|
-
isValid,
|
|
1192
|
+
this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
|
|
1084
1193
|
wasAccepted,
|
|
1085
1194
|
wasIgnored,
|
|
1086
1195
|
[Attributes.P2P_ID]: source.toString()
|
|
@@ -1096,8 +1205,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1096
1205
|
obj: tx
|
|
1097
1206
|
};
|
|
1098
1207
|
} else {
|
|
1208
|
+
this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
|
|
1209
|
+
source: source.toString(),
|
|
1210
|
+
txHash: txHash.toString()
|
|
1211
|
+
});
|
|
1099
1212
|
return {
|
|
1100
|
-
result: TopicValidatorResult.Reject
|
|
1213
|
+
result: TopicValidatorResult.Reject,
|
|
1214
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1101
1215
|
};
|
|
1102
1216
|
}
|
|
1103
1217
|
};
|
|
@@ -1118,7 +1232,16 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1118
1232
|
* Process a checkpoint attestation from a peer.
|
|
1119
1233
|
* Validates the attestation and adds it to the pool.
|
|
1120
1234
|
*/ async processCheckpointAttestationFromPeer(payloadData, msgId, source) {
|
|
1121
|
-
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);
|
|
1122
1245
|
if (result !== TopicValidatorResult.Accept || !attestation) {
|
|
1123
1246
|
return;
|
|
1124
1247
|
}
|
|
@@ -1133,9 +1256,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1133
1256
|
const validationResult = await this.checkpointAttestationValidator.validate(attestation);
|
|
1134
1257
|
if (validationResult.result === 'reject') {
|
|
1135
1258
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1136
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1137
1259
|
return {
|
|
1138
|
-
result: TopicValidatorResult.Reject
|
|
1260
|
+
result: TopicValidatorResult.Reject,
|
|
1261
|
+
severity: validationResult.severity
|
|
1139
1262
|
};
|
|
1140
1263
|
}
|
|
1141
1264
|
if (validationResult.result === 'ignore') {
|
|
@@ -1162,9 +1285,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1162
1285
|
obj: attestation
|
|
1163
1286
|
};
|
|
1164
1287
|
}
|
|
1165
|
-
// Could not add (cap reached for signer),
|
|
1288
|
+
// Could not add (cap reached for signer), penalize and do not re-broadcast
|
|
1166
1289
|
if (!added) {
|
|
1167
|
-
this.logger.warn(`
|
|
1290
|
+
this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
|
|
1168
1291
|
slot: slot.toString(),
|
|
1169
1292
|
archive: attestation.archive.toString(),
|
|
1170
1293
|
source: peerId.toString(),
|
|
@@ -1172,8 +1295,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1172
1295
|
count
|
|
1173
1296
|
});
|
|
1174
1297
|
return {
|
|
1175
|
-
result: TopicValidatorResult.
|
|
1176
|
-
|
|
1298
|
+
result: TopicValidatorResult.Reject,
|
|
1299
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1177
1300
|
};
|
|
1178
1301
|
}
|
|
1179
1302
|
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
@@ -1211,9 +1334,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1211
1334
|
const validationResult = await this.blockProposalValidator.validate(block);
|
|
1212
1335
|
if (validationResult.result === 'reject') {
|
|
1213
1336
|
this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1214
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1215
1337
|
return {
|
|
1216
|
-
result: TopicValidatorResult.Reject
|
|
1338
|
+
result: TopicValidatorResult.Reject,
|
|
1339
|
+
severity: validationResult.severity
|
|
1217
1340
|
};
|
|
1218
1341
|
}
|
|
1219
1342
|
if (validationResult.result === 'ignore') {
|
|
@@ -1243,7 +1366,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1243
1366
|
}
|
|
1244
1367
|
// Too many blocks received for this slot and index, penalize peer and do not re-broadcast
|
|
1245
1368
|
if (!added) {
|
|
1246
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1247
1369
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1248
1370
|
...block.toBlockInfo(),
|
|
1249
1371
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
@@ -1255,7 +1377,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1255
1377
|
result: TopicValidatorResult.Reject,
|
|
1256
1378
|
metadata: {
|
|
1257
1379
|
isEquivocated
|
|
1258
|
-
}
|
|
1380
|
+
},
|
|
1381
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1259
1382
|
};
|
|
1260
1383
|
}
|
|
1261
1384
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1304,7 +1427,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1304
1427
|
// Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
|
|
1305
1428
|
const isValid = await this.blockReceivedCallback(block, sender);
|
|
1306
1429
|
if (!isValid) {
|
|
1307
|
-
this.logger.
|
|
1430
|
+
this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
|
|
1308
1431
|
}
|
|
1309
1432
|
}
|
|
1310
1433
|
/**
|
|
@@ -1329,9 +1452,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1329
1452
|
const validationResult = await this.checkpointProposalValidator.validate(checkpoint);
|
|
1330
1453
|
if (validationResult.result === 'reject') {
|
|
1331
1454
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1332
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1333
1455
|
return {
|
|
1334
|
-
result: TopicValidatorResult.Reject
|
|
1456
|
+
result: TopicValidatorResult.Reject,
|
|
1457
|
+
severity: validationResult.severity
|
|
1335
1458
|
};
|
|
1336
1459
|
}
|
|
1337
1460
|
if (validationResult.result === 'ignore') {
|
|
@@ -1348,18 +1471,20 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1348
1471
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1349
1472
|
[Attributes.P2P_ID]: peerId.toString()
|
|
1350
1473
|
});
|
|
1351
|
-
const
|
|
1352
|
-
|
|
1474
|
+
const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1475
|
+
const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
|
|
1476
|
+
if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1353
1477
|
this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
|
|
1354
1478
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1355
1479
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1356
1480
|
isEquivocated,
|
|
1357
|
-
result
|
|
1481
|
+
result: blockProposalResult.result
|
|
1358
1482
|
});
|
|
1359
1483
|
return {
|
|
1360
|
-
result: TopicValidatorResult.Reject
|
|
1484
|
+
result: TopicValidatorResult.Reject,
|
|
1485
|
+
severity: 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError
|
|
1361
1486
|
};
|
|
1362
|
-
} else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1487
|
+
} else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1363
1488
|
processBlock = true;
|
|
1364
1489
|
}
|
|
1365
1490
|
}
|
|
@@ -1386,7 +1511,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1386
1511
|
// Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
|
|
1387
1512
|
// Note: We still return the checkpoint obj so the lastBlock can be processed if valid
|
|
1388
1513
|
if (!added) {
|
|
1389
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1390
1514
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1391
1515
|
...checkpoint.toCheckpointInfo(),
|
|
1392
1516
|
count,
|
|
@@ -1398,7 +1522,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1398
1522
|
metadata: {
|
|
1399
1523
|
isEquivocated,
|
|
1400
1524
|
processBlock
|
|
1401
|
-
}
|
|
1525
|
+
},
|
|
1526
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1402
1527
|
};
|
|
1403
1528
|
}
|
|
1404
1529
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1448,9 +1573,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1448
1573
|
archive: checkpoint.archive.toString(),
|
|
1449
1574
|
source: sender.toString()
|
|
1450
1575
|
});
|
|
1576
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
|
|
1451
1577
|
// Call the checkpoint received callback with the core version (without lastBlock)
|
|
1452
1578
|
// to validate and potentially generate attestations
|
|
1453
|
-
const attestations = await this.
|
|
1579
|
+
const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
|
|
1454
1580
|
if (attestations && attestations.length > 0) {
|
|
1455
1581
|
// If the callback returned attestations, add them to the pool and propagate them
|
|
1456
1582
|
await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
@@ -1622,33 +1748,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1622
1748
|
}
|
|
1623
1749
|
}
|
|
1624
1750
|
createRequestedTxValidator() {
|
|
1625
|
-
return
|
|
1751
|
+
return createTxValidatorForReqResponseReceivedTxs(this.proofVerifier, {
|
|
1626
1752
|
l1ChainId: this.config.l1ChainId,
|
|
1627
1753
|
rollupVersion: this.config.rollupVersion
|
|
1628
1754
|
});
|
|
1629
1755
|
}
|
|
1630
|
-
async validatePropagatedTx(tx, peerId) {
|
|
1631
|
-
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1632
|
-
// We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
|
|
1633
|
-
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1634
|
-
const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
|
|
1635
|
-
for (const validator of messageValidators){
|
|
1636
|
-
const outcome = await this.runValidations(tx, validator);
|
|
1637
|
-
if (outcome.allPassed) {
|
|
1638
|
-
continue;
|
|
1639
|
-
}
|
|
1640
|
-
const { name } = outcome.failure;
|
|
1641
|
-
let { severity } = outcome.failure;
|
|
1642
|
-
// Double spend validator has a special case handler
|
|
1643
|
-
if (name === 'doubleSpendValidator') {
|
|
1644
|
-
const txBlockNumber = BlockNumber(currentBlockNumber + 1); // tx is expected to be in the next block
|
|
1645
|
-
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
1646
|
-
}
|
|
1647
|
-
this.peerManager.penalizePeer(peerId, severity);
|
|
1648
|
-
return false;
|
|
1649
|
-
}
|
|
1650
|
-
return true;
|
|
1651
|
-
}
|
|
1652
1756
|
async getGasFees(blockNumber) {
|
|
1653
1757
|
if (blockNumber === this.feesCache?.blockNumber) {
|
|
1654
1758
|
return this.feesCache.gasFees;
|
|
@@ -1675,38 +1779,35 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1675
1779
|
peerScoring: this.peerManager
|
|
1676
1780
|
};
|
|
1677
1781
|
}
|
|
1678
|
-
async
|
|
1679
|
-
const
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
await Promise.all(txs.map(async (tx)=>{
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
if (!outcome.allPassed) {
|
|
1687
|
-
throw new Error('Invalid tx detected', {
|
|
1688
|
-
cause: {
|
|
1689
|
-
outcome
|
|
1690
|
-
}
|
|
1691
|
-
});
|
|
1692
|
-
}
|
|
1693
|
-
}
|
|
1782
|
+
async validateTxsReceivedInBlockProposal(txs) {
|
|
1783
|
+
const validator = createTxValidatorForBlockProposalReceivedTxs(this.proofVerifier, {
|
|
1784
|
+
l1ChainId: this.config.l1ChainId,
|
|
1785
|
+
rollupVersion: this.config.rollupVersion
|
|
1786
|
+
}, this.logger.getBindings());
|
|
1787
|
+
const results = await Promise.all(txs.map(async (tx)=>{
|
|
1788
|
+
const result = await validator.validateTx(tx);
|
|
1789
|
+
return result.result !== 'invalid';
|
|
1694
1790
|
}));
|
|
1791
|
+
if (results.some((value)=>value === false)) {
|
|
1792
|
+
throw new Error('Invalid tx detected');
|
|
1793
|
+
}
|
|
1695
1794
|
}
|
|
1696
|
-
/**
|
|
1697
|
-
* Create message validators for the given block number and timestamp.
|
|
1698
|
-
*
|
|
1699
|
-
* Each validator is a pair of a validator and a severity.
|
|
1700
|
-
* If a validator fails, the peer is penalized with the severity of the validator.
|
|
1701
|
-
*
|
|
1702
|
-
* @param currentBlockNumber - The current synced block number.
|
|
1703
|
-
* @param nextSlotTimestamp - The timestamp of the next slot (used to validate txs are not expired).
|
|
1704
|
-
* @returns The message validators.
|
|
1705
|
-
*/ async createMessageValidators(currentBlockNumber, nextSlotTimestamp) {
|
|
1795
|
+
/** Creates the first stage (fast) validators for gossiped transactions. */ async createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp) {
|
|
1706
1796
|
const gasFees = await this.getGasFees(currentBlockNumber);
|
|
1707
|
-
const allowedInSetup =
|
|
1708
|
-
|
|
1709
|
-
|
|
1797
|
+
const allowedInSetup = [
|
|
1798
|
+
...await getDefaultAllowedSetupFunctions(),
|
|
1799
|
+
...this.config.txPublicSetupAllowListExtend ?? []
|
|
1800
|
+
];
|
|
1801
|
+
const blockNumber = BlockNumber(currentBlockNumber + 1);
|
|
1802
|
+
const l1Constants = await this.archiver.getL1Constants();
|
|
1803
|
+
return createFirstStageTxValidationsForGossipedTransactions(nextSlotTimestamp, blockNumber, this.worldStateSynchronizer, gasFees, this.config.l1ChainId, this.config.rollupVersion, protocolContractsHash, this.archiver, !this.config.disableTransactions, allowedInSetup, this.logger.getBindings(), {
|
|
1804
|
+
rollupManaLimit: l1Constants.rollupManaLimit,
|
|
1805
|
+
maxBlockL2Gas: this.config.validateMaxL2BlockGas,
|
|
1806
|
+
maxBlockDAGas: this.config.validateMaxDABlockGas
|
|
1807
|
+
});
|
|
1808
|
+
}
|
|
1809
|
+
/** Creates the second stage (expensive proof verification) validators for gossiped transactions. */ createSecondStageMessageValidators() {
|
|
1810
|
+
return createSecondStageTxValidationsForGossipedTransactions(this.proofVerifier, this.logger.getBindings());
|
|
1710
1811
|
}
|
|
1711
1812
|
/**
|
|
1712
1813
|
* Run validations on a tx.
|
|
@@ -1724,8 +1825,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1724
1825
|
});
|
|
1725
1826
|
// A promise that resolves when all validations have been run
|
|
1726
1827
|
const allValidations = await Promise.all(validationPromises);
|
|
1727
|
-
const
|
|
1728
|
-
if (
|
|
1828
|
+
const failures = allValidations.filter((x)=>!x.isValid);
|
|
1829
|
+
if (failures.length > 0) {
|
|
1830
|
+
// Pick the most severe failure (lowest tolerance = harshest penalty)
|
|
1831
|
+
const failed = maxBy(failures, (f)=>PeerErrorSeverityByHarshness.indexOf(f.severity));
|
|
1729
1832
|
return {
|
|
1730
1833
|
allPassed: false,
|
|
1731
1834
|
failure: {
|
|
@@ -1772,19 +1875,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1772
1875
|
}
|
|
1773
1876
|
return PeerErrorSeverity.HighToleranceError;
|
|
1774
1877
|
}
|
|
1775
|
-
/**
|
|
1776
|
-
* Validate a checkpoint attestation.
|
|
1777
|
-
*
|
|
1778
|
-
* @param attestation - The checkpoint attestation to validate.
|
|
1779
|
-
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
1780
|
-
*/ async validateCheckpointAttestation(peerId, attestation) {
|
|
1781
|
-
const result = await this.checkpointAttestationValidator.validate(attestation);
|
|
1782
|
-
if (result.result === 'reject') {
|
|
1783
|
-
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1784
|
-
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1785
|
-
}
|
|
1786
|
-
return result;
|
|
1787
|
-
}
|
|
1788
1878
|
getPeerScore(peerId) {
|
|
1789
1879
|
return this.node.services.pubsub.score.score(peerId.toString());
|
|
1790
1880
|
}
|