@aztec/pxe 0.0.1-commit.d117d021b → 0.0.1-commit.d1da697d6
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/block_synchronizer/block_synchronizer.d.ts +1 -1
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +6 -0
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +10 -5
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +29 -6
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +5 -5
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_tagging_index_cache.js +17 -9
- package/dest/contract_function_simulator/index.d.ts +2 -1
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +1 -0
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +2 -3
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +2 -5
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +2 -3
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -5
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +20 -18
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +9 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +38 -0
- package/dest/contract_function_simulator/oracle/oracle.d.ts +38 -17
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +89 -37
- package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +10 -22
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +20 -24
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +45 -28
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +164 -71
- package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
- package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
- package/dest/contract_function_simulator/pick_notes.js +9 -2
- package/dest/contract_logging.d.ts +9 -4
- package/dest/contract_logging.d.ts.map +1 -1
- package/dest/contract_logging.js +21 -6
- package/dest/contract_sync/contract_sync_service.d.ts +6 -5
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
- package/dest/contract_sync/contract_sync_service.js +44 -37
- package/dest/contract_sync/helpers.d.ts +2 -3
- package/dest/contract_sync/helpers.d.ts.map +1 -1
- package/dest/contract_sync/helpers.js +7 -2
- package/dest/debug/pxe_debug_utils.d.ts +3 -3
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.d.ts +1 -2
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +0 -1
- package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +2 -2
- package/dest/entrypoints/client/lazy/index.d.ts +1 -2
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +0 -1
- package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +2 -2
- package/dest/entrypoints/pxe_creation_options.d.ts +3 -1
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/pxe_creation_options.js +3 -1
- package/dest/entrypoints/server/index.d.ts +1 -2
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +0 -1
- package/dest/entrypoints/server/utils.d.ts +2 -2
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +2 -2
- package/dest/events/event_service.d.ts +3 -2
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +16 -4
- package/dest/logs/log_service.d.ts +6 -7
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +32 -30
- package/dest/messages/message_context_service.d.ts +17 -0
- package/dest/messages/message_context_service.d.ts.map +1 -0
- package/dest/messages/message_context_service.js +36 -0
- package/dest/notes/note_service.d.ts +4 -5
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +14 -5
- package/dest/notes_filter.d.ts +2 -3
- package/dest/notes_filter.d.ts.map +1 -1
- package/dest/oracle_version.d.ts +2 -2
- package/dest/oracle_version.js +2 -2
- package/dest/pxe.d.ts +9 -7
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +39 -23
- package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
- package/dest/storage/capsule_store/capsule_service.js +50 -0
- package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +33 -28
- package/dest/storage/capsule_store/index.d.ts +2 -1
- package/dest/storage/capsule_store/index.d.ts.map +1 -1
- package/dest/storage/capsule_store/index.js +1 -0
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +1 -1
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +2 -2
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +26 -25
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +141 -115
- package/dest/tagging/index.d.ts +2 -2
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +10 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +4 -3
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +20 -10
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +2 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +24 -11
- package/package.json +16 -16
- package/src/block_synchronizer/block_synchronizer.ts +6 -0
- package/src/contract_function_simulator/contract_function_simulator.ts +42 -10
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +16 -11
- package/src/contract_function_simulator/index.ts +1 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +0 -3
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +0 -3
- package/src/contract_function_simulator/oracle/interfaces.ts +31 -16
- package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +98 -0
- package/src/contract_function_simulator/oracle/oracle.ts +116 -32
- package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +24 -31
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +284 -83
- package/src/contract_function_simulator/pick_notes.ts +9 -2
- package/src/contract_logging.ts +18 -5
- package/src/contract_sync/contract_sync_service.ts +77 -59
- package/src/contract_sync/helpers.ts +4 -4
- package/src/debug/pxe_debug_utils.ts +3 -3
- package/src/entrypoints/client/bundle/index.ts +0 -1
- package/src/entrypoints/client/bundle/utils.ts +2 -3
- package/src/entrypoints/client/lazy/index.ts +0 -1
- package/src/entrypoints/client/lazy/utils.ts +2 -3
- package/src/entrypoints/pxe_creation_options.ts +7 -0
- package/src/entrypoints/server/index.ts +0 -1
- package/src/entrypoints/server/utils.ts +2 -3
- package/src/events/event_service.ts +17 -4
- package/src/logs/log_service.ts +63 -48
- package/src/messages/message_context_service.ts +44 -0
- package/src/notes/note_service.ts +18 -8
- package/src/notes_filter.ts +1 -3
- package/src/oracle_version.ts +2 -2
- package/src/pxe.ts +62 -28
- package/src/storage/capsule_store/capsule_service.ts +90 -0
- package/src/storage/capsule_store/capsule_store.ts +34 -26
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +2 -5
- package/src/storage/tagging_store/sender_tagging_store.ts +182 -135
- package/src/tagging/index.ts +1 -1
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +19 -1
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +26 -11
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +19 -9
- package/dest/access_scopes.d.ts +0 -9
- package/dest/access_scopes.d.ts.map +0 -1
- package/dest/access_scopes.js +0 -6
- package/src/access_scopes.ts +0 -9
|
@@ -16,6 +16,7 @@ import { BlockHash } from '@aztec/stdlib/block';
|
|
|
16
16
|
import { ContractClassLog, ContractClassLogFields } from '@aztec/stdlib/logs';
|
|
17
17
|
|
|
18
18
|
import type { IMiscOracle, IPrivateExecutionOracle, IUtilityExecutionOracle } from './interfaces.js';
|
|
19
|
+
import { buildLegacyOracleCallbacks } from './legacy_oracle_mappings.js';
|
|
19
20
|
import { packAsHintedNote } from './note_packing_utils.js';
|
|
20
21
|
|
|
21
22
|
export class UnavailableOracleError extends Error {
|
|
@@ -26,6 +27,25 @@ export class UnavailableOracleError extends Error {
|
|
|
26
27
|
|
|
27
28
|
/**
|
|
28
29
|
* A data source that has all the apis required by Aztec.nr.
|
|
30
|
+
*
|
|
31
|
+
* ## Oracle naming conventions
|
|
32
|
+
*
|
|
33
|
+
* We try to keep oracle naming consistent, please see below the conventions we adhere to.
|
|
34
|
+
*
|
|
35
|
+
* Each oracle method name has the form `aztec_{scope}_{verb}{Object}`, where:
|
|
36
|
+
*
|
|
37
|
+
* - **Scope prefix** indicates the execution context required:
|
|
38
|
+
* - `aztec_prv_` — available only during private function execution.
|
|
39
|
+
* - `aztec_utl_` — available during both utility and private execution.
|
|
40
|
+
*
|
|
41
|
+
* - **Verb** signals the operation's semantics (verb-first, then object):
|
|
42
|
+
* - `get` — read / lookup / get data from oracle into contract.
|
|
43
|
+
* - `does`/`is`/`has` — predicate (returns boolean).
|
|
44
|
+
* - `emit`/`notify` — propagate data from contract to oracle.
|
|
45
|
+
* - `set` — contract driven oracle state mutation (capsules, execution cache, tagging, etc).
|
|
46
|
+
* - `call` — trigger nested execution (control flow).
|
|
47
|
+
* - `assert` — validate a condition, throw on failure.
|
|
48
|
+
* - Standalone verbs (`delete`, `copy`, `decrypt`, `log`, etc) are used when no generic verb fits.
|
|
29
49
|
*/
|
|
30
50
|
export class Oracle {
|
|
31
51
|
constructor(private handler: IMiscOracle | IUtilityExecutionOracle | IPrivateExecutionOracle) {}
|
|
@@ -85,11 +105,13 @@ export class Oracle {
|
|
|
85
105
|
});
|
|
86
106
|
|
|
87
107
|
// Build callback object and return it
|
|
88
|
-
|
|
108
|
+
const callback = oracleNames.reduce((acc, name) => {
|
|
89
109
|
const method = this[name as keyof Omit<Oracle, (typeof excludedProps)[number]>];
|
|
90
110
|
acc[name] = method.bind(this);
|
|
91
111
|
return acc;
|
|
92
112
|
}, {} as ACIRCallback);
|
|
113
|
+
|
|
114
|
+
return { ...callback, ...buildLegacyOracleCallbacks(this) };
|
|
93
115
|
}
|
|
94
116
|
|
|
95
117
|
// eslint-disable-next-line camelcase
|
|
@@ -105,14 +127,14 @@ export class Oracle {
|
|
|
105
127
|
}
|
|
106
128
|
|
|
107
129
|
// eslint-disable-next-line camelcase
|
|
108
|
-
|
|
109
|
-
this.handlerAsPrivate().
|
|
130
|
+
aztec_prv_setHashPreimage(values: ACVMField[], [hash]: ACVMField[]): Promise<ACVMField[]> {
|
|
131
|
+
this.handlerAsPrivate().setHashPreimage(values.map(Fr.fromString), Fr.fromString(hash));
|
|
110
132
|
return Promise.resolve([]);
|
|
111
133
|
}
|
|
112
134
|
|
|
113
135
|
// eslint-disable-next-line camelcase
|
|
114
|
-
async
|
|
115
|
-
const values = await this.handlerAsPrivate().
|
|
136
|
+
async aztec_prv_getHashPreimage([returnsHash]: ACVMField[]): Promise<ACVMField[][]> {
|
|
137
|
+
const values = await this.handlerAsPrivate().getHashPreimage(Fr.fromString(returnsHash));
|
|
116
138
|
return [values.map(toACVMField)];
|
|
117
139
|
}
|
|
118
140
|
|
|
@@ -249,9 +271,9 @@ export class Oracle {
|
|
|
249
271
|
}
|
|
250
272
|
|
|
251
273
|
// eslint-disable-next-line camelcase
|
|
252
|
-
async
|
|
274
|
+
async aztec_utl_getPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<(ACVMField | ACVMField[])[]> {
|
|
253
275
|
const parsedAddress = AztecAddress.fromField(Fr.fromString(address));
|
|
254
|
-
const result = await this.handlerAsUtility().
|
|
276
|
+
const result = await this.handlerAsUtility().getPublicKeysAndPartialAddress(parsedAddress);
|
|
255
277
|
|
|
256
278
|
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
257
279
|
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
@@ -377,8 +399,8 @@ export class Oracle {
|
|
|
377
399
|
}
|
|
378
400
|
|
|
379
401
|
// eslint-disable-next-line camelcase
|
|
380
|
-
async
|
|
381
|
-
const exists = await this.handlerAsUtility().
|
|
402
|
+
async aztec_utl_doesNullifierExist([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
|
|
403
|
+
const exists = await this.handlerAsUtility().doesNullifierExist(Fr.fromString(innerNullifier));
|
|
382
404
|
return [toACVMField(exists)];
|
|
383
405
|
}
|
|
384
406
|
|
|
@@ -397,13 +419,13 @@ export class Oracle {
|
|
|
397
419
|
}
|
|
398
420
|
|
|
399
421
|
// eslint-disable-next-line camelcase
|
|
400
|
-
async
|
|
422
|
+
async aztec_utl_getFromPublicStorage(
|
|
401
423
|
[blockHash]: ACVMField[],
|
|
402
424
|
[contractAddress]: ACVMField[],
|
|
403
425
|
[startStorageSlot]: ACVMField[],
|
|
404
426
|
[numberOfElements]: ACVMField[],
|
|
405
427
|
): Promise<ACVMField[][]> {
|
|
406
|
-
const values = await this.handlerAsUtility().
|
|
428
|
+
const values = await this.handlerAsUtility().getFromPublicStorage(
|
|
407
429
|
BlockHash.fromString(blockHash),
|
|
408
430
|
new AztecAddress(Fr.fromString(contractAddress)),
|
|
409
431
|
Fr.fromString(startStorageSlot),
|
|
@@ -461,8 +483,8 @@ export class Oracle {
|
|
|
461
483
|
}
|
|
462
484
|
|
|
463
485
|
// eslint-disable-next-line camelcase
|
|
464
|
-
async
|
|
465
|
-
await this.handlerAsPrivate().
|
|
486
|
+
async aztec_prv_assertValidPublicCalldata([calldataHash]: ACVMField[]): Promise<ACVMField[]> {
|
|
487
|
+
await this.handlerAsPrivate().assertValidPublicCalldata(Fr.fromString(calldataHash));
|
|
466
488
|
return [];
|
|
467
489
|
}
|
|
468
490
|
|
|
@@ -473,8 +495,10 @@ export class Oracle {
|
|
|
473
495
|
}
|
|
474
496
|
|
|
475
497
|
// eslint-disable-next-line camelcase
|
|
476
|
-
async
|
|
477
|
-
const isRevertible = await this.handlerAsPrivate().
|
|
498
|
+
async aztec_prv_isExecutionInRevertiblePhase([sideEffectCounter]: ACVMField[]): Promise<ACVMField[]> {
|
|
499
|
+
const isRevertible = await this.handlerAsPrivate().isExecutionInRevertiblePhase(
|
|
500
|
+
Fr.fromString(sideEffectCounter).toNumber(),
|
|
501
|
+
);
|
|
478
502
|
return Promise.resolve([toACVMField(isRevertible)]);
|
|
479
503
|
}
|
|
480
504
|
|
|
@@ -488,8 +512,14 @@ export class Oracle {
|
|
|
488
512
|
}
|
|
489
513
|
|
|
490
514
|
// eslint-disable-next-line camelcase
|
|
491
|
-
async
|
|
492
|
-
|
|
515
|
+
async aztec_utl_getPendingTaggedLogs(
|
|
516
|
+
[pendingTaggedLogArrayBaseSlot]: ACVMField[],
|
|
517
|
+
[scope]: ACVMField[],
|
|
518
|
+
): Promise<ACVMField[]> {
|
|
519
|
+
await this.handlerAsUtility().getPendingTaggedLogs(
|
|
520
|
+
Fr.fromString(pendingTaggedLogArrayBaseSlot),
|
|
521
|
+
AztecAddress.fromString(scope),
|
|
522
|
+
);
|
|
493
523
|
return [];
|
|
494
524
|
}
|
|
495
525
|
|
|
@@ -500,6 +530,7 @@ export class Oracle {
|
|
|
500
530
|
[eventValidationRequestsArrayBaseSlot]: ACVMField[],
|
|
501
531
|
[maxNotePackedLen]: ACVMField[],
|
|
502
532
|
[maxEventSerializedLen]: ACVMField[],
|
|
533
|
+
[scope]: ACVMField[],
|
|
503
534
|
): Promise<ACVMField[]> {
|
|
504
535
|
await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(
|
|
505
536
|
AztecAddress.fromString(contractAddress),
|
|
@@ -507,48 +538,71 @@ export class Oracle {
|
|
|
507
538
|
Fr.fromString(eventValidationRequestsArrayBaseSlot),
|
|
508
539
|
Fr.fromString(maxNotePackedLen).toNumber(),
|
|
509
540
|
Fr.fromString(maxEventSerializedLen).toNumber(),
|
|
541
|
+
AztecAddress.fromString(scope),
|
|
510
542
|
);
|
|
511
543
|
|
|
512
544
|
return [];
|
|
513
545
|
}
|
|
514
546
|
|
|
515
547
|
// eslint-disable-next-line camelcase
|
|
516
|
-
async
|
|
548
|
+
async aztec_utl_getLogsByTag(
|
|
517
549
|
[contractAddress]: ACVMField[],
|
|
518
550
|
[logRetrievalRequestsArrayBaseSlot]: ACVMField[],
|
|
519
551
|
[logRetrievalResponsesArrayBaseSlot]: ACVMField[],
|
|
552
|
+
[scope]: ACVMField[],
|
|
520
553
|
): Promise<ACVMField[]> {
|
|
521
|
-
await this.handlerAsUtility().
|
|
554
|
+
await this.handlerAsUtility().getLogsByTag(
|
|
522
555
|
AztecAddress.fromString(contractAddress),
|
|
523
556
|
Fr.fromString(logRetrievalRequestsArrayBaseSlot),
|
|
524
557
|
Fr.fromString(logRetrievalResponsesArrayBaseSlot),
|
|
558
|
+
AztecAddress.fromString(scope),
|
|
559
|
+
);
|
|
560
|
+
return [];
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// eslint-disable-next-line camelcase
|
|
564
|
+
async aztec_utl_getMessageContextsByTxHash(
|
|
565
|
+
[contractAddress]: ACVMField[],
|
|
566
|
+
[messageContextRequestsArrayBaseSlot]: ACVMField[],
|
|
567
|
+
[messageContextResponsesArrayBaseSlot]: ACVMField[],
|
|
568
|
+
[scope]: ACVMField[],
|
|
569
|
+
): Promise<ACVMField[]> {
|
|
570
|
+
await this.handlerAsUtility().getMessageContextsByTxHash(
|
|
571
|
+
AztecAddress.fromString(contractAddress),
|
|
572
|
+
Fr.fromString(messageContextRequestsArrayBaseSlot),
|
|
573
|
+
Fr.fromString(messageContextResponsesArrayBaseSlot),
|
|
574
|
+
AztecAddress.fromString(scope),
|
|
525
575
|
);
|
|
526
576
|
return [];
|
|
527
577
|
}
|
|
528
578
|
|
|
529
579
|
// eslint-disable-next-line camelcase
|
|
530
|
-
|
|
580
|
+
aztec_utl_setCapsule(
|
|
531
581
|
[contractAddress]: ACVMField[],
|
|
532
582
|
[slot]: ACVMField[],
|
|
533
583
|
capsule: ACVMField[],
|
|
584
|
+
[scope]: ACVMField[],
|
|
534
585
|
): Promise<ACVMField[]> {
|
|
535
|
-
|
|
586
|
+
this.handlerAsUtility().setCapsule(
|
|
536
587
|
AztecAddress.fromField(Fr.fromString(contractAddress)),
|
|
537
588
|
Fr.fromString(slot),
|
|
538
589
|
capsule.map(Fr.fromString),
|
|
590
|
+
AztecAddress.fromField(Fr.fromString(scope)),
|
|
539
591
|
);
|
|
540
|
-
return [];
|
|
592
|
+
return Promise.resolve([]);
|
|
541
593
|
}
|
|
542
594
|
|
|
543
595
|
// eslint-disable-next-line camelcase
|
|
544
|
-
async
|
|
596
|
+
async aztec_utl_getCapsule(
|
|
545
597
|
[contractAddress]: ACVMField[],
|
|
546
598
|
[slot]: ACVMField[],
|
|
547
599
|
[tSize]: ACVMField[],
|
|
600
|
+
[scope]: ACVMField[],
|
|
548
601
|
): Promise<(ACVMField | ACVMField[])[]> {
|
|
549
|
-
const values = await this.handlerAsUtility().
|
|
602
|
+
const values = await this.handlerAsUtility().getCapsule(
|
|
550
603
|
AztecAddress.fromField(Fr.fromString(contractAddress)),
|
|
551
604
|
Fr.fromString(slot),
|
|
605
|
+
AztecAddress.fromField(Fr.fromString(scope)),
|
|
552
606
|
);
|
|
553
607
|
|
|
554
608
|
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
@@ -563,12 +617,17 @@ export class Oracle {
|
|
|
563
617
|
}
|
|
564
618
|
|
|
565
619
|
// eslint-disable-next-line camelcase
|
|
566
|
-
|
|
567
|
-
|
|
620
|
+
aztec_utl_deleteCapsule(
|
|
621
|
+
[contractAddress]: ACVMField[],
|
|
622
|
+
[slot]: ACVMField[],
|
|
623
|
+
[scope]: ACVMField[],
|
|
624
|
+
): Promise<ACVMField[]> {
|
|
625
|
+
this.handlerAsUtility().deleteCapsule(
|
|
568
626
|
AztecAddress.fromField(Fr.fromString(contractAddress)),
|
|
569
627
|
Fr.fromString(slot),
|
|
628
|
+
AztecAddress.fromField(Fr.fromString(scope)),
|
|
570
629
|
);
|
|
571
|
-
return [];
|
|
630
|
+
return Promise.resolve([]);
|
|
572
631
|
}
|
|
573
632
|
|
|
574
633
|
// eslint-disable-next-line camelcase
|
|
@@ -577,18 +636,20 @@ export class Oracle {
|
|
|
577
636
|
[srcSlot]: ACVMField[],
|
|
578
637
|
[dstSlot]: ACVMField[],
|
|
579
638
|
[numEntries]: ACVMField[],
|
|
639
|
+
[scope]: ACVMField[],
|
|
580
640
|
): Promise<ACVMField[]> {
|
|
581
641
|
await this.handlerAsUtility().copyCapsule(
|
|
582
642
|
AztecAddress.fromField(Fr.fromString(contractAddress)),
|
|
583
643
|
Fr.fromString(srcSlot),
|
|
584
644
|
Fr.fromString(dstSlot),
|
|
585
645
|
Fr.fromString(numEntries).toNumber(),
|
|
646
|
+
AztecAddress.fromField(Fr.fromString(scope)),
|
|
586
647
|
);
|
|
587
648
|
return [];
|
|
588
649
|
}
|
|
589
650
|
|
|
590
651
|
// eslint-disable-next-line camelcase
|
|
591
|
-
async
|
|
652
|
+
async aztec_utl_decryptAes128(
|
|
592
653
|
ciphertextBVecStorage: ACVMField[],
|
|
593
654
|
[ciphertextLength]: ACVMField[],
|
|
594
655
|
iv: ACVMField[],
|
|
@@ -598,8 +659,15 @@ export class Oracle {
|
|
|
598
659
|
const ivBuffer = fromUintArray(iv, 8);
|
|
599
660
|
const symKeyBuffer = fromUintArray(symKey, 8);
|
|
600
661
|
|
|
601
|
-
|
|
602
|
-
|
|
662
|
+
// Noir Option<BoundedVec> is encoded as [is_some: Field, storage: Field[], length: Field].
|
|
663
|
+
try {
|
|
664
|
+
const plaintext = await this.handlerAsUtility().decryptAes128(ciphertext, ivBuffer, symKeyBuffer);
|
|
665
|
+
const [storage, length] = bufferToBoundedVec(plaintext, ciphertextBVecStorage.length);
|
|
666
|
+
return [toACVMField(1), storage, length];
|
|
667
|
+
} catch {
|
|
668
|
+
const zeroStorage = Array(ciphertextBVecStorage.length).fill(toACVMField(0));
|
|
669
|
+
return [toACVMField(0), zeroStorage, toACVMField(0)];
|
|
670
|
+
}
|
|
603
671
|
}
|
|
604
672
|
|
|
605
673
|
// eslint-disable-next-line camelcase
|
|
@@ -608,17 +676,33 @@ export class Oracle {
|
|
|
608
676
|
[ephPKField0]: ACVMField[],
|
|
609
677
|
[ephPKField1]: ACVMField[],
|
|
610
678
|
[ephPKField2]: ACVMField[],
|
|
679
|
+
[contractAddress]: ACVMField[],
|
|
611
680
|
): Promise<ACVMField[]> {
|
|
612
681
|
const secret = await this.handlerAsUtility().getSharedSecret(
|
|
613
682
|
AztecAddress.fromField(Fr.fromString(address)),
|
|
614
683
|
Point.fromFields([ephPKField0, ephPKField1, ephPKField2].map(Fr.fromString)),
|
|
684
|
+
AztecAddress.fromField(Fr.fromString(contractAddress)),
|
|
615
685
|
);
|
|
616
|
-
return secret
|
|
686
|
+
return [toACVMField(secret)];
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
// eslint-disable-next-line camelcase
|
|
690
|
+
aztec_utl_setContractSyncCacheInvalid(
|
|
691
|
+
[contractAddress]: ACVMField[],
|
|
692
|
+
scopes: ACVMField[],
|
|
693
|
+
[scopeCount]: ACVMField[],
|
|
694
|
+
): Promise<ACVMField[]> {
|
|
695
|
+
const scopeAddresses = scopes.slice(0, +scopeCount).map(s => AztecAddress.fromField(Fr.fromString(s)));
|
|
696
|
+
this.handlerAsUtility().setContractSyncCacheInvalid(
|
|
697
|
+
AztecAddress.fromField(Fr.fromString(contractAddress)),
|
|
698
|
+
scopeAddresses,
|
|
699
|
+
);
|
|
700
|
+
return Promise.resolve([]);
|
|
617
701
|
}
|
|
618
702
|
|
|
619
703
|
// eslint-disable-next-line camelcase
|
|
620
704
|
async aztec_utl_emitOffchainEffect(data: ACVMField[]) {
|
|
621
|
-
await this.
|
|
705
|
+
await this.handlerAsUtility().emitOffchainEffect(data.map(Fr.fromString));
|
|
622
706
|
return [];
|
|
623
707
|
}
|
|
624
708
|
|
|
@@ -76,12 +76,12 @@ export async function executePrivateFunction(
|
|
|
76
76
|
|
|
77
77
|
const contractClassLogs = privateExecutionOracle.getContractClassLogs();
|
|
78
78
|
|
|
79
|
-
const rawReturnValues = await privateExecutionOracle.
|
|
79
|
+
const rawReturnValues = await privateExecutionOracle.getHashPreimage(publicInputs.returnsHash);
|
|
80
80
|
|
|
81
81
|
const newNotes = privateExecutionOracle.getNewNotes();
|
|
82
82
|
const noteHashNullifierCounterMap = privateExecutionOracle.getNoteHashNullifierCounterMap();
|
|
83
83
|
const offchainEffects = privateExecutionOracle.getOffchainEffects();
|
|
84
|
-
const
|
|
84
|
+
const taggingIndexRanges = privateExecutionOracle.getUsedTaggingIndexRanges();
|
|
85
85
|
const nestedExecutionResults = privateExecutionOracle.getNestedExecutionResults();
|
|
86
86
|
|
|
87
87
|
let timerSubtractionList = nestedExecutionResults;
|
|
@@ -103,8 +103,8 @@ export async function executePrivateFunction(
|
|
|
103
103
|
newNotes,
|
|
104
104
|
noteHashNullifierCounterMap,
|
|
105
105
|
rawReturnValues,
|
|
106
|
-
offchainEffects,
|
|
107
|
-
|
|
106
|
+
offchainEffects.map(e => ({ data: e.data })),
|
|
107
|
+
taggingIndexRanges,
|
|
108
108
|
nestedExecutionResults,
|
|
109
109
|
contractClassLogs,
|
|
110
110
|
{
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
15
15
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
16
16
|
import { PrivateContextInputs } from '@aztec/stdlib/kernel';
|
|
17
|
-
import { type ContractClassLog, ExtendedDirectionalAppTaggingSecret, type
|
|
17
|
+
import { type ContractClassLog, ExtendedDirectionalAppTaggingSecret, type TaggingIndexRange } from '@aztec/stdlib/logs';
|
|
18
18
|
import { Tag } from '@aztec/stdlib/logs';
|
|
19
19
|
import { Note, type NoteStatus } from '@aztec/stdlib/note';
|
|
20
20
|
import {
|
|
@@ -25,8 +25,6 @@ import {
|
|
|
25
25
|
type TxContext,
|
|
26
26
|
} from '@aztec/stdlib/tx';
|
|
27
27
|
|
|
28
|
-
import type { AccessScopes } from '../../access_scopes.js';
|
|
29
|
-
import type { ContractSyncService } from '../../contract_sync/contract_sync_service.js';
|
|
30
28
|
import { NoteService } from '../../notes/note_service.js';
|
|
31
29
|
import type { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js';
|
|
32
30
|
import { syncSenderTaggingIndexes } from '../../tagging/index.js';
|
|
@@ -44,12 +42,11 @@ export type PrivateExecutionOracleArgs = Omit<UtilityExecutionOracleArgs, 'contr
|
|
|
44
42
|
txContext: TxContext;
|
|
45
43
|
callContext: CallContext;
|
|
46
44
|
/** Needed to trigger contract synchronization before nested calls */
|
|
47
|
-
utilityExecutor: (call: FunctionCall, scopes:
|
|
45
|
+
utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
|
|
48
46
|
executionCache: HashedValuesCache;
|
|
49
47
|
noteCache: ExecutionNoteCache;
|
|
50
48
|
taggingIndexCache: ExecutionTaggingIndexCache;
|
|
51
49
|
senderTaggingStore: SenderTaggingStore;
|
|
52
|
-
contractSyncService: ContractSyncService;
|
|
53
50
|
totalPublicCalldataCount?: number;
|
|
54
51
|
sideEffectCounter?: number;
|
|
55
52
|
senderForTags?: AztecAddress;
|
|
@@ -73,18 +70,16 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
73
70
|
private newNotes: NoteAndSlot[] = [];
|
|
74
71
|
private noteHashNullifierCounterMap: Map<number, number> = new Map();
|
|
75
72
|
private contractClassLogs: CountedContractClassLog[] = [];
|
|
76
|
-
private offchainEffects: { data: Fr[] }[] = [];
|
|
77
73
|
private nestedExecutionResults: PrivateCallExecutionResult[] = [];
|
|
78
74
|
|
|
79
75
|
private readonly argsHash: Fr;
|
|
80
76
|
private readonly txContext: TxContext;
|
|
81
77
|
private readonly callContext: CallContext;
|
|
82
|
-
private readonly utilityExecutor: (call: FunctionCall, scopes:
|
|
78
|
+
private readonly utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
|
|
83
79
|
private readonly executionCache: HashedValuesCache;
|
|
84
80
|
private readonly noteCache: ExecutionNoteCache;
|
|
85
81
|
private readonly taggingIndexCache: ExecutionTaggingIndexCache;
|
|
86
82
|
private readonly senderTaggingStore: SenderTaggingStore;
|
|
87
|
-
private readonly contractSyncService: ContractSyncService;
|
|
88
83
|
private totalPublicCalldataCount: number;
|
|
89
84
|
protected sideEffectCounter: number;
|
|
90
85
|
private senderForTags?: AztecAddress;
|
|
@@ -104,7 +99,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
104
99
|
this.noteCache = args.noteCache;
|
|
105
100
|
this.taggingIndexCache = args.taggingIndexCache;
|
|
106
101
|
this.senderTaggingStore = args.senderTaggingStore;
|
|
107
|
-
this.contractSyncService = args.contractSyncService;
|
|
108
102
|
this.totalPublicCalldataCount = args.totalPublicCalldataCount ?? 0;
|
|
109
103
|
this.sideEffectCounter = args.sideEffectCounter ?? 0;
|
|
110
104
|
this.senderForTags = args.senderForTags;
|
|
@@ -159,17 +153,10 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
159
153
|
}
|
|
160
154
|
|
|
161
155
|
/**
|
|
162
|
-
*
|
|
156
|
+
* Returns the tagging index ranges that were used in this execution (and that need to be stored in the db).
|
|
163
157
|
*/
|
|
164
|
-
public
|
|
165
|
-
return this.
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Returns the pre-tags that were used in this execution (and that need to be stored in the db).
|
|
170
|
-
*/
|
|
171
|
-
public getUsedPreTags(): PreTag[] {
|
|
172
|
-
return this.taggingIndexCache.getUsedPreTags();
|
|
158
|
+
public getUsedTaggingIndexRanges(): TaggingIndexRange[] {
|
|
159
|
+
return this.taggingIndexCache.getUsedTaggingIndexRanges();
|
|
173
160
|
}
|
|
174
161
|
|
|
175
162
|
/**
|
|
@@ -222,6 +209,16 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
222
209
|
recipient,
|
|
223
210
|
);
|
|
224
211
|
|
|
212
|
+
if (!extendedSecret) {
|
|
213
|
+
// We'd only fail to compute an extended secret if the recipient is an invalid address. To prevent
|
|
214
|
+
// king-of-the-hill attacks, instead of failing we use a random tag. By including a correct-looking tag in the
|
|
215
|
+
// log, the transaction shape is preserved and no privacy is leaked, even if the tag is bogus.
|
|
216
|
+
this.logger.warn(`Computing a tag for invalid recipient ${recipient} - returning a random tag instead`, {
|
|
217
|
+
contractAddress: this.contractAddress,
|
|
218
|
+
});
|
|
219
|
+
return new Tag(Fr.random());
|
|
220
|
+
}
|
|
221
|
+
|
|
225
222
|
const index = await this.#getIndexToUseForSecret(extendedSecret);
|
|
226
223
|
this.logger.debug(
|
|
227
224
|
`Incrementing tagging index for sender: ${sender}, recipient: ${recipient}, contract: ${this.contractAddress} to ${index}`,
|
|
@@ -277,7 +274,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
277
274
|
* @param values - Values to store.
|
|
278
275
|
* @returns The hash of the values.
|
|
279
276
|
*/
|
|
280
|
-
public
|
|
277
|
+
public setHashPreimage(values: Fr[], hash: Fr) {
|
|
281
278
|
return this.executionCache.store(values, hash);
|
|
282
279
|
}
|
|
283
280
|
|
|
@@ -286,7 +283,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
286
283
|
* @param hash - Hash of the values.
|
|
287
284
|
* @returns The values.
|
|
288
285
|
*/
|
|
289
|
-
public
|
|
286
|
+
public getHashPreimage(hash: Fr): Promise<Fr[]> {
|
|
290
287
|
const preimage = this.executionCache.getPreimage(hash);
|
|
291
288
|
if (!preimage) {
|
|
292
289
|
throw new Error(`Preimage for hash ${hash.toString()} not found in cache`);
|
|
@@ -294,7 +291,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
294
291
|
return Promise.resolve(preimage);
|
|
295
292
|
}
|
|
296
293
|
|
|
297
|
-
override async
|
|
294
|
+
override async doesNullifierExist(innerNullifier: Fr): Promise<boolean> {
|
|
298
295
|
// This oracle must be overridden because while utility execution can only meaningfully check if a nullifier exists
|
|
299
296
|
// in the synched block, during private execution there's also the possibility of it being pending, i.e. created
|
|
300
297
|
// in the current transaction.
|
|
@@ -307,7 +304,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
307
304
|
|
|
308
305
|
return (
|
|
309
306
|
this.noteCache.getNullifiers(this.contractAddress).has(nullifier) ||
|
|
310
|
-
(await super.
|
|
307
|
+
(await super.doesNullifierExist(innerNullifier))
|
|
311
308
|
);
|
|
312
309
|
}
|
|
313
310
|
|
|
@@ -567,8 +564,9 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
567
564
|
senderTaggingStore: this.senderTaggingStore,
|
|
568
565
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
569
566
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
570
|
-
|
|
567
|
+
capsuleService: this.capsuleService,
|
|
571
568
|
privateEventStore: this.privateEventStore,
|
|
569
|
+
messageContextService: this.messageContextService,
|
|
572
570
|
contractSyncService: this.contractSyncService,
|
|
573
571
|
jobId: this.jobId,
|
|
574
572
|
totalPublicCalldataCount: this.totalPublicCalldataCount,
|
|
@@ -609,7 +607,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
609
607
|
}
|
|
610
608
|
|
|
611
609
|
/** Validates the calldata preimage exists in the cache and checks cumulative calldata size is within limits. */
|
|
612
|
-
public
|
|
610
|
+
public assertValidPublicCalldata(calldataHash: Fr) {
|
|
613
611
|
const calldata = this.executionCache.getPreimage(calldataHash);
|
|
614
612
|
if (!calldata) {
|
|
615
613
|
throw new Error('Calldata for public call not found in cache');
|
|
@@ -626,7 +624,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
626
624
|
return this.noteCache.setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter);
|
|
627
625
|
}
|
|
628
626
|
|
|
629
|
-
public
|
|
627
|
+
public isExecutionInRevertiblePhase(sideEffectCounter: number): Promise<boolean> {
|
|
630
628
|
return Promise.resolve(this.noteCache.isSideEffectCounterRevertible(sideEffectCounter));
|
|
631
629
|
}
|
|
632
630
|
|
|
@@ -653,9 +651,4 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
653
651
|
public getDebugFunctionName() {
|
|
654
652
|
return this.contractStore.getDebugFunctionName(this.contractAddress, this.callContext.functionSelector);
|
|
655
653
|
}
|
|
656
|
-
|
|
657
|
-
public emitOffchainEffect(data: Fr[]): Promise<void> {
|
|
658
|
-
this.offchainEffects.push({ data });
|
|
659
|
-
return Promise.resolve();
|
|
660
|
-
}
|
|
661
654
|
}
|