@aztec/txe 0.0.1-commit.23b0eb0 → 0.0.1-commit.2448fdb
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/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +88 -54
- package/dest/oracle/interfaces.d.ts +29 -28
- package/dest/oracle/interfaces.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.d.ts +13 -13
- package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.js +12 -12
- package/dest/oracle/txe_oracle_top_level_context.d.ts +28 -23
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +143 -58
- package/dest/rpc_translator.d.ts +121 -83
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +394 -159
- package/dest/state_machine/archiver.d.ts +3 -3
- package/dest/state_machine/archiver.d.ts.map +1 -1
- package/dest/state_machine/archiver.js +7 -7
- package/dest/state_machine/dummy_p2p_client.d.ts +16 -12
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +28 -16
- package/dest/state_machine/index.d.ts +7 -5
- package/dest/state_machine/index.d.ts.map +1 -1
- package/dest/state_machine/index.js +19 -10
- package/dest/state_machine/mock_epoch_cache.d.ts +3 -1
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +4 -0
- package/dest/state_machine/synchronizer.d.ts +5 -5
- package/dest/state_machine/synchronizer.d.ts.map +1 -1
- package/dest/state_machine/synchronizer.js +3 -3
- package/dest/txe_session.d.ts +10 -6
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +96 -25
- package/dest/util/encoding.d.ts +40 -41
- package/dest/util/encoding.d.ts.map +1 -1
- package/dest/util/txe_public_contract_data_source.d.ts +2 -3
- package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
- package/dest/util/txe_public_contract_data_source.js +5 -22
- package/dest/utils/block_creation.d.ts +1 -1
- package/dest/utils/block_creation.d.ts.map +1 -1
- package/dest/utils/block_creation.js +3 -1
- package/package.json +15 -15
- package/src/index.ts +89 -52
- package/src/oracle/interfaces.ts +32 -31
- package/src/oracle/txe_oracle_public_context.ts +12 -12
- package/src/oracle/txe_oracle_top_level_context.ts +156 -115
- package/src/rpc_translator.ts +450 -176
- package/src/state_machine/archiver.ts +7 -5
- package/src/state_machine/dummy_p2p_client.ts +40 -22
- package/src/state_machine/index.ts +29 -9
- package/src/state_machine/mock_epoch_cache.ts +5 -0
- package/src/state_machine/synchronizer.ts +4 -4
- package/src/txe_session.ts +102 -72
- package/src/util/txe_public_contract_data_source.ts +10 -36
- package/src/utils/block_creation.ts +3 -1
- package/dest/util/txe_contract_store.d.ts +0 -12
- package/dest/util/txe_contract_store.d.ts.map +0 -1
- package/dest/util/txe_contract_store.js +0 -22
- package/src/util/txe_contract_store.ts +0 -36
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS,
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
DEFAULT_TEARDOWN_DA_GAS_LIMIT,
|
|
6
|
-
DEFAULT_TEARDOWN_L2_GAS_LIMIT,
|
|
3
|
+
MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT,
|
|
4
|
+
MAX_PROCESSABLE_L2_GAS,
|
|
7
5
|
NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
|
|
8
6
|
} from '@aztec/constants';
|
|
9
7
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
@@ -14,15 +12,17 @@ import { TestDateProvider } from '@aztec/foundation/timer';
|
|
|
14
12
|
import type { KeyStore } from '@aztec/key-store';
|
|
15
13
|
import {
|
|
16
14
|
AddressStore,
|
|
15
|
+
CapsuleService,
|
|
17
16
|
CapsuleStore,
|
|
17
|
+
type ContractStore,
|
|
18
|
+
type ContractSyncService,
|
|
18
19
|
NoteStore,
|
|
19
|
-
|
|
20
|
+
ORACLE_VERSION_MAJOR,
|
|
20
21
|
PrivateEventStore,
|
|
21
22
|
RecipientTaggingStore,
|
|
22
23
|
SenderAddressBookStore,
|
|
23
24
|
SenderTaggingStore,
|
|
24
25
|
enrichPublicSimulationError,
|
|
25
|
-
syncState,
|
|
26
26
|
} from '@aztec/pxe/server';
|
|
27
27
|
import {
|
|
28
28
|
ExecutionNoteCache,
|
|
@@ -55,7 +55,13 @@ import { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
|
55
55
|
import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
|
|
56
56
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
57
57
|
import { type ContractInstanceWithAddress, computePartialAddress } from '@aztec/stdlib/contract';
|
|
58
|
-
import {
|
|
58
|
+
import {
|
|
59
|
+
FALLBACK_TEARDOWN_DA_GAS_LIMIT,
|
|
60
|
+
FALLBACK_TEARDOWN_L2_GAS_LIMIT,
|
|
61
|
+
Gas,
|
|
62
|
+
GasFees,
|
|
63
|
+
GasSettings,
|
|
64
|
+
} from '@aztec/stdlib/gas';
|
|
59
65
|
import { computeCalldataHash, computeProtocolNullifier, siloNullifier } from '@aztec/stdlib/hash';
|
|
60
66
|
import {
|
|
61
67
|
PartialPrivateTailPublicInputsForPublic,
|
|
@@ -84,7 +90,6 @@ import { ForkCheckpoint } from '@aztec/world-state';
|
|
|
84
90
|
import { DEFAULT_ADDRESS } from '../constants.js';
|
|
85
91
|
import type { TXEStateMachine } from '../state_machine/index.js';
|
|
86
92
|
import type { TXEAccountStore } from '../util/txe_account_store.js';
|
|
87
|
-
import type { TXEContractStore } from '../util/txe_contract_store.js';
|
|
88
93
|
import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js';
|
|
89
94
|
import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from '../utils/block_creation.js';
|
|
90
95
|
import type { ITxeExecutionOracle } from './interfaces.js';
|
|
@@ -97,7 +102,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
97
102
|
|
|
98
103
|
constructor(
|
|
99
104
|
private stateMachine: TXEStateMachine,
|
|
100
|
-
private contractStore:
|
|
105
|
+
private contractStore: ContractStore,
|
|
101
106
|
private noteStore: NoteStore,
|
|
102
107
|
private keyStore: KeyStore,
|
|
103
108
|
private addressStore: AddressStore,
|
|
@@ -107,57 +112,70 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
107
112
|
private senderAddressBookStore: SenderAddressBookStore,
|
|
108
113
|
private capsuleStore: CapsuleStore,
|
|
109
114
|
private privateEventStore: PrivateEventStore,
|
|
110
|
-
private jobId: string,
|
|
111
115
|
private nextBlockTimestamp: bigint,
|
|
112
116
|
private version: Fr,
|
|
113
117
|
private chainId: Fr,
|
|
114
118
|
private authwits: Map<string, AuthWitness>,
|
|
119
|
+
private readonly contractSyncService: ContractSyncService,
|
|
115
120
|
) {
|
|
116
121
|
this.logger = createLogger('txe:top_level_context');
|
|
117
122
|
this.logger.debug('Entering Top Level Context');
|
|
118
123
|
}
|
|
119
124
|
|
|
120
|
-
|
|
121
|
-
|
|
125
|
+
private contractOracleVersion: { major: number; minor: number } | undefined;
|
|
126
|
+
|
|
127
|
+
assertCompatibleOracleVersion(major: number, minor: number): void {
|
|
128
|
+
if (major !== ORACLE_VERSION_MAJOR) {
|
|
129
|
+
const hint =
|
|
130
|
+
major > ORACLE_VERSION_MAJOR
|
|
131
|
+
? 'The contract was compiled with a newer version of Aztec.nr than this aztec cli version supports. Upgrade your aztec cli version to a compatible version.'
|
|
132
|
+
: 'The contract was compiled with an older version of Aztec.nr than this aztec cli version supports. Recompile the contract with a compatible version of Aztec.nr.';
|
|
122
133
|
throw new Error(
|
|
123
|
-
`Incompatible
|
|
134
|
+
`Incompatible aztec cli version: ${hint} See https://docs.aztec.network/errors/8 (expected oracle major version ${ORACLE_VERSION_MAJOR}, got ${major})`,
|
|
124
135
|
);
|
|
125
136
|
}
|
|
137
|
+
this.contractOracleVersion = { major, minor };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Prefixed with "nonOracleFunction" as it is not used as an oracle handler.
|
|
141
|
+
nonOracleFunctionGetContractOracleVersion(): { major: number; minor: number } | undefined {
|
|
142
|
+
return this.contractOracleVersion;
|
|
126
143
|
}
|
|
127
144
|
|
|
128
145
|
// This is typically only invoked in private contexts, but it is convenient to also have it in top-level for testing
|
|
129
146
|
// setup.
|
|
130
|
-
|
|
147
|
+
getRandomField(): Fr {
|
|
131
148
|
return Fr.random();
|
|
132
149
|
}
|
|
133
150
|
|
|
134
151
|
// We instruct users to debug contracts via this oracle, so it makes sense that they'd expect it to also work in tests
|
|
135
|
-
|
|
152
|
+
log(level: number, message: string, fields: Fr[]): Promise<void> {
|
|
136
153
|
if (!LogLevels[level]) {
|
|
137
|
-
throw new Error(`Invalid
|
|
154
|
+
throw new Error(`Invalid log level: ${level}`);
|
|
138
155
|
}
|
|
139
156
|
const levelName = LogLevels[level];
|
|
140
157
|
|
|
141
158
|
this.logger[levelName](`${applyStringFormatting(message, fields)}`, { module: `${this.logger.module}:debug_log` });
|
|
159
|
+
return Promise.resolve();
|
|
142
160
|
}
|
|
143
161
|
|
|
144
|
-
|
|
162
|
+
getDefaultAddress(): AztecAddress {
|
|
145
163
|
return DEFAULT_ADDRESS;
|
|
146
164
|
}
|
|
147
165
|
|
|
148
|
-
async
|
|
166
|
+
async getNextBlockNumber(): Promise<BlockNumber> {
|
|
149
167
|
return BlockNumber((await this.getLastBlockNumber()) + 1);
|
|
150
168
|
}
|
|
151
169
|
|
|
152
|
-
|
|
170
|
+
getNextBlockTimestamp(): Promise<bigint> {
|
|
153
171
|
return Promise.resolve(this.nextBlockTimestamp);
|
|
154
172
|
}
|
|
155
173
|
|
|
156
|
-
async
|
|
174
|
+
async getLastBlockTimestamp() {
|
|
157
175
|
return (await this.stateMachine.node.getBlockHeader('latest'))!.globalVariables.timestamp;
|
|
158
176
|
}
|
|
159
177
|
|
|
160
|
-
async
|
|
178
|
+
async getLastTxEffects() {
|
|
161
179
|
const latestBlockNumber = await this.stateMachine.archiver.getBlockNumber();
|
|
162
180
|
const block = await this.stateMachine.archiver.getBlock(latestBlockNumber);
|
|
163
181
|
|
|
@@ -171,7 +189,26 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
171
189
|
return { txHash: txEffects.txHash, noteHashes: txEffects.noteHashes, nullifiers: txEffects.nullifiers };
|
|
172
190
|
}
|
|
173
191
|
|
|
174
|
-
async
|
|
192
|
+
async syncContractNonOracleMethod(contractAddress: AztecAddress, scope: AztecAddress, jobId: string) {
|
|
193
|
+
if (contractAddress.equals(DEFAULT_ADDRESS)) {
|
|
194
|
+
this.logger.debug(`Skipping sync in getPrivateEvents because the events correspond to the default address.`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
199
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(
|
|
200
|
+
contractAddress,
|
|
201
|
+
null,
|
|
202
|
+
async (call, execScopes) => {
|
|
203
|
+
await this.executeUtilityCall(call, execScopes, jobId);
|
|
204
|
+
},
|
|
205
|
+
blockHeader,
|
|
206
|
+
jobId,
|
|
207
|
+
[scope],
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
async getPrivateEvents(selector: EventSelector, contractAddress: AztecAddress, scope: AztecAddress) {
|
|
175
212
|
return (
|
|
176
213
|
await this.privateEventStore.getPrivateEvents(selector, {
|
|
177
214
|
contractAddress,
|
|
@@ -182,7 +219,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
182
219
|
).map(e => e.packedEvent);
|
|
183
220
|
}
|
|
184
221
|
|
|
185
|
-
async
|
|
222
|
+
async advanceBlocksBy(blocks: number) {
|
|
186
223
|
this.logger.debug(`time traveling ${blocks} blocks`);
|
|
187
224
|
|
|
188
225
|
for (let i = 0; i < blocks; i++) {
|
|
@@ -190,12 +227,12 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
190
227
|
}
|
|
191
228
|
}
|
|
192
229
|
|
|
193
|
-
|
|
230
|
+
advanceTimestampBy(duration: UInt64) {
|
|
194
231
|
this.logger.debug(`time traveling ${duration} seconds`);
|
|
195
232
|
this.nextBlockTimestamp += duration;
|
|
196
233
|
}
|
|
197
234
|
|
|
198
|
-
async
|
|
235
|
+
async deploy(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: Fr) {
|
|
199
236
|
// Emit deployment nullifier
|
|
200
237
|
await this.mineBlock({
|
|
201
238
|
nullifiers: [
|
|
@@ -207,20 +244,20 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
207
244
|
});
|
|
208
245
|
|
|
209
246
|
if (!secret.equals(Fr.ZERO)) {
|
|
210
|
-
await this.
|
|
247
|
+
await this.addAccount(artifact, instance, secret);
|
|
211
248
|
} else {
|
|
212
249
|
await this.contractStore.addContractInstance(instance);
|
|
213
|
-
await this.contractStore.addContractArtifact(
|
|
250
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
214
251
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
215
252
|
}
|
|
216
253
|
}
|
|
217
254
|
|
|
218
|
-
async
|
|
255
|
+
async addAccount(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: Fr) {
|
|
219
256
|
const partialAddress = await computePartialAddress(instance);
|
|
220
257
|
|
|
221
258
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
222
259
|
await this.contractStore.addContractInstance(instance);
|
|
223
|
-
await this.contractStore.addContractArtifact(
|
|
260
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
224
261
|
|
|
225
262
|
const completeAddress = await this.keyStore.addAccount(secret, partialAddress);
|
|
226
263
|
await this.accountStore.setAccount(completeAddress.address, completeAddress);
|
|
@@ -230,7 +267,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
230
267
|
return completeAddress;
|
|
231
268
|
}
|
|
232
269
|
|
|
233
|
-
async
|
|
270
|
+
async createAccount(secret: Fr) {
|
|
234
271
|
// This is a foot gun !
|
|
235
272
|
const completeAddress = await this.keyStore.addAccount(secret, secret);
|
|
236
273
|
await this.accountStore.setAccount(completeAddress.address, completeAddress);
|
|
@@ -240,7 +277,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
240
277
|
return completeAddress;
|
|
241
278
|
}
|
|
242
279
|
|
|
243
|
-
async
|
|
280
|
+
async addAuthWitness(address: AztecAddress, messageHash: Fr) {
|
|
244
281
|
const account = await this.accountStore.getAccount(address);
|
|
245
282
|
const privateKey = await this.keyStore.getMasterSecretKey(account.publicKeys.masterIncomingViewingPublicKey);
|
|
246
283
|
|
|
@@ -253,7 +290,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
253
290
|
}
|
|
254
291
|
|
|
255
292
|
async mineBlock(options: { nullifiers?: Fr[] } = {}) {
|
|
256
|
-
const blockNumber = await this.
|
|
293
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
257
294
|
|
|
258
295
|
const txEffect = TxEffect.empty();
|
|
259
296
|
txEffect.nullifiers = [getSingleTxBlockRequestHash(blockNumber), ...(options.nullifiers ?? [])];
|
|
@@ -277,13 +314,14 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
277
314
|
await this.stateMachine.handleL2Block(block);
|
|
278
315
|
}
|
|
279
316
|
|
|
280
|
-
async
|
|
317
|
+
async privateCallNewFlow(
|
|
281
318
|
from: AztecAddress,
|
|
282
319
|
targetContractAddress: AztecAddress = AztecAddress.zero(),
|
|
283
320
|
functionSelector: FunctionSelector = FunctionSelector.empty(),
|
|
284
321
|
args: Fr[],
|
|
285
322
|
argsHash: Fr = Fr.zero(),
|
|
286
323
|
isStaticCall: boolean = false,
|
|
324
|
+
jobId: string,
|
|
287
325
|
) {
|
|
288
326
|
this.logger.verbose(
|
|
289
327
|
`Executing external function ${await this.contractStore.getDebugFunctionName(targetContractAddress, functionSelector)}@${targetContractAddress} isStaticCall=${isStaticCall}`,
|
|
@@ -297,29 +335,31 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
297
335
|
throw new Error(message);
|
|
298
336
|
}
|
|
299
337
|
|
|
338
|
+
// When `from` is the zero address (e.g. when deploying a new account contract), we return an
|
|
339
|
+
// empty scope list which acts as deny-all: no notes are visible and no keys are accessible.
|
|
340
|
+
const effectiveScopes = from.isZero() ? [] : [from];
|
|
341
|
+
|
|
300
342
|
// Sync notes before executing private function to discover notes from previous transactions
|
|
301
|
-
const utilityExecutor = async (call: FunctionCall) => {
|
|
302
|
-
await this.executeUtilityCall(call);
|
|
343
|
+
const utilityExecutor = async (call: FunctionCall, execScopes: AztecAddress[]) => {
|
|
344
|
+
await this.executeUtilityCall(call, execScopes, jobId);
|
|
303
345
|
};
|
|
304
346
|
|
|
305
347
|
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
306
|
-
await
|
|
348
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(
|
|
307
349
|
targetContractAddress,
|
|
308
|
-
this.contractStore,
|
|
309
350
|
functionSelector,
|
|
310
351
|
utilityExecutor,
|
|
311
|
-
this.noteStore,
|
|
312
|
-
this.stateMachine.node,
|
|
313
352
|
blockHeader,
|
|
314
|
-
|
|
353
|
+
jobId,
|
|
354
|
+
effectiveScopes,
|
|
315
355
|
);
|
|
316
356
|
|
|
317
|
-
const blockNumber = await this.
|
|
357
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
318
358
|
|
|
319
359
|
const callContext = new CallContext(from, targetContractAddress, functionSelector, isStaticCall);
|
|
320
360
|
|
|
321
|
-
const gasLimits = new Gas(
|
|
322
|
-
const teardownGasLimits = new Gas(
|
|
361
|
+
const gasLimits = new Gas(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, MAX_PROCESSABLE_L2_GAS);
|
|
362
|
+
const teardownGasLimits = new Gas(FALLBACK_TEARDOWN_DA_GAS_LIMIT, FALLBACK_TEARDOWN_L2_GAS_LIMIT);
|
|
323
363
|
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
|
|
324
364
|
|
|
325
365
|
const txContext = new TxContext(this.chainId, this.version, gasSettings);
|
|
@@ -335,42 +375,39 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
335
375
|
|
|
336
376
|
const simulator = new WASMSimulator();
|
|
337
377
|
|
|
338
|
-
const privateExecutionOracle = new PrivateExecutionOracle(
|
|
378
|
+
const privateExecutionOracle = new PrivateExecutionOracle({
|
|
339
379
|
argsHash,
|
|
340
380
|
txContext,
|
|
341
381
|
callContext,
|
|
342
|
-
|
|
343
|
-
blockHeader,
|
|
382
|
+
anchorBlockHeader: blockHeader,
|
|
344
383
|
utilityExecutor,
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
[],
|
|
349
|
-
HashedValuesCache.create([new HashedValues(args, argsHash)]),
|
|
384
|
+
authWitnesses: Array.from(this.authwits.values()),
|
|
385
|
+
capsules: [],
|
|
386
|
+
executionCache: HashedValuesCache.create([new HashedValues(args, argsHash)]),
|
|
350
387
|
noteCache,
|
|
351
388
|
taggingIndexCache,
|
|
352
|
-
this.contractStore,
|
|
353
|
-
this.noteStore,
|
|
354
|
-
this.keyStore,
|
|
355
|
-
this.addressStore,
|
|
356
|
-
this.stateMachine.node,
|
|
357
|
-
this.senderTaggingStore,
|
|
358
|
-
this.recipientTaggingStore,
|
|
359
|
-
this.senderAddressBookStore,
|
|
360
|
-
this.capsuleStore,
|
|
361
|
-
this.privateEventStore,
|
|
362
|
-
this.
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
*/
|
|
371
|
-
from,
|
|
389
|
+
contractStore: this.contractStore,
|
|
390
|
+
noteStore: this.noteStore,
|
|
391
|
+
keyStore: this.keyStore,
|
|
392
|
+
addressStore: this.addressStore,
|
|
393
|
+
aztecNode: this.stateMachine.node,
|
|
394
|
+
senderTaggingStore: this.senderTaggingStore,
|
|
395
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
396
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
397
|
+
capsuleService: new CapsuleService(this.capsuleStore, effectiveScopes),
|
|
398
|
+
privateEventStore: this.privateEventStore,
|
|
399
|
+
contractSyncService: this.stateMachine.contractSyncService,
|
|
400
|
+
jobId,
|
|
401
|
+
totalPublicCalldataCount: 0,
|
|
402
|
+
sideEffectCounter: minRevertibleSideEffectCounter,
|
|
403
|
+
scopes: effectiveScopes,
|
|
404
|
+
// In TXE, the typical transaction entrypoint is skipped, so we need to simulate the actions that such a
|
|
405
|
+
// contract would perform, including setting senderForTags.
|
|
406
|
+
senderForTags: from,
|
|
372
407
|
simulator,
|
|
373
|
-
|
|
408
|
+
messageContextService: this.stateMachine.messageContextService,
|
|
409
|
+
l2TipsStore: this.stateMachine.node,
|
|
410
|
+
});
|
|
374
411
|
|
|
375
412
|
// Note: This is a slight modification of simulator.run without any of the checks. Maybe we should modify simulator.run with a boolean value to skip checks.
|
|
376
413
|
let result: PrivateExecutionResult;
|
|
@@ -392,7 +429,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
392
429
|
);
|
|
393
430
|
const publicFunctionsCalldata = await Promise.all(
|
|
394
431
|
publicCallRequests.map(async r => {
|
|
395
|
-
const calldata = await privateExecutionOracle.
|
|
432
|
+
const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
|
|
396
433
|
return new HashedValues(calldata, r.calldataHash);
|
|
397
434
|
}),
|
|
398
435
|
);
|
|
@@ -409,7 +446,8 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
409
446
|
// We pass the non-zero minRevertibleSideEffectCounter to make sure the side effects are split correctly.
|
|
410
447
|
const { publicInputs } = await generateSimulatedProvingResult(
|
|
411
448
|
result,
|
|
412
|
-
this.contractStore,
|
|
449
|
+
(addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
|
|
450
|
+
this.stateMachine.node,
|
|
413
451
|
minRevertibleSideEffectCounter,
|
|
414
452
|
);
|
|
415
453
|
|
|
@@ -505,7 +543,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
505
543
|
return executionResult.returnValues ?? [];
|
|
506
544
|
}
|
|
507
545
|
|
|
508
|
-
async
|
|
546
|
+
async publicCallNewFlow(
|
|
509
547
|
from: AztecAddress,
|
|
510
548
|
targetContractAddress: AztecAddress,
|
|
511
549
|
calldata: Fr[],
|
|
@@ -515,11 +553,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
515
553
|
`Executing public function ${await this.contractStore.getDebugFunctionName(targetContractAddress, FunctionSelector.fromField(calldata[0]))}@${targetContractAddress} isStaticCall=${isStaticCall}`,
|
|
516
554
|
);
|
|
517
555
|
|
|
518
|
-
const blockNumber = await this.
|
|
556
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
519
557
|
|
|
520
|
-
const gasLimits = new Gas(
|
|
558
|
+
const gasLimits = new Gas(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, MAX_PROCESSABLE_L2_GAS);
|
|
521
559
|
|
|
522
|
-
const teardownGasLimits = new Gas(
|
|
560
|
+
const teardownGasLimits = new Gas(FALLBACK_TEARDOWN_DA_GAS_LIMIT, FALLBACK_TEARDOWN_L2_GAS_LIMIT);
|
|
523
561
|
|
|
524
562
|
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
|
|
525
563
|
|
|
@@ -592,7 +630,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
592
630
|
constantData,
|
|
593
631
|
/*gasUsed=*/ new Gas(0, 0),
|
|
594
632
|
/*feePayer=*/ AztecAddress.zero(),
|
|
595
|
-
/*
|
|
633
|
+
/*expirationTimestamp=*/ 0n,
|
|
596
634
|
inputsForPublic,
|
|
597
635
|
undefined,
|
|
598
636
|
);
|
|
@@ -660,10 +698,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
660
698
|
return returnValues ?? [];
|
|
661
699
|
}
|
|
662
700
|
|
|
663
|
-
async
|
|
701
|
+
async executeUtilityFunction(
|
|
664
702
|
targetContractAddress: AztecAddress,
|
|
665
703
|
functionSelector: FunctionSelector,
|
|
666
704
|
args: Fr[],
|
|
705
|
+
jobId: string,
|
|
667
706
|
) {
|
|
668
707
|
const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector);
|
|
669
708
|
if (!artifact) {
|
|
@@ -672,34 +711,32 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
672
711
|
|
|
673
712
|
// Sync notes before executing utility function to discover notes from previous transactions
|
|
674
713
|
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
675
|
-
await
|
|
714
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(
|
|
676
715
|
targetContractAddress,
|
|
677
|
-
this.contractStore,
|
|
678
716
|
functionSelector,
|
|
679
|
-
async call => {
|
|
680
|
-
await this.executeUtilityCall(call);
|
|
717
|
+
async (call, execScopes) => {
|
|
718
|
+
await this.executeUtilityCall(call, execScopes, jobId);
|
|
681
719
|
},
|
|
682
|
-
this.noteStore,
|
|
683
|
-
this.stateMachine.node,
|
|
684
720
|
blockHeader,
|
|
685
|
-
|
|
721
|
+
jobId,
|
|
722
|
+
await this.keyStore.getAccounts(),
|
|
686
723
|
);
|
|
687
724
|
|
|
688
|
-
const call =
|
|
689
|
-
artifact.name,
|
|
690
|
-
targetContractAddress,
|
|
691
|
-
functionSelector,
|
|
692
|
-
FunctionType.UTILITY,
|
|
693
|
-
false,
|
|
694
|
-
false,
|
|
725
|
+
const call = FunctionCall.from({
|
|
726
|
+
name: artifact.name,
|
|
727
|
+
to: targetContractAddress,
|
|
728
|
+
selector: functionSelector,
|
|
729
|
+
type: FunctionType.UTILITY,
|
|
730
|
+
hideMsgSender: false,
|
|
731
|
+
isStatic: false,
|
|
695
732
|
args,
|
|
696
|
-
[],
|
|
697
|
-
);
|
|
733
|
+
returnTypes: [],
|
|
734
|
+
});
|
|
698
735
|
|
|
699
|
-
return this.executeUtilityCall(call);
|
|
736
|
+
return this.executeUtilityCall(call, await this.keyStore.getAccounts(), jobId);
|
|
700
737
|
}
|
|
701
738
|
|
|
702
|
-
private async executeUtilityCall(call: FunctionCall): Promise<Fr[]> {
|
|
739
|
+
private async executeUtilityCall(call: FunctionCall, scopes: AztecAddress[], jobId: string): Promise<Fr[]> {
|
|
703
740
|
const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
|
|
704
741
|
if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
|
|
705
742
|
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
|
|
@@ -712,22 +749,26 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
712
749
|
|
|
713
750
|
try {
|
|
714
751
|
const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
715
|
-
const oracle = new UtilityExecutionOracle(
|
|
716
|
-
call.to,
|
|
717
|
-
[],
|
|
718
|
-
[],
|
|
752
|
+
const oracle = new UtilityExecutionOracle({
|
|
753
|
+
contractAddress: call.to,
|
|
754
|
+
authWitnesses: [],
|
|
755
|
+
capsules: [],
|
|
719
756
|
anchorBlockHeader,
|
|
720
|
-
this.contractStore,
|
|
721
|
-
this.noteStore,
|
|
722
|
-
this.keyStore,
|
|
723
|
-
this.addressStore,
|
|
724
|
-
this.stateMachine.node,
|
|
725
|
-
this.recipientTaggingStore,
|
|
726
|
-
this.senderAddressBookStore,
|
|
727
|
-
this.capsuleStore,
|
|
728
|
-
this.privateEventStore,
|
|
729
|
-
this.
|
|
730
|
-
|
|
757
|
+
contractStore: this.contractStore,
|
|
758
|
+
noteStore: this.noteStore,
|
|
759
|
+
keyStore: this.keyStore,
|
|
760
|
+
addressStore: this.addressStore,
|
|
761
|
+
aztecNode: this.stateMachine.node,
|
|
762
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
763
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
764
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
765
|
+
privateEventStore: this.privateEventStore,
|
|
766
|
+
messageContextService: this.stateMachine.messageContextService,
|
|
767
|
+
contractSyncService: this.contractSyncService,
|
|
768
|
+
l2TipsStore: this.stateMachine.node,
|
|
769
|
+
jobId,
|
|
770
|
+
scopes,
|
|
771
|
+
});
|
|
731
772
|
const acirExecutionResult = await new WASMSimulator()
|
|
732
773
|
.executeUserCircuit(toACVMWitness(0, call.args), entryPointArtifact, new Oracle(oracle).toACIRCallback())
|
|
733
774
|
.catch((err: Error) => {
|
|
@@ -743,10 +784,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
743
784
|
);
|
|
744
785
|
});
|
|
745
786
|
|
|
746
|
-
this.logger.verbose(`Utility
|
|
787
|
+
this.logger.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
|
|
747
788
|
return witnessMapToFields(acirExecutionResult.returnWitness);
|
|
748
789
|
} catch (err) {
|
|
749
|
-
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility
|
|
790
|
+
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility execution'));
|
|
750
791
|
}
|
|
751
792
|
}
|
|
752
793
|
|