@aztec/pxe 0.8.9 → 0.8.11
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/contract_data_oracle/index.d.ts +4 -4
- package/dest/contract_data_oracle/index.d.ts.map +1 -1
- package/dest/contract_data_oracle/index.js +9 -9
- package/dest/contract_tree/index.d.ts +10 -10
- package/dest/contract_tree/index.d.ts.map +1 -1
- package/dest/contract_tree/index.js +21 -21
- package/dest/database/database.d.ts +5 -0
- package/dest/database/database.d.ts.map +1 -1
- package/dest/database/memory_db.d.ts +1 -0
- package/dest/database/memory_db.d.ts.map +1 -1
- package/dest/database/memory_db.js +10 -2
- package/dest/database/note_spending_info_dao.d.ts +7 -1
- package/dest/database/note_spending_info_dao.d.ts.map +1 -1
- package/dest/database/note_spending_info_dao.js +11 -1
- package/dest/kernel_prover/proof_creator.d.ts.map +1 -1
- package/dest/kernel_prover/proof_creator.js +7 -7
- package/dest/note_processor/note_processor.d.ts +2 -11
- package/dest/note_processor/note_processor.d.ts.map +1 -1
- package/dest/note_processor/note_processor.js +6 -4
- package/dest/pxe_http/pxe_http_server.d.ts.map +1 -1
- package/dest/pxe_http/pxe_http_server.js +6 -2
- package/dest/pxe_service/pxe_service.d.ts +10 -3
- package/dest/pxe_service/pxe_service.d.ts.map +1 -1
- package/dest/pxe_service/pxe_service.js +33 -24
- package/dest/simulator_oracle/index.d.ts +2 -2
- package/dest/simulator_oracle/index.d.ts.map +1 -1
- package/dest/simulator_oracle/index.js +4 -4
- package/dest/synchronizer/synchronizer.d.ts +2 -2
- package/dest/synchronizer/synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/synchronizer.js +11 -10
- package/package.json +8 -8
- package/src/contract_data_oracle/index.ts +8 -8
- package/src/contract_tree/index.ts +21 -21
- package/src/database/database.ts +6 -0
- package/src/database/memory_db.ts +9 -1
- package/src/database/note_spending_info_dao.ts +12 -1
- package/src/kernel_prover/proof_creator.ts +10 -9
- package/src/note_processor/note_processor.ts +6 -13
- package/src/pxe_http/pxe_http_server.ts +6 -0
- package/src/pxe_service/pxe_service.ts +38 -33
- package/src/simulator_oracle/index.ts +5 -5
- package/src/synchronizer/synchronizer.ts +12 -10
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CircuitsWasm, Fr, HistoricBlockData } from '@aztec/circuits.js';
|
|
2
2
|
import { computeGlobalsHash } from '@aztec/circuits.js/abis';
|
|
3
3
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
|
-
import {
|
|
4
|
+
import { InterruptibleSleep } from '@aztec/foundation/sleep';
|
|
5
5
|
import { INITIAL_L2_BLOCK_NUM, L2BlockContext, L2BlockL2Logs, LogType } from '@aztec/types';
|
|
6
6
|
import { NoteProcessor } from '../note_processor/index.js';
|
|
7
7
|
/**
|
|
@@ -16,7 +16,7 @@ export class Synchronizer {
|
|
|
16
16
|
this.node = node;
|
|
17
17
|
this.db = db;
|
|
18
18
|
this.noteProcessors = [];
|
|
19
|
-
this.
|
|
19
|
+
this.interruptibleSleep = new InterruptibleSleep();
|
|
20
20
|
this.running = false;
|
|
21
21
|
this.initialSyncBlockNumber = 0;
|
|
22
22
|
this.synchedToBlock = 0;
|
|
@@ -24,7 +24,7 @@ export class Synchronizer {
|
|
|
24
24
|
this.log = createDebugLogger(logSuffix ? `aztec:pxe_synchronizer_${logSuffix}` : 'aztec:pxe_synchronizer');
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
|
-
* Starts the
|
|
27
|
+
* Starts the synchronization process by fetching encrypted logs and blocks from a specified position.
|
|
28
28
|
* Continuously processes the fetched data for all note processors until stopped. If there is no data
|
|
29
29
|
* available, it retries after a specified interval.
|
|
30
30
|
*
|
|
@@ -70,18 +70,18 @@ export class Synchronizer {
|
|
|
70
70
|
try {
|
|
71
71
|
let encryptedLogs = await this.node.getLogs(from, limit, LogType.ENCRYPTED);
|
|
72
72
|
if (!encryptedLogs.length) {
|
|
73
|
-
await this.
|
|
73
|
+
await this.interruptibleSleep.sleep(retryInterval);
|
|
74
74
|
return;
|
|
75
75
|
}
|
|
76
76
|
let unencryptedLogs = await this.node.getLogs(from, limit, LogType.UNENCRYPTED);
|
|
77
77
|
if (!unencryptedLogs.length) {
|
|
78
|
-
await this.
|
|
78
|
+
await this.interruptibleSleep.sleep(retryInterval);
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
81
|
// Note: If less than `limit` encrypted logs is returned, then we fetch only that number of blocks.
|
|
82
82
|
const blocks = await this.node.getBlocks(from, encryptedLogs.length);
|
|
83
83
|
if (!blocks.length) {
|
|
84
|
-
await this.
|
|
84
|
+
await this.interruptibleSleep.sleep(retryInterval);
|
|
85
85
|
return;
|
|
86
86
|
}
|
|
87
87
|
if (blocks.length !== encryptedLogs.length) {
|
|
@@ -111,7 +111,7 @@ export class Synchronizer {
|
|
|
111
111
|
}
|
|
112
112
|
catch (err) {
|
|
113
113
|
this.log.error(`Error in synchronizer work`, err);
|
|
114
|
-
await this.
|
|
114
|
+
await this.interruptibleSleep.sleep(retryInterval);
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
async workNoteProcessorCatchUp(limit = 1, retryInterval = 1000) {
|
|
@@ -156,6 +156,7 @@ export class Synchronizer {
|
|
|
156
156
|
eventName: 'note-processor-caught-up',
|
|
157
157
|
publicKey: noteProcessor.publicKey.toString(),
|
|
158
158
|
duration: noteProcessor.timer.ms(),
|
|
159
|
+
dbSize: this.db.estimateSize(),
|
|
159
160
|
...noteProcessor.stats,
|
|
160
161
|
});
|
|
161
162
|
this.noteProcessorsToCatchUp.shift();
|
|
@@ -164,7 +165,7 @@ export class Synchronizer {
|
|
|
164
165
|
}
|
|
165
166
|
catch (err) {
|
|
166
167
|
this.log.error(`Error in synchronizer workNoteProcessorCatchUp`, err);
|
|
167
|
-
await this.
|
|
168
|
+
await this.interruptibleSleep.sleep(retryInterval);
|
|
168
169
|
}
|
|
169
170
|
}
|
|
170
171
|
async setBlockDataFromBlock(latestBlock) {
|
|
@@ -186,7 +187,7 @@ export class Synchronizer {
|
|
|
186
187
|
*/
|
|
187
188
|
async stop() {
|
|
188
189
|
this.running = false;
|
|
189
|
-
this.
|
|
190
|
+
this.interruptibleSleep.interrupt();
|
|
190
191
|
await this.runningPromise;
|
|
191
192
|
this.log('Stopped');
|
|
192
193
|
}
|
|
@@ -246,4 +247,4 @@ export class Synchronizer {
|
|
|
246
247
|
};
|
|
247
248
|
}
|
|
248
249
|
}
|
|
249
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2hyb25pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9zeW5jaHJvbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixZQUFZLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFhLE1BQU0sb0JBQW9CLENBQUM7QUFDbEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFhLG9CQUFvQixFQUFZLGNBQWMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBR2pILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQVV2QixZQUFvQixJQUFlLEVBQVUsRUFBWSxFQUFFLFNBQVMsR0FBRyxFQUFFO1FBQXJELFNBQUksR0FBSixJQUFJLENBQVc7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFVO1FBUmpELG1CQUFjLEdBQW9CLEVBQUUsQ0FBQztRQUNyQyx1QkFBa0IsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDOUMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQiwyQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFDM0IsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFFbkIsNEJBQXVCLEdBQW9CLEVBQUUsQ0FBQztRQUdwRCxJQUFJLENBQUMsR0FBRyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLG9CQUFvQixFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsYUFBYSxHQUFHLElBQUk7UUFDN0UsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUU7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLElBQUksZ0RBQWdELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQzFHO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBRS9CLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXpCLE1BQU0sR0FBRyxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDbkIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDM0MsNEdBQTRHO29CQUM1RyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7aUJBQzNEO3FCQUFNO29CQUNMLHlFQUF5RTtvQkFDekUsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztpQkFDdkM7YUFDRjtRQUNILENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRVMsS0FBSyxDQUFDLFdBQVc7UUFDekIsTUFBTSxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1NBQ2pDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxzQkFBc0IsR0FBRyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDbEQsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVTLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxhQUFhLEdBQUcsSUFBSTtRQUNsRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJO1lBQ0YsSUFBSSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDekIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPO2FBQ1I7WUFFRCxJQUFJLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUMzQixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ25ELE9BQU87YUFDUjtZQUVELG1HQUFtRztZQUNuRyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7Z0JBQ2xCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDbkQsT0FBTzthQUNSO1lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLGFBQWEsQ0FBQyxNQUFNLEVBQUU7Z0JBQzFDLDJEQUEyRDtnQkFDM0QsYUFBYSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN2RDtZQUVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUM1Qyw2REFBNkQ7Z0JBQzdELGVBQWUsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDM0Q7WUFFRCx3QkFBd0I7WUFDeEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN0RCxLQUFLLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUQsQ0FBQyxDQUFDLENBQUM7WUFFSCxpQ0FBaUM7WUFDakMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFckUsc0RBQXNEO1lBQ3RELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVELE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTlDLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsUUFBUSxpQ0FBaUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLGtCQUFrQixDQUFDLENBQUM7WUFDOUcsS0FBSyxNQUFNLGFBQWEsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUMvQyxNQUFNLGFBQWEsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2FBQzNEO1lBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztTQUNoRDtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEQsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVTLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLGFBQWEsR0FBRyxJQUFJO1FBQ3RFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDOUQsZ0RBQWdEO1lBQ2hELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4QyxPQUFPO1NBQ1I7UUFFRCxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDcEQsNkVBQTZFO1FBQzdFLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV4RCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixLQUFLLDhCQUE4QixDQUFDLENBQUM7U0FDMUU7UUFFRCxJQUFJO1lBQ0YsSUFBSSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDekIsMEdBQTBHO2dCQUMxRyxvQkFBb0I7Z0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQzthQUNqRTtZQUVELG1HQUFtRztZQUNuRyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7Z0JBQ2xCLDBHQUEwRztnQkFDMUcsb0JBQW9CO2dCQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7YUFDekQ7WUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssYUFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDMUMsMkRBQTJEO2dCQUMzRCxhQUFhLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3ZEO1lBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFckUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxRQUFRLCtEQUErRCxDQUFDLENBQUM7WUFDaEcsTUFBTSxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUUxRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQzlELHdGQUF3RjtnQkFDeEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUU7b0JBQ2pGLFNBQVMsRUFBRSwwQkFBMEI7b0JBQ3JDLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtvQkFDN0MsUUFBUSxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFO29CQUNsQyxHQUFHLGFBQWEsQ0FBQyxLQUFLO2lCQUN2QixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN6QztTQUNGO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0RSxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDcEQ7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLHFCQUFxQixDQUFDLFdBQTJCO1FBQzdELE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxXQUFXLENBQUM7UUFDOUIsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxzQkFBc0I7WUFBRSxPQUFPO1FBRXZELE1BQU0sSUFBSSxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLElBQUksaUJBQWlCLENBQ3JDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQ3JDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQ25DLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQ2xDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQ3hDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQ3hDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsb0NBQW9DO1FBQzdDLEtBQUssQ0FBQyxxQkFBcUIsRUFDM0IsV0FBVyxDQUNaLENBQUM7UUFFRixNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxVQUFVLENBQUMsU0FBb0IsRUFBRSxRQUFrQixFQUFFLGFBQXFCO1FBQy9FLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLFNBQVM7WUFBRSxPQUFPO1FBRXRCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUMvRyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxPQUFxQjtRQUMzRCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxPQUFPLGdDQUFnQyxDQUFDLENBQUM7U0FDaEg7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxNQUFNLElBQUksS0FBSyxDQUNiLHNEQUFzRCxPQUFPLGdEQUFnRCxDQUM5RyxDQUFDO1NBQ0g7UUFDRCxPQUFPLE1BQU0sU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyx5QkFBeUI7UUFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hELE9BQU8sTUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGFBQWE7UUFDbEIsT0FBTztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsY0FBYztZQUMzQixLQUFLLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7U0FDMUcsQ0FBQztJQUNKLENBQUM7Q0FDRiJ9
|
|
250
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2hyb25pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9zeW5jaHJvbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixZQUFZLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFhLE1BQU0sb0JBQW9CLENBQUM7QUFDbEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFhLG9CQUFvQixFQUFZLGNBQWMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBSWpILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQVV2QixZQUFvQixJQUFlLEVBQVUsRUFBWSxFQUFFLFNBQVMsR0FBRyxFQUFFO1FBQXJELFNBQUksR0FBSixJQUFJLENBQVc7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFVO1FBUmpELG1CQUFjLEdBQW9CLEVBQUUsQ0FBQztRQUNyQyx1QkFBa0IsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDOUMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQiwyQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFDM0IsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFFbkIsNEJBQXVCLEdBQW9CLEVBQUUsQ0FBQztRQUdwRCxJQUFJLENBQUMsR0FBRyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLEtB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/pxe",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.11",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"bin": "./dest/bin/index.js",
|
|
@@ -32,13 +32,13 @@
|
|
|
32
32
|
"rootDir": "./src"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@aztec/acir-simulator": "0.8.
|
|
36
|
-
"@aztec/circuits.js": "0.8.
|
|
37
|
-
"@aztec/ethereum": "0.8.
|
|
38
|
-
"@aztec/foundation": "0.8.
|
|
39
|
-
"@aztec/key-store": "0.8.
|
|
40
|
-
"@aztec/noir-compiler": "0.8.
|
|
41
|
-
"@aztec/types": "0.8.
|
|
35
|
+
"@aztec/acir-simulator": "0.8.11",
|
|
36
|
+
"@aztec/circuits.js": "0.8.11",
|
|
37
|
+
"@aztec/ethereum": "0.8.11",
|
|
38
|
+
"@aztec/foundation": "0.8.11",
|
|
39
|
+
"@aztec/key-store": "0.8.11",
|
|
40
|
+
"@aztec/noir-compiler": "0.8.11",
|
|
41
|
+
"@aztec/types": "0.8.11",
|
|
42
42
|
"koa": "^2.14.2",
|
|
43
43
|
"koa-router": "^12.0.0",
|
|
44
44
|
"lodash.omit": "^4.5.0",
|
|
@@ -31,17 +31,17 @@ export class ContractDataOracle {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
|
-
* Retrieves the
|
|
34
|
+
* Retrieves the artifact of a specified function within a given contract.
|
|
35
35
|
* The function is identified by its selector, which is a unique code generated from the function's signature.
|
|
36
36
|
* Throws an error if the contract address or function selector are invalid or not found.
|
|
37
37
|
*
|
|
38
38
|
* @param contractAddress - The AztecAddress representing the contract containing the function.
|
|
39
39
|
* @param selector - The function selector.
|
|
40
|
-
* @returns The corresponding function's
|
|
40
|
+
* @returns The corresponding function's artifact as an object.
|
|
41
41
|
*/
|
|
42
|
-
public async
|
|
42
|
+
public async getFunctionArtifact(contractAddress: AztecAddress, selector: FunctionSelector) {
|
|
43
43
|
const tree = await this.getTree(contractAddress);
|
|
44
|
-
return tree.
|
|
44
|
+
return tree.getFunctionArtifact(selector);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
/**
|
|
@@ -51,20 +51,20 @@ export class ContractDataOracle {
|
|
|
51
51
|
*
|
|
52
52
|
* @param contractAddress - The AztecAddress representing the contract containing the function.
|
|
53
53
|
* @param selector - The function selector.
|
|
54
|
-
* @returns The corresponding function's
|
|
54
|
+
* @returns The corresponding function's artifact as an object.
|
|
55
55
|
*/
|
|
56
56
|
public async getFunctionDebugMetadata(
|
|
57
57
|
contractAddress: AztecAddress,
|
|
58
58
|
selector: FunctionSelector,
|
|
59
59
|
): Promise<FunctionDebugMetadata | undefined> {
|
|
60
60
|
const contract = await this.db.getContract(contractAddress);
|
|
61
|
-
const
|
|
61
|
+
const functionArtifact = contract?.functions.find(f => f.selector.equals(selector));
|
|
62
62
|
|
|
63
|
-
if (!contract || !
|
|
63
|
+
if (!contract || !functionArtifact) {
|
|
64
64
|
return undefined;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
return getFunctionDebugMetadata(contract,
|
|
67
|
+
return getFunctionDebugMetadata(contract, functionArtifact.name);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
/**
|
|
@@ -22,14 +22,14 @@ import {
|
|
|
22
22
|
computeVarArgsHash,
|
|
23
23
|
hashConstructor,
|
|
24
24
|
} from '@aztec/circuits.js/abis';
|
|
25
|
-
import {
|
|
25
|
+
import { ContractArtifact, FunctionSelector } from '@aztec/foundation/abi';
|
|
26
26
|
import { assertLength } from '@aztec/foundation/serialize';
|
|
27
27
|
import { AztecNode, ContractDao, MerkleTreeId, PublicKey, StateInfoProvider } from '@aztec/types';
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* The ContractTree class represents a Merkle tree of functions for a particular contract.
|
|
31
31
|
* It manages the construction of the function tree, computes its root, and generates membership witnesses
|
|
32
|
-
* for constrained functions. This class also enables lookup of specific function
|
|
32
|
+
* for constrained functions. This class also enables lookup of specific function artifact using selectors.
|
|
33
33
|
* It is used in combination with the AztecNode to compute various data for executing private transactions.
|
|
34
34
|
*/
|
|
35
35
|
export class ContractTree {
|
|
@@ -40,7 +40,7 @@ export class ContractTree {
|
|
|
40
40
|
|
|
41
41
|
constructor(
|
|
42
42
|
/**
|
|
43
|
-
* The contract data object containing the
|
|
43
|
+
* The contract data object containing the artifact and contract address.
|
|
44
44
|
*/
|
|
45
45
|
public readonly contract: ContractDao,
|
|
46
46
|
private stateInfoProvider: StateInfoProvider,
|
|
@@ -52,13 +52,13 @@ export class ContractTree {
|
|
|
52
52
|
) {}
|
|
53
53
|
|
|
54
54
|
/**
|
|
55
|
-
* Create a new ContractTree instance from the provided contract
|
|
55
|
+
* Create a new ContractTree instance from the provided contract artifact, constructor arguments, and related data.
|
|
56
56
|
* The function generates function leaves for constrained functions, computes the function tree root,
|
|
57
57
|
* and hashes the constructor's verification key. It then computes the contract address using the contract
|
|
58
58
|
* and portal contract addresses, contract address salt, and generated data. Finally, it returns a new
|
|
59
59
|
* ContractTree instance containing the contract data and computed values.
|
|
60
60
|
*
|
|
61
|
-
* @param
|
|
61
|
+
* @param artifact - The contract's build artifact containing the functions and their metadata.
|
|
62
62
|
* @param args - An array of Fr elements representing the constructor's arguments.
|
|
63
63
|
* @param portalContract - The Ethereum address of the portal smart contract.
|
|
64
64
|
* @param contractAddressSalt - An Fr element representing the salt used to compute the contract address.
|
|
@@ -67,7 +67,7 @@ export class ContractTree {
|
|
|
67
67
|
* @returns A new ContractTree instance containing the contract data and computed values.
|
|
68
68
|
*/
|
|
69
69
|
public static async new(
|
|
70
|
-
|
|
70
|
+
artifact: ContractArtifact,
|
|
71
71
|
args: Fr[],
|
|
72
72
|
portalContract: EthAddress,
|
|
73
73
|
contractAddressSalt: Fr,
|
|
@@ -75,29 +75,29 @@ export class ContractTree {
|
|
|
75
75
|
node: AztecNode,
|
|
76
76
|
) {
|
|
77
77
|
const wasm = await CircuitsWasm.get();
|
|
78
|
-
const
|
|
79
|
-
if (!
|
|
78
|
+
const constructorArtifact = artifact.functions.find(isConstructor);
|
|
79
|
+
if (!constructorArtifact) {
|
|
80
80
|
throw new Error('Constructor not found.');
|
|
81
81
|
}
|
|
82
|
-
if (!
|
|
82
|
+
if (!constructorArtifact.verificationKey) {
|
|
83
83
|
throw new Error('Missing verification key for the constructor.');
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
const functions =
|
|
86
|
+
const functions = artifact.functions.map(f => ({
|
|
87
87
|
...f,
|
|
88
88
|
selector: FunctionSelector.fromNameAndParameters(f.name, f.parameters),
|
|
89
89
|
}));
|
|
90
90
|
const leaves = generateFunctionLeaves(functions, wasm);
|
|
91
91
|
const root = computeFunctionTreeRoot(wasm, leaves);
|
|
92
|
-
const functionData = FunctionData.fromAbi(
|
|
93
|
-
const vkHash = hashVKStr(
|
|
92
|
+
const functionData = FunctionData.fromAbi(constructorArtifact);
|
|
93
|
+
const vkHash = hashVKStr(constructorArtifact.verificationKey, wasm);
|
|
94
94
|
const argsHash = await computeVarArgsHash(wasm, args);
|
|
95
95
|
const constructorHash = hashConstructor(wasm, functionData, argsHash, vkHash);
|
|
96
96
|
|
|
97
97
|
const completeAddress = computeCompleteAddress(wasm, from, contractAddressSalt, root, constructorHash);
|
|
98
98
|
|
|
99
99
|
const contractDao: ContractDao = {
|
|
100
|
-
...
|
|
100
|
+
...artifact,
|
|
101
101
|
completeAddress,
|
|
102
102
|
functions,
|
|
103
103
|
portalContract,
|
|
@@ -110,23 +110,23 @@ export class ContractTree {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
/**
|
|
113
|
-
* Retrieve the
|
|
113
|
+
* Retrieve the artifact of a given function.
|
|
114
114
|
* The function is identified by its selector, which represents a unique identifier for the function's signature.
|
|
115
115
|
* Throws an error if the function with the provided selector is not found in the contract.
|
|
116
116
|
*
|
|
117
117
|
* @param selector - The function selector.
|
|
118
|
-
* @returns The
|
|
118
|
+
* @returns The artifact object containing relevant information about the targeted function.
|
|
119
119
|
*/
|
|
120
|
-
public
|
|
121
|
-
const
|
|
122
|
-
if (!
|
|
120
|
+
public getFunctionArtifact(selector: FunctionSelector) {
|
|
121
|
+
const artifact = this.contract.functions.find(f => f.selector.equals(selector));
|
|
122
|
+
if (!artifact) {
|
|
123
123
|
throw new Error(
|
|
124
|
-
`Unknown function. Selector ${selector.toString()} not found in the
|
|
124
|
+
`Unknown function. Selector ${selector.toString()} not found in the artifact of contract ${this.contract.completeAddress.address.toString()}. Expected one of: ${this.contract.functions
|
|
125
125
|
.map(f => f.selector.toString())
|
|
126
126
|
.join(', ')}`,
|
|
127
127
|
);
|
|
128
128
|
}
|
|
129
|
-
return
|
|
129
|
+
return artifact;
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
/**
|
|
@@ -138,7 +138,7 @@ export class ContractTree {
|
|
|
138
138
|
* @returns The bytecode of the function as a string.
|
|
139
139
|
*/
|
|
140
140
|
public getBytecode(selector: FunctionSelector) {
|
|
141
|
-
return this.
|
|
141
|
+
return this.getFunctionArtifact(selector).bytecode;
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
/**
|
package/src/database/database.ts
CHANGED
|
@@ -128,4 +128,10 @@ export interface Database extends ContractDatabase {
|
|
|
128
128
|
* @returns A promise that resolves to an array of AztecAddress instances.
|
|
129
129
|
*/
|
|
130
130
|
getCompleteAddresses(): Promise<CompleteAddress[]>;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Returns the estimated size in bytes of this db.
|
|
134
|
+
* @returns The estimated size in bytes of this db.
|
|
135
|
+
*/
|
|
136
|
+
estimateSize(): number;
|
|
131
137
|
}
|
|
@@ -6,7 +6,7 @@ import { MerkleTreeId, PublicKey } from '@aztec/types';
|
|
|
6
6
|
|
|
7
7
|
import { MemoryContractDatabase } from '../contract_database/index.js';
|
|
8
8
|
import { Database } from './database.js';
|
|
9
|
-
import { NoteSpendingInfoDao } from './note_spending_info_dao.js';
|
|
9
|
+
import { NoteSpendingInfoDao, getNoteSpendingInfoDaoSize } from './note_spending_info_dao.js';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* The MemoryDB class provides an in-memory implementation of a database to manage transactions and auxiliary data.
|
|
@@ -144,4 +144,12 @@ export class MemoryDB extends MemoryContractDatabase implements Database {
|
|
|
144
144
|
public getCompleteAddresses(): Promise<CompleteAddress[]> {
|
|
145
145
|
return Promise.resolve(this.addresses);
|
|
146
146
|
}
|
|
147
|
+
|
|
148
|
+
public estimateSize() {
|
|
149
|
+
const notesSize = this.noteSpendingInfoTable.reduce((sum, note) => sum + getNoteSpendingInfoDaoSize(note), 0);
|
|
150
|
+
const treeRootsSize = this.treeRoots ? Object.entries(this.treeRoots).length * Fr.SIZE_IN_BYTES : 0;
|
|
151
|
+
const authWits = Object.entries(this.authWitnesses);
|
|
152
|
+
const authWitsSize = authWits.reduce((sum, [key, value]) => sum + key.length + value.length * Fr.SIZE_IN_BYTES, 0);
|
|
153
|
+
return notesSize + treeRootsSize + authWitsSize + this.addresses.length * CompleteAddress.SIZE_IN_BYTES;
|
|
154
|
+
}
|
|
147
155
|
}
|
|
@@ -25,7 +25,7 @@ export interface NoteSpendingInfoDao {
|
|
|
25
25
|
*/
|
|
26
26
|
notePreimage: NotePreimage;
|
|
27
27
|
/**
|
|
28
|
-
* Inner note hash of the note. This is
|
|
28
|
+
* Inner note hash of the note. This is customizable by the app circuit.
|
|
29
29
|
* We can use this value to compute siloedNoteHash and uniqueSiloedNoteHash.
|
|
30
30
|
*/
|
|
31
31
|
innerNoteHash: Fr;
|
|
@@ -62,3 +62,14 @@ export const createRandomNoteSpendingInfoDao = ({
|
|
|
62
62
|
index,
|
|
63
63
|
publicKey,
|
|
64
64
|
});
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Returns the size in bytes of a note spending info dao.
|
|
68
|
+
* @param note - The note.
|
|
69
|
+
* @returns - Its size in bytes.
|
|
70
|
+
*/
|
|
71
|
+
export function getNoteSpendingInfoDaoSize(note: NoteSpendingInfoDao) {
|
|
72
|
+
// 7 fields + 1 bigint + 1 buffer size (4 bytes) + 1 buffer
|
|
73
|
+
const indexSize = Math.ceil(Math.log2(Number(note.index)));
|
|
74
|
+
return 7 * Fr.SIZE_IN_BYTES + indexSize + 4 + note.notePreimage.items.length * Fr.SIZE_IN_BYTES;
|
|
75
|
+
}
|
|
@@ -17,6 +17,7 @@ import { siloCommitment } from '@aztec/circuits.js/abis';
|
|
|
17
17
|
import { Fr } from '@aztec/foundation/fields';
|
|
18
18
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
19
19
|
import { elapsed } from '@aztec/foundation/timer';
|
|
20
|
+
import { CircuitSimulationStats } from '@aztec/types/stats';
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
23
|
* Represents the output of the proof creation process for init and inner private kernel circuit.
|
|
@@ -109,17 +110,17 @@ export class KernelProofCreator implements ProofCreator {
|
|
|
109
110
|
|
|
110
111
|
public async createProofInit(privateInputs: PrivateKernelInputsInit): Promise<ProofOutput> {
|
|
111
112
|
const wasm = await CircuitsWasm.get();
|
|
112
|
-
const [
|
|
113
|
+
const [duration, result] = await elapsed(() => privateKernelSimInit(wasm, privateInputs));
|
|
113
114
|
if (result instanceof CircuitError) {
|
|
114
115
|
throw new CircuitError(result.code, result.message);
|
|
115
116
|
}
|
|
116
117
|
this.log(`Simulated private kernel init`, {
|
|
117
118
|
eventName: 'circuit-simulation',
|
|
118
119
|
circuitName: 'private-kernel-init',
|
|
119
|
-
duration
|
|
120
|
+
duration,
|
|
120
121
|
inputSize: privateInputs.toBuffer().length,
|
|
121
122
|
outputSize: result.toBuffer().length,
|
|
122
|
-
});
|
|
123
|
+
} satisfies CircuitSimulationStats);
|
|
123
124
|
this.log('Skipping private kernel init proving...');
|
|
124
125
|
const proof = makeEmptyProof();
|
|
125
126
|
|
|
@@ -131,17 +132,17 @@ export class KernelProofCreator implements ProofCreator {
|
|
|
131
132
|
|
|
132
133
|
public async createProofInner(privateInputs: PrivateKernelInputsInner): Promise<ProofOutput> {
|
|
133
134
|
const wasm = await CircuitsWasm.get();
|
|
134
|
-
const [
|
|
135
|
+
const [duration, result] = await elapsed(() => privateKernelSimInner(wasm, privateInputs));
|
|
135
136
|
if (result instanceof CircuitError) {
|
|
136
137
|
throw new CircuitError(result.code, result.message);
|
|
137
138
|
}
|
|
138
139
|
this.log(`Simulated private kernel inner`, {
|
|
139
140
|
eventName: 'circuit-simulation',
|
|
140
141
|
circuitName: 'private-kernel-inner',
|
|
141
|
-
duration
|
|
142
|
+
duration,
|
|
142
143
|
inputSize: privateInputs.toBuffer().length,
|
|
143
144
|
outputSize: result.toBuffer().length,
|
|
144
|
-
});
|
|
145
|
+
} satisfies CircuitSimulationStats);
|
|
145
146
|
this.log('Skipping private kernel inner proving...');
|
|
146
147
|
const proof = makeEmptyProof();
|
|
147
148
|
|
|
@@ -154,17 +155,17 @@ export class KernelProofCreator implements ProofCreator {
|
|
|
154
155
|
public async createProofOrdering(privateInputs: PrivateKernelInputsOrdering): Promise<ProofOutputFinal> {
|
|
155
156
|
const wasm = await CircuitsWasm.get();
|
|
156
157
|
this.log('Executing private kernel simulation ordering...');
|
|
157
|
-
const [
|
|
158
|
+
const [duration, result] = await elapsed(() => privateKernelSimOrdering(wasm, privateInputs));
|
|
158
159
|
if (result instanceof CircuitError) {
|
|
159
160
|
throw new CircuitError(result.code, result.message);
|
|
160
161
|
}
|
|
161
162
|
this.log(`Simulated private kernel ordering`, {
|
|
162
163
|
eventName: 'circuit-simulation',
|
|
163
164
|
circuitName: 'private-kernel-ordering',
|
|
164
|
-
duration
|
|
165
|
+
duration,
|
|
165
166
|
inputSize: privateInputs.toBuffer().length,
|
|
166
167
|
outputSize: result.toBuffer().length,
|
|
167
|
-
});
|
|
168
|
+
} satisfies CircuitSimulationStats);
|
|
168
169
|
this.log('Skipping private kernel ordering proving...');
|
|
169
170
|
const proof = makeEmptyProof();
|
|
170
171
|
|
|
@@ -5,6 +5,7 @@ import { Fr } from '@aztec/foundation/fields';
|
|
|
5
5
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { Timer } from '@aztec/foundation/timer';
|
|
7
7
|
import { AztecNode, KeyStore, L2BlockContext, L2BlockL2Logs, NoteSpendingInfo, PublicKey } from '@aztec/types';
|
|
8
|
+
import { NoteProcessorStats } from '@aztec/types/stats';
|
|
8
9
|
|
|
9
10
|
import { Database, NoteSpendingInfoDao } from '../database/index.js';
|
|
10
11
|
import { getAcirSimulator } from '../simulator/index.js';
|
|
@@ -23,16 +24,6 @@ interface ProcessedData {
|
|
|
23
24
|
noteSpendingInfoDaos: NoteSpendingInfoDao[];
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
/** Accumulated stats for a note processor. */
|
|
27
|
-
type NoteProcessorStats = {
|
|
28
|
-
/** How many notes have been seen and trial-decrypted. */
|
|
29
|
-
seen: number;
|
|
30
|
-
/** How many notes were successfully decrypted. */
|
|
31
|
-
decrypted: number;
|
|
32
|
-
/** How many notes failed processing. */
|
|
33
|
-
failed: number;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
27
|
/**
|
|
37
28
|
* NoteProcessor is responsible for decrypting logs and converting them to notes via their originating contracts
|
|
38
29
|
* before storing them against their owner.
|
|
@@ -45,7 +36,7 @@ export class NoteProcessor {
|
|
|
45
36
|
public readonly timer: Timer = new Timer();
|
|
46
37
|
|
|
47
38
|
/** Stats accumulated for this processor. */
|
|
48
|
-
public readonly stats: NoteProcessorStats = { seen: 0, decrypted: 0, failed: 0 };
|
|
39
|
+
public readonly stats: NoteProcessorStats = { seen: 0, decrypted: 0, failed: 0, blocks: 0, txs: 0 };
|
|
49
40
|
|
|
50
41
|
constructor(
|
|
51
42
|
/**
|
|
@@ -75,7 +66,7 @@ export class NoteProcessor {
|
|
|
75
66
|
}
|
|
76
67
|
|
|
77
68
|
/**
|
|
78
|
-
* Returns
|
|
69
|
+
* Returns synchronization status (ie up to which block has been synced ) for this note processor.
|
|
79
70
|
*/
|
|
80
71
|
public get status() {
|
|
81
72
|
return { syncedToBlock: this.syncedToBlock };
|
|
@@ -106,6 +97,7 @@ export class NoteProcessor {
|
|
|
106
97
|
|
|
107
98
|
// Iterate over both blocks and encrypted logs.
|
|
108
99
|
for (let blockIndex = 0; blockIndex < encryptedL2BlockLogs.length; ++blockIndex) {
|
|
100
|
+
this.stats.blocks++;
|
|
109
101
|
const { txLogs } = encryptedL2BlockLogs[blockIndex];
|
|
110
102
|
const block = l2BlockContexts[blockIndex].block;
|
|
111
103
|
const dataStartIndexForBlock = block.startPrivateDataTreeSnapshot.nextAvailableLeafIndex;
|
|
@@ -117,6 +109,7 @@ export class NoteProcessor {
|
|
|
117
109
|
|
|
118
110
|
// Iterate over all the encrypted logs and try decrypting them. If successful, store the note spending info.
|
|
119
111
|
for (let indexOfTxInABlock = 0; indexOfTxInABlock < txLogs.length; ++indexOfTxInABlock) {
|
|
112
|
+
this.stats.txs++;
|
|
120
113
|
const dataStartIndexForTx = dataStartIndexForBlock + indexOfTxInABlock * MAX_NEW_COMMITMENTS_PER_TX;
|
|
121
114
|
const newCommitments = block.newCommitments.slice(
|
|
122
115
|
indexOfTxInABlock * MAX_NEW_COMMITMENTS_PER_TX,
|
|
@@ -237,7 +230,7 @@ ${siloedNoteHash.toString()}'.
|
|
|
237
230
|
If you can see that notification. Everything's fine.
|
|
238
231
|
If that's not the case, and you can't find such a notification, something has gone wrong.
|
|
239
232
|
There could be a problem with the way you've defined a custom note, or with the way you're
|
|
240
|
-
|
|
233
|
+
serializing / deserializing / hashing / encrypting / decrypting that note.
|
|
241
234
|
Please see the following github issue to track an improvement that we're working on:
|
|
242
235
|
https://github.com/AztecProtocol/aztec-packages/issues/1641`;
|
|
243
236
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { FunctionSelector } from '@aztec/circuits.js';
|
|
1
2
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
2
3
|
import { Fr, GrumpkinScalar, Point } from '@aztec/foundation/fields';
|
|
3
4
|
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
@@ -6,9 +7,11 @@ import {
|
|
|
6
7
|
CompleteAddress,
|
|
7
8
|
ContractData,
|
|
8
9
|
ExtendedContractData,
|
|
10
|
+
ExtendedUnencryptedL2Log,
|
|
9
11
|
L2Block,
|
|
10
12
|
L2BlockL2Logs,
|
|
11
13
|
L2Tx,
|
|
14
|
+
LogId,
|
|
12
15
|
NotePreimage,
|
|
13
16
|
PXE,
|
|
14
17
|
Tx,
|
|
@@ -37,6 +40,8 @@ export function createPXERpcServer(pxeService: PXE): JsonRpcServer {
|
|
|
37
40
|
TxExecutionRequest,
|
|
38
41
|
ContractData,
|
|
39
42
|
ExtendedContractData,
|
|
43
|
+
ExtendedUnencryptedL2Log,
|
|
44
|
+
FunctionSelector,
|
|
40
45
|
TxHash,
|
|
41
46
|
EthAddress,
|
|
42
47
|
Point,
|
|
@@ -46,6 +51,7 @@ export function createPXERpcServer(pxeService: PXE): JsonRpcServer {
|
|
|
46
51
|
AuthWitness,
|
|
47
52
|
L2Block,
|
|
48
53
|
L2Tx,
|
|
54
|
+
LogId,
|
|
49
55
|
},
|
|
50
56
|
{ Tx, TxReceipt, L2BlockL2Logs },
|
|
51
57
|
false,
|