@aztec/p2p 0.0.1-commit.e558bd1c → 0.0.1-commit.e57c76e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -3
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +9 -1
- package/dest/client/factory.d.ts +11 -10
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +58 -16
- package/dest/client/interface.d.ts +51 -36
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +48 -57
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +219 -236
- package/dest/config.d.ts +161 -94
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +150 -41
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/errors/reqresp.error.d.ts +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -55
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +295 -195
- 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 +231 -115
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +7 -5
- package/dest/mem_pools/index.d.ts +2 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +33 -15
- package/dest/mem_pools/interface.d.ts +3 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -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 +1 -7
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +18 -9
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +7 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +12 -4
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +3 -2
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +2 -1
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +54 -5
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +8 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +7 -5
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +9 -7
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +14 -6
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +4 -4
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +16 -4
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/index.d.ts +3 -2
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +2 -1
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +33 -12
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +5 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +81 -15
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +147 -19
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +12 -3
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +50 -45
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +12 -5
- 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 +17 -6
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +14 -5
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +407 -241
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +9 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +37 -12
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +4 -5
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +56 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +10 -4
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +10 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +10 -4
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +16 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +21 -8
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +90 -44
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +4 -4
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +11 -18
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +2 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +25 -21
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts +17 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_setup_helpers.js +24 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- package/dest/msg_validators/tx_validator/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/double_spend_validator.d.ts +13 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
- package/dest/msg_validators/tx_validator/factory.d.ts +135 -7
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +252 -61
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +6 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +99 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +137 -53
- package/dest/msg_validators/tx_validator/index.d.ts +5 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +4 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/nullifier_cache.js +24 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +22 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +72 -24
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- package/dest/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 +2 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +35 -8
- package/dest/services/dummy_service.d.ts +18 -18
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +19 -20
- package/dest/services/encoding.d.ts +7 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +18 -11
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +184 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +363 -0
- package/dest/services/libp2p/instrumentation.d.ts +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -0
- package/dest/services/libp2p/libp2p_service.d.ts +56 -55
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +449 -397
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -0
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +40 -11
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +57 -12
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +5 -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 +95 -127
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +11 -11
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +11 -13
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +31 -46
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +19 -11
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +52 -15
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- package/dest/services/reqresp/config.d.ts +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/interface.d.ts +25 -18
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +23 -19
- 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 +3 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +18 -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 +57 -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 +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +21 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
- package/dest/services/reqresp/reqresp.d.ts +7 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +53 -218
- package/dest/services/service.d.ts +30 -14
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +11 -14
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +26 -33
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +37 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +127 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +38 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +100 -0
- package/dest/services/tx_collection/index.d.ts +3 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -1
- package/dest/services/tx_collection/instrumentation.js +1 -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 +45 -51
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +296 -68
- package/dest/services/tx_collection/tx_collection_sink.d.ts +19 -9
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +28 -31
- package/dest/services/tx_collection/tx_source.d.ts +13 -7
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +26 -7
- package/dest/services/tx_file_store/config.d.ts +1 -3
- package/dest/services/tx_file_store/config.d.ts.map +1 -1
- package/dest/services/tx_file_store/config.js +0 -4
- package/dest/services/tx_file_store/tx_file_store.d.ts +4 -5
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +13 -20
- package/dest/services/tx_provider.d.ts +6 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +12 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts +7 -8
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +5 -3
- package/dest/test-helpers/mock-pubsub.d.ts +46 -6
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +115 -14
- package/dest/test-helpers/reqresp-nodes.d.ts +5 -7
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +19 -20
- 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 +46 -37
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +142 -50
- 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 +93 -47
- 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 +13 -8
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +15 -14
- package/src/bootstrap/bootstrap.ts +9 -1
- package/src/client/factory.ts +124 -27
- package/src/client/interface.ts +58 -44
- package/src/client/p2p_client.ts +256 -299
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +260 -46
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/errors/reqresp.error.ts +0 -25
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +363 -236
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +258 -118
- package/src/mem_pools/attestation_pool/index.ts +3 -3
- package/src/mem_pools/attestation_pool/mocks.ts +14 -8
- package/src/mem_pools/index.ts +1 -1
- package/src/mem_pools/instrumentation.ts +22 -14
- package/src/mem_pools/interface.ts +2 -2
- package/src/mem_pools/tx_pool_v2/README.md +85 -11
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +21 -8
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +7 -3
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +18 -4
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +5 -0
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +65 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +59 -4
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +5 -5
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +8 -8
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +14 -9
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +33 -6
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +4 -3
- package/src/mem_pools/tx_pool_v2/index.ts +2 -1
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +35 -12
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +215 -27
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +58 -45
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +34 -8
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +448 -240
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +41 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -7
- package/src/msg_validators/clock_tolerance.ts +73 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +24 -4
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +35 -7
- package/src/msg_validators/proposal_validator/proposal_validator.ts +114 -47
- package/src/msg_validators/tx_validator/README.md +127 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +8 -17
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +22 -27
- package/src/msg_validators/tx_validator/allowed_setup_helpers.ts +31 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
- 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/double_spend_validator.ts +11 -6
- package/src/msg_validators/tx_validator/factory.ts +407 -80
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +6 -2
- package/src/msg_validators/tx_validator/gas_validator.ts +199 -54
- package/src/msg_validators/tx_validator/index.ts +4 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +82 -27
- package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
- 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 +38 -5
- package/src/services/dummy_service.ts +26 -45
- package/src/services/encoding.ts +18 -10
- package/src/services/gossipsub/README.md +641 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +519 -0
- package/src/services/libp2p/instrumentation.ts +14 -0
- package/src/services/libp2p/libp2p_service.ts +497 -453
- package/src/services/peer-manager/metrics.ts +7 -0
- package/src/services/peer-manager/peer_manager.ts +46 -11
- package/src/services/peer-manager/peer_scoring.ts +52 -5
- package/src/services/reqresp/README.md +215 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +92 -138
- package/src/services/reqresp/batch-tx-requester/interface.ts +14 -10
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +30 -71
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +68 -24
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/config.ts +2 -2
- package/src/services/reqresp/interface.ts +45 -46
- 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 +36 -32
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +64 -20
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +23 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
- package/src/services/reqresp/reqresp.ts +61 -264
- package/src/services/service.ts +43 -30
- package/src/services/tx_collection/config.ts +40 -49
- package/src/services/tx_collection/file_store_tx_collection.ts +153 -0
- package/src/services/tx_collection/file_store_tx_source.ts +129 -0
- package/src/services/tx_collection/index.ts +2 -6
- package/src/services/tx_collection/instrumentation.ts +1 -1
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +362 -110
- package/src/services/tx_collection/tx_collection_sink.ts +32 -36
- package/src/services/tx_collection/tx_source.ts +28 -8
- package/src/services/tx_file_store/config.ts +0 -6
- package/src/services/tx_file_store/tx_file_store.ts +15 -25
- package/src/services/tx_provider.ts +15 -9
- package/src/test-helpers/make-test-p2p-clients.ts +7 -6
- package/src/test-helpers/mock-pubsub.ts +137 -14
- package/src/test-helpers/reqresp-nodes.ts +17 -29
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +168 -68
- package/src/testbench/p2p_client_testbench_worker.ts +99 -62
- package/src/testbench/worker_client_manager.ts +72 -25
- package/src/util.ts +40 -19
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -305
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +0 -23
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +0 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +0 -212
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -52
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -307
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -49
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -53
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -177
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -336
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +0 -230
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -354
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -112
- package/src/services/tx_collection/slow_tx_collection.ts +0 -233
|
@@ -3,7 +3,7 @@ import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
5
5
|
import { makeBlockHeader, makeBlockProposal, makeCheckpointHeader, makeCheckpointProposal } from '@aztec/stdlib/testing';
|
|
6
|
-
import {
|
|
6
|
+
import { MAX_BLOCK_PROPOSALS_PER_POSITION, MAX_CHECKPOINT_PROPOSALS_PER_SLOT } from './attestation_pool.js';
|
|
7
7
|
import { mockCheckpointAttestation } from './mocks.js';
|
|
8
8
|
const NUMBER_OF_SIGNERS_PER_TEST = 4;
|
|
9
9
|
export function describeAttestationPool(getAttestationPool) {
|
|
@@ -15,9 +15,17 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
15
15
|
length: NUMBER_OF_SIGNERS_PER_TEST
|
|
16
16
|
}, ()=>Secp256k1Signer.random());
|
|
17
17
|
});
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Build attestations from each signer over the *same* signed payload (same header,
|
|
20
|
+
* archive, feeAssetPriceModifier). Required by the new pool, which deduplicates by
|
|
21
|
+
* payload hash and treats attestations from different signers as distinct entries
|
|
22
|
+
* only when the payload itself matches.
|
|
23
|
+
*/ const createCheckpointAttestationsForSlot = (slotNumber, archive)=>{
|
|
19
24
|
const archiveToUse = archive ?? Fr.random();
|
|
20
|
-
|
|
25
|
+
const sharedHeader = CheckpointHeader.random({
|
|
26
|
+
slotNumber: SlotNumber(slotNumber)
|
|
27
|
+
});
|
|
28
|
+
return signers.map((signer)=>mockCheckpointAttestation(signer, slotNumber, archiveToUse, sharedHeader));
|
|
21
29
|
};
|
|
22
30
|
const mockBlockProposalForPool = (signer, slotNumber, archive = Fr.random())=>{
|
|
23
31
|
const header = makeBlockHeader(1, {
|
|
@@ -41,20 +49,24 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
41
49
|
it('should add attestations to pool', async ()=>{
|
|
42
50
|
const slotNumber = 420;
|
|
43
51
|
const archive = Fr.random();
|
|
44
|
-
const
|
|
52
|
+
const sharedHeader = CheckpointHeader.random({
|
|
53
|
+
slotNumber: SlotNumber(slotNumber)
|
|
54
|
+
});
|
|
55
|
+
const attestations = signers.slice(0, -1).map((signer)=>mockCheckpointAttestation(signer, slotNumber, archive, sharedHeader));
|
|
56
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
45
57
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
46
|
-
const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
58
|
+
const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
47
59
|
expect(retrievedAttestations.length).toBe(attestations.length);
|
|
48
60
|
compareCheckpointAttestations(retrievedAttestations, attestations);
|
|
49
61
|
const retrievedAttestationsForSlot = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
|
|
50
62
|
expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
|
|
51
63
|
compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
|
|
52
64
|
// Add another one
|
|
53
|
-
const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
|
|
65
|
+
const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive, sharedHeader);
|
|
54
66
|
await ap.addOwnCheckpointAttestations([
|
|
55
67
|
newAttestation
|
|
56
68
|
]);
|
|
57
|
-
const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
69
|
+
const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
58
70
|
expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
|
|
59
71
|
compareCheckpointAttestations(retrievedAttestationsAfterAdd, [
|
|
60
72
|
...attestations,
|
|
@@ -68,7 +80,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
68
80
|
]);
|
|
69
81
|
// Delete by slot
|
|
70
82
|
await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
|
|
71
|
-
const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
83
|
+
const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
72
84
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
73
85
|
});
|
|
74
86
|
it('should handle duplicate proposals in a slot', async ()=>{
|
|
@@ -83,9 +95,10 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
83
95
|
for(let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++){
|
|
84
96
|
attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
|
|
85
97
|
}
|
|
98
|
+
const payloadHash = attestations[0].getPayloadHash();
|
|
86
99
|
// Add them to store and check we end up with only one
|
|
87
100
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
88
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
101
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash);
|
|
89
102
|
expect(retreivedAttestations.length).toBe(1);
|
|
90
103
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
|
|
91
104
|
expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
|
|
@@ -93,7 +106,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
93
106
|
await ap.addOwnCheckpointAttestations([
|
|
94
107
|
attestations[0]
|
|
95
108
|
]);
|
|
96
|
-
expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber),
|
|
109
|
+
expect(await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), payloadHash)).toHaveLength(1);
|
|
97
110
|
});
|
|
98
111
|
it('should store attestations by differing slot', async ()=>{
|
|
99
112
|
const slotNumbers = [
|
|
@@ -106,8 +119,8 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
106
119
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
107
120
|
for (const attestation of attestations){
|
|
108
121
|
const slot = attestation.payload.header.slotNumber;
|
|
109
|
-
const
|
|
110
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
122
|
+
const payloadHash = attestation.getPayloadHash();
|
|
123
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
111
124
|
expect(retreivedAttestations.length).toBe(1);
|
|
112
125
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
113
126
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -130,8 +143,8 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
130
143
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
131
144
|
for (const attestation of attestations){
|
|
132
145
|
const slot = attestation.payload.header.slotNumber;
|
|
133
|
-
const
|
|
134
|
-
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
146
|
+
const payloadHash = attestation.getPayloadHash();
|
|
147
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, payloadHash);
|
|
135
148
|
expect(retreivedAttestations.length).toBe(1);
|
|
136
149
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
137
150
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -148,13 +161,14 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
148
161
|
88,
|
|
149
162
|
420
|
|
150
163
|
];
|
|
151
|
-
const
|
|
152
|
-
const
|
|
164
|
+
const attestationsPerSlot = await Promise.all(slotNumbers.map((slotNumber)=>createCheckpointAttestationsForSlot(slotNumber)));
|
|
165
|
+
const attestations = attestationsPerSlot.flat();
|
|
166
|
+
const payloadHashForSlot1 = attestationsPerSlot[0][0].getPayloadHash();
|
|
153
167
|
await ap.addOwnCheckpointAttestations(attestations);
|
|
154
|
-
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1),
|
|
168
|
+
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), payloadHashForSlot1);
|
|
155
169
|
expect(attestationsForSlot1.length).toBe(signers.length);
|
|
156
170
|
await ap.deleteOlderThan(SlotNumber(73));
|
|
157
|
-
const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1),
|
|
171
|
+
const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), payloadHashForSlot1);
|
|
158
172
|
expect(attestationsForSlot1AfterDelete.length).toBe(0);
|
|
159
173
|
});
|
|
160
174
|
});
|
|
@@ -163,49 +177,81 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
163
177
|
const slotNumber = 420;
|
|
164
178
|
const archive = Fr.random();
|
|
165
179
|
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
166
|
-
const proposalId = proposal.archive.toString();
|
|
167
180
|
const result = await ap.tryAddBlockProposal(proposal);
|
|
168
181
|
expect(result.added).toBe(true);
|
|
169
182
|
expect(result.alreadyExists).toBe(false);
|
|
170
|
-
expect(result.
|
|
171
|
-
const retrievedProposal = await ap.
|
|
183
|
+
expect(result.count).toBe(1);
|
|
184
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
172
185
|
expect(retrievedProposal).toBeDefined();
|
|
173
186
|
expect(retrievedProposal).toEqual(proposal);
|
|
174
187
|
});
|
|
175
188
|
it('should return undefined for non-existent block proposal', async ()=>{
|
|
176
189
|
const nonExistentId = Fr.random().toString();
|
|
177
|
-
const retrievedProposal = await ap.
|
|
190
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(nonExistentId);
|
|
178
191
|
expect(retrievedProposal).toBeUndefined();
|
|
179
192
|
});
|
|
180
|
-
it('should return alreadyExists when adding
|
|
193
|
+
it('should return alreadyExists when re-adding the same signed payload', async ()=>{
|
|
181
194
|
const slotNumber = 420;
|
|
182
195
|
const archive = Fr.random();
|
|
183
|
-
const
|
|
184
|
-
const
|
|
185
|
-
const result1 = await ap.tryAddBlockProposal(proposal1);
|
|
196
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
197
|
+
const result1 = await ap.tryAddBlockProposal(proposal);
|
|
186
198
|
expect(result1.added).toBe(true);
|
|
187
199
|
expect(result1.alreadyExists).toBe(false);
|
|
188
|
-
//
|
|
189
|
-
const
|
|
190
|
-
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
200
|
+
// Re-broadcasting the exact same proposal yields alreadyExists.
|
|
201
|
+
const result2 = await ap.tryAddBlockProposal(proposal);
|
|
191
202
|
expect(result2.added).toBe(false);
|
|
192
203
|
expect(result2.alreadyExists).toBe(true);
|
|
193
|
-
|
|
194
|
-
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
204
|
+
const retrievedProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
195
205
|
expect(retrievedProposal).toBeDefined();
|
|
196
|
-
expect(retrievedProposal.toBuffer()).toEqual(
|
|
206
|
+
expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
|
|
197
207
|
expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
198
208
|
});
|
|
209
|
+
it('should retain an exact duplicate block proposal only once', async ()=>{
|
|
210
|
+
const slotNumber = 420;
|
|
211
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber);
|
|
212
|
+
await ap.tryAddBlockProposal(proposal);
|
|
213
|
+
await ap.tryAddBlockProposal(proposal);
|
|
214
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
215
|
+
expect(proposals.blockProposals.map((proposal)=>proposal.toBuffer())).toEqual([
|
|
216
|
+
proposal.withoutSignedTxs().toBuffer()
|
|
217
|
+
]);
|
|
218
|
+
});
|
|
219
|
+
it('should retain all accepted block proposals at a position', async ()=>{
|
|
220
|
+
const slotNumber = 420;
|
|
221
|
+
const blockHeader = makeBlockHeader(1, {
|
|
222
|
+
slotNumber: SlotNumber(slotNumber)
|
|
223
|
+
});
|
|
224
|
+
const proposal1 = await makeBlockProposal({
|
|
225
|
+
signer: signers[0],
|
|
226
|
+
blockHeader,
|
|
227
|
+
archiveRoot: Fr.random(),
|
|
228
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1)
|
|
229
|
+
});
|
|
230
|
+
const proposal2 = await makeBlockProposal({
|
|
231
|
+
signer: signers[0],
|
|
232
|
+
blockHeader,
|
|
233
|
+
archiveRoot: Fr.random(),
|
|
234
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(1)
|
|
235
|
+
});
|
|
236
|
+
await ap.tryAddBlockProposal(proposal1);
|
|
237
|
+
await ap.tryAddBlockProposal(proposal2);
|
|
238
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
239
|
+
expect(proposals.blockProposals.map((proposal)=>proposal.toBuffer())).toEqual(expect.arrayContaining([
|
|
240
|
+
proposal1.withoutSignedTxs().toBuffer(),
|
|
241
|
+
proposal2.withoutSignedTxs().toBuffer()
|
|
242
|
+
]));
|
|
243
|
+
expect(await ap.getBlockProposalByArchive(proposal2.archive.toString())).toBeDefined();
|
|
244
|
+
});
|
|
199
245
|
});
|
|
200
246
|
describe('CheckpointProposal in attestation pool', ()=>{
|
|
201
|
-
const mockCheckpointProposalForPool = async (signer, slotNumber, archive = Fr.random())=>{
|
|
202
|
-
const
|
|
247
|
+
const mockCheckpointProposalForPool = async (signer, slotNumber, archive = Fr.random(), checkpointHeader)=>{
|
|
248
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, {
|
|
203
249
|
slotNumber: SlotNumber(slotNumber)
|
|
204
250
|
});
|
|
205
251
|
const blockHeader = makeBlockHeader(1);
|
|
206
252
|
const proposal = await makeCheckpointProposal({
|
|
207
253
|
signer,
|
|
208
|
-
checkpointHeader,
|
|
254
|
+
checkpointHeader: headerToUse,
|
|
209
255
|
archiveRoot: archive,
|
|
210
256
|
lastBlock: {
|
|
211
257
|
blockHeader
|
|
@@ -218,12 +264,11 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
218
264
|
const slotNumber = 420;
|
|
219
265
|
const archive = Fr.random();
|
|
220
266
|
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
221
|
-
const proposalId = proposal.archive.toString();
|
|
222
267
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
223
268
|
expect(result.added).toBe(true);
|
|
224
269
|
expect(result.alreadyExists).toBe(false);
|
|
225
|
-
expect(result.
|
|
226
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
270
|
+
expect(result.count).toBe(1);
|
|
271
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
227
272
|
expect(retrievedProposal).toBeDefined();
|
|
228
273
|
expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
|
|
229
274
|
});
|
|
@@ -239,55 +284,126 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
239
284
|
checkpointHeader,
|
|
240
285
|
archiveRoot: archive
|
|
241
286
|
});
|
|
242
|
-
const proposalId = proposal.archive.toString();
|
|
243
287
|
// Add the checkpoint core - block extraction is now caller responsibility
|
|
244
288
|
await ap.tryAddCheckpointProposal(proposal.toCore());
|
|
245
289
|
// The checkpoint proposal should be stored
|
|
246
|
-
const retrievedCheckpointProposal = await ap.getCheckpointProposal(
|
|
290
|
+
const retrievedCheckpointProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
247
291
|
expect(retrievedCheckpointProposal).toBeDefined();
|
|
248
292
|
// No block proposal was extracted (it had none anyway)
|
|
249
|
-
const retrievedBlockProposal = await ap.
|
|
293
|
+
const retrievedBlockProposal = await ap.getBlockProposalByArchive(proposal.archive.toString());
|
|
250
294
|
expect(retrievedBlockProposal).toBeUndefined();
|
|
251
295
|
});
|
|
252
296
|
it('should return undefined for non-existent checkpoint proposal', async ()=>{
|
|
253
|
-
const
|
|
254
|
-
const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
|
|
297
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(99999));
|
|
255
298
|
expect(retrievedProposal).toBeUndefined();
|
|
256
299
|
});
|
|
257
|
-
it('should return alreadyExists when adding
|
|
300
|
+
it('should return alreadyExists when re-adding the same signed payload', async ()=>{
|
|
258
301
|
const slotNumber = 420;
|
|
259
302
|
const archive = Fr.random();
|
|
260
|
-
const
|
|
261
|
-
const
|
|
262
|
-
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
303
|
+
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
304
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal);
|
|
263
305
|
expect(result1.added).toBe(true);
|
|
264
306
|
expect(result1.alreadyExists).toBe(false);
|
|
265
|
-
//
|
|
266
|
-
const
|
|
267
|
-
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
307
|
+
// Re-broadcasting the exact same signed payload yields alreadyExists.
|
|
308
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal);
|
|
268
309
|
expect(result2.added).toBe(false);
|
|
269
310
|
expect(result2.alreadyExists).toBe(true);
|
|
270
|
-
// Should still have the first proposal
|
|
271
|
-
const retrievedProposal = await ap.getCheckpointProposal(
|
|
311
|
+
// Should still have the first proposal stored at the slot
|
|
312
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
272
313
|
expect(retrievedProposal).toBeDefined();
|
|
273
|
-
expect(retrievedProposal.toBuffer()).toEqual(
|
|
314
|
+
expect(retrievedProposal.toBuffer()).toEqual(proposal.toBuffer());
|
|
274
315
|
expect(retrievedProposal.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
275
316
|
});
|
|
317
|
+
it('should treat distinct payloads at the same slot as equivocations (count = 2)', async ()=>{
|
|
318
|
+
const slotNumber = 420;
|
|
319
|
+
// Two proposals at the same slot but with different headers (distinct payloads).
|
|
320
|
+
const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
321
|
+
const proposal2 = await mockCheckpointProposalForPool(signers[0], slotNumber, Fr.random());
|
|
322
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
323
|
+
expect(result1.added).toBe(true);
|
|
324
|
+
expect(result1.count).toBe(1);
|
|
325
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
326
|
+
// The second distinct payload is tracked as an equivocation, count goes to 2,
|
|
327
|
+
// and both accepted payloads are retained by payload hash.
|
|
328
|
+
expect(result2.added).toBe(true);
|
|
329
|
+
expect(result2.alreadyExists).toBe(false);
|
|
330
|
+
expect(result2.count).toBe(2);
|
|
331
|
+
const retrievedProposal = await ap.getCheckpointProposal(SlotNumber(slotNumber));
|
|
332
|
+
const expectedProposal = [
|
|
333
|
+
proposal1,
|
|
334
|
+
proposal2
|
|
335
|
+
].sort((a, b)=>a.getPayloadHash().localeCompare(b.getPayloadHash()))[0];
|
|
336
|
+
expect(retrievedProposal.toBuffer()).toEqual(expectedProposal.toBuffer());
|
|
337
|
+
const proposals = await ap.getProposalsForSlot(SlotNumber(slotNumber));
|
|
338
|
+
expect(proposals.checkpointProposals.map((proposal)=>proposal.toBuffer())).toEqual(expect.arrayContaining([
|
|
339
|
+
proposal1.toBuffer(),
|
|
340
|
+
proposal2.toBuffer()
|
|
341
|
+
]));
|
|
342
|
+
});
|
|
343
|
+
it('should detect equivocation when only feeAssetPriceModifier differs', async ()=>{
|
|
344
|
+
const slotNumber = 420;
|
|
345
|
+
const archive = Fr.random();
|
|
346
|
+
// Same checkpoint header + archive, but two different feeAssetPriceModifier values.
|
|
347
|
+
// This is the audit-finding scenario: archive collides but the signed payload differs.
|
|
348
|
+
const sharedHeader = makeCheckpointHeader(1, {
|
|
349
|
+
slotNumber: SlotNumber(slotNumber)
|
|
350
|
+
});
|
|
351
|
+
const proposalA = await makeCheckpointProposal({
|
|
352
|
+
signer: signers[0],
|
|
353
|
+
checkpointHeader: sharedHeader,
|
|
354
|
+
archiveRoot: archive,
|
|
355
|
+
feeAssetPriceModifier: 50n
|
|
356
|
+
});
|
|
357
|
+
const proposalB = await makeCheckpointProposal({
|
|
358
|
+
signer: signers[0],
|
|
359
|
+
checkpointHeader: sharedHeader,
|
|
360
|
+
archiveRoot: archive,
|
|
361
|
+
feeAssetPriceModifier: -50n
|
|
362
|
+
});
|
|
363
|
+
const result1 = await ap.tryAddCheckpointProposal(proposalA.toCore());
|
|
364
|
+
expect(result1.count).toBe(1);
|
|
365
|
+
const result2 = await ap.tryAddCheckpointProposal(proposalB.toCore());
|
|
366
|
+
// The fix: archive collision no longer hides the equivocation; payload-hash dedup
|
|
367
|
+
// sees the distinct feeMod and bumps `count` to 2 so libp2p can fire the slash callback.
|
|
368
|
+
expect(result2.added).toBe(true);
|
|
369
|
+
expect(result2.alreadyExists).toBe(false);
|
|
370
|
+
expect(result2.count).toBe(2);
|
|
371
|
+
});
|
|
372
|
+
it('should delete retained proposals older than a given slot', async ()=>{
|
|
373
|
+
const oldSlot = 100;
|
|
374
|
+
const newSlot = 200;
|
|
375
|
+
const oldBlock = await mockBlockProposalForPool(signers[0], oldSlot);
|
|
376
|
+
const newBlock = await mockBlockProposalForPool(signers[1], newSlot);
|
|
377
|
+
const oldCheckpoint = await mockCheckpointProposalForPool(signers[0], oldSlot);
|
|
378
|
+
const newCheckpoint = await mockCheckpointProposalForPool(signers[1], newSlot);
|
|
379
|
+
await ap.tryAddBlockProposal(oldBlock);
|
|
380
|
+
await ap.tryAddBlockProposal(newBlock);
|
|
381
|
+
await ap.tryAddCheckpointProposal(oldCheckpoint);
|
|
382
|
+
await ap.tryAddCheckpointProposal(newCheckpoint);
|
|
383
|
+
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
384
|
+
expect(await ap.getProposalsForSlot(SlotNumber(oldSlot))).toEqual({
|
|
385
|
+
blockProposals: [],
|
|
386
|
+
checkpointProposals: []
|
|
387
|
+
});
|
|
388
|
+
const newProposals = await ap.getProposalsForSlot(SlotNumber(newSlot));
|
|
389
|
+
expect(newProposals.blockProposals.map((proposal)=>proposal.toBuffer())).toContainEqual(newBlock.withoutSignedTxs().toBuffer());
|
|
390
|
+
expect(newProposals.checkpointProposals.map((proposal)=>proposal.toBuffer())).toContainEqual(newCheckpoint.toBuffer());
|
|
391
|
+
});
|
|
276
392
|
it('should return added=false when exceeding capacity', async ()=>{
|
|
277
393
|
const slotNumber = 420;
|
|
278
|
-
// Add
|
|
279
|
-
for(let i = 0; i <
|
|
394
|
+
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT distinct proposals.
|
|
395
|
+
for(let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++){
|
|
280
396
|
const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
|
|
281
397
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
282
398
|
expect(result.added).toBe(true);
|
|
283
|
-
expect(result.
|
|
399
|
+
expect(result.count).toBe(i + 1);
|
|
284
400
|
}
|
|
285
|
-
// The next proposal should not be added
|
|
401
|
+
// The next proposal should not be added.
|
|
286
402
|
const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
|
|
287
403
|
const result = await ap.tryAddCheckpointProposal(extraProposal);
|
|
288
404
|
expect(result.added).toBe(false);
|
|
289
405
|
expect(result.alreadyExists).toBe(false);
|
|
290
|
-
expect(result.
|
|
406
|
+
expect(result.count).toBe(MAX_CHECKPOINT_PROPOSALS_PER_SLOT);
|
|
291
407
|
});
|
|
292
408
|
});
|
|
293
409
|
describe('Duplicate proposal detection', ()=>{
|
|
@@ -303,12 +419,12 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
303
419
|
});
|
|
304
420
|
};
|
|
305
421
|
describe('tryAddBlockProposal duplicate detection', ()=>{
|
|
306
|
-
it('should return
|
|
422
|
+
it('should return count=1 when pool is empty', async ()=>{
|
|
307
423
|
const proposal = await mockBlockProposalWithIndex(signers[0], 100, 0);
|
|
308
424
|
const result = await ap.tryAddBlockProposal(proposal);
|
|
309
425
|
expect(result.added).toBe(true);
|
|
310
426
|
expect(result.alreadyExists).toBe(false);
|
|
311
|
-
expect(result.
|
|
427
|
+
expect(result.count).toBe(1);
|
|
312
428
|
});
|
|
313
429
|
it('should return alreadyExists when same proposal exists', async ()=>{
|
|
314
430
|
const proposal = await mockBlockProposalWithIndex(signers[0], 100, 0);
|
|
@@ -316,22 +432,22 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
316
432
|
const result = await ap.tryAddBlockProposal(proposal);
|
|
317
433
|
expect(result.added).toBe(false);
|
|
318
434
|
expect(result.alreadyExists).toBe(true);
|
|
319
|
-
expect(result.
|
|
435
|
+
expect(result.count).toBe(1);
|
|
320
436
|
});
|
|
321
|
-
it('should detect duplicate via
|
|
437
|
+
it('should detect duplicate via count when different proposal exists at same position', async ()=>{
|
|
322
438
|
const slotNumber = 100;
|
|
323
439
|
const indexWithinCheckpoint = 2;
|
|
324
440
|
// Add first proposal
|
|
325
441
|
const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
|
|
326
442
|
const result1 = await ap.tryAddBlockProposal(proposal1);
|
|
327
|
-
expect(result1.
|
|
443
|
+
expect(result1.count).toBe(1);
|
|
328
444
|
// Add a different proposal at same position - this is a duplicate (equivocation)
|
|
329
445
|
const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
|
|
330
446
|
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
331
447
|
expect(result2.added).toBe(true);
|
|
332
448
|
expect(result2.alreadyExists).toBe(false);
|
|
333
|
-
//
|
|
334
|
-
expect(result2.
|
|
449
|
+
// count >= 2 indicates duplicate detection
|
|
450
|
+
expect(result2.count).toBe(2);
|
|
335
451
|
});
|
|
336
452
|
it('should not detect duplicate for different positions in same slot', async ()=>{
|
|
337
453
|
const slotNumber = 100;
|
|
@@ -342,8 +458,8 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
342
458
|
const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
|
|
343
459
|
const result = await ap.tryAddBlockProposal(proposal2);
|
|
344
460
|
expect(result.added).toBe(true);
|
|
345
|
-
//
|
|
346
|
-
expect(result.
|
|
461
|
+
// count = 1 means no duplicate for this position
|
|
462
|
+
expect(result.count).toBe(1);
|
|
347
463
|
});
|
|
348
464
|
it('should not detect duplicate for same position in different slots', async ()=>{
|
|
349
465
|
const indexWithinCheckpoint = 0;
|
|
@@ -354,41 +470,41 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
354
470
|
const proposal2 = await mockBlockProposalWithIndex(signers[1], 200, indexWithinCheckpoint);
|
|
355
471
|
const result = await ap.tryAddBlockProposal(proposal2);
|
|
356
472
|
expect(result.added).toBe(true);
|
|
357
|
-
//
|
|
358
|
-
expect(result.
|
|
473
|
+
// count = 1 means no duplicate for this position
|
|
474
|
+
expect(result.count).toBe(1);
|
|
359
475
|
});
|
|
360
|
-
it('should track multiple duplicates correctly via
|
|
476
|
+
it('should track multiple duplicates correctly via count', async ()=>{
|
|
361
477
|
const slotNumber = 100;
|
|
362
478
|
const indexWithinCheckpoint = 0;
|
|
363
479
|
// Add multiple proposals for same position
|
|
364
480
|
const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
|
|
365
481
|
const result1 = await ap.tryAddBlockProposal(proposal1);
|
|
366
|
-
expect(result1.
|
|
482
|
+
expect(result1.count).toBe(1);
|
|
367
483
|
const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
|
|
368
484
|
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
369
|
-
expect(result2.
|
|
370
|
-
//
|
|
485
|
+
expect(result2.count).toBe(2);
|
|
486
|
+
// Third proposal for same position should be rejected (cap is 2)
|
|
371
487
|
const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
|
|
372
488
|
const result3 = await ap.tryAddBlockProposal(proposal3);
|
|
373
|
-
expect(result3.added).toBe(
|
|
374
|
-
expect(result3.
|
|
489
|
+
expect(result3.added).toBe(false);
|
|
490
|
+
expect(result3.count).toBe(2);
|
|
375
491
|
});
|
|
376
492
|
it('should return added=false when exceeding capacity', async ()=>{
|
|
377
493
|
const slotNumber = 100;
|
|
378
494
|
const indexWithinCheckpoint = 0;
|
|
379
|
-
// Add
|
|
380
|
-
for(let i = 0; i <
|
|
495
|
+
// Add MAX_BLOCK_PROPOSALS_PER_POSITION proposals
|
|
496
|
+
for(let i = 0; i < MAX_BLOCK_PROPOSALS_PER_POSITION; i++){
|
|
381
497
|
const proposal = await mockBlockProposalWithIndex(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber, indexWithinCheckpoint);
|
|
382
498
|
const result = await ap.tryAddBlockProposal(proposal);
|
|
383
499
|
expect(result.added).toBe(true);
|
|
384
|
-
expect(result.
|
|
500
|
+
expect(result.count).toBe(i + 1);
|
|
385
501
|
}
|
|
386
502
|
// The next proposal should not be added
|
|
387
503
|
const extraProposal = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
|
|
388
504
|
const result = await ap.tryAddBlockProposal(extraProposal);
|
|
389
505
|
expect(result.added).toBe(false);
|
|
390
506
|
expect(result.alreadyExists).toBe(false);
|
|
391
|
-
expect(result.
|
|
507
|
+
expect(result.count).toBe(MAX_BLOCK_PROPOSALS_PER_POSITION);
|
|
392
508
|
});
|
|
393
509
|
it('should clean up block position index when deleting old data', async ()=>{
|
|
394
510
|
const slotNumber = 100;
|
|
@@ -396,16 +512,16 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
396
512
|
// Add proposal
|
|
397
513
|
const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
|
|
398
514
|
await ap.tryAddBlockProposal(proposal1);
|
|
399
|
-
// Verify it's tracked (adding another should show
|
|
515
|
+
// Verify it's tracked (adding another should show count = 2)
|
|
400
516
|
const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
|
|
401
517
|
let result = await ap.tryAddBlockProposal(proposal2);
|
|
402
|
-
expect(result.
|
|
518
|
+
expect(result.count).toBe(2);
|
|
403
519
|
// Delete old data
|
|
404
520
|
await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
|
|
405
|
-
// Verify position index is cleaned up (
|
|
521
|
+
// Verify position index is cleaned up (count should be 1 now)
|
|
406
522
|
const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
|
|
407
523
|
result = await ap.tryAddBlockProposal(proposal3);
|
|
408
|
-
expect(result.
|
|
524
|
+
expect(result.count).toBe(1);
|
|
409
525
|
});
|
|
410
526
|
it('should correctly delete block proposals at slot boundary', async ()=>{
|
|
411
527
|
// Add proposals at slots 99, 100, and 101 with various indices
|
|
@@ -422,14 +538,14 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
422
538
|
// Slot 99 proposals should have their index cleaned up
|
|
423
539
|
const newProposal99 = await mockBlockProposalWithIndex(signers[0], 99, 0);
|
|
424
540
|
const result99 = await ap.tryAddBlockProposal(newProposal99);
|
|
425
|
-
expect(result99.
|
|
541
|
+
expect(result99.count).toBe(1); // Index was cleaned up
|
|
426
542
|
// Slot 100 and 101 should still be tracked
|
|
427
543
|
const newProposal100 = await mockBlockProposalWithIndex(signers[1], 100, 0);
|
|
428
544
|
const result100 = await ap.tryAddBlockProposal(newProposal100);
|
|
429
|
-
expect(result100.
|
|
545
|
+
expect(result100.count).toBe(2); // Still has the original
|
|
430
546
|
const newProposal101 = await mockBlockProposalWithIndex(signers[2], 101, 0);
|
|
431
547
|
const result101 = await ap.tryAddBlockProposal(newProposal101);
|
|
432
|
-
expect(result101.
|
|
548
|
+
expect(result101.count).toBe(2); // Still has the original
|
|
433
549
|
});
|
|
434
550
|
it('should delete all indices for a given slot', async ()=>{
|
|
435
551
|
const slotNumber = 50;
|
|
@@ -445,13 +561,13 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
445
561
|
// All indices should be cleaned up
|
|
446
562
|
const newProposal0 = await mockBlockProposalWithIndex(signers[0], slotNumber, 0);
|
|
447
563
|
const result0 = await ap.tryAddBlockProposal(newProposal0);
|
|
448
|
-
expect(result0.
|
|
564
|
+
expect(result0.count).toBe(1);
|
|
449
565
|
const newProposal1 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
|
|
450
566
|
const result1 = await ap.tryAddBlockProposal(newProposal1);
|
|
451
|
-
expect(result1.
|
|
567
|
+
expect(result1.count).toBe(1);
|
|
452
568
|
const newProposal2 = await mockBlockProposalWithIndex(signers[2], slotNumber, 2);
|
|
453
569
|
const result2 = await ap.tryAddBlockProposal(newProposal2);
|
|
454
|
-
expect(result2.
|
|
570
|
+
expect(result2.count).toBe(1);
|
|
455
571
|
});
|
|
456
572
|
it('should delete block proposals from storage when deleting old data', async ()=>{
|
|
457
573
|
const oldSlot = 50;
|
|
@@ -462,25 +578,25 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
462
578
|
await ap.tryAddBlockProposal(oldProposal);
|
|
463
579
|
await ap.tryAddBlockProposal(newProposal);
|
|
464
580
|
// Verify both proposals exist
|
|
465
|
-
expect(await ap.
|
|
466
|
-
expect(await ap.
|
|
581
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeDefined();
|
|
582
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
467
583
|
// Delete slots older than newSlot (should delete oldSlot)
|
|
468
584
|
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
469
585
|
// Old proposal should be deleted from storage
|
|
470
|
-
expect(await ap.
|
|
586
|
+
expect(await ap.getBlockProposalByArchive(oldProposal.archive.toString())).toBeUndefined();
|
|
471
587
|
// New proposal should still exist
|
|
472
|
-
expect(await ap.
|
|
588
|
+
expect(await ap.getBlockProposalByArchive(newProposal.archive.toString())).toBeDefined();
|
|
473
589
|
});
|
|
474
590
|
});
|
|
475
591
|
describe('tryAddCheckpointProposal duplicate detection', ()=>{
|
|
476
|
-
const mockCheckpointProposalCoreForPool = async (signer, slotNumber, archive = Fr.random())=>{
|
|
477
|
-
const
|
|
592
|
+
const mockCheckpointProposalCoreForPool = async (signer, slotNumber, archive = Fr.random(), checkpointHeader)=>{
|
|
593
|
+
const headerToUse = checkpointHeader ?? makeCheckpointHeader(1, {
|
|
478
594
|
slotNumber: SlotNumber(slotNumber)
|
|
479
595
|
});
|
|
480
596
|
const blockHeader = makeBlockHeader(1);
|
|
481
597
|
const proposal = await makeCheckpointProposal({
|
|
482
598
|
signer,
|
|
483
|
-
checkpointHeader,
|
|
599
|
+
checkpointHeader: headerToUse,
|
|
484
600
|
archiveRoot: archive,
|
|
485
601
|
lastBlock: {
|
|
486
602
|
blockHeader
|
|
@@ -488,12 +604,12 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
488
604
|
});
|
|
489
605
|
return proposal.toCore();
|
|
490
606
|
};
|
|
491
|
-
it('should return
|
|
607
|
+
it('should return count=1 when pool is empty', async ()=>{
|
|
492
608
|
const proposal = await mockCheckpointProposalCoreForPool(signers[0], 100);
|
|
493
609
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
494
610
|
expect(result.added).toBe(true);
|
|
495
611
|
expect(result.alreadyExists).toBe(false);
|
|
496
|
-
expect(result.
|
|
612
|
+
expect(result.count).toBe(1);
|
|
497
613
|
});
|
|
498
614
|
it('should return alreadyExists when same proposal exists', async ()=>{
|
|
499
615
|
const proposal = await mockCheckpointProposalCoreForPool(signers[0], 100);
|
|
@@ -501,21 +617,21 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
501
617
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
502
618
|
expect(result.added).toBe(false);
|
|
503
619
|
expect(result.alreadyExists).toBe(true);
|
|
504
|
-
expect(result.
|
|
620
|
+
expect(result.count).toBe(1);
|
|
505
621
|
});
|
|
506
|
-
it('should detect duplicate via
|
|
622
|
+
it('should detect duplicate via count when different proposal exists for same slot', async ()=>{
|
|
507
623
|
const slotNumber = 100;
|
|
508
624
|
// Add first proposal
|
|
509
625
|
const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], slotNumber);
|
|
510
626
|
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
511
|
-
expect(result1.
|
|
627
|
+
expect(result1.count).toBe(1);
|
|
512
628
|
// Add a different proposal for same slot - this is a duplicate (equivocation)
|
|
513
629
|
const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
|
|
514
630
|
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
515
631
|
expect(result2.added).toBe(true);
|
|
516
632
|
expect(result2.alreadyExists).toBe(false);
|
|
517
|
-
//
|
|
518
|
-
expect(result2.
|
|
633
|
+
// count >= 2 indicates duplicate detection
|
|
634
|
+
expect(result2.count).toBe(2);
|
|
519
635
|
});
|
|
520
636
|
it('should not detect duplicate for different slots', async ()=>{
|
|
521
637
|
// Add proposal at slot 100
|
|
@@ -525,23 +641,23 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
525
641
|
const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], 200);
|
|
526
642
|
const result = await ap.tryAddCheckpointProposal(proposal2);
|
|
527
643
|
expect(result.added).toBe(true);
|
|
528
|
-
//
|
|
529
|
-
expect(result.
|
|
644
|
+
// count = 1 means no duplicate for this slot
|
|
645
|
+
expect(result.count).toBe(1);
|
|
530
646
|
});
|
|
531
|
-
it('should track multiple duplicates correctly via
|
|
647
|
+
it('should track multiple duplicates correctly via count', async ()=>{
|
|
532
648
|
const slotNumber = 100;
|
|
533
649
|
// Add multiple proposals for same slot
|
|
534
650
|
const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], slotNumber);
|
|
535
651
|
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
536
|
-
expect(result1.
|
|
652
|
+
expect(result1.count).toBe(1);
|
|
537
653
|
const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
|
|
538
654
|
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
539
|
-
expect(result2.
|
|
540
|
-
//
|
|
655
|
+
expect(result2.count).toBe(2);
|
|
656
|
+
// Third proposal for same slot should be rejected (cap is 2)
|
|
541
657
|
const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
|
|
542
658
|
const result3 = await ap.tryAddCheckpointProposal(proposal3);
|
|
543
|
-
expect(result3.added).toBe(
|
|
544
|
-
expect(result3.
|
|
659
|
+
expect(result3.added).toBe(false);
|
|
660
|
+
expect(result3.count).toBe(2);
|
|
545
661
|
});
|
|
546
662
|
it('should not count attestations as proposals for duplicate detection', async ()=>{
|
|
547
663
|
const slotNumber = 100;
|
|
@@ -556,8 +672,8 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
556
672
|
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
557
673
|
expect(result.added).toBe(true);
|
|
558
674
|
expect(result.alreadyExists).toBe(false);
|
|
559
|
-
//
|
|
560
|
-
expect(result.
|
|
675
|
+
// count should be 1, NOT 2 - attestations should not count as proposals
|
|
676
|
+
expect(result.count).toBe(1);
|
|
561
677
|
});
|
|
562
678
|
it('should not count attestations for different proposals as duplicates', async ()=>{
|
|
563
679
|
const slotNumber = 100;
|
|
@@ -574,12 +690,12 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
574
690
|
const proposal1 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber, archive1);
|
|
575
691
|
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
576
692
|
expect(result1.added).toBe(true);
|
|
577
|
-
expect(result1.
|
|
693
|
+
expect(result1.count).toBe(1);
|
|
578
694
|
// Add the second checkpoint proposal - this IS a duplicate (different archive, same slot)
|
|
579
695
|
const proposal2 = await mockCheckpointProposalCoreForPool(signers[3], slotNumber, archive2);
|
|
580
696
|
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
581
697
|
expect(result2.added).toBe(true);
|
|
582
|
-
expect(result2.
|
|
698
|
+
expect(result2.count).toBe(2);
|
|
583
699
|
});
|
|
584
700
|
});
|
|
585
701
|
});
|