@aztec/p2p 0.0.1-commit.f2ce05ee → 0.0.1-commit.f81dbcf
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/client/factory.d.ts +8 -8
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +42 -13
- package/dest/client/interface.d.ts +39 -33
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +37 -50
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +144 -223
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -7
- package/dest/config.d.ts +47 -11
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +94 -31
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +21 -12
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +67 -37
- 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 +53 -53
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +2 -2
- package/dest/mem_pools/index.d.ts +2 -1
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/interface.d.ts +3 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
- package/dest/mem_pools/tx_pool/priority.d.ts +2 -2
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.js +4 -4
- 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 +3 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +5 -2
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +2 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +22 -8
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +4 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +68 -11
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +132 -17
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +36 -14
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -4
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +11 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +13 -5
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +336 -185
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +6 -4
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +6 -4
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +48 -36
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +3 -3
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +24 -20
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -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 +4 -4
- package/dest/msg_validators/tx_validator/factory.d.ts +125 -6
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +233 -59
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +67 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +104 -37
- package/dest/msg_validators/tx_validator/index.d.ts +3 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +2 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +44 -23
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- package/dest/services/dummy_service.d.ts +9 -5
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +7 -4
- package/dest/services/encoding.d.ts +3 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +11 -10
- package/dest/services/gossipsub/topic_score_params.d.ts +18 -6
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +32 -10
- package/dest/services/libp2p/libp2p_service.d.ts +25 -14
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +158 -123
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -3
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +5 -9
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -6
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +10 -13
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +25 -46
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +2 -2
- package/dest/services/reqresp/interface.d.ts +10 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +15 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +15 -0
- package/dest/services/reqresp/protocols/tx.d.ts +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +11 -4
- package/dest/services/service.d.ts +22 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +19 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +46 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +56 -36
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +90 -0
- package/dest/services/tx_collection/index.d.ts +2 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -0
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +2 -1
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -6
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +5 -4
- package/dest/services/tx_collection/slow_tx_collection.d.ts +7 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +60 -26
- package/dest/services/tx_collection/tx_collection.d.ts +23 -10
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +75 -3
- package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +26 -29
- package/dest/services/tx_collection/tx_source.d.ts +8 -3
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +19 -2
- package/dest/services/tx_file_store/config.d.ts +1 -3
- package/dest/services/tx_file_store/config.d.ts.map +1 -1
- package/dest/services/tx_file_store/config.js +0 -4
- package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +9 -6
- package/dest/services/tx_provider.d.ts +4 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +9 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +1 -2
- package/dest/test-helpers/mock-pubsub.d.ts +30 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +105 -4
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -3
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +2 -2
- package/dest/test-helpers/testbench-utils.d.ts +35 -24
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +95 -36
- package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +16 -15
- package/dest/testbench/worker_client_manager.d.ts +3 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +4 -1
- package/dest/util.d.ts +2 -2
- package/dest/util.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/client/factory.ts +77 -23
- package/src/client/interface.ts +43 -33
- package/src/client/p2p_client.ts +165 -265
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +19 -10
- package/src/config.ts +139 -33
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +95 -44
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +57 -53
- package/src/mem_pools/attestation_pool/index.ts +3 -3
- package/src/mem_pools/attestation_pool/mocks.ts +2 -1
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/interface.ts +2 -2
- package/src/mem_pools/tx_pool/README.md +1 -1
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
- package/src/mem_pools/tx_pool/priority.ts +4 -4
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +3 -1
- package/src/mem_pools/tx_pool_v2/README.md +85 -11
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +5 -2
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +4 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
- package/src/mem_pools/tx_pool_v2/index.ts +2 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +23 -8
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +189 -23
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -16
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +18 -7
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +379 -182
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +14 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +20 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +63 -40
- package/src/msg_validators/tx_validator/README.md +115 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +5 -5
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
- package/src/msg_validators/tx_validator/factory.ts +373 -77
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +123 -27
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +51 -26
- package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
- package/src/services/dummy_service.ts +12 -6
- package/src/services/encoding.ts +9 -9
- package/src/services/gossipsub/README.md +29 -14
- package/src/services/gossipsub/topic_score_params.ts +49 -13
- package/src/services/libp2p/libp2p_service.ts +170 -132
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +6 -6
- package/src/services/reqresp/batch-tx-requester/interface.ts +1 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +23 -71
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +2 -2
- package/src/services/reqresp/interface.ts +26 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
- package/src/services/reqresp/protocols/tx.ts +22 -0
- package/src/services/reqresp/reqresp.ts +13 -3
- package/src/services/service.ts +31 -2
- package/src/services/tx_collection/config.ts +68 -0
- package/src/services/tx_collection/fast_tx_collection.ts +65 -32
- package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
- package/src/services/tx_collection/file_store_tx_source.ts +117 -0
- package/src/services/tx_collection/index.ts +1 -0
- package/src/services/tx_collection/instrumentation.ts +7 -1
- package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
- package/src/services/tx_collection/proposal_tx_collector.ts +8 -7
- package/src/services/tx_collection/slow_tx_collection.ts +66 -33
- package/src/services/tx_collection/tx_collection.ts +113 -16
- package/src/services/tx_collection/tx_collection_sink.ts +30 -34
- package/src/services/tx_collection/tx_source.ts +22 -3
- package/src/services/tx_file_store/config.ts +0 -6
- package/src/services/tx_file_store/tx_file_store.ts +10 -8
- package/src/services/tx_provider.ts +10 -9
- package/src/test-helpers/make-test-p2p-clients.ts +3 -5
- package/src/test-helpers/mock-pubsub.ts +146 -9
- package/src/test-helpers/reqresp-nodes.ts +2 -5
- package/src/test-helpers/testbench-utils.ts +109 -40
- package/src/testbench/p2p_client_testbench_worker.ts +24 -20
- package/src/testbench/worker_client_manager.ts +11 -4
- package/src/util.ts +7 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
|
@@ -19,7 +19,7 @@ import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
|
19
19
|
import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
20
20
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
21
21
|
import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
22
|
-
import { type BlockProposal,
|
|
22
|
+
import { type BlockProposal, P2PMessage } from '@aztec/stdlib/p2p';
|
|
23
23
|
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
24
24
|
import { makeAztecAddress, makeBlockHeader, makeBlockProposal, mockTx } from '@aztec/stdlib/testing';
|
|
25
25
|
import { Tx, TxHash, type TxValidationResult } from '@aztec/stdlib/tx';
|
|
@@ -29,22 +29,19 @@ import type { Message, PeerId } from '@libp2p/interface';
|
|
|
29
29
|
import { TopicValidatorResult } from '@libp2p/interface';
|
|
30
30
|
import { peerIdFromString } from '@libp2p/peer-id';
|
|
31
31
|
|
|
32
|
-
import type { P2PClient } from '../client/
|
|
32
|
+
import type { P2PClient } from '../client/index.js';
|
|
33
33
|
import type { P2PConfig } from '../config.js';
|
|
34
34
|
import { createP2PClient } from '../index.js';
|
|
35
|
-
import type { MemPools } from '../mem_pools/
|
|
36
|
-
import { LibP2PService } from '../services/
|
|
35
|
+
import type { MemPools } from '../mem_pools/index.js';
|
|
36
|
+
import { BatchTxRequesterCollector, LibP2PService, SendBatchRequestCollector } from '../services/index.js';
|
|
37
37
|
import type { PeerManager } from '../services/peer-manager/peer_manager.js';
|
|
38
38
|
import type { BatchTxRequesterLibP2PService } from '../services/reqresp/batch-tx-requester/interface.js';
|
|
39
39
|
import type { IBatchRequestTxValidator } from '../services/reqresp/batch-tx-requester/tx_validator.js';
|
|
40
40
|
import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.js';
|
|
41
41
|
import type { ReqResp } from '../services/reqresp/reqresp.js';
|
|
42
42
|
import type { PeerDiscoveryService } from '../services/service.js';
|
|
43
|
-
import {
|
|
44
|
-
|
|
45
|
-
SendBatchRequestCollector,
|
|
46
|
-
} from '../services/tx_collection/proposal_tx_collector.js';
|
|
47
|
-
import { AlwaysTrueCircuitVerifier } from '../test-helpers/reqresp-nodes.js';
|
|
43
|
+
import { MissingTxsTracker } from '../services/tx_collection/missing_txs_tracker.js';
|
|
44
|
+
import { AlwaysTrueCircuitVerifier } from '../test-helpers/index.js';
|
|
48
45
|
import {
|
|
49
46
|
BENCHMARK_CONSTANTS,
|
|
50
47
|
type CollectorType,
|
|
@@ -55,7 +52,7 @@ import {
|
|
|
55
52
|
createMockEpochCache,
|
|
56
53
|
createMockWorldStateSynchronizer,
|
|
57
54
|
filterTxsByDistribution,
|
|
58
|
-
} from '../test-helpers/
|
|
55
|
+
} from '../test-helpers/index.js';
|
|
59
56
|
import type { PubSubLibp2p } from '../util.js';
|
|
60
57
|
|
|
61
58
|
export type { DistributionPattern, CollectorType } from '../test-helpers/testbench-utils.js';
|
|
@@ -89,12 +86,11 @@ export interface BenchReadyMessage {
|
|
|
89
86
|
}
|
|
90
87
|
const txCache = new Map<number, Tx[]>();
|
|
91
88
|
|
|
92
|
-
class TestLibP2PService
|
|
89
|
+
class TestLibP2PService extends LibP2PService {
|
|
93
90
|
private disableTxValidation: boolean;
|
|
94
91
|
private gossipMessageCount = 0;
|
|
95
92
|
|
|
96
93
|
constructor(
|
|
97
|
-
clientType: T,
|
|
98
94
|
config: P2PConfig,
|
|
99
95
|
node: PubSubLibp2p,
|
|
100
96
|
peerDiscoveryService: PeerDiscoveryService,
|
|
@@ -110,7 +106,6 @@ class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends Li
|
|
|
110
106
|
disableTxValidation = true,
|
|
111
107
|
) {
|
|
112
108
|
super(
|
|
113
|
-
clientType,
|
|
114
109
|
config,
|
|
115
110
|
node,
|
|
116
111
|
peerDiscoveryService,
|
|
@@ -144,7 +139,7 @@ class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends Li
|
|
|
144
139
|
const txHash = tx.getTxHash();
|
|
145
140
|
const txHashString = txHash.toString();
|
|
146
141
|
this.logger.verbose(`Received tx ${txHashString} from external peer ${source.toString()}.`);
|
|
147
|
-
await this.mempools.txPool.
|
|
142
|
+
await this.mempools.txPool.addPendingTxs([tx]);
|
|
148
143
|
} else {
|
|
149
144
|
await super.handleGossipedTx(payload, msgId, source);
|
|
150
145
|
}
|
|
@@ -166,7 +161,7 @@ async function generateDeterministicTxs(txCount: number, seed: number, config: P
|
|
|
166
161
|
return cached.slice(0, txCount);
|
|
167
162
|
}
|
|
168
163
|
|
|
169
|
-
const
|
|
164
|
+
const expirationTimestampBase = BigInt(seed);
|
|
170
165
|
for (let i = cached.length; i < txCount; i++) {
|
|
171
166
|
const txSeed = seed * 10000 + i;
|
|
172
167
|
const tx = await mockTx(txSeed, {
|
|
@@ -182,7 +177,7 @@ async function generateDeterministicTxs(txCount: number, seed: number, config: P
|
|
|
182
177
|
hasPublicTeardownCallRequest: false,
|
|
183
178
|
publicCalldataSize: 0,
|
|
184
179
|
});
|
|
185
|
-
tx.data.
|
|
180
|
+
tx.data.expirationTimestamp = expirationTimestampBase + BigInt(i);
|
|
186
181
|
await tx.recomputeHash();
|
|
187
182
|
cached.push(tx);
|
|
188
183
|
}
|
|
@@ -277,7 +272,12 @@ async function runAggregatorBenchmark(
|
|
|
277
272
|
new DateProvider(),
|
|
278
273
|
noopTxValidator,
|
|
279
274
|
);
|
|
280
|
-
const fetchedTxs = await collector.collectTxs(
|
|
275
|
+
const fetchedTxs = await collector.collectTxs(
|
|
276
|
+
MissingTxsTracker.fromArray(txHashes),
|
|
277
|
+
blockProposal,
|
|
278
|
+
pinnedPeer,
|
|
279
|
+
timeoutMs,
|
|
280
|
+
);
|
|
281
281
|
const durationMs = timer.ms();
|
|
282
282
|
return {
|
|
283
283
|
type: 'BENCH_RESULT',
|
|
@@ -292,7 +292,12 @@ async function runAggregatorBenchmark(
|
|
|
292
292
|
BENCHMARK_CONSTANTS.FIXED_MAX_PEERS,
|
|
293
293
|
BENCHMARK_CONSTANTS.FIXED_MAX_RETRY_ATTEMPTS,
|
|
294
294
|
);
|
|
295
|
-
const fetchedTxs = await collector.collectTxs(
|
|
295
|
+
const fetchedTxs = await collector.collectTxs(
|
|
296
|
+
MissingTxsTracker.fromArray(txHashes),
|
|
297
|
+
blockProposal,
|
|
298
|
+
pinnedPeer,
|
|
299
|
+
timeoutMs,
|
|
300
|
+
);
|
|
296
301
|
const durationMs = timer.ms();
|
|
297
302
|
return {
|
|
298
303
|
type: 'BENCH_RESULT',
|
|
@@ -335,6 +340,7 @@ process.on('message', async msg => {
|
|
|
335
340
|
const config: P2PConfig = {
|
|
336
341
|
...rawConfig,
|
|
337
342
|
peerIdPrivateKey: rawConfig.peerIdPrivateKey ? new SecretValue(rawConfig.peerIdPrivateKey) : undefined,
|
|
343
|
+
priceBumpPercentage: 10n,
|
|
338
344
|
} as P2PConfig;
|
|
339
345
|
|
|
340
346
|
workerConfig = config;
|
|
@@ -358,7 +364,6 @@ process.on('message', async msg => {
|
|
|
358
364
|
};
|
|
359
365
|
|
|
360
366
|
const client = await createP2PClient(
|
|
361
|
-
P2PClientType.Full,
|
|
362
367
|
config as P2PConfig & DataStoreConfig,
|
|
363
368
|
l2BlockSource,
|
|
364
369
|
proofVerifier as ClientProtocolCircuitVerifier,
|
|
@@ -371,7 +376,6 @@ process.on('message', async msg => {
|
|
|
371
376
|
);
|
|
372
377
|
|
|
373
378
|
const testService = new TestLibP2PService(
|
|
374
|
-
P2PClientType.Full,
|
|
375
379
|
config,
|
|
376
380
|
(client as any).p2pService.node,
|
|
377
381
|
(client as any).p2pService.peerDiscoveryService,
|
|
@@ -81,13 +81,15 @@ class WorkerClientManager {
|
|
|
81
81
|
* Note: We send the raw peerIdPrivateKey string instead of SecretValue
|
|
82
82
|
* because SecretValue.toJSON() returns '[Redacted]', losing the value.
|
|
83
83
|
* The worker must re-wrap it in SecretValue.
|
|
84
|
+
* We also omit priceBumpPercentage since it's a bigint and can't be
|
|
85
|
+
* serialized over IPC (which uses JSON under the hood).
|
|
84
86
|
*/
|
|
85
87
|
private createClientConfig(
|
|
86
88
|
clientIndex: number,
|
|
87
89
|
port: number,
|
|
88
90
|
otherNodes: string[],
|
|
89
|
-
): Omit<P2PConfig, 'peerIdPrivateKey'> & { peerIdPrivateKey: string } & Partial<ChainConfig> {
|
|
90
|
-
|
|
91
|
+
): Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & { peerIdPrivateKey: string } & Partial<ChainConfig> {
|
|
92
|
+
const { priceBumpPercentage: _, ...config } = {
|
|
91
93
|
...getP2PDefaultConfig(),
|
|
92
94
|
p2pEnabled: true,
|
|
93
95
|
peerIdPrivateKey: this.peerIdPrivateKeys[clientIndex],
|
|
@@ -96,7 +98,10 @@ class WorkerClientManager {
|
|
|
96
98
|
p2pPort: port,
|
|
97
99
|
bootstrapNodes: [...otherNodes],
|
|
98
100
|
...this.p2pConfig,
|
|
99
|
-
}
|
|
101
|
+
};
|
|
102
|
+
return config as Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & {
|
|
103
|
+
peerIdPrivateKey: string;
|
|
104
|
+
} & Partial<ChainConfig>;
|
|
100
105
|
}
|
|
101
106
|
|
|
102
107
|
/**
|
|
@@ -104,7 +109,9 @@ class WorkerClientManager {
|
|
|
104
109
|
* Config uses raw string for peerIdPrivateKey (not SecretValue) for IPC serialization.
|
|
105
110
|
*/
|
|
106
111
|
private spawnWorkerProcess(
|
|
107
|
-
config: Omit<P2PConfig, 'peerIdPrivateKey'> & {
|
|
112
|
+
config: Omit<P2PConfig, 'peerIdPrivateKey' | 'priceBumpPercentage'> & {
|
|
113
|
+
peerIdPrivateKey: string;
|
|
114
|
+
} & Partial<ChainConfig>,
|
|
108
115
|
clientIndex: number,
|
|
109
116
|
): [ChildProcess, Promise<void>] {
|
|
110
117
|
const useCompiled = existsSync(workerJsPath);
|
package/src/util.ts
CHANGED
|
@@ -23,7 +23,13 @@ export interface PubSubLibp2p extends Pick<Libp2p, 'status' | 'start' | 'stop' |
|
|
|
23
23
|
services: {
|
|
24
24
|
pubsub: Pick<
|
|
25
25
|
GossipSub,
|
|
26
|
-
|
|
26
|
+
| 'addEventListener'
|
|
27
|
+
| 'removeEventListener'
|
|
28
|
+
| 'publish'
|
|
29
|
+
| 'subscribe'
|
|
30
|
+
| 'reportMessageValidationResult'
|
|
31
|
+
| 'direct'
|
|
32
|
+
| 'getMeshPeers'
|
|
27
33
|
> & { score: Pick<GossipSub['score'], 'score'> };
|
|
28
34
|
};
|
|
29
35
|
}
|
|
@@ -1,23 +0,0 @@
|
|
|
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, type ValidationResult } from '@aztec/stdlib/p2p';
|
|
5
|
-
import type { TxHash } from '@aztec/stdlib/tx';
|
|
6
|
-
import type { MockProxy } from 'jest-mock-extended';
|
|
7
|
-
export interface ProposalValidatorTestParams<TProposal extends BlockProposal | CheckpointProposal> {
|
|
8
|
-
validatorFactory: (epochCache: EpochCacheInterface, opts: {
|
|
9
|
-
txsPermitted: boolean;
|
|
10
|
-
}) => {
|
|
11
|
-
validate: (proposal: TProposal) => Promise<ValidationResult>;
|
|
12
|
-
};
|
|
13
|
-
makeProposal: (options?: any) => Promise<TProposal>;
|
|
14
|
-
makeHeader: (epochNumber: number | bigint, slotNumber: number | bigint, blockNumber: number | bigint) => any;
|
|
15
|
-
getSigner: () => Secp256k1Signer;
|
|
16
|
-
getAddress: (signer?: Secp256k1Signer) => EthAddress;
|
|
17
|
-
getSlot: (slot: number | bigint) => any;
|
|
18
|
-
getTxHashes: (n: number) => TxHash[];
|
|
19
|
-
getTxs: () => any[];
|
|
20
|
-
epochCacheMock: () => MockProxy<EpochCacheInterface>;
|
|
21
|
-
}
|
|
22
|
-
export declare function sharedProposalValidatorTests<TProposal extends BlockProposal | CheckpointProposal>(params: ProposalValidatorTestParams<TProposal>): void;
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9wcm9wb3NhbF92YWxpZGF0b3IvcHJvcG9zYWxfdmFsaWRhdG9yX3Rlc3Rfc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsS0FBSyxhQUFhLEVBQ2xCLEtBQUssa0JBQWtCLEVBRXZCLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsTUFBTSxXQUFXLDJCQUEyQixDQUFDLFNBQVMsU0FBUyxhQUFhLEdBQUcsa0JBQWtCO0lBQy9GLGdCQUFnQixFQUFFLENBQ2hCLFVBQVUsRUFBRSxtQkFBbUIsRUFDL0IsSUFBSSxFQUFFO1FBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQTtLQUFFLEtBQzVCO1FBQUUsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsS0FBSyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtLQUFFLENBQUM7SUFDdEUsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRCxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxHQUFHLE1BQU0sS0FBSyxHQUFHLENBQUM7SUFDN0csU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0lBQ2pDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGVBQWUsS0FBSyxVQUFVLENBQUM7SUFDckQsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxNQUFNLEtBQUssR0FBRyxDQUFDO0lBQ3hDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7SUFDckMsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDcEIsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7Q0FDdEQ7QUFFRCx3QkFBZ0IsNEJBQTRCLENBQUMsU0FBUyxTQUFTLGFBQWEsR0FBRyxrQkFBa0IsRUFDL0YsTUFBTSxFQUFFLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxRQXdNL0MifQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proposal_validator_test_suite.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator_test_suite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAEvB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,2BAA2B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB;IAC/F,gBAAgB,EAAE,CAChB,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,KAC5B;QAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;KAAE,CAAC;IACtE,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IAC7G,SAAS,EAAE,MAAM,eAAe,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,KAAK,UAAU,CAAC;IACrD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;CACtD;AAED,wBAAgB,4BAA4B,CAAC,SAAS,SAAS,aAAa,GAAG,kBAAkB,EAC/F,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,QAwM/C"}
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
2
|
-
export function sharedProposalValidatorTests(params) {
|
|
3
|
-
const { validatorFactory, makeProposal, makeHeader, getSigner, getAddress, getSlot, getTxHashes, epochCacheMock } = params;
|
|
4
|
-
describe('shared proposal validation logic', ()=>{
|
|
5
|
-
let epochCache;
|
|
6
|
-
let validator;
|
|
7
|
-
const previousSlot = getSlot(99);
|
|
8
|
-
const currentSlot = getSlot(100);
|
|
9
|
-
const nextSlot = getSlot(101);
|
|
10
|
-
function mockGetProposer(currentProposer, nextProposer, previousProposer) {
|
|
11
|
-
epochCache.getProposerAttesterAddressInSlot.mockImplementation((slot)=>{
|
|
12
|
-
if (slot === currentSlot) {
|
|
13
|
-
return Promise.resolve(currentProposer);
|
|
14
|
-
}
|
|
15
|
-
if (slot === nextSlot) {
|
|
16
|
-
return Promise.resolve(nextProposer);
|
|
17
|
-
}
|
|
18
|
-
if (slot === previousSlot && previousProposer) {
|
|
19
|
-
return Promise.resolve(previousProposer);
|
|
20
|
-
}
|
|
21
|
-
throw new Error('Unexpected argument');
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
beforeEach(()=>{
|
|
25
|
-
epochCache = epochCacheMock();
|
|
26
|
-
validator = validatorFactory(epochCache, {
|
|
27
|
-
txsPermitted: true
|
|
28
|
-
});
|
|
29
|
-
epochCache.getCurrentAndNextSlot.mockReturnValue({
|
|
30
|
-
currentSlot: currentSlot,
|
|
31
|
-
nextSlot: nextSlot
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
it('returns high tolerance error if slot number is not current or next slot (outside clock tolerance)', async ()=>{
|
|
35
|
-
const header = makeHeader(1, 99, 99);
|
|
36
|
-
const mockProposal = await makeProposal({
|
|
37
|
-
blockHeader: header,
|
|
38
|
-
lastBlockHeader: header
|
|
39
|
-
});
|
|
40
|
-
// Mock getEpochAndSlotNow to return time OUTSIDE clock tolerance (1000ms elapsed)
|
|
41
|
-
epochCache.getEpochAndSlotNow.mockReturnValue({
|
|
42
|
-
epoch: 1,
|
|
43
|
-
slot: currentSlot,
|
|
44
|
-
ts: 1000n,
|
|
45
|
-
nowMs: 1001000n
|
|
46
|
-
});
|
|
47
|
-
epochCache.getProposerAttesterAddressInSlot.mockResolvedValue(getAddress());
|
|
48
|
-
const result = await validator.validate(mockProposal);
|
|
49
|
-
expect(result).toEqual({
|
|
50
|
-
result: 'reject',
|
|
51
|
-
severity: PeerErrorSeverity.HighToleranceError
|
|
52
|
-
});
|
|
53
|
-
// Should not try to resolve proposers if base validation fails
|
|
54
|
-
expect(epochCache.getProposerAttesterAddressInSlot).not.toHaveBeenCalled();
|
|
55
|
-
});
|
|
56
|
-
it('returns ignore if previous slot proposal is within clock tolerance', async ()=>{
|
|
57
|
-
const previousProposer = getSigner();
|
|
58
|
-
const header = makeHeader(1, 99, 99);
|
|
59
|
-
const mockProposal = await makeProposal({
|
|
60
|
-
blockHeader: header,
|
|
61
|
-
lastBlockHeader: header,
|
|
62
|
-
signer: previousProposer
|
|
63
|
-
});
|
|
64
|
-
// Mock getEpochAndSlotNow to return time WITHIN clock tolerance (100ms elapsed)
|
|
65
|
-
epochCache.getEpochAndSlotNow.mockReturnValue({
|
|
66
|
-
epoch: 1,
|
|
67
|
-
slot: currentSlot,
|
|
68
|
-
ts: 1000n,
|
|
69
|
-
nowMs: 1000100n
|
|
70
|
-
});
|
|
71
|
-
mockGetProposer(getAddress(), getAddress(), getAddress(previousProposer));
|
|
72
|
-
const result = await validator.validate(mockProposal);
|
|
73
|
-
expect(result).toEqual({
|
|
74
|
-
result: 'ignore'
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
it('returns mid tolerance error if proposer is not current proposer for current slot', async ()=>{
|
|
78
|
-
const currentProposer = getSigner();
|
|
79
|
-
const nextProposer = getSigner();
|
|
80
|
-
const invalidProposer = getSigner();
|
|
81
|
-
const header = makeHeader(1, 100, 100);
|
|
82
|
-
const mockProposal = await makeProposal({
|
|
83
|
-
blockHeader: header,
|
|
84
|
-
lastBlockHeader: header,
|
|
85
|
-
signer: invalidProposer
|
|
86
|
-
});
|
|
87
|
-
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
88
|
-
const result = await validator.validate(mockProposal);
|
|
89
|
-
expect(result).toEqual({
|
|
90
|
-
result: 'reject',
|
|
91
|
-
severity: PeerErrorSeverity.MidToleranceError
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
it('returns mid tolerance error if proposer is not next proposer for next slot', async ()=>{
|
|
95
|
-
const currentProposer = getSigner();
|
|
96
|
-
const nextProposer = getSigner();
|
|
97
|
-
const invalidProposer = getSigner();
|
|
98
|
-
const header = makeHeader(1, 101, 101);
|
|
99
|
-
const mockProposal = await makeProposal({
|
|
100
|
-
blockHeader: header,
|
|
101
|
-
lastBlockHeader: header,
|
|
102
|
-
signer: invalidProposer
|
|
103
|
-
});
|
|
104
|
-
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
105
|
-
const result = await validator.validate(mockProposal);
|
|
106
|
-
expect(result).toEqual({
|
|
107
|
-
result: 'reject',
|
|
108
|
-
severity: PeerErrorSeverity.MidToleranceError
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
it('returns mid tolerance error if proposer is current proposer but proposal is for next slot', async ()=>{
|
|
112
|
-
const currentProposer = getSigner();
|
|
113
|
-
const nextProposer = getSigner();
|
|
114
|
-
const header = makeHeader(1, 101, 101);
|
|
115
|
-
const mockProposal = await makeProposal({
|
|
116
|
-
blockHeader: header,
|
|
117
|
-
lastBlockHeader: header,
|
|
118
|
-
signer: currentProposer
|
|
119
|
-
});
|
|
120
|
-
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
121
|
-
const result = await validator.validate(mockProposal);
|
|
122
|
-
expect(result).toEqual({
|
|
123
|
-
result: 'reject',
|
|
124
|
-
severity: PeerErrorSeverity.MidToleranceError
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
it('returns undefined if proposal is valid for current slot and proposer', async ()=>{
|
|
128
|
-
const currentProposer = getSigner();
|
|
129
|
-
const nextProposer = getSigner();
|
|
130
|
-
const header = makeHeader(1, 100, 100);
|
|
131
|
-
const mockProposal = await makeProposal({
|
|
132
|
-
blockHeader: header,
|
|
133
|
-
lastBlockHeader: header,
|
|
134
|
-
signer: currentProposer
|
|
135
|
-
});
|
|
136
|
-
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
137
|
-
const result = await validator.validate(mockProposal);
|
|
138
|
-
expect(result).toEqual({
|
|
139
|
-
result: 'accept'
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
it('returns undefined if proposal is valid for next slot and proposer', async ()=>{
|
|
143
|
-
const currentProposer = getSigner();
|
|
144
|
-
const nextProposer = getSigner();
|
|
145
|
-
const header = makeHeader(1, 101, 101);
|
|
146
|
-
const mockProposal = await makeProposal({
|
|
147
|
-
blockHeader: header,
|
|
148
|
-
lastBlockHeader: header,
|
|
149
|
-
signer: nextProposer
|
|
150
|
-
});
|
|
151
|
-
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
152
|
-
const result = await validator.validate(mockProposal);
|
|
153
|
-
expect(result).toEqual({
|
|
154
|
-
result: 'accept'
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
describe('transaction permission validation', ()=>{
|
|
158
|
-
it('returns mid tolerance error if txs not permitted and proposal contains txHashes', async ()=>{
|
|
159
|
-
const currentProposer = getSigner();
|
|
160
|
-
const validatorWithTxsDisabled = validatorFactory(epochCache, {
|
|
161
|
-
txsPermitted: false
|
|
162
|
-
});
|
|
163
|
-
const header = makeHeader(1, 100, 100);
|
|
164
|
-
const mockProposal = await makeProposal({
|
|
165
|
-
blockHeader: header,
|
|
166
|
-
lastBlockHeader: header,
|
|
167
|
-
signer: currentProposer,
|
|
168
|
-
txHashes: getTxHashes(2)
|
|
169
|
-
});
|
|
170
|
-
mockGetProposer(getAddress(currentProposer), getAddress());
|
|
171
|
-
const result = await validatorWithTxsDisabled.validate(mockProposal);
|
|
172
|
-
expect(result).toEqual({
|
|
173
|
-
result: 'reject',
|
|
174
|
-
severity: PeerErrorSeverity.MidToleranceError
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
it('returns undefined if txs not permitted but proposal has no txHashes', async ()=>{
|
|
178
|
-
const currentProposer = getSigner();
|
|
179
|
-
const validatorWithTxsDisabled = validatorFactory(epochCache, {
|
|
180
|
-
txsPermitted: false
|
|
181
|
-
});
|
|
182
|
-
const header = makeHeader(1, 100, 100);
|
|
183
|
-
const mockProposal = await makeProposal({
|
|
184
|
-
blockHeader: header,
|
|
185
|
-
lastBlockHeader: header,
|
|
186
|
-
signer: currentProposer,
|
|
187
|
-
txHashes: getTxHashes(0)
|
|
188
|
-
});
|
|
189
|
-
mockGetProposer(getAddress(currentProposer), getAddress());
|
|
190
|
-
const result = await validatorWithTxsDisabled.validate(mockProposal);
|
|
191
|
-
expect(result).toEqual({
|
|
192
|
-
result: 'accept'
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
it('returns undefined if txs permitted and proposal contains txHashes', async ()=>{
|
|
196
|
-
const currentProposer = getSigner();
|
|
197
|
-
const header = makeHeader(1, 100, 100);
|
|
198
|
-
const mockProposal = await makeProposal({
|
|
199
|
-
blockHeader: header,
|
|
200
|
-
lastBlockHeader: header,
|
|
201
|
-
signer: currentProposer,
|
|
202
|
-
txHashes: getTxHashes(2)
|
|
203
|
-
});
|
|
204
|
-
mockGetProposer(getAddress(currentProposer), getAddress());
|
|
205
|
-
const result = await validator.validate(mockProposal);
|
|
206
|
-
expect(result).toEqual({
|
|
207
|
-
result: 'accept'
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
}
|
|
@@ -1,230 +0,0 @@
|
|
|
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 {
|
|
5
|
-
type BlockProposal,
|
|
6
|
-
type CheckpointProposal,
|
|
7
|
-
PeerErrorSeverity,
|
|
8
|
-
type ValidationResult,
|
|
9
|
-
} from '@aztec/stdlib/p2p';
|
|
10
|
-
import type { TxHash } from '@aztec/stdlib/tx';
|
|
11
|
-
|
|
12
|
-
import type { MockProxy } from 'jest-mock-extended';
|
|
13
|
-
|
|
14
|
-
export interface ProposalValidatorTestParams<TProposal extends BlockProposal | CheckpointProposal> {
|
|
15
|
-
validatorFactory: (
|
|
16
|
-
epochCache: EpochCacheInterface,
|
|
17
|
-
opts: { txsPermitted: boolean },
|
|
18
|
-
) => { validate: (proposal: TProposal) => Promise<ValidationResult> };
|
|
19
|
-
makeProposal: (options?: any) => Promise<TProposal>;
|
|
20
|
-
makeHeader: (epochNumber: number | bigint, slotNumber: number | bigint, blockNumber: number | bigint) => any;
|
|
21
|
-
getSigner: () => Secp256k1Signer;
|
|
22
|
-
getAddress: (signer?: Secp256k1Signer) => EthAddress;
|
|
23
|
-
getSlot: (slot: number | bigint) => any;
|
|
24
|
-
getTxHashes: (n: number) => TxHash[];
|
|
25
|
-
getTxs: () => any[];
|
|
26
|
-
epochCacheMock: () => MockProxy<EpochCacheInterface>;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function sharedProposalValidatorTests<TProposal extends BlockProposal | CheckpointProposal>(
|
|
30
|
-
params: ProposalValidatorTestParams<TProposal>,
|
|
31
|
-
) {
|
|
32
|
-
const { validatorFactory, makeProposal, makeHeader, getSigner, getAddress, getSlot, getTxHashes, epochCacheMock } =
|
|
33
|
-
params;
|
|
34
|
-
|
|
35
|
-
describe('shared proposal validation logic', () => {
|
|
36
|
-
let epochCache: MockProxy<EpochCacheInterface>;
|
|
37
|
-
let validator: { validate: (proposal: TProposal) => Promise<ValidationResult> };
|
|
38
|
-
const previousSlot = getSlot(99);
|
|
39
|
-
const currentSlot = getSlot(100);
|
|
40
|
-
const nextSlot = getSlot(101);
|
|
41
|
-
|
|
42
|
-
function mockGetProposer(currentProposer: EthAddress, nextProposer: EthAddress, previousProposer?: EthAddress) {
|
|
43
|
-
epochCache.getProposerAttesterAddressInSlot.mockImplementation(slot => {
|
|
44
|
-
if (slot === currentSlot) {
|
|
45
|
-
return Promise.resolve(currentProposer);
|
|
46
|
-
}
|
|
47
|
-
if (slot === nextSlot) {
|
|
48
|
-
return Promise.resolve(nextProposer);
|
|
49
|
-
}
|
|
50
|
-
if (slot === previousSlot && previousProposer) {
|
|
51
|
-
return Promise.resolve(previousProposer);
|
|
52
|
-
}
|
|
53
|
-
throw new Error('Unexpected argument');
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
beforeEach(() => {
|
|
58
|
-
epochCache = epochCacheMock();
|
|
59
|
-
validator = validatorFactory(epochCache, { txsPermitted: true });
|
|
60
|
-
epochCache.getCurrentAndNextSlot.mockReturnValue({
|
|
61
|
-
currentSlot: currentSlot,
|
|
62
|
-
nextSlot: nextSlot,
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('returns high tolerance error if slot number is not current or next slot (outside clock tolerance)', async () => {
|
|
67
|
-
const header = makeHeader(1, 99, 99);
|
|
68
|
-
const mockProposal = await makeProposal({ blockHeader: header, lastBlockHeader: header });
|
|
69
|
-
|
|
70
|
-
// Mock getEpochAndSlotNow to return time OUTSIDE clock tolerance (1000ms elapsed)
|
|
71
|
-
epochCache.getEpochAndSlotNow.mockReturnValue({
|
|
72
|
-
epoch: 1 as any,
|
|
73
|
-
slot: currentSlot,
|
|
74
|
-
ts: 1000n, // slot started at 1000 seconds
|
|
75
|
-
nowMs: 1001000n, // 1000ms elapsed, outside 500ms tolerance
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
epochCache.getProposerAttesterAddressInSlot.mockResolvedValue(getAddress());
|
|
79
|
-
const result = await validator.validate(mockProposal);
|
|
80
|
-
expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.HighToleranceError });
|
|
81
|
-
|
|
82
|
-
// Should not try to resolve proposers if base validation fails
|
|
83
|
-
expect(epochCache.getProposerAttesterAddressInSlot).not.toHaveBeenCalled();
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it('returns ignore if previous slot proposal is within clock tolerance', async () => {
|
|
87
|
-
const previousProposer = getSigner();
|
|
88
|
-
const header = makeHeader(1, 99, 99);
|
|
89
|
-
const mockProposal = await makeProposal({
|
|
90
|
-
blockHeader: header,
|
|
91
|
-
lastBlockHeader: header,
|
|
92
|
-
signer: previousProposer,
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
// Mock getEpochAndSlotNow to return time WITHIN clock tolerance (100ms elapsed)
|
|
96
|
-
epochCache.getEpochAndSlotNow.mockReturnValue({
|
|
97
|
-
epoch: 1 as any,
|
|
98
|
-
slot: currentSlot,
|
|
99
|
-
ts: 1000n, // slot started at 1000 seconds
|
|
100
|
-
nowMs: 1000100n, // 100ms elapsed, within 500ms tolerance
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
mockGetProposer(getAddress(), getAddress(), getAddress(previousProposer));
|
|
104
|
-
const result = await validator.validate(mockProposal);
|
|
105
|
-
expect(result).toEqual({ result: 'ignore' });
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('returns mid tolerance error if proposer is not current proposer for current slot', async () => {
|
|
109
|
-
const currentProposer = getSigner();
|
|
110
|
-
const nextProposer = getSigner();
|
|
111
|
-
const invalidProposer = getSigner();
|
|
112
|
-
const header = makeHeader(1, 100, 100);
|
|
113
|
-
const mockProposal = await makeProposal({
|
|
114
|
-
blockHeader: header,
|
|
115
|
-
lastBlockHeader: header,
|
|
116
|
-
signer: invalidProposer,
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
120
|
-
const result = await validator.validate(mockProposal);
|
|
121
|
-
expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.MidToleranceError });
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it('returns mid tolerance error if proposer is not next proposer for next slot', async () => {
|
|
125
|
-
const currentProposer = getSigner();
|
|
126
|
-
const nextProposer = getSigner();
|
|
127
|
-
const invalidProposer = getSigner();
|
|
128
|
-
const header = makeHeader(1, 101, 101);
|
|
129
|
-
const mockProposal = await makeProposal({
|
|
130
|
-
blockHeader: header,
|
|
131
|
-
lastBlockHeader: header,
|
|
132
|
-
signer: invalidProposer,
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
136
|
-
const result = await validator.validate(mockProposal);
|
|
137
|
-
expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.MidToleranceError });
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it('returns mid tolerance error if proposer is current proposer but proposal is for next slot', async () => {
|
|
141
|
-
const currentProposer = getSigner();
|
|
142
|
-
const nextProposer = getSigner();
|
|
143
|
-
const header = makeHeader(1, 101, 101);
|
|
144
|
-
const mockProposal = await makeProposal({
|
|
145
|
-
blockHeader: header,
|
|
146
|
-
lastBlockHeader: header,
|
|
147
|
-
signer: currentProposer,
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
151
|
-
const result = await validator.validate(mockProposal);
|
|
152
|
-
expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.MidToleranceError });
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it('returns undefined if proposal is valid for current slot and proposer', async () => {
|
|
156
|
-
const currentProposer = getSigner();
|
|
157
|
-
const nextProposer = getSigner();
|
|
158
|
-
const header = makeHeader(1, 100, 100);
|
|
159
|
-
const mockProposal = await makeProposal({
|
|
160
|
-
blockHeader: header,
|
|
161
|
-
lastBlockHeader: header,
|
|
162
|
-
signer: currentProposer,
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
166
|
-
const result = await validator.validate(mockProposal);
|
|
167
|
-
expect(result).toEqual({ result: 'accept' });
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it('returns undefined if proposal is valid for next slot and proposer', async () => {
|
|
171
|
-
const currentProposer = getSigner();
|
|
172
|
-
const nextProposer = getSigner();
|
|
173
|
-
const header = makeHeader(1, 101, 101);
|
|
174
|
-
const mockProposal = await makeProposal({ blockHeader: header, lastBlockHeader: header, signer: nextProposer });
|
|
175
|
-
|
|
176
|
-
mockGetProposer(getAddress(currentProposer), getAddress(nextProposer));
|
|
177
|
-
const result = await validator.validate(mockProposal);
|
|
178
|
-
expect(result).toEqual({ result: 'accept' });
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
describe('transaction permission validation', () => {
|
|
182
|
-
it('returns mid tolerance error if txs not permitted and proposal contains txHashes', async () => {
|
|
183
|
-
const currentProposer = getSigner();
|
|
184
|
-
const validatorWithTxsDisabled = validatorFactory(epochCache, { txsPermitted: false });
|
|
185
|
-
const header = makeHeader(1, 100, 100);
|
|
186
|
-
const mockProposal = await makeProposal({
|
|
187
|
-
blockHeader: header,
|
|
188
|
-
lastBlockHeader: header,
|
|
189
|
-
signer: currentProposer,
|
|
190
|
-
txHashes: getTxHashes(2),
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
mockGetProposer(getAddress(currentProposer), getAddress());
|
|
194
|
-
const result = await validatorWithTxsDisabled.validate(mockProposal);
|
|
195
|
-
expect(result).toEqual({ result: 'reject', severity: PeerErrorSeverity.MidToleranceError });
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it('returns undefined if txs not permitted but proposal has no txHashes', async () => {
|
|
199
|
-
const currentProposer = getSigner();
|
|
200
|
-
const validatorWithTxsDisabled = validatorFactory(epochCache, { txsPermitted: false });
|
|
201
|
-
const header = makeHeader(1, 100, 100);
|
|
202
|
-
const mockProposal = await makeProposal({
|
|
203
|
-
blockHeader: header,
|
|
204
|
-
lastBlockHeader: header,
|
|
205
|
-
signer: currentProposer,
|
|
206
|
-
txHashes: getTxHashes(0),
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
mockGetProposer(getAddress(currentProposer), getAddress());
|
|
210
|
-
const result = await validatorWithTxsDisabled.validate(mockProposal);
|
|
211
|
-
expect(result).toEqual({ result: 'accept' });
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
it('returns undefined if txs permitted and proposal contains txHashes', async () => {
|
|
215
|
-
const currentProposer = getSigner();
|
|
216
|
-
const header = makeHeader(1, 100, 100);
|
|
217
|
-
const mockProposal = await makeProposal({
|
|
218
|
-
blockHeader: header,
|
|
219
|
-
lastBlockHeader: header,
|
|
220
|
-
signer: currentProposer,
|
|
221
|
-
txHashes: getTxHashes(2),
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
mockGetProposer(getAddress(currentProposer), getAddress());
|
|
225
|
-
const result = await validator.validate(mockProposal);
|
|
226
|
-
expect(result).toEqual({ result: 'accept' });
|
|
227
|
-
});
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
}
|