@aztec/p2p 0.0.0-test.0 → 0.0.1-commit.023c3e5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +26 -13
- package/dest/client/factory.d.ts +15 -5
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +61 -25
- package/dest/client/index.d.ts +2 -1
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +1 -0
- package/dest/client/interface.d.ts +170 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +9 -0
- package/dest/client/p2p_client.d.ts +75 -193
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +765 -229
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +154 -125
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +182 -34
- package/dest/enr/generate-enr.d.ts +11 -3
- package/dest/enr/generate-enr.d.ts.map +1 -1
- package/dest/enr/generate-enr.js +27 -5
- package/dest/enr/index.d.ts +1 -1
- package/dest/errors/attestation-pool.error.d.ts +7 -0
- package/dest/errors/attestation-pool.error.d.ts.map +1 -0
- package/dest/errors/attestation-pool.error.js +12 -0
- package/dest/errors/reqresp.error.d.ts +1 -1
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/index.d.ts +4 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +104 -25
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- 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 +299 -174
- package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -11
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +168 -62
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +24 -10
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +133 -82
- package/dest/mem_pools/attestation_pool/mocks.d.ts +234 -11
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +19 -21
- package/dest/mem_pools/index.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts +16 -12
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +56 -41
- package/dest/mem_pools/interface.d.ts +3 -4
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +75 -16
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +493 -142
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
- package/dest/mem_pools/tx_pool/index.d.ts +1 -2
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/index.js +0 -1
- package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.js +7 -2
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +72 -11
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +276 -45
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +7 -5
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +79 -10
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +76 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/index.js +1 -0
- package/dest/msg_validators/clock_tolerance.d.ts +21 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +37 -0
- package/dest/msg_validators/index.d.ts +2 -2
- package/dest/msg_validators/index.d.ts.map +1 -1
- package/dest/msg_validators/index.js +1 -1
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +10 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -0
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.js +36 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +3 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +27 -0
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +14 -0
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/archive_cache.js +22 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +7 -6
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +60 -87
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -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 +24 -29
- package/dest/msg_validators/tx_validator/factory.d.ts +21 -0
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/factory.js +84 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +12 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/gas_validator.js +110 -0
- package/dest/msg_validators/tx_validator/index.d.ts +9 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +8 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -5
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +40 -21
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/phases_validator.js +93 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts +17 -0
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/test_utils.js +22 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +14 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.js +32 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +24 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +8 -7
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +10 -6
- package/dest/services/discv5/discV5_service.d.ts +10 -9
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +64 -37
- package/dest/services/dummy_service.d.ts +66 -11
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +130 -5
- package/dest/services/encoding.d.ts +26 -7
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +75 -6
- package/dest/services/gossipsub/scoring.d.ts +1 -1
- package/dest/services/index.d.ts +5 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +4 -0
- package/dest/services/libp2p/instrumentation.d.ts +20 -0
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -0
- package/dest/services/libp2p/instrumentation.js +122 -0
- package/dest/services/libp2p/libp2p_service.d.ts +107 -95
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +1328 -313
- package/dest/services/peer-manager/interface.d.ts +23 -0
- package/dest/services/peer-manager/interface.d.ts.map +1 -0
- package/dest/services/peer-manager/interface.js +1 -0
- package/dest/services/peer-manager/metrics.d.ts +12 -3
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +44 -12
- package/dest/services/peer-manager/peer_manager.d.ts +103 -23
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +551 -82
- 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 +43 -2
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
- package/dest/services/reqresp/config.d.ts +11 -9
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +18 -4
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +23 -4
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +73 -10
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +32 -17
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +154 -84
- 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/index.d.ts +3 -2
- package/dest/services/reqresp/index.d.ts.map +1 -1
- package/dest/services/reqresp/index.js +2 -1
- package/dest/services/reqresp/interface.d.ts +75 -24
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +46 -27
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -21
- package/dest/services/reqresp/protocols/auth.d.ts +43 -0
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/auth.js +71 -0
- package/dest/services/reqresp/protocols/block.d.ts +6 -1
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block.js +30 -6
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +34 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +87 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +11 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +52 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +59 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +105 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts +4 -0
- package/dest/services/reqresp/protocols/block_txs/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/index.js +3 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts +3 -5
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/goodbye.js +7 -7
- package/dest/services/reqresp/protocols/index.d.ts +3 -1
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +2 -0
- package/dest/services/reqresp/protocols/ping.d.ts +1 -3
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.d.ts +40 -7
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +76 -5
- package/dest/services/reqresp/protocols/tx.d.ts +14 -4
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +34 -6
- package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +6 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -2
- 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 +21 -1
- package/dest/services/reqresp/reqresp.d.ts +29 -66
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +753 -248
- package/dest/services/reqresp/status.d.ts +10 -4
- package/dest/services/reqresp/status.d.ts.map +1 -1
- package/dest/services/reqresp/status.js +9 -2
- package/dest/services/service.d.ts +40 -20
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +28 -0
- package/dest/services/tx_collection/config.d.ts.map +1 -0
- package/dest/services/tx_collection/config.js +66 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/fast_tx_collection.js +311 -0
- package/dest/services/tx_collection/index.d.ts +4 -0
- package/dest/services/tx_collection/index.d.ts.map +1 -0
- package/dest/services/tx_collection/index.js +3 -0
- package/dest/services/tx_collection/instrumentation.d.ts +10 -0
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_collection/instrumentation.js +31 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/slow_tx_collection.js +177 -0
- package/dest/services/tx_collection/tx_collection.d.ts +110 -0
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection.js +128 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts +30 -0
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_collection_sink.js +111 -0
- package/dest/services/tx_collection/tx_source.d.ts +18 -0
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/tx_source.js +31 -0
- package/dest/services/tx_provider.d.ts +51 -0
- package/dest/services/tx_provider.d.ts.map +1 -0
- package/dest/services/tx_provider.js +219 -0
- package/dest/services/tx_provider_instrumentation.d.ts +16 -0
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -0
- package/dest/services/tx_provider_instrumentation.js +34 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts +1 -1
- package/dest/test-helpers/get-ports.d.ts.map +1 -1
- package/dest/test-helpers/index.d.ts +4 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +3 -0
- package/dest/test-helpers/make-enrs.d.ts +1 -1
- package/dest/test-helpers/make-enrs.d.ts.map +1 -1
- package/dest/test-helpers/make-enrs.js +4 -5
- package/dest/test-helpers/make-test-p2p-clients.d.ts +33 -5
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +86 -16
- package/dest/test-helpers/mock-pubsub.d.ts +59 -0
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -0
- package/dest/test-helpers/mock-pubsub.js +130 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts +12 -0
- package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -0
- package/dest/test-helpers/mock-tx-helpers.js +19 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +15 -11
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +62 -28
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +158 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +297 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +259 -90
- package/dest/testbench/parse_log_file.d.ts +1 -1
- package/dest/testbench/parse_log_file.js +4 -4
- package/dest/testbench/testbench.d.ts +1 -1
- package/dest/testbench/testbench.js +4 -4
- package/dest/testbench/worker_client_manager.d.ts +51 -11
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +232 -53
- package/dest/types/index.d.ts +4 -2
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +2 -0
- package/dest/util.d.ts +24 -16
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +75 -69
- package/dest/versioning.d.ts +4 -4
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +8 -3
- package/package.json +32 -27
- package/src/bootstrap/bootstrap.ts +34 -15
- package/src/client/factory.ts +135 -53
- package/src/client/index.ts +1 -0
- package/src/client/interface.ts +213 -0
- package/src/client/p2p_client.ts +476 -383
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +304 -134
- package/src/enr/generate-enr.ts +39 -6
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/index.ts +4 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +119 -24
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +352 -201
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +233 -72
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +199 -96
- package/src/mem_pools/attestation_pool/mocks.ts +24 -17
- package/src/mem_pools/instrumentation.ts +72 -48
- package/src/mem_pools/interface.ts +2 -4
- package/src/mem_pools/tx_pool/README.md +270 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +580 -143
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
- package/src/mem_pools/tx_pool/index.ts +0 -1
- package/src/mem_pools/tx_pool/priority.ts +9 -2
- package/src/mem_pools/tx_pool/tx_pool.ts +75 -10
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +225 -36
- package/src/msg_validators/attestation_validator/attestation_validator.ts +72 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +94 -0
- package/src/msg_validators/attestation_validator/index.ts +1 -0
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -0
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +35 -0
- package/src/msg_validators/tx_validator/archive_cache.ts +28 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +10 -9
- package/src/msg_validators/tx_validator/data_validator.ts +95 -71
- package/src/msg_validators/tx_validator/double_spend_validator.ts +23 -20
- package/src/msg_validators/tx_validator/factory.ts +151 -0
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +123 -0
- package/src/msg_validators/tx_validator/index.ts +8 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +72 -24
- package/src/msg_validators/tx_validator/phases_validator.ts +118 -0
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/test_utils.ts +43 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +52 -0
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +22 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +14 -8
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +85 -39
- package/src/services/dummy_service.ts +198 -9
- package/src/services/encoding.ts +82 -6
- package/src/services/index.ts +4 -0
- package/src/services/libp2p/instrumentation.ts +126 -0
- package/src/services/libp2p/libp2p_service.ts +1170 -353
- package/src/services/peer-manager/interface.ts +29 -0
- package/src/services/peer-manager/metrics.ts +55 -12
- package/src/services/peer-manager/peer_manager.ts +657 -80
- package/src/services/peer-manager/peer_scoring.ts +45 -3
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
- package/src/services/reqresp/config.ts +26 -9
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +77 -10
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +166 -95
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/index.ts +2 -0
- package/src/services/reqresp/interface.ts +95 -37
- package/src/services/reqresp/metrics.ts +40 -28
- package/src/services/reqresp/protocols/auth.ts +83 -0
- package/src/services/reqresp/protocols/block.ts +26 -4
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +106 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +67 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +121 -0
- package/src/services/reqresp/protocols/block_txs/index.ts +3 -0
- package/src/services/reqresp/protocols/goodbye.ts +9 -7
- package/src/services/reqresp/protocols/index.ts +2 -0
- package/src/services/reqresp/protocols/status.ts +121 -5
- package/src/services/reqresp/protocols/tx.ts +36 -8
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +12 -3
- package/src/services/reqresp/rate-limiter/rate_limits.ts +21 -1
- package/src/services/reqresp/reqresp.ts +449 -271
- package/src/services/reqresp/status.ts +12 -3
- package/src/services/service.ts +65 -22
- package/src/services/tx_collection/config.ts +98 -0
- package/src/services/tx_collection/fast_tx_collection.ts +364 -0
- package/src/services/tx_collection/index.ts +7 -0
- package/src/services/tx_collection/instrumentation.ts +35 -0
- package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
- package/src/services/tx_collection/slow_tx_collection.ts +233 -0
- package/src/services/tx_collection/tx_collection.ts +216 -0
- package/src/services/tx_collection/tx_collection_sink.ts +129 -0
- package/src/services/tx_collection/tx_source.ts +37 -0
- package/src/services/tx_provider.ts +232 -0
- package/src/services/tx_provider_instrumentation.ts +54 -0
- package/src/test-helpers/index.ts +3 -0
- package/src/test-helpers/make-enrs.ts +4 -5
- package/src/test-helpers/make-test-p2p-clients.ts +111 -21
- package/src/test-helpers/mock-pubsub.ts +188 -0
- package/src/test-helpers/mock-tx-helpers.ts +24 -0
- package/src/test-helpers/reqresp-nodes.ts +87 -36
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +374 -0
- package/src/testbench/p2p_client_testbench_worker.ts +434 -89
- package/src/testbench/parse_log_file.ts +4 -4
- package/src/testbench/testbench.ts +4 -4
- package/src/testbench/worker_client_manager.ts +315 -59
- package/src/types/index.ts +2 -0
- package/src/util.ts +105 -91
- package/src/versioning.ts +11 -4
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -56
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -141
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -8
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -21
- package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/index.js +0 -1
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -174
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -29
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
|
@@ -1,23 +1,48 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
3
|
import { toArray } from '@aztec/foundation/iterable';
|
|
3
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
-
import {
|
|
5
|
+
import { BlockProposal, CheckpointAttestation, CheckpointProposal } from '@aztec/stdlib/p2p';
|
|
5
6
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
7
|
+
import { ProposalSlotCapExceededError } from '../../errors/attestation-pool.error.js';
|
|
6
8
|
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
9
|
+
export const MAX_PROPOSALS_PER_SLOT = 5;
|
|
10
|
+
export const ATTESTATION_CAP_BUFFER = 10;
|
|
7
11
|
export class KvAttestationPool {
|
|
8
12
|
store;
|
|
9
13
|
log;
|
|
10
14
|
metrics;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
proposals;
|
|
16
|
+
// Checkpoint attestation storage
|
|
17
|
+
checkpointAttestations;
|
|
18
|
+
checkpointProposals;
|
|
19
|
+
checkpointProposalsForSlot;
|
|
20
|
+
checkpointAttestationsForProposal;
|
|
14
21
|
constructor(store, telemetry = getTelemetryClient(), log = createLogger('aztec:attestation_pool')){
|
|
15
22
|
this.store = store;
|
|
16
23
|
this.log = log;
|
|
17
|
-
this.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
24
|
+
this.poolStats = async ()=>{
|
|
25
|
+
return {
|
|
26
|
+
itemCount: await this.checkpointAttestations.sizeAsync()
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
this.proposals = store.openMap('proposals');
|
|
30
|
+
// Initialize checkpoint attestation storage
|
|
31
|
+
this.checkpointAttestations = store.openMap('checkpoint_attestations');
|
|
32
|
+
this.checkpointProposals = store.openMap('checkpoint_proposals');
|
|
33
|
+
this.checkpointProposalsForSlot = store.openMultiMap('checkpoint_proposals_for_slot');
|
|
34
|
+
this.checkpointAttestationsForProposal = store.openMultiMap('checkpoint_attestations_for_proposal');
|
|
35
|
+
this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL, this.poolStats);
|
|
36
|
+
}
|
|
37
|
+
poolStats;
|
|
38
|
+
async isEmpty() {
|
|
39
|
+
for await (const _ of this.checkpointAttestations.entriesAsync()){
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
for await (const _ of this.proposals.entriesAsync()){
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
21
46
|
}
|
|
22
47
|
getProposalKey(slot, proposalId) {
|
|
23
48
|
const slotStr = typeof slot === 'string' ? slot : new Fr(slot).toString();
|
|
@@ -27,86 +52,167 @@ export class KvAttestationPool {
|
|
|
27
52
|
getAttestationKey(slot, proposalId, address) {
|
|
28
53
|
return `${this.getProposalKey(slot, proposalId)}-${address}`;
|
|
29
54
|
}
|
|
30
|
-
async
|
|
55
|
+
async addBlockProposal(blockProposal) {
|
|
56
|
+
await this.store.transactionAsync(async ()=>{
|
|
57
|
+
const proposalId = blockProposal.archive.toString();
|
|
58
|
+
// Strip signedTxs before storing to avoid persisting full tx data
|
|
59
|
+
await this.proposals.set(proposalId, blockProposal.withoutSignedTxs().toBuffer());
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async getBlockProposal(id) {
|
|
63
|
+
const buffer = await this.proposals.getAsync(id);
|
|
64
|
+
try {
|
|
65
|
+
if (buffer && buffer.length > 0) {
|
|
66
|
+
return BlockProposal.fromBuffer(buffer);
|
|
67
|
+
}
|
|
68
|
+
} catch {
|
|
69
|
+
return Promise.resolve(undefined);
|
|
70
|
+
}
|
|
71
|
+
return Promise.resolve(undefined);
|
|
72
|
+
}
|
|
73
|
+
async hasBlockProposal(idOrProposal) {
|
|
74
|
+
const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.archive.toString();
|
|
75
|
+
return await this.proposals.hasAsync(id);
|
|
76
|
+
}
|
|
77
|
+
async addCheckpointProposal(proposal) {
|
|
78
|
+
if (!await this.canAddCheckpointProposal(proposal)) {
|
|
79
|
+
throw new ProposalSlotCapExceededError(`Maximum checkpoint proposals per slot reached: slot=${proposal.slotNumber} cap=${MAX_PROPOSALS_PER_SLOT} proposal=${proposal.archive.toString()}`);
|
|
80
|
+
}
|
|
81
|
+
// Extract and validate the block proposal if present
|
|
82
|
+
const blockProposal = proposal.getBlockProposal();
|
|
83
|
+
if (blockProposal && !await this.canAddProposal(blockProposal)) {
|
|
84
|
+
throw new ProposalSlotCapExceededError(`Maximum block proposals per slot reached when extracting from checkpoint: slot=${proposal.slotNumber} proposal=${blockProposal.archive.toString()}`);
|
|
85
|
+
}
|
|
86
|
+
await this.store.transactionAsync(async ()=>{
|
|
87
|
+
const slotKey = proposal.slotNumber;
|
|
88
|
+
const proposalId = proposal.archive.toString();
|
|
89
|
+
await this.checkpointProposalsForSlot.set(slotKey, proposalId);
|
|
90
|
+
// Store the checkpoint proposal as core (without lastBlock) to avoid duplication
|
|
91
|
+
await this.checkpointProposals.set(proposalId, proposal.toCore().toBuffer());
|
|
92
|
+
// Store the extracted block proposal separately
|
|
93
|
+
if (blockProposal) {
|
|
94
|
+
await this.proposals.set(blockProposal.archive.toString(), blockProposal.withoutSignedTxs().toBuffer());
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
async getCheckpointProposal(id) {
|
|
99
|
+
const buffer = await this.checkpointProposals.getAsync(id);
|
|
100
|
+
try {
|
|
101
|
+
if (buffer && buffer.length > 0) {
|
|
102
|
+
return CheckpointProposal.fromBuffer(buffer);
|
|
103
|
+
}
|
|
104
|
+
} catch {
|
|
105
|
+
return Promise.resolve(undefined);
|
|
106
|
+
}
|
|
107
|
+
return Promise.resolve(undefined);
|
|
108
|
+
}
|
|
109
|
+
async hasCheckpointProposal(idOrProposal) {
|
|
110
|
+
const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.archive.toString();
|
|
111
|
+
return await this.checkpointProposals.hasAsync(id);
|
|
112
|
+
}
|
|
113
|
+
async addCheckpointAttestations(attestations) {
|
|
31
114
|
await this.store.transactionAsync(async ()=>{
|
|
32
115
|
for (const attestation of attestations){
|
|
33
|
-
const slotNumber = attestation.payload.header.
|
|
116
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
34
117
|
const proposalId = attestation.archive;
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
118
|
+
const sender = attestation.getSender();
|
|
119
|
+
// Skip attestations with invalid signatures
|
|
120
|
+
if (!sender) {
|
|
121
|
+
this.log.warn(`Skipping checkpoint attestation with invalid signature for slot ${slotNumber}`, {
|
|
122
|
+
signature: attestation.signature.toString(),
|
|
123
|
+
slotNumber,
|
|
124
|
+
proposalId
|
|
125
|
+
});
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const address = sender.toString();
|
|
129
|
+
await this.checkpointAttestations.set(this.getAttestationKey(slotNumber, proposalId, address), attestation.toBuffer());
|
|
130
|
+
await this.checkpointProposalsForSlot.set(slotNumber, proposalId.toString());
|
|
131
|
+
await this.checkpointAttestationsForProposal.set(this.getProposalKey(slotNumber, proposalId), this.getAttestationKey(slotNumber, proposalId, address));
|
|
132
|
+
this.log.verbose(`Added checkpoint attestation for slot ${slotNumber} from ${address}`, {
|
|
133
|
+
signature: attestation.signature.toString(),
|
|
134
|
+
slotNumber,
|
|
135
|
+
address,
|
|
136
|
+
proposalId
|
|
137
|
+
});
|
|
40
138
|
}
|
|
41
139
|
});
|
|
42
|
-
this.metrics.recordAddedObjects(attestations.length);
|
|
43
140
|
}
|
|
44
|
-
async
|
|
45
|
-
const
|
|
141
|
+
async getCheckpointAttestationsForSlot(slot) {
|
|
142
|
+
const proposalIds = await toArray(this.checkpointProposalsForSlot.getValuesAsync(slot));
|
|
143
|
+
const attestations = [];
|
|
144
|
+
for (const proposalId of proposalIds){
|
|
145
|
+
attestations.push(...await this.getCheckpointAttestationsForSlotAndProposal(slot, proposalId));
|
|
146
|
+
}
|
|
147
|
+
return attestations;
|
|
148
|
+
}
|
|
149
|
+
async getCheckpointAttestationsForSlotAndProposal(slot, proposalId) {
|
|
150
|
+
const attestationIds = await toArray(this.checkpointAttestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)));
|
|
46
151
|
const attestations = [];
|
|
47
|
-
// alternatively iterate this.attestaions starting from slot-proposal-EthAddress.zero
|
|
48
152
|
for (const id of attestationIds){
|
|
49
|
-
const buf = await this.
|
|
153
|
+
const buf = await this.checkpointAttestations.getAsync(id);
|
|
50
154
|
if (!buf) {
|
|
51
|
-
|
|
52
|
-
throw new Error('Attestation not found ' + id);
|
|
155
|
+
throw new Error('Checkpoint attestation not found ' + id);
|
|
53
156
|
}
|
|
54
|
-
const attestation =
|
|
157
|
+
const attestation = CheckpointAttestation.fromBuffer(buf);
|
|
55
158
|
attestations.push(attestation);
|
|
56
159
|
}
|
|
57
160
|
return attestations;
|
|
58
161
|
}
|
|
59
|
-
async
|
|
60
|
-
const olderThan = await toArray(this.
|
|
61
|
-
end:
|
|
162
|
+
async deleteCheckpointAttestationsOlderThan(oldestSlot) {
|
|
163
|
+
const olderThan = await toArray(this.checkpointProposalsForSlot.keysAsync({
|
|
164
|
+
end: oldestSlot
|
|
62
165
|
}));
|
|
63
166
|
for (const oldSlot of olderThan){
|
|
64
|
-
await this.
|
|
167
|
+
await this.deleteCheckpointAttestationsForSlot(SlotNumber(oldSlot));
|
|
65
168
|
}
|
|
66
169
|
}
|
|
67
|
-
async
|
|
68
|
-
const slotFr = new Fr(slot);
|
|
170
|
+
async deleteCheckpointAttestationsForSlot(slot) {
|
|
69
171
|
let numberOfAttestations = 0;
|
|
70
172
|
await this.store.transactionAsync(async ()=>{
|
|
71
|
-
const proposalIds = await toArray(this.
|
|
173
|
+
const proposalIds = await toArray(this.checkpointProposalsForSlot.getValuesAsync(slot));
|
|
72
174
|
for (const proposalId of proposalIds){
|
|
73
|
-
const attestations = await toArray(this.
|
|
175
|
+
const attestations = await toArray(this.checkpointAttestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)));
|
|
74
176
|
numberOfAttestations += attestations.length;
|
|
75
177
|
for (const attestation of attestations){
|
|
76
|
-
await this.
|
|
178
|
+
await this.checkpointAttestations.delete(attestation);
|
|
77
179
|
}
|
|
78
|
-
await this.
|
|
180
|
+
await this.checkpointProposals.delete(proposalId);
|
|
181
|
+
await this.checkpointAttestationsForProposal.delete(this.getProposalKey(slot, proposalId));
|
|
79
182
|
}
|
|
183
|
+
await this.checkpointProposalsForSlot.delete(slot);
|
|
184
|
+
this.log.verbose(`Removed ${numberOfAttestations} checkpoint attestations for slot ${slot}`);
|
|
80
185
|
});
|
|
81
|
-
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`);
|
|
82
|
-
this.metrics.recordRemovedObjects(numberOfAttestations);
|
|
83
186
|
}
|
|
84
|
-
async
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
});
|
|
96
|
-
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
|
|
97
|
-
this.metrics.recordRemovedObjects(numberOfAttestations);
|
|
187
|
+
async hasCheckpointAttestation(attestation) {
|
|
188
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
189
|
+
const proposalId = attestation.archive;
|
|
190
|
+
const sender = attestation.getSender();
|
|
191
|
+
// Attestations with invalid signatures are never in the pool
|
|
192
|
+
if (!sender) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
const address = sender.toString();
|
|
196
|
+
const key = this.getAttestationKey(slotNumber, proposalId, address);
|
|
197
|
+
return await this.checkpointAttestations.hasAsync(key);
|
|
98
198
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
199
|
+
canAddProposal(_block) {
|
|
200
|
+
// TODO(palla/mbps): implement proposal cap logic
|
|
201
|
+
return Promise.resolve(true);
|
|
202
|
+
}
|
|
203
|
+
async canAddCheckpointProposal(proposal) {
|
|
204
|
+
// TODO(palla/mbps): Adjust checkpoint proposal limit to 1. Also connect to slashing condition in the caller.
|
|
205
|
+
return await this.checkpointProposals.hasAsync(proposal.archive.toString()) || !await this.hasReachedCheckpointProposalCap(proposal.slotNumber);
|
|
206
|
+
}
|
|
207
|
+
async canAddCheckpointAttestation(attestation, committeeSize) {
|
|
208
|
+
return await this.hasCheckpointAttestation(attestation) || !await this.hasReachedCheckpointAttestationCap(attestation.payload.header.slotNumber, attestation.archive.toString(), committeeSize);
|
|
209
|
+
}
|
|
210
|
+
async hasReachedCheckpointProposalCap(slot) {
|
|
211
|
+
const uniqueProposalCount = await this.checkpointProposalsForSlot.getValueCountAsync(slot);
|
|
212
|
+
return uniqueProposalCount >= MAX_PROPOSALS_PER_SLOT;
|
|
213
|
+
}
|
|
214
|
+
async hasReachedCheckpointAttestationCap(slot, proposalId, committeeSize) {
|
|
215
|
+
const limit = committeeSize + ATTESTATION_CAP_BUFFER;
|
|
216
|
+
return await this.checkpointAttestationsForProposal.getValueCountAsync(this.getProposalKey(slot, proposalId)) >= limit;
|
|
111
217
|
}
|
|
112
218
|
}
|
|
@@ -1,17 +1,31 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { BlockProposal, CheckpointAttestation, CheckpointProposal, CheckpointProposalCore } from '@aztec/stdlib/p2p';
|
|
2
3
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
4
|
import type { AttestationPool } from './attestation_pool.js';
|
|
4
5
|
export declare class InMemoryAttestationPool implements AttestationPool {
|
|
5
|
-
#private;
|
|
6
6
|
private log;
|
|
7
7
|
private metrics;
|
|
8
|
-
private
|
|
8
|
+
private proposals;
|
|
9
|
+
private checkpointAttestations;
|
|
10
|
+
private checkpointProposals;
|
|
9
11
|
constructor(telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
private poolStats;
|
|
13
|
+
isEmpty(): Promise<boolean>;
|
|
14
|
+
addBlockProposal(blockProposal: BlockProposal): Promise<void>;
|
|
15
|
+
getBlockProposal(id: string): Promise<BlockProposal | undefined>;
|
|
16
|
+
hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean>;
|
|
17
|
+
canAddProposal(_block: BlockProposal): Promise<boolean>;
|
|
18
|
+
addCheckpointProposal(proposal: CheckpointProposal): Promise<void>;
|
|
19
|
+
getCheckpointProposal(id: string): Promise<CheckpointProposalCore | undefined>;
|
|
20
|
+
hasCheckpointProposal(idOrProposal: string | CheckpointProposal): Promise<boolean>;
|
|
21
|
+
addCheckpointAttestations(attestations: CheckpointAttestation[]): Promise<void>;
|
|
22
|
+
getCheckpointAttestationsForSlot(slot: SlotNumber): Promise<CheckpointAttestation[]>;
|
|
23
|
+
getCheckpointAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<CheckpointAttestation[]>;
|
|
24
|
+
deleteCheckpointAttestationsOlderThan(oldestSlot: SlotNumber): Promise<void>;
|
|
25
|
+
hasReachedCheckpointProposalCap(slot: SlotNumber): Promise<boolean>;
|
|
26
|
+
hasReachedCheckpointAttestationCap(slot: SlotNumber, proposalId: string, committeeSize: number): Promise<boolean>;
|
|
27
|
+
canAddCheckpointProposal(proposal: CheckpointProposal): Promise<boolean>;
|
|
28
|
+
canAddCheckpointAttestation(attestation: CheckpointAttestation, committeeSize: number): Promise<boolean>;
|
|
29
|
+
hasCheckpointAttestation(attestation: CheckpointAttestation): Promise<boolean>;
|
|
16
30
|
}
|
|
17
|
-
//# sourceMappingURL=
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X2F0dGVzdGF0aW9uX3Bvb2wuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9tZW1vcnlfYXR0ZXN0YXRpb25fcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVsRSxPQUFPLEtBQUssRUFDVixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQixzQkFBc0IsRUFDdkIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFJbkYsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHN0QscUJBQWEsdUJBQXdCLFlBQVcsZUFBZTtJQWUzRCxPQUFPLENBQUMsR0FBRztJQWRiLE9BQU8sQ0FBQyxPQUFPLENBQTZDO0lBRTVELE9BQU8sQ0FBQyxTQUFTLENBQTZCO0lBSTlDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FHNUI7SUFDRixPQUFPLENBQUMsbUJBQW1CLENBQXNDO0lBRWpFLFlBQ0UsU0FBUyxHQUFFLGVBQXNDLEVBQ3pDLEdBQUcseUNBQXVDLEVBTW5EO0lBRUQsT0FBTyxDQUFDLFNBQVMsQ0FJZjtJQUVLLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBRWpDO0lBRU0sZ0JBQWdCLENBQUMsYUFBYSxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBSW5FO0lBRU0sZ0JBQWdCLENBQUMsRUFBRSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxDQUV0RTtJQUVNLGdCQUFnQixDQUFDLFlBQVksRUFBRSxNQUFNLEdBQUcsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FHOUU7SUFFTSxjQUFjLENBQUMsTUFBTSxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBRzdEO0lBSVkscUJBQXFCLENBQUMsUUFBUSxFQUFFLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0EyQjlFO0lBRU0scUJBQXFCLENBQUMsRUFBRSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDLENBRXBGO0lBRU0scUJBQXFCLENBQUMsWUFBWSxFQUFFLE1BQU0sR0FBRyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBR3hGO0lBRU0seUJBQXlCLENBQUMsWUFBWSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQTZCckY7SUFFTSxnQ0FBZ0MsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBTTFGO0lBRU0sMkNBQTJDLENBQ2hELElBQUksRUFBRSxVQUFVLEVBQ2hCLFVBQVUsRUFBRSxNQUFNLEdBQ2pCLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBU2xDO0lBRU0scUNBQXFDLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBa0JsRjtJQUVNLCtCQUErQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUl6RTtJQUVNLGtDQUFrQyxDQUN2QyxJQUFJLEVBQUUsVUFBVSxFQUNoQixVQUFVLEVBQUUsTUFBTSxFQUNsQixhQUFhLEVBQUUsTUFBTSxHQUNwQixPQUFPLENBQUMsT0FBTyxDQUFDLENBSWxCO0lBRVksd0JBQXdCLENBQUMsUUFBUSxFQUFFLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FLcEY7SUFFWSwyQkFBMkIsQ0FDdEMsV0FBVyxFQUFFLHFCQUFxQixFQUNsQyxhQUFhLEVBQUUsTUFBTSxHQUNwQixPQUFPLENBQUMsT0FBTyxDQUFDLENBU2xCO0lBRU0sd0JBQXdCLENBQUMsV0FBVyxFQUFFLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FxQnBGO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory_attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/memory_attestation_pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory_attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/memory_attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAInF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,qBAAa,uBAAwB,YAAW,eAAe;IAe3D,OAAO,CAAC,GAAG;IAdb,OAAO,CAAC,OAAO,CAA6C;IAE5D,OAAO,CAAC,SAAS,CAA6B;IAI9C,OAAO,CAAC,sBAAsB,CAG5B;IACF,OAAO,CAAC,mBAAmB,CAAsC;IAEjE,YACE,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAuC,EAMnD;IAED,OAAO,CAAC,SAAS,CAIf;IAEK,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAEjC;IAEM,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAInE;IAEM,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAEtE;IAEM,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAG9E;IAEM,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAG7D;IAIY,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B9E;IAEM,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAEpF;IAEM,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAGxF;IAEM,yBAAyB,CAAC,YAAY,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BrF;IAEM,gCAAgC,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAM1F;IAEM,2CAA2C,CAChD,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CASlC;IAEM,qCAAqC,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBlF;IAEM,+BAA+B,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAIzE;IAEM,kCAAkC,CACvC,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC,CAIlB;IAEY,wBAAwB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAKpF;IAEY,2BAA2B,CACtC,WAAW,EAAE,qBAAqB,EAClC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC,CASlB;IAEM,wBAAwB,CAAC,WAAW,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBpF;CACF"}
|
|
@@ -1,56 +1,117 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
3
|
+
import { ProposalSlotCapExceededError } from '../../errors/attestation-pool.error.js';
|
|
3
4
|
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
5
|
+
import { ATTESTATION_CAP_BUFFER, MAX_PROPOSALS_PER_SLOT } from './kv_attestation_pool.js';
|
|
4
6
|
export class InMemoryAttestationPool {
|
|
5
7
|
log;
|
|
6
8
|
metrics;
|
|
7
|
-
|
|
9
|
+
proposals;
|
|
10
|
+
// Checkpoint attestations
|
|
11
|
+
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
12
|
+
checkpointAttestations;
|
|
13
|
+
checkpointProposals;
|
|
8
14
|
constructor(telemetry = getTelemetryClient(), log = createLogger('p2p:attestation_pool')){
|
|
9
15
|
this.log = log;
|
|
10
|
-
this.
|
|
11
|
-
|
|
16
|
+
this.poolStats = ()=>{
|
|
17
|
+
return Promise.resolve({
|
|
18
|
+
itemCount: this.checkpointAttestations.size
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
this.proposals = new Map();
|
|
22
|
+
this.checkpointAttestations = new Map();
|
|
23
|
+
this.checkpointProposals = new Map();
|
|
24
|
+
this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL, this.poolStats);
|
|
12
25
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
26
|
+
poolStats;
|
|
27
|
+
isEmpty() {
|
|
28
|
+
return Promise.resolve(this.checkpointAttestations.size === 0 && this.proposals.size === 0);
|
|
29
|
+
}
|
|
30
|
+
addBlockProposal(blockProposal) {
|
|
31
|
+
// Strip signedTxs before storing to avoid holding full tx data in memory
|
|
32
|
+
this.proposals.set(blockProposal.archive.toString(), blockProposal.withoutSignedTxs());
|
|
33
|
+
return Promise.resolve();
|
|
34
|
+
}
|
|
35
|
+
getBlockProposal(id) {
|
|
36
|
+
return Promise.resolve(this.proposals.get(id));
|
|
37
|
+
}
|
|
38
|
+
hasBlockProposal(idOrProposal) {
|
|
39
|
+
const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.archive.toString();
|
|
40
|
+
return Promise.resolve(this.proposals.has(id));
|
|
41
|
+
}
|
|
42
|
+
canAddProposal(_block) {
|
|
43
|
+
// TODO(palla/mbps): See when to allow
|
|
44
|
+
return Promise.resolve(true);
|
|
45
|
+
}
|
|
46
|
+
// Checkpoint attestation methods
|
|
47
|
+
async addCheckpointProposal(proposal) {
|
|
48
|
+
if (!await this.canAddCheckpointProposal(proposal)) {
|
|
49
|
+
throw new ProposalSlotCapExceededError(`Maximum checkpoint proposals per slot reached: slot=${proposal.slotNumber} cap=${MAX_PROPOSALS_PER_SLOT} proposal=${proposal.archive.toString()}`);
|
|
20
50
|
}
|
|
21
|
-
|
|
51
|
+
// Extract and validate the block proposal if present
|
|
52
|
+
const blockProposal = proposal.getBlockProposal();
|
|
53
|
+
if (blockProposal && !await this.canAddProposal(blockProposal)) {
|
|
54
|
+
throw new ProposalSlotCapExceededError(`Maximum block proposals per slot reached when extracting from checkpoint: slot=${proposal.slotNumber} proposal=${blockProposal.archive.toString()}`);
|
|
55
|
+
}
|
|
56
|
+
const slotProposalMapping = getCheckpointSlotOrDefault(this.checkpointAttestations, proposal.slotNumber);
|
|
57
|
+
slotProposalMapping.set(proposal.archive.toString(), new Map());
|
|
58
|
+
// Store the checkpoint proposal as core (without lastBlock) to avoid duplication
|
|
59
|
+
this.checkpointProposals.set(proposal.archive.toString(), proposal.toCore());
|
|
60
|
+
// Store the extracted block proposal separately
|
|
61
|
+
if (blockProposal) {
|
|
62
|
+
this.proposals.set(blockProposal.archive.toString(), blockProposal.withoutSignedTxs());
|
|
63
|
+
}
|
|
64
|
+
return Promise.resolve();
|
|
65
|
+
}
|
|
66
|
+
getCheckpointProposal(id) {
|
|
67
|
+
return Promise.resolve(this.checkpointProposals.get(id));
|
|
22
68
|
}
|
|
23
|
-
|
|
69
|
+
hasCheckpointProposal(idOrProposal) {
|
|
70
|
+
const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.archive.toString();
|
|
71
|
+
return Promise.resolve(this.checkpointProposals.has(id));
|
|
72
|
+
}
|
|
73
|
+
addCheckpointAttestations(attestations) {
|
|
24
74
|
for (const attestation of attestations){
|
|
25
|
-
|
|
26
|
-
const slotNumber = attestation.payload.header.globalVariables.slotNumber;
|
|
75
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
27
76
|
const proposalId = attestation.archive.toString();
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
77
|
+
const sender = attestation.getSender();
|
|
78
|
+
// Skip attestations with invalid signatures
|
|
79
|
+
if (!sender) {
|
|
80
|
+
this.log.warn(`Skipping checkpoint attestation with invalid signature for slot ${slotNumber}`, {
|
|
81
|
+
signature: attestation.signature.toString(),
|
|
82
|
+
slotNumber,
|
|
83
|
+
proposalId
|
|
84
|
+
});
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const slotAttestationMap = getCheckpointSlotOrDefault(this.checkpointAttestations, slotNumber);
|
|
88
|
+
const proposalAttestationMap = getCheckpointProposalOrDefault(slotAttestationMap, proposalId);
|
|
89
|
+
proposalAttestationMap.set(sender.toString(), attestation);
|
|
90
|
+
this.log.verbose(`Added checkpoint attestation for slot ${slotNumber} from ${sender}`, {
|
|
91
|
+
signature: attestation.signature.toString(),
|
|
92
|
+
slotNumber,
|
|
93
|
+
address: sender,
|
|
94
|
+
proposalId
|
|
95
|
+
});
|
|
33
96
|
}
|
|
34
|
-
// TODO: set these to pending or something ????
|
|
35
|
-
this.metrics.recordAddedObjects(attestations.length);
|
|
36
97
|
return Promise.resolve();
|
|
37
98
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
99
|
+
getCheckpointAttestationsForSlot(slot) {
|
|
100
|
+
return Promise.resolve(Array.from(this.checkpointAttestations.get(slot)?.values() ?? []).flatMap((proposalAttestationMap)=>Array.from(proposalAttestationMap.values())));
|
|
101
|
+
}
|
|
102
|
+
getCheckpointAttestationsForSlotAndProposal(slot, proposalId) {
|
|
103
|
+
const slotAttestationMap = this.checkpointAttestations.get(slot);
|
|
41
104
|
if (slotAttestationMap) {
|
|
42
|
-
|
|
43
|
-
|
|
105
|
+
const proposalAttestationMap = slotAttestationMap.get(proposalId);
|
|
106
|
+
if (proposalAttestationMap) {
|
|
107
|
+
return Promise.resolve(Array.from(proposalAttestationMap.values()));
|
|
44
108
|
}
|
|
45
109
|
}
|
|
46
|
-
return
|
|
110
|
+
return Promise.resolve([]);
|
|
47
111
|
}
|
|
48
|
-
|
|
112
|
+
deleteCheckpointAttestationsOlderThan(oldestSlot) {
|
|
49
113
|
const olderThan = [];
|
|
50
|
-
|
|
51
|
-
// Note: this will only prune correctly if attestations are added in order of rising slot, it is important that we do not allow
|
|
52
|
-
// insertion of attestations that are old. #(https://github.com/AztecProtocol/aztec-packages/issues/10322)
|
|
53
|
-
const slots = this.attestations.keys();
|
|
114
|
+
const slots = this.checkpointAttestations.keys();
|
|
54
115
|
for (const slot of slots){
|
|
55
116
|
if (slot < oldestSlot) {
|
|
56
117
|
olderThan.push(slot);
|
|
@@ -59,69 +120,59 @@ export class InMemoryAttestationPool {
|
|
|
59
120
|
}
|
|
60
121
|
}
|
|
61
122
|
for (const oldSlot of olderThan){
|
|
62
|
-
|
|
123
|
+
const proposalIds = this.checkpointAttestations.get(oldSlot)?.keys();
|
|
124
|
+
proposalIds?.forEach((proposalId)=>this.checkpointProposals.delete(proposalId));
|
|
125
|
+
this.checkpointAttestations.delete(oldSlot);
|
|
63
126
|
}
|
|
64
127
|
return Promise.resolve();
|
|
65
128
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`);
|
|
71
|
-
this.metrics.recordRemovedObjects(numberOfAttestations);
|
|
72
|
-
return Promise.resolve();
|
|
129
|
+
hasReachedCheckpointProposalCap(slot) {
|
|
130
|
+
const slotAttestationMap = this.checkpointAttestations.get(slot);
|
|
131
|
+
const proposalCount = slotAttestationMap?.size ?? 0;
|
|
132
|
+
return Promise.resolve(proposalCount >= MAX_PROPOSALS_PER_SLOT);
|
|
73
133
|
}
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const numberOfAttestations = slotAttestationMap.get(proposalId)?.size ?? 0;
|
|
79
|
-
slotAttestationMap.delete(proposalId);
|
|
80
|
-
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
|
|
81
|
-
this.metrics.recordRemovedObjects(numberOfAttestations);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return Promise.resolve();
|
|
134
|
+
hasReachedCheckpointAttestationCap(slot, proposalId, committeeSize) {
|
|
135
|
+
const limit = committeeSize + ATTESTATION_CAP_BUFFER;
|
|
136
|
+
const count = this.checkpointAttestations.get(slot)?.get(proposalId)?.size ?? 0;
|
|
137
|
+
return Promise.resolve(limit <= 0 || count >= limit);
|
|
85
138
|
}
|
|
86
|
-
async
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
139
|
+
async canAddCheckpointProposal(proposal) {
|
|
140
|
+
return this.checkpointProposals.has(proposal.archive.toString()) || !await this.hasReachedCheckpointProposalCap(proposal.slotNumber);
|
|
141
|
+
}
|
|
142
|
+
async canAddCheckpointAttestation(attestation, committeeSize) {
|
|
143
|
+
const sender = attestation.getSender();
|
|
144
|
+
const slot = attestation.payload.header.slotNumber;
|
|
145
|
+
const pid = attestation.archive.toString();
|
|
146
|
+
return !!sender && ((this.checkpointAttestations.get(slot)?.get(pid)?.has(sender.toString()) ?? false) || !await this.hasReachedCheckpointAttestationCap(slot, pid, committeeSize));
|
|
147
|
+
}
|
|
148
|
+
hasCheckpointAttestation(attestation) {
|
|
149
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
150
|
+
const proposalId = attestation.archive.toString();
|
|
151
|
+
const sender = attestation.getSender();
|
|
152
|
+
// Attestations with invalid signatures are never in the pool
|
|
153
|
+
if (!sender) {
|
|
154
|
+
return Promise.resolve(false);
|
|
99
155
|
}
|
|
100
|
-
this.
|
|
101
|
-
|
|
156
|
+
const slotAttestationMap = this.checkpointAttestations.get(slotNumber);
|
|
157
|
+
if (!slotAttestationMap) {
|
|
158
|
+
return Promise.resolve(false);
|
|
159
|
+
}
|
|
160
|
+
const proposalAttestationMap = slotAttestationMap.get(proposalId);
|
|
161
|
+
if (!proposalAttestationMap) {
|
|
162
|
+
return Promise.resolve(false);
|
|
163
|
+
}
|
|
164
|
+
return Promise.resolve(proposalAttestationMap.has(sender.toString()));
|
|
102
165
|
}
|
|
103
166
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
* Fetch the slot mapping, if it does not exist, then create a mapping and return it
|
|
108
|
-
* @param map - The map to fetch from
|
|
109
|
-
* @param slot - The slot to fetch
|
|
110
|
-
* @returns The slot mapping
|
|
111
|
-
*/ function getSlotOrDefault(map, slot) {
|
|
167
|
+
// Checkpoint attestation helper functions
|
|
168
|
+
function getCheckpointSlotOrDefault(// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
169
|
+
map, slot) {
|
|
112
170
|
if (!map.has(slot)) {
|
|
113
171
|
map.set(slot, new Map());
|
|
114
172
|
}
|
|
115
173
|
return map.get(slot);
|
|
116
174
|
}
|
|
117
|
-
|
|
118
|
-
* Get Proposal or Default
|
|
119
|
-
*
|
|
120
|
-
* Fetch the proposal mapping, if it does not exist, then create a mapping and return it
|
|
121
|
-
* @param map - The map to fetch from
|
|
122
|
-
* @param proposalId - The proposal id to fetch
|
|
123
|
-
* @returns The proposal mapping
|
|
124
|
-
*/ function getProposalOrDefault(map, proposalId) {
|
|
175
|
+
function getCheckpointProposalOrDefault(map, proposalId) {
|
|
125
176
|
if (!map.has(proposalId)) {
|
|
126
177
|
map.set(proposalId, new Map());
|
|
127
178
|
}
|