@aztec/p2p 0.0.1-commit.03f7ef2 → 0.0.1-commit.1142ef1

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 (191) hide show
  1. package/dest/client/factory.js +1 -1
  2. package/dest/client/interface.d.ts +18 -5
  3. package/dest/client/interface.d.ts.map +1 -1
  4. package/dest/client/p2p_client.d.ts +10 -13
  5. package/dest/client/p2p_client.d.ts.map +1 -1
  6. package/dest/client/p2p_client.js +450 -119
  7. package/dest/config.d.ts +4 -7
  8. package/dest/config.d.ts.map +1 -1
  9. package/dest/config.js +6 -9
  10. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +61 -42
  11. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  12. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
  13. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
  14. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +225 -262
  15. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -18
  16. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
  17. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +113 -108
  18. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -16
  19. package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
  20. package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +89 -128
  21. package/dest/mem_pools/attestation_pool/mocks.d.ts +7 -6
  22. package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
  23. package/dest/mem_pools/attestation_pool/mocks.js +9 -8
  24. package/dest/mem_pools/instrumentation.d.ts +3 -3
  25. package/dest/mem_pools/instrumentation.d.ts.map +1 -1
  26. package/dest/mem_pools/instrumentation.js +10 -17
  27. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +28 -24
  28. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
  29. package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +260 -325
  30. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +18 -0
  31. package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
  32. package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +56 -0
  33. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +83 -0
  34. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
  35. package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +5 -0
  36. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +15 -0
  37. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +1 -0
  38. package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +88 -0
  39. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
  40. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
  41. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
  42. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
  43. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
  44. package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +76 -0
  45. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
  46. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
  47. package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
  48. package/dest/mem_pools/tx_pool/index.d.ts +1 -2
  49. package/dest/mem_pools/tx_pool/index.d.ts.map +1 -1
  50. package/dest/mem_pools/tx_pool/index.js +0 -1
  51. package/dest/mem_pools/tx_pool/priority.d.ts +5 -1
  52. package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -1
  53. package/dest/mem_pools/tx_pool/priority.js +6 -1
  54. package/dest/mem_pools/tx_pool/tx_pool.d.ts +8 -4
  55. package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
  56. package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +7 -7
  57. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
  58. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
  59. package/dest/msg_validators/attestation_validator/attestation_validator.js +12 -10
  60. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
  61. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
  62. package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +7 -10
  63. package/dest/msg_validators/index.d.ts +2 -2
  64. package/dest/msg_validators/index.d.ts.map +1 -1
  65. package/dest/msg_validators/index.js +1 -1
  66. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
  67. package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
  68. package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
  69. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
  70. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
  71. package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
  72. package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
  73. package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
  74. package/dest/msg_validators/proposal_validator/index.js +3 -0
  75. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
  76. package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
  77. package/dest/msg_validators/{block_proposal_validator/block_proposal_validator.js → proposal_validator/proposal_validator.js} +19 -21
  78. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
  79. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
  80. package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +183 -0
  81. package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
  82. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
  83. package/dest/msg_validators/tx_validator/metadata_validator.d.ts +1 -1
  84. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
  85. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +1 -1
  86. package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
  87. package/dest/services/dummy_service.d.ts +6 -2
  88. package/dest/services/dummy_service.d.ts.map +1 -1
  89. package/dest/services/dummy_service.js +3 -0
  90. package/dest/services/encoding.d.ts +1 -1
  91. package/dest/services/encoding.d.ts.map +1 -1
  92. package/dest/services/encoding.js +4 -2
  93. package/dest/services/libp2p/instrumentation.d.ts +1 -1
  94. package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
  95. package/dest/services/libp2p/instrumentation.js +15 -68
  96. package/dest/services/libp2p/libp2p_service.d.ts +27 -10
  97. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
  98. package/dest/services/libp2p/libp2p_service.js +696 -137
  99. package/dest/services/peer-manager/metrics.d.ts +6 -1
  100. package/dest/services/peer-manager/metrics.d.ts.map +1 -1
  101. package/dest/services/peer-manager/metrics.js +18 -21
  102. package/dest/services/peer-manager/peer_manager.d.ts +2 -2
  103. package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
  104. package/dest/services/peer-manager/peer_manager.js +2 -10
  105. package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
  106. package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
  107. package/dest/services/peer-manager/peer_scoring.js +2 -5
  108. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +1 -1
  109. package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
  110. package/dest/services/reqresp/metrics.d.ts +1 -1
  111. package/dest/services/reqresp/metrics.d.ts.map +1 -1
  112. package/dest/services/reqresp/metrics.js +5 -21
  113. package/dest/services/reqresp/protocols/status.d.ts +1 -1
  114. package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
  115. package/dest/services/reqresp/protocols/status.js +2 -0
  116. package/dest/services/reqresp/reqresp.js +402 -24
  117. package/dest/services/service.d.ts +16 -3
  118. package/dest/services/service.d.ts.map +1 -1
  119. package/dest/services/tx_collection/instrumentation.d.ts +1 -1
  120. package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
  121. package/dest/services/tx_collection/instrumentation.js +4 -14
  122. package/dest/services/tx_provider.d.ts +1 -1
  123. package/dest/services/tx_provider.d.ts.map +1 -1
  124. package/dest/services/tx_provider.js +3 -1
  125. package/dest/services/tx_provider_instrumentation.d.ts +1 -1
  126. package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
  127. package/dest/services/tx_provider_instrumentation.js +6 -19
  128. package/dest/testbench/p2p_client_testbench_worker.js +26 -11
  129. package/dest/testbench/worker_client_manager.d.ts +1 -1
  130. package/dest/testbench/worker_client_manager.d.ts.map +1 -1
  131. package/dest/testbench/worker_client_manager.js +6 -1
  132. package/package.json +14 -14
  133. package/src/client/factory.ts +1 -1
  134. package/src/client/interface.ts +19 -4
  135. package/src/client/p2p_client.ts +79 -129
  136. package/src/config.ts +8 -14
  137. package/src/mem_pools/attestation_pool/attestation_pool.ts +68 -41
  138. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +231 -287
  139. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +162 -140
  140. package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +141 -164
  141. package/src/mem_pools/attestation_pool/mocks.ts +13 -9
  142. package/src/mem_pools/instrumentation.ts +18 -25
  143. package/src/mem_pools/tx_pool/README.md +255 -0
  144. package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +307 -370
  145. package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +71 -0
  146. package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +93 -0
  147. package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +108 -0
  148. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
  149. package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +91 -0
  150. package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
  151. package/src/mem_pools/tx_pool/index.ts +0 -1
  152. package/src/mem_pools/tx_pool/priority.ts +8 -1
  153. package/src/mem_pools/tx_pool/tx_pool.ts +8 -3
  154. package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +7 -7
  155. package/src/msg_validators/attestation_validator/attestation_validator.ts +16 -13
  156. package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +9 -12
  157. package/src/msg_validators/index.ts +1 -1
  158. package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
  159. package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
  160. package/src/msg_validators/proposal_validator/index.ts +3 -0
  161. package/src/msg_validators/{block_proposal_validator/block_proposal_validator.ts → proposal_validator/proposal_validator.ts} +23 -28
  162. package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +206 -0
  163. package/src/msg_validators/tx_validator/data_validator.ts +12 -4
  164. package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
  165. package/src/msg_validators/tx_validator/timestamp_validator.ts +3 -1
  166. package/src/services/dummy_service.ts +6 -0
  167. package/src/services/encoding.ts +3 -1
  168. package/src/services/libp2p/instrumentation.ts +14 -68
  169. package/src/services/libp2p/libp2p_service.ts +324 -100
  170. package/src/services/peer-manager/metrics.ts +22 -21
  171. package/src/services/peer-manager/peer_manager.ts +3 -2
  172. package/src/services/peer-manager/peer_scoring.ts +1 -5
  173. package/src/services/reqresp/connection-sampler/connection_sampler.ts +3 -1
  174. package/src/services/reqresp/metrics.ts +7 -23
  175. package/src/services/reqresp/protocols/status.ts +2 -1
  176. package/src/services/service.ts +19 -4
  177. package/src/services/tx_collection/instrumentation.ts +4 -21
  178. package/src/services/tx_provider.ts +4 -1
  179. package/src/services/tx_provider_instrumentation.ts +11 -24
  180. package/src/testbench/p2p_client_testbench_worker.ts +35 -11
  181. package/src/testbench/worker_client_manager.ts +6 -1
  182. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +0 -81
  183. package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +0 -1
  184. package/dest/mem_pools/tx_pool/memory_tx_pool.js +0 -242
  185. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
  186. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
  187. package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
  188. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
  189. package/dest/msg_validators/block_proposal_validator/index.js +0 -1
  190. package/src/mem_pools/tx_pool/memory_tx_pool.ts +0 -288
  191. package/src/msg_validators/block_proposal_validator/index.ts +0 -1
@@ -1,60 +1,93 @@
1
1
  import { createLogger } from '@aztec/foundation/log';
2
2
  import { getTelemetryClient } from '@aztec/telemetry-client';
3
+ import { ProposalSlotCapExceededError } from '../../errors/attestation-pool.error.js';
3
4
  import { PoolInstrumentation, PoolName } from '../instrumentation.js';
4
5
  import { ATTESTATION_CAP_BUFFER, MAX_PROPOSALS_PER_SLOT } from './kv_attestation_pool.js';
5
6
  export class InMemoryAttestationPool {
6
7
  log;
7
8
  metrics;
8
- // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
9
- attestations;
10
9
  proposals;
10
+ // Checkpoint attestations
11
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
12
+ checkpointAttestations;
13
+ checkpointProposals;
11
14
  constructor(telemetry = getTelemetryClient(), log = createLogger('p2p:attestation_pool')){
12
15
  this.log = log;
13
16
  this.poolStats = ()=>{
14
17
  return Promise.resolve({
15
- itemCount: this.attestations.size
18
+ itemCount: this.checkpointAttestations.size
16
19
  });
17
20
  };
18
- this.attestations = new Map();
19
21
  this.proposals = new Map();
22
+ this.checkpointAttestations = new Map();
23
+ this.checkpointProposals = new Map();
20
24
  this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL, this.poolStats);
21
25
  }
22
26
  poolStats;
23
27
  isEmpty() {
24
- return Promise.resolve(this.attestations.size === 0);
28
+ return Promise.resolve(this.checkpointAttestations.size === 0 && this.proposals.size === 0);
25
29
  }
26
- getAttestationsForSlot(slot) {
27
- return Promise.resolve(Array.from(this.attestations.get(slot)?.values() ?? []).flatMap((proposalAttestationMap)=>Array.from(proposalAttestationMap.values())));
30
+ addBlockProposal(blockProposal) {
31
+ // Strip signedTxs before storing to avoid holding full tx data in memory
32
+ this.proposals.set(blockProposal.archive.toString(), blockProposal.withoutSignedTxs());
33
+ return Promise.resolve();
28
34
  }
29
- getAttestationsForSlotAndProposal(slot, proposalId) {
30
- const slotAttestationMap = this.attestations.get(slot);
31
- if (slotAttestationMap) {
32
- const proposalAttestationMap = slotAttestationMap.get(proposalId);
33
- if (proposalAttestationMap) {
34
- return Promise.resolve(Array.from(proposalAttestationMap.values()));
35
- }
35
+ getBlockProposal(id) {
36
+ return Promise.resolve(this.proposals.get(id));
37
+ }
38
+ hasBlockProposal(idOrProposal) {
39
+ const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.archive.toString();
40
+ return Promise.resolve(this.proposals.has(id));
41
+ }
42
+ canAddProposal(_block) {
43
+ // TODO(palla/mbps): See when to allow
44
+ return Promise.resolve(true);
45
+ }
46
+ // Checkpoint attestation methods
47
+ async addCheckpointProposal(proposal) {
48
+ if (!await this.canAddCheckpointProposal(proposal)) {
49
+ throw new ProposalSlotCapExceededError(`Maximum checkpoint proposals per slot reached: slot=${proposal.slotNumber} cap=${MAX_PROPOSALS_PER_SLOT} proposal=${proposal.archive.toString()}`);
36
50
  }
37
- return Promise.resolve([]);
51
+ // Extract and validate the block proposal if present
52
+ const blockProposal = proposal.getBlockProposal();
53
+ if (blockProposal && !await this.canAddProposal(blockProposal)) {
54
+ throw new ProposalSlotCapExceededError(`Maximum block proposals per slot reached when extracting from checkpoint: slot=${proposal.slotNumber} proposal=${blockProposal.archive.toString()}`);
55
+ }
56
+ const slotProposalMapping = getCheckpointSlotOrDefault(this.checkpointAttestations, proposal.slotNumber);
57
+ slotProposalMapping.set(proposal.archive.toString(), new Map());
58
+ // Store the checkpoint proposal as core (without lastBlock) to avoid duplication
59
+ this.checkpointProposals.set(proposal.archive.toString(), proposal.toCore());
60
+ // Store the extracted block proposal separately
61
+ if (blockProposal) {
62
+ this.proposals.set(blockProposal.archive.toString(), blockProposal.withoutSignedTxs());
63
+ }
64
+ return Promise.resolve();
65
+ }
66
+ getCheckpointProposal(id) {
67
+ return Promise.resolve(this.checkpointProposals.get(id));
38
68
  }
39
- addAttestations(attestations) {
69
+ hasCheckpointProposal(idOrProposal) {
70
+ const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.archive.toString();
71
+ return Promise.resolve(this.checkpointProposals.has(id));
72
+ }
73
+ addCheckpointAttestations(attestations) {
40
74
  for (const attestation of attestations){
41
- // Perf: order and group by slot before insertion
42
75
  const slotNumber = attestation.payload.header.slotNumber;
43
76
  const proposalId = attestation.archive.toString();
44
77
  const sender = attestation.getSender();
45
78
  // Skip attestations with invalid signatures
46
79
  if (!sender) {
47
- this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber}`, {
80
+ this.log.warn(`Skipping checkpoint attestation with invalid signature for slot ${slotNumber}`, {
48
81
  signature: attestation.signature.toString(),
49
82
  slotNumber,
50
83
  proposalId
51
84
  });
52
85
  continue;
53
86
  }
54
- const slotAttestationMap = getSlotOrDefault(this.attestations, slotNumber);
55
- const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
87
+ const slotAttestationMap = getCheckpointSlotOrDefault(this.checkpointAttestations, slotNumber);
88
+ const proposalAttestationMap = getCheckpointProposalOrDefault(slotAttestationMap, proposalId);
56
89
  proposalAttestationMap.set(sender.toString(), attestation);
57
- this.log.verbose(`Added attestation for slot ${slotNumber} from ${sender}`, {
90
+ this.log.verbose(`Added checkpoint attestation for slot ${slotNumber} from ${sender}`, {
58
91
  signature: attestation.signature.toString(),
59
92
  slotNumber,
60
93
  address: sender,
@@ -63,22 +96,22 @@ export class InMemoryAttestationPool {
63
96
  }
64
97
  return Promise.resolve();
65
98
  }
66
- #getNumberOfAttestationsInSlot(slot) {
67
- let total = 0;
68
- const slotAttestationMap = getSlotOrDefault(this.attestations, slot);
99
+ getCheckpointAttestationsForSlot(slot) {
100
+ return Promise.resolve(Array.from(this.checkpointAttestations.get(slot)?.values() ?? []).flatMap((proposalAttestationMap)=>Array.from(proposalAttestationMap.values())));
101
+ }
102
+ getCheckpointAttestationsForSlotAndProposal(slot, proposalId) {
103
+ const slotAttestationMap = this.checkpointAttestations.get(slot);
69
104
  if (slotAttestationMap) {
70
- for (const proposalAttestationMap of slotAttestationMap.values() ?? []){
71
- total += proposalAttestationMap.size;
105
+ const proposalAttestationMap = slotAttestationMap.get(proposalId);
106
+ if (proposalAttestationMap) {
107
+ return Promise.resolve(Array.from(proposalAttestationMap.values()));
72
108
  }
73
109
  }
74
- return total;
110
+ return Promise.resolve([]);
75
111
  }
76
- async deleteAttestationsOlderThan(oldestSlot) {
112
+ deleteCheckpointAttestationsOlderThan(oldestSlot) {
77
113
  const olderThan = [];
78
- // Entries are iterated in insertion order, so we can break as soon as we find a slot that is older than the oldestSlot.
79
- // Note: this will only prune correctly if attestations are added in order of rising slot, it is important that we do not allow
80
- // insertion of attestations that are old. #(https://github.com/AztecProtocol/aztec-packages/issues/10322)
81
- const slots = this.attestations.keys();
114
+ const slots = this.checkpointAttestations.keys();
82
115
  for (const slot of slots){
83
116
  if (slot < oldestSlot) {
84
117
  olderThan.push(slot);
@@ -87,57 +120,32 @@ export class InMemoryAttestationPool {
87
120
  }
88
121
  }
89
122
  for (const oldSlot of olderThan){
90
- await this.deleteAttestationsForSlot(oldSlot);
123
+ const proposalIds = this.checkpointAttestations.get(oldSlot)?.keys();
124
+ proposalIds?.forEach((proposalId)=>this.checkpointProposals.delete(proposalId));
125
+ this.checkpointAttestations.delete(oldSlot);
91
126
  }
92
127
  return Promise.resolve();
93
128
  }
94
- deleteAttestationsForSlot(slot) {
95
- // We count the number of attestations we are removing
96
- const numberOfAttestations = this.#getNumberOfAttestationsInSlot(slot);
97
- const proposalIdsToDelete = this.attestations.get(slot)?.keys();
98
- let proposalIdsToDeleteCount = 0;
99
- proposalIdsToDelete?.forEach((proposalId)=>{
100
- this.proposals.delete(proposalId);
101
- proposalIdsToDeleteCount++;
102
- });
103
- this.attestations.delete(slot);
104
- this.log.verbose(`Removed ${numberOfAttestations} attestations and ${proposalIdsToDeleteCount} proposals for slot ${slot}`);
105
- return Promise.resolve();
129
+ hasReachedCheckpointProposalCap(slot) {
130
+ const slotAttestationMap = this.checkpointAttestations.get(slot);
131
+ const proposalCount = slotAttestationMap?.size ?? 0;
132
+ return Promise.resolve(proposalCount >= MAX_PROPOSALS_PER_SLOT);
106
133
  }
107
- deleteAttestationsForSlotAndProposal(slot, proposalId) {
108
- const slotAttestationMap = getSlotOrDefault(this.attestations, slot);
109
- if (slotAttestationMap) {
110
- if (slotAttestationMap.has(proposalId)) {
111
- const numberOfAttestations = slotAttestationMap.get(proposalId)?.size ?? 0;
112
- slotAttestationMap.delete(proposalId);
113
- this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
114
- }
115
- }
116
- this.proposals.delete(proposalId);
117
- return Promise.resolve();
134
+ hasReachedCheckpointAttestationCap(slot, proposalId, committeeSize) {
135
+ const limit = committeeSize + ATTESTATION_CAP_BUFFER;
136
+ const count = this.checkpointAttestations.get(slot)?.get(proposalId)?.size ?? 0;
137
+ return Promise.resolve(limit <= 0 || count >= limit);
118
138
  }
119
- deleteAttestations(attestations) {
120
- for (const attestation of attestations){
121
- const slotNumber = attestation.payload.header.slotNumber;
122
- const slotAttestationMap = this.attestations.get(slotNumber);
123
- if (slotAttestationMap) {
124
- const proposalId = attestation.archive.toString();
125
- const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
126
- if (proposalAttestationMap) {
127
- const sender = attestation.getSender();
128
- // Skip attestations with invalid signatures
129
- if (!sender) {
130
- this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber}`);
131
- continue;
132
- }
133
- proposalAttestationMap.delete(sender.toString());
134
- this.log.debug(`Deleted attestation for slot ${slotNumber} from ${sender}`);
135
- }
136
- }
137
- }
138
- return Promise.resolve();
139
+ async canAddCheckpointProposal(proposal) {
140
+ return this.checkpointProposals.has(proposal.archive.toString()) || !await this.hasReachedCheckpointProposalCap(proposal.slotNumber);
139
141
  }
140
- hasAttestation(attestation) {
142
+ async canAddCheckpointAttestation(attestation, committeeSize) {
143
+ const sender = attestation.getSender();
144
+ const slot = attestation.payload.header.slotNumber;
145
+ const pid = attestation.archive.toString();
146
+ return !!sender && ((this.checkpointAttestations.get(slot)?.get(pid)?.has(sender.toString()) ?? false) || !await this.hasReachedCheckpointAttestationCap(slot, pid, committeeSize));
147
+ }
148
+ hasCheckpointAttestation(attestation) {
141
149
  const slotNumber = attestation.payload.header.slotNumber;
142
150
  const proposalId = attestation.archive.toString();
143
151
  const sender = attestation.getSender();
@@ -145,7 +153,7 @@ export class InMemoryAttestationPool {
145
153
  if (!sender) {
146
154
  return Promise.resolve(false);
147
155
  }
148
- const slotAttestationMap = this.attestations.get(slotNumber);
156
+ const slotAttestationMap = this.checkpointAttestations.get(slotNumber);
149
157
  if (!slotAttestationMap) {
150
158
  return Promise.resolve(false);
151
159
  }
@@ -155,63 +163,16 @@ export class InMemoryAttestationPool {
155
163
  }
156
164
  return Promise.resolve(proposalAttestationMap.has(sender.toString()));
157
165
  }
158
- addBlockProposal(blockProposal) {
159
- // We initialize slot-proposal mapping if it does not exist
160
- // This is important to ensure we can delete this proposal if there were not attestations for it
161
- const slotProposalMapping = getSlotOrDefault(this.attestations, blockProposal.slotNumber);
162
- slotProposalMapping.set(blockProposal.payload.archive.toString(), new Map());
163
- this.proposals.set(blockProposal.payload.archive.toString(), blockProposal);
164
- return Promise.resolve();
165
- }
166
- getBlockProposal(id) {
167
- return Promise.resolve(this.proposals.get(id));
168
- }
169
- hasBlockProposal(idOrProposal) {
170
- const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.payload.archive.toString();
171
- return Promise.resolve(this.proposals.has(id));
172
- }
173
- hasReachedProposalCap(slot) {
174
- const slotAttestationMap = this.attestations.get(slot);
175
- const proposalCount = slotAttestationMap?.size ?? 0;
176
- return Promise.resolve(proposalCount >= MAX_PROPOSALS_PER_SLOT);
177
- }
178
- hasReachedAttestationCap(slot, proposalId, committeeSize) {
179
- const limit = committeeSize + ATTESTATION_CAP_BUFFER;
180
- const count = this.attestations.get(slot)?.get(proposalId)?.size ?? 0;
181
- return Promise.resolve(limit <= 0 || count >= limit);
182
- }
183
- async canAddProposal(block) {
184
- return this.proposals.has(block.archive.toString()) || !await this.hasReachedProposalCap(block.slotNumber);
185
- }
186
- async canAddAttestation(attestation, committeeSize) {
187
- const sender = attestation.getSender();
188
- const slot = attestation.payload.header.slotNumber;
189
- const pid = attestation.archive.toString();
190
- return !!sender && ((this.attestations.get(slot)?.get(pid)?.has(sender.toString()) ?? false) || !await this.hasReachedAttestationCap(slot, pid, committeeSize));
191
- }
192
166
  }
193
- /**
194
- * Get Slot or Default
195
- *
196
- * Fetch the slot mapping, if it does not exist, then create a mapping and return it
197
- * @param map - The map to fetch from
198
- * @param slot - The slot to fetch
199
- * @returns The slot mapping
200
- */ function getSlotOrDefault(// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
167
+ // Checkpoint attestation helper functions
168
+ function getCheckpointSlotOrDefault(// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
201
169
  map, slot) {
202
170
  if (!map.has(slot)) {
203
171
  map.set(slot, new Map());
204
172
  }
205
173
  return map.get(slot);
206
174
  }
207
- /**
208
- * Get Proposal or Default
209
- *
210
- * Fetch the proposal mapping, if it does not exist, then create a mapping and return it
211
- * @param map - The map to fetch from
212
- * @param proposalId - The proposal id to fetch
213
- * @returns The proposal mapping
214
- */ function getProposalOrDefault(map, proposalId) {
175
+ function getCheckpointProposalOrDefault(map, proposalId) {
215
176
  if (!map.has(proposalId)) {
216
177
  map.set(proposalId, new Map());
217
178
  }
@@ -1,6 +1,6 @@
1
1
  import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
- import { BlockAttestation } from '@aztec/stdlib/p2p';
3
+ import { CheckpointAttestation } from '@aztec/stdlib/p2p';
4
4
  /** Generate Account
5
5
  *
6
6
  * Create a random signer
@@ -229,11 +229,12 @@ export declare const generateAccount: () => {
229
229
  source: string;
230
230
  type: "local";
231
231
  };
232
- /** Mock Attestation
232
+ /** Mock Checkpoint Attestation
233
233
  *
234
- * @param signer A viem signer to create a signature
234
+ * @param signer A Secp256k1Signer to create a signature
235
235
  * @param slot The slot number the attestation is for
236
- * @returns A Block Attestation
236
+ * @param archive The archive root (defaults to random)
237
+ * @returns A Checkpoint Attestation
237
238
  */
238
- export declare const mockAttestation: (signer: Secp256k1Signer, slot?: number, archive?: Fr) => BlockAttestation;
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9tb2Nrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUNMLGdCQUFnQixFQUlqQixNQUFNLG1CQUFtQixDQUFDO0FBSzNCOzs7O0dBSUc7QUFDSCxlQUFPLE1BQU0sZUFBZTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBRzNCLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILGVBQU8sTUFBTSxlQUFlLDRFQWdCM0IsQ0FBQyJ9
239
+ export declare const mockCheckpointAttestation: (signer: Secp256k1Signer, slot?: number, archive?: Fr) => CheckpointAttestation;
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9tb2Nrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUNMLHFCQUFxQixFQUl0QixNQUFNLG1CQUFtQixDQUFDO0FBSzNCOzs7O0dBSUc7QUFDSCxlQUFPLE1BQU0sZUFBZTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBRzNCLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxlQUFPLE1BQU0seUJBQXlCLGlGQW1CckMsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/mocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EACL,gBAAgB,EAIjB,MAAM,mBAAmB,CAAC;AAK3B;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG3B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,4EAgB3B,CAAC"}
1
+ {"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/mocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EACL,qBAAqB,EAItB,MAAM,mBAAmB,CAAC;AAK3B;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG3B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,iFAmBrC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { Fr } from '@aztec/foundation/curves/bn254';
2
- import { BlockAttestation, ConsensusPayload, SignatureDomainSeparator, getHashedSignaturePayloadEthSignedMessage } from '@aztec/stdlib/p2p';
2
+ import { CheckpointAttestation, ConsensusPayload, SignatureDomainSeparator, getHashedSignaturePayloadEthSignedMessage } from '@aztec/stdlib/p2p';
3
3
  import { makeL2BlockHeader } from '@aztec/stdlib/testing';
4
4
  import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
5
5
  /** Generate Account
@@ -10,18 +10,19 @@ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
10
10
  const privateKey = generatePrivateKey();
11
11
  return privateKeyToAccount(privateKey);
12
12
  };
13
- /** Mock Attestation
13
+ /** Mock Checkpoint Attestation
14
14
  *
15
- * @param signer A viem signer to create a signature
15
+ * @param signer A Secp256k1Signer to create a signature
16
16
  * @param slot The slot number the attestation is for
17
- * @returns A Block Attestation
18
- */ export const mockAttestation = (signer, slot = 0, archive = Fr.random())=>{
17
+ * @param archive The archive root (defaults to random)
18
+ * @returns A Checkpoint Attestation
19
+ */ export const mockCheckpointAttestation = (signer, slot = 0, archive = Fr.random())=>{
19
20
  // Use arbitrary numbers for all other than slot
20
21
  const header = makeL2BlockHeader(1, 2, slot);
21
22
  const payload = new ConsensusPayload(header.toCheckpointHeader(), archive);
22
- const attestationHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockAttestation);
23
+ const attestationHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.checkpointAttestation);
23
24
  const attestationSignature = signer.sign(attestationHash);
24
- const proposalHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockProposal);
25
+ const proposalHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.checkpointProposal);
25
26
  const proposerSignature = signer.sign(proposalHash);
26
- return new BlockAttestation(payload, attestationSignature, proposerSignature);
27
+ return new CheckpointAttestation(payload, attestationSignature, proposerSignature);
27
28
  };
@@ -1,5 +1,5 @@
1
1
  import type { Gossipable } from '@aztec/stdlib/p2p';
2
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
2
+ import type { Tx } from '@aztec/stdlib/tx';
3
3
  import { type LmdbStatsCallback, type TelemetryClient } from '@aztec/telemetry-client';
4
4
  export declare enum PoolName {
5
5
  TX_POOL = "TxPool",
@@ -28,7 +28,7 @@ export declare class PoolInstrumentation<PoolObject extends Gossipable> {
28
28
  recordSize(poolObject: PoolObject): void;
29
29
  incrementAddedObjects(count: number): void;
30
30
  transactionsAdded(transactions: Tx[]): void;
31
- transactionsRemoved(hashes: TxHash[]): void;
31
+ transactionsRemoved(hashes: Iterable<bigint> | Iterable<string>): void;
32
32
  private observeStats;
33
33
  }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWVtX3Bvb2xzL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxFQUtMLEtBQUssaUJBQWlCLEVBS3RCLEtBQUssZUFBZSxFQUVyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLG9CQUFZLFFBQVE7SUFDbEIsT0FBTyxXQUFXO0lBQ2xCLGdCQUFnQixvQkFBb0I7Q0FDckM7QUFrQ0QsTUFBTSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sT0FBTyxDQUFDO0lBQzVDLFNBQVMsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztDQUM1QyxDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILHFCQUFhLG1CQUFtQixDQUFDLFVBQVUsU0FBUyxVQUFVO0lBbUIxRCxPQUFPLENBQUMsU0FBUztJQWxCbkIsdUNBQXVDO0lBQ3ZDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBa0I7SUFDMUMsT0FBTyxDQUFDLGdCQUFnQixDQUFnQjtJQUN4QyxxQkFBcUI7SUFDckIsT0FBTyxDQUFDLFVBQVUsQ0FBWTtJQUM5Qix3REFBd0Q7SUFDeEQsT0FBTyxDQUFDLFVBQVUsQ0FBWTtJQUU5QixPQUFPLENBQUMsU0FBUyxDQUFjO0lBRS9CLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztJQUMxQixPQUFPLENBQUMsS0FBSyxDQUFRO0lBRXJCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBa0Q7SUFFMUUsWUFDRSxTQUFTLEVBQUUsZUFBZSxFQUMxQixJQUFJLEVBQUUsUUFBUSxFQUNOLFNBQVMsRUFBRSxpQkFBaUIsRUFDcEMsT0FBTyxDQUFDLEVBQUUsaUJBQWlCLEVBaUM1QjtJQUVNLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxRQUV2QztJQUVNLHFCQUFxQixDQUFDLEtBQUssRUFBRSxNQUFNLFFBRXpDO0lBRU0saUJBQWlCLENBQUMsWUFBWSxFQUFFLEVBQUUsRUFBRSxRQUsxQztJQUVNLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFVMUM7SUFFRCxPQUFPLENBQUMsWUFBWSxDQVlsQjtDQUNIIn0=
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWVtX3Bvb2xzL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBS0wsS0FBSyxpQkFBaUIsRUFLdEIsS0FBSyxlQUFlLEVBRXJCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsb0JBQVksUUFBUTtJQUNsQixPQUFPLFdBQVc7SUFDbEIsZ0JBQWdCLG9CQUFvQjtDQUNyQztBQWtDRCxNQUFNLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxPQUFPLENBQUM7SUFDNUMsU0FBUyxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQzVDLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ0gscUJBQWEsbUJBQW1CLENBQUMsVUFBVSxTQUFTLFVBQVU7SUFtQjFELE9BQU8sQ0FBQyxTQUFTO0lBbEJuQix1Q0FBdUM7SUFDdkMsT0FBTyxDQUFDLGdCQUFnQixDQUFrQjtJQUMxQyxPQUFPLENBQUMsZ0JBQWdCLENBQWdCO0lBQ3hDLHFCQUFxQjtJQUNyQixPQUFPLENBQUMsVUFBVSxDQUFZO0lBQzlCLHdEQUF3RDtJQUN4RCxPQUFPLENBQUMsVUFBVSxDQUFZO0lBRTlCLE9BQU8sQ0FBQyxTQUFTLENBQWM7SUFFL0IsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0lBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQVE7SUFFckIsT0FBTyxDQUFDLGdCQUFnQixDQUFrRDtJQUUxRSxZQUNFLFNBQVMsRUFBRSxlQUFlLEVBQzFCLElBQUksRUFBRSxRQUFRLEVBQ04sU0FBUyxFQUFFLGlCQUFpQixFQUNwQyxPQUFPLENBQUMsRUFBRSxpQkFBaUIsRUF3QjVCO0lBRU0sVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLFFBRXZDO0lBRU0scUJBQXFCLENBQUMsS0FBSyxFQUFFLE1BQU0sUUFFekM7SUFFTSxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLFFBSzFDO0lBRU0sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBWXJFO0lBRUQsT0FBTyxDQUFDLFlBQVksQ0FZbEI7Q0FDSCJ9
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/mem_pools/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAKL,KAAK,iBAAiB,EAKtB,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAC;AAEjC,oBAAY,QAAQ;IAClB,OAAO,WAAW;IAClB,gBAAgB,oBAAoB;CACrC;AAkCD,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC;IAC5C,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C,CAAC,CAAC;AAEH;;GAEG;AACH,qBAAa,mBAAmB,CAAC,UAAU,SAAS,UAAU;IAmB1D,OAAO,CAAC,SAAS;IAlBnB,uCAAuC;IACvC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IACxC,qBAAqB;IACrB,OAAO,CAAC,UAAU,CAAY;IAC9B,wDAAwD;IACxD,OAAO,CAAC,UAAU,CAAY;IAE9B,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,gBAAgB,CAAkD;IAE1E,YACE,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,QAAQ,EACN,SAAS,EAAE,iBAAiB,EACpC,OAAO,CAAC,EAAE,iBAAiB,EAiC5B;IAEM,UAAU,CAAC,UAAU,EAAE,UAAU,QAEvC;IAEM,qBAAqB,CAAC,KAAK,EAAE,MAAM,QAEzC;IAEM,iBAAiB,CAAC,YAAY,EAAE,EAAE,EAAE,QAK1C;IAEM,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAU1C;IAED,OAAO,CAAC,YAAY,CAYlB;CACH"}
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/mem_pools/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAKL,KAAK,iBAAiB,EAKtB,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAC;AAEjC,oBAAY,QAAQ;IAClB,OAAO,WAAW;IAClB,gBAAgB,oBAAoB;CACrC;AAkCD,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC;IAC5C,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C,CAAC,CAAC;AAEH;;GAEG;AACH,qBAAa,mBAAmB,CAAC,UAAU,SAAS,UAAU;IAmB1D,OAAO,CAAC,SAAS;IAlBnB,uCAAuC;IACvC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IACxC,qBAAqB;IACrB,OAAO,CAAC,UAAU,CAAY;IAC9B,wDAAwD;IACxD,OAAO,CAAC,UAAU,CAAY;IAE9B,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,gBAAgB,CAAkD;IAE1E,YACE,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,QAAQ,EACN,SAAS,EAAE,iBAAiB,EACpC,OAAO,CAAC,EAAE,iBAAiB,EAwB5B;IAEM,UAAU,CAAC,UAAU,EAAE,UAAU,QAEvC;IAEM,qBAAqB,CAAC,KAAK,EAAE,MAAM,QAEzC;IAEM,iBAAiB,CAAC,YAAY,EAAE,EAAE,EAAE,QAK1C;IAEM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,QAYrE;IAED,OAAO,CAAC,YAAY,CAYlB;CACH"}
@@ -59,22 +59,13 @@ export var PoolName = /*#__PURE__*/ function(PoolName) {
59
59
  [Attributes.POOL_NAME]: name
60
60
  };
61
61
  const metricsLabels = getMetricsLabels(name);
62
- this.objectsInMempool = this.meter.createObservableGauge(metricsLabels.objectInMempool, {
63
- description: 'The current number of transactions in the mempool'
64
- });
65
- this.objectSize = this.meter.createHistogram(metricsLabels.objectSize, {
66
- unit: 'By',
67
- description: 'The size of transactions in the mempool'
68
- });
62
+ this.objectsInMempool = this.meter.createObservableGauge(metricsLabels.objectInMempool);
63
+ this.objectSize = this.meter.createHistogram(metricsLabels.objectSize);
69
64
  this.dbMetrics = new LmdbMetrics(this.meter, {
70
65
  [Attributes.DB_DATA_TYPE]: 'tx-pool'
71
66
  }, dbStats);
72
- this.addObjectCounter = this.meter.createUpDownCounter(metricsLabels.itemsAdded, {
73
- description: 'The number of transactions added to the mempool'
74
- });
75
- this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay, {
76
- description: 'Delay between transaction added and evicted from the mempool'
77
- });
67
+ this.addObjectCounter = this.meter.createUpDownCounter(metricsLabels.itemsAdded);
68
+ this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay);
78
69
  this.meter.addBatchObservableCallback(this.observeStats, [
79
70
  this.objectsInMempool
80
71
  ]);
@@ -88,17 +79,19 @@ export var PoolName = /*#__PURE__*/ function(PoolName) {
88
79
  transactionsAdded(transactions) {
89
80
  const timestamp = Date.now();
90
81
  for (const transaction of transactions){
91
- this.txAddedTimestamp.set(transaction.txHash.toString(), timestamp);
82
+ this.txAddedTimestamp.set(transaction.txHash.toBigInt(), timestamp);
92
83
  }
93
84
  }
94
85
  transactionsRemoved(hashes) {
95
86
  const timestamp = Date.now();
96
87
  for (const hash of hashes){
97
- const key = hash.toString();
88
+ const key = BigInt(hash);
98
89
  const addedAt = this.txAddedTimestamp.get(key);
99
- if (addedAt) {
90
+ if (addedAt !== undefined) {
100
91
  this.txAddedTimestamp.delete(key);
101
- this.minedDelay.record(addedAt - timestamp);
92
+ if (addedAt < timestamp) {
93
+ this.minedDelay.record(timestamp - addedAt);
94
+ }
102
95
  }
103
96
  }
104
97
  }
@@ -1,21 +1,21 @@
1
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
3
  import { type Logger } from '@aztec/foundation/log';
3
4
  import type { TypedEventEmitter } from '@aztec/foundation/types';
4
5
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
5
- import type { MerkleTreeReadOperations, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
6
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
7
+ import type { MerkleTreeReadOperations, ReadonlyWorldStateAccess } from '@aztec/stdlib/interfaces/server';
6
8
  import { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
7
9
  import { type TelemetryClient } from '@aztec/telemetry-client';
8
10
  import { ArchiveCache } from '../../msg_validators/tx_validator/archive_cache.js';
9
- import { GasTxValidator } from '../../msg_validators/tx_validator/gas_validator.js';
11
+ import type { PendingTxInfo, TxBlockReference, TxPoolOperations } from './eviction/eviction_strategy.js';
10
12
  import type { TxPool, TxPoolEvents, TxPoolOptions } from './tx_pool.js';
11
13
  declare const AztecKVTxPool_base: new () => TypedEventEmitter<TxPoolEvents>;
12
14
  /**
13
15
  * KV implementation of the Transaction Pool.
14
16
  */
15
- export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool {
17
+ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool, TxPoolOperations {
16
18
  #private;
17
- /** The tx evicion logic will kick after pool size is greater than maxTxPoolSize * txPoolOverflowFactor */
18
- txPoolOverflowFactor: number;
19
19
  /**
20
20
  * Class constructor for KV TxPool. Initiates our transaction pool as an AztecMap.
21
21
  * @param store - A KV store for live txs in the pool.
@@ -24,7 +24,7 @@ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool
24
24
  * @param archivedTxLimit - The number of txs to archive.
25
25
  * @param log - A logger.
26
26
  */
27
- constructor(store: AztecAsyncKVStore, archive: AztecAsyncKVStore, worldStateSynchronizer: WorldStateSynchronizer, telemetry?: TelemetryClient, config?: TxPoolOptions, log?: Logger);
27
+ constructor(store: AztecAsyncKVStore, archive: AztecAsyncKVStore, worldState: ReadonlyWorldStateAccess, telemetry?: TelemetryClient, config?: TxPoolOptions, log?: Logger);
28
28
  private countTxs;
29
29
  isEmpty(): Promise<boolean>;
30
30
  /**
@@ -35,12 +35,8 @@ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool
35
35
  * @param blockHeader - The header of the block the transactions were mined in
36
36
  */
37
37
  markAsMined(txHashes: TxHash[], blockHeader: BlockHeader): Promise<void>;
38
- markMinedAsPending(txHashes: TxHash[]): Promise<void>;
38
+ markMinedAsPending(txHashes: TxHash[], latestBlock: BlockNumber): Promise<void>;
39
39
  getPendingTxHashes(): Promise<TxHash[]>;
40
- getMinedTxHashes(): Promise<[TxHash, BlockNumber][]>;
41
- getPendingTxCount(): Promise<number>;
42
- getMinedTxCount(): Promise<number>;
43
- getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined>;
44
40
  /**
45
41
  * Checks if a transaction exists in the pool and returns it.
46
42
  * @param txHash - The generated tx hash.
@@ -59,7 +55,7 @@ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool
59
55
  /**
60
56
  * Adds a list of transactions to the pool. Duplicates are ignored.
61
57
  * @param txs - An array of txs to be added to the pool.
62
- * @returns Empty promise.
58
+ * @returns count of added transactions
63
59
  */
64
60
  addTxs(txs: Tx[], opts?: {
65
61
  source?: string;
@@ -71,9 +67,10 @@ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool
71
67
  * @returns Empty promise.
72
68
  */
73
69
  deleteTxs(txHashes: TxHash[], opts?: {
74
- eviction?: boolean;
75
70
  permanently?: boolean;
76
71
  }): Promise<void>;
72
+ private deleteMinedTx;
73
+ private deletePendingTx;
77
74
  /**
78
75
  * Gets all the transactions stored in the pool.
79
76
  * @returns Array of tx objects in the order they were added to the pool.
@@ -84,20 +81,23 @@ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool
84
81
  * @returns An array of transaction hashes found in the tx pool.
85
82
  */
86
83
  getAllTxHashes(): Promise<TxHash[]>;
87
- updateConfig({ maxTxPoolSize, txPoolOverflowFactor, archivedTxLimit }: TxPoolOptions): void;
84
+ getPendingTxInfos(): Promise<PendingTxInfo[]>;
85
+ private getPendingTxInfo;
86
+ getPendingTxsReferencingBlocks(blockHashes: Fr[]): Promise<TxBlockReference[]>;
87
+ getPendingTxsWithFeePayer(feePayers: AztecAddress[]): Promise<PendingTxInfo[]>;
88
+ getMinedTxHashes(): Promise<[TxHash, BlockNumber][]>;
89
+ getPendingTxCount(): Promise<number>;
90
+ getMinedTxCount(): Promise<number>;
91
+ getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined>;
92
+ updateConfig(cfg: TxPoolOptions): void;
88
93
  markTxsAsNonEvictable(txHashes: TxHash[]): Promise<void>;
94
+ clearNonEvictableTxs(): Promise<void>;
89
95
  /**
90
96
  * Permanently deletes deleted mined transactions from blocks up to and including the specified block number.
91
97
  * @param blockNumber - Block number threshold. Deleted mined txs from this block or earlier will be permanently deleted.
92
98
  * @returns The number of transactions permanently deleted.
93
99
  */
94
100
  cleanupDeletedMinedTxs(blockNumber: BlockNumber): Promise<number>;
95
- /**
96
- * Creates a GasTxValidator instance.
97
- * @param db - DB for the validator to use
98
- * @returns A GasTxValidator instance
99
- */
100
- protected createGasTxValidator(db: MerkleTreeReadOperations): GasTxValidator;
101
101
  /**
102
102
  * Creates an ArchiveCache instance.
103
103
  * @param db - DB for the cache to use
@@ -106,11 +106,15 @@ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool
106
106
  protected createArchiveCache(db: MerkleTreeReadOperations): ArchiveCache;
107
107
  private getPendingTxByHash;
108
108
  private archiveTxs;
109
- private evictLowPriorityTxs;
110
- private evictInvalidTxsAfterMining;
111
- private evictInvalidTxsAfterReorg;
109
+ private addPendingTxIndicesInDbTx;
112
110
  private addPendingTxIndices;
111
+ private removePendingTxIndicesInDbTx;
113
112
  private removePendingTxIndices;
113
+ /**
114
+ * Returns up to `limit` lowest-priority evictable pending tx hashes without hydrating transactions.
115
+ * Iterates the priority index in ascending order and skips non-evictable txs.
116
+ */
117
+ getLowestPriorityEvictable(limit: number): Promise<TxHash[]>;
114
118
  }
115
119
  export {};
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp0ZWNfa3ZfdHhfcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy90eF9wb29sL2F6dGVjX2t2X3R4X3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRzlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUEwRCxNQUFNLGlCQUFpQixDQUFDO0FBR2pILE9BQU8sS0FBSyxFQUFFLHdCQUF3QixFQUFFLHNCQUFzQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFJeEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFzQixNQUFNLHlCQUF5QixDQUFDO0FBS25GLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNsRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFHcEYsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRXhFOztHQUVHO0FBQ0gscUJBQWEsYUFBYyxTQUFRLGtCQUE0RCxZQUFXLE1BQU07O0lBUzlHLDBHQUEwRztJQUMxRyxvQkFBb0IsRUFBRSxNQUFNLENBQUs7SUFnRGpDOzs7Ozs7O09BT0c7SUFDSCxZQUNFLEtBQUssRUFBRSxpQkFBaUIsRUFDeEIsT0FBTyxFQUFFLGlCQUFpQixFQUMxQixzQkFBc0IsRUFBRSxzQkFBc0IsRUFDOUMsU0FBUyxHQUFFLGVBQXNDLEVBQ2pELE1BQU0sR0FBRSxhQUFrQixFQUMx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
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp0ZWNfa3ZfdHhfcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy90eF9wb29sL2F6dGVjX2t2X3R4X3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVwRCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RixPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRzFHLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNELE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUtuRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFHbEYsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFNekcsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRXhFOztHQUVHO0FBQ0gscUJBQWEsYUFDWCxTQUFRLGtCQUNSLFlBQVcsTUFBTSxFQUFFLGdCQUFnQjs7SUErQ25DOzs7Ozs7O09BT0c7SUFDSCxZQUNFLEtBQUssRUFBRSxpQkFBaUIsRUFDeEIs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
@@ -1 +1 @@
1
- {"version":3,"file":"aztec_kv_tx_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool/aztec_kv_tx_pool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aztec_kv_tx_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool/aztec_kv_tx_pool.ts"],"names":[],"mappings":"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"}