@aztec/pxe 0.0.1-commit.3469e52 → 0.0.1-commit.3895657bc
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/access_scopes.d.ts +9 -0
- package/dest/access_scopes.d.ts.map +1 -0
- package/dest/access_scopes.js +6 -0
- package/dest/bin/check_oracle_version.js +1 -1
- package/dest/block_synchronizer/block_synchronizer.d.ts +9 -5
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +62 -16
- package/dest/config/index.d.ts +4 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +18 -1
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +54 -30
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +178 -77
- 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 +3 -3
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +2 -2
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -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 -2
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +48 -45
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.d.ts +44 -42
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +170 -105
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -22
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +1 -38
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +61 -53
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +111 -55
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +80 -50
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +126 -113
- package/dest/contract_logging.d.ts +22 -0
- package/dest/contract_logging.d.ts.map +1 -0
- package/dest/contract_logging.js +23 -0
- package/dest/contract_sync/contract_sync_service.d.ts +43 -0
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
- package/dest/contract_sync/contract_sync_service.js +97 -0
- package/dest/contract_sync/helpers.d.ts +29 -0
- package/dest/contract_sync/helpers.d.ts.map +1 -0
- package/dest/contract_sync/helpers.js +55 -0
- package/dest/debug/pxe_debug_utils.d.ts +24 -10
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +28 -17
- package/dest/entrypoints/client/bundle/index.d.ts +4 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +3 -0
- package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +21 -7
- package/dest/entrypoints/client/lazy/index.d.ts +4 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +3 -0
- 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 +22 -8
- package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/server/index.d.ts +4 -1
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +3 -0
- package/dest/entrypoints/server/utils.d.ts +1 -1
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +28 -9
- package/dest/events/event_service.d.ts +5 -6
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +6 -7
- package/dest/job_coordinator/job_coordinator.d.ts +3 -2
- package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
- package/dest/job_coordinator/job_coordinator.js +3 -2
- package/dest/logs/log_service.d.ts +7 -5
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +28 -32
- package/dest/notes/note_service.d.ts +9 -8
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +17 -16
- package/dest/notes_filter.d.ts +25 -0
- package/dest/notes_filter.d.ts.map +1 -0
- package/dest/notes_filter.js +4 -0
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +5 -4
- package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
- package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
- package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
- package/dest/private_kernel/hints/index.d.ts +1 -1
- package/dest/private_kernel/hints/index.js +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +129 -68
- package/dest/private_kernel/hints/test_utils.d.ts +122 -0
- package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
- package/dest/private_kernel/hints/test_utils.js +203 -0
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +21 -13
- package/dest/private_kernel/private_kernel_oracle.d.ts +8 -4
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +7 -3
- package/dest/pxe.d.ts +71 -24
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +110 -70
- package/dest/storage/address_store/address_store.d.ts +1 -1
- package/dest/storage/address_store/address_store.d.ts.map +1 -1
- package/dest/storage/address_store/address_store.js +12 -11
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
- package/dest/storage/capsule_store/capsule_store.js +6 -8
- package/dest/storage/contract_store/contract_store.d.ts +42 -16
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +157 -84
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +47 -49
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +278 -252
- package/dest/storage/note_store/stored_note.d.ts +16 -0
- package/dest/storage/note_store/stored_note.d.ts.map +1 -0
- package/dest/storage/note_store/stored_note.js +43 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +17 -4
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +198 -147
- package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
- package/dest/storage/private_event_store/stored_private_event.js +56 -0
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
- package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +5 -5
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +184 -114
- package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
- package/dest/tagging/get_all_logs_by_tags.js +60 -0
- package/dest/tagging/index.d.ts +3 -2
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +2 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +5 -5
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +7 -7
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +7 -7
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +16 -12
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +5 -8
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +3 -6
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
- 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 +5 -8
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -7
- 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 +20 -18
- package/package.json +25 -16
- package/src/access_scopes.ts +9 -0
- package/src/bin/check_oracle_version.ts +1 -0
- package/src/block_synchronizer/block_synchronizer.ts +76 -33
- package/src/config/index.ts +15 -1
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +327 -140
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +5 -5
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +2 -2
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
- package/src/contract_function_simulator/oracle/interfaces.ts +56 -47
- package/src/contract_function_simulator/oracle/oracle.ts +176 -118
- package/src/contract_function_simulator/oracle/private_execution.ts +2 -61
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +151 -135
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +191 -127
- package/src/contract_logging.ts +39 -0
- package/src/contract_sync/contract_sync_service.ts +152 -0
- package/src/contract_sync/helpers.ts +98 -0
- package/src/debug/pxe_debug_utils.ts +63 -18
- package/src/entrypoints/client/bundle/index.ts +3 -0
- package/src/entrypoints/client/bundle/utils.ts +16 -15
- package/src/entrypoints/client/lazy/index.ts +3 -0
- package/src/entrypoints/client/lazy/utils.ts +17 -15
- package/src/entrypoints/pxe_creation_options.ts +2 -1
- package/src/entrypoints/server/index.ts +3 -0
- package/src/entrypoints/server/utils.ts +22 -26
- package/src/events/event_service.ts +5 -7
- package/src/job_coordinator/job_coordinator.ts +4 -3
- package/src/logs/log_service.ts +48 -39
- package/src/notes/note_service.ts +24 -22
- package/src/notes_filter.ts +26 -0
- package/src/oracle_version.ts +5 -4
- package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
- package/src/private_kernel/hints/index.ts +1 -1
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +164 -117
- package/src/private_kernel/hints/test_utils.ts +325 -0
- package/src/private_kernel/private_kernel_execution_prover.ts +25 -15
- package/src/private_kernel/private_kernel_oracle.ts +9 -9
- package/src/pxe.ts +217 -115
- package/src/storage/address_store/address_store.ts +15 -15
- package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
- package/src/storage/capsule_store/capsule_store.ts +8 -8
- package/src/storage/contract_store/contract_store.ts +186 -96
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +321 -318
- package/src/storage/note_store/stored_note.ts +48 -0
- package/src/storage/private_event_store/private_event_store.ts +250 -190
- package/src/storage/private_event_store/stored_private_event.ts +73 -0
- package/src/storage/tagging_store/recipient_tagging_store.ts +38 -24
- package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
- package/src/storage/tagging_store/sender_tagging_store.ts +214 -130
- package/src/tagging/get_all_logs_by_tags.ts +92 -0
- package/src/tagging/index.ts +2 -1
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +17 -10
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +17 -16
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +6 -9
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -17
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +23 -23
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
- package/dest/tree_membership/tree_membership_service.d.ts +0 -50
- package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
- package/dest/tree_membership/tree_membership_service.js +0 -75
- package/src/tree_membership/tree_membership_service.ts +0 -97
|
@@ -6,46 +6,63 @@ import { toACVMWitness } from '@aztec/simulator/client';
|
|
|
6
6
|
import { FunctionSelector, countArgumentsSize } from '@aztec/stdlib/abi';
|
|
7
7
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
8
8
|
import { PrivateContextInputs } from '@aztec/stdlib/kernel';
|
|
9
|
-
import {
|
|
9
|
+
import { ExtendedDirectionalAppTaggingSecret } from '@aztec/stdlib/logs';
|
|
10
10
|
import { Tag } from '@aztec/stdlib/logs';
|
|
11
11
|
import { Note } from '@aztec/stdlib/note';
|
|
12
12
|
import { CallContext, CountedContractClassLog, NoteAndSlot } from '@aztec/stdlib/tx';
|
|
13
13
|
import { NoteService } from '../../notes/note_service.js';
|
|
14
14
|
import { syncSenderTaggingIndexes } from '../../tagging/index.js';
|
|
15
15
|
import { pickNotes } from '../pick_notes.js';
|
|
16
|
-
import { executePrivateFunction
|
|
16
|
+
import { executePrivateFunction } from './private_execution.js';
|
|
17
17
|
import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
18
18
|
/**
|
|
19
19
|
* The execution oracle for the private part of a transaction.
|
|
20
20
|
*/ export class PrivateExecutionOracle extends UtilityExecutionOracle {
|
|
21
|
+
isPrivate = true;
|
|
22
|
+
/**
|
|
23
|
+
* New notes created during this execution.
|
|
24
|
+
* It's possible that a note in this list has been nullified (in the same or other executions) and doesn't exist in
|
|
25
|
+
* the ExecutionNoteCache and the final proof data. But we still include those notes in the execution result because
|
|
26
|
+
* their commitments are still in the public inputs of this execution.
|
|
27
|
+
* This information is only for references (currently used for tests), and is not used for any sort of constrains.
|
|
28
|
+
* Users can also use this to get a clearer idea of what's happened during a simulation.
|
|
29
|
+
*/ newNotes = [];
|
|
30
|
+
noteHashNullifierCounterMap = new Map();
|
|
31
|
+
contractClassLogs = [];
|
|
32
|
+
offchainEffects = [];
|
|
33
|
+
nestedExecutionResults = [];
|
|
21
34
|
argsHash;
|
|
22
35
|
txContext;
|
|
23
36
|
callContext;
|
|
24
|
-
anchorBlockHeader;
|
|
25
37
|
utilityExecutor;
|
|
26
38
|
executionCache;
|
|
27
39
|
noteCache;
|
|
28
40
|
taggingIndexCache;
|
|
29
41
|
senderTaggingStore;
|
|
42
|
+
contractSyncService;
|
|
30
43
|
totalPublicCalldataCount;
|
|
31
44
|
sideEffectCounter;
|
|
32
45
|
senderForTags;
|
|
33
46
|
simulator;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
constructor(args){
|
|
48
|
+
super({
|
|
49
|
+
...args,
|
|
50
|
+
contractAddress: args.callContext.contractAddress,
|
|
51
|
+
log: args.log ?? createLogger('simulator:client_execution_context')
|
|
52
|
+
});
|
|
53
|
+
this.argsHash = args.argsHash;
|
|
54
|
+
this.txContext = args.txContext;
|
|
55
|
+
this.callContext = args.callContext;
|
|
56
|
+
this.utilityExecutor = args.utilityExecutor;
|
|
57
|
+
this.executionCache = args.executionCache;
|
|
58
|
+
this.noteCache = args.noteCache;
|
|
59
|
+
this.taggingIndexCache = args.taggingIndexCache;
|
|
60
|
+
this.senderTaggingStore = args.senderTaggingStore;
|
|
61
|
+
this.contractSyncService = args.contractSyncService;
|
|
62
|
+
this.totalPublicCalldataCount = args.totalPublicCalldataCount ?? 0;
|
|
63
|
+
this.sideEffectCounter = args.sideEffectCounter ?? 0;
|
|
64
|
+
this.senderForTags = args.senderForTags;
|
|
65
|
+
this.simulator = args.simulator;
|
|
49
66
|
}
|
|
50
67
|
getPrivateContextInputs() {
|
|
51
68
|
return new PrivateContextInputs(this.callContext, this.anchorBlockHeader, this.txContext, this.sideEffectCounter);
|
|
@@ -109,7 +126,7 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
109
126
|
*
|
|
110
127
|
* The value persists through nested calls, meaning all calls down the stack will use the same
|
|
111
128
|
* 'senderForTags' value (unless it is replaced).
|
|
112
|
-
*/
|
|
129
|
+
*/ getSenderForTags() {
|
|
113
130
|
return Promise.resolve(this.senderForTags);
|
|
114
131
|
}
|
|
115
132
|
/**
|
|
@@ -122,7 +139,7 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
122
139
|
* Account contracts typically set this value before calling other contracts. The value persists
|
|
123
140
|
* through nested calls, meaning all calls down the stack will use the same 'senderForTags'
|
|
124
141
|
* value (unless it is replaced by another call to this setter).
|
|
125
|
-
*/
|
|
142
|
+
*/ setSenderForTags(senderForTags) {
|
|
126
143
|
this.senderForTags = senderForTags;
|
|
127
144
|
return Promise.resolve();
|
|
128
145
|
}
|
|
@@ -131,20 +148,20 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
131
148
|
* @param sender - The address sending the log
|
|
132
149
|
* @param recipient - The address receiving the log
|
|
133
150
|
* @returns An app tag to be used in a log.
|
|
134
|
-
*/ async
|
|
135
|
-
const
|
|
136
|
-
const index = await this.#getIndexToUseForSecret(
|
|
137
|
-
this.
|
|
138
|
-
this.taggingIndexCache.setLastUsedIndex(
|
|
151
|
+
*/ async getNextAppTagAsSender(sender, recipient) {
|
|
152
|
+
const extendedSecret = await this.#calculateExtendedDirectionalAppTaggingSecret(this.contractAddress, sender, recipient);
|
|
153
|
+
const index = await this.#getIndexToUseForSecret(extendedSecret);
|
|
154
|
+
this.logger.debug(`Incrementing tagging index for sender: ${sender}, recipient: ${recipient}, contract: ${this.contractAddress} to ${index}`);
|
|
155
|
+
this.taggingIndexCache.setLastUsedIndex(extendedSecret, index);
|
|
139
156
|
return Tag.compute({
|
|
140
|
-
|
|
157
|
+
extendedSecret,
|
|
141
158
|
index
|
|
142
159
|
});
|
|
143
160
|
}
|
|
144
|
-
async #
|
|
145
|
-
const senderCompleteAddress = await this.
|
|
161
|
+
async #calculateExtendedDirectionalAppTaggingSecret(contractAddress, sender, recipient) {
|
|
162
|
+
const senderCompleteAddress = await this.getCompleteAddressOrFail(sender);
|
|
146
163
|
const senderIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(sender);
|
|
147
|
-
return
|
|
164
|
+
return ExtendedDirectionalAppTaggingSecret.compute(senderCompleteAddress, senderIvsk, recipient, contractAddress, recipient);
|
|
148
165
|
}
|
|
149
166
|
async #getIndexToUseForSecret(secret) {
|
|
150
167
|
// If we have the tagging index in the cache, we use it. If not we obtain it from the execution data provider.
|
|
@@ -155,7 +172,7 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
155
172
|
// This is a tagging secret we've not yet used in this tx, so first sync our store to make sure its indices
|
|
156
173
|
// are up to date. We do this here because this store is not synced as part of the global sync because
|
|
157
174
|
// that'd be wasteful as most tagging secrets are not used in each tx.
|
|
158
|
-
await syncSenderTaggingIndexes(secret, this.
|
|
175
|
+
await syncSenderTaggingIndexes(secret, this.aztecNode, this.senderTaggingStore, await this.anchorBlockHeader.hash(), this.jobId);
|
|
159
176
|
const lastUsedIndex = await this.senderTaggingStore.getLastUsedIndex(secret, this.jobId);
|
|
160
177
|
// If lastUsedIndex is undefined, we've never used this secret, so start from 0
|
|
161
178
|
// Otherwise, the next index to use is one past the last used index
|
|
@@ -166,29 +183,29 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
166
183
|
* Store values in the execution cache.
|
|
167
184
|
* @param values - Values to store.
|
|
168
185
|
* @returns The hash of the values.
|
|
169
|
-
*/
|
|
186
|
+
*/ storeInExecutionCache(values, hash) {
|
|
170
187
|
return this.executionCache.store(values, hash);
|
|
171
188
|
}
|
|
172
189
|
/**
|
|
173
190
|
* Gets values from the execution cache.
|
|
174
191
|
* @param hash - Hash of the values.
|
|
175
192
|
* @returns The values.
|
|
176
|
-
*/
|
|
193
|
+
*/ loadFromExecutionCache(hash) {
|
|
177
194
|
const preimage = this.executionCache.getPreimage(hash);
|
|
178
195
|
if (!preimage) {
|
|
179
196
|
throw new Error(`Preimage for hash ${hash.toString()} not found in cache`);
|
|
180
197
|
}
|
|
181
198
|
return Promise.resolve(preimage);
|
|
182
199
|
}
|
|
183
|
-
async
|
|
200
|
+
async checkNullifierExists(innerNullifier) {
|
|
184
201
|
// This oracle must be overridden because while utility execution can only meaningfully check if a nullifier exists
|
|
185
202
|
// in the synched block, during private execution there's also the possibility of it being pending, i.e. created
|
|
186
203
|
// in the current transaction.
|
|
187
|
-
this.
|
|
204
|
+
this.logger.debug(`Checking existence of inner nullifier ${innerNullifier}`, {
|
|
188
205
|
contractAddress: this.contractAddress
|
|
189
206
|
});
|
|
190
207
|
const nullifier = (await siloNullifier(this.contractAddress, innerNullifier)).toBigInt();
|
|
191
|
-
return this.noteCache.getNullifiers(this.contractAddress).has(nullifier) || await super.
|
|
208
|
+
return this.noteCache.getNullifiers(this.contractAddress).has(nullifier) || await super.checkNullifierExists(innerNullifier);
|
|
192
209
|
}
|
|
193
210
|
/**
|
|
194
211
|
* Gets some notes for a storage slot.
|
|
@@ -210,11 +227,11 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
210
227
|
* @param offset - The starting index for pagination.
|
|
211
228
|
* @param status - The status of notes to fetch.
|
|
212
229
|
* @returns Array of note data.
|
|
213
|
-
*/ async
|
|
230
|
+
*/ async getNotes(owner, storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status) {
|
|
214
231
|
// Nullified pending notes are already removed from the list.
|
|
215
232
|
const pendingNotes = this.noteCache.getNotes(this.callContext.contractAddress, owner, storageSlot);
|
|
216
233
|
const pendingNullifiers = this.noteCache.getNullifiers(this.callContext.contractAddress);
|
|
217
|
-
const noteService = new NoteService(this.noteStore, this.aztecNode, this.
|
|
234
|
+
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
218
235
|
const dbNotes = await noteService.getNotes(this.callContext.contractAddress, owner, storageSlot, status, this.scopes);
|
|
219
236
|
const dbNotesFiltered = dbNotes.filter((n)=>!pendingNullifiers.has(n.siloedNullifier.value));
|
|
220
237
|
const notes = pickNotes([
|
|
@@ -241,7 +258,7 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
241
258
|
limit,
|
|
242
259
|
offset
|
|
243
260
|
});
|
|
244
|
-
this.
|
|
261
|
+
this.logger.debug(`Returning ${notes.length} notes for ${this.callContext.contractAddress} at ${storageSlot}: ${notes.map((n)=>`${n.noteNonce.toString()}:[${n.note.items.map((i)=>i.toString()).join(',')}]`).join(', ')}`);
|
|
245
262
|
return notes;
|
|
246
263
|
}
|
|
247
264
|
/**
|
|
@@ -254,8 +271,8 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
254
271
|
* @param noteItems - The items to be included in a Note.
|
|
255
272
|
* @param noteHash - A hash of the new note.
|
|
256
273
|
* @returns
|
|
257
|
-
*/
|
|
258
|
-
this.
|
|
274
|
+
*/ notifyCreatedNote(owner, storageSlot, randomness, noteTypeId, noteItems, noteHash, counter) {
|
|
275
|
+
this.logger.debug(`Notified of new note with inner hash ${noteHash}`, {
|
|
259
276
|
contractAddress: this.callContext.contractAddress,
|
|
260
277
|
storageSlot,
|
|
261
278
|
randomness,
|
|
@@ -286,7 +303,7 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
286
303
|
* within the current transaction/execution.
|
|
287
304
|
* @param innerNullifier - The pending nullifier to add in the list (not yet siloed by contract address).
|
|
288
305
|
* @param noteHash - A hash of the new note.
|
|
289
|
-
*/ async
|
|
306
|
+
*/ async notifyNullifiedNote(innerNullifier, noteHash, counter) {
|
|
290
307
|
const nullifiedNoteHashCounter = await this.noteCache.nullifyNote(this.callContext.contractAddress, innerNullifier, noteHash);
|
|
291
308
|
if (nullifiedNoteHashCounter !== undefined) {
|
|
292
309
|
this.noteHashNullifierCounterMap.set(nullifiedNoteHashCounter, counter);
|
|
@@ -297,22 +314,33 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
297
314
|
* within the current transaction/execution.
|
|
298
315
|
* @param innerNullifier - The pending nullifier to add in the list (not yet siloed by contract address).
|
|
299
316
|
* @param noteHash - A hash of the new note.
|
|
300
|
-
*/
|
|
301
|
-
this.
|
|
317
|
+
*/ notifyCreatedNullifier(innerNullifier) {
|
|
318
|
+
this.logger.debug(`Notified of new inner nullifier ${innerNullifier}`, {
|
|
302
319
|
contractAddress: this.contractAddress
|
|
303
320
|
});
|
|
304
321
|
return this.noteCache.nullifierCreated(this.callContext.contractAddress, innerNullifier);
|
|
305
322
|
}
|
|
306
323
|
/**
|
|
324
|
+
* Check if a nullifier has been emitted in the same transaction, i.e. if notifyCreatedNullifier has been
|
|
325
|
+
* called for this inner nullifier from the contract with the specified address.
|
|
326
|
+
* @param innerNullifier - The inner nullifier to check.
|
|
327
|
+
* @param contractAddress - Address of the contract that emitted the nullifier.
|
|
328
|
+
* @returns A boolean indicating whether the nullifier is pending or not.
|
|
329
|
+
*/ async isNullifierPending(innerNullifier, contractAddress) {
|
|
330
|
+
const siloedNullifier = await siloNullifier(contractAddress, innerNullifier);
|
|
331
|
+
const isNullifierPending = this.noteCache.getNullifiers(contractAddress).has(siloedNullifier.toBigInt());
|
|
332
|
+
return Promise.resolve(isNullifierPending);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
307
335
|
* Emit a contract class log.
|
|
308
336
|
* This fn exists because we only carry a poseidon hash through the kernels, and need to
|
|
309
337
|
* keep the preimage in ts for later.
|
|
310
338
|
* @param log - The contract class log to be emitted.
|
|
311
339
|
* @param counter - The contract class log's counter.
|
|
312
|
-
*/
|
|
340
|
+
*/ notifyCreatedContractClassLog(log, counter) {
|
|
313
341
|
this.contractClassLogs.push(new CountedContractClassLog(log, counter));
|
|
314
342
|
const text = log.toBuffer().toString('hex');
|
|
315
|
-
this.
|
|
343
|
+
this.logger.verbose(`Emitted log from ContractClassRegistry: "${text.length > 100 ? text.slice(0, 100) + '...' : text}"`);
|
|
316
344
|
}
|
|
317
345
|
#checkValidStaticCall(childExecutionResult) {
|
|
318
346
|
if (childExecutionResult.publicInputs.noteHashes.claimedLength > 0 || childExecutionResult.publicInputs.nullifiers.claimedLength > 0 || childExecutionResult.publicInputs.l2ToL1Msgs.claimedLength > 0 || childExecutionResult.publicInputs.privateLogs.claimedLength > 0 || childExecutionResult.publicInputs.contractClassLogsHashes.claimedLength > 0) {
|
|
@@ -327,21 +355,49 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
327
355
|
* @param sideEffectCounter - The side effect counter at the start of the call.
|
|
328
356
|
* @param isStaticCall - Whether the call is a static call.
|
|
329
357
|
* @returns The execution result.
|
|
330
|
-
*/ async
|
|
358
|
+
*/ async callPrivateFunction(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall) {
|
|
331
359
|
if (!this.simulator) {
|
|
332
360
|
// In practice it is only when creating inline private contexts in a Noir test using TXE that we create an
|
|
333
361
|
// instance of this class without a simulator.
|
|
334
362
|
throw new Error('No simulator provided, cannot perform a nested private call');
|
|
335
363
|
}
|
|
336
364
|
const simulatorSetupTimer = new Timer();
|
|
337
|
-
this.
|
|
365
|
+
this.logger.debug(`Calling private function ${targetContractAddress}:${functionSelector} from ${this.callContext.contractAddress}`);
|
|
338
366
|
isStaticCall = isStaticCall || this.callContext.isStaticCall;
|
|
339
|
-
await
|
|
340
|
-
await this.contractStore.syncPrivateState(targetContractAddress, functionSelector, this.utilityExecutor);
|
|
367
|
+
await this.contractSyncService.ensureContractSynced(targetContractAddress, functionSelector, this.utilityExecutor, this.anchorBlockHeader, this.jobId, this.scopes);
|
|
341
368
|
const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(targetContractAddress, functionSelector);
|
|
342
369
|
const derivedTxContext = this.txContext.clone();
|
|
343
370
|
const derivedCallContext = await this.deriveCallContext(targetContractAddress, targetArtifact, isStaticCall);
|
|
344
|
-
const privateExecutionOracle = new PrivateExecutionOracle(
|
|
371
|
+
const privateExecutionOracle = new PrivateExecutionOracle({
|
|
372
|
+
argsHash,
|
|
373
|
+
txContext: derivedTxContext,
|
|
374
|
+
callContext: derivedCallContext,
|
|
375
|
+
anchorBlockHeader: this.anchorBlockHeader,
|
|
376
|
+
utilityExecutor: this.utilityExecutor,
|
|
377
|
+
authWitnesses: this.authWitnesses,
|
|
378
|
+
capsules: this.capsules,
|
|
379
|
+
executionCache: this.executionCache,
|
|
380
|
+
noteCache: this.noteCache,
|
|
381
|
+
taggingIndexCache: this.taggingIndexCache,
|
|
382
|
+
contractStore: this.contractStore,
|
|
383
|
+
noteStore: this.noteStore,
|
|
384
|
+
keyStore: this.keyStore,
|
|
385
|
+
addressStore: this.addressStore,
|
|
386
|
+
aztecNode: this.aztecNode,
|
|
387
|
+
senderTaggingStore: this.senderTaggingStore,
|
|
388
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
389
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
390
|
+
capsuleStore: this.capsuleStore,
|
|
391
|
+
privateEventStore: this.privateEventStore,
|
|
392
|
+
contractSyncService: this.contractSyncService,
|
|
393
|
+
jobId: this.jobId,
|
|
394
|
+
totalPublicCalldataCount: this.totalPublicCalldataCount,
|
|
395
|
+
sideEffectCounter,
|
|
396
|
+
log: this.logger,
|
|
397
|
+
scopes: this.scopes,
|
|
398
|
+
senderForTags: this.senderForTags,
|
|
399
|
+
simulator: this.simulator
|
|
400
|
+
});
|
|
345
401
|
const setupTime = simulatorSetupTimer.ms();
|
|
346
402
|
const childExecutionResult = await executePrivateFunction(this.simulator, privateExecutionOracle, targetArtifact, targetContractAddress, functionSelector);
|
|
347
403
|
if (isStaticCall) {
|
|
@@ -374,7 +430,7 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
374
430
|
* @param calldataHash - The hash of the function selector and arguments.
|
|
375
431
|
* @param sideEffectCounter - The side effect counter at the start of the call.
|
|
376
432
|
* @param isStaticCall - Whether the call is a static call.
|
|
377
|
-
*/
|
|
433
|
+
*/ notifyEnqueuedPublicFunctionCall(_targetContractAddress, calldataHash, _sideEffectCounter, _isStaticCall) {
|
|
378
434
|
this.#onNewPublicFunctionCall(calldataHash);
|
|
379
435
|
return Promise.resolve();
|
|
380
436
|
}
|
|
@@ -384,14 +440,14 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
384
440
|
* @param argsHash - The arguments hash to pass to the function.
|
|
385
441
|
* @param sideEffectCounter - The side effect counter at the start of the call.
|
|
386
442
|
* @param isStaticCall - Whether the call is a static call.
|
|
387
|
-
*/
|
|
443
|
+
*/ notifySetPublicTeardownFunctionCall(_targetContractAddress, calldataHash, _sideEffectCounter, _isStaticCall) {
|
|
388
444
|
this.#onNewPublicFunctionCall(calldataHash);
|
|
389
445
|
return Promise.resolve();
|
|
390
446
|
}
|
|
391
|
-
|
|
447
|
+
notifySetMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter) {
|
|
392
448
|
return this.noteCache.setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter);
|
|
393
449
|
}
|
|
394
|
-
|
|
450
|
+
isSideEffectCounterRevertible(sideEffectCounter) {
|
|
395
451
|
return Promise.resolve(this.noteCache.isSideEffectCounterRevertible(sideEffectCounter));
|
|
396
452
|
}
|
|
397
453
|
/**
|
|
@@ -406,7 +462,7 @@ import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
|
406
462
|
getDebugFunctionName() {
|
|
407
463
|
return this.contractStore.getDebugFunctionName(this.contractAddress, this.callContext.functionSelector);
|
|
408
464
|
}
|
|
409
|
-
|
|
465
|
+
emitOffchainEffect(data) {
|
|
410
466
|
this.offchainEffects.push({
|
|
411
467
|
data
|
|
412
468
|
});
|
|
@@ -1,18 +1,21 @@
|
|
|
1
|
+
import type { ARCHIVE_HEIGHT, NOTE_HASH_TREE_HEIGHT } from '@aztec/constants';
|
|
1
2
|
import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
4
|
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
5
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
6
|
+
import type { MembershipWitness } from '@aztec/foundation/trees';
|
|
4
7
|
import type { KeyStore } from '@aztec/key-store';
|
|
5
8
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
6
9
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
7
|
-
import {
|
|
10
|
+
import { BlockHash } from '@aztec/stdlib/block';
|
|
8
11
|
import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
|
|
9
12
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
10
13
|
import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
|
|
11
14
|
import type { NoteStatus } from '@aztec/stdlib/note';
|
|
12
|
-
import {
|
|
15
|
+
import { type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
13
16
|
import type { BlockHeader, Capsule } from '@aztec/stdlib/tx';
|
|
17
|
+
import type { AccessScopes } from '../../access_scopes.js';
|
|
14
18
|
import type { AddressStore } from '../../storage/address_store/address_store.js';
|
|
15
|
-
import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
|
|
16
19
|
import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
|
|
17
20
|
import type { ContractStore } from '../../storage/contract_store/contract_store.js';
|
|
18
21
|
import type { NoteStore } from '../../storage/note_store/note_store.js';
|
|
@@ -22,12 +25,35 @@ import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_
|
|
|
22
25
|
import { UtilityContext } from '../noir-structs/utility_context.js';
|
|
23
26
|
import type { IMiscOracle, IUtilityExecutionOracle, NoteData } from './interfaces.js';
|
|
24
27
|
import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
|
|
28
|
+
/** Args for UtilityExecutionOracle constructor. */
|
|
29
|
+
export type UtilityExecutionOracleArgs = {
|
|
30
|
+
contractAddress: AztecAddress;
|
|
31
|
+
/** List of transient auth witnesses to be used during this simulation */
|
|
32
|
+
authWitnesses: AuthWitness[];
|
|
33
|
+
capsules: Capsule[];
|
|
34
|
+
anchorBlockHeader: BlockHeader;
|
|
35
|
+
contractStore: ContractStore;
|
|
36
|
+
noteStore: NoteStore;
|
|
37
|
+
keyStore: KeyStore;
|
|
38
|
+
addressStore: AddressStore;
|
|
39
|
+
aztecNode: AztecNode;
|
|
40
|
+
recipientTaggingStore: RecipientTaggingStore;
|
|
41
|
+
senderAddressBookStore: SenderAddressBookStore;
|
|
42
|
+
capsuleStore: CapsuleStore;
|
|
43
|
+
privateEventStore: PrivateEventStore;
|
|
44
|
+
jobId: string;
|
|
45
|
+
log?: ReturnType<typeof createLogger>;
|
|
46
|
+
scopes: AccessScopes;
|
|
47
|
+
};
|
|
25
48
|
/**
|
|
26
49
|
* The oracle for an execution of utility contract functions.
|
|
27
50
|
*/
|
|
28
51
|
export declare class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOracle {
|
|
52
|
+
#private;
|
|
53
|
+
isMisc: true;
|
|
54
|
+
isUtility: true;
|
|
55
|
+
private contractLogger;
|
|
29
56
|
protected readonly contractAddress: AztecAddress;
|
|
30
|
-
/** List of transient auth witnesses to be used during this simulation */
|
|
31
57
|
protected readonly authWitnesses: AuthWitness[];
|
|
32
58
|
protected readonly capsules: Capsule[];
|
|
33
59
|
protected readonly anchorBlockHeader: BlockHeader;
|
|
@@ -36,45 +62,52 @@ export declare class UtilityExecutionOracle implements IMiscOracle, IUtilityExec
|
|
|
36
62
|
protected readonly keyStore: KeyStore;
|
|
37
63
|
protected readonly addressStore: AddressStore;
|
|
38
64
|
protected readonly aztecNode: AztecNode;
|
|
39
|
-
protected readonly anchorBlockStore: AnchorBlockStore;
|
|
40
65
|
protected readonly recipientTaggingStore: RecipientTaggingStore;
|
|
41
66
|
protected readonly senderAddressBookStore: SenderAddressBookStore;
|
|
42
67
|
protected readonly capsuleStore: CapsuleStore;
|
|
43
68
|
protected readonly privateEventStore: PrivateEventStore;
|
|
44
69
|
protected readonly jobId: string;
|
|
45
|
-
protected
|
|
46
|
-
protected readonly scopes
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
/** List of transient auth witnesses to be used during this simulation */
|
|
52
|
-
authWitnesses: AuthWitness[], capsules: Capsule[], anchorBlockHeader: BlockHeader, contractStore: ContractStore, noteStore: NoteStore, keyStore: KeyStore, addressStore: AddressStore, aztecNode: AztecNode, anchorBlockStore: AnchorBlockStore, recipientTaggingStore: RecipientTaggingStore, senderAddressBookStore: SenderAddressBookStore, capsuleStore: CapsuleStore, privateEventStore: PrivateEventStore, jobId: string, log?: import("@aztec/foundation/log").Logger, scopes?: AztecAddress[] | undefined);
|
|
53
|
-
utilityAssertCompatibleOracleVersion(version: number): void;
|
|
54
|
-
utilityGetRandomField(): Fr;
|
|
55
|
-
utilityGetUtilityContext(): UtilityContext;
|
|
70
|
+
protected logger: ReturnType<typeof createLogger>;
|
|
71
|
+
protected readonly scopes: AccessScopes;
|
|
72
|
+
constructor(args: UtilityExecutionOracleArgs);
|
|
73
|
+
assertCompatibleOracleVersion(version: number): void;
|
|
74
|
+
getRandomField(): Fr;
|
|
75
|
+
getUtilityContext(): UtilityContext;
|
|
56
76
|
/**
|
|
57
77
|
* Retrieve keys associated with a specific master public key and app address.
|
|
58
78
|
* @param pkMHash - The master public key hash.
|
|
59
79
|
* @returns A Promise that resolves to nullifier keys.
|
|
60
80
|
* @throws If the keys are not registered in the key store.
|
|
81
|
+
* @throws If scopes are defined and the account is not in the scopes.
|
|
82
|
+
*/
|
|
83
|
+
getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest>;
|
|
84
|
+
/**
|
|
85
|
+
* Fetches the index and sibling path of a leaf at a given block from the note hash tree.
|
|
86
|
+
* @param anchorBlockHash - The hash of a block that contains the note hash tree root in which to find the membership
|
|
87
|
+
* witness.
|
|
88
|
+
* @param noteHash - The note hash to find in the note hash tree.
|
|
89
|
+
* @returns The membership witness containing the leaf index and sibling path
|
|
61
90
|
*/
|
|
62
|
-
|
|
91
|
+
getNoteHashMembershipWitness(anchorBlockHash: BlockHash, noteHash: Fr): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined>;
|
|
63
92
|
/**
|
|
64
|
-
* Fetches the index and sibling path of a
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
93
|
+
* Fetches the index and sibling path of a block hash in the archive tree.
|
|
94
|
+
*
|
|
95
|
+
* Block hashes are the leaves of the archive tree. Each time a new block is added to the chain,
|
|
96
|
+
* its block hash is appended as a new leaf to the archive tree.
|
|
97
|
+
*
|
|
98
|
+
* @param anchorBlockHash - The hash of a block that contains the archive tree root in which to find the membership
|
|
99
|
+
* witness.
|
|
100
|
+
* @param blockHash - The block hash to find in the archive tree.
|
|
101
|
+
* @returns The membership witness containing the leaf index and sibling path
|
|
69
102
|
*/
|
|
70
|
-
|
|
103
|
+
getBlockHashMembershipWitness(anchorBlockHash: BlockHash, blockHash: BlockHash): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined>;
|
|
71
104
|
/**
|
|
72
105
|
* Returns a nullifier membership witness for a given nullifier at a given block.
|
|
73
106
|
* @param blockHash - The block hash at which to get the index.
|
|
74
107
|
* @param nullifier - Nullifier we try to find witness for.
|
|
75
108
|
* @returns The nullifier membership witness (if found).
|
|
76
109
|
*/
|
|
77
|
-
|
|
110
|
+
getNullifierMembershipWitness(blockHash: BlockHash, nullifier: Fr): Promise<NullifierMembershipWitness | undefined>;
|
|
78
111
|
/**
|
|
79
112
|
* Returns a low nullifier membership witness for a given nullifier at a given block.
|
|
80
113
|
* @param blockHash - The block hash at which to get the index.
|
|
@@ -84,42 +117,40 @@ export declare class UtilityExecutionOracle implements IMiscOracle, IUtilityExec
|
|
|
84
117
|
* list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
|
|
85
118
|
* we are trying to prove non-inclusion for.
|
|
86
119
|
*/
|
|
87
|
-
|
|
120
|
+
getLowNullifierMembershipWitness(blockHash: BlockHash, nullifier: Fr): Promise<NullifierMembershipWitness | undefined>;
|
|
88
121
|
/**
|
|
89
122
|
* Returns a public data tree witness for a given leaf slot at a given block.
|
|
90
123
|
* @param blockHash - The block hash at which to get the index.
|
|
91
124
|
* @param leafSlot - The slot of the public data tree to get the witness for.
|
|
92
125
|
* @returns - The witness
|
|
93
126
|
*/
|
|
94
|
-
|
|
127
|
+
getPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined>;
|
|
95
128
|
/**
|
|
96
129
|
* Fetches a block header of a given block.
|
|
97
130
|
* @param blockNumber - The number of a block of which to get the block header.
|
|
98
131
|
* @returns Block extracted from a block with block number `blockNumber`.
|
|
99
132
|
*/
|
|
100
|
-
|
|
133
|
+
getBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined>;
|
|
101
134
|
/**
|
|
102
135
|
* Retrieve the complete address associated to a given address.
|
|
103
136
|
* @param account - The account address.
|
|
104
|
-
* @returns A complete address associated with the input address.
|
|
105
|
-
* @throws An error if the account is not registered in the database.
|
|
137
|
+
* @returns A complete address associated with the input address, or `undefined` if not registered.
|
|
106
138
|
*/
|
|
107
|
-
|
|
108
|
-
protected
|
|
139
|
+
tryGetPublicKeysAndPartialAddress(account: AztecAddress): Promise<CompleteAddress | undefined>;
|
|
140
|
+
protected getCompleteAddressOrFail(account: AztecAddress): Promise<CompleteAddress>;
|
|
109
141
|
/**
|
|
110
142
|
* Returns a contract instance associated with an address or throws if not found.
|
|
111
143
|
* @param address - Address.
|
|
112
144
|
* @returns A contract instance.
|
|
113
145
|
*/
|
|
114
|
-
|
|
115
|
-
protected getContractInstance(address: AztecAddress): Promise<ContractInstance>;
|
|
146
|
+
getContractInstance(address: AztecAddress): Promise<ContractInstance>;
|
|
116
147
|
/**
|
|
117
148
|
* Returns an auth witness for the given message hash. Checks on the list of transient witnesses
|
|
118
149
|
* for this transaction first, and falls back to the local database if not found.
|
|
119
150
|
* @param messageHash - Hash of the message to authenticate.
|
|
120
151
|
* @returns Authentication witness for the requested message hash.
|
|
121
152
|
*/
|
|
122
|
-
|
|
153
|
+
getAuthWitness(messageHash: Fr): Promise<Fr[] | undefined>;
|
|
123
154
|
/**
|
|
124
155
|
* Gets some notes for a contract address and storage slot.
|
|
125
156
|
* Returns a flattened array containing filtered notes.
|
|
@@ -142,13 +173,13 @@ export declare class UtilityExecutionOracle implements IMiscOracle, IUtilityExec
|
|
|
142
173
|
* @param status - The status of notes to fetch.
|
|
143
174
|
* @returns Array of note data.
|
|
144
175
|
*/
|
|
145
|
-
|
|
176
|
+
getNotes(owner: AztecAddress | undefined, storageSlot: Fr, numSelects: number, selectByIndexes: number[], selectByOffsets: number[], selectByLengths: number[], selectValues: Fr[], selectComparators: number[], sortByIndexes: number[], sortByOffsets: number[], sortByLengths: number[], sortOrder: number[], limit: number, offset: number, status: NoteStatus): Promise<NoteData[]>;
|
|
146
177
|
/**
|
|
147
178
|
* Check if a nullifier exists in the nullifier tree.
|
|
148
179
|
* @param innerNullifier - The inner nullifier.
|
|
149
180
|
* @returns A boolean indicating whether the nullifier exists in the tree or not.
|
|
150
181
|
*/
|
|
151
|
-
|
|
182
|
+
checkNullifierExists(innerNullifier: Fr): Promise<boolean>;
|
|
152
183
|
/**
|
|
153
184
|
* Fetches a message from the executionStore, given its key.
|
|
154
185
|
* @param contractAddress - Address of a contract by which the message was emitted.
|
|
@@ -157,7 +188,7 @@ export declare class UtilityExecutionOracle implements IMiscOracle, IUtilityExec
|
|
|
157
188
|
* @dev Contract address and secret are only used to compute the nullifier to get non-nullified messages
|
|
158
189
|
* @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
|
|
159
190
|
*/
|
|
160
|
-
|
|
191
|
+
getL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr): Promise<MessageLoadOracleInputs<36>>;
|
|
161
192
|
/**
|
|
162
193
|
* Read the public storage data.
|
|
163
194
|
* @param blockHash - The block hash to read storage at.
|
|
@@ -165,9 +196,9 @@ export declare class UtilityExecutionOracle implements IMiscOracle, IUtilityExec
|
|
|
165
196
|
* @param startStorageSlot - The starting storage slot.
|
|
166
197
|
* @param numberOfElements - Number of elements to read from the starting storage slot.
|
|
167
198
|
*/
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
199
|
+
storageRead(blockHash: BlockHash, contractAddress: AztecAddress, startStorageSlot: Fr, numberOfElements: number): Promise<Fr[]>;
|
|
200
|
+
log(level: number, message: string, fields: Fr[]): Promise<void>;
|
|
201
|
+
fetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr): Promise<void>;
|
|
171
202
|
/**
|
|
172
203
|
* Validates all note and event validation requests enqueued via `enqueue_note_for_validation` and
|
|
173
204
|
* `enqueue_event_for_validation`, inserting them into the note database and event store respectively, making them
|
|
@@ -178,20 +209,19 @@ export declare class UtilityExecutionOracle implements IMiscOracle, IUtilityExec
|
|
|
178
209
|
* @param noteValidationRequestsArrayBaseSlot - The base slot of capsule array containing note validation requests.
|
|
179
210
|
* @param eventValidationRequestsArrayBaseSlot - The base slot of capsule array containing event validation requests.
|
|
180
211
|
*/
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
212
|
+
validateAndStoreEnqueuedNotesAndEvents(contractAddress: AztecAddress, noteValidationRequestsArrayBaseSlot: Fr, eventValidationRequestsArrayBaseSlot: Fr): Promise<void>;
|
|
213
|
+
bulkRetrieveLogs(contractAddress: AztecAddress, logRetrievalRequestsArrayBaseSlot: Fr, logRetrievalResponsesArrayBaseSlot: Fr): Promise<void>;
|
|
214
|
+
storeCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[]): Promise<void>;
|
|
215
|
+
loadCapsule(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null>;
|
|
216
|
+
deleteCapsule(contractAddress: AztecAddress, slot: Fr): Promise<void>;
|
|
217
|
+
copyCapsule(contractAddress: AztecAddress, srcSlot: Fr, dstSlot: Fr, numEntries: number): Promise<void>;
|
|
218
|
+
aes128Decrypt(ciphertext: Buffer, iv: Buffer, symKey: Buffer): Promise<Buffer>;
|
|
188
219
|
/**
|
|
189
220
|
* Retrieves the shared secret for a given address and ephemeral public key.
|
|
190
221
|
* @param address - The address to get the secret for.
|
|
191
222
|
* @param ephPk - The ephemeral public key to get the secret for.
|
|
192
223
|
* @returns The secret for the given address.
|
|
193
224
|
*/
|
|
194
|
-
|
|
195
|
-
protected getSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point>;
|
|
225
|
+
getSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point>;
|
|
196
226
|
}
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
227
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0eV9leGVjdXRpb25fb3JhY2xlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udHJhY3RfZnVuY3Rpb25fc2ltdWxhdG9yL29yYWNsZS91dGlsaXR5X2V4ZWN1dGlvbl9vcmFjbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUUsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbkUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRCxPQUFPLEVBQTBCLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRixPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSWpFLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBZ0IsS0FBSywwQkFBMEIsRUFBRSxpQkFBaUIsRUFB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
|