@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,3 +1,3 @@
|
|
|
1
1
|
import { type AttestationPool } from './attestation_pool.js';
|
|
2
2
|
export declare function describeAttestationPool(getAttestationPool: () => AttestationPool): void;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL2F0dGVzdGF0aW9uX3Bvb2wvYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWNBLE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFHckIsTUFBTSx1QkFBdUIsQ0FBQztBQUsvQix3QkFBZ0IsdUJBQXVCLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLFFBdzJCaEYifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attestation_pool_test_suite.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool_test_suite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"attestation_pool_test_suite.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool_test_suite.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,uBAAuB,CAAC;AAK/B,wBAAgB,uBAAuB,CAAC,kBAAkB,EAAE,MAAM,eAAe,QAw2BhF"}
|
|
@@ -1,6 +1,8 @@
|
|
|
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 { Signature } from '@aztec/foundation/eth-signature';
|
|
5
|
+
import { CheckpointAttestation } from '@aztec/stdlib/p2p';
|
|
4
6
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
5
7
|
import { makeBlockHeader, makeBlockProposal, makeCheckpointHeader, makeCheckpointProposal } from '@aztec/stdlib/testing';
|
|
6
8
|
import { MAX_BLOCK_PROPOSALS_PER_POSITION, MAX_CHECKPOINT_PROPOSALS_PER_SLOT } from './attestation_pool.js';
|
|
@@ -15,9 +17,17 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
15
17
|
length: NUMBER_OF_SIGNERS_PER_TEST
|
|
16
18
|
}, ()=>Secp256k1Signer.random());
|
|
17
19
|
});
|
|
18
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Build attestations from each signer over the *same* signed payload (same header,
|
|
22
|
+
* archive, feeAssetPriceModifier). Required by the new pool, which deduplicates by
|
|
23
|
+
* payload hash and treats attestations from different signers as distinct entries
|
|
24
|
+
* only when the payload itself matches.
|
|
25
|
+
*/ const createCheckpointAttestationsForSlot = (slotNumber, archive)=>{
|
|
19
26
|
const archiveToUse = archive ?? Fr.random();
|
|
20
|
-
|
|
27
|
+
const sharedHeader = CheckpointHeader.random({
|
|
28
|
+
slotNumber: SlotNumber(slotNumber)
|
|
29
|
+
});
|
|
30
|
+
return signers.map((signer)=>mockCheckpointAttestation(signer, slotNumber, archiveToUse, sharedHeader));
|
|
21
31
|
};
|
|
22
32
|
const mockBlockProposalForPool = (signer, slotNumber, archive = Fr.random())=>{
|
|
23
33
|
const header = makeBlockHeader(1, {
|
|
@@ -37,24 +47,69 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
37
47
|
expect(a1Buffer.length).toBe(a2Buffer.length);
|
|
38
48
|
expect(a1Buffer).toEqual(expect.arrayContaining(a2Buffer));
|
|
39
49
|
};
|
|
50
|
+
/**
|
|
51
|
+
* Rewrites the attester signature into yParity form (27 -> 0, 28 -> 1), keeping (r, s). The recovery
|
|
52
|
+
* bit is unchanged so it still recovers to the same signer, mimicking a peer that gossips (or mutates
|
|
53
|
+
* in flight) a signature with a non-canonical recovery byte.
|
|
54
|
+
*/ const toYParityForm = (attestation)=>{
|
|
55
|
+
const sig = attestation.signature;
|
|
56
|
+
const yParityV = sig.v === 27 ? 0 : sig.v === 28 ? 1 : sig.v;
|
|
57
|
+
return new CheckpointAttestation(attestation.payload, new Signature(sig.r, sig.s, yParityV), attestation.proposerSignature);
|
|
58
|
+
};
|
|
40
59
|
describe('CheckpointAttestation', ()=>{
|
|
60
|
+
it('normalizes yParity (v=0/v=1) attester signatures on ingress from both gossip and own keys', async ()=>{
|
|
61
|
+
const slotNumber = 421;
|
|
62
|
+
const canonical = createCheckpointAttestationsForSlot(slotNumber);
|
|
63
|
+
const payloadHash = canonical[0].getPayloadHash();
|
|
64
|
+
const expectedSenders = new Set([
|
|
65
|
+
canonical[0].getSender().toString(),
|
|
66
|
+
canonical[1].getSender().toString()
|
|
67
|
+
]);
|
|
68
|
+
const gossiped = toYParityForm(canonical[0]);
|
|
69
|
+
expect([
|
|
70
|
+
0,
|
|
71
|
+
1
|
|
72
|
+
]).toContain(gossiped.signature.v);
|
|
73
|
+
await ap.tryAddCheckpointAttestation(gossiped);
|
|
74
|
+
const own = toYParityForm(canonical[1]);
|
|
75
|
+
expect([
|
|
76
|
+
0,
|
|
77
|
+
1
|
|
78
|
+
]).toContain(own.signature.v);
|
|
79
|
+
await ap.addOwnCheckpointAttestations([
|
|
80
|
+
own
|
|
81
|
+
]);
|
|
82
|
+
const retrieved = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
83
|
+
expect(retrieved.length).toBe(2);
|
|
84
|
+
for (const attestation of retrieved){
|
|
85
|
+
expect([
|
|
86
|
+
27,
|
|
87
|
+
28
|
|
88
|
+
]).toContain(attestation.signature.v);
|
|
89
|
+
expect(expectedSenders.has(attestation.getSender().toString())).toBe(true);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
41
92
|
it('should add attestations to pool', async ()=>{
|
|
42
93
|
const slotNumber = 420;
|
|
43
94
|
const archive = Fr.random();
|
|
44
|
-
const
|
|
95
|
+
const sharedHeader = CheckpointHeader.random({
|
|
96
|
+
slotNumber: SlotNumber(slotNumber)
|
|
97
|
+
});
|
|
98
|
+
const attestations = signers.slice(0, -1).map((signer)=>mockCheckpointAttestation(signer, slotNumber, archive, sharedHeader));
|
|
99
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
45
100
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
46
|
-
const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
101
|
+
const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
47
102
|
expect(retrievedAttestations.length).toBe(attestations.length);
|
|
48
103
|
compareCheckpointAttestations(retrievedAttestations, attestations);
|
|
49
104
|
const retrievedAttestationsForSlot = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
|
|
50
105
|
expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
|
|
51
106
|
compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
|
|
52
107
|
// Add another one
|
|
53
|
-
const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
|
|
108
|
+
const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive, sharedHeader);
|
|
54
109
|
await ap.addOwnCheckpointAttestations([
|
|
55
110
|
newAttestation
|
|
56
111
|
]);
|
|
57
|
-
const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
112
|
+
const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
58
113
|
expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
|
|
59
114
|
compareCheckpointAttestations(retrievedAttestationsAfterAdd, [
|
|
60
115
|
...attestations,
|
|
@@ -68,7 +123,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
68
123
|
]);
|
|
69
124
|
// Delete by slot
|
|
70
125
|
await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
|
|
71
|
-
const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
126
|
+
const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
72
127
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
73
128
|
});
|
|
74
129
|
it('should handle duplicate proposals in a slot', async ()=>{
|
|
@@ -83,9 +138,10 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
83
138
|
for(let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++){
|
|
84
139
|
attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
|
|
85
140
|
}
|
|
141
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
86
142
|
// Add them to store and check we end up with only one
|
|
87
143
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
88
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
144
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
89
145
|
expect(retreivedAttestations.length).toBe(1);
|
|
90
146
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
|
|
91
147
|
expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
|
|
@@ -93,7 +149,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
93
149
|
await ap.addOwnCheckpointAttestations([
|
|
94
150
|
attestations[0]
|
|
95
151
|
]);
|
|
96
|
-
expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
152
|
+
expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash)).toHaveLength(1);
|
|
97
153
|
});
|
|
98
154
|
it('should store attestations by differing slot', async ()=>{
|
|
99
155
|
const slotNumbers = [
|
|
@@ -106,8 +162,8 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
106
162
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
107
163
|
for (const attestation of attestations){
|
|
108
164
|
const slot = attestation.payload.header.slotNumber;
|
|
109
|
-
const
|
|
110
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
165
|
+
const payloadHash = attestation.getPayloadHash();
|
|
166
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
111
167
|
expect(retreivedAttestations.length).toBe(1);
|
|
112
168
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
113
169
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -130,8 +186,8 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
130
186
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
131
187
|
for (const attestation of attestations){
|
|
132
188
|
const slot = attestation.payload.header.slotNumber;
|
|
133
|
-
const
|
|
134
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
189
|
+
const payloadHash = attestation.getPayloadHash();
|
|
190
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
135
191
|
expect(retreivedAttestations.length).toBe(1);
|
|
136
192
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
137
193
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -148,13 +204,14 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
148
204
|
88,
|
|
149
205
|
420
|
|
150
206
|
];
|
|
151
|
-
const
|
|
152
|
-
const
|
|
207
|
+
const attestationsPerSlot = await Promise.all(slotNumbers.map((slotNumber)=>createCheckpointAttestationsForSlot(slotNumber)));
|
|
208
|
+
const attestations = attestationsPerSlot.flat();
|
|
209
|
+
const payloadHashForSlot1 = attestationsPerSlot[0][0].getPayloadHash();
|
|
153
210
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
154
|
-
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1),
|
|
211
|
+
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), payloadHashForSlot1);
|
|
155
212
|
expect(attestationsForSlot1.length).toBe(signers.length);
|
|
156
213
|
await ap.deleteOlderThan(SlotNumber(73));
|
|
157
|
-
const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1),
|
|
214
|
+
const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), payloadHashForSlot1);
|
|
158
215
|
expect(attestationsForSlot1AfterDelete.length).toBe(0);
|
|
159
216
|
});
|
|
160
217
|
});
|
|
@@ -163,49 +220,81 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
163
220
|
const slotNumber = 420;
|
|
164
221
|
const archive = Fr.random();
|
|
165
222
|
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
166
|
-
const proposalId = proposal.archive.toString();
|
|
167
223
|
const result = await ap.tryAddBlockProposal(proposal);
|
|
168
224
|
expect(result.added).toBe(true);
|
|
169
225
|
expect(result.alreadyExists).toBe(false);
|
|
170
226
|
expect(result.count).toBe(1);
|
|
171
|
-
const retrievedProposal = await ap.
|
|
227
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
172
228
|
expect(retrievedProposal).toBeDefined();
|
|
173
229
|
expect(retrievedProposal).toEqual(proposal);
|
|
174
230
|
});
|
|
175
231
|
it('should return undefined for non-existent block proposal', async ()=>{
|
|
176
232
|
const nonExistentId = Fr.random().toString();
|
|
177
|
-
const retrievedProposal = await ap.
|
|
233
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(nonExistentId);
|
|
178
234
|
expect(retrievedProposal).toBeUndefined();
|
|
179
235
|
});
|
|
180
|
-
it('should return alreadyExists when adding
|
|
236
|
+
it('should return alreadyExists when re-adding the same signed payload', async ()=>{
|
|
181
237
|
const slotNumber = 420;
|
|
182
238
|
const archive = Fr.random();
|
|
183
|
-
const
|
|
184
|
-
const
|
|
185
|
-
const result1 = await ap.tryAddBlockProposal(proposal1);
|
|
239
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
240
|
+
const result1 = await ap.tryAddBlockProposal(proposal);
|
|
186
241
|
expect(result1.added).toBe(true);
|
|
187
242
|
expect(result1.alreadyExists).toBe(false);
|
|
188
|
-
//
|
|
189
|
-
const
|
|
190
|
-
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
243
|
+
// Re-broadcasting the exact same proposal yields alreadyExists.
|
|
244
|
+
const result2 = await ap.tryAddBlockProposal(proposal);
|
|
191
245
|
expect(result2.added).toBe(false);
|
|
192
246
|
expect(result2.alreadyExists).toBe(true);
|
|
193
|
-
|
|
194
|
-
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
247
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
195
248
|
expect(retrievedProposal).toBeDefined();
|
|
196
|
-
expect(retrievedProposal.toBuffer()).toEqual(
|
|
249
|
+
expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
|
|
197
250
|
expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
198
251
|
});
|
|
252
|
+
it('should retain an exact duplicate block proposal only once', async ()=>{
|
|
253
|
+
const slotNumber = 420;
|
|
254
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber);
|
|
255
|
+
await ap.tryAddBlockProposal(proposal);
|
|
256
|
+
await ap.tryAddBlockProposal(proposal);
|
|
257
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
258
|
+
expect(proposals.blockProposals.map((proposal)=>proposal.toBuffer())).toEqual([
|
|
259
|
+
proposal.withoutSignedTxs().toBuffer()
|
|
260
|
+
]);
|
|
261
|
+
});
|
|
262
|
+
it('should retain all accepted block proposals at a position', async ()=>{
|
|
263
|
+
const slotNumber = 420;
|
|
264
|
+
const blockHeader = makeBlockHeader(1, {
|
|
265
|
+
slotNumber: SlotNumber(slotNumber)
|
|
266
|
+
});
|
|
267
|
+
const proposal1 = await makeBlockProposal({
|
|
268
|
+
signer: signers[0],
|
|
269
|
+
blockHeader,
|
|
270
|
+
archiveRoot: Fr.random(),
|
|
271
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1)
|
|
272
|
+
});
|
|
273
|
+
const proposal2 = await makeBlockProposal({
|
|
274
|
+
signer: signers[0],
|
|
275
|
+
blockHeader,
|
|
276
|
+
archiveRoot: Fr.random(),
|
|
277
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1)
|
|
278
|
+
});
|
|
279
|
+
await ap.tryAddBlockProposal(proposal1);
|
|
280
|
+
await ap.tryAddBlockProposal(proposal2);
|
|
281
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
282
|
+
expect(proposals.blockProposals.map((proposal)=>proposal.toBuffer())).toEqual(expect.arrayContaining([
|
|
283
|
+
proposal1.withoutSignedTxs().toBuffer(),
|
|
284
|
+
proposal2.withoutSignedTxs().toBuffer()
|
|
285
|
+
]));
|
|
286
|
+
expect(await ap.getBlockProposalByArchive(proposal2.archive.toString())).toBeDefined();
|
|
287
|
+
});
|
|
199
288
|
});
|
|
200
289
|
describe('CheckpointProposal in attestation pool', ()=>{
|
|
201
|
-
const mockCheckpointProposalForPool = async (signer, slotNumber, archive = Fr.random())=>{
|
|
202
|
-
const
|
|
290
|
+
const mockCheckpointProposalForPool = async (signer, slotNumber, archive = Fr.random(), checkpointHeader)=>{
|
|
291
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, {
|
|
203
292
|
slotNumber: SlotNumber(slotNumber)
|
|
204
293
|
});
|
|
205
294
|
const blockHeader = makeBlockHeader(1);
|
|
206
295
|
const proposal = await makeCheckpointProposal({
|
|
207
296
|
signer,
|
|
208
|
-
checkpointHeader,
|
|
297
|
+
checkpointHeader: headerToUse,
|
|
209
298
|
archiveRoot: archive,
|
|
210
299
|
lastBlock: {
|
|
211
300
|
blockHeader
|
|
@@ -218,12 +307,11 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
218
307
|
const slotNumber = 420;
|
|
219
308
|
const archive = Fr.random();
|
|
220
309
|
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
221
|
-
const proposalId = proposal.archive.toString();
|
|
222
310
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
223
311
|
expect(result.added).toBe(true);
|
|
224
312
|
expect(result.alreadyExists).toBe(false);
|
|
225
313
|
expect(result.count).toBe(1);
|
|
226
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
314
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
227
315
|
expect(retrievedProposal).toBeDefined();
|
|
228
316
|
expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
|
|
229
317
|
});
|
|
@@ -239,50 +327,121 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
239
327
|
checkpointHeader,
|
|
240
328
|
archiveRoot: archive
|
|
241
329
|
});
|
|
242
|
-
const proposalId = proposal.archive.toString();
|
|
243
330
|
// Add the checkpoint core - block extraction is now caller responsibility
|
|
244
331
|
await ap.tryAddCheckpointProposal(proposal.toCore());
|
|
245
332
|
// The checkpoint proposal should be stored
|
|
246
|
-
const retrievedCheckpointProposal = await ap.getCheckpointProposal(
|
|
333
|
+
const retrievedCheckpointProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
247
334
|
expect(retrievedCheckpointProposal).toBeDefined();
|
|
248
335
|
// No block proposal was extracted (it had none anyway)
|
|
249
|
-
const retrievedBlockProposal = await ap.
|
|
336
|
+
const retrievedBlockProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
250
337
|
expect(retrievedBlockProposal).toBeUndefined();
|
|
251
338
|
});
|
|
252
339
|
it('should return undefined for non-existent checkpoint proposal', async ()=>{
|
|
253
|
-
const
|
|
254
|
-
const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
|
|
340
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(99999));
|
|
255
341
|
expect(retrievedProposal).toBeUndefined();
|
|
256
342
|
});
|
|
257
|
-
it('should return alreadyExists when adding
|
|
343
|
+
it('should return alreadyExists when re-adding the same signed payload', async ()=>{
|
|
258
344
|
const slotNumber = 420;
|
|
259
345
|
const archive = Fr.random();
|
|
260
|
-
const
|
|
261
|
-
const
|
|
262
|
-
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
346
|
+
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
347
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal);
|
|
263
348
|
expect(result1.added).toBe(true);
|
|
264
349
|
expect(result1.alreadyExists).toBe(false);
|
|
265
|
-
//
|
|
266
|
-
const
|
|
267
|
-
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
350
|
+
// Re-broadcasting the exact same signed payload yields alreadyExists.
|
|
351
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal);
|
|
268
352
|
expect(result2.added).toBe(false);
|
|
269
353
|
expect(result2.alreadyExists).toBe(true);
|
|
270
|
-
// Should still have the first proposal
|
|
271
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
354
|
+
// Should still have the first proposal stored at the slot
|
|
355
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
272
356
|
expect(retrievedProposal).toBeDefined();
|
|
273
|
-
expect(retrievedProposal.toBuffer()).toEqual(
|
|
357
|
+
expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
|
|
274
358
|
expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
275
359
|
});
|
|
360
|
+
it('should treat distinct payloads at the same slot as equivocations (count = 2)', async ()=>{
|
|
361
|
+
const slotNumber = 420;
|
|
362
|
+
// Two proposals at the same slot but with different headers (distinct payloads).
|
|
363
|
+
const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
364
|
+
const proposal2 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
365
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
366
|
+
expect(result1.added).toBe(true);
|
|
367
|
+
expect(result1.count).toBe(1);
|
|
368
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
369
|
+
// The second distinct payload is tracked as an equivocation, count goes to 2,
|
|
370
|
+
// and both accepted payloads are retained by payload hash.
|
|
371
|
+
expect(result2.added).toBe(true);
|
|
372
|
+
expect(result2.alreadyExists).toBe(false);
|
|
373
|
+
expect(result2.count).toBe(2);
|
|
374
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
375
|
+
const expectedProposal = [
|
|
376
|
+
proposal1,
|
|
377
|
+
proposal2
|
|
378
|
+
].sort((a, b)=>a.getPayloadHash().localeCompare(b.getPayloadHash()))[0];
|
|
379
|
+
expect(retrievedProposal.toBuffer()).toEqual(expectedProposal.toBuffer());
|
|
380
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
381
|
+
expect(proposals.checkpointProposals.map((proposal)=>proposal.toBuffer())).toEqual(expect.arrayContaining([
|
|
382
|
+
proposal1.toBuffer(),
|
|
383
|
+
proposal2.toBuffer()
|
|
384
|
+
]));
|
|
385
|
+
});
|
|
386
|
+
it('should detect equivocation when only feeAssetPriceModifier differs', async ()=>{
|
|
387
|
+
const slotNumber = 420;
|
|
388
|
+
const archive = Fr.random();
|
|
389
|
+
// Same checkpoint header + archive, but two different feeAssetPriceModifier values.
|
|
390
|
+
// This is the audit-finding scenario: archive collides but the signed payload differs.
|
|
391
|
+
const sharedHeader = makeCheckpointHeader(1, {
|
|
392
|
+
slotNumber: SlotNumber(slotNumber)
|
|
393
|
+
});
|
|
394
|
+
const proposalA = await makeCheckpointProposal({
|
|
395
|
+
signer: signers[0],
|
|
396
|
+
checkpointHeader: sharedHeader,
|
|
397
|
+
archiveRoot: archive,
|
|
398
|
+
feeAssetPriceModifier: 50n
|
|
399
|
+
});
|
|
400
|
+
const proposalB = await makeCheckpointProposal({
|
|
401
|
+
signer: signers[0],
|
|
402
|
+
checkpointHeader: sharedHeader,
|
|
403
|
+
archiveRoot: archive,
|
|
404
|
+
feeAssetPriceModifier: -50n
|
|
405
|
+
});
|
|
406
|
+
const result1 = await ap.tryAddCheckpointProposal(proposalA.toCore());
|
|
407
|
+
expect(result1.count).toBe(1);
|
|
408
|
+
const result2 = await ap.tryAddCheckpointProposal(proposalB.toCore());
|
|
409
|
+
// The fix: archive collision no longer hides the equivocation; payload-hash dedup
|
|
410
|
+
// sees the distinct feeMod and bumps `count` to 2 so libp2p can fire the slash callback.
|
|
411
|
+
expect(result2.added).toBe(true);
|
|
412
|
+
expect(result2.alreadyExists).toBe(false);
|
|
413
|
+
expect(result2.count).toBe(2);
|
|
414
|
+
});
|
|
415
|
+
it('should delete retained proposals older than a given slot', async ()=>{
|
|
416
|
+
const oldSlot = 100;
|
|
417
|
+
const newSlot = 200;
|
|
418
|
+
const oldBlock = await mockBlockProposalForPool(signers[0], oldSlot);
|
|
419
|
+
const newBlock = await mockBlockProposalForPool(signers[1], newSlot);
|
|
420
|
+
const oldCheckpoint = await mockCheckpointProposalForPool(signers[0], oldSlot);
|
|
421
|
+
const newCheckpoint = await mockCheckpointProposalForPool(signers[1], newSlot);
|
|
422
|
+
await ap.tryAddBlockProposal(oldBlock);
|
|
423
|
+
await ap.tryAddBlockProposal(newBlock);
|
|
424
|
+
await ap.tryAddCheckpointProposal(oldCheckpoint);
|
|
425
|
+
await ap.tryAddCheckpointProposal(newCheckpoint);
|
|
426
|
+
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
427
|
+
expect(await ap.getProposalsForSlot(SlotNumber(oldSlot))).toEqual({
|
|
428
|
+
blockProposals: [],
|
|
429
|
+
checkpointProposals: []
|
|
430
|
+
});
|
|
431
|
+
const newProposals = await ap.getProposalsForSlot(SlotNumber(newSlot));
|
|
432
|
+
expect(newProposals.blockProposals.map((proposal)=>proposal.toBuffer())).toContainEqual(newBlock.withoutSignedTxs().toBuffer());
|
|
433
|
+
expect(newProposals.checkpointProposals.map((proposal)=>proposal.toBuffer())).toContainEqual(newCheckpoint.toBuffer());
|
|
434
|
+
});
|
|
276
435
|
it('should return added=false when exceeding capacity', async ()=>{
|
|
277
436
|
const slotNumber = 420;
|
|
278
|
-
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT proposals
|
|
437
|
+
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT distinct proposals.
|
|
279
438
|
for(let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++){
|
|
280
439
|
const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
|
|
281
440
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
282
441
|
expect(result.added).toBe(true);
|
|
283
442
|
expect(result.count).toBe(i + 1);
|
|
284
443
|
}
|
|
285
|
-
// The next proposal should not be added
|
|
444
|
+
// The next proposal should not be added.
|
|
286
445
|
const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
|
|
287
446
|
const result = await ap.tryAddCheckpointProposal(extraProposal);
|
|
288
447
|
expect(result.added).toBe(false);
|
|
@@ -367,11 +526,11 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
367
526
|
const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
|
|
368
527
|
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
369
528
|
expect(result2.count).toBe(2);
|
|
370
|
-
//
|
|
529
|
+
// Third proposal for same position should be rejected (cap is 2)
|
|
371
530
|
const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
|
|
372
531
|
const result3 = await ap.tryAddBlockProposal(proposal3);
|
|
373
|
-
expect(result3.added).toBe(
|
|
374
|
-
expect(result3.count).toBe(
|
|
532
|
+
expect(result3.added).toBe(false);
|
|
533
|
+
expect(result3.count).toBe(2);
|
|
375
534
|
});
|
|
376
535
|
it('should return added=false when exceeding capacity', async ()=>{
|
|
377
536
|
const slotNumber = 100;
|
|
@@ -462,25 +621,25 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
462
621
|
await ap.tryAddBlockProposal(oldProposal);
|
|
463
622
|
await ap.tryAddBlockProposal(newProposal);
|
|
464
623
|
// Verify both proposals exist
|
|
465
|
-
expect(await ap.
|
|
466
|
-
expect(await ap.
|
|
624
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeDefined();
|
|
625
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
467
626
|
// Delete slots older than newSlot (should delete oldSlot)
|
|
468
627
|
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
469
628
|
// Old proposal should be deleted from storage
|
|
470
|
-
expect(await ap.
|
|
629
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeUndefined();
|
|
471
630
|
// New proposal should still exist
|
|
472
|
-
expect(await ap.
|
|
631
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
473
632
|
});
|
|
474
633
|
});
|
|
475
634
|
describe('tryAddCheckpointProposal duplicate detection', ()=>{
|
|
476
|
-
const mockCheckpointProposalCoreForPool = async (signer, slotNumber, archive = Fr.random())=>{
|
|
477
|
-
const
|
|
635
|
+
const mockCheckpointProposalCoreForPool = async (signer, slotNumber, archive = Fr.random(), checkpointHeader)=>{
|
|
636
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, {
|
|
478
637
|
slotNumber: SlotNumber(slotNumber)
|
|
479
638
|
});
|
|
480
639
|
const blockHeader = makeBlockHeader(1);
|
|
481
640
|
const proposal = await makeCheckpointProposal({
|
|
482
641
|
signer,
|
|
483
|
-
checkpointHeader,
|
|
642
|
+
checkpointHeader: headerToUse,
|
|
484
643
|
archiveRoot: archive,
|
|
485
644
|
lastBlock: {
|
|
486
645
|
blockHeader
|
|
@@ -537,11 +696,11 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
537
696
|
const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
|
|
538
697
|
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
539
698
|
expect(result2.count).toBe(2);
|
|
540
|
-
//
|
|
699
|
+
// Third proposal for same slot should be rejected (cap is 2)
|
|
541
700
|
const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
|
|
542
701
|
const result3 = await ap.tryAddCheckpointProposal(proposal3);
|
|
543
|
-
expect(result3.added).toBe(
|
|
544
|
-
expect(result3.count).toBe(
|
|
702
|
+
expect(result3.added).toBe(false);
|
|
703
|
+
expect(result3.count).toBe(2);
|
|
545
704
|
});
|
|
546
705
|
it('should not count attestations as proposals for duplicate detection', async ()=>{
|
|
547
706
|
const slotNumber = 100;
|
|
@@ -239,4 +239,4 @@ export declare const generateAccount: () => {
|
|
|
239
239
|
* @returns A Checkpoint Attestation
|
|
240
240
|
*/
|
|
241
241
|
export declare const mockCheckpointAttestation: (signer: Secp256k1Signer, slot?: number, archive?: Fr, header?: CheckpointHeader | undefined, feeAssetPriceModifier?: bigint) => CheckpointAttestation;
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9tb2Nrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUNMLHFCQUFxQixFQUl0QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBS3hEOzs7O0dBSUc7QUFDSCxlQUFPLE1BQU0sZUFBZTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBRzNCLENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsZUFBTyxNQUFNLHlCQUF5Qix3SkF3QnJDLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/mocks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EACL,qBAAqB,EAItB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/mocks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EACL,qBAAqB,EAItB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKxD;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG3B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,wJAwBrC,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
-
import { CheckpointAttestation,
|
|
3
|
+
import { CheckpointAttestation, CheckpointProposal, ConsensusPayload, getHashedSignaturePayloadTypedData } from '@aztec/stdlib/p2p';
|
|
4
4
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
5
|
+
import { TEST_COORDINATION_SIGNATURE_CONTEXT } from '@aztec/stdlib/testing';
|
|
5
6
|
import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
6
7
|
/** Generate Account
|
|
7
8
|
*
|
|
@@ -22,10 +23,11 @@ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
|
22
23
|
header = header ?? CheckpointHeader.random({
|
|
23
24
|
slotNumber: SlotNumber(slot)
|
|
24
25
|
});
|
|
25
|
-
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier);
|
|
26
|
-
const attestationHash =
|
|
26
|
+
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier, TEST_COORDINATION_SIGNATURE_CONTEXT);
|
|
27
|
+
const attestationHash = getHashedSignaturePayloadTypedData(payload);
|
|
27
28
|
const attestationSignature = signer.sign(attestationHash);
|
|
28
|
-
const
|
|
29
|
+
const proposal = new CheckpointProposal(header, archive, feeAssetPriceModifier, attestationSignature, TEST_COORDINATION_SIGNATURE_CONTEXT);
|
|
30
|
+
const proposalHash = getHashedSignaturePayloadTypedData(proposal);
|
|
29
31
|
const proposerSignature = signer.sign(proposalHash);
|
|
30
32
|
return new CheckpointAttestation(payload, attestationSignature, proposerSignature);
|
|
31
33
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export { AttestationPool, type AttestationPoolApi } from './attestation_pool/attestation_pool.js';
|
|
2
2
|
export { type MemPools } from './interface.js';
|
|
3
|
-
export { type TxPool } from './tx_pool/tx_pool.js';
|
|
4
3
|
export { type TxPoolV2, type TxPoolV2Config, type TxPoolV2Events, type AddTxsResult } from './tx_pool_v2/index.js';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZW1fcG9vbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDbEcsT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLEtBQUssY0FBYyxFQUFFLEtBQUssY0FBYyxFQUFFLEtBQUssWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mem_pools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAClG,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mem_pools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAClG,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { Gossipable } from '@aztec/stdlib/p2p';
|
|
2
|
-
import type { Tx } from '@aztec/stdlib/tx';
|
|
3
2
|
import { type LmdbStatsCallback, type TelemetryClient } from '@aztec/telemetry-client';
|
|
4
3
|
export declare enum PoolName {
|
|
5
4
|
TX_POOL = "TxPool",
|
|
@@ -27,10 +26,16 @@ export declare class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
27
26
|
constructor(telemetry: TelemetryClient, name: PoolName, poolStats: PoolStatsCallback, dbStats?: LmdbStatsCallback);
|
|
28
27
|
recordSize(poolObject: PoolObject): void;
|
|
29
28
|
incrementAddedObjects(count: number): void;
|
|
30
|
-
transactionsAdded(transactions: Tx[]): void;
|
|
31
|
-
transactionsRemoved(hashes: Iterable<bigint> | Iterable<string>): void;
|
|
32
29
|
trackMempoolItemAdded(key: bigint | string): void;
|
|
33
30
|
trackMempoolItemRemoved(key: bigint | string): void;
|
|
31
|
+
/**
|
|
32
|
+
* Records a pre-computed pending-to-mined delay directly, bypassing the
|
|
33
|
+
* `mempoolItemAddedTimestamp` map. Used by the tx pool, which derives the
|
|
34
|
+
* delay from the persisted `receivedAt` on tx metadata at the mined
|
|
35
|
+
* transition — more accurate than the add/remove map (which also fires on
|
|
36
|
+
* eviction) and resilient to the caller not having tracked the add.
|
|
37
|
+
*/
|
|
38
|
+
recordMinedDelay(delayMs: number): void;
|
|
34
39
|
private observeStats;
|
|
35
40
|
}
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWVtX3Bvb2xzL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBS0wsS0FBSyxpQkFBaUIsRUFLdEIsS0FBSyxlQUFlLEVBR3JCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsb0JBQVksUUFBUTtJQUNsQixPQUFPLFdBQVc7SUFDbEIsZ0JBQWdCLG9CQUFvQjtDQUNyQztBQWtDRCxNQUFNLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxPQUFPLENBQUM7SUFDNUMsU0FBUyxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQzVDLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ0gscUJBQWEsbUJBQW1CLENBQUMsVUFBVSxTQUFTLFVBQVU7SUFtQjFELE9BQU8sQ0FBQyxTQUFTO0lBbEJuQix1Q0FBdUM7SUFDdkMsT0FBTyxDQUFDLGdCQUFnQixDQUFrQjtJQUMxQyxPQUFPLENBQUMsZ0JBQWdCLENBQWdCO0lBQ3hDLHFCQUFxQjtJQUNyQixPQUFPLENBQUMsVUFBVSxDQUFZO0lBQzlCLHdEQUF3RDtJQUN4RCxPQUFPLENBQUMsVUFBVSxDQUFZO0lBRTlCLE9BQU8sQ0FBQyxTQUFTLENBQWM7SUFFL0IsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0lBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQVE7SUFFckIsT0FBTyxDQUFDLHlCQUF5QixDQUFvRTtJQUVyRyxZQUNFLFNBQVMsRUFBRSxlQUFlLEVBQzFCLElBQUksRUFBRSxRQUFRLEVBQ04sU0FBUyxFQUFFLGlCQUFpQixFQUNwQyxPQUFPLENBQUMsRUFBRSxpQkFBaUIsRUE0QjVCO0lBRU0sVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLFFBRXZDO0lBRU0scUJBQXFCLENBQUMsS0FBSyxFQUFFLE1BQU0sUUFFekM7SUFFTSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBRXZEO0lBRU0sdUJBQXVCLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQVN6RDtJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUk3QztJQUVELE9BQU8sQ0FBQyxZQUFZLENBWWxCO0NBQ0gifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/mem_pools/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/mem_pools/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAKL,KAAK,iBAAiB,EAKtB,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,oBAAY,QAAQ;IAClB,OAAO,WAAW;IAClB,gBAAgB,oBAAoB;CACrC;AAkCD,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC;IAC5C,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C,CAAC,CAAC;AAEH;;GAEG;AACH,qBAAa,mBAAmB,CAAC,UAAU,SAAS,UAAU;IAmB1D,OAAO,CAAC,SAAS;IAlBnB,uCAAuC;IACvC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IACxC,qBAAqB;IACrB,OAAO,CAAC,UAAU,CAAY;IAC9B,wDAAwD;IACxD,OAAO,CAAC,UAAU,CAAY;IAE9B,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,yBAAyB,CAAoE;IAErG,YACE,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,QAAQ,EACN,SAAS,EAAE,iBAAiB,EACpC,OAAO,CAAC,EAAE,iBAAiB,EA4B5B;IAEM,UAAU,CAAC,UAAU,EAAE,UAAU,QAEvC;IAEM,qBAAqB,CAAC,KAAK,EAAE,MAAM,QAEzC;IAEM,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvD;IAEM,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASzD;IAED;;;;;;OAMG;IACI,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI7C;IAED,OAAO,CAAC,YAAY,CAYlB;CACH"}
|