@aztec/p2p 0.0.1-commit.87a0206 → 0.0.1-commit.8f9871590
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/client/factory.d.ts +3 -3
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +42 -8
- package/dest/client/interface.d.ts +30 -15
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +33 -35
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +107 -137
- package/dest/config.d.ts +22 -4
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +16 -1
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +21 -12
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +67 -37
- 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 +53 -53
- package/dest/mem_pools/attestation_pool/index.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/index.js +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts +2 -2
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +2 -2
- package/dest/mem_pools/index.d.ts +2 -1
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/interface.d.ts +3 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +3 -3
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +102 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +242 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +3 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +5 -3
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +3 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +3 -1
- package/dest/mem_pools/tx_pool_v2/index.d.ts +2 -1
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +7 -3
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +28 -4
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +37 -4
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +8 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +15 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +6 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +4 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +110 -78
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +3 -3
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +16 -3
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +13 -3
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +4 -4
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +20 -4
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +6 -6
- package/dest/services/dummy_service.d.ts +6 -2
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +3 -0
- package/dest/services/encoding.d.ts +2 -2
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +2 -2
- package/dest/services/gossipsub/index.d.ts +3 -0
- package/dest/services/gossipsub/index.d.ts.map +1 -0
- package/dest/services/gossipsub/index.js +2 -0
- package/dest/services/gossipsub/scoring.d.ts +21 -3
- package/dest/services/gossipsub/scoring.d.ts.map +1 -1
- package/dest/services/gossipsub/scoring.js +24 -7
- package/dest/services/gossipsub/topic_score_params.d.ts +161 -0
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -0
- package/dest/services/gossipsub/topic_score_params.js +324 -0
- package/dest/services/libp2p/libp2p_service.d.ts +11 -3
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +91 -67
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +25 -2
- package/dest/services/reqresp/interface.d.ts +10 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +15 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +3 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +7 -1
- 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 +15 -0
- package/dest/services/reqresp/protocols/tx.d.ts +7 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +11 -4
- package/dest/services/service.d.ts +18 -1
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +19 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +46 -0
- package/dest/services/tx_collection/fast_tx_collection.d.ts +3 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +17 -3
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +53 -0
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_collection.js +165 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts +28 -0
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -0
- package/dest/services/tx_collection/file_store_tx_source.js +59 -0
- package/dest/services/tx_collection/index.d.ts +2 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +6 -2
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/slow_tx_collection.js +55 -23
- package/dest/services/tx_collection/tx_collection.d.ts +19 -7
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +75 -3
- package/dest/services/tx_collection/tx_collection_sink.d.ts +15 -6
- package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +13 -7
- package/dest/services/tx_file_store/config.d.ts +1 -3
- package/dest/services/tx_file_store/config.d.ts.map +1 -1
- package/dest/services/tx_file_store/config.js +0 -4
- package/dest/services/tx_file_store/tx_file_store.d.ts +4 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +8 -5
- package/dest/services/tx_provider.d.ts +3 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +5 -4
- package/dest/test-helpers/make-test-p2p-clients.d.ts +3 -3
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.d.ts +27 -1
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +97 -2
- package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +2 -1
- package/dest/test-helpers/testbench-utils.d.ts +32 -24
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +103 -36
- package/dest/testbench/p2p_client_testbench_worker.js +3 -3
- package/package.json +14 -14
- package/src/client/factory.ts +78 -9
- package/src/client/interface.ts +32 -13
- package/src/client/p2p_client.ts +135 -157
- package/src/config.ts +34 -2
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +95 -44
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +57 -53
- package/src/mem_pools/attestation_pool/index.ts +3 -3
- package/src/mem_pools/attestation_pool/mocks.ts +2 -1
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/interface.ts +2 -2
- package/src/mem_pools/tx_pool/README.md +1 -1
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/README.md +76 -10
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +310 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +3 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +1 -1
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +3 -1
- package/src/mem_pools/tx_pool_v2/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +8 -2
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +57 -7
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +18 -2
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +7 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +122 -80
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +2 -2
- package/src/msg_validators/tx_validator/block_header_validator.ts +15 -3
- package/src/msg_validators/tx_validator/double_spend_validator.ts +11 -6
- package/src/msg_validators/tx_validator/timestamp_validator.ts +23 -18
- package/src/services/dummy_service.ts +6 -0
- package/src/services/encoding.ts +2 -2
- package/src/services/gossipsub/README.md +626 -0
- package/src/services/gossipsub/index.ts +2 -0
- package/src/services/gossipsub/scoring.ts +29 -5
- package/src/services/gossipsub/topic_score_params.ts +451 -0
- package/src/services/libp2p/libp2p_service.ts +91 -70
- package/src/services/peer-manager/peer_scoring.ts +25 -0
- package/src/services/reqresp/interface.ts +26 -1
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +17 -0
- package/src/services/reqresp/protocols/tx.ts +22 -0
- package/src/services/reqresp/reqresp.ts +13 -3
- package/src/services/service.ts +20 -0
- package/src/services/tx_collection/config.ts +68 -0
- package/src/services/tx_collection/fast_tx_collection.ts +14 -2
- package/src/services/tx_collection/file_store_tx_collection.ts +198 -0
- package/src/services/tx_collection/file_store_tx_source.ts +73 -0
- package/src/services/tx_collection/index.ts +1 -0
- package/src/services/tx_collection/slow_tx_collection.ts +64 -30
- package/src/services/tx_collection/tx_collection.ts +109 -13
- package/src/services/tx_collection/tx_collection_sink.ts +17 -7
- package/src/services/tx_file_store/config.ts +0 -6
- package/src/services/tx_file_store/tx_file_store.ts +9 -7
- package/src/services/tx_provider.ts +8 -7
- package/src/test-helpers/make-test-p2p-clients.ts +3 -3
- package/src/test-helpers/mock-pubsub.ts +133 -3
- package/src/test-helpers/reqresp-nodes.ts +2 -1
- package/src/test-helpers/testbench-utils.ts +117 -40
- package/src/testbench/p2p_client_testbench_worker.ts +3 -3
|
@@ -8,14 +8,18 @@ export type TryAddResult = {
|
|
|
8
8
|
added: boolean;
|
|
9
9
|
/** Whether the exact item already existed */
|
|
10
10
|
alreadyExists: boolean;
|
|
11
|
-
/**
|
|
12
|
-
|
|
11
|
+
/** Count of items for the position. Meaning varies by method:
|
|
12
|
+
* - tryAddBlockProposal: proposals at (slot, indexWithinCheckpoint)
|
|
13
|
+
* - tryAddCheckpointProposal: proposals at slot
|
|
14
|
+
* - tryAddCheckpointAttestation: attestations by this signer for this slot */
|
|
15
|
+
count: number;
|
|
13
16
|
};
|
|
14
|
-
export declare const
|
|
15
|
-
export declare const
|
|
16
|
-
|
|
17
|
+
export declare const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 5;
|
|
18
|
+
export declare const MAX_BLOCK_PROPOSALS_PER_POSITION = 3;
|
|
19
|
+
/** Maximum attestations a single signer can make per slot before being rejected. */
|
|
20
|
+
export declare const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 3;
|
|
17
21
|
/** Public API interface for attestation pools. Used for typing mocks and test implementations. */
|
|
18
|
-
export type AttestationPoolApi = Pick<AttestationPool, 'tryAddBlockProposal' | 'getBlockProposal' | 'tryAddCheckpointProposal' | 'getCheckpointProposal' | 'addOwnCheckpointAttestations' | 'tryAddCheckpointAttestation' | 'deleteOlderThan' | 'getCheckpointAttestationsForSlot' | 'getCheckpointAttestationsForSlotAndProposal' | 'isEmpty'>;
|
|
22
|
+
export type AttestationPoolApi = Pick<AttestationPool, 'tryAddBlockProposal' | 'getBlockProposal' | 'tryAddCheckpointProposal' | 'getCheckpointProposal' | 'addOwnCheckpointAttestations' | 'tryAddCheckpointAttestation' | 'deleteOlderThan' | 'getCheckpointAttestationsForSlot' | 'getCheckpointAttestationsForSlotAndProposal' | 'hasBlockProposalsForSlot' | 'isEmpty'>;
|
|
19
23
|
/**
|
|
20
24
|
* Pool for storing attestations and proposals collected by a validator.
|
|
21
25
|
*
|
|
@@ -31,6 +35,7 @@ export declare class AttestationPool {
|
|
|
31
35
|
private checkpointProposalsForSlot;
|
|
32
36
|
private blockProposals;
|
|
33
37
|
private blockProposalsForSlotAndIndex;
|
|
38
|
+
private checkpointAttestationsPerSlotAndSigner;
|
|
34
39
|
constructor(store: AztecAsyncKVStore, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
35
40
|
private poolStats;
|
|
36
41
|
/** Returns whether the pool is empty. */
|
|
@@ -41,6 +46,8 @@ export declare class AttestationPool {
|
|
|
41
46
|
private getAttestationKeyRangeForSlot;
|
|
42
47
|
/** Returns range bounds for querying all attestations for a given (slot, proposalId). */
|
|
43
48
|
private getAttestationKeyRangeForProposal;
|
|
49
|
+
/** Creates a key for the per-signer-per-slot attestation index. Uses padded slot for lexicographic ordering. */
|
|
50
|
+
private getSlotSignerKey;
|
|
44
51
|
/** Number of bits reserved for indexWithinCheckpoint in position keys. */
|
|
45
52
|
private static readonly INDEX_BITS;
|
|
46
53
|
/** Maximum indexWithinCheckpoint value (2^10 - 1 = 1023). */
|
|
@@ -70,6 +77,8 @@ export declare class AttestationPool {
|
|
|
70
77
|
* @return The block proposal if it exists, otherwise undefined.
|
|
71
78
|
*/
|
|
72
79
|
getBlockProposal(id: string): Promise<BlockProposal | undefined>;
|
|
80
|
+
/** Checks if any block proposals exist for a given slot (at index 0). */
|
|
81
|
+
hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean>;
|
|
73
82
|
/**
|
|
74
83
|
* Attempts to add a checkpoint proposal to the pool.
|
|
75
84
|
*
|
|
@@ -128,16 +137,16 @@ export declare class AttestationPool {
|
|
|
128
137
|
*
|
|
129
138
|
* This method performs validation and addition in a single call:
|
|
130
139
|
* - Checks if the attestation already exists (returns alreadyExists: true if so)
|
|
131
|
-
* - Checks if
|
|
140
|
+
* - Checks if this signer has reached the per-signer attestation cap for this slot
|
|
132
141
|
* - Adds the attestation if validation passes
|
|
133
142
|
*
|
|
134
143
|
* @param attestation - The checkpoint attestation to add
|
|
135
|
-
* @
|
|
136
|
-
*
|
|
144
|
+
* @returns Result indicating whether the attestation was added, existence info, and count of
|
|
145
|
+
* attestations by this signer for this slot (for equivocation detection)
|
|
137
146
|
*/
|
|
138
|
-
tryAddCheckpointAttestation(attestation: CheckpointAttestation
|
|
139
|
-
private
|
|
147
|
+
tryAddCheckpointAttestation(attestation: CheckpointAttestation): Promise<TryAddResult>;
|
|
148
|
+
private getSignerAttestationCountForSlot;
|
|
140
149
|
}
|
|
141
150
|
/** Creates an AttestationPool backed by a temporary store for testing. */
|
|
142
151
|
export declare function createTestAttestationPool(telemetry?: TelemetryClient): Promise<AttestationPool>;
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy9hdHRlc3RhdGlvbl9wb29sL2F0dGVzdGF0aW9uX3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF5QixVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUlwRixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RixPQUFPLEVBQ0wsYUFBYSxFQUNiLHFCQUFxQixFQUVyQixLQUFLLHNCQUFzQixFQUM1QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUluRiw0RUFBNEU7QUFDNUUsTUFBTSxNQUFNLFlBQVksR0FBRztJQUN6QixpQ0FBaUM7SUFDakMsS0FBSyxFQUFFLE9BQU8sQ0FBQztJQUNmLDZDQUE2QztJQUM3QyxhQUFhLEVBQUUsT0FBTyxDQUFDO0lBQ3ZCOzs7bUZBRytFO0lBQy9FLEtBQUssRUFBRSxNQUFNLENBQUM7Q0FDZixDQUFDO0FBRUYsZUFBTyxNQUFNLGlDQUFpQyxJQUFJLENBQUM7QUFDbkQsZUFBTyxNQUFNLGdDQUFnQyxJQUFJLENBQUM7QUFDbEQsb0ZBQW9GO0FBQ3BGLGVBQU8sTUFBTSxvQ0FBb0MsSUFBSSxDQUFDO0FBRXRELGtHQUFrRztBQUNsRyxNQUFNLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUNuQyxlQUFlLEVBQ2IscUJBQXFCLEdBQ3JCLGtCQUFrQixHQUNsQiwwQkFBMEIsR0FDMUIsdUJBQXVCLEdBQ3ZCLDhCQUE4QixHQUM5Qiw2QkFBNkIsR0FDN0IsaUJBQWlCLEdBQ2pCLGtDQUFrQyxHQUNsQyw2Q0FBNkMsR0FDN0MsMEJBQTBCLEdBQzFCLFNBQVMsQ0FDWixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxxQkFBYSxlQUFlO0lBMEJ4QixPQUFP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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAIpF,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EACL,aAAa,EACb,qBAAqB,EAErB,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAInF,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GAAG;IACzB,iCAAiC;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,6CAA6C;IAC7C,aAAa,EAAE,OAAO,CAAC;IACvB
|
|
1
|
+
{"version":3,"file":"attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAIpF,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EACL,aAAa,EACb,qBAAqB,EAErB,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAInF,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GAAG;IACzB,iCAAiC;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,6CAA6C;IAC7C,aAAa,EAAE,OAAO,CAAC;IACvB;;;mFAG+E;IAC/E,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,iCAAiC,IAAI,CAAC;AACnD,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAClD,oFAAoF;AACpF,eAAO,MAAM,oCAAoC,IAAI,CAAC;AAEtD,kGAAkG;AAClG,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,eAAe,EACb,qBAAqB,GACrB,kBAAkB,GAClB,0BAA0B,GAC1B,uBAAuB,GACvB,8BAA8B,GAC9B,6BAA6B,GAC7B,iBAAiB,GACjB,kCAAkC,GAClC,6CAA6C,GAC7C,0BAA0B,GAC1B,SAAS,CACZ,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,eAAe;IA0BxB,OAAO,CAAC,KAAK;IAEb,OAAO,CAAC,GAAG;IA3Bb,OAAO,CAAC,OAAO,CAA6C;IAI5D,OAAO,CAAC,sBAAsB,CAAgC;IAG9D,OAAO,CAAC,mBAAmB,CAAgC;IAI3D,OAAO,CAAC,0BAA0B,CAAqC;IAGvE,OAAO,CAAC,cAAc,CAAgC;IAItD,OAAO,CAAC,6BAA6B,CAAqC;IAI1E,OAAO,CAAC,sCAAsC,CAAqC;IAEnF,YACU,KAAK,EAAE,iBAAiB,EAChC,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAyC,EAerD;IAED,OAAO,CAAC,SAAS,CAIf;IAEF,yCAAyC;IAC5B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAQvC;IAED,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IAIzB,2EAA2E;IAC3E,OAAO,CAAC,6BAA6B;IAKrC,yFAAyF;IACzF,OAAO,CAAC,iCAAiC;IAKzC,gHAAgH;IAChH,OAAO,CAAC,gBAAgB;IAKxB,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAM;IACxC,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAyC;IAE1E,wFAAwF;IACxF,OAAO,CAAC,mBAAmB;IAS3B;;;;;;;;;;OAUG;IACU,mBAAmB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAsCpF;IAED,4FAA4F;IAC5F,OAAO,CAAC,gCAAgC;YAS1B,gBAAgB;IAU9B;;;;;;OAMG;IACU,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAW5E;IAED,yEAAyE;IAC5D,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAIxE;IAED;;;;;;;;;;;;;;OAcG;IACU,wBAAwB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CA2B7F;YAGa,qBAAqB;IAQnC;;;;;;;;OAQG;IACU,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAW1F;IAED;;;OAGG;IACU,4BAA4B,CAAC,YAAY,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC9F;IAED;;;;;OAKG;IACU,gCAAgC,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAShG;IAED;;;;;;OAMG;IACU,2CAA2C,CACtD,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CASlC;IAED;;;;OAIG;IACU,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDlE;IAED;;;;;;;;;;;OAWG;IACU,2BAA2B,CAAC,WAAW,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CA8DlG;YAGa,gCAAgC;CAI/C;AAED,0EAA0E;AAC1E,wBAAsB,yBAAyB,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAIrG"}
|
|
@@ -4,9 +4,9 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
4
4
|
import { BlockProposal, CheckpointAttestation, CheckpointProposal } from '@aztec/stdlib/p2p';
|
|
5
5
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
6
6
|
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
7
|
-
export const
|
|
8
|
-
export const
|
|
9
|
-
export const
|
|
7
|
+
export const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 5;
|
|
8
|
+
export const MAX_BLOCK_PROPOSALS_PER_POSITION = 3;
|
|
9
|
+
/** Maximum attestations a single signer can make per slot before being rejected. */ export const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 3;
|
|
10
10
|
/**
|
|
11
11
|
* Pool for storing attestations and proposals collected by a validator.
|
|
12
12
|
*
|
|
@@ -29,6 +29,9 @@ export const ATTESTATION_CAP_BUFFER = 10;
|
|
|
29
29
|
// Block proposals indexed by slot and index-within-checkpoint for duplicate detection
|
|
30
30
|
// Key: (slot << 10) | indexWithinCheckpoint, Value: archive string
|
|
31
31
|
blockProposalsForSlotAndIndex;
|
|
32
|
+
// Checkpoint attestations indexed by (slot, signer) for tracking attestations per (slot, signer) for duplicate detection
|
|
33
|
+
// Key: `${Fr(slot).toString()}-${signerAddress}` string (padded for lexicographic ordering), Value: `proposalId` strings
|
|
34
|
+
checkpointAttestationsPerSlotAndSigner;
|
|
32
35
|
constructor(store, telemetry = getTelemetryClient(), log = createLogger('aztec:attestation_pool')){
|
|
33
36
|
this.store = store;
|
|
34
37
|
this.log = log;
|
|
@@ -42,6 +45,7 @@ export const ATTESTATION_CAP_BUFFER = 10;
|
|
|
42
45
|
this.blockProposalsForSlotAndIndex = store.openMultiMap('block_proposals_for_slot_and_index');
|
|
43
46
|
// Initialize checkpoint attestations storage
|
|
44
47
|
this.checkpointAttestations = store.openMap('checkpoint_attestations');
|
|
48
|
+
this.checkpointAttestationsPerSlotAndSigner = store.openMultiMap('checkpoint_attestations_per_slot_and_signer');
|
|
45
49
|
// Initialize checkpoint proposal storage
|
|
46
50
|
this.checkpointProposals = store.openMap('checkpoint_proposals');
|
|
47
51
|
this.checkpointProposalsForSlot = store.openMultiMap('checkpoint_proposals_for_slot');
|
|
@@ -79,6 +83,10 @@ export const ATTESTATION_CAP_BUFFER = 10;
|
|
|
79
83
|
end: `${proposalKey}-Z`
|
|
80
84
|
};
|
|
81
85
|
}
|
|
86
|
+
/** Creates a key for the per-signer-per-slot attestation index. Uses padded slot for lexicographic ordering. */ getSlotSignerKey(slot, signerAddress) {
|
|
87
|
+
const slotStr = new Fr(slot).toString();
|
|
88
|
+
return `${slotStr}-${signerAddress}`;
|
|
89
|
+
}
|
|
82
90
|
/** Number of bits reserved for indexWithinCheckpoint in position keys. */ static INDEX_BITS = 10;
|
|
83
91
|
/** Maximum indexWithinCheckpoint value (2^10 - 1 = 1023). */ static MAX_INDEX = (1 << AttestationPool.INDEX_BITS) - 1;
|
|
84
92
|
/** Creates a position key for block proposals: (slot << 10) | indexWithinCheckpoint. */ getBlockPositionKey(slot, indexWithinCheckpoint) {
|
|
@@ -103,20 +111,20 @@ export const ATTESTATION_CAP_BUFFER = 10;
|
|
|
103
111
|
// Check if already exists
|
|
104
112
|
const alreadyExists = await this.blockProposals.hasAsync(proposalId);
|
|
105
113
|
if (alreadyExists) {
|
|
106
|
-
const
|
|
114
|
+
const count = await this.getBlockProposalCountForPosition(blockProposal.slotNumber, blockProposal.indexWithinCheckpoint);
|
|
107
115
|
return {
|
|
108
116
|
added: false,
|
|
109
117
|
alreadyExists: true,
|
|
110
|
-
|
|
118
|
+
count
|
|
111
119
|
};
|
|
112
120
|
}
|
|
113
121
|
// Get current count for position and check cap, do not add if exceeded
|
|
114
|
-
const
|
|
115
|
-
if (
|
|
122
|
+
const count = await this.getBlockProposalCountForPosition(blockProposal.slotNumber, blockProposal.indexWithinCheckpoint);
|
|
123
|
+
if (count >= MAX_BLOCK_PROPOSALS_PER_POSITION) {
|
|
116
124
|
return {
|
|
117
125
|
added: false,
|
|
118
126
|
alreadyExists: false,
|
|
119
|
-
|
|
127
|
+
count
|
|
120
128
|
};
|
|
121
129
|
}
|
|
122
130
|
// Add the proposal
|
|
@@ -129,7 +137,7 @@ export const ATTESTATION_CAP_BUFFER = 10;
|
|
|
129
137
|
return {
|
|
130
138
|
added: true,
|
|
131
139
|
alreadyExists: false,
|
|
132
|
-
|
|
140
|
+
count: count + 1
|
|
133
141
|
};
|
|
134
142
|
});
|
|
135
143
|
}
|
|
@@ -162,6 +170,11 @@ export const ATTESTATION_CAP_BUFFER = 10;
|
|
|
162
170
|
}
|
|
163
171
|
return undefined;
|
|
164
172
|
}
|
|
173
|
+
/** Checks if any block proposals exist for a given slot (at index 0). */ async hasBlockProposalsForSlot(slot) {
|
|
174
|
+
const positionKey = this.getBlockPositionKey(slot, 0);
|
|
175
|
+
const count = await this.blockProposalsForSlotAndIndex.getValueCountAsync(positionKey);
|
|
176
|
+
return count > 0;
|
|
177
|
+
}
|
|
165
178
|
/**
|
|
166
179
|
* Attempts to add a checkpoint proposal to the pool.
|
|
167
180
|
*
|
|
@@ -182,20 +195,20 @@ export const ATTESTATION_CAP_BUFFER = 10;
|
|
|
182
195
|
// Check if already exists
|
|
183
196
|
const alreadyExists = await this.checkpointProposals.hasAsync(proposalId);
|
|
184
197
|
if (alreadyExists) {
|
|
185
|
-
const
|
|
198
|
+
const count = await this.checkpointProposalsForSlot.getValueCountAsync(proposal.slotNumber);
|
|
186
199
|
return {
|
|
187
200
|
added: false,
|
|
188
201
|
alreadyExists: true,
|
|
189
|
-
|
|
202
|
+
count
|
|
190
203
|
};
|
|
191
204
|
}
|
|
192
205
|
// Get current count for slot and check cap
|
|
193
|
-
const
|
|
194
|
-
if (
|
|
206
|
+
const count = await this.checkpointProposalsForSlot.getValueCountAsync(proposal.slotNumber);
|
|
207
|
+
if (count >= MAX_CHECKPOINT_PROPOSALS_PER_SLOT) {
|
|
195
208
|
return {
|
|
196
209
|
added: false,
|
|
197
210
|
alreadyExists: false,
|
|
198
|
-
|
|
211
|
+
count
|
|
199
212
|
};
|
|
200
213
|
}
|
|
201
214
|
// Add the proposal if cap not exceeded
|
|
@@ -207,7 +220,7 @@ export const ATTESTATION_CAP_BUFFER = 10;
|
|
|
207
220
|
return {
|
|
208
221
|
added: true,
|
|
209
222
|
alreadyExists: false,
|
|
210
|
-
|
|
223
|
+
count: count + 1
|
|
211
224
|
};
|
|
212
225
|
});
|
|
213
226
|
}
|
|
@@ -310,6 +323,15 @@ export const ATTESTATION_CAP_BUFFER = 10;
|
|
|
310
323
|
await this.checkpointAttestations.delete(key);
|
|
311
324
|
numberOfAttestations++;
|
|
312
325
|
}
|
|
326
|
+
// Clean up per-signer-per-slot index. Keys are formatted as `${Fr(slot).toString()}-${signerAddress}`.
|
|
327
|
+
// Since Fr pads to fixed-width hex, Fr(oldestSlot) is lexicographically greater than any key with
|
|
328
|
+
// a smaller slot (even with the signer suffix), so using it as the exclusive end bound is correct.
|
|
329
|
+
const slotSignerEndKey = new Fr(oldestSlot).toString();
|
|
330
|
+
for await (const key of this.checkpointAttestationsPerSlotAndSigner.keysAsync({
|
|
331
|
+
end: slotSignerEndKey
|
|
332
|
+
})){
|
|
333
|
+
await this.checkpointAttestationsPerSlotAndSigner.delete(key);
|
|
334
|
+
}
|
|
313
335
|
// Delete checkpoint proposals for slots < oldestSlot, using checkpointProposalsForSlot as index
|
|
314
336
|
for await (const slot of this.checkpointProposalsForSlot.keysAsync({
|
|
315
337
|
end: oldestSlot
|
|
@@ -347,13 +369,13 @@ export const ATTESTATION_CAP_BUFFER = 10;
|
|
|
347
369
|
*
|
|
348
370
|
* This method performs validation and addition in a single call:
|
|
349
371
|
* - Checks if the attestation already exists (returns alreadyExists: true if so)
|
|
350
|
-
* - Checks if
|
|
372
|
+
* - Checks if this signer has reached the per-signer attestation cap for this slot
|
|
351
373
|
* - Adds the attestation if validation passes
|
|
352
374
|
*
|
|
353
375
|
* @param attestation - The checkpoint attestation to add
|
|
354
|
-
* @
|
|
355
|
-
*
|
|
356
|
-
*/ async tryAddCheckpointAttestation(attestation
|
|
376
|
+
* @returns Result indicating whether the attestation was added, existence info, and count of
|
|
377
|
+
* attestations by this signer for this slot (for equivocation detection)
|
|
378
|
+
*/ async tryAddCheckpointAttestation(attestation) {
|
|
357
379
|
const slotNumber = attestation.payload.header.slotNumber;
|
|
358
380
|
const proposalId = attestation.archive.toString();
|
|
359
381
|
const sender = attestation.getSender();
|
|
@@ -361,50 +383,58 @@ export const ATTESTATION_CAP_BUFFER = 10;
|
|
|
361
383
|
return {
|
|
362
384
|
added: false,
|
|
363
385
|
alreadyExists: false,
|
|
364
|
-
|
|
386
|
+
count: 0
|
|
365
387
|
};
|
|
366
388
|
}
|
|
389
|
+
const signerAddress = sender.toString();
|
|
367
390
|
return await this.store.transactionAsync(async ()=>{
|
|
368
|
-
const key = this.getAttestationKey(slotNumber, proposalId,
|
|
391
|
+
const key = this.getAttestationKey(slotNumber, proposalId, signerAddress);
|
|
369
392
|
const alreadyExists = await this.checkpointAttestations.hasAsync(key);
|
|
393
|
+
// Get count of attestations by this signer for this slot (for duplicate detection)
|
|
394
|
+
const signerAttestationCount = await this.getSignerAttestationCountForSlot(slotNumber, signerAddress);
|
|
370
395
|
if (alreadyExists) {
|
|
371
|
-
const total = await this.getAttestationCount(slotNumber, proposalId);
|
|
372
396
|
return {
|
|
373
397
|
added: false,
|
|
374
398
|
alreadyExists: true,
|
|
375
|
-
|
|
399
|
+
count: signerAttestationCount
|
|
376
400
|
};
|
|
377
401
|
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
402
|
+
// Check if this signer has exceeded the per-signer cap for this slot
|
|
403
|
+
if (signerAttestationCount >= MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER) {
|
|
404
|
+
this.log.debug(`Rejecting attestation: signer ${signerAddress} exceeded per-slot cap for slot ${slotNumber}`, {
|
|
405
|
+
slotNumber,
|
|
406
|
+
signerAddress,
|
|
407
|
+
proposalId,
|
|
408
|
+
signerAttestationCount
|
|
409
|
+
});
|
|
381
410
|
return {
|
|
382
411
|
added: false,
|
|
383
412
|
alreadyExists: false,
|
|
384
|
-
|
|
413
|
+
count: signerAttestationCount
|
|
385
414
|
};
|
|
386
415
|
}
|
|
416
|
+
// Add the attestation
|
|
387
417
|
await this.checkpointAttestations.set(key, attestation.toBuffer());
|
|
388
|
-
this
|
|
418
|
+
// Track this attestation in the per-signer-per-slot index for duplicate detection
|
|
419
|
+
const slotSignerKey = this.getSlotSignerKey(slotNumber, signerAddress);
|
|
420
|
+
await this.checkpointAttestationsPerSlotAndSigner.set(slotSignerKey, proposalId);
|
|
421
|
+
this.log.debug(`Added checkpoint attestation for slot ${slotNumber} from ${signerAddress}`, {
|
|
389
422
|
signature: attestation.signature.toString(),
|
|
390
423
|
slotNumber,
|
|
391
|
-
address:
|
|
424
|
+
address: signerAddress,
|
|
392
425
|
proposalId
|
|
393
426
|
});
|
|
427
|
+
// Return the new count
|
|
394
428
|
return {
|
|
395
429
|
added: true,
|
|
396
430
|
alreadyExists: false,
|
|
397
|
-
|
|
431
|
+
count: signerAttestationCount + 1
|
|
398
432
|
};
|
|
399
433
|
});
|
|
400
434
|
}
|
|
401
|
-
/** Gets the count of attestations for a given
|
|
402
|
-
const
|
|
403
|
-
|
|
404
|
-
for await (const _ of this.checkpointAttestations.keysAsync(range)){
|
|
405
|
-
count++;
|
|
406
|
-
}
|
|
407
|
-
return count;
|
|
435
|
+
/** Gets the count of attestations by a specific signer for a given slot. */ async getSignerAttestationCountForSlot(slot, signerAddress) {
|
|
436
|
+
const slotSignerKey = this.getSlotSignerKey(slot, signerAddress);
|
|
437
|
+
return await this.checkpointAttestationsPerSlotAndSigner.getValueCountAsync(slotSignerKey);
|
|
408
438
|
}
|
|
409
439
|
}
|
|
410
440
|
/** Creates an AttestationPool backed by a temporary store for testing. */ export async function createTestAttestationPool(telemetry) {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type AttestationPool } from './attestation_pool.js';
|
|
2
2
|
export declare function describeAttestationPool(getAttestationPool: () => AttestationPool): void;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL2F0dGVzdGF0aW9uX3Bvb2wvYXR0ZXN0YXRpb25fcG9vbF90ZXN0X3N1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFHckIsTUFBTSx1QkFBdUIsQ0FBQztBQUsvQix3QkFBZ0IsdUJBQXVCLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLFFBMnJCaEYifQ==
|
|
@@ -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":"AAYA,OAAO,
|
|
1
|
+
{"version":3,"file":"attestation_pool_test_suite.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/attestation_pool_test_suite.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,uBAAuB,CAAC;AAK/B,wBAAgB,uBAAuB,CAAC,kBAAkB,EAAE,MAAM,eAAe,QA2rBhF"}
|