@aztec/p2p 0.0.1-commit.b655e406 → 0.0.1-commit.fce3e4f
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 +4 -22
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +10 -5
- package/dest/config.d.ts +60 -54
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +11 -1
- 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 +28 -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 +33 -32
- package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +13 -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 +40 -17
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +11 -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 +30 -8
- package/dest/mem_pools/attestation_pool/mocks.d.ts +224 -3
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +1 -1
- 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 +1 -36
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/index.d.ts +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/priority.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
- 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 +11 -11
- 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 +21 -9
- 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 +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/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 +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 +1 -1
- 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 +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +1 -1
- 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 +1 -1
- package/dest/services/encoding.d.ts.map +1 -1
- 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 +11 -67
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +224 -54
- 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 +2 -0
- 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 +1 -1
- package/dest/services/reqresp/interface.d.ts.map +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 +1 -1
- package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block.d.ts +1 -1
- 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 +3 -5
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +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 +2 -2
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- 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/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 +1 -7
- 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 +1 -3
- 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 +1 -2
- 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 +1 -1
- 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/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 +11 -8
- package/dest/testbench/parse_log_file.d.ts +1 -1
- package/dest/testbench/testbench.d.ts +1 -1
- 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 +12 -6
- package/src/config.ts +18 -1
- package/src/errors/attestation-pool.error.ts +13 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +29 -5
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +45 -32
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +65 -23
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +50 -16
- package/src/mem_pools/attestation_pool/mocks.ts +1 -1
- package/src/mem_pools/instrumentation.ts +13 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +13 -15
- 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 +25 -9
- package/src/msg_validators/tx_validator/phases_validator.ts +3 -1
- package/src/services/libp2p/instrumentation.ts +10 -1
- package/src/services/libp2p/libp2p_service.ts +248 -59
- package/src/services/peer-manager/metrics.ts +10 -0
- package/src/services/peer-manager/peer_manager.ts +2 -0
- package/src/services/peer-manager/peer_scoring.ts +46 -3
- package/src/services/tx_collection/slow_tx_collection.ts +3 -2
- package/src/testbench/p2p_client_testbench_worker.ts +8 -5
- package/src/util.ts +12 -2
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { Secp256k1Signer } from '@aztec/foundation/crypto';
|
|
2
3
|
import { Fr } from '@aztec/foundation/fields';
|
|
3
4
|
import { BlockProposal as BlockProposalClass, ConsensusPayload, SignatureDomainSeparator, getHashedSignaturePayloadEthSignedMessage } from '@aztec/stdlib/p2p';
|
|
@@ -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,14 +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
|
|
56
57
|
for (const attestation of attestations){
|
|
57
58
|
expect(await ap.hasAttestation(attestation)).toBe(true);
|
|
58
59
|
}
|
|
59
|
-
const retrievedAttestationsForSlot = await ap.getAttestationsForSlot(
|
|
60
|
+
const retrievedAttestationsForSlot = await ap.getAttestationsForSlot(SlotNumber(slotNumber));
|
|
60
61
|
expect(retrievedAttestationsForSlot.length).toBe(attestations.length);
|
|
61
62
|
compareAttestations(retrievedAttestationsForSlot, attestations);
|
|
62
63
|
// Add another one
|
|
@@ -64,22 +65,22 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
64
65
|
await ap.addAttestations([
|
|
65
66
|
newAttestation
|
|
66
67
|
]);
|
|
67
|
-
const retrievedAttestationsAfterAdd = await ap.getAttestationsForSlotAndProposal(
|
|
68
|
+
const retrievedAttestationsAfterAdd = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
|
|
68
69
|
expect(retrievedAttestationsAfterAdd.length).toBe(attestations.length + 1);
|
|
69
70
|
compareAttestations(retrievedAttestationsAfterAdd, [
|
|
70
71
|
...attestations,
|
|
71
72
|
newAttestation
|
|
72
73
|
]);
|
|
73
74
|
expect(await ap.hasAttestation(newAttestation)).toBe(true);
|
|
74
|
-
const retrievedAttestationsForSlotAfterAdd = await ap.getAttestationsForSlot(
|
|
75
|
+
const retrievedAttestationsForSlotAfterAdd = await ap.getAttestationsForSlot(SlotNumber(slotNumber));
|
|
75
76
|
expect(retrievedAttestationsForSlotAfterAdd.length).toBe(attestations.length + 1);
|
|
76
77
|
compareAttestations(retrievedAttestationsForSlotAfterAdd, [
|
|
77
78
|
...attestations,
|
|
78
79
|
newAttestation
|
|
79
80
|
]);
|
|
80
81
|
// Delete by slot
|
|
81
|
-
await ap.deleteAttestationsForSlot(
|
|
82
|
-
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
|
|
82
|
+
await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
|
|
83
|
+
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
|
|
83
84
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
84
85
|
// Check hasAttestation after deletion
|
|
85
86
|
for (const attestation of attestations){
|
|
@@ -98,7 +99,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
98
99
|
}
|
|
99
100
|
// Add them to store and check we end up with only one
|
|
100
101
|
await ap.addAttestations(attestations);
|
|
101
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
102
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString());
|
|
102
103
|
expect(retreivedAttestations.length).toBe(1);
|
|
103
104
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer());
|
|
104
105
|
expect(retreivedAttestations[0].getSender()?.toString()).toEqual(signer.address.toString());
|
|
@@ -106,7 +107,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
106
107
|
await ap.addAttestations([
|
|
107
108
|
attestations[0]
|
|
108
109
|
]);
|
|
109
|
-
expect(await ap.getAttestationsForSlotAndProposal(
|
|
110
|
+
expect(await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), archive.toString())).toHaveLength(1);
|
|
110
111
|
});
|
|
111
112
|
it('should store attestations by differing slot', async ()=>{
|
|
112
113
|
const slotNumbers = [
|
|
@@ -120,7 +121,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
120
121
|
for (const attestation of attestations){
|
|
121
122
|
const slot = attestation.payload.header.slotNumber;
|
|
122
123
|
const archive = attestation.archive.toString();
|
|
123
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot
|
|
124
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot, archive);
|
|
124
125
|
expect(retreivedAttestations.length).toBe(1);
|
|
125
126
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
126
127
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -144,7 +145,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
144
145
|
for (const attestation of attestations){
|
|
145
146
|
const slot = attestation.payload.header.slotNumber;
|
|
146
147
|
const proposalId = attestation.archive.toString();
|
|
147
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot
|
|
148
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(slot, proposalId);
|
|
148
149
|
expect(retreivedAttestations.length).toBe(1);
|
|
149
150
|
expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer());
|
|
150
151
|
expect(retreivedAttestations[0].payload.header.slotNumber).toEqual(slot);
|
|
@@ -156,7 +157,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
156
157
|
const attestations = signers.map((signer)=>mockAttestation(signer, slotNumber, archive));
|
|
157
158
|
const proposalId = attestations[0].archive.toString();
|
|
158
159
|
await ap.addAttestations(attestations);
|
|
159
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
160
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
160
161
|
expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
|
|
161
162
|
compareAttestations(retreivedAttestations, attestations);
|
|
162
163
|
// Check hasAttestation before deletion
|
|
@@ -164,7 +165,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
164
165
|
expect(await ap.hasAttestation(attestation)).toBe(true);
|
|
165
166
|
}
|
|
166
167
|
await ap.deleteAttestations(attestations);
|
|
167
|
-
const gottenAfterDelete = await ap.getAttestationsForSlotAndProposal(
|
|
168
|
+
const gottenAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
168
169
|
expect(gottenAfterDelete.length).toBe(0);
|
|
169
170
|
// Check hasAttestation after deletion
|
|
170
171
|
for (const attestation of attestations){
|
|
@@ -177,11 +178,11 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
177
178
|
const attestations = signers.map((signer)=>mockAttestation(signer, slotNumber, archive));
|
|
178
179
|
const proposalId = attestations[0].archive.toString();
|
|
179
180
|
await ap.addAttestations(attestations);
|
|
180
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
181
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
181
182
|
expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
|
|
182
183
|
compareAttestations(retreivedAttestations, attestations);
|
|
183
|
-
await ap.deleteAttestationsForSlot(
|
|
184
|
-
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
|
|
184
|
+
await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
|
|
185
|
+
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
185
186
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
186
187
|
});
|
|
187
188
|
it('should blanket delete attestations per slot and proposal', async ()=>{
|
|
@@ -195,13 +196,13 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
195
196
|
const proposalId2 = attestations2[0].archive.toString();
|
|
196
197
|
await ap.addAttestations(attestations);
|
|
197
198
|
await ap.addAttestations(attestations2);
|
|
198
|
-
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
199
|
+
const retreivedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
199
200
|
expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
|
|
200
201
|
compareAttestations(retreivedAttestations, attestations);
|
|
201
|
-
await ap.deleteAttestationsForSlotAndProposal(
|
|
202
|
-
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(
|
|
202
|
+
await ap.deleteAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
203
|
+
const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
203
204
|
expect(retreivedAttestationsAfterDelete.length).toBe(0);
|
|
204
|
-
const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlotAndProposal(
|
|
205
|
+
const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId2);
|
|
205
206
|
expect(retreivedAttestationsAfterDeleteForOtherProposal.length).toBe(NUMBER_OF_SIGNERS_PER_TEST);
|
|
206
207
|
compareAttestations(retreivedAttestationsAfterDeleteForOtherProposal, attestations2);
|
|
207
208
|
});
|
|
@@ -219,18 +220,18 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
219
220
|
const attestations = (await Promise.all(slotNumbers.map((slotNumber)=>createAttestationsForSlot(slotNumber)))).flat();
|
|
220
221
|
const proposalId = attestations[0].archive.toString();
|
|
221
222
|
await ap.addAttestations(attestations);
|
|
222
|
-
const attestationsForSlot1 = await ap.getAttestationsForSlotAndProposal(
|
|
223
|
+
const attestationsForSlot1 = await ap.getAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
|
|
223
224
|
expect(attestationsForSlot1.length).toBe(signers.length);
|
|
224
225
|
const deleteAttestationsSpy = jest.spyOn(ap, 'deleteAttestationsForSlot');
|
|
225
|
-
await ap.deleteAttestationsOlderThan(
|
|
226
|
-
const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlotAndProposal(
|
|
226
|
+
await ap.deleteAttestationsOlderThan(SlotNumber(73));
|
|
227
|
+
const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlotAndProposal(SlotNumber(1), proposalId);
|
|
227
228
|
expect(attestationsForSlot1AfterDelete.length).toBe(0);
|
|
228
229
|
expect(deleteAttestationsSpy).toHaveBeenCalledTimes(5);
|
|
229
|
-
expect(deleteAttestationsSpy).toHaveBeenCalledWith(
|
|
230
|
-
expect(deleteAttestationsSpy).toHaveBeenCalledWith(
|
|
231
|
-
expect(deleteAttestationsSpy).toHaveBeenCalledWith(
|
|
232
|
-
expect(deleteAttestationsSpy).toHaveBeenCalledWith(
|
|
233
|
-
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));
|
|
234
235
|
});
|
|
235
236
|
describe('BlockProposal in attestation pool', ()=>{
|
|
236
237
|
it('should add and retrieve block proposal', async ()=>{
|
|
@@ -279,7 +280,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
279
280
|
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
280
281
|
expect(retrievedProposal).toBeDefined();
|
|
281
282
|
expect(retrievedProposal.toBuffer()).toEqual(proposal2.toBuffer());
|
|
282
|
-
expect(retrievedProposal.slotNumber
|
|
283
|
+
expect(retrievedProposal.slotNumber).toBe(SlotNumber(200));
|
|
283
284
|
});
|
|
284
285
|
it('should delete block proposal when deleting attestations for slot and proposal', async ()=>{
|
|
285
286
|
const slotNumber = 420;
|
|
@@ -295,7 +296,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
295
296
|
expect(retrievedProposal).toBeDefined();
|
|
296
297
|
expect(await ap.hasBlockProposal(proposalId)).toBe(true);
|
|
297
298
|
// Delete attestations for slot and proposal
|
|
298
|
-
await ap.deleteAttestationsForSlotAndProposal(
|
|
299
|
+
await ap.deleteAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
299
300
|
// Proposal should be deleted
|
|
300
301
|
retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
301
302
|
expect(retrievedProposal).toBeUndefined();
|
|
@@ -313,7 +314,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
313
314
|
expect(retrievedProposal).toBeDefined();
|
|
314
315
|
expect(await ap.hasBlockProposal(proposal)).toBe(true);
|
|
315
316
|
// Delete attestations for slot
|
|
316
|
-
await ap.deleteAttestationsForSlot(
|
|
317
|
+
await ap.deleteAttestationsForSlot(SlotNumber(slotNumber));
|
|
317
318
|
// Proposal should be deleted
|
|
318
319
|
retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
319
320
|
expect(retrievedProposal).toBeUndefined();
|
|
@@ -331,7 +332,7 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
331
332
|
await ap.addAttestations(attestations);
|
|
332
333
|
// Retrieve both proposal and attestations
|
|
333
334
|
const retrievedProposal = await ap.getBlockProposal(proposalId);
|
|
334
|
-
const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(
|
|
335
|
+
const retrievedAttestations = await ap.getAttestationsForSlotAndProposal(SlotNumber(slotNumber), proposalId);
|
|
335
336
|
expect(retrievedProposal).toBeDefined();
|
|
336
337
|
expect(retrievedProposal).toEqual(proposal);
|
|
337
338
|
expect(await ap.hasBlockProposal(proposalId)).toBe(true);
|
|
@@ -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,15 +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>;
|
|
25
28
|
hasAttestation(attestation: BlockAttestation): Promise<boolean>;
|
|
26
29
|
getBlockProposal(id: string): Promise<BlockProposal | undefined>;
|
|
27
30
|
hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean>;
|
|
28
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>;
|
|
29
36
|
}
|
|
30
|
-
//# 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 { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
3
|
import { toArray } from '@aztec/foundation/iterable';
|
|
3
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
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();
|
|
@@ -183,8 +186,28 @@ export class KvAttestationPool {
|
|
|
183
186
|
}
|
|
184
187
|
async addBlockProposal(blockProposal) {
|
|
185
188
|
await this.store.transactionAsync(async ()=>{
|
|
186
|
-
|
|
187
|
-
|
|
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());
|
|
188
197
|
});
|
|
189
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
|
+
}
|
|
190
213
|
}
|
|
@@ -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
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
4
|
import type { AttestationPool } from './attestation_pool.js';
|
|
@@ -10,16 +11,20 @@ export declare class InMemoryAttestationPool implements AttestationPool {
|
|
|
10
11
|
constructor(telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
11
12
|
private poolStats;
|
|
12
13
|
isEmpty(): Promise<boolean>;
|
|
13
|
-
getAttestationsForSlot(slot:
|
|
14
|
-
getAttestationsForSlotAndProposal(slot:
|
|
14
|
+
getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]>;
|
|
15
|
+
getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]>;
|
|
15
16
|
addAttestations(attestations: BlockAttestation[]): Promise<void>;
|
|
16
|
-
deleteAttestationsOlderThan(oldestSlot:
|
|
17
|
-
deleteAttestationsForSlot(slot:
|
|
18
|
-
deleteAttestationsForSlotAndProposal(slot:
|
|
17
|
+
deleteAttestationsOlderThan(oldestSlot: SlotNumber): Promise<void>;
|
|
18
|
+
deleteAttestationsForSlot(slot: SlotNumber): Promise<void>;
|
|
19
|
+
deleteAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<void>;
|
|
19
20
|
deleteAttestations(attestations: BlockAttestation[]): Promise<void>;
|
|
20
21
|
hasAttestation(attestation: BlockAttestation): Promise<boolean>;
|
|
21
22
|
addBlockProposal(blockProposal: BlockProposal): Promise<void>;
|
|
22
23
|
getBlockProposal(id: string): Promise<BlockProposal | undefined>;
|
|
23
24
|
hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean>;
|
|
25
|
+
hasReachedProposalCap(slot: SlotNumber): Promise<boolean>;
|
|
26
|
+
hasReachedAttestationCap(slot: SlotNumber, proposalId: string, committeeSize: number): Promise<boolean>;
|
|
27
|
+
canAddProposal(block: BlockProposal): Promise<boolean>;
|
|
28
|
+
canAddAttestation(attestation: BlockAttestation, committeeSize: number): Promise<boolean>;
|
|
24
29
|
}
|
|
25
|
-
//# sourceMappingURL=
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X2F0dGVzdGF0aW9uX3Bvb2wuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9tZW1vcnlfYXR0ZXN0YXRpb25fcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVsRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFHbkYsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHN0QscUJBQWEsdUJBQXdCLFlBQVcsZUFBZTs7SUFZM0QsT0FBTyxDQUFDLEdBQUc7SUFYYixPQUFPLENBQUMsT0FBTyxDQUF3QztJQUd2RCxPQUFPLENBQUMsWUFBWSxDQUdsQjtJQUNGLE9BQU8sQ0FBQyxTQUFTLENBQTZCO0lBRTlDLFlBQ0UsU0FBUyxHQUFFLGVBQXNDLEVBQ3pDLEdBQUcseUNBQXVDLEVBS25EO0lBRUQsT0FBTyxDQUFDLFNBQVMsQ0FJZjtJQUVLLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBRWpDO0lBRU0sc0JBQXNCLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQU0zRTtJQUVNLGlDQUFpQyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQVMxRztJQUVNLGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBK0J0RTtJQWNZLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQW1COUU7SUFFTSx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FnQmhFO0lBRU0sb0NBQW9DLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FjL0Y7SUFFTSxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBc0J6RTtJQUVNLGNBQWMsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQXFCckU7SUFFTSxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FRbkU7SUFFTSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDLENBRXRFO0lBRU0sZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE1BQU0sR0FBRyxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUc5RTtJQUVNLHFCQUFxQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUkvRDtJQUVNLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FJN0c7SUFFWSxjQUFjLENBQUMsS0FBSyxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBRWxFO0lBRVksaUJBQWlCLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQVNyRztDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory_attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/memory_attestation_pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory_attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/memory_attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAGnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,qBAAa,uBAAwB,YAAW,eAAe;;IAY3D,OAAO,CAAC,GAAG;IAXb,OAAO,CAAC,OAAO,CAAwC;IAGvD,OAAO,CAAC,YAAY,CAGlB;IACF,OAAO,CAAC,SAAS,CAA6B;IAE9C,YACE,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAuC,EAKnD;IAED,OAAO,CAAC,SAAS,CAIf;IAEK,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAEjC;IAEM,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAM3E;IAEM,iCAAiC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAS1G;IAEM,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BtE;IAcY,2BAA2B,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB9E;IAEM,yBAAyB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhE;IAEM,oCAAoC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/F;IAEM,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBzE;IAEM,cAAc,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBrE;IAEM,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnE;IAEM,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAEtE;IAEM,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAG9E;IAEM,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAI/D;IAEM,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI7G;IAEY,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAElE;IAEY,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrG;CACF"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
3
3
|
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
4
|
+
import { ATTESTATION_CAP_BUFFER, MAX_PROPOSALS_PER_SLOT } from './kv_attestation_pool.js';
|
|
4
5
|
export class InMemoryAttestationPool {
|
|
5
6
|
log;
|
|
6
7
|
metrics;
|
|
8
|
+
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
7
9
|
attestations;
|
|
8
10
|
proposals;
|
|
9
11
|
constructor(telemetry = getTelemetryClient(), log = createLogger('p2p:attestation_pool')){
|
|
@@ -42,17 +44,17 @@ export class InMemoryAttestationPool {
|
|
|
42
44
|
const sender = attestation.getSender();
|
|
43
45
|
// Skip attestations with invalid signatures
|
|
44
46
|
if (!sender) {
|
|
45
|
-
this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber
|
|
47
|
+
this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber}`, {
|
|
46
48
|
signature: attestation.signature.toString(),
|
|
47
49
|
slotNumber,
|
|
48
50
|
proposalId
|
|
49
51
|
});
|
|
50
52
|
continue;
|
|
51
53
|
}
|
|
52
|
-
const slotAttestationMap = getSlotOrDefault(this.attestations, slotNumber
|
|
54
|
+
const slotAttestationMap = getSlotOrDefault(this.attestations, slotNumber);
|
|
53
55
|
const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
|
|
54
56
|
proposalAttestationMap.set(sender.toString(), attestation);
|
|
55
|
-
this.log.verbose(`Added attestation for slot ${slotNumber
|
|
57
|
+
this.log.verbose(`Added attestation for slot ${slotNumber} from ${sender}`, {
|
|
56
58
|
signature: attestation.signature.toString(),
|
|
57
59
|
slotNumber,
|
|
58
60
|
address: sender,
|
|
@@ -117,7 +119,7 @@ export class InMemoryAttestationPool {
|
|
|
117
119
|
deleteAttestations(attestations) {
|
|
118
120
|
for (const attestation of attestations){
|
|
119
121
|
const slotNumber = attestation.payload.header.slotNumber;
|
|
120
|
-
const slotAttestationMap = this.attestations.get(slotNumber
|
|
122
|
+
const slotAttestationMap = this.attestations.get(slotNumber);
|
|
121
123
|
if (slotAttestationMap) {
|
|
122
124
|
const proposalId = attestation.archive.toString();
|
|
123
125
|
const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
|
|
@@ -125,7 +127,7 @@ export class InMemoryAttestationPool {
|
|
|
125
127
|
const sender = attestation.getSender();
|
|
126
128
|
// Skip attestations with invalid signatures
|
|
127
129
|
if (!sender) {
|
|
128
|
-
this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber
|
|
130
|
+
this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber}`);
|
|
129
131
|
continue;
|
|
130
132
|
}
|
|
131
133
|
proposalAttestationMap.delete(sender.toString());
|
|
@@ -143,7 +145,7 @@ export class InMemoryAttestationPool {
|
|
|
143
145
|
if (!sender) {
|
|
144
146
|
return Promise.resolve(false);
|
|
145
147
|
}
|
|
146
|
-
const slotAttestationMap = this.attestations.get(slotNumber
|
|
148
|
+
const slotAttestationMap = this.attestations.get(slotNumber);
|
|
147
149
|
if (!slotAttestationMap) {
|
|
148
150
|
return Promise.resolve(false);
|
|
149
151
|
}
|
|
@@ -156,7 +158,7 @@ export class InMemoryAttestationPool {
|
|
|
156
158
|
addBlockProposal(blockProposal) {
|
|
157
159
|
// We initialize slot-proposal mapping if it does not exist
|
|
158
160
|
// This is important to ensure we can delete this proposal if there were not attestations for it
|
|
159
|
-
const slotProposalMapping = getSlotOrDefault(this.attestations, blockProposal.slotNumber
|
|
161
|
+
const slotProposalMapping = getSlotOrDefault(this.attestations, blockProposal.slotNumber);
|
|
160
162
|
slotProposalMapping.set(blockProposal.payload.archive.toString(), new Map());
|
|
161
163
|
this.proposals.set(blockProposal.payload.archive.toString(), blockProposal);
|
|
162
164
|
return Promise.resolve();
|
|
@@ -168,6 +170,25 @@ export class InMemoryAttestationPool {
|
|
|
168
170
|
const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.payload.archive.toString();
|
|
169
171
|
return Promise.resolve(this.proposals.has(id));
|
|
170
172
|
}
|
|
173
|
+
hasReachedProposalCap(slot) {
|
|
174
|
+
const slotAttestationMap = this.attestations.get(slot);
|
|
175
|
+
const proposalCount = slotAttestationMap?.size ?? 0;
|
|
176
|
+
return Promise.resolve(proposalCount >= MAX_PROPOSALS_PER_SLOT);
|
|
177
|
+
}
|
|
178
|
+
hasReachedAttestationCap(slot, proposalId, committeeSize) {
|
|
179
|
+
const limit = committeeSize + ATTESTATION_CAP_BUFFER;
|
|
180
|
+
const count = this.attestations.get(slot)?.get(proposalId)?.size ?? 0;
|
|
181
|
+
return Promise.resolve(limit <= 0 || count >= limit);
|
|
182
|
+
}
|
|
183
|
+
async canAddProposal(block) {
|
|
184
|
+
return this.proposals.has(block.archive.toString()) || !await this.hasReachedProposalCap(block.slotNumber);
|
|
185
|
+
}
|
|
186
|
+
async canAddAttestation(attestation, committeeSize) {
|
|
187
|
+
const sender = attestation.getSender();
|
|
188
|
+
const slot = attestation.payload.header.slotNumber;
|
|
189
|
+
const pid = attestation.archive.toString();
|
|
190
|
+
return !!sender && ((this.attestations.get(slot)?.get(pid)?.has(sender.toString()) ?? false) || !await this.hasReachedAttestationCap(slot, pid, committeeSize));
|
|
191
|
+
}
|
|
171
192
|
}
|
|
172
193
|
/**
|
|
173
194
|
* Get Slot or Default
|
|
@@ -176,7 +197,8 @@ export class InMemoryAttestationPool {
|
|
|
176
197
|
* @param map - The map to fetch from
|
|
177
198
|
* @param slot - The slot to fetch
|
|
178
199
|
* @returns The slot mapping
|
|
179
|
-
*/ function getSlotOrDefault(
|
|
200
|
+
*/ function getSlotOrDefault(// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
201
|
+
map, slot) {
|
|
180
202
|
if (!map.has(slot)) {
|
|
181
203
|
map.set(slot, new Map());
|
|
182
204
|
}
|