@aztec/pxe 0.0.1-commit.f295ac2 → 0.0.1-commit.f504929
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/access_scopes.d.ts +9 -0
- package/dest/access_scopes.d.ts.map +1 -0
- package/dest/access_scopes.js +6 -0
- package/dest/bin/check_oracle_version.js +1 -1
- package/dest/block_synchronizer/block_synchronizer.d.ts +9 -5
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +62 -16
- package/dest/config/index.d.ts +3 -1
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +17 -0
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +54 -30
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +178 -77
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +5 -5
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_tagging_index_cache.js +3 -3
- package/dest/contract_function_simulator/index.d.ts +2 -2
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +2 -2
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -3
- 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 +2 -2
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +48 -45
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +4 -4
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.js +4 -4
- package/dest/contract_function_simulator/oracle/oracle.d.ts +44 -42
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +174 -109
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -22
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +1 -38
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +61 -53
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +111 -55
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +80 -50
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +126 -113
- package/dest/contract_logging.d.ts +22 -0
- package/dest/contract_logging.d.ts.map +1 -0
- package/dest/contract_logging.js +23 -0
- package/dest/contract_sync/contract_sync_service.d.ts +43 -0
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
- package/dest/contract_sync/contract_sync_service.js +97 -0
- package/dest/contract_sync/helpers.d.ts +29 -0
- package/dest/contract_sync/helpers.d.ts.map +1 -0
- package/dest/contract_sync/helpers.js +55 -0
- package/dest/debug/pxe_debug_utils.d.ts +24 -10
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +28 -17
- package/dest/entrypoints/client/bundle/index.d.ts +4 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +3 -0
- package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +21 -7
- package/dest/entrypoints/client/lazy/index.d.ts +4 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +3 -0
- 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 +22 -8
- package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/server/index.d.ts +4 -1
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +3 -0
- package/dest/entrypoints/server/utils.d.ts +1 -1
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +28 -9
- package/dest/events/event_service.d.ts +5 -6
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +6 -7
- package/dest/job_coordinator/job_coordinator.d.ts +3 -2
- package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
- package/dest/job_coordinator/job_coordinator.js +3 -2
- package/dest/logs/log_service.d.ts +7 -5
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +28 -32
- package/dest/notes/note_service.d.ts +9 -8
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +17 -16
- package/dest/notes_filter.d.ts +25 -0
- package/dest/notes_filter.d.ts.map +1 -0
- package/dest/notes_filter.js +4 -0
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +5 -4
- package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
- package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
- package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
- package/dest/private_kernel/hints/index.d.ts +1 -1
- package/dest/private_kernel/hints/index.js +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +129 -68
- package/dest/private_kernel/hints/test_utils.d.ts +122 -0
- package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
- package/dest/private_kernel/hints/test_utils.js +203 -0
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +21 -13
- package/dest/private_kernel/private_kernel_oracle.d.ts +8 -4
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +7 -3
- package/dest/pxe.d.ts +71 -24
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +110 -70
- package/dest/storage/address_store/address_store.d.ts +1 -1
- package/dest/storage/address_store/address_store.d.ts.map +1 -1
- package/dest/storage/address_store/address_store.js +12 -11
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
- package/dest/storage/capsule_store/capsule_store.js +6 -8
- package/dest/storage/contract_store/contract_store.d.ts +42 -16
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +157 -84
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +47 -49
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +278 -252
- package/dest/storage/note_store/stored_note.d.ts +16 -0
- package/dest/storage/note_store/stored_note.d.ts.map +1 -0
- package/dest/storage/note_store/stored_note.js +43 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +17 -4
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +198 -147
- package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
- package/dest/storage/private_event_store/stored_private_event.js +56 -0
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
- package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +5 -5
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +184 -114
- package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
- package/dest/tagging/get_all_logs_by_tags.js +60 -0
- package/dest/tagging/index.d.ts +3 -2
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +2 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +5 -5
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +7 -7
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +7 -7
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +16 -12
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +5 -8
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +3 -6
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -7
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +20 -18
- package/package.json +25 -16
- package/src/access_scopes.ts +9 -0
- package/src/bin/check_oracle_version.ts +1 -0
- package/src/block_synchronizer/block_synchronizer.ts +76 -33
- package/src/config/index.ts +14 -0
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +327 -140
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +5 -5
- package/src/contract_function_simulator/index.ts +1 -1
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +2 -2
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
- package/src/contract_function_simulator/oracle/interfaces.ts +56 -47
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +4 -4
- package/src/contract_function_simulator/oracle/oracle.ts +182 -124
- package/src/contract_function_simulator/oracle/private_execution.ts +2 -61
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +151 -135
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +191 -127
- package/src/contract_logging.ts +39 -0
- package/src/contract_sync/contract_sync_service.ts +152 -0
- package/src/contract_sync/helpers.ts +98 -0
- package/src/debug/pxe_debug_utils.ts +63 -18
- package/src/entrypoints/client/bundle/index.ts +3 -0
- package/src/entrypoints/client/bundle/utils.ts +16 -15
- package/src/entrypoints/client/lazy/index.ts +3 -0
- package/src/entrypoints/client/lazy/utils.ts +17 -15
- package/src/entrypoints/pxe_creation_options.ts +2 -1
- package/src/entrypoints/server/index.ts +3 -0
- package/src/entrypoints/server/utils.ts +22 -26
- package/src/events/event_service.ts +5 -7
- package/src/job_coordinator/job_coordinator.ts +4 -3
- package/src/logs/log_service.ts +48 -39
- package/src/notes/note_service.ts +24 -22
- package/src/notes_filter.ts +26 -0
- package/src/oracle_version.ts +5 -4
- package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
- package/src/private_kernel/hints/index.ts +1 -1
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +164 -117
- package/src/private_kernel/hints/test_utils.ts +325 -0
- package/src/private_kernel/private_kernel_execution_prover.ts +25 -15
- package/src/private_kernel/private_kernel_oracle.ts +9 -9
- package/src/pxe.ts +217 -115
- package/src/storage/address_store/address_store.ts +15 -15
- package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
- package/src/storage/capsule_store/capsule_store.ts +8 -8
- package/src/storage/contract_store/contract_store.ts +186 -96
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +321 -318
- package/src/storage/note_store/stored_note.ts +48 -0
- package/src/storage/private_event_store/private_event_store.ts +250 -190
- package/src/storage/private_event_store/stored_private_event.ts +73 -0
- package/src/storage/tagging_store/recipient_tagging_store.ts +38 -24
- package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
- package/src/storage/tagging_store/sender_tagging_store.ts +214 -130
- package/src/tagging/get_all_logs_by_tags.ts +92 -0
- package/src/tagging/index.ts +2 -1
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +17 -10
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +17 -16
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +6 -9
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -17
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +23 -23
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
- package/dest/tree_membership/tree_membership_service.d.ts +0 -50
- package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
- package/dest/tree_membership/tree_membership_service.js +0 -75
- package/src/tree_membership/tree_membership_service.ts +0 -97
|
@@ -1,35 +1,38 @@
|
|
|
1
|
+
import type { ARCHIVE_HEIGHT, NOTE_HASH_TREE_HEIGHT } from '@aztec/constants';
|
|
1
2
|
import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { Aes128 } from '@aztec/foundation/crypto/aes128';
|
|
3
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
5
|
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
5
|
-
import { LogLevels,
|
|
6
|
+
import { LogLevels, type Logger, createLogger } from '@aztec/foundation/log';
|
|
7
|
+
import type { MembershipWitness } from '@aztec/foundation/trees';
|
|
6
8
|
import type { KeyStore } from '@aztec/key-store';
|
|
7
9
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
8
10
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
9
|
-
import {
|
|
11
|
+
import { BlockHash } from '@aztec/stdlib/block';
|
|
10
12
|
import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
|
|
11
13
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
12
14
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
13
15
|
import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
|
|
14
16
|
import { computeAddressSecret } from '@aztec/stdlib/keys';
|
|
15
17
|
import { deriveEcdhSharedSecret } from '@aztec/stdlib/logs';
|
|
18
|
+
import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
|
|
16
19
|
import type { NoteStatus } from '@aztec/stdlib/note';
|
|
17
20
|
import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
18
21
|
import type { BlockHeader, Capsule } from '@aztec/stdlib/tx';
|
|
19
22
|
|
|
23
|
+
import type { AccessScopes } from '../../access_scopes.js';
|
|
24
|
+
import { createContractLogger, logContractMessage } from '../../contract_logging.js';
|
|
20
25
|
import { EventService } from '../../events/event_service.js';
|
|
21
26
|
import { LogService } from '../../logs/log_service.js';
|
|
22
27
|
import { NoteService } from '../../notes/note_service.js';
|
|
23
28
|
import { ORACLE_VERSION } from '../../oracle_version.js';
|
|
24
29
|
import type { AddressStore } from '../../storage/address_store/address_store.js';
|
|
25
|
-
import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
|
|
26
30
|
import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
|
|
27
31
|
import type { ContractStore } from '../../storage/contract_store/contract_store.js';
|
|
28
32
|
import type { NoteStore } from '../../storage/note_store/note_store.js';
|
|
29
33
|
import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
|
|
30
34
|
import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
|
|
31
35
|
import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js';
|
|
32
|
-
import { TreeMembershipService } from '../../tree_membership/tree_membership_service.js';
|
|
33
36
|
import { EventValidationRequest } from '../noir-structs/event_validation_request.js';
|
|
34
37
|
import { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
|
|
35
38
|
import { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
|
|
@@ -39,6 +42,27 @@ import { pickNotes } from '../pick_notes.js';
|
|
|
39
42
|
import type { IMiscOracle, IUtilityExecutionOracle, NoteData } from './interfaces.js';
|
|
40
43
|
import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
|
|
41
44
|
|
|
45
|
+
/** Args for UtilityExecutionOracle constructor. */
|
|
46
|
+
export type UtilityExecutionOracleArgs = {
|
|
47
|
+
contractAddress: AztecAddress;
|
|
48
|
+
/** List of transient auth witnesses to be used during this simulation */
|
|
49
|
+
authWitnesses: AuthWitness[];
|
|
50
|
+
capsules: Capsule[]; // TODO(#12425): Rename to transientCapsules
|
|
51
|
+
anchorBlockHeader: BlockHeader;
|
|
52
|
+
contractStore: ContractStore;
|
|
53
|
+
noteStore: NoteStore;
|
|
54
|
+
keyStore: KeyStore;
|
|
55
|
+
addressStore: AddressStore;
|
|
56
|
+
aztecNode: AztecNode;
|
|
57
|
+
recipientTaggingStore: RecipientTaggingStore;
|
|
58
|
+
senderAddressBookStore: SenderAddressBookStore;
|
|
59
|
+
capsuleStore: CapsuleStore;
|
|
60
|
+
privateEventStore: PrivateEventStore;
|
|
61
|
+
jobId: string;
|
|
62
|
+
log?: ReturnType<typeof createLogger>;
|
|
63
|
+
scopes: AccessScopes;
|
|
64
|
+
};
|
|
65
|
+
|
|
42
66
|
/**
|
|
43
67
|
* The oracle for an execution of utility contract functions.
|
|
44
68
|
*/
|
|
@@ -46,40 +70,55 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
46
70
|
isMisc = true as const;
|
|
47
71
|
isUtility = true as const;
|
|
48
72
|
|
|
49
|
-
private
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
+
private contractLogger: Logger | undefined;
|
|
74
|
+
|
|
75
|
+
protected readonly contractAddress: AztecAddress;
|
|
76
|
+
protected readonly authWitnesses: AuthWitness[];
|
|
77
|
+
protected readonly capsules: Capsule[];
|
|
78
|
+
protected readonly anchorBlockHeader: BlockHeader;
|
|
79
|
+
protected readonly contractStore: ContractStore;
|
|
80
|
+
protected readonly noteStore: NoteStore;
|
|
81
|
+
protected readonly keyStore: KeyStore;
|
|
82
|
+
protected readonly addressStore: AddressStore;
|
|
83
|
+
protected readonly aztecNode: AztecNode;
|
|
84
|
+
protected readonly recipientTaggingStore: RecipientTaggingStore;
|
|
85
|
+
protected readonly senderAddressBookStore: SenderAddressBookStore;
|
|
86
|
+
protected readonly capsuleStore: CapsuleStore;
|
|
87
|
+
protected readonly privateEventStore: PrivateEventStore;
|
|
88
|
+
protected readonly jobId: string;
|
|
89
|
+
protected logger: ReturnType<typeof createLogger>;
|
|
90
|
+
protected readonly scopes: AccessScopes;
|
|
91
|
+
|
|
92
|
+
constructor(args: UtilityExecutionOracleArgs) {
|
|
93
|
+
this.contractAddress = args.contractAddress;
|
|
94
|
+
this.authWitnesses = args.authWitnesses;
|
|
95
|
+
this.capsules = args.capsules;
|
|
96
|
+
this.anchorBlockHeader = args.anchorBlockHeader;
|
|
97
|
+
this.contractStore = args.contractStore;
|
|
98
|
+
this.noteStore = args.noteStore;
|
|
99
|
+
this.keyStore = args.keyStore;
|
|
100
|
+
this.addressStore = args.addressStore;
|
|
101
|
+
this.aztecNode = args.aztecNode;
|
|
102
|
+
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
103
|
+
this.senderAddressBookStore = args.senderAddressBookStore;
|
|
104
|
+
this.capsuleStore = args.capsuleStore;
|
|
105
|
+
this.privateEventStore = args.privateEventStore;
|
|
106
|
+
this.jobId = args.jobId;
|
|
107
|
+
this.logger = args.log ?? createLogger('simulator:client_view_context');
|
|
108
|
+
this.scopes = args.scopes;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public assertCompatibleOracleVersion(version: number): void {
|
|
73
112
|
if (version !== ORACLE_VERSION) {
|
|
74
113
|
throw new Error(`Incompatible oracle version. Expected version ${ORACLE_VERSION}, got ${version}.`);
|
|
75
114
|
}
|
|
76
115
|
}
|
|
77
116
|
|
|
78
|
-
public
|
|
117
|
+
public getRandomField(): Fr {
|
|
79
118
|
return Fr.random();
|
|
80
119
|
}
|
|
81
120
|
|
|
82
|
-
public
|
|
121
|
+
public getUtilityContext(): UtilityContext {
|
|
83
122
|
return new UtilityContext(this.anchorBlockHeader, this.contractAddress);
|
|
84
123
|
}
|
|
85
124
|
|
|
@@ -88,21 +127,54 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
88
127
|
* @param pkMHash - The master public key hash.
|
|
89
128
|
* @returns A Promise that resolves to nullifier keys.
|
|
90
129
|
* @throws If the keys are not registered in the key store.
|
|
130
|
+
* @throws If scopes are defined and the account is not in the scopes.
|
|
91
131
|
*/
|
|
92
|
-
public
|
|
132
|
+
public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
|
|
133
|
+
// If scopes are defined, check that the key belongs to an account in the scopes.
|
|
134
|
+
if (this.scopes !== 'ALL_SCOPES' && this.scopes.length > 0) {
|
|
135
|
+
let hasAccess = false;
|
|
136
|
+
for (let i = 0; i < this.scopes.length && !hasAccess; i++) {
|
|
137
|
+
if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
|
|
138
|
+
hasAccess = true;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (!hasAccess) {
|
|
142
|
+
throw new Error(`Key validation request denied: no scoped account has a key with hash ${pkMHash.toString()}.`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
93
145
|
return this.keyStore.getKeyValidationRequest(pkMHash, this.contractAddress);
|
|
94
146
|
}
|
|
95
147
|
|
|
96
148
|
/**
|
|
97
|
-
* Fetches the index and sibling path of a leaf at a given block from
|
|
98
|
-
* @param
|
|
99
|
-
*
|
|
100
|
-
* @param
|
|
101
|
-
* @returns The index and sibling path
|
|
149
|
+
* Fetches the index and sibling path of a leaf at a given block from the note hash tree.
|
|
150
|
+
* @param anchorBlockHash - The hash of a block that contains the note hash tree root in which to find the membership
|
|
151
|
+
* witness.
|
|
152
|
+
* @param noteHash - The note hash to find in the note hash tree.
|
|
153
|
+
* @returns The membership witness containing the leaf index and sibling path
|
|
102
154
|
*/
|
|
103
|
-
public
|
|
104
|
-
|
|
105
|
-
|
|
155
|
+
public getNoteHashMembershipWitness(
|
|
156
|
+
anchorBlockHash: BlockHash,
|
|
157
|
+
noteHash: Fr,
|
|
158
|
+
): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
|
|
159
|
+
return this.aztecNode.getNoteHashMembershipWitness(anchorBlockHash, noteHash);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Fetches the index and sibling path of a block hash in the archive tree.
|
|
164
|
+
*
|
|
165
|
+
* Block hashes are the leaves of the archive tree. Each time a new block is added to the chain,
|
|
166
|
+
* its block hash is appended as a new leaf to the archive tree.
|
|
167
|
+
*
|
|
168
|
+
* @param anchorBlockHash - The hash of a block that contains the archive tree root in which to find the membership
|
|
169
|
+
* witness.
|
|
170
|
+
* @param blockHash - The block hash to find in the archive tree.
|
|
171
|
+
* @returns The membership witness containing the leaf index and sibling path
|
|
172
|
+
*/
|
|
173
|
+
public getBlockHashMembershipWitness(
|
|
174
|
+
anchorBlockHash: BlockHash,
|
|
175
|
+
blockHash: BlockHash,
|
|
176
|
+
): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined> {
|
|
177
|
+
return this.aztecNode.getBlockHashMembershipWitness(anchorBlockHash, blockHash);
|
|
106
178
|
}
|
|
107
179
|
|
|
108
180
|
/**
|
|
@@ -111,11 +183,11 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
111
183
|
* @param nullifier - Nullifier we try to find witness for.
|
|
112
184
|
* @returns The nullifier membership witness (if found).
|
|
113
185
|
*/
|
|
114
|
-
public
|
|
115
|
-
blockHash:
|
|
186
|
+
public getNullifierMembershipWitness(
|
|
187
|
+
blockHash: BlockHash,
|
|
116
188
|
nullifier: Fr,
|
|
117
189
|
): Promise<NullifierMembershipWitness | undefined> {
|
|
118
|
-
return
|
|
190
|
+
return this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier);
|
|
119
191
|
}
|
|
120
192
|
|
|
121
193
|
/**
|
|
@@ -127,12 +199,11 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
127
199
|
* list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
|
|
128
200
|
* we are trying to prove non-inclusion for.
|
|
129
201
|
*/
|
|
130
|
-
public
|
|
131
|
-
blockHash:
|
|
202
|
+
public getLowNullifierMembershipWitness(
|
|
203
|
+
blockHash: BlockHash,
|
|
132
204
|
nullifier: Fr,
|
|
133
205
|
): Promise<NullifierMembershipWitness | undefined> {
|
|
134
|
-
|
|
135
|
-
return await treeMembershipService.getLowNullifierMembershipWitness(blockHash, nullifier);
|
|
206
|
+
return this.aztecNode.getLowNullifierMembershipWitness(blockHash, nullifier);
|
|
136
207
|
}
|
|
137
208
|
|
|
138
209
|
/**
|
|
@@ -141,12 +212,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
141
212
|
* @param leafSlot - The slot of the public data tree to get the witness for.
|
|
142
213
|
* @returns - The witness
|
|
143
214
|
*/
|
|
144
|
-
public
|
|
145
|
-
blockHash
|
|
146
|
-
leafSlot: Fr,
|
|
147
|
-
): Promise<PublicDataWitness | undefined> {
|
|
148
|
-
const treeMembershipService = new TreeMembershipService(this.aztecNode);
|
|
149
|
-
return await treeMembershipService.getPublicDataWitness(blockHash, leafSlot);
|
|
215
|
+
public getPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
|
|
216
|
+
return this.aztecNode.getPublicDataWitness(blockHash, leafSlot);
|
|
150
217
|
}
|
|
151
218
|
|
|
152
219
|
/**
|
|
@@ -154,8 +221,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
154
221
|
* @param blockNumber - The number of a block of which to get the block header.
|
|
155
222
|
* @returns Block extracted from a block with block number `blockNumber`.
|
|
156
223
|
*/
|
|
157
|
-
public async
|
|
158
|
-
const anchorBlockNumber =
|
|
224
|
+
public async getBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined> {
|
|
225
|
+
const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
|
|
159
226
|
if (blockNumber > anchorBlockNumber) {
|
|
160
227
|
throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`);
|
|
161
228
|
}
|
|
@@ -167,14 +234,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
167
234
|
/**
|
|
168
235
|
* Retrieve the complete address associated to a given address.
|
|
169
236
|
* @param account - The account address.
|
|
170
|
-
* @returns A complete address associated with the input address.
|
|
171
|
-
* @throws An error if the account is not registered in the database.
|
|
237
|
+
* @returns A complete address associated with the input address, or `undefined` if not registered.
|
|
172
238
|
*/
|
|
173
|
-
public
|
|
174
|
-
return this.getCompleteAddress(account);
|
|
239
|
+
public tryGetPublicKeysAndPartialAddress(account: AztecAddress): Promise<CompleteAddress | undefined> {
|
|
240
|
+
return this.addressStore.getCompleteAddress(account);
|
|
175
241
|
}
|
|
176
242
|
|
|
177
|
-
protected async
|
|
243
|
+
protected async getCompleteAddressOrFail(account: AztecAddress): Promise<CompleteAddress> {
|
|
178
244
|
const completeAddress = await this.addressStore.getCompleteAddress(account);
|
|
179
245
|
if (!completeAddress) {
|
|
180
246
|
throw new Error(
|
|
@@ -190,11 +256,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
190
256
|
* @param address - Address.
|
|
191
257
|
* @returns A contract instance.
|
|
192
258
|
*/
|
|
193
|
-
public
|
|
194
|
-
return this.getContractInstance(address);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
protected async getContractInstance(address: AztecAddress): Promise<ContractInstance> {
|
|
259
|
+
public async getContractInstance(address: AztecAddress): Promise<ContractInstance> {
|
|
198
260
|
const instance = await this.contractStore.getContractInstance(address);
|
|
199
261
|
if (!instance) {
|
|
200
262
|
throw new Error(`No contract instance found for address ${address.toString()}`);
|
|
@@ -208,7 +270,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
208
270
|
* @param messageHash - Hash of the message to authenticate.
|
|
209
271
|
* @returns Authentication witness for the requested message hash.
|
|
210
272
|
*/
|
|
211
|
-
public
|
|
273
|
+
public getAuthWitness(messageHash: Fr): Promise<Fr[] | undefined> {
|
|
212
274
|
return Promise.resolve(this.authWitnesses.find(w => w.requestHash.equals(messageHash))?.witness);
|
|
213
275
|
}
|
|
214
276
|
|
|
@@ -234,7 +296,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
234
296
|
* @param status - The status of notes to fetch.
|
|
235
297
|
* @returns Array of note data.
|
|
236
298
|
*/
|
|
237
|
-
public async
|
|
299
|
+
public async getNotes(
|
|
238
300
|
owner: AztecAddress | undefined,
|
|
239
301
|
storageSlot: Fr,
|
|
240
302
|
numSelects: number,
|
|
@@ -251,7 +313,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
251
313
|
offset: number,
|
|
252
314
|
status: NoteStatus,
|
|
253
315
|
): Promise<NoteData[]> {
|
|
254
|
-
const noteService = new NoteService(this.noteStore, this.aztecNode, this.
|
|
316
|
+
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
255
317
|
|
|
256
318
|
const dbNotes = await noteService.getNotes(this.contractAddress, owner, storageSlot, status, this.scopes);
|
|
257
319
|
return pickNotes<NoteData>(dbNotes, {
|
|
@@ -274,11 +336,15 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
274
336
|
* @param innerNullifier - The inner nullifier.
|
|
275
337
|
* @returns A boolean indicating whether the nullifier exists in the tree or not.
|
|
276
338
|
*/
|
|
277
|
-
public async
|
|
278
|
-
const nullifier = await
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
339
|
+
public async checkNullifierExists(innerNullifier: Fr) {
|
|
340
|
+
const [nullifier, anchorBlockHash] = await Promise.all([
|
|
341
|
+
siloNullifier(this.contractAddress, innerNullifier!),
|
|
342
|
+
this.anchorBlockHeader.hash(),
|
|
343
|
+
]);
|
|
344
|
+
const [leafIndex] = await this.aztecNode.findLeavesIndexes(anchorBlockHash, MerkleTreeId.NULLIFIER_TREE, [
|
|
345
|
+
nullifier,
|
|
346
|
+
]);
|
|
347
|
+
return leafIndex?.data !== undefined;
|
|
282
348
|
}
|
|
283
349
|
|
|
284
350
|
/**
|
|
@@ -289,15 +355,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
289
355
|
* @dev Contract address and secret are only used to compute the nullifier to get non-nullified messages
|
|
290
356
|
* @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
|
|
291
357
|
*/
|
|
292
|
-
public async
|
|
293
|
-
const
|
|
294
|
-
|
|
358
|
+
public async getL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) {
|
|
359
|
+
const [messageIndex, siblingPath] = await getNonNullifiedL1ToL2MessageWitness(
|
|
360
|
+
this.aztecNode,
|
|
295
361
|
contractAddress,
|
|
296
362
|
messageHash,
|
|
297
363
|
secret,
|
|
298
364
|
);
|
|
299
365
|
|
|
300
|
-
// Assuming messageIndex is what you intended to use for the index in MessageLoadOracleInputs
|
|
301
366
|
return new MessageLoadOracleInputs(messageIndex, siblingPath);
|
|
302
367
|
}
|
|
303
368
|
|
|
@@ -308,58 +373,65 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
308
373
|
* @param startStorageSlot - The starting storage slot.
|
|
309
374
|
* @param numberOfElements - Number of elements to read from the starting storage slot.
|
|
310
375
|
*/
|
|
311
|
-
public async
|
|
312
|
-
blockHash:
|
|
376
|
+
public async storageRead(
|
|
377
|
+
blockHash: BlockHash,
|
|
313
378
|
contractAddress: AztecAddress,
|
|
314
379
|
startStorageSlot: Fr,
|
|
315
380
|
numberOfElements: number,
|
|
316
381
|
) {
|
|
317
|
-
const
|
|
382
|
+
const slots = Array(numberOfElements)
|
|
383
|
+
.fill(0)
|
|
384
|
+
.map((_, i) => new Fr(startStorageSlot.value + BigInt(i)));
|
|
318
385
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
386
|
+
const values = await Promise.all(
|
|
387
|
+
slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
|
|
388
|
+
);
|
|
389
|
+
|
|
390
|
+
this.logger.debug(
|
|
391
|
+
`Oracle storage read: slots=[${slots.map(slot => slot.toString()).join(', ')}] address=${contractAddress.toString()} values=[${values.join(', ')}]`,
|
|
392
|
+
);
|
|
324
393
|
|
|
325
|
-
|
|
326
|
-
|
|
394
|
+
return values;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Returns a per-contract logger whose output is prefixed with `contract_log::<name>(<addrAbbrev>)`.
|
|
399
|
+
*/
|
|
400
|
+
async #getContractLogger(): Promise<Logger> {
|
|
401
|
+
if (!this.contractLogger) {
|
|
402
|
+
// Purpose of instanceId is to distinguish logs from different instances of the same component. It makes sense
|
|
403
|
+
// to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
|
|
404
|
+
this.contractLogger = await createContractLogger(
|
|
405
|
+
this.contractAddress,
|
|
406
|
+
addr => this.contractStore.getDebugContractName(addr),
|
|
407
|
+
{ instanceId: this.jobId },
|
|
327
408
|
);
|
|
328
|
-
values.push(value);
|
|
329
409
|
}
|
|
330
|
-
return
|
|
410
|
+
return this.contractLogger;
|
|
331
411
|
}
|
|
332
412
|
|
|
333
|
-
public
|
|
413
|
+
public async log(level: number, message: string, fields: Fr[]): Promise<void> {
|
|
334
414
|
if (!LogLevels[level]) {
|
|
335
|
-
throw new Error(`Invalid
|
|
415
|
+
throw new Error(`Invalid log level: ${level}`);
|
|
336
416
|
}
|
|
337
|
-
const
|
|
338
|
-
|
|
417
|
+
const logger = await this.#getContractLogger();
|
|
418
|
+
logContractMessage(logger, LogLevels[level], message, fields);
|
|
339
419
|
}
|
|
340
420
|
|
|
341
|
-
public async
|
|
421
|
+
public async fetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) {
|
|
342
422
|
const logService = new LogService(
|
|
343
423
|
this.aztecNode,
|
|
344
|
-
this.
|
|
424
|
+
this.anchorBlockHeader,
|
|
345
425
|
this.keyStore,
|
|
346
426
|
this.capsuleStore,
|
|
347
427
|
this.recipientTaggingStore,
|
|
348
428
|
this.senderAddressBookStore,
|
|
349
429
|
this.addressStore,
|
|
350
430
|
this.jobId,
|
|
431
|
+
this.logger.getBindings(),
|
|
351
432
|
);
|
|
352
433
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
// It is acceptable to run the following operations in parallel for several reasons:
|
|
356
|
-
// 1. syncTaggedLogs does not write to the note store — it only stores the pending tagged logs in a capsule array,
|
|
357
|
-
// which is then processed in Noir after this handler returns.
|
|
358
|
-
// 2. Even if syncTaggedLogs did write to the note store, it would not cause inconsistent state.
|
|
359
|
-
await Promise.all([
|
|
360
|
-
logService.syncTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes),
|
|
361
|
-
noteService.syncNoteNullifiers(this.contractAddress),
|
|
362
|
-
]);
|
|
434
|
+
await logService.fetchTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes);
|
|
363
435
|
}
|
|
364
436
|
|
|
365
437
|
/**
|
|
@@ -372,7 +444,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
372
444
|
* @param noteValidationRequestsArrayBaseSlot - The base slot of capsule array containing note validation requests.
|
|
373
445
|
* @param eventValidationRequestsArrayBaseSlot - The base slot of capsule array containing event validation requests.
|
|
374
446
|
*/
|
|
375
|
-
public async
|
|
447
|
+
public async validateAndStoreEnqueuedNotesAndEvents(
|
|
376
448
|
contractAddress: AztecAddress,
|
|
377
449
|
noteValidationRequestsArrayBaseSlot: Fr,
|
|
378
450
|
eventValidationRequestsArrayBaseSlot: Fr,
|
|
@@ -392,9 +464,9 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
392
464
|
await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, this.jobId)
|
|
393
465
|
).map(EventValidationRequest.fromFields);
|
|
394
466
|
|
|
395
|
-
const noteService = new NoteService(this.noteStore, this.aztecNode, this.
|
|
467
|
+
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
396
468
|
const noteStorePromises = noteValidationRequests.map(request =>
|
|
397
|
-
noteService.
|
|
469
|
+
noteService.validateAndStoreNote(
|
|
398
470
|
request.contractAddress,
|
|
399
471
|
request.owner,
|
|
400
472
|
request.storageSlot,
|
|
@@ -408,9 +480,9 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
408
480
|
),
|
|
409
481
|
);
|
|
410
482
|
|
|
411
|
-
const eventService = new EventService(this.
|
|
483
|
+
const eventService = new EventService(this.anchorBlockHeader, this.aztecNode, this.privateEventStore, this.jobId);
|
|
412
484
|
const eventStorePromises = eventValidationRequests.map(request =>
|
|
413
|
-
eventService.
|
|
485
|
+
eventService.validateAndStoreEvent(
|
|
414
486
|
request.contractAddress,
|
|
415
487
|
request.eventTypeId,
|
|
416
488
|
request.randomness,
|
|
@@ -428,7 +500,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
428
500
|
await this.capsuleStore.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, [], this.jobId);
|
|
429
501
|
}
|
|
430
502
|
|
|
431
|
-
public async
|
|
503
|
+
public async bulkRetrieveLogs(
|
|
432
504
|
contractAddress: AztecAddress,
|
|
433
505
|
logRetrievalRequestsArrayBaseSlot: Fr,
|
|
434
506
|
logRetrievalResponsesArrayBaseSlot: Fr,
|
|
@@ -446,13 +518,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
446
518
|
|
|
447
519
|
const logService = new LogService(
|
|
448
520
|
this.aztecNode,
|
|
449
|
-
this.
|
|
521
|
+
this.anchorBlockHeader,
|
|
450
522
|
this.keyStore,
|
|
451
523
|
this.capsuleStore,
|
|
452
524
|
this.recipientTaggingStore,
|
|
453
525
|
this.senderAddressBookStore,
|
|
454
526
|
this.addressStore,
|
|
455
527
|
this.jobId,
|
|
528
|
+
this.logger.getBindings(),
|
|
456
529
|
);
|
|
457
530
|
|
|
458
531
|
const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);
|
|
@@ -469,7 +542,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
469
542
|
);
|
|
470
543
|
}
|
|
471
544
|
|
|
472
|
-
public
|
|
545
|
+
public storeCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[]): Promise<void> {
|
|
473
546
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
474
547
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
475
548
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -478,7 +551,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
478
551
|
return Promise.resolve();
|
|
479
552
|
}
|
|
480
553
|
|
|
481
|
-
public async
|
|
554
|
+
public async loadCapsule(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null> {
|
|
482
555
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
483
556
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
484
557
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -490,7 +563,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
490
563
|
);
|
|
491
564
|
}
|
|
492
565
|
|
|
493
|
-
public
|
|
566
|
+
public deleteCapsule(contractAddress: AztecAddress, slot: Fr): Promise<void> {
|
|
494
567
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
495
568
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
496
569
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -499,12 +572,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
499
572
|
return Promise.resolve();
|
|
500
573
|
}
|
|
501
574
|
|
|
502
|
-
public
|
|
503
|
-
contractAddress: AztecAddress,
|
|
504
|
-
srcSlot: Fr,
|
|
505
|
-
dstSlot: Fr,
|
|
506
|
-
numEntries: number,
|
|
507
|
-
): Promise<void> {
|
|
575
|
+
public copyCapsule(contractAddress: AztecAddress, srcSlot: Fr, dstSlot: Fr, numEntries: number): Promise<void> {
|
|
508
576
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
509
577
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
510
578
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -513,7 +581,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
513
581
|
}
|
|
514
582
|
|
|
515
583
|
// TODO(#11849): consider replacing this oracle with a pure Noir implementation of aes decryption.
|
|
516
|
-
public
|
|
584
|
+
public aes128Decrypt(ciphertext: Buffer, iv: Buffer, symKey: Buffer): Promise<Buffer> {
|
|
517
585
|
const aes128 = new Aes128();
|
|
518
586
|
return aes128.decryptBufferCBC(ciphertext, iv, symKey);
|
|
519
587
|
}
|
|
@@ -524,13 +592,9 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
524
592
|
* @param ephPk - The ephemeral public key to get the secret for.
|
|
525
593
|
* @returns The secret for the given address.
|
|
526
594
|
*/
|
|
527
|
-
public
|
|
528
|
-
return this.getSharedSecret(address, ephPk);
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
protected async getSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point> {
|
|
595
|
+
public async getSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point> {
|
|
532
596
|
// TODO(#12656): return an app-siloed secret
|
|
533
|
-
const recipientCompleteAddress = await this.
|
|
597
|
+
const recipientCompleteAddress = await this.getCompleteAddressOrFail(address);
|
|
534
598
|
const ivskM = await this.keyStore.getMasterSecretKey(
|
|
535
599
|
recipientCompleteAddress.publicKeys.masterIncomingViewingPublicKey,
|
|
536
600
|
);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { type LogLevel, type Logger, applyStringFormatting, createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
|
+
import type { DebugLog } from '@aztec/stdlib/logs';
|
|
5
|
+
|
|
6
|
+
/** Resolves a contract address to a human-readable name, if available. */
|
|
7
|
+
export type ContractNameResolver = (address: AztecAddress) => Promise<string | undefined>;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Creates a logger whose output is prefixed with `contract_log::<name>(<addrAbbrev>)`.
|
|
11
|
+
*/
|
|
12
|
+
export async function createContractLogger(
|
|
13
|
+
contractAddress: AztecAddress,
|
|
14
|
+
getContractName: ContractNameResolver,
|
|
15
|
+
options?: { instanceId?: string },
|
|
16
|
+
): Promise<Logger> {
|
|
17
|
+
const addrAbbrev = contractAddress.toString().slice(0, 10);
|
|
18
|
+
const name = await getContractName(contractAddress);
|
|
19
|
+
const module = name ? `contract_log::${name}(${addrAbbrev})` : `contract_log::Unknown(${addrAbbrev})`;
|
|
20
|
+
return createLogger(module, options);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Formats and emits a single contract log message through the given logger.
|
|
25
|
+
*/
|
|
26
|
+
export function logContractMessage(logger: Logger, level: LogLevel, message: string, fields: Fr[]): void {
|
|
27
|
+
logger[level](applyStringFormatting(message, fields));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Displays debug logs collected during public function simulation,
|
|
32
|
+
* using the `contract_log::` prefixed logger format.
|
|
33
|
+
*/
|
|
34
|
+
export async function displayDebugLogs(debugLogs: DebugLog[], getContractName: ContractNameResolver): Promise<void> {
|
|
35
|
+
for (const log of debugLogs) {
|
|
36
|
+
const logger = await createContractLogger(log.contractAddress, getContractName);
|
|
37
|
+
logContractMessage(logger, log.level, log.message, log.fields);
|
|
38
|
+
}
|
|
39
|
+
}
|