@aztec/p2p 0.0.1-commit.7b97ef96e → 0.0.1-commit.7cbc774
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +9 -1
- package/dest/client/factory.d.ts +7 -7
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +39 -32
- package/dest/client/interface.d.ts +19 -17
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +16 -20
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +94 -105
- package/dest/config.d.ts +154 -106
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +134 -40
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +99 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +267 -197
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +181 -65
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +6 -4
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +33 -15
- 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 +3 -2
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
- 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 +2 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +7 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +4 -4
- 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 +10 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +1 -1
- 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 +8 -6
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +2 -2
- 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 +2 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +18 -9
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +3 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +51 -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 +90 -19
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
- 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 +26 -44
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +5 -3
- 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 +6 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +3 -2
- 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 +256 -220
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +61 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -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 +10 -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 +21 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
- 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 +25 -21
- 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/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +36 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +135 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +252 -61
- 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 +99 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
- package/dest/msg_validators/tx_validator/index.d.ts +5 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +4 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- 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 +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +69 -0
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +5 -5
- package/dest/services/discv5/discV5_service.d.ts +2 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +35 -8
- package/dest/services/dummy_service.d.ts +12 -17
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +13 -20
- package/dest/services/encoding.d.ts +6 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +14 -8
- package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +21 -4
- package/dest/services/libp2p/instrumentation.d.ts +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -0
- package/dest/services/libp2p/libp2p_service.d.ts +47 -55
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +344 -308
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +40 -11
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +32 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +97 -107
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +10 -6
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- package/dest/services/reqresp/config.d.ts +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/interface.d.ts +16 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -20
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +4 -2
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +43 -215
- package/dest/services/service.d.ts +10 -13
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +2 -23
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +2 -55
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/index.d.ts +2 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +0 -1
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +0 -2
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/tx_collection.d.ts +36 -55
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +275 -119
- package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +2 -2
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +4 -14
- package/dest/services/tx_provider.d.ts +5 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +7 -4
- package/dest/test-helpers/make-test-p2p-clients.d.ts +5 -6
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -3
- package/dest/test-helpers/mock-pubsub.d.ts +24 -11
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +45 -45
- package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +17 -19
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +13 -15
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +42 -15
- package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +88 -42
- package/dest/testbench/worker_client_manager.d.ts +12 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +57 -11
- package/dest/util.d.ts +12 -7
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +15 -14
- package/src/bootstrap/bootstrap.ts +9 -1
- package/src/client/factory.ts +74 -49
- package/src/client/interface.ts +20 -30
- package/src/client/p2p_client.ts +108 -156
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +227 -45
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +318 -242
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +204 -68
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +22 -14
- package/src/mem_pools/tx_pool_v2/README.md +9 -1
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +3 -2
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
- 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 +10 -6
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +15 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/index.ts +1 -1
- package/src/mem_pools/tx_pool_v2/interfaces.ts +19 -8
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +130 -23
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +29 -43
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +17 -2
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +267 -229
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
- package/src/msg_validators/clock_tolerance.ts +79 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
- package/src/msg_validators/tx_validator/README.md +127 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +6 -15
- 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/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +44 -1
- package/src/msg_validators/tx_validator/factory.ts +407 -80
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
- package/src/msg_validators/tx_validator/index.ts +4 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +38 -5
- package/src/services/dummy_service.ts +15 -44
- package/src/services/encoding.ts +14 -7
- package/src/services/gossipsub/topic_score_params.ts +36 -4
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +390 -360
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +46 -11
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/README.md +215 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +97 -119
- package/src/services/reqresp/batch-tx-requester/interface.ts +13 -5
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +2 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +4 -2
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +1 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
- package/src/services/reqresp/reqresp.ts +48 -261
- package/src/services/service.ts +13 -29
- package/src/services/tx_collection/config.ts +3 -80
- package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +331 -176
- package/src/services/tx_collection/tx_collection_sink.ts +2 -2
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +7 -2
- package/src/test-helpers/make-test-p2p-clients.ts +4 -3
- package/src/test-helpers/mock-pubsub.ts +49 -66
- package/src/test-helpers/reqresp-nodes.ts +15 -28
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +54 -29
- package/src/testbench/p2p_client_testbench_worker.ts +91 -61
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +33 -18
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/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/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -54
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -327
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -49
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -211
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -346
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -387
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -113
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
2
|
import { type Logger } from '@aztec/foundation/log';
|
|
3
|
-
import { type CheckpointAttestation, type P2PValidator, type ValidationResult } from '@aztec/stdlib/p2p';
|
|
3
|
+
import { type CheckpointAttestation, type CoordinationSignatureContext, type P2PValidator, type ValidationResult } from '@aztec/stdlib/p2p';
|
|
4
4
|
export declare class CheckpointAttestationValidator implements P2PValidator<CheckpointAttestation> {
|
|
5
5
|
protected epochCache: EpochCacheInterface;
|
|
6
6
|
protected logger: Logger;
|
|
7
|
-
|
|
7
|
+
private readonly pipeliningWindow;
|
|
8
|
+
protected readonly signatureContext: CoordinationSignatureContext;
|
|
9
|
+
constructor(epochCache: EpochCacheInterface, opts: {
|
|
10
|
+
l1PublishingTime?: number;
|
|
11
|
+
p2pPropagationTime?: number;
|
|
12
|
+
signatureContext: CoordinationSignatureContext;
|
|
13
|
+
});
|
|
8
14
|
validate(message: CheckpointAttestation): Promise<ValidationResult>;
|
|
9
15
|
}
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvYXR0ZXN0YXRpb25fdmFsaWRhdG9yL2F0dGVzdGF0aW9uX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsS0FBSyxxQkFBcUIsRUFDMUIsS0FBSyw0QkFBNEIsRUFDakMsS0FBSyxZQUFZLEVBRWpCLEtBQUssZ0JBQWdCLEVBRXRCLE1BQU0sbUJBQW1CLENBQUM7QUFJM0IscUJBQWEsOEJBQStCLFlBQVcsWUFBWSxDQUFDLHFCQUFxQixDQUFDO0lBQ3hGLFNBQVMsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDMUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDekIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBbUI7SUFDcEQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSw0QkFBNEIsQ0FBQztJQUVsRSxZQUNFLFVBQVUsRUFBRSxtQkFBbUIsRUFDL0IsSUFBSSxFQUFFO1FBQ0osZ0JBQWdCLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDMUIsa0JBQWtCLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDNUIsZ0JBQWdCLEVBQUUsNEJBQTRCLENBQUM7S0FDaEQsRUFTRjtJQUVLLFFBQVEsQ0FBQyxPQUFPLEVBQUUscUJBQXFCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBNkV4RTtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAEjB,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EACjC,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EAEtB,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,8BAA+B,YAAW,YAAY,CAAC,qBAAqB,CAAC;IACxF,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;IAElE,YACE,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QACJ,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,gBAAgB,EAAE,4BAA4B,CAAC;KAChD,EASF;IAEK,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6ExE;CACF"}
|
|
@@ -1,31 +1,56 @@
|
|
|
1
1
|
import { NoCommitteeError } from '@aztec/ethereum/contracts';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
-
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
4
|
-
import { isWithinClockTolerance } from '../clock_tolerance.js';
|
|
3
|
+
import { PeerErrorSeverity, hasValidSignatureContext } from '@aztec/stdlib/p2p';
|
|
4
|
+
import { PipeliningWindow, isWithinClockTolerance } from '../clock_tolerance.js';
|
|
5
5
|
export class CheckpointAttestationValidator {
|
|
6
6
|
epochCache;
|
|
7
7
|
logger;
|
|
8
|
-
|
|
8
|
+
pipeliningWindow;
|
|
9
|
+
signatureContext;
|
|
10
|
+
constructor(epochCache, opts){
|
|
9
11
|
this.epochCache = epochCache;
|
|
12
|
+
this.pipeliningWindow = new PipeliningWindow(epochCache, {
|
|
13
|
+
l1PublishingTime: opts.l1PublishingTime,
|
|
14
|
+
p2pPropagationTime: opts.p2pPropagationTime
|
|
15
|
+
});
|
|
16
|
+
this.signatureContext = opts.signatureContext;
|
|
10
17
|
this.logger = createLogger('p2p:checkpoint-attestation-validator');
|
|
11
18
|
}
|
|
12
19
|
async validate(message) {
|
|
13
20
|
const slotNumber = message.payload.header.slotNumber;
|
|
14
21
|
try {
|
|
15
|
-
|
|
16
|
-
if (
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
22
|
+
// Cross-chain replay check: reject attestations that carry a foreign signing domain.
|
|
23
|
+
if (!hasValidSignatureContext(message.payload, this.signatureContext)) {
|
|
24
|
+
this.logger.warn(`Rejecting checkpoint attestation with foreign signature context for slot ${slotNumber}`, {
|
|
25
|
+
chainId: message.payload.signatureContext.chainId,
|
|
26
|
+
rollupAddress: message.payload.signatureContext.rollupAddress.toString(),
|
|
27
|
+
expectedChainId: this.signatureContext.chainId,
|
|
28
|
+
expectedRollupAddress: this.signatureContext.rollupAddress.toString()
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
result: 'reject',
|
|
32
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Use target slots since proposals target pipeline slots (slot + 1 when pipelining).
|
|
36
|
+
const { targetSlot, nextSlot } = this.epochCache.getTargetAndNextSlot();
|
|
37
|
+
if (slotNumber !== targetSlot && slotNumber !== nextSlot) {
|
|
38
|
+
// When pipelining, accept attestations for the current slot (built in the previous slot)
|
|
39
|
+
// until the target slot reaches its L1 publish cutoff.
|
|
40
|
+
if (this.pipeliningWindow.acceptsAttestation(slotNumber)) {
|
|
41
|
+
// Fall through to remaining validation (signature, committee, etc.)
|
|
42
|
+
} else if (!isWithinClockTolerance(slotNumber, targetSlot, this.epochCache)) {
|
|
43
|
+
this.logger.warn(`Checkpoint attestation slot ${slotNumber} is not current (${targetSlot}) or next (${nextSlot}) slot`);
|
|
20
44
|
return {
|
|
21
45
|
result: 'reject',
|
|
22
46
|
severity: PeerErrorSeverity.HighToleranceError
|
|
23
47
|
};
|
|
48
|
+
} else {
|
|
49
|
+
this.logger.debug(`Ignoring checkpoint attestation for previous slot ${slotNumber} within clock tolerance`);
|
|
50
|
+
return {
|
|
51
|
+
result: 'ignore'
|
|
52
|
+
};
|
|
24
53
|
}
|
|
25
|
-
this.logger.debug(`Ignoring checkpoint attestation for previous slot ${slotNumber} within clock tolerance`);
|
|
26
|
-
return {
|
|
27
|
-
result: 'ignore'
|
|
28
|
-
};
|
|
29
54
|
}
|
|
30
55
|
// Verify the signature is valid
|
|
31
56
|
const attester = message.getSender();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
-
import { type CheckpointAttestation, type ValidationResult } from '@aztec/stdlib/p2p';
|
|
2
|
+
import { type CheckpointAttestation, type CoordinationSignatureContext, type ValidationResult } from '@aztec/stdlib/p2p';
|
|
3
3
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
4
4
|
import type { AttestationPoolApi } from '../../mem_pools/attestation_pool/attestation_pool.js';
|
|
5
5
|
import { CheckpointAttestationValidator } from './attestation_validator.js';
|
|
@@ -14,7 +14,11 @@ import { CheckpointAttestationValidator } from './attestation_validator.js';
|
|
|
14
14
|
export declare class FishermanAttestationValidator extends CheckpointAttestationValidator {
|
|
15
15
|
private attestationPool;
|
|
16
16
|
private invalidAttestationCounter;
|
|
17
|
-
constructor(epochCache: EpochCacheInterface, attestationPool: AttestationPoolApi, telemetryClient: TelemetryClient
|
|
17
|
+
constructor(epochCache: EpochCacheInterface, attestationPool: AttestationPoolApi, telemetryClient: TelemetryClient, opts: {
|
|
18
|
+
l1PublishingTime?: number;
|
|
19
|
+
p2pPropagationTime?: number;
|
|
20
|
+
signatureContext: CoordinationSignatureContext;
|
|
21
|
+
});
|
|
18
22
|
validate(message: CheckpointAttestation): Promise<ValidationResult>;
|
|
19
23
|
}
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlzaGVybWFuX2F0dGVzdGF0aW9uX3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL2F0dGVzdGF0aW9uX3ZhbGlkYXRvci9maXNoZXJtYW5fYXR0ZXN0YXRpb25fdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUNMLEtBQUsscUJBQXFCLEVBQzFCLEtBQUssNEJBQTRCLEVBRWpDLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUF1QixLQUFLLGVBQWUsRUFBa0MsTUFBTSx5QkFBeUIsQ0FBQztBQUVwSCxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTVFOzs7Ozs7O0dBT0c7QUFDSCxxQkFBYSw2QkFBOEIsU0FBUSw4QkFBOEI7SUFLN0UsT0FBTyxDQUFDLGVBQWU7SUFKekIsT0FBTyxDQUFDLHlCQUF5QixDQUFDO0lBRWxDLFlBQ0UsVUFBVSxFQUFFLG1CQUFtQixFQUN2QixlQUFlLEVBQUUsa0JBQWtCLEVBQzNDLGVBQWUsRUFBRSxlQUFlLEVBQ2hDLElBQUksRUFBRTtRQUNKLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQzFCLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQzVCLGdCQUFnQixFQUFFLDRCQUE0QixDQUFDO0tBQ2hELEVBYUY7SUFFYyxRQUFRLENBQUMsT0FBTyxFQUFFLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQXFEakY7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fisherman_attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/fisherman_attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,
|
|
1
|
+
{"version":3,"file":"fisherman_attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/fisherman_attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EAEjC,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAuB,KAAK,eAAe,EAAkC,MAAM,yBAAyB,CAAC;AAEpH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAC;AAC/F,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAE5E;;;;;;;GAOG;AACH,qBAAa,6BAA8B,SAAQ,8BAA8B;IAK7E,OAAO,CAAC,eAAe;IAJzB,OAAO,CAAC,yBAAyB,CAAC;IAElC,YACE,UAAU,EAAE,mBAAmB,EACvB,eAAe,EAAE,kBAAkB,EAC3C,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE;QACJ,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,gBAAgB,EAAE,4BAA4B,CAAC;KAChD,EAaF;IAEc,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqDjF;CACF"}
|
|
@@ -11,8 +11,8 @@ import { CheckpointAttestationValidator } from './attestation_validator.js';
|
|
|
11
11
|
*/ export class FishermanAttestationValidator extends CheckpointAttestationValidator {
|
|
12
12
|
attestationPool;
|
|
13
13
|
invalidAttestationCounter;
|
|
14
|
-
constructor(epochCache, attestationPool, telemetryClient){
|
|
15
|
-
super(epochCache), this.attestationPool = attestationPool;
|
|
14
|
+
constructor(epochCache, attestationPool, telemetryClient, opts){
|
|
15
|
+
super(epochCache, opts), this.attestationPool = attestationPool;
|
|
16
16
|
this.logger = this.logger.createChild('[FISHERMAN]');
|
|
17
17
|
const meter = telemetryClient.getMeter('FishermanAttestationValidator');
|
|
18
18
|
this.invalidAttestationCounter = createUpDownCounterWithDefault(meter, Metrics.VALIDATOR_INVALID_ATTESTATION_RECEIVED_COUNT, {
|
|
@@ -41,8 +41,7 @@ import { CheckpointAttestationValidator } from './attestation_validator.js';
|
|
|
41
41
|
result: 'accept'
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
|
-
const
|
|
45
|
-
const proposal = await this.attestationPool.getCheckpointProposal(proposalId);
|
|
44
|
+
const proposal = await this.attestationPool.getCheckpointProposal(message.payload.header.slotNumber);
|
|
46
45
|
if (proposal) {
|
|
47
46
|
// Compare the attestation payload with the proposal payload
|
|
48
47
|
if (!message.payload.equals(proposal)) {
|
|
@@ -67,7 +66,7 @@ import { CheckpointAttestationValidator } from './attestation_validator.js';
|
|
|
67
66
|
}
|
|
68
67
|
} else {
|
|
69
68
|
// We might receive attestations before proposals in some cases
|
|
70
|
-
this.logger.debug(`Received attestation for slot ${slotNumberBigInt} but proposal not found yet
|
|
69
|
+
this.logger.debug(`Received attestation for slot ${slotNumberBigInt} but proposal not found yet.`);
|
|
71
70
|
}
|
|
72
71
|
return {
|
|
73
72
|
result: 'accept'
|
|
@@ -18,4 +18,15 @@ export declare const MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS = 500;
|
|
|
18
18
|
* @returns true if the message is for the previous slot AND we're within the clock tolerance window
|
|
19
19
|
*/
|
|
20
20
|
export declare function isWithinClockTolerance(messageSlot: SlotNumber, currentSlot: SlotNumber, epochCache: EpochCacheInterface): boolean;
|
|
21
|
-
|
|
21
|
+
export declare class PipeliningWindow {
|
|
22
|
+
private readonly epochCache;
|
|
23
|
+
private readonly proposalWindowIntoTargetSlot;
|
|
24
|
+
private readonly attestationWindowIntoTargetSlot;
|
|
25
|
+
constructor(epochCache: EpochCacheInterface, opts?: {
|
|
26
|
+
p2pPropagationTime?: number;
|
|
27
|
+
l1PublishingTime?: number;
|
|
28
|
+
});
|
|
29
|
+
acceptsProposal(messageSlot: SlotNumber): boolean;
|
|
30
|
+
acceptsAttestation(messageSlot: SlotNumber): boolean;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2tfdG9sZXJhbmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvY2xvY2tfdG9sZXJhbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRzdEOzs7Ozs7O0dBT0c7QUFDSCxlQUFPLE1BQU0saUNBQWlDLE1BQU0sQ0FBQztBQUVyRDs7Ozs7OztHQU9HO0FBQ0gsd0JBQWdCLHNCQUFzQixDQUNwQyxXQUFXLEVBQUUsVUFBVSxFQUN2QixXQUFXLEVBQUUsVUFBVSxFQUN2QixVQUFVLEVBQUUsbUJBQW1CLEdBQzlCLE9BQU8sQ0EwQlQ7QUE0Q0QscUJBQWEsZ0JBQWdCO0lBS3pCLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVTtJQUo3QixPQUFPLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFTO0lBQ3RELE9BQU8sQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQVM7SUFFekQsWUFDbUIsVUFBVSxFQUFFLG1CQUFtQixFQUNoRCxJQUFJLEdBQUU7UUFDSixrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUM1QixnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztLQUN0QixFQVlQO0lBRU0sZUFBZSxDQUFDLFdBQVcsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUV2RDtJQUVNLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUUxRDtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock_tolerance.d.ts","sourceRoot":"","sources":["../../src/msg_validators/clock_tolerance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"clock_tolerance.d.ts","sourceRoot":"","sources":["../../src/msg_validators/clock_tolerance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAG7D;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,MAAM,CAAC;AAErD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,UAAU,EACvB,WAAW,EAAE,UAAU,EACvB,UAAU,EAAE,mBAAmB,GAC9B,OAAO,CA0BT;AA4CD,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJ7B,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAS;IACtD,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAS;IAEzD,YACmB,UAAU,EAAE,mBAAmB,EAChD,IAAI,GAAE;QACJ,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;KACtB,EAYP;IAEM,eAAe,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAEvD;IAEM,kBAAkB,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAE1D;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { DEFAULT_P2P_PROPAGATION_TIME, createPipelinedCheckpointTimingModel } from '@aztec/stdlib/timetable';
|
|
2
3
|
/**
|
|
3
4
|
* Maximum clock disparity tolerance for P2P message validation (in milliseconds).
|
|
4
5
|
* Messages for the previous slot are accepted if we're within this many milliseconds
|
|
@@ -25,9 +26,10 @@ import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
|
25
26
|
return false;
|
|
26
27
|
}
|
|
27
28
|
// Check how far we are into the current slot (in milliseconds)
|
|
28
|
-
const { ts: slotStartTs, nowMs
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
const { ts: slotStartTs, nowMs } = epochCache.getEpochAndSlotNow();
|
|
30
|
+
const targetSlot = epochCache.getTargetSlot();
|
|
31
|
+
// Sanity check: ensure the epoch cache's target slot matches the expected current slot
|
|
32
|
+
if (targetSlot !== currentSlot) {
|
|
31
33
|
return false;
|
|
32
34
|
}
|
|
33
35
|
// ts is in seconds, convert to ms; nowMs is already in milliseconds
|
|
@@ -35,3 +37,59 @@ import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
|
35
37
|
const elapsedMs = Number(nowMs - slotStartMs);
|
|
36
38
|
return elapsedMs < MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS;
|
|
37
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Checks if a straggler message for the previous target slot should be accepted.
|
|
42
|
+
*
|
|
43
|
+
* Under pipelining, proposals and attestations carry the target slot N. Most of the
|
|
44
|
+
* time the receiver is either still in the build slot N-1 (accepted via the main
|
|
45
|
+
* `slotNumber === targetSlot` match) or in the target slot N (accepted via
|
|
46
|
+
* `slotNumber === nextSlot` when pipelining is disabled, or again via `targetSlot`
|
|
47
|
+
* when the receiver itself is pipelining). Stragglers that arrive after the receiver
|
|
48
|
+
* has rolled past the target slot fall to this check: accept `messageSlot === slotNow`
|
|
49
|
+
* while we're still within the first `windowSeconds + clock-disparity` of the slot.
|
|
50
|
+
*
|
|
51
|
+
* Under the early-pipelining schedule `windowSeconds` is small (0 for proposals,
|
|
52
|
+
* `2*p2pPropagationTime` for attestations) since the proposer collects everything
|
|
53
|
+
* before the slot boundary.
|
|
54
|
+
*
|
|
55
|
+
* @param messageSlot - The slot number from the received message
|
|
56
|
+
* @param epochCache - EpochCache to get timing and pipelining state
|
|
57
|
+
* @param windowSeconds - How far into the current slot we still accept previous-target messages
|
|
58
|
+
* @returns true if pipelining is enabled, the message is for the current wallclock slot, and we're within the grace period
|
|
59
|
+
*/ function isWithinPipeliningWindow(messageSlot, epochCache, windowSeconds) {
|
|
60
|
+
if (!epochCache.isProposerPipeliningEnabled()) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const currentSlot = epochCache.getSlotNow();
|
|
64
|
+
if (messageSlot !== currentSlot) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
const { ts: slotStartTs, nowMs } = epochCache.getEpochAndSlotNow();
|
|
68
|
+
const slotStartMs = slotStartTs * 1000n;
|
|
69
|
+
const elapsedMs = Number(nowMs - slotStartMs);
|
|
70
|
+
const windowMs = windowSeconds * 1000 + MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS;
|
|
71
|
+
return elapsedMs < windowMs;
|
|
72
|
+
}
|
|
73
|
+
export class PipeliningWindow {
|
|
74
|
+
epochCache;
|
|
75
|
+
proposalWindowIntoTargetSlot;
|
|
76
|
+
attestationWindowIntoTargetSlot;
|
|
77
|
+
constructor(epochCache, opts = {}){
|
|
78
|
+
this.epochCache = epochCache;
|
|
79
|
+
const l1Constants = epochCache.getL1Constants();
|
|
80
|
+
const checkpointTiming = createPipelinedCheckpointTimingModel({
|
|
81
|
+
aztecSlotDuration: l1Constants.slotDuration,
|
|
82
|
+
ethereumSlotDuration: l1Constants.ethereumSlotDuration,
|
|
83
|
+
l1PublishingTime: opts.l1PublishingTime ?? l1Constants.ethereumSlotDuration,
|
|
84
|
+
p2pPropagationTime: opts.p2pPropagationTime ?? DEFAULT_P2P_PROPAGATION_TIME
|
|
85
|
+
});
|
|
86
|
+
this.proposalWindowIntoTargetSlot = checkpointTiming.proposalWindowIntoTargetSlot;
|
|
87
|
+
this.attestationWindowIntoTargetSlot = checkpointTiming.attestationWindowIntoTargetSlot;
|
|
88
|
+
}
|
|
89
|
+
acceptsProposal(messageSlot) {
|
|
90
|
+
return isWithinPipeliningWindow(messageSlot, this.epochCache, this.proposalWindowIntoTargetSlot);
|
|
91
|
+
}
|
|
92
|
+
acceptsAttestation(messageSlot) {
|
|
93
|
+
return isWithinPipeliningWindow(messageSlot, this.epochCache, this.attestationWindowIntoTargetSlot);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
-
import type { BlockProposal, P2PValidator } from '@aztec/stdlib/p2p';
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import type { BlockProposal, CoordinationSignatureContext, P2PValidator, ValidationResult } from '@aztec/stdlib/p2p';
|
|
3
|
+
export declare class BlockProposalValidator implements P2PValidator<BlockProposal> {
|
|
4
|
+
private proposalValidator;
|
|
5
5
|
constructor(epochCache: EpochCacheInterface, opts: {
|
|
6
6
|
txsPermitted: boolean;
|
|
7
|
+
maxTxsPerBlock?: number;
|
|
8
|
+
maxBlocksPerCheckpoint?: number;
|
|
9
|
+
p2pPropagationTime?: number;
|
|
10
|
+
skipSlotValidation?: boolean;
|
|
11
|
+
signatureContext: CoordinationSignatureContext;
|
|
7
12
|
});
|
|
13
|
+
validate(proposal: BlockProposal): Promise<ValidationResult>;
|
|
8
14
|
}
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfcHJvcG9zYWxfdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvcHJvcG9zYWxfdmFsaWRhdG9yL2Jsb2NrX3Byb3Bvc2FsX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSw0QkFBNEIsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUlySCxxQkFBYSxzQkFBdUIsWUFBVyxZQUFZLENBQUMsYUFBYSxDQUFDO0lBQ3hFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBb0I7SUFFN0MsWUFDRSxVQUFVLEVBQUUsbUJBQW1CLEVBQy9CLElBQUksRUFBRTtRQUNKLFlBQVksRUFBRSxPQUFPLENBQUM7UUFDdEIsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ3hCLHNCQUFzQixDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ2hDLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQzVCLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxDQUFDO1FBQzdCLGdCQUFnQixFQUFFLDRCQUE0QixDQUFDO0tBQ2hELEVBR0Y7SUFFSyxRQUFRLENBQUMsUUFBUSxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FNakU7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/block_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"block_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/block_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,4BAA4B,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIrH,qBAAa,sBAAuB,YAAW,YAAY,CAAC,aAAa,CAAC;IACxE,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,YACE,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QACJ,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,sBAAsB,CAAC,EAAE,MAAM,CAAC;QAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,gBAAgB,EAAE,4BAA4B,CAAC;KAChD,EAGF;IAEK,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAMjE;CACF"}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
|
|
2
|
-
export class BlockProposalValidator
|
|
2
|
+
export class BlockProposalValidator {
|
|
3
|
+
proposalValidator;
|
|
3
4
|
constructor(epochCache, opts){
|
|
4
|
-
|
|
5
|
+
this.proposalValidator = new ProposalValidator(epochCache, opts, 'p2p:block_proposal_validator');
|
|
6
|
+
}
|
|
7
|
+
async validate(proposal) {
|
|
8
|
+
const headerResult = await this.proposalValidator.validate(proposal);
|
|
9
|
+
if (headerResult.result !== 'accept') {
|
|
10
|
+
return headerResult;
|
|
11
|
+
}
|
|
12
|
+
return this.proposalValidator.validateTxs(proposal);
|
|
5
13
|
}
|
|
6
14
|
}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
-
import type { CheckpointProposal, P2PValidator } from '@aztec/stdlib/p2p';
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import type { CheckpointProposal, CoordinationSignatureContext, P2PValidator, ValidationResult } from '@aztec/stdlib/p2p';
|
|
3
|
+
export declare class CheckpointProposalValidator implements P2PValidator<CheckpointProposal> {
|
|
4
|
+
private proposalValidator;
|
|
5
5
|
constructor(epochCache: EpochCacheInterface, opts: {
|
|
6
6
|
txsPermitted: boolean;
|
|
7
|
+
maxTxsPerBlock?: number;
|
|
8
|
+
maxBlocksPerCheckpoint?: number;
|
|
9
|
+
p2pPropagationTime?: number;
|
|
10
|
+
skipSlotValidation?: boolean;
|
|
11
|
+
signatureContext: CoordinationSignatureContext;
|
|
7
12
|
});
|
|
13
|
+
validate(proposal: CheckpointProposal): Promise<ValidationResult>;
|
|
8
14
|
}
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9wcm9wb3NhbF92YWxpZGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9wcm9wb3NhbF92YWxpZGF0b3IvY2hlY2twb2ludF9wcm9wb3NhbF92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFDVixrQkFBa0IsRUFDbEIsNEJBQTRCLEVBQzVCLFlBQVksRUFDWixnQkFBZ0IsRUFDakIsTUFBTSxtQkFBbUIsQ0FBQztBQUkzQixxQkFBYSwyQkFBNEIsWUFBVyxZQUFZLENBQUMsa0JBQWtCLENBQUM7SUFDbEYsT0FBTyxDQUFDLGlCQUFpQixDQUFvQjtJQUU3QyxZQUNFLFVBQVUsRUFBRSxtQkFBbUIsRUFDL0IsSUFBSSxFQUFFO1FBQ0osWUFBWSxFQUFFLE9BQU8sQ0FBQztRQUN0QixjQUFjLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDeEIsc0JBQXNCLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDaEMsa0JBQWtCLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDNUIsa0JBQWtCLENBQUMsRUFBRSxPQUFPLENBQUM7UUFDN0IsZ0JBQWdCLEVBQUUsNEJBQTRCLENBQUM7S0FDaEQsRUFHRjtJQUVLLFFBQVEsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBWXRFO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"checkpoint_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,YAAY,EACZ,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,2BAA4B,YAAW,YAAY,CAAC,kBAAkB,CAAC;IAClF,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,YACE,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QACJ,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,sBAAsB,CAAC,EAAE,MAAM,CAAC;QAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,gBAAgB,EAAE,4BAA4B,CAAC;KAChD,EAGF;IAEK,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAYtE;CACF"}
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import { ProposalValidator } from '../proposal_validator/proposal_validator.js';
|
|
2
|
-
export class CheckpointProposalValidator
|
|
2
|
+
export class CheckpointProposalValidator {
|
|
3
|
+
proposalValidator;
|
|
3
4
|
constructor(epochCache, opts){
|
|
4
|
-
|
|
5
|
+
this.proposalValidator = new ProposalValidator(epochCache, opts, 'p2p:checkpoint_proposal_validator');
|
|
6
|
+
}
|
|
7
|
+
async validate(proposal) {
|
|
8
|
+
const headerResult = await this.proposalValidator.validate(proposal);
|
|
9
|
+
if (headerResult.result !== 'accept') {
|
|
10
|
+
return headerResult;
|
|
11
|
+
}
|
|
12
|
+
const blockProposal = proposal.getBlockProposal();
|
|
13
|
+
if (blockProposal) {
|
|
14
|
+
return this.proposalValidator.validateTxs(blockProposal);
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
result: 'accept'
|
|
18
|
+
};
|
|
5
19
|
}
|
|
6
20
|
}
|
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
-
import { type
|
|
3
|
-
|
|
4
|
-
export declare
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
import { type BlockProposal, type CheckpointProposalCore, type CoordinationSignatureContext, type ValidationResult } from '@aztec/stdlib/p2p';
|
|
3
|
+
/** Validates header-level and tx-level fields of block and checkpoint proposals. */
|
|
4
|
+
export declare class ProposalValidator {
|
|
5
|
+
private epochCache;
|
|
6
|
+
private logger;
|
|
7
|
+
private txsPermitted;
|
|
8
|
+
private maxTxsPerBlock?;
|
|
9
|
+
private maxBlocksPerCheckpoint?;
|
|
10
|
+
private pipeliningWindow;
|
|
11
|
+
private skipSlotValidation;
|
|
12
|
+
private signatureContext;
|
|
8
13
|
constructor(epochCache: EpochCacheInterface, opts: {
|
|
9
14
|
txsPermitted: boolean;
|
|
15
|
+
maxTxsPerBlock?: number;
|
|
16
|
+
maxBlocksPerCheckpoint?: number;
|
|
17
|
+
p2pPropagationTime?: number;
|
|
18
|
+
skipSlotValidation?: boolean;
|
|
19
|
+
signatureContext: CoordinationSignatureContext;
|
|
10
20
|
}, loggerName: string);
|
|
11
|
-
|
|
21
|
+
/** Validates header-level fields: slot, signature, and proposer. */
|
|
22
|
+
validate(proposal: BlockProposal | CheckpointProposalCore): Promise<ValidationResult>;
|
|
23
|
+
/** Validates transaction-related fields of a block proposal. */
|
|
24
|
+
validateTxs(proposal: BlockProposal): Promise<ValidationResult>;
|
|
12
25
|
}
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvcHJvcG9zYWxfdmFsaWRhdG9yL3Byb3Bvc2FsX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sRUFDTCxLQUFLLGFBQWEsRUFDbEIsS0FBSyxzQkFBc0IsRUFDM0IsS0FBSyw0QkFBNEIsRUFFakMsS0FBSyxnQkFBZ0IsRUFFdEIsTUFBTSxtQkFBbUIsQ0FBQztBQUkzQixvRkFBb0Y7QUFDcEYscUJBQWEsaUJBQWlCO0lBQzVCLE9BQU8sQ0FBQyxVQUFVLENBQXNCO0lBQ3hDLE9BQU8sQ0FBQyxNQUFNLENBQVM7SUFDdkIsT0FBTyxDQUFDLFlBQVksQ0FBVTtJQUM5QixPQUFPLENBQUMsY0FBYyxDQUFDLENBQVM7SUFDaEMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQVM7SUFDeEMsT0FBTyxDQUFDLGdCQUFnQixDQUFtQjtJQUMzQyxPQUFPLENBQUMsa0JBQWtCLENBQVU7SUFDcEMsT0FBTyxDQUFDLGdCQUFnQixDQUErQjtJQUV2RCxZQUNFLFVBQVUsRUFBRSxtQkFBbUIsRUFDL0IsSUFBSSxFQUFFO1FBQ0osWUFBWSxFQUFFLE9BQU8sQ0FBQztRQUN0QixjQUFjLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDeEIsc0JBQXNCLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDaEMsa0JBQWtCLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDNUIsa0JBQWtCLENBQUMsRUFBRSxPQUFPLENBQUM7UUFDN0IsZ0JBQWdCLEVBQUUsNEJBQTRCLENBQUM7S0FDaEQsRUFDRCxVQUFVLEVBQUUsTUFBTSxFQVVuQjtJQUVELG9FQUFvRTtJQUN2RCxRQUFRLENBQUMsUUFBUSxFQUFFLGFBQWEsR0FBRyxzQkFBc0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FrRWpHO0lBRUQsZ0VBQWdFO0lBQ25ELFdBQVcsQ0FBQyxRQUFRLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQXdDM0U7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EAEjC,KAAK,gBAAgB,EAEtB,MAAM,mBAAmB,CAAC;AAI3B,oFAAoF;AACpF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,sBAAsB,CAAC,CAAS;IACxC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,gBAAgB,CAA+B;IAEvD,YACE,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QACJ,YAAY,EAAE,OAAO,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,sBAAsB,CAAC,EAAE,MAAM,CAAC;QAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,gBAAgB,EAAE,4BAA4B,CAAC;KAChD,EACD,UAAU,EAAE,MAAM,EAUnB;IAED,oEAAoE;IACvD,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkEjG;IAED,gEAAgE;IACnD,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwC3E;CACF"}
|
|
@@ -1,37 +1,66 @@
|
|
|
1
1
|
import { NoCommitteeError } from '@aztec/ethereum/contracts';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
-
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
4
|
-
import { isWithinClockTolerance } from '../clock_tolerance.js';
|
|
5
|
-
export class ProposalValidator {
|
|
3
|
+
import { PeerErrorSeverity, hasValidSignatureContext } from '@aztec/stdlib/p2p';
|
|
4
|
+
import { PipeliningWindow, isWithinClockTolerance } from '../clock_tolerance.js';
|
|
5
|
+
/** Validates header-level and tx-level fields of block and checkpoint proposals. */ export class ProposalValidator {
|
|
6
6
|
epochCache;
|
|
7
7
|
logger;
|
|
8
8
|
txsPermitted;
|
|
9
|
+
maxTxsPerBlock;
|
|
10
|
+
maxBlocksPerCheckpoint;
|
|
11
|
+
pipeliningWindow;
|
|
12
|
+
skipSlotValidation;
|
|
13
|
+
signatureContext;
|
|
9
14
|
constructor(epochCache, opts, loggerName){
|
|
10
15
|
this.epochCache = epochCache;
|
|
11
16
|
this.txsPermitted = opts.txsPermitted;
|
|
17
|
+
this.maxTxsPerBlock = opts.maxTxsPerBlock;
|
|
18
|
+
this.maxBlocksPerCheckpoint = opts.maxBlocksPerCheckpoint;
|
|
19
|
+
this.pipeliningWindow = new PipeliningWindow(epochCache, {
|
|
20
|
+
p2pPropagationTime: opts.p2pPropagationTime
|
|
21
|
+
});
|
|
22
|
+
this.skipSlotValidation = opts.skipSlotValidation ?? false;
|
|
23
|
+
this.signatureContext = opts.signatureContext;
|
|
12
24
|
this.logger = createLogger(loggerName);
|
|
13
25
|
}
|
|
14
|
-
async validate(proposal) {
|
|
26
|
+
/** Validates header-level fields: slot, signature, and proposer. */ async validate(proposal) {
|
|
15
27
|
try {
|
|
16
|
-
//
|
|
17
|
-
|
|
28
|
+
// Cross-chain replay check: reject proposals that carry a foreign signing domain.
|
|
29
|
+
if (!hasValidSignatureContext(proposal, this.signatureContext)) {
|
|
30
|
+
this.logger.warn(`Penalizing peer for proposal with foreign signature context`, {
|
|
31
|
+
chainId: proposal.signatureContext.chainId,
|
|
32
|
+
rollupAddress: proposal.signatureContext.rollupAddress.toString(),
|
|
33
|
+
expectedChainId: this.signatureContext.chainId,
|
|
34
|
+
expectedRollupAddress: this.signatureContext.rollupAddress.toString()
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
result: 'reject',
|
|
38
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Slot check: use target slots since proposals target pipeline slots (slot + 1 when pipelining).
|
|
42
|
+
const { targetSlot, nextSlot } = this.epochCache.getTargetAndNextSlot();
|
|
18
43
|
const slotNumber = proposal.slotNumber;
|
|
19
|
-
if (slotNumber !==
|
|
20
|
-
//
|
|
21
|
-
if
|
|
44
|
+
if (!this.skipSlotValidation && slotNumber !== targetSlot && slotNumber !== nextSlot) {
|
|
45
|
+
// When pipelining, accept proposals for the current slot (built in the previous slot)
|
|
46
|
+
// if they're still within the shared proposal acceptance window.
|
|
47
|
+
if (this.pipeliningWindow.acceptsProposal(slotNumber)) {
|
|
48
|
+
// Fall through to remaining validation (signature, proposer, etc.)
|
|
49
|
+
} else if (!isWithinClockTolerance(slotNumber, targetSlot, this.epochCache)) {
|
|
22
50
|
this.logger.warn(`Penalizing peer for invalid slot number ${slotNumber}`, {
|
|
23
|
-
|
|
51
|
+
targetSlot,
|
|
24
52
|
nextSlot
|
|
25
53
|
});
|
|
26
54
|
return {
|
|
27
55
|
result: 'reject',
|
|
28
56
|
severity: PeerErrorSeverity.HighToleranceError
|
|
29
57
|
};
|
|
58
|
+
} else {
|
|
59
|
+
this.logger.verbose(`Ignoring proposal for previous slot ${slotNumber} within clock tolerance`);
|
|
60
|
+
return {
|
|
61
|
+
result: 'ignore'
|
|
62
|
+
};
|
|
30
63
|
}
|
|
31
|
-
this.logger.verbose(`Ignoring proposal for previous slot ${slotNumber} within clock tolerance`);
|
|
32
|
-
return {
|
|
33
|
-
result: 'ignore'
|
|
34
|
-
};
|
|
35
64
|
}
|
|
36
65
|
// Signature validity
|
|
37
66
|
const proposer = proposal.getSender();
|
|
@@ -42,29 +71,6 @@ export class ProposalValidator {
|
|
|
42
71
|
severity: PeerErrorSeverity.MidToleranceError
|
|
43
72
|
};
|
|
44
73
|
}
|
|
45
|
-
// Transactions permitted check
|
|
46
|
-
const embeddedTxCount = proposal.txs?.length ?? 0;
|
|
47
|
-
if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
|
|
48
|
-
this.logger.warn(`Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`);
|
|
49
|
-
return {
|
|
50
|
-
result: 'reject',
|
|
51
|
-
severity: PeerErrorSeverity.MidToleranceError
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
// Embedded txs must be listed in txHashes
|
|
55
|
-
const hashSet = new Set(proposal.txHashes.map((h)=>h.toString()));
|
|
56
|
-
const missingTxHashes = embeddedTxCount > 0 ? proposal.txs.filter((tx)=>!hashSet.has(tx.getTxHash().toString())).map((tx)=>tx.getTxHash().toString()) : [];
|
|
57
|
-
if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
|
|
58
|
-
this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
|
|
59
|
-
embeddedTxCount,
|
|
60
|
-
txHashesLength: proposal.txHashes.length,
|
|
61
|
-
missingTxHashes
|
|
62
|
-
});
|
|
63
|
-
return {
|
|
64
|
-
result: 'reject',
|
|
65
|
-
severity: PeerErrorSeverity.MidToleranceError
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
74
|
// Proposer check
|
|
69
75
|
const expectedProposer = await this.epochCache.getProposerAttesterAddressInSlot(slotNumber);
|
|
70
76
|
if (expectedProposer !== undefined && !proposer.equals(expectedProposer)) {
|
|
@@ -77,15 +83,11 @@ export class ProposalValidator {
|
|
|
77
83
|
severity: PeerErrorSeverity.MidToleranceError
|
|
78
84
|
};
|
|
79
85
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
this.logger.warn(`Penalizing peer for invalid tx hashes in proposal`, {
|
|
83
|
-
proposer,
|
|
84
|
-
slotNumber
|
|
85
|
-
});
|
|
86
|
+
if (this.maxBlocksPerCheckpoint !== undefined && 'indexWithinCheckpoint' in proposal && proposal.indexWithinCheckpoint >= this.maxBlocksPerCheckpoint) {
|
|
87
|
+
this.logger.warn(`Penalizing peer for proposal with indexWithinCheckpoint ${proposal.indexWithinCheckpoint} >= max ${this.maxBlocksPerCheckpoint}`);
|
|
86
88
|
return {
|
|
87
89
|
result: 'reject',
|
|
88
|
-
severity: PeerErrorSeverity.
|
|
90
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
89
91
|
};
|
|
90
92
|
}
|
|
91
93
|
return {
|
|
@@ -101,4 +103,48 @@ export class ProposalValidator {
|
|
|
101
103
|
throw e;
|
|
102
104
|
}
|
|
103
105
|
}
|
|
106
|
+
/** Validates transaction-related fields of a block proposal. */ async validateTxs(proposal) {
|
|
107
|
+
// Transactions permitted check
|
|
108
|
+
const embeddedTxCount = proposal.txs?.length ?? 0;
|
|
109
|
+
if (!this.txsPermitted && (proposal.txHashes.length > 0 || embeddedTxCount > 0)) {
|
|
110
|
+
this.logger.warn(`Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when transactions are not permitted`);
|
|
111
|
+
return {
|
|
112
|
+
result: 'reject',
|
|
113
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// Max txs per block check
|
|
117
|
+
if (this.maxTxsPerBlock !== undefined && proposal.txHashes.length > this.maxTxsPerBlock) {
|
|
118
|
+
this.logger.warn(`Penalizing peer for proposal with ${proposal.txHashes.length} transaction(s) when max is ${this.maxTxsPerBlock}`);
|
|
119
|
+
return {
|
|
120
|
+
result: 'reject',
|
|
121
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// Embedded txs must be listed in txHashes
|
|
125
|
+
const hashSet = new Set(proposal.txHashes.map((h)=>h.toString()));
|
|
126
|
+
const missingTxHashes = embeddedTxCount > 0 ? proposal.txs.filter((tx)=>!hashSet.has(tx.getTxHash().toString())).map((tx)=>tx.getTxHash().toString()) : [];
|
|
127
|
+
if (embeddedTxCount > 0 && missingTxHashes.length > 0) {
|
|
128
|
+
this.logger.warn('Penalizing peer for embedded transaction(s) not included in txHashes', {
|
|
129
|
+
embeddedTxCount,
|
|
130
|
+
txHashesLength: proposal.txHashes.length,
|
|
131
|
+
missingTxHashes
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
result: 'reject',
|
|
135
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// Validate tx hashes for all txs embedded in the proposal
|
|
139
|
+
if (!(await Promise.all(proposal.txs?.map((tx)=>tx.validateTxHash()) ?? [])).every((v)=>v)) {
|
|
140
|
+
this.logger.warn(`Penalizing peer for invalid tx hashes in proposal`);
|
|
141
|
+
return {
|
|
142
|
+
result: 'reject',
|
|
143
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
result: 'accept'
|
|
148
|
+
};
|
|
149
|
+
}
|
|
104
150
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { TxValidationResult, TxValidator } from '@aztec/stdlib/tx';
|
|
2
2
|
export declare class AggregateTxValidator<T> implements TxValidator<T> {
|
|
3
|
-
|
|
3
|
+
readonly validators: TxValidator<T>[];
|
|
4
4
|
constructor(...validators: TxValidator<T>[]);
|
|
5
5
|
validateTx(tx: T): Promise<TxValidationResult>;
|
|
6
6
|
}
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlX3R4X3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL3R4X3ZhbGlkYXRvci9hZ2dyZWdhdGVfdHhfdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXhFLHFCQUFhLG9CQUFvQixDQUFDLENBQUMsQ0FBRSxZQUFXLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDNUQsUUFBUSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN0QyxZQUFZLEdBQUcsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQU0xQztJQUVLLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQVNuRDtDQUNGIn0=
|