@aztec/p2p 0.0.1-commit.3d8f95d → 0.0.1-commit.3fd054f6
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 +35 -29
- package/dest/client/interface.d.ts +14 -19
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +9 -18
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +68 -100
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -7
- package/dest/config.d.ts +43 -15
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +91 -37
- 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/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 +13 -4
- 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/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/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +2 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
- package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.js +4 -4
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +3 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +30 -13
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +91 -20
- 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 +7 -3
- 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 +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -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 +14 -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 +28 -10
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +56 -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 +107 -18
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
- 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 +50 -45
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
- 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 +17 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -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 +319 -147
- 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/dummy_service.d.ts +4 -4
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +4 -4
- 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 +18 -20
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +190 -140
- 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 +1 -1
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +6 -3
- 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/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 +5 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +13 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +30 -0
- 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 +38 -29
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +126 -77
- 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 +49 -16
- 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 +5 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +17 -12
- package/dest/services/tx_collection/tx_collection.d.ts +9 -9
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +26 -10
- 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 +8 -3
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +19 -2
- package/dest/services/tx_file_store/tx_file_store.d.ts +3 -2
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +9 -6
- 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 +4 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +8 -2
- 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 +2 -2
- package/dest/test-helpers/testbench-utils.d.ts +8 -3
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +29 -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 +15 -14
- 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 -2
- package/dest/util.d.ts +3 -3
- package/dest/util.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/client/factory.ts +62 -47
- package/src/client/interface.ts +17 -20
- package/src/client/p2p_client.ts +74 -130
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +18 -11
- package/src/config.ts +133 -43
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +16 -7
- 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/instrumentation.ts +17 -13
- package/src/mem_pools/tx_pool/README.md +1 -1
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +2 -1
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
- package/src/mem_pools/tx_pool/priority.ts +4 -4
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
- package/src/mem_pools/tx_pool_v2/README.md +52 -28
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +109 -22
- 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 +7 -3
- 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 +5 -5
- 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 +14 -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 +30 -10
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +156 -26
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +353 -143
- 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/dummy_service.ts +6 -6
- 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 +198 -161
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +7 -3
- 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/reqresp.ts +22 -12
- package/src/services/service.ts +11 -2
- package/src/services/tx_collection/config.ts +42 -0
- package/src/services/tx_collection/fast_tx_collection.ts +71 -76
- package/src/services/tx_collection/file_store_tx_collection.ts +143 -93
- package/src/services/tx_collection/file_store_tx_source.ts +64 -17
- 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 +17 -13
- package/src/services/tx_collection/tx_collection.ts +46 -17
- package/src/services/tx_collection/tx_collection_sink.ts +15 -29
- package/src/services/tx_collection/tx_source.ts +22 -3
- package/src/services/tx_file_store/tx_file_store.ts +6 -4
- 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 +13 -6
- package/src/test-helpers/reqresp-nodes.ts +3 -6
- package/src/test-helpers/testbench-utils.ts +40 -6
- package/src/testbench/p2p_client_testbench_worker.ts +22 -20
- package/src/testbench/worker_client_manager.ts +13 -5
- package/src/util.ts +8 -2
- 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/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
2
|
import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { maxBy } from '@aztec/foundation/collection';
|
|
3
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
5
|
import { type Logger, createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
5
6
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
@@ -16,13 +17,12 @@ import {
|
|
|
16
17
|
CheckpointProposal,
|
|
17
18
|
type CheckpointProposalCore,
|
|
18
19
|
type Gossipable,
|
|
19
|
-
P2PClientType,
|
|
20
20
|
P2PMessage,
|
|
21
|
-
type ValidationResult as P2PValidationResult,
|
|
22
21
|
PeerErrorSeverity,
|
|
22
|
+
PeerErrorSeverityByHarshness,
|
|
23
23
|
TopicType,
|
|
24
24
|
createTopicString,
|
|
25
|
-
|
|
25
|
+
getTopicsForConfig,
|
|
26
26
|
metricsTopicStrToLabels,
|
|
27
27
|
} from '@aztec/stdlib/p2p';
|
|
28
28
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
@@ -69,9 +69,11 @@ import {
|
|
|
69
69
|
} from '../../msg_validators/index.js';
|
|
70
70
|
import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
|
|
71
71
|
import {
|
|
72
|
-
type
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
type TransactionValidator,
|
|
73
|
+
createFirstStageTxValidationsForGossipedTransactions,
|
|
74
|
+
createSecondStageTxValidationsForGossipedTransactions,
|
|
75
|
+
createTxValidatorForBlockProposalReceivedTxs,
|
|
76
|
+
createTxValidatorForReqResponseReceivedTxs,
|
|
75
77
|
} from '../../msg_validators/tx_validator/factory.js';
|
|
76
78
|
import { GossipSubEvent } from '../../types/index.js';
|
|
77
79
|
import { type PubSubLibp2p, convertToMultiaddr } from '../../util.js';
|
|
@@ -87,6 +89,9 @@ import { PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
|
87
89
|
import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
|
|
88
90
|
import type { P2PReqRespConfig } from '../reqresp/config.js';
|
|
89
91
|
import {
|
|
92
|
+
AuthRequest,
|
|
93
|
+
BlockTxsRequest,
|
|
94
|
+
BlockTxsResponse,
|
|
90
95
|
DEFAULT_SUB_PROTOCOL_VALIDATORS,
|
|
91
96
|
type ReqRespInterface,
|
|
92
97
|
type ReqRespResponse,
|
|
@@ -94,14 +99,9 @@ import {
|
|
|
94
99
|
type ReqRespSubProtocolHandler,
|
|
95
100
|
type ReqRespSubProtocolHandlers,
|
|
96
101
|
type ReqRespSubProtocolValidators,
|
|
102
|
+
StatusMessage,
|
|
97
103
|
type SubProtocolMap,
|
|
98
104
|
ValidationError,
|
|
99
|
-
} from '../reqresp/index.js';
|
|
100
|
-
import {
|
|
101
|
-
AuthRequest,
|
|
102
|
-
BlockTxsRequest,
|
|
103
|
-
BlockTxsResponse,
|
|
104
|
-
StatusMessage,
|
|
105
105
|
pingHandler,
|
|
106
106
|
reqGoodbyeHandler,
|
|
107
107
|
reqRespBlockHandler,
|
|
@@ -130,12 +130,12 @@ type ValidationOutcome = { allPassed: true } | { allPassed: false; failure: Vali
|
|
|
130
130
|
// REFACTOR: Unify with the type above
|
|
131
131
|
type ReceivedMessageValidationResult<T, M = undefined> =
|
|
132
132
|
| { obj: T; result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>; metadata?: M }
|
|
133
|
-
| { obj?: T; result: TopicValidatorResult.Reject; metadata?: M };
|
|
133
|
+
| { obj?: T; result: TopicValidatorResult.Reject; metadata?: M; severity: PeerErrorSeverity };
|
|
134
134
|
|
|
135
135
|
/**
|
|
136
136
|
* Lib P2P implementation of the P2PService interface.
|
|
137
137
|
*/
|
|
138
|
-
export class LibP2PService
|
|
138
|
+
export class LibP2PService extends WithTracer implements P2PService {
|
|
139
139
|
private discoveryRunningPromise?: RunningPromise;
|
|
140
140
|
private msgIdSeenValidators: Record<TopicType, MessageSeenValidator> = {} as Record<TopicType, MessageSeenValidator>;
|
|
141
141
|
|
|
@@ -182,7 +182,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
182
182
|
protected logger: Logger;
|
|
183
183
|
|
|
184
184
|
constructor(
|
|
185
|
-
private clientType: T,
|
|
186
185
|
private config: P2PConfig,
|
|
187
186
|
protected node: PubSubLibp2p,
|
|
188
187
|
private peerDiscoveryService: PeerDiscoveryService,
|
|
@@ -224,10 +223,12 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
224
223
|
this.protocolVersion,
|
|
225
224
|
);
|
|
226
225
|
|
|
227
|
-
|
|
228
|
-
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, {
|
|
226
|
+
const proposalValidatorOpts = {
|
|
229
227
|
txsPermitted: !config.disableTransactions,
|
|
230
|
-
|
|
228
|
+
maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
|
|
229
|
+
};
|
|
230
|
+
this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
|
|
231
|
+
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
|
|
231
232
|
this.checkpointAttestationValidator = config.fishermanMode
|
|
232
233
|
? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry)
|
|
233
234
|
: new CheckpointAttestationValidator(epochCache);
|
|
@@ -235,11 +236,11 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
235
236
|
this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
|
|
236
237
|
|
|
237
238
|
this.blockReceivedCallback = async (block: BlockProposal): Promise<boolean> => {
|
|
238
|
-
this.logger.
|
|
239
|
-
`Handler not yet registered
|
|
239
|
+
this.logger.warn(
|
|
240
|
+
`Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`,
|
|
240
241
|
{ p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier() },
|
|
241
242
|
);
|
|
242
|
-
return
|
|
243
|
+
return true;
|
|
243
244
|
};
|
|
244
245
|
|
|
245
246
|
this.checkpointReceivedCallback = (
|
|
@@ -262,8 +263,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
262
263
|
* @param txPool - The transaction pool to be accessed by the service.
|
|
263
264
|
* @returns The new service.
|
|
264
265
|
*/
|
|
265
|
-
public static async new
|
|
266
|
-
clientType: T,
|
|
266
|
+
public static async new(
|
|
267
267
|
config: P2PConfig,
|
|
268
268
|
peerId: PeerId,
|
|
269
269
|
deps: {
|
|
@@ -341,6 +341,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
341
341
|
heartbeatIntervalMs: config.gossipsubInterval,
|
|
342
342
|
targetCommitteeSize: l1Constants.targetCommitteeSize,
|
|
343
343
|
blockDurationMs: config.blockDurationMs,
|
|
344
|
+
expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot,
|
|
344
345
|
});
|
|
345
346
|
|
|
346
347
|
const node = await createLibp2p({
|
|
@@ -474,7 +475,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
474
475
|
peerManager.shouldDisableP2PGossip(peerId) ? -Infinity : peerManager.getPeerScore(peerId);
|
|
475
476
|
|
|
476
477
|
return new LibP2PService(
|
|
477
|
-
clientType,
|
|
478
478
|
config,
|
|
479
479
|
node,
|
|
480
480
|
peerDiscoveryService,
|
|
@@ -548,7 +548,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
548
548
|
await this.node.start();
|
|
549
549
|
|
|
550
550
|
// Subscribe to standard GossipSub topics by default
|
|
551
|
-
for (const topic of
|
|
551
|
+
for (const topic of getTopicsForConfig(this.config.disableTransactions)) {
|
|
552
552
|
this.subscribeToTopic(this.topicStrings[topic]);
|
|
553
553
|
}
|
|
554
554
|
|
|
@@ -614,6 +614,10 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
614
614
|
return this.peerManager.getPeers(includePending);
|
|
615
615
|
}
|
|
616
616
|
|
|
617
|
+
public getGossipMeshPeerCount(topicType: TopicType): number {
|
|
618
|
+
return this.node.services.pubsub.getMeshPeers(this.topicStrings[topicType]).length;
|
|
619
|
+
}
|
|
620
|
+
|
|
617
621
|
private handleGossipSubEvent(e: CustomEvent<GossipsubMessage>) {
|
|
618
622
|
this.logger.trace(`Received PUBSUB message.`);
|
|
619
623
|
|
|
@@ -749,6 +753,9 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
749
753
|
if (!validator || !validator.addMessage(msgId)) {
|
|
750
754
|
this.instrumentation.incMessagePrevalidationStatus(false, topicType);
|
|
751
755
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
|
|
756
|
+
if (topicType === TopicType.tx) {
|
|
757
|
+
this.logger.verbose(`Ignoring already-seen tx gossip message`, { msgId, source: source.toString() });
|
|
758
|
+
}
|
|
752
759
|
return { result: false, topicType };
|
|
753
760
|
}
|
|
754
761
|
|
|
@@ -813,9 +820,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
813
820
|
if (msg.topic === this.topicStrings[TopicType.tx]) {
|
|
814
821
|
await this.handleGossipedTx(p2pMessage.payload, msgId, source);
|
|
815
822
|
} else if (msg.topic === this.topicStrings[TopicType.checkpoint_attestation]) {
|
|
816
|
-
|
|
817
|
-
await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
|
|
818
|
-
}
|
|
823
|
+
await this.processCheckpointAttestationFromPeer(p2pMessage.payload, msgId, source);
|
|
819
824
|
} else if (msg.topic === this.topicStrings[TopicType.block_proposal]) {
|
|
820
825
|
await this.processBlockFromPeer(p2pMessage.payload, msgId, source);
|
|
821
826
|
} else if (msg.topic === this.topicStrings[TopicType.checkpoint_proposal]) {
|
|
@@ -877,47 +882,113 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
877
882
|
source: PeerId,
|
|
878
883
|
topicType: TopicType,
|
|
879
884
|
): Promise<ReceivedMessageValidationResult<T, M>> {
|
|
880
|
-
|
|
885
|
+
// Default to reject result with a penalty if validation function throws an error
|
|
886
|
+
let resultAndObj: ReceivedMessageValidationResult<T, M> = {
|
|
887
|
+
result: TopicValidatorResult.Reject,
|
|
888
|
+
severity: PeerErrorSeverity.MidToleranceError,
|
|
889
|
+
};
|
|
881
890
|
const timer = new Timer();
|
|
882
891
|
try {
|
|
883
892
|
resultAndObj = await validationFunc();
|
|
884
893
|
} catch (err) {
|
|
885
|
-
this.
|
|
886
|
-
this.logger.error(`Error deserializing and validating gossipsub message`, err, {
|
|
887
|
-
msgId,
|
|
888
|
-
source: source.toString(),
|
|
889
|
-
topicType,
|
|
890
|
-
});
|
|
894
|
+
this.logger.error(`Error validating gossipsub message`, err, { msgId, source: source.toString(), topicType });
|
|
891
895
|
}
|
|
892
896
|
|
|
893
897
|
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
898
|
+
this.logger.debug(`Message ${topicType} accepted by validator`, { msgId, source: source.toString(), topicType });
|
|
894
899
|
this.instrumentation.recordMessageValidation(topicType, timer);
|
|
900
|
+
} else if (resultAndObj.result === TopicValidatorResult.Reject) {
|
|
901
|
+
this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
|
|
902
|
+
msgId,
|
|
903
|
+
source: source.toString(),
|
|
904
|
+
topicType,
|
|
905
|
+
severity: resultAndObj.severity,
|
|
906
|
+
});
|
|
907
|
+
this.peerManager.penalizePeer(source, resultAndObj.severity);
|
|
908
|
+
} else {
|
|
909
|
+
this.logger.trace(`Message ${topicType} ignored by validator`, { msgId, source: source.toString(), topicType });
|
|
895
910
|
}
|
|
896
911
|
|
|
897
912
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
|
|
898
913
|
return resultAndObj;
|
|
899
914
|
}
|
|
900
915
|
|
|
916
|
+
private tryDeserialize<T>(deserializeFunc: () => T, msgId: string, source: PeerId): T | undefined {
|
|
917
|
+
try {
|
|
918
|
+
return deserializeFunc();
|
|
919
|
+
} catch (err) {
|
|
920
|
+
this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
|
|
921
|
+
err,
|
|
922
|
+
msgId,
|
|
923
|
+
source: source.toString(),
|
|
924
|
+
});
|
|
925
|
+
return undefined;
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
|
|
901
929
|
protected async handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId) {
|
|
902
930
|
const validationFunc: () => Promise<ReceivedMessageValidationResult<Tx>> = async () => {
|
|
903
|
-
const tx = Tx.fromBuffer(payloadData);
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
931
|
+
const tx = this.tryDeserialize(() => Tx.fromBuffer(payloadData), msgId, source);
|
|
932
|
+
if (!tx) {
|
|
933
|
+
return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.LowToleranceError };
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
937
|
+
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
938
|
+
|
|
939
|
+
// Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
|
|
940
|
+
const firstStageValidators = await this.createFirstStageMessageValidators(currentBlockNumber, nextSlotTimestamp);
|
|
941
|
+
const firstStageOutcome = await this.runValidations(tx, firstStageValidators);
|
|
942
|
+
if (!firstStageOutcome.allPassed) {
|
|
943
|
+
const { name } = firstStageOutcome.failure;
|
|
944
|
+
let { severity } = firstStageOutcome.failure;
|
|
945
|
+
|
|
946
|
+
// Double spend validator has a special case handler. We perform more detailed examination
|
|
947
|
+
// as to how recently the nullifier was entered into the tree and if the transaction should
|
|
948
|
+
// have 'known' the nullifier existed. This determines the severity of the penalty applied to the peer.
|
|
949
|
+
if (name === 'doubleSpendValidator') {
|
|
950
|
+
const txBlockNumber = BlockNumber(currentBlockNumber + 1);
|
|
951
|
+
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 1 validation failed`, {
|
|
955
|
+
validator: name,
|
|
956
|
+
severity,
|
|
957
|
+
source: source.toString(),
|
|
958
|
+
});
|
|
959
|
+
return { result: TopicValidatorResult.Reject, severity };
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
963
|
+
const canAdd = await this.mempools.txPool.canAddPendingTx(tx);
|
|
964
|
+
if (canAdd === 'ignored') {
|
|
965
|
+
this.logger.verbose(`Ignoring gossiped tx ${tx.getTxHash().toString()}: pool pre-check returned ignored`, {
|
|
966
|
+
source: source.toString(),
|
|
967
|
+
});
|
|
968
|
+
return { result: TopicValidatorResult.Ignore, obj: tx };
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
// Stage 2: expensive proof verification
|
|
972
|
+
const secondStageValidators = this.createSecondStageMessageValidators();
|
|
973
|
+
const secondStageOutcome = await this.runValidations(tx, secondStageValidators);
|
|
974
|
+
if (!secondStageOutcome.allPassed) {
|
|
975
|
+
const { severity, name } = secondStageOutcome.failure;
|
|
976
|
+
this.logger.verbose(`Rejecting gossiped tx ${tx.getTxHash().toString()}: stage 2 validation failed`, {
|
|
977
|
+
validator: name,
|
|
978
|
+
severity,
|
|
979
|
+
source: source.toString(),
|
|
908
980
|
});
|
|
909
|
-
return { result: TopicValidatorResult.Reject };
|
|
981
|
+
return { result: TopicValidatorResult.Reject, severity };
|
|
910
982
|
}
|
|
911
983
|
|
|
912
|
-
//
|
|
984
|
+
// Pool add: persist the tx
|
|
913
985
|
const txHash = tx.getTxHash();
|
|
914
986
|
const addResult = await this.mempools.txPool.addPendingTxs([tx], { source: 'gossip' });
|
|
915
987
|
|
|
916
988
|
const wasAccepted = addResult.accepted.some(h => h.equals(txHash));
|
|
917
989
|
const wasIgnored = addResult.ignored.some(h => h.equals(txHash));
|
|
918
990
|
|
|
919
|
-
this.logger.
|
|
920
|
-
isValid,
|
|
991
|
+
this.logger.verbose(`Validate propagated tx ${txHash.toString()}`, {
|
|
921
992
|
wasAccepted,
|
|
922
993
|
wasIgnored,
|
|
923
994
|
[Attributes.P2P_ID]: source.toString(),
|
|
@@ -928,7 +999,11 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
928
999
|
} else if (wasIgnored) {
|
|
929
1000
|
return { result: TopicValidatorResult.Ignore, obj: tx };
|
|
930
1001
|
} else {
|
|
931
|
-
|
|
1002
|
+
this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
|
|
1003
|
+
source: source.toString(),
|
|
1004
|
+
txHash: txHash.toString(),
|
|
1005
|
+
});
|
|
1006
|
+
return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
|
|
932
1007
|
}
|
|
933
1008
|
};
|
|
934
1009
|
|
|
@@ -958,7 +1033,16 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
958
1033
|
source: PeerId,
|
|
959
1034
|
): Promise<void> {
|
|
960
1035
|
const { result, obj: attestation } = await this.validateReceivedMessage<CheckpointAttestation>(
|
|
961
|
-
() =>
|
|
1036
|
+
() => {
|
|
1037
|
+
const attestation = this.tryDeserialize(() => CheckpointAttestation.fromBuffer(payloadData), msgId, source);
|
|
1038
|
+
if (!attestation) {
|
|
1039
|
+
return Promise.resolve({
|
|
1040
|
+
result: TopicValidatorResult.Reject,
|
|
1041
|
+
severity: PeerErrorSeverity.LowToleranceError,
|
|
1042
|
+
});
|
|
1043
|
+
}
|
|
1044
|
+
return this.validateAndStoreCheckpointAttestation(source, attestation);
|
|
1045
|
+
},
|
|
962
1046
|
msgId,
|
|
963
1047
|
source,
|
|
964
1048
|
TopicType.checkpoint_attestation,
|
|
@@ -991,8 +1075,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
991
1075
|
|
|
992
1076
|
if (validationResult.result === 'reject') {
|
|
993
1077
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
994
|
-
|
|
995
|
-
return { result: TopicValidatorResult.Reject };
|
|
1078
|
+
return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
|
|
996
1079
|
}
|
|
997
1080
|
|
|
998
1081
|
if (validationResult.result === 'ignore') {
|
|
@@ -1018,16 +1101,16 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1018
1101
|
return { result: TopicValidatorResult.Ignore, obj: attestation };
|
|
1019
1102
|
}
|
|
1020
1103
|
|
|
1021
|
-
// Could not add (cap reached for signer),
|
|
1104
|
+
// Could not add (cap reached for signer), penalize and do not re-broadcast
|
|
1022
1105
|
if (!added) {
|
|
1023
|
-
this.logger.warn(`
|
|
1106
|
+
this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
|
|
1024
1107
|
slot: slot.toString(),
|
|
1025
1108
|
archive: attestation.archive.toString(),
|
|
1026
1109
|
source: peerId.toString(),
|
|
1027
1110
|
attester: attestation.getSender()?.toString(),
|
|
1028
1111
|
count,
|
|
1029
1112
|
});
|
|
1030
|
-
return { result: TopicValidatorResult.
|
|
1113
|
+
return { result: TopicValidatorResult.Reject, severity: PeerErrorSeverity.HighToleranceError };
|
|
1031
1114
|
}
|
|
1032
1115
|
|
|
1033
1116
|
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
@@ -1082,8 +1165,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1082
1165
|
|
|
1083
1166
|
if (validationResult.result === 'reject') {
|
|
1084
1167
|
this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1085
|
-
|
|
1086
|
-
return { result: TopicValidatorResult.Reject };
|
|
1168
|
+
return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
|
|
1087
1169
|
}
|
|
1088
1170
|
|
|
1089
1171
|
if (validationResult.result === 'ignore') {
|
|
@@ -1107,7 +1189,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1107
1189
|
|
|
1108
1190
|
// Too many blocks received for this slot and index, penalize peer and do not re-broadcast
|
|
1109
1191
|
if (!added) {
|
|
1110
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1111
1192
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1112
1193
|
...block.toBlockInfo(),
|
|
1113
1194
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
@@ -1115,7 +1196,11 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1115
1196
|
proposer: block.getSender()?.toString(),
|
|
1116
1197
|
source: peerId.toString(),
|
|
1117
1198
|
});
|
|
1118
|
-
return {
|
|
1199
|
+
return {
|
|
1200
|
+
result: TopicValidatorResult.Reject,
|
|
1201
|
+
metadata: { isEquivocated },
|
|
1202
|
+
severity: PeerErrorSeverity.HighToleranceError,
|
|
1203
|
+
};
|
|
1119
1204
|
}
|
|
1120
1205
|
|
|
1121
1206
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1160,7 +1245,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1160
1245
|
// Note: Validators do NOT attest to individual blocks, only to checkpoint proposals.
|
|
1161
1246
|
const isValid = await this.blockReceivedCallback(block, sender);
|
|
1162
1247
|
if (!isValid) {
|
|
1163
|
-
this.logger.
|
|
1248
|
+
this.logger.info(`Block proposal validation failed for block ${block.blockNumber}`, block.toBlockInfo());
|
|
1164
1249
|
}
|
|
1165
1250
|
}
|
|
1166
1251
|
|
|
@@ -1208,8 +1293,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1208
1293
|
|
|
1209
1294
|
if (validationResult.result === 'reject') {
|
|
1210
1295
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1211
|
-
|
|
1212
|
-
return { result: TopicValidatorResult.Reject };
|
|
1296
|
+
return { result: TopicValidatorResult.Reject, severity: validationResult.severity };
|
|
1213
1297
|
}
|
|
1214
1298
|
|
|
1215
1299
|
if (validationResult.result === 'ignore') {
|
|
@@ -1224,20 +1308,21 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1224
1308
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1225
1309
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1226
1310
|
});
|
|
1227
|
-
const
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
metadata: { isEquivocated } = {},
|
|
1231
|
-
} = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1232
|
-
if (result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1311
|
+
const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1312
|
+
const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
|
|
1313
|
+
if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1233
1314
|
this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
|
|
1234
1315
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1235
1316
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1236
1317
|
isEquivocated,
|
|
1237
|
-
result,
|
|
1318
|
+
result: blockProposalResult.result,
|
|
1238
1319
|
});
|
|
1239
|
-
return {
|
|
1240
|
-
|
|
1320
|
+
return {
|
|
1321
|
+
result: TopicValidatorResult.Reject,
|
|
1322
|
+
severity:
|
|
1323
|
+
'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError,
|
|
1324
|
+
};
|
|
1325
|
+
} else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1241
1326
|
processBlock = true;
|
|
1242
1327
|
}
|
|
1243
1328
|
}
|
|
@@ -1264,13 +1349,17 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1264
1349
|
// Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
|
|
1265
1350
|
// Note: We still return the checkpoint obj so the lastBlock can be processed if valid
|
|
1266
1351
|
if (!added) {
|
|
1267
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1268
1352
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1269
1353
|
...checkpoint.toCheckpointInfo(),
|
|
1270
1354
|
count,
|
|
1271
1355
|
source: peerId.toString(),
|
|
1272
1356
|
});
|
|
1273
|
-
return {
|
|
1357
|
+
return {
|
|
1358
|
+
result: TopicValidatorResult.Reject,
|
|
1359
|
+
obj: checkpoint,
|
|
1360
|
+
metadata: { isEquivocated, processBlock },
|
|
1361
|
+
severity: PeerErrorSeverity.HighToleranceError,
|
|
1362
|
+
};
|
|
1274
1363
|
}
|
|
1275
1364
|
|
|
1276
1365
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1532,43 +1621,12 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1532
1621
|
}
|
|
1533
1622
|
|
|
1534
1623
|
protected createRequestedTxValidator(): TxValidator {
|
|
1535
|
-
return
|
|
1624
|
+
return createTxValidatorForReqResponseReceivedTxs(this.proofVerifier, {
|
|
1536
1625
|
l1ChainId: this.config.l1ChainId,
|
|
1537
1626
|
rollupVersion: this.config.rollupVersion,
|
|
1538
1627
|
});
|
|
1539
1628
|
}
|
|
1540
1629
|
|
|
1541
|
-
@trackSpan('Libp2pService.validatePropagatedTx', tx => ({
|
|
1542
|
-
[Attributes.TX_HASH]: tx.getTxHash().toString(),
|
|
1543
|
-
}))
|
|
1544
|
-
protected async validatePropagatedTx(tx: Tx, peerId: PeerId): Promise<boolean> {
|
|
1545
|
-
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1546
|
-
|
|
1547
|
-
// We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
|
|
1548
|
-
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1549
|
-
const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
|
|
1550
|
-
|
|
1551
|
-
for (const validator of messageValidators) {
|
|
1552
|
-
const outcome = await this.runValidations(tx, validator);
|
|
1553
|
-
|
|
1554
|
-
if (outcome.allPassed) {
|
|
1555
|
-
continue;
|
|
1556
|
-
}
|
|
1557
|
-
const { name } = outcome.failure;
|
|
1558
|
-
let { severity } = outcome.failure;
|
|
1559
|
-
|
|
1560
|
-
// Double spend validator has a special case handler
|
|
1561
|
-
if (name === 'doubleSpendValidator') {
|
|
1562
|
-
const txBlockNumber = BlockNumber(currentBlockNumber + 1); // tx is expected to be in the next block
|
|
1563
|
-
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
1564
|
-
}
|
|
1565
|
-
|
|
1566
|
-
this.peerManager.penalizePeer(peerId, severity);
|
|
1567
|
-
return false;
|
|
1568
|
-
}
|
|
1569
|
-
return true;
|
|
1570
|
-
}
|
|
1571
|
-
|
|
1572
1630
|
private async getGasFees(blockNumber: BlockNumber): Promise<GasFees> {
|
|
1573
1631
|
if (blockNumber === this.feesCache?.blockNumber) {
|
|
1574
1632
|
return this.feesCache.gasFees;
|
|
@@ -1596,60 +1654,62 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1596
1654
|
};
|
|
1597
1655
|
}
|
|
1598
1656
|
|
|
1599
|
-
public async
|
|
1600
|
-
const
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1657
|
+
public async validateTxsReceivedInBlockProposal(txs: Tx[]): Promise<void> {
|
|
1658
|
+
const validator = createTxValidatorForBlockProposalReceivedTxs(
|
|
1659
|
+
this.proofVerifier,
|
|
1660
|
+
{ l1ChainId: this.config.l1ChainId, rollupVersion: this.config.rollupVersion },
|
|
1661
|
+
this.logger.getBindings(),
|
|
1662
|
+
);
|
|
1605
1663
|
|
|
1606
|
-
await Promise.all(
|
|
1664
|
+
const results = await Promise.all(
|
|
1607
1665
|
txs.map(async tx => {
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
if (!outcome.allPassed) {
|
|
1611
|
-
throw new Error('Invalid tx detected', { cause: { outcome } });
|
|
1612
|
-
}
|
|
1613
|
-
}
|
|
1666
|
+
const result = await validator.validateTx(tx);
|
|
1667
|
+
return result.result !== 'invalid';
|
|
1614
1668
|
}),
|
|
1615
1669
|
);
|
|
1670
|
+
if (results.some(value => value === false)) {
|
|
1671
|
+
throw new Error('Invalid tx detected');
|
|
1672
|
+
}
|
|
1616
1673
|
}
|
|
1617
1674
|
|
|
1618
|
-
/**
|
|
1619
|
-
|
|
1620
|
-
*
|
|
1621
|
-
* Each validator is a pair of a validator and a severity.
|
|
1622
|
-
* If a validator fails, the peer is penalized with the severity of the validator.
|
|
1623
|
-
*
|
|
1624
|
-
* @param currentBlockNumber - The current synced block number.
|
|
1625
|
-
* @param nextSlotTimestamp - The timestamp of the next slot (used to validate txs are not expired).
|
|
1626
|
-
* @returns The message validators.
|
|
1627
|
-
*/
|
|
1628
|
-
private async createMessageValidators(
|
|
1675
|
+
/** Creates the first stage (fast) validators for gossiped transactions. */
|
|
1676
|
+
protected async createFirstStageMessageValidators(
|
|
1629
1677
|
currentBlockNumber: BlockNumber,
|
|
1630
1678
|
nextSlotTimestamp: UInt64,
|
|
1631
|
-
): Promise<Record<string,
|
|
1679
|
+
): Promise<Record<string, TransactionValidator>> {
|
|
1632
1680
|
const gasFees = await this.getGasFees(currentBlockNumber);
|
|
1633
|
-
const allowedInSetup =
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1681
|
+
const allowedInSetup = [
|
|
1682
|
+
...(await getDefaultAllowedSetupFunctions()),
|
|
1683
|
+
...(this.config.txPublicSetupAllowListExtend ?? []),
|
|
1684
|
+
];
|
|
1685
|
+
const blockNumber = BlockNumber(currentBlockNumber + 1);
|
|
1686
|
+
const l1Constants = await this.archiver.getL1Constants();
|
|
1687
|
+
|
|
1688
|
+
return createFirstStageTxValidationsForGossipedTransactions(
|
|
1638
1689
|
nextSlotTimestamp,
|
|
1639
|
-
|
|
1690
|
+
blockNumber,
|
|
1640
1691
|
this.worldStateSynchronizer,
|
|
1641
1692
|
gasFees,
|
|
1642
1693
|
this.config.l1ChainId,
|
|
1643
1694
|
this.config.rollupVersion,
|
|
1644
1695
|
protocolContractsHash,
|
|
1645
1696
|
this.archiver,
|
|
1646
|
-
this.proofVerifier,
|
|
1647
1697
|
!this.config.disableTransactions,
|
|
1648
1698
|
allowedInSetup,
|
|
1649
1699
|
this.logger.getBindings(),
|
|
1700
|
+
{
|
|
1701
|
+
rollupManaLimit: l1Constants.rollupManaLimit,
|
|
1702
|
+
maxBlockL2Gas: this.config.validateMaxL2BlockGas,
|
|
1703
|
+
maxBlockDAGas: this.config.validateMaxDABlockGas,
|
|
1704
|
+
},
|
|
1650
1705
|
);
|
|
1651
1706
|
}
|
|
1652
1707
|
|
|
1708
|
+
/** Creates the second stage (expensive proof verification) validators for gossiped transactions. */
|
|
1709
|
+
protected createSecondStageMessageValidators(): Record<string, TransactionValidator> {
|
|
1710
|
+
return createSecondStageTxValidationsForGossipedTransactions(this.proofVerifier, this.logger.getBindings());
|
|
1711
|
+
}
|
|
1712
|
+
|
|
1653
1713
|
/**
|
|
1654
1714
|
* Run validations on a tx.
|
|
1655
1715
|
* @param tx - The tx to validate.
|
|
@@ -1658,7 +1718,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1658
1718
|
*/
|
|
1659
1719
|
private async runValidations(
|
|
1660
1720
|
tx: Tx,
|
|
1661
|
-
messageValidators: Record<string,
|
|
1721
|
+
messageValidators: Record<string, TransactionValidator>,
|
|
1662
1722
|
): Promise<ValidationOutcome> {
|
|
1663
1723
|
const validationPromises = Object.entries(messageValidators).map(async ([name, { validator, severity }]) => {
|
|
1664
1724
|
const { result } = await validator.validateTx(tx);
|
|
@@ -1667,8 +1727,10 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1667
1727
|
|
|
1668
1728
|
// A promise that resolves when all validations have been run
|
|
1669
1729
|
const allValidations = await Promise.all(validationPromises);
|
|
1670
|
-
const
|
|
1671
|
-
if (
|
|
1730
|
+
const failures = allValidations.filter(x => !x.isValid);
|
|
1731
|
+
if (failures.length > 0) {
|
|
1732
|
+
// Pick the most severe failure (lowest tolerance = harshest penalty)
|
|
1733
|
+
const failed = maxBy(failures, f => PeerErrorSeverityByHarshness.indexOf(f.severity))!;
|
|
1672
1734
|
return {
|
|
1673
1735
|
allPassed: false,
|
|
1674
1736
|
failure: {
|
|
@@ -1721,31 +1783,6 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1721
1783
|
return PeerErrorSeverity.HighToleranceError;
|
|
1722
1784
|
}
|
|
1723
1785
|
|
|
1724
|
-
/**
|
|
1725
|
-
* Validate a checkpoint attestation.
|
|
1726
|
-
*
|
|
1727
|
-
* @param attestation - The checkpoint attestation to validate.
|
|
1728
|
-
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
1729
|
-
*/
|
|
1730
|
-
@trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation) => ({
|
|
1731
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
1732
|
-
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
1733
|
-
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then(i => i.toString()),
|
|
1734
|
-
}))
|
|
1735
|
-
public async validateCheckpointAttestation(
|
|
1736
|
-
peerId: PeerId,
|
|
1737
|
-
attestation: CheckpointAttestation,
|
|
1738
|
-
): Promise<P2PValidationResult> {
|
|
1739
|
-
const result = await this.checkpointAttestationValidator.validate(attestation);
|
|
1740
|
-
|
|
1741
|
-
if (result.result === 'reject') {
|
|
1742
|
-
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1743
|
-
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1744
|
-
}
|
|
1745
|
-
|
|
1746
|
-
return result;
|
|
1747
|
-
}
|
|
1748
|
-
|
|
1749
1786
|
public getPeerScore(peerId: PeerId): number {
|
|
1750
1787
|
return this.node.services.pubsub.score.score(peerId.toString());
|
|
1751
1788
|
}
|