@aztec/archiver 0.61.0 → 0.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/archiver/archiver.d.ts +13 -5
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +49 -26
- package/dest/archiver/archiver_store.d.ts +10 -5
- package/dest/archiver/archiver_store.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.js +64 -36
- package/dest/archiver/config.d.ts +2 -6
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +3 -6
- package/dest/archiver/epoch_helpers.d.ts +10 -10
- package/dest/archiver/epoch_helpers.d.ts.map +1 -1
- package/dest/archiver/epoch_helpers.js +9 -10
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +10 -5
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +17 -5
- package/dest/archiver/kv_archiver_store/log_store.d.ts +8 -2
- package/dest/archiver/kv_archiver_store/log_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/log_store.js +144 -57
- package/dest/archiver/kv_archiver_store/message_store.d.ts +2 -3
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/message_store.js +7 -12
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +2 -3
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +1 -1
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +4 -9
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +15 -7
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -1
- package/dest/archiver/memory_archiver_store/memory_archiver_store.js +139 -35
- package/dest/factory.d.ts +5 -2
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +2 -2
- package/dest/rpc/index.d.ts +3 -2
- package/dest/rpc/index.d.ts.map +1 -1
- package/dest/rpc/index.js +10 -3
- package/dest/test/mock_archiver.d.ts +1 -1
- package/dest/test/mock_archiver.d.ts.map +1 -1
- package/dest/test/mock_archiver.js +3 -3
- package/dest/test/mock_l1_to_l2_message_source.d.ts +1 -1
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/test/mock_l1_to_l2_message_source.js +2 -2
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +6 -4
- package/package.json +10 -10
- package/src/archiver/archiver.ts +60 -31
- package/src/archiver/archiver_store.ts +11 -5
- package/src/archiver/archiver_store_test_suite.ts +85 -40
- package/src/archiver/config.ts +11 -12
- package/src/archiver/epoch_helpers.ts +16 -12
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +18 -6
- package/src/archiver/kv_archiver_store/log_store.ts +176 -58
- package/src/archiver/kv_archiver_store/message_store.ts +6 -12
- package/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +3 -8
- package/src/archiver/memory_archiver_store/memory_archiver_store.ts +155 -31
- package/src/factory.ts +6 -3
- package/src/rpc/index.ts +11 -2
- package/src/test/mock_archiver.ts +2 -2
- package/src/test/mock_l1_to_l2_message_source.ts +1 -1
- package/src/test/mock_l2_block_source.ts +5 -3
- package/dest/rpc/archiver_client.d.ts +0 -3
- package/dest/rpc/archiver_client.d.ts.map +0 -1
- package/dest/rpc/archiver_client.js +0 -12
- package/dest/rpc/archiver_server.d.ts +0 -9
- package/dest/rpc/archiver_server.d.ts.map +0 -1
- package/dest/rpc/archiver_server.js +0 -20
- package/src/rpc/archiver_client.ts +0 -29
- package/src/rpc/archiver_server.ts +0 -35
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
+
type Body,
|
|
3
|
+
type ContractClass2BlockL2Logs,
|
|
2
4
|
type EncryptedL2BlockL2Logs,
|
|
3
|
-
type EncryptedL2NoteLog,
|
|
4
5
|
type EncryptedNoteL2BlockL2Logs,
|
|
5
6
|
ExtendedUnencryptedL2Log,
|
|
6
7
|
type FromLogType,
|
|
@@ -14,6 +15,7 @@ import {
|
|
|
14
15
|
type TxEffect,
|
|
15
16
|
type TxHash,
|
|
16
17
|
TxReceipt,
|
|
18
|
+
TxScopedL2Log,
|
|
17
19
|
type UnencryptedL2BlockL2Logs,
|
|
18
20
|
} from '@aztec/circuit-types';
|
|
19
21
|
import {
|
|
@@ -24,6 +26,7 @@ import {
|
|
|
24
26
|
Fr,
|
|
25
27
|
type Header,
|
|
26
28
|
INITIAL_L2_BLOCK_NUM,
|
|
29
|
+
MAX_NOTE_HASHES_PER_TX,
|
|
27
30
|
type UnconstrainedFunctionWithMembershipProof,
|
|
28
31
|
} from '@aztec/circuits.js';
|
|
29
32
|
import { type ContractArtifact } from '@aztec/foundation/abi';
|
|
@@ -51,14 +54,16 @@ export class MemoryArchiverStore implements ArchiverDataStore {
|
|
|
51
54
|
|
|
52
55
|
private noteEncryptedLogsPerBlock: Map<number, EncryptedNoteL2BlockL2Logs> = new Map();
|
|
53
56
|
|
|
54
|
-
private
|
|
57
|
+
private taggedLogs: Map<string, TxScopedL2Log[]> = new Map();
|
|
55
58
|
|
|
56
|
-
private
|
|
59
|
+
private logTagsPerBlock: Map<number, Fr[]> = new Map();
|
|
57
60
|
|
|
58
61
|
private encryptedLogsPerBlock: Map<number, EncryptedL2BlockL2Logs> = new Map();
|
|
59
62
|
|
|
60
63
|
private unencryptedLogsPerBlock: Map<number, UnencryptedL2BlockL2Logs> = new Map();
|
|
61
64
|
|
|
65
|
+
private contractClassLogsPerBlock: Map<number, ContractClass2BlockL2Logs> = new Map();
|
|
66
|
+
|
|
62
67
|
/**
|
|
63
68
|
* Contains all L1 to L2 messages.
|
|
64
69
|
*/
|
|
@@ -206,6 +211,56 @@ export class MemoryArchiverStore implements ArchiverDataStore {
|
|
|
206
211
|
return Promise.resolve(true);
|
|
207
212
|
}
|
|
208
213
|
|
|
214
|
+
#storeTaggedLogs(block: L2Block, logType: keyof Pick<Body, 'noteEncryptedLogs' | 'unencryptedLogs'>): void {
|
|
215
|
+
const dataStartIndexForBlock =
|
|
216
|
+
block.header.state.partial.noteHashTree.nextAvailableLeafIndex -
|
|
217
|
+
block.body.numberOfTxsIncludingPadded * MAX_NOTE_HASHES_PER_TX;
|
|
218
|
+
block.body[logType].txLogs.forEach((txLogs, txIndex) => {
|
|
219
|
+
const txHash = block.body.txEffects[txIndex].txHash;
|
|
220
|
+
const dataStartIndexForTx = dataStartIndexForBlock + txIndex * MAX_NOTE_HASHES_PER_TX;
|
|
221
|
+
const logs = txLogs.unrollLogs();
|
|
222
|
+
logs.forEach(log => {
|
|
223
|
+
if (
|
|
224
|
+
(logType == 'noteEncryptedLogs' && log.data.length < 32) ||
|
|
225
|
+
// TODO remove when #9835 and #9836 are fixed
|
|
226
|
+
(logType === 'unencryptedLogs' && log.data.length < 32 * 33)
|
|
227
|
+
) {
|
|
228
|
+
this.#log.warn(`Skipping log (${logType}) with invalid data length: ${log.data.length}`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
try {
|
|
232
|
+
let tag = Fr.ZERO;
|
|
233
|
+
// TODO remove when #9835 and #9836 are fixed. The partial note logs are emitted as bytes, but encoded as Fields.
|
|
234
|
+
// This means that for every 32 bytes of payload, we only have 1 byte of data.
|
|
235
|
+
// Also, the tag is not stored in the first 32 bytes of the log, (that's the length of public fields now) but in the next 32.
|
|
236
|
+
if (logType === 'unencryptedLogs') {
|
|
237
|
+
const correctedBuffer = Buffer.alloc(32);
|
|
238
|
+
const initialOffset = 32;
|
|
239
|
+
for (let i = 0; i < 32; i++) {
|
|
240
|
+
const byte = Fr.fromBuffer(
|
|
241
|
+
log.data.subarray(i * 32 + initialOffset, i * 32 + 32 + initialOffset),
|
|
242
|
+
).toNumber();
|
|
243
|
+
correctedBuffer.writeUInt8(byte, i);
|
|
244
|
+
}
|
|
245
|
+
tag = new Fr(correctedBuffer);
|
|
246
|
+
} else {
|
|
247
|
+
tag = new Fr(log.data.subarray(0, 32));
|
|
248
|
+
}
|
|
249
|
+
this.#log.verbose(`Storing tagged (${logType}) log with tag ${tag.toString()} in block ${block.number}`);
|
|
250
|
+
const currentLogs = this.taggedLogs.get(tag.toString()) || [];
|
|
251
|
+
this.taggedLogs.set(tag.toString(), [
|
|
252
|
+
...currentLogs,
|
|
253
|
+
new TxScopedL2Log(txHash, dataStartIndexForTx, block.number, logType === 'unencryptedLogs', log.data),
|
|
254
|
+
]);
|
|
255
|
+
const currentTagsInBlock = this.logTagsPerBlock.get(block.number) || [];
|
|
256
|
+
this.logTagsPerBlock.set(block.number, [...currentTagsInBlock, tag]);
|
|
257
|
+
} catch (err) {
|
|
258
|
+
this.#log.warn(`Failed to add tagged log to store: ${err}`);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
|
|
209
264
|
/**
|
|
210
265
|
* Append new logs to the store's list.
|
|
211
266
|
* @param block - The block for which to add the logs.
|
|
@@ -213,44 +268,30 @@ export class MemoryArchiverStore implements ArchiverDataStore {
|
|
|
213
268
|
*/
|
|
214
269
|
addLogs(blocks: L2Block[]): Promise<boolean> {
|
|
215
270
|
blocks.forEach(block => {
|
|
271
|
+
void this.#storeTaggedLogs(block, 'noteEncryptedLogs');
|
|
272
|
+
void this.#storeTaggedLogs(block, 'unencryptedLogs');
|
|
216
273
|
this.noteEncryptedLogsPerBlock.set(block.number, block.body.noteEncryptedLogs);
|
|
217
|
-
block.body.noteEncryptedLogs.txLogs.forEach(txLogs => {
|
|
218
|
-
const noteLogs = txLogs.unrollLogs();
|
|
219
|
-
noteLogs.forEach(noteLog => {
|
|
220
|
-
if (noteLog.data.length < 32) {
|
|
221
|
-
this.#log.warn(`Skipping note log with invalid data length: ${noteLog.data.length}`);
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
try {
|
|
225
|
-
const tag = new Fr(noteLog.data.subarray(0, 32));
|
|
226
|
-
const currentNoteLogs = this.taggedNoteEncryptedLogs.get(tag.toString()) || [];
|
|
227
|
-
this.taggedNoteEncryptedLogs.set(tag.toString(), [...currentNoteLogs, noteLog]);
|
|
228
|
-
const currentTagsInBlock = this.noteEncryptedLogTagsPerBlock.get(block.number) || [];
|
|
229
|
-
this.noteEncryptedLogTagsPerBlock.set(block.number, [...currentTagsInBlock, tag]);
|
|
230
|
-
} catch (err) {
|
|
231
|
-
this.#log.warn(`Failed to add tagged note log to store: ${err}`);
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
274
|
this.encryptedLogsPerBlock.set(block.number, block.body.encryptedLogs);
|
|
236
275
|
this.unencryptedLogsPerBlock.set(block.number, block.body.unencryptedLogs);
|
|
276
|
+
this.contractClassLogsPerBlock.set(block.number, block.body.contractClassLogs);
|
|
237
277
|
});
|
|
238
278
|
return Promise.resolve(true);
|
|
239
279
|
}
|
|
240
280
|
|
|
241
281
|
deleteLogs(blocks: L2Block[]): Promise<boolean> {
|
|
242
|
-
const
|
|
243
|
-
|
|
282
|
+
const tagsToDelete = blocks.flatMap(block => this.logTagsPerBlock.get(block.number));
|
|
283
|
+
tagsToDelete
|
|
244
284
|
.filter(tag => tag != undefined)
|
|
245
285
|
.forEach(tag => {
|
|
246
|
-
this.
|
|
286
|
+
this.taggedLogs.delete(tag!.toString());
|
|
247
287
|
});
|
|
248
288
|
|
|
249
289
|
blocks.forEach(block => {
|
|
250
290
|
this.encryptedLogsPerBlock.delete(block.number);
|
|
251
291
|
this.noteEncryptedLogsPerBlock.delete(block.number);
|
|
252
292
|
this.unencryptedLogsPerBlock.delete(block.number);
|
|
253
|
-
this.
|
|
293
|
+
this.logTagsPerBlock.delete(block.number);
|
|
294
|
+
this.contractClassLogsPerBlock.delete(block.number);
|
|
254
295
|
});
|
|
255
296
|
|
|
256
297
|
return Promise.resolve(true);
|
|
@@ -281,13 +322,12 @@ export class MemoryArchiverStore implements ArchiverDataStore {
|
|
|
281
322
|
}
|
|
282
323
|
|
|
283
324
|
/**
|
|
284
|
-
* Gets the
|
|
325
|
+
* Gets the L1 to L2 message index in the L1 to L2 message tree.
|
|
285
326
|
* @param l1ToL2Message - The L1 to L2 message.
|
|
286
|
-
* @param startIndex - The index to start searching from.
|
|
287
327
|
* @returns The index of the L1 to L2 message in the L1 to L2 message tree (undefined if not found).
|
|
288
328
|
*/
|
|
289
|
-
getL1ToL2MessageIndex(l1ToL2Message: Fr
|
|
290
|
-
return Promise.resolve(this.l1ToL2Messages.getMessageIndex(l1ToL2Message
|
|
329
|
+
getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint | undefined> {
|
|
330
|
+
return Promise.resolve(this.l1ToL2Messages.getMessageIndex(l1ToL2Message));
|
|
291
331
|
}
|
|
292
332
|
|
|
293
333
|
/**
|
|
@@ -420,8 +460,8 @@ export class MemoryArchiverStore implements ArchiverDataStore {
|
|
|
420
460
|
* @returns For each received tag, an array of matching logs is returned. An empty array implies no logs match
|
|
421
461
|
* that tag.
|
|
422
462
|
*/
|
|
423
|
-
getLogsByTags(tags: Fr[]): Promise<
|
|
424
|
-
const noteLogs = tags.map(tag => this.
|
|
463
|
+
getLogsByTags(tags: Fr[]): Promise<TxScopedL2Log[][]> {
|
|
464
|
+
const noteLogs = tags.map(tag => this.taggedLogs.get(tag.toString()) || []);
|
|
425
465
|
return Promise.resolve(noteLogs);
|
|
426
466
|
}
|
|
427
467
|
|
|
@@ -508,6 +548,90 @@ export class MemoryArchiverStore implements ArchiverDataStore {
|
|
|
508
548
|
});
|
|
509
549
|
}
|
|
510
550
|
|
|
551
|
+
/**
|
|
552
|
+
* Gets contract class logs based on the provided filter.
|
|
553
|
+
* NB: clone of the above fn, but for contract class logs
|
|
554
|
+
* @param filter - The filter to apply to the logs.
|
|
555
|
+
* @returns The requested logs.
|
|
556
|
+
* @remarks Works by doing an intersection of all params in the filter.
|
|
557
|
+
*/
|
|
558
|
+
getContractClassLogs(filter: LogFilter): Promise<GetUnencryptedLogsResponse> {
|
|
559
|
+
let txHash: TxHash | undefined;
|
|
560
|
+
let fromBlock = 0;
|
|
561
|
+
let toBlock = this.l2Blocks.length + INITIAL_L2_BLOCK_NUM;
|
|
562
|
+
let txIndexInBlock = 0;
|
|
563
|
+
let logIndexInTx = 0;
|
|
564
|
+
|
|
565
|
+
if (filter.afterLog) {
|
|
566
|
+
// Continuation parameter is set --> tx hash is ignored
|
|
567
|
+
if (filter.fromBlock == undefined || filter.fromBlock <= filter.afterLog.blockNumber) {
|
|
568
|
+
fromBlock = filter.afterLog.blockNumber;
|
|
569
|
+
txIndexInBlock = filter.afterLog.txIndex;
|
|
570
|
+
logIndexInTx = filter.afterLog.logIndex + 1; // We want to start from the next log
|
|
571
|
+
} else {
|
|
572
|
+
fromBlock = filter.fromBlock;
|
|
573
|
+
}
|
|
574
|
+
} else {
|
|
575
|
+
txHash = filter.txHash;
|
|
576
|
+
|
|
577
|
+
if (filter.fromBlock !== undefined) {
|
|
578
|
+
fromBlock = filter.fromBlock;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
if (filter.toBlock !== undefined) {
|
|
583
|
+
toBlock = filter.toBlock;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// Ensure the indices are within block array bounds
|
|
587
|
+
fromBlock = Math.max(fromBlock, INITIAL_L2_BLOCK_NUM);
|
|
588
|
+
toBlock = Math.min(toBlock, this.l2Blocks.length + INITIAL_L2_BLOCK_NUM);
|
|
589
|
+
|
|
590
|
+
if (fromBlock > this.l2Blocks.length || toBlock < fromBlock || toBlock <= 0) {
|
|
591
|
+
return Promise.resolve({
|
|
592
|
+
logs: [],
|
|
593
|
+
maxLogsHit: false,
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
const contractAddress = filter.contractAddress;
|
|
598
|
+
|
|
599
|
+
const logs: ExtendedUnencryptedL2Log[] = [];
|
|
600
|
+
|
|
601
|
+
for (; fromBlock < toBlock; fromBlock++) {
|
|
602
|
+
const block = this.l2Blocks[fromBlock - INITIAL_L2_BLOCK_NUM];
|
|
603
|
+
const blockLogs = this.contractClassLogsPerBlock.get(fromBlock);
|
|
604
|
+
|
|
605
|
+
if (blockLogs) {
|
|
606
|
+
for (; txIndexInBlock < blockLogs.txLogs.length; txIndexInBlock++) {
|
|
607
|
+
const txLogs = blockLogs.txLogs[txIndexInBlock].unrollLogs();
|
|
608
|
+
for (; logIndexInTx < txLogs.length; logIndexInTx++) {
|
|
609
|
+
const log = txLogs[logIndexInTx];
|
|
610
|
+
if (
|
|
611
|
+
(!txHash || block.data.body.txEffects[txIndexInBlock].txHash.equals(txHash)) &&
|
|
612
|
+
(!contractAddress || log.contractAddress.equals(contractAddress))
|
|
613
|
+
) {
|
|
614
|
+
logs.push(new ExtendedUnencryptedL2Log(new LogId(block.data.number, txIndexInBlock, logIndexInTx), log));
|
|
615
|
+
if (logs.length === this.maxLogs) {
|
|
616
|
+
return Promise.resolve({
|
|
617
|
+
logs,
|
|
618
|
+
maxLogsHit: true,
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
logIndexInTx = 0;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
txIndexInBlock = 0;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
return Promise.resolve({
|
|
630
|
+
logs,
|
|
631
|
+
maxLogsHit: false,
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
|
|
511
635
|
/**
|
|
512
636
|
* Gets the number of the latest L2 block processed.
|
|
513
637
|
* @returns The number of the latest L2 block processed.
|
package/src/factory.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { type ArchiverApi, type Service } from '@aztec/circuit-types';
|
|
1
2
|
import { type ContractClassPublic } from '@aztec/circuits.js';
|
|
2
3
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { type Maybe } from '@aztec/foundation/types';
|
|
5
|
+
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
3
6
|
import { createStore } from '@aztec/kv-store/utils';
|
|
4
7
|
import { getCanonicalProtocolContract, protocolContractNames } from '@aztec/protocol-contracts';
|
|
5
8
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
@@ -8,13 +11,13 @@ import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
|
8
11
|
import { Archiver } from './archiver/archiver.js';
|
|
9
12
|
import { type ArchiverConfig } from './archiver/config.js';
|
|
10
13
|
import { KVArchiverDataStore } from './archiver/index.js';
|
|
11
|
-
import { createArchiverClient } from './rpc/
|
|
14
|
+
import { createArchiverClient } from './rpc/index.js';
|
|
12
15
|
|
|
13
16
|
export async function createArchiver(
|
|
14
|
-
config: ArchiverConfig,
|
|
17
|
+
config: ArchiverConfig & DataStoreConfig,
|
|
15
18
|
telemetry: TelemetryClient = new NoopTelemetryClient(),
|
|
16
19
|
opts: { blockUntilSync: boolean } = { blockUntilSync: true },
|
|
17
|
-
) {
|
|
20
|
+
): Promise<ArchiverApi & Maybe<Service>> {
|
|
18
21
|
if (!config.archiverUrl) {
|
|
19
22
|
const store = await createStore('archiver', config, createDebugLogger('aztec:archiver:lmdb'));
|
|
20
23
|
const archiverStore = new KVArchiverDataStore(store, config.maxLogs);
|
package/src/rpc/index.ts
CHANGED
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { type ArchiverApi, ArchiverApiSchema } from '@aztec/circuit-types';
|
|
2
|
+
import { createSafeJsonRpcClient, makeFetch } from '@aztec/foundation/json-rpc/client';
|
|
3
|
+
import { createSafeJsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
4
|
+
|
|
5
|
+
export function createArchiverClient(url: string, fetch = makeFetch([1, 2, 3], true)): ArchiverApi {
|
|
6
|
+
return createSafeJsonRpcClient<ArchiverApi>(url, ArchiverApiSchema, false, 'archiver', fetch);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function createArchiverRpcServer(handler: ArchiverApi) {
|
|
10
|
+
return createSafeJsonRpcServer(handler, ArchiverApiSchema);
|
|
11
|
+
}
|
|
@@ -18,8 +18,8 @@ export class MockArchiver extends MockL2BlockSource implements L2BlockSource, L1
|
|
|
18
18
|
return this.messageSource.getL1ToL2Messages(blockNumber);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
getL1ToL2MessageIndex(_l1ToL2Message: Fr
|
|
22
|
-
return this.messageSource.getL1ToL2MessageIndex(_l1ToL2Message
|
|
21
|
+
getL1ToL2MessageIndex(_l1ToL2Message: Fr): Promise<bigint | undefined> {
|
|
22
|
+
return this.messageSource.getL1ToL2MessageIndex(_l1ToL2Message);
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -21,7 +21,7 @@ export class MockL1ToL2MessageSource implements L1ToL2MessageSource {
|
|
|
21
21
|
return Promise.resolve(this.messagesPerBlock.get(Number(blockNumber)) ?? []);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
getL1ToL2MessageIndex(_l1ToL2Message: Fr
|
|
24
|
+
getL1ToL2MessageIndex(_l1ToL2Message: Fr): Promise<bigint | undefined> {
|
|
25
25
|
throw new Error('Method not implemented.');
|
|
26
26
|
}
|
|
27
27
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { L2Block, type L2BlockSource, type L2Tips, type TxHash, TxReceipt, TxStatus } from '@aztec/circuit-types';
|
|
2
2
|
import { EthAddress, type Header } from '@aztec/circuits.js';
|
|
3
|
+
import { DefaultL1ContractsConfig } from '@aztec/ethereum';
|
|
3
4
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
5
|
|
|
5
6
|
import { getSlotRangeForEpoch } from '../archiver/epoch_helpers.js';
|
|
@@ -67,8 +68,8 @@ export class MockL2BlockSource implements L2BlockSource {
|
|
|
67
68
|
return Promise.resolve(this.l2Blocks.length);
|
|
68
69
|
}
|
|
69
70
|
|
|
70
|
-
public
|
|
71
|
-
return
|
|
71
|
+
public getProvenBlockNumber(): Promise<number> {
|
|
72
|
+
return Promise.resolve(this.provenBlockNumber);
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
public getProvenL2EpochNumber(): Promise<number | undefined> {
|
|
@@ -103,7 +104,8 @@ export class MockL2BlockSource implements L2BlockSource {
|
|
|
103
104
|
}
|
|
104
105
|
|
|
105
106
|
getBlocksForEpoch(epochNumber: bigint): Promise<L2Block[]> {
|
|
106
|
-
const
|
|
107
|
+
const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
|
|
108
|
+
const [start, end] = getSlotRangeForEpoch(epochNumber, { epochDuration });
|
|
107
109
|
const blocks = this.l2Blocks.filter(b => {
|
|
108
110
|
const slot = b.header.globalVariables.slotNumber.toBigInt();
|
|
109
111
|
return slot >= start && slot <= end;
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { type ArchiveSource } from '../archiver/archiver.js';
|
|
2
|
-
export declare const createArchiverClient: (url: string, fetch?: (host: string, rpcMethod: string, body: any, useApiEndpoints: boolean) => Promise<any>) => ArchiveSource;
|
|
3
|
-
//# sourceMappingURL=archiver_client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archiver_client.d.ts","sourceRoot":"","sources":["../../src/rpc/archiver_client.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,eAAO,MAAM,oBAAoB,QAAS,MAAM,qGAAuC,aAenE,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { EncryptedNoteL2BlockL2Logs, ExtendedUnencryptedL2Log, L2Block, NullifierMembershipWitness, TxReceipt, UnencryptedL2BlockL2Logs, } from '@aztec/circuit-types';
|
|
2
|
-
import { EthAddress, Fr } from '@aztec/circuits.js';
|
|
3
|
-
import { createJsonRpcClient, makeFetch } from '@aztec/foundation/json-rpc/client';
|
|
4
|
-
export const createArchiverClient = (url, fetch = makeFetch([1, 2, 3], true)) => createJsonRpcClient(url, {
|
|
5
|
-
EthAddress,
|
|
6
|
-
ExtendedUnencryptedL2Log,
|
|
7
|
-
Fr,
|
|
8
|
-
L2Block,
|
|
9
|
-
EncryptedNoteL2BlockL2Logs,
|
|
10
|
-
UnencryptedL2BlockL2Logs,
|
|
11
|
-
}, { TxReceipt, NullifierMembershipWitness }, false, 'archiver', fetch);
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXJfY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JwYy9hcmNoaXZlcl9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLDBCQUEwQixFQUMxQix3QkFBd0IsRUFDeEIsT0FBTyxFQUNQLDBCQUEwQixFQUMxQixTQUFTLEVBQ1Qsd0JBQXdCLEdBQ3pCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFJbkYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQWlCLEVBQUUsQ0FDckcsbUJBQW1CLENBQ2pCLEdBQUcsRUFDSDtJQUNFLFVBQVU7SUFDVix3QkFBd0I7SUFDeEIsRUFBRTtJQUNGLE9BQU87SUFDUCwwQkFBMEI7SUFDMUIsd0JBQXdCO0NBQ3pCLEVBQ0QsRUFBRSxTQUFTLEVBQUUsMEJBQTBCLEVBQUUsRUFDekMsS0FBSyxFQUNMLFVBQVUsRUFDVixLQUFLLENBQ1csQ0FBQyJ9
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
2
|
-
import { type Archiver } from '../archiver/archiver.js';
|
|
3
|
-
/**
|
|
4
|
-
* Wrap an Archiver instance with a JSON RPC HTTP server.
|
|
5
|
-
* @param archiverService - The Archiver instance
|
|
6
|
-
* @returns An JSON-RPC HTTP server
|
|
7
|
-
*/
|
|
8
|
-
export declare function createArchiverRpcServer(archiverService: Archiver): JsonRpcServer;
|
|
9
|
-
//# sourceMappingURL=archiver_server.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archiver_server.d.ts","sourceRoot":"","sources":["../../src/rpc/archiver_server.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,QAAQ,GAAG,aAAa,CAehF"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { EncryptedNoteL2BlockL2Logs, ExtendedUnencryptedL2Log, L2Block, NullifierMembershipWitness, TxEffect, TxReceipt, UnencryptedL2BlockL2Logs, } from '@aztec/circuit-types';
|
|
2
|
-
import { EthAddress, Fr } from '@aztec/circuits.js';
|
|
3
|
-
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
4
|
-
/**
|
|
5
|
-
* Wrap an Archiver instance with a JSON RPC HTTP server.
|
|
6
|
-
* @param archiverService - The Archiver instance
|
|
7
|
-
* @returns An JSON-RPC HTTP server
|
|
8
|
-
*/
|
|
9
|
-
export function createArchiverRpcServer(archiverService) {
|
|
10
|
-
return new JsonRpcServer(archiverService, {
|
|
11
|
-
EthAddress,
|
|
12
|
-
ExtendedUnencryptedL2Log,
|
|
13
|
-
Fr,
|
|
14
|
-
L2Block,
|
|
15
|
-
EncryptedNoteL2BlockL2Logs,
|
|
16
|
-
UnencryptedL2BlockL2Logs,
|
|
17
|
-
TxEffect,
|
|
18
|
-
}, { TxReceipt, NullifierMembershipWitness }, ['start', 'stop']);
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXJfc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JwYy9hcmNoaXZlcl9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLDBCQUEwQixFQUMxQix3QkFBd0IsRUFDeEIsT0FBTyxFQUNQLDBCQUEwQixFQUMxQixRQUFRLEVBQ1IsU0FBUyxFQUNULHdCQUF3QixHQUN6QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSWxFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsZUFBeUI7SUFDL0QsT0FBTyxJQUFJLGFBQWEsQ0FDdEIsZUFBZSxFQUNmO1FBQ0UsVUFBVTtRQUNWLHdCQUF3QjtRQUN4QixFQUFFO1FBQ0YsT0FBTztRQUNQLDBCQUEwQjtRQUMxQix3QkFBd0I7UUFDeEIsUUFBUTtLQUNULEVBQ0QsRUFBRSxTQUFTLEVBQUUsMEJBQTBCLEVBQUUsRUFDekMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQ2xCLENBQUM7QUFDSixDQUFDIn0=
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
EncryptedNoteL2BlockL2Logs,
|
|
3
|
-
ExtendedUnencryptedL2Log,
|
|
4
|
-
L2Block,
|
|
5
|
-
NullifierMembershipWitness,
|
|
6
|
-
TxReceipt,
|
|
7
|
-
UnencryptedL2BlockL2Logs,
|
|
8
|
-
} from '@aztec/circuit-types';
|
|
9
|
-
import { EthAddress, Fr } from '@aztec/circuits.js';
|
|
10
|
-
import { createJsonRpcClient, makeFetch } from '@aztec/foundation/json-rpc/client';
|
|
11
|
-
|
|
12
|
-
import { type ArchiveSource } from '../archiver/archiver.js';
|
|
13
|
-
|
|
14
|
-
export const createArchiverClient = (url: string, fetch = makeFetch([1, 2, 3], true)): ArchiveSource =>
|
|
15
|
-
createJsonRpcClient<ArchiveSource>(
|
|
16
|
-
url,
|
|
17
|
-
{
|
|
18
|
-
EthAddress,
|
|
19
|
-
ExtendedUnencryptedL2Log,
|
|
20
|
-
Fr,
|
|
21
|
-
L2Block,
|
|
22
|
-
EncryptedNoteL2BlockL2Logs,
|
|
23
|
-
UnencryptedL2BlockL2Logs,
|
|
24
|
-
},
|
|
25
|
-
{ TxReceipt, NullifierMembershipWitness },
|
|
26
|
-
false,
|
|
27
|
-
'archiver',
|
|
28
|
-
fetch,
|
|
29
|
-
) as ArchiveSource;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
EncryptedNoteL2BlockL2Logs,
|
|
3
|
-
ExtendedUnencryptedL2Log,
|
|
4
|
-
L2Block,
|
|
5
|
-
NullifierMembershipWitness,
|
|
6
|
-
TxEffect,
|
|
7
|
-
TxReceipt,
|
|
8
|
-
UnencryptedL2BlockL2Logs,
|
|
9
|
-
} from '@aztec/circuit-types';
|
|
10
|
-
import { EthAddress, Fr } from '@aztec/circuits.js';
|
|
11
|
-
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
12
|
-
|
|
13
|
-
import { type Archiver } from '../archiver/archiver.js';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Wrap an Archiver instance with a JSON RPC HTTP server.
|
|
17
|
-
* @param archiverService - The Archiver instance
|
|
18
|
-
* @returns An JSON-RPC HTTP server
|
|
19
|
-
*/
|
|
20
|
-
export function createArchiverRpcServer(archiverService: Archiver): JsonRpcServer {
|
|
21
|
-
return new JsonRpcServer(
|
|
22
|
-
archiverService,
|
|
23
|
-
{
|
|
24
|
-
EthAddress,
|
|
25
|
-
ExtendedUnencryptedL2Log,
|
|
26
|
-
Fr,
|
|
27
|
-
L2Block,
|
|
28
|
-
EncryptedNoteL2BlockL2Logs,
|
|
29
|
-
UnencryptedL2BlockL2Logs,
|
|
30
|
-
TxEffect,
|
|
31
|
-
},
|
|
32
|
-
{ TxReceipt, NullifierMembershipWitness },
|
|
33
|
-
['start', 'stop'],
|
|
34
|
-
);
|
|
35
|
-
}
|