@aztec/simulator 0.81.0 → 0.82.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/common/db_interfaces.d.ts +6 -12
- package/dest/common/db_interfaces.d.ts.map +1 -1
- package/dest/common/db_interfaces.js +1 -1
- package/dest/common/message_load_oracle_inputs.d.ts +4 -0
- package/dest/common/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/common/message_load_oracle_inputs.js +9 -0
- package/dest/private/acvm/acvm.d.ts +6 -1
- package/dest/private/acvm/acvm.d.ts.map +1 -1
- package/dest/private/acvm/acvm.js +7 -13
- package/dest/private/acvm/deserialize.d.ts +0 -18
- package/dest/private/acvm/deserialize.d.ts.map +1 -1
- package/dest/private/acvm/deserialize.js +3 -24
- package/dest/private/acvm/oracle/oracle.d.ts +34 -34
- package/dest/private/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/private/acvm/oracle/oracle.js +119 -79
- package/dest/private/acvm/oracle/typed_oracle.d.ts +1 -1
- package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/private/acvm/oracle/typed_oracle.js +2 -2
- package/dest/private/execution_data_provider.d.ts +3 -9
- package/dest/private/execution_data_provider.d.ts.map +1 -1
- package/dest/private/private_execution.d.ts +2 -2
- package/dest/private/private_execution.d.ts.map +1 -1
- package/dest/private/private_execution.js +4 -5
- package/dest/private/providers/acvm_native.d.ts +6 -4
- package/dest/private/providers/acvm_native.d.ts.map +1 -1
- package/dest/private/providers/acvm_native.js +6 -3
- package/dest/private/providers/acvm_wasm.d.ts +6 -7
- package/dest/private/providers/acvm_wasm.d.ts.map +1 -1
- package/dest/private/providers/acvm_wasm.js +13 -15
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts +5 -5
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +1 -1
- package/dest/private/providers/acvm_wasm_with_blobs.js +7 -9
- package/dest/private/providers/circuit_recording/circuit_recorder.d.ts +90 -0
- package/dest/private/providers/circuit_recording/circuit_recorder.d.ts.map +1 -0
- package/dest/private/providers/circuit_recording/circuit_recorder.js +246 -0
- package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.d.ts +18 -0
- package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.d.ts.map +1 -0
- package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.js +39 -0
- package/dest/private/providers/simulation_provider.d.ts +21 -7
- package/dest/private/providers/simulation_provider.d.ts.map +1 -1
- package/dest/private/simulator.d.ts +3 -2
- package/dest/private/simulator.d.ts.map +1 -1
- package/dest/private/simulator.js +2 -2
- package/dest/private/unconstrained_execution.d.ts +2 -2
- package/dest/private/unconstrained_execution.d.ts.map +1 -1
- package/dest/private/unconstrained_execution.js +1 -2
- package/dest/private/unconstrained_execution_oracle.d.ts +1 -1
- package/dest/private/unconstrained_execution_oracle.d.ts.map +1 -1
- package/dest/private/unconstrained_execution_oracle.js +3 -3
- package/dest/public/avm/avm_simulator.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.js +0 -2
- package/dest/public/avm/journal/journal.js +1 -1
- package/dest/public/avm/test_utils.js +1 -1
- package/dest/public/public_db_sources.d.ts +1 -1
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +3 -3
- package/dest/testing.d.ts +2 -0
- package/dest/testing.d.ts.map +1 -0
- package/dest/testing.js +1 -0
- package/package.json +15 -14
- package/src/common/db_interfaces.ts +6 -13
- package/src/common/message_load_oracle_inputs.ts +8 -0
- package/src/private/acvm/acvm.ts +8 -24
- package/src/private/acvm/deserialize.ts +3 -30
- package/src/private/acvm/oracle/oracle.ts +144 -136
- package/src/private/acvm/oracle/typed_oracle.ts +2 -2
- package/src/private/execution_data_provider.ts +6 -10
- package/src/private/private_execution.ts +11 -7
- package/src/private/providers/acvm_native.ts +17 -6
- package/src/private/providers/acvm_wasm.ts +27 -20
- package/src/private/providers/acvm_wasm_with_blobs.ts +15 -12
- package/src/private/providers/circuit_recording/circuit_recorder.ts +283 -0
- package/src/private/providers/circuit_recording/simulation_provider_recorder_wrapper.ts +82 -0
- package/src/private/providers/simulation_provider.ts +30 -5
- package/src/private/simulator.ts +5 -3
- package/src/private/unconstrained_execution.ts +8 -4
- package/src/private/unconstrained_execution_oracle.ts +3 -6
- package/src/public/avm/avm_simulator.ts +0 -2
- package/src/public/avm/journal/journal.ts +1 -1
- package/src/public/avm/test_utils.ts +1 -1
- package/src/public/public_db_sources.ts +3 -3
- package/src/testing.ts +1 -0
- package/dest/public/avm/bytecode_utils.d.ts +0 -5
- package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
- package/dest/public/avm/bytecode_utils.js +0 -17
- package/src/public/avm/bytecode_utils.ts +0 -17
|
@@ -5,14 +5,7 @@ import { ContractClassLog, LogWithTxData } from '@aztec/stdlib/logs';
|
|
|
5
5
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
6
6
|
|
|
7
7
|
import type { ACVMField } from '../acvm_types.js';
|
|
8
|
-
import {
|
|
9
|
-
frToBoolean,
|
|
10
|
-
frToNumber,
|
|
11
|
-
fromACVMField,
|
|
12
|
-
fromBoundedVec,
|
|
13
|
-
fromUintArray,
|
|
14
|
-
fromUintBoundedVec,
|
|
15
|
-
} from '../deserialize.js';
|
|
8
|
+
import { fromBoundedVec, fromUintArray, fromUintBoundedVec } from '../deserialize.js';
|
|
16
9
|
import { bufferToBoundedVec, toACVMField, toACVMFieldSingleOrArray } from '../serialize.js';
|
|
17
10
|
import type { TypedOracle } from './typed_oracle.js';
|
|
18
11
|
|
|
@@ -22,46 +15,46 @@ import type { TypedOracle } from './typed_oracle.js';
|
|
|
22
15
|
export class Oracle {
|
|
23
16
|
constructor(private typedOracle: TypedOracle) {}
|
|
24
17
|
|
|
25
|
-
getRandomField(): ACVMField {
|
|
18
|
+
getRandomField(): Promise<ACVMField[]> {
|
|
26
19
|
const val = this.typedOracle.getRandomField();
|
|
27
|
-
return toACVMField(val);
|
|
20
|
+
return Promise.resolve([toACVMField(val)]);
|
|
28
21
|
}
|
|
29
22
|
|
|
30
23
|
// Since the argument is a slice, noir automatically adds a length field to oracle call.
|
|
31
|
-
async storeInExecutionCache(_length: ACVMField[], values: ACVMField[]): Promise<ACVMField> {
|
|
32
|
-
const hash = await this.typedOracle.storeInExecutionCache(values.map(
|
|
33
|
-
return toACVMField(hash);
|
|
24
|
+
async storeInExecutionCache(_length: ACVMField[], values: ACVMField[]): Promise<ACVMField[]> {
|
|
25
|
+
const hash = await this.typedOracle.storeInExecutionCache(values.map(Fr.fromString));
|
|
26
|
+
return [toACVMField(hash)];
|
|
34
27
|
}
|
|
35
28
|
|
|
36
|
-
async loadFromExecutionCache([returnsHash]: ACVMField[]): Promise<ACVMField[]> {
|
|
37
|
-
const values = await this.typedOracle.loadFromExecutionCache(
|
|
38
|
-
return values.map(toACVMField);
|
|
29
|
+
async loadFromExecutionCache([returnsHash]: ACVMField[]): Promise<ACVMField[][]> {
|
|
30
|
+
const values = await this.typedOracle.loadFromExecutionCache(Fr.fromString(returnsHash));
|
|
31
|
+
return [values.map(toACVMField)];
|
|
39
32
|
}
|
|
40
33
|
|
|
41
|
-
async getBlockNumber(): Promise<ACVMField> {
|
|
42
|
-
return toACVMField(await this.typedOracle.getBlockNumber());
|
|
34
|
+
async getBlockNumber(): Promise<ACVMField[]> {
|
|
35
|
+
return [toACVMField(await this.typedOracle.getBlockNumber())];
|
|
43
36
|
}
|
|
44
37
|
|
|
45
|
-
async getContractAddress(): Promise<ACVMField> {
|
|
46
|
-
return toACVMField(await this.typedOracle.getContractAddress());
|
|
38
|
+
async getContractAddress(): Promise<ACVMField[]> {
|
|
39
|
+
return [toACVMField(await this.typedOracle.getContractAddress())];
|
|
47
40
|
}
|
|
48
41
|
|
|
49
|
-
async getVersion(): Promise<ACVMField> {
|
|
50
|
-
return toACVMField(await this.typedOracle.getVersion());
|
|
42
|
+
async getVersion(): Promise<ACVMField[]> {
|
|
43
|
+
return [toACVMField(await this.typedOracle.getVersion())];
|
|
51
44
|
}
|
|
52
45
|
|
|
53
|
-
async getChainId(): Promise<ACVMField> {
|
|
54
|
-
return toACVMField(await this.typedOracle.getChainId());
|
|
46
|
+
async getChainId(): Promise<ACVMField[]> {
|
|
47
|
+
return [toACVMField(await this.typedOracle.getChainId())];
|
|
55
48
|
}
|
|
56
49
|
|
|
57
50
|
async getKeyValidationRequest([pkMHash]: ACVMField[]): Promise<ACVMField[]> {
|
|
58
|
-
const
|
|
51
|
+
const keyValidationRequest = await this.typedOracle.getKeyValidationRequest(Fr.fromString(pkMHash));
|
|
59
52
|
|
|
60
|
-
return
|
|
53
|
+
return keyValidationRequest.toFields().map(toACVMField);
|
|
61
54
|
}
|
|
62
55
|
|
|
63
|
-
async getContractInstance([address]: ACVMField[]) {
|
|
64
|
-
const instance = await this.typedOracle.getContractInstance(AztecAddress.fromField(
|
|
56
|
+
async getContractInstance([address]: ACVMField[]): Promise<ACVMField[]> {
|
|
57
|
+
const instance = await this.typedOracle.getContractInstance(AztecAddress.fromField(Fr.fromString(address)));
|
|
65
58
|
|
|
66
59
|
return [
|
|
67
60
|
instance.salt,
|
|
@@ -76,10 +69,10 @@ export class Oracle {
|
|
|
76
69
|
[blockNumber]: ACVMField[],
|
|
77
70
|
[treeId]: ACVMField[],
|
|
78
71
|
[leafValue]: ACVMField[],
|
|
79
|
-
): Promise<ACVMField[]> {
|
|
80
|
-
const parsedBlockNumber =
|
|
81
|
-
const parsedTreeId =
|
|
82
|
-
const parsedLeafValue =
|
|
72
|
+
): Promise<(ACVMField | ACVMField[])[]> {
|
|
73
|
+
const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
|
|
74
|
+
const parsedTreeId = Fr.fromString(treeId).toNumber();
|
|
75
|
+
const parsedLeafValue = Fr.fromString(leafValue);
|
|
83
76
|
|
|
84
77
|
const witness = await this.typedOracle.getMembershipWitness(parsedBlockNumber, parsedTreeId, parsedLeafValue);
|
|
85
78
|
if (!witness) {
|
|
@@ -87,29 +80,29 @@ export class Oracle {
|
|
|
87
80
|
`Leaf ${leafValue} not found in the tree ${MerkleTreeId[parsedTreeId]} at block ${parsedBlockNumber}.`,
|
|
88
81
|
);
|
|
89
82
|
}
|
|
90
|
-
return witness.map(toACVMField);
|
|
83
|
+
return [toACVMField(witness[0]), witness.slice(1).map(toACVMField)];
|
|
91
84
|
}
|
|
92
85
|
|
|
93
86
|
async getNullifierMembershipWitness(
|
|
94
87
|
[blockNumber]: ACVMField[],
|
|
95
88
|
[nullifier]: ACVMField[], // nullifier, we try to find the witness for (to prove inclusion)
|
|
96
|
-
): Promise<ACVMField[]> {
|
|
97
|
-
const parsedBlockNumber =
|
|
98
|
-
const parsedNullifier =
|
|
89
|
+
): Promise<(ACVMField | ACVMField[])[]> {
|
|
90
|
+
const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
|
|
91
|
+
const parsedNullifier = Fr.fromString(nullifier);
|
|
99
92
|
|
|
100
93
|
const witness = await this.typedOracle.getNullifierMembershipWitness(parsedBlockNumber, parsedNullifier);
|
|
101
94
|
if (!witness) {
|
|
102
95
|
throw new Error(`Nullifier witness not found for nullifier ${parsedNullifier} at block ${parsedBlockNumber}.`);
|
|
103
96
|
}
|
|
104
|
-
return witness.
|
|
97
|
+
return witness.toNoirRepresentation();
|
|
105
98
|
}
|
|
106
99
|
|
|
107
100
|
async getLowNullifierMembershipWitness(
|
|
108
101
|
[blockNumber]: ACVMField[],
|
|
109
102
|
[nullifier]: ACVMField[], // nullifier, we try to find the low nullifier witness for (to prove non-inclusion)
|
|
110
|
-
): Promise<ACVMField[]> {
|
|
111
|
-
const parsedBlockNumber =
|
|
112
|
-
const parsedNullifier =
|
|
103
|
+
): Promise<(ACVMField | ACVMField[])[]> {
|
|
104
|
+
const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
|
|
105
|
+
const parsedNullifier = Fr.fromString(nullifier);
|
|
113
106
|
|
|
114
107
|
const witness = await this.typedOracle.getLowNullifierMembershipWitness(parsedBlockNumber, parsedNullifier);
|
|
115
108
|
if (!witness) {
|
|
@@ -117,22 +110,25 @@ export class Oracle {
|
|
|
117
110
|
`Low nullifier witness not found for nullifier ${parsedNullifier} at block ${parsedBlockNumber}.`,
|
|
118
111
|
);
|
|
119
112
|
}
|
|
120
|
-
return witness.
|
|
113
|
+
return witness.toNoirRepresentation();
|
|
121
114
|
}
|
|
122
115
|
|
|
123
|
-
async
|
|
124
|
-
|
|
125
|
-
|
|
116
|
+
async getPublicDataWitness(
|
|
117
|
+
[blockNumber]: ACVMField[],
|
|
118
|
+
[leafSlot]: ACVMField[],
|
|
119
|
+
): Promise<(ACVMField | ACVMField[])[]> {
|
|
120
|
+
const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
|
|
121
|
+
const parsedLeafSlot = Fr.fromString(leafSlot);
|
|
126
122
|
|
|
127
|
-
const witness = await this.typedOracle.
|
|
123
|
+
const witness = await this.typedOracle.getPublicDataWitness(parsedBlockNumber, parsedLeafSlot);
|
|
128
124
|
if (!witness) {
|
|
129
125
|
throw new Error(`Public data witness not found for slot ${parsedLeafSlot} at block ${parsedBlockNumber}.`);
|
|
130
126
|
}
|
|
131
|
-
return witness.
|
|
127
|
+
return witness.toNoirRepresentation();
|
|
132
128
|
}
|
|
133
129
|
|
|
134
130
|
async getBlockHeader([blockNumber]: ACVMField[]): Promise<ACVMField[]> {
|
|
135
|
-
const parsedBlockNumber =
|
|
131
|
+
const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
|
|
136
132
|
|
|
137
133
|
const header = await this.typedOracle.getBlockHeader(parsedBlockNumber);
|
|
138
134
|
if (!header) {
|
|
@@ -141,20 +137,20 @@ export class Oracle {
|
|
|
141
137
|
return header.toFields().map(toACVMField);
|
|
142
138
|
}
|
|
143
139
|
|
|
144
|
-
async getAuthWitness([messageHash]: ACVMField[]): Promise<ACVMField[]> {
|
|
145
|
-
const messageHashField =
|
|
140
|
+
async getAuthWitness([messageHash]: ACVMField[]): Promise<ACVMField[][]> {
|
|
141
|
+
const messageHashField = Fr.fromString(messageHash);
|
|
146
142
|
const witness = await this.typedOracle.getAuthWitness(messageHashField);
|
|
147
143
|
if (!witness) {
|
|
148
144
|
throw new Error(`Unknown auth witness for message hash ${messageHashField}`);
|
|
149
145
|
}
|
|
150
|
-
return witness.map(toACVMField);
|
|
146
|
+
return [witness.map(toACVMField)];
|
|
151
147
|
}
|
|
152
148
|
|
|
153
|
-
async getPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<ACVMField[]> {
|
|
154
|
-
const parsedAddress = AztecAddress.fromField(
|
|
149
|
+
async getPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<ACVMField[][]> {
|
|
150
|
+
const parsedAddress = AztecAddress.fromField(Fr.fromString(address));
|
|
155
151
|
const { publicKeys, partialAddress } = await this.typedOracle.getCompleteAddress(parsedAddress);
|
|
156
152
|
|
|
157
|
-
return [...publicKeys.toFields(), partialAddress].map(toACVMField);
|
|
153
|
+
return [[...publicKeys.toFields(), partialAddress].map(toACVMField)];
|
|
158
154
|
}
|
|
159
155
|
|
|
160
156
|
async getNotes(
|
|
@@ -173,14 +169,14 @@ export class Oracle {
|
|
|
173
169
|
[offset]: ACVMField[],
|
|
174
170
|
[status]: ACVMField[],
|
|
175
171
|
[returnSize]: ACVMField[],
|
|
176
|
-
): Promise<ACVMField[]> {
|
|
172
|
+
): Promise<ACVMField[][]> {
|
|
177
173
|
const noteDatas = await this.typedOracle.getNotes(
|
|
178
|
-
|
|
174
|
+
Fr.fromString(storageSlot),
|
|
179
175
|
+numSelects,
|
|
180
176
|
selectByIndexes.map(s => +s),
|
|
181
177
|
selectByOffsets.map(s => +s),
|
|
182
178
|
selectByLengths.map(s => +s),
|
|
183
|
-
selectValues.map(
|
|
179
|
+
selectValues.map(Fr.fromString),
|
|
184
180
|
selectComparators.map(s => +s),
|
|
185
181
|
sortByIndexes.map(s => +s),
|
|
186
182
|
sortByOffsets.map(s => +s),
|
|
@@ -216,7 +212,7 @@ export class Oracle {
|
|
|
216
212
|
}
|
|
217
213
|
|
|
218
214
|
const paddedZeros = Array(returnFieldSize - returnData.length).fill(toACVMField(0));
|
|
219
|
-
return returnData.concat(paddedZeros);
|
|
215
|
+
return [returnData.concat(paddedZeros)];
|
|
220
216
|
}
|
|
221
217
|
|
|
222
218
|
notifyCreatedNote(
|
|
@@ -225,47 +221,47 @@ export class Oracle {
|
|
|
225
221
|
note: ACVMField[],
|
|
226
222
|
[noteHash]: ACVMField[],
|
|
227
223
|
[counter]: ACVMField[],
|
|
228
|
-
): ACVMField {
|
|
224
|
+
): Promise<ACVMField[]> {
|
|
229
225
|
this.typedOracle.notifyCreatedNote(
|
|
230
|
-
|
|
231
|
-
NoteSelector.fromField(
|
|
232
|
-
note.map(
|
|
233
|
-
|
|
226
|
+
Fr.fromString(storageSlot),
|
|
227
|
+
NoteSelector.fromField(Fr.fromString(noteTypeId)),
|
|
228
|
+
note.map(Fr.fromString),
|
|
229
|
+
Fr.fromString(noteHash),
|
|
234
230
|
+counter,
|
|
235
231
|
);
|
|
236
|
-
return
|
|
232
|
+
return Promise.resolve([]);
|
|
237
233
|
}
|
|
238
234
|
|
|
239
235
|
async notifyNullifiedNote(
|
|
240
236
|
[innerNullifier]: ACVMField[],
|
|
241
237
|
[noteHash]: ACVMField[],
|
|
242
238
|
[counter]: ACVMField[],
|
|
243
|
-
): Promise<ACVMField> {
|
|
244
|
-
await this.typedOracle.notifyNullifiedNote(
|
|
245
|
-
return
|
|
239
|
+
): Promise<ACVMField[]> {
|
|
240
|
+
await this.typedOracle.notifyNullifiedNote(Fr.fromString(innerNullifier), Fr.fromString(noteHash), +counter);
|
|
241
|
+
return [];
|
|
246
242
|
}
|
|
247
243
|
|
|
248
|
-
async notifyCreatedNullifier([innerNullifier]: ACVMField[]): Promise<ACVMField> {
|
|
249
|
-
await this.typedOracle.notifyCreatedNullifier(
|
|
250
|
-
return
|
|
244
|
+
async notifyCreatedNullifier([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
|
|
245
|
+
await this.typedOracle.notifyCreatedNullifier(Fr.fromString(innerNullifier));
|
|
246
|
+
return [];
|
|
251
247
|
}
|
|
252
248
|
|
|
253
|
-
async checkNullifierExists([innerNullifier]: ACVMField[]): Promise<ACVMField> {
|
|
254
|
-
const exists = await this.typedOracle.checkNullifierExists(
|
|
255
|
-
return toACVMField(exists);
|
|
249
|
+
async checkNullifierExists([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
|
|
250
|
+
const exists = await this.typedOracle.checkNullifierExists(Fr.fromString(innerNullifier));
|
|
251
|
+
return [toACVMField(exists)];
|
|
256
252
|
}
|
|
257
253
|
|
|
258
254
|
async getL1ToL2MembershipWitness(
|
|
259
255
|
[contractAddress]: ACVMField[],
|
|
260
256
|
[messageHash]: ACVMField[],
|
|
261
257
|
[secret]: ACVMField[],
|
|
262
|
-
): Promise<ACVMField[]> {
|
|
258
|
+
): Promise<(ACVMField | ACVMField[])[]> {
|
|
263
259
|
const message = await this.typedOracle.getL1ToL2MembershipWitness(
|
|
264
260
|
AztecAddress.fromString(contractAddress),
|
|
265
|
-
|
|
266
|
-
|
|
261
|
+
Fr.fromString(messageHash),
|
|
262
|
+
Fr.fromString(secret),
|
|
267
263
|
);
|
|
268
|
-
return message.
|
|
264
|
+
return message.toNoirRepresentation();
|
|
269
265
|
}
|
|
270
266
|
|
|
271
267
|
async storageRead(
|
|
@@ -273,32 +269,38 @@ export class Oracle {
|
|
|
273
269
|
[startStorageSlot]: ACVMField[],
|
|
274
270
|
[blockNumber]: ACVMField[],
|
|
275
271
|
[numberOfElements]: ACVMField[],
|
|
276
|
-
): Promise<ACVMField[]> {
|
|
272
|
+
): Promise<ACVMField[][]> {
|
|
277
273
|
const values = await this.typedOracle.storageRead(
|
|
278
|
-
new AztecAddress(
|
|
279
|
-
|
|
274
|
+
new AztecAddress(Fr.fromString(contractAddress)),
|
|
275
|
+
Fr.fromString(startStorageSlot),
|
|
280
276
|
+blockNumber,
|
|
281
277
|
+numberOfElements,
|
|
282
278
|
);
|
|
283
|
-
return values.map(toACVMField);
|
|
279
|
+
return [values.map(toACVMField)];
|
|
284
280
|
}
|
|
285
281
|
|
|
286
282
|
async storageWrite([startStorageSlot]: ACVMField[], values: ACVMField[]): Promise<ACVMField[]> {
|
|
287
|
-
const newValues = await this.typedOracle.storageWrite(
|
|
283
|
+
const newValues = await this.typedOracle.storageWrite(Fr.fromString(startStorageSlot), values.map(Fr.fromString));
|
|
288
284
|
return newValues.map(toACVMField);
|
|
289
285
|
}
|
|
290
286
|
|
|
291
|
-
notifyCreatedContractClassLog(
|
|
292
|
-
|
|
293
|
-
|
|
287
|
+
notifyCreatedContractClassLog(
|
|
288
|
+
[contractAddress]: ACVMField[],
|
|
289
|
+
message: ACVMField[],
|
|
290
|
+
[counter]: ACVMField[],
|
|
291
|
+
): Promise<ACVMField[]> {
|
|
292
|
+
const logPayload = message.map(Fr.fromString);
|
|
293
|
+
const log = new ContractClassLog(new AztecAddress(Fr.fromString(contractAddress)), logPayload);
|
|
294
294
|
|
|
295
295
|
this.typedOracle.notifyCreatedContractClassLog(log, +counter);
|
|
296
|
+
return Promise.resolve([]);
|
|
296
297
|
}
|
|
297
298
|
|
|
298
|
-
debugLog(message: ACVMField[], _ignoredFieldsSize: ACVMField[], fields: ACVMField[]):
|
|
299
|
-
const messageStr = message.map(acvmField => String.fromCharCode(
|
|
300
|
-
const fieldsFr = fields.map(
|
|
299
|
+
debugLog(message: ACVMField[], _ignoredFieldsSize: ACVMField[], fields: ACVMField[]): Promise<ACVMField[]> {
|
|
300
|
+
const messageStr = message.map(acvmField => String.fromCharCode(Fr.fromString(acvmField).toNumber())).join('');
|
|
301
|
+
const fieldsFr = fields.map(Fr.fromString);
|
|
301
302
|
this.typedOracle.debugLog(messageStr, fieldsFr);
|
|
303
|
+
return Promise.resolve([]);
|
|
302
304
|
}
|
|
303
305
|
|
|
304
306
|
async callPrivateFunction(
|
|
@@ -307,15 +309,15 @@ export class Oracle {
|
|
|
307
309
|
[argsHash]: ACVMField[],
|
|
308
310
|
[sideEffectCounter]: ACVMField[],
|
|
309
311
|
[isStaticCall]: ACVMField[],
|
|
310
|
-
): Promise<ACVMField[]> {
|
|
312
|
+
): Promise<ACVMField[][]> {
|
|
311
313
|
const { endSideEffectCounter, returnsHash } = await this.typedOracle.callPrivateFunction(
|
|
312
|
-
AztecAddress.fromField(
|
|
313
|
-
FunctionSelector.fromField(
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
314
|
+
AztecAddress.fromField(Fr.fromString(contractAddress)),
|
|
315
|
+
FunctionSelector.fromField(Fr.fromString(functionSelector)),
|
|
316
|
+
Fr.fromString(argsHash),
|
|
317
|
+
Fr.fromString(sideEffectCounter).toNumber(),
|
|
318
|
+
Fr.fromString(isStaticCall).toBool(),
|
|
317
319
|
);
|
|
318
|
-
return [endSideEffectCounter, returnsHash].map(toACVMField);
|
|
320
|
+
return [[endSideEffectCounter, returnsHash].map(toACVMField)];
|
|
319
321
|
}
|
|
320
322
|
|
|
321
323
|
async enqueuePublicFunctionCall(
|
|
@@ -324,15 +326,15 @@ export class Oracle {
|
|
|
324
326
|
[argsHash]: ACVMField[],
|
|
325
327
|
[sideEffectCounter]: ACVMField[],
|
|
326
328
|
[isStaticCall]: ACVMField[],
|
|
327
|
-
): Promise<ACVMField> {
|
|
329
|
+
): Promise<ACVMField[]> {
|
|
328
330
|
const newArgsHash = await this.typedOracle.enqueuePublicFunctionCall(
|
|
329
331
|
AztecAddress.fromString(contractAddress),
|
|
330
|
-
FunctionSelector.fromField(
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
332
|
+
FunctionSelector.fromField(Fr.fromString(functionSelector)),
|
|
333
|
+
Fr.fromString(argsHash),
|
|
334
|
+
Fr.fromString(sideEffectCounter).toNumber(),
|
|
335
|
+
Fr.fromString(isStaticCall).toBool(),
|
|
334
336
|
);
|
|
335
|
-
return toACVMField(newArgsHash);
|
|
337
|
+
return [toACVMField(newArgsHash)];
|
|
336
338
|
}
|
|
337
339
|
|
|
338
340
|
async setPublicTeardownFunctionCall(
|
|
@@ -341,38 +343,41 @@ export class Oracle {
|
|
|
341
343
|
[argsHash]: ACVMField[],
|
|
342
344
|
[sideEffectCounter]: ACVMField[],
|
|
343
345
|
[isStaticCall]: ACVMField[],
|
|
344
|
-
): Promise<ACVMField> {
|
|
346
|
+
): Promise<ACVMField[]> {
|
|
345
347
|
const newArgsHash = await this.typedOracle.setPublicTeardownFunctionCall(
|
|
346
348
|
AztecAddress.fromString(contractAddress),
|
|
347
|
-
FunctionSelector.fromField(
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
349
|
+
FunctionSelector.fromField(Fr.fromString(functionSelector)),
|
|
350
|
+
Fr.fromString(argsHash),
|
|
351
|
+
Fr.fromString(sideEffectCounter).toNumber(),
|
|
352
|
+
Fr.fromString(isStaticCall).toBool(),
|
|
351
353
|
);
|
|
352
|
-
return toACVMField(newArgsHash);
|
|
354
|
+
return [toACVMField(newArgsHash)];
|
|
353
355
|
}
|
|
354
356
|
|
|
355
|
-
notifySetMinRevertibleSideEffectCounter([minRevertibleSideEffectCounter]: ACVMField[]) {
|
|
356
|
-
this.typedOracle.notifySetMinRevertibleSideEffectCounter(
|
|
357
|
+
notifySetMinRevertibleSideEffectCounter([minRevertibleSideEffectCounter]: ACVMField[]): Promise<ACVMField[]> {
|
|
358
|
+
this.typedOracle.notifySetMinRevertibleSideEffectCounter(Fr.fromString(minRevertibleSideEffectCounter).toNumber());
|
|
359
|
+
return Promise.resolve([]);
|
|
357
360
|
}
|
|
358
361
|
|
|
359
|
-
async getIndexedTaggingSecretAsSender([sender]: ACVMField[], [recipient]: ACVMField[]): Promise<ACVMField[]> {
|
|
362
|
+
async getIndexedTaggingSecretAsSender([sender]: ACVMField[], [recipient]: ACVMField[]): Promise<ACVMField[][]> {
|
|
360
363
|
const taggingSecret = await this.typedOracle.getIndexedTaggingSecretAsSender(
|
|
361
364
|
AztecAddress.fromString(sender),
|
|
362
365
|
AztecAddress.fromString(recipient),
|
|
363
366
|
);
|
|
364
|
-
return taggingSecret.toFields().map(toACVMField);
|
|
367
|
+
return [taggingSecret.toFields().map(toACVMField)];
|
|
365
368
|
}
|
|
366
369
|
|
|
367
|
-
async incrementAppTaggingSecretIndexAsSender([sender]: ACVMField[], [recipient]: ACVMField[]) {
|
|
370
|
+
async incrementAppTaggingSecretIndexAsSender([sender]: ACVMField[], [recipient]: ACVMField[]): Promise<ACVMField[]> {
|
|
368
371
|
await this.typedOracle.incrementAppTaggingSecretIndexAsSender(
|
|
369
372
|
AztecAddress.fromString(sender),
|
|
370
373
|
AztecAddress.fromString(recipient),
|
|
371
374
|
);
|
|
375
|
+
return [];
|
|
372
376
|
}
|
|
373
377
|
|
|
374
|
-
async syncNotes() {
|
|
378
|
+
async syncNotes(): Promise<ACVMField[]> {
|
|
375
379
|
await this.typedOracle.syncNotes();
|
|
380
|
+
return [];
|
|
376
381
|
}
|
|
377
382
|
|
|
378
383
|
async deliverNote(
|
|
@@ -385,26 +390,26 @@ export class Oracle {
|
|
|
385
390
|
[nullifier]: ACVMField[],
|
|
386
391
|
[txHash]: ACVMField[],
|
|
387
392
|
[recipient]: ACVMField[],
|
|
388
|
-
): Promise<ACVMField> {
|
|
393
|
+
): Promise<ACVMField[]> {
|
|
389
394
|
// TODO(#10728): try-catch this block and return false if we get an exception so that the contract can decide what
|
|
390
395
|
// to do if a note fails delivery (e.g. not increment the tagging index, or add it to some pending work list).
|
|
391
396
|
// Delivery might fail due to temporary issues, such as poor node connectivity.
|
|
392
397
|
await this.typedOracle.deliverNote(
|
|
393
398
|
AztecAddress.fromString(contractAddress),
|
|
394
|
-
|
|
395
|
-
|
|
399
|
+
Fr.fromString(storageSlot),
|
|
400
|
+
Fr.fromString(nonce),
|
|
396
401
|
fromBoundedVec(content, contentLength),
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
402
|
+
Fr.fromString(noteHash),
|
|
403
|
+
Fr.fromString(nullifier),
|
|
404
|
+
Fr.fromString(txHash),
|
|
400
405
|
AztecAddress.fromString(recipient),
|
|
401
406
|
);
|
|
402
407
|
|
|
403
|
-
return toACVMField(true);
|
|
408
|
+
return [toACVMField(true)];
|
|
404
409
|
}
|
|
405
410
|
|
|
406
411
|
async getLogByTag([tag]: ACVMField[]): Promise<(ACVMField | ACVMField[])[]> {
|
|
407
|
-
const log = await this.typedOracle.getLogByTag(
|
|
412
|
+
const log = await this.typedOracle.getLogByTag(Fr.fromString(tag));
|
|
408
413
|
|
|
409
414
|
if (log == null) {
|
|
410
415
|
return [toACVMField(0), ...LogWithTxData.noirSerializationOfEmpty().map(toACVMFieldSingleOrArray)];
|
|
@@ -413,12 +418,13 @@ export class Oracle {
|
|
|
413
418
|
}
|
|
414
419
|
}
|
|
415
420
|
|
|
416
|
-
async storeCapsule([contractAddress]: ACVMField[], [slot]: ACVMField[], capsule: ACVMField[]) {
|
|
421
|
+
async storeCapsule([contractAddress]: ACVMField[], [slot]: ACVMField[], capsule: ACVMField[]): Promise<ACVMField[]> {
|
|
417
422
|
await this.typedOracle.storeCapsule(
|
|
418
|
-
AztecAddress.fromField(
|
|
419
|
-
|
|
420
|
-
capsule.map(
|
|
423
|
+
AztecAddress.fromField(Fr.fromString(contractAddress)),
|
|
424
|
+
Fr.fromString(slot),
|
|
425
|
+
capsule.map(Fr.fromString),
|
|
421
426
|
);
|
|
427
|
+
return [];
|
|
422
428
|
}
|
|
423
429
|
|
|
424
430
|
async loadCapsule(
|
|
@@ -427,23 +433,24 @@ export class Oracle {
|
|
|
427
433
|
[tSize]: ACVMField[],
|
|
428
434
|
): Promise<(ACVMField | ACVMField[])[]> {
|
|
429
435
|
const values = await this.typedOracle.loadCapsule(
|
|
430
|
-
AztecAddress.fromField(
|
|
431
|
-
|
|
436
|
+
AztecAddress.fromField(Fr.fromString(contractAddress)),
|
|
437
|
+
Fr.fromString(slot),
|
|
432
438
|
);
|
|
433
439
|
|
|
434
440
|
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
435
441
|
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
436
442
|
if (values === null) {
|
|
437
443
|
// No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
|
|
438
|
-
return [toACVMField(0), Array(
|
|
444
|
+
return [toACVMField(0), Array(Fr.fromString(tSize).toNumber()).fill(toACVMField(0))];
|
|
439
445
|
} else {
|
|
440
446
|
// Data was found so we set `some` to 1 and return it along with `value`.
|
|
441
447
|
return [toACVMField(1), values.map(toACVMField)];
|
|
442
448
|
}
|
|
443
449
|
}
|
|
444
450
|
|
|
445
|
-
async deleteCapsule([contractAddress]: ACVMField[], [slot]: ACVMField[]) {
|
|
446
|
-
await this.typedOracle.deleteCapsule(AztecAddress.fromField(
|
|
451
|
+
async deleteCapsule([contractAddress]: ACVMField[], [slot]: ACVMField[]): Promise<ACVMField[]> {
|
|
452
|
+
await this.typedOracle.deleteCapsule(AztecAddress.fromField(Fr.fromString(contractAddress)), Fr.fromString(slot));
|
|
453
|
+
return [];
|
|
447
454
|
}
|
|
448
455
|
|
|
449
456
|
async copyCapsule(
|
|
@@ -451,13 +458,14 @@ export class Oracle {
|
|
|
451
458
|
[srcSlot]: ACVMField[],
|
|
452
459
|
[dstSlot]: ACVMField[],
|
|
453
460
|
[numEntries]: ACVMField[],
|
|
454
|
-
) {
|
|
461
|
+
): Promise<ACVMField[]> {
|
|
455
462
|
await this.typedOracle.copyCapsule(
|
|
456
|
-
AztecAddress.fromField(
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
463
|
+
AztecAddress.fromField(Fr.fromString(contractAddress)),
|
|
464
|
+
Fr.fromString(srcSlot),
|
|
465
|
+
Fr.fromString(dstSlot),
|
|
466
|
+
Fr.fromString(numEntries).toNumber(),
|
|
460
467
|
);
|
|
468
|
+
return [];
|
|
461
469
|
}
|
|
462
470
|
|
|
463
471
|
async aes128Decrypt(
|
|
@@ -481,8 +489,8 @@ export class Oracle {
|
|
|
481
489
|
[ephPKField2]: ACVMField[],
|
|
482
490
|
): Promise<ACVMField[]> {
|
|
483
491
|
const secret = await this.typedOracle.getSharedSecret(
|
|
484
|
-
AztecAddress.fromField(
|
|
485
|
-
Point.fromFields([ephPKField0, ephPKField1, ephPKField2].map(
|
|
492
|
+
AztecAddress.fromField(Fr.fromString(address)),
|
|
493
|
+
Point.fromFields([ephPKField0, ephPKField1, ephPKField2].map(Fr.fromString)),
|
|
486
494
|
);
|
|
487
495
|
return secret.toFields().map(toACVMField);
|
|
488
496
|
}
|
|
@@ -87,8 +87,8 @@ export abstract class TypedOracle {
|
|
|
87
87
|
return Promise.reject(new OracleMethodNotAvailableError('getNullifierMembershipWitness'));
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
return Promise.reject(new OracleMethodNotAvailableError('
|
|
90
|
+
getPublicDataWitness(_blockNumber: number, _leafSlot: Fr): Promise<PublicDataWitness | undefined> {
|
|
91
|
+
return Promise.reject(new OracleMethodNotAvailableError('getPublicDataWitness'));
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
getLowNullifierMembershipWitness(
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Fr, Point } from '@aztec/foundation/fields';
|
|
2
|
-
import type { FunctionArtifact, FunctionSelector } from '@aztec/stdlib/abi';
|
|
2
|
+
import type { FunctionArtifact, FunctionArtifactWithContractName, FunctionSelector } from '@aztec/stdlib/abi';
|
|
3
3
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
4
|
import type { L2Block } from '@aztec/stdlib/block';
|
|
5
5
|
import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
|
|
@@ -49,13 +49,6 @@ export interface ExecutionDataProvider extends CommitmentsDBInterface {
|
|
|
49
49
|
*/
|
|
50
50
|
getCompleteAddress(account: AztecAddress): Promise<CompleteAddress>;
|
|
51
51
|
|
|
52
|
-
/**
|
|
53
|
-
* Retrieve the auth witness for a given message hash.
|
|
54
|
-
* @param messageHash - The message hash.
|
|
55
|
-
* @returns A Promise that resolves to an array of field elements representing the auth witness.
|
|
56
|
-
*/
|
|
57
|
-
getAuthWitness(messageHash: Fr): Promise<Fr[] | undefined>;
|
|
58
|
-
|
|
59
52
|
/**
|
|
60
53
|
* Retrieve keys associated with a specific master public key and app address.
|
|
61
54
|
* @param pkMHash - The master public key hash.
|
|
@@ -90,7 +83,10 @@ export interface ExecutionDataProvider extends CommitmentsDBInterface {
|
|
|
90
83
|
* @param selector - The corresponding function selector.
|
|
91
84
|
* @returns A Promise that resolves to a FunctionArtifact object.
|
|
92
85
|
*/
|
|
93
|
-
getFunctionArtifact(
|
|
86
|
+
getFunctionArtifact(
|
|
87
|
+
contractAddress: AztecAddress,
|
|
88
|
+
selector: FunctionSelector,
|
|
89
|
+
): Promise<FunctionArtifactWithContractName>;
|
|
94
90
|
|
|
95
91
|
/**
|
|
96
92
|
* Generates a stable function name for debug purposes.
|
|
@@ -157,7 +153,7 @@ export interface ExecutionDataProvider extends CommitmentsDBInterface {
|
|
|
157
153
|
* @param blockNumber - The block number at which to get the witness.
|
|
158
154
|
* @param leafSlot - The slot of the public data in the public data tree.
|
|
159
155
|
*/
|
|
160
|
-
|
|
156
|
+
getPublicDataWitness(blockNumber: number, leafSlot: Fr): Promise<PublicDataWitness | undefined>;
|
|
161
157
|
|
|
162
158
|
/**
|
|
163
159
|
* Gets the storage value at the given contract storage slot.
|
|
@@ -3,7 +3,12 @@ import { Fr } from '@aztec/foundation/fields';
|
|
|
3
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { Timer } from '@aztec/foundation/timer';
|
|
5
5
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
type FunctionArtifact,
|
|
8
|
+
type FunctionArtifactWithContractName,
|
|
9
|
+
type FunctionSelector,
|
|
10
|
+
countArgumentsSize,
|
|
11
|
+
} from '@aztec/stdlib/abi';
|
|
7
12
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
8
13
|
import type { ContractInstance } from '@aztec/stdlib/contract';
|
|
9
14
|
import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
@@ -13,7 +18,7 @@ import type { CircuitWitnessGenerationStats } from '@aztec/stdlib/stats';
|
|
|
13
18
|
import { PrivateCallExecutionResult } from '@aztec/stdlib/tx';
|
|
14
19
|
|
|
15
20
|
import { ExecutionError, resolveAssertionMessageFromError } from '../common/errors.js';
|
|
16
|
-
import {
|
|
21
|
+
import { witnessMapToFields } from './acvm/deserialize.js';
|
|
17
22
|
import { type ACVMWitness, Oracle, extractCallStack } from './acvm/index.js';
|
|
18
23
|
import type { ExecutionDataProvider } from './execution_data_provider.js';
|
|
19
24
|
import type { PrivateExecutionOracle } from './private_execution_oracle.js';
|
|
@@ -25,19 +30,18 @@ import type { SimulationProvider } from './providers/simulation_provider.js';
|
|
|
25
30
|
export async function executePrivateFunction(
|
|
26
31
|
simulator: SimulationProvider,
|
|
27
32
|
privateExecutionOracle: PrivateExecutionOracle,
|
|
28
|
-
artifact:
|
|
33
|
+
artifact: FunctionArtifactWithContractName,
|
|
29
34
|
contractAddress: AztecAddress,
|
|
30
35
|
functionSelector: FunctionSelector,
|
|
31
36
|
log = createLogger('simulator:private_execution'),
|
|
32
37
|
): Promise<PrivateCallExecutionResult> {
|
|
33
38
|
const functionName = await privateExecutionOracle.getDebugFunctionName();
|
|
34
39
|
log.verbose(`Executing private function ${functionName}`, { contract: contractAddress });
|
|
35
|
-
const acir = artifact.bytecode;
|
|
36
40
|
const initialWitness = privateExecutionOracle.getInitialWitness(artifact);
|
|
37
41
|
const acvmCallback = new Oracle(privateExecutionOracle);
|
|
38
42
|
const timer = new Timer();
|
|
39
43
|
const acirExecutionResult = await simulator
|
|
40
|
-
.executeUserCircuit(
|
|
44
|
+
.executeUserCircuit(initialWitness, artifact, acvmCallback)
|
|
41
45
|
.catch((err: Error) => {
|
|
42
46
|
err.message = resolveAssertionMessageFromError(err, artifact);
|
|
43
47
|
throw new ExecutionError(
|
|
@@ -79,7 +83,7 @@ export async function executePrivateFunction(
|
|
|
79
83
|
log.debug(`Returning from call to ${contractAddress.toString()}:${functionSelector}`);
|
|
80
84
|
|
|
81
85
|
return new PrivateCallExecutionResult(
|
|
82
|
-
|
|
86
|
+
artifact.bytecode,
|
|
83
87
|
Buffer.from(artifact.verificationKey!, 'base64'),
|
|
84
88
|
partialWitness,
|
|
85
89
|
publicInputs,
|
|
@@ -113,7 +117,7 @@ export function extractPrivateCircuitPublicInputs(
|
|
|
113
117
|
if (returnedField === undefined) {
|
|
114
118
|
throw new Error(`Missing return value for index ${i}`);
|
|
115
119
|
}
|
|
116
|
-
returnData.push(
|
|
120
|
+
returnData.push(Fr.fromString(returnedField));
|
|
117
121
|
}
|
|
118
122
|
return PrivateCircuitPublicInputs.fromFields(returnData);
|
|
119
123
|
}
|