@aztec/p2p 0.0.1-commit.fce3e4f → 0.0.1-commit.ff7989d6c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +4 -4
- package/dest/client/factory.d.ts +7 -6
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +53 -15
- package/dest/client/interface.d.ts +58 -25
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +51 -56
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +608 -264
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +38 -13
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +31 -20
- package/dest/errors/tx-pool.error.d.ts +8 -0
- package/dest/errors/tx-pool.error.d.ts.map +1 -0
- package/dest/errors/tx-pool.error.js +9 -0
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +111 -76
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +441 -3
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +2 -2
- 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 +529 -289
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -3
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts +11 -8
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +17 -13
- package/dest/mem_pools/index.d.ts +3 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/index.js +1 -1
- package/dest/mem_pools/instrumentation.d.ts +7 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +31 -13
- package/dest/mem_pools/interface.d.ts +6 -7
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +37 -27
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +314 -335
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
- package/dest/mem_pools/tx_pool/index.d.ts +1 -2
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/index.js +0 -1
- package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.js +6 -1
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +11 -6
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +30 -24
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
- 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 +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +95 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +174 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +65 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +73 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- 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 +211 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +9 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +97 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +152 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +355 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +60 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +161 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +77 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +896 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +52 -19
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +7 -7
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +22 -13
- package/dest/msg_validators/clock_tolerance.d.ts +21 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +37 -0
- package/dest/msg_validators/index.d.ts +2 -2
- package/dest/msg_validators/index.d.ts.map +1 -1
- package/dest/msg_validators/index.js +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +4 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
- package/dest/msg_validators/tx_validator/factory.d.ts +10 -4
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +22 -12
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +11 -16
- package/dest/msg_validators/tx_validator/index.d.ts +2 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +4 -3
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +23 -5
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- 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 -2
- 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 +10 -6
- package/dest/services/discv5/discV5_service.js +1 -1
- package/dest/services/dummy_service.d.ts +28 -3
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +51 -0
- package/dest/services/encoding.d.ts +2 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +10 -8
- 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 +173 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +346 -0
- package/dest/services/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/instrumentation.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +30 -72
- package/dest/services/libp2p/libp2p_service.d.ts +109 -36
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +988 -326
- package/dest/services/peer-manager/metrics.d.ts +7 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +33 -21
- package/dest/services/peer-manager/peer_manager.d.ts +2 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +4 -12
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +32 -6
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +48 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +562 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +46 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +34 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +130 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- package/dest/services/reqresp/interface.d.ts +13 -2
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +16 -2
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -21
- package/dest/services/reqresp/protocols/auth.d.ts +2 -2
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/auth.js +2 -2
- package/dest/services/reqresp/protocols/block.d.ts +1 -1
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block.js +3 -2
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +12 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +7 -5
- 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 +27 -9
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +30 -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 +60 -14
- package/dest/services/reqresp/protocols/status.d.ts +5 -4
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +7 -3
- package/dest/services/reqresp/protocols/tx.d.ts +8 -3
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/reqresp.d.ts +6 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +471 -50
- package/dest/services/service.d.ts +55 -3
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +22 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +56 -2
- package/dest/services/tx_collection/fast_tx_collection.d.ts +10 -6
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +71 -44
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +167 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +37 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +90 -0
- package/dest/services/tx_collection/index.d.ts +3 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +2 -0
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +11 -13
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +49 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +9 -4
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +60 -26
- package/dest/services/tx_collection/tx_collection.d.ts +31 -17
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +79 -7
- package/dest/services/tx_collection/tx_collection_sink.d.ts +18 -8
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +26 -29
- package/dest/services/tx_collection/tx_source.d.ts +8 -3
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +19 -2
- package/dest/services/tx_file_store/config.d.ts +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +48 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +152 -0
- 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 +16 -6
- package/dest/services/tx_provider_instrumentation.d.ts +5 -2
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +14 -14
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.d.ts +29 -2
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +103 -2
- package/dest/test-helpers/mock-tx-helpers.js +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts +2 -2
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +2 -1
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +163 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +366 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +221 -126
- package/dest/testbench/worker_client_manager.d.ts +51 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +226 -39
- package/dest/util.d.ts +2 -2
- package/dest/util.d.ts.map +1 -1
- package/package.json +18 -18
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +98 -31
- package/src/client/interface.ts +76 -25
- package/src/client/p2p_client.ts +283 -307
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +346 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +59 -29
- package/src/errors/tx-pool.error.ts +12 -0
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +510 -78
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +614 -322
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +22 -15
- package/src/mem_pools/index.ts +4 -1
- package/src/mem_pools/instrumentation.ts +39 -14
- package/src/mem_pools/interface.ts +5 -7
- package/src/mem_pools/tx_pool/README.md +270 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +367 -371
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
- package/src/mem_pools/tx_pool/index.ts +0 -1
- package/src/mem_pools/tx_pool/priority.ts +8 -1
- package/src/mem_pools/tx_pool/tx_pool.ts +11 -5
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +23 -17
- package/src/mem_pools/tx_pool_v2/README.md +275 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +121 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +122 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +27 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +209 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +90 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +242 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +242 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +444 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +223 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1069 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +37 -22
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +21 -18
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
- package/src/msg_validators/tx_validator/data_validator.ts +18 -6
- package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
- package/src/msg_validators/tx_validator/factory.ts +67 -25
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +17 -28
- package/src/msg_validators/tx_validator/index.ts +1 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +19 -8
- package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/test_utils.ts +1 -1
- package/src/msg_validators/tx_validator/timestamp_validator.ts +30 -19
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +1 -1
- package/src/services/dummy_service.ts +68 -1
- package/src/services/encoding.ts +9 -7
- 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 +487 -0
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +32 -73
- package/src/services/libp2p/libp2p_service.ts +661 -316
- package/src/services/peer-manager/metrics.ts +39 -21
- package/src/services/peer-manager/peer_manager.ts +5 -4
- package/src/services/peer-manager/peer_scoring.ts +28 -4
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +53 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +161 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +19 -1
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/interface.ts +30 -2
- package/src/services/reqresp/metrics.ts +36 -27
- package/src/services/reqresp/protocols/auth.ts +2 -2
- package/src/services/reqresp/protocols/block.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +35 -12
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +75 -10
- package/src/services/reqresp/protocols/status.ts +16 -12
- package/src/services/reqresp/protocols/tx.ts +23 -2
- package/src/services/reqresp/reqresp.ts +79 -22
- package/src/services/service.ts +72 -4
- package/src/services/tx_collection/config.ts +84 -2
- package/src/services/tx_collection/fast_tx_collection.ts +96 -49
- package/src/services/tx_collection/file_store_tx_collection.ts +202 -0
- package/src/services/tx_collection/file_store_tx_source.ts +117 -0
- package/src/services/tx_collection/index.ts +6 -0
- package/src/services/tx_collection/instrumentation.ts +11 -13
- package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
- package/src/services/tx_collection/proposal_tx_collector.ts +113 -0
- package/src/services/tx_collection/slow_tx_collection.ts +69 -36
- package/src/services/tx_collection/tx_collection.ts +122 -24
- package/src/services/tx_collection/tx_collection_sink.ts +30 -34
- package/src/services/tx_collection/tx_source.ts +22 -3
- package/src/services/tx_file_store/config.ts +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +175 -0
- package/src/services/tx_provider.ts +27 -10
- package/src/services/tx_provider_instrumentation.ts +24 -14
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/make-test-p2p-clients.ts +3 -3
- package/src/test-helpers/mock-pubsub.ts +144 -4
- package/src/test-helpers/mock-tx-helpers.ts +1 -1
- package/src/test-helpers/reqresp-nodes.ts +3 -2
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +430 -0
- package/src/testbench/p2p_client_testbench_worker.ts +349 -123
- package/src/testbench/worker_client_manager.ts +304 -42
- package/src/util.ts +7 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +0 -37
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +0 -213
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +0 -30
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +0 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +0 -219
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -80
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -238
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
- package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/index.js +0 -1
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +0 -298
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +0 -287
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -283
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
-
import { Secp256k1Signer } from '@aztec/foundation/crypto';
|
|
3
|
-
import { Fr } from '@aztec/foundation/
|
|
4
|
-
import type {
|
|
1
|
+
import { IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
3
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
+
import type { BlockProposal, CheckpointAttestation, CheckpointProposalCore } from '@aztec/stdlib/p2p';
|
|
5
|
+
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
5
6
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} from '@aztec/stdlib/
|
|
11
|
-
import { makeL2BlockHeader } from '@aztec/stdlib/testing';
|
|
12
|
-
import { TxHash } from '@aztec/stdlib/tx';
|
|
7
|
+
makeBlockHeader,
|
|
8
|
+
makeBlockProposal,
|
|
9
|
+
makeCheckpointHeader,
|
|
10
|
+
makeCheckpointProposal,
|
|
11
|
+
} from '@aztec/stdlib/testing';
|
|
13
12
|
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
type AttestationPool,
|
|
15
|
+
MAX_BLOCK_PROPOSALS_PER_POSITION,
|
|
16
|
+
MAX_CHECKPOINT_PROPOSALS_PER_SLOT,
|
|
17
|
+
} from './attestation_pool.js';
|
|
18
|
+
import { mockCheckpointAttestation } from './mocks.js';
|
|
20
19
|
|
|
21
20
|
const NUMBER_OF_SIGNERS_PER_TEST = 4;
|
|
22
21
|
|
|
@@ -24,406 +23,699 @@ export function describeAttestationPool(getAttestationPool: () => AttestationPoo
|
|
|
24
23
|
let ap: AttestationPool;
|
|
25
24
|
let signers: Secp256k1Signer[];
|
|
26
25
|
|
|
27
|
-
// Check that metrics are recorded correctly
|
|
28
|
-
let metricsMock: MockProxy<PoolInstrumentation<BlockAttestation>>;
|
|
29
|
-
|
|
30
26
|
beforeEach(() => {
|
|
31
27
|
ap = getAttestationPool();
|
|
32
28
|
signers = Array.from({ length: NUMBER_OF_SIGNERS_PER_TEST }, () => Secp256k1Signer.random());
|
|
33
|
-
|
|
34
|
-
metricsMock = mock<PoolInstrumentation<BlockAttestation>>();
|
|
35
|
-
// Can i overwrite this like this??
|
|
36
|
-
(ap as any).metrics = metricsMock;
|
|
37
29
|
});
|
|
38
30
|
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
return signers.map(signer =>
|
|
31
|
+
const createCheckpointAttestationsForSlot = (slotNumber: number, archive?: Fr) => {
|
|
32
|
+
const archiveToUse = archive ?? Fr.random();
|
|
33
|
+
return signers.map(signer => mockCheckpointAttestation(signer, slotNumber, archiveToUse));
|
|
42
34
|
};
|
|
43
35
|
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
36
|
+
const mockBlockProposalForPool = (
|
|
37
|
+
signer: Secp256k1Signer,
|
|
38
|
+
slotNumber: number,
|
|
39
|
+
archive: Fr = Fr.random(),
|
|
40
|
+
): Promise<BlockProposal> => {
|
|
41
|
+
const header = makeBlockHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
42
|
+
return makeBlockProposal({
|
|
43
|
+
signer,
|
|
44
|
+
blockHeader: header,
|
|
45
|
+
archiveRoot: archive,
|
|
46
|
+
});
|
|
54
47
|
};
|
|
55
48
|
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
const
|
|
49
|
+
// Compare checkpoint attestations buffers
|
|
50
|
+
// Using array containing as the kv store does not respect insertion order
|
|
51
|
+
const compareCheckpointAttestations = (a1: CheckpointAttestation[], a2: CheckpointAttestation[]) => {
|
|
59
52
|
const a1Buffer = a1.map(attestation => attestation.toBuffer());
|
|
60
53
|
const a2Buffer = a2.map(attestation => attestation.toBuffer());
|
|
61
54
|
expect(a1Buffer.length).toBe(a2Buffer.length);
|
|
62
55
|
expect(a1Buffer).toEqual(expect.arrayContaining(a2Buffer));
|
|
63
56
|
};
|
|
64
57
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
expect(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
SlotNumber(slotNumber),
|
|
107
|
-
archive.toString(),
|
|
108
|
-
);
|
|
109
|
-
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
110
|
-
// Check hasAttestation after deletion
|
|
111
|
-
for (const attestation of attestations) {
|
|
112
|
-
expect(await ap.hasAttestation(attestation)).toBe(false);
|
|
113
|
-
}
|
|
114
|
-
expect(await ap.hasAttestation(newAttestation)).toBe(false);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('should handle duplicate proposals in a slot', async () => {
|
|
118
|
-
const slotNumber = 420;
|
|
119
|
-
const archive = Fr.random();
|
|
120
|
-
|
|
121
|
-
// Use the same signer for all attestations
|
|
122
|
-
const attestations: BlockAttestation[] = [];
|
|
123
|
-
const signer = signers[0];
|
|
124
|
-
for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
|
|
125
|
-
attestations.push(mockAttestation(signer, slotNumber, archive));
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Add them to store and check we end up with only one
|
|
129
|
-
await ap.addAttestations(attestations);
|
|
130
|
-
|
|
131
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
132
|
-
SlotNumber(slotNumber),
|
|
133
|
-
archive.toString(),
|
|
134
|
-
);
|
|
135
|
-
expect(retreivedAttestations.length).toBe(1);
|
|
136
|
-
expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
|
|
137
|
-
expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
|
|
138
|
-
|
|
139
|
-
// Try adding them on another operation and check they are still not duplicated
|
|
140
|
-
await ap.addAttestations([attestations[0]]);
|
|
141
|
-
expect(await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString())).toHaveLength(1);
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
it('should store attestations by differing slot', async () => {
|
|
145
|
-
const slotNumbers = [1, 2, 3, 4];
|
|
146
|
-
const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i]));
|
|
147
|
-
|
|
148
|
-
await ap.addAttestations(attestations);
|
|
149
|
-
|
|
150
|
-
for (const attestation of attestations) {
|
|
151
|
-
const slot = attestation.payload.header.slotNumber;
|
|
152
|
-
const archive = attestation.archive.toString();
|
|
153
|
-
|
|
154
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot, archive);
|
|
155
|
-
expect(retreivedAttestations.length).toBe(1);
|
|
156
|
-
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
157
|
-
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
158
|
-
}
|
|
159
|
-
});
|
|
58
|
+
describe('CheckpointAttestation', () => {
|
|
59
|
+
it('should add attestations to pool', async () => {
|
|
60
|
+
const slotNumber = 420;
|
|
61
|
+
const archive = Fr.random();
|
|
62
|
+
const attestations = signers.slice(0, -1).map(signer => mockCheckpointAttestation(signer, slotNumber, archive));
|
|
63
|
+
|
|
64
|
+
await ap.addOwnCheckpointAttestations(attestations);
|
|
65
|
+
|
|
66
|
+
const retrievedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
67
|
+
SlotNumber(slotNumber),
|
|
68
|
+
archive.toString(),
|
|
69
|
+
);
|
|
70
|
+
expect(retrievedAttestations.length).toBe(attestations.length);
|
|
71
|
+
compareCheckpointAttestations(retrievedAttestations, attestations);
|
|
72
|
+
|
|
73
|
+
const retrievedAttestationsForSlot = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
|
|
74
|
+
expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
|
|
75
|
+
compareCheckpointAttestations(retrievedAttestationsForSlot, attestations);
|
|
76
|
+
|
|
77
|
+
// Add another one
|
|
78
|
+
const newAttestation = mockCheckpointAttestation(signers[NUMBER_OF_SIGNERS_PER_TEST - 1], slotNumber, archive);
|
|
79
|
+
await ap.addOwnCheckpointAttestations([newAttestation]);
|
|
80
|
+
const retrievedAttestationsAfterAdd = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
81
|
+
SlotNumber(slotNumber),
|
|
82
|
+
archive.toString(),
|
|
83
|
+
);
|
|
84
|
+
expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
|
|
85
|
+
compareCheckpointAttestations(retrievedAttestationsAfterAdd, [...attestations, newAttestation]);
|
|
86
|
+
const retrievedAttestationsForSlotAfterAdd = await ap.getCheckpointAttestationsForSlot(SlotNumber(slotNumber));
|
|
87
|
+
expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
|
|
88
|
+
compareCheckpointAttestations(retrievedAttestationsForSlotAfterAdd, [...attestations, newAttestation]);
|
|
89
|
+
|
|
90
|
+
// Delete by slot
|
|
91
|
+
await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
|
|
92
|
+
|
|
93
|
+
const retreivedAttestationsAfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
94
|
+
SlotNumber(slotNumber),
|
|
95
|
+
archive.toString(),
|
|
96
|
+
);
|
|
97
|
+
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
98
|
+
});
|
|
160
99
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
100
|
+
it('should handle duplicate proposals in a slot', async () => {
|
|
101
|
+
const slotNumber = 420;
|
|
102
|
+
const archive = Fr.random();
|
|
103
|
+
const header = CheckpointHeader.random({ slotNumber: SlotNumber(slotNumber) });
|
|
165
104
|
|
|
166
|
-
|
|
105
|
+
// Use the same signer and header for all attestations
|
|
106
|
+
const attestations: CheckpointAttestation[] = [];
|
|
107
|
+
const signer = signers[0];
|
|
108
|
+
for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) {
|
|
109
|
+
attestations.push(mockCheckpointAttestation(signer, slotNumber, archive, header));
|
|
110
|
+
}
|
|
167
111
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
const proposalId = attestation.archive.toString();
|
|
112
|
+
// Add them to store and check we end up with only one
|
|
113
|
+
await ap.addOwnCheckpointAttestations(attestations);
|
|
171
114
|
|
|
172
|
-
const retreivedAttestations = await ap.
|
|
115
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
116
|
+
SlotNumber(slotNumber),
|
|
117
|
+
archive.toString(),
|
|
118
|
+
);
|
|
173
119
|
expect(retreivedAttestations.length).toBe(1);
|
|
174
|
-
expect(retreivedAttestations[0].toBuffer()).toEqual(
|
|
175
|
-
expect(retreivedAttestations[0].
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const proposalId = attestations[0].archive.toString();
|
|
184
|
-
|
|
185
|
-
await ap.addAttestations(attestations);
|
|
186
|
-
|
|
187
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
188
|
-
expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
|
|
189
|
-
compareAttestations(retreivedAttestations, attestations);
|
|
190
|
-
|
|
191
|
-
// Check hasAttestation before deletion
|
|
192
|
-
for (const attestation of attestations) {
|
|
193
|
-
expect(await ap.hasAttestation(attestation)).toBe(true);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
await ap.deleteAttestations(attestations);
|
|
197
|
-
|
|
198
|
-
const gottenAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
199
|
-
expect(gottenAfterDelete.length).toBe(0);
|
|
120
|
+
expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
|
|
121
|
+
expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
|
|
122
|
+
|
|
123
|
+
// Try adding them on another operation and check they are still not duplicated
|
|
124
|
+
await ap.addOwnCheckpointAttestations([attestations[0]]);
|
|
125
|
+
expect(
|
|
126
|
+
await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString()),
|
|
127
|
+
).toHaveLength(1);
|
|
128
|
+
});
|
|
200
129
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
}
|
|
205
|
-
});
|
|
130
|
+
it('should store attestations by differing slot', async () => {
|
|
131
|
+
const slotNumbers = [1, 2, 3, 4];
|
|
132
|
+
const attestations = signers.map((signer, i) => mockCheckpointAttestation(signer, slotNumbers[i]));
|
|
206
133
|
|
|
207
|
-
|
|
208
|
-
const slotNumber = 420;
|
|
209
|
-
const archive = Fr.random();
|
|
210
|
-
const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
|
|
211
|
-
const proposalId = attestations[0].archive.toString();
|
|
134
|
+
await ap.addOwnCheckpointAttestations(attestations);
|
|
212
135
|
|
|
213
|
-
|
|
136
|
+
for (const attestation of attestations) {
|
|
137
|
+
const slot = attestation.payload.header.slotNumber;
|
|
138
|
+
const archive = attestation.archive.toString();
|
|
214
139
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
140
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, archive);
|
|
141
|
+
expect(retreivedAttestations.length).toBe(1);
|
|
142
|
+
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
143
|
+
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
218
146
|
|
|
219
|
-
|
|
147
|
+
it('should store attestations by differing slot and archive', async () => {
|
|
148
|
+
const slotNumbers = [1, 1, 2, 3];
|
|
149
|
+
const archives = [Fr.random(), Fr.random(), Fr.random(), Fr.random()];
|
|
150
|
+
const attestations = signers.map((signer, i) => mockCheckpointAttestation(signer, slotNumbers[i], archives[i]));
|
|
220
151
|
|
|
221
|
-
|
|
222
|
-
SlotNumber(slotNumber),
|
|
223
|
-
proposalId,
|
|
224
|
-
);
|
|
225
|
-
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
226
|
-
});
|
|
152
|
+
await ap.addOwnCheckpointAttestations(attestations);
|
|
227
153
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
|
|
232
|
-
const proposalId = attestations[0].archive.toString();
|
|
233
|
-
|
|
234
|
-
// Add another set of attestations with a different proposalId, yet the same slot
|
|
235
|
-
const archive2 = Fr.random();
|
|
236
|
-
const attestations2 = signers.map(signer => mockAttestation(signer, slotNumber, archive2));
|
|
237
|
-
const proposalId2 = attestations2[0].archive.toString();
|
|
238
|
-
|
|
239
|
-
await ap.addAttestations(attestations);
|
|
240
|
-
await ap.addAttestations(attestations2);
|
|
241
|
-
|
|
242
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
243
|
-
expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
|
|
244
|
-
compareAttestations(retreivedAttestations, attestations);
|
|
245
|
-
|
|
246
|
-
await ap.deleteAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
247
|
-
|
|
248
|
-
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
|
|
249
|
-
SlotNumber(slotNumber),
|
|
250
|
-
proposalId,
|
|
251
|
-
);
|
|
252
|
-
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
253
|
-
|
|
254
|
-
const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlotAndProposal(
|
|
255
|
-
SlotNumber(slotNumber),
|
|
256
|
-
proposalId2,
|
|
257
|
-
);
|
|
258
|
-
expect(retreivedAttestationsAfterDeleteForOtherProposal.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
|
|
259
|
-
compareAttestations(retreivedAttestationsAfterDeleteForOtherProposal, attestations2);
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
it('should delete attestations older than a given slot', async () => {
|
|
263
|
-
const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420];
|
|
264
|
-
const attestations = (
|
|
265
|
-
await Promise.all(slotNumbers.map(slotNumber => createAttestationsForSlot(slotNumber)))
|
|
266
|
-
).flat();
|
|
267
|
-
const proposalId = attestations[0].archive.toString();
|
|
154
|
+
for (const attestation of attestations) {
|
|
155
|
+
const slot = attestation.payload.header.slotNumber;
|
|
156
|
+
const proposalId = attestation.archive.toString();
|
|
268
157
|
|
|
269
|
-
|
|
158
|
+
const retreivedAttestations = await ap.getCheckpointAttestationsForSlotAndProposal(slot, proposalId);
|
|
159
|
+
expect(retreivedAttestations.length).toBe(1);
|
|
160
|
+
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
161
|
+
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
270
164
|
|
|
271
|
-
|
|
272
|
-
|
|
165
|
+
it('should delete attestations older than a given slot', async () => {
|
|
166
|
+
const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420];
|
|
167
|
+
const attestations = (
|
|
168
|
+
await Promise.all(slotNumbers.map(slotNumber => createCheckpointAttestationsForSlot(slotNumber)))
|
|
169
|
+
).flat();
|
|
170
|
+
const proposalId = attestations[0].archive.toString();
|
|
273
171
|
|
|
274
|
-
|
|
172
|
+
await ap.addOwnCheckpointAttestations(attestations);
|
|
275
173
|
|
|
276
|
-
|
|
174
|
+
const attestationsForSlot1 = await ap.getCheckpointAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
|
|
175
|
+
expect(attestationsForSlot1.length).toBe(signers.length);
|
|
277
176
|
|
|
278
|
-
|
|
279
|
-
expect(attestationsForSlot1AfterDelete.length).toBe(0);
|
|
177
|
+
await ap.deleteOlderThan(SlotNumber(73));
|
|
280
178
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
179
|
+
const attestationsForSlot1AfterDelete = await ap.getCheckpointAttestationsForSlotAndProposal(
|
|
180
|
+
SlotNumber(1),
|
|
181
|
+
proposalId,
|
|
182
|
+
);
|
|
183
|
+
expect(attestationsForSlot1AfterDelete.length).toBe(0);
|
|
184
|
+
});
|
|
287
185
|
});
|
|
288
186
|
|
|
289
187
|
describe('BlockProposal in attestation pool', () => {
|
|
290
188
|
it('should add and retrieve block proposal', async () => {
|
|
291
189
|
const slotNumber = 420;
|
|
292
190
|
const archive = Fr.random();
|
|
293
|
-
const proposal =
|
|
191
|
+
const proposal = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
294
192
|
const proposalId = proposal.archive.toString();
|
|
295
193
|
|
|
296
|
-
await ap.
|
|
194
|
+
const result = await ap.tryAddBlockProposal(proposal);
|
|
195
|
+
|
|
196
|
+
expect(result.added).toBe(true);
|
|
197
|
+
expect(result.alreadyExists).toBe(false);
|
|
198
|
+
expect(result.count).toBe(1);
|
|
297
199
|
|
|
298
200
|
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
299
201
|
|
|
300
202
|
expect(retrievedProposal).toBeDefined();
|
|
301
203
|
expect(retrievedProposal!).toEqual(proposal);
|
|
302
|
-
|
|
303
|
-
// Check hasBlockProposal with both id and object
|
|
304
|
-
expect(await ap.hasBlockProposal(proposalId)).toBe(true);
|
|
305
|
-
expect(await ap.hasBlockProposal(proposal)).toBe(true);
|
|
306
204
|
});
|
|
307
205
|
|
|
308
206
|
it('should return undefined for non-existent block proposal', async () => {
|
|
309
207
|
const nonExistentId = Fr.random().toString();
|
|
310
208
|
const retrievedProposal = await ap.getBlockProposal(nonExistentId);
|
|
311
209
|
expect(retrievedProposal).toBeUndefined();
|
|
312
|
-
|
|
313
|
-
// Check hasBlockProposal returns false for non-existent proposal
|
|
314
|
-
expect(await ap.hasBlockProposal(nonExistentId)).toBe(false);
|
|
315
210
|
});
|
|
316
211
|
|
|
317
|
-
it('should
|
|
212
|
+
it('should return alreadyExists when adding proposal with same id', async () => {
|
|
318
213
|
const slotNumber = 420;
|
|
319
214
|
const archive = Fr.random();
|
|
320
|
-
const proposal1 =
|
|
215
|
+
const proposal1 = await mockBlockProposalForPool(signers[0], slotNumber, archive);
|
|
321
216
|
const proposalId = proposal1.archive.toString();
|
|
322
217
|
|
|
323
|
-
await ap.
|
|
218
|
+
const result1 = await ap.tryAddBlockProposal(proposal1);
|
|
219
|
+
expect(result1.added).toBe(true);
|
|
220
|
+
expect(result1.alreadyExists).toBe(false);
|
|
324
221
|
|
|
325
222
|
// Create a new proposal with same archive but different signer
|
|
326
|
-
const proposal2 =
|
|
223
|
+
const proposal2 = await mockBlockProposalForPool(signers[1], slotNumber, archive);
|
|
327
224
|
|
|
328
|
-
await ap.
|
|
225
|
+
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
226
|
+
expect(result2.added).toBe(false);
|
|
227
|
+
expect(result2.alreadyExists).toBe(true);
|
|
329
228
|
|
|
229
|
+
// Should still have the first proposal
|
|
330
230
|
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
331
231
|
expect(retrievedProposal).toBeDefined();
|
|
332
|
-
|
|
333
|
-
expect(retrievedProposal!.
|
|
334
|
-
expect(retrievedProposal!.getSender()?.toString()).toBe(signers[1].address.toString());
|
|
232
|
+
expect(retrievedProposal!.toBuffer()).toEqual(proposal1.toBuffer());
|
|
233
|
+
expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
335
234
|
});
|
|
235
|
+
});
|
|
336
236
|
|
|
337
|
-
|
|
237
|
+
describe('CheckpointProposal in attestation pool', () => {
|
|
238
|
+
const mockCheckpointProposalForPool = async (
|
|
239
|
+
signer: Secp256k1Signer,
|
|
240
|
+
slotNumber: number,
|
|
241
|
+
archive: Fr = Fr.random(),
|
|
242
|
+
): Promise<CheckpointProposalCore> => {
|
|
243
|
+
const checkpointHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
244
|
+
const blockHeader = makeBlockHeader(1);
|
|
245
|
+
const proposal = await makeCheckpointProposal({
|
|
246
|
+
signer,
|
|
247
|
+
checkpointHeader,
|
|
248
|
+
archiveRoot: archive,
|
|
249
|
+
lastBlock: { blockHeader },
|
|
250
|
+
});
|
|
251
|
+
// Return the core version since tryAddCheckpointProposal now takes CheckpointProposalCore
|
|
252
|
+
return proposal.toCore();
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
it('should add and retrieve checkpoint proposal', async () => {
|
|
256
|
+
const slotNumber = 420;
|
|
338
257
|
const archive = Fr.random();
|
|
339
|
-
const
|
|
340
|
-
const
|
|
341
|
-
const proposalId = archive.toString();
|
|
258
|
+
const proposal = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
259
|
+
const proposalId = proposal.archive.toString();
|
|
342
260
|
|
|
343
|
-
await ap.
|
|
344
|
-
|
|
261
|
+
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
262
|
+
|
|
263
|
+
expect(result.added).toBe(true);
|
|
264
|
+
expect(result.alreadyExists).toBe(false);
|
|
265
|
+
expect(result.count).toBe(1);
|
|
266
|
+
|
|
267
|
+
const retrievedProposal = await ap.getCheckpointProposal(proposalId);
|
|
345
268
|
|
|
346
|
-
// Should get the latest one added
|
|
347
|
-
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
348
269
|
expect(retrievedProposal).toBeDefined();
|
|
349
|
-
expect(retrievedProposal!.toBuffer()).toEqual(
|
|
350
|
-
expect(retrievedProposal!.slotNumber).toBe(SlotNumber(200));
|
|
270
|
+
expect(retrievedProposal!.toBuffer()).toEqual(proposal.toBuffer());
|
|
351
271
|
});
|
|
352
272
|
|
|
353
|
-
it('should
|
|
273
|
+
it('should handle checkpoint proposal without lastBlock (caller extracts and adds block separately)', async () => {
|
|
354
274
|
const slotNumber = 420;
|
|
355
275
|
const archive = Fr.random();
|
|
356
|
-
const
|
|
276
|
+
const checkpointHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
277
|
+
// Create a checkpoint proposal WITHOUT lastBlock
|
|
278
|
+
const proposal = await makeCheckpointProposal({
|
|
279
|
+
signer: signers[0],
|
|
280
|
+
checkpointHeader,
|
|
281
|
+
archiveRoot: archive,
|
|
282
|
+
// No lastBlock
|
|
283
|
+
});
|
|
357
284
|
const proposalId = proposal.archive.toString();
|
|
358
285
|
|
|
359
|
-
// Add
|
|
360
|
-
await ap.
|
|
361
|
-
const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive));
|
|
362
|
-
await ap.addAttestations(attestations);
|
|
286
|
+
// Add the checkpoint core - block extraction is now caller responsibility
|
|
287
|
+
await ap.tryAddCheckpointProposal(proposal.toCore());
|
|
363
288
|
|
|
364
|
-
//
|
|
365
|
-
|
|
366
|
-
expect(
|
|
367
|
-
expect(await ap.hasBlockProposal(proposalId)).toBe(true);
|
|
289
|
+
// The checkpoint proposal should be stored
|
|
290
|
+
const retrievedCheckpointProposal = await ap.getCheckpointProposal(proposalId);
|
|
291
|
+
expect(retrievedCheckpointProposal).toBeDefined();
|
|
368
292
|
|
|
369
|
-
//
|
|
370
|
-
await ap.
|
|
293
|
+
// No block proposal was extracted (it had none anyway)
|
|
294
|
+
const retrievedBlockProposal = await ap.getBlockProposal(proposalId);
|
|
295
|
+
expect(retrievedBlockProposal).toBeUndefined();
|
|
296
|
+
});
|
|
371
297
|
|
|
372
|
-
|
|
373
|
-
|
|
298
|
+
it('should return undefined for non-existent checkpoint proposal', async () => {
|
|
299
|
+
const nonExistentId = Fr.random().toString();
|
|
300
|
+
const retrievedProposal = await ap.getCheckpointProposal(nonExistentId);
|
|
374
301
|
expect(retrievedProposal).toBeUndefined();
|
|
375
|
-
expect(await ap.hasBlockProposal(proposalId)).toBe(false);
|
|
376
302
|
});
|
|
377
303
|
|
|
378
|
-
it('should
|
|
304
|
+
it('should return alreadyExists when adding proposal with same id', async () => {
|
|
379
305
|
const slotNumber = 420;
|
|
380
306
|
const archive = Fr.random();
|
|
381
|
-
const
|
|
382
|
-
const proposalId =
|
|
307
|
+
const proposal1 = await mockCheckpointProposalForPool(signers[0], slotNumber, archive);
|
|
308
|
+
const proposalId = proposal1.archive.toString();
|
|
383
309
|
|
|
384
|
-
|
|
385
|
-
|
|
310
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
311
|
+
expect(result1.added).toBe(true);
|
|
312
|
+
expect(result1.alreadyExists).toBe(false);
|
|
386
313
|
|
|
387
|
-
//
|
|
388
|
-
|
|
389
|
-
expect(retrievedProposal).toBeDefined();
|
|
390
|
-
expect(await ap.hasBlockProposal(proposal)).toBe(true);
|
|
314
|
+
// Create a new proposal with same archive but different signer
|
|
315
|
+
const proposal2 = await mockCheckpointProposalForPool(signers[1], slotNumber, archive);
|
|
391
316
|
|
|
392
|
-
|
|
393
|
-
|
|
317
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
318
|
+
expect(result2.added).toBe(false);
|
|
319
|
+
expect(result2.alreadyExists).toBe(true);
|
|
394
320
|
|
|
395
|
-
//
|
|
396
|
-
retrievedProposal = await ap.
|
|
397
|
-
expect(retrievedProposal).
|
|
398
|
-
expect(
|
|
321
|
+
// Should still have the first proposal
|
|
322
|
+
const retrievedProposal = await ap.getCheckpointProposal(proposalId);
|
|
323
|
+
expect(retrievedProposal).toBeDefined();
|
|
324
|
+
expect(retrievedProposal!.toBuffer()).toEqual(proposal1.toBuffer());
|
|
325
|
+
expect(retrievedProposal!.getSender()?.toString()).toBe(signers[0].address.toString());
|
|
399
326
|
});
|
|
400
327
|
|
|
401
|
-
it('should
|
|
328
|
+
it('should return added=false when exceeding capacity', async () => {
|
|
402
329
|
const slotNumber = 420;
|
|
403
|
-
const archive = Fr.random();
|
|
404
|
-
const proposal = mockBlockProposal(signers[0], slotNumber, archive);
|
|
405
|
-
const proposalId = proposal.archive.toString();
|
|
406
|
-
|
|
407
|
-
// Add proposal first
|
|
408
|
-
await ap.addBlockProposal(proposal);
|
|
409
330
|
|
|
410
|
-
// Add
|
|
411
|
-
|
|
412
|
-
|
|
331
|
+
// Add MAX_CHECKPOINT_PROPOSALS_PER_SLOT proposals
|
|
332
|
+
for (let i = 0; i < MAX_CHECKPOINT_PROPOSALS_PER_SLOT; i++) {
|
|
333
|
+
const proposal = await mockCheckpointProposalForPool(signers[i % NUMBER_OF_SIGNERS_PER_TEST], slotNumber);
|
|
334
|
+
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
335
|
+
expect(result.added).toBe(true);
|
|
336
|
+
expect(result.count).toBe(i + 1);
|
|
337
|
+
}
|
|
413
338
|
|
|
414
|
-
//
|
|
415
|
-
const
|
|
416
|
-
const
|
|
339
|
+
// The next proposal should not be added
|
|
340
|
+
const extraProposal = await mockCheckpointProposalForPool(signers[0], slotNumber);
|
|
341
|
+
const result = await ap.tryAddCheckpointProposal(extraProposal);
|
|
342
|
+
expect(result.added).toBe(false);
|
|
343
|
+
expect(result.alreadyExists).toBe(false);
|
|
344
|
+
expect(result.count).toBe(MAX_CHECKPOINT_PROPOSALS_PER_SLOT);
|
|
345
|
+
});
|
|
346
|
+
});
|
|
417
347
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
348
|
+
describe('Duplicate proposal detection', () => {
|
|
349
|
+
const mockBlockProposalWithIndex = (
|
|
350
|
+
signer: Secp256k1Signer,
|
|
351
|
+
slotNumber: number,
|
|
352
|
+
indexWithinCheckpoint: number,
|
|
353
|
+
archive: Fr = Fr.random(),
|
|
354
|
+
): Promise<BlockProposal> => {
|
|
355
|
+
const header = makeBlockHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
356
|
+
return makeBlockProposal({
|
|
357
|
+
signer,
|
|
358
|
+
blockHeader: header,
|
|
359
|
+
archiveRoot: archive,
|
|
360
|
+
indexWithinCheckpoint: IndexWithinCheckpoint(indexWithinCheckpoint),
|
|
361
|
+
});
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
describe('tryAddBlockProposal duplicate detection', () => {
|
|
365
|
+
it('should return count=1 when pool is empty', async () => {
|
|
366
|
+
const proposal = await mockBlockProposalWithIndex(signers[0], 100, 0);
|
|
367
|
+
const result = await ap.tryAddBlockProposal(proposal);
|
|
368
|
+
|
|
369
|
+
expect(result.added).toBe(true);
|
|
370
|
+
expect(result.alreadyExists).toBe(false);
|
|
371
|
+
expect(result.count).toBe(1);
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
it('should return alreadyExists when same proposal exists', async () => {
|
|
375
|
+
const proposal = await mockBlockProposalWithIndex(signers[0], 100, 0);
|
|
376
|
+
await ap.tryAddBlockProposal(proposal);
|
|
377
|
+
|
|
378
|
+
const result = await ap.tryAddBlockProposal(proposal);
|
|
379
|
+
|
|
380
|
+
expect(result.added).toBe(false);
|
|
381
|
+
expect(result.alreadyExists).toBe(true);
|
|
382
|
+
expect(result.count).toBe(1);
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
it('should detect duplicate via count when different proposal exists at same position', async () => {
|
|
386
|
+
const slotNumber = 100;
|
|
387
|
+
const indexWithinCheckpoint = 2;
|
|
388
|
+
|
|
389
|
+
// Add first proposal
|
|
390
|
+
const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
|
|
391
|
+
const result1 = await ap.tryAddBlockProposal(proposal1);
|
|
392
|
+
expect(result1.count).toBe(1);
|
|
393
|
+
|
|
394
|
+
// Add a different proposal at same position - this is a duplicate (equivocation)
|
|
395
|
+
const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
|
|
396
|
+
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
397
|
+
|
|
398
|
+
expect(result2.added).toBe(true);
|
|
399
|
+
expect(result2.alreadyExists).toBe(false);
|
|
400
|
+
// count >= 2 indicates duplicate detection
|
|
401
|
+
expect(result2.count).toBe(2);
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
it('should not detect duplicate for different positions in same slot', async () => {
|
|
405
|
+
const slotNumber = 100;
|
|
406
|
+
|
|
407
|
+
// Add proposal at index 0
|
|
408
|
+
const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, 0);
|
|
409
|
+
await ap.tryAddBlockProposal(proposal1);
|
|
410
|
+
|
|
411
|
+
// Add proposal at index 1 (different position)
|
|
412
|
+
const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
|
|
413
|
+
const result = await ap.tryAddBlockProposal(proposal2);
|
|
414
|
+
|
|
415
|
+
expect(result.added).toBe(true);
|
|
416
|
+
// count = 1 means no duplicate for this position
|
|
417
|
+
expect(result.count).toBe(1);
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
it('should not detect duplicate for same position in different slots', async () => {
|
|
421
|
+
const indexWithinCheckpoint = 0;
|
|
422
|
+
|
|
423
|
+
// Add proposal at slot 100
|
|
424
|
+
const proposal1 = await mockBlockProposalWithIndex(signers[0], 100, indexWithinCheckpoint);
|
|
425
|
+
await ap.tryAddBlockProposal(proposal1);
|
|
426
|
+
|
|
427
|
+
// Add proposal at slot 200 (different slot)
|
|
428
|
+
const proposal2 = await mockBlockProposalWithIndex(signers[1], 200, indexWithinCheckpoint);
|
|
429
|
+
const result = await ap.tryAddBlockProposal(proposal2);
|
|
430
|
+
|
|
431
|
+
expect(result.added).toBe(true);
|
|
432
|
+
// count = 1 means no duplicate for this position
|
|
433
|
+
expect(result.count).toBe(1);
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
it('should track multiple duplicates correctly via count', async () => {
|
|
437
|
+
const slotNumber = 100;
|
|
438
|
+
const indexWithinCheckpoint = 0;
|
|
439
|
+
|
|
440
|
+
// Add multiple proposals for same position
|
|
441
|
+
const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
|
|
442
|
+
const result1 = await ap.tryAddBlockProposal(proposal1);
|
|
443
|
+
expect(result1.count).toBe(1);
|
|
444
|
+
|
|
445
|
+
const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
|
|
446
|
+
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
447
|
+
expect(result2.count).toBe(2);
|
|
448
|
+
|
|
449
|
+
// Add a third proposal for same position
|
|
450
|
+
const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
|
|
451
|
+
const result3 = await ap.tryAddBlockProposal(proposal3);
|
|
452
|
+
|
|
453
|
+
expect(result3.added).toBe(true);
|
|
454
|
+
expect(result3.count).toBe(3);
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
it('should return added=false when exceeding capacity', async () => {
|
|
458
|
+
const slotNumber = 100;
|
|
459
|
+
const indexWithinCheckpoint = 0;
|
|
460
|
+
|
|
461
|
+
// Add MAX_BLOCK_PROPOSALS_PER_POSITION proposals
|
|
462
|
+
for (let i = 0; i < MAX_BLOCK_PROPOSALS_PER_POSITION; i++) {
|
|
463
|
+
const proposal = await mockBlockProposalWithIndex(
|
|
464
|
+
signers[i % NUMBER_OF_SIGNERS_PER_TEST],
|
|
465
|
+
slotNumber,
|
|
466
|
+
indexWithinCheckpoint,
|
|
467
|
+
);
|
|
468
|
+
const result = await ap.tryAddBlockProposal(proposal);
|
|
469
|
+
expect(result.added).toBe(true);
|
|
470
|
+
expect(result.count).toBe(i + 1);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// The next proposal should not be added
|
|
474
|
+
const extraProposal = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
|
|
475
|
+
const result = await ap.tryAddBlockProposal(extraProposal);
|
|
476
|
+
expect(result.added).toBe(false);
|
|
477
|
+
expect(result.alreadyExists).toBe(false);
|
|
478
|
+
expect(result.count).toBe(MAX_BLOCK_PROPOSALS_PER_POSITION);
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
it('should clean up block position index when deleting old data', async () => {
|
|
482
|
+
const slotNumber = 100;
|
|
483
|
+
const indexWithinCheckpoint = 0;
|
|
484
|
+
|
|
485
|
+
// Add proposal
|
|
486
|
+
const proposal1 = await mockBlockProposalWithIndex(signers[0], slotNumber, indexWithinCheckpoint);
|
|
487
|
+
await ap.tryAddBlockProposal(proposal1);
|
|
488
|
+
|
|
489
|
+
// Verify it's tracked (adding another should show count = 2)
|
|
490
|
+
const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
|
|
491
|
+
let result = await ap.tryAddBlockProposal(proposal2);
|
|
492
|
+
expect(result.count).toBe(2);
|
|
493
|
+
|
|
494
|
+
// Delete old data
|
|
495
|
+
await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
|
|
496
|
+
|
|
497
|
+
// Verify position index is cleaned up (count should be 1 now)
|
|
498
|
+
const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
|
|
499
|
+
result = await ap.tryAddBlockProposal(proposal3);
|
|
500
|
+
expect(result.count).toBe(1);
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
it('should correctly delete block proposals at slot boundary', async () => {
|
|
504
|
+
// Add proposals at slots 99, 100, and 101 with various indices
|
|
505
|
+
const proposalSlot99Idx0 = await mockBlockProposalWithIndex(signers[0], 99, 0);
|
|
506
|
+
const proposalSlot99Idx1 = await mockBlockProposalWithIndex(signers[1], 99, 1);
|
|
507
|
+
const proposalSlot100Idx0 = await mockBlockProposalWithIndex(signers[2], 100, 0);
|
|
508
|
+
const proposalSlot101Idx0 = await mockBlockProposalWithIndex(signers[3], 101, 0);
|
|
509
|
+
|
|
510
|
+
await ap.tryAddBlockProposal(proposalSlot99Idx0);
|
|
511
|
+
await ap.tryAddBlockProposal(proposalSlot99Idx1);
|
|
512
|
+
await ap.tryAddBlockProposal(proposalSlot100Idx0);
|
|
513
|
+
await ap.tryAddBlockProposal(proposalSlot101Idx0);
|
|
514
|
+
|
|
515
|
+
// Delete slots older than 100 (should delete slot 99 only)
|
|
516
|
+
await ap.deleteOlderThan(SlotNumber(100));
|
|
517
|
+
|
|
518
|
+
// Slot 99 proposals should have their index cleaned up
|
|
519
|
+
const newProposal99 = await mockBlockProposalWithIndex(signers[0], 99, 0);
|
|
520
|
+
const result99 = await ap.tryAddBlockProposal(newProposal99);
|
|
521
|
+
expect(result99.count).toBe(1); // Index was cleaned up
|
|
522
|
+
|
|
523
|
+
// Slot 100 and 101 should still be tracked
|
|
524
|
+
const newProposal100 = await mockBlockProposalWithIndex(signers[1], 100, 0);
|
|
525
|
+
const result100 = await ap.tryAddBlockProposal(newProposal100);
|
|
526
|
+
expect(result100.count).toBe(2); // Still has the original
|
|
527
|
+
|
|
528
|
+
const newProposal101 = await mockBlockProposalWithIndex(signers[2], 101, 0);
|
|
529
|
+
const result101 = await ap.tryAddBlockProposal(newProposal101);
|
|
530
|
+
expect(result101.count).toBe(2); // Still has the original
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
it('should delete all indices for a given slot', async () => {
|
|
534
|
+
const slotNumber = 50;
|
|
535
|
+
|
|
536
|
+
// Add proposals at multiple indices for the same slot
|
|
537
|
+
const proposal0 = await mockBlockProposalWithIndex(signers[0], slotNumber, 0);
|
|
538
|
+
const proposal1 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
|
|
539
|
+
const proposal2 = await mockBlockProposalWithIndex(signers[2], slotNumber, 2);
|
|
540
|
+
|
|
541
|
+
await ap.tryAddBlockProposal(proposal0);
|
|
542
|
+
await ap.tryAddBlockProposal(proposal1);
|
|
543
|
+
await ap.tryAddBlockProposal(proposal2);
|
|
544
|
+
|
|
545
|
+
// Delete slots older than slotNumber + 1
|
|
546
|
+
await ap.deleteOlderThan(SlotNumber(slotNumber + 1));
|
|
547
|
+
|
|
548
|
+
// All indices should be cleaned up
|
|
549
|
+
const newProposal0 = await mockBlockProposalWithIndex(signers[0], slotNumber, 0);
|
|
550
|
+
const result0 = await ap.tryAddBlockProposal(newProposal0);
|
|
551
|
+
expect(result0.count).toBe(1);
|
|
552
|
+
|
|
553
|
+
const newProposal1 = await mockBlockProposalWithIndex(signers[1], slotNumber, 1);
|
|
554
|
+
const result1 = await ap.tryAddBlockProposal(newProposal1);
|
|
555
|
+
expect(result1.count).toBe(1);
|
|
556
|
+
|
|
557
|
+
const newProposal2 = await mockBlockProposalWithIndex(signers[2], slotNumber, 2);
|
|
558
|
+
const result2 = await ap.tryAddBlockProposal(newProposal2);
|
|
559
|
+
expect(result2.count).toBe(1);
|
|
560
|
+
});
|
|
561
|
+
|
|
562
|
+
it('should delete block proposals from storage when deleting old data', async () => {
|
|
563
|
+
const oldSlot = 50;
|
|
564
|
+
const newSlot = 100;
|
|
565
|
+
|
|
566
|
+
// Add proposals at old and new slots
|
|
567
|
+
const oldProposal = await mockBlockProposalWithIndex(signers[0], oldSlot, 0);
|
|
568
|
+
const newProposal = await mockBlockProposalWithIndex(signers[1], newSlot, 0);
|
|
569
|
+
|
|
570
|
+
await ap.tryAddBlockProposal(oldProposal);
|
|
571
|
+
await ap.tryAddBlockProposal(newProposal);
|
|
572
|
+
|
|
573
|
+
// Verify both proposals exist
|
|
574
|
+
expect(await ap.getBlockProposal(oldProposal.archive.toString())).toBeDefined();
|
|
575
|
+
expect(await ap.getBlockProposal(newProposal.archive.toString())).toBeDefined();
|
|
576
|
+
|
|
577
|
+
// Delete slots older than newSlot (should delete oldSlot)
|
|
578
|
+
await ap.deleteOlderThan(SlotNumber(newSlot));
|
|
579
|
+
|
|
580
|
+
// Old proposal should be deleted from storage
|
|
581
|
+
expect(await ap.getBlockProposal(oldProposal.archive.toString())).toBeUndefined();
|
|
582
|
+
|
|
583
|
+
// New proposal should still exist
|
|
584
|
+
expect(await ap.getBlockProposal(newProposal.archive.toString())).toBeDefined();
|
|
585
|
+
});
|
|
586
|
+
});
|
|
421
587
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
588
|
+
describe('tryAddCheckpointProposal duplicate detection', () => {
|
|
589
|
+
const mockCheckpointProposalCoreForPool = async (
|
|
590
|
+
signer: Secp256k1Signer,
|
|
591
|
+
slotNumber: number,
|
|
592
|
+
archive: Fr = Fr.random(),
|
|
593
|
+
): Promise<CheckpointProposalCore> => {
|
|
594
|
+
const checkpointHeader = makeCheckpointHeader(1, { slotNumber: SlotNumber(slotNumber) });
|
|
595
|
+
const blockHeader = makeBlockHeader(1);
|
|
596
|
+
const proposal = await makeCheckpointProposal({
|
|
597
|
+
signer,
|
|
598
|
+
checkpointHeader,
|
|
599
|
+
archiveRoot: archive,
|
|
600
|
+
lastBlock: { blockHeader },
|
|
601
|
+
});
|
|
602
|
+
return proposal.toCore();
|
|
603
|
+
};
|
|
604
|
+
|
|
605
|
+
it('should return count=1 when pool is empty', async () => {
|
|
606
|
+
const proposal = await mockCheckpointProposalCoreForPool(signers[0], 100);
|
|
607
|
+
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
608
|
+
|
|
609
|
+
expect(result.added).toBe(true);
|
|
610
|
+
expect(result.alreadyExists).toBe(false);
|
|
611
|
+
expect(result.count).toBe(1);
|
|
612
|
+
});
|
|
613
|
+
|
|
614
|
+
it('should return alreadyExists when same proposal exists', async () => {
|
|
615
|
+
const proposal = await mockCheckpointProposalCoreForPool(signers[0], 100);
|
|
616
|
+
await ap.tryAddCheckpointProposal(proposal);
|
|
617
|
+
|
|
618
|
+
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
619
|
+
|
|
620
|
+
expect(result.added).toBe(false);
|
|
621
|
+
expect(result.alreadyExists).toBe(true);
|
|
622
|
+
expect(result.count).toBe(1);
|
|
623
|
+
});
|
|
624
|
+
|
|
625
|
+
it('should detect duplicate via count when different proposal exists for same slot', async () => {
|
|
626
|
+
const slotNumber = 100;
|
|
627
|
+
|
|
628
|
+
// Add first proposal
|
|
629
|
+
const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], slotNumber);
|
|
630
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
631
|
+
expect(result1.count).toBe(1);
|
|
632
|
+
|
|
633
|
+
// Add a different proposal for same slot - this is a duplicate (equivocation)
|
|
634
|
+
const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
|
|
635
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
636
|
+
|
|
637
|
+
expect(result2.added).toBe(true);
|
|
638
|
+
expect(result2.alreadyExists).toBe(false);
|
|
639
|
+
// count >= 2 indicates duplicate detection
|
|
640
|
+
expect(result2.count).toBe(2);
|
|
641
|
+
});
|
|
642
|
+
|
|
643
|
+
it('should not detect duplicate for different slots', async () => {
|
|
644
|
+
// Add proposal at slot 100
|
|
645
|
+
const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], 100);
|
|
646
|
+
await ap.tryAddCheckpointProposal(proposal1);
|
|
647
|
+
|
|
648
|
+
// Add proposal at slot 200 (different slot)
|
|
649
|
+
const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], 200);
|
|
650
|
+
const result = await ap.tryAddCheckpointProposal(proposal2);
|
|
651
|
+
|
|
652
|
+
expect(result.added).toBe(true);
|
|
653
|
+
// count = 1 means no duplicate for this slot
|
|
654
|
+
expect(result.count).toBe(1);
|
|
655
|
+
});
|
|
656
|
+
|
|
657
|
+
it('should track multiple duplicates correctly via count', async () => {
|
|
658
|
+
const slotNumber = 100;
|
|
659
|
+
|
|
660
|
+
// Add multiple proposals for same slot
|
|
661
|
+
const proposal1 = await mockCheckpointProposalCoreForPool(signers[0], slotNumber);
|
|
662
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
663
|
+
expect(result1.count).toBe(1);
|
|
664
|
+
|
|
665
|
+
const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
|
|
666
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
667
|
+
expect(result2.count).toBe(2);
|
|
668
|
+
|
|
669
|
+
// Add a third proposal for same slot
|
|
670
|
+
const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
|
|
671
|
+
const result3 = await ap.tryAddCheckpointProposal(proposal3);
|
|
672
|
+
|
|
673
|
+
expect(result3.added).toBe(true);
|
|
674
|
+
expect(result3.count).toBe(3);
|
|
675
|
+
});
|
|
676
|
+
|
|
677
|
+
it('should not count attestations as proposals for duplicate detection', async () => {
|
|
678
|
+
const slotNumber = 100;
|
|
679
|
+
const archive = Fr.random();
|
|
680
|
+
|
|
681
|
+
// Attestation arrives BEFORE the checkpoint proposal (race condition in p2p)
|
|
682
|
+
const attestation = mockCheckpointAttestation(signers[0], slotNumber, archive);
|
|
683
|
+
await ap.addOwnCheckpointAttestations([attestation]);
|
|
684
|
+
|
|
685
|
+
// Now the checkpoint proposal arrives - this should NOT be detected as a duplicate
|
|
686
|
+
const proposal = await mockCheckpointProposalCoreForPool(signers[1], slotNumber, archive);
|
|
687
|
+
const result = await ap.tryAddCheckpointProposal(proposal);
|
|
688
|
+
|
|
689
|
+
expect(result.added).toBe(true);
|
|
690
|
+
expect(result.alreadyExists).toBe(false);
|
|
691
|
+
// count should be 1, NOT 2 - attestations should not count as proposals
|
|
692
|
+
expect(result.count).toBe(1);
|
|
693
|
+
});
|
|
694
|
+
|
|
695
|
+
it('should not count attestations for different proposals as duplicates', async () => {
|
|
696
|
+
const slotNumber = 100;
|
|
697
|
+
const archive1 = Fr.random();
|
|
698
|
+
const archive2 = Fr.random();
|
|
699
|
+
|
|
700
|
+
// Add attestations for two different proposals in the same slot
|
|
701
|
+
const attestation1 = mockCheckpointAttestation(signers[0], slotNumber, archive1);
|
|
702
|
+
const attestation2 = mockCheckpointAttestation(signers[1], slotNumber, archive2);
|
|
703
|
+
await ap.addOwnCheckpointAttestations([attestation1, attestation2]);
|
|
704
|
+
|
|
705
|
+
// Add the first checkpoint proposal - should not be affected by attestations
|
|
706
|
+
const proposal1 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber, archive1);
|
|
707
|
+
const result1 = await ap.tryAddCheckpointProposal(proposal1);
|
|
708
|
+
|
|
709
|
+
expect(result1.added).toBe(true);
|
|
710
|
+
expect(result1.count).toBe(1);
|
|
711
|
+
|
|
712
|
+
// Add the second checkpoint proposal - this IS a duplicate (different archive, same slot)
|
|
713
|
+
const proposal2 = await mockCheckpointProposalCoreForPool(signers[3], slotNumber, archive2);
|
|
714
|
+
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
715
|
+
|
|
716
|
+
expect(result2.added).toBe(true);
|
|
717
|
+
expect(result2.count).toBe(2);
|
|
718
|
+
});
|
|
427
719
|
});
|
|
428
720
|
});
|
|
429
721
|
}
|