@aztec/archiver 0.0.1-commit.03f7ef2 → 0.0.1-commit.0b941701

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 (192) hide show
  1. package/README.md +156 -22
  2. package/dest/archiver.d.ts +135 -0
  3. package/dest/archiver.d.ts.map +1 -0
  4. package/dest/archiver.js +768 -0
  5. package/dest/{archiver/config.d.ts → config.d.ts} +9 -1
  6. package/dest/config.d.ts.map +1 -0
  7. package/dest/{archiver/config.js → config.js} +11 -2
  8. package/dest/errors.d.ts +41 -0
  9. package/dest/errors.d.ts.map +1 -0
  10. package/dest/{archiver/errors.js → errors.js} +8 -0
  11. package/dest/factory.d.ts +7 -7
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +87 -8
  14. package/dest/index.d.ts +10 -4
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +8 -3
  17. package/dest/interfaces.d.ts +9 -0
  18. package/dest/interfaces.d.ts.map +1 -0
  19. package/dest/interfaces.js +3 -0
  20. package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.d.ts +1 -1
  21. package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
  22. package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.js +2 -2
  23. package/dest/{archiver/l1 → l1}/calldata_retriever.d.ts +3 -3
  24. package/dest/l1/calldata_retriever.d.ts.map +1 -0
  25. package/dest/{archiver/l1 → l1}/calldata_retriever.js +2 -2
  26. package/dest/l1/data_retrieval.d.ts +88 -0
  27. package/dest/l1/data_retrieval.d.ts.map +1 -0
  28. package/dest/{archiver/l1 → l1}/data_retrieval.js +35 -54
  29. package/dest/{archiver/l1 → l1}/debug_tx.d.ts +1 -1
  30. package/dest/l1/debug_tx.d.ts.map +1 -0
  31. package/dest/{archiver/l1 → l1}/spire_proposer.d.ts +1 -1
  32. package/dest/l1/spire_proposer.d.ts.map +1 -0
  33. package/dest/{archiver/l1 → l1}/trace_tx.d.ts +1 -1
  34. package/dest/l1/trace_tx.d.ts.map +1 -0
  35. package/dest/l1/types.d.ts +12 -0
  36. package/dest/l1/types.d.ts.map +1 -0
  37. package/dest/{archiver/l1 → l1}/validate_trace.d.ts +1 -1
  38. package/dest/l1/validate_trace.d.ts.map +1 -0
  39. package/dest/{archiver/l1 → l1}/validate_trace.js +1 -1
  40. package/dest/modules/data_source_base.d.ts +84 -0
  41. package/dest/modules/data_source_base.d.ts.map +1 -0
  42. package/dest/modules/data_source_base.js +260 -0
  43. package/dest/modules/data_store_updater.d.ts +73 -0
  44. package/dest/modules/data_store_updater.d.ts.map +1 -0
  45. package/dest/modules/data_store_updater.js +302 -0
  46. package/dest/modules/instrumentation.d.ts +37 -0
  47. package/dest/modules/instrumentation.d.ts.map +1 -0
  48. package/dest/{archiver → modules}/instrumentation.js +15 -63
  49. package/dest/modules/l1_synchronizer.d.ts +75 -0
  50. package/dest/modules/l1_synchronizer.d.ts.map +1 -0
  51. package/dest/modules/l1_synchronizer.js +1113 -0
  52. package/dest/modules/validation.d.ts +17 -0
  53. package/dest/modules/validation.d.ts.map +1 -0
  54. package/dest/{archiver → modules}/validation.js +7 -1
  55. package/dest/store/block_store.d.ts +192 -0
  56. package/dest/store/block_store.d.ts.map +1 -0
  57. package/dest/{archiver/kv_archiver_store → store}/block_store.js +162 -48
  58. package/dest/store/contract_class_store.d.ts +18 -0
  59. package/dest/store/contract_class_store.d.ts.map +1 -0
  60. package/dest/{archiver/kv_archiver_store → store}/contract_class_store.js +1 -1
  61. package/dest/store/contract_instance_store.d.ts +24 -0
  62. package/dest/store/contract_instance_store.d.ts.map +1 -0
  63. package/dest/{archiver/kv_archiver_store → store}/contract_instance_store.js +1 -1
  64. package/dest/store/kv_archiver_store.d.ts +340 -0
  65. package/dest/store/kv_archiver_store.d.ts.map +1 -0
  66. package/dest/store/kv_archiver_store.js +447 -0
  67. package/dest/store/log_store.d.ts +54 -0
  68. package/dest/store/log_store.d.ts.map +1 -0
  69. package/dest/{archiver/kv_archiver_store → store}/log_store.js +99 -67
  70. package/dest/{archiver/kv_archiver_store → store}/message_store.d.ts +1 -1
  71. package/dest/store/message_store.d.ts.map +1 -0
  72. package/dest/{archiver/structs → structs}/data_retrieval.d.ts +1 -1
  73. package/dest/structs/data_retrieval.d.ts.map +1 -0
  74. package/dest/structs/inbox_message.d.ts +15 -0
  75. package/dest/structs/inbox_message.d.ts.map +1 -0
  76. package/dest/{archiver/structs → structs}/published.d.ts +1 -1
  77. package/dest/structs/published.d.ts.map +1 -0
  78. package/dest/test/fake_l1_state.d.ts +190 -0
  79. package/dest/test/fake_l1_state.d.ts.map +1 -0
  80. package/dest/test/fake_l1_state.js +383 -0
  81. package/dest/test/index.d.ts +2 -1
  82. package/dest/test/index.d.ts.map +1 -1
  83. package/dest/test/index.js +1 -0
  84. package/dest/test/mock_archiver.d.ts +2 -2
  85. package/dest/test/mock_archiver.d.ts.map +1 -1
  86. package/dest/test/mock_archiver.js +1 -2
  87. package/dest/test/mock_l1_to_l2_message_source.d.ts +2 -2
  88. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
  89. package/dest/test/mock_l1_to_l2_message_source.js +12 -3
  90. package/dest/test/mock_l2_block_source.d.ts +22 -15
  91. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  92. package/dest/test/mock_l2_block_source.js +163 -57
  93. package/dest/test/mock_structs.d.ts +76 -2
  94. package/dest/test/mock_structs.d.ts.map +1 -1
  95. package/dest/test/mock_structs.js +133 -2
  96. package/package.json +15 -17
  97. package/src/archiver.ts +523 -0
  98. package/src/{archiver/config.ts → config.ts} +13 -2
  99. package/src/{archiver/errors.ts → errors.ts} +12 -0
  100. package/src/factory.ts +122 -8
  101. package/src/index.ts +10 -3
  102. package/src/interfaces.ts +9 -0
  103. package/src/{archiver/l1 → l1}/bin/retrieve-calldata.ts +7 -2
  104. package/src/{archiver/l1 → l1}/calldata_retriever.ts +3 -3
  105. package/src/{archiver/l1 → l1}/data_retrieval.ts +56 -73
  106. package/src/{archiver/l1 → l1}/validate_trace.ts +1 -1
  107. package/src/modules/data_source_base.ts +367 -0
  108. package/src/modules/data_store_updater.ts +423 -0
  109. package/src/{archiver → modules}/instrumentation.ts +16 -65
  110. package/src/modules/l1_synchronizer.ts +931 -0
  111. package/src/{archiver → modules}/validation.ts +11 -6
  112. package/src/{archiver/kv_archiver_store → store}/block_store.ts +210 -66
  113. package/src/{archiver/kv_archiver_store → store}/contract_class_store.ts +1 -1
  114. package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +1 -1
  115. package/src/{archiver/kv_archiver_store → store}/kv_archiver_store.ts +236 -35
  116. package/src/{archiver/kv_archiver_store → store}/log_store.ts +159 -106
  117. package/src/test/fake_l1_state.ts +599 -0
  118. package/src/test/index.ts +1 -0
  119. package/src/test/mock_archiver.ts +2 -2
  120. package/src/test/mock_l1_to_l2_message_source.ts +10 -4
  121. package/src/test/mock_l2_block_source.ts +173 -67
  122. package/src/test/mock_structs.ts +247 -2
  123. package/dest/archiver/archiver.d.ts +0 -304
  124. package/dest/archiver/archiver.d.ts.map +0 -1
  125. package/dest/archiver/archiver.js +0 -1645
  126. package/dest/archiver/archiver_store.d.ts +0 -308
  127. package/dest/archiver/archiver_store.d.ts.map +0 -1
  128. package/dest/archiver/archiver_store.js +0 -4
  129. package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
  130. package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
  131. package/dest/archiver/archiver_store_test_suite.js +0 -2790
  132. package/dest/archiver/config.d.ts.map +0 -1
  133. package/dest/archiver/errors.d.ts +0 -36
  134. package/dest/archiver/errors.d.ts.map +0 -1
  135. package/dest/archiver/index.d.ts +0 -7
  136. package/dest/archiver/index.d.ts.map +0 -1
  137. package/dest/archiver/index.js +0 -4
  138. package/dest/archiver/instrumentation.d.ts +0 -37
  139. package/dest/archiver/instrumentation.d.ts.map +0 -1
  140. package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -157
  141. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
  142. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
  143. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
  144. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
  145. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
  146. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -158
  147. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
  148. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -313
  149. package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -45
  150. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
  151. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
  152. package/dest/archiver/l1/bin/retrieve-calldata.d.ts.map +0 -1
  153. package/dest/archiver/l1/calldata_retriever.d.ts.map +0 -1
  154. package/dest/archiver/l1/data_retrieval.d.ts +0 -90
  155. package/dest/archiver/l1/data_retrieval.d.ts.map +0 -1
  156. package/dest/archiver/l1/debug_tx.d.ts.map +0 -1
  157. package/dest/archiver/l1/spire_proposer.d.ts.map +0 -1
  158. package/dest/archiver/l1/trace_tx.d.ts.map +0 -1
  159. package/dest/archiver/l1/types.d.ts +0 -12
  160. package/dest/archiver/l1/types.d.ts.map +0 -1
  161. package/dest/archiver/l1/validate_trace.d.ts.map +0 -1
  162. package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
  163. package/dest/archiver/structs/inbox_message.d.ts +0 -15
  164. package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
  165. package/dest/archiver/structs/published.d.ts.map +0 -1
  166. package/dest/archiver/validation.d.ts +0 -17
  167. package/dest/archiver/validation.d.ts.map +0 -1
  168. package/dest/rpc/index.d.ts +0 -9
  169. package/dest/rpc/index.d.ts.map +0 -1
  170. package/dest/rpc/index.js +0 -15
  171. package/src/archiver/archiver.ts +0 -2157
  172. package/src/archiver/archiver_store.ts +0 -372
  173. package/src/archiver/archiver_store_test_suite.ts +0 -2863
  174. package/src/archiver/index.ts +0 -6
  175. package/src/rpc/index.ts +0 -16
  176. /package/dest/{archiver/l1 → l1}/debug_tx.js +0 -0
  177. /package/dest/{archiver/l1 → l1}/spire_proposer.js +0 -0
  178. /package/dest/{archiver/l1 → l1}/trace_tx.js +0 -0
  179. /package/dest/{archiver/l1 → l1}/types.js +0 -0
  180. /package/dest/{archiver/kv_archiver_store → store}/message_store.js +0 -0
  181. /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
  182. /package/dest/{archiver/structs → structs}/inbox_message.js +0 -0
  183. /package/dest/{archiver/structs → structs}/published.js +0 -0
  184. /package/src/{archiver/l1 → l1}/README.md +0 -0
  185. /package/src/{archiver/l1 → l1}/debug_tx.ts +0 -0
  186. /package/src/{archiver/l1 → l1}/spire_proposer.ts +0 -0
  187. /package/src/{archiver/l1 → l1}/trace_tx.ts +0 -0
  188. /package/src/{archiver/l1 → l1}/types.ts +0 -0
  189. /package/src/{archiver/kv_archiver_store → store}/message_store.ts +0 -0
  190. /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
  191. /package/src/{archiver/structs → structs}/inbox_message.ts +0 -0
  192. /package/src/{archiver/structs → structs}/published.ts +0 -0
@@ -1,11 +1,13 @@
1
- import { INITIAL_L2_BLOCK_NUM, MAX_NOTE_HASHES_PER_TX } from '@aztec/constants';
1
+ import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
2
2
  import { BlockNumber } from '@aztec/foundation/branded-types';
3
+ import { filterAsync } from '@aztec/foundation/collection';
3
4
  import { Fr } from '@aztec/foundation/curves/bn254';
4
5
  import { createLogger } from '@aztec/foundation/log';
5
6
  import { BufferReader, numToUInt32BE } from '@aztec/foundation/serialize';
6
7
  import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
7
8
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
8
- import { L2BlockHash, L2BlockNew } from '@aztec/stdlib/block';
9
+ import { L2Block, L2BlockHash } from '@aztec/stdlib/block';
10
+ import { MAX_LOGS_PER_TAG } from '@aztec/stdlib/interfaces/api-limit';
9
11
  import type { GetContractClassLogsResponse, GetPublicLogsResponse } from '@aztec/stdlib/interfaces/client';
10
12
  import {
11
13
  ContractClassLog,
@@ -57,21 +59,16 @@ export class LogStore {
57
59
  * @param block - The L2 block to extract logs from.
58
60
  * @returns An object containing the private and public tagged logs for the block.
59
61
  */
60
- async #extractTaggedLogsFromBlock(block: L2BlockNew) {
61
- const blockHash = L2BlockHash.fromField(await block.hash());
62
+ #extractTaggedLogsFromBlock(block: L2Block) {
62
63
  // SiloedTag (as string) -> array of log buffers.
63
64
  const privateTaggedLogs = new Map<string, Buffer[]>();
64
65
  // "{contractAddress}_{tag}" (as string) -> array of log buffers.
65
66
  const publicTaggedLogs = new Map<string, Buffer[]>();
66
- const dataStartIndexForBlock =
67
- block.header.state.partial.noteHashTree.nextAvailableLeafIndex -
68
- block.body.txEffects.length * MAX_NOTE_HASHES_PER_TX;
69
67
 
70
- block.body.txEffects.forEach((txEffect, txIndex) => {
68
+ block.body.txEffects.forEach(txEffect => {
71
69
  const txHash = txEffect.txHash;
72
- const dataStartIndexForTx = dataStartIndexForBlock + txIndex * MAX_NOTE_HASHES_PER_TX;
73
70
 
74
- txEffect.privateLogs.forEach((log, logIndex) => {
71
+ txEffect.privateLogs.forEach(log => {
75
72
  // Private logs use SiloedTag (already siloed by kernel)
76
73
  const tag = log.fields[0];
77
74
  this.#log.debug(`Found private log with tag ${tag.toString()} in block ${block.number}`);
@@ -80,18 +77,17 @@ export class LogStore {
80
77
  currentLogs.push(
81
78
  new TxScopedL2Log(
82
79
  txHash,
83
- dataStartIndexForTx,
84
- logIndex,
85
80
  block.number,
86
- blockHash,
87
81
  block.timestamp,
88
- log,
82
+ log.getEmittedFields(),
83
+ txEffect.noteHashes,
84
+ txEffect.nullifiers[0],
89
85
  ).toBuffer(),
90
86
  );
91
87
  privateTaggedLogs.set(tag.toString(), currentLogs);
92
88
  });
93
89
 
94
- txEffect.publicLogs.forEach((log, logIndex) => {
90
+ txEffect.publicLogs.forEach(log => {
95
91
  // Public logs use Tag directly (not siloed) and are stored with contract address
96
92
  const tag = log.fields[0];
97
93
  const contractAddress = log.contractAddress;
@@ -104,12 +100,11 @@ export class LogStore {
104
100
  currentLogs.push(
105
101
  new TxScopedL2Log(
106
102
  txHash,
107
- dataStartIndexForTx,
108
- logIndex,
109
103
  block.number,
110
- blockHash,
111
104
  block.timestamp,
112
- log,
105
+ log.getEmittedFields(),
106
+ txEffect.noteHashes,
107
+ txEffect.nullifiers[0],
113
108
  ).toBuffer(),
114
109
  );
115
110
  publicTaggedLogs.set(key, currentLogs);
@@ -125,10 +120,11 @@ export class LogStore {
125
120
  * @returns A map from tag (as string) to an array of serialized private logs belonging to that tag, and a map from
126
121
  * "{contractAddress}_{tag}" (as string) to an array of serialized public logs belonging to that key.
127
122
  */
128
- async #extractTaggedLogs(
129
- blocks: L2BlockNew[],
130
- ): Promise<{ privateTaggedLogs: Map<string, Buffer[]>; publicTaggedLogs: Map<string, Buffer[]> }> {
131
- const taggedLogsInBlocks = await Promise.all(blocks.map(block => this.#extractTaggedLogsFromBlock(block)));
123
+ #extractTaggedLogs(blocks: L2Block[]): {
124
+ privateTaggedLogs: Map<string, Buffer[]>;
125
+ publicTaggedLogs: Map<string, Buffer[]>;
126
+ } {
127
+ const taggedLogsInBlocks = blocks.map(block => this.#extractTaggedLogsFromBlock(block));
132
128
 
133
129
  // Now we merge the maps from each block into a single map.
134
130
  const privateTaggedLogs = taggedLogsInBlocks.reduce((acc, { privateTaggedLogs }) => {
@@ -150,92 +146,127 @@ export class LogStore {
150
146
  return { privateTaggedLogs, publicTaggedLogs };
151
147
  }
152
148
 
153
- /**
154
- * Append new logs to the store's list.
155
- * @param blocks - The blocks for which to add the logs.
156
- * @returns True if the operation is successful.
157
- */
158
- async addLogs(blocks: L2BlockNew[]): Promise<boolean> {
159
- const { privateTaggedLogs, publicTaggedLogs } = await this.#extractTaggedLogs(blocks);
149
+ async #addPrivateLogs(blocks: L2Block[]): Promise<void> {
150
+ const newBlocks = await filterAsync(
151
+ blocks,
152
+ async block => !(await this.#privateLogKeysByBlock.hasAsync(block.number)),
153
+ );
160
154
 
155
+ const { privateTaggedLogs } = this.#extractTaggedLogs(newBlocks);
161
156
  const keysOfPrivateLogsToUpdate = Array.from(privateTaggedLogs.keys());
162
- const keysOfPublicLogsToUpdate = Array.from(publicTaggedLogs.keys());
163
157
 
164
- return this.db.transactionAsync(async () => {
165
- const currentPrivateTaggedLogs = await Promise.all(
166
- keysOfPrivateLogsToUpdate.map(async key => ({
167
- tag: key,
168
- logBuffers: await this.#privateLogsByTag.getAsync(key),
169
- })),
170
- );
171
- currentPrivateTaggedLogs.forEach(taggedLogBuffer => {
172
- if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
173
- privateTaggedLogs.set(
174
- taggedLogBuffer.tag,
175
- taggedLogBuffer.logBuffers!.concat(privateTaggedLogs.get(taggedLogBuffer.tag)!),
176
- );
177
- }
178
- });
158
+ const currentPrivateTaggedLogs = await Promise.all(
159
+ keysOfPrivateLogsToUpdate.map(async key => ({
160
+ tag: key,
161
+ logBuffers: await this.#privateLogsByTag.getAsync(key),
162
+ })),
163
+ );
179
164
 
180
- const currentPublicTaggedLogs = await Promise.all(
181
- keysOfPublicLogsToUpdate.map(async key => ({
182
- key,
183
- logBuffers: await this.#publicLogsByContractAndTag.getAsync(key),
184
- })),
185
- );
186
- currentPublicTaggedLogs.forEach(taggedLogBuffer => {
187
- if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
188
- publicTaggedLogs.set(
189
- taggedLogBuffer.key,
190
- taggedLogBuffer.logBuffers!.concat(publicTaggedLogs.get(taggedLogBuffer.key)!),
191
- );
192
- }
193
- });
165
+ for (const taggedLogBuffer of currentPrivateTaggedLogs) {
166
+ if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
167
+ privateTaggedLogs.set(
168
+ taggedLogBuffer.tag,
169
+ taggedLogBuffer.logBuffers!.concat(privateTaggedLogs.get(taggedLogBuffer.tag)!),
170
+ );
171
+ }
172
+ }
194
173
 
195
- for (const block of blocks) {
196
- const blockHash = await block.hash();
174
+ for (const block of newBlocks) {
175
+ const privateTagsInBlock: string[] = [];
176
+ for (const [tag, logs] of privateTaggedLogs.entries()) {
177
+ await this.#privateLogsByTag.set(tag, logs);
178
+ privateTagsInBlock.push(tag);
179
+ }
180
+ await this.#privateLogKeysByBlock.set(block.number, privateTagsInBlock);
181
+ }
182
+ }
197
183
 
198
- const privateTagsInBlock: string[] = [];
199
- for (const [tag, logs] of privateTaggedLogs.entries()) {
200
- await this.#privateLogsByTag.set(tag, logs);
201
- privateTagsInBlock.push(tag);
202
- }
203
- await this.#privateLogKeysByBlock.set(block.number, privateTagsInBlock);
184
+ async #addPublicLogs(blocks: L2Block[]): Promise<void> {
185
+ const newBlocks = await filterAsync(
186
+ blocks,
187
+ async block => !(await this.#publicLogKeysByBlock.hasAsync(block.number)),
188
+ );
204
189
 
205
- const publicKeysInBlock: string[] = [];
206
- for (const [key, logs] of publicTaggedLogs.entries()) {
207
- await this.#publicLogsByContractAndTag.set(key, logs);
208
- publicKeysInBlock.push(key);
209
- }
210
- await this.#publicLogKeysByBlock.set(block.number, publicKeysInBlock);
211
-
212
- const publicLogsInBlock = block.body.txEffects
213
- .map((txEffect, txIndex) =>
214
- [
215
- numToUInt32BE(txIndex),
216
- numToUInt32BE(txEffect.publicLogs.length),
217
- txEffect.publicLogs.map(log => log.toBuffer()),
218
- ].flat(),
219
- )
220
- .flat();
221
-
222
- const contractClassLogsInBlock = block.body.txEffects
223
- .map((txEffect, txIndex) =>
224
- [
225
- numToUInt32BE(txIndex),
226
- numToUInt32BE(txEffect.contractClassLogs.length),
227
- txEffect.contractClassLogs.map(log => log.toBuffer()),
228
- ].flat(),
229
- )
230
- .flat();
231
-
232
- await this.#publicLogsByBlock.set(block.number, this.#packWithBlockHash(blockHash, publicLogsInBlock));
233
- await this.#contractClassLogsByBlock.set(
234
- block.number,
235
- this.#packWithBlockHash(blockHash, contractClassLogsInBlock),
190
+ const { publicTaggedLogs } = this.#extractTaggedLogs(newBlocks);
191
+ const keysOfPublicLogsToUpdate = Array.from(publicTaggedLogs.keys());
192
+
193
+ const currentPublicTaggedLogs = await Promise.all(
194
+ keysOfPublicLogsToUpdate.map(async key => ({
195
+ tag: key,
196
+ logBuffers: await this.#publicLogsByContractAndTag.getAsync(key),
197
+ })),
198
+ );
199
+
200
+ for (const taggedLogBuffer of currentPublicTaggedLogs) {
201
+ if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
202
+ publicTaggedLogs.set(
203
+ taggedLogBuffer.tag,
204
+ taggedLogBuffer.logBuffers!.concat(publicTaggedLogs.get(taggedLogBuffer.tag)!),
236
205
  );
237
206
  }
207
+ }
238
208
 
209
+ for (const block of newBlocks) {
210
+ const blockHash = await block.hash();
211
+ const publicTagsInBlock: string[] = [];
212
+ for (const [tag, logs] of publicTaggedLogs.entries()) {
213
+ await this.#publicLogsByContractAndTag.set(tag, logs);
214
+ publicTagsInBlock.push(tag);
215
+ }
216
+ await this.#publicLogKeysByBlock.set(block.number, publicTagsInBlock);
217
+
218
+ const publicLogsInBlock = block.body.txEffects
219
+ .map((txEffect, txIndex) =>
220
+ [
221
+ numToUInt32BE(txIndex),
222
+ numToUInt32BE(txEffect.publicLogs.length),
223
+ txEffect.publicLogs.map(log => log.toBuffer()),
224
+ ].flat(),
225
+ )
226
+ .flat();
227
+
228
+ await this.#publicLogsByBlock.set(block.number, this.#packWithBlockHash(blockHash, publicLogsInBlock));
229
+ }
230
+ }
231
+
232
+ async #addContractClassLogs(blocks: L2Block[]): Promise<void> {
233
+ const newBlocks = await filterAsync(
234
+ blocks,
235
+ async block => !(await this.#contractClassLogsByBlock.hasAsync(block.number)),
236
+ );
237
+
238
+ for (const block of newBlocks) {
239
+ const blockHash = await block.hash();
240
+
241
+ const contractClassLogsInBlock = block.body.txEffects
242
+ .map((txEffect, txIndex) =>
243
+ [
244
+ numToUInt32BE(txIndex),
245
+ numToUInt32BE(txEffect.contractClassLogs.length),
246
+ txEffect.contractClassLogs.map(log => log.toBuffer()),
247
+ ].flat(),
248
+ )
249
+ .flat();
250
+
251
+ await this.#contractClassLogsByBlock.set(
252
+ block.number,
253
+ this.#packWithBlockHash(blockHash, contractClassLogsInBlock),
254
+ );
255
+ }
256
+ }
257
+
258
+ /**
259
+ * Append new logs to the store's list.
260
+ * @param blocks - The blocks for which to add the logs.
261
+ * @returns True if the operation is successful.
262
+ */
263
+ addLogs(blocks: L2Block[]): Promise<boolean> {
264
+ return this.db.transactionAsync(async () => {
265
+ await Promise.all([
266
+ this.#addPrivateLogs(blocks),
267
+ this.#addPublicLogs(blocks),
268
+ this.#addContractClassLogs(blocks),
269
+ ]);
239
270
  return true;
240
271
  });
241
272
  }
@@ -254,7 +285,7 @@ export class LogStore {
254
285
  return L2BlockHash.fromField(blockHash);
255
286
  }
256
287
 
257
- deleteLogs(blocks: L2BlockNew[]): Promise<boolean> {
288
+ deleteLogs(blocks: L2Block[]): Promise<boolean> {
258
289
  return this.db.transactionAsync(async () => {
259
290
  await Promise.all(
260
291
  blocks.map(async block => {
@@ -284,27 +315,49 @@ export class LogStore {
284
315
  }
285
316
 
286
317
  /**
287
- * Gets all private logs that match any of the `tags`. For each tag, an array of matching logs is returned. An empty
318
+ * Gets private logs that match any of the `tags`. For each tag, an array of matching logs is returned. An empty
288
319
  * array implies no logs match that tag.
320
+ * @param tags - The tags to search for.
321
+ * @param page - The page number (0-indexed) for pagination.
322
+ * @returns An array of log arrays, one per tag. Returns at most MAX_LOGS_PER_TAG logs per tag per page. If
323
+ * MAX_LOGS_PER_TAG logs are returned for a tag, the caller should fetch the next page to check for more logs.
289
324
  */
290
- async getPrivateLogsByTags(tags: SiloedTag[]): Promise<TxScopedL2Log[][]> {
325
+ async getPrivateLogsByTags(tags: SiloedTag[], page: number = 0): Promise<TxScopedL2Log[][]> {
291
326
  const logs = await Promise.all(tags.map(tag => this.#privateLogsByTag.getAsync(tag.toString())));
327
+ const start = page * MAX_LOGS_PER_TAG;
328
+ const end = start + MAX_LOGS_PER_TAG;
292
329
 
293
- return logs.map(logBuffers => logBuffers?.map(logBuffer => TxScopedL2Log.fromBuffer(logBuffer)) ?? []);
330
+ return logs.map(
331
+ logBuffers => logBuffers?.slice(start, end).map(logBuffer => TxScopedL2Log.fromBuffer(logBuffer)) ?? [],
332
+ );
294
333
  }
295
334
 
296
335
  /**
297
- * Gets all public logs that match any of the `tags` from the specified contract. For each tag, an array of matching
336
+ * Gets public logs that match any of the `tags` from the specified contract. For each tag, an array of matching
298
337
  * logs is returned. An empty array implies no logs match that tag.
338
+ * @param contractAddress - The contract address to search logs for.
339
+ * @param tags - The tags to search for.
340
+ * @param page - The page number (0-indexed) for pagination.
341
+ * @returns An array of log arrays, one per tag. Returns at most MAX_LOGS_PER_TAG logs per tag per page. If
342
+ * MAX_LOGS_PER_TAG logs are returned for a tag, the caller should fetch the next page to check for more logs.
299
343
  */
300
- async getPublicLogsByTagsFromContract(contractAddress: AztecAddress, tags: Tag[]): Promise<TxScopedL2Log[][]> {
344
+ async getPublicLogsByTagsFromContract(
345
+ contractAddress: AztecAddress,
346
+ tags: Tag[],
347
+ page: number = 0,
348
+ ): Promise<TxScopedL2Log[][]> {
301
349
  const logs = await Promise.all(
302
350
  tags.map(tag => {
303
351
  const key = `${contractAddress.toString()}_${tag.value.toString()}`;
304
352
  return this.#publicLogsByContractAndTag.getAsync(key);
305
353
  }),
306
354
  );
307
- return logs.map(logBuffers => logBuffers?.map(logBuffer => TxScopedL2Log.fromBuffer(logBuffer)) ?? []);
355
+ const start = page * MAX_LOGS_PER_TAG;
356
+ const end = start + MAX_LOGS_PER_TAG;
357
+
358
+ return logs.map(
359
+ logBuffers => logBuffers?.slice(start, end).map(logBuffer => TxScopedL2Log.fromBuffer(logBuffer)) ?? [],
360
+ );
308
361
  }
309
362
 
310
363
  /**