@aztec/p2p 0.0.1-commit.85d7d01 → 0.0.1-commit.8655d4a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +9 -1
- package/dest/client/factory.d.ts +5 -4
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +33 -15
- package/dest/client/interface.d.ts +14 -5
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +13 -9
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +93 -49
- package/dest/config.d.ts +153 -102
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +134 -35
- 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 +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +267 -197
- 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 +181 -65
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +6 -4
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +33 -15
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +8 -6
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +12 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +29 -11
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +46 -16
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +26 -43
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +97 -88
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +61 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -4
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +10 -4
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +21 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
- 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/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/factory.d.ts +27 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +47 -17
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +48 -7
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
- package/dest/msg_validators/tx_validator/index.d.ts +4 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +3 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/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 +69 -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 +2 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +35 -8
- package/dest/services/dummy_service.d.ts +11 -15
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +12 -16
- package/dest/services/encoding.d.ts +5 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +7 -1
- package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +21 -4
- package/dest/services/libp2p/instrumentation.d.ts +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -0
- package/dest/services/libp2p/libp2p_service.d.ts +36 -46
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +296 -244
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +40 -11
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +32 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +84 -71
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
- package/dest/services/reqresp/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 +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/interface.d.ts +16 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -20
- 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/block_txs_handler.d.ts +1 -1
- 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 +4 -2
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +41 -214
- package/dest/services/service.d.ts +9 -12
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +2 -23
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +2 -55
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/index.d.ts +2 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +0 -1
- 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 +0 -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 +36 -55
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +275 -119
- package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +2 -2
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +4 -14
- package/dest/services/tx_provider.d.ts +3 -1
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +3 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -2
- package/dest/test-helpers/mock-pubsub.d.ts +23 -9
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +44 -44
- package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +16 -18
- 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 +12 -14
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +42 -15
- 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 +85 -39
- 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 +12 -7
- 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 +15 -14
- package/src/bootstrap/bootstrap.ts +9 -1
- package/src/client/factory.ts +57 -8
- package/src/client/interface.ts +15 -11
- package/src/client/p2p_client.ts +106 -70
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +226 -36
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +22 -14
- package/src/mem_pools/tx_pool_v2/README.md +9 -1
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/interfaces.ts +12 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +72 -20
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +16 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +101 -94
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
- package/src/msg_validators/clock_tolerance.ts +79 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
- package/src/msg_validators/tx_validator/README.md +15 -3
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
- 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/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/factory.ts +61 -10
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +121 -39
- package/src/msg_validators/tx_validator/index.ts +3 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +38 -5
- package/src/services/dummy_service.ts +14 -39
- package/src/services/encoding.ts +9 -1
- package/src/services/gossipsub/topic_score_params.ts +36 -4
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +321 -276
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +46 -11
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/README.md +215 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +83 -77
- package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +2 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -2
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +1 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
- package/src/services/reqresp/reqresp.ts +45 -260
- package/src/services/service.ts +12 -28
- package/src/services/tx_collection/config.ts +3 -80
- package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +331 -176
- package/src/services/tx_collection/tx_collection_sink.ts +2 -2
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +5 -0
- package/src/test-helpers/make-test-p2p-clients.ts +4 -1
- package/src/test-helpers/mock-pubsub.ts +46 -60
- package/src/test-helpers/reqresp-nodes.ts +13 -23
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +53 -28
- package/src/testbench/p2p_client_testbench_worker.ts +89 -55
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +33 -18
- 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 -304
- 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/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 -54
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -327
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -211
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -345
- 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/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 -387
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
|
@@ -28,9 +28,16 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
28
28
|
signers = Array.from({ length: NUMBER_OF_SIGNERS_PER_TEST }, () => Secp256k1Signer.random());
|
|
29
29
|
});
|
|
30
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Build attestations from each signer over the *same* signed payload (same header,
|
|
33
|
+
* archive, feeAssetPriceModifier). Required by the new pool, which deduplicates by
|
|
34
|
+
* payload hash and treats attestations from different signers as distinct entries
|
|
35
|
+
* only when the payload itself matches.
|
|
36
|
+
*/
|
|
31
37
|
const createCheckpointAttestationsForSlot = (slotNumber: number, archive?: Fr) => {
|
|
32
38
|
const archiveToUse = archive ?? Fr.random();
|
|
33
|
-
|
|
39
|
+
const sharedHeader = CheckpointHeader.random({ slotNumber: SlotNumber(slotNumber) });
|
|
40
|
+
return signers.map(signer => mockCheckpointAttestation(signer, slotNumber, archiveToUse, sharedHeader));
|
|
34
41
|
};
|
|
35
42
|
|
|
36
43
|
const mockBlockProposalForPool = (
|
|
@@ -59,13 +66,17 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
59
66
|
it('should add attestations to pool', async () => {
|
|
60
67
|
const slotNumber = 420;
|
|
61
68
|
const archive = Fr.random();
|
|
62
|
-
const
|
|
69
|
+
const sharedHeader = CheckpointHeader.random({ slotNumber: SlotNumber(slotNumber) });
|
|
70
|
+
const attestations = signers
|
|
71
|
+
.slice(0, -1)
|
|
72
|
+
.map(signer => mockCheckpointAttestation(signer, slotNumber, archive, sharedHeader));
|
|
73
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
63
74
|
|
|
64
75
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
65
76
|
|
|
66
77
|
const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
67
78
|
SlotNumber(slotNumber),
|
|
68
|
-
|
|
79
|
+
payloadHash,
|
|
69
80
|
);
|
|
70
81
|
expect(retrievedAttestations.length).toBe(attestations.length);
|
|
71
82
|
compareCheckpointAttestations(retrievedAttestations, attestations);
|
|
@@ -75,11 +86,16 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
75
86
|
compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
|
|
76
87
|
|
|
77
88
|
// Add another one
|
|
78
|
-
const newAttestation = mockCheckpointAttestation(
|
|
89
|
+
const newAttestation = mockCheckpointAttestation(
|
|
90
|
+
signers[NUMBER_OF_SIGNERS_PER_TEST - 1],
|
|
91
|
+
slotNumber,
|
|
92
|
+
archive,
|
|
93
|
+
sharedHeader,
|
|
94
|
+
);
|
|
79
95
|
await ap.addOwnCheckpointAttestations([newAttestation]);
|
|
80
96
|
const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
81
97
|
SlotNumber(slotNumber),
|
|
82
|
-
|
|
98
|
+
payloadHash,
|
|
83
99
|
);
|
|
84
100
|
expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
|
|
85
101
|
compareCheckpointAttestations(retrievedAttestationsAfterAdd, [...attestations, newAttestation]);
|
|
@@ -92,7 +108,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
92
108
|
|
|
93
109
|
const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
94
110
|
SlotNumber(slotNumber),
|
|
95
|
-
|
|
111
|
+
payloadHash,
|
|
96
112
|
);
|
|
97
113
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
98
114
|
});
|
|
@@ -108,13 +124,14 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
108
124
|
for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
|
|
109
125
|
attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
|
|
110
126
|
}
|
|
127
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
111
128
|
|
|
112
129
|
// Add them to store and check we end up with only one
|
|
113
130
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
114
131
|
|
|
115
132
|
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
116
133
|
SlotNumber(slotNumber),
|
|
117
|
-
|
|
134
|
+
payloadHash,
|
|
118
135
|
);
|
|
119
136
|
expect(retreivedAttestations.length).toBe(1);
|
|
120
137
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
|
|
@@ -122,9 +139,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
122
139
|
|
|
123
140
|
// Try adding them on another operation and check they are still not duplicated
|
|
124
141
|
await ap.addOwnCheckpointAttestations([attestations[0]]);
|
|
125
|
-
expect(
|
|
126
|
-
await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString()),
|
|
127
|
-
).toHaveLength(1);
|
|
142
|
+
expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash)).toHaveLength(1);
|
|
128
143
|
});
|
|
129
144
|
|
|
130
145
|
it('should store attestations by differing slot', async () => {
|
|
@@ -135,9 +150,9 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
135
150
|
|
|
136
151
|
for (const attestation of attestations) {
|
|
137
152
|
const slot = attestation.payload.header.slotNumber;
|
|
138
|
-
const
|
|
153
|
+
const payloadHash = attestation.getPayloadHash();
|
|
139
154
|
|
|
140
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
155
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
141
156
|
expect(retreivedAttestations.length).toBe(1);
|
|
142
157
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
143
158
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -153,9 +168,9 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
153
168
|
|
|
154
169
|
for (const attestation of attestations) {
|
|
155
170
|
const slot = attestation.payload.header.slotNumber;
|
|
156
|
-
const
|
|
171
|
+
const payloadHash = attestation.getPayloadHash();
|
|
157
172
|
|
|
158
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
173
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
159
174
|
expect(retreivedAttestations.length).toBe(1);
|
|
160
175
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
161
176
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -164,21 +179,25 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
164
179
|
|
|
165
180
|
it('should delete attestations older than a given slot', async () => {
|
|
166
181
|
const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420];
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
)
|
|
170
|
-
const
|
|
182
|
+
const attestationsPerSlot = await Promise.all(
|
|
183
|
+
slotNumbers.map(slotNumber => createCheckpointAttestationsForSlot(slotNumber)),
|
|
184
|
+
);
|
|
185
|
+
const attestations = attestationsPerSlot.flat();
|
|
186
|
+
const payloadHashForSlot1 = attestationsPerSlot[0][0].getPayloadHash();
|
|
171
187
|
|
|
172
188
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
173
189
|
|
|
174
|
-
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
190
|
+
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
191
|
+
SlotNumber(1),
|
|
192
|
+
payloadHashForSlot1,
|
|
193
|
+
);
|
|
175
194
|
expect(attestationsForSlot1.length).toBe(signers.length);
|
|
176
195
|
|
|
177
196
|
await ap.deleteOlderThan(SlotNumber(73));
|
|
178
197
|
|
|
179
198
|
const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
180
199
|
SlotNumber(1),
|
|
181
|
-
|
|
200
|
+
payloadHashForSlot1,
|
|
182
201
|
);
|
|
183
202
|
expect(attestationsForSlot1AfterDelete.length).toBe(0);
|
|
184
203
|
});
|
|
@@ -189,7 +208,6 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
189
208
|
const slotNumber = 420;
|
|
190
209
|
const archive = Fr.random();
|
|
191
210
|
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
192
|
-
const proposalId = proposal.archive.toString();
|
|
193
211
|
|
|
194
212
|
const result = await ap.tryAddBlockProposal(proposal);
|
|
195
213
|
|
|
@@ -197,7 +215,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
197
215
|
expect(result.alreadyExists).toBe(false);
|
|
198
216
|
expect(result.count).toBe(1);
|
|
199
217
|
|
|
200
|
-
const retrievedProposal = await ap.
|
|
218
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
201
219
|
|
|
202
220
|
expect(retrievedProposal).toBeDefined();
|
|
203
221
|
expect(retrievedProposal!).toEqual(proposal);
|
|
@@ -205,33 +223,68 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
205
223
|
|
|
206
224
|
it('should return undefined for non-existent block proposal', async () => {
|
|
207
225
|
const nonExistentId = Fr.random().toString();
|
|
208
|
-
const retrievedProposal = await ap.
|
|
226
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(nonExistentId);
|
|
209
227
|
expect(retrievedProposal).toBeUndefined();
|
|
210
228
|
});
|
|
211
229
|
|
|
212
|
-
it('should return alreadyExists when adding
|
|
230
|
+
it('should return alreadyExists when re-adding the same signed payload', async () => {
|
|
213
231
|
const slotNumber = 420;
|
|
214
232
|
const archive = Fr.random();
|
|
215
|
-
const
|
|
216
|
-
const proposalId = proposal1.archive.toString();
|
|
233
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
217
234
|
|
|
218
|
-
const result1 = await ap.tryAddBlockProposal(
|
|
235
|
+
const result1 = await ap.tryAddBlockProposal(proposal);
|
|
219
236
|
expect(result1.added).toBe(true);
|
|
220
237
|
expect(result1.alreadyExists).toBe(false);
|
|
221
238
|
|
|
222
|
-
//
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
239
|
+
// Re-broadcasting the exact same proposal yields alreadyExists.
|
|
240
|
+
const result2 = await ap.tryAddBlockProposal(proposal);
|
|
226
241
|
expect(result2.added).toBe(false);
|
|
227
242
|
expect(result2.alreadyExists).toBe(true);
|
|
228
243
|
|
|
229
|
-
|
|
230
|
-
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
244
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
231
245
|
expect(retrievedProposal).toBeDefined();
|
|
232
|
-
expect(retrievedProposal!.toBuffer()).toEqual(
|
|
246
|
+
expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
|
|
233
247
|
expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
234
248
|
});
|
|
249
|
+
|
|
250
|
+
it('should retain an exact duplicate block proposal only once', async () => {
|
|
251
|
+
const slotNumber = 420;
|
|
252
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber);
|
|
253
|
+
|
|
254
|
+
await ap.tryAddBlockProposal(proposal);
|
|
255
|
+
await ap.tryAddBlockProposal(proposal);
|
|
256
|
+
|
|
257
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
258
|
+
expect(proposals.blockProposals.map(proposal => proposal.toBuffer())).toEqual([
|
|
259
|
+
proposal.withoutSignedTxs().toBuffer(),
|
|
260
|
+
]);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it('should retain all accepted block proposals at a position', async () => {
|
|
264
|
+
const slotNumber = 420;
|
|
265
|
+
const blockHeader = makeBlockHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
266
|
+
const proposal1 = await makeBlockProposal({
|
|
267
|
+
signer: signers[0],
|
|
268
|
+
blockHeader,
|
|
269
|
+
archiveRoot: Fr.random(),
|
|
270
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1),
|
|
271
|
+
});
|
|
272
|
+
const proposal2 = await makeBlockProposal({
|
|
273
|
+
signer: signers[0],
|
|
274
|
+
blockHeader,
|
|
275
|
+
archiveRoot: Fr.random(),
|
|
276
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1),
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
await ap.tryAddBlockProposal(proposal1);
|
|
280
|
+
await ap.tryAddBlockProposal(proposal2);
|
|
281
|
+
|
|
282
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
283
|
+
expect(proposals.blockProposals.map(proposal => proposal.toBuffer())).toEqual(
|
|
284
|
+
expect.arrayContaining([proposal1.withoutSignedTxs().toBuffer(), proposal2.withoutSignedTxs().toBuffer()]),
|
|
285
|
+
);
|
|
286
|
+
expect(await ap.getBlockProposalByArchive(proposal2.archive.toString())).toBeDefined();
|
|
287
|
+
});
|
|
235
288
|
});
|
|
236
289
|
|
|
237
290
|
describe('CheckpointProposal in attestation pool', () => {
|
|
@@ -239,12 +292,13 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
239
292
|
signer: Secp256k1Signer,
|
|
240
293
|
slotNumber: number,
|
|
241
294
|
archive: Fr = Fr.random(),
|
|
295
|
+
checkpointHeader?: CheckpointHeader,
|
|
242
296
|
): Promise<CheckpointProposalCore> => {
|
|
243
|
-
const
|
|
297
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
244
298
|
const blockHeader = makeBlockHeader(1);
|
|
245
299
|
const proposal = await makeCheckpointProposal({
|
|
246
300
|
signer,
|
|
247
|
-
checkpointHeader,
|
|
301
|
+
checkpointHeader: headerToUse,
|
|
248
302
|
archiveRoot: archive,
|
|
249
303
|
lastBlock: { blockHeader },
|
|
250
304
|
});
|
|
@@ -256,7 +310,6 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
256
310
|
const slotNumber = 420;
|
|
257
311
|
const archive = Fr.random();
|
|
258
312
|
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
259
|
-
const proposalId = proposal.archive.toString();
|
|
260
313
|
|
|
261
314
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
262
315
|
|
|
@@ -264,7 +317,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
264
317
|
expect(result.alreadyExists).toBe(false);
|
|
265
318
|
expect(result.count).toBe(1);
|
|
266
319
|
|
|
267
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
320
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
268
321
|
|
|
269
322
|
expect(retrievedProposal).toBeDefined();
|
|
270
323
|
expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
|
|
@@ -281,54 +334,136 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
281
334
|
archiveRoot: archive,
|
|
282
335
|
// No lastBlock
|
|
283
336
|
});
|
|
284
|
-
const proposalId = proposal.archive.toString();
|
|
285
337
|
|
|
286
338
|
// Add the checkpoint core - block extraction is now caller responsibility
|
|
287
339
|
await ap.tryAddCheckpointProposal(proposal.toCore());
|
|
288
340
|
|
|
289
341
|
// The checkpoint proposal should be stored
|
|
290
|
-
const retrievedCheckpointProposal = await ap.getCheckpointProposal(
|
|
342
|
+
const retrievedCheckpointProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
291
343
|
expect(retrievedCheckpointProposal).toBeDefined();
|
|
292
344
|
|
|
293
345
|
// No block proposal was extracted (it had none anyway)
|
|
294
|
-
const retrievedBlockProposal = await ap.
|
|
346
|
+
const retrievedBlockProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
295
347
|
expect(retrievedBlockProposal).toBeUndefined();
|
|
296
348
|
});
|
|
297
349
|
|
|
298
350
|
it('should return undefined for non-existent checkpoint proposal', async () => {
|
|
299
|
-
const
|
|
300
|
-
const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
|
|
351
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(99999));
|
|
301
352
|
expect(retrievedProposal).toBeUndefined();
|
|
302
353
|
});
|
|
303
354
|
|
|
304
|
-
it('should return alreadyExists when adding
|
|
355
|
+
it('should return alreadyExists when re-adding the same signed payload', async () => {
|
|
305
356
|
const slotNumber = 420;
|
|
306
357
|
const archive = Fr.random();
|
|
307
|
-
const
|
|
308
|
-
const proposalId = proposal1.archive.toString();
|
|
358
|
+
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
309
359
|
|
|
310
|
-
const result1 = await ap.tryAddCheckpointProposal(
|
|
360
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal);
|
|
311
361
|
expect(result1.added).toBe(true);
|
|
312
362
|
expect(result1.alreadyExists).toBe(false);
|
|
313
363
|
|
|
314
|
-
//
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
364
|
+
// Re-broadcasting the exact same signed payload yields alreadyExists.
|
|
365
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal);
|
|
318
366
|
expect(result2.added).toBe(false);
|
|
319
367
|
expect(result2.alreadyExists).toBe(true);
|
|
320
368
|
|
|
321
|
-
// Should still have the first proposal
|
|
322
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
369
|
+
// Should still have the first proposal stored at the slot
|
|
370
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
323
371
|
expect(retrievedProposal).toBeDefined();
|
|
324
|
-
expect(retrievedProposal!.toBuffer()).toEqual(
|
|
372
|
+
expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
|
|
325
373
|
expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
326
374
|
});
|
|
327
375
|
|
|
376
|
+
it('should treat distinct payloads at the same slot as equivocations (count = 2)', async () => {
|
|
377
|
+
const slotNumber = 420;
|
|
378
|
+
// Two proposals at the same slot but with different headers (distinct payloads).
|
|
379
|
+
const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
380
|
+
const proposal2 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
381
|
+
|
|
382
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
383
|
+
expect(result1.added).toBe(true);
|
|
384
|
+
expect(result1.count).toBe(1);
|
|
385
|
+
|
|
386
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
387
|
+
// The second distinct payload is tracked as an equivocation, count goes to 2,
|
|
388
|
+
// and both accepted payloads are retained by payload hash.
|
|
389
|
+
expect(result2.added).toBe(true);
|
|
390
|
+
expect(result2.alreadyExists).toBe(false);
|
|
391
|
+
expect(result2.count).toBe(2);
|
|
392
|
+
|
|
393
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
394
|
+
const expectedProposal = [proposal1, proposal2].sort((a, b) =>
|
|
395
|
+
a.getPayloadHash().localeCompare(b.getPayloadHash()),
|
|
396
|
+
)[0];
|
|
397
|
+
expect(retrievedProposal!.toBuffer()).toEqual(expectedProposal.toBuffer());
|
|
398
|
+
|
|
399
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
400
|
+
expect(proposals.checkpointProposals.map(proposal => proposal.toBuffer())).toEqual(
|
|
401
|
+
expect.arrayContaining([proposal1.toBuffer(), proposal2.toBuffer()]),
|
|
402
|
+
);
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
it('should detect equivocation when only feeAssetPriceModifier differs', async () => {
|
|
406
|
+
const slotNumber = 420;
|
|
407
|
+
const archive = Fr.random();
|
|
408
|
+
// Same checkpoint header + archive, but two different feeAssetPriceModifier values.
|
|
409
|
+
// This is the audit-finding scenario: archive collides but the signed payload differs.
|
|
410
|
+
const sharedHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
411
|
+
const proposalA = await makeCheckpointProposal({
|
|
412
|
+
signer: signers[0],
|
|
413
|
+
checkpointHeader: sharedHeader,
|
|
414
|
+
archiveRoot: archive,
|
|
415
|
+
feeAssetPriceModifier: 50n,
|
|
416
|
+
});
|
|
417
|
+
const proposalB = await makeCheckpointProposal({
|
|
418
|
+
signer: signers[0],
|
|
419
|
+
checkpointHeader: sharedHeader,
|
|
420
|
+
archiveRoot: archive,
|
|
421
|
+
feeAssetPriceModifier: -50n,
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
const result1 = await ap.tryAddCheckpointProposal(proposalA.toCore());
|
|
425
|
+
expect(result1.count).toBe(1);
|
|
426
|
+
|
|
427
|
+
const result2 = await ap.tryAddCheckpointProposal(proposalB.toCore());
|
|
428
|
+
// The fix: archive collision no longer hides the equivocation; payload-hash dedup
|
|
429
|
+
// sees the distinct feeMod and bumps `count` to 2 so libp2p can fire the slash callback.
|
|
430
|
+
expect(result2.added).toBe(true);
|
|
431
|
+
expect(result2.alreadyExists).toBe(false);
|
|
432
|
+
expect(result2.count).toBe(2);
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
it('should delete retained proposals older than a given slot', async () => {
|
|
436
|
+
const oldSlot = 100;
|
|
437
|
+
const newSlot = 200;
|
|
438
|
+
const oldBlock = await mockBlockProposalForPool(signers[0], oldSlot);
|
|
439
|
+
const newBlock = await mockBlockProposalForPool(signers[1], newSlot);
|
|
440
|
+
const oldCheckpoint = await mockCheckpointProposalForPool(signers[0], oldSlot);
|
|
441
|
+
const newCheckpoint = await mockCheckpointProposalForPool(signers[1], newSlot);
|
|
442
|
+
|
|
443
|
+
await ap.tryAddBlockProposal(oldBlock);
|
|
444
|
+
await ap.tryAddBlockProposal(newBlock);
|
|
445
|
+
await ap.tryAddCheckpointProposal(oldCheckpoint);
|
|
446
|
+
await ap.tryAddCheckpointProposal(newCheckpoint);
|
|
447
|
+
|
|
448
|
+
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
449
|
+
|
|
450
|
+
expect(await ap.getProposalsForSlot(SlotNumber(oldSlot))).toEqual({
|
|
451
|
+
blockProposals: [],
|
|
452
|
+
checkpointProposals: [],
|
|
453
|
+
});
|
|
454
|
+
const newProposals = await ap.getProposalsForSlot(SlotNumber(newSlot));
|
|
455
|
+
expect(newProposals.blockProposals.map(proposal => proposal.toBuffer())).toContainEqual(
|
|
456
|
+
newBlock.withoutSignedTxs().toBuffer(),
|
|
457
|
+
);
|
|
458
|
+
expect(newProposals.checkpointProposals.map(proposal => proposal.toBuffer())).toContainEqual(
|
|
459
|
+
newCheckpoint.toBuffer(),
|
|
460
|
+
);
|
|
461
|
+
});
|
|
462
|
+
|
|
328
463
|
it('should return added=false when exceeding capacity', async () => {
|
|
329
464
|
const slotNumber = 420;
|
|
330
465
|
|
|
331
|
-
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT proposals
|
|
466
|
+
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT distinct proposals.
|
|
332
467
|
for (let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++) {
|
|
333
468
|
const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
|
|
334
469
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
@@ -336,7 +471,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
336
471
|
expect(result.count).toBe(i + 1);
|
|
337
472
|
}
|
|
338
473
|
|
|
339
|
-
// The next proposal should not be added
|
|
474
|
+
// The next proposal should not be added.
|
|
340
475
|
const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
|
|
341
476
|
const result = await ap.tryAddCheckpointProposal(extraProposal);
|
|
342
477
|
expect(result.added).toBe(false);
|
|
@@ -446,12 +581,12 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
446
581
|
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
447
582
|
expect(result2.count).toBe(2);
|
|
448
583
|
|
|
449
|
-
//
|
|
584
|
+
// Third proposal for same position should be rejected (cap is 2)
|
|
450
585
|
const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
|
|
451
586
|
const result3 = await ap.tryAddBlockProposal(proposal3);
|
|
452
587
|
|
|
453
|
-
expect(result3.added).toBe(
|
|
454
|
-
expect(result3.count).toBe(
|
|
588
|
+
expect(result3.added).toBe(false);
|
|
589
|
+
expect(result3.count).toBe(2);
|
|
455
590
|
});
|
|
456
591
|
|
|
457
592
|
it('should return added=false when exceeding capacity', async () => {
|
|
@@ -571,17 +706,17 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
571
706
|
await ap.tryAddBlockProposal(newProposal);
|
|
572
707
|
|
|
573
708
|
// Verify both proposals exist
|
|
574
|
-
expect(await ap.
|
|
575
|
-
expect(await ap.
|
|
709
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeDefined();
|
|
710
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
576
711
|
|
|
577
712
|
// Delete slots older than newSlot (should delete oldSlot)
|
|
578
713
|
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
579
714
|
|
|
580
715
|
// Old proposal should be deleted from storage
|
|
581
|
-
expect(await ap.
|
|
716
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeUndefined();
|
|
582
717
|
|
|
583
718
|
// New proposal should still exist
|
|
584
|
-
expect(await ap.
|
|
719
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
585
720
|
});
|
|
586
721
|
});
|
|
587
722
|
|
|
@@ -590,12 +725,13 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
590
725
|
signer: Secp256k1Signer,
|
|
591
726
|
slotNumber: number,
|
|
592
727
|
archive: Fr = Fr.random(),
|
|
728
|
+
checkpointHeader?: CheckpointHeader,
|
|
593
729
|
): Promise<CheckpointProposalCore> => {
|
|
594
|
-
const
|
|
730
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
595
731
|
const blockHeader = makeBlockHeader(1);
|
|
596
732
|
const proposal = await makeCheckpointProposal({
|
|
597
733
|
signer,
|
|
598
|
-
checkpointHeader,
|
|
734
|
+
checkpointHeader: headerToUse,
|
|
599
735
|
archiveRoot: archive,
|
|
600
736
|
lastBlock: { blockHeader },
|
|
601
737
|
});
|
|
@@ -666,12 +802,12 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
666
802
|
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
667
803
|
expect(result2.count).toBe(2);
|
|
668
804
|
|
|
669
|
-
//
|
|
805
|
+
// Third proposal for same slot should be rejected (cap is 2)
|
|
670
806
|
const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
|
|
671
807
|
const result3 = await ap.tryAddCheckpointProposal(proposal3);
|
|
672
808
|
|
|
673
|
-
expect(result3.added).toBe(
|
|
674
|
-
expect(result3.count).toBe(
|
|
809
|
+
expect(result3.added).toBe(false);
|
|
810
|
+
expect(result3.count).toBe(2);
|
|
675
811
|
});
|
|
676
812
|
|
|
677
813
|
it('should not count attestations as proposals for duplicate detection', async () => {
|
|
@@ -3,11 +3,12 @@ import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer'
|
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import {
|
|
5
5
|
CheckpointAttestation,
|
|
6
|
+
CheckpointProposal,
|
|
6
7
|
ConsensusPayload,
|
|
7
|
-
|
|
8
|
-
getHashedSignaturePayloadEthSignedMessage,
|
|
8
|
+
getHashedSignaturePayloadTypedData,
|
|
9
9
|
} from '@aztec/stdlib/p2p';
|
|
10
10
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
11
|
+
import { TEST_COORDINATION_SIGNATURE_CONTEXT } from '@aztec/stdlib/testing';
|
|
11
12
|
|
|
12
13
|
import { type LocalAccount, generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
13
14
|
|
|
@@ -37,15 +38,19 @@ export const mockCheckpointAttestation = (
|
|
|
37
38
|
feeAssetPriceModifier: bigint = 0n,
|
|
38
39
|
): CheckpointAttestation => {
|
|
39
40
|
header = header ?? CheckpointHeader.random({ slotNumber: SlotNumber(slot) });
|
|
40
|
-
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier);
|
|
41
|
+
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier, TEST_COORDINATION_SIGNATURE_CONTEXT);
|
|
41
42
|
|
|
42
|
-
const attestationHash =
|
|
43
|
-
payload,
|
|
44
|
-
SignatureDomainSeparator.checkpointAttestation,
|
|
45
|
-
);
|
|
43
|
+
const attestationHash = getHashedSignaturePayloadTypedData(payload);
|
|
46
44
|
const attestationSignature = signer.sign(attestationHash);
|
|
47
45
|
|
|
48
|
-
const
|
|
46
|
+
const proposal = new CheckpointProposal(
|
|
47
|
+
header,
|
|
48
|
+
archive,
|
|
49
|
+
feeAssetPriceModifier,
|
|
50
|
+
attestationSignature,
|
|
51
|
+
TEST_COORDINATION_SIGNATURE_CONTEXT,
|
|
52
|
+
);
|
|
53
|
+
const proposalHash = getHashedSignaturePayloadTypedData(proposal);
|
|
49
54
|
const proposerSignature = signer.sign(proposalHash);
|
|
50
55
|
|
|
51
56
|
return new CheckpointAttestation(payload, attestationSignature, proposerSignature);
|
package/src/mem_pools/index.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
1
|
export { AttestationPool, type AttestationPoolApi } from './attestation_pool/attestation_pool.js';
|
|
2
2
|
export { type MemPools } from './interface.js';
|
|
3
|
-
// Old TxPool exports - kept temporarily for external consumers
|
|
4
|
-
export { type TxPool } from './tx_pool/tx_pool.js';
|
|
5
|
-
// New TxPoolV2 exports
|
|
6
3
|
export { type TxPoolV2, type TxPoolV2Config, type TxPoolV2Events, type AddTxsResult } from './tx_pool_v2/index.js';
|
|
@@ -73,7 +73,7 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
73
73
|
private defaultAttributes;
|
|
74
74
|
private meter: Meter;
|
|
75
75
|
|
|
76
|
-
private
|
|
76
|
+
private mempoolItemAddedTimestamp: Map<bigint | string, number> = new Map<bigint | string, number>();
|
|
77
77
|
|
|
78
78
|
constructor(
|
|
79
79
|
telemetry: TelemetryClient,
|
|
@@ -100,7 +100,11 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
100
100
|
|
|
101
101
|
this.addObjectCounter = createUpDownCounterWithDefault(this.meter, metricsLabels.itemsAdded);
|
|
102
102
|
|
|
103
|
-
this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay
|
|
103
|
+
this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay, {
|
|
104
|
+
advice: {
|
|
105
|
+
explicitBucketBoundaries: [100, 500, 1000, 5000, 10000, 30000, 60000, 300000, 600000, 1800000, 3600000],
|
|
106
|
+
},
|
|
107
|
+
});
|
|
104
108
|
|
|
105
109
|
this.meter.addBatchObservableCallback(this.observeStats, [this.objectsInMempool]);
|
|
106
110
|
}
|
|
@@ -114,22 +118,26 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
114
118
|
}
|
|
115
119
|
|
|
116
120
|
public transactionsAdded(transactions: Tx[]) {
|
|
117
|
-
|
|
118
|
-
for (const transaction of transactions) {
|
|
119
|
-
this.txAddedTimestamp.set(transaction.txHash.toBigInt(), timestamp);
|
|
120
|
-
}
|
|
121
|
+
transactions.forEach(tx => this.trackMempoolItemAdded(tx.txHash.toBigInt()));
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
public transactionsRemoved(hashes: Iterable<bigint> | Iterable<string>) {
|
|
124
|
-
const timestamp = Date.now();
|
|
125
125
|
for (const hash of hashes) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
126
|
+
this.trackMempoolItemRemoved(BigInt(hash));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
public trackMempoolItemAdded(key: bigint | string): void {
|
|
131
|
+
this.mempoolItemAddedTimestamp.set(key, Date.now());
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public trackMempoolItemRemoved(key: bigint | string): void {
|
|
135
|
+
const timestamp = Date.now();
|
|
136
|
+
const addedAt = this.mempoolItemAddedTimestamp.get(key);
|
|
137
|
+
if (addedAt !== undefined) {
|
|
138
|
+
this.mempoolItemAddedTimestamp.delete(key);
|
|
139
|
+
if (addedAt < timestamp) {
|
|
140
|
+
this.minedDelay.record(timestamp - addedAt);
|
|
133
141
|
}
|
|
134
142
|
}
|
|
135
143
|
}
|
|
@@ -158,7 +158,7 @@ Checked before adding a transaction to the pending pool:
|
|
|
158
158
|
|
|
159
159
|
| Rule | Purpose |
|
|
160
160
|
|------|---------|
|
|
161
|
-
| `NullifierConflictRule` | Handles transactions with conflicting nullifiers. Higher priority tx wins. |
|
|
161
|
+
| `NullifierConflictRule` | Handles transactions with conflicting nullifiers. Higher priority tx wins. For RPC submissions, a configurable price bump percentage is required. |
|
|
162
162
|
| `FeePayerBalancePreAddRule` | Ensures fee payer has sufficient balance for all their pending txs. |
|
|
163
163
|
| `LowPriorityPreAddRule` | Rejects txs when pool is full and new tx has lowest priority. |
|
|
164
164
|
|
|
@@ -233,6 +233,14 @@ await pool.updateConfig({
|
|
|
233
233
|
});
|
|
234
234
|
```
|
|
235
235
|
|
|
236
|
+
### Price Bump (RPC Transaction Replacement)
|
|
237
|
+
|
|
238
|
+
When a transaction is submitted via RPC and clashes on nullifiers with an existing pool transaction, the incoming tx must pay at least `priceBumpPercentage`% more in priority fee (i.e. `>= existingFee + existingFee * bump / 100`) to replace it. This prevents spam via small fee increments. The same bump applies when the pool is full and the incoming tx needs to evict the lowest-priority tx.
|
|
239
|
+
|
|
240
|
+
- **Env var**: `P2P_RPC_PRICE_BUMP_PERCENTAGE` (default: 10)
|
|
241
|
+
- **Scope**: RPC submissions only. P2P gossip uses `comparePriority` (fee + hash tiebreaker) with no bump.
|
|
242
|
+
- Even with a 0% bump, a replacement tx must pay at least 1 unit more than the existing fee.
|
|
243
|
+
|
|
236
244
|
## Return Values
|
|
237
245
|
|
|
238
246
|
### AddTxsResult
|
|
@@ -29,7 +29,8 @@ export class FeePayerBalanceEvictionRule implements EvictionRule {
|
|
|
29
29
|
|
|
30
30
|
if (context.event === EvictionEvent.BLOCK_MINED) {
|
|
31
31
|
const blockNumber = context.block.getBlockNumber();
|
|
32
|
-
await
|
|
32
|
+
const blockHash = await context.block.hash();
|
|
33
|
+
await this.worldState.syncImmediate(blockNumber, blockHash);
|
|
33
34
|
return await this.evictForFeePayers(context.feePayers, this.worldState.getSnapshot(blockNumber), pool);
|
|
34
35
|
}
|
|
35
36
|
|
|
@@ -21,6 +21,7 @@ export { FeePayerBalancePreAddRule } from './fee_payer_balance_pre_add_rule.js';
|
|
|
21
21
|
export { LowPriorityPreAddRule } from './low_priority_pre_add_rule.js';
|
|
22
22
|
|
|
23
23
|
// Post-event eviction rules
|
|
24
|
+
export { InsufficientFeePerGasEvictionRule } from './insufficient_fee_per_gas_eviction_rule.js';
|
|
24
25
|
export { InvalidTxsAfterMiningRule } from './invalid_txs_after_mining_rule.js';
|
|
25
26
|
export { InvalidTxsAfterReorgRule } from './invalid_txs_after_reorg_rule.js';
|
|
26
27
|
export { FeePayerBalanceEvictionRule } from './fee_payer_balance_eviction_rule.js';
|