@aztec/p2p 0.0.1-commit.f504929 → 0.0.1-commit.f5a9928
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 +130 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +22 -6
- package/dest/client/factory.d.ts +5 -4
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +39 -16
- package/dest/client/interface.d.ts +52 -12
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +36 -20
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +142 -81
- package/dest/config.d.ts +163 -98
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +130 -20
- 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 +9 -16
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +10 -17
- 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 +101 -59
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +272 -199
- 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 +224 -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 +9 -4
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +28 -9
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +10 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +29 -20
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
- 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 -4
- 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 +3 -1
- 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 +64 -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_mining_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +6 -7
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
- 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 +6 -5
- 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/instrumentation.d.ts +11 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +24 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +41 -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 +29 -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 +46 -16
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -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 +55 -41
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +19 -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 +86 -32
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +50 -6
- 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 +262 -131
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +38 -15
- 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/proposal_validator/block_proposal_validator.d.ts +11 -5
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +11 -3
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +11 -5
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +23 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +35 -10
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +128 -56
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -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 +21 -32
- 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 +25 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +55 -16
- 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 +53 -7
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +88 -41
- package/dest/msg_validators/tx_validator/index.d.ts +4 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +3 -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/phases_validator.d.ts +21 -1
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +49 -2
- 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 +68 -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 +13 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +119 -23
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +18 -16
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +21 -16
- package/dest/services/encoding.d.ts +23 -6
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +32 -16
- package/dest/services/gossipsub/topic_score_params.d.ts +6 -12
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +4 -14
- package/dest/services/libp2p/instrumentation.d.ts +6 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +21 -0
- package/dest/services/libp2p/libp2p_service.d.ts +51 -51
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +499 -333
- package/dest/services/peer-manager/peer_manager.d.ts +31 -3
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +125 -25
- package/dest/services/peer-manager/peer_scoring.d.ts +34 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +102 -13
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -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 +81 -86
- 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 +3 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
- 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 +15 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +11 -0
- 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/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- 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 +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
- 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 +42 -24
- 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 +3 -13
- 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 +73 -215
- package/dest/services/service.d.ts +43 -18
- 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 +13 -8
- 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 +3 -1
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +3 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -2
- package/dest/test-helpers/mock-pubsub.d.ts +33 -9
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +57 -44
- package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +16 -18
- 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 +15 -14
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +49 -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 +104 -41
- 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 +17 -17
- package/src/bootstrap/bootstrap.ts +17 -3
- package/src/client/factory.ts +62 -9
- package/src/client/interface.ts +48 -18
- package/src/client/p2p_client.ts +159 -113
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +233 -20
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +13 -19
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +327 -242
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +244 -69
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/instrumentation.ts +18 -12
- package/src/mem_pools/tx_pool_v2/README.md +9 -1
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +30 -20
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +4 -5
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
- 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 +67 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +11 -1
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +5 -7
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -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/instrumentation.ts +27 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +40 -8
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +72 -20
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +62 -41
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +107 -32
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +291 -137
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +46 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +15 -7
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +26 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +43 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +150 -58
- package/src/msg_validators/tx_validator/README.md +17 -3
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +16 -35
- 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 +66 -9
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +117 -39
- package/src/msg_validators/tx_validator/index.ts +3 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/phases_validator.ts +60 -1
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/data_store.ts +5 -13
- package/src/services/discv5/discV5_service.ts +126 -14
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +26 -40
- package/src/services/encoding.ts +35 -19
- package/src/services/gossipsub/README.md +33 -11
- package/src/services/gossipsub/topic_score_params.ts +9 -18
- package/src/services/libp2p/instrumentation.ts +22 -0
- package/src/services/libp2p/libp2p_service.ts +560 -369
- package/src/services/peer-manager/peer_manager.ts +138 -24
- package/src/services/peer-manager/peer_scoring.ts +102 -8
- package/src/services/reqresp/README.md +194 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +77 -95
- 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 +5 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +19 -2
- package/src/services/reqresp/interface.ts +21 -47
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
- 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 +3 -13
- package/src/services/reqresp/reqresp.ts +84 -259
- package/src/services/service.ts +51 -35
- 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 +10 -8
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +5 -0
- package/src/test-helpers/make-test-p2p-clients.ts +4 -1
- package/src/test-helpers/mock-pubsub.ts +61 -60
- package/src/test-helpers/reqresp-nodes.ts +13 -23
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +63 -28
- package/src/testbench/p2p_client_testbench_worker.ts +111 -57
- 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 -304
- 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/clock_tolerance.d.ts +0 -21
- package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
- package/dest/msg_validators/clock_tolerance.js +0 -37
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -24
- 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 -378
- 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 -345
- 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/clock_tolerance.ts +0 -51
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -373
- 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,7 +1,9 @@
|
|
|
1
1
|
import { IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
-
import
|
|
4
|
+
import { Signature } from '@aztec/foundation/eth-signature';
|
|
5
|
+
import type { BlockProposal, CheckpointProposalCore } from '@aztec/stdlib/p2p';
|
|
6
|
+
import { CheckpointAttestation } from '@aztec/stdlib/p2p';
|
|
5
7
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
6
8
|
import {
|
|
7
9
|
makeBlockHeader,
|
|
@@ -28,9 +30,16 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
28
30
|
signers = Array.from({ length: NUMBER_OF_SIGNERS_PER_TEST }, () => Secp256k1Signer.random());
|
|
29
31
|
});
|
|
30
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Build attestations from each signer over the *same* signed payload (same header,
|
|
35
|
+
* archive, feeAssetPriceModifier). Required by the new pool, which deduplicates by
|
|
36
|
+
* payload hash and treats attestations from different signers as distinct entries
|
|
37
|
+
* only when the payload itself matches.
|
|
38
|
+
*/
|
|
31
39
|
const createCheckpointAttestationsForSlot = (slotNumber: number, archive?: Fr) => {
|
|
32
40
|
const archiveToUse = archive ?? Fr.random();
|
|
33
|
-
|
|
41
|
+
const sharedHeader = CheckpointHeader.random({ slotNumber: SlotNumber(slotNumber) });
|
|
42
|
+
return signers.map(signer => mockCheckpointAttestation(signer, slotNumber, archiveToUse, sharedHeader));
|
|
34
43
|
};
|
|
35
44
|
|
|
36
45
|
const mockBlockProposalForPool = (
|
|
@@ -55,17 +64,58 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
55
64
|
expect(a1Buffer).toEqual(expect.arrayContaining(a2Buffer));
|
|
56
65
|
};
|
|
57
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Rewrites the attester signature into yParity form (27 -> 0, 28 -> 1), keeping (r, s). The recovery
|
|
69
|
+
* bit is unchanged so it still recovers to the same signer, mimicking a peer that gossips (or mutates
|
|
70
|
+
* in flight) a signature with a non-canonical recovery byte.
|
|
71
|
+
*/
|
|
72
|
+
const toYParityForm = (attestation: CheckpointAttestation): CheckpointAttestation => {
|
|
73
|
+
const sig = attestation.signature;
|
|
74
|
+
const yParityV = sig.v === 27 ? 0 : sig.v === 28 ? 1 : sig.v;
|
|
75
|
+
return new CheckpointAttestation(
|
|
76
|
+
attestation.payload,
|
|
77
|
+
new Signature(sig.r, sig.s, yParityV),
|
|
78
|
+
attestation.proposerSignature,
|
|
79
|
+
);
|
|
80
|
+
};
|
|
81
|
+
|
|
58
82
|
describe('CheckpointAttestation', () => {
|
|
83
|
+
it('normalizes yParity (v=0/v=1) attester signatures on ingress from both gossip and own keys', async () => {
|
|
84
|
+
const slotNumber = 421;
|
|
85
|
+
const canonical = createCheckpointAttestationsForSlot(slotNumber);
|
|
86
|
+
const payloadHash = canonical[0].getPayloadHash();
|
|
87
|
+
const expectedSenders = new Set([canonical[0].getSender()!.toString(), canonical[1].getSender()!.toString()]);
|
|
88
|
+
|
|
89
|
+
const gossiped = toYParityForm(canonical[0]);
|
|
90
|
+
expect([0, 1]).toContain(gossiped.signature.v);
|
|
91
|
+
await ap.tryAddCheckpointAttestation(gossiped);
|
|
92
|
+
|
|
93
|
+
const own = toYParityForm(canonical[1]);
|
|
94
|
+
expect([0, 1]).toContain(own.signature.v);
|
|
95
|
+
await ap.addOwnCheckpointAttestations([own]);
|
|
96
|
+
|
|
97
|
+
const retrieved = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
98
|
+
expect(retrieved.length).toBe(2);
|
|
99
|
+
for (const attestation of retrieved) {
|
|
100
|
+
expect([27, 28]).toContain(attestation.signature.v);
|
|
101
|
+
expect(expectedSenders.has(attestation.getSender()!.toString())).toBe(true);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
|
|
59
105
|
it('should add attestations to pool', async () => {
|
|
60
106
|
const slotNumber = 420;
|
|
61
107
|
const archive = Fr.random();
|
|
62
|
-
const
|
|
108
|
+
const sharedHeader = CheckpointHeader.random({ slotNumber: SlotNumber(slotNumber) });
|
|
109
|
+
const attestations = signers
|
|
110
|
+
.slice(0, -1)
|
|
111
|
+
.map(signer => mockCheckpointAttestation(signer, slotNumber, archive, sharedHeader));
|
|
112
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
63
113
|
|
|
64
114
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
65
115
|
|
|
66
116
|
const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
67
117
|
SlotNumber(slotNumber),
|
|
68
|
-
|
|
118
|
+
payloadHash,
|
|
69
119
|
);
|
|
70
120
|
expect(retrievedAttestations.length).toBe(attestations.length);
|
|
71
121
|
compareCheckpointAttestations(retrievedAttestations, attestations);
|
|
@@ -75,11 +125,16 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
75
125
|
compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
|
|
76
126
|
|
|
77
127
|
// Add another one
|
|
78
|
-
const newAttestation = mockCheckpointAttestation(
|
|
128
|
+
const newAttestation = mockCheckpointAttestation(
|
|
129
|
+
signers[NUMBER_OF_SIGNERS_PER_TEST - 1],
|
|
130
|
+
slotNumber,
|
|
131
|
+
archive,
|
|
132
|
+
sharedHeader,
|
|
133
|
+
);
|
|
79
134
|
await ap.addOwnCheckpointAttestations([newAttestation]);
|
|
80
135
|
const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
81
136
|
SlotNumber(slotNumber),
|
|
82
|
-
|
|
137
|
+
payloadHash,
|
|
83
138
|
);
|
|
84
139
|
expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
|
|
85
140
|
compareCheckpointAttestations(retrievedAttestationsAfterAdd, [...attestations, newAttestation]);
|
|
@@ -92,7 +147,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
92
147
|
|
|
93
148
|
const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
94
149
|
SlotNumber(slotNumber),
|
|
95
|
-
|
|
150
|
+
payloadHash,
|
|
96
151
|
);
|
|
97
152
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
98
153
|
});
|
|
@@ -108,13 +163,14 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
108
163
|
for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
|
|
109
164
|
attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
|
|
110
165
|
}
|
|
166
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
111
167
|
|
|
112
168
|
// Add them to store and check we end up with only one
|
|
113
169
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
114
170
|
|
|
115
171
|
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
116
172
|
SlotNumber(slotNumber),
|
|
117
|
-
|
|
173
|
+
payloadHash,
|
|
118
174
|
);
|
|
119
175
|
expect(retreivedAttestations.length).toBe(1);
|
|
120
176
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
|
|
@@ -122,9 +178,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
122
178
|
|
|
123
179
|
// Try adding them on another operation and check they are still not duplicated
|
|
124
180
|
await ap.addOwnCheckpointAttestations([attestations[0]]);
|
|
125
|
-
expect(
|
|
126
|
-
await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString()),
|
|
127
|
-
).toHaveLength(1);
|
|
181
|
+
expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash)).toHaveLength(1);
|
|
128
182
|
});
|
|
129
183
|
|
|
130
184
|
it('should store attestations by differing slot', async () => {
|
|
@@ -135,9 +189,9 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
135
189
|
|
|
136
190
|
for (const attestation of attestations) {
|
|
137
191
|
const slot = attestation.payload.header.slotNumber;
|
|
138
|
-
const
|
|
192
|
+
const payloadHash = attestation.getPayloadHash();
|
|
139
193
|
|
|
140
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
194
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
141
195
|
expect(retreivedAttestations.length).toBe(1);
|
|
142
196
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
143
197
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -153,9 +207,9 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
153
207
|
|
|
154
208
|
for (const attestation of attestations) {
|
|
155
209
|
const slot = attestation.payload.header.slotNumber;
|
|
156
|
-
const
|
|
210
|
+
const payloadHash = attestation.getPayloadHash();
|
|
157
211
|
|
|
158
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
212
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
159
213
|
expect(retreivedAttestations.length).toBe(1);
|
|
160
214
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
161
215
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -164,21 +218,25 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
164
218
|
|
|
165
219
|
it('should delete attestations older than a given slot', async () => {
|
|
166
220
|
const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420];
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
)
|
|
170
|
-
const
|
|
221
|
+
const attestationsPerSlot = await Promise.all(
|
|
222
|
+
slotNumbers.map(slotNumber => createCheckpointAttestationsForSlot(slotNumber)),
|
|
223
|
+
);
|
|
224
|
+
const attestations = attestationsPerSlot.flat();
|
|
225
|
+
const payloadHashForSlot1 = attestationsPerSlot[0][0].getPayloadHash();
|
|
171
226
|
|
|
172
227
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
173
228
|
|
|
174
|
-
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
229
|
+
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
230
|
+
SlotNumber(1),
|
|
231
|
+
payloadHashForSlot1,
|
|
232
|
+
);
|
|
175
233
|
expect(attestationsForSlot1.length).toBe(signers.length);
|
|
176
234
|
|
|
177
235
|
await ap.deleteOlderThan(SlotNumber(73));
|
|
178
236
|
|
|
179
237
|
const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
180
238
|
SlotNumber(1),
|
|
181
|
-
|
|
239
|
+
payloadHashForSlot1,
|
|
182
240
|
);
|
|
183
241
|
expect(attestationsForSlot1AfterDelete.length).toBe(0);
|
|
184
242
|
});
|
|
@@ -189,7 +247,6 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
189
247
|
const slotNumber = 420;
|
|
190
248
|
const archive = Fr.random();
|
|
191
249
|
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
192
|
-
const proposalId = proposal.archive.toString();
|
|
193
250
|
|
|
194
251
|
const result = await ap.tryAddBlockProposal(proposal);
|
|
195
252
|
|
|
@@ -197,7 +254,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
197
254
|
expect(result.alreadyExists).toBe(false);
|
|
198
255
|
expect(result.count).toBe(1);
|
|
199
256
|
|
|
200
|
-
const retrievedProposal = await ap.
|
|
257
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
201
258
|
|
|
202
259
|
expect(retrievedProposal).toBeDefined();
|
|
203
260
|
expect(retrievedProposal!).toEqual(proposal);
|
|
@@ -205,33 +262,68 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
205
262
|
|
|
206
263
|
it('should return undefined for non-existent block proposal', async () => {
|
|
207
264
|
const nonExistentId = Fr.random().toString();
|
|
208
|
-
const retrievedProposal = await ap.
|
|
265
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(nonExistentId);
|
|
209
266
|
expect(retrievedProposal).toBeUndefined();
|
|
210
267
|
});
|
|
211
268
|
|
|
212
|
-
it('should return alreadyExists when adding
|
|
269
|
+
it('should return alreadyExists when re-adding the same signed payload', async () => {
|
|
213
270
|
const slotNumber = 420;
|
|
214
271
|
const archive = Fr.random();
|
|
215
|
-
const
|
|
216
|
-
const proposalId = proposal1.archive.toString();
|
|
272
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
217
273
|
|
|
218
|
-
const result1 = await ap.tryAddBlockProposal(
|
|
274
|
+
const result1 = await ap.tryAddBlockProposal(proposal);
|
|
219
275
|
expect(result1.added).toBe(true);
|
|
220
276
|
expect(result1.alreadyExists).toBe(false);
|
|
221
277
|
|
|
222
|
-
//
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
278
|
+
// Re-broadcasting the exact same proposal yields alreadyExists.
|
|
279
|
+
const result2 = await ap.tryAddBlockProposal(proposal);
|
|
226
280
|
expect(result2.added).toBe(false);
|
|
227
281
|
expect(result2.alreadyExists).toBe(true);
|
|
228
282
|
|
|
229
|
-
|
|
230
|
-
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
283
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
231
284
|
expect(retrievedProposal).toBeDefined();
|
|
232
|
-
expect(retrievedProposal!.toBuffer()).toEqual(
|
|
285
|
+
expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
|
|
233
286
|
expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
234
287
|
});
|
|
288
|
+
|
|
289
|
+
it('should retain an exact duplicate block proposal only once', async () => {
|
|
290
|
+
const slotNumber = 420;
|
|
291
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber);
|
|
292
|
+
|
|
293
|
+
await ap.tryAddBlockProposal(proposal);
|
|
294
|
+
await ap.tryAddBlockProposal(proposal);
|
|
295
|
+
|
|
296
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
297
|
+
expect(proposals.blockProposals.map(proposal => proposal.toBuffer())).toEqual([
|
|
298
|
+
proposal.withoutSignedTxs().toBuffer(),
|
|
299
|
+
]);
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it('should retain all accepted block proposals at a position', async () => {
|
|
303
|
+
const slotNumber = 420;
|
|
304
|
+
const blockHeader = makeBlockHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
305
|
+
const proposal1 = await makeBlockProposal({
|
|
306
|
+
signer: signers[0],
|
|
307
|
+
blockHeader,
|
|
308
|
+
archiveRoot: Fr.random(),
|
|
309
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1),
|
|
310
|
+
});
|
|
311
|
+
const proposal2 = await makeBlockProposal({
|
|
312
|
+
signer: signers[0],
|
|
313
|
+
blockHeader,
|
|
314
|
+
archiveRoot: Fr.random(),
|
|
315
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1),
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
await ap.tryAddBlockProposal(proposal1);
|
|
319
|
+
await ap.tryAddBlockProposal(proposal2);
|
|
320
|
+
|
|
321
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
322
|
+
expect(proposals.blockProposals.map(proposal => proposal.toBuffer())).toEqual(
|
|
323
|
+
expect.arrayContaining([proposal1.withoutSignedTxs().toBuffer(), proposal2.withoutSignedTxs().toBuffer()]),
|
|
324
|
+
);
|
|
325
|
+
expect(await ap.getBlockProposalByArchive(proposal2.archive.toString())).toBeDefined();
|
|
326
|
+
});
|
|
235
327
|
});
|
|
236
328
|
|
|
237
329
|
describe('CheckpointProposal in attestation pool', () => {
|
|
@@ -239,12 +331,13 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
239
331
|
signer: Secp256k1Signer,
|
|
240
332
|
slotNumber: number,
|
|
241
333
|
archive: Fr = Fr.random(),
|
|
334
|
+
checkpointHeader?: CheckpointHeader,
|
|
242
335
|
): Promise<CheckpointProposalCore> => {
|
|
243
|
-
const
|
|
336
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
244
337
|
const blockHeader = makeBlockHeader(1);
|
|
245
338
|
const proposal = await makeCheckpointProposal({
|
|
246
339
|
signer,
|
|
247
|
-
checkpointHeader,
|
|
340
|
+
checkpointHeader: headerToUse,
|
|
248
341
|
archiveRoot: archive,
|
|
249
342
|
lastBlock: { blockHeader },
|
|
250
343
|
});
|
|
@@ -256,7 +349,6 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
256
349
|
const slotNumber = 420;
|
|
257
350
|
const archive = Fr.random();
|
|
258
351
|
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
259
|
-
const proposalId = proposal.archive.toString();
|
|
260
352
|
|
|
261
353
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
262
354
|
|
|
@@ -264,7 +356,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
264
356
|
expect(result.alreadyExists).toBe(false);
|
|
265
357
|
expect(result.count).toBe(1);
|
|
266
358
|
|
|
267
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
359
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
268
360
|
|
|
269
361
|
expect(retrievedProposal).toBeDefined();
|
|
270
362
|
expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
|
|
@@ -281,54 +373,136 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
281
373
|
archiveRoot: archive,
|
|
282
374
|
// No lastBlock
|
|
283
375
|
});
|
|
284
|
-
const proposalId = proposal.archive.toString();
|
|
285
376
|
|
|
286
377
|
// Add the checkpoint core - block extraction is now caller responsibility
|
|
287
378
|
await ap.tryAddCheckpointProposal(proposal.toCore());
|
|
288
379
|
|
|
289
380
|
// The checkpoint proposal should be stored
|
|
290
|
-
const retrievedCheckpointProposal = await ap.getCheckpointProposal(
|
|
381
|
+
const retrievedCheckpointProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
291
382
|
expect(retrievedCheckpointProposal).toBeDefined();
|
|
292
383
|
|
|
293
384
|
// No block proposal was extracted (it had none anyway)
|
|
294
|
-
const retrievedBlockProposal = await ap.
|
|
385
|
+
const retrievedBlockProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
295
386
|
expect(retrievedBlockProposal).toBeUndefined();
|
|
296
387
|
});
|
|
297
388
|
|
|
298
389
|
it('should return undefined for non-existent checkpoint proposal', async () => {
|
|
299
|
-
const
|
|
300
|
-
const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
|
|
390
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(99999));
|
|
301
391
|
expect(retrievedProposal).toBeUndefined();
|
|
302
392
|
});
|
|
303
393
|
|
|
304
|
-
it('should return alreadyExists when adding
|
|
394
|
+
it('should return alreadyExists when re-adding the same signed payload', async () => {
|
|
305
395
|
const slotNumber = 420;
|
|
306
396
|
const archive = Fr.random();
|
|
307
|
-
const
|
|
308
|
-
const proposalId = proposal1.archive.toString();
|
|
397
|
+
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
309
398
|
|
|
310
|
-
const result1 = await ap.tryAddCheckpointProposal(
|
|
399
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal);
|
|
311
400
|
expect(result1.added).toBe(true);
|
|
312
401
|
expect(result1.alreadyExists).toBe(false);
|
|
313
402
|
|
|
314
|
-
//
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
403
|
+
// Re-broadcasting the exact same signed payload yields alreadyExists.
|
|
404
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal);
|
|
318
405
|
expect(result2.added).toBe(false);
|
|
319
406
|
expect(result2.alreadyExists).toBe(true);
|
|
320
407
|
|
|
321
|
-
// Should still have the first proposal
|
|
322
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
408
|
+
// Should still have the first proposal stored at the slot
|
|
409
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
323
410
|
expect(retrievedProposal).toBeDefined();
|
|
324
|
-
expect(retrievedProposal!.toBuffer()).toEqual(
|
|
411
|
+
expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
|
|
325
412
|
expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
326
413
|
});
|
|
327
414
|
|
|
415
|
+
it('should treat distinct payloads at the same slot as equivocations (count = 2)', async () => {
|
|
416
|
+
const slotNumber = 420;
|
|
417
|
+
// Two proposals at the same slot but with different headers (distinct payloads).
|
|
418
|
+
const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
419
|
+
const proposal2 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
420
|
+
|
|
421
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
422
|
+
expect(result1.added).toBe(true);
|
|
423
|
+
expect(result1.count).toBe(1);
|
|
424
|
+
|
|
425
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
426
|
+
// The second distinct payload is tracked as an equivocation, count goes to 2,
|
|
427
|
+
// and both accepted payloads are retained by payload hash.
|
|
428
|
+
expect(result2.added).toBe(true);
|
|
429
|
+
expect(result2.alreadyExists).toBe(false);
|
|
430
|
+
expect(result2.count).toBe(2);
|
|
431
|
+
|
|
432
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
433
|
+
const expectedProposal = [proposal1, proposal2].sort((a, b) =>
|
|
434
|
+
a.getPayloadHash().localeCompare(b.getPayloadHash()),
|
|
435
|
+
)[0];
|
|
436
|
+
expect(retrievedProposal!.toBuffer()).toEqual(expectedProposal.toBuffer());
|
|
437
|
+
|
|
438
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
439
|
+
expect(proposals.checkpointProposals.map(proposal => proposal.toBuffer())).toEqual(
|
|
440
|
+
expect.arrayContaining([proposal1.toBuffer(), proposal2.toBuffer()]),
|
|
441
|
+
);
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
it('should detect equivocation when only feeAssetPriceModifier differs', async () => {
|
|
445
|
+
const slotNumber = 420;
|
|
446
|
+
const archive = Fr.random();
|
|
447
|
+
// Same checkpoint header + archive, but two different feeAssetPriceModifier values.
|
|
448
|
+
// This is the audit-finding scenario: archive collides but the signed payload differs.
|
|
449
|
+
const sharedHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
450
|
+
const proposalA = await makeCheckpointProposal({
|
|
451
|
+
signer: signers[0],
|
|
452
|
+
checkpointHeader: sharedHeader,
|
|
453
|
+
archiveRoot: archive,
|
|
454
|
+
feeAssetPriceModifier: 50n,
|
|
455
|
+
});
|
|
456
|
+
const proposalB = await makeCheckpointProposal({
|
|
457
|
+
signer: signers[0],
|
|
458
|
+
checkpointHeader: sharedHeader,
|
|
459
|
+
archiveRoot: archive,
|
|
460
|
+
feeAssetPriceModifier: -50n,
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
const result1 = await ap.tryAddCheckpointProposal(proposalA.toCore());
|
|
464
|
+
expect(result1.count).toBe(1);
|
|
465
|
+
|
|
466
|
+
const result2 = await ap.tryAddCheckpointProposal(proposalB.toCore());
|
|
467
|
+
// The fix: archive collision no longer hides the equivocation; payload-hash dedup
|
|
468
|
+
// sees the distinct feeMod and bumps `count` to 2 so libp2p can fire the slash callback.
|
|
469
|
+
expect(result2.added).toBe(true);
|
|
470
|
+
expect(result2.alreadyExists).toBe(false);
|
|
471
|
+
expect(result2.count).toBe(2);
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
it('should delete retained proposals older than a given slot', async () => {
|
|
475
|
+
const oldSlot = 100;
|
|
476
|
+
const newSlot = 200;
|
|
477
|
+
const oldBlock = await mockBlockProposalForPool(signers[0], oldSlot);
|
|
478
|
+
const newBlock = await mockBlockProposalForPool(signers[1], newSlot);
|
|
479
|
+
const oldCheckpoint = await mockCheckpointProposalForPool(signers[0], oldSlot);
|
|
480
|
+
const newCheckpoint = await mockCheckpointProposalForPool(signers[1], newSlot);
|
|
481
|
+
|
|
482
|
+
await ap.tryAddBlockProposal(oldBlock);
|
|
483
|
+
await ap.tryAddBlockProposal(newBlock);
|
|
484
|
+
await ap.tryAddCheckpointProposal(oldCheckpoint);
|
|
485
|
+
await ap.tryAddCheckpointProposal(newCheckpoint);
|
|
486
|
+
|
|
487
|
+
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
488
|
+
|
|
489
|
+
expect(await ap.getProposalsForSlot(SlotNumber(oldSlot))).toEqual({
|
|
490
|
+
blockProposals: [],
|
|
491
|
+
checkpointProposals: [],
|
|
492
|
+
});
|
|
493
|
+
const newProposals = await ap.getProposalsForSlot(SlotNumber(newSlot));
|
|
494
|
+
expect(newProposals.blockProposals.map(proposal => proposal.toBuffer())).toContainEqual(
|
|
495
|
+
newBlock.withoutSignedTxs().toBuffer(),
|
|
496
|
+
);
|
|
497
|
+
expect(newProposals.checkpointProposals.map(proposal => proposal.toBuffer())).toContainEqual(
|
|
498
|
+
newCheckpoint.toBuffer(),
|
|
499
|
+
);
|
|
500
|
+
});
|
|
501
|
+
|
|
328
502
|
it('should return added=false when exceeding capacity', async () => {
|
|
329
503
|
const slotNumber = 420;
|
|
330
504
|
|
|
331
|
-
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT proposals
|
|
505
|
+
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT distinct proposals.
|
|
332
506
|
for (let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++) {
|
|
333
507
|
const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
|
|
334
508
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
@@ -336,7 +510,7 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
336
510
|
expect(result.count).toBe(i + 1);
|
|
337
511
|
}
|
|
338
512
|
|
|
339
|
-
// The next proposal should not be added
|
|
513
|
+
// The next proposal should not be added.
|
|
340
514
|
const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
|
|
341
515
|
const result = await ap.tryAddCheckpointProposal(extraProposal);
|
|
342
516
|
expect(result.added).toBe(false);
|
|
@@ -446,12 +620,12 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
446
620
|
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
447
621
|
expect(result2.count).toBe(2);
|
|
448
622
|
|
|
449
|
-
//
|
|
623
|
+
// Third proposal for same position should be rejected (cap is 2)
|
|
450
624
|
const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
|
|
451
625
|
const result3 = await ap.tryAddBlockProposal(proposal3);
|
|
452
626
|
|
|
453
|
-
expect(result3.added).toBe(
|
|
454
|
-
expect(result3.count).toBe(
|
|
627
|
+
expect(result3.added).toBe(false);
|
|
628
|
+
expect(result3.count).toBe(2);
|
|
455
629
|
});
|
|
456
630
|
|
|
457
631
|
it('should return added=false when exceeding capacity', async () => {
|
|
@@ -571,17 +745,17 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
571
745
|
await ap.tryAddBlockProposal(newProposal);
|
|
572
746
|
|
|
573
747
|
// Verify both proposals exist
|
|
574
|
-
expect(await ap.
|
|
575
|
-
expect(await ap.
|
|
748
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeDefined();
|
|
749
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
576
750
|
|
|
577
751
|
// Delete slots older than newSlot (should delete oldSlot)
|
|
578
752
|
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
579
753
|
|
|
580
754
|
// Old proposal should be deleted from storage
|
|
581
|
-
expect(await ap.
|
|
755
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeUndefined();
|
|
582
756
|
|
|
583
757
|
// New proposal should still exist
|
|
584
|
-
expect(await ap.
|
|
758
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
585
759
|
});
|
|
586
760
|
});
|
|
587
761
|
|
|
@@ -590,12 +764,13 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
590
764
|
signer: Secp256k1Signer,
|
|
591
765
|
slotNumber: number,
|
|
592
766
|
archive: Fr = Fr.random(),
|
|
767
|
+
checkpointHeader?: CheckpointHeader,
|
|
593
768
|
): Promise<CheckpointProposalCore> => {
|
|
594
|
-
const
|
|
769
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
595
770
|
const blockHeader = makeBlockHeader(1);
|
|
596
771
|
const proposal = await makeCheckpointProposal({
|
|
597
772
|
signer,
|
|
598
|
-
checkpointHeader,
|
|
773
|
+
checkpointHeader: headerToUse,
|
|
599
774
|
archiveRoot: archive,
|
|
600
775
|
lastBlock: { blockHeader },
|
|
601
776
|
});
|
|
@@ -666,12 +841,12 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
666
841
|
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
667
842
|
expect(result2.count).toBe(2);
|
|
668
843
|
|
|
669
|
-
//
|
|
844
|
+
// Third proposal for same slot should be rejected (cap is 2)
|
|
670
845
|
const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
|
|
671
846
|
const result3 = await ap.tryAddCheckpointProposal(proposal3);
|
|
672
847
|
|
|
673
|
-
expect(result3.added).toBe(
|
|
674
|
-
expect(result3.count).toBe(
|
|
848
|
+
expect(result3.added).toBe(false);
|
|
849
|
+
expect(result3.count).toBe(2);
|
|
675
850
|
});
|
|
676
851
|
|
|
677
852
|
it('should not count attestations as proposals for duplicate detection', async () => {
|
|
@@ -3,11 +3,12 @@ import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer'
|
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import {
|
|
5
5
|
CheckpointAttestation,
|
|
6
|
+
CheckpointProposal,
|
|
6
7
|
ConsensusPayload,
|
|
7
|
-
|
|
8
|
-
getHashedSignaturePayloadEthSignedMessage,
|
|
8
|
+
getHashedSignaturePayloadTypedData,
|
|
9
9
|
} from '@aztec/stdlib/p2p';
|
|
10
10
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
11
|
+
import { TEST_COORDINATION_SIGNATURE_CONTEXT } from '@aztec/stdlib/testing';
|
|
11
12
|
|
|
12
13
|
import { type LocalAccount, generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
13
14
|
|
|
@@ -37,15 +38,19 @@ export const mockCheckpointAttestation = (
|
|
|
37
38
|
feeAssetPriceModifier: bigint = 0n,
|
|
38
39
|
): CheckpointAttestation => {
|
|
39
40
|
header = header ?? CheckpointHeader.random({ slotNumber: SlotNumber(slot) });
|
|
40
|
-
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier);
|
|
41
|
+
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier, TEST_COORDINATION_SIGNATURE_CONTEXT);
|
|
41
42
|
|
|
42
|
-
const attestationHash =
|
|
43
|
-
payload,
|
|
44
|
-
SignatureDomainSeparator.checkpointAttestation,
|
|
45
|
-
);
|
|
43
|
+
const attestationHash = getHashedSignaturePayloadTypedData(payload);
|
|
46
44
|
const attestationSignature = signer.sign(attestationHash);
|
|
47
45
|
|
|
48
|
-
const
|
|
46
|
+
const proposal = new CheckpointProposal(
|
|
47
|
+
header,
|
|
48
|
+
archive,
|
|
49
|
+
feeAssetPriceModifier,
|
|
50
|
+
attestationSignature,
|
|
51
|
+
TEST_COORDINATION_SIGNATURE_CONTEXT,
|
|
52
|
+
);
|
|
53
|
+
const proposalHash = getHashedSignaturePayloadTypedData(proposal);
|
|
49
54
|
const proposerSignature = signer.sign(proposalHash);
|
|
50
55
|
|
|
51
56
|
return new CheckpointAttestation(payload, attestationSignature, proposerSignature);
|
package/src/mem_pools/index.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
1
|
export { AttestationPool, type AttestationPoolApi } from './attestation_pool/attestation_pool.js';
|
|
2
2
|
export { type MemPools } from './interface.js';
|
|
3
|
-
// Old TxPool exports - kept temporarily for external consumers
|
|
4
|
-
export { type TxPool } from './tx_pool/tx_pool.js';
|
|
5
|
-
// New TxPoolV2 exports
|
|
6
3
|
export { type TxPoolV2, type TxPoolV2Config, type TxPoolV2Events, type AddTxsResult } from './tx_pool_v2/index.js';
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { Gossipable } from '@aztec/stdlib/p2p';
|
|
2
|
-
import type { Tx } from '@aztec/stdlib/tx';
|
|
3
2
|
import {
|
|
4
3
|
Attributes,
|
|
5
4
|
type BatchObservableResult,
|
|
@@ -100,7 +99,11 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
100
99
|
|
|
101
100
|
this.addObjectCounter = createUpDownCounterWithDefault(this.meter, metricsLabels.itemsAdded);
|
|
102
101
|
|
|
103
|
-
this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay
|
|
102
|
+
this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay, {
|
|
103
|
+
advice: {
|
|
104
|
+
explicitBucketBoundaries: [100, 500, 1000, 5000, 10000, 30000, 60000, 300000, 600000, 1800000, 3600000],
|
|
105
|
+
},
|
|
106
|
+
});
|
|
104
107
|
|
|
105
108
|
this.meter.addBatchObservableCallback(this.observeStats, [this.objectsInMempool]);
|
|
106
109
|
}
|
|
@@ -113,16 +116,6 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
113
116
|
this.addObjectCounter.add(count);
|
|
114
117
|
}
|
|
115
118
|
|
|
116
|
-
public transactionsAdded(transactions: Tx[]) {
|
|
117
|
-
transactions.forEach(tx => this.trackMempoolItemAdded(tx.txHash.toBigInt()));
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
public transactionsRemoved(hashes: Iterable<bigint> | Iterable<string>) {
|
|
121
|
-
for (const hash of hashes) {
|
|
122
|
-
this.trackMempoolItemRemoved(BigInt(hash));
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
119
|
public trackMempoolItemAdded(key: bigint | string): void {
|
|
127
120
|
this.mempoolItemAddedTimestamp.set(key, Date.now());
|
|
128
121
|
}
|
|
@@ -138,6 +131,19 @@ export class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
138
131
|
}
|
|
139
132
|
}
|
|
140
133
|
|
|
134
|
+
/**
|
|
135
|
+
* Records a pre-computed pending-to-mined delay directly, bypassing the
|
|
136
|
+
* `mempoolItemAddedTimestamp` map. Used by the tx pool, which derives the
|
|
137
|
+
* delay from the persisted `receivedAt` on tx metadata at the mined
|
|
138
|
+
* transition — more accurate than the add/remove map (which also fires on
|
|
139
|
+
* eviction) and resilient to the caller not having tracked the add.
|
|
140
|
+
*/
|
|
141
|
+
public recordMinedDelay(delayMs: number): void {
|
|
142
|
+
if (delayMs > 0) {
|
|
143
|
+
this.minedDelay.record(delayMs);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
141
147
|
private observeStats = async (observer: BatchObservableResult) => {
|
|
142
148
|
const { itemCount } = await this.poolStats();
|
|
143
149
|
if (typeof itemCount === 'number') {
|