@aztec/pxe 0.0.1-commit.27d773e65 → 0.0.1-commit.2c85e299c
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/config/index.d.ts +2 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +3 -3
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +49 -45
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.d.ts +44 -44
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +132 -89
- package/dest/contract_function_simulator/oracle/private_execution.js +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +20 -20
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +28 -28
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +36 -34
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +42 -41
- package/dest/oracle_version.d.ts +2 -2
- package/dest/oracle_version.js +3 -3
- package/dest/pxe.d.ts +3 -2
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +8 -5
- package/package.json +16 -16
- package/src/config/index.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +3 -3
- package/src/contract_function_simulator/oracle/interfaces.ts +47 -44
- package/src/contract_function_simulator/oracle/oracle.ts +135 -107
- package/src/contract_function_simulator/oracle/private_execution.ts +1 -1
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +28 -28
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +43 -50
- package/src/oracle_version.ts +3 -3
- package/src/pxe.ts +6 -3
|
@@ -189,7 +189,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
189
189
|
* The value persists through nested calls, meaning all calls down the stack will use the same
|
|
190
190
|
* 'senderForTags' value (unless it is replaced).
|
|
191
191
|
*/
|
|
192
|
-
public
|
|
192
|
+
public getSenderForTags(): Promise<AztecAddress | undefined> {
|
|
193
193
|
return Promise.resolve(this.senderForTags);
|
|
194
194
|
}
|
|
195
195
|
|
|
@@ -204,7 +204,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
204
204
|
* through nested calls, meaning all calls down the stack will use the same 'senderForTags'
|
|
205
205
|
* value (unless it is replaced by another call to this setter).
|
|
206
206
|
*/
|
|
207
|
-
public
|
|
207
|
+
public setSenderForTags(senderForTags: AztecAddress): Promise<void> {
|
|
208
208
|
this.senderForTags = senderForTags;
|
|
209
209
|
return Promise.resolve();
|
|
210
210
|
}
|
|
@@ -215,7 +215,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
215
215
|
* @param recipient - The address receiving the log
|
|
216
216
|
* @returns An app tag to be used in a log.
|
|
217
217
|
*/
|
|
218
|
-
public async
|
|
218
|
+
public async getNextAppTagAsSender(sender: AztecAddress, recipient: AztecAddress): Promise<Tag> {
|
|
219
219
|
const extendedSecret = await this.#calculateExtendedDirectionalAppTaggingSecret(
|
|
220
220
|
this.contractAddress,
|
|
221
221
|
sender,
|
|
@@ -223,7 +223,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
223
223
|
);
|
|
224
224
|
|
|
225
225
|
const index = await this.#getIndexToUseForSecret(extendedSecret);
|
|
226
|
-
this.
|
|
226
|
+
this.logger.debug(
|
|
227
227
|
`Incrementing tagging index for sender: ${sender}, recipient: ${recipient}, contract: ${this.contractAddress} to ${index}`,
|
|
228
228
|
);
|
|
229
229
|
this.taggingIndexCache.setLastUsedIndex(extendedSecret, index);
|
|
@@ -277,7 +277,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
277
277
|
* @param values - Values to store.
|
|
278
278
|
* @returns The hash of the values.
|
|
279
279
|
*/
|
|
280
|
-
public
|
|
280
|
+
public storeInExecutionCache(values: Fr[], hash: Fr) {
|
|
281
281
|
return this.executionCache.store(values, hash);
|
|
282
282
|
}
|
|
283
283
|
|
|
@@ -286,7 +286,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
286
286
|
* @param hash - Hash of the values.
|
|
287
287
|
* @returns The values.
|
|
288
288
|
*/
|
|
289
|
-
public
|
|
289
|
+
public loadFromExecutionCache(hash: Fr): Promise<Fr[]> {
|
|
290
290
|
const preimage = this.executionCache.getPreimage(hash);
|
|
291
291
|
if (!preimage) {
|
|
292
292
|
throw new Error(`Preimage for hash ${hash.toString()} not found in cache`);
|
|
@@ -294,12 +294,12 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
294
294
|
return Promise.resolve(preimage);
|
|
295
295
|
}
|
|
296
296
|
|
|
297
|
-
override async
|
|
297
|
+
override async checkNullifierExists(innerNullifier: Fr): Promise<boolean> {
|
|
298
298
|
// This oracle must be overridden because while utility execution can only meaningfully check if a nullifier exists
|
|
299
299
|
// in the synched block, during private execution there's also the possibility of it being pending, i.e. created
|
|
300
300
|
// in the current transaction.
|
|
301
301
|
|
|
302
|
-
this.
|
|
302
|
+
this.logger.debug(`Checking existence of inner nullifier ${innerNullifier}`, {
|
|
303
303
|
contractAddress: this.contractAddress,
|
|
304
304
|
});
|
|
305
305
|
|
|
@@ -307,7 +307,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
307
307
|
|
|
308
308
|
return (
|
|
309
309
|
this.noteCache.getNullifiers(this.contractAddress).has(nullifier) ||
|
|
310
|
-
(await super.
|
|
310
|
+
(await super.checkNullifierExists(innerNullifier))
|
|
311
311
|
);
|
|
312
312
|
}
|
|
313
313
|
|
|
@@ -332,7 +332,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
332
332
|
* @param status - The status of notes to fetch.
|
|
333
333
|
* @returns Array of note data.
|
|
334
334
|
*/
|
|
335
|
-
public override async
|
|
335
|
+
public override async getNotes(
|
|
336
336
|
owner: AztecAddress | undefined,
|
|
337
337
|
storageSlot: Fr,
|
|
338
338
|
numSelects: number,
|
|
@@ -378,7 +378,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
378
378
|
offset,
|
|
379
379
|
});
|
|
380
380
|
|
|
381
|
-
this.
|
|
381
|
+
this.logger.debug(
|
|
382
382
|
`Returning ${notes.length} notes for ${this.callContext.contractAddress} at ${storageSlot}: ${notes
|
|
383
383
|
.map(n => `${n.noteNonce.toString()}:[${n.note.items.map(i => i.toString()).join(',')}]`)
|
|
384
384
|
.join(', ')}`,
|
|
@@ -398,7 +398,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
398
398
|
* @param noteHash - A hash of the new note.
|
|
399
399
|
* @returns
|
|
400
400
|
*/
|
|
401
|
-
public
|
|
401
|
+
public notifyCreatedNote(
|
|
402
402
|
owner: AztecAddress,
|
|
403
403
|
storageSlot: Fr,
|
|
404
404
|
randomness: Fr,
|
|
@@ -407,7 +407,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
407
407
|
noteHash: Fr,
|
|
408
408
|
counter: number,
|
|
409
409
|
) {
|
|
410
|
-
this.
|
|
410
|
+
this.logger.debug(`Notified of new note with inner hash ${noteHash}`, {
|
|
411
411
|
contractAddress: this.callContext.contractAddress,
|
|
412
412
|
storageSlot,
|
|
413
413
|
randomness,
|
|
@@ -439,7 +439,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
439
439
|
* @param innerNullifier - The pending nullifier to add in the list (not yet siloed by contract address).
|
|
440
440
|
* @param noteHash - A hash of the new note.
|
|
441
441
|
*/
|
|
442
|
-
public async
|
|
442
|
+
public async notifyNullifiedNote(innerNullifier: Fr, noteHash: Fr, counter: number) {
|
|
443
443
|
const nullifiedNoteHashCounter = await this.noteCache.nullifyNote(
|
|
444
444
|
this.callContext.contractAddress,
|
|
445
445
|
innerNullifier,
|
|
@@ -456,19 +456,19 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
456
456
|
* @param innerNullifier - The pending nullifier to add in the list (not yet siloed by contract address).
|
|
457
457
|
* @param noteHash - A hash of the new note.
|
|
458
458
|
*/
|
|
459
|
-
public
|
|
460
|
-
this.
|
|
459
|
+
public notifyCreatedNullifier(innerNullifier: Fr) {
|
|
460
|
+
this.logger.debug(`Notified of new inner nullifier ${innerNullifier}`, { contractAddress: this.contractAddress });
|
|
461
461
|
return this.noteCache.nullifierCreated(this.callContext.contractAddress, innerNullifier);
|
|
462
462
|
}
|
|
463
463
|
|
|
464
464
|
/**
|
|
465
|
-
* Check if a nullifier has been emitted in the same transaction, i.e. if
|
|
465
|
+
* Check if a nullifier has been emitted in the same transaction, i.e. if notifyCreatedNullifier has been
|
|
466
466
|
* called for this inner nullifier from the contract with the specified address.
|
|
467
467
|
* @param innerNullifier - The inner nullifier to check.
|
|
468
468
|
* @param contractAddress - Address of the contract that emitted the nullifier.
|
|
469
469
|
* @returns A boolean indicating whether the nullifier is pending or not.
|
|
470
470
|
*/
|
|
471
|
-
public async
|
|
471
|
+
public async isNullifierPending(innerNullifier: Fr, contractAddress: AztecAddress): Promise<boolean> {
|
|
472
472
|
const siloedNullifier = await siloNullifier(contractAddress, innerNullifier);
|
|
473
473
|
const isNullifierPending = this.noteCache.getNullifiers(contractAddress).has(siloedNullifier.toBigInt());
|
|
474
474
|
return Promise.resolve(isNullifierPending);
|
|
@@ -481,10 +481,10 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
481
481
|
* @param log - The contract class log to be emitted.
|
|
482
482
|
* @param counter - The contract class log's counter.
|
|
483
483
|
*/
|
|
484
|
-
public
|
|
484
|
+
public notifyCreatedContractClassLog(log: ContractClassLog, counter: number) {
|
|
485
485
|
this.contractClassLogs.push(new CountedContractClassLog(log, counter));
|
|
486
486
|
const text = log.toBuffer().toString('hex');
|
|
487
|
-
this.
|
|
487
|
+
this.logger.verbose(
|
|
488
488
|
`Emitted log from ContractClassRegistry: "${text.length > 100 ? text.slice(0, 100) + '...' : text}"`,
|
|
489
489
|
);
|
|
490
490
|
}
|
|
@@ -510,7 +510,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
510
510
|
* @param isStaticCall - Whether the call is a static call.
|
|
511
511
|
* @returns The execution result.
|
|
512
512
|
*/
|
|
513
|
-
async
|
|
513
|
+
async callPrivateFunction(
|
|
514
514
|
targetContractAddress: AztecAddress,
|
|
515
515
|
functionSelector: FunctionSelector,
|
|
516
516
|
argsHash: Fr,
|
|
@@ -524,7 +524,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
524
524
|
}
|
|
525
525
|
|
|
526
526
|
const simulatorSetupTimer = new Timer();
|
|
527
|
-
this.
|
|
527
|
+
this.logger.debug(
|
|
528
528
|
`Calling private function ${targetContractAddress}:${functionSelector} from ${this.callContext.contractAddress}`,
|
|
529
529
|
);
|
|
530
530
|
|
|
@@ -573,7 +573,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
573
573
|
jobId: this.jobId,
|
|
574
574
|
totalPublicCalldataCount: this.totalPublicCalldataCount,
|
|
575
575
|
sideEffectCounter,
|
|
576
|
-
log: this.
|
|
576
|
+
log: this.logger,
|
|
577
577
|
scopes: this.scopes,
|
|
578
578
|
senderForTags: this.senderForTags,
|
|
579
579
|
simulator: this.simulator!,
|
|
@@ -627,7 +627,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
627
627
|
* @param sideEffectCounter - The side effect counter at the start of the call.
|
|
628
628
|
* @param isStaticCall - Whether the call is a static call.
|
|
629
629
|
*/
|
|
630
|
-
public
|
|
630
|
+
public notifyEnqueuedPublicFunctionCall(
|
|
631
631
|
_targetContractAddress: AztecAddress,
|
|
632
632
|
calldataHash: Fr,
|
|
633
633
|
_sideEffectCounter: number,
|
|
@@ -644,7 +644,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
644
644
|
* @param sideEffectCounter - The side effect counter at the start of the call.
|
|
645
645
|
* @param isStaticCall - Whether the call is a static call.
|
|
646
646
|
*/
|
|
647
|
-
public
|
|
647
|
+
public notifySetPublicTeardownFunctionCall(
|
|
648
648
|
_targetContractAddress: AztecAddress,
|
|
649
649
|
calldataHash: Fr,
|
|
650
650
|
_sideEffectCounter: number,
|
|
@@ -654,11 +654,11 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
654
654
|
return Promise.resolve();
|
|
655
655
|
}
|
|
656
656
|
|
|
657
|
-
public
|
|
657
|
+
public notifySetMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter: number): Promise<void> {
|
|
658
658
|
return this.noteCache.setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter);
|
|
659
659
|
}
|
|
660
660
|
|
|
661
|
-
public
|
|
661
|
+
public isSideEffectCounterRevertible(sideEffectCounter: number): Promise<boolean> {
|
|
662
662
|
return Promise.resolve(this.noteCache.isSideEffectCounterRevertible(sideEffectCounter));
|
|
663
663
|
}
|
|
664
664
|
|
|
@@ -686,7 +686,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
686
686
|
return this.contractStore.getDebugFunctionName(this.contractAddress, this.callContext.functionSelector);
|
|
687
687
|
}
|
|
688
688
|
|
|
689
|
-
public
|
|
689
|
+
public emitOffchainEffect(data: Fr[]): Promise<void> {
|
|
690
690
|
this.offchainEffects.push({ data });
|
|
691
691
|
return Promise.resolve();
|
|
692
692
|
}
|
|
@@ -9,11 +9,11 @@ import type { KeyStore } from '@aztec/key-store';
|
|
|
9
9
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
10
10
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
11
11
|
import { BlockHash } from '@aztec/stdlib/block';
|
|
12
|
-
import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
|
|
12
|
+
import type { CompleteAddress, ContractInstance, PartialAddress } from '@aztec/stdlib/contract';
|
|
13
13
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
14
14
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
15
15
|
import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
|
|
16
|
-
import { computeAddressSecret } from '@aztec/stdlib/keys';
|
|
16
|
+
import { type PublicKeys, computeAddressSecret } from '@aztec/stdlib/keys';
|
|
17
17
|
import { deriveEcdhSharedSecret } from '@aztec/stdlib/logs';
|
|
18
18
|
import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
|
|
19
19
|
import type { NoteStatus } from '@aztec/stdlib/note';
|
|
@@ -86,7 +86,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
86
86
|
protected readonly capsuleStore: CapsuleStore;
|
|
87
87
|
protected readonly privateEventStore: PrivateEventStore;
|
|
88
88
|
protected readonly jobId: string;
|
|
89
|
-
protected
|
|
89
|
+
protected logger: ReturnType<typeof createLogger>;
|
|
90
90
|
protected readonly scopes: AccessScopes;
|
|
91
91
|
|
|
92
92
|
constructor(args: UtilityExecutionOracleArgs) {
|
|
@@ -104,21 +104,21 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
104
104
|
this.capsuleStore = args.capsuleStore;
|
|
105
105
|
this.privateEventStore = args.privateEventStore;
|
|
106
106
|
this.jobId = args.jobId;
|
|
107
|
-
this.
|
|
107
|
+
this.logger = args.log ?? createLogger('simulator:client_view_context');
|
|
108
108
|
this.scopes = args.scopes;
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
-
public
|
|
111
|
+
public assertCompatibleOracleVersion(version: number): void {
|
|
112
112
|
if (version !== ORACLE_VERSION) {
|
|
113
113
|
throw new Error(`Incompatible oracle version. Expected version ${ORACLE_VERSION}, got ${version}.`);
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
public
|
|
117
|
+
public getRandomField(): Fr {
|
|
118
118
|
return Fr.random();
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
public
|
|
121
|
+
public getUtilityContext(): UtilityContext {
|
|
122
122
|
return new UtilityContext(this.anchorBlockHeader, this.contractAddress);
|
|
123
123
|
}
|
|
124
124
|
|
|
@@ -129,7 +129,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
129
129
|
* @throws If the keys are not registered in the key store.
|
|
130
130
|
* @throws If scopes are defined and the account is not in the scopes.
|
|
131
131
|
*/
|
|
132
|
-
public async
|
|
132
|
+
public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
|
|
133
133
|
// If scopes are defined, check that the key belongs to an account in the scopes.
|
|
134
134
|
if (this.scopes !== 'ALL_SCOPES' && this.scopes.length > 0) {
|
|
135
135
|
let hasAccess = false;
|
|
@@ -152,7 +152,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
152
152
|
* @param noteHash - The note hash to find in the note hash tree.
|
|
153
153
|
* @returns The membership witness containing the leaf index and sibling path
|
|
154
154
|
*/
|
|
155
|
-
public
|
|
155
|
+
public getNoteHashMembershipWitness(
|
|
156
156
|
anchorBlockHash: BlockHash,
|
|
157
157
|
noteHash: Fr,
|
|
158
158
|
): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
|
|
@@ -170,7 +170,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
170
170
|
* @param blockHash - The block hash to find in the archive tree.
|
|
171
171
|
* @returns The membership witness containing the leaf index and sibling path
|
|
172
172
|
*/
|
|
173
|
-
public
|
|
173
|
+
public getBlockHashMembershipWitness(
|
|
174
174
|
anchorBlockHash: BlockHash,
|
|
175
175
|
blockHash: BlockHash,
|
|
176
176
|
): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined> {
|
|
@@ -183,7 +183,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
183
183
|
* @param nullifier - Nullifier we try to find witness for.
|
|
184
184
|
* @returns The nullifier membership witness (if found).
|
|
185
185
|
*/
|
|
186
|
-
public
|
|
186
|
+
public getNullifierMembershipWitness(
|
|
187
187
|
blockHash: BlockHash,
|
|
188
188
|
nullifier: Fr,
|
|
189
189
|
): Promise<NullifierMembershipWitness | undefined> {
|
|
@@ -199,7 +199,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
199
199
|
* list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
|
|
200
200
|
* we are trying to prove non-inclusion for.
|
|
201
201
|
*/
|
|
202
|
-
public
|
|
202
|
+
public getLowNullifierMembershipWitness(
|
|
203
203
|
blockHash: BlockHash,
|
|
204
204
|
nullifier: Fr,
|
|
205
205
|
): Promise<NullifierMembershipWitness | undefined> {
|
|
@@ -212,7 +212,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
212
212
|
* @param leafSlot - The slot of the public data tree to get the witness for.
|
|
213
213
|
* @returns - The witness
|
|
214
214
|
*/
|
|
215
|
-
public
|
|
215
|
+
public getPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
|
|
216
216
|
return this.aztecNode.getPublicDataWitness(blockHash, leafSlot);
|
|
217
217
|
}
|
|
218
218
|
|
|
@@ -221,7 +221,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
221
221
|
* @param blockNumber - The number of a block of which to get the block header.
|
|
222
222
|
* @returns Block extracted from a block with block number `blockNumber`.
|
|
223
223
|
*/
|
|
224
|
-
public async
|
|
224
|
+
public async getBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined> {
|
|
225
225
|
const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
|
|
226
226
|
if (blockNumber > anchorBlockNumber) {
|
|
227
227
|
throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`);
|
|
@@ -232,12 +232,18 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
/**
|
|
235
|
-
* Retrieve the
|
|
235
|
+
* Retrieve the public keys and partial address associated to a given address.
|
|
236
236
|
* @param account - The account address.
|
|
237
|
-
* @returns
|
|
237
|
+
* @returns The public keys and partial address, or `undefined` if the account is not registered.
|
|
238
238
|
*/
|
|
239
|
-
public
|
|
240
|
-
|
|
239
|
+
public async tryGetPublicKeysAndPartialAddress(
|
|
240
|
+
account: AztecAddress,
|
|
241
|
+
): Promise<{ publicKeys: PublicKeys; partialAddress: PartialAddress } | undefined> {
|
|
242
|
+
const completeAddress = await this.addressStore.getCompleteAddress(account);
|
|
243
|
+
if (!completeAddress) {
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
return { publicKeys: completeAddress.publicKeys, partialAddress: completeAddress.partialAddress };
|
|
241
247
|
}
|
|
242
248
|
|
|
243
249
|
protected async getCompleteAddressOrFail(account: AztecAddress): Promise<CompleteAddress> {
|
|
@@ -256,11 +262,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
256
262
|
* @param address - Address.
|
|
257
263
|
* @returns A contract instance.
|
|
258
264
|
*/
|
|
259
|
-
public
|
|
260
|
-
return this.getContractInstance(address);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
protected async getContractInstance(address: AztecAddress): Promise<ContractInstance> {
|
|
265
|
+
public async getContractInstance(address: AztecAddress): Promise<ContractInstance> {
|
|
264
266
|
const instance = await this.contractStore.getContractInstance(address);
|
|
265
267
|
if (!instance) {
|
|
266
268
|
throw new Error(`No contract instance found for address ${address.toString()}`);
|
|
@@ -274,7 +276,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
274
276
|
* @param messageHash - Hash of the message to authenticate.
|
|
275
277
|
* @returns Authentication witness for the requested message hash.
|
|
276
278
|
*/
|
|
277
|
-
public
|
|
279
|
+
public getAuthWitness(messageHash: Fr): Promise<Fr[] | undefined> {
|
|
278
280
|
return Promise.resolve(this.authWitnesses.find(w => w.requestHash.equals(messageHash))?.witness);
|
|
279
281
|
}
|
|
280
282
|
|
|
@@ -300,7 +302,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
300
302
|
* @param status - The status of notes to fetch.
|
|
301
303
|
* @returns Array of note data.
|
|
302
304
|
*/
|
|
303
|
-
public async
|
|
305
|
+
public async getNotes(
|
|
304
306
|
owner: AztecAddress | undefined,
|
|
305
307
|
storageSlot: Fr,
|
|
306
308
|
numSelects: number,
|
|
@@ -340,7 +342,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
340
342
|
* @param innerNullifier - The inner nullifier.
|
|
341
343
|
* @returns A boolean indicating whether the nullifier exists in the tree or not.
|
|
342
344
|
*/
|
|
343
|
-
public async
|
|
345
|
+
public async checkNullifierExists(innerNullifier: Fr) {
|
|
344
346
|
const [nullifier, anchorBlockHash] = await Promise.all([
|
|
345
347
|
siloNullifier(this.contractAddress, innerNullifier!),
|
|
346
348
|
this.anchorBlockHeader.hash(),
|
|
@@ -359,7 +361,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
359
361
|
* @dev Contract address and secret are only used to compute the nullifier to get non-nullified messages
|
|
360
362
|
* @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
|
|
361
363
|
*/
|
|
362
|
-
public async
|
|
364
|
+
public async getL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) {
|
|
363
365
|
const [messageIndex, siblingPath] = await getNonNullifiedL1ToL2MessageWitness(
|
|
364
366
|
this.aztecNode,
|
|
365
367
|
contractAddress,
|
|
@@ -377,7 +379,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
377
379
|
* @param startStorageSlot - The starting storage slot.
|
|
378
380
|
* @param numberOfElements - Number of elements to read from the starting storage slot.
|
|
379
381
|
*/
|
|
380
|
-
public async
|
|
382
|
+
public async storageRead(
|
|
381
383
|
blockHash: BlockHash,
|
|
382
384
|
contractAddress: AztecAddress,
|
|
383
385
|
startStorageSlot: Fr,
|
|
@@ -391,7 +393,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
391
393
|
slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
|
|
392
394
|
);
|
|
393
395
|
|
|
394
|
-
this.
|
|
396
|
+
this.logger.debug(
|
|
395
397
|
`Oracle storage read: slots=[${slots.map(slot => slot.toString()).join(', ')}] address=${contractAddress.toString()} values=[${values.join(', ')}]`,
|
|
396
398
|
);
|
|
397
399
|
|
|
@@ -414,7 +416,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
414
416
|
return this.contractLogger;
|
|
415
417
|
}
|
|
416
418
|
|
|
417
|
-
public async
|
|
419
|
+
public async log(level: number, message: string, fields: Fr[]): Promise<void> {
|
|
418
420
|
if (!LogLevels[level]) {
|
|
419
421
|
throw new Error(`Invalid log level: ${level}`);
|
|
420
422
|
}
|
|
@@ -422,7 +424,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
422
424
|
logContractMessage(logger, LogLevels[level], message, fields);
|
|
423
425
|
}
|
|
424
426
|
|
|
425
|
-
public async
|
|
427
|
+
public async fetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) {
|
|
426
428
|
const logService = new LogService(
|
|
427
429
|
this.aztecNode,
|
|
428
430
|
this.anchorBlockHeader,
|
|
@@ -432,7 +434,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
432
434
|
this.senderAddressBookStore,
|
|
433
435
|
this.addressStore,
|
|
434
436
|
this.jobId,
|
|
435
|
-
this.
|
|
437
|
+
this.logger.getBindings(),
|
|
436
438
|
);
|
|
437
439
|
|
|
438
440
|
await logService.fetchTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes);
|
|
@@ -448,7 +450,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
448
450
|
* @param noteValidationRequestsArrayBaseSlot - The base slot of capsule array containing note validation requests.
|
|
449
451
|
* @param eventValidationRequestsArrayBaseSlot - The base slot of capsule array containing event validation requests.
|
|
450
452
|
*/
|
|
451
|
-
public async
|
|
453
|
+
public async validateAndStoreEnqueuedNotesAndEvents(
|
|
452
454
|
contractAddress: AztecAddress,
|
|
453
455
|
noteValidationRequestsArrayBaseSlot: Fr,
|
|
454
456
|
eventValidationRequestsArrayBaseSlot: Fr,
|
|
@@ -504,7 +506,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
504
506
|
await this.capsuleStore.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, [], this.jobId);
|
|
505
507
|
}
|
|
506
508
|
|
|
507
|
-
public async
|
|
509
|
+
public async bulkRetrieveLogs(
|
|
508
510
|
contractAddress: AztecAddress,
|
|
509
511
|
logRetrievalRequestsArrayBaseSlot: Fr,
|
|
510
512
|
logRetrievalResponsesArrayBaseSlot: Fr,
|
|
@@ -529,7 +531,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
529
531
|
this.senderAddressBookStore,
|
|
530
532
|
this.addressStore,
|
|
531
533
|
this.jobId,
|
|
532
|
-
this.
|
|
534
|
+
this.logger.getBindings(),
|
|
533
535
|
);
|
|
534
536
|
|
|
535
537
|
const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);
|
|
@@ -546,7 +548,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
546
548
|
);
|
|
547
549
|
}
|
|
548
550
|
|
|
549
|
-
public
|
|
551
|
+
public storeCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[]): Promise<void> {
|
|
550
552
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
551
553
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
552
554
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -555,7 +557,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
555
557
|
return Promise.resolve();
|
|
556
558
|
}
|
|
557
559
|
|
|
558
|
-
public async
|
|
560
|
+
public async loadCapsule(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null> {
|
|
559
561
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
560
562
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
561
563
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -567,7 +569,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
567
569
|
);
|
|
568
570
|
}
|
|
569
571
|
|
|
570
|
-
public
|
|
572
|
+
public deleteCapsule(contractAddress: AztecAddress, slot: Fr): Promise<void> {
|
|
571
573
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
572
574
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
573
575
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -576,12 +578,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
576
578
|
return Promise.resolve();
|
|
577
579
|
}
|
|
578
580
|
|
|
579
|
-
public
|
|
580
|
-
contractAddress: AztecAddress,
|
|
581
|
-
srcSlot: Fr,
|
|
582
|
-
dstSlot: Fr,
|
|
583
|
-
numEntries: number,
|
|
584
|
-
): Promise<void> {
|
|
581
|
+
public copyCapsule(contractAddress: AztecAddress, srcSlot: Fr, dstSlot: Fr, numEntries: number): Promise<void> {
|
|
585
582
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
586
583
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
587
584
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -590,7 +587,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
590
587
|
}
|
|
591
588
|
|
|
592
589
|
// TODO(#11849): consider replacing this oracle with a pure Noir implementation of aes decryption.
|
|
593
|
-
public
|
|
590
|
+
public aes128Decrypt(ciphertext: Buffer, iv: Buffer, symKey: Buffer): Promise<Buffer> {
|
|
594
591
|
const aes128 = new Aes128();
|
|
595
592
|
return aes128.decryptBufferCBC(ciphertext, iv, symKey);
|
|
596
593
|
}
|
|
@@ -601,11 +598,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
601
598
|
* @param ephPk - The ephemeral public key to get the secret for.
|
|
602
599
|
* @returns The secret for the given address.
|
|
603
600
|
*/
|
|
604
|
-
public
|
|
605
|
-
return this.getSharedSecret(address, ephPk);
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
protected async getSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point> {
|
|
601
|
+
public async getSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point> {
|
|
609
602
|
// TODO(#12656): return an app-siloed secret
|
|
610
603
|
const recipientCompleteAddress = await this.getCompleteAddressOrFail(address);
|
|
611
604
|
const ivskM = await this.keyStore.getMasterSecretKey(
|
package/src/oracle_version.ts
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
/// to version the oracle interface to ensure that developers get a reasonable error message if they use incompatible
|
|
3
3
|
/// versions of Aztec.nr and PXE. The Noir counterpart is in `noir-projects/aztec-nr/aztec/src/oracle/version.nr`.
|
|
4
4
|
///
|
|
5
|
-
/// @dev Whenever a contract function or Noir test is run, the `
|
|
5
|
+
/// @dev Whenever a contract function or Noir test is run, the `aztec_utl_assertCompatibleOracleVersion` oracle is called
|
|
6
6
|
/// and if the oracle version is incompatible an error is thrown.
|
|
7
|
-
export const ORACLE_VERSION =
|
|
7
|
+
export const ORACLE_VERSION = 14;
|
|
8
8
|
|
|
9
9
|
/// This hash is computed as by hashing the Oracle interface and it is used to detect when the Oracle interface changes,
|
|
10
10
|
/// which in turn implies that you need to update the ORACLE_VERSION constant in this file and in
|
|
11
11
|
/// `noir-projects/aztec-nr/aztec/src/oracle/version.nr`.
|
|
12
|
-
export const ORACLE_INTERFACE_HASH = '
|
|
12
|
+
export const ORACLE_INTERFACE_HASH = '9fb918682455c164ce8dd3acb71c751e2b9b2fc48913604069c9ea885fa378ca';
|
package/src/pxe.ts
CHANGED
|
@@ -145,6 +145,7 @@ export type PXECreateArgs = {
|
|
|
145
145
|
export class PXE {
|
|
146
146
|
private constructor(
|
|
147
147
|
private node: AztecNode,
|
|
148
|
+
private db: AztecAsyncKVStore,
|
|
148
149
|
private blockStateSynchronizer: BlockSynchronizer,
|
|
149
150
|
private keyStore: KeyStore,
|
|
150
151
|
private contractStore: ContractStore,
|
|
@@ -240,6 +241,7 @@ export class PXE {
|
|
|
240
241
|
|
|
241
242
|
const pxe = new PXE(
|
|
242
243
|
node,
|
|
244
|
+
store,
|
|
243
245
|
synchronizer,
|
|
244
246
|
keyStore,
|
|
245
247
|
contractStore,
|
|
@@ -1130,9 +1132,10 @@ export class PXE {
|
|
|
1130
1132
|
}
|
|
1131
1133
|
|
|
1132
1134
|
/**
|
|
1133
|
-
* Stops the PXE's job queue.
|
|
1135
|
+
* Stops the PXE's job queue and closes the backing store.
|
|
1134
1136
|
*/
|
|
1135
|
-
public stop(): Promise<void> {
|
|
1136
|
-
|
|
1137
|
+
public async stop(): Promise<void> {
|
|
1138
|
+
await this.jobQueue.end();
|
|
1139
|
+
await this.db.close();
|
|
1137
1140
|
}
|
|
1138
1141
|
}
|