@aztec/txe 0.0.1-commit.e6bd8901 → 0.0.1-commit.ec7ac5448
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 +14 -15
- 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 +149 -63
- package/dest/rpc_translator.d.ts +121 -83
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +406 -172
- 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 +9 -8
- package/dest/state_machine/dummy_p2p_client.d.ts +18 -13
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +33 -18
- package/dest/state_machine/global_variable_builder.d.ts +3 -2
- package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
- package/dest/state_machine/global_variable_builder.js +1 -1
- 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 +20 -3
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +39 -2
- 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 +94 -26
- package/dest/util/encoding.d.ts +69 -1
- 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 +6 -25
- 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 +14 -16
- package/src/oracle/txe_oracle_top_level_context.ts +188 -115
- package/src/rpc_translator.ts +470 -189
- package/src/state_machine/archiver.ts +8 -5
- package/src/state_machine/dummy_p2p_client.ts +46 -24
- package/src/state_machine/global_variable_builder.ts +2 -0
- package/src/state_machine/index.ts +30 -9
- package/src/state_machine/mock_epoch_cache.ts +51 -3
- package/src/state_machine/synchronizer.ts +4 -4
- package/src/txe_session.ts +106 -85
- package/src/util/txe_public_contract_data_source.ts +10 -38
- 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,25 +335,35 @@ 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
|
-
await
|
|
347
|
+
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
348
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(
|
|
349
|
+
targetContractAddress,
|
|
350
|
+
functionSelector,
|
|
351
|
+
utilityExecutor,
|
|
352
|
+
blockHeader,
|
|
353
|
+
jobId,
|
|
354
|
+
effectiveScopes,
|
|
355
|
+
);
|
|
306
356
|
|
|
307
|
-
const blockNumber = await this.
|
|
357
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
308
358
|
|
|
309
359
|
const callContext = new CallContext(from, targetContractAddress, functionSelector, isStaticCall);
|
|
310
360
|
|
|
311
|
-
const gasLimits = new Gas(
|
|
312
|
-
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);
|
|
313
363
|
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
|
|
314
364
|
|
|
315
365
|
const txContext = new TxContext(this.chainId, this.version, gasSettings);
|
|
316
366
|
|
|
317
|
-
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
318
|
-
|
|
319
367
|
const protocolNullifier = await computeProtocolNullifier(getSingleTxBlockRequestHash(blockNumber));
|
|
320
368
|
const noteCache = new ExecutionNoteCache(protocolNullifier);
|
|
321
369
|
// In production, the account contract sets the min revertible counter before calling the app function.
|
|
@@ -327,43 +375,38 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
327
375
|
|
|
328
376
|
const simulator = new WASMSimulator();
|
|
329
377
|
|
|
330
|
-
const privateExecutionOracle = new PrivateExecutionOracle(
|
|
378
|
+
const privateExecutionOracle = new PrivateExecutionOracle({
|
|
331
379
|
argsHash,
|
|
332
380
|
txContext,
|
|
333
381
|
callContext,
|
|
334
|
-
|
|
335
|
-
blockHeader,
|
|
382
|
+
anchorBlockHeader: blockHeader,
|
|
336
383
|
utilityExecutor,
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
[],
|
|
341
|
-
HashedValuesCache.create([new HashedValues(args, argsHash)]),
|
|
384
|
+
authWitnesses: Array.from(this.authwits.values()),
|
|
385
|
+
capsules: [],
|
|
386
|
+
executionCache: HashedValuesCache.create([new HashedValues(args, argsHash)]),
|
|
342
387
|
noteCache,
|
|
343
388
|
taggingIndexCache,
|
|
344
|
-
this.contractStore,
|
|
345
|
-
this.noteStore,
|
|
346
|
-
this.keyStore,
|
|
347
|
-
this.addressStore,
|
|
348
|
-
this.stateMachine.node,
|
|
349
|
-
this.
|
|
350
|
-
this.
|
|
351
|
-
this.
|
|
352
|
-
this.
|
|
353
|
-
this.
|
|
354
|
-
this.
|
|
355
|
-
|
|
356
|
-
0,
|
|
357
|
-
minRevertibleSideEffectCounter,
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
* contract would perform, including setting senderForTags.
|
|
363
|
-
*/
|
|
364
|
-
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,
|
|
365
407
|
simulator,
|
|
366
|
-
|
|
408
|
+
messageContextService: this.stateMachine.messageContextService,
|
|
409
|
+
});
|
|
367
410
|
|
|
368
411
|
// 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.
|
|
369
412
|
let result: PrivateExecutionResult;
|
|
@@ -385,7 +428,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
385
428
|
);
|
|
386
429
|
const publicFunctionsCalldata = await Promise.all(
|
|
387
430
|
publicCallRequests.map(async r => {
|
|
388
|
-
const calldata = await privateExecutionOracle.
|
|
431
|
+
const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
|
|
389
432
|
return new HashedValues(calldata, r.calldataHash);
|
|
390
433
|
}),
|
|
391
434
|
);
|
|
@@ -402,7 +445,8 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
402
445
|
// We pass the non-zero minRevertibleSideEffectCounter to make sure the side effects are split correctly.
|
|
403
446
|
const { publicInputs } = await generateSimulatedProvingResult(
|
|
404
447
|
result,
|
|
405
|
-
this.contractStore,
|
|
448
|
+
(addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
|
|
449
|
+
this.stateMachine.node,
|
|
406
450
|
minRevertibleSideEffectCounter,
|
|
407
451
|
);
|
|
408
452
|
|
|
@@ -415,7 +459,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
415
459
|
|
|
416
460
|
const forkedWorldTrees = await this.stateMachine.synchronizer.nativeWorldStateService.fork();
|
|
417
461
|
|
|
418
|
-
const
|
|
462
|
+
const bindings = this.logger.getBindings();
|
|
463
|
+
const contractsDB = new PublicContractsDB(
|
|
464
|
+
new TXEPublicContractDataSource(blockNumber, this.contractStore),
|
|
465
|
+
bindings,
|
|
466
|
+
);
|
|
419
467
|
const guardedMerkleTrees = new GuardedMerkleTreeOperations(forkedWorldTrees);
|
|
420
468
|
const config = PublicSimulatorConfig.from({
|
|
421
469
|
skipFeeEnforcement: true,
|
|
@@ -428,8 +476,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
428
476
|
globals,
|
|
429
477
|
guardedMerkleTrees,
|
|
430
478
|
contractsDB,
|
|
431
|
-
new CppPublicTxSimulator(guardedMerkleTrees, contractsDB, globals, config),
|
|
479
|
+
new CppPublicTxSimulator(guardedMerkleTrees, contractsDB, globals, config, bindings),
|
|
432
480
|
new TestDateProvider(),
|
|
481
|
+
undefined,
|
|
482
|
+
createLogger('simulator:public-processor', bindings),
|
|
433
483
|
);
|
|
434
484
|
|
|
435
485
|
const tx = await Tx.create({
|
|
@@ -492,7 +542,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
492
542
|
return executionResult.returnValues ?? [];
|
|
493
543
|
}
|
|
494
544
|
|
|
495
|
-
async
|
|
545
|
+
async publicCallNewFlow(
|
|
496
546
|
from: AztecAddress,
|
|
497
547
|
targetContractAddress: AztecAddress,
|
|
498
548
|
calldata: Fr[],
|
|
@@ -502,11 +552,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
502
552
|
`Executing public function ${await this.contractStore.getDebugFunctionName(targetContractAddress, FunctionSelector.fromField(calldata[0]))}@${targetContractAddress} isStaticCall=${isStaticCall}`,
|
|
503
553
|
);
|
|
504
554
|
|
|
505
|
-
const blockNumber = await this.
|
|
555
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
506
556
|
|
|
507
|
-
const gasLimits = new Gas(
|
|
557
|
+
const gasLimits = new Gas(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, MAX_PROCESSABLE_L2_GAS);
|
|
508
558
|
|
|
509
|
-
const teardownGasLimits = new Gas(
|
|
559
|
+
const teardownGasLimits = new Gas(FALLBACK_TEARDOWN_DA_GAS_LIMIT, FALLBACK_TEARDOWN_L2_GAS_LIMIT);
|
|
510
560
|
|
|
511
561
|
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
|
|
512
562
|
|
|
@@ -526,7 +576,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
526
576
|
|
|
527
577
|
const forkedWorldTrees = await this.stateMachine.synchronizer.nativeWorldStateService.fork();
|
|
528
578
|
|
|
529
|
-
const
|
|
579
|
+
const bindings2 = this.logger.getBindings();
|
|
580
|
+
const contractsDB = new PublicContractsDB(
|
|
581
|
+
new TXEPublicContractDataSource(blockNumber, this.contractStore),
|
|
582
|
+
bindings2,
|
|
583
|
+
);
|
|
530
584
|
const guardedMerkleTrees = new GuardedMerkleTreeOperations(forkedWorldTrees);
|
|
531
585
|
const config = PublicSimulatorConfig.from({
|
|
532
586
|
skipFeeEnforcement: true,
|
|
@@ -535,8 +589,16 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
535
589
|
collectStatistics: false,
|
|
536
590
|
collectCallMetadata: true,
|
|
537
591
|
});
|
|
538
|
-
const simulator = new CppPublicTxSimulator(guardedMerkleTrees, contractsDB, globals, config);
|
|
539
|
-
const processor = new PublicProcessor(
|
|
592
|
+
const simulator = new CppPublicTxSimulator(guardedMerkleTrees, contractsDB, globals, config, bindings2);
|
|
593
|
+
const processor = new PublicProcessor(
|
|
594
|
+
globals,
|
|
595
|
+
guardedMerkleTrees,
|
|
596
|
+
contractsDB,
|
|
597
|
+
simulator,
|
|
598
|
+
new TestDateProvider(),
|
|
599
|
+
undefined,
|
|
600
|
+
createLogger('simulator:public-processor', bindings2),
|
|
601
|
+
);
|
|
540
602
|
|
|
541
603
|
// We're simulating a scenario in which private execution immediately enqueues a public call and halts. The private
|
|
542
604
|
// kernel init would in this case inject a nullifier with the transaction request hash as a non-revertible
|
|
@@ -567,7 +629,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
567
629
|
constantData,
|
|
568
630
|
/*gasUsed=*/ new Gas(0, 0),
|
|
569
631
|
/*feePayer=*/ AztecAddress.zero(),
|
|
570
|
-
/*
|
|
632
|
+
/*expirationTimestamp=*/ 0n,
|
|
571
633
|
inputsForPublic,
|
|
572
634
|
undefined,
|
|
573
635
|
);
|
|
@@ -635,10 +697,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
635
697
|
return returnValues ?? [];
|
|
636
698
|
}
|
|
637
699
|
|
|
638
|
-
async
|
|
700
|
+
async executeUtilityFunction(
|
|
639
701
|
targetContractAddress: AztecAddress,
|
|
640
702
|
functionSelector: FunctionSelector,
|
|
641
703
|
args: Fr[],
|
|
704
|
+
jobId: string,
|
|
642
705
|
) {
|
|
643
706
|
const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector);
|
|
644
707
|
if (!artifact) {
|
|
@@ -646,25 +709,33 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
646
709
|
}
|
|
647
710
|
|
|
648
711
|
// Sync notes before executing utility function to discover notes from previous transactions
|
|
649
|
-
await
|
|
650
|
-
|
|
651
|
-
});
|
|
652
|
-
|
|
653
|
-
const call = new FunctionCall(
|
|
654
|
-
artifact.name,
|
|
712
|
+
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
713
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(
|
|
655
714
|
targetContractAddress,
|
|
656
715
|
functionSelector,
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
716
|
+
async (call, execScopes) => {
|
|
717
|
+
await this.executeUtilityCall(call, execScopes, jobId);
|
|
718
|
+
},
|
|
719
|
+
blockHeader,
|
|
720
|
+
jobId,
|
|
721
|
+
await this.keyStore.getAccounts(),
|
|
662
722
|
);
|
|
663
723
|
|
|
664
|
-
|
|
724
|
+
const call = FunctionCall.from({
|
|
725
|
+
name: artifact.name,
|
|
726
|
+
to: targetContractAddress,
|
|
727
|
+
selector: functionSelector,
|
|
728
|
+
type: FunctionType.UTILITY,
|
|
729
|
+
hideMsgSender: false,
|
|
730
|
+
isStatic: false,
|
|
731
|
+
args,
|
|
732
|
+
returnTypes: [],
|
|
733
|
+
});
|
|
734
|
+
|
|
735
|
+
return this.executeUtilityCall(call, await this.keyStore.getAccounts(), jobId);
|
|
665
736
|
}
|
|
666
737
|
|
|
667
|
-
private async executeUtilityCall(call: FunctionCall): Promise<Fr[]> {
|
|
738
|
+
private async executeUtilityCall(call: FunctionCall, scopes: AztecAddress[], jobId: string): Promise<Fr[]> {
|
|
668
739
|
const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
|
|
669
740
|
if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
|
|
670
741
|
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
|
|
@@ -677,23 +748,25 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
677
748
|
|
|
678
749
|
try {
|
|
679
750
|
const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
680
|
-
const oracle = new UtilityExecutionOracle(
|
|
681
|
-
call.to,
|
|
682
|
-
[],
|
|
683
|
-
[],
|
|
751
|
+
const oracle = new UtilityExecutionOracle({
|
|
752
|
+
contractAddress: call.to,
|
|
753
|
+
authWitnesses: [],
|
|
754
|
+
capsules: [],
|
|
684
755
|
anchorBlockHeader,
|
|
685
|
-
this.contractStore,
|
|
686
|
-
this.noteStore,
|
|
687
|
-
this.keyStore,
|
|
688
|
-
this.addressStore,
|
|
689
|
-
this.stateMachine.node,
|
|
690
|
-
this.
|
|
691
|
-
this.
|
|
692
|
-
this.
|
|
693
|
-
this.
|
|
694
|
-
this.
|
|
695
|
-
this.
|
|
696
|
-
|
|
756
|
+
contractStore: this.contractStore,
|
|
757
|
+
noteStore: this.noteStore,
|
|
758
|
+
keyStore: this.keyStore,
|
|
759
|
+
addressStore: this.addressStore,
|
|
760
|
+
aztecNode: this.stateMachine.node,
|
|
761
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
762
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
763
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
764
|
+
privateEventStore: this.privateEventStore,
|
|
765
|
+
messageContextService: this.stateMachine.messageContextService,
|
|
766
|
+
contractSyncService: this.contractSyncService,
|
|
767
|
+
jobId,
|
|
768
|
+
scopes,
|
|
769
|
+
});
|
|
697
770
|
const acirExecutionResult = await new WASMSimulator()
|
|
698
771
|
.executeUserCircuit(toACVMWitness(0, call.args), entryPointArtifact, new Oracle(oracle).toACIRCallback())
|
|
699
772
|
.catch((err: Error) => {
|
|
@@ -709,10 +782,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
709
782
|
);
|
|
710
783
|
});
|
|
711
784
|
|
|
712
|
-
this.logger.verbose(`Utility
|
|
785
|
+
this.logger.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
|
|
713
786
|
return witnessMapToFields(acirExecutionResult.returnWitness);
|
|
714
787
|
} catch (err) {
|
|
715
|
-
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility
|
|
788
|
+
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility execution'));
|
|
716
789
|
}
|
|
717
790
|
}
|
|
718
791
|
|