@aztec/p2p 0.0.1-commit.e6bd8901 → 0.0.1-commit.ec5f612
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +4 -4
- package/dest/client/factory.d.ts +10 -10
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +45 -18
- package/dest/client/interface.d.ts +46 -33
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +41 -51
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +156 -200
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +304 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +35 -7
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +21 -7
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -88
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +353 -87
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +2 -2
- package/dest/mem_pools/index.d.ts +3 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/index.js +1 -1
- package/dest/mem_pools/instrumentation.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +2 -2
- package/dest/mem_pools/interface.d.ts +5 -5
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +97 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +211 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +119 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +193 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +354 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +905 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -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 +7 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.js +5 -5
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +4 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
- package/dest/msg_validators/tx_validator/factory.d.ts +118 -5
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +228 -57
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +59 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +76 -38
- package/dest/msg_validators/tx_validator/index.d.ts +2 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/size_validator.js +4 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +22 -5
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +10 -6
- package/dest/services/discv5/discV5_service.js +1 -1
- package/dest/services/dummy_service.d.ts +24 -4
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +46 -1
- package/dest/services/encoding.d.ts +3 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +11 -10
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +173 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +346 -0
- package/dest/services/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/instrumentation.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -3
- package/dest/services/libp2p/libp2p_service.d.ts +100 -42
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +451 -359
- package/dest/services/peer-manager/metrics.d.ts +2 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +20 -5
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +33 -4
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +48 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +539 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +46 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +34 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +130 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +60 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +173 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/interface.d.ts +12 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +15 -1
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -5
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +27 -9
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -6
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +59 -13
- package/dest/services/reqresp/protocols/tx.d.ts +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/reqresp.d.ts +6 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +71 -27
- package/dest/services/service.d.ts +42 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +22 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +55 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +7 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +71 -44
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +90 -0
- package/dest/services/tx_collection/index.d.ts +3 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +2 -0
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +10 -2
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +60 -26
- package/dest/services/tx_collection/tx_collection.d.ts +25 -12
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +79 -7
- package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +26 -29
- package/dest/services/tx_collection/tx_source.d.ts +8 -3
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +19 -2
- package/dest/services/tx_file_store/config.d.ts +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +152 -0
- package/dest/services/tx_provider.d.ts +4 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +9 -8
- package/dest/services/tx_provider_instrumentation.d.ts +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +5 -5
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +1 -2
- package/dest/test-helpers/mock-pubsub.d.ts +30 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +105 -4
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +4 -3
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +163 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +366 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +219 -138
- package/dest/testbench/worker_client_manager.d.ts +51 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +226 -44
- package/dest/util.d.ts +2 -2
- package/dest/util.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +83 -36
- package/src/client/interface.ts +56 -34
- package/src/client/p2p_client.ts +192 -247
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +345 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +47 -11
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +496 -91
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +442 -102
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +2 -1
- package/src/mem_pools/index.ts +4 -1
- package/src/mem_pools/instrumentation.ts +2 -1
- package/src/mem_pools/interface.ts +4 -4
- package/src/mem_pools/tx_pool/README.md +1 -1
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/README.md +275 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +297 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1083 -0
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +10 -4
- package/src/msg_validators/proposal_validator/proposal_validator.ts +5 -5
- package/src/msg_validators/tx_validator/README.md +115 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
- package/src/msg_validators/tx_validator/data_validator.ts +6 -2
- package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
- package/src/msg_validators/tx_validator/factory.ts +372 -55
- package/src/msg_validators/tx_validator/gas_validator.ts +98 -29
- package/src/msg_validators/tx_validator/index.ts +1 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
- package/src/msg_validators/tx_validator/size_validator.ts +6 -2
- package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +1 -1
- package/src/services/dummy_service.ts +59 -2
- package/src/services/encoding.ts +9 -9
- package/src/services/gossipsub/README.md +641 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +487 -0
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +15 -2
- package/src/services/libp2p/libp2p_service.ts +496 -397
- package/src/services/peer-manager/metrics.ts +21 -4
- package/src/services/peer-manager/peer_scoring.ts +29 -1
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +678 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +53 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +161 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +244 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
- package/src/services/reqresp/interface.ts +29 -1
- package/src/services/reqresp/metrics.ts +34 -9
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
- package/src/services/reqresp/protocols/tx.ts +22 -0
- package/src/services/reqresp/reqresp.ts +82 -23
- package/src/services/service.ts +55 -2
- package/src/services/tx_collection/config.ts +83 -1
- package/src/services/tx_collection/fast_tx_collection.ts +93 -47
- package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
- package/src/services/tx_collection/file_store_tx_source.ts +117 -0
- package/src/services/tx_collection/index.ts +6 -0
- package/src/services/tx_collection/instrumentation.ts +17 -2
- package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
- package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
- package/src/services/tx_collection/slow_tx_collection.ts +66 -33
- package/src/services/tx_collection/tx_collection.ts +117 -20
- package/src/services/tx_collection/tx_collection_sink.ts +30 -34
- package/src/services/tx_collection/tx_source.ts +22 -3
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +175 -0
- package/src/services/tx_provider.ts +10 -9
- package/src/services/tx_provider_instrumentation.ts +11 -5
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/make-test-p2p-clients.ts +3 -5
- package/src/test-helpers/mock-pubsub.ts +146 -9
- package/src/test-helpers/reqresp-nodes.ts +4 -6
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +430 -0
- package/src/testbench/p2p_client_testbench_worker.ts +333 -131
- package/src/testbench/worker_client_manager.ts +304 -47
- package/src/util.ts +7 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -40
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -218
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -31
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -180
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -320
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -264
|
@@ -1,74 +1,245 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Transaction validator factories for each tx entry point.
|
|
3
|
+
*
|
|
4
|
+
* Unsolicited transactions (gossip and RPC) are fully validated before acceptance.
|
|
5
|
+
* Transactions received via req/resp or block proposals are only checked for
|
|
6
|
+
* well-formedness because we must include them for block re-execution — they may
|
|
7
|
+
* ultimately be invalid, which is caught during block building and reported as
|
|
8
|
+
* part of block validation/attestation. See the README in this directory for the
|
|
9
|
+
* full validation strategy.
|
|
10
|
+
*
|
|
11
|
+
* 1. **Gossip** — full validation in two stages with a pool pre-check in between.
|
|
12
|
+
* Stage 1 (fast): metadata, data, timestamps, double-spend, gas, phases, block header.
|
|
13
|
+
* Pool pre-check: `canAddPendingTx` — skips proof verification if pool would reject.
|
|
14
|
+
* Stage 2 (slow): proof verification.
|
|
15
|
+
* Orchestrated by `handleGossipedTx` in `libp2p_service.ts`.
|
|
16
|
+
*
|
|
17
|
+
* 2. **JSON-RPC** — full validation including all state-dependent checks.
|
|
18
|
+
* Proof verification and fee enforcement are configurable for testing purposes.
|
|
19
|
+
*
|
|
20
|
+
* 3. **Req/resp & block proposals** — well-formedness checks only (metadata, size,
|
|
21
|
+
* data, proof). Stored for re-execution; validity against state is not checked here.
|
|
22
|
+
*
|
|
23
|
+
* 4. **Block building** — re-validates against current state immediately before
|
|
24
|
+
* sequencing. Catches invalid txs that entered via req/resp or block proposals.
|
|
25
|
+
* Proof and data checks are skipped since they were verified on entry.
|
|
26
|
+
*
|
|
27
|
+
* 5. **Pending pool migration** — when unmined txs (e.g. from req/resp or block
|
|
28
|
+
* proposals) are migrated to the pending pool, the pool runs the state-dependent
|
|
29
|
+
* checks they missed: double-spend, block header, gas limits, and timestamps.
|
|
30
|
+
* This runs on every tx potentially entering the pending pool.
|
|
31
|
+
*/ import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
32
|
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
3
|
-
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
33
|
+
import { ProtocolContractAddress, protocolContractsHash } from '@aztec/protocol-contracts';
|
|
4
34
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
5
35
|
import { DatabasePublicStateSource, MerkleTreeId } from '@aztec/stdlib/trees';
|
|
36
|
+
import { AggregateTxValidator } from './aggregate_tx_validator.js';
|
|
6
37
|
import { ArchiveCache } from './archive_cache.js';
|
|
7
38
|
import { BlockHeaderTxValidator } from './block_header_validator.js';
|
|
8
39
|
import { DataTxValidator } from './data_validator.js';
|
|
9
40
|
import { DoubleSpendTxValidator } from './double_spend_validator.js';
|
|
10
|
-
import { GasTxValidator } from './gas_validator.js';
|
|
41
|
+
import { GasLimitsValidator, GasTxValidator } from './gas_validator.js';
|
|
11
42
|
import { MetadataTxValidator } from './metadata_validator.js';
|
|
43
|
+
import { NullifierCache } from './nullifier_cache.js';
|
|
12
44
|
import { PhasesTxValidator } from './phases_validator.js';
|
|
45
|
+
import { SizeTxValidator } from './size_validator.js';
|
|
13
46
|
import { TimestampTxValidator } from './timestamp_validator.js';
|
|
14
47
|
import { TxPermittedValidator } from './tx_permitted_validator.js';
|
|
15
48
|
import { TxProofValidator } from './tx_proof_validator.js';
|
|
16
|
-
|
|
49
|
+
/**
|
|
50
|
+
* First stage of gossip validation — fast checks run before the pool pre-check.
|
|
51
|
+
*
|
|
52
|
+
* If any validator fails, the peer is penalized and the tx is rejected immediately,
|
|
53
|
+
* without consulting the pool or running proof verification.
|
|
54
|
+
*
|
|
55
|
+
* The `doubleSpendValidator` failure is special-cased by the caller (`handleGossipedTx`)
|
|
56
|
+
* to determine severity based on how recently the nullifier appeared.
|
|
57
|
+
*/ export function createFirstStageTxValidationsForGossipedTransactions(timestamp, blockNumber, worldStateSynchronizer, gasFees, l1ChainId, rollupVersion, protocolContractsHash, contractDataSource, txsPermitted, allowedInSetup = [], bindings) {
|
|
17
58
|
const merkleTree = worldStateSynchronizer.getCommitted();
|
|
18
|
-
return
|
|
19
|
-
{
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
validator: new DataTxValidator(),
|
|
26
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
27
|
-
},
|
|
28
|
-
metadataValidator: {
|
|
29
|
-
validator: new MetadataTxValidator({
|
|
30
|
-
l1ChainId: new Fr(l1ChainId),
|
|
31
|
-
rollupVersion: new Fr(rollupVersion),
|
|
32
|
-
protocolContractsHash,
|
|
33
|
-
vkTreeRoot: getVKTreeRoot()
|
|
34
|
-
}),
|
|
35
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
36
|
-
},
|
|
37
|
-
timestampValidator: {
|
|
38
|
-
validator: new TimestampTxValidator({
|
|
39
|
-
timestamp,
|
|
40
|
-
blockNumber
|
|
41
|
-
}),
|
|
42
|
-
severity: PeerErrorSeverity.MidToleranceError
|
|
43
|
-
},
|
|
44
|
-
doubleSpendValidator: {
|
|
45
|
-
validator: new DoubleSpendTxValidator({
|
|
46
|
-
nullifiersExist: async (nullifiers)=>{
|
|
47
|
-
const merkleTree = worldStateSynchronizer.getCommitted();
|
|
48
|
-
const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
|
|
49
|
-
return indices.map((index)=>index !== undefined);
|
|
50
|
-
}
|
|
51
|
-
}),
|
|
52
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
53
|
-
},
|
|
54
|
-
gasValidator: {
|
|
55
|
-
validator: new GasTxValidator(new DatabasePublicStateSource(merkleTree), ProtocolContractAddress.FeeJuice, gasFees),
|
|
56
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
57
|
-
},
|
|
58
|
-
phasesValidator: {
|
|
59
|
-
validator: new PhasesTxValidator(contractDataSource, allowedInSetup, timestamp),
|
|
60
|
-
severity: PeerErrorSeverity.MidToleranceError
|
|
61
|
-
},
|
|
62
|
-
blockHeaderValidator: {
|
|
63
|
-
validator: new BlockHeaderTxValidator(new ArchiveCache(merkleTree)),
|
|
64
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
65
|
-
}
|
|
59
|
+
return {
|
|
60
|
+
timestampValidator: {
|
|
61
|
+
validator: new TimestampTxValidator({
|
|
62
|
+
timestamp,
|
|
63
|
+
blockNumber
|
|
64
|
+
}, bindings),
|
|
65
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
66
66
|
},
|
|
67
|
-
{
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
txsPermittedValidator: {
|
|
68
|
+
validator: new TxPermittedValidator(txsPermitted, bindings),
|
|
69
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
70
|
+
},
|
|
71
|
+
txSizeValidator: {
|
|
72
|
+
validator: new SizeTxValidator(bindings),
|
|
73
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
74
|
+
},
|
|
75
|
+
metadataValidator: {
|
|
76
|
+
validator: new MetadataTxValidator({
|
|
77
|
+
l1ChainId: new Fr(l1ChainId),
|
|
78
|
+
rollupVersion: new Fr(rollupVersion),
|
|
79
|
+
protocolContractsHash,
|
|
80
|
+
vkTreeRoot: getVKTreeRoot()
|
|
81
|
+
}, bindings),
|
|
82
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
83
|
+
},
|
|
84
|
+
phasesValidator: {
|
|
85
|
+
validator: new PhasesTxValidator(contractDataSource, allowedInSetup, timestamp, bindings),
|
|
86
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
87
|
+
},
|
|
88
|
+
blockHeaderValidator: {
|
|
89
|
+
validator: new BlockHeaderTxValidator(new ArchiveCache(merkleTree), bindings),
|
|
90
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
91
|
+
},
|
|
92
|
+
doubleSpendValidator: {
|
|
93
|
+
validator: new DoubleSpendTxValidator({
|
|
94
|
+
nullifiersExist: async (nullifiers)=>{
|
|
95
|
+
const merkleTree = worldStateSynchronizer.getCommitted();
|
|
96
|
+
const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
|
|
97
|
+
return indices.map((index)=>index !== undefined);
|
|
98
|
+
}
|
|
99
|
+
}, bindings),
|
|
100
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
101
|
+
},
|
|
102
|
+
gasValidator: {
|
|
103
|
+
validator: new GasTxValidator(new DatabasePublicStateSource(merkleTree), ProtocolContractAddress.FeeJuice, gasFees, bindings),
|
|
104
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
105
|
+
},
|
|
106
|
+
dataValidator: {
|
|
107
|
+
validator: new DataTxValidator(bindings),
|
|
108
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
72
109
|
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Second stage of gossip validation — expensive proof verification.
|
|
114
|
+
*
|
|
115
|
+
* Only runs after the first stage passes AND `canAddPendingTx` confirms the pool would
|
|
116
|
+
* accept the tx. This avoids wasting CPU on proof verification for txs the pool would reject
|
|
117
|
+
* (e.g., duplicates, insufficient balance, pool full).
|
|
118
|
+
*/ export function createSecondStageTxValidationsForGossipedTransactions(proofVerifier, bindings) {
|
|
119
|
+
return {
|
|
120
|
+
proofValidator: {
|
|
121
|
+
validator: new TxProofValidator(proofVerifier, bindings),
|
|
122
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Well-formedness checks only: metadata, size, data, and proof.
|
|
128
|
+
* Used for req/resp and block proposal txs. These txs must be accepted for block
|
|
129
|
+
* re-execution even though they may be invalid against current state — that is
|
|
130
|
+
* caught later by the block building validator.
|
|
131
|
+
*/ function createTxValidatorForMinimumTxIntegrityChecks(verifier, { l1ChainId, rollupVersion }, bindings) {
|
|
132
|
+
return new AggregateTxValidator(new MetadataTxValidator({
|
|
133
|
+
l1ChainId: new Fr(l1ChainId),
|
|
134
|
+
rollupVersion: new Fr(rollupVersion),
|
|
135
|
+
protocolContractsHash,
|
|
136
|
+
vkTreeRoot: getVKTreeRoot()
|
|
137
|
+
}, bindings), new SizeTxValidator(bindings), new DataTxValidator(bindings), new TxProofValidator(verifier, bindings));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Validators for txs received via req/resp or filestores.
|
|
141
|
+
* Checks well-formedness only — we must accept these for re-execution even if they
|
|
142
|
+
* are invalid against current state. State-dependent checks happen when the tx
|
|
143
|
+
* enters the pending pool or during block building.
|
|
144
|
+
*/ export function createTxValidatorForReqResponseReceivedTxs(verifier, { l1ChainId, rollupVersion }, bindings) {
|
|
145
|
+
return createTxValidatorForMinimumTxIntegrityChecks(verifier, {
|
|
146
|
+
l1ChainId,
|
|
147
|
+
rollupVersion
|
|
148
|
+
}, bindings);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Validators for txs received in block proposals.
|
|
152
|
+
* Same as req/resp — well-formedness only. We must store these for block
|
|
153
|
+
* re-execution; their validity against state is checked during block building.
|
|
154
|
+
*/ export function createTxValidatorForBlockProposalReceivedTxs(verifier, { l1ChainId, rollupVersion }, bindings) {
|
|
155
|
+
return createTxValidatorForMinimumTxIntegrityChecks(verifier, {
|
|
156
|
+
l1ChainId,
|
|
157
|
+
rollupVersion
|
|
158
|
+
}, bindings);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Validators for unsolicited txs received over JSON-RPC (from a local wallet/PXE).
|
|
162
|
+
* Full validation — all state-dependent checks are run. Proof verification is optional
|
|
163
|
+
* (can be skipped for testing purposes). Fee enforcement is also optional (skipped for testing/dev).
|
|
164
|
+
* Called from `AztecNodeService.isValidTx()`.
|
|
165
|
+
*/ export function createTxValidatorForAcceptingTxsOverRPC(db, contractDataSource, verifier, { l1ChainId, rollupVersion, setupAllowList, gasFees, skipFeeEnforcement, timestamp, blockNumber, txsPermitted }, bindings) {
|
|
166
|
+
const validators = [
|
|
167
|
+
new TxPermittedValidator(txsPermitted, bindings),
|
|
168
|
+
new TimestampTxValidator({
|
|
169
|
+
timestamp,
|
|
170
|
+
blockNumber
|
|
171
|
+
}, bindings),
|
|
172
|
+
new SizeTxValidator(bindings),
|
|
173
|
+
new MetadataTxValidator({
|
|
174
|
+
l1ChainId: new Fr(l1ChainId),
|
|
175
|
+
rollupVersion: new Fr(rollupVersion),
|
|
176
|
+
protocolContractsHash,
|
|
177
|
+
vkTreeRoot: getVKTreeRoot()
|
|
178
|
+
}, bindings),
|
|
179
|
+
new PhasesTxValidator(contractDataSource, setupAllowList, timestamp, bindings),
|
|
180
|
+
new BlockHeaderTxValidator(new ArchiveCache(db), bindings),
|
|
181
|
+
new DoubleSpendTxValidator(new NullifierCache(db), bindings),
|
|
182
|
+
new DataTxValidator(bindings)
|
|
73
183
|
];
|
|
184
|
+
if (!skipFeeEnforcement) {
|
|
185
|
+
validators.push(new GasTxValidator(new DatabasePublicStateSource(db), ProtocolContractAddress.FeeJuice, gasFees, bindings));
|
|
186
|
+
}
|
|
187
|
+
if (verifier) {
|
|
188
|
+
validators.push(new TxProofValidator(verifier, bindings));
|
|
189
|
+
}
|
|
190
|
+
return new AggregateTxValidator(...validators);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Validators for txs about to be included in a block by the sequencer.
|
|
194
|
+
* Re-validates against current state. This is where invalid txs that entered via
|
|
195
|
+
* req/resp or block proposals are caught — their invalidity is reported as part
|
|
196
|
+
* of block validation/attestation. Proof and data checks are omitted since they
|
|
197
|
+
* were already verified on entry.
|
|
198
|
+
* Called from `CheckpointBuilder.makeBlockBuilderDeps()`.
|
|
199
|
+
*/ export function createTxValidatorForBlockBuilding(db, contractDataSource, globalVariables, setupAllowList, bindings) {
|
|
200
|
+
const nullifierCache = new NullifierCache(db);
|
|
201
|
+
const archiveCache = new ArchiveCache(db);
|
|
202
|
+
const publicStateSource = new DatabasePublicStateSource(db);
|
|
203
|
+
return {
|
|
204
|
+
preprocessValidator: createTxValidatorForValidatingAgainstCurrentState(nullifierCache, archiveCache, publicStateSource, contractDataSource, globalVariables, setupAllowList, bindings),
|
|
205
|
+
nullifierCache
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function createTxValidatorForValidatingAgainstCurrentState(nullifierSource, archiveSource, publicStateSource, contractDataSource, globalVariables, setupAllowList, bindings) {
|
|
209
|
+
// We don't include the TxProofValidator nor the DataTxValidator here because they are already checked by the time we get to block building.
|
|
210
|
+
return new AggregateTxValidator(new TimestampTxValidator({
|
|
211
|
+
timestamp: globalVariables.timestamp,
|
|
212
|
+
blockNumber: globalVariables.blockNumber
|
|
213
|
+
}, bindings), new PhasesTxValidator(contractDataSource, setupAllowList, globalVariables.timestamp, bindings), new BlockHeaderTxValidator(archiveSource, bindings), new DoubleSpendTxValidator(nullifierSource, bindings), new GasTxValidator(publicStateSource, ProtocolContractAddress.FeeJuice, globalVariables.gasFees, bindings));
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Validators for txs migrating to the pending pool.
|
|
217
|
+
*
|
|
218
|
+
* Txs that arrived via req/resp or block proposals only had well-formedness checks
|
|
219
|
+
* on receipt. When they fail to be mined and are migrated to the pending pool, we
|
|
220
|
+
* run the state-dependent checks they missed: double-spend, block header, gas limits,
|
|
221
|
+
* and timestamp expiry. This is run on EVERY tx potentially entering the pending pool
|
|
222
|
+
* — called inside `TxPoolV2Impl` during `addPendingTxs`, `prepareForSlot` (unprotect),
|
|
223
|
+
* `handlePrunedBlocks` (unmine), and startup hydration.
|
|
224
|
+
*
|
|
225
|
+
* Operates on `TxMetaData` rather than full `Tx` since metadata is pre-built by the pool.
|
|
226
|
+
* Injected into `TxPoolV2` as the `createTxValidator` factory in `TxPoolV2Dependencies`.
|
|
227
|
+
*/ export async function createTxValidatorForTransactionsEnteringPendingTxPool(worldStateSynchronizer, timestamp, blockNumber, bindings) {
|
|
228
|
+
await worldStateSynchronizer.syncImmediate();
|
|
229
|
+
const merkleTree = worldStateSynchronizer.getCommitted();
|
|
230
|
+
const nullifierSource = {
|
|
231
|
+
nullifiersExist: async (nullifiers)=>{
|
|
232
|
+
const indices = await merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers);
|
|
233
|
+
return indices.map((index)=>index !== undefined);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
const archiveSource = {
|
|
237
|
+
getArchiveIndices: (archives)=>{
|
|
238
|
+
return merkleTree.findLeafIndices(MerkleTreeId.ARCHIVE, archives);
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
return new AggregateTxValidator(new GasLimitsValidator(bindings), new TimestampTxValidator({
|
|
242
|
+
timestamp,
|
|
243
|
+
blockNumber
|
|
244
|
+
}, bindings), new DoubleSpendTxValidator(nullifierSource, bindings), new BlockHeaderTxValidator(archiveSource, bindings));
|
|
74
245
|
}
|
|
@@ -1,11 +1,67 @@
|
|
|
1
|
+
import { type LoggerBindings } from '@aztec/foundation/log';
|
|
1
2
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
2
|
-
import { GasFees } from '@aztec/stdlib/gas';
|
|
3
|
+
import { Gas, GasFees } from '@aztec/stdlib/gas';
|
|
3
4
|
import type { PublicStateSource } from '@aztec/stdlib/trees';
|
|
4
5
|
import { type Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
6
|
+
/** Structural interface for types that carry gas limit data, used by {@link GasLimitsValidator}. */
|
|
7
|
+
export interface HasGasLimitData {
|
|
8
|
+
txHash: {
|
|
9
|
+
toString(): string;
|
|
10
|
+
};
|
|
11
|
+
data: {
|
|
12
|
+
forPublic?: unknown;
|
|
13
|
+
constants: {
|
|
14
|
+
txContext: {
|
|
15
|
+
gasSettings: {
|
|
16
|
+
gasLimits: Gas;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validates that a transaction's gas limits are within acceptable bounds.
|
|
24
|
+
*
|
|
25
|
+
* Rejects transactions whose gas limits fall below the fixed minimums (FIXED_DA_GAS,
|
|
26
|
+
* FIXED_L2_GAS) or exceed the AVM's maximum processable L2 gas. This is a cheap,
|
|
27
|
+
* stateless check that operates on gas settings alone.
|
|
28
|
+
*
|
|
29
|
+
* Generic over T so it can validate both full {@link Tx} objects and {@link TxMetaData}
|
|
30
|
+
* (used during pending pool migration).
|
|
31
|
+
*
|
|
32
|
+
* Used by: pending pool migration (via factory), and indirectly by {@link GasTxValidator}.
|
|
33
|
+
*/
|
|
34
|
+
export declare class GasLimitsValidator<T extends HasGasLimitData> implements TxValidator<T> {
|
|
35
|
+
#private;
|
|
36
|
+
constructor(bindings?: LoggerBindings);
|
|
37
|
+
validateTx(tx: T): Promise<TxValidationResult>;
|
|
38
|
+
/** Checks gas limits are >= fixed minimums and <= AVM max processable L2 gas. */
|
|
39
|
+
validateGasLimit(tx: T): TxValidationResult;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Validates that a transaction can pay its gas fees.
|
|
43
|
+
*
|
|
44
|
+
* Runs three checks in order:
|
|
45
|
+
* 1. **Gas limits** (delegates to {@link GasLimitsValidator}) — rejects if limits are
|
|
46
|
+
* out of bounds.
|
|
47
|
+
* 2. **Max fee per gas** — skips (not rejects) the tx if its maxFeesPerGas is below
|
|
48
|
+
* the current block's gas fees. We skip rather than reject because the tx may
|
|
49
|
+
* become eligible in a later block with lower fees.
|
|
50
|
+
* 3. **Fee payer balance** — reads the fee payer's FeeJuice balance from public state,
|
|
51
|
+
* adds any pending claim from a setup-phase `_increase_public_balance` call, and
|
|
52
|
+
* rejects if the total is less than the tx's fee limit (gasLimits * maxFeePerGas).
|
|
53
|
+
*
|
|
54
|
+
* Used by: gossip (stage 1), RPC, and block building validators.
|
|
55
|
+
*/
|
|
5
56
|
export declare class GasTxValidator implements TxValidator<Tx> {
|
|
6
57
|
#private;
|
|
7
|
-
|
|
58
|
+
private bindings?;
|
|
59
|
+
constructor(publicDataSource: PublicStateSource, feeJuiceAddress: AztecAddress, gasFees: GasFees, bindings?: LoggerBindings | undefined);
|
|
8
60
|
validateTx(tx: Tx): Promise<TxValidationResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Checks the fee payer has enough FeeJuice balance to cover the tx's fee limit.
|
|
63
|
+
* Accounts for any pending claim from a setup-phase `_increase_public_balance` call.
|
|
64
|
+
*/
|
|
9
65
|
validateTxFee(tx: Tx): Promise<TxValidationResult>;
|
|
10
66
|
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FzX3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9nYXNfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE9BQU8sRUFBZSxLQUFLLGNBQWMsRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RixPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUtMLEtBQUssRUFBRSxFQUNQLEtBQUssa0JBQWtCLEVBQ3ZCLEtBQUssV0FBVyxFQUNqQixNQUFNLGtCQUFrQixDQUFDO0FBSTFCLG9HQUFvRztBQUNwRyxNQUFNLFdBQVcsZUFBZTtJQUM5QixNQUFNLEVBQUU7UUFBRSxRQUFRLElBQUksTUFBTSxDQUFBO0tBQUUsQ0FBQztJQUMvQixJQUFJLEVBQUU7UUFFSixTQUFTLENBQUMsRUFBRSxPQUFPLENBQUM7UUFDcEIsU0FBUyxFQUFFO1lBQ1QsU0FBUyxFQUFFO2dCQUNULFdBQVcsRUFBRTtvQkFBRSxTQUFTLEVBQUUsR0FBRyxDQUFBO2lCQUFFLENBQUM7YUFDakMsQ0FBQztTQUNILENBQUM7S0FDSCxDQUFDO0NBQ0g7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILHFCQUFhLGtCQUFrQixDQUFDLENBQUMsU0FBUyxlQUFlLENBQUUsWUFBVyxXQUFXLENBQUMsQ0FBQyxDQUFDOztJQUdsRixZQUFZLFFBQVEsQ0FBQyxFQUFFLGNBQWMsRUFFcEM7SUFFRCxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FFN0M7SUFFRCxpRkFBaUY7SUFDakYsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxrQkFBa0IsQ0F3QjFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILHFCQUFhLGNBQWUsWUFBVyxXQUFXLENBQUMsRUFBRSxDQUFDOztJQVVsRCxPQUFPLENBQUMsUUFBUSxDQUFDO0lBSm5CLFlBQ0UsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ25DLGVBQWUsRUFBRSxZQUFZLEVBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQ1IsUUFBUSxDQUFDLDRCQUFnQixFQU1sQztJQUVLLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQVNwRDtJQXlCRDs7O09BR0c7SUFDVSxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0F5QjlEO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/gas_validator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gas_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/gas_validator.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAEvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAKL,KAAK,EAAE,EACP,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAI1B,oGAAoG;AACpG,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,CAAC;IAC/B,IAAI,EAAE;QAEJ,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,SAAS,EAAE;YACT,SAAS,EAAE;gBACT,WAAW,EAAE;oBAAE,SAAS,EAAE,GAAG,CAAA;iBAAE,CAAC;aACjC,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAkB,CAAC,CAAC,SAAS,eAAe,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAGlF,YAAY,QAAQ,CAAC,EAAE,cAAc,EAEpC;IAED,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAE7C;IAED,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,EAAE,CAAC,GAAG,kBAAkB,CAwB1C;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,cAAe,YAAW,WAAW,CAAC,EAAE,CAAC;;IAUlD,OAAO,CAAC,QAAQ,CAAC;IAJnB,YACE,gBAAgB,EAAE,iBAAiB,EACnC,eAAe,EAAE,YAAY,EAC7B,OAAO,EAAE,OAAO,EACR,QAAQ,CAAC,4BAAgB,EAMlC;IAEK,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CASpD;IAyBD;;;OAGG;IACU,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAyB9D;CACF"}
|
|
@@ -1,21 +1,89 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MAX_PROCESSABLE_L2_GAS, PRIVATE_TX_L2_GAS_OVERHEAD, PUBLIC_TX_L2_GAS_OVERHEAD, TX_DA_GAS_OVERHEAD } from '@aztec/constants';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
4
4
|
import { Gas } from '@aztec/stdlib/gas';
|
|
5
5
|
import { TX_ERROR_GAS_LIMIT_TOO_HIGH, TX_ERROR_INSUFFICIENT_FEE_PAYER_BALANCE, TX_ERROR_INSUFFICIENT_FEE_PER_GAS, TX_ERROR_INSUFFICIENT_GAS_LIMIT } from '@aztec/stdlib/tx';
|
|
6
6
|
import { getFeePayerClaimAmount, getTxFeeLimit } from './fee_payer_balance.js';
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Validates that a transaction's gas limits are within acceptable bounds.
|
|
9
|
+
*
|
|
10
|
+
* Rejects transactions whose gas limits fall below the fixed minimums (FIXED_DA_GAS,
|
|
11
|
+
* FIXED_L2_GAS) or exceed the AVM's maximum processable L2 gas. This is a cheap,
|
|
12
|
+
* stateless check that operates on gas settings alone.
|
|
13
|
+
*
|
|
14
|
+
* Generic over T so it can validate both full {@link Tx} objects and {@link TxMetaData}
|
|
15
|
+
* (used during pending pool migration).
|
|
16
|
+
*
|
|
17
|
+
* Used by: pending pool migration (via factory), and indirectly by {@link GasTxValidator}.
|
|
18
|
+
*/ export class GasLimitsValidator {
|
|
19
|
+
#log;
|
|
20
|
+
constructor(bindings){
|
|
21
|
+
this.#log = createLogger('sequencer:tx_validator:tx_gas', bindings);
|
|
22
|
+
}
|
|
23
|
+
validateTx(tx) {
|
|
24
|
+
return Promise.resolve(this.validateGasLimit(tx));
|
|
25
|
+
}
|
|
26
|
+
/** Checks gas limits are >= fixed minimums and <= AVM max processable L2 gas. */ validateGasLimit(tx) {
|
|
27
|
+
const gasLimits = tx.data.constants.txContext.gasSettings.gasLimits;
|
|
28
|
+
const minGasLimits = new Gas(TX_DA_GAS_OVERHEAD, tx.data.forPublic ? PUBLIC_TX_L2_GAS_OVERHEAD : PRIVATE_TX_L2_GAS_OVERHEAD);
|
|
29
|
+
if (minGasLimits.gtAny(gasLimits)) {
|
|
30
|
+
this.#log.verbose(`Rejecting transaction due to the gas limit(s) not being above the minimum gas limit`, {
|
|
31
|
+
gasLimits,
|
|
32
|
+
minGasLimits
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
result: 'invalid',
|
|
36
|
+
reason: [
|
|
37
|
+
TX_ERROR_INSUFFICIENT_GAS_LIMIT
|
|
38
|
+
]
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (gasLimits.l2Gas > MAX_PROCESSABLE_L2_GAS) {
|
|
42
|
+
this.#log.verbose(`Rejecting transaction due to the gas limit(s) being higher than the maximum processable gas`, {
|
|
43
|
+
gasLimits,
|
|
44
|
+
minGasLimits
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
result: 'invalid',
|
|
48
|
+
reason: [
|
|
49
|
+
TX_ERROR_GAS_LIMIT_TOO_HIGH
|
|
50
|
+
]
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
result: 'valid'
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Validates that a transaction can pay its gas fees.
|
|
60
|
+
*
|
|
61
|
+
* Runs three checks in order:
|
|
62
|
+
* 1. **Gas limits** (delegates to {@link GasLimitsValidator}) — rejects if limits are
|
|
63
|
+
* out of bounds.
|
|
64
|
+
* 2. **Max fee per gas** — skips (not rejects) the tx if its maxFeesPerGas is below
|
|
65
|
+
* the current block's gas fees. We skip rather than reject because the tx may
|
|
66
|
+
* become eligible in a later block with lower fees.
|
|
67
|
+
* 3. **Fee payer balance** — reads the fee payer's FeeJuice balance from public state,
|
|
68
|
+
* adds any pending claim from a setup-phase `_increase_public_balance` call, and
|
|
69
|
+
* rejects if the total is less than the tx's fee limit (gasLimits * maxFeePerGas).
|
|
70
|
+
*
|
|
71
|
+
* Used by: gossip (stage 1), RPC, and block building validators.
|
|
72
|
+
*/ export class GasTxValidator {
|
|
73
|
+
bindings;
|
|
74
|
+
#log;
|
|
9
75
|
#publicDataSource;
|
|
10
76
|
#feeJuiceAddress;
|
|
11
77
|
#gasFees;
|
|
12
|
-
constructor(publicDataSource, feeJuiceAddress, gasFees){
|
|
78
|
+
constructor(publicDataSource, feeJuiceAddress, gasFees, bindings){
|
|
79
|
+
this.bindings = bindings;
|
|
80
|
+
this.#log = createLogger('sequencer:tx_validator:tx_gas', bindings);
|
|
13
81
|
this.#publicDataSource = publicDataSource;
|
|
14
82
|
this.#feeJuiceAddress = feeJuiceAddress;
|
|
15
83
|
this.#gasFees = gasFees;
|
|
16
84
|
}
|
|
17
85
|
async validateTx(tx) {
|
|
18
|
-
const gasLimitValidation = this
|
|
86
|
+
const gasLimitValidation = new GasLimitsValidator(this.bindings).validateGasLimit(tx);
|
|
19
87
|
if (gasLimitValidation.result === 'invalid') {
|
|
20
88
|
return Promise.resolve(gasLimitValidation);
|
|
21
89
|
}
|
|
@@ -48,39 +116,9 @@ export class GasTxValidator {
|
|
|
48
116
|
return notEnoughMaxFees;
|
|
49
117
|
}
|
|
50
118
|
/**
|
|
51
|
-
*
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const minGasLimits = new Gas(FIXED_DA_GAS, FIXED_L2_GAS);
|
|
55
|
-
if (minGasLimits.gtAny(gasLimits)) {
|
|
56
|
-
this.#log.verbose(`Rejecting transaction due to the gas limit(s) not being above the minimum gas limit`, {
|
|
57
|
-
gasLimits,
|
|
58
|
-
minGasLimits
|
|
59
|
-
});
|
|
60
|
-
return {
|
|
61
|
-
result: 'invalid',
|
|
62
|
-
reason: [
|
|
63
|
-
TX_ERROR_INSUFFICIENT_GAS_LIMIT
|
|
64
|
-
]
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
if (gasLimits.l2Gas > AVM_MAX_PROCESSABLE_L2_GAS) {
|
|
68
|
-
this.#log.verbose(`Rejecting transaction due to the gas limit(s) being higher than the maximum processable gas`, {
|
|
69
|
-
gasLimits,
|
|
70
|
-
minGasLimits
|
|
71
|
-
});
|
|
72
|
-
return {
|
|
73
|
-
result: 'invalid',
|
|
74
|
-
reason: [
|
|
75
|
-
TX_ERROR_GAS_LIMIT_TOO_HIGH
|
|
76
|
-
]
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
return {
|
|
80
|
-
result: 'valid'
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
async validateTxFee(tx) {
|
|
119
|
+
* Checks the fee payer has enough FeeJuice balance to cover the tx's fee limit.
|
|
120
|
+
* Accounts for any pending claim from a setup-phase `_increase_public_balance` call.
|
|
121
|
+
*/ async validateTxFee(tx) {
|
|
84
122
|
const feePayer = tx.data.feePayer;
|
|
85
123
|
// Compute the maximum fee that this tx may pay, based on its gasLimits and maxFeePerGas
|
|
86
124
|
const feeLimit = getTxFeeLimit(tx);
|
|
@@ -12,4 +12,5 @@ export * from './archive_cache.js';
|
|
|
12
12
|
export * from './tx_permitted_validator.js';
|
|
13
13
|
export * from './timestamp_validator.js';
|
|
14
14
|
export * from './size_validator.js';
|
|
15
|
-
|
|
15
|
+
export * from './factory.js';
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy90eF92YWxpZGF0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsY0FBYyxDQUFDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { type LoggerBindings } from '@aztec/foundation/log';
|
|
2
3
|
import { type AnyTx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
3
4
|
export declare class MetadataTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
4
5
|
#private;
|
|
@@ -8,7 +9,7 @@ export declare class MetadataTxValidator<T extends AnyTx> implements TxValidator
|
|
|
8
9
|
rollupVersion: Fr;
|
|
9
10
|
vkTreeRoot: Fr;
|
|
10
11
|
protocolContractsHash: Fr;
|
|
11
|
-
});
|
|
12
|
+
}, bindings?: LoggerBindings);
|
|
12
13
|
validateTx(tx: T): Promise<TxValidationResult>;
|
|
13
14
|
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGFfdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvdHhfdmFsaWRhdG9yL21ldGFkYXRhX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEVBQWUsS0FBSyxjQUFjLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFDdkYsT0FBTyxFQUNMLEtBQUssS0FBSyxFQUtWLEtBQUssa0JBQWtCLEVBQ3ZCLEtBQUssV0FBVyxFQUNqQixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLHFCQUFhLG1CQUFtQixDQUFDLENBQUMsU0FBUyxLQUFLLENBQUUsWUFBVyxXQUFXLENBQUMsQ0FBQyxDQUFDOztJQUl2RSxPQUFPLENBQUMsTUFBTTtJQURoQixZQUNVLE1BQU0sRUFBRTtRQUNkLFNBQVMsRUFBRSxFQUFFLENBQUM7UUFDZCxhQUFhLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLFVBQVUsRUFBRSxFQUFFLENBQUM7UUFDZixxQkFBcUIsRUFBRSxFQUFFLENBQUM7S0FDM0IsRUFDRCxRQUFRLENBQUMsRUFBRSxjQUFjLEVBRzFCO0lBRUQsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBZTdDO0NBcURGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/metadata_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/metadata_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AACvF,OAAO,EACL,KAAK,KAAK,EAKV,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,mBAAmB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAIvE,OAAO,CAAC,MAAM;IADhB,YACU,MAAM,EAAE;QACd,SAAS,EAAE,EAAE,CAAC;QACd,aAAa,EAAE,EAAE,CAAC;QAClB,UAAU,EAAE,EAAE,CAAC;QACf,qBAAqB,EAAE,EAAE,CAAC;KAC3B,EACD,QAAQ,CAAC,EAAE,cAAc,EAG1B;IAED,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAe7C;CAqDF"}
|
|
@@ -3,9 +3,9 @@ import { TX_ERROR_INCORRECT_L1_CHAIN_ID, TX_ERROR_INCORRECT_PROTOCOL_CONTRACTS_H
|
|
|
3
3
|
export class MetadataTxValidator {
|
|
4
4
|
values;
|
|
5
5
|
#log;
|
|
6
|
-
constructor(values){
|
|
6
|
+
constructor(values, bindings){
|
|
7
7
|
this.values = values;
|
|
8
|
-
this.#log = createLogger('p2p:tx_validator:tx_metadata');
|
|
8
|
+
this.#log = createLogger('p2p:tx_validator:tx_metadata', bindings);
|
|
9
9
|
}
|
|
10
10
|
validateTx(tx) {
|
|
11
11
|
const errors = [];
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { NullifierSource } from '@aztec/p2p';
|
|
2
|
+
import type { MerkleTreeReadOperations } from '@aztec/stdlib/interfaces/server';
|
|
3
|
+
/**
|
|
4
|
+
* Implements a nullifier source by checking a DB and an in-memory collection.
|
|
5
|
+
* Intended for validating transactions as they are added to a block.
|
|
6
|
+
*/
|
|
7
|
+
export declare class NullifierCache implements NullifierSource {
|
|
8
|
+
private db;
|
|
9
|
+
nullifiers: Set<string>;
|
|
10
|
+
constructor(db: MerkleTreeReadOperations);
|
|
11
|
+
nullifiersExist(nullifiers: Buffer[]): Promise<boolean[]>;
|
|
12
|
+
addNullifiers(nullifiers: Buffer[]): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbGlmaWVyX2NhY2hlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvdHhfdmFsaWRhdG9yL251bGxpZmllcl9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEQsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUdoRjs7O0dBR0c7QUFDSCxxQkFBYSxjQUFlLFlBQVcsZUFBZTtJQUd4QyxPQUFPLENBQUMsRUFBRTtJQUZ0QixVQUFVLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXhCLFlBQW9CLEVBQUUsRUFBRSx3QkFBd0IsRUFFL0M7SUFFWSxlQUFlLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQU9yRTtJQUVNLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBSXhDO0NBQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullifier_cache.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/nullifier_cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAGhF;;;GAGG;AACH,qBAAa,cAAe,YAAW,eAAe;IAGxC,OAAO,CAAC,EAAE;IAFtB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAExB,YAAoB,EAAE,EAAE,wBAAwB,EAE/C;IAEY,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAOrE;IAEM,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAIxC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
2
|
+
/**
|
|
3
|
+
* Implements a nullifier source by checking a DB and an in-memory collection.
|
|
4
|
+
* Intended for validating transactions as they are added to a block.
|
|
5
|
+
*/ export class NullifierCache {
|
|
6
|
+
db;
|
|
7
|
+
nullifiers;
|
|
8
|
+
constructor(db){
|
|
9
|
+
this.db = db;
|
|
10
|
+
this.nullifiers = new Set();
|
|
11
|
+
}
|
|
12
|
+
async nullifiersExist(nullifiers) {
|
|
13
|
+
const cacheResults = nullifiers.map((n)=>this.nullifiers.has(n.toString()));
|
|
14
|
+
const toCheckDb = nullifiers.filter((_n, index)=>!cacheResults[index]);
|
|
15
|
+
const dbHits = await this.db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, toCheckDb);
|
|
16
|
+
let dbIndex = 0;
|
|
17
|
+
return nullifiers.map((_n, index)=>cacheResults[index] || dbHits[dbIndex++] !== undefined);
|
|
18
|
+
}
|
|
19
|
+
addNullifiers(nullifiers) {
|
|
20
|
+
for (const nullifier of nullifiers){
|
|
21
|
+
this.nullifiers.add(nullifier.toString());
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type LoggerBindings } from '@aztec/foundation/log';
|
|
1
2
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
2
3
|
import type { AllowedElement } from '@aztec/stdlib/interfaces/server';
|
|
3
4
|
import { Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
@@ -7,8 +8,8 @@ export declare class PhasesTxValidator implements TxValidator<Tx> {
|
|
|
7
8
|
private setupAllowList;
|
|
8
9
|
private timestamp;
|
|
9
10
|
private contractsDB;
|
|
10
|
-
constructor(contracts: ContractDataSource, setupAllowList: AllowedElement[], timestamp: UInt64);
|
|
11
|
+
constructor(contracts: ContractDataSource, setupAllowList: AllowedElement[], timestamp: UInt64, bindings?: LoggerBindings);
|
|
11
12
|
validateTx(tx: Tx): Promise<TxValidationResult>;
|
|
12
13
|
private isOnAllowList;
|
|
13
14
|
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhhc2VzX3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9waGFzZXNfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZSxLQUFLLGNBQWMsRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RixPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFJTCxFQUFFLEVBRUYsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyxXQUFXLEVBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbEQscUJBQWEsaUJBQWtCLFlBQVcsV0FBVyxDQUFDLEVBQUUsQ0FBQzs7SUFNckQsT0FBTyxDQUFDLGNBQWM7SUFDdEIsT0FBTyxDQUFDLFNBQVM7SUFMbkIsT0FBTyxDQUFDLFdBQVcsQ0FBb0I7SUFFdkMsWUFDRSxTQUFTLEVBQUUsa0JBQWtCLEVBQ3JCLGNBQWMsRUFBRSxjQUFjLEVBQUUsRUFDaEMsU0FBUyxFQUFFLE1BQU0sRUFDekIsUUFBUSxDQUFDLEVBQUUsY0FBYyxFQUkxQjtJQUVLLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQXFDcEQ7WUFFYSxhQUFhO0NBaUQ1QiJ9
|