@aztec/p2p 3.0.0-devnet.5 → 3.0.0-devnet.6-patch.1
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/client/factory.d.ts +1 -1
- package/dest/client/index.d.ts +1 -1
- package/dest/client/interface.d.ts +4 -2
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +8 -26
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +31 -24
- package/dest/config.d.ts +60 -54
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +12 -2
- package/dest/enr/generate-enr.d.ts +1 -1
- 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 +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +43 -6
- 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 +67 -34
- package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +15 -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 +57 -18
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +13 -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 +51 -7
- package/dest/mem_pools/attestation_pool/mocks.d.ts +226 -5
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +2 -2
- package/dest/mem_pools/index.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts +3 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +11 -2
- package/dest/mem_pools/interface.d.ts +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +5 -38
- 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 +9 -3
- package/dest/mem_pools/tx_pool/index.d.ts +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +5 -3
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +7 -0
- package/dest/mem_pools/tx_pool/priority.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +10 -3
- 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 +5 -4
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +12 -12
- 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 +1 -1
- 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 +22 -10
- 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 +1 -1
- package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -1
- 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 +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +2 -2
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- 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/double_spend_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.d.ts +4 -3
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +2 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -1
- package/dest/msg_validators/tx_validator/test_utils.d.ts +2 -2
- package/dest/msg_validators/tx_validator/test_utils.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- 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/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 +1 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/dummy_service.d.ts +1 -1
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/encoding.d.ts +25 -4
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +74 -6
- package/dest/services/gossipsub/scoring.d.ts +1 -1
- package/dest/services/index.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts +3 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +9 -2
- package/dest/services/libp2p/libp2p_service.d.ts +25 -74
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +308 -84
- package/dest/services/peer-manager/interface.d.ts +1 -1
- package/dest/services/peer-manager/metrics.d.ts +3 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +11 -0
- package/dest/services/peer-manager/peer_manager.d.ts +1 -32
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +4 -2
- 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 +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +1 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/index.d.ts +1 -1
- package/dest/services/reqresp/interface.d.ts +2 -2
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +1 -1
- 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 +2 -2
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/auth.js +2 -2
- package/dest/services/reqresp/protocols/block.d.ts +1 -1
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block.js +3 -2
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +4 -6
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +1 -1
- package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.d.ts +1 -1
- package/dest/services/reqresp/protocols/ping.d.ts +1 -1
- package/dest/services/reqresp/protocols/status.d.ts +6 -5
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +4 -3
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +2 -2
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts +1 -41
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +2 -2
- package/dest/services/reqresp/status.d.ts +2 -2
- package/dest/services/reqresp/status.d.ts.map +1 -1
- package/dest/services/service.d.ts +1 -1
- package/dest/services/tx_collection/config.d.ts +1 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +4 -9
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/index.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.d.ts +6 -7
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +2 -1
- package/dest/services/tx_collection/tx_collection.d.ts +11 -11
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.d.ts +3 -3
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.d.ts +1 -1
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_provider.d.ts +5 -4
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/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 +1 -1
- package/dest/test-helpers/make-enrs.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts +2 -2
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.d.ts +4 -4
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
- package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
- package/dest/test-helpers/mock-tx-helpers.js +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +14 -8
- package/dest/testbench/parse_log_file.d.ts +1 -1
- package/dest/testbench/testbench.d.ts +1 -1
- package/dest/testbench/testbench.js +2 -2
- package/dest/testbench/worker_client_manager.d.ts +1 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/types/index.d.ts +1 -1
- package/dest/util.d.ts +2 -1
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +11 -2
- package/dest/versioning.d.ts +1 -1
- package/package.json +19 -18
- package/src/client/interface.ts +4 -1
- package/src/client/p2p_client.ts +51 -43
- package/src/config.ts +19 -2
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +46 -5
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +84 -34
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +87 -24
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +77 -15
- package/src/mem_pools/attestation_pool/mocks.ts +3 -3
- package/src/mem_pools/instrumentation.ts +13 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +15 -9
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +13 -6
- package/src/mem_pools/tx_pool/tx_pool.ts +10 -2
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +5 -4
- package/src/msg_validators/attestation_validator/attestation_validator.ts +14 -16
- 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 +26 -10
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/block_header_validator.ts +1 -1
- package/src/msg_validators/tx_validator/factory.ts +3 -2
- package/src/msg_validators/tx_validator/metadata_validator.ts +1 -1
- package/src/msg_validators/tx_validator/phases_validator.ts +3 -1
- package/src/msg_validators/tx_validator/test_utils.ts +1 -1
- package/src/msg_validators/tx_validator/timestamp_validator.ts +2 -1
- package/src/services/encoding.ts +81 -6
- package/src/services/libp2p/instrumentation.ts +10 -1
- package/src/services/libp2p/libp2p_service.ts +334 -91
- package/src/services/peer-manager/metrics.ts +10 -0
- package/src/services/peer-manager/peer_manager.ts +4 -2
- package/src/services/peer-manager/peer_scoring.ts +46 -3
- package/src/services/reqresp/interface.ts +1 -1
- package/src/services/reqresp/protocols/auth.ts +2 -2
- package/src/services/reqresp/protocols/block.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +1 -1
- package/src/services/reqresp/protocols/status.ts +9 -8
- package/src/services/reqresp/reqresp.ts +2 -2
- package/src/services/tx_collection/fast_tx_collection.ts +3 -2
- package/src/services/tx_collection/slow_tx_collection.ts +7 -6
- package/src/services/tx_collection/tx_collection.ts +10 -9
- package/src/services/tx_provider.ts +4 -3
- package/src/test-helpers/mock-tx-helpers.ts +1 -1
- package/src/testbench/p2p_client_testbench_worker.ts +11 -5
- package/src/testbench/testbench.ts +2 -2
- package/src/util.ts +12 -2
|
@@ -25,4 +25,4 @@ export declare class CollectiveReqRespTimeoutError extends Error {
|
|
|
25
25
|
export declare class InvalidResponseError extends Error {
|
|
26
26
|
constructor();
|
|
27
27
|
}
|
|
28
|
-
//# sourceMappingURL=
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxcmVzcC5lcnJvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy9yZXFyZXNwLmVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxxQkFBYSw2QkFBOEIsU0FBUSxLQUFLO0lBQ3RELGNBRUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxxQkFBYSw2QkFBOEIsU0FBUSxLQUFLO0lBQ3RELGNBRUM7Q0FDRjtBQUVEOzs7Ozs7O0dBT0c7QUFDSCxxQkFBYSxvQkFBcUIsU0FBUSxLQUFLO0lBQzdDLGNBRUM7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reqresp.error.d.ts","sourceRoot":"","sources":["../../src/errors/reqresp.error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,KAAK
|
|
1
|
+
{"version":3,"file":"reqresp.error.d.ts","sourceRoot":"","sources":["../../src/errors/reqresp.error.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,cAEC;CACF;AAED;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,cAEC;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,cAEC;CACF"}
|
package/dest/index.d.ts
CHANGED
|
@@ -8,4 +8,4 @@ export * from './mem_pools/attestation_pool/index.js';
|
|
|
8
8
|
export * from './mem_pools/tx_pool/index.js';
|
|
9
9
|
export * from './msg_validators/index.js';
|
|
10
10
|
export * from './services/index.js';
|
|
11
|
-
//# sourceMappingURL=
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxxQkFBcUIsQ0FBQyJ9
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import type { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
|
|
2
3
|
/**
|
|
3
4
|
* An Attestation Pool contains attestations collected by a validator
|
|
@@ -18,6 +19,14 @@ export interface AttestationPool {
|
|
|
18
19
|
* @return The block proposal if it exists, otherwise undefined.
|
|
19
20
|
*/
|
|
20
21
|
getBlockProposal(id: string): Promise<BlockProposal | undefined>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a block proposal exists in the pool
|
|
24
|
+
*
|
|
25
|
+
* @param idOrProposal - The ID of the block proposal or the block proposal itself to check. The ID is proposal.payload.archive
|
|
26
|
+
*
|
|
27
|
+
* @return True if the block proposal exists, false otherwise.
|
|
28
|
+
*/
|
|
29
|
+
hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean>;
|
|
21
30
|
/**
|
|
22
31
|
* AddAttestations
|
|
23
32
|
*
|
|
@@ -37,7 +46,7 @@ export interface AttestationPool {
|
|
|
37
46
|
*
|
|
38
47
|
* @param slot - The oldest slot to keep.
|
|
39
48
|
*/
|
|
40
|
-
deleteAttestationsOlderThan(slot:
|
|
49
|
+
deleteAttestationsOlderThan(slot: SlotNumber): Promise<void>;
|
|
41
50
|
/**
|
|
42
51
|
* Delete Attestations for slot
|
|
43
52
|
*
|
|
@@ -45,7 +54,7 @@ export interface AttestationPool {
|
|
|
45
54
|
*
|
|
46
55
|
* @param slot - The slot to delete.
|
|
47
56
|
*/
|
|
48
|
-
deleteAttestationsForSlot(slot:
|
|
57
|
+
deleteAttestationsForSlot(slot: SlotNumber): Promise<void>;
|
|
49
58
|
/**
|
|
50
59
|
* Delete Attestations for slot and proposal
|
|
51
60
|
*
|
|
@@ -54,7 +63,7 @@ export interface AttestationPool {
|
|
|
54
63
|
* @param slot - The slot to delete.
|
|
55
64
|
* @param proposalId - The proposal to delete.
|
|
56
65
|
*/
|
|
57
|
-
deleteAttestationsForSlotAndProposal(slot:
|
|
66
|
+
deleteAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<void>;
|
|
58
67
|
/**
|
|
59
68
|
* Get all Attestations for all proposals for a given slot
|
|
60
69
|
*
|
|
@@ -63,7 +72,7 @@ export interface AttestationPool {
|
|
|
63
72
|
* @param slot - The slot to query
|
|
64
73
|
* @return BlockAttestations
|
|
65
74
|
*/
|
|
66
|
-
getAttestationsForSlot(slot:
|
|
75
|
+
getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]>;
|
|
67
76
|
/**
|
|
68
77
|
* Get Attestations for slot and given proposal
|
|
69
78
|
*
|
|
@@ -73,8 +82,36 @@ export interface AttestationPool {
|
|
|
73
82
|
* @param proposalId - The proposal to query
|
|
74
83
|
* @return BlockAttestations
|
|
75
84
|
*/
|
|
76
|
-
getAttestationsForSlotAndProposal(slot:
|
|
85
|
+
getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Check if a specific attestation exists in the pool
|
|
88
|
+
*
|
|
89
|
+
* @param attestation - The attestation to check
|
|
90
|
+
* @return True if the attestation exists, false otherwise
|
|
91
|
+
*/
|
|
92
|
+
hasAttestation(attestation: BlockAttestation): Promise<boolean>;
|
|
93
|
+
/**
|
|
94
|
+
* Returns whether adding this proposal is permitted at current capacity:
|
|
95
|
+
* - True if the proposal already exists, allow overwrite to keep parity with tests.
|
|
96
|
+
* - True if the slot is below the proposal cap.
|
|
97
|
+
* - False if the slot is at/above cap and this would be a new unique proposal.
|
|
98
|
+
*
|
|
99
|
+
* @param block - The block proposal to check
|
|
100
|
+
* @returns True if the proposal can be added (or already exists), false otherwise.
|
|
101
|
+
*/
|
|
102
|
+
canAddProposal(block: BlockProposal): Promise<boolean>;
|
|
103
|
+
/**
|
|
104
|
+
* Returns whether an attestation would be accepted for (slot, proposalId):
|
|
105
|
+
* - True if the attestation already exists for this sender.
|
|
106
|
+
* - True if the attestation cap for (slot, proposalId) has not been reached.
|
|
107
|
+
* - False if the cap is reached and this attestation would be a new unique entry.
|
|
108
|
+
*
|
|
109
|
+
* @param attestation - The attestation to check
|
|
110
|
+
* @param committeeSize - Committee size for the attestation's slot, implementation may add a small buffer
|
|
111
|
+
* @returns True if the attestation can be added, false otherwise.
|
|
112
|
+
*/
|
|
113
|
+
canAddAttestation(attestation: BlockAttestation, committeeSize: number): Promise<boolean>;
|
|
77
114
|
/** Returns whether the pool is empty. */
|
|
78
115
|
isEmpty(): Promise<boolean>;
|
|
79
116
|
}
|
|
80
|
-
//# sourceMappingURL=
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy9hdHRlc3RhdGlvbl9wb29sL2F0dGVzdGF0aW9uX3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFekU7Ozs7O0dBS0c7QUFDSCxNQUFNLFdBQVcsZUFBZTtJQUM5Qjs7T0FFRztJQUNILGdCQUFnQixDQUFDLGFBQWEsRUFBRSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTlEOzs7Ozs7T0FNRztJQUNILGdCQUFnQixDQUFDLEVBQUUsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUVqRTs7Ozs7O09BTUc7SUFDSCxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxHQUFHLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFekU7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFakU7Ozs7T0FJRztJQUNILGtCQUFrQixDQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwRTs7Ozs7O09BTUc7SUFDSCwyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU3RDs7Ozs7O09BTUc7SUFDSCx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUUzRDs7Ozs7OztPQU9HO0lBQ0gsb0NBQW9DLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUUxRjs7Ozs7OztPQU9HO0lBQ0gsc0JBQXNCLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBRXRFOzs7Ozs7OztPQVFHO0lBQ0gsaUNBQWlDLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFFckc7Ozs7O09BS0c7SUFDSCxjQUFjLENBQUMsV0FBVyxFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUVoRTs7Ozs7Ozs7T0FRRztJQUNILGNBQWMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV2RDs7Ozs7Ozs7O09BU0c7SUFDSCxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFMUYseUNBQXlDO0lBQ3pDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Q0FDN0IifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IAEjE;;;;OAIG;IACH,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;;;OAIG;IACH,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE;;;;;;OAMG;IACH,2BAA2B,CAAC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IAEjE;;;;;;OAMG;IACH,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEzE;;;;OAIG;IACH,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;;;OAIG;IACH,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE;;;;;;OAMG;IACH,2BAA2B,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7D;;;;;;OAMG;IACH,yBAAyB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D;;;;;;;OAOG;IACH,oCAAoC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1F;;;;;;;OAOG;IACH,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAEtE;;;;;;;;OAQG;IACH,iCAAiC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAErG;;;;;OAKG;IACH,cAAc,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhE;;;;;;;;OAQG;IACH,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvD;;;;;;;;;OASG;IACH,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1F,yCAAyC;IACzC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7B"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { AttestationPool } from './attestation_pool.js';
|
|
2
2
|
export declare function describeAttestationPool(getAttestationPool: () => AttestationPool): void;
|
|
3
|
-
//# sourceMappingURL=
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL2F0dGVzdGF0aW9uX3Bvb2wvYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUs3RCx3QkFBZ0IsdUJBQXVCLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLFFBc1poRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attestation_pool_test_suite.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool_test_suite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"attestation_pool_test_suite.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool_test_suite.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,wBAAgB,uBAAuB,CAAC,kBAAkB,EAAE,MAAM,eAAe,QAsZhF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
3
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
4
|
import { BlockProposal as BlockProposalClass, ConsensusPayload, SignatureDomainSeparator, getHashedSignaturePayloadEthSignedMessage } from '@aztec/stdlib/p2p';
|
|
4
5
|
import { makeL2BlockHeader } from '@aztec/stdlib/testing';
|
|
5
6
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
@@ -27,7 +28,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
27
28
|
};
|
|
28
29
|
const mockBlockProposal = (signer, slotNumber, archive = Fr.random())=>{
|
|
29
30
|
const header = makeL2BlockHeader(1, 2, slotNumber);
|
|
30
|
-
const payload = new ConsensusPayload(header.toCheckpointHeader(), archive
|
|
31
|
+
const payload = new ConsensusPayload(header.toCheckpointHeader(), archive);
|
|
31
32
|
const hash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockProposal);
|
|
32
33
|
const signature = signer.sign(hash);
|
|
33
34
|
const txHashes = [
|
|
@@ -49,10 +50,14 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
49
50
|
const archive = Fr.random();
|
|
50
51
|
const attestations = signers.slice(0, -1).map((signer)=>mockAttestation(signer, slotNumber, archive));
|
|
51
52
|
await ap.addAttestations(attestations);
|
|
52
|
-
const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
53
|
+
const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
|
|
53
54
|
expect(retrievedAttestations.length).toBe(attestations.length);
|
|
54
55
|
compareAttestations(retrievedAttestations, attestations);
|
|
55
|
-
|
|
56
|
+
// Check hasAttestation for added attestations
|
|
57
|
+
for (const attestation of attestations){
|
|
58
|
+
expect(await ap.hasAttestation(attestation)).toBe(true);
|
|
59
|
+
}
|
|
60
|
+
const retrievedAttestationsForSlot = await ap.getAttestationsForSlot(SlotNumber(slotNumber));
|
|
56
61
|
expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
|
|
57
62
|
compareAttestations(retrievedAttestationsForSlot, attestations);
|
|
58
63
|
// Add another one
|
|
@@ -60,22 +65,28 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
60
65
|
await ap.addAttestations([
|
|
61
66
|
newAttestation
|
|
62
67
|
]);
|
|
63
|
-
const retrievedAttestationsAfterAdd = await ap.getAttestationsForSlotAndProposal(
|
|
68
|
+
const retrievedAttestationsAfterAdd = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
|
|
64
69
|
expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
|
|
65
70
|
compareAttestations(retrievedAttestationsAfterAdd, [
|
|
66
71
|
...attestations,
|
|
67
72
|
newAttestation
|
|
68
73
|
]);
|
|
69
|
-
|
|
74
|
+
expect(await ap.hasAttestation(newAttestation)).toBe(true);
|
|
75
|
+
const retrievedAttestationsForSlotAfterAdd = await ap.getAttestationsForSlot(SlotNumber(slotNumber));
|
|
70
76
|
expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
|
|
71
77
|
compareAttestations(retrievedAttestationsForSlotAfterAdd, [
|
|
72
78
|
...attestations,
|
|
73
79
|
newAttestation
|
|
74
80
|
]);
|
|
75
81
|
// Delete by slot
|
|
76
|
-
await ap.deleteAttestationsForSlot(
|
|
77
|
-
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
|
|
82
|
+
await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
|
|
83
|
+
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
|
|
78
84
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
85
|
+
// Check hasAttestation after deletion
|
|
86
|
+
for (const attestation of attestations){
|
|
87
|
+
expect(await ap.hasAttestation(attestation)).toBe(false);
|
|
88
|
+
}
|
|
89
|
+
expect(await ap.hasAttestation(newAttestation)).toBe(false);
|
|
79
90
|
});
|
|
80
91
|
it('should handle duplicate proposals in a slot', async ()=>{
|
|
81
92
|
const slotNumber = 420;
|
|
@@ -88,7 +99,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
88
99
|
}
|
|
89
100
|
// Add them to store and check we end up with only one
|
|
90
101
|
await ap.addAttestations(attestations);
|
|
91
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
102
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
|
|
92
103
|
expect(retreivedAttestations.length).toBe(1);
|
|
93
104
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
|
|
94
105
|
expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
|
|
@@ -96,7 +107,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
96
107
|
await ap.addAttestations([
|
|
97
108
|
attestations[0]
|
|
98
109
|
]);
|
|
99
|
-
expect(await ap.getAttestationsForSlotAndProposal(
|
|
110
|
+
expect(await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString())).toHaveLength(1);
|
|
100
111
|
});
|
|
101
112
|
it('should store attestations by differing slot', async ()=>{
|
|
102
113
|
const slotNumbers = [
|
|
@@ -110,7 +121,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
110
121
|
for (const attestation of attestations){
|
|
111
122
|
const slot = attestation.payload.header.slotNumber;
|
|
112
123
|
const archive = attestation.archive.toString();
|
|
113
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot
|
|
124
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot, archive);
|
|
114
125
|
expect(retreivedAttestations.length).toBe(1);
|
|
115
126
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
116
127
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -134,7 +145,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
134
145
|
for (const attestation of attestations){
|
|
135
146
|
const slot = attestation.payload.header.slotNumber;
|
|
136
147
|
const proposalId = attestation.archive.toString();
|
|
137
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot
|
|
148
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot, proposalId);
|
|
138
149
|
expect(retreivedAttestations.length).toBe(1);
|
|
139
150
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
140
151
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -146,12 +157,20 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
146
157
|
const attestations = signers.map((signer)=>mockAttestation(signer, slotNumber, archive));
|
|
147
158
|
const proposalId = attestations[0].archive.toString();
|
|
148
159
|
await ap.addAttestations(attestations);
|
|
149
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
160
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
150
161
|
expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
|
|
151
162
|
compareAttestations(retreivedAttestations, attestations);
|
|
163
|
+
// Check hasAttestation before deletion
|
|
164
|
+
for (const attestation of attestations){
|
|
165
|
+
expect(await ap.hasAttestation(attestation)).toBe(true);
|
|
166
|
+
}
|
|
152
167
|
await ap.deleteAttestations(attestations);
|
|
153
|
-
const gottenAfterDelete = await ap.getAttestationsForSlotAndProposal(
|
|
168
|
+
const gottenAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
154
169
|
expect(gottenAfterDelete.length).toBe(0);
|
|
170
|
+
// Check hasAttestation after deletion
|
|
171
|
+
for (const attestation of attestations){
|
|
172
|
+
expect(await ap.hasAttestation(attestation)).toBe(false);
|
|
173
|
+
}
|
|
155
174
|
});
|
|
156
175
|
it('should blanket delete attestations per slot', async ()=>{
|
|
157
176
|
const slotNumber = 420;
|
|
@@ -159,11 +178,11 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
159
178
|
const attestations = signers.map((signer)=>mockAttestation(signer, slotNumber, archive));
|
|
160
179
|
const proposalId = attestations[0].archive.toString();
|
|
161
180
|
await ap.addAttestations(attestations);
|
|
162
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
181
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
163
182
|
expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
|
|
164
183
|
compareAttestations(retreivedAttestations, attestations);
|
|
165
|
-
await ap.deleteAttestationsForSlot(
|
|
166
|
-
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
|
|
184
|
+
await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
|
|
185
|
+
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
167
186
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
168
187
|
});
|
|
169
188
|
it('should blanket delete attestations per slot and proposal', async ()=>{
|
|
@@ -177,13 +196,13 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
177
196
|
const proposalId2 = attestations2[0].archive.toString();
|
|
178
197
|
await ap.addAttestations(attestations);
|
|
179
198
|
await ap.addAttestations(attestations2);
|
|
180
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
199
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
181
200
|
expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
|
|
182
201
|
compareAttestations(retreivedAttestations, attestations);
|
|
183
|
-
await ap.deleteAttestationsForSlotAndProposal(
|
|
184
|
-
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
|
|
202
|
+
await ap.deleteAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
203
|
+
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
185
204
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
186
|
-
const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlotAndProposal(
|
|
205
|
+
const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId2);
|
|
187
206
|
expect(retreivedAttestationsAfterDeleteForOtherProposal.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
|
|
188
207
|
compareAttestations(retreivedAttestationsAfterDeleteForOtherProposal, attestations2);
|
|
189
208
|
});
|
|
@@ -201,18 +220,18 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
201
220
|
const attestations = (await Promise.all(slotNumbers.map((slotNumber)=>createAttestationsForSlot(slotNumber)))).flat();
|
|
202
221
|
const proposalId = attestations[0].archive.toString();
|
|
203
222
|
await ap.addAttestations(attestations);
|
|
204
|
-
const attestationsForSlot1 = await ap.getAttestationsForSlotAndProposal(
|
|
223
|
+
const attestationsForSlot1 = await ap.getAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
|
|
205
224
|
expect(attestationsForSlot1.length).toBe(signers.length);
|
|
206
225
|
const deleteAttestationsSpy = jest.spyOn(ap, 'deleteAttestationsForSlot');
|
|
207
|
-
await ap.deleteAttestationsOlderThan(
|
|
208
|
-
const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlotAndProposal(
|
|
226
|
+
await ap.deleteAttestationsOlderThan(SlotNumber(73));
|
|
227
|
+
const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
|
|
209
228
|
expect(attestationsForSlot1AfterDelete.length).toBe(0);
|
|
210
229
|
expect(deleteAttestationsSpy).toHaveBeenCalledTimes(5);
|
|
211
|
-
expect(deleteAttestationsSpy).toHaveBeenCalledWith(
|
|
212
|
-
expect(deleteAttestationsSpy).toHaveBeenCalledWith(
|
|
213
|
-
expect(deleteAttestationsSpy).toHaveBeenCalledWith(
|
|
214
|
-
expect(deleteAttestationsSpy).toHaveBeenCalledWith(
|
|
215
|
-
expect(deleteAttestationsSpy).toHaveBeenCalledWith(
|
|
230
|
+
expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(1));
|
|
231
|
+
expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(2));
|
|
232
|
+
expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(3));
|
|
233
|
+
expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(69));
|
|
234
|
+
expect(deleteAttestationsSpy).toHaveBeenCalledWith(SlotNumber(72));
|
|
216
235
|
});
|
|
217
236
|
describe('BlockProposal in attestation pool', ()=>{
|
|
218
237
|
it('should add and retrieve block proposal', async ()=>{
|
|
@@ -224,11 +243,16 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
224
243
|
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
225
244
|
expect(retrievedProposal).toBeDefined();
|
|
226
245
|
expect(retrievedProposal).toEqual(proposal);
|
|
246
|
+
// Check hasBlockProposal with both id and object
|
|
247
|
+
expect(await ap.hasBlockProposal(proposalId)).toBe(true);
|
|
248
|
+
expect(await ap.hasBlockProposal(proposal)).toBe(true);
|
|
227
249
|
});
|
|
228
250
|
it('should return undefined for non-existent block proposal', async ()=>{
|
|
229
251
|
const nonExistentId = Fr.random().toString();
|
|
230
252
|
const retrievedProposal = await ap.getBlockProposal(nonExistentId);
|
|
231
253
|
expect(retrievedProposal).toBeUndefined();
|
|
254
|
+
// Check hasBlockProposal returns false for non-existent proposal
|
|
255
|
+
expect(await ap.hasBlockProposal(nonExistentId)).toBe(false);
|
|
232
256
|
});
|
|
233
257
|
it('should update block proposal if added twice with same id', async ()=>{
|
|
234
258
|
const slotNumber = 420;
|
|
@@ -256,7 +280,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
256
280
|
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
257
281
|
expect(retrievedProposal).toBeDefined();
|
|
258
282
|
expect(retrievedProposal.toBuffer()).toEqual(proposal2.toBuffer());
|
|
259
|
-
expect(retrievedProposal.slotNumber
|
|
283
|
+
expect(retrievedProposal.slotNumber).toBe(SlotNumber(200));
|
|
260
284
|
});
|
|
261
285
|
it('should delete block proposal when deleting attestations for slot and proposal', async ()=>{
|
|
262
286
|
const slotNumber = 420;
|
|
@@ -270,11 +294,13 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
270
294
|
// Verify proposal exists
|
|
271
295
|
let retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
272
296
|
expect(retrievedProposal).toBeDefined();
|
|
297
|
+
expect(await ap.hasBlockProposal(proposalId)).toBe(true);
|
|
273
298
|
// Delete attestations for slot and proposal
|
|
274
|
-
await ap.deleteAttestationsForSlotAndProposal(
|
|
299
|
+
await ap.deleteAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
275
300
|
// Proposal should be deleted
|
|
276
301
|
retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
277
302
|
expect(retrievedProposal).toBeUndefined();
|
|
303
|
+
expect(await ap.hasBlockProposal(proposalId)).toBe(false);
|
|
278
304
|
});
|
|
279
305
|
it('should delete block proposal when deleting attestations for slot', async ()=>{
|
|
280
306
|
const slotNumber = 420;
|
|
@@ -286,11 +312,13 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
286
312
|
// Verify proposal exists
|
|
287
313
|
let retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
288
314
|
expect(retrievedProposal).toBeDefined();
|
|
315
|
+
expect(await ap.hasBlockProposal(proposal)).toBe(true);
|
|
289
316
|
// Delete attestations for slot
|
|
290
|
-
await ap.deleteAttestationsForSlot(
|
|
317
|
+
await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
|
|
291
318
|
// Proposal should be deleted
|
|
292
319
|
retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
293
320
|
expect(retrievedProposal).toBeUndefined();
|
|
321
|
+
expect(await ap.hasBlockProposal(proposal)).toBe(false);
|
|
294
322
|
});
|
|
295
323
|
it('should be able to fetch both block proposal and attestations', async ()=>{
|
|
296
324
|
const slotNumber = 420;
|
|
@@ -304,10 +332,15 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
304
332
|
await ap.addAttestations(attestations);
|
|
305
333
|
// Retrieve both proposal and attestations
|
|
306
334
|
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
307
|
-
const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
335
|
+
const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
308
336
|
expect(retrievedProposal).toBeDefined();
|
|
309
337
|
expect(retrievedProposal).toEqual(proposal);
|
|
338
|
+
expect(await ap.hasBlockProposal(proposalId)).toBe(true);
|
|
310
339
|
compareAttestations(retrievedAttestations, attestations);
|
|
340
|
+
// Check hasAttestation for all attestations
|
|
341
|
+
for (const attestation of attestations){
|
|
342
|
+
expect(await ap.hasAttestation(attestation)).toBe(true);
|
|
343
|
+
}
|
|
311
344
|
});
|
|
312
345
|
});
|
|
313
346
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * from './attestation_pool.js';
|
|
2
2
|
export * from './memory_attestation_pool.js';
|
|
3
|
-
//# sourceMappingURL=
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsOEJBQThCLENBQUMifQ==
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
2
3
|
import { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
|
|
3
4
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
4
5
|
import type { AttestationPool } from './attestation_pool.js';
|
|
6
|
+
export declare const MAX_PROPOSALS_PER_SLOT = 5;
|
|
7
|
+
export declare const ATTESTATION_CAP_BUFFER = 10;
|
|
5
8
|
export declare class KvAttestationPool implements AttestationPool {
|
|
6
9
|
private store;
|
|
7
10
|
private log;
|
|
@@ -16,13 +19,19 @@ export declare class KvAttestationPool implements AttestationPool {
|
|
|
16
19
|
private getProposalKey;
|
|
17
20
|
private getAttestationKey;
|
|
18
21
|
addAttestations(attestations: BlockAttestation[]): Promise<void>;
|
|
19
|
-
getAttestationsForSlot(slot:
|
|
20
|
-
getAttestationsForSlotAndProposal(slot:
|
|
21
|
-
deleteAttestationsOlderThan(oldestSlot:
|
|
22
|
-
deleteAttestationsForSlot(slot:
|
|
23
|
-
deleteAttestationsForSlotAndProposal(slot:
|
|
22
|
+
getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]>;
|
|
23
|
+
getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]>;
|
|
24
|
+
deleteAttestationsOlderThan(oldestSlot: SlotNumber): Promise<void>;
|
|
25
|
+
deleteAttestationsForSlot(slot: SlotNumber): Promise<void>;
|
|
26
|
+
deleteAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<void>;
|
|
24
27
|
deleteAttestations(attestations: BlockAttestation[]): Promise<void>;
|
|
28
|
+
hasAttestation(attestation: BlockAttestation): Promise<boolean>;
|
|
25
29
|
getBlockProposal(id: string): Promise<BlockProposal | undefined>;
|
|
30
|
+
hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean>;
|
|
26
31
|
addBlockProposal(blockProposal: BlockProposal): Promise<void>;
|
|
32
|
+
hasReachedProposalCap(slot: SlotNumber): Promise<boolean>;
|
|
33
|
+
hasReachedAttestationCap(slot: SlotNumber, proposalId: string, committeeSize: number): Promise<boolean>;
|
|
34
|
+
canAddProposal(block: BlockProposal): Promise<boolean>;
|
|
35
|
+
canAddAttestation(attestation: BlockAttestation, committeeSize: number): Promise<boolean>;
|
|
27
36
|
}
|
|
28
|
-
//# sourceMappingURL=
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3ZfYXR0ZXN0YXRpb25fcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy9hdHRlc3RhdGlvbl9wb29sL2t2X2F0dGVzdGF0aW9uX3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSTdELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFxQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFJbkYsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0QsZUFBTyxNQUFNLHNCQUFzQixJQUFJLENBQUM7QUFDeEMsZUFBTyxNQUFNLHNCQUFzQixLQUFLLENBQUM7QUFFekMscUJBQWEsaUJBQWtCLFlBQVcsZUFBZTtJQVlyRCxPQUFPLENBQUMsS0FBSztJQUViLE9BQU8sQ0FBQyxHQUFHO0lBYmIsT0FBTyxDQUFDLE9BQU8sQ0FBd0M7SUFFdkQsT0FBTyxDQUFDLFlBQVksQ0FBZ0M7SUFDcEQsT0FBTyxDQUFDLFNBQVMsQ0FHZjtJQUNGLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBcUM7SUFDN0QsT0FBTyxDQUFDLHVCQUF1QixDQUFxQztJQUVwRSxZQUNVLEtBQUssRUFBRSxpQkFBaUIsRUFDaEMsU0FBUyxHQUFFLGVBQXNDLEVBQ3pDLEdBQUcseUNBQXlDLEVBUXJEO0lBRUQsT0FBTyxDQUFDLFNBQVMsQ0FJZjtJQUVXLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBS3ZDO0lBRUQsT0FBTyxDQUFDLGNBQWM7SUFZdEIsT0FBTyxDQUFDLGlCQUFpQjtJQUlaLGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBbUM1RTtJQUVZLHNCQUFzQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FTakY7SUFFWSxpQ0FBaUMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FvQmhIO0lBRVksMkJBQTJCLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBSzlFO0lBRVkseUJBQXlCLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBdUJ0RTtJQUVZLG9DQUFvQyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBa0JyRztJQUVZLGtCQUFrQixDQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0E0Qi9FO0lBRVksY0FBYyxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBYzNFO0lBRVksZ0JBQWdCLENBQUMsRUFBRSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxDQVc1RTtJQUVZLGdCQUFnQixDQUFDLFlBQVksRUFBRSxNQUFNLEdBQUcsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FHcEY7SUFFWSxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FlekU7SUFFWSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FHckU7SUFFWSx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBR25IO0lBRVksY0FBYyxDQUFDLEtBQUssRUFBRSxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUlsRTtJQUVZLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FTckc7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kv_attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/kv_attestation_pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"kv_attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/kv_attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAI7D,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAInF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,qBAAa,iBAAkB,YAAW,eAAe;IAYrD,OAAO,CAAC,KAAK;IAEb,OAAO,CAAC,GAAG;IAbb,OAAO,CAAC,OAAO,CAAwC;IAEvD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,SAAS,CAGf;IACF,OAAO,CAAC,gBAAgB,CAAqC;IAC7D,OAAO,CAAC,uBAAuB,CAAqC;IAEpE,YACU,KAAK,EAAE,iBAAiB,EAChC,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAyC,EAQrD;IAED,OAAO,CAAC,SAAS,CAIf;IAEW,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAKvC;IAED,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IAIZ,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC5E;IAEY,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CASjF;IAEY,iCAAiC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoBhH;IAEY,2BAA2B,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9E;IAEY,yBAAyB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBtE;IAEY,oCAAoC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBrG;IAEY,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B/E;IAEY,cAAc,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAc3E;IAEY,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAW5E;IAEY,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAGpF;IAEY,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAezE;IAEY,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAGrE;IAEY,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGnH;IAEY,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAIlE;IAEY,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrG;CACF"}
|
|
@@ -1,9 +1,13 @@
|
|
|
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
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;
|
|
@@ -49,7 +53,7 @@ export class KvAttestationPool {
|
|
|
49
53
|
const sender = attestation.getSender();
|
|
50
54
|
// Skip attestations with invalid signatures
|
|
51
55
|
if (!sender) {
|
|
52
|
-
this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber
|
|
56
|
+
this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber}`, {
|
|
53
57
|
signature: attestation.signature.toString(),
|
|
54
58
|
slotNumber,
|
|
55
59
|
proposalId
|
|
@@ -58,9 +62,9 @@ export class KvAttestationPool {
|
|
|
58
62
|
}
|
|
59
63
|
const address = sender.toString();
|
|
60
64
|
await this.attestations.set(this.getAttestationKey(slotNumber, proposalId, address), attestation.toBuffer());
|
|
61
|
-
await this.proposalsForSlot.set(slotNumber
|
|
65
|
+
await this.proposalsForSlot.set(slotNumber, proposalId.toString());
|
|
62
66
|
await this.attestationsForProposal.set(this.getProposalKey(slotNumber, proposalId), this.getAttestationKey(slotNumber, proposalId, address));
|
|
63
|
-
this.log.verbose(`Added attestation for slot ${slotNumber
|
|
67
|
+
this.log.verbose(`Added attestation for slot ${slotNumber} from ${address}`, {
|
|
64
68
|
signature: attestation.signature.toString(),
|
|
65
69
|
slotNumber,
|
|
66
70
|
address,
|
|
@@ -70,8 +74,7 @@ export class KvAttestationPool {
|
|
|
70
74
|
});
|
|
71
75
|
}
|
|
72
76
|
async getAttestationsForSlot(slot) {
|
|
73
|
-
const
|
|
74
|
-
const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(slotFr.toString()));
|
|
77
|
+
const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(slot));
|
|
75
78
|
const attestations = [];
|
|
76
79
|
for (const proposalId of proposalIds){
|
|
77
80
|
attestations.push(...await this.getAttestationsForSlotAndProposal(slot, proposalId));
|
|
@@ -95,41 +98,41 @@ export class KvAttestationPool {
|
|
|
95
98
|
}
|
|
96
99
|
async deleteAttestationsOlderThan(oldestSlot) {
|
|
97
100
|
const olderThan = await toArray(this.proposalsForSlot.keysAsync({
|
|
98
|
-
end:
|
|
101
|
+
end: oldestSlot
|
|
99
102
|
}));
|
|
100
103
|
for (const oldSlot of olderThan){
|
|
101
|
-
await this.deleteAttestationsForSlot(
|
|
104
|
+
await this.deleteAttestationsForSlot(SlotNumber(oldSlot));
|
|
102
105
|
}
|
|
103
106
|
}
|
|
104
107
|
async deleteAttestationsForSlot(slot) {
|
|
105
|
-
const slotFr = new Fr(slot);
|
|
106
108
|
let numberOfAttestations = 0;
|
|
107
109
|
await this.store.transactionAsync(async ()=>{
|
|
108
|
-
const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(
|
|
110
|
+
const proposalIds = await toArray(this.proposalsForSlot.getValuesAsync(slot));
|
|
109
111
|
for (const proposalId of proposalIds){
|
|
110
|
-
const attestations = await toArray(this.attestationsForProposal.getValuesAsync(this.getProposalKey(
|
|
112
|
+
const attestations = await toArray(this.attestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)));
|
|
111
113
|
numberOfAttestations += attestations.length;
|
|
112
114
|
for (const attestation of attestations){
|
|
113
115
|
await this.attestations.delete(attestation);
|
|
114
116
|
}
|
|
115
117
|
await this.proposals.delete(proposalId);
|
|
116
|
-
await this.attestationsForProposal.delete(this.getProposalKey(
|
|
118
|
+
await this.attestationsForProposal.delete(this.getProposalKey(slot, proposalId));
|
|
117
119
|
}
|
|
120
|
+
// Delete from proposalsForSlot
|
|
121
|
+
await this.proposalsForSlot.delete(slot);
|
|
118
122
|
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`);
|
|
119
123
|
});
|
|
120
124
|
}
|
|
121
125
|
async deleteAttestationsForSlotAndProposal(slot, proposalId) {
|
|
122
126
|
let numberOfAttestations = 0;
|
|
123
127
|
await this.store.transactionAsync(async ()=>{
|
|
124
|
-
const slotString = new Fr(slot).toString();
|
|
125
128
|
const attestations = await toArray(this.attestationsForProposal.getValuesAsync(this.getProposalKey(slot, proposalId)));
|
|
126
129
|
numberOfAttestations += attestations.length;
|
|
127
130
|
for (const attestation of attestations){
|
|
128
131
|
await this.attestations.delete(attestation);
|
|
129
132
|
}
|
|
130
133
|
await this.proposals.delete(proposalId);
|
|
131
|
-
await this.proposalsForSlot.deleteValue(
|
|
132
|
-
await this.attestationsForProposal.delete(this.getProposalKey(
|
|
134
|
+
await this.proposalsForSlot.deleteValue(slot, proposalId);
|
|
135
|
+
await this.attestationsForProposal.delete(this.getProposalKey(slot, proposalId));
|
|
133
136
|
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
|
|
134
137
|
});
|
|
135
138
|
}
|
|
@@ -141,7 +144,7 @@ export class KvAttestationPool {
|
|
|
141
144
|
const sender = attestation.getSender();
|
|
142
145
|
// Skip attestations with invalid signatures
|
|
143
146
|
if (!sender) {
|
|
144
|
-
this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber
|
|
147
|
+
this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber}`);
|
|
145
148
|
continue;
|
|
146
149
|
}
|
|
147
150
|
const address = sender.toString();
|
|
@@ -154,6 +157,18 @@ export class KvAttestationPool {
|
|
|
154
157
|
}
|
|
155
158
|
});
|
|
156
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
|
+
}
|
|
157
172
|
async getBlockProposal(id) {
|
|
158
173
|
const buffer = await this.proposals.getAsync(id);
|
|
159
174
|
try {
|
|
@@ -165,10 +180,34 @@ export class KvAttestationPool {
|
|
|
165
180
|
}
|
|
166
181
|
return Promise.resolve(undefined);
|
|
167
182
|
}
|
|
183
|
+
async hasBlockProposal(idOrProposal) {
|
|
184
|
+
const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.payload.archive.toString();
|
|
185
|
+
return await this.proposals.hasAsync(id);
|
|
186
|
+
}
|
|
168
187
|
async addBlockProposal(blockProposal) {
|
|
169
188
|
await this.store.transactionAsync(async ()=>{
|
|
170
|
-
|
|
171
|
-
|
|
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());
|
|
172
197
|
});
|
|
173
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);
|
|
212
|
+
}
|
|
174
213
|
}
|