@aztec/txe 0.0.1-commit.b8a057fa → 0.0.1-commit.be03c316
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/AuthRegistry-QVGDDH5X.js +3 -0
- package/dest/AuthRegistry-QVGDDH5X.js.map +7 -0
- package/dest/ContractClassRegistry-VWR3F42P.js +3 -0
- package/dest/ContractClassRegistry-VWR3F42P.js.map +7 -0
- package/dest/{ContractInstanceRegistry-2TZHWOTT.js → ContractInstanceRegistry-FHIWE33X.js} +1 -1
- package/dest/{ContractInstanceRegistry-2TZHWOTT.js.map → ContractInstanceRegistry-FHIWE33X.js.map} +1 -1
- package/dest/FeeJuice-SAOWVGG7.js +3 -0
- package/dest/FeeJuice-SAOWVGG7.js.map +7 -0
- package/dest/HandshakeRegistry-GY5CPEPS.js +3 -0
- package/dest/HandshakeRegistry-GY5CPEPS.js.map +7 -0
- package/dest/{MultiCallEntrypoint-IGLO227K.js → MultiCallEntrypoint-QG5H33ZZ.js} +1 -1
- package/dest/{MultiCallEntrypoint-IGLO227K.js.map → MultiCallEntrypoint-QG5H33ZZ.js.map} +2 -2
- package/dest/SchnorrAccount-NME3E45O.js +3 -0
- package/dest/SchnorrAccount-NME3E45O.js.map +7 -0
- package/dest/SchnorrInitializerlessAccount-WTGXU6SW.js +3 -0
- package/dest/SchnorrInitializerlessAccount-WTGXU6SW.js.map +7 -0
- package/dest/bin/check_txe_oracle_version.js +7 -15
- package/dest/bin/index.js +1 -1
- package/dest/{chunk-FRF5YZEO.js → chunk-DXIAVNMJ.js} +2 -2
- package/dest/{chunk-FRF5YZEO.js.map → chunk-DXIAVNMJ.js.map} +3 -3
- package/dest/{chunk-O57S6W5S.js → chunk-JHAAHRCL.js} +13 -13
- package/dest/{chunk-O57S6W5S.js.map → chunk-JHAAHRCL.js.map} +4 -4
- package/dest/metafile.json +654 -392
- package/dest/oracle/interfaces.d.ts +11 -3
- package/dest/oracle/interfaces.d.ts.map +1 -1
- package/dest/oracle/tagging_secret_strategy.d.ts +12 -0
- package/dest/oracle/tagging_secret_strategy.d.ts.map +1 -0
- package/dest/oracle/tagging_secret_strategy.js +12 -0
- package/dest/oracle/test-resolver/default_fixtures.d.ts +9 -2
- package/dest/oracle/test-resolver/default_fixtures.d.ts.map +1 -1
- package/dest/oracle/test-resolver/default_fixtures.js +32 -39
- package/dest/oracle/test-resolver/resolver.d.ts +1 -1
- package/dest/oracle/test-resolver/resolver.d.ts.map +1 -1
- package/dest/oracle/test-resolver/resolver.js +2 -2
- package/dest/oracle/txe_oracle_registry.d.ts +8 -5
- package/dest/oracle/txe_oracle_registry.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_registry.js +52 -30
- package/dest/oracle/txe_oracle_top_level_context.d.ts +21 -7
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +39 -17
- package/dest/oracle/txe_oracle_version.d.ts +4 -4
- package/dest/oracle/txe_oracle_version.js +4 -4
- package/dest/rpc_translator.d.ts +6 -3
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +31 -7
- package/dest/server.bundle.js +1 -1
- package/dest/txe_session.d.ts +3 -2
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +15 -9
- package/dest/worker.bundle.js +1 -1
- package/package.json +17 -17
- package/src/bin/check_txe_oracle_version.ts +9 -12
- package/src/oracle/interfaces.ts +13 -2
- package/src/oracle/tagging_secret_strategy.ts +25 -0
- package/src/oracle/test-resolver/default_fixtures.ts +58 -69
- package/src/oracle/test-resolver/resolver.ts +2 -2
- package/src/oracle/txe_oracle_registry.ts +48 -28
- package/src/oracle/txe_oracle_top_level_context.ts +47 -12
- package/src/oracle/txe_oracle_version.ts +4 -4
- package/src/rpc_translator.ts +37 -8
- package/src/txe_session.ts +23 -11
- package/dest/AuthRegistry-HMC7WEOJ.js +0 -3
- package/dest/AuthRegistry-HMC7WEOJ.js.map +0 -7
- package/dest/ContractClassRegistry-TXCDCFNC.js +0 -3
- package/dest/ContractClassRegistry-TXCDCFNC.js.map +0 -7
- package/dest/FeeJuice-FDF3J2Q5.js +0 -3
- package/dest/FeeJuice-FDF3J2Q5.js.map +0 -7
- package/dest/HandshakeRegistry-C7JF4R54.js +0 -3
- package/dest/HandshakeRegistry-C7JF4R54.js.map +0 -7
- package/dest/SchnorrAccount-KCIHUCXS.js +0 -3
- package/dest/SchnorrAccount-KCIHUCXS.js.map +0 -7
- package/dest/SchnorrInitializerlessAccount-PVR6XUSN.js +0 -3
- package/dest/SchnorrInitializerlessAccount-PVR6XUSN.js.map +0 -7
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type { Logger } from '@aztec/foundation/log';
|
|
3
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { withoutHexPrefix } from '@aztec/foundation/string';
|
|
5
|
-
import { BOUNDED_VEC,
|
|
5
|
+
import { BOUNDED_VEC, BoundedVec, Option, type OracleRegistryEntry, U8, makeEntry } from '@aztec/pxe/simulator';
|
|
6
6
|
|
|
7
7
|
import type { ForeignCallArgs, ForeignCallResult } from '../../utils/encoding.js';
|
|
8
8
|
import { toInputSlots } from '../txe_oracle_registry.js';
|
|
@@ -10,7 +10,7 @@ import { synthesizeDefaultFixtures } from './default_fixtures.js';
|
|
|
10
10
|
|
|
11
11
|
/** Name of the meta-oracle that Noir tests call to announce the next call's scenario by name. */
|
|
12
12
|
const SET_SCENARIO_ORACLE = 'aztec_oracle_test_set_scenario';
|
|
13
|
-
export const SET_SCENARIO_ENTRY = makeEntry({ params: [{ name: 'name', type: BOUNDED_VEC(
|
|
13
|
+
export const SET_SCENARIO_ENTRY = makeEntry({ params: [{ name: 'name', type: BOUNDED_VEC(U8) }] });
|
|
14
14
|
|
|
15
15
|
export type OracleTestCallInput = {
|
|
16
16
|
session_id: number;
|
|
@@ -14,7 +14,6 @@ import type { TaggingSecretStrategy } from '@aztec/pxe/server';
|
|
|
14
14
|
import {
|
|
15
15
|
ARRAY,
|
|
16
16
|
AZTEC_ADDRESS,
|
|
17
|
-
BIGINT,
|
|
18
17
|
BLOCK_NUMBER,
|
|
19
18
|
BOOL,
|
|
20
19
|
ETH_ADDRESS,
|
|
@@ -22,17 +21,20 @@ import {
|
|
|
22
21
|
FIXED_ARRAY,
|
|
23
22
|
FUNCTION_SELECTOR,
|
|
24
23
|
type InputSlot,
|
|
24
|
+
LEAF,
|
|
25
25
|
type MaybePromise,
|
|
26
26
|
OPTION,
|
|
27
27
|
ORACLE_REGISTRY,
|
|
28
28
|
type OracleRegistryEntry,
|
|
29
29
|
type OutputSlot,
|
|
30
30
|
type ParamTypes,
|
|
31
|
+
SCALAR,
|
|
31
32
|
STR,
|
|
32
33
|
STRUCT,
|
|
33
34
|
type SlotShape,
|
|
34
35
|
type TypeMapping,
|
|
35
36
|
U32,
|
|
37
|
+
U64,
|
|
36
38
|
buildACIRCallback,
|
|
37
39
|
makeEntry,
|
|
38
40
|
} from '@aztec/pxe/simulator';
|
|
@@ -59,22 +61,24 @@ export type { BlockHash } from '@aztec/stdlib/block';
|
|
|
59
61
|
export type { MembershipWitness } from '@aztec/foundation/trees';
|
|
60
62
|
export type { NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
61
63
|
|
|
62
|
-
const GAS_SETTINGS: TypeMapping<GasSettings> = {
|
|
64
|
+
const GAS_SETTINGS: TypeMapping<GasSettings> = LEAF({
|
|
65
|
+
kind: 'gas-settings',
|
|
63
66
|
deserialization: {
|
|
64
67
|
fn: ([reader]) => GasSettings.fromFields(reader.readFieldArray(GAS_SETTINGS_LENGTH)),
|
|
65
68
|
},
|
|
66
69
|
shape: [{ len: GAS_SETTINGS_LENGTH }],
|
|
67
|
-
};
|
|
70
|
+
});
|
|
68
71
|
|
|
69
72
|
// Tagging secret strategy discriminants. Must match the Noir test helper `TaggingSecretStrategy` in
|
|
70
|
-
// aztec-nr `test/helpers/tagging_secret_strategy.nr`. This is a test-only oracle (only `
|
|
73
|
+
// aztec-nr `test/helpers/tagging_secret_strategy.nr`. This is a test-only oracle (only `set_tagging_secret_strategies`
|
|
71
74
|
// reads it), so the mapping lives here on the TXE side rather than in the production oracle type mappings.
|
|
72
75
|
const STRATEGY_NON_INTERACTIVE_HANDSHAKE = 1;
|
|
73
76
|
const STRATEGY_ARBITRARY_SECRET = 2;
|
|
74
77
|
const STRATEGY_ADDRESS_DERIVED = 3;
|
|
75
78
|
const STRATEGY_INTERACTIVE_HANDSHAKE = 4;
|
|
76
79
|
|
|
77
|
-
const TAGGING_SECRET_STRATEGY: TypeMapping<TaggingSecretStrategy> = {
|
|
80
|
+
const TAGGING_SECRET_STRATEGY: TypeMapping<TaggingSecretStrategy> = LEAF({
|
|
81
|
+
kind: 'tagging-secret-strategy',
|
|
78
82
|
serialization: {
|
|
79
83
|
fn: strategy => {
|
|
80
84
|
switch (strategy.type) {
|
|
@@ -108,24 +112,27 @@ const TAGGING_SECRET_STRATEGY: TypeMapping<TaggingSecretStrategy> = {
|
|
|
108
112
|
},
|
|
109
113
|
},
|
|
110
114
|
shape: ['scalar', 'scalar', 'scalar'],
|
|
111
|
-
};
|
|
115
|
+
});
|
|
112
116
|
|
|
113
|
-
const PRIVATE_CONTEXT_INPUTS: TypeMapping<PrivateContextInputs> = {
|
|
117
|
+
const PRIVATE_CONTEXT_INPUTS: TypeMapping<PrivateContextInputs> = LEAF({
|
|
118
|
+
kind: 'private-context-inputs',
|
|
114
119
|
serialization: { fn: v => v.toFields() },
|
|
115
120
|
shape: Array<SlotShape>(PRIVATE_CONTEXT_INPUTS_LENGTH).fill('scalar'),
|
|
116
|
-
};
|
|
121
|
+
});
|
|
117
122
|
|
|
118
|
-
const COMPLETE_ADDRESS: TypeMapping<CompleteAddress> = {
|
|
123
|
+
const COMPLETE_ADDRESS: TypeMapping<CompleteAddress> = LEAF({
|
|
124
|
+
kind: 'complete-address',
|
|
119
125
|
serialization: { fn: v => [v.address.toField(), ...v.publicKeys.toFields()] },
|
|
120
126
|
shape: Array<SlotShape>(8).fill('scalar'), // address + 7 public-key fields
|
|
121
|
-
};
|
|
127
|
+
});
|
|
122
128
|
|
|
123
129
|
const TXE_TX_EFFECTS: TypeMapping<{
|
|
124
130
|
txHash: TxHash;
|
|
125
131
|
noteHashes: Fr[];
|
|
126
132
|
nullifiers: Fr[];
|
|
127
133
|
privateLogs: PrivateLog[];
|
|
128
|
-
}> = {
|
|
134
|
+
}> = LEAF({
|
|
135
|
+
kind: 'txe-tx-effects',
|
|
129
136
|
serialization: {
|
|
130
137
|
fn: ({ txHash, noteHashes, nullifiers, privateLogs }) => {
|
|
131
138
|
const emittedLogs = privateLogs.map(log => log.getEmittedFields());
|
|
@@ -164,9 +171,10 @@ const TXE_TX_EFFECTS: TypeMapping<{
|
|
|
164
171
|
{ len: MAX_PRIVATE_LOGS_PER_TX },
|
|
165
172
|
'scalar',
|
|
166
173
|
],
|
|
167
|
-
};
|
|
174
|
+
});
|
|
168
175
|
|
|
169
|
-
const TXE_OFFCHAIN_EFFECTS: TypeMapping<{ effects: Fr[][] }> = {
|
|
176
|
+
const TXE_OFFCHAIN_EFFECTS: TypeMapping<{ effects: Fr[][] }> = LEAF({
|
|
177
|
+
kind: 'txe-offchain-effects',
|
|
170
178
|
serialization: {
|
|
171
179
|
fn: ({ effects }) => {
|
|
172
180
|
const rawArrayStorage = effects
|
|
@@ -188,9 +196,10 @@ const TXE_OFFCHAIN_EFFECTS: TypeMapping<{ effects: Fr[][] }> = {
|
|
|
188
196
|
{ len: MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY },
|
|
189
197
|
'scalar',
|
|
190
198
|
],
|
|
191
|
-
};
|
|
199
|
+
});
|
|
192
200
|
|
|
193
|
-
const TXE_CALL_CONTEXT: TypeMapping<{ txHash: Fr; anchorBlockTimestamp: bigint }> = {
|
|
201
|
+
const TXE_CALL_CONTEXT: TypeMapping<{ txHash: Fr; anchorBlockTimestamp: bigint }> = LEAF({
|
|
202
|
+
kind: 'txe-call-context',
|
|
194
203
|
serialization: {
|
|
195
204
|
fn: ({ txHash, anchorBlockTimestamp }) => {
|
|
196
205
|
const isSome = txHash.isZero() ? 0 : 1;
|
|
@@ -198,7 +207,7 @@ const TXE_CALL_CONTEXT: TypeMapping<{ txHash: Fr; anchorBlockTimestamp: bigint }
|
|
|
198
207
|
},
|
|
199
208
|
},
|
|
200
209
|
shape: ['scalar', 'scalar', 'scalar'], // discriminant, txHash, anchor block timestamp
|
|
201
|
-
};
|
|
210
|
+
});
|
|
202
211
|
|
|
203
212
|
const CONTRACT_INSTANCE_MEMBER: TypeMapping<{ exists: boolean; member: Fr }[]> = FIXED_ARRAY(
|
|
204
213
|
STRUCT([
|
|
@@ -208,13 +217,14 @@ const CONTRACT_INSTANCE_MEMBER: TypeMapping<{ exists: boolean; member: Fr }[]> =
|
|
|
208
217
|
1,
|
|
209
218
|
);
|
|
210
219
|
|
|
211
|
-
const EVENT_SELECTOR: TypeMapping<EventSelector> = {
|
|
220
|
+
const EVENT_SELECTOR: TypeMapping<EventSelector> = SCALAR({
|
|
221
|
+
kind: 'event-selector',
|
|
212
222
|
serialization: { fn: v => [v.toField()] },
|
|
213
223
|
deserialization: { fn: ([reader]) => EventSelector.fromField(reader.readField()) },
|
|
214
|
-
|
|
215
|
-
};
|
|
224
|
+
});
|
|
216
225
|
|
|
217
|
-
const TXE_PRIVATE_EVENTS: TypeMapping<Fr[][]> = {
|
|
226
|
+
const TXE_PRIVATE_EVENTS: TypeMapping<Fr[][]> = LEAF({
|
|
227
|
+
kind: 'txe-private-events',
|
|
218
228
|
serialization: {
|
|
219
229
|
fn: events => {
|
|
220
230
|
const rawArrayStorage = events
|
|
@@ -235,7 +245,7 @@ const TXE_PRIVATE_EVENTS: TypeMapping<Fr[][]> = {
|
|
|
235
245
|
{ len: MAX_PRIVATE_EVENTS_PER_TXE_QUERY },
|
|
236
246
|
'scalar',
|
|
237
247
|
],
|
|
238
|
-
};
|
|
248
|
+
});
|
|
239
249
|
|
|
240
250
|
export const TXE_ORACLE_REGISTRY = {
|
|
241
251
|
...ORACLE_REGISTRY,
|
|
@@ -270,14 +280,14 @@ export const TXE_ORACLE_REGISTRY = {
|
|
|
270
280
|
|
|
271
281
|
aztec_txe_getNextBlockNumber: makeEntry({ returnType: BLOCK_NUMBER }),
|
|
272
282
|
|
|
273
|
-
aztec_txe_getNextBlockTimestamp: makeEntry({ returnType:
|
|
283
|
+
aztec_txe_getNextBlockTimestamp: makeEntry({ returnType: U64 }),
|
|
274
284
|
|
|
275
285
|
aztec_txe_advanceBlocksBy: makeEntry({
|
|
276
286
|
params: [{ name: 'blocks', type: U32 }],
|
|
277
287
|
}),
|
|
278
288
|
|
|
279
289
|
aztec_txe_advanceTimestampBy: makeEntry({
|
|
280
|
-
params: [{ name: 'duration', type:
|
|
290
|
+
params: [{ name: 'duration', type: U64 }],
|
|
281
291
|
}),
|
|
282
292
|
|
|
283
293
|
aztec_txe_deploy: makeEntry({
|
|
@@ -294,7 +304,10 @@ export const TXE_ORACLE_REGISTRY = {
|
|
|
294
304
|
}),
|
|
295
305
|
|
|
296
306
|
aztec_txe_createAccount: makeEntry({
|
|
297
|
-
params: [
|
|
307
|
+
params: [
|
|
308
|
+
{ name: 'secret', type: FIELD },
|
|
309
|
+
{ name: 'partialAddress', type: FIELD },
|
|
310
|
+
],
|
|
298
311
|
returnType: COMPLETE_ADDRESS,
|
|
299
312
|
}),
|
|
300
313
|
|
|
@@ -320,12 +333,19 @@ export const TXE_ORACLE_REGISTRY = {
|
|
|
320
333
|
returnType: FIELD,
|
|
321
334
|
}),
|
|
322
335
|
|
|
323
|
-
|
|
324
|
-
params: [
|
|
336
|
+
aztec_txe_setTaggingSecretStrategies: makeEntry({
|
|
337
|
+
params: [
|
|
338
|
+
{ name: 'unconstrainedStrategy', type: OPTION(TAGGING_SECRET_STRATEGY) },
|
|
339
|
+
{ name: 'constrainedStrategy', type: OPTION(TAGGING_SECRET_STRATEGY) },
|
|
340
|
+
],
|
|
341
|
+
}),
|
|
342
|
+
|
|
343
|
+
aztec_txe_setAuthorizeAllUtilityCallTargets: makeEntry({
|
|
344
|
+
params: [{ name: 'authorizeAll', type: BOOL }],
|
|
325
345
|
}),
|
|
326
346
|
|
|
327
347
|
aztec_txe_getLastBlockTimestamp: makeEntry({
|
|
328
|
-
returnType:
|
|
348
|
+
returnType: U64,
|
|
329
349
|
}),
|
|
330
350
|
|
|
331
351
|
aztec_txe_getLastTxEffects: makeEntry({ returnType: TXE_TX_EFFECTS }),
|
|
@@ -384,7 +404,7 @@ export const TXE_ORACLE_REGISTRY = {
|
|
|
384
404
|
|
|
385
405
|
aztec_avm_blockNumber: makeEntry({ returnType: BLOCK_NUMBER }),
|
|
386
406
|
|
|
387
|
-
aztec_avm_timestamp: makeEntry({ returnType:
|
|
407
|
+
aztec_avm_timestamp: makeEntry({ returnType: U64 }),
|
|
388
408
|
|
|
389
409
|
aztec_avm_isStaticCall: makeEntry({ returnType: BOOL }),
|
|
390
410
|
|
|
@@ -73,6 +73,7 @@ import {
|
|
|
73
73
|
} from '@aztec/stdlib/kernel';
|
|
74
74
|
import { deriveKeys, hashPublicKey } from '@aztec/stdlib/keys';
|
|
75
75
|
import type { PrivateLog } from '@aztec/stdlib/logs';
|
|
76
|
+
import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
|
|
76
77
|
import { L1Actor, L1ToL2Message, L2Actor } from '@aztec/stdlib/messaging';
|
|
77
78
|
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
78
79
|
import { makeGlobalVariables } from '@aztec/stdlib/testing';
|
|
@@ -99,6 +100,7 @@ import type { TXEAccountStore } from '../utils/txe_account_store.js';
|
|
|
99
100
|
import type { TXEArtifactResolver } from '../utils/txe_artifact_resolver.js';
|
|
100
101
|
import { TXEPublicContractDataSource } from '../utils/txe_public_contract_data_source.js';
|
|
101
102
|
import type { ITxeExecutionOracle } from './interfaces.js';
|
|
103
|
+
import { type TXETaggingSecretStrategies, makeResolveTaggingSecretStrategyHook } from './tagging_secret_strategy.js';
|
|
102
104
|
|
|
103
105
|
export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracle {
|
|
104
106
|
isMisc = true as const;
|
|
@@ -123,7 +125,8 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
123
125
|
private version: Fr,
|
|
124
126
|
private chainId: Fr,
|
|
125
127
|
private authwits: Map<string, AuthWitness>,
|
|
126
|
-
private
|
|
128
|
+
private taggingSecretStrategies: TXETaggingSecretStrategies,
|
|
129
|
+
private authorizeAllUtilityCallTargets: boolean,
|
|
127
130
|
private readonly artifactResolver: TXEArtifactResolver,
|
|
128
131
|
private readonly rootPath: string,
|
|
129
132
|
private readonly packageName: string,
|
|
@@ -333,9 +336,8 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
333
336
|
return completeAddress;
|
|
334
337
|
}
|
|
335
338
|
|
|
336
|
-
async createAccount(secret: Fr) {
|
|
337
|
-
|
|
338
|
-
const completeAddress = await this.keyStore.addAccount(await deriveKeys(secret), secret);
|
|
339
|
+
async createAccount(secret: Fr, partialAddress: Fr) {
|
|
340
|
+
const completeAddress = await this.keyStore.addAccount(await deriveKeys(secret), partialAddress);
|
|
339
341
|
await this.accountStore.setAccount(completeAddress.address, completeAddress);
|
|
340
342
|
await this.addressStore.addCompleteAddress(completeAddress);
|
|
341
343
|
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
@@ -356,8 +358,23 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
356
358
|
this.authwits.set(authWitness.requestHash.toString(), authWitness);
|
|
357
359
|
}
|
|
358
360
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
+
setTaggingSecretStrategies(
|
|
362
|
+
unconstrainedStrategy: Option<TaggingSecretStrategy>,
|
|
363
|
+
constrainedStrategy: Option<TaggingSecretStrategy>,
|
|
364
|
+
): void {
|
|
365
|
+
const apply = (mode: AppTaggingSecretKind, strategy: Option<TaggingSecretStrategy>) => {
|
|
366
|
+
if (strategy.isSome()) {
|
|
367
|
+
this.taggingSecretStrategies.set(mode, strategy.value);
|
|
368
|
+
} else {
|
|
369
|
+
this.taggingSecretStrategies.delete(mode);
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
apply(AppTaggingSecretKind.UNCONSTRAINED, unconstrainedStrategy);
|
|
373
|
+
apply(AppTaggingSecretKind.CONSTRAINED, constrainedStrategy);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
setAuthorizeAllUtilityCallTargets(authorizeAll: boolean): void {
|
|
377
|
+
this.authorizeAllUtilityCallTargets = authorizeAll;
|
|
361
378
|
}
|
|
362
379
|
|
|
363
380
|
async sendL1ToL2Message(content: Fr, secretHash: Fr, sender: EthAddress, recipient: AztecAddress): Promise<Fr> {
|
|
@@ -471,7 +488,6 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
471
488
|
const simulator = new WASMSimulator();
|
|
472
489
|
|
|
473
490
|
const transientArrayService = new TransientArrayService();
|
|
474
|
-
const taggingSecretStrategy = this.taggingSecretStrategy;
|
|
475
491
|
const privateExecutionOracle = new PrivateExecutionOracle({
|
|
476
492
|
argsHash,
|
|
477
493
|
txContext,
|
|
@@ -511,9 +527,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
511
527
|
isStaticCall ? 'private view' : 'private',
|
|
512
528
|
authorizedUtilityCallTargets,
|
|
513
529
|
),
|
|
514
|
-
|
|
515
|
-
// strategy is exercised.
|
|
516
|
-
resolveTaggingSecretStrategy: taggingSecretStrategy ? () => Promise.resolve(taggingSecretStrategy) : undefined,
|
|
530
|
+
resolveTaggingSecretStrategy: makeResolveTaggingSecretStrategyHook(this.taggingSecretStrategies),
|
|
517
531
|
}),
|
|
518
532
|
transientArrayService,
|
|
519
533
|
});
|
|
@@ -973,9 +987,19 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
973
987
|
}
|
|
974
988
|
}
|
|
975
989
|
|
|
976
|
-
close():
|
|
990
|
+
close(): {
|
|
991
|
+
nextBlockTimestamp: bigint;
|
|
992
|
+
authwits: Map<string, AuthWitness>;
|
|
993
|
+
taggingSecretStrategies: TXETaggingSecretStrategies;
|
|
994
|
+
authorizeAllUtilityCallTargets: boolean;
|
|
995
|
+
} {
|
|
977
996
|
this.logger.debug('Exiting Top Level Context');
|
|
978
|
-
return
|
|
997
|
+
return {
|
|
998
|
+
nextBlockTimestamp: this.nextBlockTimestamp,
|
|
999
|
+
authwits: this.authwits,
|
|
1000
|
+
taggingSecretStrategies: this.taggingSecretStrategies,
|
|
1001
|
+
authorizeAllUtilityCallTargets: this.authorizeAllUtilityCallTargets,
|
|
1002
|
+
};
|
|
979
1003
|
}
|
|
980
1004
|
|
|
981
1005
|
private async getLastBlockNumber(): Promise<BlockNumber> {
|
|
@@ -987,6 +1011,9 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
987
1011
|
callerContext: 'private' | 'private view' | 'utility',
|
|
988
1012
|
authorizedTargets: AztecAddress[],
|
|
989
1013
|
): ExecutionHooks['authorizeUtilityCall'] | undefined {
|
|
1014
|
+
if (this.authorizeAllUtilityCallTargets) {
|
|
1015
|
+
return authorizeAllUtilityCallsHook;
|
|
1016
|
+
}
|
|
990
1017
|
if (authorizedTargets.length === 0) {
|
|
991
1018
|
return undefined;
|
|
992
1019
|
}
|
|
@@ -996,3 +1023,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
996
1023
|
});
|
|
997
1024
|
}
|
|
998
1025
|
}
|
|
1026
|
+
|
|
1027
|
+
/**
|
|
1028
|
+
* An `authorizeUtilityCall` hook that authorizes every cross-contract utility call.
|
|
1029
|
+
*
|
|
1030
|
+
* Backs the `aztec_txe_setAuthorizeAllUtilityCallTargets` oracle.
|
|
1031
|
+
*/
|
|
1032
|
+
export const authorizeAllUtilityCallsHook: NonNullable<ExecutionHooks['authorizeUtilityCall']> = () =>
|
|
1033
|
+
Promise.resolve({ authorized: true });
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
*
|
|
6
6
|
* The Noir counterparts are in `noir-projects/aztec-nr/aztec/src/test/helpers/txe_oracles.nr`.
|
|
7
7
|
*/
|
|
8
|
-
export const TXE_ORACLE_VERSION_MAJOR =
|
|
9
|
-
export const TXE_ORACLE_VERSION_MINOR =
|
|
8
|
+
export const TXE_ORACLE_VERSION_MAJOR = 4;
|
|
9
|
+
export const TXE_ORACLE_VERSION_MINOR = 1;
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* This hash is computed from the TXE
|
|
12
|
+
* This hash is computed from the TXE-specific entries in `TXE_ORACLE_REGISTRY` and is used to
|
|
13
13
|
* detect when those interfaces change. When it does, bump:
|
|
14
14
|
* - TXE_ORACLE_VERSION_MAJOR (and reset MINOR to 0) for breaking changes, or
|
|
15
15
|
* - TXE_ORACLE_VERSION_MINOR for additive changes (new oracle method added).
|
|
16
16
|
*/
|
|
17
|
-
export const TXE_ORACLE_INTERFACE_HASH = '
|
|
17
|
+
export const TXE_ORACLE_INTERFACE_HASH = '1a6c578d0a47cd8dd7dae07fd00abe781225a73920c596d873afcc061c0e4284';
|
package/src/rpc_translator.ts
CHANGED
|
@@ -188,7 +188,7 @@ export class RPCTranslator {
|
|
|
188
188
|
return callTxeHandler({
|
|
189
189
|
oracle: 'aztec_txe_createAccount',
|
|
190
190
|
inputs,
|
|
191
|
-
handler: ([secret]) => this.handlerAsTxe().createAccount(secret),
|
|
191
|
+
handler: ([secret, partialAddress]) => this.handlerAsTxe().createAccount(secret, partialAddress),
|
|
192
192
|
});
|
|
193
193
|
}
|
|
194
194
|
|
|
@@ -221,11 +221,21 @@ export class RPCTranslator {
|
|
|
221
221
|
}
|
|
222
222
|
|
|
223
223
|
// eslint-disable-next-line camelcase
|
|
224
|
-
|
|
224
|
+
aztec_txe_setTaggingSecretStrategies(...inputs: ForeignCallArgs) {
|
|
225
225
|
return callTxeHandler({
|
|
226
|
-
oracle: '
|
|
226
|
+
oracle: 'aztec_txe_setTaggingSecretStrategies',
|
|
227
227
|
inputs,
|
|
228
|
-
handler: ([
|
|
228
|
+
handler: ([unconstrainedStrategy, constrainedStrategy]) =>
|
|
229
|
+
this.handlerAsTxe().setTaggingSecretStrategies(unconstrainedStrategy, constrainedStrategy),
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// eslint-disable-next-line camelcase
|
|
234
|
+
aztec_txe_setAuthorizeAllUtilityCallTargets(...inputs: ForeignCallArgs) {
|
|
235
|
+
return callTxeHandler({
|
|
236
|
+
oracle: 'aztec_txe_setAuthorizeAllUtilityCallTargets',
|
|
237
|
+
inputs,
|
|
238
|
+
handler: ([authorizeAll]) => this.handlerAsTxe().setAuthorizeAllUtilityCallTargets(authorizeAll),
|
|
229
239
|
});
|
|
230
240
|
}
|
|
231
241
|
|
|
@@ -488,12 +498,12 @@ export class RPCTranslator {
|
|
|
488
498
|
}
|
|
489
499
|
|
|
490
500
|
// eslint-disable-next-line camelcase
|
|
491
|
-
|
|
501
|
+
aztec_utl_getL1ToL2MembershipWitnessV2(...inputs: ForeignCallArgs) {
|
|
492
502
|
return callTxeHandler({
|
|
493
|
-
oracle: '
|
|
503
|
+
oracle: 'aztec_utl_getL1ToL2MembershipWitnessV2',
|
|
494
504
|
inputs,
|
|
495
|
-
handler: ([
|
|
496
|
-
this.handlerAsUtility().
|
|
505
|
+
handler: ([messageHash, nullifier]) =>
|
|
506
|
+
this.handlerAsUtility().getL1ToL2MembershipWitnessV2(messageHash, nullifier),
|
|
497
507
|
});
|
|
498
508
|
}
|
|
499
509
|
|
|
@@ -571,6 +581,16 @@ export class RPCTranslator {
|
|
|
571
581
|
});
|
|
572
582
|
}
|
|
573
583
|
|
|
584
|
+
// eslint-disable-next-line camelcase
|
|
585
|
+
aztec_utl_areBlockHashesInArchive(...inputs: ForeignCallArgs) {
|
|
586
|
+
return callTxeHandler({
|
|
587
|
+
oracle: 'aztec_utl_areBlockHashesInArchive',
|
|
588
|
+
inputs,
|
|
589
|
+
handler: ([anchorBlockHash, blockHashes]) =>
|
|
590
|
+
this.handlerAsUtility().areBlockHashesInArchive(anchorBlockHash, blockHashes),
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
|
|
574
594
|
// eslint-disable-next-line camelcase
|
|
575
595
|
aztec_utl_getLowNullifierMembershipWitness(...inputs: ForeignCallArgs) {
|
|
576
596
|
return callTxeHandler({
|
|
@@ -622,6 +642,15 @@ export class RPCTranslator {
|
|
|
622
642
|
});
|
|
623
643
|
}
|
|
624
644
|
|
|
645
|
+
// eslint-disable-next-line camelcase
|
|
646
|
+
aztec_utl_getTxEffects(...inputs: ForeignCallArgs) {
|
|
647
|
+
return callTxeHandler({
|
|
648
|
+
oracle: 'aztec_utl_getTxEffects',
|
|
649
|
+
inputs,
|
|
650
|
+
handler: ([txHashes]) => this.handlerAsUtility().getTxEffects(txHashes),
|
|
651
|
+
});
|
|
652
|
+
}
|
|
653
|
+
|
|
625
654
|
// eslint-disable-next-line camelcase
|
|
626
655
|
aztec_utl_setCapsule(...inputs: ForeignCallArgs) {
|
|
627
656
|
return callTxeHandler({
|
package/src/txe_session.ts
CHANGED
|
@@ -20,7 +20,6 @@ import {
|
|
|
20
20
|
RecipientTaggingStore,
|
|
21
21
|
SenderTaggingStore,
|
|
22
22
|
TaggingSecretSourcesStore,
|
|
23
|
-
type TaggingSecretStrategy,
|
|
24
23
|
composeHooks,
|
|
25
24
|
} from '@aztec/pxe/server';
|
|
26
25
|
import {
|
|
@@ -58,9 +57,13 @@ import { z } from 'zod';
|
|
|
58
57
|
|
|
59
58
|
import { DEFAULT_ADDRESS, MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY, MAX_OFFCHAIN_EFFECT_LEN } from './constants.js';
|
|
60
59
|
import type { IAvmExecutionOracle, ITxeExecutionOracle } from './oracle/interfaces.js';
|
|
60
|
+
import {
|
|
61
|
+
type TXETaggingSecretStrategies,
|
|
62
|
+
makeResolveTaggingSecretStrategyHook,
|
|
63
|
+
} from './oracle/tagging_secret_strategy.js';
|
|
61
64
|
import { TXEOraclePublicContext } from './oracle/txe_oracle_public_context.js';
|
|
62
65
|
import { callTxeLegacyHandler } from './oracle/txe_oracle_registry.js';
|
|
63
|
-
import { TXEOracleTopLevelContext } from './oracle/txe_oracle_top_level_context.js';
|
|
66
|
+
import { TXEOracleTopLevelContext, authorizeAllUtilityCallsHook } from './oracle/txe_oracle_top_level_context.js';
|
|
64
67
|
import { TXE_ORACLE_VERSION_MAJOR, TXE_ORACLE_VERSION_MINOR } from './oracle/txe_oracle_version.js';
|
|
65
68
|
import { TXEPrivateExecutionOracle } from './oracle/txe_private_execution_oracle.js';
|
|
66
69
|
import { RPCTranslator, UnavailableOracleError } from './rpc_translator.js';
|
|
@@ -237,7 +240,8 @@ function emptyLastCallState(): LastCallState {
|
|
|
237
240
|
export class TXESession implements TXESessionStateHandler {
|
|
238
241
|
private state: SessionState = { name: 'TOP_LEVEL' };
|
|
239
242
|
private authwits: Map<string, AuthWitness> = new Map();
|
|
240
|
-
private
|
|
243
|
+
private taggingSecretStrategies: TXETaggingSecretStrategies = new Map();
|
|
244
|
+
private authorizeAllUtilityCallTargets = false;
|
|
241
245
|
private lastCallInfo: LastCallState = emptyLastCallState();
|
|
242
246
|
private txeOracleVersion: { major: number; minor: number } | undefined;
|
|
243
247
|
|
|
@@ -365,7 +369,8 @@ export class TXESession implements TXESessionStateHandler {
|
|
|
365
369
|
version,
|
|
366
370
|
chainId,
|
|
367
371
|
new Map(),
|
|
368
|
-
|
|
372
|
+
new Map(),
|
|
373
|
+
false, // authorizeAllUtilityCallTargets
|
|
369
374
|
artifactResolver,
|
|
370
375
|
rootPath,
|
|
371
376
|
packageName,
|
|
@@ -695,7 +700,8 @@ export class TXESession implements TXESessionStateHandler {
|
|
|
695
700
|
this.version,
|
|
696
701
|
this.chainId,
|
|
697
702
|
this.authwits,
|
|
698
|
-
this.
|
|
703
|
+
this.taggingSecretStrategies,
|
|
704
|
+
this.authorizeAllUtilityCallTargets,
|
|
699
705
|
this.artifactResolver,
|
|
700
706
|
this.rootPath,
|
|
701
707
|
this.packageName,
|
|
@@ -745,7 +751,6 @@ export class TXESession implements TXESessionStateHandler {
|
|
|
745
751
|
this.stateMachine.contractClassService,
|
|
746
752
|
anchorBlock!,
|
|
747
753
|
);
|
|
748
|
-
const taggingSecretStrategy = this.taggingSecretStrategy;
|
|
749
754
|
this.oracleHandler = new TXEPrivateExecutionOracle({
|
|
750
755
|
argsHash: Fr.ZERO,
|
|
751
756
|
txContext: new TxContext(this.chainId, this.version, gasSettings),
|
|
@@ -776,7 +781,8 @@ export class TXESession implements TXESessionStateHandler {
|
|
|
776
781
|
txResolver: this.stateMachine.txResolver,
|
|
777
782
|
simulator: new WASMSimulator(),
|
|
778
783
|
hooks: composeHooks({
|
|
779
|
-
resolveTaggingSecretStrategy:
|
|
784
|
+
resolveTaggingSecretStrategy: makeResolveTaggingSecretStrategyHook(this.taggingSecretStrategies),
|
|
785
|
+
authorizeUtilityCall: this.authorizeAllUtilityCallTargets ? authorizeAllUtilityCallsHook : undefined,
|
|
780
786
|
}),
|
|
781
787
|
transientArrayService,
|
|
782
788
|
});
|
|
@@ -877,6 +883,9 @@ export class TXESession implements TXESessionStateHandler {
|
|
|
877
883
|
scopes: await this.keyStore.getAccounts(),
|
|
878
884
|
simulator: new WASMSimulator(),
|
|
879
885
|
utilityExecutor: this.utilityExecutorForContractSync(anchorBlockHeader),
|
|
886
|
+
hooks: composeHooks({
|
|
887
|
+
authorizeUtilityCall: this.authorizeAllUtilityCallTargets ? authorizeAllUtilityCallsHook : undefined,
|
|
888
|
+
}),
|
|
880
889
|
// Execution-tree root (top-level utility run): own store; nested frames inherit it.
|
|
881
890
|
transientArrayService: new TransientArrayService(),
|
|
882
891
|
});
|
|
@@ -899,15 +908,18 @@ export class TXESession implements TXESessionStateHandler {
|
|
|
899
908
|
// accounts to PXE (via `addAccount`), etc. This is a slight inconsistency in the working model of this class, but
|
|
900
909
|
// is not too bad. The `close` call below therefore only hands back the session-scoped values that a test
|
|
901
910
|
// sets directly at the top level, outside any contract execution (e.g. via `advanceTimestampBy`,
|
|
902
|
-
// `addAuthWitness`, `
|
|
911
|
+
// `addAuthWitness`, `setTaggingSecretStrategies`). The oracle handler is discarded on every state transition,
|
|
903
912
|
// so the session must seed these values into the contexts it creates later.
|
|
904
913
|
|
|
905
914
|
// TODO: persisting authwits this way is quite unfortunate: they create a temporary utility context that would
|
|
906
915
|
// otherwise reset them, so we'd not be able to pass more than one per execution. Ideally authwits would be passed
|
|
907
916
|
// alongside a contract call instead of pre-seeded.
|
|
908
|
-
|
|
909
|
-
this.
|
|
910
|
-
|
|
917
|
+
({
|
|
918
|
+
nextBlockTimestamp: this.nextBlockTimestamp,
|
|
919
|
+
authwits: this.authwits,
|
|
920
|
+
taggingSecretStrategies: this.taggingSecretStrategies,
|
|
921
|
+
authorizeAllUtilityCallTargets: this.authorizeAllUtilityCallTargets,
|
|
922
|
+
} = (this.oracleHandler as TXEOracleTopLevelContext).close());
|
|
911
923
|
}
|
|
912
924
|
|
|
913
925
|
private async exitPrivateState() {
|