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