@aztec/p2p 0.0.0-test.1 → 0.0.1-commit.5476d83
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 +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +22 -9
- package/dest/client/factory.d.ts +14 -4
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +60 -24
- 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 +157 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +9 -0
- package/dest/client/p2p_client.d.ts +72 -187
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +373 -177
- package/dest/config.d.ts +151 -125
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +183 -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 +68 -8
- 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 +214 -63
- package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -6
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +126 -25
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +19 -6
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +111 -21
- package/dest/mem_pools/attestation_pool/mocks.d.ts +225 -5
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +9 -15
- package/dest/mem_pools/index.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts +10 -12
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +35 -38
- package/dest/mem_pools/interface.d.ts +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +62 -13
- 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 +469 -97
- package/dest/mem_pools/tx_pool/index.d.ts +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +34 -10
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +133 -36
- package/dest/mem_pools/tx_pool/priority.d.ts +1 -1
- package/dest/mem_pools/tx_pool/priority.js +1 -1
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +65 -9
- 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 +264 -39
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -2
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +45 -9
- 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 +67 -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/block_proposal_validator/block_proposal_validator.d.ts +6 -2
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +73 -12
- package/dest/msg_validators/block_proposal_validator/index.d.ts +1 -1
- package/dest/msg_validators/index.d.ts +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/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 +1 -1
- 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 -4
- package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +56 -86
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +1 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +21 -27
- package/dest/msg_validators/tx_validator/factory.d.ts +15 -0
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/factory.js +74 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +11 -0
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/gas_validator.js +115 -0
- package/dest/msg_validators/tx_validator/index.d.ts +8 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +7 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +8 -4
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +39 -20
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +14 -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/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 +12 -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 +8 -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 +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +6 -5
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- 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 +63 -36
- package/dest/services/dummy_service.d.ts +50 -11
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +88 -5
- package/dest/services/encoding.d.ts +26 -7
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +73 -5
- 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 +164 -0
- package/dest/services/libp2p/libp2p_service.d.ts +78 -89
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +698 -246
- 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 +6 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +22 -2
- package/dest/services/peer-manager/peer_manager.d.ts +102 -22
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +549 -72
- 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 +40 -2
- 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 +2 -2
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +10 -6
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +31 -17
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +142 -84
- 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 +73 -24
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +45 -26
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- 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 +28 -5
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +30 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +75 -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 +39 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +47 -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 +75 -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 +39 -7
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +72 -5
- package/dest/services/reqresp/protocols/tx.d.ts +13 -2
- 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 +24 -66
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +298 -207
- 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 +23 -19
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +25 -0
- package/dest/services/tx_collection/config.d.ts.map +1 -0
- package/dest/services/tx_collection/config.js +58 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts +50 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/fast_tx_collection.js +300 -0
- package/dest/services/tx_collection/index.d.ts +3 -0
- package/dest/services/tx_collection/index.d.ts.map +1 -0
- package/dest/services/tx_collection/index.js +2 -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 +34 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +52 -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 +109 -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 +49 -0
- package/dest/services/tx_provider.d.ts.map +1 -0
- package/dest/services/tx_provider.js +210 -0
- package/dest/services/tx_provider_instrumentation.d.ts +13 -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 +2 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +1 -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/testbench/p2p_client_testbench_worker.d.ts +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +103 -29
- 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 +1 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +11 -19
- 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 +27 -11
- package/src/client/factory.ts +136 -45
- package/src/client/index.ts +1 -0
- package/src/client/interface.ts +198 -0
- package/src/client/p2p_client.ts +469 -330
- package/src/config.ts +305 -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 +75 -7
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +264 -65
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +173 -34
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +156 -30
- package/src/mem_pools/attestation_pool/mocks.ts +11 -10
- package/src/mem_pools/instrumentation.ts +43 -44
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +549 -108
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +153 -44
- package/src/mem_pools/tx_pool/priority.ts +1 -1
- package/src/mem_pools/tx_pool/tx_pool.ts +67 -8
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +217 -34
- package/src/msg_validators/attestation_validator/attestation_validator.ts +54 -11
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +91 -0
- package/src/msg_validators/attestation_validator/index.ts +1 -0
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +82 -14
- package/src/msg_validators/msg_seen_validator/msg_seen_validator.ts +36 -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 +4 -4
- package/src/msg_validators/tx_validator/data_validator.ts +81 -69
- package/src/msg_validators/tx_validator/double_spend_validator.ts +19 -17
- package/src/msg_validators/tx_validator/factory.ts +109 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +134 -0
- package/src/msg_validators/tx_validator/index.ts +7 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +58 -21
- package/src/msg_validators/tx_validator/phases_validator.ts +116 -0
- package/src/msg_validators/tx_validator/test_utils.ts +43 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +46 -0
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +17 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +6 -5
- package/src/services/discv5/discV5_service.ts +84 -38
- package/src/services/dummy_service.ts +147 -9
- package/src/services/encoding.ts +80 -5
- package/src/services/index.ts +4 -0
- package/src/services/libp2p/instrumentation.ts +167 -0
- package/src/services/libp2p/libp2p_service.ts +866 -294
- package/src/services/peer-manager/interface.ts +29 -0
- package/src/services/peer-manager/metrics.ts +26 -1
- package/src/services/peer-manager/peer_manager.ts +654 -78
- package/src/services/peer-manager/peer_scoring.ts +46 -3
- package/src/services/reqresp/config.ts +26 -9
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +12 -6
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +148 -95
- package/src/services/reqresp/index.ts +2 -0
- package/src/services/reqresp/interface.ts +91 -36
- package/src/services/reqresp/metrics.ts +4 -1
- package/src/services/reqresp/protocols/auth.ts +83 -0
- package/src/services/reqresp/protocols/block.ts +24 -3
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +90 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +53 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +79 -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 +117 -5
- package/src/services/reqresp/protocols/tx.ts +35 -6
- 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 +387 -256
- package/src/services/reqresp/status.ts +12 -3
- package/src/services/service.ts +45 -21
- package/src/services/tx_collection/config.ts +84 -0
- package/src/services/tx_collection/fast_tx_collection.ts +340 -0
- package/src/services/tx_collection/index.ts +2 -0
- package/src/services/tx_collection/instrumentation.ts +43 -0
- package/src/services/tx_collection/slow_tx_collection.ts +233 -0
- package/src/services/tx_collection/tx_collection.ts +215 -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 +216 -0
- package/src/services/tx_provider_instrumentation.ts +44 -0
- package/src/test-helpers/index.ts +1 -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 +86 -35
- package/src/testbench/p2p_client_testbench_worker.ts +151 -25
- package/src/testbench/parse_log_file.ts +4 -4
- package/src/testbench/testbench.ts +4 -4
- package/src/testbench/worker_client_manager.ts +17 -23
- package/src/types/index.ts +2 -0
- package/src/util.ts +105 -91
- package/src/versioning.ts +11 -4
|
@@ -1,23 +1,41 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
3
|
import { toArray } from '@aztec/foundation/iterable';
|
|
3
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
-
import { BlockAttestation } from '@aztec/stdlib/p2p';
|
|
5
|
+
import { BlockAttestation, BlockProposal } 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
15
|
attestations;
|
|
16
|
+
proposals;
|
|
12
17
|
proposalsForSlot;
|
|
13
18
|
attestationsForProposal;
|
|
14
19
|
constructor(store, telemetry = getTelemetryClient(), log = createLogger('aztec:attestation_pool')){
|
|
15
20
|
this.store = store;
|
|
16
21
|
this.log = log;
|
|
22
|
+
this.poolStats = async ()=>{
|
|
23
|
+
return {
|
|
24
|
+
itemCount: await this.attestations.sizeAsync()
|
|
25
|
+
};
|
|
26
|
+
};
|
|
17
27
|
this.attestations = store.openMap('attestations');
|
|
28
|
+
this.proposals = store.openMap('proposals');
|
|
18
29
|
this.proposalsForSlot = store.openMultiMap('proposals_for_slot');
|
|
19
30
|
this.attestationsForProposal = store.openMultiMap('attestations_for_proposal');
|
|
20
|
-
this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL);
|
|
31
|
+
this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL, this.poolStats);
|
|
32
|
+
}
|
|
33
|
+
poolStats;
|
|
34
|
+
async isEmpty() {
|
|
35
|
+
for await (const _ of this.attestations.entriesAsync()){
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
21
39
|
}
|
|
22
40
|
getProposalKey(slot, proposalId) {
|
|
23
41
|
const slotStr = typeof slot === 'string' ? slot : new Fr(slot).toString();
|
|
@@ -30,18 +48,40 @@ export class KvAttestationPool {
|
|
|
30
48
|
async addAttestations(attestations) {
|
|
31
49
|
await this.store.transactionAsync(async ()=>{
|
|
32
50
|
for (const attestation of attestations){
|
|
33
|
-
const slotNumber = attestation.payload.header.
|
|
51
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
34
52
|
const proposalId = attestation.archive;
|
|
35
|
-
const
|
|
53
|
+
const sender = attestation.getSender();
|
|
54
|
+
// Skip attestations with invalid signatures
|
|
55
|
+
if (!sender) {
|
|
56
|
+
this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber}`, {
|
|
57
|
+
signature: attestation.signature.toString(),
|
|
58
|
+
slotNumber,
|
|
59
|
+
proposalId
|
|
60
|
+
});
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const address = sender.toString();
|
|
36
64
|
await this.attestations.set(this.getAttestationKey(slotNumber, proposalId, address), attestation.toBuffer());
|
|
37
|
-
await this.proposalsForSlot.set(slotNumber
|
|
65
|
+
await this.proposalsForSlot.set(slotNumber, proposalId.toString());
|
|
38
66
|
await this.attestationsForProposal.set(this.getProposalKey(slotNumber, proposalId), this.getAttestationKey(slotNumber, proposalId, address));
|
|
39
|
-
this.log.verbose(`Added attestation for slot ${slotNumber} from ${address}
|
|
67
|
+
this.log.verbose(`Added attestation for slot ${slotNumber} from ${address}`, {
|
|
68
|
+
signature: attestation.signature.toString(),
|
|
69
|
+
slotNumber,
|
|
70
|
+
address,
|
|
71
|
+
proposalId
|
|
72
|
+
});
|
|
40
73
|
}
|
|
41
74
|
});
|
|
42
|
-
this.metrics.recordAddedObjects(attestations.length);
|
|
43
75
|
}
|
|
44
|
-
async getAttestationsForSlot(slot
|
|
76
|
+
async getAttestationsForSlot(slot) {
|
|
77
|
+
const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(slot));
|
|
78
|
+
const attestations = [];
|
|
79
|
+
for (const proposalId of proposalIds){
|
|
80
|
+
attestations.push(...await this.getAttestationsForSlotAndProposal(slot, proposalId));
|
|
81
|
+
}
|
|
82
|
+
return attestations;
|
|
83
|
+
}
|
|
84
|
+
async getAttestationsForSlotAndProposal(slot, proposalId) {
|
|
45
85
|
const attestationIds = await toArray(this.attestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)));
|
|
46
86
|
const attestations = [];
|
|
47
87
|
// alternatively iterate this.attestaions starting from slot-proposal-EthAddress.zero
|
|
@@ -58,55 +98,116 @@ export class KvAttestationPool {
|
|
|
58
98
|
}
|
|
59
99
|
async deleteAttestationsOlderThan(oldestSlot) {
|
|
60
100
|
const olderThan = await toArray(this.proposalsForSlot.keysAsync({
|
|
61
|
-
end:
|
|
101
|
+
end: oldestSlot
|
|
62
102
|
}));
|
|
63
103
|
for (const oldSlot of olderThan){
|
|
64
|
-
await this.deleteAttestationsForSlot(
|
|
104
|
+
await this.deleteAttestationsForSlot(SlotNumber(oldSlot));
|
|
65
105
|
}
|
|
66
106
|
}
|
|
67
107
|
async deleteAttestationsForSlot(slot) {
|
|
68
|
-
const slotFr = new Fr(slot);
|
|
69
108
|
let numberOfAttestations = 0;
|
|
70
109
|
await this.store.transactionAsync(async ()=>{
|
|
71
|
-
const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(
|
|
110
|
+
const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(slot));
|
|
72
111
|
for (const proposalId of proposalIds){
|
|
73
|
-
const attestations = await toArray(this.attestationsForProposal.getValuesAsync(this.getProposalKey(
|
|
112
|
+
const attestations = await toArray(this.attestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)));
|
|
74
113
|
numberOfAttestations += attestations.length;
|
|
75
114
|
for (const attestation of attestations){
|
|
76
115
|
await this.attestations.delete(attestation);
|
|
77
116
|
}
|
|
78
|
-
await this.
|
|
117
|
+
await this.proposals.delete(proposalId);
|
|
118
|
+
await this.attestationsForProposal.delete(this.getProposalKey(slot, proposalId));
|
|
79
119
|
}
|
|
120
|
+
// Delete from proposalsForSlot
|
|
121
|
+
await this.proposalsForSlot.delete(slot);
|
|
122
|
+
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`);
|
|
80
123
|
});
|
|
81
|
-
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`);
|
|
82
|
-
this.metrics.recordRemovedObjects(numberOfAttestations);
|
|
83
124
|
}
|
|
84
125
|
async deleteAttestationsForSlotAndProposal(slot, proposalId) {
|
|
85
126
|
let numberOfAttestations = 0;
|
|
86
127
|
await this.store.transactionAsync(async ()=>{
|
|
87
|
-
const slotString = new Fr(slot).toString();
|
|
88
128
|
const attestations = await toArray(this.attestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)));
|
|
89
129
|
numberOfAttestations += attestations.length;
|
|
90
130
|
for (const attestation of attestations){
|
|
91
131
|
await this.attestations.delete(attestation);
|
|
92
132
|
}
|
|
93
|
-
await this.
|
|
94
|
-
await this.
|
|
133
|
+
await this.proposals.delete(proposalId);
|
|
134
|
+
await this.proposalsForSlot.deleteValue(slot, proposalId);
|
|
135
|
+
await this.attestationsForProposal.delete(this.getProposalKey(slot, proposalId));
|
|
136
|
+
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
|
|
95
137
|
});
|
|
96
|
-
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
|
|
97
|
-
this.metrics.recordRemovedObjects(numberOfAttestations);
|
|
98
138
|
}
|
|
99
139
|
async deleteAttestations(attestations) {
|
|
100
140
|
await this.store.transactionAsync(async ()=>{
|
|
101
141
|
for (const attestation of attestations){
|
|
102
|
-
const slotNumber = attestation.payload.header.
|
|
142
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
103
143
|
const proposalId = attestation.archive;
|
|
104
|
-
const
|
|
105
|
-
|
|
144
|
+
const sender = attestation.getSender();
|
|
145
|
+
// Skip attestations with invalid signatures
|
|
146
|
+
if (!sender) {
|
|
147
|
+
this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber}`);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const address = sender.toString();
|
|
151
|
+
const key = this.getAttestationKey(slotNumber, proposalId, address);
|
|
152
|
+
if (await this.attestations.hasAsync(key)) {
|
|
153
|
+
await this.attestations.delete(key);
|
|
154
|
+
}
|
|
106
155
|
await this.attestationsForProposal.deleteValue(this.getProposalKey(slotNumber, proposalId), this.getAttestationKey(slotNumber, proposalId, address));
|
|
107
156
|
this.log.debug(`Deleted attestation for slot ${slotNumber} from ${address}`);
|
|
108
157
|
}
|
|
109
158
|
});
|
|
110
|
-
|
|
159
|
+
}
|
|
160
|
+
async hasAttestation(attestation) {
|
|
161
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
162
|
+
const proposalId = attestation.archive;
|
|
163
|
+
const sender = attestation.getSender();
|
|
164
|
+
// Attestations with invalid signatures are never in the pool
|
|
165
|
+
if (!sender) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
const address = sender.toString();
|
|
169
|
+
const key = this.getAttestationKey(slotNumber, proposalId, address);
|
|
170
|
+
return await this.attestations.hasAsync(key);
|
|
171
|
+
}
|
|
172
|
+
async getBlockProposal(id) {
|
|
173
|
+
const buffer = await this.proposals.getAsync(id);
|
|
174
|
+
try {
|
|
175
|
+
if (buffer && buffer.length > 0) {
|
|
176
|
+
return BlockProposal.fromBuffer(buffer);
|
|
177
|
+
}
|
|
178
|
+
} catch {
|
|
179
|
+
return Promise.resolve(undefined);
|
|
180
|
+
}
|
|
181
|
+
return Promise.resolve(undefined);
|
|
182
|
+
}
|
|
183
|
+
async hasBlockProposal(idOrProposal) {
|
|
184
|
+
const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.payload.archive.toString();
|
|
185
|
+
return await this.proposals.hasAsync(id);
|
|
186
|
+
}
|
|
187
|
+
async addBlockProposal(blockProposal) {
|
|
188
|
+
await this.store.transactionAsync(async ()=>{
|
|
189
|
+
const slotKey = blockProposal.slotNumber;
|
|
190
|
+
const proposalId = blockProposal.archive.toString();
|
|
191
|
+
if (!await this.canAddProposal(blockProposal)) {
|
|
192
|
+
throw new ProposalSlotCapExceededError(`Maximum proposals per slot reached: slot=${slotKey} cap=${MAX_PROPOSALS_PER_SLOT} proposal=${proposalId}`);
|
|
193
|
+
}
|
|
194
|
+
await this.proposalsForSlot.set(slotKey, proposalId);
|
|
195
|
+
// Always update the stored proposal buffer so re-adds overwrite with latest data
|
|
196
|
+
await this.proposals.set(proposalId, blockProposal.toBuffer());
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
async hasReachedProposalCap(slot) {
|
|
200
|
+
const uniqueProposalCount = await this.proposalsForSlot.getValueCountAsync(slot);
|
|
201
|
+
return uniqueProposalCount >= MAX_PROPOSALS_PER_SLOT;
|
|
202
|
+
}
|
|
203
|
+
async hasReachedAttestationCap(slot, proposalId, committeeSize) {
|
|
204
|
+
const limit = committeeSize + ATTESTATION_CAP_BUFFER;
|
|
205
|
+
return await this.attestationsForProposal.getValueCountAsync(this.getProposalKey(slot, proposalId)) >= limit;
|
|
206
|
+
}
|
|
207
|
+
async canAddProposal(block) {
|
|
208
|
+
return await this.proposals.hasAsync(block.archive.toString()) || !await this.hasReachedProposalCap(block.slotNumber);
|
|
209
|
+
}
|
|
210
|
+
async canAddAttestation(attestation, committeeSize) {
|
|
211
|
+
return await this.hasAttestation(attestation) || !await this.hasReachedAttestationCap(attestation.payload.header.slotNumber, attestation.archive.toString(), committeeSize);
|
|
111
212
|
}
|
|
112
213
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { BlockAttestation, BlockProposal } 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 {
|
|
@@ -6,12 +7,24 @@ export declare class InMemoryAttestationPool implements AttestationPool {
|
|
|
6
7
|
private log;
|
|
7
8
|
private metrics;
|
|
8
9
|
private attestations;
|
|
10
|
+
private proposals;
|
|
9
11
|
constructor(telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
10
|
-
|
|
12
|
+
private poolStats;
|
|
13
|
+
isEmpty(): Promise<boolean>;
|
|
14
|
+
getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]>;
|
|
15
|
+
getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]>;
|
|
11
16
|
addAttestations(attestations: BlockAttestation[]): Promise<void>;
|
|
12
|
-
deleteAttestationsOlderThan(oldestSlot:
|
|
13
|
-
deleteAttestationsForSlot(slot:
|
|
14
|
-
deleteAttestationsForSlotAndProposal(slot:
|
|
17
|
+
deleteAttestationsOlderThan(oldestSlot: SlotNumber): Promise<void>;
|
|
18
|
+
deleteAttestationsForSlot(slot: SlotNumber): Promise<void>;
|
|
19
|
+
deleteAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<void>;
|
|
15
20
|
deleteAttestations(attestations: BlockAttestation[]): Promise<void>;
|
|
21
|
+
hasAttestation(attestation: BlockAttestation): Promise<boolean>;
|
|
22
|
+
addBlockProposal(blockProposal: BlockProposal): Promise<void>;
|
|
23
|
+
getBlockProposal(id: string): Promise<BlockProposal | undefined>;
|
|
24
|
+
hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean>;
|
|
25
|
+
hasReachedProposalCap(slot: SlotNumber): Promise<boolean>;
|
|
26
|
+
hasReachedAttestationCap(slot: SlotNumber, proposalId: string, committeeSize: number): Promise<boolean>;
|
|
27
|
+
canAddProposal(block: BlockProposal): Promise<boolean>;
|
|
28
|
+
canAddAttestation(attestation: BlockAttestation, committeeSize: number): Promise<boolean>;
|
|
16
29
|
}
|
|
17
|
-
//# sourceMappingURL=
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X2F0dGVzdGF0aW9uX3Bvb2wuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9tZW1vcnlfYXR0ZXN0YXRpb25fcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVsRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFHbkYsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHN0QscUJBQWEsdUJBQXdCLFlBQVcsZUFBZTs7SUFZM0QsT0FBTyxDQUFDLEdBQUc7SUFYYixPQUFPLENBQUMsT0FBTyxDQUF3QztJQUd2RCxPQUFPLENBQUMsWUFBWSxDQUdsQjtJQUNGLE9BQU8sQ0FBQyxTQUFTLENBQTZCO0lBRTlDLFlBQ0UsU0FBUyxHQUFFLGVBQXNDLEVBQ3pDLEdBQUcseUNBQXVDLEVBS25EO0lBRUQsT0FBTyxDQUFDLFNBQVMsQ0FJZjtJQUVLLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBRWpDO0lBRU0sc0JBQXNCLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQU0zRTtJQUVNLGlDQUFpQyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQVMxRztJQUVNLGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBK0J0RTtJQWNZLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQW1COUU7SUFFTSx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FnQmhFO0lBRU0sb0NBQW9DLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FjL0Y7SUFFTSxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBc0J6RTtJQUVNLGNBQWMsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQXFCckU7SUFFTSxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FRbkU7SUFFTSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDLENBRXRFO0lBRU0sZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE1BQU0sR0FBRyxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUc5RTtJQUVNLHFCQUFxQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUkvRDtJQUVNLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FJN0c7SUFFWSxjQUFjLENBQUMsS0FBSyxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBRWxFO0lBRVksaUJBQWlCLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQVNyRztDQUNGIn0=
|
|
@@ -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,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAGnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,qBAAa,uBAAwB,YAAW,eAAe;;IAY3D,OAAO,CAAC,GAAG;IAXb,OAAO,CAAC,OAAO,CAAwC;IAGvD,OAAO,CAAC,YAAY,CAGlB;IACF,OAAO,CAAC,SAAS,CAA6B;IAE9C,YACE,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAuC,EAKnD;IAED,OAAO,CAAC,SAAS,CAIf;IAEK,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAEjC;IAEM,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAM3E;IAEM,iCAAiC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAS1G;IAEM,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BtE;IAcY,2BAA2B,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB9E;IAEM,yBAAyB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhE;IAEM,oCAAoC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/F;IAEM,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBzE;IAEM,cAAc,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBrE;IAEM,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnE;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,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAI/D;IAEM,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI7G;IAEY,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAElE;IAEY,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrG;CACF"}
|
|
@@ -1,16 +1,32 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
3
3
|
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
4
|
+
import { ATTESTATION_CAP_BUFFER, MAX_PROPOSALS_PER_SLOT } from './kv_attestation_pool.js';
|
|
4
5
|
export class InMemoryAttestationPool {
|
|
5
6
|
log;
|
|
6
7
|
metrics;
|
|
8
|
+
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
7
9
|
attestations;
|
|
10
|
+
proposals;
|
|
8
11
|
constructor(telemetry = getTelemetryClient(), log = createLogger('p2p:attestation_pool')){
|
|
9
12
|
this.log = log;
|
|
13
|
+
this.poolStats = ()=>{
|
|
14
|
+
return Promise.resolve({
|
|
15
|
+
itemCount: this.attestations.size
|
|
16
|
+
});
|
|
17
|
+
};
|
|
10
18
|
this.attestations = new Map();
|
|
11
|
-
this.
|
|
19
|
+
this.proposals = new Map();
|
|
20
|
+
this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL, this.poolStats);
|
|
12
21
|
}
|
|
13
|
-
|
|
22
|
+
poolStats;
|
|
23
|
+
isEmpty() {
|
|
24
|
+
return Promise.resolve(this.attestations.size === 0);
|
|
25
|
+
}
|
|
26
|
+
getAttestationsForSlot(slot) {
|
|
27
|
+
return Promise.resolve(Array.from(this.attestations.get(slot)?.values() ?? []).flatMap((proposalAttestationMap)=>Array.from(proposalAttestationMap.values())));
|
|
28
|
+
}
|
|
29
|
+
getAttestationsForSlotAndProposal(slot, proposalId) {
|
|
14
30
|
const slotAttestationMap = this.attestations.get(slot);
|
|
15
31
|
if (slotAttestationMap) {
|
|
16
32
|
const proposalAttestationMap = slotAttestationMap.get(proposalId);
|
|
@@ -20,19 +36,31 @@ export class InMemoryAttestationPool {
|
|
|
20
36
|
}
|
|
21
37
|
return Promise.resolve([]);
|
|
22
38
|
}
|
|
23
|
-
|
|
39
|
+
addAttestations(attestations) {
|
|
24
40
|
for (const attestation of attestations){
|
|
25
41
|
// Perf: order and group by slot before insertion
|
|
26
|
-
const slotNumber = attestation.payload.header.
|
|
42
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
27
43
|
const proposalId = attestation.archive.toString();
|
|
28
|
-
const
|
|
29
|
-
|
|
44
|
+
const sender = attestation.getSender();
|
|
45
|
+
// Skip attestations with invalid signatures
|
|
46
|
+
if (!sender) {
|
|
47
|
+
this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber}`, {
|
|
48
|
+
signature: attestation.signature.toString(),
|
|
49
|
+
slotNumber,
|
|
50
|
+
proposalId
|
|
51
|
+
});
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const slotAttestationMap = getSlotOrDefault(this.attestations, slotNumber);
|
|
30
55
|
const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
|
|
31
|
-
proposalAttestationMap.set(
|
|
32
|
-
this.log.verbose(`Added attestation for slot ${slotNumber} from ${
|
|
56
|
+
proposalAttestationMap.set(sender.toString(), attestation);
|
|
57
|
+
this.log.verbose(`Added attestation for slot ${slotNumber} from ${sender}`, {
|
|
58
|
+
signature: attestation.signature.toString(),
|
|
59
|
+
slotNumber,
|
|
60
|
+
address: sender,
|
|
61
|
+
proposalId
|
|
62
|
+
});
|
|
33
63
|
}
|
|
34
|
-
// TODO: set these to pending or something ????
|
|
35
|
-
this.metrics.recordAddedObjects(attestations.length);
|
|
36
64
|
return Promise.resolve();
|
|
37
65
|
}
|
|
38
66
|
#getNumberOfAttestationsInSlot(slot) {
|
|
@@ -66,9 +94,14 @@ export class InMemoryAttestationPool {
|
|
|
66
94
|
deleteAttestationsForSlot(slot) {
|
|
67
95
|
// We count the number of attestations we are removing
|
|
68
96
|
const numberOfAttestations = this.#getNumberOfAttestationsInSlot(slot);
|
|
97
|
+
const proposalIdsToDelete = this.attestations.get(slot)?.keys();
|
|
98
|
+
let proposalIdsToDeleteCount = 0;
|
|
99
|
+
proposalIdsToDelete?.forEach((proposalId)=>{
|
|
100
|
+
this.proposals.delete(proposalId);
|
|
101
|
+
proposalIdsToDeleteCount++;
|
|
102
|
+
});
|
|
69
103
|
this.attestations.delete(slot);
|
|
70
|
-
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`);
|
|
71
|
-
this.metrics.recordRemovedObjects(numberOfAttestations);
|
|
104
|
+
this.log.verbose(`Removed ${numberOfAttestations} attestations and ${proposalIdsToDeleteCount} proposals for slot ${slot}`);
|
|
72
105
|
return Promise.resolve();
|
|
73
106
|
}
|
|
74
107
|
deleteAttestationsForSlotAndProposal(slot, proposalId) {
|
|
@@ -78,28 +111,84 @@ export class InMemoryAttestationPool {
|
|
|
78
111
|
const numberOfAttestations = slotAttestationMap.get(proposalId)?.size ?? 0;
|
|
79
112
|
slotAttestationMap.delete(proposalId);
|
|
80
113
|
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
|
|
81
|
-
this.metrics.recordRemovedObjects(numberOfAttestations);
|
|
82
114
|
}
|
|
83
115
|
}
|
|
116
|
+
this.proposals.delete(proposalId);
|
|
84
117
|
return Promise.resolve();
|
|
85
118
|
}
|
|
86
|
-
|
|
119
|
+
deleteAttestations(attestations) {
|
|
87
120
|
for (const attestation of attestations){
|
|
88
|
-
const slotNumber = attestation.payload.header.
|
|
89
|
-
const slotAttestationMap = this.attestations.get(slotNumber
|
|
121
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
122
|
+
const slotAttestationMap = this.attestations.get(slotNumber);
|
|
90
123
|
if (slotAttestationMap) {
|
|
91
124
|
const proposalId = attestation.archive.toString();
|
|
92
125
|
const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
|
|
93
126
|
if (proposalAttestationMap) {
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
127
|
+
const sender = attestation.getSender();
|
|
128
|
+
// Skip attestations with invalid signatures
|
|
129
|
+
if (!sender) {
|
|
130
|
+
this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber}`);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
proposalAttestationMap.delete(sender.toString());
|
|
134
|
+
this.log.debug(`Deleted attestation for slot ${slotNumber} from ${sender}`);
|
|
97
135
|
}
|
|
98
136
|
}
|
|
99
137
|
}
|
|
100
|
-
this.metrics.recordRemovedObjects(attestations.length);
|
|
101
138
|
return Promise.resolve();
|
|
102
139
|
}
|
|
140
|
+
hasAttestation(attestation) {
|
|
141
|
+
const slotNumber = attestation.payload.header.slotNumber;
|
|
142
|
+
const proposalId = attestation.archive.toString();
|
|
143
|
+
const sender = attestation.getSender();
|
|
144
|
+
// Attestations with invalid signatures are never in the pool
|
|
145
|
+
if (!sender) {
|
|
146
|
+
return Promise.resolve(false);
|
|
147
|
+
}
|
|
148
|
+
const slotAttestationMap = this.attestations.get(slotNumber);
|
|
149
|
+
if (!slotAttestationMap) {
|
|
150
|
+
return Promise.resolve(false);
|
|
151
|
+
}
|
|
152
|
+
const proposalAttestationMap = slotAttestationMap.get(proposalId);
|
|
153
|
+
if (!proposalAttestationMap) {
|
|
154
|
+
return Promise.resolve(false);
|
|
155
|
+
}
|
|
156
|
+
return Promise.resolve(proposalAttestationMap.has(sender.toString()));
|
|
157
|
+
}
|
|
158
|
+
addBlockProposal(blockProposal) {
|
|
159
|
+
// We initialize slot-proposal mapping if it does not exist
|
|
160
|
+
// This is important to ensure we can delete this proposal if there were not attestations for it
|
|
161
|
+
const slotProposalMapping = getSlotOrDefault(this.attestations, blockProposal.slotNumber);
|
|
162
|
+
slotProposalMapping.set(blockProposal.payload.archive.toString(), new Map());
|
|
163
|
+
this.proposals.set(blockProposal.payload.archive.toString(), blockProposal);
|
|
164
|
+
return Promise.resolve();
|
|
165
|
+
}
|
|
166
|
+
getBlockProposal(id) {
|
|
167
|
+
return Promise.resolve(this.proposals.get(id));
|
|
168
|
+
}
|
|
169
|
+
hasBlockProposal(idOrProposal) {
|
|
170
|
+
const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.payload.archive.toString();
|
|
171
|
+
return Promise.resolve(this.proposals.has(id));
|
|
172
|
+
}
|
|
173
|
+
hasReachedProposalCap(slot) {
|
|
174
|
+
const slotAttestationMap = this.attestations.get(slot);
|
|
175
|
+
const proposalCount = slotAttestationMap?.size ?? 0;
|
|
176
|
+
return Promise.resolve(proposalCount >= MAX_PROPOSALS_PER_SLOT);
|
|
177
|
+
}
|
|
178
|
+
hasReachedAttestationCap(slot, proposalId, committeeSize) {
|
|
179
|
+
const limit = committeeSize + ATTESTATION_CAP_BUFFER;
|
|
180
|
+
const count = this.attestations.get(slot)?.get(proposalId)?.size ?? 0;
|
|
181
|
+
return Promise.resolve(limit <= 0 || count >= limit);
|
|
182
|
+
}
|
|
183
|
+
async canAddProposal(block) {
|
|
184
|
+
return this.proposals.has(block.archive.toString()) || !await this.hasReachedProposalCap(block.slotNumber);
|
|
185
|
+
}
|
|
186
|
+
async canAddAttestation(attestation, committeeSize) {
|
|
187
|
+
const sender = attestation.getSender();
|
|
188
|
+
const slot = attestation.payload.header.slotNumber;
|
|
189
|
+
const pid = attestation.archive.toString();
|
|
190
|
+
return !!sender && ((this.attestations.get(slot)?.get(pid)?.has(sender.toString()) ?? false) || !await this.hasReachedAttestationCap(slot, pid, committeeSize));
|
|
191
|
+
}
|
|
103
192
|
}
|
|
104
193
|
/**
|
|
105
194
|
* Get Slot or Default
|
|
@@ -108,7 +197,8 @@ export class InMemoryAttestationPool {
|
|
|
108
197
|
* @param map - The map to fetch from
|
|
109
198
|
* @param slot - The slot to fetch
|
|
110
199
|
* @returns The slot mapping
|
|
111
|
-
*/ function getSlotOrDefault(
|
|
200
|
+
*/ function getSlotOrDefault(// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
201
|
+
map, slot) {
|
|
112
202
|
if (!map.has(slot)) {
|
|
113
203
|
map.set(slot, new Map());
|
|
114
204
|
}
|