@aztec/p2p 0.0.1-commit.96bb3f7 → 0.0.1-commit.993d240
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 +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +13 -5
- package/dest/client/factory.d.ts +13 -12
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +65 -20
- package/dest/client/interface.d.ts +58 -36
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +52 -58
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +236 -236
- package/dest/config.d.ts +163 -84
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +156 -43
- 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 +162 -106
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +511 -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 +525 -132
- 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 +13 -8
- package/dest/mem_pools/index.d.ts +3 -3
- 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 +4 -2
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +35 -17
- package/dest/mem_pools/interface.d.ts +5 -5
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +104 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +251 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +128 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +94 -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 +97 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +11 -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 +12 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +62 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +180 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +25 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/{tx_pool → tx_pool_v2}/eviction/invalid_txs_after_mining_rule.js +16 -35
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +93 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +78 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +75 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +6 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +5 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/instrumentation.js +43 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +218 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +10 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +137 -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 +223 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +108 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +337 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +62 -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 +167 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +78 -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 +914 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +10 -4
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +69 -13
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +9 -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 +22 -11
- package/dest/msg_validators/clock_tolerance.d.ts +32 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +95 -0
- 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 +123 -53
- 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.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +20 -6
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
- package/dest/msg_validators/tx_validator/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 +4 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +40 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +15 -4
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +7 -6
- package/dest/msg_validators/tx_validator/factory.d.ts +138 -5
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +259 -58
- 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 +24 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +100 -3
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +146 -67
- package/dest/msg_validators/tx_validator/index.d.ts +6 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +5 -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 +6 -6
- 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 +24 -3
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +75 -27
- 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 +22 -5
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +8 -8
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +4 -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 +4 -2
- 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 +69 -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 +14 -10
- 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 +36 -9
- package/dest/services/dummy_service.d.ts +33 -17
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +56 -15
- package/dest/services/encoding.d.ts +7 -3
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +20 -14
- 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/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 +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +33 -8
- package/dest/services/libp2p/libp2p_service.d.ts +107 -59
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +683 -539
- package/dest/services/peer-manager/metrics.d.ts +4 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +26 -5
- 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 +65 -14
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +51 -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 +552 -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 +35 -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 +136 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +62 -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 +176 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +11 -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 +7 -0
- package/dest/services/reqresp/config.d.ts +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- 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 +27 -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 +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +16 -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 +7 -5
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +29 -9
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +29 -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 +59 -13
- 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/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/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 +12 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +58 -187
- package/dest/services/service.d.ts +49 -13
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +11 -11
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +27 -26
- 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 -2
- 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 +8 -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 +50 -56
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +298 -70
- 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 +16 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +22 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +46 -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 +142 -0
- package/dest/services/tx_provider.d.ts +8 -6
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +12 -8
- 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/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 +42 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +44 -0
- package/dest/test-helpers/testbench-utils.d.ts +161 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +393 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +26 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +270 -144
- package/dest/testbench/worker_client_manager.d.ts +57 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +277 -49
- 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 +17 -16
- package/src/bootstrap/bootstrap.ts +16 -5
- package/src/client/factory.ts +135 -39
- package/src/client/interface.ts +70 -44
- package/src/client/p2p_client.ts +283 -302
- package/src/client/test/p2p_client.batch_tx_requester.bench.README.md +197 -0
- package/src/config.ts +274 -48
- 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 +575 -94
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +633 -149
- package/src/mem_pools/attestation_pool/index.ts +9 -2
- package/src/mem_pools/attestation_pool/mocks.ts +19 -11
- package/src/mem_pools/index.ts +2 -2
- package/src/mem_pools/instrumentation.ts +24 -15
- package/src/mem_pools/interface.ts +4 -4
- package/src/mem_pools/tx_pool_v2/README.md +283 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +321 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +160 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +122 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +125 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +28 -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 +219 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +91 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +99 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +32 -0
- package/src/mem_pools/tx_pool_v2/index.ts +12 -0
- package/src/mem_pools/tx_pool_v2/instrumentation.ts +69 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +250 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +349 -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 +430 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +238 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1090 -0
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +60 -16
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +29 -16
- package/src/msg_validators/clock_tolerance.ts +127 -0
- 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 +129 -62
- 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 +2 -2
- package/src/msg_validators/tx_validator/block_header_validator.ts +21 -8
- 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 +50 -3
- package/src/msg_validators/tx_validator/double_spend_validator.ts +15 -9
- package/src/msg_validators/tx_validator/factory.ts +424 -56
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +44 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +211 -77
- package/src/msg_validators/tx_validator/index.ts +5 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +18 -7
- package/src/msg_validators/tx_validator/nullifier_cache.ts +30 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +87 -30
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +29 -21
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +10 -3
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +102 -0
- package/src/services/data_store.ts +14 -19
- package/src/services/discv5/discV5_service.ts +39 -6
- package/src/services/dummy_service.ts +71 -39
- package/src/services/encoding.ts +20 -13
- 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/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +34 -7
- package/src/services/libp2p/libp2p_service.ts +753 -597
- package/src/services/peer-manager/metrics.ts +28 -4
- package/src/services/peer-manager/peer_manager.ts +46 -11
- package/src/services/peer-manager/peer_scoring.ts +56 -6
- package/src/services/reqresp/README.md +215 -0
- package/src/services/reqresp/batch-tx-requester/README.md +344 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +684 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +61 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +168 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +249 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +24 -0
- package/src/services/reqresp/config.ts +2 -2
- 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 +48 -46
- package/src/services/reqresp/metrics.ts +33 -9
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +16 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +37 -12
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +74 -9
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/status.ts +5 -3
- 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 +68 -224
- package/src/services/service.ts +66 -29
- package/src/services/tx_collection/config.ts +41 -36
- 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 -1
- package/src/services/tx_collection/instrumentation.ts +11 -2
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/tx_collection.ts +367 -115
- 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 +37 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +163 -0
- package/src/services/tx_provider.ts +17 -11
- package/src/services/tx_provider_instrumentation.ts +11 -5
- package/src/test-helpers/index.ts +2 -0
- 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 +69 -0
- package/src/test-helpers/testbench-utils.ts +455 -0
- package/src/testbench/p2p_client_testbench_worker.ts +370 -138
- package/src/testbench/worker_client_manager.ts +355 -51
- package/src/util.ts +40 -19
- package/src/versioning.ts +3 -33
- 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/aztec_kv_tx_pool.d.ts +0 -120
- 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 -555
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -18
- 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 -56
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -83
- 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 -5
- 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/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_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 -76
- 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/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 -183
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -45
- 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 -92
- 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 -51
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -300
- 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/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/README.md +0 -255
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -691
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -71
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +0 -108
- 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 -91
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- 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 -206
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -100
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/fast_tx_collection.ts +0 -341
- package/src/services/tx_collection/slow_tx_collection.ts +0 -233
|
@@ -1,157 +1,638 @@
|
|
|
1
|
-
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
-
import
|
|
1
|
+
import type { BlockProposalHash, CheckpointProposalHash, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { toArray } from '@aztec/foundation/iterable';
|
|
3
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import type { AztecAsyncKVStore, AztecAsyncMap, AztecAsyncMultiMap } from '@aztec/kv-store';
|
|
5
|
+
import {
|
|
3
6
|
BlockProposal,
|
|
4
7
|
CheckpointAttestation,
|
|
5
8
|
CheckpointProposal,
|
|
6
|
-
CheckpointProposalCore,
|
|
9
|
+
type CheckpointProposalCore,
|
|
7
10
|
} from '@aztec/stdlib/p2p';
|
|
11
|
+
import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
|
|
12
|
+
|
|
13
|
+
import { PoolInstrumentation, PoolName, type PoolStatsCallback } from '../instrumentation.js';
|
|
14
|
+
|
|
15
|
+
/** Result of trying to add an item (proposal or attestation) to the pool */
|
|
16
|
+
export type TryAddResult = {
|
|
17
|
+
/** Whether the item was accepted into pool state. False when it already existed, was invalid, or hit a cap. */
|
|
18
|
+
added: boolean;
|
|
19
|
+
/** Whether the exact signed payload (matched by payload hash) already existed in the pool. */
|
|
20
|
+
alreadyExists: boolean;
|
|
21
|
+
/** Number of distinct signed-payload hashes seen for the position. Meaning varies by method:
|
|
22
|
+
* - tryAddBlockProposal: distinct payload hashes at (slot, indexWithinCheckpoint)
|
|
23
|
+
* - tryAddCheckpointProposal: distinct payload hashes at slot
|
|
24
|
+
* - tryAddCheckpointAttestation: distinct payload hashes by this signer for this slot */
|
|
25
|
+
count: number;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type ProposalsForSlot = {
|
|
29
|
+
blockProposals: BlockProposal[];
|
|
30
|
+
checkpointProposals: CheckpointProposalCore[];
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 2;
|
|
34
|
+
export const MAX_BLOCK_PROPOSALS_PER_POSITION = 2;
|
|
35
|
+
/** Maximum attestations a single signer can make per slot before being rejected. */
|
|
36
|
+
export const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 2;
|
|
37
|
+
|
|
38
|
+
/** Public API interface for attestation pools. Used for typing mocks and test implementations. */
|
|
39
|
+
export type AttestationPoolApi = Pick<
|
|
40
|
+
AttestationPool,
|
|
41
|
+
| 'tryAddBlockProposal'
|
|
42
|
+
| 'getBlockProposalByArchive'
|
|
43
|
+
| 'getProposalsForSlot'
|
|
44
|
+
| 'tryAddCheckpointProposal'
|
|
45
|
+
| 'getCheckpointProposal'
|
|
46
|
+
| 'addOwnCheckpointAttestations'
|
|
47
|
+
| 'tryAddCheckpointAttestation'
|
|
48
|
+
| 'deleteOlderThan'
|
|
49
|
+
| 'getCheckpointAttestationsForSlot'
|
|
50
|
+
| 'getCheckpointAttestationsForSlotAndProposal'
|
|
51
|
+
| 'hasBlockProposalsForSlot'
|
|
52
|
+
| 'isEmpty'
|
|
53
|
+
>;
|
|
8
54
|
|
|
9
55
|
/**
|
|
10
|
-
*
|
|
56
|
+
* Pool for storing attestations and proposals collected by a validator.
|
|
11
57
|
*
|
|
12
|
-
* Attestations
|
|
58
|
+
* Attestations and proposals observed via the p2p network are stored for requests
|
|
13
59
|
* from the validator to produce a block, or to serve to other peers.
|
|
60
|
+
*
|
|
61
|
+
* Equivocation detection: distinct *signed payload hashes* arriving at the same
|
|
62
|
+
* position are tracked in the matching index multimap so the equivocation count
|
|
63
|
+
* reaches 2 even when archive collides on `feeAssetPriceModifier` variants.
|
|
64
|
+
* Proposal bytes are retained per accepted payload hash, up to the same equivocation
|
|
65
|
+
* caps, for slashing watchers that need signed P2P proposals.
|
|
14
66
|
*/
|
|
15
|
-
export
|
|
67
|
+
export class AttestationPool {
|
|
68
|
+
private metrics: PoolInstrumentation<CheckpointAttestation>;
|
|
69
|
+
|
|
70
|
+
// Checkpoint attestations from `${paddedSlot}-${signer}` to serialized CheckpointAttestation.
|
|
71
|
+
// Stores the first attestation seen per (slot, signer); subsequent distinct payload
|
|
72
|
+
// hashes from the same signer are tracked only in `attestationHashesPerSlotAndSigner`
|
|
73
|
+
// for equivocation detection.
|
|
74
|
+
private attestationPerSlotAndSigner: AztecAsyncMap<string, Buffer>;
|
|
75
|
+
|
|
76
|
+
// Distinct payload hashes seen per (slot, signer) for tracking attestation equivocations.
|
|
77
|
+
// Key: `${paddedSlot}-${signerAddress}`, Value: CheckpointProposalHash (`0x`-prefixed hex)
|
|
78
|
+
private attestationHashesPerSlotAndSigner: AztecAsyncMultiMap<string, CheckpointProposalHash>;
|
|
79
|
+
|
|
80
|
+
// Checkpoint proposals from `${paddedSlot}-${payloadHash}` to serialized CheckpointProposalCore.
|
|
81
|
+
// Stores every accepted distinct payload up to MAX_CHECKPOINT_PROPOSALS_PER_SLOT.
|
|
82
|
+
private checkpointProposalsPerSlotAndHash: AztecAsyncMap<string, Buffer>;
|
|
83
|
+
|
|
84
|
+
// Distinct payload hashes seen per slot. Hash collision = duplicate.
|
|
85
|
+
// Hash count reaching 2 = equivocation.
|
|
86
|
+
// Key: slot number, Value: CheckpointProposalHash (`0x`-prefixed hex)
|
|
87
|
+
private checkpointProposalHashesPerSlot: AztecAsyncMultiMap<number, CheckpointProposalHash>;
|
|
88
|
+
|
|
89
|
+
// Block proposals from `${paddedSlot}-${paddedIndex}-${payloadHash}` to serialized BlockProposal.
|
|
90
|
+
// Stores every accepted distinct payload up to MAX_BLOCK_PROPOSALS_PER_POSITION.
|
|
91
|
+
private blockProposalsPerSlotIndexAndHash: AztecAsyncMap<string, Buffer>;
|
|
92
|
+
|
|
93
|
+
// Distinct payload hashes seen per (slot, indexWithinCheckpoint).
|
|
94
|
+
// Key: slot * (1 << INDEX_BITS) + indexWithinCheckpoint, Value: BlockProposalHash (`0x`-prefixed hex)
|
|
95
|
+
private blockProposalHashesPerSlotAndIndex: AztecAsyncMultiMap<number, BlockProposalHash>;
|
|
96
|
+
|
|
97
|
+
// Secondary index from archive root to all retained block proposal keys.
|
|
98
|
+
private blockProposalKeysPerArchive: AztecAsyncMultiMap<string, string>;
|
|
99
|
+
|
|
100
|
+
constructor(
|
|
101
|
+
private store: AztecAsyncKVStore,
|
|
102
|
+
telemetry: TelemetryClient = getTelemetryClient(),
|
|
103
|
+
private log = createLogger('aztec:attestation_pool'),
|
|
104
|
+
) {
|
|
105
|
+
// Initialize block proposal storage
|
|
106
|
+
this.blockProposalsPerSlotIndexAndHash = store.openMap('block_proposals_by_slot_index_and_hash');
|
|
107
|
+
this.blockProposalHashesPerSlotAndIndex = store.openMultiMap('block_proposals_for_slot_and_index');
|
|
108
|
+
this.blockProposalKeysPerArchive = store.openMultiMap('block_proposals_by_archive');
|
|
109
|
+
|
|
110
|
+
// Initialize checkpoint attestations storage
|
|
111
|
+
this.attestationPerSlotAndSigner = store.openMap('checkpoint_attestations');
|
|
112
|
+
this.attestationHashesPerSlotAndSigner = store.openMultiMap('checkpoint_attestations_per_slot_and_signer');
|
|
113
|
+
|
|
114
|
+
// Initialize checkpoint proposal storage
|
|
115
|
+
this.checkpointProposalsPerSlotAndHash = store.openMap('checkpoint_proposals_by_slot_and_hash');
|
|
116
|
+
this.checkpointProposalHashesPerSlot = store.openMultiMap('checkpoint_proposals_for_slot');
|
|
117
|
+
|
|
118
|
+
this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL, this.poolStats);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private poolStats: PoolStatsCallback = async () => {
|
|
122
|
+
return {
|
|
123
|
+
itemCount: await this.attestationPerSlotAndSigner.sizeAsync(),
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/** Returns whether the pool is empty. */
|
|
128
|
+
public async isEmpty(): Promise<boolean> {
|
|
129
|
+
const [attestationCount, blockProposalCount, checkpointProposalCount] = await Promise.all([
|
|
130
|
+
this.attestationPerSlotAndSigner.sizeAsync(),
|
|
131
|
+
this.blockProposalsPerSlotIndexAndHash.sizeAsync(),
|
|
132
|
+
this.checkpointProposalsPerSlotAndHash.sizeAsync(),
|
|
133
|
+
]);
|
|
134
|
+
|
|
135
|
+
return attestationCount === 0 && blockProposalCount === 0 && checkpointProposalCount === 0;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Number of bits reserved for indexWithinCheckpoint in position keys. */
|
|
139
|
+
private static readonly INDEX_BITS = 10;
|
|
140
|
+
/** Maximum indexWithinCheckpoint value (2^10 - 1 = 1023). */
|
|
141
|
+
private static readonly MAX_INDEX = (1 << AttestationPool.INDEX_BITS) - 1;
|
|
142
|
+
/** Decimal digits used to left-pad slot numbers in string keys.
|
|
143
|
+
* 10 digits ≈ 3500 years at 36 s/slot, leaving ample headroom. */
|
|
144
|
+
private static readonly SLOT_PAD_DIGITS = 10;
|
|
145
|
+
|
|
146
|
+
/** Fixed-width decimal slot string for use in composite string keys. */
|
|
147
|
+
private slotPaddedKey(slot: SlotNumber | number): string {
|
|
148
|
+
return slot.toString().padStart(AttestationPool.SLOT_PAD_DIGITS, '0');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Fixed-width decimal index string for use in composite string keys. */
|
|
152
|
+
private indexPaddedKey(indexWithinCheckpoint: number): string {
|
|
153
|
+
return indexWithinCheckpoint.toString().padStart(4, '0');
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Key for retained block proposals. */
|
|
157
|
+
private getBlockProposalKey(
|
|
158
|
+
slot: SlotNumber | number,
|
|
159
|
+
indexWithinCheckpoint: number,
|
|
160
|
+
payloadHash: BlockProposalHash,
|
|
161
|
+
): string {
|
|
162
|
+
return `${this.slotPaddedKey(slot)}-${this.indexPaddedKey(indexWithinCheckpoint)}-${payloadHash}`;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Range bounds for all retained block proposals in a slot. */
|
|
166
|
+
private getBlockProposalKeyRangeForSlot(slot: SlotNumber): { start: string; end: string } {
|
|
167
|
+
return { start: `${this.slotPaddedKey(slot)}-`, end: `${this.slotPaddedKey(slot + 1)}-` };
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** Key for retained checkpoint proposals. */
|
|
171
|
+
private getCheckpointProposalKey(slot: SlotNumber | number, payloadHash: CheckpointProposalHash): string {
|
|
172
|
+
return `${this.slotPaddedKey(slot)}-${payloadHash}`;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** Range bounds for all retained checkpoint proposals in a slot. */
|
|
176
|
+
private getCheckpointProposalKeyRangeForSlot(slot: SlotNumber): { start: string; end: string } {
|
|
177
|
+
return { start: `${this.slotPaddedKey(slot)}-`, end: `${this.slotPaddedKey(slot + 1)}-` };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** Key for the per-(slot, signer) attestation main store and equivocation index. */
|
|
181
|
+
private getSlotSignerKey(slot: SlotNumber, signerAddress: string): string {
|
|
182
|
+
return `${this.slotPaddedKey(slot)}-${signerAddress}`;
|
|
183
|
+
}
|
|
184
|
+
|
|
16
185
|
/**
|
|
17
|
-
*
|
|
186
|
+
* Returns range bounds for querying all attestations for a given slot.
|
|
187
|
+
* Fixed-width padding ensures the slot prefix sorts cleanly, so using the next
|
|
188
|
+
* slot's prefix as the upper bound captures exactly the current slot's entries.
|
|
18
189
|
*/
|
|
19
|
-
|
|
190
|
+
private getAttestationKeyRangeForSlot(slot: SlotNumber): { start: string; end: string } {
|
|
191
|
+
return { start: `${this.slotPaddedKey(slot)}-`, end: `${this.slotPaddedKey(slot + 1)}-` };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** Creates a position key for block proposals: slot * 1024 + indexWithinCheckpoint.
|
|
195
|
+
* Uses multiplication instead of bit-shift to avoid 32-bit signed integer overflow
|
|
196
|
+
* (bit-shift overflows after slot ~2^21, roughly 278 days of uptime). */
|
|
197
|
+
private getBlockPositionKey(slot: number, indexWithinCheckpoint: number): number {
|
|
198
|
+
if (indexWithinCheckpoint > AttestationPool.MAX_INDEX) {
|
|
199
|
+
throw new Error(
|
|
200
|
+
`Value for indexWithinCheckpoint ${indexWithinCheckpoint} exceeds maximum ${AttestationPool.MAX_INDEX}`,
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
return slot * (1 << AttestationPool.INDEX_BITS) + indexWithinCheckpoint;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** Returns true if the multimap already contains the given value for the given key. */
|
|
207
|
+
private async multimapHasValue<TKey extends number | string, TValue extends string>(
|
|
208
|
+
map: AztecAsyncMultiMap<TKey, TValue>,
|
|
209
|
+
key: TKey,
|
|
210
|
+
value: TValue,
|
|
211
|
+
): Promise<boolean> {
|
|
212
|
+
const values = await toArray(map.getValuesAsync(key));
|
|
213
|
+
return values.includes(value);
|
|
214
|
+
}
|
|
20
215
|
|
|
21
216
|
/**
|
|
22
|
-
*
|
|
217
|
+
* Attempts to add a block proposal to the pool.
|
|
23
218
|
*
|
|
24
|
-
*
|
|
219
|
+
* - Detects duplicates by signed-payload hash (not archive); a re-broadcast of the
|
|
220
|
+
* exact same signed payload returns `alreadyExists: true`.
|
|
221
|
+
* - Distinct payload hashes at the same `(slot, indexWithinCheckpoint)` are tracked
|
|
222
|
+
* in the equivocation index and retained up to the cap.
|
|
25
223
|
*
|
|
26
|
-
* @
|
|
224
|
+
* @param blockProposal - The block proposal to add
|
|
225
|
+
* @returns Result indicating whether the proposal was added and duplicate detection info
|
|
27
226
|
*/
|
|
28
|
-
|
|
227
|
+
public async tryAddBlockProposal(blockProposal: BlockProposal): Promise<TryAddResult> {
|
|
228
|
+
return await this.store.transactionAsync(async () => {
|
|
229
|
+
const positionKey = this.getBlockPositionKey(blockProposal.slotNumber, blockProposal.indexWithinCheckpoint);
|
|
230
|
+
const payloadHash = blockProposal.getPayloadHash();
|
|
231
|
+
|
|
232
|
+
// Hash already tracked => exact same signed payload was already received.
|
|
233
|
+
if (await this.multimapHasValue(this.blockProposalHashesPerSlotAndIndex, positionKey, payloadHash)) {
|
|
234
|
+
const count = await this.blockProposalHashesPerSlotAndIndex.getValueCountAsync(positionKey);
|
|
235
|
+
return { added: false, alreadyExists: true, count };
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Cap reached for this position (no more new payload hashes accepted).
|
|
239
|
+
const count = await this.blockProposalHashesPerSlotAndIndex.getValueCountAsync(positionKey);
|
|
240
|
+
if (count >= MAX_BLOCK_PROPOSALS_PER_POSITION) {
|
|
241
|
+
return { added: false, alreadyExists: false, count };
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Track the new payload hash for equivocation detection.
|
|
245
|
+
await this.blockProposalHashesPerSlotAndIndex.set(positionKey, payloadHash);
|
|
246
|
+
const proposalKey = this.getBlockProposalKey(
|
|
247
|
+
blockProposal.slotNumber,
|
|
248
|
+
blockProposal.indexWithinCheckpoint,
|
|
249
|
+
payloadHash,
|
|
250
|
+
);
|
|
251
|
+
await this.blockProposalsPerSlotIndexAndHash.set(proposalKey, blockProposal.withoutSignedTxs().toBuffer());
|
|
252
|
+
await this.blockProposalKeysPerArchive.set(blockProposal.archive.toString(), proposalKey);
|
|
253
|
+
|
|
254
|
+
this.log.debug(
|
|
255
|
+
`Added block proposal for slot ${blockProposal.slotNumber} and index ${blockProposal.indexWithinCheckpoint}`,
|
|
256
|
+
{
|
|
257
|
+
archive: blockProposal.archive.toString(),
|
|
258
|
+
payloadHash,
|
|
259
|
+
slotNumber: blockProposal.slotNumber,
|
|
260
|
+
indexWithinCheckpoint: blockProposal.indexWithinCheckpoint,
|
|
261
|
+
},
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
return { added: true, alreadyExists: false, count: count + 1 };
|
|
265
|
+
});
|
|
266
|
+
}
|
|
29
267
|
|
|
30
268
|
/**
|
|
31
|
-
*
|
|
269
|
+
* Get block proposal by archive root.
|
|
32
270
|
*
|
|
33
|
-
*
|
|
271
|
+
* Resolves the archive root through the archive index and returns the first
|
|
272
|
+
* retained proposal for that archive. This lookup is used by block-txs req/resp,
|
|
273
|
+
* where any retained proposal for the requested archive gives the tx hash list.
|
|
34
274
|
*
|
|
35
|
-
* @
|
|
275
|
+
* @param archiveRoot - The archive root to look up
|
|
276
|
+
* @return The block proposal if it exists and its archive matches, otherwise undefined.
|
|
36
277
|
*/
|
|
37
|
-
|
|
278
|
+
public async getBlockProposalByArchive(archiveRoot: string): Promise<BlockProposal | undefined> {
|
|
279
|
+
for await (const proposalKey of this.blockProposalKeysPerArchive.getValuesAsync(archiveRoot)) {
|
|
280
|
+
const buffer = await this.blockProposalsPerSlotIndexAndHash.getAsync(proposalKey);
|
|
281
|
+
if (!buffer || buffer.length === 0) {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
try {
|
|
285
|
+
const proposal = BlockProposal.fromBuffer(buffer);
|
|
286
|
+
if (proposal.archive.toString() === archiveRoot) {
|
|
287
|
+
return proposal;
|
|
288
|
+
}
|
|
289
|
+
} catch {
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return undefined;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/** Returns retained signed proposals for a slot. */
|
|
297
|
+
public async getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
|
|
298
|
+
const blockProposals: BlockProposal[] = [];
|
|
299
|
+
const checkpointProposals: CheckpointProposalCore[] = [];
|
|
300
|
+
|
|
301
|
+
for await (const [_, buffer] of this.blockProposalsPerSlotIndexAndHash.entriesAsync(
|
|
302
|
+
this.getBlockProposalKeyRangeForSlot(slot),
|
|
303
|
+
)) {
|
|
304
|
+
try {
|
|
305
|
+
blockProposals.push(BlockProposal.fromBuffer(buffer));
|
|
306
|
+
} catch {
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
for await (const [_, buffer] of this.checkpointProposalsPerSlotAndHash.entriesAsync(
|
|
312
|
+
this.getCheckpointProposalKeyRangeForSlot(slot),
|
|
313
|
+
)) {
|
|
314
|
+
try {
|
|
315
|
+
checkpointProposals.push(CheckpointProposal.fromBuffer(buffer));
|
|
316
|
+
} catch {
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return { blockProposals, checkpointProposals };
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/** Checks if any block proposals exist for a given slot (at index 0). */
|
|
325
|
+
public async hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
|
|
326
|
+
const positionKey = this.getBlockPositionKey(slot, 0);
|
|
327
|
+
const count = await this.blockProposalHashesPerSlotAndIndex.getValueCountAsync(positionKey);
|
|
328
|
+
return count > 0;
|
|
329
|
+
}
|
|
38
330
|
|
|
39
331
|
/**
|
|
40
|
-
*
|
|
332
|
+
* Attempts to add a checkpoint proposal to the pool.
|
|
333
|
+
*
|
|
334
|
+
* - Detects duplicates by signed-payload hash (not archive); a re-broadcast of the
|
|
335
|
+
* exact same signed payload returns `alreadyExists: true`.
|
|
336
|
+
* - Distinct payload hashes at the same slot are tracked in the equivocation index.
|
|
337
|
+
* Distinct payload bytes are retained up to the same cap so slashing watchers
|
|
338
|
+
* can recover signed proposals.
|
|
41
339
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
340
|
+
* Note: This method only handles the CheckpointProposalCore. If the original
|
|
341
|
+
* CheckpointProposal contains a lastBlock, the caller should extract it via
|
|
342
|
+
* getBlockProposal() and add it separately via tryAddBlockProposal().
|
|
45
343
|
*
|
|
46
|
-
* @param proposal - The checkpoint proposal to add
|
|
47
|
-
* @
|
|
344
|
+
* @param proposal - The checkpoint proposal core to add
|
|
345
|
+
* @returns Result indicating whether the proposal was added and duplicate detection info
|
|
48
346
|
*/
|
|
49
|
-
|
|
347
|
+
public async tryAddCheckpointProposal(proposal: CheckpointProposalCore): Promise<TryAddResult> {
|
|
348
|
+
return await this.store.transactionAsync(async () => {
|
|
349
|
+
const slot = proposal.slotNumber;
|
|
350
|
+
const payloadHash = proposal.getPayloadHash();
|
|
351
|
+
|
|
352
|
+
if (await this.multimapHasValue(this.checkpointProposalHashesPerSlot, slot, payloadHash)) {
|
|
353
|
+
const count = await this.checkpointProposalHashesPerSlot.getValueCountAsync(slot);
|
|
354
|
+
return { added: false, alreadyExists: true, count };
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const count = await this.checkpointProposalHashesPerSlot.getValueCountAsync(slot);
|
|
358
|
+
if (count >= MAX_CHECKPOINT_PROPOSALS_PER_SLOT) {
|
|
359
|
+
return { added: false, alreadyExists: false, count };
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Track the new payload hash for equivocation detection.
|
|
363
|
+
await this.checkpointProposalHashesPerSlot.set(slot, payloadHash);
|
|
364
|
+
await this.checkpointProposalsPerSlotAndHash.set(
|
|
365
|
+
this.getCheckpointProposalKey(slot, payloadHash),
|
|
366
|
+
proposal.toBuffer(),
|
|
367
|
+
);
|
|
368
|
+
|
|
369
|
+
this.log.debug(`Added checkpoint proposal for slot ${slot}`, {
|
|
370
|
+
archive: proposal.archive.toString(),
|
|
371
|
+
payloadHash,
|
|
372
|
+
slotNumber: slot,
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
return { added: true, alreadyExists: false, count: count + 1 };
|
|
376
|
+
});
|
|
377
|
+
}
|
|
50
378
|
|
|
51
379
|
/**
|
|
52
|
-
* Get checkpoint proposal
|
|
380
|
+
* Get a retained checkpoint proposal stored for the given slot.
|
|
381
|
+
* If multiple proposals were retained for an equivocation, returns the lowest
|
|
382
|
+
* payload hash deterministically.
|
|
53
383
|
*
|
|
54
384
|
* Returns a CheckpointProposalCore (without lastBlock info) since the lastBlock
|
|
55
385
|
* is extracted and stored separately as a BlockProposal when added.
|
|
56
386
|
*
|
|
57
|
-
* @param
|
|
58
|
-
* @return The checkpoint proposal core if
|
|
387
|
+
* @param slot - The slot to look up
|
|
388
|
+
* @return The checkpoint proposal core if one is stored, otherwise undefined.
|
|
59
389
|
*/
|
|
60
|
-
getCheckpointProposal(
|
|
390
|
+
public async getCheckpointProposal(slot: SlotNumber): Promise<CheckpointProposalCore | undefined> {
|
|
391
|
+
for await (const [_, buffer] of this.checkpointProposalsPerSlotAndHash.entriesAsync(
|
|
392
|
+
this.getCheckpointProposalKeyRangeForSlot(slot),
|
|
393
|
+
)) {
|
|
394
|
+
try {
|
|
395
|
+
if (buffer && buffer.length > 0) {
|
|
396
|
+
return CheckpointProposal.fromBuffer(buffer);
|
|
397
|
+
}
|
|
398
|
+
} catch {
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
61
402
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
*
|
|
65
|
-
* @param idOrProposal - The ID of the checkpoint proposal or the proposal itself
|
|
66
|
-
* @return True if the proposal exists, false otherwise.
|
|
67
|
-
*/
|
|
68
|
-
hasCheckpointProposal(idOrProposal: string | CheckpointProposal): Promise<boolean>;
|
|
403
|
+
return undefined;
|
|
404
|
+
}
|
|
69
405
|
|
|
70
406
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
407
|
+
* Adds own checkpoint attestations to the pool.
|
|
408
|
+
* Skips per-signer cap and equivocation tracking; the caller is trusted.
|
|
409
|
+
* Each (slot, signer) gets a single stored attestation; later additions overwrite.
|
|
74
410
|
*/
|
|
75
|
-
|
|
411
|
+
public async addOwnCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void> {
|
|
412
|
+
await this.store.transactionAsync(async () => {
|
|
413
|
+
for (const attestation of attestations) {
|
|
414
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
415
|
+
const sender = attestation.getSender();
|
|
76
416
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
417
|
+
// Skip attestations with invalid signatures
|
|
418
|
+
if (!sender) {
|
|
419
|
+
this.log.warn(`Skipping own checkpoint attestation with invalid signature for slot ${slotNumber}`, {
|
|
420
|
+
signature: attestation.signature.toString(),
|
|
421
|
+
slotNumber,
|
|
422
|
+
archive: attestation.archive.toString(),
|
|
423
|
+
});
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
const address = sender.toString();
|
|
428
|
+
const ownKey = this.getSlotSignerKey(slotNumber, address);
|
|
429
|
+
const payloadHash = attestation.getPayloadHash();
|
|
430
|
+
|
|
431
|
+
await this.attestationPerSlotAndSigner.set(ownKey, attestation.toBuffer());
|
|
432
|
+
this.metrics.trackMempoolItemAdded(ownKey);
|
|
433
|
+
|
|
434
|
+
// Track our own payload hash so that an equivocating attestation from another
|
|
435
|
+
// peer at the same (slot, signer) is detected as a duplicate.
|
|
436
|
+
if (!(await this.multimapHasValue(this.attestationHashesPerSlotAndSigner, ownKey, payloadHash))) {
|
|
437
|
+
await this.attestationHashesPerSlotAndSigner.set(ownKey, payloadHash);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
this.log.debug(`Added own checkpoint attestation for slot ${slotNumber} from ${address}`, {
|
|
441
|
+
signature: attestation.signature.toString(),
|
|
442
|
+
slotNumber,
|
|
443
|
+
address,
|
|
444
|
+
archive: attestation.archive.toString(),
|
|
445
|
+
payloadHash,
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
}
|
|
83
450
|
|
|
84
451
|
/**
|
|
85
|
-
* Get all checkpoint attestations for a given slot
|
|
452
|
+
* Get all checkpoint attestations for a given slot.
|
|
453
|
+
*
|
|
454
|
+
* Returns one attestation per (slot, signer) — the first seen for each signer.
|
|
455
|
+
* Later equivocating attestations from the same signer are tracked in the index
|
|
456
|
+
* but their bytes are not retained.
|
|
86
457
|
*
|
|
87
458
|
* @param slot - The slot to query
|
|
88
459
|
* @return CheckpointAttestations
|
|
89
460
|
*/
|
|
90
|
-
getCheckpointAttestationsForSlot(slot: SlotNumber): Promise<CheckpointAttestation[]
|
|
461
|
+
public async getCheckpointAttestationsForSlot(slot: SlotNumber): Promise<CheckpointAttestation[]> {
|
|
462
|
+
const range = this.getAttestationKeyRangeForSlot(slot);
|
|
463
|
+
const attestations: CheckpointAttestation[] = [];
|
|
464
|
+
|
|
465
|
+
for await (const [_, buf] of this.attestationPerSlotAndSigner.entriesAsync(range)) {
|
|
466
|
+
attestations.push(CheckpointAttestation.fromBuffer(buf));
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
return attestations;
|
|
470
|
+
}
|
|
91
471
|
|
|
92
472
|
/**
|
|
93
|
-
* Get checkpoint attestations for slot
|
|
473
|
+
* Get checkpoint attestations for a slot whose signed payload matches the given
|
|
474
|
+
* proposal payload hash.
|
|
94
475
|
*
|
|
95
476
|
* @param slot - The slot to query
|
|
96
|
-
* @param
|
|
97
|
-
* @return CheckpointAttestations
|
|
477
|
+
* @param proposalPayloadHash - Hex-encoded keccak256 of the target proposal's signed payload
|
|
478
|
+
* @return CheckpointAttestations whose `getPayloadHash()` matches `proposalPayloadHash`
|
|
98
479
|
*/
|
|
99
|
-
getCheckpointAttestationsForSlotAndProposal(
|
|
480
|
+
public async getCheckpointAttestationsForSlotAndProposal(
|
|
481
|
+
slot: SlotNumber,
|
|
482
|
+
proposalPayloadHash: CheckpointProposalHash,
|
|
483
|
+
): Promise<CheckpointAttestation[]> {
|
|
484
|
+
const all = await this.getCheckpointAttestationsForSlot(slot);
|
|
485
|
+
return all.filter(att => att.getPayloadHash() === proposalPayloadHash);
|
|
486
|
+
}
|
|
100
487
|
|
|
101
488
|
/**
|
|
102
|
-
*
|
|
489
|
+
* Delete all pool data (attestations, proposals) older than the given slot.
|
|
103
490
|
*
|
|
104
|
-
* @param
|
|
105
|
-
* @return True if the attestation exists, false otherwise
|
|
491
|
+
* @param oldestSlot - The oldest slot to keep.
|
|
106
492
|
*/
|
|
107
|
-
|
|
493
|
+
public async deleteOlderThan(oldestSlot: SlotNumber): Promise<void> {
|
|
494
|
+
let numberOfAttestations = 0;
|
|
495
|
+
let numberOfCheckpointProposals = 0;
|
|
496
|
+
let numberOfBlockProposals = 0;
|
|
108
497
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
* - True if the proposal already exists, allow overwrite to keep parity with tests.
|
|
112
|
-
* - True if the slot is below the proposal cap.
|
|
113
|
-
* - False if the slot is at/above cap and this would be a new unique proposal.
|
|
114
|
-
*
|
|
115
|
-
* @param block - The block proposal to check
|
|
116
|
-
* @returns True if the proposal can be added (or already exists), false otherwise.
|
|
117
|
-
*/
|
|
118
|
-
canAddProposal(block: BlockProposal): Promise<boolean>;
|
|
498
|
+
await this.store.transactionAsync(async () => {
|
|
499
|
+
const oldestSlotPadded = this.slotPaddedKey(oldestSlot);
|
|
119
500
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
501
|
+
// Delete checkpoint attestations whose key < `${oldestSlotPadded}-`. Fixed-width
|
|
502
|
+
// decimal padding means the slot prefix sorts strictly before any key at that slot.
|
|
503
|
+
for await (const key of this.attestationPerSlotAndSigner.keysAsync({ end: `${oldestSlotPadded}-` })) {
|
|
504
|
+
await this.attestationPerSlotAndSigner.delete(key);
|
|
505
|
+
this.metrics.trackMempoolItemRemoved(key);
|
|
506
|
+
numberOfAttestations++;
|
|
507
|
+
}
|
|
127
508
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
* @param committeeSize - Committee size for the attestation's slot
|
|
133
|
-
* @returns True if the attestation can be added, false otherwise.
|
|
134
|
-
*/
|
|
135
|
-
canAddCheckpointAttestation(attestation: CheckpointAttestation, committeeSize: number): Promise<boolean>;
|
|
509
|
+
// Clean up per-signer-per-slot index using the same end bound.
|
|
510
|
+
for await (const key of this.attestationHashesPerSlotAndSigner.keysAsync({ end: `${oldestSlotPadded}-` })) {
|
|
511
|
+
await this.attestationHashesPerSlotAndSigner.delete(key);
|
|
512
|
+
}
|
|
136
513
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
514
|
+
// Delete checkpoint proposals for slots < oldestSlot.
|
|
515
|
+
for await (const slot of this.checkpointProposalHashesPerSlot.keysAsync({ end: oldestSlot })) {
|
|
516
|
+
await this.checkpointProposalHashesPerSlot.delete(slot);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
for await (const key of this.checkpointProposalsPerSlotAndHash.keysAsync({
|
|
520
|
+
end: `${oldestSlotPadded}-`,
|
|
521
|
+
})) {
|
|
522
|
+
await this.checkpointProposalsPerSlotAndHash.delete(key);
|
|
523
|
+
numberOfCheckpointProposals++;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// Delete block proposals for slots < oldestSlot, using blockProposalHashesPerSlotAndIndex as index.
|
|
527
|
+
// Key format: slot * (1 << INDEX_BITS) + indexWithinCheckpoint
|
|
528
|
+
const blockPositionEndKey = oldestSlot * (1 << AttestationPool.INDEX_BITS);
|
|
529
|
+
for await (const positionKey of this.blockProposalHashesPerSlotAndIndex.keysAsync({ end: blockPositionEndKey })) {
|
|
530
|
+
await this.blockProposalHashesPerSlotAndIndex.delete(positionKey);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
for await (const [key, buffer] of this.blockProposalsPerSlotIndexAndHash.entriesAsync({
|
|
534
|
+
end: `${oldestSlotPadded}-`,
|
|
535
|
+
})) {
|
|
536
|
+
try {
|
|
537
|
+
const proposal = BlockProposal.fromBuffer(buffer);
|
|
538
|
+
await this.blockProposalKeysPerArchive.deleteValue(proposal.archive.toString(), key);
|
|
539
|
+
} catch {
|
|
540
|
+
// ignore decode errors when cleaning up
|
|
541
|
+
}
|
|
542
|
+
await this.blockProposalsPerSlotIndexAndHash.delete(key);
|
|
543
|
+
numberOfBlockProposals++;
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
this.log.verbose(`Deleted old pool data`, {
|
|
548
|
+
oldestSlot,
|
|
549
|
+
numberOfAttestations,
|
|
550
|
+
numberOfCheckpointProposals,
|
|
551
|
+
numberOfBlockProposals,
|
|
552
|
+
});
|
|
553
|
+
}
|
|
144
554
|
|
|
145
555
|
/**
|
|
146
|
-
*
|
|
556
|
+
* Attempts to add a checkpoint attestation to the pool.
|
|
557
|
+
*
|
|
558
|
+
* - Detects duplicates by signed-payload hash (not archive); a re-broadcast of the
|
|
559
|
+
* exact same signed payload from the same signer returns `alreadyExists: true`.
|
|
560
|
+
* - Distinct payload hashes from the same (slot, signer) are tracked in the
|
|
561
|
+
* equivocation index. The first one's bytes are stored; later distinct hashes
|
|
562
|
+
* bump `count` so libp2p can fire its duplicate callback.
|
|
147
563
|
*
|
|
148
|
-
* @param
|
|
149
|
-
* @
|
|
150
|
-
*
|
|
151
|
-
*
|
|
564
|
+
* @param attestation - The checkpoint attestation to add
|
|
565
|
+
* @returns Result indicating whether the attestation was added, existence info,
|
|
566
|
+
* and number of distinct payload hashes by this signer for this slot
|
|
567
|
+
* (for equivocation detection).
|
|
152
568
|
*/
|
|
153
|
-
|
|
569
|
+
public async tryAddCheckpointAttestation(attestation: CheckpointAttestation): Promise<TryAddResult> {
|
|
570
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
571
|
+
const sender = attestation.getSender();
|
|
154
572
|
|
|
155
|
-
|
|
156
|
-
|
|
573
|
+
if (!sender) {
|
|
574
|
+
return { added: false, alreadyExists: false, count: 0 };
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
const signerAddress = sender.toString();
|
|
578
|
+
const slotSignerKey = this.getSlotSignerKey(slotNumber, signerAddress);
|
|
579
|
+
const payloadHash = attestation.getPayloadHash();
|
|
580
|
+
|
|
581
|
+
return await this.store.transactionAsync(async () => {
|
|
582
|
+
if (await this.multimapHasValue(this.attestationHashesPerSlotAndSigner, slotSignerKey, payloadHash)) {
|
|
583
|
+
const count = await this.attestationHashesPerSlotAndSigner.getValueCountAsync(slotSignerKey);
|
|
584
|
+
return { added: false, alreadyExists: true, count };
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
const signerAttestationCount = await this.attestationHashesPerSlotAndSigner.getValueCountAsync(slotSignerKey);
|
|
588
|
+
|
|
589
|
+
if (signerAttestationCount >= MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER) {
|
|
590
|
+
this.log.debug(`Rejecting attestation: signer ${signerAddress} exceeded per-slot cap for slot ${slotNumber}`, {
|
|
591
|
+
slotNumber,
|
|
592
|
+
signerAddress,
|
|
593
|
+
archive: attestation.archive.toString(),
|
|
594
|
+
payloadHash,
|
|
595
|
+
signerAttestationCount,
|
|
596
|
+
});
|
|
597
|
+
return {
|
|
598
|
+
added: false,
|
|
599
|
+
alreadyExists: false,
|
|
600
|
+
count: signerAttestationCount,
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
// Track the new payload hash for equivocation detection.
|
|
605
|
+
await this.attestationHashesPerSlotAndSigner.set(slotSignerKey, payloadHash);
|
|
606
|
+
|
|
607
|
+
// Only the first distinct payload at (slot, signer) is stored; later
|
|
608
|
+
// equivocations are detected via the multimap but their bytes are not retained.
|
|
609
|
+
const alreadyHasStored = await this.attestationPerSlotAndSigner.hasAsync(slotSignerKey);
|
|
610
|
+
if (!alreadyHasStored) {
|
|
611
|
+
await this.attestationPerSlotAndSigner.set(slotSignerKey, attestation.toBuffer());
|
|
612
|
+
this.metrics.trackMempoolItemAdded(slotSignerKey);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
this.log.debug(`Added checkpoint attestation for slot ${slotNumber} from ${signerAddress}`, {
|
|
616
|
+
signature: attestation.signature.toString(),
|
|
617
|
+
slotNumber,
|
|
618
|
+
address: signerAddress,
|
|
619
|
+
archive: attestation.archive.toString(),
|
|
620
|
+
payloadHash,
|
|
621
|
+
stored: !alreadyHasStored,
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
return {
|
|
625
|
+
added: true,
|
|
626
|
+
alreadyExists: false,
|
|
627
|
+
count: signerAttestationCount + 1,
|
|
628
|
+
};
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
/** Creates an AttestationPool backed by a temporary store for testing. */
|
|
634
|
+
export async function createTestAttestationPool(telemetry?: TelemetryClient): Promise<AttestationPool> {
|
|
635
|
+
const { openTmpStore } = await import('@aztec/kv-store/lmdb-v2');
|
|
636
|
+
const store = await openTmpStore('test-attestation-pool');
|
|
637
|
+
return new AttestationPool(store, telemetry);
|
|
157
638
|
}
|