@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.1142ef1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +22 -9
- package/dest/client/factory.d.ts +15 -5
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +60 -25
- package/dest/client/index.d.ts +2 -1
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +1 -0
- package/dest/client/interface.d.ts +170 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +9 -0
- package/dest/client/p2p_client.d.ts +75 -193
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +757 -228
- package/dest/config.d.ts +148 -125
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +180 -34
- package/dest/enr/generate-enr.d.ts +11 -3
- package/dest/enr/generate-enr.d.ts.map +1 -1
- package/dest/enr/generate-enr.js +27 -5
- package/dest/enr/index.d.ts +1 -1
- package/dest/errors/attestation-pool.error.d.ts +7 -0
- package/dest/errors/attestation-pool.error.d.ts.map +1 -0
- package/dest/errors/attestation-pool.error.js +12 -0
- package/dest/errors/reqresp.error.d.ts +1 -1
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/index.d.ts +4 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -25
- 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 +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 +288 -174
- package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -11
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +168 -62
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +24 -10
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +133 -82
- package/dest/mem_pools/attestation_pool/mocks.d.ts +232 -11
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +15 -20
- package/dest/mem_pools/index.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts +16 -12
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +55 -40
- package/dest/mem_pools/interface.d.ts +3 -4
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +70 -16
- 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 +452 -142
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +18 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +56 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +83 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +5 -0
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +88 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +76 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
- package/dest/mem_pools/tx_pool/index.d.ts +1 -2
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/index.js +0 -1
- package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.js +7 -2
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +72 -11
- 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 +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 +276 -45
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -5
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +48 -10
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +64 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/index.js +1 -0
- package/dest/msg_validators/index.d.ts +2 -2
- package/dest/msg_validators/index.d.ts.map +1 -1
- package/dest/msg_validators/index.js +1 -1
- 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/proposal_validator/block_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +80 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +183 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/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 +2 -2
- 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 +1 -1
- 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 +1 -3
- 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 +16 -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 +8 -1
- 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 +9 -5
- 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 +93 -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 +13 -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 +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +6 -5
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.d.ts +10 -9
- 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 +54 -11
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +91 -5
- package/dest/services/encoding.d.ts +26 -7
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +76 -6
- package/dest/services/gossipsub/scoring.d.ts +1 -1
- package/dest/services/index.d.ts +5 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +4 -0
- package/dest/services/libp2p/instrumentation.d.ts +20 -0
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
- package/dest/services/libp2p/instrumentation.js +111 -0
- package/dest/services/libp2p/libp2p_service.d.ts +102 -96
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +1307 -301
- 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 +11 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +29 -12
- package/dest/services/peer-manager/peer_manager.d.ts +103 -23
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +551 -82
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +37 -2
- package/dest/services/reqresp/config.d.ts +11 -9
- 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 +2 -2
- 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 +31 -17
- 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 +3 -2
- 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 +73 -24
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +46 -27
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +5 -21
- 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 +6 -1
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block.js +30 -6
- 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 +47 -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 +3 -5
- 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 +3 -1
- 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 +1 -3
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.d.ts +40 -7
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +75 -5
- package/dest/services/reqresp/protocols/tx.d.ts +14 -4
- 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/index.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
- 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 +1 -1
- 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 +24 -66
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +699 -230
- package/dest/services/reqresp/status.d.ts +10 -4
- package/dest/services/reqresp/status.d.ts.map +1 -1
- package/dest/services/reqresp/status.js +9 -2
- package/dest/services/service.d.ts +37 -20
- 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 +51 -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 +24 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/slow_tx_collection.js +177 -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 +51 -0
- package/dest/services/tx_provider.d.ts.map +1 -0
- package/dest/services/tx_provider.js +219 -0
- package/dest/services/tx_provider_instrumentation.d.ts +16 -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/generate-peer-id-private-keys.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts.map +1 -1
- package/dest/test-helpers/index.d.ts +2 -1
- 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 +1 -1
- 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 +33 -5
- 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 +15 -11
- 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.d.ts +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +124 -35
- package/dest/testbench/parse_log_file.d.ts +1 -1
- package/dest/testbench/parse_log_file.js +4 -4
- package/dest/testbench/testbench.d.ts +1 -1
- package/dest/testbench/testbench.js +4 -4
- package/dest/testbench/worker_client_manager.d.ts +1 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +17 -20
- package/dest/types/index.d.ts +4 -2
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +2 -0
- package/dest/util.d.ts +24 -16
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +75 -69
- package/dest/versioning.d.ts +4 -4
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +8 -3
- package/package.json +32 -27
- package/src/bootstrap/bootstrap.ts +27 -11
- package/src/client/factory.ts +139 -53
- package/src/client/index.ts +1 -0
- package/src/client/interface.ts +213 -0
- package/src/client/p2p_client.ts +471 -385
- package/src/config.ts +299 -134
- package/src/enr/generate-enr.ts +39 -6
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/index.ts +4 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +119 -24
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +344 -201
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +233 -72
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +199 -96
- package/src/mem_pools/attestation_pool/mocks.ts +21 -16
- package/src/mem_pools/instrumentation.ts +71 -48
- package/src/mem_pools/interface.ts +2 -4
- package/src/mem_pools/tx_pool/README.md +255 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +537 -155
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +71 -0
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +93 -0
- package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +108 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +91 -0
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
- package/src/mem_pools/tx_pool/index.ts +0 -1
- package/src/mem_pools/tx_pool/priority.ts +9 -2
- package/src/mem_pools/tx_pool/tx_pool.ts +75 -10
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +225 -36
- package/src/msg_validators/attestation_validator/attestation_validator.ts +60 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +88 -0
- package/src/msg_validators/attestation_validator/index.ts +1 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +206 -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 +5 -5
- package/src/msg_validators/tx_validator/data_validator.ts +89 -69
- package/src/msg_validators/tx_validator/double_spend_validator.ts +19 -17
- package/src/msg_validators/tx_validator/factory.ts +110 -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 +67 -22
- package/src/msg_validators/tx_validator/phases_validator.ts +116 -0
- package/src/msg_validators/tx_validator/test_utils.ts +43 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +49 -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 +153 -9
- package/src/services/encoding.ts +83 -6
- package/src/services/index.ts +4 -0
- package/src/services/libp2p/instrumentation.ts +113 -0
- package/src/services/libp2p/libp2p_service.ts +1120 -329
- package/src/services/peer-manager/interface.ts +29 -0
- package/src/services/peer-manager/metrics.ts +38 -12
- package/src/services/peer-manager/peer_manager.ts +657 -80
- package/src/services/peer-manager/peer_scoring.ts +42 -3
- 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 +150 -95
- package/src/services/reqresp/index.ts +2 -0
- package/src/services/reqresp/interface.ts +92 -37
- package/src/services/reqresp/metrics.ts +11 -24
- package/src/services/reqresp/protocols/auth.ts +83 -0
- package/src/services/reqresp/protocols/block.ts +26 -4
- 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 +119 -5
- package/src/services/reqresp/protocols/tx.ts +36 -8
- 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 +61 -22
- package/src/services/tx_collection/config.ts +84 -0
- package/src/services/tx_collection/fast_tx_collection.ts +341 -0
- package/src/services/tx_collection/index.ts +2 -0
- package/src/services/tx_collection/instrumentation.ts +26 -0
- package/src/services/tx_collection/slow_tx_collection.ts +233 -0
- package/src/services/tx_collection/tx_collection.ts +216 -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 +232 -0
- package/src/services/tx_provider_instrumentation.ts +48 -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 +87 -36
- package/src/testbench/p2p_client_testbench_worker.ts +182 -32
- package/src/testbench/parse_log_file.ts +4 -4
- package/src/testbench/testbench.ts +4 -4
- package/src/testbench/worker_client_manager.ts +23 -24
- package/src/types/index.ts +2 -0
- package/src/util.ts +105 -91
- package/src/versioning.ts +11 -4
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -141
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -21
- package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/index.js +0 -1
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Implements a queue of message IDs
|
|
2
|
+
export class MessageSeenValidator {
|
|
3
|
+
private queue: Array<string>;
|
|
4
|
+
private writePointer = 0;
|
|
5
|
+
private seenMessages: Set<string> = new Set();
|
|
6
|
+
|
|
7
|
+
constructor(private queueLength: number) {
|
|
8
|
+
if (this.queueLength <= 0) {
|
|
9
|
+
throw new Error('Queue length must be greater than 0');
|
|
10
|
+
}
|
|
11
|
+
this.queue = new Array<string>(this.queueLength);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Adds a message if not seen before. Returns true if added, false if already seen.
|
|
15
|
+
public addMessage(msgId: string): boolean {
|
|
16
|
+
// Check if the message is already in the cache
|
|
17
|
+
if (this.seenMessages.has(msgId)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
// If we are at the cache limit, remove the oldest msg ID
|
|
21
|
+
if (this.seenMessages.size >= this.queueLength) {
|
|
22
|
+
const msgToRemove = this.queue[this.writePointer];
|
|
23
|
+
this.seenMessages.delete(msgToRemove);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Insert the message into the cache and the queue
|
|
27
|
+
this.seenMessages.add(msgId);
|
|
28
|
+
this.queue[this.writePointer] = msgId;
|
|
29
|
+
this.writePointer = this.writePointer === this.queueLength - 1 ? 0 : this.writePointer + 1;
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public size() {
|
|
34
|
+
return this.seenMessages.size;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
+
import type { BlockProposal, P2PValidator } from '@aztec/stdlib/p2p';
|
|
3
|
+
|
|
4
|
+
import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
|
|
5
|
+
|
|
6
|
+
export class BlockProposalValidator extends ProposalValidator<BlockProposal> implements P2PValidator<BlockProposal> {
|
|
7
|
+
constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }) {
|
|
8
|
+
super(epochCache, opts, 'p2p:block_proposal_validator');
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
+
import type { CheckpointProposal, P2PValidator } from '@aztec/stdlib/p2p';
|
|
3
|
+
|
|
4
|
+
import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
|
|
5
|
+
|
|
6
|
+
export class CheckpointProposalValidator
|
|
7
|
+
extends ProposalValidator<CheckpointProposal>
|
|
8
|
+
implements P2PValidator<CheckpointProposal>
|
|
9
|
+
{
|
|
10
|
+
constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }) {
|
|
11
|
+
super(epochCache, opts, 'p2p:checkpoint_proposal_validator');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
+
import { NoCommitteeError } from '@aztec/ethereum/contracts';
|
|
3
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { BlockProposal, CheckpointProposal, PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
5
|
+
|
|
6
|
+
export abstract class ProposalValidator<TProposal extends BlockProposal | CheckpointProposal> {
|
|
7
|
+
protected epochCache: EpochCacheInterface;
|
|
8
|
+
protected logger: Logger;
|
|
9
|
+
protected txsPermitted: boolean;
|
|
10
|
+
|
|
11
|
+
constructor(epochCache: EpochCacheInterface, opts: { txsPermitted: boolean }, loggerName: string) {
|
|
12
|
+
this.epochCache = epochCache;
|
|
13
|
+
this.txsPermitted = opts.txsPermitted;
|
|
14
|
+
this.logger = createLogger(loggerName);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public async validate(proposal: TProposal): Promise<PeerErrorSeverity | undefined> {
|
|
18
|
+
try {
|
|
19
|
+
// Signature validity
|
|
20
|
+
const proposer = proposal.getSender();
|
|
21
|
+
if (!proposer) {
|
|
22
|
+
this.logger.debug(`Penalizing peer for proposal with invalid signature`);
|
|
23
|
+
return PeerErrorSeverity.MidToleranceError;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Transactions permitted check
|
|
27
|
+
const embeddedTxCount = proposal.txs?.length ?? 0;
|
|
28
|
+
if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
|
|
29
|
+
this.logger.debug(
|
|
30
|
+
`Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`,
|
|
31
|
+
);
|
|
32
|
+
return PeerErrorSeverity.MidToleranceError;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Embedded txs must be listed in txHashes
|
|
36
|
+
const hashSet = new Set(proposal.txHashes.map(h => h.toString()));
|
|
37
|
+
const missingTxHashes =
|
|
38
|
+
embeddedTxCount > 0
|
|
39
|
+
? proposal.txs!.filter(tx => !hashSet.has(tx.getTxHash().toString())).map(tx => tx.getTxHash().toString())
|
|
40
|
+
: [];
|
|
41
|
+
if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
|
|
42
|
+
this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
|
|
43
|
+
embeddedTxCount,
|
|
44
|
+
txHashesLength: proposal.txHashes.length,
|
|
45
|
+
missingTxHashes,
|
|
46
|
+
});
|
|
47
|
+
return PeerErrorSeverity.MidToleranceError;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Slot and proposer checks
|
|
51
|
+
const { currentProposer, nextProposer, currentSlot, nextSlot } =
|
|
52
|
+
await this.epochCache.getProposerAttesterAddressInCurrentOrNextSlot();
|
|
53
|
+
const slotNumber = proposal.slotNumber;
|
|
54
|
+
if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
|
|
55
|
+
this.logger.debug(`Penalizing peer for invalid slot number ${slotNumber}`, { currentSlot, nextSlot });
|
|
56
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
57
|
+
}
|
|
58
|
+
if (slotNumber === currentSlot && currentProposer !== undefined && !proposer.equals(currentProposer)) {
|
|
59
|
+
this.logger.debug(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
|
|
60
|
+
currentProposer,
|
|
61
|
+
nextProposer,
|
|
62
|
+
proposer: proposer.toString(),
|
|
63
|
+
});
|
|
64
|
+
return PeerErrorSeverity.MidToleranceError;
|
|
65
|
+
}
|
|
66
|
+
if (slotNumber === nextSlot && nextProposer !== undefined && !proposer.equals(nextProposer)) {
|
|
67
|
+
this.logger.debug(`Penalizing peer for invalid proposer for next slot ${slotNumber}`, {
|
|
68
|
+
currentProposer,
|
|
69
|
+
nextProposer,
|
|
70
|
+
proposer: proposer.toString(),
|
|
71
|
+
});
|
|
72
|
+
return PeerErrorSeverity.MidToleranceError;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Validate tx hashes for all txs embedded in the proposal
|
|
76
|
+
if (!(await Promise.all(proposal.txs?.map(tx => tx.validateTxHash()) ?? [])).every(v => v)) {
|
|
77
|
+
this.logger.warn(`Penalizing peer for invalid tx hashes in proposal`, {
|
|
78
|
+
proposer,
|
|
79
|
+
slotNumber,
|
|
80
|
+
});
|
|
81
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return undefined;
|
|
85
|
+
} catch (e) {
|
|
86
|
+
if (e instanceof NoCommitteeError) {
|
|
87
|
+
return PeerErrorSeverity.LowToleranceError;
|
|
88
|
+
}
|
|
89
|
+
throw e;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
+
import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
3
|
+
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
|
+
import { type BlockProposal, type CheckpointProposal, PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
5
|
+
import type { TxHash } from '@aztec/stdlib/tx';
|
|
6
|
+
|
|
7
|
+
import type { MockProxy } from 'jest-mock-extended';
|
|
8
|
+
|
|
9
|
+
export interface ProposalValidatorTestParams<TProposal extends BlockProposal | CheckpointProposal> {
|
|
10
|
+
validatorFactory: (
|
|
11
|
+
epochCache: EpochCacheInterface,
|
|
12
|
+
opts: { txsPermitted: boolean },
|
|
13
|
+
) => { validate: (proposal: TProposal) => Promise<PeerErrorSeverity | undefined> };
|
|
14
|
+
makeProposal: (options?: any) => Promise<TProposal>;
|
|
15
|
+
makeHeader: (epochNumber: number | bigint, slotNumber: number | bigint, blockNumber: number | bigint) => any;
|
|
16
|
+
getSigner: () => Secp256k1Signer;
|
|
17
|
+
getAddress: (signer?: Secp256k1Signer) => EthAddress;
|
|
18
|
+
getSlot: (slot: number | bigint) => any;
|
|
19
|
+
getTxHashes: (n: number) => TxHash[];
|
|
20
|
+
getTxs: () => any[];
|
|
21
|
+
epochCacheMock: () => MockProxy<EpochCacheInterface>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function sharedProposalValidatorTests<TProposal extends BlockProposal | CheckpointProposal>(
|
|
25
|
+
params: ProposalValidatorTestParams<TProposal>,
|
|
26
|
+
) {
|
|
27
|
+
const { validatorFactory, makeProposal, makeHeader, getSigner, getAddress, getSlot, getTxHashes, epochCacheMock } =
|
|
28
|
+
params;
|
|
29
|
+
|
|
30
|
+
describe('shared proposal validation logic', () => {
|
|
31
|
+
let epochCache: MockProxy<EpochCacheInterface>;
|
|
32
|
+
let validator: { validate: (proposal: TProposal) => Promise<PeerErrorSeverity | undefined> };
|
|
33
|
+
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
epochCache = epochCacheMock();
|
|
36
|
+
validator = validatorFactory(epochCache, { txsPermitted: true });
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('returns high tolerance error if slot number is not current or next slot', async () => {
|
|
40
|
+
const header = makeHeader(1, 97, 97);
|
|
41
|
+
const mockProposal = await makeProposal({ blockHeader: header, lastBlockHeader: header });
|
|
42
|
+
epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
|
|
43
|
+
currentSlot: getSlot(98),
|
|
44
|
+
nextSlot: getSlot(99),
|
|
45
|
+
currentProposer: getAddress(),
|
|
46
|
+
nextProposer: getAddress(),
|
|
47
|
+
});
|
|
48
|
+
const result = await validator.validate(mockProposal);
|
|
49
|
+
expect(result).toBe(PeerErrorSeverity.HighToleranceError);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('returns mid tolerance error if proposer is not current proposer for current slot', async () => {
|
|
53
|
+
const currentProposer = getSigner();
|
|
54
|
+
const nextProposer = getSigner();
|
|
55
|
+
const invalidProposer = getSigner();
|
|
56
|
+
const header = makeHeader(1, 100, 100);
|
|
57
|
+
const mockProposal = await makeProposal({
|
|
58
|
+
blockHeader: header,
|
|
59
|
+
lastBlockHeader: header,
|
|
60
|
+
signer: invalidProposer,
|
|
61
|
+
});
|
|
62
|
+
epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
|
|
63
|
+
currentSlot: getSlot(100),
|
|
64
|
+
nextSlot: getSlot(101),
|
|
65
|
+
currentProposer: getAddress(currentProposer),
|
|
66
|
+
nextProposer: getAddress(nextProposer),
|
|
67
|
+
});
|
|
68
|
+
const result = await validator.validate(mockProposal);
|
|
69
|
+
expect(result).toBe(PeerErrorSeverity.MidToleranceError);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('returns mid tolerance error if proposer is not next proposer for next slot', async () => {
|
|
73
|
+
const currentProposer = getSigner();
|
|
74
|
+
const nextProposer = getSigner();
|
|
75
|
+
const invalidProposer = getSigner();
|
|
76
|
+
const header = makeHeader(1, 101, 101);
|
|
77
|
+
const mockProposal = await makeProposal({
|
|
78
|
+
blockHeader: header,
|
|
79
|
+
lastBlockHeader: header,
|
|
80
|
+
signer: invalidProposer,
|
|
81
|
+
});
|
|
82
|
+
epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
|
|
83
|
+
currentSlot: getSlot(100),
|
|
84
|
+
nextSlot: getSlot(101),
|
|
85
|
+
currentProposer: getAddress(currentProposer),
|
|
86
|
+
nextProposer: getAddress(nextProposer),
|
|
87
|
+
});
|
|
88
|
+
const result = await validator.validate(mockProposal);
|
|
89
|
+
expect(result).toBe(PeerErrorSeverity.MidToleranceError);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('returns mid tolerance error if proposer is current proposer but proposal is for next slot', async () => {
|
|
93
|
+
const currentProposer = getSigner();
|
|
94
|
+
const nextProposer = getSigner();
|
|
95
|
+
const header = makeHeader(1, 101, 101);
|
|
96
|
+
const mockProposal = await makeProposal({
|
|
97
|
+
blockHeader: header,
|
|
98
|
+
lastBlockHeader: header,
|
|
99
|
+
signer: currentProposer,
|
|
100
|
+
});
|
|
101
|
+
epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
|
|
102
|
+
currentSlot: getSlot(100),
|
|
103
|
+
nextSlot: getSlot(101),
|
|
104
|
+
currentProposer: getAddress(currentProposer),
|
|
105
|
+
nextProposer: getAddress(nextProposer),
|
|
106
|
+
});
|
|
107
|
+
const result = await validator.validate(mockProposal);
|
|
108
|
+
expect(result).toBe(PeerErrorSeverity.MidToleranceError);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('returns undefined if proposal is valid for current slot and proposer', async () => {
|
|
112
|
+
const currentProposer = getSigner();
|
|
113
|
+
const nextProposer = getSigner();
|
|
114
|
+
const header = makeHeader(1, 100, 100);
|
|
115
|
+
const mockProposal = await makeProposal({
|
|
116
|
+
blockHeader: header,
|
|
117
|
+
lastBlockHeader: header,
|
|
118
|
+
signer: currentProposer,
|
|
119
|
+
});
|
|
120
|
+
epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
|
|
121
|
+
currentSlot: getSlot(100),
|
|
122
|
+
nextSlot: getSlot(101),
|
|
123
|
+
currentProposer: getAddress(currentProposer),
|
|
124
|
+
nextProposer: getAddress(nextProposer),
|
|
125
|
+
});
|
|
126
|
+
const result = await validator.validate(mockProposal);
|
|
127
|
+
expect(result).toBeUndefined();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('returns undefined if proposal is valid for next slot and proposer', async () => {
|
|
131
|
+
const currentProposer = getSigner();
|
|
132
|
+
const nextProposer = getSigner();
|
|
133
|
+
const header = makeHeader(1, 101, 101);
|
|
134
|
+
const mockProposal = await makeProposal({ blockHeader: header, lastBlockHeader: header, signer: nextProposer });
|
|
135
|
+
epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
|
|
136
|
+
currentSlot: getSlot(100),
|
|
137
|
+
nextSlot: getSlot(101),
|
|
138
|
+
currentProposer: getAddress(currentProposer),
|
|
139
|
+
nextProposer: getAddress(nextProposer),
|
|
140
|
+
});
|
|
141
|
+
const result = await validator.validate(mockProposal);
|
|
142
|
+
expect(result).toBeUndefined();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
describe('transaction permission validation', () => {
|
|
146
|
+
it('returns mid tolerance error if txs not permitted and proposal contains txHashes', async () => {
|
|
147
|
+
const currentProposer = getSigner();
|
|
148
|
+
const validatorWithTxsDisabled = validatorFactory(epochCache, { txsPermitted: false });
|
|
149
|
+
const header = makeHeader(1, 100, 100);
|
|
150
|
+
const mockProposal = await makeProposal({
|
|
151
|
+
blockHeader: header,
|
|
152
|
+
lastBlockHeader: header,
|
|
153
|
+
signer: currentProposer,
|
|
154
|
+
txHashes: getTxHashes(2),
|
|
155
|
+
});
|
|
156
|
+
epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
|
|
157
|
+
currentSlot: getSlot(100),
|
|
158
|
+
nextSlot: getSlot(101),
|
|
159
|
+
currentProposer: getAddress(currentProposer),
|
|
160
|
+
nextProposer: getAddress(),
|
|
161
|
+
});
|
|
162
|
+
const result = await validatorWithTxsDisabled.validate(mockProposal);
|
|
163
|
+
expect(result).toBe(PeerErrorSeverity.MidToleranceError);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('returns undefined if txs not permitted but proposal has no txHashes', async () => {
|
|
167
|
+
const currentProposer = getSigner();
|
|
168
|
+
const validatorWithTxsDisabled = validatorFactory(epochCache, { txsPermitted: false });
|
|
169
|
+
const header = makeHeader(1, 100, 100);
|
|
170
|
+
const mockProposal = await makeProposal({
|
|
171
|
+
blockHeader: header,
|
|
172
|
+
lastBlockHeader: header,
|
|
173
|
+
signer: currentProposer,
|
|
174
|
+
txHashes: getTxHashes(0),
|
|
175
|
+
});
|
|
176
|
+
epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
|
|
177
|
+
currentSlot: getSlot(100),
|
|
178
|
+
nextSlot: getSlot(101),
|
|
179
|
+
currentProposer: getAddress(currentProposer),
|
|
180
|
+
nextProposer: getAddress(),
|
|
181
|
+
});
|
|
182
|
+
const result = await validatorWithTxsDisabled.validate(mockProposal);
|
|
183
|
+
expect(result).toBeUndefined();
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it('returns undefined if txs permitted and proposal contains txHashes', async () => {
|
|
187
|
+
const currentProposer = getSigner();
|
|
188
|
+
const header = makeHeader(1, 100, 100);
|
|
189
|
+
const mockProposal = await makeProposal({
|
|
190
|
+
blockHeader: header,
|
|
191
|
+
lastBlockHeader: header,
|
|
192
|
+
signer: currentProposer,
|
|
193
|
+
txHashes: getTxHashes(2),
|
|
194
|
+
});
|
|
195
|
+
epochCache.getProposerAttesterAddressInCurrentOrNextSlot.mockResolvedValue({
|
|
196
|
+
currentSlot: getSlot(100),
|
|
197
|
+
nextSlot: getSlot(101),
|
|
198
|
+
currentProposer: getAddress(currentProposer),
|
|
199
|
+
nextProposer: getAddress(),
|
|
200
|
+
});
|
|
201
|
+
const result = await validator.validate(mockProposal);
|
|
202
|
+
expect(result).toBeUndefined();
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { FPCContract } from '@aztec/noir-contracts.js/FPC';
|
|
2
|
+
import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
|
|
3
|
+
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
4
|
+
import { getContractClassFromArtifact } from '@aztec/stdlib/contract';
|
|
5
|
+
import type { AllowedElement } from '@aztec/stdlib/interfaces/server';
|
|
6
|
+
|
|
7
|
+
let defaultAllowedSetupFunctions: AllowedElement[] | undefined = undefined;
|
|
8
|
+
export async function getDefaultAllowedSetupFunctions(): Promise<AllowedElement[]> {
|
|
9
|
+
if (defaultAllowedSetupFunctions === undefined) {
|
|
10
|
+
defaultAllowedSetupFunctions = [
|
|
11
|
+
// needed for authwit support
|
|
12
|
+
{
|
|
13
|
+
address: ProtocolContractAddress.AuthRegistry,
|
|
14
|
+
},
|
|
15
|
+
// needed for claiming on the same tx as a spend
|
|
16
|
+
{
|
|
17
|
+
address: ProtocolContractAddress.FeeJuice,
|
|
18
|
+
// We can't restrict the selector because public functions get routed via dispatch.
|
|
19
|
+
// selector: FunctionSelector.fromSignature('_increase_public_balance((Field),u128)'),
|
|
20
|
+
},
|
|
21
|
+
// needed for private transfers via FPC
|
|
22
|
+
{
|
|
23
|
+
classId: (await getContractClassFromArtifact(TokenContractArtifact)).id,
|
|
24
|
+
// We can't restrict the selector because public functions get routed via dispatch.
|
|
25
|
+
// selector: FunctionSelector.fromSignature('_increase_public_balance((Field),u128)'),
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
classId: (await getContractClassFromArtifact(FPCContract.artifact)).id,
|
|
29
|
+
// We can't restrict the selector because public functions get routed via dispatch.
|
|
30
|
+
// selector: FunctionSelector.fromSignature('prepare_fee((Field),Field,(Field),Field)'),
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
return defaultAllowedSetupFunctions;
|
|
35
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import type { ArchiveSource } from '@aztec/p2p';
|
|
3
|
+
import type { MerkleTreeReadOperations } from '@aztec/stdlib/interfaces/server';
|
|
4
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Implements an archive source by checking a DB and an in-memory collection.
|
|
8
|
+
* Intended for validating transactions as they are added to a block.
|
|
9
|
+
*/
|
|
10
|
+
export class ArchiveCache implements ArchiveSource {
|
|
11
|
+
archives: Map<string, bigint>;
|
|
12
|
+
|
|
13
|
+
constructor(private db: MerkleTreeReadOperations) {
|
|
14
|
+
this.archives = new Map<string, bigint>();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public async getArchiveIndices(archives: Fr[]): Promise<(bigint | undefined)[]> {
|
|
18
|
+
const toCheckDb = archives.filter(n => !this.archives.has(n.toString()));
|
|
19
|
+
const dbHits = await this.db.findLeafIndices(MerkleTreeId.ARCHIVE, toCheckDb);
|
|
20
|
+
dbHits.forEach((x, index) => {
|
|
21
|
+
if (x !== undefined) {
|
|
22
|
+
this.archives.set(toCheckDb[index].toString(), x);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
return archives.map(n => this.archives.get(n.toString()));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Fr } from '@aztec/foundation/
|
|
1
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
-
import { type AnyTx,
|
|
3
|
+
import { type AnyTx, TX_ERROR_BLOCK_HEADER, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
4
4
|
|
|
5
5
|
export interface ArchiveSource {
|
|
6
6
|
getArchiveIndices: (archives: Fr[]) => Promise<(bigint | undefined)[]>;
|
|
@@ -15,10 +15,10 @@ export class BlockHeaderTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
async validateTx(tx: T): Promise<TxValidationResult> {
|
|
18
|
-
const [index] = await this.#archiveSource.getArchiveIndices([await tx.data.constants.
|
|
18
|
+
const [index] = await this.#archiveSource.getArchiveIndices([await tx.data.constants.anchorBlockHeader.hash()]);
|
|
19
19
|
if (index === undefined) {
|
|
20
|
-
this.#log.
|
|
21
|
-
return { result: 'invalid', reason: [
|
|
20
|
+
this.#log.verbose(`Rejecting tx ${'txHash' in tx ? tx.txHash : tx.hash} for referencing an unknown block header`);
|
|
21
|
+
return { result: 'invalid', reason: [TX_ERROR_BLOCK_HEADER] };
|
|
22
22
|
}
|
|
23
23
|
return { result: 'valid' };
|
|
24
24
|
}
|
|
@@ -1,106 +1,126 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS } from '@aztec/constants';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
-
import {
|
|
3
|
+
import { computeCalldataHash } from '@aztec/stdlib/hash';
|
|
4
|
+
import {
|
|
5
|
+
TX_ERROR_CALLDATA_COUNT_MISMATCH,
|
|
6
|
+
TX_ERROR_CALLDATA_COUNT_TOO_LARGE,
|
|
7
|
+
TX_ERROR_CONTRACT_CLASS_LOGS,
|
|
8
|
+
TX_ERROR_CONTRACT_CLASS_LOG_COUNT,
|
|
9
|
+
TX_ERROR_CONTRACT_CLASS_LOG_LENGTH,
|
|
10
|
+
TX_ERROR_CONTRACT_CLASS_LOG_SORTING,
|
|
11
|
+
TX_ERROR_INCORRECT_CALLDATA,
|
|
12
|
+
TX_ERROR_INCORRECT_HASH,
|
|
13
|
+
Tx,
|
|
14
|
+
type TxValidationResult,
|
|
15
|
+
type TxValidator,
|
|
16
|
+
} from '@aztec/stdlib/tx';
|
|
4
17
|
|
|
5
18
|
export class DataTxValidator implements TxValidator<Tx> {
|
|
6
19
|
#log = createLogger('p2p:tx_validator:tx_data');
|
|
7
20
|
|
|
8
21
|
async validateTx(tx: Tx): Promise<TxValidationResult> {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
22
|
+
const reason =
|
|
23
|
+
(await this.#hasCorrectHash(tx)) ??
|
|
24
|
+
(await this.#hasCorrectCalldata(tx)) ??
|
|
25
|
+
(await this.#hasCorrectContractClassLogs(tx));
|
|
26
|
+
return reason ? { result: 'invalid', reason: [reason] } : { result: 'valid' };
|
|
12
27
|
}
|
|
13
28
|
|
|
14
|
-
async #
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
callRequests.length
|
|
23
|
-
}. Got ${tx.enqueuedPublicFunctionCalls.length}.`,
|
|
29
|
+
async #hasCorrectHash(tx: Tx): Promise<string | undefined> {
|
|
30
|
+
const expected = await Tx.computeTxHash(tx);
|
|
31
|
+
if (!tx.getTxHash().equals(expected)) {
|
|
32
|
+
const reason = TX_ERROR_INCORRECT_HASH;
|
|
33
|
+
this.#log.verbose(
|
|
34
|
+
`Rejecting tx ${tx.getTxHash().toString()}. Reason: ${reason}. Expected hash ${expected.toString()}. Got ${tx
|
|
35
|
+
.getTxHash()
|
|
36
|
+
.toString()}.`,
|
|
24
37
|
);
|
|
25
|
-
return
|
|
38
|
+
return reason;
|
|
26
39
|
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
27
42
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
)}
|
|
43
|
+
async #hasCorrectCalldata(tx: Tx): Promise<string | undefined> {
|
|
44
|
+
if (tx.publicFunctionCalldata.length !== tx.numberOfPublicCalls()) {
|
|
45
|
+
const reason = TX_ERROR_CALLDATA_COUNT_MISMATCH;
|
|
46
|
+
this.#log.verbose(
|
|
47
|
+
`Rejecting tx ${tx.getTxHash().toString()}. Reason: ${reason}. Expected ${tx.numberOfPublicCalls()}. Got ${
|
|
48
|
+
tx.publicFunctionCalldata.length
|
|
49
|
+
}.`,
|
|
33
50
|
);
|
|
34
|
-
return
|
|
51
|
+
return reason;
|
|
35
52
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (invalidExecutionRequestIndex !== -1) {
|
|
44
|
-
this.#log.warn(
|
|
45
|
-
`Rejecting tx ${await Tx.getHash(
|
|
46
|
-
tx,
|
|
47
|
-
)} because of incorrect execution requests for public call at index ${invalidExecutionRequestIndex}.`,
|
|
53
|
+
|
|
54
|
+
if (tx.getTotalPublicCalldataCount() > MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS) {
|
|
55
|
+
const reason = TX_ERROR_CALLDATA_COUNT_TOO_LARGE;
|
|
56
|
+
this.#log.verbose(
|
|
57
|
+
`Rejecting tx ${tx
|
|
58
|
+
.getTxHash()
|
|
59
|
+
.toString()}. Reason: ${reason}. Expected no greater than ${MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS} fields. Got ${tx.getTotalPublicCalldataCount()}.`,
|
|
48
60
|
);
|
|
49
|
-
return
|
|
61
|
+
return reason;
|
|
50
62
|
}
|
|
51
63
|
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
64
|
+
const callRequests = tx.getPublicCallRequestsWithCalldata();
|
|
65
|
+
for (let i = 0; i < callRequests.length; i++) {
|
|
66
|
+
const { request, calldata } = callRequests[i];
|
|
67
|
+
const hash = await computeCalldataHash(calldata);
|
|
68
|
+
if (!hash.equals(request.calldataHash)) {
|
|
69
|
+
const reason = TX_ERROR_INCORRECT_CALLDATA;
|
|
70
|
+
this.#log.verbose(`Rejecting tx ${tx.getTxHash().toString()}. Reason: ${reason}. Call request index: ${i}.`);
|
|
71
|
+
return reason;
|
|
72
|
+
}
|
|
59
73
|
}
|
|
60
74
|
|
|
61
|
-
return
|
|
75
|
+
return undefined;
|
|
62
76
|
}
|
|
63
77
|
|
|
64
|
-
async #hasCorrectContractClassLogs(tx: Tx): Promise<
|
|
78
|
+
async #hasCorrectContractClassLogs(tx: Tx): Promise<string | undefined> {
|
|
65
79
|
const contractClassLogsHashes = tx.data.getNonEmptyContractClassLogsHashes();
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
`Rejecting tx ${Tx.getHash(tx)} because of mismatched number of contract class logs. Expected ${
|
|
80
|
+
if (contractClassLogsHashes.length !== tx.contractClassLogFields.length) {
|
|
81
|
+
this.#log.verbose(
|
|
82
|
+
`Rejecting tx ${tx.getTxHash().toString()} because of mismatched number of contract class logs. Expected ${
|
|
70
83
|
contractClassLogsHashes.length
|
|
71
|
-
}. Got ${
|
|
84
|
+
}. Got ${tx.contractClassLogFields.length}.`,
|
|
72
85
|
);
|
|
73
|
-
return
|
|
86
|
+
return TX_ERROR_CONTRACT_CLASS_LOG_COUNT;
|
|
74
87
|
}
|
|
88
|
+
|
|
89
|
+
const expectedHashes = await Promise.all(tx.contractClassLogFields.map(l => l.hash()));
|
|
75
90
|
for (const [i, logHash] of contractClassLogsHashes.entries()) {
|
|
76
|
-
const
|
|
77
|
-
if (!logHash.value.equals(
|
|
78
|
-
if (
|
|
79
|
-
const matchingLogIndex =
|
|
80
|
-
this.#log.
|
|
81
|
-
`Rejecting tx ${
|
|
82
|
-
|
|
83
|
-
|
|
91
|
+
const hash = expectedHashes[i];
|
|
92
|
+
if (!logHash.value.equals(hash)) {
|
|
93
|
+
if (expectedHashes.some(h => logHash.value.equals(h))) {
|
|
94
|
+
const matchingLogIndex = expectedHashes.findIndex(l => logHash.value.equals(l));
|
|
95
|
+
this.#log.verbose(
|
|
96
|
+
`Rejecting tx ${tx
|
|
97
|
+
.getTxHash()
|
|
98
|
+
.toString()} because of mismatched contract class logs indices. Expected ${i} from the kernel's log hashes. Got ${matchingLogIndex} in the tx.`,
|
|
84
99
|
);
|
|
85
|
-
return
|
|
100
|
+
return TX_ERROR_CONTRACT_CLASS_LOG_SORTING;
|
|
86
101
|
} else {
|
|
87
|
-
this.#log.
|
|
88
|
-
`Rejecting tx ${
|
|
102
|
+
this.#log.verbose(
|
|
103
|
+
`Rejecting tx ${tx.getTxHash().toString()} because of mismatched contract class logs. Expected hash ${
|
|
89
104
|
logHash.value
|
|
90
|
-
} from the kernels. Got ${
|
|
105
|
+
} from the kernels. Got ${hash} in the tx.`,
|
|
91
106
|
);
|
|
92
|
-
return
|
|
107
|
+
return TX_ERROR_CONTRACT_CLASS_LOGS;
|
|
93
108
|
}
|
|
94
109
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
110
|
+
|
|
111
|
+
const expectedMinLength = 1 + tx.contractClassLogFields[i].fields.findLastIndex(f => !f.isZero());
|
|
112
|
+
if (logHash.logHash.length < expectedMinLength) {
|
|
113
|
+
this.#log.verbose(
|
|
114
|
+
`Rejecting tx ${tx
|
|
115
|
+
.getTxHash()
|
|
116
|
+
.toString()} because of incorrect contract class log length. Expected the length to be at least ${expectedMinLength}. Got ${
|
|
98
117
|
logHash.logHash.length
|
|
99
|
-
}
|
|
118
|
+
}.`,
|
|
100
119
|
);
|
|
101
|
-
return
|
|
120
|
+
return TX_ERROR_CONTRACT_CLASS_LOG_LENGTH;
|
|
102
121
|
}
|
|
103
122
|
}
|
|
104
|
-
|
|
123
|
+
|
|
124
|
+
return undefined;
|
|
105
125
|
}
|
|
106
126
|
}
|