@aztec/pxe 0.0.1-commit.35158ae7e → 0.0.1-commit.3750d92a7
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/bin/check_oracle_version.js +4 -4
- package/dest/block_synchronizer/block_synchronizer.d.ts +1 -1
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +6 -0
- package/dest/config/index.d.ts +1 -1
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +7 -14
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +3 -4
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +4 -3
- package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
- package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
- package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +3 -4
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +3 -6
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -1
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -4
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/note_validation_request.js +3 -6
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +31 -20
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +1 -1
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +28 -23
- package/dest/contract_function_simulator/oracle/oracle.d.ts +50 -20
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +157 -41
- package/dest/contract_function_simulator/oracle/private_execution.js +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +7 -8
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +16 -7
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +47 -32
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +164 -77
- package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
- package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
- package/dest/contract_function_simulator/pick_notes.js +9 -2
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.js +3 -0
- package/dest/contract_logging.d.ts +9 -4
- package/dest/contract_logging.d.ts.map +1 -1
- package/dest/contract_logging.js +21 -6
- package/dest/contract_sync/contract_sync_service.d.ts +3 -4
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
- package/dest/contract_sync/contract_sync_service.js +12 -22
- package/dest/contract_sync/helpers.d.ts +2 -3
- package/dest/contract_sync/helpers.d.ts.map +1 -1
- package/dest/contract_sync/helpers.js +7 -2
- package/dest/debug/pxe_debug_utils.d.ts +3 -3
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.d.ts +1 -2
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +0 -1
- package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +2 -2
- package/dest/entrypoints/client/lazy/index.d.ts +1 -2
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +0 -1
- package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +2 -2
- package/dest/entrypoints/pxe_creation_options.d.ts +3 -1
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/pxe_creation_options.js +3 -1
- package/dest/entrypoints/server/index.d.ts +2 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +1 -2
- package/dest/entrypoints/server/utils.d.ts +2 -2
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +2 -2
- package/dest/events/event_service.d.ts +3 -2
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +16 -4
- package/dest/logs/log_service.d.ts +5 -8
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +23 -37
- package/dest/messages/message_context_service.d.ts +3 -3
- package/dest/messages/message_context_service.d.ts.map +1 -1
- package/dest/messages/message_context_service.js +3 -3
- package/dest/notes/note_service.d.ts +4 -5
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +14 -5
- package/dest/notes_filter.d.ts +2 -3
- package/dest/notes_filter.d.ts.map +1 -1
- package/dest/oracle_version.d.ts +4 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +20 -10
- package/dest/pxe.d.ts +4 -5
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +9 -4
- package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
- package/dest/storage/capsule_store/capsule_service.js +50 -0
- package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +33 -28
- package/dest/storage/capsule_store/index.d.ts +2 -1
- package/dest/storage/capsule_store/index.d.ts.map +1 -1
- package/dest/storage/capsule_store/index.js +1 -0
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +1 -1
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +2 -2
- package/dest/storage/private_event_store/stored_private_event.js +1 -1
- package/package.json +16 -16
- package/src/bin/check_oracle_version.ts +4 -4
- package/src/block_synchronizer/block_synchronizer.ts +6 -0
- package/src/config/index.ts +2 -8
- package/src/contract_function_simulator/contract_function_simulator.ts +6 -6
- package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -4
- package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +1 -1
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +1 -1
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -4
- package/src/contract_function_simulator/oracle/interfaces.ts +46 -18
- package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +20 -51
- package/src/contract_function_simulator/oracle/oracle.ts +222 -36
- package/src/contract_function_simulator/oracle/private_execution.ts +1 -1
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +19 -10
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +280 -98
- package/src/contract_function_simulator/pick_notes.ts +9 -2
- package/src/contract_function_simulator/proxied_contract_data_source.ts +8 -1
- package/src/contract_logging.ts +18 -5
- package/src/contract_sync/contract_sync_service.ts +32 -43
- package/src/contract_sync/helpers.ts +4 -4
- package/src/debug/pxe_debug_utils.ts +3 -3
- package/src/entrypoints/client/bundle/index.ts +0 -1
- package/src/entrypoints/client/bundle/utils.ts +2 -3
- package/src/entrypoints/client/lazy/index.ts +0 -1
- package/src/entrypoints/client/lazy/utils.ts +2 -3
- package/src/entrypoints/pxe_creation_options.ts +7 -0
- package/src/entrypoints/server/index.ts +1 -2
- package/src/entrypoints/server/utils.ts +2 -3
- package/src/events/event_service.ts +17 -4
- package/src/logs/log_service.ts +51 -78
- package/src/messages/message_context_service.ts +3 -4
- package/src/notes/note_service.ts +18 -8
- package/src/notes_filter.ts +1 -3
- package/src/oracle_version.ts +20 -10
- package/src/pxe.ts +17 -10
- package/src/storage/capsule_store/capsule_service.ts +90 -0
- package/src/storage/capsule_store/capsule_store.ts +34 -26
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +2 -5
- package/src/storage/private_event_store/stored_private_event.ts +1 -1
- package/dest/access_scopes.d.ts +0 -9
- package/dest/access_scopes.d.ts.map +0 -1
- package/dest/access_scopes.js +0 -6
- package/dest/contract_function_simulator/noir-structs/message_tx_context.d.ts +0 -16
- package/dest/contract_function_simulator/noir-structs/message_tx_context.d.ts.map +0 -1
- package/dest/contract_function_simulator/noir-structs/message_tx_context.js +0 -57
- package/src/access_scopes.ts +0 -9
- package/src/contract_function_simulator/noir-structs/message_tx_context.ts +0 -55
|
@@ -15,31 +15,30 @@ import { siloNullifier } from '@aztec/stdlib/hash';
|
|
|
15
15
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
16
16
|
import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
|
|
17
17
|
import { type PublicKeys, computeAddressSecret } from '@aztec/stdlib/keys';
|
|
18
|
-
import {
|
|
18
|
+
import { MessageContext, deriveAppSiloedSharedSecret } from '@aztec/stdlib/logs';
|
|
19
19
|
import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
|
|
20
20
|
import type { NoteStatus } from '@aztec/stdlib/note';
|
|
21
21
|
import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
22
22
|
import type { BlockHeader, Capsule, OffchainEffect } from '@aztec/stdlib/tx';
|
|
23
23
|
|
|
24
|
-
import
|
|
25
|
-
import { createContractLogger, logContractMessage } from '../../contract_logging.js';
|
|
24
|
+
import { createContractLogger, logContractMessage, stripAztecnrLogPrefix } from '../../contract_logging.js';
|
|
26
25
|
import type { ContractSyncService } from '../../contract_sync/contract_sync_service.js';
|
|
27
26
|
import { EventService } from '../../events/event_service.js';
|
|
28
27
|
import { LogService } from '../../logs/log_service.js';
|
|
29
28
|
import { MessageContextService } from '../../messages/message_context_service.js';
|
|
30
29
|
import { NoteService } from '../../notes/note_service.js';
|
|
31
|
-
import {
|
|
30
|
+
import { ORACLE_VERSION_MAJOR } from '../../oracle_version.js';
|
|
32
31
|
import type { AddressStore } from '../../storage/address_store/address_store.js';
|
|
33
|
-
import type {
|
|
32
|
+
import type { CapsuleService } from '../../storage/capsule_store/capsule_service.js';
|
|
34
33
|
import type { ContractStore } from '../../storage/contract_store/contract_store.js';
|
|
35
34
|
import type { NoteStore } from '../../storage/note_store/note_store.js';
|
|
36
35
|
import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
|
|
37
36
|
import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
|
|
38
37
|
import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js';
|
|
38
|
+
import { EphemeralArrayService } from '../ephemeral_array_service.js';
|
|
39
39
|
import { EventValidationRequest } from '../noir-structs/event_validation_request.js';
|
|
40
40
|
import { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
|
|
41
41
|
import { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
|
|
42
|
-
import { MessageTxContext } from '../noir-structs/message_tx_context.js';
|
|
43
42
|
import { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
|
|
44
43
|
import { UtilityContext } from '../noir-structs/utility_context.js';
|
|
45
44
|
import { pickNotes } from '../pick_notes.js';
|
|
@@ -60,13 +59,13 @@ export type UtilityExecutionOracleArgs = {
|
|
|
60
59
|
aztecNode: AztecNode;
|
|
61
60
|
recipientTaggingStore: RecipientTaggingStore;
|
|
62
61
|
senderAddressBookStore: SenderAddressBookStore;
|
|
63
|
-
|
|
62
|
+
capsuleService: CapsuleService;
|
|
64
63
|
privateEventStore: PrivateEventStore;
|
|
65
64
|
messageContextService: MessageContextService;
|
|
66
65
|
contractSyncService: ContractSyncService;
|
|
67
66
|
jobId: string;
|
|
68
67
|
log?: ReturnType<typeof createLogger>;
|
|
69
|
-
scopes:
|
|
68
|
+
scopes: AztecAddress[];
|
|
70
69
|
};
|
|
71
70
|
|
|
72
71
|
/**
|
|
@@ -77,7 +76,12 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
77
76
|
isUtility = true as const;
|
|
78
77
|
|
|
79
78
|
private contractLogger: Logger | undefined;
|
|
79
|
+
private aztecnrLogger: Logger | undefined;
|
|
80
80
|
private offchainEffects: OffchainEffect[] = [];
|
|
81
|
+
private readonly ephemeralArrayService = new EphemeralArrayService();
|
|
82
|
+
|
|
83
|
+
// We store oracle version to be able to show a nice error message when an oracle handler is missing.
|
|
84
|
+
private contractOracleVersion: { major: number; minor: number } | undefined;
|
|
81
85
|
|
|
82
86
|
protected readonly contractAddress: AztecAddress;
|
|
83
87
|
protected readonly authWitnesses: AuthWitness[];
|
|
@@ -90,13 +94,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
90
94
|
protected readonly aztecNode: AztecNode;
|
|
91
95
|
protected readonly recipientTaggingStore: RecipientTaggingStore;
|
|
92
96
|
protected readonly senderAddressBookStore: SenderAddressBookStore;
|
|
93
|
-
protected readonly
|
|
97
|
+
protected readonly capsuleService: CapsuleService;
|
|
94
98
|
protected readonly privateEventStore: PrivateEventStore;
|
|
95
99
|
protected readonly messageContextService: MessageContextService;
|
|
96
100
|
protected readonly contractSyncService: ContractSyncService;
|
|
97
101
|
protected readonly jobId: string;
|
|
98
102
|
protected logger: ReturnType<typeof createLogger>;
|
|
99
|
-
protected readonly scopes:
|
|
103
|
+
protected readonly scopes: AztecAddress[];
|
|
100
104
|
|
|
101
105
|
constructor(args: UtilityExecutionOracleArgs) {
|
|
102
106
|
this.contractAddress = args.contractAddress;
|
|
@@ -110,7 +114,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
110
114
|
this.aztecNode = args.aztecNode;
|
|
111
115
|
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
112
116
|
this.senderAddressBookStore = args.senderAddressBookStore;
|
|
113
|
-
this.
|
|
117
|
+
this.capsuleService = args.capsuleService;
|
|
114
118
|
this.privateEventStore = args.privateEventStore;
|
|
115
119
|
this.messageContextService = args.messageContextService;
|
|
116
120
|
this.contractSyncService = args.contractSyncService;
|
|
@@ -119,7 +123,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
119
123
|
this.scopes = args.scopes;
|
|
120
124
|
}
|
|
121
125
|
|
|
122
|
-
public assertCompatibleOracleVersion(
|
|
126
|
+
public assertCompatibleOracleVersion(major: number, minor: number): void {
|
|
123
127
|
// TODO(F-416): Remove this hack on v5 when protocol contracts are redeployed.
|
|
124
128
|
// Protocol contracts/canonical contracts shipped with committed bytecode that cannot be changed. Assert they use
|
|
125
129
|
// the expected pinned version or the current one. We want to allow for both the pinned and the current versions
|
|
@@ -127,17 +131,36 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
127
131
|
// pinned contracts (like e.g. next)
|
|
128
132
|
const LEGACY_ORACLE_VERSION = 12;
|
|
129
133
|
if (isProtocolContract(this.contractAddress)) {
|
|
130
|
-
if (
|
|
134
|
+
if (major !== LEGACY_ORACLE_VERSION && major !== ORACLE_VERSION_MAJOR) {
|
|
135
|
+
const hint =
|
|
136
|
+
major > ORACLE_VERSION_MAJOR
|
|
137
|
+
? 'The contract was compiled with a newer version of Aztec.nr than your private environment supports. Upgrade your private environment to a compatible version.'
|
|
138
|
+
: 'The contract was compiled with an older version of Aztec.nr than your private environment supports. Recompile the contract with a compatible version of Aztec.nr.';
|
|
131
139
|
throw new Error(
|
|
132
|
-
`
|
|
140
|
+
`Incompatible private environment version: ${hint} See https://docs.aztec.network/errors/8 (expected oracle major version ${LEGACY_ORACLE_VERSION} or ${ORACLE_VERSION_MAJOR}, got ${major})`,
|
|
133
141
|
);
|
|
134
142
|
}
|
|
143
|
+
this.contractOracleVersion = { major, minor };
|
|
135
144
|
return;
|
|
136
145
|
}
|
|
137
146
|
|
|
138
|
-
if (
|
|
139
|
-
|
|
147
|
+
if (major !== ORACLE_VERSION_MAJOR) {
|
|
148
|
+
const hint =
|
|
149
|
+
major > ORACLE_VERSION_MAJOR
|
|
150
|
+
? 'The contract was compiled with a newer version of Aztec.nr than your private environment supports. Upgrade your private environment to a compatible version.'
|
|
151
|
+
: 'The contract was compiled with an older version of Aztec.nr than your private environment supports. Recompile the contract with a compatible version of Aztec.nr.';
|
|
152
|
+
throw new Error(
|
|
153
|
+
`Incompatible private environment version: ${hint} See https://docs.aztec.network/errors/8 (expected oracle major version ${ORACLE_VERSION_MAJOR}, got ${major})`,
|
|
154
|
+
);
|
|
140
155
|
}
|
|
156
|
+
|
|
157
|
+
// Major matches - store both major and minor for later diagnostics (e.g. when an oracle is not found)
|
|
158
|
+
this.contractOracleVersion = { major, minor };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Prefixed with "nonOracleFunction" as it is not used as an oracle handler.
|
|
162
|
+
public nonOracleFunctionGetContractOracleVersion(): { major: number; minor: number } | undefined {
|
|
163
|
+
return this.contractOracleVersion;
|
|
141
164
|
}
|
|
142
165
|
|
|
143
166
|
public getRandomField(): Fr {
|
|
@@ -156,18 +179,15 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
156
179
|
* @throws If scopes are defined and the account is not in the scopes.
|
|
157
180
|
*/
|
|
158
181
|
public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
|
|
164
|
-
hasAccess = true;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
if (!hasAccess) {
|
|
168
|
-
throw new Error(`Key validation request denied: no scoped account has a key with hash ${pkMHash.toString()}.`);
|
|
182
|
+
let hasAccess = false;
|
|
183
|
+
for (let i = 0; i < this.scopes.length && !hasAccess; i++) {
|
|
184
|
+
if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
|
|
185
|
+
hasAccess = true;
|
|
169
186
|
}
|
|
170
187
|
}
|
|
188
|
+
if (!hasAccess) {
|
|
189
|
+
throw new Error(`Key validation request denied: no scoped account has a key with hash ${pkMHash.toString()}.`);
|
|
190
|
+
}
|
|
171
191
|
return this.keyStore.getKeyValidationRequest(pkMHash, this.contractAddress);
|
|
172
192
|
}
|
|
173
193
|
|
|
@@ -275,7 +295,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
275
295
|
* @param account - The account address.
|
|
276
296
|
* @returns The public keys and partial address, or `undefined` if the account is not registered.
|
|
277
297
|
*/
|
|
278
|
-
public async
|
|
298
|
+
public async getPublicKeysAndPartialAddress(
|
|
279
299
|
account: AztecAddress,
|
|
280
300
|
): Promise<{ publicKeys: PublicKeys; partialAddress: PartialAddress } | undefined> {
|
|
281
301
|
const completeAddress = await this.addressStore.getCompleteAddress(account);
|
|
@@ -381,7 +401,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
381
401
|
* @param innerNullifier - The inner nullifier.
|
|
382
402
|
* @returns A boolean indicating whether the nullifier exists in the tree or not.
|
|
383
403
|
*/
|
|
384
|
-
public async
|
|
404
|
+
public async doesNullifierExist(innerNullifier: Fr) {
|
|
385
405
|
const [nullifier, anchorBlockHash] = await Promise.all([
|
|
386
406
|
siloNullifier(this.contractAddress, innerNullifier!),
|
|
387
407
|
this.anchorBlockHeader.hash(),
|
|
@@ -419,7 +439,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
419
439
|
* @param startStorageSlot - The starting storage slot.
|
|
420
440
|
* @param numberOfElements - Number of elements to read from the starting storage slot.
|
|
421
441
|
*/
|
|
422
|
-
public
|
|
442
|
+
public getFromPublicStorage(
|
|
423
443
|
blockHash: BlockHash,
|
|
424
444
|
contractAddress: AztecAddress,
|
|
425
445
|
startStorageSlot: Fr,
|
|
@@ -443,7 +463,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
443
463
|
}
|
|
444
464
|
|
|
445
465
|
/**
|
|
446
|
-
* Returns a per-contract logger whose output is prefixed with `
|
|
466
|
+
* Returns a per-contract logger whose output is prefixed with `contract:<name>(<addrAbbrev>)`.
|
|
447
467
|
*/
|
|
448
468
|
async #getContractLogger(): Promise<Logger> {
|
|
449
469
|
if (!this.contractLogger) {
|
|
@@ -452,45 +472,78 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
452
472
|
this.contractLogger = await createContractLogger(
|
|
453
473
|
this.contractAddress,
|
|
454
474
|
addr => this.contractStore.getDebugContractName(addr),
|
|
475
|
+
'user',
|
|
455
476
|
{ instanceId: this.jobId },
|
|
456
477
|
);
|
|
457
478
|
}
|
|
458
479
|
return this.contractLogger;
|
|
459
480
|
}
|
|
460
481
|
|
|
482
|
+
/**
|
|
483
|
+
* Returns a per-contract logger whose output is prefixed with `aztecnr:<name>(<addrAbbrev>)`.
|
|
484
|
+
*/
|
|
485
|
+
async #getAztecnrLogger(): Promise<Logger> {
|
|
486
|
+
if (!this.aztecnrLogger) {
|
|
487
|
+
// Purpose of instanceId is to distinguish logs from different instances of the same component. It makes sense
|
|
488
|
+
// to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
|
|
489
|
+
this.aztecnrLogger = await createContractLogger(
|
|
490
|
+
this.contractAddress,
|
|
491
|
+
addr => this.contractStore.getDebugContractName(addr),
|
|
492
|
+
'aztecnr',
|
|
493
|
+
{ instanceId: this.jobId },
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
return this.aztecnrLogger;
|
|
497
|
+
}
|
|
498
|
+
|
|
461
499
|
public async log(level: number, message: string, fields: Fr[]): Promise<void> {
|
|
462
500
|
if (!LogLevels[level]) {
|
|
463
501
|
throw new Error(`Invalid log level: ${level}`);
|
|
464
502
|
}
|
|
465
|
-
|
|
466
|
-
|
|
503
|
+
|
|
504
|
+
const { kind, message: strippedMessage } = stripAztecnrLogPrefix(message);
|
|
505
|
+
|
|
506
|
+
const logger = kind == 'aztecnr' ? await this.#getAztecnrLogger() : await this.#getContractLogger();
|
|
507
|
+
logContractMessage(logger, LogLevels[level], strippedMessage, fields);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// Deprecated, only kept for backwards compatibility until Alpha v5 rolls out.
|
|
511
|
+
public async getPendingTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr, scope: AztecAddress) {
|
|
512
|
+
const logService = this.#createLogService();
|
|
513
|
+
const logs = await logService.fetchTaggedLogs(this.contractAddress, scope);
|
|
514
|
+
await this.capsuleService.appendToCapsuleArray(
|
|
515
|
+
this.contractAddress,
|
|
516
|
+
pendingTaggedLogArrayBaseSlot,
|
|
517
|
+
logs.map(log => log.toFields()),
|
|
518
|
+
this.jobId,
|
|
519
|
+
scope,
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/** Fetches pending tagged logs into a freshly allocated ephemeral array and returns its base slot. */
|
|
524
|
+
public async getPendingTaggedLogsV2(scope: AztecAddress): Promise<Fr> {
|
|
525
|
+
const logService = this.#createLogService();
|
|
526
|
+
const logs = await logService.fetchTaggedLogs(this.contractAddress, scope);
|
|
527
|
+
return this.ephemeralArrayService.newArray(logs.map(log => log.toFields()));
|
|
467
528
|
}
|
|
468
529
|
|
|
469
|
-
|
|
470
|
-
|
|
530
|
+
#createLogService(): LogService {
|
|
531
|
+
return new LogService(
|
|
471
532
|
this.aztecNode,
|
|
472
533
|
this.anchorBlockHeader,
|
|
473
534
|
this.keyStore,
|
|
474
|
-
this.capsuleStore,
|
|
475
535
|
this.recipientTaggingStore,
|
|
476
536
|
this.senderAddressBookStore,
|
|
477
537
|
this.addressStore,
|
|
478
538
|
this.jobId,
|
|
479
539
|
this.logger.getBindings(),
|
|
480
540
|
);
|
|
481
|
-
|
|
482
|
-
await logService.fetchTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes);
|
|
483
541
|
}
|
|
484
542
|
|
|
485
543
|
/**
|
|
486
|
-
*
|
|
487
|
-
* `enqueue_event_for_validation`, inserting them into the note database and event store respectively, making them
|
|
488
|
-
* queryable via `get_notes` and `getPrivateEvents`.
|
|
544
|
+
* Legacy: validates note/event requests stored in capsule arrays.
|
|
489
545
|
*
|
|
490
|
-
*
|
|
491
|
-
* @param contractAddress - The address of the contract that the logs are tagged for.
|
|
492
|
-
* @param noteValidationRequestsArrayBaseSlot - The base slot of capsule array containing note validation requests.
|
|
493
|
-
* @param eventValidationRequestsArrayBaseSlot - The base slot of capsule array containing event validation requests.
|
|
546
|
+
* Deprecated, only kept for backwards compatibility until Alpha v5 rolls out.
|
|
494
547
|
*/
|
|
495
548
|
public async validateAndStoreEnqueuedNotesAndEvents(
|
|
496
549
|
contractAddress: AztecAddress,
|
|
@@ -498,22 +551,78 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
498
551
|
eventValidationRequestsArrayBaseSlot: Fr,
|
|
499
552
|
maxNotePackedLen: number,
|
|
500
553
|
maxEventSerializedLen: number,
|
|
554
|
+
scope: AztecAddress,
|
|
501
555
|
) {
|
|
502
556
|
// TODO(#10727): allow other contracts to store notes
|
|
503
557
|
if (!this.contractAddress.equals(contractAddress)) {
|
|
504
558
|
throw new Error(`Got a note validation request from ${contractAddress}, expected ${this.contractAddress}`);
|
|
505
559
|
}
|
|
506
560
|
|
|
507
|
-
// We read all note and event validation requests and process them all concurrently. This makes the process much
|
|
508
|
-
// faster as we don't need to wait for the network round-trip.
|
|
509
561
|
const noteValidationRequests = (
|
|
510
|
-
await this.
|
|
562
|
+
await this.capsuleService.readCapsuleArray(
|
|
563
|
+
contractAddress,
|
|
564
|
+
noteValidationRequestsArrayBaseSlot,
|
|
565
|
+
this.jobId,
|
|
566
|
+
scope,
|
|
567
|
+
)
|
|
511
568
|
).map(fields => NoteValidationRequest.fromFields(fields, maxNotePackedLen));
|
|
512
569
|
|
|
513
570
|
const eventValidationRequests = (
|
|
514
|
-
await this.
|
|
571
|
+
await this.capsuleService.readCapsuleArray(
|
|
572
|
+
contractAddress,
|
|
573
|
+
eventValidationRequestsArrayBaseSlot,
|
|
574
|
+
this.jobId,
|
|
575
|
+
scope,
|
|
576
|
+
)
|
|
515
577
|
).map(fields => EventValidationRequest.fromFields(fields, maxEventSerializedLen));
|
|
516
578
|
|
|
579
|
+
await this.#processValidationRequests(noteValidationRequests, eventValidationRequests, scope);
|
|
580
|
+
|
|
581
|
+
await this.capsuleService.setCapsuleArray(
|
|
582
|
+
contractAddress,
|
|
583
|
+
noteValidationRequestsArrayBaseSlot,
|
|
584
|
+
[],
|
|
585
|
+
this.jobId,
|
|
586
|
+
scope,
|
|
587
|
+
);
|
|
588
|
+
await this.capsuleService.setCapsuleArray(
|
|
589
|
+
contractAddress,
|
|
590
|
+
eventValidationRequestsArrayBaseSlot,
|
|
591
|
+
[],
|
|
592
|
+
this.jobId,
|
|
593
|
+
scope,
|
|
594
|
+
);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
public async validateAndStoreEnqueuedNotesAndEventsV2(
|
|
598
|
+
noteValidationRequestsArrayBaseSlot: Fr,
|
|
599
|
+
eventValidationRequestsArrayBaseSlot: Fr,
|
|
600
|
+
maxNotePackedLen: number,
|
|
601
|
+
maxEventSerializedLen: number,
|
|
602
|
+
scope: AztecAddress,
|
|
603
|
+
) {
|
|
604
|
+
const noteValidationRequests = this.ephemeralArrayService
|
|
605
|
+
.readArrayAt(noteValidationRequestsArrayBaseSlot)
|
|
606
|
+
.map(fields => NoteValidationRequest.fromFields(fields, maxNotePackedLen));
|
|
607
|
+
|
|
608
|
+
const eventValidationRequests = this.ephemeralArrayService
|
|
609
|
+
.readArrayAt(eventValidationRequestsArrayBaseSlot)
|
|
610
|
+
.map(fields => EventValidationRequest.fromFields(fields, maxEventSerializedLen));
|
|
611
|
+
|
|
612
|
+
await this.#processValidationRequests(noteValidationRequests, eventValidationRequests, scope);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/**
|
|
616
|
+
* Dispatches note and event validation requests to the service layer.
|
|
617
|
+
*
|
|
618
|
+
* This function is an auxiliary to support legacy (capsule backed) and new (ephemeral array backed) versions of the
|
|
619
|
+
* `validateAndStoreEnqueuedNotesAndEvents` oracle.
|
|
620
|
+
*/
|
|
621
|
+
async #processValidationRequests(
|
|
622
|
+
noteValidationRequests: NoteValidationRequest[],
|
|
623
|
+
eventValidationRequests: EventValidationRequest[],
|
|
624
|
+
scope: AztecAddress,
|
|
625
|
+
) {
|
|
517
626
|
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
518
627
|
const noteStorePromises = noteValidationRequests.map(request =>
|
|
519
628
|
noteService.validateAndStoreNote(
|
|
@@ -526,7 +635,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
526
635
|
request.noteHash,
|
|
527
636
|
request.nullifier,
|
|
528
637
|
request.txHash,
|
|
529
|
-
|
|
638
|
+
scope,
|
|
530
639
|
),
|
|
531
640
|
);
|
|
532
641
|
|
|
@@ -539,21 +648,18 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
539
648
|
request.serializedEvent,
|
|
540
649
|
request.eventCommitment,
|
|
541
650
|
request.txHash,
|
|
542
|
-
|
|
651
|
+
scope,
|
|
543
652
|
),
|
|
544
653
|
);
|
|
545
654
|
|
|
546
655
|
await Promise.all([...noteStorePromises, ...eventStorePromises]);
|
|
547
|
-
|
|
548
|
-
// Requests are cleared once we're done.
|
|
549
|
-
await this.capsuleStore.setCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot, [], this.jobId);
|
|
550
|
-
await this.capsuleStore.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, [], this.jobId);
|
|
551
656
|
}
|
|
552
657
|
|
|
553
|
-
public async
|
|
658
|
+
public async getLogsByTag(
|
|
554
659
|
contractAddress: AztecAddress,
|
|
555
660
|
logRetrievalRequestsArrayBaseSlot: Fr,
|
|
556
661
|
logRetrievalResponsesArrayBaseSlot: Fr,
|
|
662
|
+
scope: AztecAddress,
|
|
557
663
|
) {
|
|
558
664
|
// TODO(#10727): allow other contracts to process partial notes
|
|
559
665
|
if (!this.contractAddress.equals(contractAddress)) {
|
|
@@ -563,48 +669,63 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
563
669
|
// We read all log retrieval requests and process them all concurrently. This makes the process much faster as we
|
|
564
670
|
// don't need to wait for the network round-trip.
|
|
565
671
|
const logRetrievalRequests = (
|
|
566
|
-
await this.
|
|
672
|
+
await this.capsuleService.readCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot, this.jobId, scope)
|
|
567
673
|
).map(LogRetrievalRequest.fromFields);
|
|
568
674
|
|
|
569
|
-
const logService =
|
|
570
|
-
|
|
571
|
-
this.anchorBlockHeader,
|
|
572
|
-
this.keyStore,
|
|
573
|
-
this.capsuleStore,
|
|
574
|
-
this.recipientTaggingStore,
|
|
575
|
-
this.senderAddressBookStore,
|
|
576
|
-
this.addressStore,
|
|
577
|
-
this.jobId,
|
|
578
|
-
this.logger.getBindings(),
|
|
579
|
-
);
|
|
580
|
-
|
|
581
|
-
const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);
|
|
675
|
+
const logService = this.#createLogService();
|
|
676
|
+
const maybeLogRetrievalResponses = await logService.fetchLogsByTag(contractAddress, logRetrievalRequests);
|
|
582
677
|
|
|
583
678
|
// Requests are cleared once we're done.
|
|
584
|
-
await this.
|
|
679
|
+
await this.capsuleService.setCapsuleArray(
|
|
680
|
+
contractAddress,
|
|
681
|
+
logRetrievalRequestsArrayBaseSlot,
|
|
682
|
+
[],
|
|
683
|
+
this.jobId,
|
|
684
|
+
scope,
|
|
685
|
+
);
|
|
585
686
|
|
|
586
687
|
// The responses are stored as Option<LogRetrievalResponse> in a second CapsuleArray.
|
|
587
|
-
await this.
|
|
688
|
+
await this.capsuleService.setCapsuleArray(
|
|
588
689
|
contractAddress,
|
|
589
690
|
logRetrievalResponsesArrayBaseSlot,
|
|
590
691
|
maybeLogRetrievalResponses.map(LogRetrievalResponse.toSerializedOption),
|
|
591
692
|
this.jobId,
|
|
693
|
+
scope,
|
|
592
694
|
);
|
|
593
695
|
}
|
|
594
696
|
|
|
595
|
-
public async
|
|
697
|
+
public async getLogsByTagV2(requestArrayBaseSlot: Fr): Promise<Fr> {
|
|
698
|
+
const logRetrievalRequests = this.ephemeralArrayService
|
|
699
|
+
.readArrayAt(requestArrayBaseSlot)
|
|
700
|
+
.map(LogRetrievalRequest.fromFields);
|
|
701
|
+
const logService = this.#createLogService();
|
|
702
|
+
|
|
703
|
+
const maybeLogRetrievalResponses = await logService.fetchLogsByTag(this.contractAddress, logRetrievalRequests);
|
|
704
|
+
|
|
705
|
+
return this.ephemeralArrayService.newArray(maybeLogRetrievalResponses.map(LogRetrievalResponse.toSerializedOption));
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
// Deprecated, only kept for backwards compatibility until Alpha v5 rolls out.
|
|
709
|
+
public async getMessageContextsByTxHash(
|
|
596
710
|
contractAddress: AztecAddress,
|
|
597
711
|
messageContextRequestsArrayBaseSlot: Fr,
|
|
598
712
|
messageContextResponsesArrayBaseSlot: Fr,
|
|
713
|
+
scope: AztecAddress,
|
|
599
714
|
) {
|
|
600
715
|
try {
|
|
601
716
|
if (!this.contractAddress.equals(contractAddress)) {
|
|
602
717
|
throw new Error(`Got a message context request from ${contractAddress}, expected ${this.contractAddress}`);
|
|
603
718
|
}
|
|
604
|
-
|
|
719
|
+
|
|
720
|
+
// TODO(@mverzilli): this is a prime example of where using an ephemeral array would make much more sense, we don't
|
|
721
|
+
// need scopes here, we just need a bit of shared memory to cross boundaries between Noir and TS.
|
|
722
|
+
// At the same time, we don't want to allow any global scope access other than where backwards compatibility
|
|
723
|
+
// forces us to. Hence we need the scope here to be artificial.
|
|
724
|
+
const requestCapsules = await this.capsuleService.readCapsuleArray(
|
|
605
725
|
contractAddress,
|
|
606
726
|
messageContextRequestsArrayBaseSlot,
|
|
607
727
|
this.jobId,
|
|
728
|
+
scope,
|
|
608
729
|
);
|
|
609
730
|
|
|
610
731
|
const txHashes = requestCapsules.map((fields, i) => {
|
|
@@ -616,66 +737,94 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
616
737
|
return fields[0];
|
|
617
738
|
});
|
|
618
739
|
|
|
619
|
-
const maybeMessageContexts = await this.messageContextService.
|
|
740
|
+
const maybeMessageContexts = await this.messageContextService.getMessageContextsByTxHash(
|
|
620
741
|
txHashes,
|
|
621
742
|
this.anchorBlockHeader.getBlockNumber(),
|
|
622
743
|
);
|
|
623
744
|
|
|
624
745
|
// Leave response in response capsule array.
|
|
625
|
-
await this.
|
|
746
|
+
await this.capsuleService.setCapsuleArray(
|
|
626
747
|
contractAddress,
|
|
627
748
|
messageContextResponsesArrayBaseSlot,
|
|
628
|
-
maybeMessageContexts.map(
|
|
749
|
+
maybeMessageContexts.map(MessageContext.toSerializedOption),
|
|
629
750
|
this.jobId,
|
|
751
|
+
scope,
|
|
630
752
|
);
|
|
631
753
|
} finally {
|
|
632
|
-
await this.
|
|
754
|
+
await this.capsuleService.setCapsuleArray(
|
|
755
|
+
contractAddress,
|
|
756
|
+
messageContextRequestsArrayBaseSlot,
|
|
757
|
+
[],
|
|
758
|
+
this.jobId,
|
|
759
|
+
scope,
|
|
760
|
+
);
|
|
633
761
|
}
|
|
634
762
|
}
|
|
635
763
|
|
|
636
|
-
|
|
764
|
+
/** Reads tx hash requests from an ephemeral array, resolves their contexts, and returns the response slot. */
|
|
765
|
+
public async getMessageContextsByTxHashV2(requestArrayBaseSlot: Fr): Promise<Fr> {
|
|
766
|
+
const requestFields = this.ephemeralArrayService.readArrayAt(requestArrayBaseSlot);
|
|
767
|
+
|
|
768
|
+
const txHashes = requestFields.map((fields, i) => {
|
|
769
|
+
if (fields.length !== 1) {
|
|
770
|
+
throw new Error(
|
|
771
|
+
`Malformed message context request at index ${i}: expected 1 field (tx hash), got ${fields.length}`,
|
|
772
|
+
);
|
|
773
|
+
}
|
|
774
|
+
return fields[0];
|
|
775
|
+
});
|
|
776
|
+
|
|
777
|
+
const maybeMessageContexts = await this.messageContextService.getMessageContextsByTxHash(
|
|
778
|
+
txHashes,
|
|
779
|
+
this.anchorBlockHeader.getBlockNumber(),
|
|
780
|
+
);
|
|
781
|
+
|
|
782
|
+
return this.ephemeralArrayService.newArray(maybeMessageContexts.map(MessageContext.toSerializedOption));
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
public setCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[], scope: AztecAddress): void {
|
|
637
786
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
638
787
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
639
788
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
640
789
|
}
|
|
641
|
-
this.
|
|
642
|
-
return Promise.resolve();
|
|
790
|
+
this.capsuleService.setCapsule(contractAddress, slot, capsule, this.jobId, scope);
|
|
643
791
|
}
|
|
644
792
|
|
|
645
|
-
public
|
|
793
|
+
public getCapsule(contractAddress: AztecAddress, slot: Fr, scope: AztecAddress): Promise<Fr[] | null> {
|
|
646
794
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
647
795
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
648
796
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
649
797
|
}
|
|
650
|
-
return (
|
|
651
|
-
// TODO(#12425): On the following line, the pertinent capsule gets overshadowed by the transient one. Tackle this.
|
|
652
|
-
this.capsules.find(c => c.contractAddress.equals(contractAddress) && c.storageSlot.equals(slot))?.data ??
|
|
653
|
-
(await this.capsuleStore.loadCapsule(this.contractAddress, slot, this.jobId))
|
|
654
|
-
);
|
|
798
|
+
return this.capsuleService.getCapsule(contractAddress, slot, this.jobId, scope, this.capsules);
|
|
655
799
|
}
|
|
656
800
|
|
|
657
|
-
public deleteCapsule(contractAddress: AztecAddress, slot: Fr):
|
|
801
|
+
public deleteCapsule(contractAddress: AztecAddress, slot: Fr, scope: AztecAddress): void {
|
|
658
802
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
659
803
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
660
804
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
661
805
|
}
|
|
662
|
-
this.
|
|
663
|
-
return Promise.resolve();
|
|
806
|
+
this.capsuleService.deleteCapsule(contractAddress, slot, this.jobId, scope);
|
|
664
807
|
}
|
|
665
808
|
|
|
666
|
-
public copyCapsule(
|
|
809
|
+
public copyCapsule(
|
|
810
|
+
contractAddress: AztecAddress,
|
|
811
|
+
srcSlot: Fr,
|
|
812
|
+
dstSlot: Fr,
|
|
813
|
+
numEntries: number,
|
|
814
|
+
scope: AztecAddress,
|
|
815
|
+
): Promise<void> {
|
|
667
816
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
668
817
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
669
818
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
670
819
|
}
|
|
671
|
-
return this.
|
|
820
|
+
return this.capsuleService.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, this.jobId, scope);
|
|
672
821
|
}
|
|
673
822
|
|
|
674
823
|
/**
|
|
675
824
|
* Clears cached sync state for a contract for a set of scopes, forcing re-sync on the next query so that newly
|
|
676
825
|
* stored notes or events are discovered.
|
|
677
826
|
*/
|
|
678
|
-
public
|
|
827
|
+
public setContractSyncCacheInvalid(contractAddress: AztecAddress, scopes: AztecAddress[]): void {
|
|
679
828
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
680
829
|
throw new Error(`Contract ${this.contractAddress} cannot invalidate sync cache of ${contractAddress}`);
|
|
681
830
|
}
|
|
@@ -683,25 +832,58 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
683
832
|
}
|
|
684
833
|
|
|
685
834
|
// TODO(#11849): consider replacing this oracle with a pure Noir implementation of aes decryption.
|
|
686
|
-
public
|
|
835
|
+
public decryptAes128(ciphertext: Buffer, iv: Buffer, symKey: Buffer): Promise<Buffer> {
|
|
687
836
|
const aes128 = new Aes128();
|
|
688
837
|
return aes128.decryptBufferCBC(ciphertext, iv, symKey);
|
|
689
838
|
}
|
|
690
839
|
|
|
691
840
|
/**
|
|
692
|
-
* Retrieves the shared secret for a given address and ephemeral public key.
|
|
841
|
+
* Retrieves the app-siloed shared secret for a given address and ephemeral public key.
|
|
693
842
|
* @param address - The address to get the secret for.
|
|
694
843
|
* @param ephPk - The ephemeral public key to get the secret for.
|
|
695
|
-
* @
|
|
844
|
+
* @param contractAddress - The contract address for app-siloing (validated against execution context).
|
|
845
|
+
* @returns The app-siloed shared secret as a Field.
|
|
696
846
|
*/
|
|
697
|
-
public async getSharedSecret(address: AztecAddress, ephPk: Point): Promise<
|
|
698
|
-
|
|
847
|
+
public async getSharedSecret(address: AztecAddress, ephPk: Point, contractAddress: AztecAddress): Promise<Fr> {
|
|
848
|
+
if (!contractAddress.equals(this.contractAddress)) {
|
|
849
|
+
throw new Error(
|
|
850
|
+
`getSharedSecret called with contract address ${contractAddress}, expected ${this.contractAddress}`,
|
|
851
|
+
);
|
|
852
|
+
}
|
|
699
853
|
const recipientCompleteAddress = await this.getCompleteAddressOrFail(address);
|
|
700
854
|
const ivskM = await this.keyStore.getMasterSecretKey(
|
|
701
855
|
recipientCompleteAddress.publicKeys.masterIncomingViewingPublicKey,
|
|
702
856
|
);
|
|
703
857
|
const addressSecret = await computeAddressSecret(await recipientCompleteAddress.getPreaddress(), ivskM);
|
|
704
|
-
return
|
|
858
|
+
return deriveAppSiloedSharedSecret(addressSecret, ephPk, this.contractAddress);
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
public pushEphemeral(slot: Fr, elements: Fr[]): number {
|
|
862
|
+
return this.ephemeralArrayService.push(slot, elements);
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
public popEphemeral(slot: Fr): Fr[] {
|
|
866
|
+
return this.ephemeralArrayService.pop(slot);
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
public getEphemeral(slot: Fr, index: number): Fr[] {
|
|
870
|
+
return this.ephemeralArrayService.get(slot, index);
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
public setEphemeral(slot: Fr, index: number, elements: Fr[]): void {
|
|
874
|
+
this.ephemeralArrayService.set(slot, index, elements);
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
public getEphemeralLen(slot: Fr): number {
|
|
878
|
+
return this.ephemeralArrayService.len(slot);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
public removeEphemeral(slot: Fr, index: number): void {
|
|
882
|
+
this.ephemeralArrayService.remove(slot, index);
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
public clearEphemeral(slot: Fr): void {
|
|
886
|
+
this.ephemeralArrayService.clear(slot);
|
|
705
887
|
}
|
|
706
888
|
|
|
707
889
|
public emitOffchainEffect(data: Fr[]): Promise<void> {
|