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