@aztec/p2p 0.0.1-commit.d431d1c → 0.0.1-commit.e2b2873ed
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/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +4 -4
- package/dest/client/factory.d.ts +5 -5
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +47 -13
- package/dest/client/interface.d.ts +33 -15
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +35 -36
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +115 -139
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +24 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +16 -2
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +102 -88
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +436 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -2
- package/dest/mem_pools/index.d.ts +3 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/index.js +1 -1
- package/dest/mem_pools/instrumentation.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +2 -2
- package/dest/mem_pools/interface.d.ts +5 -5
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +3 -3
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +3 -2
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +3 -2
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +3 -3
- 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 +8 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +87 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +180 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +119 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +90 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +89 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +131 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +63 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +91 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +70 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +63 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +197 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +6 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +93 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +127 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +99 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +332 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +55 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +156 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +69 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +751 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +3 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +40 -9
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +18 -6
- package/dest/msg_validators/clock_tolerance.d.ts +21 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +37 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +46 -15
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +3 -3
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +66 -11
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +4 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
- package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +21 -11
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +3 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/size_validator.js +4 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +4 -4
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +10 -6
- package/dest/services/discv5/discV5_service.js +1 -1
- package/dest/services/dummy_service.d.ts +22 -2
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +45 -0
- package/dest/services/encoding.d.ts +2 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +2 -2
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +161 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +324 -0
- package/dest/services/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/instrumentation.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -3
- package/dest/services/libp2p/libp2p_service.d.ts +91 -36
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +407 -303
- package/dest/services/peer-manager/metrics.d.ts +2 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +20 -5
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +33 -4
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/interface.d.ts +14 -3
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +17 -3
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -5
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
- package/dest/services/reqresp/protocols/tx.d.ts +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/reqresp.d.ts +6 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +69 -26
- package/dest/services/service.d.ts +38 -1
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +10 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +25 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +7 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +34 -13
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +44 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +118 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +27 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +57 -0
- package/dest/services/tx_collection/index.d.ts +3 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +2 -0
- 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 +9 -2
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +49 -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 +48 -19
- package/dest/services/tx_collection/tx_collection.d.ts +23 -13
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +62 -6
- package/dest/services/tx_collection/tx_collection_sink.d.ts +15 -6
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +13 -7
- package/dest/services/tx_file_store/config.d.ts +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +47 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +149 -0
- package/dest/services/tx_provider.d.ts +5 -5
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +5 -4
- package/dest/services/tx_provider_instrumentation.d.ts +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +5 -5
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.d.ts +27 -1
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +97 -2
- package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +2 -1
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +158 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +360 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +213 -131
- package/dest/testbench/worker_client_manager.d.ts +51 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +226 -44
- package/package.json +14 -14
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +78 -22
- package/src/client/interface.ts +39 -14
- package/src/client/p2p_client.ts +155 -166
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +38 -2
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +488 -91
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/index.ts +4 -1
- package/src/mem_pools/instrumentation.ts +2 -1
- package/src/mem_pools/interface.ts +4 -4
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +2 -2
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +2 -1
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +2 -1
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +10 -7
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
- package/src/mem_pools/tx_pool_v2/README.md +259 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +234 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +147 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +118 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +111 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +23 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +164 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +86 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +72 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +227 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +207 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +417 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +212 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +895 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +25 -13
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +16 -10
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +21 -14
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +53 -14
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
- package/src/msg_validators/tx_validator/data_validator.ts +6 -2
- package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
- package/src/msg_validators/tx_validator/factory.ts +64 -23
- package/src/msg_validators/tx_validator/gas_validator.ts +9 -3
- package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
- package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
- package/src/msg_validators/tx_validator/size_validator.ts +6 -2
- package/src/msg_validators/tx_validator/timestamp_validator.ts +25 -17
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +1 -1
- package/src/services/dummy_service.ts +57 -0
- package/src/services/encoding.ts +2 -2
- package/src/services/gossipsub/README.md +626 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +451 -0
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +15 -2
- package/src/services/libp2p/libp2p_service.ts +437 -318
- package/src/services/peer-manager/metrics.ts +21 -4
- package/src/services/peer-manager/peer_scoring.ts +29 -1
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
- package/src/services/reqresp/interface.ts +31 -3
- package/src/services/reqresp/metrics.ts +34 -9
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
- package/src/services/reqresp/protocols/tx.ts +22 -0
- package/src/services/reqresp/reqresp.ts +79 -22
- package/src/services/service.ts +44 -0
- package/src/services/tx_collection/config.ts +41 -1
- package/src/services/tx_collection/fast_tx_collection.ts +44 -19
- package/src/services/tx_collection/file_store_tx_collection.ts +152 -0
- package/src/services/tx_collection/file_store_tx_source.ts +70 -0
- package/src/services/tx_collection/index.ts +6 -0
- package/src/services/tx_collection/instrumentation.ts +11 -2
- package/src/services/tx_collection/proposal_tx_collector.ts +112 -0
- package/src/services/tx_collection/slow_tx_collection.ts +57 -28
- package/src/services/tx_collection/tx_collection.ts +86 -20
- package/src/services/tx_collection/tx_collection_sink.ts +17 -7
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +173 -0
- package/src/services/tx_provider.ts +10 -9
- package/src/services/tx_provider_instrumentation.ts +11 -5
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/make-test-p2p-clients.ts +3 -3
- package/src/test-helpers/mock-pubsub.ts +133 -3
- package/src/test-helpers/reqresp-nodes.ts +2 -1
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +422 -0
- package/src/testbench/p2p_client_testbench_worker.ts +322 -123
- package/src/testbench/worker_client_manager.ts +304 -47
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { TopicType, createTopicString } from '@aztec/stdlib/p2p';
|
|
2
|
+
import { calculateMaxBlocksPerSlot } from '@aztec/stdlib/timetable';
|
|
3
|
+
import { createTopicScoreParams } from '@chainsafe/libp2p-gossipsub/score';
|
|
4
|
+
/**
|
|
5
|
+
* Calculates the number of blocks per slot based on timing parameters.
|
|
6
|
+
* Uses the shared calculation from @aztec/stdlib/timetable.
|
|
7
|
+
*
|
|
8
|
+
* @param slotDurationMs - L2 slot duration in milliseconds
|
|
9
|
+
* @param blockDurationMs - Duration per block in milliseconds (undefined = single block mode)
|
|
10
|
+
* @returns Number of blocks per slot
|
|
11
|
+
*/ export function calculateBlocksPerSlot(slotDurationMs, blockDurationMs) {
|
|
12
|
+
return calculateMaxBlocksPerSlot(slotDurationMs / 1000, blockDurationMs ? blockDurationMs / 1000 : undefined);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Determines the decay window in slots based on expected message frequency.
|
|
16
|
+
* Low-frequency topics need longer decay windows to accumulate meaningful counter values.
|
|
17
|
+
*
|
|
18
|
+
* @param expectedMessagesPerSlot - Expected messages per slot for this topic
|
|
19
|
+
* @returns Number of slots over which the counter should decay to ~1%
|
|
20
|
+
*/ export function getDecayWindowSlots(expectedMessagesPerSlot) {
|
|
21
|
+
if (expectedMessagesPerSlot <= 1) {
|
|
22
|
+
return 5; // Low frequency: decay over 5 slots
|
|
23
|
+
} else if (expectedMessagesPerSlot <= 10) {
|
|
24
|
+
return 3; // Medium frequency: decay over 3 slots
|
|
25
|
+
} else {
|
|
26
|
+
return 2; // High frequency: decay over 2 slots
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Computes the decay factor for exponential decay over a given window.
|
|
31
|
+
* After `heartbeatsInWindow` heartbeats, the counter decays to ~1% of its original value.
|
|
32
|
+
*
|
|
33
|
+
* @param heartbeatIntervalMs - Gossipsub heartbeat interval in milliseconds
|
|
34
|
+
* @param slotDurationMs - L2 slot duration in milliseconds
|
|
35
|
+
* @param decayWindowSlots - Number of slots over which to decay
|
|
36
|
+
* @returns Decay factor (0 < decay < 1), applied each heartbeat
|
|
37
|
+
*/ export function computeDecay(heartbeatIntervalMs, slotDurationMs, decayWindowSlots) {
|
|
38
|
+
const heartbeatsPerSlot = slotDurationMs / heartbeatIntervalMs;
|
|
39
|
+
const heartbeatsInWindow = heartbeatsPerSlot * decayWindowSlots;
|
|
40
|
+
// Decay to 1% over the window: decay^heartbeatsInWindow = 0.01
|
|
41
|
+
// decay = 0.01^(1/heartbeatsInWindow)
|
|
42
|
+
return Math.pow(0.01, 1 / heartbeatsInWindow);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Computes the steady-state convergence value for a decaying counter.
|
|
46
|
+
* If messages arrive at a constant rate and decay is applied each heartbeat,
|
|
47
|
+
* the counter converges to: rate / (1 - decay)
|
|
48
|
+
*
|
|
49
|
+
* @param messagesPerHeartbeat - Expected messages per heartbeat
|
|
50
|
+
* @param decay - Decay factor applied each heartbeat
|
|
51
|
+
* @returns Convergence value (steady-state counter value)
|
|
52
|
+
*/ export function computeConvergence(messagesPerHeartbeat, decay) {
|
|
53
|
+
return messagesPerHeartbeat / (1 - decay);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Computes a conservative threshold for mesh message deliveries.
|
|
57
|
+
* The threshold should be low enough to avoid penalizing honest peers with normal variance.
|
|
58
|
+
*
|
|
59
|
+
* @param convergence - Steady-state counter value
|
|
60
|
+
* @param conservativeFactor - Fraction of convergence to use as threshold (e.g., 0.3)
|
|
61
|
+
* @returns Threshold value
|
|
62
|
+
*/ export function computeThreshold(convergence, conservativeFactor) {
|
|
63
|
+
return convergence * conservativeFactor;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Gets the expected messages per slot for a given topic type.
|
|
67
|
+
*
|
|
68
|
+
* @param topicType - The topic type
|
|
69
|
+
* @param targetCommitteeSize - Target committee size
|
|
70
|
+
* @param blocksPerSlot - Number of blocks per slot
|
|
71
|
+
* @returns Expected messages per slot, or undefined if unpredictable
|
|
72
|
+
*/ export function getExpectedMessagesPerSlot(topicType, targetCommitteeSize, blocksPerSlot) {
|
|
73
|
+
switch(topicType){
|
|
74
|
+
case TopicType.tx:
|
|
75
|
+
// Transactions are unpredictable - disable mesh message delivery scoring
|
|
76
|
+
return undefined;
|
|
77
|
+
case TopicType.block_proposal:
|
|
78
|
+
// In MBPS mode, N-1 block proposals per slot (last one bundled with checkpoint)
|
|
79
|
+
// In single block mode (blocksPerSlot=1), this is 0
|
|
80
|
+
return Math.max(0, blocksPerSlot - 1);
|
|
81
|
+
case TopicType.checkpoint_proposal:
|
|
82
|
+
// Exactly 1 checkpoint proposal per slot
|
|
83
|
+
return 1;
|
|
84
|
+
case TopicType.checkpoint_attestation:
|
|
85
|
+
// Each committee member sends one attestation per slot
|
|
86
|
+
return targetCommitteeSize;
|
|
87
|
+
default:
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Conservative factor for threshold calculation (30% of convergence) */ const CONSERVATIVE_FACTOR = 0.3;
|
|
92
|
+
/** Number of slots over which invalid message penalty decays */ const INVALID_DECAY_WINDOW_SLOTS = 4;
|
|
93
|
+
/** Weight for invalid message deliveries penalty */ const INVALID_MESSAGE_WEIGHT = -20;
|
|
94
|
+
/** Mesh message deliveries window in milliseconds (5 seconds - balanced for TypeScript runtime) */ const MESH_DELIVERIES_WINDOW_MS = 5000;
|
|
95
|
+
/**
|
|
96
|
+
* Multiplier for activation time to provide extra grace period during network bootstrap.
|
|
97
|
+
* The activation timer starts from mesh join time, not from first message received.
|
|
98
|
+
* During bootstrap, peers may join before messages start flowing, so we need extra time.
|
|
99
|
+
*/ const ACTIVATION_MULTIPLIER = 5;
|
|
100
|
+
// ============================================================================
|
|
101
|
+
// P1 (timeInMesh) Configuration
|
|
102
|
+
// ============================================================================
|
|
103
|
+
// P1 rewards peers for time spent in the mesh. Following Lodestar's approach,
|
|
104
|
+
// we normalize the score so that max P1 = MAX_P1_SCORE after P1_CAP_TIME_SECONDS.
|
|
105
|
+
//
|
|
106
|
+
// Formula: P1 = min(timeInMesh / quantum, cap) * weight
|
|
107
|
+
// - quantum = slotDurationMs (one increment per slot worth of time)
|
|
108
|
+
// - cap = P1_CAP_TIME_SECONDS / slotSeconds (number of slots to reach cap)
|
|
109
|
+
// - weight = MAX_P1_SCORE / cap
|
|
110
|
+
//
|
|
111
|
+
// This ensures: max P1 = cap * weight = MAX_P1_SCORE
|
|
112
|
+
/** Maximum P1 score contribution per topic */ export const MAX_P1_SCORE = 8;
|
|
113
|
+
/** Time in seconds to reach P1 cap (1 hour) */ const P1_CAP_TIME_SECONDS = 3600;
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// P2 (firstMessageDeliveries) Configuration
|
|
116
|
+
// ============================================================================
|
|
117
|
+
// P2 rewards peers who deliver messages first. We normalize so max P2 = MAX_P2_SCORE.
|
|
118
|
+
// P2 uses a decaying counter, so we set the cap based on convergence and scale the weight.
|
|
119
|
+
//
|
|
120
|
+
// Formula: P2 = min(firstMessageDeliveries, cap) * weight
|
|
121
|
+
// - cap = convergence value for first deliveries
|
|
122
|
+
// - weight = MAX_P2_SCORE / cap
|
|
123
|
+
/** Maximum P2 score contribution per topic */ export const MAX_P2_SCORE = 25;
|
|
124
|
+
/** Decay window for first message deliveries in slots (fast decay) */ const P2_DECAY_WINDOW_SLOTS = 2;
|
|
125
|
+
// ============================================================================
|
|
126
|
+
// P3 (meshMessageDeliveries) Configuration
|
|
127
|
+
// ============================================================================
|
|
128
|
+
// P3 penalizes peers who under-deliver messages. For a peer to be pruned from
|
|
129
|
+
// the mesh, their topic score must be negative: P1 + P2 + P3 < 0
|
|
130
|
+
//
|
|
131
|
+
// Therefore, P3 max penalty must exceed (P1 + P2) to cause pruning:
|
|
132
|
+
// |P3| > P1 + P2
|
|
133
|
+
// |P3| > 8 + 25 = 33
|
|
134
|
+
//
|
|
135
|
+
// We set P3 max = -34 per topic (slightly more than P1+P2) to ensure pruning.
|
|
136
|
+
// With 3 topics having P3 enabled, total P3b after pruning = -102.
|
|
137
|
+
//
|
|
138
|
+
// With appSpecificWeight=10, ~20 HighTolerance errors (-40 app score) plus max P3b (-102)
|
|
139
|
+
// would cross gossipThreshold (-500). This keeps non-contributors from being disconnected
|
|
140
|
+
// unless they also accrue app-level penalties.
|
|
141
|
+
//
|
|
142
|
+
// The weight formula ensures max penalty equals MAX_P3_PENALTY_PER_TOPIC:
|
|
143
|
+
// weight = MAX_P3_PENALTY_PER_TOPIC / threshold²
|
|
144
|
+
// When deficit = threshold: penalty = threshold² * weight = MAX_P3_PENALTY_PER_TOPIC
|
|
145
|
+
/** Maximum P3 penalty per topic (must exceed P1 + P2 to cause pruning) */ export const MAX_P3_PENALTY_PER_TOPIC = -(MAX_P1_SCORE + MAX_P2_SCORE + 1); // -34
|
|
146
|
+
/** Number of topics with P3 enabled in MBPS mode (block_proposal + checkpoint_proposal + checkpoint_attestation) */ export const NUM_P3_ENABLED_TOPICS = 3;
|
|
147
|
+
/** Total maximum P3b penalty across all topics after pruning in MBPS mode */ export const TOTAL_MAX_P3B_PENALTY = MAX_P3_PENALTY_PER_TOPIC * NUM_P3_ENABLED_TOPICS; // -102
|
|
148
|
+
/**
|
|
149
|
+
* Factory class for creating gossipsub topic scoring parameters.
|
|
150
|
+
* Computes shared values once and reuses them across all topics.
|
|
151
|
+
*/ export class TopicScoreParamsFactory {
|
|
152
|
+
params;
|
|
153
|
+
/** Number of blocks per slot based on timetable configuration */ blocksPerSlot;
|
|
154
|
+
/** Decay factor for invalid message penalties (P4) */ invalidDecay;
|
|
155
|
+
/** Number of heartbeats per slot */ heartbeatsPerSlot;
|
|
156
|
+
/** P1: Time in mesh quantum (slot duration in ms - score increases by ~1 per slot) */ timeInMeshQuantum;
|
|
157
|
+
/** P1: Time in mesh cap (number of slots to reach max score) */ timeInMeshCap;
|
|
158
|
+
/** P1: Time in mesh weight (normalized so max P1 = MAX_P1_SCORE) */ timeInMeshWeight;
|
|
159
|
+
/** P2: First message deliveries decay factor */ firstMessageDeliveriesDecay;
|
|
160
|
+
/** P2: First message deliveries cap (convergence-based) */ firstMessageDeliveriesCap;
|
|
161
|
+
/** P2: First message deliveries weight (normalized so max P2 = MAX_P2_SCORE) */ firstMessageDeliveriesWeight;
|
|
162
|
+
/** Base parameters common to all topics */ baseParams;
|
|
163
|
+
constructor(params){
|
|
164
|
+
this.params = params;
|
|
165
|
+
const { slotDurationMs, heartbeatIntervalMs, blockDurationMs } = params;
|
|
166
|
+
// Compute values that are the same for all topics
|
|
167
|
+
this.blocksPerSlot = calculateBlocksPerSlot(slotDurationMs, blockDurationMs);
|
|
168
|
+
this.heartbeatsPerSlot = slotDurationMs / heartbeatIntervalMs;
|
|
169
|
+
this.invalidDecay = computeDecay(heartbeatIntervalMs, slotDurationMs, INVALID_DECAY_WINDOW_SLOTS);
|
|
170
|
+
// P1: timeInMesh - Lodestar style slot-based normalization
|
|
171
|
+
// quantum = slot duration, so score increases by ~1 per slot of mesh membership
|
|
172
|
+
// cap = number of slots in P1_CAP_TIME_SECONDS (1 hour)
|
|
173
|
+
// weight = MAX_P1_SCORE / cap, so max P1 = cap * weight = MAX_P1_SCORE
|
|
174
|
+
const slotDurationSeconds = slotDurationMs / 1000;
|
|
175
|
+
this.timeInMeshQuantum = slotDurationMs;
|
|
176
|
+
this.timeInMeshCap = P1_CAP_TIME_SECONDS / slotDurationSeconds;
|
|
177
|
+
this.timeInMeshWeight = MAX_P1_SCORE / this.timeInMeshCap;
|
|
178
|
+
// P2: firstMessageDeliveries - convergence-based cap with normalized weight
|
|
179
|
+
// Uses fast decay (2 slots) so it rewards recent first deliveries
|
|
180
|
+
// cap = convergence at 1 first delivery per heartbeat (theoretical max rate)
|
|
181
|
+
// weight = MAX_P2_SCORE / cap, so max P2 = cap * weight = MAX_P2_SCORE
|
|
182
|
+
this.firstMessageDeliveriesDecay = computeDecay(heartbeatIntervalMs, slotDurationMs, P2_DECAY_WINDOW_SLOTS);
|
|
183
|
+
// Convergence for 1 message per heartbeat (generous estimate for first deliveries)
|
|
184
|
+
this.firstMessageDeliveriesCap = computeConvergence(1, this.firstMessageDeliveriesDecay);
|
|
185
|
+
this.firstMessageDeliveriesWeight = MAX_P2_SCORE / this.firstMessageDeliveriesCap;
|
|
186
|
+
// Base params are identical for all topics
|
|
187
|
+
this.baseParams = {
|
|
188
|
+
topicWeight: 1,
|
|
189
|
+
invalidMessageDeliveriesWeight: INVALID_MESSAGE_WEIGHT,
|
|
190
|
+
invalidMessageDeliveriesDecay: this.invalidDecay,
|
|
191
|
+
// P1: timeInMesh (same for all topics)
|
|
192
|
+
timeInMeshQuantum: this.timeInMeshQuantum,
|
|
193
|
+
timeInMeshCap: this.timeInMeshCap,
|
|
194
|
+
timeInMeshWeight: this.timeInMeshWeight,
|
|
195
|
+
// P2: firstMessageDeliveries (same for all topics)
|
|
196
|
+
firstMessageDeliveriesDecay: this.firstMessageDeliveriesDecay,
|
|
197
|
+
firstMessageDeliveriesCap: this.firstMessageDeliveriesCap,
|
|
198
|
+
firstMessageDeliveriesWeight: this.firstMessageDeliveriesWeight
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Creates scoring parameters for topics with unpredictable or zero message rates.
|
|
203
|
+
* Disables P1, P2, P3, and P3b to avoid unbalanced positive score accumulation.
|
|
204
|
+
*
|
|
205
|
+
* Rationale: If P1/P2 were enabled without P3, the topic would contribute free
|
|
206
|
+
* positive scores that could offset penalties from other topics, preventing
|
|
207
|
+
* proper mesh pruning of non-contributing peers.
|
|
208
|
+
*/ createDisabledP3Params() {
|
|
209
|
+
return createTopicScoreParams({
|
|
210
|
+
topicWeight: 1,
|
|
211
|
+
// P1: timeInMesh - disabled (no free positive scores)
|
|
212
|
+
timeInMeshQuantum: 1,
|
|
213
|
+
timeInMeshCap: 0,
|
|
214
|
+
timeInMeshWeight: 0,
|
|
215
|
+
// P2: firstMessageDeliveries - disabled
|
|
216
|
+
firstMessageDeliveriesDecay: 0.5,
|
|
217
|
+
firstMessageDeliveriesCap: 0,
|
|
218
|
+
firstMessageDeliveriesWeight: 0,
|
|
219
|
+
// P3: meshMessageDeliveries - disabled
|
|
220
|
+
meshMessageDeliveriesWeight: 0,
|
|
221
|
+
meshMessageDeliveriesDecay: 0.5,
|
|
222
|
+
meshMessageDeliveriesThreshold: 0,
|
|
223
|
+
meshMessageDeliveriesWindow: 0,
|
|
224
|
+
meshMessageDeliveriesActivation: 0,
|
|
225
|
+
meshMessageDeliveriesCap: 0,
|
|
226
|
+
// P3b: meshFailurePenalty - disabled
|
|
227
|
+
meshFailurePenaltyWeight: 0,
|
|
228
|
+
meshFailurePenaltyDecay: 0.5,
|
|
229
|
+
// P4: invalidMessageDeliveries - still enabled for attack detection
|
|
230
|
+
invalidMessageDeliveriesWeight: INVALID_MESSAGE_WEIGHT,
|
|
231
|
+
invalidMessageDeliveriesDecay: this.invalidDecay
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Creates scoring parameters for topics with predictable message rates.
|
|
236
|
+
* Enables P1, P2, P3, and P3b for balanced scoring.
|
|
237
|
+
*
|
|
238
|
+
* The scoring is designed so that:
|
|
239
|
+
* - P1 + P2 max = 8 + 25 = 33 (positive rewards for good behavior)
|
|
240
|
+
* - P3 max = -34 (penalty exceeds P1+P2 to ensure pruning of non-contributors)
|
|
241
|
+
* - After pruning: P1 resets, P2 decays, P3b persists with slow decay
|
|
242
|
+
*
|
|
243
|
+
* @param expectedPerSlot - Expected messages per slot
|
|
244
|
+
*/ createEnabledP3Params(expectedPerSlot) {
|
|
245
|
+
const { slotDurationMs, heartbeatIntervalMs } = this.params;
|
|
246
|
+
// Calculate decay based on message frequency
|
|
247
|
+
const decayWindowSlots = getDecayWindowSlots(expectedPerSlot);
|
|
248
|
+
const decay = computeDecay(heartbeatIntervalMs, slotDurationMs, decayWindowSlots);
|
|
249
|
+
// Calculate convergence and threshold
|
|
250
|
+
const messagesPerHeartbeat = expectedPerSlot / this.heartbeatsPerSlot;
|
|
251
|
+
const convergence = computeConvergence(messagesPerHeartbeat, decay);
|
|
252
|
+
const threshold = computeThreshold(convergence, CONSERVATIVE_FACTOR);
|
|
253
|
+
// Cap factor: higher for high-volume topics
|
|
254
|
+
const capFactor = expectedPerSlot > 10 ? 8 : 4;
|
|
255
|
+
// P3 Weight: scaled so max penalty = MAX_P3_PENALTY_PER_TOPIC (-34)
|
|
256
|
+
// When deficit = threshold (peer delivers nothing):
|
|
257
|
+
// penalty = deficit² × weight = threshold² × (MAX_P3_PENALTY_PER_TOPIC / threshold²) = MAX_P3_PENALTY_PER_TOPIC
|
|
258
|
+
const meshDeliveriesWeight = threshold > 0 ? MAX_P3_PENALTY_PER_TOPIC / (threshold * threshold) : 0;
|
|
259
|
+
// Activation time: use the decay window multiplied by ACTIVATION_MULTIPLIER for extra grace
|
|
260
|
+
// during network bootstrap. The timer starts from mesh join time, not from first message,
|
|
261
|
+
// so peers joining before messages flow need extra time to accumulate counter values.
|
|
262
|
+
const activationMs = slotDurationMs * decayWindowSlots * ACTIVATION_MULTIPLIER;
|
|
263
|
+
return createTopicScoreParams({
|
|
264
|
+
...this.baseParams,
|
|
265
|
+
// P3: meshMessageDeliveries
|
|
266
|
+
meshMessageDeliveriesWeight: meshDeliveriesWeight,
|
|
267
|
+
meshMessageDeliveriesDecay: decay,
|
|
268
|
+
meshMessageDeliveriesThreshold: threshold,
|
|
269
|
+
meshMessageDeliveriesWindow: MESH_DELIVERIES_WINDOW_MS,
|
|
270
|
+
meshMessageDeliveriesActivation: activationMs,
|
|
271
|
+
meshMessageDeliveriesCap: Math.max(threshold * capFactor, 2),
|
|
272
|
+
// P3b: meshFailurePenalty (same weight and decay as P3)
|
|
273
|
+
meshFailurePenaltyWeight: meshDeliveriesWeight,
|
|
274
|
+
meshFailurePenaltyDecay: decay
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Creates topic score parameters for a specific topic type.
|
|
279
|
+
*
|
|
280
|
+
* @param topicType - The topic type
|
|
281
|
+
* @returns TopicScoreParams for the topic
|
|
282
|
+
*/ createForTopic(topicType) {
|
|
283
|
+
const expectedPerSlot = getExpectedMessagesPerSlot(topicType, this.params.targetCommitteeSize, this.blocksPerSlot);
|
|
284
|
+
// For unpredictable topics (tx) or topics with 0 expected messages, disable P3/P3b
|
|
285
|
+
if (expectedPerSlot === undefined || expectedPerSlot === 0) {
|
|
286
|
+
return this.createDisabledP3Params();
|
|
287
|
+
}
|
|
288
|
+
return this.createEnabledP3Params(expectedPerSlot);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Creates all topic score parameters for gossipsub configuration.
|
|
292
|
+
*
|
|
293
|
+
* @param protocolVersion - Protocol version string for topic naming
|
|
294
|
+
* @returns Record mapping topic strings to their score parameters
|
|
295
|
+
*/ createAll(protocolVersion) {
|
|
296
|
+
const topics = {};
|
|
297
|
+
for (const topicType of Object.values(TopicType)){
|
|
298
|
+
const topicString = createTopicString(topicType, protocolVersion);
|
|
299
|
+
topics[topicString] = this.createForTopic(topicType);
|
|
300
|
+
}
|
|
301
|
+
return topics;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Creates topic score parameters for a specific topic type.
|
|
306
|
+
* Convenience function that creates a factory internally.
|
|
307
|
+
*
|
|
308
|
+
* @param topicType - The topic type
|
|
309
|
+
* @param params - Network parameters for scoring calculation
|
|
310
|
+
* @returns TopicScoreParams for the topic
|
|
311
|
+
*/ export function createTopicScoreParamsForTopic(topicType, params) {
|
|
312
|
+
const factory = new TopicScoreParamsFactory(params);
|
|
313
|
+
return factory.createForTopic(topicType);
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Creates all topic score parameters for gossipsub configuration.
|
|
317
|
+
*
|
|
318
|
+
* @param protocolVersion - Protocol version string for topic naming
|
|
319
|
+
* @param params - Network parameters for scoring calculation
|
|
320
|
+
* @returns Record mapping topic strings to their score parameters
|
|
321
|
+
*/ export function createAllTopicScoreParams(protocolVersion, params) {
|
|
322
|
+
const factory = new TopicScoreParamsFactory(params);
|
|
323
|
+
return factory.createAll(protocolVersion);
|
|
324
|
+
}
|
package/dest/services/index.d.ts
CHANGED
|
@@ -3,5 +3,6 @@ export * from './libp2p/libp2p_service.js';
|
|
|
3
3
|
export * from './tx_provider.js';
|
|
4
4
|
export * from './dummy_service.js';
|
|
5
5
|
export * from './reqresp/index.js';
|
|
6
|
+
export * from './tx_file_store/index.js';
|
|
6
7
|
export * from './tx_collection/index.js';
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywwQkFBMEIsQ0FBQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC"}
|
package/dest/services/index.js
CHANGED
|
@@ -17,4 +17,4 @@ export declare class P2PInstrumentation {
|
|
|
17
17
|
recordMessageLatency(topicName: TopicType, timerOrMs: Timer | number): void;
|
|
18
18
|
private aggregate;
|
|
19
19
|
}
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvbGlicDJwL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQU1MLEtBQUssZUFBZSxFQUdyQixNQUFNLHlCQUF5QixDQUFDO0FBSWpDLHFCQUFhLGtCQUFrQjtJQUM3QixPQUFPLENBQUMseUJBQXlCLENBQVk7SUFDN0MsT0FBTyxDQUFDLHlCQUF5QixDQUFnQjtJQUNqRCxPQUFPLENBQUMsY0FBYyxDQUFZO0lBQ2xDLE9BQU8sQ0FBQyxlQUFlLENBQWdCO0lBRXZDLE9BQU8sQ0FBQyxlQUFlLENBQTZDO0lBQ3BFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBNkM7SUFFdkUsT0FBTyxDQUFDLGlCQUFpQixDQUFpRTtJQUMxRixPQUFPLENBQUMsb0JBQW9CLENBQWlFO0lBRTdGLFlBQVksTUFBTSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQTJDaEQ7SUFFTSx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEdBQUcsTUFBTSxRQVc3RTtJQUVNLG1CQUFtQixDQUFDLEtBQUssRUFBRSxNQUFNLFFBRXZDO0lBRU0sNkJBQTZCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxHQUFHLFNBQVMsUUFFckY7SUFFTSxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEdBQUcsTUFBTSxRQVcxRTtJQUVELE9BQU8sQ0FBQyxTQUFTLENBa0JmO0NBQ0gifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../../src/services/libp2p/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAML,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../../src/services/libp2p/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAML,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAIjC,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,yBAAyB,CAAY;IAC7C,OAAO,CAAC,yBAAyB,CAAgB;IACjD,OAAO,CAAC,cAAc,CAAY;IAClC,OAAO,CAAC,eAAe,CAAgB;IAEvC,OAAO,CAAC,eAAe,CAA6C;IACpE,OAAO,CAAC,kBAAkB,CAA6C;IAEvE,OAAO,CAAC,iBAAiB,CAAiE;IAC1F,OAAO,CAAC,oBAAoB,CAAiE;IAE7F,YAAY,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EA2ChD;IAEM,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,GAAG,MAAM,QAW7E;IAEM,mBAAmB,CAAC,KAAK,EAAE,MAAM,QAEvC;IAEM,6BAA6B,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,SAAS,QAErF;IAEM,oBAAoB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,GAAG,MAAM,QAW1E;IAED,OAAO,CAAC,SAAS,CAkBf;CACH"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TopicType } from '@aztec/stdlib/p2p';
|
|
2
|
-
import { Attributes, Metrics } from '@aztec/telemetry-client';
|
|
2
|
+
import { Attributes, Metrics, createUpDownCounterWithDefault } from '@aztec/telemetry-client';
|
|
3
3
|
import { createHistogram } from 'node:perf_hooks';
|
|
4
4
|
export class P2PInstrumentation {
|
|
5
5
|
messageValidationDuration;
|
|
@@ -13,9 +13,20 @@ export class P2PInstrumentation {
|
|
|
13
13
|
constructor(client, name){
|
|
14
14
|
const meter = client.getMeter(name);
|
|
15
15
|
this.messageValidationDuration = meter.createHistogram(Metrics.P2P_GOSSIP_MESSAGE_VALIDATION_DURATION);
|
|
16
|
-
this.messagePrevalidationCount = meter
|
|
16
|
+
this.messagePrevalidationCount = createUpDownCounterWithDefault(meter, Metrics.P2P_GOSSIP_MESSAGE_PREVALIDATION_COUNT, {
|
|
17
|
+
[Attributes.TOPIC_NAME]: [
|
|
18
|
+
TopicType.tx,
|
|
19
|
+
TopicType.block_proposal,
|
|
20
|
+
TopicType.checkpoint_proposal,
|
|
21
|
+
TopicType.checkpoint_attestation
|
|
22
|
+
],
|
|
23
|
+
[Attributes.OK]: [
|
|
24
|
+
true,
|
|
25
|
+
false
|
|
26
|
+
]
|
|
27
|
+
});
|
|
17
28
|
this.messageLatency = meter.createHistogram(Metrics.P2P_GOSSIP_MESSAGE_LATENCY);
|
|
18
|
-
this.txReceivedCount = meter
|
|
29
|
+
this.txReceivedCount = createUpDownCounterWithDefault(meter, Metrics.P2P_GOSSIP_TX_RECEIVED_COUNT);
|
|
19
30
|
this.aggLatencyMetrics = {
|
|
20
31
|
avg: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_AVG),
|
|
21
32
|
max: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_MAX),
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
+
import { type SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
4
|
import { type Logger } from '@aztec/foundation/log';
|
|
3
5
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
4
|
-
import type { EthAddress, L2BlockSource } from '@aztec/stdlib/block';
|
|
6
|
+
import type { EthAddress, L2Block, L2BlockSource } from '@aztec/stdlib/block';
|
|
5
7
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
6
8
|
import type { ClientProtocolCircuitVerifier, PeerInfo, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
7
|
-
import { BlockProposal, CheckpointAttestation, CheckpointProposal, type Gossipable, P2PClientType, TopicType } from '@aztec/stdlib/p2p';
|
|
8
|
-
import { Tx } from '@aztec/stdlib/tx';
|
|
9
|
+
import { BlockProposal, CheckpointAttestation, CheckpointProposal, type CheckpointProposalCore, type Gossipable, P2PClientType, type ValidationResult as P2PValidationResult, TopicType } from '@aztec/stdlib/p2p';
|
|
10
|
+
import { Tx, type TxValidator } from '@aztec/stdlib/tx';
|
|
9
11
|
import { type TelemetryClient, WithTracer } from '@aztec/telemetry-client';
|
|
10
12
|
import { type Message, type PeerId, TopicValidatorResult } from '@libp2p/interface';
|
|
11
13
|
import { ENR } from '@nethermindeth/enr';
|
|
@@ -13,16 +15,19 @@ import type { P2PConfig } from '../../config.js';
|
|
|
13
15
|
import type { MemPools } from '../../mem_pools/interface.js';
|
|
14
16
|
import { type PubSubLibp2p } from '../../util.js';
|
|
15
17
|
import type { PeerManagerInterface } from '../peer-manager/interface.js';
|
|
18
|
+
import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
|
|
16
19
|
import type { P2PReqRespConfig } from '../reqresp/config.js';
|
|
17
|
-
import { type ReqRespInterface, ReqRespSubProtocol, type ReqRespSubProtocolHandler, type ReqRespSubProtocolValidators, type SubProtocolMap } from '../reqresp/
|
|
18
|
-
import { AuthRequest, StatusMessage } from '../reqresp/
|
|
19
|
-
import type { P2PBlockReceivedCallback, P2PCheckpointReceivedCallback, P2PService, PeerDiscoveryService } from '../service.js';
|
|
20
|
-
type ReceivedMessageValidationResult<T> = {
|
|
20
|
+
import { type ReqRespInterface, type ReqRespResponse, ReqRespSubProtocol, type ReqRespSubProtocolHandler, type ReqRespSubProtocolValidators, type SubProtocolMap } from '../reqresp/index.js';
|
|
21
|
+
import { AuthRequest, BlockTxsRequest, BlockTxsResponse, StatusMessage } from '../reqresp/index.js';
|
|
22
|
+
import type { P2PBlockReceivedCallback, P2PCheckpointReceivedCallback, P2PDuplicateAttestationCallback, P2PService, PeerDiscoveryService } from '../service.js';
|
|
23
|
+
type ReceivedMessageValidationResult<T, M = undefined> = {
|
|
21
24
|
obj: T;
|
|
22
25
|
result: Exclude<TopicValidatorResult, TopicValidatorResult.Reject>;
|
|
26
|
+
metadata?: M;
|
|
23
27
|
} | {
|
|
24
|
-
obj?:
|
|
28
|
+
obj?: T;
|
|
25
29
|
result: TopicValidatorResult.Reject;
|
|
30
|
+
metadata?: M;
|
|
26
31
|
};
|
|
27
32
|
/**
|
|
28
33
|
* Lib P2P implementation of the P2PService interface.
|
|
@@ -33,9 +38,9 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
33
38
|
protected node: PubSubLibp2p;
|
|
34
39
|
private peerDiscoveryService;
|
|
35
40
|
private reqresp;
|
|
36
|
-
|
|
41
|
+
protected peerManager: PeerManagerInterface;
|
|
37
42
|
protected mempools: MemPools;
|
|
38
|
-
|
|
43
|
+
protected archiver: L2BlockSource & ContractDataSource;
|
|
39
44
|
private epochCache;
|
|
40
45
|
private proofVerifier;
|
|
41
46
|
private worldStateSynchronizer;
|
|
@@ -47,6 +52,10 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
47
52
|
private protocolVersion;
|
|
48
53
|
private topicStrings;
|
|
49
54
|
private feesCache;
|
|
55
|
+
/** Callback invoked when a duplicate proposal is detected (triggers slashing). */
|
|
56
|
+
private duplicateProposalCallback?;
|
|
57
|
+
/** Callback invoked when a duplicate attestation is detected (triggers slashing). */
|
|
58
|
+
private duplicateAttestationCallback?;
|
|
50
59
|
/**
|
|
51
60
|
* Callback for when a block is received from a peer.
|
|
52
61
|
* @param block - The block received from the peer.
|
|
@@ -103,6 +112,7 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
103
112
|
* @returns The responses to the requests
|
|
104
113
|
*/
|
|
105
114
|
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(protocol: SubProtocol, requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[], pinnedPeerId: PeerId | undefined): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]>;
|
|
115
|
+
sendRequestToPeer(peerId: PeerId, subProtocol: ReqRespSubProtocol, payload: Buffer, dialTimeout?: number): Promise<ReqRespResponse>;
|
|
106
116
|
/**
|
|
107
117
|
* Get the ENR of the node
|
|
108
118
|
* @returns The ENR of the node
|
|
@@ -110,6 +120,21 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
110
120
|
getEnr(): ENR | undefined;
|
|
111
121
|
registerBlockReceivedCallback(callback: P2PBlockReceivedCallback): void;
|
|
112
122
|
registerCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback): void;
|
|
123
|
+
/**
|
|
124
|
+
* Registers a callback to be invoked when a duplicate proposal is detected.
|
|
125
|
+
* This callback is triggered on the first duplicate (when count goes from 1 to 2).
|
|
126
|
+
*/
|
|
127
|
+
registerDuplicateProposalCallback(callback: (info: {
|
|
128
|
+
slot: SlotNumber;
|
|
129
|
+
proposer: EthAddress;
|
|
130
|
+
type: 'checkpoint' | 'block';
|
|
131
|
+
}) => void): void;
|
|
132
|
+
/**
|
|
133
|
+
* Registers a callback to be invoked when a duplicate attestation is detected.
|
|
134
|
+
* A validator signing attestations for different proposals at the same slot.
|
|
135
|
+
* This callback is triggered on the first duplicate (when count goes from 1 to 2).
|
|
136
|
+
*/
|
|
137
|
+
registerDuplicateAttestationCallback(callback: P2PDuplicateAttestationCallback): void;
|
|
113
138
|
/**
|
|
114
139
|
* Subscribes to a topic.
|
|
115
140
|
* @param topic - The topic to subscribe to.
|
|
@@ -139,25 +164,69 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
139
164
|
* @param data - The message data
|
|
140
165
|
*/
|
|
141
166
|
protected handleNewGossipMessage(msg: Message, msgId: string, source: PeerId): Promise<void>;
|
|
142
|
-
protected validateReceivedMessage<T>(validationFunc: () => Promise<ReceivedMessageValidationResult<T>>, msgId: string, source: PeerId, topicType: TopicType): Promise<ReceivedMessageValidationResult<T>>;
|
|
167
|
+
protected validateReceivedMessage<T, M = undefined>(validationFunc: () => Promise<ReceivedMessageValidationResult<T, M>>, msgId: string, source: PeerId, topicType: TopicType): Promise<ReceivedMessageValidationResult<T, M>>;
|
|
143
168
|
protected handleGossipedTx(payloadData: Buffer, msgId: string, source: PeerId): Promise<void>;
|
|
144
169
|
private processCheckpointAttestationFromPeer;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
170
|
+
/** Validates a checkpoint attestation and adds it to the pool. Penalizes the peer if validation fails. */
|
|
171
|
+
protected validateAndStoreCheckpointAttestation(peerId: PeerId, attestation: CheckpointAttestation): Promise<ReceivedMessageValidationResult<CheckpointAttestation>>;
|
|
172
|
+
protected processBlockFromPeer(payloadData: Buffer, msgId: string, source: PeerId): Promise<void>;
|
|
173
|
+
/** Validates a block proposal. Triggers a penalization to the peer that sent it if invalid. Adds to the mempool if valid. */
|
|
174
|
+
protected validateAndStoreBlockProposal(peerId: PeerId, block: BlockProposal): Promise<ReceivedMessageValidationResult<BlockProposal, {
|
|
175
|
+
isEquivocated: boolean;
|
|
176
|
+
}>>;
|
|
177
|
+
protected processValidBlockProposal(block: BlockProposal, sender: PeerId): Promise<void>;
|
|
178
|
+
/**
|
|
179
|
+
* Handle a gossiped checkpoint proposal.
|
|
180
|
+
* Validates and processes the checkpoint proposal, then triggers the callback for attestation.
|
|
181
|
+
*/
|
|
182
|
+
protected handleGossipedCheckpointProposal(payloadData: Buffer, msgId: string, source: PeerId): Promise<void>;
|
|
183
|
+
/**
|
|
184
|
+
* Validates a checkpoint proposal. Penalizes peer if validation fails. Adds the checkpoint and
|
|
185
|
+
* its last block (if present) to the mempool if valid. Triggers equivocation detection on both.
|
|
186
|
+
*/
|
|
187
|
+
protected validateAndStoreCheckpointProposal(peerId: PeerId, checkpoint: CheckpointProposal): Promise<ReceivedMessageValidationResult<CheckpointProposal, {
|
|
188
|
+
isEquivocated: boolean;
|
|
189
|
+
processBlock: boolean;
|
|
190
|
+
}>>;
|
|
191
|
+
/**
|
|
192
|
+
* Process a validated checkpoint proposal.
|
|
193
|
+
* Note: The proposal was already added to the pool by tryAddCheckpointProposal in handleGossipedCheckpointProposal.
|
|
194
|
+
*/
|
|
195
|
+
protected processValidCheckpointProposal(checkpoint: CheckpointProposalCore, sender: PeerId): Promise<void>;
|
|
149
196
|
/**
|
|
150
197
|
* Propagates provided message to peers.
|
|
151
198
|
* @param message - The message to propagate.
|
|
152
199
|
*/
|
|
153
200
|
propagate<T extends Gossipable>(message: T): Promise<void>;
|
|
154
|
-
|
|
201
|
+
/**
|
|
202
|
+
* Validate the requested block transactions. Allow partial returns.
|
|
203
|
+
* @param request - The block transactions request.
|
|
204
|
+
* @param response - The block transactions response.
|
|
205
|
+
* @param peerId - The ID of the peer that made the request.
|
|
206
|
+
* @returns True if the requested block transactions are valid, false otherwise.
|
|
207
|
+
*/
|
|
208
|
+
protected validateRequestedBlockTxs(request: BlockTxsRequest, response: BlockTxsResponse, peerId: PeerId): Promise<boolean>;
|
|
155
209
|
private validateRequestedTxs;
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
210
|
+
/**
|
|
211
|
+
* Validates a BLOCK response.
|
|
212
|
+
*
|
|
213
|
+
* If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
|
|
214
|
+
* Penalizes on block number mismatch or hash mismatch.
|
|
215
|
+
*
|
|
216
|
+
* @param requestedBlockNumber - The requested block number.
|
|
217
|
+
* @param responseBlock - The block returned by the peer.
|
|
218
|
+
* @param peerId - The peer that returned the block.
|
|
219
|
+
* @returns True if the response is valid, false otherwise.
|
|
220
|
+
*/
|
|
221
|
+
protected validateRequestedBlock(requestedBlockNumber: Fr, responseBlock: L2Block, peerId: PeerId): Promise<boolean>;
|
|
222
|
+
protected validateRequestedTx(tx: Tx, peerId: PeerId, txValidator: TxValidator, requested?: Set<`0x${string}`>): Promise<void>;
|
|
223
|
+
protected createRequestedTxValidator(): TxValidator;
|
|
224
|
+
protected validatePropagatedTx(tx: Tx, peerId: PeerId): Promise<boolean>;
|
|
160
225
|
private getGasFees;
|
|
226
|
+
/**
|
|
227
|
+
* Get the BatchTxRequesterLibP2PService dependencies for creating BatchTxRequester instances
|
|
228
|
+
*/
|
|
229
|
+
getBatchTxRequesterService(): BatchTxRequesterLibP2PService;
|
|
161
230
|
validate(txs: Tx[]): Promise<void>;
|
|
162
231
|
private createMessageValidators;
|
|
163
232
|
private runValidations;
|
|
@@ -168,25 +237,11 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
168
237
|
* @param attestation - The checkpoint attestation to validate.
|
|
169
238
|
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
170
239
|
*/
|
|
171
|
-
validateCheckpointAttestation(peerId: PeerId, attestation: CheckpointAttestation): Promise<
|
|
172
|
-
/**
|
|
173
|
-
* Validate a block proposal.
|
|
174
|
-
*
|
|
175
|
-
* @param block - The block proposal to validate.
|
|
176
|
-
* @returns True if the block proposal is valid, false otherwise.
|
|
177
|
-
*/
|
|
178
|
-
validateBlockProposal(peerId: PeerId, block: BlockProposal): Promise<boolean>;
|
|
179
|
-
/**
|
|
180
|
-
* Validate a checkpoint proposal.
|
|
181
|
-
*
|
|
182
|
-
* @param checkpoint - The checkpoint proposal to validate.
|
|
183
|
-
* @returns True if the checkpoint proposal is valid, false otherwise.
|
|
184
|
-
*/
|
|
185
|
-
validateCheckpointProposal(peerId: PeerId, checkpoint: CheckpointProposal): Promise<boolean>;
|
|
240
|
+
validateCheckpointAttestation(peerId: PeerId, attestation: CheckpointAttestation): Promise<P2PValidationResult>;
|
|
186
241
|
getPeerScore(peerId: PeerId): number;
|
|
187
242
|
handleAuthRequestFromPeer(authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
188
243
|
private sendToPeers;
|
|
189
244
|
private stopLibP2P;
|
|
190
245
|
}
|
|
191
246
|
export {};
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9saWJwMnAvbGlicDJwX3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQWUsS0FBSyxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUE2QyxNQUFNLHVCQUF1QixDQUFDO0FBRy9GLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RSxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpFLE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLFFBQVEsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZILE9BQU8sRUFDTCxhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQixLQUFLLHNCQUFzQixFQUMzQixLQUFLLFVBQVUsRUFDZixhQUFhLEVBRWIsS0FBSyxnQkFBZ0IsSUFBSSxtQkFBbUIsRUFFNUMsU0FBUyxFQUlWLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsT0FBTyxFQUFFLEVBQUUsRUFBd0MsS0FBSyxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc5RixPQUFPLEVBSUwsS0FBSyxlQUFlLEVBQ3BCLFVBQVUsRUFFWCxNQUFNLHlCQUF5QixDQUFDO0FBY2pDLE9BQU8sRUFBRSxLQUFLLE9BQU8sRUFBNEIsS0FBSyxNQUFNLEVBQUUsb0JBQW9CLEVBQUUs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
|