@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.
Files changed (219) hide show
  1. package/dest/bootstrap/bootstrap.d.ts +1 -1
  2. package/dest/bootstrap/bootstrap.d.ts.map +1 -1
  3. package/dest/client/factory.d.ts +1 -1
  4. package/dest/client/index.d.ts +1 -1
  5. package/dest/client/interface.d.ts +4 -2
  6. package/dest/client/interface.d.ts.map +1 -1
  7. package/dest/client/p2p_client.d.ts +4 -22
  8. package/dest/client/p2p_client.d.ts.map +1 -1
  9. package/dest/client/p2p_client.js +10 -5
  10. package/dest/config.d.ts +60 -54
  11. package/dest/config.d.ts.map +1 -1
  12. package/dest/config.js +11 -1
  13. package/dest/enr/generate-enr.d.ts +1 -1
  14. package/dest/enr/index.d.ts +1 -1
  15. package/dest/errors/attestation-pool.error.d.ts +7 -0
  16. package/dest/errors/attestation-pool.error.d.ts.map +1 -0
  17. package/dest/errors/attestation-pool.error.js +12 -0
  18. package/dest/errors/reqresp.error.d.ts +1 -1
  19. package/dest/errors/reqresp.error.d.ts.map +1 -1
  20. package/dest/index.d.ts +1 -1
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +28 -6
  22. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  25. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +33 -32
  26. package/dest/mem_pools/attestation_pool/index.d.ts +1 -1
  27. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +13 -6
  28. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  29. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +40 -17
  30. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +11 -6
  31. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  32. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +30 -8
  33. package/dest/mem_pools/attestation_pool/mocks.d.ts +224 -3
  34. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  35. package/dest/mem_pools/attestation_pool/mocks.js +1 -1
  36. package/dest/mem_pools/index.d.ts +1 -1
  37. package/dest/mem_pools/instrumentation.d.ts +3 -1
  38. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  39. package/dest/mem_pools/instrumentation.js +11 -2
  40. package/dest/mem_pools/interface.d.ts +1 -1
  41. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +1 -36
  42. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  43. package/dest/mem_pools/tx_pool/index.d.ts +1 -1
  44. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +1 -1
  45. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
  46. package/dest/mem_pools/tx_pool/priority.d.ts +1 -1
  47. package/dest/mem_pools/tx_pool/tx_pool.d.ts +1 -1
  48. package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +1 -1
  49. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -3
  50. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  51. package/dest/msg_validators/attestation_validator/attestation_validator.js +11 -11
  52. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +20 -0
  53. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -0
  54. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +67 -0
  55. package/dest/msg_validators/attestation_validator/index.d.ts +2 -1
  56. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -1
  57. package/dest/msg_validators/attestation_validator/index.js +1 -0
  58. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +1 -1
  59. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -1
  60. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +21 -9
  61. package/dest/msg_validators/block_proposal_validator/index.d.ts +1 -1
  62. package/dest/msg_validators/index.d.ts +1 -1
  63. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts +1 -1
  64. package/dest/msg_validators/msg_seen_validator/msg_seen_validator.d.ts.map +1 -1
  65. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
  66. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  67. package/dest/msg_validators/tx_validator/allowed_public_setup.d.ts +1 -1
  68. package/dest/msg_validators/tx_validator/archive_cache.d.ts +1 -1
  69. package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
  70. package/dest/msg_validators/tx_validator/block_header_validator.d.ts +1 -1
  71. package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
  72. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  73. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  74. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +1 -1
  75. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
  76. package/dest/msg_validators/tx_validator/factory.d.ts +1 -1
  77. package/dest/msg_validators/tx_validator/gas_validator.d.ts +1 -1
  78. package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
  79. package/dest/msg_validators/tx_validator/index.d.ts +1 -1
  80. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  81. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  82. package/dest/msg_validators/tx_validator/phases_validator.d.ts +1 -1
  83. package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
  84. package/dest/msg_validators/tx_validator/phases_validator.js +3 -1
  85. package/dest/msg_validators/tx_validator/test_utils.d.ts +1 -1
  86. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +1 -1
  87. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  88. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +1 -1
  89. package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
  90. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +1 -1
  91. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
  92. package/dest/services/data_store.d.ts +1 -1
  93. package/dest/services/data_store.d.ts.map +1 -1
  94. package/dest/services/discv5/discV5_service.d.ts +1 -1
  95. package/dest/services/discv5/discV5_service.d.ts.map +1 -1
  96. package/dest/services/dummy_service.d.ts +1 -1
  97. package/dest/services/dummy_service.d.ts.map +1 -1
  98. package/dest/services/encoding.d.ts +1 -1
  99. package/dest/services/encoding.d.ts.map +1 -1
  100. package/dest/services/gossipsub/scoring.d.ts +1 -1
  101. package/dest/services/index.d.ts +1 -1
  102. package/dest/services/libp2p/instrumentation.d.ts +3 -1
  103. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  104. package/dest/services/libp2p/instrumentation.js +9 -2
  105. package/dest/services/libp2p/libp2p_service.d.ts +11 -67
  106. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  107. package/dest/services/libp2p/libp2p_service.js +224 -54
  108. package/dest/services/peer-manager/interface.d.ts +1 -1
  109. package/dest/services/peer-manager/metrics.d.ts +3 -1
  110. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  111. package/dest/services/peer-manager/metrics.js +11 -0
  112. package/dest/services/peer-manager/peer_manager.d.ts +1 -32
  113. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  114. package/dest/services/peer-manager/peer_manager.js +2 -0
  115. package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
  116. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  117. package/dest/services/peer-manager/peer_scoring.js +40 -2
  118. package/dest/services/reqresp/config.d.ts +1 -1
  119. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +1 -1
  120. package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
  121. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +1 -4
  122. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  123. package/dest/services/reqresp/index.d.ts +1 -1
  124. package/dest/services/reqresp/interface.d.ts +1 -1
  125. package/dest/services/reqresp/interface.d.ts.map +1 -1
  126. package/dest/services/reqresp/metrics.d.ts +1 -1
  127. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  128. package/dest/services/reqresp/protocols/auth.d.ts +1 -1
  129. package/dest/services/reqresp/protocols/auth.d.ts.map +1 -1
  130. package/dest/services/reqresp/protocols/block.d.ts +1 -1
  131. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +1 -1
  132. package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
  133. package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
  134. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +3 -5
  135. package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
  136. package/dest/services/reqresp/protocols/block_txs/index.d.ts +1 -1
  137. package/dest/services/reqresp/protocols/goodbye.d.ts +1 -1
  138. package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -1
  139. package/dest/services/reqresp/protocols/index.d.ts +1 -1
  140. package/dest/services/reqresp/protocols/ping.d.ts +1 -1
  141. package/dest/services/reqresp/protocols/status.d.ts +2 -2
  142. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  143. package/dest/services/reqresp/protocols/tx.d.ts +1 -1
  144. package/dest/services/reqresp/rate-limiter/index.d.ts +1 -1
  145. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +2 -2
  146. package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
  147. package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
  148. package/dest/services/reqresp/reqresp.d.ts +1 -41
  149. package/dest/services/reqresp/reqresp.d.ts.map +1 -1
  150. package/dest/services/reqresp/status.d.ts +2 -2
  151. package/dest/services/reqresp/status.d.ts.map +1 -1
  152. package/dest/services/service.d.ts +1 -1
  153. package/dest/services/tx_collection/config.d.ts +1 -1
  154. package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -7
  155. package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
  156. package/dest/services/tx_collection/index.d.ts +1 -1
  157. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  158. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  159. package/dest/services/tx_collection/slow_tx_collection.d.ts +1 -3
  160. package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
  161. package/dest/services/tx_collection/slow_tx_collection.js +2 -1
  162. package/dest/services/tx_collection/tx_collection.d.ts +1 -2
  163. package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
  164. package/dest/services/tx_collection/tx_collection_sink.d.ts +3 -3
  165. package/dest/services/tx_collection/tx_collection_sink.d.ts.map +1 -1
  166. package/dest/services/tx_collection/tx_source.d.ts +1 -1
  167. package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
  168. package/dest/services/tx_provider.d.ts +1 -1
  169. package/dest/services/tx_provider.d.ts.map +1 -1
  170. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  171. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  172. package/dest/test-helpers/generate-peer-id-private-keys.d.ts +1 -1
  173. package/dest/test-helpers/get-ports.d.ts +1 -1
  174. package/dest/test-helpers/get-ports.d.ts.map +1 -1
  175. package/dest/test-helpers/index.d.ts +1 -1
  176. package/dest/test-helpers/make-enrs.d.ts +1 -1
  177. package/dest/test-helpers/make-test-p2p-clients.d.ts +2 -2
  178. package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
  179. package/dest/test-helpers/mock-pubsub.d.ts +4 -4
  180. package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
  181. package/dest/test-helpers/mock-tx-helpers.d.ts +2 -2
  182. package/dest/test-helpers/mock-tx-helpers.d.ts.map +1 -1
  183. package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
  184. package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
  185. package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
  186. package/dest/testbench/p2p_client_testbench_worker.js +11 -8
  187. package/dest/testbench/parse_log_file.d.ts +1 -1
  188. package/dest/testbench/testbench.d.ts +1 -1
  189. package/dest/testbench/worker_client_manager.d.ts +1 -1
  190. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  191. package/dest/types/index.d.ts +1 -1
  192. package/dest/util.d.ts +2 -1
  193. package/dest/util.d.ts.map +1 -1
  194. package/dest/util.js +11 -2
  195. package/dest/versioning.d.ts +1 -1
  196. package/package.json +19 -18
  197. package/src/client/interface.ts +4 -1
  198. package/src/client/p2p_client.ts +12 -6
  199. package/src/config.ts +18 -1
  200. package/src/errors/attestation-pool.error.ts +13 -0
  201. package/src/mem_pools/attestation_pool/attestation_pool.ts +29 -5
  202. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +45 -32
  203. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +65 -23
  204. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +50 -16
  205. package/src/mem_pools/attestation_pool/mocks.ts +1 -1
  206. package/src/mem_pools/instrumentation.ts +13 -0
  207. package/src/msg_validators/attestation_validator/attestation_validator.ts +13 -15
  208. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +91 -0
  209. package/src/msg_validators/attestation_validator/index.ts +1 -0
  210. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +25 -9
  211. package/src/msg_validators/tx_validator/phases_validator.ts +3 -1
  212. package/src/services/libp2p/instrumentation.ts +10 -1
  213. package/src/services/libp2p/libp2p_service.ts +248 -59
  214. package/src/services/peer-manager/metrics.ts +10 -0
  215. package/src/services/peer-manager/peer_manager.ts +2 -0
  216. package/src/services/peer-manager/peer_scoring.ts +46 -3
  217. package/src/services/tx_collection/slow_tx_collection.ts +3 -2
  218. package/src/testbench/p2p_client_testbench_worker.ts +8 -5
  219. 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, header.state);
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(BigInt(slotNumber), archive.toString());
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(BigInt(slotNumber));
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(BigInt(slotNumber), archive.toString());
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(BigInt(slotNumber));
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(BigInt(slotNumber));
82
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), archive.toString());
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(BigInt(slotNumber), archive.toString());
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(BigInt(slotNumber), archive.toString())).toHaveLength(1);
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.toBigInt(), archive);
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.toBigInt(), proposalId);
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(BigInt(slotNumber), proposalId);
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(BigInt(slotNumber), proposalId);
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(BigInt(slotNumber), proposalId);
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(BigInt(slotNumber));
184
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
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(BigInt(slotNumber), proposalId);
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(BigInt(slotNumber), proposalId);
202
- const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId);
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(BigInt(slotNumber), proposalId2);
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(BigInt(1), proposalId);
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(BigInt(73));
226
- const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlotAndProposal(BigInt(1), proposalId);
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(BigInt(1));
230
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(2));
231
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(3));
232
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(69));
233
- expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(72));
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.toBigInt()).toBe(BigInt(200));
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(BigInt(slotNumber), proposalId);
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(BigInt(slotNumber));
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(BigInt(slotNumber), proposalId);
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=index.d.ts.map
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: bigint): Promise<BlockAttestation[]>;
20
- getAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<BlockAttestation[]>;
21
- deleteAttestationsOlderThan(oldestSlot: bigint): Promise<void>;
22
- deleteAttestationsForSlot(slot: bigint): Promise<void>;
23
- deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<void>;
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=kv_attestation_pool.d.ts.map
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":"AAGA,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;AAGnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,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;gBAG1D,KAAK,EAAE,iBAAiB,EAChC,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAyC;IAUtD,OAAO,CAAC,SAAS,CAIf;IAEW,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAOxC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IAIZ,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqChE,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAYjE,iCAAiC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAsBhG,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9D,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBtD,oCAAoC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrF,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BnE,cAAc,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB/D,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAahE,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxE,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAM3E"}
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.toBigInt()}`, {
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.toString(), proposalId.toString());
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.toBigInt()} from ${address}`, {
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 slotFr = new Fr(slot);
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: new Fr(oldestSlot).toString()
101
+ end: oldestSlot
99
102
  }));
100
103
  for (const oldSlot of olderThan){
101
- await this.deleteAttestationsForSlot(BigInt(oldSlot));
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(slotFr.toString()));
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(slotFr, proposalId)));
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(slotFr, proposalId));
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(slotString, proposalId);
132
- await this.attestationsForProposal.delete(this.getProposalKey(slotString, proposalId));
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.toBigInt()}`);
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
- await this.proposalsForSlot.set(blockProposal.slotNumber.toString(), blockProposal.archive.toString());
187
- await this.proposals.set(blockProposal.payload.archive.toString(), blockProposal.toBuffer());
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: bigint): Promise<BlockAttestation[]>;
14
- getAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<BlockAttestation[]>;
14
+ getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]>;
15
+ getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]>;
15
16
  addAttestations(attestations: BlockAttestation[]): Promise<void>;
16
- deleteAttestationsOlderThan(oldestSlot: bigint): Promise<void>;
17
- deleteAttestationsForSlot(slot: bigint): Promise<void>;
18
- deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise<void>;
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=memory_attestation_pool.d.ts.map
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":"AACA,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;AAE7D,qBAAa,uBAAwB,YAAW,eAAe;;IAQ3D,OAAO,CAAC,GAAG;IAPb,OAAO,CAAC,OAAO,CAAwC;IAEvD,OAAO,CAAC,YAAY,CAAgG;IACpH,OAAO,CAAC,SAAS,CAA6B;gBAG5C,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAuC;IAOpD,OAAO,CAAC,SAAS,CAIf;IAEK,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAI3B,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAQjE,iCAAiC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAWhG,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C1D,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpE,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBtD,oCAAoC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrF,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnE,cAAc,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB/D,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7D,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAIhE,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;CAIhF"}
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.toBigInt()}`, {
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.toBigInt());
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.toBigInt()} from ${sender}`, {
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.toBigInt());
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.toBigInt()}`);
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.toBigInt());
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.toBigInt());
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(map, slot) {
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
  }