@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.24de95ac
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.map +1 -1
- package/dest/bootstrap/bootstrap.js +22 -9
- package/dest/client/factory.d.ts +13 -3
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +60 -24
- package/dest/client/index.d.ts +1 -0
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +1 -0
- package/dest/client/interface.d.ts +155 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +9 -0
- package/dest/client/p2p_client.d.ts +72 -169
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +365 -174
- package/dest/config.d.ts +123 -103
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +173 -34
- package/dest/enr/generate-enr.d.ts +10 -2
- package/dest/enr/generate-enr.d.ts.map +1 -1
- package/dest/enr/generate-enr.js +27 -5
- package/dest/index.d.ts +3 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +42 -4
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +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 +204 -54
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +10 -2
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +93 -15
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +10 -2
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +86 -18
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +9 -15
- package/dest/mem_pools/instrumentation.d.ts +7 -11
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +25 -37
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +93 -9
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +469 -97
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +33 -9
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +133 -36
- package/dest/mem_pools/tx_pool/priority.js +1 -1
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +64 -8
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +264 -39
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +45 -9
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +5 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +61 -12
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +3 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +27 -0
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
- 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 -4
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +56 -86
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +0 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +21 -27
- package/dest/msg_validators/tx_validator/factory.d.ts +15 -0
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/factory.js +74 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +11 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/gas_validator.js +115 -0
- package/dest/msg_validators/tx_validator/index.d.ts +7 -0
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +7 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +7 -3
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +39 -20
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +14 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/phases_validator.js +91 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/test_utils.js +22 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +12 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +6 -5
- package/dest/services/discv5/discV5_service.d.ts +9 -8
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +63 -36
- package/dest/services/dummy_service.d.ts +49 -10
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +88 -5
- package/dest/services/encoding.d.ts +25 -6
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +73 -5
- package/dest/services/index.d.ts +4 -0
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +4 -0
- package/dest/services/libp2p/instrumentation.d.ts +18 -0
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
- package/dest/services/libp2p/instrumentation.js +157 -0
- package/dest/services/libp2p/libp2p_service.d.ts +87 -42
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +500 -218
- package/dest/services/peer-manager/interface.d.ts +23 -0
- package/dest/services/peer-manager/interface.d.ts.map +1 -0
- package/dest/services/peer-manager/interface.js +1 -0
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +11 -2
- package/dest/services/peer-manager/peer_manager.d.ts +126 -15
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +547 -72
- package/dest/services/reqresp/config.d.ts +10 -8
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +18 -4
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +10 -6
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +30 -13
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +142 -84
- package/dest/services/reqresp/index.d.ts +2 -1
- package/dest/services/reqresp/index.d.ts.map +1 -1
- package/dest/services/reqresp/index.js +2 -1
- package/dest/services/reqresp/interface.d.ts +72 -23
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +45 -26
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/auth.d.ts +43 -0
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/auth.js +71 -0
- package/dest/services/reqresp/protocols/block.d.ts +5 -0
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block.js +28 -5
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +30 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +75 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +11 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +39 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +49 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +75 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts +2 -4
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/goodbye.js +7 -7
- package/dest/services/reqresp/protocols/index.d.ts +2 -0
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +2 -0
- package/dest/services/reqresp/protocols/ping.d.ts +0 -2
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.d.ts +38 -6
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +72 -5
- package/dest/services/reqresp/protocols/tx.d.ts +12 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +34 -6
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +4 -2
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +21 -1
- package/dest/services/reqresp/reqresp.d.ts +45 -47
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +298 -207
- package/dest/services/reqresp/status.d.ts +9 -3
- package/dest/services/reqresp/status.d.ts.map +1 -1
- package/dest/services/reqresp/status.js +9 -2
- package/dest/services/service.d.ts +22 -18
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +25 -0
- package/dest/services/tx_collection/config.d.ts.map +1 -0
- package/dest/services/tx_collection/config.js +58 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts +56 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/fast_tx_collection.js +300 -0
- package/dest/services/tx_collection/index.d.ts +3 -0
- package/dest/services/tx_collection/index.d.ts.map +1 -0
- package/dest/services/tx_collection/index.js +2 -0
- package/dest/services/tx_collection/instrumentation.d.ts +10 -0
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_collection/instrumentation.js +34 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +54 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/slow_tx_collection.js +176 -0
- package/dest/services/tx_collection/tx_collection.d.ts +110 -0
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection.js +128 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts +30 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection_sink.js +111 -0
- package/dest/services/tx_collection/tx_source.d.ts +18 -0
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_source.js +31 -0
- package/dest/services/tx_provider.d.ts +49 -0
- package/dest/services/tx_provider.d.ts.map +1 -0
- package/dest/services/tx_provider.js +210 -0
- package/dest/services/tx_provider_instrumentation.d.ts +13 -0
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
- package/dest/services/tx_provider_instrumentation.js +34 -0
- package/dest/test-helpers/get-ports.d.ts.map +1 -1
- package/dest/test-helpers/index.d.ts +1 -0
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +1 -0
- package/dest/test-helpers/make-enrs.d.ts.map +1 -1
- package/dest/test-helpers/make-enrs.js +4 -5
- package/dest/test-helpers/make-test-p2p-clients.d.ts +32 -4
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +86 -16
- package/dest/test-helpers/mock-pubsub.d.ts +59 -0
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
- package/dest/test-helpers/mock-pubsub.js +130 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
- package/dest/test-helpers/mock-tx-helpers.js +19 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +14 -10
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +62 -28
- package/dest/testbench/p2p_client_testbench_worker.js +96 -25
- package/dest/testbench/parse_log_file.js +4 -4
- package/dest/testbench/testbench.js +4 -4
- package/dest/testbench/worker_client_manager.d.ts +0 -5
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +11 -19
- package/dest/types/index.d.ts +3 -1
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +2 -0
- package/dest/util.d.ts +22 -15
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +64 -67
- package/dest/versioning.d.ts +3 -3
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +8 -3
- package/package.json +28 -24
- package/src/bootstrap/bootstrap.ts +27 -11
- package/src/client/factory.ts +136 -45
- package/src/client/index.ts +1 -0
- package/src/client/interface.ts +195 -0
- package/src/client/p2p_client.ts +460 -327
- package/src/config.ts +288 -134
- package/src/enr/generate-enr.ts +39 -6
- package/src/index.ts +4 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +48 -4
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +241 -55
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +117 -20
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +114 -22
- package/src/mem_pools/attestation_pool/mocks.ts +11 -10
- package/src/mem_pools/instrumentation.ts +32 -46
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +549 -108
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +153 -44
- package/src/mem_pools/tx_pool/priority.ts +1 -1
- package/src/mem_pools/tx_pool/tx_pool.ts +67 -8
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +217 -34
- package/src/msg_validators/attestation_validator/attestation_validator.ts +55 -10
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +66 -14
- package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +35 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +4 -4
- package/src/msg_validators/tx_validator/data_validator.ts +81 -69
- package/src/msg_validators/tx_validator/double_spend_validator.ts +19 -17
- package/src/msg_validators/tx_validator/factory.ts +109 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +134 -0
- package/src/msg_validators/tx_validator/index.ts +7 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +58 -21
- package/src/msg_validators/tx_validator/phases_validator.ts +114 -0
- package/src/msg_validators/tx_validator/test_utils.ts +43 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +46 -0
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +17 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +6 -5
- package/src/services/discv5/discV5_service.ts +84 -38
- package/src/services/dummy_service.ts +147 -9
- package/src/services/encoding.ts +80 -5
- package/src/services/index.ts +4 -0
- package/src/services/libp2p/instrumentation.ts +158 -0
- package/src/services/libp2p/libp2p_service.ts +646 -263
- package/src/services/peer-manager/interface.ts +29 -0
- package/src/services/peer-manager/metrics.ts +16 -1
- package/src/services/peer-manager/peer_manager.ts +652 -78
- package/src/services/reqresp/config.ts +26 -9
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +12 -6
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +148 -95
- package/src/services/reqresp/index.ts +2 -0
- package/src/services/reqresp/interface.ts +91 -36
- package/src/services/reqresp/metrics.ts +4 -1
- package/src/services/reqresp/protocols/auth.ts +83 -0
- package/src/services/reqresp/protocols/block.ts +24 -3
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +90 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +53 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +79 -0
- package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
- package/src/services/reqresp/protocols/goodbye.ts +9 -7
- package/src/services/reqresp/protocols/index.ts +2 -0
- package/src/services/reqresp/protocols/status.ts +117 -5
- package/src/services/reqresp/protocols/tx.ts +35 -6
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
- package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
- package/src/services/reqresp/reqresp.ts +387 -256
- package/src/services/reqresp/status.ts +12 -3
- package/src/services/service.ts +45 -21
- package/src/services/tx_collection/config.ts +84 -0
- package/src/services/tx_collection/fast_tx_collection.ts +340 -0
- package/src/services/tx_collection/index.ts +2 -0
- package/src/services/tx_collection/instrumentation.ts +43 -0
- package/src/services/tx_collection/slow_tx_collection.ts +232 -0
- package/src/services/tx_collection/tx_collection.ts +215 -0
- package/src/services/tx_collection/tx_collection_sink.ts +129 -0
- package/src/services/tx_collection/tx_source.ts +37 -0
- package/src/services/tx_provider.ts +216 -0
- package/src/services/tx_provider_instrumentation.ts +44 -0
- package/src/test-helpers/index.ts +1 -0
- package/src/test-helpers/make-enrs.ts +4 -5
- package/src/test-helpers/make-test-p2p-clients.ts +111 -21
- package/src/test-helpers/mock-pubsub.ts +188 -0
- package/src/test-helpers/mock-tx-helpers.ts +24 -0
- package/src/test-helpers/reqresp-nodes.ts +86 -35
- package/src/testbench/p2p_client_testbench_worker.ts +145 -22
- package/src/testbench/parse_log_file.ts +4 -4
- package/src/testbench/testbench.ts +4 -4
- package/src/testbench/worker_client_manager.ts +17 -23
- package/src/types/index.ts +2 -0
- package/src/util.ts +93 -89
- package/src/versioning.ts +11 -4
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { elapsed } from '@aztec/foundation/timer';
|
|
2
|
+
import EventEmitter from 'node:events';
|
|
3
|
+
import { TxCollectionInstrumentation } from './instrumentation.js';
|
|
4
|
+
/**
|
|
5
|
+
* Executes collection requests from the fast and slow collection loops, and handles collected txs
|
|
6
|
+
* by adding them to the tx pool and emitting events, as well as handling logging and metrics.
|
|
7
|
+
*/ export class TxCollectionSink extends EventEmitter {
|
|
8
|
+
txPool;
|
|
9
|
+
log;
|
|
10
|
+
instrumentation;
|
|
11
|
+
constructor(txPool, telemetryClient, log){
|
|
12
|
+
super(), this.txPool = txPool, this.log = log;
|
|
13
|
+
this.instrumentation = new TxCollectionInstrumentation(telemetryClient, 'TxCollection');
|
|
14
|
+
}
|
|
15
|
+
async collect(collectValidTxsFn, requested, info) {
|
|
16
|
+
this.log.trace(`Requesting ${requested.length} txs via ${info.description}`, {
|
|
17
|
+
...info,
|
|
18
|
+
requestedTxs: requested.map((t)=>t.toString())
|
|
19
|
+
});
|
|
20
|
+
// Execute collection function and measure the time taken, catching any errors.
|
|
21
|
+
const [duration, txs] = await elapsed(async ()=>{
|
|
22
|
+
try {
|
|
23
|
+
const response = await collectValidTxsFn(requested);
|
|
24
|
+
return response.filter((tx)=>tx !== undefined);
|
|
25
|
+
} catch (err) {
|
|
26
|
+
this.log.error(`Error collecting txs via ${info.description}`, err, {
|
|
27
|
+
...info,
|
|
28
|
+
requestedTxs: requested.map((hash)=>hash.toString())
|
|
29
|
+
});
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
if (txs.length === 0) {
|
|
34
|
+
this.log.trace(`No txs found via ${info.description}`, {
|
|
35
|
+
...info,
|
|
36
|
+
requestedTxs: requested.map((t)=>t.toString())
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
txs,
|
|
40
|
+
requested,
|
|
41
|
+
duration
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Validate tx hashes for all collected txs from external sources
|
|
45
|
+
const validTxs = [];
|
|
46
|
+
const invalidTxHashes = [];
|
|
47
|
+
await Promise.all(txs.map(async (tx)=>{
|
|
48
|
+
const isValid = await tx.validateTxHash();
|
|
49
|
+
if (isValid) {
|
|
50
|
+
validTxs.push(tx);
|
|
51
|
+
} else {
|
|
52
|
+
invalidTxHashes.push(tx.getTxHash().toString());
|
|
53
|
+
}
|
|
54
|
+
}));
|
|
55
|
+
if (invalidTxHashes.length > 0) {
|
|
56
|
+
this.log.warn(`Rejecting ${invalidTxHashes.length} txs with invalid hashes from ${info.description}`, {
|
|
57
|
+
...info,
|
|
58
|
+
invalidTxHashes
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (validTxs.length === 0) {
|
|
62
|
+
this.log.trace(`No valid txs found via ${info.description} after validation`, {
|
|
63
|
+
...info,
|
|
64
|
+
requestedTxs: requested.map((t)=>t.toString()),
|
|
65
|
+
invalidTxHashes
|
|
66
|
+
});
|
|
67
|
+
return {
|
|
68
|
+
txs: [],
|
|
69
|
+
requested,
|
|
70
|
+
duration
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
this.log.verbose(`Collected ${validTxs.length} txs out of ${requested.length} requested via ${info.description} in ${duration}ms`, {
|
|
74
|
+
...info,
|
|
75
|
+
duration,
|
|
76
|
+
txs: validTxs.map((t)=>t.getTxHash().toString()),
|
|
77
|
+
requestedTxs: requested.map((t)=>t.toString()),
|
|
78
|
+
rejectedCount: invalidTxHashes.length
|
|
79
|
+
});
|
|
80
|
+
return await this.foundTxs(validTxs, {
|
|
81
|
+
...info,
|
|
82
|
+
duration
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async foundTxs(txs, info) {
|
|
86
|
+
// Report metrics for the collection
|
|
87
|
+
this.instrumentation.increaseTxsFor(info.method, txs.length, info.duration);
|
|
88
|
+
// Mark txs as found in the slow missing txs set and all fast requests
|
|
89
|
+
this.emit('txs-added', {
|
|
90
|
+
txs
|
|
91
|
+
});
|
|
92
|
+
// Add the txs to the tx pool (should not fail, but we catch it just in case)
|
|
93
|
+
try {
|
|
94
|
+
await this.txPool.addTxs(txs, {
|
|
95
|
+
source: `tx-collection`
|
|
96
|
+
});
|
|
97
|
+
} catch (err) {
|
|
98
|
+
this.log.error(`Error adding txs to the pool via ${info.description}`, err, {
|
|
99
|
+
...info,
|
|
100
|
+
txs: txs.map((tx)=>tx.txHash.toString())
|
|
101
|
+
});
|
|
102
|
+
// Return no txs since none have been added
|
|
103
|
+
return {
|
|
104
|
+
txs: []
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
txs
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ChainConfig } from '@aztec/stdlib/config';
|
|
2
|
+
import { type AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
3
|
+
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
4
|
+
import { type ComponentsVersions } from '@aztec/stdlib/versioning';
|
|
5
|
+
export interface TxSource {
|
|
6
|
+
getInfo(): string;
|
|
7
|
+
getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
8
|
+
}
|
|
9
|
+
export declare class NodeRpcTxSource implements TxSource {
|
|
10
|
+
private readonly client;
|
|
11
|
+
private readonly info;
|
|
12
|
+
constructor(client: Pick<AztecNode, 'getTxsByHash'>, info: string);
|
|
13
|
+
static fromUrl(nodeUrl: string, versions: ComponentsVersions): NodeRpcTxSource;
|
|
14
|
+
getInfo(): string;
|
|
15
|
+
getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
16
|
+
}
|
|
17
|
+
export declare function createNodeRpcTxSources(urls: string[], chainConfig: ChainConfig): NodeRpcTxSource[];
|
|
18
|
+
//# sourceMappingURL=tx_source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_source.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,kBAAkB,EAAmC,MAAM,0BAA0B,CAAC;AAGpG,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;CAC/D;AAED,qBAAa,eAAgB,YAAW,QAAQ;IAE5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACvC,IAAI,EAAE,MAAM;WAGjB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,eAAe;IAK9E,OAAO;IAIP,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;CAGrE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,qBAG9E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
2
|
+
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
3
|
+
import { createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
|
|
4
|
+
import { getComponentsVersionsFromConfig } from '@aztec/stdlib/versioning';
|
|
5
|
+
import { makeTracedFetch } from '@aztec/telemetry-client';
|
|
6
|
+
export class NodeRpcTxSource {
|
|
7
|
+
client;
|
|
8
|
+
info;
|
|
9
|
+
constructor(client, info){
|
|
10
|
+
this.client = client;
|
|
11
|
+
this.info = info;
|
|
12
|
+
}
|
|
13
|
+
static fromUrl(nodeUrl, versions) {
|
|
14
|
+
const client = createAztecNodeClient(nodeUrl, versions, makeTracedFetch([
|
|
15
|
+
1,
|
|
16
|
+
2,
|
|
17
|
+
3
|
|
18
|
+
], false));
|
|
19
|
+
return new NodeRpcTxSource(client, nodeUrl);
|
|
20
|
+
}
|
|
21
|
+
getInfo() {
|
|
22
|
+
return this.info;
|
|
23
|
+
}
|
|
24
|
+
getTxsByHash(txHashes) {
|
|
25
|
+
return this.client.getTxsByHash(txHashes);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function createNodeRpcTxSources(urls, chainConfig) {
|
|
29
|
+
const versions = getComponentsVersionsFromConfig(chainConfig, protocolContractsHash, getVKTreeRoot());
|
|
30
|
+
return urls.map((url)=>NodeRpcTxSource.fromUrl(url, versions));
|
|
31
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
2
|
+
import type { L2Block } from '@aztec/stdlib/block';
|
|
3
|
+
import type { ITxProvider } from '@aztec/stdlib/interfaces/server';
|
|
4
|
+
import type { BlockProposal } from '@aztec/stdlib/p2p';
|
|
5
|
+
import { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
6
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
7
|
+
import type { PeerId } from '@libp2p/interface';
|
|
8
|
+
import type { P2PClient } from '../client/p2p_client.js';
|
|
9
|
+
import type { TxPool } from '../mem_pools/index.js';
|
|
10
|
+
import type { TxCollection } from './tx_collection/tx_collection.js';
|
|
11
|
+
import { TxProviderInstrumentation } from './tx_provider_instrumentation.js';
|
|
12
|
+
/**
|
|
13
|
+
* Gathers and returns txs given a block proposal, block, or their hashes.
|
|
14
|
+
* Loads available txs from the tx pool, and relies on a TxCollection service to collect txs from the network and other nodes.
|
|
15
|
+
*/
|
|
16
|
+
export declare class TxProvider implements ITxProvider {
|
|
17
|
+
private txCollection;
|
|
18
|
+
private txPool;
|
|
19
|
+
private txValidator;
|
|
20
|
+
private log;
|
|
21
|
+
protected instrumentation: TxProviderInstrumentation;
|
|
22
|
+
constructor(txCollection: TxCollection, txPool: TxPool, txValidator: Pick<P2PClient, 'validate'>, log?: Logger, client?: TelemetryClient);
|
|
23
|
+
/** Returns txs from the tx pool given their hashes.*/
|
|
24
|
+
getAvailableTxs(txHashes: TxHash[]): Promise<{
|
|
25
|
+
txs: Tx[];
|
|
26
|
+
missingTxs: TxHash[];
|
|
27
|
+
}>;
|
|
28
|
+
/** Gathers txs from the tx pool, proposal body, remote rpc nodes, and reqresp. */
|
|
29
|
+
getTxsForBlockProposal(blockProposal: BlockProposal, blockNumber: number, opts: {
|
|
30
|
+
pinnedPeer: PeerId | undefined;
|
|
31
|
+
deadline: Date;
|
|
32
|
+
}): Promise<{
|
|
33
|
+
txs: Tx[];
|
|
34
|
+
missingTxs: TxHash[];
|
|
35
|
+
}>;
|
|
36
|
+
/** Gathers txs from the tx pool, remote rpc nodes, and reqresp. */
|
|
37
|
+
getTxsForBlock(block: L2Block, opts: {
|
|
38
|
+
deadline: Date;
|
|
39
|
+
}): Promise<{
|
|
40
|
+
txs: Tx[];
|
|
41
|
+
missingTxs: TxHash[];
|
|
42
|
+
}>;
|
|
43
|
+
private getOrderedTxsFromAllSources;
|
|
44
|
+
private orderTxs;
|
|
45
|
+
private getTxsFromAllSources;
|
|
46
|
+
private extractFromProposal;
|
|
47
|
+
private processProposalTxs;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=tx_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_provider.d.ts","sourceRoot":"","sources":["../../src/services/tx_provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAEnF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAA8B,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACjG,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAE7E;;;GAGG;AACH,qBAAa,UAAW,YAAW,WAAW;IAI1C,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,GAAG;IANb,SAAS,CAAC,eAAe,EAAE,yBAAyB,CAAC;gBAG3C,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EACxC,GAAG,GAAE,MAAyC,EACtD,MAAM,GAAE,eAAsC;IAKhD,sDAAsD;IACzC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,EAAE,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAoB9F,kFAAkF;IAC3E,sBAAsB,CAC3B,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE,GACvD,OAAO,CAAC;QAAE,GAAG,EAAE,EAAE,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAS/C,mEAAmE;IAC5D,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,EAAE,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;YAS/F,2BAA2B;IAgCzC,OAAO,CAAC,QAAQ;YAKF,oBAAoB;IAsFlC,OAAO,CAAC,mBAAmB;YAOb,kBAAkB;CAOjC"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { compactArray } from '@aztec/foundation/collection';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { elapsed } from '@aztec/foundation/timer';
|
|
4
|
+
import { TxHash } from '@aztec/stdlib/tx';
|
|
5
|
+
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
6
|
+
import { TxProviderInstrumentation } from './tx_provider_instrumentation.js';
|
|
7
|
+
/**
|
|
8
|
+
* Gathers and returns txs given a block proposal, block, or their hashes.
|
|
9
|
+
* Loads available txs from the tx pool, and relies on a TxCollection service to collect txs from the network and other nodes.
|
|
10
|
+
*/ export class TxProvider {
|
|
11
|
+
txCollection;
|
|
12
|
+
txPool;
|
|
13
|
+
txValidator;
|
|
14
|
+
log;
|
|
15
|
+
instrumentation;
|
|
16
|
+
constructor(txCollection, txPool, txValidator, log = createLogger('p2p:tx-collector'), client = getTelemetryClient()){
|
|
17
|
+
this.txCollection = txCollection;
|
|
18
|
+
this.txPool = txPool;
|
|
19
|
+
this.txValidator = txValidator;
|
|
20
|
+
this.log = log;
|
|
21
|
+
this.instrumentation = new TxProviderInstrumentation(client, 'TxProvider');
|
|
22
|
+
}
|
|
23
|
+
/** Returns txs from the tx pool given their hashes.*/ async getAvailableTxs(txHashes) {
|
|
24
|
+
const response = await this.txPool.getTxsByHash(txHashes);
|
|
25
|
+
if (response.length !== txHashes.length) {
|
|
26
|
+
throw new Error(`Unexpected response size from tx pool: expected ${txHashes.length} but got ${response.length}`);
|
|
27
|
+
}
|
|
28
|
+
const txs = [];
|
|
29
|
+
const missingTxs = [];
|
|
30
|
+
for(let i = 0; i < txHashes.length; i++){
|
|
31
|
+
const tx = response[i];
|
|
32
|
+
if (tx === undefined) {
|
|
33
|
+
missingTxs.push(txHashes[i]);
|
|
34
|
+
} else {
|
|
35
|
+
txs.push(tx);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
txs,
|
|
40
|
+
missingTxs
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Gathers txs from the tx pool, proposal body, remote rpc nodes, and reqresp. */ getTxsForBlockProposal(blockProposal, blockNumber, opts) {
|
|
44
|
+
return this.getOrderedTxsFromAllSources({
|
|
45
|
+
type: 'proposal',
|
|
46
|
+
blockProposal,
|
|
47
|
+
blockNumber
|
|
48
|
+
}, {
|
|
49
|
+
...blockProposal.toBlockInfo(),
|
|
50
|
+
blockNumber
|
|
51
|
+
}, blockProposal.txHashes, {
|
|
52
|
+
...opts,
|
|
53
|
+
pinnedPeer: opts.pinnedPeer
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** Gathers txs from the tx pool, remote rpc nodes, and reqresp. */ getTxsForBlock(block, opts) {
|
|
57
|
+
return this.getOrderedTxsFromAllSources({
|
|
58
|
+
type: 'block',
|
|
59
|
+
block
|
|
60
|
+
}, block.toBlockInfo(), block.body.txEffects.map((tx)=>tx.txHash), {
|
|
61
|
+
...opts,
|
|
62
|
+
pinnedPeer: undefined
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async getOrderedTxsFromAllSources(request, blockInfo, txHashes, opts) {
|
|
66
|
+
const [durationMs, result] = await elapsed(()=>this.getTxsFromAllSources(request, blockInfo, txHashes, opts));
|
|
67
|
+
const { missingTxHashes, txsFromMempool, txsFromNetwork, txsFromProposal } = result;
|
|
68
|
+
const txs = [
|
|
69
|
+
...txsFromMempool ?? [],
|
|
70
|
+
...txsFromProposal ?? [],
|
|
71
|
+
...txsFromNetwork ?? []
|
|
72
|
+
];
|
|
73
|
+
const missingTxs = missingTxHashes?.length ?? 0;
|
|
74
|
+
const level = missingTxs === 0 ? 'verbose' : 'warn';
|
|
75
|
+
this.log[level](`Retrieved ${txs.length} out of ${blockInfo.txCount} txs for ${request.type}`, {
|
|
76
|
+
...blockInfo,
|
|
77
|
+
txsFromProposal: txsFromProposal?.length,
|
|
78
|
+
txsFromMempool: txsFromMempool?.length,
|
|
79
|
+
txsFromNetwork: txsFromNetwork?.length,
|
|
80
|
+
missingTxs,
|
|
81
|
+
durationMs
|
|
82
|
+
});
|
|
83
|
+
const orderedTxs = this.orderTxs(txs, txHashes);
|
|
84
|
+
if (orderedTxs.length + missingTxs !== txHashes.length) {
|
|
85
|
+
throw new Error(`Error collecting txs for ${request.type} with ${txHashes.length} txs: found ${orderedTxs.length} and flagged ${missingTxs} as missing`);
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
txs: orderedTxs,
|
|
89
|
+
missingTxs: (missingTxHashes ?? []).map(TxHash.fromString),
|
|
90
|
+
durationMs
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
orderTxs(txs, order) {
|
|
94
|
+
const txsMap = new Map(txs.map((tx)=>[
|
|
95
|
+
tx.txHash.toString(),
|
|
96
|
+
tx
|
|
97
|
+
]));
|
|
98
|
+
return order.map((hash)=>txsMap.get(hash.toString())).filter((tx)=>tx !== undefined);
|
|
99
|
+
}
|
|
100
|
+
async getTxsFromAllSources(request, blockInfo, txHashes, opts) {
|
|
101
|
+
const missingTxHashes = new Set(txHashes.map((txHash)=>txHash.toString()));
|
|
102
|
+
if (missingTxHashes.size === 0) {
|
|
103
|
+
this.log.debug(`Received request with no transactions`, blockInfo);
|
|
104
|
+
return {};
|
|
105
|
+
}
|
|
106
|
+
// First go to our tx pool and fetch whatever txs we have there
|
|
107
|
+
// We go to the mempool first since those txs are already validated
|
|
108
|
+
const txsFromMempool = compactArray(await this.txPool.getTxsByHash(txHashes));
|
|
109
|
+
txsFromMempool.forEach((tx)=>missingTxHashes.delete(tx.getTxHash().toString()));
|
|
110
|
+
this.instrumentation.incTxsFromMempool(txsFromMempool.length);
|
|
111
|
+
this.log.debug(`Retrieved ${txsFromMempool.length} txs from mempool for block proposal (${missingTxHashes.size} pending)`, {
|
|
112
|
+
...blockInfo,
|
|
113
|
+
missingTxHashes: [
|
|
114
|
+
...missingTxHashes
|
|
115
|
+
]
|
|
116
|
+
});
|
|
117
|
+
if (missingTxHashes.size === 0) {
|
|
118
|
+
return {
|
|
119
|
+
txsFromMempool
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// Take txs from the proposal body if there are any
|
|
123
|
+
// Note that we still have to validate these txs, but we do it in parallel with tx collection
|
|
124
|
+
const proposal = request.type === 'proposal' ? request.blockProposal : undefined;
|
|
125
|
+
const txsFromProposal = this.extractFromProposal(proposal, [
|
|
126
|
+
...missingTxHashes
|
|
127
|
+
]);
|
|
128
|
+
if (txsFromProposal.length > 0) {
|
|
129
|
+
this.instrumentation.incTxsFromProposals(txsFromProposal.length);
|
|
130
|
+
txsFromProposal.forEach((tx)=>missingTxHashes.delete(tx.txHash.toString()));
|
|
131
|
+
this.log.debug(`Retrieved ${txsFromProposal.length} txs from proposal body (${missingTxHashes.size} pending)`, {
|
|
132
|
+
...blockInfo,
|
|
133
|
+
missingTxHashes: [
|
|
134
|
+
...missingTxHashes
|
|
135
|
+
]
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
if (missingTxHashes.size === 0) {
|
|
139
|
+
await this.processProposalTxs(txsFromProposal);
|
|
140
|
+
return {
|
|
141
|
+
txsFromMempool,
|
|
142
|
+
txsFromProposal
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
// Start tx collection from the network if needed, while we validate the txs taken from the proposal in parallel
|
|
146
|
+
const [txsFromNetwork] = await Promise.all([
|
|
147
|
+
this.txCollection.collectFastFor(request, [
|
|
148
|
+
...missingTxHashes
|
|
149
|
+
], opts),
|
|
150
|
+
this.processProposalTxs(txsFromProposal)
|
|
151
|
+
]);
|
|
152
|
+
if (txsFromNetwork.length > 0) {
|
|
153
|
+
txsFromNetwork.forEach((tx)=>missingTxHashes.delete(tx.txHash.toString()));
|
|
154
|
+
this.instrumentation.incTxsFromP2P(txsFromNetwork.length);
|
|
155
|
+
this.log.debug(`Retrieved ${txsFromNetwork.length} txs from network for block proposal (${missingTxHashes.size} pending)`, {
|
|
156
|
+
...blockInfo,
|
|
157
|
+
missingTxHashes: [
|
|
158
|
+
...missingTxHashes
|
|
159
|
+
]
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
if (missingTxHashes.size === 0) {
|
|
163
|
+
return {
|
|
164
|
+
txsFromNetwork,
|
|
165
|
+
txsFromMempool,
|
|
166
|
+
txsFromProposal
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// We are still missing txs, make one last attempt to collect them from our pool, in case they showed up somehow else
|
|
170
|
+
const moreTxsFromPool = compactArray(await this.txPool.getTxsByHash([
|
|
171
|
+
...missingTxHashes
|
|
172
|
+
].map(TxHash.fromString)));
|
|
173
|
+
if (moreTxsFromPool.length > 0) {
|
|
174
|
+
this.instrumentation.incTxsFromMempool(moreTxsFromPool.length);
|
|
175
|
+
this.log.debug(`Retrieved ${moreTxsFromPool.length} txs from pool retry for block proposal (${missingTxHashes.size} pending)`, {
|
|
176
|
+
...blockInfo,
|
|
177
|
+
missingTxHashes: [
|
|
178
|
+
...missingTxHashes
|
|
179
|
+
]
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
if (missingTxHashes.size > 0) {
|
|
183
|
+
this.instrumentation.incMissingTxs(missingTxHashes.size);
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
txsFromNetwork,
|
|
187
|
+
txsFromMempool: [
|
|
188
|
+
...txsFromMempool,
|
|
189
|
+
...moreTxsFromPool
|
|
190
|
+
],
|
|
191
|
+
txsFromProposal,
|
|
192
|
+
missingTxHashes: [
|
|
193
|
+
...missingTxHashes
|
|
194
|
+
]
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
extractFromProposal(proposal, missingTxHashes) {
|
|
198
|
+
if (!proposal) {
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
return compactArray(proposal.txs ?? []).filter((tx)=>missingTxHashes.includes(tx.getTxHash().toString()));
|
|
202
|
+
}
|
|
203
|
+
async processProposalTxs(txs) {
|
|
204
|
+
if (txs.length === 0) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
await this.txValidator.validate(txs);
|
|
208
|
+
await this.txPool.addTxs(txs);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
2
|
+
export declare class TxProviderInstrumentation {
|
|
3
|
+
private txFromProposalCount;
|
|
4
|
+
private txFromMempoolCount;
|
|
5
|
+
private txFromP2PCount;
|
|
6
|
+
private missingTxsCount;
|
|
7
|
+
constructor(client: TelemetryClient, name: string);
|
|
8
|
+
incTxsFromProposals(count: number): void;
|
|
9
|
+
incTxsFromMempool(count: number): void;
|
|
10
|
+
incTxsFromP2P(count: number): void;
|
|
11
|
+
incMissingTxs(count: number): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=tx_provider_instrumentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_provider_instrumentation.d.ts","sourceRoot":"","sources":["../../src/services/tx_provider_instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAE5F,qBAAa,yBAAyB;IACpC,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,eAAe,CAAgB;gBAE3B,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM;IAoBjD,mBAAmB,CAAC,KAAK,EAAE,MAAM;IAIjC,iBAAiB,CAAC,KAAK,EAAE,MAAM;IAI/B,aAAa,CAAC,KAAK,EAAE,MAAM;IAI3B,aAAa,CAAC,KAAK,EAAE,MAAM;CAG5B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Metrics } from '@aztec/telemetry-client';
|
|
2
|
+
export class TxProviderInstrumentation {
|
|
3
|
+
txFromProposalCount;
|
|
4
|
+
txFromMempoolCount;
|
|
5
|
+
txFromP2PCount;
|
|
6
|
+
missingTxsCount;
|
|
7
|
+
constructor(client, name){
|
|
8
|
+
const meter = client.getMeter(name);
|
|
9
|
+
this.txFromProposalCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_PROPOSALS_COUNT, {
|
|
10
|
+
description: 'The number of txs taken from block proposals'
|
|
11
|
+
});
|
|
12
|
+
this.txFromMempoolCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_MEMPOOL_COUNT, {
|
|
13
|
+
description: 'The number of txs taken from the local mempool'
|
|
14
|
+
});
|
|
15
|
+
this.txFromP2PCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_TXS_FROM_P2P_COUNT, {
|
|
16
|
+
description: 'The number of txs taken from the p2p network'
|
|
17
|
+
});
|
|
18
|
+
this.missingTxsCount = meter.createUpDownCounter(Metrics.TX_PROVIDER_MISSING_TXS_COUNT, {
|
|
19
|
+
description: 'The number of txs not found anywhere'
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
incTxsFromProposals(count) {
|
|
23
|
+
this.txFromProposalCount.add(count);
|
|
24
|
+
}
|
|
25
|
+
incTxsFromMempool(count) {
|
|
26
|
+
this.txFromMempoolCount.add(count);
|
|
27
|
+
}
|
|
28
|
+
incTxsFromP2P(count) {
|
|
29
|
+
this.txFromP2PCount.add(count);
|
|
30
|
+
}
|
|
31
|
+
incMissingTxs(count) {
|
|
32
|
+
this.missingTxsCount.add(count);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-ports.d.ts","sourceRoot":"","sources":["../../src/test-helpers/get-ports.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"get-ports.d.ts","sourceRoot":"","sources":["../../src/test-helpers/get-ports.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,eAAe,MAAM,sBAAwE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-enrs.d.ts","sourceRoot":"","sources":["../../src/test-helpers/make-enrs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAQxD;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,qBAM5F;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"make-enrs.d.ts","sourceRoot":"","sources":["../../src/test-helpers/make-enrs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAQxD;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,qBAM5F;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,mBAcrF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SignableENR } from '@chainsafe/enr';
|
|
2
1
|
import { multiaddr } from '@multiformats/multiaddr';
|
|
2
|
+
import { SignableENR } from '@nethermindeth/enr';
|
|
3
3
|
import { convertToMultiaddr, createLibP2PPeerIdFromPrivateKey } from '../util.js';
|
|
4
4
|
import { setAztecEnrKey } from '../versioning.js';
|
|
5
5
|
/**
|
|
@@ -20,10 +20,9 @@ import { setAztecEnrKey } from '../versioning.js';
|
|
|
20
20
|
*/ export async function makeEnr(p2pPrivateKey, port, config) {
|
|
21
21
|
const peerId = await createLibP2PPeerIdFromPrivateKey(p2pPrivateKey);
|
|
22
22
|
const enr = SignableENR.createFromPeerId(peerId);
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const tcpPublicAddr = multiaddr(convertToMultiaddr(tcpAnnounceAddress, 'tcp'));
|
|
23
|
+
const p2pIp = `127.0.0.1`;
|
|
24
|
+
const udpPublicAddr = multiaddr(convertToMultiaddr(p2pIp, port, 'udp'));
|
|
25
|
+
const tcpPublicAddr = multiaddr(convertToMultiaddr(p2pIp, port, 'tcp'));
|
|
27
26
|
// ENRS must include the network and a discoverable address (udp for discv5)
|
|
28
27
|
setAztecEnrKey(enr, config);
|
|
29
28
|
enr.setLocationMultiaddr(udpPublicAddr);
|
|
@@ -6,7 +6,8 @@ import type { P2PClient } from '../client/p2p_client.js';
|
|
|
6
6
|
import type { P2PConfig } from '../config.js';
|
|
7
7
|
import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
8
8
|
import type { TxPool } from '../mem_pools/tx_pool/index.js';
|
|
9
|
-
|
|
9
|
+
import { type MockGossipSubNetwork } from './mock-pubsub.js';
|
|
10
|
+
export interface MakeTestP2PClientOptions {
|
|
10
11
|
mockAttestationPool: AttestationPool;
|
|
11
12
|
mockTxPool: TxPool;
|
|
12
13
|
mockEpochCache: EpochCache;
|
|
@@ -15,7 +16,17 @@ interface MakeTestP2PClientOptions {
|
|
|
15
16
|
p2pBaseConfig: P2PConfig;
|
|
16
17
|
p2pConfigOverrides?: Partial<P2PConfig>;
|
|
17
18
|
logger?: Logger;
|
|
19
|
+
mockGossipSubNetwork?: MockGossipSubNetwork;
|
|
18
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates a single P2P client and immediately starts it for testing purposes.
|
|
23
|
+
* @param peerIdPrivateKey - The private key of the peer.
|
|
24
|
+
* @param port - The port to run the client on.
|
|
25
|
+
* @param peers - The peers to connect to.
|
|
26
|
+
* @param options - The options for the client.
|
|
27
|
+
* @returns The created and already started client.
|
|
28
|
+
*/
|
|
29
|
+
export declare function makeAndStartTestP2PClient(peerIdPrivateKey: string, port: number, peers: string[], options: MakeTestP2PClientOptions): Promise<P2PClient<P2PClientType.Full>>;
|
|
19
30
|
/**
|
|
20
31
|
* Creates a single P2P client for testing purposes.
|
|
21
32
|
* @param peerIdPrivateKey - The private key of the peer.
|
|
@@ -24,13 +35,30 @@ interface MakeTestP2PClientOptions {
|
|
|
24
35
|
* @param options - The options for the client.
|
|
25
36
|
* @returns The created client.
|
|
26
37
|
*/
|
|
27
|
-
export declare function makeTestP2PClient(peerIdPrivateKey: string, port: number, peers: string[], { alwaysTrueVerifier, p2pBaseConfig, p2pConfigOverrides, mockAttestationPool, mockTxPool, mockEpochCache, mockWorldState, logger, }: MakeTestP2PClientOptions): Promise<P2PClient<P2PClientType.Full>>;
|
|
38
|
+
export declare function makeTestP2PClient(peerIdPrivateKey: string, port: number, peers: string[], { alwaysTrueVerifier, p2pBaseConfig, p2pConfigOverrides, mockAttestationPool, mockTxPool, mockEpochCache, mockWorldState, mockGossipSubNetwork, logger, }: MakeTestP2PClientOptions): Promise<P2PClient<P2PClientType.Full>>;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a number of P2P clients and immediately starts them for testing purposes.
|
|
41
|
+
* @param numberOfPeers - The number of clients to create.
|
|
42
|
+
* @param options - The options for the clients.
|
|
43
|
+
* @returns The created and started clients.
|
|
44
|
+
*/
|
|
45
|
+
export declare function makeAndStartTestP2PClients(numberOfPeers: number, testConfig: MakeTestP2PClientOptions): Promise<{
|
|
46
|
+
client: P2PClient<P2PClientType.Full>;
|
|
47
|
+
peerPrivateKey: string;
|
|
48
|
+
port: number;
|
|
49
|
+
enr: string;
|
|
50
|
+
}[]>;
|
|
28
51
|
/**
|
|
29
52
|
* Creates a number of P2P clients for testing purposes.
|
|
30
53
|
* @param numberOfPeers - The number of clients to create.
|
|
31
54
|
* @param options - The options for the clients.
|
|
32
55
|
* @returns The created clients.
|
|
33
56
|
*/
|
|
34
|
-
export declare function makeTestP2PClients(numberOfPeers: number, testConfig: MakeTestP2PClientOptions): Promise<
|
|
35
|
-
|
|
57
|
+
export declare function makeTestP2PClients(numberOfPeers: number, testConfig: MakeTestP2PClientOptions): Promise<{
|
|
58
|
+
client: P2PClient<P2PClientType.Full>;
|
|
59
|
+
peerPrivateKey: string;
|
|
60
|
+
port: number;
|
|
61
|
+
enr: string;
|
|
62
|
+
}[]>;
|
|
63
|
+
export declare function startTestP2PClients(clients: P2PClient[]): Promise<void>;
|
|
36
64
|
//# sourceMappingURL=make-test-p2p-clients.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-test-p2p-clients.d.ts","sourceRoot":"","sources":["../../src/test-helpers/make-test-p2p-clients.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"make-test-p2p-clients.d.ts","sourceRoot":"","sources":["../../src/test-helpers/make-test-p2p-clients.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAKlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAI5D,OAAO,EAAE,KAAK,oBAAoB,EAAkC,MAAM,kBAAkB,CAAC;AAG7F,MAAM,WAAW,wBAAwB;IACvC,mBAAmB,EAAE,eAAe,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,UAAU,CAAC;IAC3B,cAAc,EAAE,sBAAsB,CAAC;IACvC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,SAAS,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,wBAAwB,0CAMlC;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,EACE,kBAAyB,EACzB,aAAa,EACb,kBAAuB,EACvB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,MAAwC,GACzC,EAAE,wBAAwB,0CA2C5B;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,wBAAwB;;;;;KAuC3G;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,wBAAwB;;;;;KAgCnG;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,iBAG7D"}
|