@aztec/p2p 0.0.1-commit.b6e433891 → 0.0.1-commit.b9865e97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +9 -1
- package/dest/client/factory.d.ts +4 -3
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +28 -23
- 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 +78 -22
- package/dest/config.d.ts +131 -101
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +53 -8
- 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 +96 -56
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +262 -196
- 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 +175 -59
- 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 +1 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +17 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -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 +1 -7
- 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/invalid_txs_after_reorg_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +4 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +5 -2
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +13 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -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 +75 -84
- 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 +34 -10
- 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 +52 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -2
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +10 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +44 -10
- 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.js +3 -3
- 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 +6 -5
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +21 -11
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +36 -4
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +50 -33
- package/dest/msg_validators/tx_validator/index.d.ts +3 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +2 -0
- package/dest/msg_validators/tx_validator/phases_validator.js +1 -1
- 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 +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/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 -39
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +268 -241
- 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 +36 -8
- 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 +1 -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 +38 -44
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +8 -5
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- 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/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 +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 +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -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 +42 -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 +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 +26 -207
- 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/tx_collection.d.ts +35 -51
- 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 +19 -13
- 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 +84 -40
- package/dest/testbench/worker_client_manager.d.ts +10 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +51 -9
- package/dest/util.d.ts +11 -6
- 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 +48 -23
- package/src/client/interface.ts +15 -11
- package/src/client/p2p_client.ts +91 -43
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +107 -7
- 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 +313 -238
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +198 -62
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +5 -1
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
- 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/invalid_txs_after_reorg_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/interfaces.ts +3 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +20 -8
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +75 -90
- package/src/msg_validators/attestation_validator/attestation_validator.ts +38 -7
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
- package/src/msg_validators/clock_tolerance.ts +69 -0
- package/src/msg_validators/proposal_validator/README.md +1 -1
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +12 -2
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +17 -2
- package/src/msg_validators/proposal_validator/proposal_validator.ts +51 -8
- package/src/msg_validators/tx_validator/README.md +11 -3
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
- 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 +25 -7
- package/src/msg_validators/tx_validator/gas_validator.ts +82 -33
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +1 -1
- 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 +38 -5
- package/src/services/dummy_service.ts +14 -39
- 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 +297 -274
- package/src/services/peer-manager/peer_manager.ts +41 -8
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/README.md +0 -14
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +42 -52
- package/src/services/reqresp/batch-tx-requester/interface.ts +11 -4
- 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/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
- 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 +29 -252
- 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/tx_collection.ts +330 -173
- 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 +3 -0
- package/src/test-helpers/mock-pubsub.ts +46 -60
- package/src/test-helpers/reqresp-nodes.ts +12 -22
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +23 -26
- package/src/testbench/p2p_client_testbench_worker.ts +89 -54
- package/src/testbench/worker_client_manager.ts +59 -20
- package/src/util.ts +32 -17
- 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 -123
- 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 -402
- 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 -51
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -311
- 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 -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 -344
- 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 -163
- 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 -321
- 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 -361
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -108
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { BlockHash } from '@aztec/stdlib/block';
|
|
3
3
|
import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
4
4
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
5
5
|
|
|
@@ -33,14 +33,14 @@ export class InvalidTxsAfterReorgRule implements EvictionRule {
|
|
|
33
33
|
const pendingTxs = pool.getPendingTxs();
|
|
34
34
|
|
|
35
35
|
// Deduplicate block hashes to reduce redundant DB lookups
|
|
36
|
-
const uniqueBlockHashes = new Map<string,
|
|
36
|
+
const uniqueBlockHashes = new Map<string, BlockHash>();
|
|
37
37
|
const txsByBlockHash = new Map<string, string[]>();
|
|
38
38
|
|
|
39
39
|
for (const meta of pendingTxs) {
|
|
40
40
|
const blockHashStr = meta.anchorBlockHeaderHash;
|
|
41
41
|
if (!txsByBlockHash.has(blockHashStr)) {
|
|
42
42
|
txsByBlockHash.set(blockHashStr, []);
|
|
43
|
-
uniqueBlockHashes.set(blockHashStr,
|
|
43
|
+
uniqueBlockHashes.set(blockHashStr, BlockHash.fromString(blockHashStr));
|
|
44
44
|
}
|
|
45
45
|
txsByBlockHash.get(blockHashStr)!.push(meta.txHash);
|
|
46
46
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import type { TypedEventEmitter } from '@aztec/foundation/types';
|
|
3
3
|
import type { L2Block, L2BlockId, L2BlockSource } from '@aztec/stdlib/block';
|
|
4
|
+
import type { BlockMinFeesProvider } from '@aztec/stdlib/gas';
|
|
4
5
|
import type { WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
5
6
|
import type { BlockHeader, Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
|
|
6
7
|
|
|
@@ -74,6 +75,8 @@ export type TxPoolV2Dependencies = {
|
|
|
74
75
|
createTxValidator: () => Promise<TxValidator<TxMetaData>>;
|
|
75
76
|
/** Checks whether a tx's setup-phase calls are on the allow list. Precomputed at receipt time. */
|
|
76
77
|
checkAllowedSetupCalls: (tx: Tx) => Promise<boolean>;
|
|
78
|
+
/** Provides projected minimum fees for the next block. Used by eviction rules instead of stale block header fees. */
|
|
79
|
+
blockMinFeesProvider: BlockMinFeesProvider;
|
|
77
80
|
};
|
|
78
81
|
|
|
79
82
|
/**
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import { minBigint } from '@aztec/foundation/bigint';
|
|
1
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
4
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
4
5
|
import { BlockHash, type L2BlockId } from '@aztec/stdlib/block';
|
|
5
|
-
import { Gas } from '@aztec/stdlib/gas';
|
|
6
|
+
import { Gas, GasFees } from '@aztec/stdlib/gas';
|
|
6
7
|
import { type Tx, TxHash } from '@aztec/stdlib/tx';
|
|
7
8
|
|
|
8
9
|
import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
|
|
9
|
-
import { getTxPriorityFee } from '../tx_pool/priority.js';
|
|
10
10
|
import { type PreAddResult, TxPoolRejectionCode } from './eviction/interfaces.js';
|
|
11
11
|
|
|
12
12
|
/** Validator-compatible data interface, mirroring the subset of PrivateKernelTailCircuitPublicInputs used by validators. */
|
|
@@ -23,7 +23,7 @@ export type TxMetaValidationData = {
|
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
25
|
txContext: {
|
|
26
|
-
gasSettings: { gasLimits: Gas };
|
|
26
|
+
gasSettings: { gasLimits: Gas; maxFeesPerGas: GasFees };
|
|
27
27
|
};
|
|
28
28
|
};
|
|
29
29
|
};
|
|
@@ -132,7 +132,10 @@ export async function buildTxMetaData(tx: Tx, allowedSetupCalls: boolean = true)
|
|
|
132
132
|
globalVariables: { blockNumber: anchorBlockNumber },
|
|
133
133
|
},
|
|
134
134
|
txContext: {
|
|
135
|
-
gasSettings: {
|
|
135
|
+
gasSettings: {
|
|
136
|
+
gasLimits: tx.data.constants.txContext.gasSettings.gasLimits,
|
|
137
|
+
maxFeesPerGas: tx.data.constants.txContext.gasSettings.maxFeesPerGas,
|
|
138
|
+
},
|
|
136
139
|
},
|
|
137
140
|
},
|
|
138
141
|
},
|
|
@@ -285,17 +288,19 @@ export function checkNullifierConflict(
|
|
|
285
288
|
}
|
|
286
289
|
|
|
287
290
|
/** Creates a stub TxMetaValidationData for tests that don't exercise validators. */
|
|
288
|
-
export function stubTxMetaValidationData(
|
|
291
|
+
export function stubTxMetaValidationData(
|
|
292
|
+
overrides: { expirationTimestamp?: bigint; maxFeesPerGas?: GasFees } = {},
|
|
293
|
+
): TxMetaValidationData {
|
|
289
294
|
return {
|
|
290
295
|
getNonEmptyNullifiers: () => [],
|
|
291
296
|
expirationTimestamp: overrides.expirationTimestamp ?? 0n,
|
|
292
297
|
constants: {
|
|
293
298
|
anchorBlockHeader: {
|
|
294
|
-
hash: () => Promise.resolve(
|
|
299
|
+
hash: () => Promise.resolve(BlockHash.ZERO),
|
|
295
300
|
globalVariables: { blockNumber: BlockNumber(0) },
|
|
296
301
|
},
|
|
297
302
|
txContext: {
|
|
298
|
-
gasSettings: { gasLimits: Gas.empty() },
|
|
303
|
+
gasSettings: { gasLimits: Gas.empty(), maxFeesPerGas: overrides.maxFeesPerGas ?? GasFees.empty() },
|
|
299
304
|
},
|
|
300
305
|
},
|
|
301
306
|
};
|
|
@@ -313,6 +318,7 @@ export function stubTxMetaData(
|
|
|
313
318
|
expirationTimestamp?: bigint;
|
|
314
319
|
anchorBlockHeaderHash?: string;
|
|
315
320
|
allowedSetupCalls?: boolean;
|
|
321
|
+
maxFeesPerGas?: GasFees;
|
|
316
322
|
} = {},
|
|
317
323
|
): TxMetaData {
|
|
318
324
|
const txHashBigInt = Fr.fromHexString(txHash).toBigInt();
|
|
@@ -332,6 +338,12 @@ export function stubTxMetaData(
|
|
|
332
338
|
allowedSetupCalls: overrides.allowedSetupCalls ?? true,
|
|
333
339
|
receivedAt: 0,
|
|
334
340
|
estimatedSizeBytes: 0,
|
|
335
|
-
data: stubTxMetaValidationData({ expirationTimestamp }),
|
|
341
|
+
data: stubTxMetaValidationData({ expirationTimestamp, maxFeesPerGas: overrides.maxFeesPerGas }),
|
|
336
342
|
};
|
|
337
343
|
}
|
|
344
|
+
|
|
345
|
+
/** Returns the priority fee for a tx, based on the L2 priority fee capped by the max fee per gas. */
|
|
346
|
+
function getTxPriorityFee(tx: Tx): bigint {
|
|
347
|
+
const { maxPriorityFeesPerGas: priorityFees, maxFeesPerGas } = tx.getGasSettings();
|
|
348
|
+
return minBigint(maxFeesPerGas.feePerL2Gas, priorityFees.feePerL2Gas);
|
|
349
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { FifoSet } from '@aztec/foundation/fifo-set';
|
|
2
3
|
import type { Logger } from '@aztec/foundation/log';
|
|
3
4
|
import type { DateProvider } from '@aztec/foundation/timer';
|
|
4
5
|
import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
|
|
@@ -17,6 +18,7 @@ import {
|
|
|
17
18
|
EvictionManager,
|
|
18
19
|
FeePayerBalanceEvictionRule,
|
|
19
20
|
FeePayerBalancePreAddRule,
|
|
21
|
+
InsufficientFeePerGasEvictionRule,
|
|
20
22
|
InvalidTxsAfterMiningRule,
|
|
21
23
|
InvalidTxsAfterReorgRule,
|
|
22
24
|
LowPriorityEvictionRule,
|
|
@@ -39,6 +41,13 @@ import {
|
|
|
39
41
|
import { type TxMetaData, type TxState, buildTxMetaData, checkNullifierConflict } from './tx_metadata.js';
|
|
40
42
|
import { TxPoolIndices } from './tx_pool_indices.js';
|
|
41
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Maximum number of full transactions to load into memory at once when finalizing a block.
|
|
46
|
+
* Bounds peak memory while archiving and hard-deleting mined txs (~23k txs/epoch at 10 TPS would
|
|
47
|
+
* otherwise OOM the node).
|
|
48
|
+
*/
|
|
49
|
+
const FINALIZE_BLOCK_CHUNK_SIZE = 100;
|
|
50
|
+
|
|
42
51
|
/**
|
|
43
52
|
* Callbacks for the implementation to notify the outer class about events and metrics.
|
|
44
53
|
*/
|
|
@@ -74,7 +83,7 @@ export class TxPoolV2Impl {
|
|
|
74
83
|
#evictionManager: EvictionManager;
|
|
75
84
|
#dateProvider: DateProvider;
|
|
76
85
|
#instrumentation: TxPoolV2Instrumentation;
|
|
77
|
-
#evictedTxHashes:
|
|
86
|
+
#evictedTxHashes: FifoSet<string>;
|
|
78
87
|
#log: Logger;
|
|
79
88
|
#callbacks: TxPoolV2Callbacks;
|
|
80
89
|
|
|
@@ -97,6 +106,7 @@ export class TxPoolV2Impl {
|
|
|
97
106
|
this.#checkAllowedSetupCalls = deps.checkAllowedSetupCalls;
|
|
98
107
|
|
|
99
108
|
this.#config = { ...DEFAULT_TX_POOL_V2_CONFIG, ...config };
|
|
109
|
+
this.#evictedTxHashes = FifoSet.withLimit<string>(this.#config.evictedTxCacheSize);
|
|
100
110
|
this.#archive = new TxArchive(archiveStore, this.#config.archivedTxLimit, log);
|
|
101
111
|
this.#deletedPool = new DeletedPool(store, this.#txsDB, log);
|
|
102
112
|
this.#dateProvider = dateProvider;
|
|
@@ -116,6 +126,7 @@ export class TxPoolV2Impl {
|
|
|
116
126
|
|
|
117
127
|
// Post-event eviction rules (run after events to check ALL pending txs)
|
|
118
128
|
this.#evictionManager.registerRule(new InvalidTxsAfterMiningRule());
|
|
129
|
+
this.#evictionManager.registerRule(new InsufficientFeePerGasEvictionRule(deps.blockMinFeesProvider));
|
|
119
130
|
this.#evictionManager.registerRule(new InvalidTxsAfterReorgRule(deps.worldStateSynchronizer));
|
|
120
131
|
this.#evictionManager.registerRule(new FeePayerBalanceEvictionRule(deps.worldStateSynchronizer));
|
|
121
132
|
// LowPriorityEvictionRule handles cases where txs become pending via prepareForSlot (unprotect)
|
|
@@ -138,39 +149,67 @@ export class TxPoolV2Impl {
|
|
|
138
149
|
// Step 0: Hydrate deleted pool state
|
|
139
150
|
await this.#deletedPool.hydrateFromDatabase();
|
|
140
151
|
|
|
141
|
-
// Step 1:
|
|
142
|
-
const
|
|
152
|
+
// Step 1: Stream txs from DB, building metadata and mined status one at a time.
|
|
153
|
+
const minedMetas: TxMetaData[] = [];
|
|
154
|
+
const pendingMetas: TxMetaData[] = [];
|
|
155
|
+
const deserializationErrors: string[] = [];
|
|
156
|
+
|
|
157
|
+
for await (const [txHashStr, buffer] of this.#txsDB.entriesAsync()) {
|
|
158
|
+
// Skip soft-deleted transactions - they stay in DB but not in indices
|
|
159
|
+
if (this.#deletedPool.isSoftDeleted(txHashStr)) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
let meta: TxMetaData;
|
|
164
|
+
let txEffect: Awaited<ReturnType<L2BlockSource['getTxEffect']>>;
|
|
165
|
+
try {
|
|
166
|
+
const tx = Tx.fromBuffer(buffer);
|
|
167
|
+
// Resolve allowed-setup-calls and the tx effect concurrently
|
|
168
|
+
// getTxEffect failures are non-fatal (we just treat the tx as not-yet-mined), so
|
|
169
|
+
// its rejection is swallowed before the Promise.all so it can't fail-fast the batch.
|
|
170
|
+
const txEffectPromise = this.#l2BlockSource.getTxEffect(tx.getTxHash()).catch(err => {
|
|
171
|
+
this.#log.warn(`Failed to check mined status for tx ${txHashStr}`, { err });
|
|
172
|
+
return undefined;
|
|
173
|
+
});
|
|
174
|
+
const [allowedSetupCalls, fetchedTxEffect] = await Promise.all([
|
|
175
|
+
this.#checkAllowedSetupCalls(tx),
|
|
176
|
+
txEffectPromise,
|
|
177
|
+
]);
|
|
178
|
+
meta = await buildTxMetaData(tx, allowedSetupCalls);
|
|
179
|
+
txEffect = fetchedTxEffect;
|
|
180
|
+
} catch (err) {
|
|
181
|
+
this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, { err });
|
|
182
|
+
deserializationErrors.push(txHashStr);
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
143
185
|
|
|
144
|
-
|
|
145
|
-
|
|
186
|
+
if (txEffect) {
|
|
187
|
+
meta.minedL2BlockId = {
|
|
188
|
+
number: txEffect.l2BlockNumber,
|
|
189
|
+
hash: txEffect.l2BlockHash.toString(),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
146
192
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
const nonMined: { tx: Tx; meta: TxMetaData }[] = [];
|
|
150
|
-
for (const entry of loaded) {
|
|
151
|
-
if (entry.meta.minedL2BlockId !== undefined) {
|
|
152
|
-
mined.push(entry.meta);
|
|
193
|
+
if (meta.minedL2BlockId !== undefined) {
|
|
194
|
+
minedMetas.push(meta);
|
|
153
195
|
} else {
|
|
154
|
-
|
|
196
|
+
pendingMetas.push(meta);
|
|
155
197
|
}
|
|
156
198
|
}
|
|
157
199
|
|
|
158
|
-
// Step
|
|
159
|
-
const { valid, invalid } = await this.#revalidateMetadata(
|
|
160
|
-
nonMined.map(e => e.meta),
|
|
161
|
-
'on startup',
|
|
162
|
-
);
|
|
200
|
+
// Step 2: Validate non-mined transactions
|
|
201
|
+
const { valid, invalid } = await this.#revalidateMetadata(pendingMetas, 'on startup');
|
|
163
202
|
|
|
164
|
-
// Step
|
|
165
|
-
for (const meta of
|
|
203
|
+
// Step 3: Populate mined indices (these don't need conflict resolution)
|
|
204
|
+
for (const meta of minedMetas) {
|
|
166
205
|
this.#indices.addMined(meta);
|
|
167
206
|
}
|
|
168
207
|
|
|
169
|
-
// Step
|
|
208
|
+
// Step 4: Rebuild pending pool by running pre-add rules for each tx
|
|
170
209
|
// This resolves nullifier conflicts, fee payer balance issues, and pool size limits
|
|
171
210
|
const { rejected } = await this.#rebuildPendingPool(valid);
|
|
172
211
|
|
|
173
|
-
// Step
|
|
212
|
+
// Step 5: Delete invalid and rejected txs from DB only (indices were never populated for these)
|
|
174
213
|
const toDelete = [...deserializationErrors, ...invalid, ...rejected];
|
|
175
214
|
if (toDelete.length === 0) {
|
|
176
215
|
return;
|
|
@@ -638,28 +677,29 @@ export class TxPoolV2Impl {
|
|
|
638
677
|
// Step 1: Find mined txs at or before finalized block
|
|
639
678
|
const minedTxsToFinalize = this.#indices.findTxsMinedAtOrBefore(blockNumber);
|
|
640
679
|
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
680
|
+
// Step 2: Archive in chunks if archiving is enabled. Hydrating an entire epoch's worth of
|
|
681
|
+
// mined txs at once would OOM under load. When archiving is disabled there is no need to hydrate the txs at all.
|
|
682
|
+
if (this.#archive.isEnabled()) {
|
|
683
|
+
for (let i = 0; i < minedTxsToFinalize.length; i += FINALIZE_BLOCK_CHUNK_SIZE) {
|
|
684
|
+
const chunk = minedTxsToFinalize.slice(i, i + FINALIZE_BLOCK_CHUNK_SIZE);
|
|
685
|
+
const txsToArchive: Tx[] = [];
|
|
686
|
+
for (const txHashStr of chunk) {
|
|
646
687
|
const buffer = await this.#txsDB.getAsync(txHashStr);
|
|
647
688
|
if (buffer) {
|
|
648
689
|
txsToArchive.push(Tx.fromBuffer(buffer));
|
|
649
690
|
}
|
|
650
691
|
}
|
|
692
|
+
if (txsToArchive.length > 0) {
|
|
693
|
+
await this.#archive.archiveTxs(txsToArchive);
|
|
694
|
+
}
|
|
651
695
|
}
|
|
696
|
+
}
|
|
652
697
|
|
|
653
|
-
|
|
698
|
+
// Step 3: Delete mined txs from the active pool and finalize soft-deleted txs in one
|
|
699
|
+
// transaction. Only tx hashes are touched here, so memory is bounded and atomicity is preserved.
|
|
700
|
+
await this.#store.transactionAsync(async () => {
|
|
654
701
|
await this.#deleteTxsBatch(minedTxsToFinalize);
|
|
655
|
-
|
|
656
|
-
// Step 4: Finalize soft-deleted txs
|
|
657
702
|
await this.#deletedPool.finalizeBlock(blockNumber);
|
|
658
|
-
|
|
659
|
-
// Step 5: Archive mined txs
|
|
660
|
-
if (txsToArchive.length > 0) {
|
|
661
|
-
await this.#archive.archiveTxs(txsToArchive);
|
|
662
|
-
}
|
|
663
703
|
});
|
|
664
704
|
|
|
665
705
|
if (minedTxsToFinalize.length > 0) {
|
|
@@ -865,21 +905,11 @@ export class TxPoolV2Impl {
|
|
|
865
905
|
this.#instrumentation.recordEvictions(txHashes.length, reason);
|
|
866
906
|
for (const txHashStr of txHashes) {
|
|
867
907
|
this.#log.debug(`Evicting tx ${txHashStr}`, { txHash: txHashStr, reason });
|
|
868
|
-
this.#
|
|
908
|
+
this.#evictedTxHashes.add(txHashStr);
|
|
869
909
|
}
|
|
870
910
|
await this.#deleteTxsBatch(txHashes);
|
|
871
911
|
}
|
|
872
912
|
|
|
873
|
-
/** Adds a tx hash to the bounded evicted cache, evicting the oldest entry if at capacity. */
|
|
874
|
-
#addToEvictedCache(txHashStr: string): void {
|
|
875
|
-
if (this.#evictedTxHashes.size >= this.#config.evictedTxCacheSize) {
|
|
876
|
-
// FIFO eviction: remove the first (oldest) entry
|
|
877
|
-
const oldest = this.#evictedTxHashes.values().next().value!;
|
|
878
|
-
this.#evictedTxHashes.delete(oldest);
|
|
879
|
-
}
|
|
880
|
-
this.#evictedTxHashes.add(txHashStr);
|
|
881
|
-
}
|
|
882
|
-
|
|
883
913
|
// ============================================================================
|
|
884
914
|
// PRIVATE HELPERS - Validation & Conflict Resolution
|
|
885
915
|
// ============================================================================
|
|
@@ -974,51 +1004,6 @@ export class TxPoolV2Impl {
|
|
|
974
1004
|
};
|
|
975
1005
|
}
|
|
976
1006
|
|
|
977
|
-
/** Loads all transactions from the database, returning loaded txs and deserialization errors */
|
|
978
|
-
async #loadAllTxsFromDb(): Promise<{
|
|
979
|
-
loaded: { tx: Tx; meta: TxMetaData }[];
|
|
980
|
-
errors: string[];
|
|
981
|
-
}> {
|
|
982
|
-
const loaded: { tx: Tx; meta: TxMetaData }[] = [];
|
|
983
|
-
const errors: string[] = [];
|
|
984
|
-
|
|
985
|
-
for await (const [txHashStr, buffer] of this.#txsDB.entriesAsync()) {
|
|
986
|
-
// Skip soft-deleted transactions - they stay in DB but not in indices
|
|
987
|
-
if (this.#deletedPool.isSoftDeleted(txHashStr)) {
|
|
988
|
-
continue;
|
|
989
|
-
}
|
|
990
|
-
|
|
991
|
-
try {
|
|
992
|
-
const tx = Tx.fromBuffer(buffer);
|
|
993
|
-
const allowedSetupCalls = await this.#checkAllowedSetupCalls(tx);
|
|
994
|
-
const meta = await buildTxMetaData(tx, allowedSetupCalls);
|
|
995
|
-
loaded.push({ tx, meta });
|
|
996
|
-
} catch (err) {
|
|
997
|
-
this.#log.warn(`Failed to deserialize tx ${txHashStr}, deleting`, { err });
|
|
998
|
-
errors.push(txHashStr);
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
|
|
1002
|
-
return { loaded, errors };
|
|
1003
|
-
}
|
|
1004
|
-
|
|
1005
|
-
/** Queries block source and marks mined status on transaction metadata */
|
|
1006
|
-
async #markMinedStatusBatch(metas: TxMetaData[]): Promise<void> {
|
|
1007
|
-
for (const meta of metas) {
|
|
1008
|
-
try {
|
|
1009
|
-
const txEffect = await this.#l2BlockSource.getTxEffect(TxHash.fromString(meta.txHash));
|
|
1010
|
-
if (txEffect) {
|
|
1011
|
-
meta.minedL2BlockId = {
|
|
1012
|
-
number: txEffect.l2BlockNumber,
|
|
1013
|
-
hash: txEffect.l2BlockHash.toString(),
|
|
1014
|
-
};
|
|
1015
|
-
}
|
|
1016
|
-
} catch (err) {
|
|
1017
|
-
this.#log.warn(`Failed to check mined status for tx ${meta.txHash}`, { err });
|
|
1018
|
-
}
|
|
1019
|
-
}
|
|
1020
|
-
}
|
|
1021
|
-
|
|
1022
1007
|
/**
|
|
1023
1008
|
* Rebuilds the pending pool by processing each tx through pre-add rules.
|
|
1024
1009
|
* Starts with an empty pending pool and adds txs one by one, resolving conflicts.
|
|
@@ -3,19 +3,35 @@ import { NoCommitteeError } from '@aztec/ethereum/contracts';
|
|
|
3
3
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import {
|
|
5
5
|
type CheckpointAttestation,
|
|
6
|
+
type CoordinationSignatureContext,
|
|
6
7
|
type P2PValidator,
|
|
7
8
|
PeerErrorSeverity,
|
|
8
9
|
type ValidationResult,
|
|
10
|
+
hasValidSignatureContext,
|
|
9
11
|
} from '@aztec/stdlib/p2p';
|
|
10
12
|
|
|
11
|
-
import { isWithinClockTolerance } from '../clock_tolerance.js';
|
|
13
|
+
import { PipeliningWindow, isWithinClockTolerance } from '../clock_tolerance.js';
|
|
12
14
|
|
|
13
15
|
export class CheckpointAttestationValidator implements P2PValidator<CheckpointAttestation> {
|
|
14
16
|
protected epochCache: EpochCacheInterface;
|
|
15
17
|
protected logger: Logger;
|
|
18
|
+
private readonly pipeliningWindow: PipeliningWindow;
|
|
19
|
+
protected readonly signatureContext: CoordinationSignatureContext;
|
|
16
20
|
|
|
17
|
-
constructor(
|
|
21
|
+
constructor(
|
|
22
|
+
epochCache: EpochCacheInterface,
|
|
23
|
+
opts: {
|
|
24
|
+
l1PublishingTime?: number;
|
|
25
|
+
p2pPropagationTime?: number;
|
|
26
|
+
signatureContext: CoordinationSignatureContext;
|
|
27
|
+
},
|
|
28
|
+
) {
|
|
18
29
|
this.epochCache = epochCache;
|
|
30
|
+
this.pipeliningWindow = new PipeliningWindow(epochCache, {
|
|
31
|
+
l1PublishingTime: opts.l1PublishingTime,
|
|
32
|
+
p2pPropagationTime: opts.p2pPropagationTime,
|
|
33
|
+
});
|
|
34
|
+
this.signatureContext = opts.signatureContext;
|
|
19
35
|
this.logger = createLogger('p2p:checkpoint-attestation-validator');
|
|
20
36
|
}
|
|
21
37
|
|
|
@@ -23,19 +39,34 @@ export class CheckpointAttestationValidator implements P2PValidator<CheckpointAt
|
|
|
23
39
|
const slotNumber = message.payload.header.slotNumber;
|
|
24
40
|
|
|
25
41
|
try {
|
|
26
|
-
//
|
|
42
|
+
// Cross-chain replay check: reject attestations that carry a foreign signing domain.
|
|
43
|
+
if (!hasValidSignatureContext(message.payload, this.signatureContext)) {
|
|
44
|
+
this.logger.warn(`Rejecting checkpoint attestation with foreign signature context for slot ${slotNumber}`, {
|
|
45
|
+
chainId: message.payload.signatureContext.chainId,
|
|
46
|
+
rollupAddress: message.payload.signatureContext.rollupAddress.toString(),
|
|
47
|
+
expectedChainId: this.signatureContext.chainId,
|
|
48
|
+
expectedRollupAddress: this.signatureContext.rollupAddress.toString(),
|
|
49
|
+
});
|
|
50
|
+
return { result: 'reject', severity: PeerErrorSeverity.LowToleranceError };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Use target slots since proposals target pipeline slots (slot + 1 when pipelining).
|
|
27
54
|
const { targetSlot, nextSlot } = this.epochCache.getTargetAndNextSlot();
|
|
28
55
|
|
|
29
56
|
if (slotNumber !== targetSlot && slotNumber !== nextSlot) {
|
|
30
|
-
//
|
|
31
|
-
|
|
57
|
+
// When pipelining, accept attestations for the current slot (built in the previous slot)
|
|
58
|
+
// until the target slot reaches its L1 publish cutoff.
|
|
59
|
+
if (this.pipeliningWindow.acceptsAttestation(slotNumber)) {
|
|
60
|
+
// Fall through to remaining validation (signature, committee, etc.)
|
|
61
|
+
} else if (!isWithinClockTolerance(slotNumber, targetSlot, this.epochCache)) {
|
|
32
62
|
this.logger.warn(
|
|
33
63
|
`Checkpoint attestation slot ${slotNumber} is not current (${targetSlot}) or next (${nextSlot}) slot`,
|
|
34
64
|
);
|
|
35
65
|
return { result: 'reject', severity: PeerErrorSeverity.HighToleranceError };
|
|
66
|
+
} else {
|
|
67
|
+
this.logger.debug(`Ignoring checkpoint attestation for previous slot ${slotNumber} within clock tolerance`);
|
|
68
|
+
return { result: 'ignore' };
|
|
36
69
|
}
|
|
37
|
-
this.logger.debug(`Ignoring checkpoint attestation for previous slot ${slotNumber} within clock tolerance`);
|
|
38
|
-
return { result: 'ignore' };
|
|
39
70
|
}
|
|
40
71
|
|
|
41
72
|
// Verify the signature is valid
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
type CheckpointAttestation,
|
|
4
|
+
type CoordinationSignatureContext,
|
|
5
|
+
PeerErrorSeverity,
|
|
6
|
+
type ValidationResult,
|
|
7
|
+
} from '@aztec/stdlib/p2p';
|
|
3
8
|
import { Attributes, Metrics, type TelemetryClient, createUpDownCounterWithDefault } from '@aztec/telemetry-client';
|
|
4
9
|
|
|
5
10
|
import type { AttestationPoolApi } from '../../mem_pools/attestation_pool/attestation_pool.js';
|
|
@@ -20,8 +25,13 @@ export class FishermanAttestationValidator extends CheckpointAttestationValidato
|
|
|
20
25
|
epochCache: EpochCacheInterface,
|
|
21
26
|
private attestationPool: AttestationPoolApi,
|
|
22
27
|
telemetryClient: TelemetryClient,
|
|
28
|
+
opts: {
|
|
29
|
+
l1PublishingTime?: number;
|
|
30
|
+
p2pPropagationTime?: number;
|
|
31
|
+
signatureContext: CoordinationSignatureContext;
|
|
32
|
+
},
|
|
23
33
|
) {
|
|
24
|
-
super(epochCache);
|
|
34
|
+
super(epochCache, opts);
|
|
25
35
|
this.logger = this.logger.createChild('[FISHERMAN]');
|
|
26
36
|
|
|
27
37
|
const meter = telemetryClient.getMeter('FishermanAttestationValidator');
|
|
@@ -54,8 +64,7 @@ export class FishermanAttestationValidator extends CheckpointAttestationValidato
|
|
|
54
64
|
return { result: 'accept' };
|
|
55
65
|
}
|
|
56
66
|
|
|
57
|
-
const
|
|
58
|
-
const proposal = await this.attestationPool.getCheckpointProposal(proposalId);
|
|
67
|
+
const proposal = await this.attestationPool.getCheckpointProposal(message.payload.header.slotNumber);
|
|
59
68
|
|
|
60
69
|
if (proposal) {
|
|
61
70
|
// Compare the attestation payload with the proposal payload
|
|
@@ -84,9 +93,7 @@ export class FishermanAttestationValidator extends CheckpointAttestationValidato
|
|
|
84
93
|
}
|
|
85
94
|
} else {
|
|
86
95
|
// We might receive attestations before proposals in some cases
|
|
87
|
-
this.logger.debug(
|
|
88
|
-
`Received attestation for slot ${slotNumberBigInt} but proposal not found yet. ` + `Proposal ID: ${proposalId}`,
|
|
89
|
-
);
|
|
96
|
+
this.logger.debug(`Received attestation for slot ${slotNumberBigInt} but proposal not found yet.`);
|
|
90
97
|
}
|
|
91
98
|
|
|
92
99
|
return { result: 'accept' };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
2
|
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { DEFAULT_P2P_PROPAGATION_TIME, createPipelinedCheckpointTimingModel } from '@aztec/stdlib/timetable';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Maximum clock disparity tolerance for P2P message validation (in milliseconds).
|
|
@@ -50,3 +51,71 @@ export function isWithinClockTolerance(
|
|
|
50
51
|
|
|
51
52
|
return elapsedMs < MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS;
|
|
52
53
|
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Checks if a straggler message for the previous target slot should be accepted.
|
|
57
|
+
*
|
|
58
|
+
* Proposals and attestations carry the target slot N. Most of the time the receiver is either
|
|
59
|
+
* still in the build slot N-1 (accepted via the main `slotNumber === targetSlot` match) or in the
|
|
60
|
+
* target slot N (accepted again via `targetSlot`). Stragglers that arrive after the receiver has
|
|
61
|
+
* rolled past the target slot fall to this check: accept `messageSlot === slotNow` while we're
|
|
62
|
+
* still within the first `windowSeconds + clock-disparity` of the slot.
|
|
63
|
+
*
|
|
64
|
+
* Under the early-pipelining schedule `windowSeconds` is small (0 for proposals,
|
|
65
|
+
* `2*p2pPropagationTime` for attestations) since the proposer collects everything
|
|
66
|
+
* before the slot boundary.
|
|
67
|
+
*
|
|
68
|
+
* @param messageSlot - The slot number from the received message
|
|
69
|
+
* @param epochCache - EpochCache to get timing state
|
|
70
|
+
* @param windowSeconds - How far into the current slot we still accept previous-target messages
|
|
71
|
+
* @returns true if the message is for the current wallclock slot and we're within the grace period
|
|
72
|
+
*/
|
|
73
|
+
function isWithinPipeliningWindow(
|
|
74
|
+
messageSlot: SlotNumber,
|
|
75
|
+
epochCache: EpochCacheInterface,
|
|
76
|
+
windowSeconds: number,
|
|
77
|
+
): boolean {
|
|
78
|
+
const currentSlot = epochCache.getSlotNow();
|
|
79
|
+
if (messageSlot !== currentSlot) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const { ts: slotStartTs, nowMs } = epochCache.getEpochAndSlotNow();
|
|
84
|
+
const slotStartMs = slotStartTs * 1000n;
|
|
85
|
+
const elapsedMs = Number(nowMs - slotStartMs);
|
|
86
|
+
const windowMs = windowSeconds * 1000 + MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS;
|
|
87
|
+
|
|
88
|
+
return elapsedMs < windowMs;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export class PipeliningWindow {
|
|
92
|
+
private readonly proposalWindowIntoTargetSlot: number;
|
|
93
|
+
private readonly attestationWindowIntoTargetSlot: number;
|
|
94
|
+
|
|
95
|
+
constructor(
|
|
96
|
+
private readonly epochCache: EpochCacheInterface,
|
|
97
|
+
opts: {
|
|
98
|
+
p2pPropagationTime?: number;
|
|
99
|
+
l1PublishingTime?: number;
|
|
100
|
+
} = {},
|
|
101
|
+
) {
|
|
102
|
+
const l1Constants = epochCache.getL1Constants();
|
|
103
|
+
const checkpointTiming = createPipelinedCheckpointTimingModel({
|
|
104
|
+
aztecSlotDuration: l1Constants.slotDuration,
|
|
105
|
+
ethereumSlotDuration: l1Constants.ethereumSlotDuration,
|
|
106
|
+
l1PublishingTime: opts.l1PublishingTime ?? l1Constants.ethereumSlotDuration,
|
|
107
|
+
p2pPropagationTime: opts.p2pPropagationTime ?? DEFAULT_P2P_PROPAGATION_TIME,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
this.proposalWindowIntoTargetSlot = checkpointTiming.proposalWindowIntoTargetSlot;
|
|
111
|
+
this.attestationWindowIntoTargetSlot = checkpointTiming.attestationWindowIntoTargetSlot;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public acceptsProposal(messageSlot: SlotNumber): boolean {
|
|
115
|
+
return isWithinPipeliningWindow(messageSlot, this.epochCache, this.proposalWindowIntoTargetSlot);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public acceptsAttestation(messageSlot: SlotNumber): boolean {
|
|
119
|
+
return isWithinPipeliningWindow(messageSlot, this.epochCache, this.attestationWindowIntoTargetSlot);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -53,7 +53,7 @@ Only runs on validator nodes. Non-validator nodes use a default handler that tri
|
|
|
53
53
|
|
|
54
54
|
**Escape hatch**: during escape hatch periods (`isEscapeHatchOpenAtSlot`), re-execution and slashing are both disabled, and the proposal is rejected locally.
|
|
55
55
|
|
|
56
|
-
**Conditional re-execution**: rules 22-24 only run when at least one condition is true: `fishermanMode` enabled, `slashBroadcastedInvalidBlockPenalty > 0
|
|
56
|
+
**Conditional re-execution**: rules 22-24 only run when at least one condition is true: `fishermanMode` enabled, `slashBroadcastedInvalidBlockPenalty > 0`, committee membership, `alwaysReexecuteBlockProposals`, or `blobClient.canUpload()`.
|
|
57
57
|
|
|
58
58
|
**Slashing**: only `state_mismatch` and `failed_txs` trigger on-chain slashing (`OffenseType.BROADCASTED_INVALID_BLOCK_PROPOSAL`, gated by `slashBroadcastedInvalidBlockPenalty > 0`). Unknown errors during re-execution do NOT slash.
|
|
59
59
|
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
-
import type { BlockProposal, P2PValidator, ValidationResult } from '@aztec/stdlib/p2p';
|
|
2
|
+
import type { BlockProposal, CoordinationSignatureContext, P2PValidator, ValidationResult } from '@aztec/stdlib/p2p';
|
|
3
3
|
|
|
4
4
|
import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
|
|
5
5
|
|
|
6
6
|
export class BlockProposalValidator implements P2PValidator<BlockProposal> {
|
|
7
7
|
private proposalValidator: ProposalValidator;
|
|
8
8
|
|
|
9
|
-
constructor(
|
|
9
|
+
constructor(
|
|
10
|
+
epochCache: EpochCacheInterface,
|
|
11
|
+
opts: {
|
|
12
|
+
txsPermitted: boolean;
|
|
13
|
+
maxTxsPerBlock?: number;
|
|
14
|
+
maxBlocksPerCheckpoint?: number;
|
|
15
|
+
p2pPropagationTime?: number;
|
|
16
|
+
skipSlotValidation?: boolean;
|
|
17
|
+
signatureContext: CoordinationSignatureContext;
|
|
18
|
+
},
|
|
19
|
+
) {
|
|
10
20
|
this.proposalValidator = new ProposalValidator(epochCache, opts, 'p2p:block_proposal_validator');
|
|
11
21
|
}
|
|
12
22
|
|
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
CheckpointProposal,
|
|
4
|
+
CoordinationSignatureContext,
|
|
5
|
+
P2PValidator,
|
|
6
|
+
ValidationResult,
|
|
7
|
+
} from '@aztec/stdlib/p2p';
|
|
3
8
|
|
|
4
9
|
import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
|
|
5
10
|
|
|
6
11
|
export class CheckpointProposalValidator implements P2PValidator<CheckpointProposal> {
|
|
7
12
|
private proposalValidator: ProposalValidator;
|
|
8
13
|
|
|
9
|
-
constructor(
|
|
14
|
+
constructor(
|
|
15
|
+
epochCache: EpochCacheInterface,
|
|
16
|
+
opts: {
|
|
17
|
+
txsPermitted: boolean;
|
|
18
|
+
maxTxsPerBlock?: number;
|
|
19
|
+
maxBlocksPerCheckpoint?: number;
|
|
20
|
+
p2pPropagationTime?: number;
|
|
21
|
+
skipSlotValidation?: boolean;
|
|
22
|
+
signatureContext: CoordinationSignatureContext;
|
|
23
|
+
},
|
|
24
|
+
) {
|
|
10
25
|
this.proposalValidator = new ProposalValidator(epochCache, opts, 'p2p:checkpoint_proposal_validator');
|
|
11
26
|
}
|
|
12
27
|
|