@aztec/p2p 0.0.1-commit.04852196a → 0.0.1-commit.04d373f
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 +4 -3
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +31 -14
- 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 +94 -26
- package/dest/config.d.ts +139 -97
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +70 -5
- 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 +265 -199
- 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 +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/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/invalid_txs_after_reorg_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +10 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +13 -3
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +20 -7
- 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 +3 -0
- 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 +92 -87
- 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 +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 +46 -12
- 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 +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/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 +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.d.ts +21 -1
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +28 -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 +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 +282 -236
- 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 +38 -10
- 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 +83 -38
- 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 +55 -7
- package/src/client/interface.ts +15 -11
- package/src/client/p2p_client.ts +107 -49
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +137 -4
- 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 +316 -241
- 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 +5 -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/invalid_txs_after_reorg_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/interfaces.ts +9 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +31 -9
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +13 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +93 -93
- 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 +12 -2
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +17 -2
- package/src/msg_validators/proposal_validator/proposal_validator.ts +54 -10
- 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 +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 +61 -10
- package/src/msg_validators/tx_validator/gas_validator.ts +121 -39
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +31 -1
- 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 +308 -272
- package/src/services/peer-manager/peer_manager.ts +44 -10
- 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 +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 +53 -28
- package/src/testbench/p2p_client_testbench_worker.ts +87 -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 -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/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/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
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS } from '@aztec/constants';
|
|
2
2
|
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
|
|
4
|
+
import { computeContractClassId } from '@aztec/stdlib/contract';
|
|
3
5
|
import { computeCalldataHash } from '@aztec/stdlib/hash';
|
|
4
6
|
import {
|
|
5
7
|
TX_ERROR_CALLDATA_COUNT_MISMATCH,
|
|
@@ -9,13 +11,17 @@ import {
|
|
|
9
11
|
TX_ERROR_CONTRACT_CLASS_LOG_LENGTH,
|
|
10
12
|
TX_ERROR_CONTRACT_CLASS_LOG_SORTING,
|
|
11
13
|
TX_ERROR_INCORRECT_CALLDATA,
|
|
14
|
+
TX_ERROR_INCORRECT_CONTRACT_CLASS_ID,
|
|
12
15
|
TX_ERROR_INCORRECT_HASH,
|
|
16
|
+
TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG,
|
|
13
17
|
Tx,
|
|
14
18
|
type TxValidationResult,
|
|
15
19
|
type TxValidator,
|
|
16
20
|
} from '@aztec/stdlib/tx';
|
|
17
21
|
|
|
18
22
|
export class DataTxValidator implements TxValidator<Tx> {
|
|
23
|
+
public readonly identifier: symbol = Symbol('DataTxValidator');
|
|
24
|
+
|
|
19
25
|
#log: Logger;
|
|
20
26
|
|
|
21
27
|
constructor(bindings?: LoggerBindings) {
|
|
@@ -26,7 +32,8 @@ export class DataTxValidator implements TxValidator<Tx> {
|
|
|
26
32
|
const reason =
|
|
27
33
|
(await this.#hasCorrectHash(tx)) ??
|
|
28
34
|
(await this.#hasCorrectCalldata(tx)) ??
|
|
29
|
-
(await this.#hasCorrectContractClassLogs(tx))
|
|
35
|
+
(await this.#hasCorrectContractClassLogs(tx)) ??
|
|
36
|
+
(await this.#hasCorrectContractClassIds(tx));
|
|
30
37
|
return reason ? { result: 'invalid', reason: [reason] } : { result: 'valid' };
|
|
31
38
|
}
|
|
32
39
|
|
|
@@ -127,4 +134,40 @@ export class DataTxValidator implements TxValidator<Tx> {
|
|
|
127
134
|
|
|
128
135
|
return undefined;
|
|
129
136
|
}
|
|
137
|
+
|
|
138
|
+
async #hasCorrectContractClassIds(tx: Tx): Promise<string | undefined> {
|
|
139
|
+
const contractClassLogs = tx.getContractClassLogs();
|
|
140
|
+
for (const log of contractClassLogs) {
|
|
141
|
+
if (!ContractClassPublishedEvent.isContractClassPublishedEvent(log)) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
let event;
|
|
146
|
+
try {
|
|
147
|
+
event = ContractClassPublishedEvent.fromLog(log);
|
|
148
|
+
} catch (e) {
|
|
149
|
+
this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to parse contract class event: ${e}`);
|
|
150
|
+
return TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
const { publicBytecodeCommitment } = await event.toContractClassPublicWithBytecodeCommitment();
|
|
155
|
+
const computedClassId = await computeContractClassId({
|
|
156
|
+
artifactHash: event.artifactHash,
|
|
157
|
+
privateFunctionsRoot: event.privateFunctionsRoot,
|
|
158
|
+
publicBytecodeCommitment,
|
|
159
|
+
});
|
|
160
|
+
if (!computedClassId.equals(event.contractClassId)) {
|
|
161
|
+
this.#log.warn(
|
|
162
|
+
`Rejecting tx ${tx.getTxHash()}: contract class id mismatch. Claimed ${event.contractClassId}, computed ${computedClassId}`,
|
|
163
|
+
);
|
|
164
|
+
return TX_ERROR_INCORRECT_CONTRACT_CLASS_ID;
|
|
165
|
+
}
|
|
166
|
+
} catch (e) {
|
|
167
|
+
this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to compute contract class id: ${e}`);
|
|
168
|
+
return TX_ERROR_MALFORMED_CONTRACT_CLASS_LOG;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
130
173
|
}
|
|
@@ -53,16 +53,19 @@ import type { TxMetaData } from '../../mem_pools/tx_pool_v2/tx_metadata.js';
|
|
|
53
53
|
import { AggregateTxValidator } from './aggregate_tx_validator.js';
|
|
54
54
|
import { ArchiveCache } from './archive_cache.js';
|
|
55
55
|
import { type ArchiveSource, BlockHeaderTxValidator } from './block_header_validator.js';
|
|
56
|
+
import { CachedTxValidator } from './cached_tx_validator.js';
|
|
57
|
+
import { ContractInstanceTxValidator } from './contract_instance_validator.js';
|
|
56
58
|
import { DataTxValidator } from './data_validator.js';
|
|
57
59
|
import { DoubleSpendTxValidator, type NullifierSource } from './double_spend_validator.js';
|
|
58
|
-
import { GasLimitsValidator, GasTxValidator } from './gas_validator.js';
|
|
60
|
+
import { GasLimitsValidator, GasTxValidator, MaxFeePerGasValidator } from './gas_validator.js';
|
|
59
61
|
import { MetadataTxValidator } from './metadata_validator.js';
|
|
60
62
|
import { NullifierCache } from './nullifier_cache.js';
|
|
61
|
-
import { PhasesTxValidator } from './phases_validator.js';
|
|
63
|
+
import { AllowedSetupCallsMetaValidator, PhasesTxValidator } from './phases_validator.js';
|
|
62
64
|
import { SizeTxValidator } from './size_validator.js';
|
|
63
65
|
import { TimestampTxValidator } from './timestamp_validator.js';
|
|
64
66
|
import { TxPermittedValidator } from './tx_permitted_validator.js';
|
|
65
67
|
import { TxProofValidator } from './tx_proof_validator.js';
|
|
68
|
+
import { TxValidationCache } from './tx_validation_cache.js';
|
|
66
69
|
|
|
67
70
|
/**
|
|
68
71
|
* A validator paired with a peer penalty severity.
|
|
@@ -97,6 +100,7 @@ export function createFirstStageTxValidationsForGossipedTransactions(
|
|
|
97
100
|
txsPermitted: boolean,
|
|
98
101
|
allowedInSetup: AllowedElement[] = [],
|
|
99
102
|
bindings?: LoggerBindings,
|
|
103
|
+
gasLimitOpts?: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number },
|
|
100
104
|
): Record<string, TransactionValidator> {
|
|
101
105
|
const merkleTree = worldStateSynchronizer.getCommitted();
|
|
102
106
|
|
|
@@ -158,6 +162,7 @@ export function createFirstStageTxValidationsForGossipedTransactions(
|
|
|
158
162
|
ProtocolContractAddress.FeeJuice,
|
|
159
163
|
gasFees,
|
|
160
164
|
bindings,
|
|
165
|
+
gasLimitOpts,
|
|
161
166
|
),
|
|
162
167
|
severity: PeerErrorSeverity.MidToleranceError,
|
|
163
168
|
},
|
|
@@ -165,6 +170,10 @@ export function createFirstStageTxValidationsForGossipedTransactions(
|
|
|
165
170
|
validator: new DataTxValidator(bindings),
|
|
166
171
|
severity: PeerErrorSeverity.MidToleranceError,
|
|
167
172
|
},
|
|
173
|
+
contractInstanceValidator: {
|
|
174
|
+
validator: new ContractInstanceTxValidator(bindings),
|
|
175
|
+
severity: PeerErrorSeverity.MidToleranceError,
|
|
176
|
+
},
|
|
168
177
|
};
|
|
169
178
|
}
|
|
170
179
|
|
|
@@ -203,8 +212,9 @@ function createTxValidatorForMinimumTxIntegrityChecks(
|
|
|
203
212
|
rollupVersion: number;
|
|
204
213
|
},
|
|
205
214
|
bindings?: LoggerBindings,
|
|
215
|
+
cache?: TxValidationCache,
|
|
206
216
|
): TxValidator {
|
|
207
|
-
|
|
217
|
+
const aggregate = new AggregateTxValidator(
|
|
208
218
|
new MetadataTxValidator(
|
|
209
219
|
{
|
|
210
220
|
l1ChainId: new Fr(l1ChainId),
|
|
@@ -215,9 +225,14 @@ function createTxValidatorForMinimumTxIntegrityChecks(
|
|
|
215
225
|
bindings,
|
|
216
226
|
),
|
|
217
227
|
new SizeTxValidator(bindings),
|
|
218
|
-
new DataTxValidator(bindings),
|
|
219
|
-
new
|
|
228
|
+
CachedTxValidator.new(new DataTxValidator(bindings), cache),
|
|
229
|
+
new ContractInstanceTxValidator(bindings),
|
|
230
|
+
CachedTxValidator.new(new TxProofValidator(verifier, bindings), cache),
|
|
220
231
|
);
|
|
232
|
+
|
|
233
|
+
// This validator is not state-dependent so we can cache it.
|
|
234
|
+
const identifier = Symbol('TxValidatorForMinimumTxIntegrityChecks');
|
|
235
|
+
return CachedTxValidator.newWithIdentifier(aggregate, identifier, cache);
|
|
221
236
|
}
|
|
222
237
|
|
|
223
238
|
/**
|
|
@@ -226,7 +241,7 @@ function createTxValidatorForMinimumTxIntegrityChecks(
|
|
|
226
241
|
* are invalid against current state. State-dependent checks happen when the tx
|
|
227
242
|
* enters the pending pool or during block building.
|
|
228
243
|
*/
|
|
229
|
-
export function
|
|
244
|
+
export function createTxValidatorForOnDemandReceivedTxs(
|
|
230
245
|
verifier: ClientProtocolCircuitVerifier,
|
|
231
246
|
{
|
|
232
247
|
l1ChainId,
|
|
@@ -236,8 +251,9 @@ export function createTxValidatorForReqResponseReceivedTxs(
|
|
|
236
251
|
rollupVersion: number;
|
|
237
252
|
},
|
|
238
253
|
bindings?: LoggerBindings,
|
|
254
|
+
cache?: TxValidationCache,
|
|
239
255
|
): TxValidator {
|
|
240
|
-
return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings);
|
|
256
|
+
return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings, cache);
|
|
241
257
|
}
|
|
242
258
|
|
|
243
259
|
/**
|
|
@@ -255,8 +271,9 @@ export function createTxValidatorForBlockProposalReceivedTxs(
|
|
|
255
271
|
rollupVersion: number;
|
|
256
272
|
},
|
|
257
273
|
bindings?: LoggerBindings,
|
|
274
|
+
cache?: TxValidationCache,
|
|
258
275
|
): TxValidator {
|
|
259
|
-
return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings);
|
|
276
|
+
return createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings, cache);
|
|
260
277
|
}
|
|
261
278
|
|
|
262
279
|
/**
|
|
@@ -278,6 +295,9 @@ export function createTxValidatorForAcceptingTxsOverRPC(
|
|
|
278
295
|
timestamp,
|
|
279
296
|
blockNumber,
|
|
280
297
|
txsPermitted,
|
|
298
|
+
rollupManaLimit,
|
|
299
|
+
maxBlockL2Gas,
|
|
300
|
+
maxBlockDAGas,
|
|
281
301
|
}: {
|
|
282
302
|
l1ChainId: number;
|
|
283
303
|
rollupVersion: number;
|
|
@@ -287,6 +307,9 @@ export function createTxValidatorForAcceptingTxsOverRPC(
|
|
|
287
307
|
timestamp: UInt64;
|
|
288
308
|
blockNumber: BlockNumber;
|
|
289
309
|
txsPermitted: boolean;
|
|
310
|
+
rollupManaLimit: number;
|
|
311
|
+
maxBlockL2Gas?: number;
|
|
312
|
+
maxBlockDAGas?: number;
|
|
290
313
|
},
|
|
291
314
|
bindings?: LoggerBindings,
|
|
292
315
|
): TxValidator<Tx> {
|
|
@@ -313,11 +336,16 @@ export function createTxValidatorForAcceptingTxsOverRPC(
|
|
|
313
336
|
new BlockHeaderTxValidator(new ArchiveCache(db), bindings),
|
|
314
337
|
new DoubleSpendTxValidator(new NullifierCache(db), bindings),
|
|
315
338
|
new DataTxValidator(bindings),
|
|
339
|
+
new ContractInstanceTxValidator(bindings),
|
|
316
340
|
];
|
|
317
341
|
|
|
318
342
|
if (!skipFeeEnforcement) {
|
|
319
343
|
validators.push(
|
|
320
|
-
new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees, bindings
|
|
344
|
+
new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees, bindings, {
|
|
345
|
+
rollupManaLimit,
|
|
346
|
+
maxBlockL2Gas,
|
|
347
|
+
maxBlockDAGas,
|
|
348
|
+
}),
|
|
321
349
|
);
|
|
322
350
|
}
|
|
323
351
|
|
|
@@ -403,6 +431,8 @@ export async function createTxValidatorForTransactionsEnteringPendingTxPool(
|
|
|
403
431
|
worldStateSynchronizer: WorldStateSynchronizer,
|
|
404
432
|
timestamp: bigint,
|
|
405
433
|
blockNumber: BlockNumber,
|
|
434
|
+
gasLimitOpts: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number },
|
|
435
|
+
gasFees: GasFees,
|
|
406
436
|
bindings?: LoggerBindings,
|
|
407
437
|
): Promise<TxValidator<TxMetaData>> {
|
|
408
438
|
await worldStateSynchronizer.syncImmediate();
|
|
@@ -419,9 +449,30 @@ export async function createTxValidatorForTransactionsEnteringPendingTxPool(
|
|
|
419
449
|
},
|
|
420
450
|
};
|
|
421
451
|
return new AggregateTxValidator<TxMetaData>(
|
|
422
|
-
new GasLimitsValidator<TxMetaData>(bindings),
|
|
452
|
+
new GasLimitsValidator<TxMetaData>({ ...gasLimitOpts, bindings }),
|
|
453
|
+
new MaxFeePerGasValidator<TxMetaData>(gasFees, bindings),
|
|
423
454
|
new TimestampTxValidator<TxMetaData>({ timestamp, blockNumber }, bindings),
|
|
424
455
|
new DoubleSpendTxValidator<TxMetaData>(nullifierSource, bindings),
|
|
425
456
|
new BlockHeaderTxValidator<TxMetaData>(archiveSource, bindings),
|
|
457
|
+
new AllowedSetupCallsMetaValidator<TxMetaData>(bindings),
|
|
426
458
|
);
|
|
427
459
|
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Creates a function that checks whether a tx's setup-phase calls are on the allow list.
|
|
463
|
+
*
|
|
464
|
+
* Uses the `PhasesTxValidator` on the full Tx. The result is stored as a boolean
|
|
465
|
+
* flag in `TxMetaData.allowedSetupCalls` at receipt time, so the pending pool
|
|
466
|
+
* migration validator can check it without needing the full Tx or its dependencies.
|
|
467
|
+
*/
|
|
468
|
+
export function createCheckAllowedSetupCalls(
|
|
469
|
+
contractDataSource: ContractDataSource,
|
|
470
|
+
setupAllowList: AllowedElement[],
|
|
471
|
+
getTimestamp: () => UInt64,
|
|
472
|
+
): (tx: Tx) => Promise<boolean> {
|
|
473
|
+
return async (tx: Tx) => {
|
|
474
|
+
const validator = new PhasesTxValidator(contractDataSource, setupAllowList, getTimestamp());
|
|
475
|
+
const result = await validator.validateTx(tx);
|
|
476
|
+
return result.result === 'valid';
|
|
477
|
+
};
|
|
478
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT,
|
|
2
3
|
MAX_PROCESSABLE_L2_GAS,
|
|
3
4
|
PRIVATE_TX_L2_GAS_OVERHEAD,
|
|
4
5
|
PUBLIC_TX_L2_GAS_OVERHEAD,
|
|
@@ -35,6 +36,18 @@ export interface HasGasLimitData {
|
|
|
35
36
|
};
|
|
36
37
|
}
|
|
37
38
|
|
|
39
|
+
/** Structural interface for types that carry max fee per gas data, used by {@link MaxFeePerGasValidator}. */
|
|
40
|
+
export interface HasMaxFeePerGasData {
|
|
41
|
+
txHash: { toString(): string };
|
|
42
|
+
data: {
|
|
43
|
+
constants: {
|
|
44
|
+
txContext: {
|
|
45
|
+
gasSettings: { maxFeesPerGas: GasFees };
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
38
51
|
/**
|
|
39
52
|
* Validates that a transaction's gas limits are within acceptable bounds.
|
|
40
53
|
*
|
|
@@ -49,16 +62,31 @@ export interface HasGasLimitData {
|
|
|
49
62
|
*/
|
|
50
63
|
export class GasLimitsValidator<T extends HasGasLimitData> implements TxValidator<T> {
|
|
51
64
|
#log: Logger;
|
|
65
|
+
#effectiveMaxL2Gas: number;
|
|
66
|
+
#effectiveMaxDAGas: number;
|
|
67
|
+
#rollupManaLimit: number;
|
|
68
|
+
#maxBlockL2Gas: number;
|
|
69
|
+
#maxBlockDAGas: number;
|
|
52
70
|
|
|
53
|
-
constructor(
|
|
54
|
-
|
|
71
|
+
constructor(opts?: {
|
|
72
|
+
rollupManaLimit?: number;
|
|
73
|
+
maxBlockL2Gas?: number;
|
|
74
|
+
maxBlockDAGas?: number;
|
|
75
|
+
bindings?: LoggerBindings;
|
|
76
|
+
}) {
|
|
77
|
+
this.#log = createLogger('sequencer:tx_validator:tx_gas', opts?.bindings);
|
|
78
|
+
this.#rollupManaLimit = opts?.rollupManaLimit ?? Infinity;
|
|
79
|
+
this.#maxBlockL2Gas = opts?.maxBlockL2Gas ?? Infinity;
|
|
80
|
+
this.#maxBlockDAGas = opts?.maxBlockDAGas ?? Infinity;
|
|
81
|
+
this.#effectiveMaxL2Gas = Math.min(MAX_PROCESSABLE_L2_GAS, this.#rollupManaLimit, this.#maxBlockL2Gas);
|
|
82
|
+
this.#effectiveMaxDAGas = Math.min(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, this.#maxBlockDAGas);
|
|
55
83
|
}
|
|
56
84
|
|
|
57
85
|
validateTx(tx: T): Promise<TxValidationResult> {
|
|
58
86
|
return Promise.resolve(this.validateGasLimit(tx));
|
|
59
87
|
}
|
|
60
88
|
|
|
61
|
-
/** Checks gas limits are >= fixed minimums and <=
|
|
89
|
+
/** Checks gas limits are >= fixed minimums and <= effective max gas (L2 and DA). */
|
|
62
90
|
validateGasLimit(tx: T): TxValidationResult {
|
|
63
91
|
const gasLimits = tx.data.constants.txContext.gasSettings.gasLimits;
|
|
64
92
|
const minGasLimits = new Gas(
|
|
@@ -71,30 +99,97 @@ export class GasLimitsValidator<T extends HasGasLimitData> implements TxValidato
|
|
|
71
99
|
gasLimits,
|
|
72
100
|
minGasLimits,
|
|
73
101
|
});
|
|
74
|
-
return {
|
|
102
|
+
return {
|
|
103
|
+
result: 'invalid',
|
|
104
|
+
reason: [
|
|
105
|
+
`${TX_ERROR_INSUFFICIENT_GAS_LIMIT} (required=da:${minGasLimits.daGas},l2:${minGasLimits.l2Gas} got=da:${gasLimits.daGas},l2:${gasLimits.l2Gas})`,
|
|
106
|
+
],
|
|
107
|
+
};
|
|
75
108
|
}
|
|
76
109
|
|
|
77
|
-
if (gasLimits.l2Gas >
|
|
78
|
-
this.#log.verbose(`Rejecting transaction due to the gas limit
|
|
110
|
+
if (gasLimits.l2Gas > this.#effectiveMaxL2Gas) {
|
|
111
|
+
this.#log.verbose(`Rejecting transaction due to the L2 gas limit being higher than the effective maximum`, {
|
|
79
112
|
gasLimits,
|
|
80
|
-
|
|
113
|
+
effectiveMaxL2Gas: this.#effectiveMaxL2Gas,
|
|
114
|
+
rollupManaLimit: this.#rollupManaLimit,
|
|
115
|
+
maxBlockL2Gas: this.#maxBlockL2Gas,
|
|
116
|
+
});
|
|
117
|
+
return {
|
|
118
|
+
result: 'invalid',
|
|
119
|
+
reason: [`${TX_ERROR_GAS_LIMIT_TOO_HIGH} (l2Gas=${gasLimits.l2Gas}, max=${this.#effectiveMaxL2Gas})`],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (gasLimits.daGas > this.#effectiveMaxDAGas) {
|
|
124
|
+
this.#log.verbose(`Rejecting transaction due to the DA gas limit being higher than the effective maximum`, {
|
|
125
|
+
gasLimits,
|
|
126
|
+
effectiveMaxDAGas: this.#effectiveMaxDAGas,
|
|
127
|
+
maxBlockDAGas: this.#maxBlockDAGas,
|
|
81
128
|
});
|
|
82
|
-
return {
|
|
129
|
+
return {
|
|
130
|
+
result: 'invalid',
|
|
131
|
+
reason: [`${TX_ERROR_GAS_LIMIT_TOO_HIGH} (daGas=${gasLimits.daGas}, max=${this.#effectiveMaxDAGas})`],
|
|
132
|
+
};
|
|
83
133
|
}
|
|
84
134
|
|
|
85
135
|
return { result: 'valid' };
|
|
86
136
|
}
|
|
87
137
|
}
|
|
88
138
|
|
|
139
|
+
/**
|
|
140
|
+
* Validates that a transaction's max fee per gas meets the current block's gas fees.
|
|
141
|
+
*
|
|
142
|
+
* Rejects transactions whose maxFeesPerGas is below the current block's gas fees
|
|
143
|
+
* on either dimension (DA or L2). This is a cheap, stateless check.
|
|
144
|
+
*
|
|
145
|
+
* Generic over T so it can validate both full {@link Tx} objects and {@link TxMetaData}
|
|
146
|
+
* (used during pending pool migration).
|
|
147
|
+
*
|
|
148
|
+
* Used by: pending pool migration (via factory), and indirectly by {@link GasTxValidator}.
|
|
149
|
+
*/
|
|
150
|
+
export class MaxFeePerGasValidator<T extends HasMaxFeePerGasData> implements TxValidator<T> {
|
|
151
|
+
#log: Logger;
|
|
152
|
+
#gasFees: GasFees;
|
|
153
|
+
|
|
154
|
+
constructor(gasFees: GasFees, bindings?: LoggerBindings) {
|
|
155
|
+
this.#log = createLogger('sequencer:tx_validator:tx_gas', bindings);
|
|
156
|
+
this.#gasFees = gasFees;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
validateTx(tx: T): Promise<TxValidationResult> {
|
|
160
|
+
return Promise.resolve(this.validateMaxFeePerGas(tx));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Checks maxFeesPerGas >= current block gas fees on both dimensions. */
|
|
164
|
+
validateMaxFeePerGas(tx: T): TxValidationResult {
|
|
165
|
+
const maxFeesPerGas = tx.data.constants.txContext.gasSettings.maxFeesPerGas;
|
|
166
|
+
const notEnoughMaxFees =
|
|
167
|
+
maxFeesPerGas.feePerDaGas < this.#gasFees.feePerDaGas || maxFeesPerGas.feePerL2Gas < this.#gasFees.feePerL2Gas;
|
|
168
|
+
|
|
169
|
+
if (notEnoughMaxFees) {
|
|
170
|
+
this.#log.verbose(`Rejecting transaction ${tx.txHash.toString()} due to insufficient fee per gas`, {
|
|
171
|
+
txMaxFeesPerGas: maxFeesPerGas.toInspect(),
|
|
172
|
+
currentGasFees: this.#gasFees.toInspect(),
|
|
173
|
+
});
|
|
174
|
+
return {
|
|
175
|
+
result: 'invalid',
|
|
176
|
+
reason: [
|
|
177
|
+
`${TX_ERROR_INSUFFICIENT_FEE_PER_GAS} (maxFee=da:${maxFeesPerGas.feePerDaGas},l2:${maxFeesPerGas.feePerL2Gas} required=da:${this.#gasFees.feePerDaGas},l2:${this.#gasFees.feePerL2Gas})`,
|
|
178
|
+
],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return { result: 'valid' };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
89
185
|
/**
|
|
90
186
|
* Validates that a transaction can pay its gas fees.
|
|
91
187
|
*
|
|
92
188
|
* Runs three checks in order:
|
|
93
189
|
* 1. **Gas limits** (delegates to {@link GasLimitsValidator}) — rejects if limits are
|
|
94
190
|
* out of bounds.
|
|
95
|
-
* 2. **Max fee per gas** —
|
|
96
|
-
* the current block's gas fees.
|
|
97
|
-
* become eligible in a later block with lower fees.
|
|
191
|
+
* 2. **Max fee per gas** — rejects the tx if its maxFeesPerGas is below
|
|
192
|
+
* the current block's gas fees.
|
|
98
193
|
* 3. **Fee payer balance** — reads the fee payer's FeeJuice balance from public state,
|
|
99
194
|
* adds any pending claim from a setup-phase `_increase_public_balance` call, and
|
|
100
195
|
* rejects if the total is less than the tx's fee limit (gasLimits * maxFeePerGas).
|
|
@@ -106,53 +201,37 @@ export class GasTxValidator implements TxValidator<Tx> {
|
|
|
106
201
|
#publicDataSource: PublicStateSource;
|
|
107
202
|
#feeJuiceAddress: AztecAddress;
|
|
108
203
|
#gasFees: GasFees;
|
|
204
|
+
#gasLimitOpts?: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number };
|
|
109
205
|
|
|
110
206
|
constructor(
|
|
111
207
|
publicDataSource: PublicStateSource,
|
|
112
208
|
feeJuiceAddress: AztecAddress,
|
|
113
209
|
gasFees: GasFees,
|
|
114
210
|
private bindings?: LoggerBindings,
|
|
211
|
+
opts?: { rollupManaLimit?: number; maxBlockL2Gas?: number; maxBlockDAGas?: number },
|
|
115
212
|
) {
|
|
116
213
|
this.#log = createLogger('sequencer:tx_validator:tx_gas', bindings);
|
|
117
214
|
this.#publicDataSource = publicDataSource;
|
|
118
215
|
this.#feeJuiceAddress = feeJuiceAddress;
|
|
119
216
|
this.#gasFees = gasFees;
|
|
217
|
+
this.#gasLimitOpts = opts;
|
|
120
218
|
}
|
|
121
219
|
|
|
122
220
|
async validateTx(tx: Tx): Promise<TxValidationResult> {
|
|
123
|
-
const gasLimitValidation = new GasLimitsValidator(
|
|
221
|
+
const gasLimitValidation = new GasLimitsValidator({
|
|
222
|
+
...this.#gasLimitOpts,
|
|
223
|
+
bindings: this.bindings,
|
|
224
|
+
}).validateGasLimit(tx);
|
|
124
225
|
if (gasLimitValidation.result === 'invalid') {
|
|
125
|
-
return
|
|
226
|
+
return gasLimitValidation;
|
|
126
227
|
}
|
|
127
|
-
|
|
128
|
-
|
|
228
|
+
const maxFeeValidation = new MaxFeePerGasValidator(this.#gasFees, this.bindings).validateMaxFeePerGas(tx);
|
|
229
|
+
if (maxFeeValidation.result === 'invalid') {
|
|
230
|
+
return maxFeeValidation;
|
|
129
231
|
}
|
|
130
232
|
return await this.validateTxFee(tx);
|
|
131
233
|
}
|
|
132
234
|
|
|
133
|
-
/**
|
|
134
|
-
* Check whether the tx's max fees are valid for the current block, and skip if not.
|
|
135
|
-
* We skip instead of invalidating since the tx may become eligible later.
|
|
136
|
-
* Note that circuits check max fees even if fee payer is unset, so we
|
|
137
|
-
* keep this validation even if the tx does not pay fees.
|
|
138
|
-
*/
|
|
139
|
-
#shouldSkip(tx: Tx): boolean {
|
|
140
|
-
const gasSettings = tx.data.constants.txContext.gasSettings;
|
|
141
|
-
|
|
142
|
-
// Skip the tx if its max fees are not enough for the current block's gas fees.
|
|
143
|
-
const maxFeesPerGas = gasSettings.maxFeesPerGas;
|
|
144
|
-
const notEnoughMaxFees =
|
|
145
|
-
maxFeesPerGas.feePerDaGas < this.#gasFees.feePerDaGas || maxFeesPerGas.feePerL2Gas < this.#gasFees.feePerL2Gas;
|
|
146
|
-
|
|
147
|
-
if (notEnoughMaxFees) {
|
|
148
|
-
this.#log.verbose(`Skipping transaction ${tx.getTxHash().toString()} due to insufficient fee per gas`, {
|
|
149
|
-
txMaxFeesPerGas: maxFeesPerGas.toInspect(),
|
|
150
|
-
currentGasFees: this.#gasFees.toInspect(),
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
return notEnoughMaxFees;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
235
|
/**
|
|
157
236
|
* Checks the fee payer has enough FeeJuice balance to cover the tx's fee limit.
|
|
158
237
|
* Accounts for any pending claim from a setup-phase `_increase_public_balance` call.
|
|
@@ -179,7 +258,10 @@ export class GasTxValidator implements TxValidator<Tx> {
|
|
|
179
258
|
balance,
|
|
180
259
|
feeLimit,
|
|
181
260
|
});
|
|
182
|
-
return {
|
|
261
|
+
return {
|
|
262
|
+
result: 'invalid',
|
|
263
|
+
reason: [`${TX_ERROR_INSUFFICIENT_FEE_PAYER_BALANCE} (required=${feeLimit}, available=${balance})`],
|
|
264
|
+
};
|
|
183
265
|
}
|
|
184
266
|
return { result: 'valid' };
|
|
185
267
|
}
|
|
@@ -40,7 +40,7 @@ export class PhasesTxValidator implements TxValidator<Tx> {
|
|
|
40
40
|
// which are needed for public FPC flows, but fail if the account contract hasnt been deployed yet,
|
|
41
41
|
// which is what we're trying to do as part of the current txs.
|
|
42
42
|
// We only need to create/revert checkpoint here because of this addNewContracts call.
|
|
43
|
-
|
|
43
|
+
this.contractsDB.addNewContracts(tx);
|
|
44
44
|
|
|
45
45
|
if (!tx.data.forPublic) {
|
|
46
46
|
this.#log.debug(
|
|
@@ -141,3 +141,33 @@ export class PhasesTxValidator implements TxValidator<Tx> {
|
|
|
141
141
|
return TX_ERROR_SETUP_FUNCTION_NOT_ALLOWED;
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
|
+
|
|
145
|
+
/** Structural interface for the allowed-setup-calls flag check. */
|
|
146
|
+
export interface HasAllowedSetupCallsData {
|
|
147
|
+
txHash: { toString(): string };
|
|
148
|
+
allowedSetupCalls: boolean;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Validates that a transaction's setup-phase calls were allowed at receipt time.
|
|
153
|
+
*
|
|
154
|
+
* Checks the precomputed `allowedSetupCalls` flag on TxMetaData. The flag is
|
|
155
|
+
* computed by running the PhasesTxValidator on the full Tx when it first enters
|
|
156
|
+
* the pool. This lightweight validator is used during pending pool migration to
|
|
157
|
+
* reject txs whose setup calls are not on the allow list.
|
|
158
|
+
*/
|
|
159
|
+
export class AllowedSetupCallsMetaValidator<T extends HasAllowedSetupCallsData> implements TxValidator<T> {
|
|
160
|
+
#log: Logger;
|
|
161
|
+
|
|
162
|
+
constructor(bindings?: LoggerBindings) {
|
|
163
|
+
this.#log = createLogger('sequencer:tx_validator:tx_phases_meta', bindings);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
validateTx(tx: T): Promise<TxValidationResult> {
|
|
167
|
+
if (!tx.allowedSetupCalls) {
|
|
168
|
+
this.#log.verbose(`Rejecting tx ${tx.txHash} because its setup calls are not on the allow list`);
|
|
169
|
+
return Promise.resolve({ result: 'invalid', reason: [TX_ERROR_SETUP_FUNCTION_NOT_ALLOWED] });
|
|
170
|
+
}
|
|
171
|
+
return Promise.resolve({ result: 'valid' });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -3,6 +3,8 @@ import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/ser
|
|
|
3
3
|
import { TX_ERROR_INVALID_PROOF, Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
4
4
|
|
|
5
5
|
export class TxProofValidator implements TxValidator<Tx> {
|
|
6
|
+
public readonly identifier: symbol = Symbol('TxProofValidator');
|
|
7
|
+
|
|
6
8
|
#log: Logger;
|
|
7
9
|
|
|
8
10
|
constructor(
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { LruMap } from '@aztec/foundation/collection';
|
|
2
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import type { Tx, TxValidationResult } from '@aztec/stdlib/tx';
|
|
4
|
+
|
|
5
|
+
import { webcrypto } from 'node:crypto';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Minimal interface consumed by {@link CachedTxValidator}.
|
|
9
|
+
* Keeping the dependency on an interface lets callers (and tests) substitute any cache implementation.
|
|
10
|
+
*/
|
|
11
|
+
export interface ITxValidationCache {
|
|
12
|
+
/** Returns the cached promise if present, otherwise calls `validate`, caches its promise, and returns it. */
|
|
13
|
+
getOrValidate(
|
|
14
|
+
validatorSymbol: symbol,
|
|
15
|
+
tx: Tx,
|
|
16
|
+
validate: () => Promise<TxValidationResult>,
|
|
17
|
+
): Promise<TxValidationResult>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Caches per-validator tx validation results to avoid redundant work across repeated validation calls.
|
|
22
|
+
*
|
|
23
|
+
* The cache key is composed from the validator symbol and tx hash, ensuring results are
|
|
24
|
+
* scoped to the specific validator that produced them.
|
|
25
|
+
*
|
|
26
|
+
* Promises are stored before they are awaited, so concurrent calls for the same pair share
|
|
27
|
+
* a single in-flight validation rather than launching duplicate work.
|
|
28
|
+
*
|
|
29
|
+
* Entries are evicted in least-recently-used order once the cache reaches `maxSize`.
|
|
30
|
+
*/
|
|
31
|
+
export class TxValidationCache implements ITxValidationCache {
|
|
32
|
+
#log: Logger;
|
|
33
|
+
|
|
34
|
+
private readonly entries: LruMap<string, Promise<TxValidationResult>>;
|
|
35
|
+
// Remember hashes for known Tx object references to skip rehashing on subsequent lookups.
|
|
36
|
+
// WeakMap holds keys weakly, so an entry doesn't keep the Tx alive once nothing else references it.
|
|
37
|
+
private readonly txHashesCache: WeakMap<Tx, string> = new WeakMap();
|
|
38
|
+
|
|
39
|
+
constructor(maxSize: number) {
|
|
40
|
+
this.entries = new LruMap(maxSize);
|
|
41
|
+
this.#log = createLogger('p2p:tx_validation_cache');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Computes the cache key scoping a validation result to a specific validator and tx.
|
|
46
|
+
*
|
|
47
|
+
* @param validatorSymbol - The symbol of the validator.
|
|
48
|
+
* @param tx - The tx to compute the key for.
|
|
49
|
+
* @returns The cache key.
|
|
50
|
+
*
|
|
51
|
+
* Note: the key should NOT use the tx.hash because it can't be trusted at this point.
|
|
52
|
+
*/
|
|
53
|
+
public async key(validatorSymbol: symbol, tx: Tx): Promise<string> {
|
|
54
|
+
// Hashing the whole tx takes a few milliseconds. So if we have already hashed
|
|
55
|
+
// this particular object, we avoid rehashing it.
|
|
56
|
+
let hash = this.txHashesCache.get(tx);
|
|
57
|
+
if (hash === undefined) {
|
|
58
|
+
hash = Buffer.from(await webcrypto.subtle.digest('SHA-256', tx.toBuffer())).toString('hex');
|
|
59
|
+
this.txHashesCache.set(tx, hash);
|
|
60
|
+
}
|
|
61
|
+
return `${Symbol.keyFor(validatorSymbol) ?? validatorSymbol.toString()}:${hash}`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Returns the cached promise for the given key, or undefined if not cached. Refreshes recency. */
|
|
65
|
+
public get(key: string): Promise<TxValidationResult> | undefined {
|
|
66
|
+
return this.entries.get(key);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Stores a validation promise under the given key, evicting the LRU entry if at capacity. */
|
|
70
|
+
public set(key: string, result: Promise<TxValidationResult>): void {
|
|
71
|
+
this.entries.set(key, result);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Removes the cached validation promise for the given key. */
|
|
75
|
+
public delete(key: string): void {
|
|
76
|
+
this.entries.delete(key);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Returns the cached promise if present, otherwise calls `validate`, stores its promise
|
|
81
|
+
* immediately (before awaiting), and returns it.
|
|
82
|
+
*/
|
|
83
|
+
public async getOrValidate(
|
|
84
|
+
validatorSymbol: symbol,
|
|
85
|
+
tx: Tx,
|
|
86
|
+
validate: () => Promise<TxValidationResult>,
|
|
87
|
+
): Promise<TxValidationResult> {
|
|
88
|
+
const key = await this.key(validatorSymbol, tx);
|
|
89
|
+
const cached = this.get(key);
|
|
90
|
+
if (cached !== undefined) {
|
|
91
|
+
this.#log.debug('Returning cached tx validation result', {
|
|
92
|
+
validator: validatorSymbol.toString(),
|
|
93
|
+
txHash: tx.txHash.toString(),
|
|
94
|
+
key: key,
|
|
95
|
+
});
|
|
96
|
+
return cached;
|
|
97
|
+
}
|
|
98
|
+
const promise = validate();
|
|
99
|
+
this.set(key, promise);
|
|
100
|
+
return promise;
|
|
101
|
+
}
|
|
102
|
+
}
|