@aztec/p2p 0.0.1-commit.f2ce05ee → 0.0.1-commit.f5a9928
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 +130 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +22 -6
- package/dest/client/factory.d.ts +11 -10
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +64 -17
- package/dest/client/interface.d.ts +86 -40
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +67 -64
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +251 -251
- package/dest/config.d.ts +173 -94
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +158 -44
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +9 -16
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +10 -17
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +106 -55
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +302 -195
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- 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 +274 -115
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -1
- 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 +7 -5
- package/dest/mem_pools/index.d.ts +2 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +12 -5
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +38 -17
- package/dest/mem_pools/interface.d.ts +3 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +10 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +29 -20
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -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 +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +8 -4
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +15 -5
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +3 -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 +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +64 -0
- 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.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +6 -5
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +9 -8
- 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 +15 -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 +3 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +2 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +25 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +67 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +62 -16
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +6 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +81 -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 +147 -19
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +26 -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 +79 -43
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +27 -7
- 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 +94 -32
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +62 -9
- 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 +537 -246
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +12 -5
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +12 -5
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +36 -9
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +130 -48
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
- 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 +25 -21
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -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 +2 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +36 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
- package/dest/msg_validators/tx_validator/factory.d.ts +133 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +261 -61
- 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 +104 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
- package/dest/msg_validators/tx_validator/index.d.ts +5 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +4 -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 +20 -4
- 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/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- 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 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +5 -5
- package/dest/services/discv5/discV5_service.d.ts +13 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +119 -23
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +25 -19
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +28 -20
- package/dest/services/encoding.d.ts +24 -7
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +43 -26
- package/dest/services/gossipsub/topic_score_params.d.ts +23 -17
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +36 -24
- package/dest/services/libp2p/instrumentation.d.ts +6 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +21 -0
- package/dest/services/libp2p/libp2p_service.d.ts +71 -60
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +602 -407
- 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 +31 -3
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +127 -26
- package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +102 -13
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +5 -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 +95 -127
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +11 -11
- 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.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- package/dest/services/reqresp/config.d.ts +15 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +11 -0
- package/dest/services/reqresp/interface.d.ts +25 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +23 -19
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
- 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 +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +18 -7
- 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 +57 -24
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +21 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -13
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +85 -219
- package/dest/services/service.d.ts +63 -19
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +11 -14
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +26 -33
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -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 +127 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -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 +100 -0
- package/dest/services/tx_collection/index.d.ts +3 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -1
- package/dest/services/tx_collection/instrumentation.js +1 -2
- 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/tx_collection.d.ts +45 -51
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +296 -68
- package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +28 -31
- package/dest/services/tx_collection/tx_source.d.ts +13 -7
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +29 -7
- package/dest/services/tx_file_store/config.d.ts +1 -3
- package/dest/services/tx_file_store/config.d.ts.map +1 -1
- package/dest/services/tx_file_store/config.js +0 -4
- package/dest/services/tx_file_store/tx_file_store.d.ts +4 -5
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +13 -20
- package/dest/services/tx_provider.d.ts +6 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +12 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -3
- package/dest/test-helpers/mock-pubsub.d.ts +56 -6
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +128 -14
- package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +17 -19
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +49 -37
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +142 -50
- package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +112 -49
- package/dest/testbench/worker_client_manager.d.ts +12 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +57 -11
- package/dest/util.d.ts +13 -8
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +17 -17
- package/src/bootstrap/bootstrap.ts +17 -3
- package/src/client/factory.ts +129 -28
- package/src/client/interface.ts +88 -48
- package/src/client/p2p_client.ts +284 -317
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +280 -49
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +13 -19
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +373 -236
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +298 -119
- package/src/mem_pools/attestation_pool/index.ts +3 -3
- package/src/mem_pools/attestation_pool/mocks.ts +14 -8
- package/src/mem_pools/index.ts +1 -1
- package/src/mem_pools/instrumentation.ts +27 -17
- package/src/mem_pools/interface.ts +2 -2
- package/src/mem_pools/tx_pool_v2/README.md +85 -11
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +6 -4
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +21 -6
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +5 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +67 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +4 -6
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -10
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -10
- 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 +2 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +96 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +63 -16
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +215 -27
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +91 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +122 -33
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +602 -242
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +155 -49
- package/src/msg_validators/tx_validator/README.md +129 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +44 -1
- package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
- package/src/msg_validators/tx_validator/factory.ts +413 -80
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +195 -54
- package/src/msg_validators/tx_validator/index.ts +4 -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 +23 -18
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +126 -14
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +38 -46
- package/src/services/encoding.ts +42 -26
- package/src/services/gossipsub/README.md +59 -22
- package/src/services/gossipsub/topic_score_params.ts +58 -31
- package/src/services/libp2p/instrumentation.ts +22 -0
- package/src/services/libp2p/libp2p_service.ts +687 -466
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +140 -25
- package/src/services/peer-manager/peer_scoring.ts +102 -8
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +92 -138
- package/src/services/reqresp/batch-tx-requester/interface.ts +14 -10
- 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 +12 -25
- package/src/services/reqresp/config.ts +19 -2
- package/src/services/reqresp/interface.ts +45 -46
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +36 -32
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +64 -20
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +23 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -13
- package/src/services/reqresp/reqresp.ts +100 -263
- package/src/services/service.ts +80 -35
- package/src/services/tx_collection/config.ts +40 -49
- package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
- package/src/services/tx_collection/file_store_tx_source.ts +129 -0
- package/src/services/tx_collection/index.ts +2 -6
- package/src/services/tx_collection/instrumentation.ts +1 -1
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +362 -110
- package/src/services/tx_collection/tx_collection_sink.ts +32 -36
- package/src/services/tx_collection/tx_source.ts +29 -8
- package/src/services/tx_file_store/config.ts +0 -6
- package/src/services/tx_file_store/tx_file_store.ts +15 -25
- package/src/services/tx_provider.ts +15 -9
- package/src/test-helpers/make-test-p2p-clients.ts +7 -6
- package/src/test-helpers/mock-pubsub.ts +152 -14
- package/src/test-helpers/reqresp-nodes.ts +15 -28
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +171 -68
- package/src/testbench/p2p_client_testbench_worker.ts +121 -64
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +40 -19
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/msg_validators/clock_tolerance.d.ts +0 -21
- package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
- package/dest/msg_validators/clock_tolerance.js +0 -37
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -52
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -307
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -49
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -53
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -177
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -336
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/clock_tolerance.ts +0 -51
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -354
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -112
- package/src/services/tx_collection/slow_tx_collection.ts +0 -233
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
-
import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
|
|
3
|
-
import type { Gossipable, PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
2
|
+
import type { P2PConnectivity, PeerInfo } from '@aztec/stdlib/interfaces/server';
|
|
3
|
+
import type { Gossipable, PeerErrorSeverity, TopicType } from '@aztec/stdlib/p2p';
|
|
4
4
|
import { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
5
5
|
|
|
6
6
|
import type { PeerId } from '@libp2p/interface';
|
|
@@ -18,15 +18,17 @@ import type {
|
|
|
18
18
|
ReqRespSubProtocol,
|
|
19
19
|
ReqRespSubProtocolHandler,
|
|
20
20
|
ReqRespSubProtocolHandlers,
|
|
21
|
-
ReqRespSubProtocolValidators,
|
|
22
21
|
SubProtocolMap,
|
|
23
22
|
} from './reqresp/interface.js';
|
|
24
23
|
import type { GoodByeReason } from './reqresp/protocols/goodbye.js';
|
|
25
24
|
import { ReqRespStatus } from './reqresp/status.js';
|
|
26
25
|
import {
|
|
27
26
|
type P2PBlockReceivedCallback,
|
|
27
|
+
type P2PCheckpointAttestationCallback,
|
|
28
28
|
type P2PCheckpointReceivedCallback,
|
|
29
|
+
type P2PDuplicateAttestationCallback,
|
|
29
30
|
type P2PDuplicateProposalCallback,
|
|
31
|
+
type P2POversizedProposalCallback,
|
|
30
32
|
type P2PService,
|
|
31
33
|
type PeerDiscoveryService,
|
|
32
34
|
PeerDiscoveryState,
|
|
@@ -36,6 +38,8 @@ import {
|
|
|
36
38
|
* A dummy implementation of the P2P Service.
|
|
37
39
|
*/
|
|
38
40
|
export class DummyP2PService implements P2PService {
|
|
41
|
+
private allNodesCheckpointReceivedCallback?: P2PCheckpointReceivedCallback;
|
|
42
|
+
|
|
39
43
|
updateConfig(_config: Partial<P2PReqRespConfig>): void {}
|
|
40
44
|
|
|
41
45
|
/** Returns an empty array for peers. */
|
|
@@ -43,6 +47,15 @@ export class DummyP2PService implements P2PService {
|
|
|
43
47
|
return [];
|
|
44
48
|
}
|
|
45
49
|
|
|
50
|
+
/** Reports p2p as disabled, since this service does not run a p2p stack. */
|
|
51
|
+
getP2PConnectivity(): P2PConnectivity {
|
|
52
|
+
return { enabled: false, connectedPeers: 0 };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
getGossipMeshPeerCount(_topicType: TopicType): number {
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
46
59
|
/**
|
|
47
60
|
* Starts the dummy implementation.
|
|
48
61
|
* @returns A resolved promise.
|
|
@@ -81,13 +94,28 @@ export class DummyP2PService implements P2PService {
|
|
|
81
94
|
/**
|
|
82
95
|
* Register a callback into the validator client for when a checkpoint proposal is received
|
|
83
96
|
*/
|
|
84
|
-
public
|
|
97
|
+
public registerValidatorCheckpointReceivedCallback(_callback: P2PCheckpointReceivedCallback) {}
|
|
98
|
+
public registerAllNodesCheckpointReceivedCallback(callback: P2PCheckpointReceivedCallback) {
|
|
99
|
+
this.allNodesCheckpointReceivedCallback = callback;
|
|
100
|
+
}
|
|
85
101
|
|
|
86
102
|
/**
|
|
87
103
|
* Register a callback for when a duplicate proposal is detected
|
|
88
104
|
*/
|
|
89
105
|
public registerDuplicateProposalCallback(_callback: P2PDuplicateProposalCallback): void {}
|
|
90
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Register a callback for when an oversized proposal is stored
|
|
109
|
+
*/
|
|
110
|
+
public registerOversizedProposalCallback(_callback: P2POversizedProposalCallback): void {}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Register a callback for when a duplicate attestation is detected
|
|
114
|
+
*/
|
|
115
|
+
public registerDuplicateAttestationCallback(_callback: P2PDuplicateAttestationCallback): void {}
|
|
116
|
+
|
|
117
|
+
public registerCheckpointAttestationCallback(_callback: P2PCheckpointAttestationCallback): void {}
|
|
118
|
+
|
|
91
119
|
/**
|
|
92
120
|
* Sends a request to a peer.
|
|
93
121
|
* @param _protocol - The protocol to send the request on.
|
|
@@ -101,19 +129,6 @@ export class DummyP2PService implements P2PService {
|
|
|
101
129
|
return Promise.resolve(undefined);
|
|
102
130
|
}
|
|
103
131
|
|
|
104
|
-
/**
|
|
105
|
-
* Sends a batch request to a peer.
|
|
106
|
-
* @param _protocol - The protocol to send the request on.
|
|
107
|
-
* @param _requests - The requests to send.
|
|
108
|
-
* @returns The responses from the peer, otherwise undefined.
|
|
109
|
-
*/
|
|
110
|
-
public sendBatchRequest<Protocol extends ReqRespSubProtocol>(
|
|
111
|
-
_protocol: Protocol,
|
|
112
|
-
_requests: InstanceType<SubProtocolMap[Protocol]['request']>[],
|
|
113
|
-
): Promise<InstanceType<SubProtocolMap[Protocol]['response']>[]> {
|
|
114
|
-
return Promise.resolve([]);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
132
|
public sendRequestToPeer(
|
|
118
133
|
_peerId: PeerId,
|
|
119
134
|
_subProtocol: ReqRespSubProtocol,
|
|
@@ -131,19 +146,11 @@ export class DummyP2PService implements P2PService {
|
|
|
131
146
|
return undefined;
|
|
132
147
|
}
|
|
133
148
|
|
|
134
|
-
|
|
149
|
+
validateTxsReceivedInBlockProposal(_txs: Tx[]): Promise<void> {
|
|
135
150
|
return Promise.resolve();
|
|
136
151
|
}
|
|
137
152
|
|
|
138
|
-
|
|
139
|
-
return Promise.resolve(true);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
addReqRespSubProtocol(
|
|
143
|
-
_subProtocol: ReqRespSubProtocol,
|
|
144
|
-
_handler: ReqRespSubProtocolHandler,
|
|
145
|
-
_validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
146
|
-
): Promise<void> {
|
|
153
|
+
addReqRespSubProtocol(_subProtocol: ReqRespSubProtocol, _handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
147
154
|
return Promise.resolve();
|
|
148
155
|
}
|
|
149
156
|
|
|
@@ -172,6 +179,7 @@ export class DummyP2PService implements P2PService {
|
|
|
172
179
|
peerScoring: {
|
|
173
180
|
penalizePeer: (_peerId, _penalty) => {},
|
|
174
181
|
},
|
|
182
|
+
validateRequestedBlockTxsConsistency: () => Promise.resolve(true),
|
|
175
183
|
};
|
|
176
184
|
}
|
|
177
185
|
}
|
|
@@ -276,10 +284,8 @@ export class DummyPeerManager implements PeerManagerInterface {
|
|
|
276
284
|
|
|
277
285
|
export class DummyReqResp implements ReqRespInterface {
|
|
278
286
|
updateConfig(_config: Partial<P2PReqRespConfig>): void {}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
_subProtocolValidators: ReqRespSubProtocolValidators,
|
|
282
|
-
): Promise<void> {
|
|
287
|
+
setShouldRejectPeer(): void {}
|
|
288
|
+
start(_subProtocolHandlers: ReqRespSubProtocolHandlers): Promise<void> {
|
|
283
289
|
return Promise.resolve();
|
|
284
290
|
}
|
|
285
291
|
stop(): Promise<void> {
|
|
@@ -291,16 +297,6 @@ export class DummyReqResp implements ReqRespInterface {
|
|
|
291
297
|
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']> | undefined> {
|
|
292
298
|
return Promise.resolve(undefined);
|
|
293
299
|
}
|
|
294
|
-
sendBatchRequest<SubProtocol extends ReqRespSubProtocol>(
|
|
295
|
-
_subProtocol: SubProtocol,
|
|
296
|
-
_requests: InstanceType<SubProtocolMap[SubProtocol]['request']>[],
|
|
297
|
-
_pinnedPeer: PeerId | undefined,
|
|
298
|
-
_timeoutMs?: number,
|
|
299
|
-
_maxPeers?: number,
|
|
300
|
-
_maxRetryAttempts?: number,
|
|
301
|
-
): Promise<InstanceType<SubProtocolMap[SubProtocol]['response']>[]> {
|
|
302
|
-
return Promise.resolve([]);
|
|
303
|
-
}
|
|
304
300
|
public sendRequestToPeer(
|
|
305
301
|
_peerId: PeerId,
|
|
306
302
|
_subProtocol: ReqRespSubProtocol,
|
|
@@ -319,11 +315,7 @@ export class DummyReqResp implements ReqRespInterface {
|
|
|
319
315
|
};
|
|
320
316
|
}
|
|
321
317
|
|
|
322
|
-
addSubProtocol(
|
|
323
|
-
_subProtocol: ReqRespSubProtocol,
|
|
324
|
-
_handler: ReqRespSubProtocolHandler,
|
|
325
|
-
_validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
326
|
-
): Promise<void> {
|
|
318
|
+
addSubProtocol(_subProtocol: ReqRespSubProtocol, _handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
327
319
|
return Promise.resolve();
|
|
328
320
|
}
|
|
329
321
|
}
|
package/src/services/encoding.ts
CHANGED
|
@@ -1,34 +1,41 @@
|
|
|
1
1
|
// Taken from lodestar: https://github.com/ChainSafe/lodestar
|
|
2
|
-
import { sha256 } from '@aztec/foundation/crypto/sha256';
|
|
3
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
3
|
import { MAX_TX_SIZE_KB, TopicType, getTopicFromString } from '@aztec/stdlib/p2p';
|
|
5
4
|
|
|
6
|
-
import type { RPC } from '@chainsafe/libp2p-gossipsub/message';
|
|
7
5
|
import type { DataTransform } from '@chainsafe/libp2p-gossipsub/types';
|
|
8
6
|
import type { Message } from '@libp2p/interface';
|
|
7
|
+
import { webcrypto } from 'node:crypto';
|
|
9
8
|
import { compressSync, uncompressSync } from 'snappy';
|
|
10
|
-
import xxhashFactory from 'xxhash-wasm';
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
10
|
+
/**
|
|
11
|
+
* Fallback maximum response size (in KB) applied when no explicit per-request bound is supplied.
|
|
12
|
+
* Used both as the `SnappyTransform` default and as the reception-side fallback in `readMessage`.
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_MAX_RESPONSE_SIZE_KB = 10 * 1024;
|
|
17
15
|
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
/** Thrown when a Snappy-compressed response exceeds the allowed decompressed size. */
|
|
17
|
+
export class OversizedSnappyResponseError extends Error {
|
|
18
|
+
constructor(decompressedSize: number, maxSizeKb: number) {
|
|
19
|
+
super(`Decompressed size ${decompressedSize} exceeds maximum allowed size of ${maxSizeKb}kb`);
|
|
20
|
+
this.name = 'OversizedSnappyResponseError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
20
23
|
|
|
21
24
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
25
|
+
* Thrown when the compressed bytes accumulated while reading a response stream exceed the reception
|
|
26
|
+
* bound, before the full payload is buffered. Distinct from {@link OversizedSnappyResponseError},
|
|
27
|
+
* which guards the decompressed size after the stream has already been fully received.
|
|
24
28
|
*/
|
|
25
|
-
export
|
|
26
|
-
|
|
27
|
-
|
|
29
|
+
export class ResponseSizeLimitExceededError extends Error {
|
|
30
|
+
constructor(accumulatedBytes: number, limitBytes: number) {
|
|
31
|
+
super(`Accumulated response size ${accumulatedBytes} bytes exceeds reception limit of ${limitBytes} bytes`);
|
|
32
|
+
this.name = 'ResponseSizeLimitExceededError';
|
|
28
33
|
}
|
|
29
|
-
return '0000000000000000';
|
|
30
34
|
}
|
|
31
35
|
|
|
36
|
+
// Shared buffer to convert msgId to string
|
|
37
|
+
const sharedMsgIdBuf = Buffer.alloc(20);
|
|
38
|
+
|
|
32
39
|
export function msgIdToStrFn(msgId: Uint8Array): string {
|
|
33
40
|
// This happens serially, no need to reallocate the buffer
|
|
34
41
|
sharedMsgIdBuf.set(msgId);
|
|
@@ -41,14 +48,22 @@ export function msgIdToStrFn(msgId: Uint8Array): string {
|
|
|
41
48
|
* Follows similarly to:
|
|
42
49
|
* https://github.com/ethereum/consensus-specs/blob/v1.1.0-alpha.7/specs/altair/p2p-interface.md#topics-and-messages
|
|
43
50
|
*
|
|
51
|
+
* The topic length is framed into the hash input (`uint32be(topicLen) || topic || data`) so the
|
|
52
|
+
* `(topic, data)` boundary is unambiguous. A raw `topic || data` concatenation is not injective —
|
|
53
|
+
* shifting bytes across the boundary (e.g. `(topic + data[0], data[1:])`) yields the same bytes and
|
|
54
|
+
* thus the same id, letting an unsubscribed-topic message pre-occupy a real message's seenCache slot
|
|
55
|
+
* and suppress it as a duplicate.
|
|
56
|
+
*
|
|
44
57
|
* @param message - The libp2p message
|
|
45
58
|
* @returns The message identifier
|
|
46
59
|
*/
|
|
47
|
-
export function getMsgIdFn(
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
60
|
+
export async function getMsgIdFn({ topic, data }: Pick<Message, 'topic' | 'data'>): Promise<Uint8Array> {
|
|
61
|
+
const topicBytes = Buffer.from(topic);
|
|
62
|
+
const framedTopicLength = Buffer.allocUnsafe(4);
|
|
63
|
+
framedTopicLength.writeUInt32BE(topicBytes.length);
|
|
64
|
+
const buffer = Buffer.concat([framedTopicLength, topicBytes, data]);
|
|
65
|
+
const hash = await webcrypto.subtle.digest('SHA-256', buffer);
|
|
66
|
+
return Buffer.from(hash.slice(0, 20));
|
|
52
67
|
}
|
|
53
68
|
|
|
54
69
|
const DefaultMaxSizesKb: Record<TopicType, number> = {
|
|
@@ -58,7 +73,8 @@ const DefaultMaxSizesKb: Record<TopicType, number> = {
|
|
|
58
73
|
// Proposals may carry some tx objects, so we allow a larger size capped at 10mb
|
|
59
74
|
// Note this may not be enough for carrying all tx objects in a block
|
|
60
75
|
[TopicType.block_proposal]: 1024 * 10,
|
|
61
|
-
//
|
|
76
|
+
// Checkpoint proposals carry almost the same data as a block proposal (see the lastBlockProposal)
|
|
77
|
+
// Only diff is an additional header, which is pretty small compared to the 10mb limit
|
|
62
78
|
[TopicType.checkpoint_proposal]: 1024 * 10,
|
|
63
79
|
};
|
|
64
80
|
|
|
@@ -68,7 +84,7 @@ const DefaultMaxSizesKb: Record<TopicType, number> = {
|
|
|
68
84
|
export class SnappyTransform implements DataTransform {
|
|
69
85
|
constructor(
|
|
70
86
|
private maxSizesKb: Record<TopicType, number> = DefaultMaxSizesKb,
|
|
71
|
-
private defaultMaxSizeKb: number =
|
|
87
|
+
private defaultMaxSizeKb: number = DEFAULT_MAX_RESPONSE_SIZE_KB,
|
|
72
88
|
private logger = createLogger('p2p:snappy-transform'),
|
|
73
89
|
) {}
|
|
74
90
|
|
|
@@ -78,15 +94,15 @@ export class SnappyTransform implements DataTransform {
|
|
|
78
94
|
return this.inboundTransformData(Buffer.from(data), topic);
|
|
79
95
|
}
|
|
80
96
|
|
|
81
|
-
public inboundTransformData(data: Buffer, topic?: TopicType): Buffer {
|
|
97
|
+
public inboundTransformData(data: Buffer, topic?: TopicType, maxSizeKbOverride?: number): Buffer {
|
|
82
98
|
if (data.length === 0) {
|
|
83
99
|
return data;
|
|
84
100
|
}
|
|
85
|
-
const maxSizeKb = this.maxSizesKb[topic!] ?? this.defaultMaxSizeKb;
|
|
101
|
+
const maxSizeKb = maxSizeKbOverride ?? this.maxSizesKb[topic!] ?? this.defaultMaxSizeKb;
|
|
86
102
|
const { decompressedSize } = readSnappyPreamble(data);
|
|
87
103
|
if (decompressedSize > maxSizeKb * 1024) {
|
|
88
104
|
this.logger.warn(`Decompressed size ${decompressedSize} exceeds maximum allowed size of ${maxSizeKb}kb`);
|
|
89
|
-
throw new
|
|
105
|
+
throw new OversizedSnappyResponseError(decompressedSize, maxSizeKb);
|
|
90
106
|
}
|
|
91
107
|
|
|
92
108
|
return Buffer.from(uncompressSync(data, { asBuffer: true }));
|
|
@@ -40,7 +40,7 @@ We configure all parameters (P1-P4) with values calculated dynamically from netw
|
|
|
40
40
|
| P3b: meshFailurePenalty | -34 per topic | Sticky penalty after pruning |
|
|
41
41
|
| P4: invalidMessageDeliveries | -20 per message | Attack detection |
|
|
42
42
|
|
|
43
|
-
**Important:** P1 and P2 are only enabled on topics with P3 enabled
|
|
43
|
+
**Important:** P1 and P2 are only enabled on topics with P3 enabled. By default, P3 is enabled for checkpoint_proposal and checkpoint_attestation (2 topics). Block proposal scoring is controlled by `expectedBlockProposalsPerSlot` (current default: `0`, including when env var is unset, so disabled) - see [Block Proposals](#block-proposals-block_proposal) for details. The tx topic has all scoring disabled except P4, to prevent free positive score accumulation that would offset penalties from other topics.
|
|
44
44
|
|
|
45
45
|
## Exponential Decay
|
|
46
46
|
|
|
@@ -205,7 +205,7 @@ This ensures P3 max penalty (-34) exceeds P1 + P2 max (+33), causing mesh prunin
|
|
|
205
205
|
| Topic | Expected/Slot | Decay Window | Notes |
|
|
206
206
|
|-------|--------------|--------------|-------|
|
|
207
207
|
| `tx` | Unpredictable | N/A | P3/P3b disabled |
|
|
208
|
-
| `block_proposal` | N-1 | 3 slots | N = blocks per slot
|
|
208
|
+
| `block_proposal` | N-1 | 3 slots | N = blocks per slot |
|
|
209
209
|
| `checkpoint_proposal` | 1 | 5 slots | One per slot |
|
|
210
210
|
| `checkpoint_attestation` | C (~48) | 2 slots | C = committee size |
|
|
211
211
|
|
|
@@ -217,7 +217,21 @@ Transactions are submitted unpredictably by users, so we cannot set meaningful d
|
|
|
217
217
|
|
|
218
218
|
### Block Proposals (block_proposal)
|
|
219
219
|
|
|
220
|
-
|
|
220
|
+
Block proposal scoring is controlled by the `expectedBlockProposalsPerSlot` config (`SEQ_EXPECTED_BLOCK_PROPOSALS_PER_SLOT` env var):
|
|
221
|
+
|
|
222
|
+
| Config Value | Behavior |
|
|
223
|
+
|-------------|----------|
|
|
224
|
+
| `0` (current default) | Block proposal P3 scoring is **disabled** |
|
|
225
|
+
| Positive number | Uses the provided value as expected proposals per slot |
|
|
226
|
+
| `undefined` | Falls back to `blocksPerSlot - 1` (N-1 when the slot fits multiple blocks, 0 when it fits one) |
|
|
227
|
+
|
|
228
|
+
**Current behavior note:** In the current implementation, if `SEQ_EXPECTED_BLOCK_PROPOSALS_PER_SLOT` is not set, config mapping applies `0` by default (scoring disabled). The `undefined` fallback above is currently reachable only if the value is explicitly provided as `undefined` in code.
|
|
229
|
+
|
|
230
|
+
**Future intent:** Once throughput is stable, we may change env parsing/defaults so an unset env var resolves to `undefined` again (re-enabling automatic fallback to `blocksPerSlot - 1`).
|
|
231
|
+
|
|
232
|
+
**Why disabled by default?** Gossipsub expects N-1 block proposals per slot. When transaction throughput is low (as expected at launch), fewer blocks are actually built, causing peers to be incorrectly penalized for under-delivering block proposals. The default of 0 disables this scoring. Set to a positive value when throughput increases and block production is consistent.
|
|
233
|
+
|
|
234
|
+
When a slot fits multiple blocks, N-1 block proposals are gossiped per slot (the last block is bundled with the checkpoint). When the slot fits exactly one block, this is 0.
|
|
221
235
|
|
|
222
236
|
### Checkpoint Proposals (checkpoint_proposal)
|
|
223
237
|
|
|
@@ -240,7 +254,8 @@ The scoring parameters depend on:
|
|
|
240
254
|
| `slotDuration` | L1RollupConstants | 72s |
|
|
241
255
|
| `targetCommitteeSize` | L1RollupConstants | 48 |
|
|
242
256
|
| `heartbeatInterval` | P2PConfig.gossipsubInterval | 700ms |
|
|
243
|
-
| `blockDurationMs` | P2PConfig.blockDurationMs |
|
|
257
|
+
| `blockDurationMs` | P2PConfig.blockDurationMs | 3000ms |
|
|
258
|
+
| `expectedBlockProposalsPerSlot` | P2PConfig.expectedBlockProposalsPerSlot | 0 (disabled; current unset-env behavior) |
|
|
244
259
|
|
|
245
260
|
## Invalid Message Handling (P4)
|
|
246
261
|
|
|
@@ -320,9 +335,9 @@ Conversely, if topic scores are low, a peer slightly above the disconnect thresh
|
|
|
320
335
|
|
|
321
336
|
Topic scores provide **burst response** to attacks, while app score provides **stable baseline**:
|
|
322
337
|
|
|
323
|
-
- P1 (time in mesh): Max +8 per topic (+24
|
|
324
|
-
- P2 (first deliveries): Max +25 per topic (+75
|
|
325
|
-
- P3 (under-delivery): Max -34 per topic (-
|
|
338
|
+
- P1 (time in mesh): Max +8 per topic (+16 default, +24 with block proposal scoring enabled)
|
|
339
|
+
- P2 (first deliveries): Max +25 per topic (+50 default, +75 with block proposal scoring, but decays fast)
|
|
340
|
+
- P3 (under-delivery): Max -34 per topic (-68 default with 2 topics, -102 with block proposal scoring enabled)
|
|
326
341
|
- P4 (invalid messages): -20 per invalid message, can spike to -2000+ during attacks
|
|
327
342
|
|
|
328
343
|
Example attack scenario:
|
|
@@ -373,21 +388,21 @@ When a peer is pruned from the mesh:
|
|
|
373
388
|
3. **P3b captures the penalty**: The P3 deficit at prune time becomes P3b, which decays slowly
|
|
374
389
|
|
|
375
390
|
After pruning, the peer's score consists mainly of P3b:
|
|
376
|
-
- **Total P3b
|
|
391
|
+
- **Total P3b: -68** (default, 2 topics) or **-102** (with block proposal scoring enabled, 3 topics)
|
|
377
392
|
- **Recovery time**: P3b decays to ~1% over one decay window (2-5 slots = 2-6 minutes)
|
|
378
393
|
- **Grafting eligibility**: Peer can be grafted when score ≥ 0, but asymptotic decay means recovery is slow
|
|
379
394
|
|
|
380
395
|
### Why Non-Contributors Aren't Disconnected
|
|
381
396
|
|
|
382
|
-
With P3b capped at -
|
|
397
|
+
With P3b capped at -68 (default, 2 topics) or -102 (with block proposal scoring, 3 topics) after pruning:
|
|
383
398
|
|
|
384
399
|
| Threshold | Value | P3b Score | Triggered? |
|
|
385
400
|
|-----------|-------|-----------|------------|
|
|
386
|
-
| gossipThreshold | -500 | -
|
|
387
|
-
| publishThreshold | -1000 | -
|
|
388
|
-
| graylistThreshold | -2000 | -
|
|
401
|
+
| gossipThreshold | -500 | -68 (default) / -102 (block scoring on) | No |
|
|
402
|
+
| publishThreshold | -1000 | -68 (default) / -102 (block scoring on) | No |
|
|
403
|
+
| graylistThreshold | -2000 | -68 (default) / -102 (block scoring on) | No |
|
|
389
404
|
|
|
390
|
-
**A score of -
|
|
405
|
+
**A score of -68 or -102 is well above -500**, so non-contributing peers:
|
|
391
406
|
- Are pruned from mesh (good - stops them slowing propagation)
|
|
392
407
|
- Still receive gossip (can recover by reconnecting/restarting)
|
|
393
408
|
- Are NOT disconnected unless they also have application-level penalties
|
|
@@ -455,7 +470,22 @@ Application scores decay by 10% per minute (`decayFactor = 0.9`):
|
|
|
455
470
|
- Score -100 → -35 after 10 minutes
|
|
456
471
|
- Score -100 → -12 after 20 minutes
|
|
457
472
|
|
|
458
|
-
This allows honest peers to recover from temporary issues.
|
|
473
|
+
This allows honest peers to recover from temporary issues — but only up to the ban threshold. Once a peer
|
|
474
|
+
crosses into the **Banned** state, decay no longer applies until the ban expires (see Ban Duration below).
|
|
475
|
+
|
|
476
|
+
### Ban Duration
|
|
477
|
+
|
|
478
|
+
Once a peer's score drops below the ban threshold (`MIN_SCORE_BEFORE_BAN = -100`) the ban is held for a configurable
|
|
479
|
+
duration:
|
|
480
|
+
|
|
481
|
+
- The score the peer held when banned is recorded in memory alongside an expiry timestamp.
|
|
482
|
+
- While the ban is active, `getScore` returns the **ban score** regardless of decay, so the peer stays in the
|
|
483
|
+
`Banned` state for the full window and cannot decay its way out early.
|
|
484
|
+
- When the ban expires it is removed and the live (decayed) score takes over again, letting the peer recover.
|
|
485
|
+
|
|
486
|
+
The ban duration is controlled by `P2P_PEER_BAN_DURATION_SECONDS` (config field `peerBanDurationSeconds`), defaulting
|
|
487
|
+
to 24 hours. Bans are held in memory only (cleared on restart). This is independent of the gossipsub topic-score
|
|
488
|
+
decay (P4, P3b), which continues to decay as described above; only the application-level ban score is pinned.
|
|
459
489
|
|
|
460
490
|
## Score Calculation Examples
|
|
461
491
|
|
|
@@ -529,15 +559,22 @@ Initial state: Total score -3003
|
|
|
529
559
|
|
|
530
560
|
After 4 slots (~5 min):
|
|
531
561
|
P4 decays to 1%: -2000 → -20
|
|
532
|
-
App score
|
|
562
|
+
App score pinned at ban floor: -1000
|
|
533
563
|
Total: -1023 → Still banned, but no longer graylisted
|
|
534
564
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
Total:
|
|
565
|
+
For the rest of the ban window (default 24h):
|
|
566
|
+
Topic scores (P4, P3b) keep decaying toward 0
|
|
567
|
+
App score stays pinned at the ban floor: -1000 contribution
|
|
568
|
+
Total: ~-1000 → Remains banned (cannot publish)
|
|
569
|
+
|
|
570
|
+
After the ban expires:
|
|
571
|
+
The ban is lifted; the live app score (now decayed toward 0) takes over
|
|
572
|
+
Total: recovers, peer can participate again
|
|
539
573
|
```
|
|
540
574
|
|
|
575
|
+
Unlike topic scores, the application ban score does **not** decay-recover during the ban window — that is the
|
|
576
|
+
point of the ban duration (see above). A banned peer is held for the full `P2P_PEER_BAN_DURATION_SECONDS`.
|
|
577
|
+
|
|
541
578
|
## Network Outage Analysis
|
|
542
579
|
|
|
543
580
|
What happens when a peer experiences a network outage and stops delivering messages?
|
|
@@ -547,7 +584,7 @@ What happens when a peer experiences a network outage and stops delivering messa
|
|
|
547
584
|
While the peer is disconnected:
|
|
548
585
|
|
|
549
586
|
1. **P3 penalty accumulates**: The message delivery counter decays toward 0, causing increasing P3 penalty
|
|
550
|
-
2. **Max P3 penalty reached**: Once counter drops below threshold, penalty hits -34 per topic (-102
|
|
587
|
+
2. **Max P3 penalty reached**: Once counter drops below threshold, penalty hits -34 per topic (-68 default, -102 with block proposal scoring)
|
|
551
588
|
3. **Mesh pruning**: Topic score goes negative → peer is pruned from mesh
|
|
552
589
|
4. **P3b captures penalty**: The P3 deficit at prune time becomes P3b (sticky penalty)
|
|
553
590
|
|
|
@@ -569,13 +606,13 @@ Note: If the peer just joined the mesh, P3 penalties only start after
|
|
|
569
606
|
During a network outage, the peer:
|
|
570
607
|
- **Does NOT send invalid messages** → No P4 penalty
|
|
571
608
|
- **Does NOT violate protocols** → No application-level penalty
|
|
572
|
-
- **Only accumulates topic-level penalties** → Max -
|
|
609
|
+
- **Only accumulates topic-level penalties** → Max -68 (default) or -102 (with block proposal scoring)
|
|
573
610
|
|
|
574
611
|
This is the crucial difference from malicious behavior:
|
|
575
612
|
|
|
576
613
|
| Scenario | App Score | Topic Score | Total | Threshold Hit |
|
|
577
614
|
|----------|-----------|-------------|-------|---------------|
|
|
578
|
-
| Network outage | 0 | -
|
|
615
|
+
| Network outage | 0 | -68 (default) / -102 (block scoring on) | -68 / -102 | None |
|
|
579
616
|
| Validation failure | -50 | -20 | -520 | gossipThreshold |
|
|
580
617
|
| Malicious peer | -100 | -2000+ | -2100+ | graylistThreshold |
|
|
581
618
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { TopicType, createTopicString } from '@aztec/stdlib/p2p';
|
|
2
|
-
import { calculateMaxBlocksPerSlot } from '@aztec/stdlib/timetable';
|
|
3
2
|
|
|
4
3
|
import { createTopicScoreParams } from '@chainsafe/libp2p-gossipsub/score';
|
|
5
4
|
|
|
@@ -13,22 +12,15 @@ export type TopicScoringNetworkParams = {
|
|
|
13
12
|
heartbeatIntervalMs: number;
|
|
14
13
|
/** Target committee size (number of validators expected to attest per slot) */
|
|
15
14
|
targetCommitteeSize: number;
|
|
16
|
-
/**
|
|
17
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Max blocks per checkpoint, the network-wide config value. Used to derive expected per-slot message rates
|
|
17
|
+
* for scoring; it is a peer-rate threshold input, not a consensus deadline.
|
|
18
|
+
*/
|
|
19
|
+
maxBlocksPerCheckpoint: number;
|
|
20
|
+
/** Expected number of block proposals per slot for scoring override. 0 disables scoring, undefined falls back to blocksPerSlot - 1. */
|
|
21
|
+
expectedBlockProposalsPerSlot?: number;
|
|
18
22
|
};
|
|
19
23
|
|
|
20
|
-
/**
|
|
21
|
-
* Calculates the number of blocks per slot based on timing parameters.
|
|
22
|
-
* Uses the shared calculation from @aztec/stdlib/timetable.
|
|
23
|
-
*
|
|
24
|
-
* @param slotDurationMs - L2 slot duration in milliseconds
|
|
25
|
-
* @param blockDurationMs - Duration per block in milliseconds (undefined = single block mode)
|
|
26
|
-
* @returns Number of blocks per slot
|
|
27
|
-
*/
|
|
28
|
-
export function calculateBlocksPerSlot(slotDurationMs: number, blockDurationMs: number | undefined): number {
|
|
29
|
-
return calculateMaxBlocksPerSlot(slotDurationMs / 1000, blockDurationMs ? blockDurationMs / 1000 : undefined);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
24
|
/**
|
|
33
25
|
* Determines the decay window in slots based on expected message frequency.
|
|
34
26
|
* Low-frequency topics need longer decay windows to accumulate meaningful counter values.
|
|
@@ -89,18 +81,41 @@ export function computeThreshold(convergence: number, conservativeFactor: number
|
|
|
89
81
|
return convergence * conservativeFactor;
|
|
90
82
|
}
|
|
91
83
|
|
|
84
|
+
/**
|
|
85
|
+
* Determines the effective expected block proposals per slot for scoring.
|
|
86
|
+
* Returns undefined if scoring should be disabled, or a positive number if enabled.
|
|
87
|
+
*
|
|
88
|
+
* @param blocksPerSlot - Number of blocks per slot from timetable
|
|
89
|
+
* @param expectedBlockProposalsPerSlot - Config override. 0 disables scoring, undefined falls back to blocksPerSlot - 1.
|
|
90
|
+
* @returns Positive number of expected block proposals, or undefined if scoring is disabled
|
|
91
|
+
*/
|
|
92
|
+
export function getEffectiveBlockProposalsPerSlot(
|
|
93
|
+
blocksPerSlot: number,
|
|
94
|
+
expectedBlockProposalsPerSlot?: number,
|
|
95
|
+
): number | undefined {
|
|
96
|
+
if (expectedBlockProposalsPerSlot !== undefined) {
|
|
97
|
+
return expectedBlockProposalsPerSlot > 0 ? expectedBlockProposalsPerSlot : undefined;
|
|
98
|
+
}
|
|
99
|
+
// Fallback: In MBPS mode, N-1 block proposals per slot (last one bundled with checkpoint)
|
|
100
|
+
// In single block mode (blocksPerSlot=1), this is 0 → disabled
|
|
101
|
+
const fallback = Math.max(0, blocksPerSlot - 1);
|
|
102
|
+
return fallback > 0 ? fallback : undefined;
|
|
103
|
+
}
|
|
104
|
+
|
|
92
105
|
/**
|
|
93
106
|
* Gets the expected messages per slot for a given topic type.
|
|
94
107
|
*
|
|
95
108
|
* @param topicType - The topic type
|
|
96
109
|
* @param targetCommitteeSize - Target committee size
|
|
97
110
|
* @param blocksPerSlot - Number of blocks per slot
|
|
111
|
+
* @param expectedBlockProposalsPerSlot - Override for block proposals. 0 disables scoring, undefined falls back to blocksPerSlot - 1.
|
|
98
112
|
* @returns Expected messages per slot, or undefined if unpredictable
|
|
99
113
|
*/
|
|
100
114
|
export function getExpectedMessagesPerSlot(
|
|
101
115
|
topicType: TopicType,
|
|
102
116
|
targetCommitteeSize: number,
|
|
103
117
|
blocksPerSlot: number,
|
|
118
|
+
expectedBlockProposalsPerSlot?: number,
|
|
104
119
|
): number | undefined {
|
|
105
120
|
switch (topicType) {
|
|
106
121
|
case TopicType.tx:
|
|
@@ -108,9 +123,7 @@ export function getExpectedMessagesPerSlot(
|
|
|
108
123
|
return undefined;
|
|
109
124
|
|
|
110
125
|
case TopicType.block_proposal:
|
|
111
|
-
|
|
112
|
-
// In single block mode (blocksPerSlot=1), this is 0
|
|
113
|
-
return Math.max(0, blocksPerSlot - 1);
|
|
126
|
+
return getEffectiveBlockProposalsPerSlot(blocksPerSlot, expectedBlockProposalsPerSlot);
|
|
114
127
|
|
|
115
128
|
case TopicType.checkpoint_proposal:
|
|
116
129
|
// Exactly 1 checkpoint proposal per slot
|
|
@@ -190,10 +203,12 @@ const P2_DECAY_WINDOW_SLOTS = 2;
|
|
|
190
203
|
// |P3| > 8 + 25 = 33
|
|
191
204
|
//
|
|
192
205
|
// We set P3 max = -34 per topic (slightly more than P1+P2) to ensure pruning.
|
|
193
|
-
//
|
|
206
|
+
// The number of P3-enabled topics depends on config: by default 2 (checkpoint_proposal +
|
|
207
|
+
// checkpoint_attestation), or 3 if block proposal scoring is enabled via
|
|
208
|
+
// expectedBlockProposalsPerSlot. Total P3b after pruning = -68 (2 topics) or -102 (3 topics).
|
|
194
209
|
//
|
|
195
|
-
// With appSpecificWeight=10, ~20 HighTolerance errors (-40 app score) plus max P3b (-102)
|
|
196
|
-
// would cross gossipThreshold (-500). This keeps non-contributors from being disconnected
|
|
210
|
+
// With appSpecificWeight=10, ~20 HighTolerance errors (-40 app score) plus max P3b (-68 or -102)
|
|
211
|
+
// would not cross gossipThreshold (-500). This keeps non-contributors from being disconnected
|
|
197
212
|
// unless they also accrue app-level penalties.
|
|
198
213
|
//
|
|
199
214
|
// The weight formula ensures max penalty equals MAX_P3_PENALTY_PER_TOPIC:
|
|
@@ -203,12 +218,6 @@ const P2_DECAY_WINDOW_SLOTS = 2;
|
|
|
203
218
|
/** Maximum P3 penalty per topic (must exceed P1 + P2 to cause pruning) */
|
|
204
219
|
export const MAX_P3_PENALTY_PER_TOPIC = -(MAX_P1_SCORE + MAX_P2_SCORE + 1); // -34
|
|
205
220
|
|
|
206
|
-
/** Number of topics with P3 enabled in MBPS mode (block_proposal + checkpoint_proposal + checkpoint_attestation) */
|
|
207
|
-
export const NUM_P3_ENABLED_TOPICS = 3;
|
|
208
|
-
|
|
209
|
-
/** Total maximum P3b penalty across all topics after pruning in MBPS mode */
|
|
210
|
-
export const TOTAL_MAX_P3B_PENALTY = MAX_P3_PENALTY_PER_TOPIC * NUM_P3_ENABLED_TOPICS; // -102
|
|
211
|
-
|
|
212
221
|
/**
|
|
213
222
|
* Factory class for creating gossipsub topic scoring parameters.
|
|
214
223
|
* Computes shared values once and reuses them across all topics.
|
|
@@ -257,10 +266,11 @@ export class TopicScoreParamsFactory {
|
|
|
257
266
|
};
|
|
258
267
|
|
|
259
268
|
constructor(private readonly params: TopicScoringNetworkParams) {
|
|
260
|
-
const { slotDurationMs, heartbeatIntervalMs
|
|
269
|
+
const { slotDurationMs, heartbeatIntervalMs } = params;
|
|
261
270
|
|
|
262
|
-
// Compute values that are the same for all topics
|
|
263
|
-
|
|
271
|
+
// Compute values that are the same for all topics. The block count comes straight from the network-wide
|
|
272
|
+
// max-blocks-per-checkpoint config value.
|
|
273
|
+
this.blocksPerSlot = params.maxBlocksPerCheckpoint;
|
|
264
274
|
this.heartbeatsPerSlot = slotDurationMs / heartbeatIntervalMs;
|
|
265
275
|
this.invalidDecay = computeDecay(heartbeatIntervalMs, slotDurationMs, INVALID_DECAY_WINDOW_SLOTS);
|
|
266
276
|
|
|
@@ -384,6 +394,18 @@ export class TopicScoreParamsFactory {
|
|
|
384
394
|
});
|
|
385
395
|
}
|
|
386
396
|
|
|
397
|
+
/** Number of topics with P3 enabled, computed from config. Always 2 (checkpoint_proposal + checkpoint_attestation) plus optionally block_proposal. */
|
|
398
|
+
get numP3EnabledTopics(): number {
|
|
399
|
+
const blockProposalP3Enabled =
|
|
400
|
+
getEffectiveBlockProposalsPerSlot(this.blocksPerSlot, this.params.expectedBlockProposalsPerSlot) !== undefined;
|
|
401
|
+
return blockProposalP3Enabled ? 3 : 2;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/** Total maximum P3b penalty across all topics after pruning, computed from config */
|
|
405
|
+
get totalMaxP3bPenalty(): number {
|
|
406
|
+
return MAX_P3_PENALTY_PER_TOPIC * this.numP3EnabledTopics;
|
|
407
|
+
}
|
|
408
|
+
|
|
387
409
|
/**
|
|
388
410
|
* Creates topic score parameters for a specific topic type.
|
|
389
411
|
*
|
|
@@ -391,7 +413,12 @@ export class TopicScoreParamsFactory {
|
|
|
391
413
|
* @returns TopicScoreParams for the topic
|
|
392
414
|
*/
|
|
393
415
|
createForTopic(topicType: TopicType): ReturnType<typeof createTopicScoreParams> {
|
|
394
|
-
const expectedPerSlot = getExpectedMessagesPerSlot(
|
|
416
|
+
const expectedPerSlot = getExpectedMessagesPerSlot(
|
|
417
|
+
topicType,
|
|
418
|
+
this.params.targetCommitteeSize,
|
|
419
|
+
this.blocksPerSlot,
|
|
420
|
+
this.params.expectedBlockProposalsPerSlot,
|
|
421
|
+
);
|
|
395
422
|
|
|
396
423
|
// For unpredictable topics (tx) or topics with 0 expected messages, disable P3/P3b
|
|
397
424
|
if (expectedPerSlot === undefined || expectedPerSlot === 0) {
|