@aztec/pxe 0.0.1-commit.e6bd8901 → 0.0.1-commit.ee80a48
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/block_synchronizer/block_synchronizer.d.ts +3 -3
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +5 -5
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +2 -4
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +7 -9
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +8 -8
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.d.ts +3 -3
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +15 -15
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +2 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +6 -8
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +20 -16
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +23 -27
- package/dest/contract_sync/index.d.ts +4 -3
- package/dest/contract_sync/index.d.ts.map +1 -1
- package/dest/contract_sync/index.js +12 -7
- package/dest/debug/pxe_debug_utils.d.ts +16 -6
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +17 -8
- 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 +12 -6
- 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 +13 -7
- 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/utils.d.ts +1 -1
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +19 -8
- package/dest/events/event_service.d.ts +4 -5
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +5 -6
- 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 +6 -5
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +10 -16
- 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 +6 -8
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +2 -2
- 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 +2 -2
- package/dest/private_kernel/private_kernel_oracle.d.ts +3 -3
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/pxe.d.ts +1 -1
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +12 -11
- 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 +1 -1
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +22 -13
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +11 -1
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +143 -105
- package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +84 -61
- package/dest/storage/private_event_store/stored_private_event.d.ts +4 -4
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -1
- package/dest/storage/private_event_store/stored_private_event.js +2 -2
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +1 -1
- 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 +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +183 -113
- package/dest/tagging/get_all_logs_by_tags.d.ts +4 -4
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -3
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -3
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -3
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +3 -3
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
- package/package.json +16 -16
- package/src/block_synchronizer/block_synchronizer.ts +17 -19
- package/src/contract_function_simulator/contract_function_simulator.ts +6 -6
- package/src/contract_function_simulator/oracle/interfaces.ts +10 -10
- package/src/contract_function_simulator/oracle/oracle.ts +27 -17
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +4 -8
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +32 -35
- package/src/contract_sync/index.ts +24 -5
- package/src/debug/pxe_debug_utils.ts +23 -9
- package/src/entrypoints/client/bundle/utils.ts +7 -14
- package/src/entrypoints/client/lazy/utils.ts +8 -14
- package/src/entrypoints/pxe_creation_options.ts +2 -1
- package/src/entrypoints/server/utils.ts +15 -19
- package/src/events/event_service.ts +4 -6
- package/src/job_coordinator/job_coordinator.ts +4 -3
- package/src/logs/log_service.ts +14 -15
- package/src/notes/note_service.ts +5 -8
- package/src/oracle_version.ts +2 -2
- package/src/private_kernel/private_kernel_execution_prover.ts +6 -3
- package/src/private_kernel/private_kernel_oracle.ts +2 -2
- package/src/pxe.ts +22 -9
- 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 +22 -11
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +159 -129
- package/src/storage/private_event_store/private_event_store.ts +102 -81
- package/src/storage/private_event_store/stored_private_event.ts +3 -3
- package/src/storage/tagging_store/recipient_tagging_store.ts +31 -21
- package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
- package/src/storage/tagging_store/sender_tagging_store.ts +210 -126
- package/src/tagging/get_all_logs_by_tags.ts +3 -3
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +2 -2
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +2 -2
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +2 -2
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +3 -3
|
@@ -8,7 +8,7 @@ import type { MembershipWitness } from '@aztec/foundation/trees';
|
|
|
8
8
|
import type { KeyStore } from '@aztec/key-store';
|
|
9
9
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
10
10
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
11
|
-
import {
|
|
11
|
+
import { BlockHash } from '@aztec/stdlib/block';
|
|
12
12
|
import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
|
|
13
13
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
14
14
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
@@ -25,7 +25,6 @@ import { LogService } from '../../logs/log_service.js';
|
|
|
25
25
|
import { NoteService } from '../../notes/note_service.js';
|
|
26
26
|
import { ORACLE_VERSION } from '../../oracle_version.js';
|
|
27
27
|
import type { AddressStore } from '../../storage/address_store/address_store.js';
|
|
28
|
-
import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
|
|
29
28
|
import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
|
|
30
29
|
import type { ContractStore } from '../../storage/contract_store/contract_store.js';
|
|
31
30
|
import type { NoteStore } from '../../storage/note_store/note_store.js';
|
|
@@ -61,7 +60,6 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
61
60
|
protected readonly keyStore: KeyStore,
|
|
62
61
|
protected readonly addressStore: AddressStore,
|
|
63
62
|
protected readonly aztecNode: AztecNode,
|
|
64
|
-
protected readonly anchorBlockStore: AnchorBlockStore,
|
|
65
63
|
protected readonly recipientTaggingStore: RecipientTaggingStore,
|
|
66
64
|
protected readonly senderAddressBookStore: SenderAddressBookStore,
|
|
67
65
|
protected readonly capsuleStore: CapsuleStore,
|
|
@@ -97,28 +95,34 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
97
95
|
|
|
98
96
|
/**
|
|
99
97
|
* Fetches the index and sibling path of a leaf at a given block from the note hash tree.
|
|
100
|
-
* @param
|
|
101
|
-
*
|
|
98
|
+
* @param anchorBlockHash - The hash of a block that contains the note hash tree root in which to find the membership
|
|
99
|
+
* witness.
|
|
100
|
+
* @param noteHash - The note hash to find in the note hash tree.
|
|
102
101
|
* @returns The membership witness containing the leaf index and sibling path
|
|
103
102
|
*/
|
|
104
103
|
public utilityGetNoteHashMembershipWitness(
|
|
105
|
-
|
|
106
|
-
|
|
104
|
+
anchorBlockHash: BlockHash,
|
|
105
|
+
noteHash: Fr,
|
|
107
106
|
): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
|
|
108
|
-
return this.aztecNode.getNoteHashMembershipWitness(
|
|
107
|
+
return this.aztecNode.getNoteHashMembershipWitness(anchorBlockHash, noteHash);
|
|
109
108
|
}
|
|
110
109
|
|
|
111
110
|
/**
|
|
112
|
-
* Fetches the index and sibling path of a
|
|
113
|
-
*
|
|
114
|
-
*
|
|
111
|
+
* Fetches the index and sibling path of a block hash in the archive tree.
|
|
112
|
+
*
|
|
113
|
+
* Block hashes are the leaves of the archive tree. Each time a new block is added to the chain,
|
|
114
|
+
* its block hash is appended as a new leaf to the archive tree.
|
|
115
|
+
*
|
|
116
|
+
* @param anchorBlockHash - The hash of a block that contains the archive tree root in which to find the membership
|
|
117
|
+
* witness.
|
|
118
|
+
* @param blockHash - The block hash to find in the archive tree.
|
|
115
119
|
* @returns The membership witness containing the leaf index and sibling path
|
|
116
120
|
*/
|
|
117
|
-
public
|
|
118
|
-
|
|
119
|
-
|
|
121
|
+
public utilityGetBlockHashMembershipWitness(
|
|
122
|
+
anchorBlockHash: BlockHash,
|
|
123
|
+
blockHash: BlockHash,
|
|
120
124
|
): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined> {
|
|
121
|
-
return this.aztecNode.
|
|
125
|
+
return this.aztecNode.getBlockHashMembershipWitness(anchorBlockHash, blockHash);
|
|
122
126
|
}
|
|
123
127
|
|
|
124
128
|
/**
|
|
@@ -128,7 +132,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
128
132
|
* @returns The nullifier membership witness (if found).
|
|
129
133
|
*/
|
|
130
134
|
public utilityGetNullifierMembershipWitness(
|
|
131
|
-
blockHash:
|
|
135
|
+
blockHash: BlockHash,
|
|
132
136
|
nullifier: Fr,
|
|
133
137
|
): Promise<NullifierMembershipWitness | undefined> {
|
|
134
138
|
return this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier);
|
|
@@ -144,7 +148,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
144
148
|
* we are trying to prove non-inclusion for.
|
|
145
149
|
*/
|
|
146
150
|
public utilityGetLowNullifierMembershipWitness(
|
|
147
|
-
blockHash:
|
|
151
|
+
blockHash: BlockHash,
|
|
148
152
|
nullifier: Fr,
|
|
149
153
|
): Promise<NullifierMembershipWitness | undefined> {
|
|
150
154
|
return this.aztecNode.getLowNullifierMembershipWitness(blockHash, nullifier);
|
|
@@ -156,7 +160,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
156
160
|
* @param leafSlot - The slot of the public data tree to get the witness for.
|
|
157
161
|
* @returns - The witness
|
|
158
162
|
*/
|
|
159
|
-
public utilityGetPublicDataWitness(blockHash:
|
|
163
|
+
public utilityGetPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
|
|
160
164
|
return this.aztecNode.getPublicDataWitness(blockHash, leafSlot);
|
|
161
165
|
}
|
|
162
166
|
|
|
@@ -166,7 +170,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
166
170
|
* @returns Block extracted from a block with block number `blockNumber`.
|
|
167
171
|
*/
|
|
168
172
|
public async utilityGetBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined> {
|
|
169
|
-
const anchorBlockNumber =
|
|
173
|
+
const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
|
|
170
174
|
if (blockNumber > anchorBlockNumber) {
|
|
171
175
|
throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`);
|
|
172
176
|
}
|
|
@@ -262,7 +266,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
262
266
|
offset: number,
|
|
263
267
|
status: NoteStatus,
|
|
264
268
|
): Promise<NoteData[]> {
|
|
265
|
-
const noteService = new NoteService(this.noteStore, this.aztecNode, this.
|
|
269
|
+
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
266
270
|
|
|
267
271
|
const dbNotes = await noteService.getNotes(this.contractAddress, owner, storageSlot, status, this.scopes);
|
|
268
272
|
return pickNotes<NoteData>(dbNotes, {
|
|
@@ -318,7 +322,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
318
322
|
* @param numberOfElements - Number of elements to read from the starting storage slot.
|
|
319
323
|
*/
|
|
320
324
|
public async utilityStorageRead(
|
|
321
|
-
blockHash:
|
|
325
|
+
blockHash: BlockHash,
|
|
322
326
|
contractAddress: AztecAddress,
|
|
323
327
|
startStorageSlot: Fr,
|
|
324
328
|
numberOfElements: number,
|
|
@@ -349,25 +353,17 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
349
353
|
public async utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) {
|
|
350
354
|
const logService = new LogService(
|
|
351
355
|
this.aztecNode,
|
|
352
|
-
this.
|
|
356
|
+
this.anchorBlockHeader,
|
|
353
357
|
this.keyStore,
|
|
354
358
|
this.capsuleStore,
|
|
355
359
|
this.recipientTaggingStore,
|
|
356
360
|
this.senderAddressBookStore,
|
|
357
361
|
this.addressStore,
|
|
358
362
|
this.jobId,
|
|
363
|
+
this.log.getBindings(),
|
|
359
364
|
);
|
|
360
365
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
// It is acceptable to run the following operations in parallel for several reasons:
|
|
364
|
-
// 1. syncTaggedLogs does not write to the note store — it only stores the pending tagged logs in a capsule array,
|
|
365
|
-
// which is then processed in Noir after this handler returns.
|
|
366
|
-
// 2. Even if syncTaggedLogs did write to the note store, it would not cause inconsistent state.
|
|
367
|
-
await Promise.all([
|
|
368
|
-
logService.syncTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes),
|
|
369
|
-
noteService.syncNoteNullifiers(this.contractAddress),
|
|
370
|
-
]);
|
|
366
|
+
await logService.fetchTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes);
|
|
371
367
|
}
|
|
372
368
|
|
|
373
369
|
/**
|
|
@@ -400,7 +396,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
400
396
|
await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, this.jobId)
|
|
401
397
|
).map(EventValidationRequest.fromFields);
|
|
402
398
|
|
|
403
|
-
const noteService = new NoteService(this.noteStore, this.aztecNode, this.
|
|
399
|
+
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
404
400
|
const noteStorePromises = noteValidationRequests.map(request =>
|
|
405
401
|
noteService.validateAndStoreNote(
|
|
406
402
|
request.contractAddress,
|
|
@@ -416,7 +412,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
416
412
|
),
|
|
417
413
|
);
|
|
418
414
|
|
|
419
|
-
const eventService = new EventService(this.
|
|
415
|
+
const eventService = new EventService(this.anchorBlockHeader, this.aztecNode, this.privateEventStore, this.jobId);
|
|
420
416
|
const eventStorePromises = eventValidationRequests.map(request =>
|
|
421
417
|
eventService.validateAndStoreEvent(
|
|
422
418
|
request.contractAddress,
|
|
@@ -454,13 +450,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
454
450
|
|
|
455
451
|
const logService = new LogService(
|
|
456
452
|
this.aztecNode,
|
|
457
|
-
this.
|
|
453
|
+
this.anchorBlockHeader,
|
|
458
454
|
this.keyStore,
|
|
459
455
|
this.capsuleStore,
|
|
460
456
|
this.recipientTaggingStore,
|
|
461
457
|
this.senderAddressBookStore,
|
|
462
458
|
this.addressStore,
|
|
463
459
|
this.jobId,
|
|
460
|
+
this.log.getBindings(),
|
|
464
461
|
);
|
|
465
462
|
|
|
466
463
|
const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { ProtocolContractAddress, isProtocolContract } from '@aztec/protocol-contracts';
|
|
2
2
|
import type { FunctionCall, FunctionSelector } from '@aztec/stdlib/abi';
|
|
3
3
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
|
-
import { L2BlockHash } from '@aztec/stdlib/block';
|
|
5
4
|
import type { ContractInstance } from '@aztec/stdlib/contract';
|
|
6
5
|
import { DelayedPublicMutableValues, DelayedPublicMutableValuesWithHash } from '@aztec/stdlib/delayed-public-mutable';
|
|
7
6
|
import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
8
7
|
import type { BlockHeader } from '@aztec/stdlib/tx';
|
|
9
8
|
|
|
9
|
+
import { NoteService } from '../notes/note_service.js';
|
|
10
10
|
import type { ContractStore } from '../storage/contract_store/contract_store.js';
|
|
11
|
+
import type { NoteStore } from '../storage/note_store/note_store.js';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* Read the current class id of a contract from the execution data provider or AztecNode. If not found, class id
|
|
@@ -24,8 +25,7 @@ export async function readCurrentClassId(
|
|
|
24
25
|
aztecNode: AztecNode,
|
|
25
26
|
header: BlockHeader,
|
|
26
27
|
) {
|
|
27
|
-
const
|
|
28
|
-
const blockHash = L2BlockHash.fromField(blockHashFr);
|
|
28
|
+
const blockHash = await header.hash();
|
|
29
29
|
const timestamp = header.globalVariables.timestamp;
|
|
30
30
|
const { delayedPublicMutableSlot } = await DelayedPublicMutableValuesWithHash.getContractUpdateSlots(contractAddress);
|
|
31
31
|
const delayedPublicMutableValues = await DelayedPublicMutableValues.readFromTree(delayedPublicMutableSlot, slot =>
|
|
@@ -43,6 +43,10 @@ export async function syncState(
|
|
|
43
43
|
contractStore: ContractStore,
|
|
44
44
|
functionToInvokeAfterSync: FunctionSelector | null,
|
|
45
45
|
utilityExecutor: (privateSyncCall: FunctionCall) => Promise<any>,
|
|
46
|
+
noteStore: NoteStore,
|
|
47
|
+
aztecNode: AztecNode,
|
|
48
|
+
header: BlockHeader,
|
|
49
|
+
jobId: string,
|
|
46
50
|
) {
|
|
47
51
|
// Protocol contracts don't have private state to sync
|
|
48
52
|
if (!isProtocolContract(contractAddress)) {
|
|
@@ -53,7 +57,11 @@ export async function syncState(
|
|
|
53
57
|
);
|
|
54
58
|
}
|
|
55
59
|
|
|
56
|
-
|
|
60
|
+
const noteService = new NoteService(noteStore, aztecNode, header, jobId);
|
|
61
|
+
|
|
62
|
+
// Both sync_state and syncNoteNullifiers interact with the note store, but running them in parallel is safe
|
|
63
|
+
// because note store is designed to handle concurrent operations.
|
|
64
|
+
await Promise.all([utilityExecutor(syncStateFunctionCall), noteService.syncNoteNullifiers(contractAddress)]);
|
|
57
65
|
}
|
|
58
66
|
}
|
|
59
67
|
|
|
@@ -91,10 +99,21 @@ export async function ensureContractSynced(
|
|
|
91
99
|
utilityExecutor: (call: FunctionCall) => Promise<any>,
|
|
92
100
|
aztecNode: AztecNode,
|
|
93
101
|
contractStore: ContractStore,
|
|
102
|
+
noteStore: NoteStore,
|
|
94
103
|
header: BlockHeader,
|
|
104
|
+
jobId: string,
|
|
95
105
|
): Promise<void> {
|
|
96
106
|
await Promise.all([
|
|
97
|
-
syncState(
|
|
107
|
+
syncState(
|
|
108
|
+
contractAddress,
|
|
109
|
+
contractStore,
|
|
110
|
+
functionToInvokeAfterSync,
|
|
111
|
+
utilityExecutor,
|
|
112
|
+
noteStore,
|
|
113
|
+
aztecNode,
|
|
114
|
+
header,
|
|
115
|
+
jobId,
|
|
116
|
+
),
|
|
98
117
|
verifyCurrentClassId(contractAddress, aztecNode, contractStore, header),
|
|
99
118
|
]);
|
|
100
119
|
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
2
2
|
import type { NoteDao, NotesFilter } from '@aztec/stdlib/note';
|
|
3
|
+
import type { BlockHeader } from '@aztec/stdlib/tx';
|
|
3
4
|
|
|
5
|
+
import type { BlockSynchronizer } from '../block_synchronizer/block_synchronizer.js';
|
|
4
6
|
import type { PXE } from '../pxe.js';
|
|
5
7
|
import type { ContractStore } from '../storage/contract_store/contract_store.js';
|
|
8
|
+
import type { AnchorBlockStore } from '../storage/index.js';
|
|
6
9
|
import type { NoteStore } from '../storage/note_store/note_store.js';
|
|
7
10
|
|
|
8
11
|
/**
|
|
@@ -10,18 +13,20 @@ import type { NoteStore } from '../storage/note_store/note_store.js';
|
|
|
10
13
|
* No backwards compatibility or API stability should be expected. Use at your own risk.
|
|
11
14
|
*/
|
|
12
15
|
export class PXEDebugUtils {
|
|
13
|
-
#pxe
|
|
16
|
+
#pxe!: PXE;
|
|
17
|
+
#putJobInQueue!: <T>(job: (jobId: string) => Promise<T>) => Promise<T>;
|
|
14
18
|
|
|
15
19
|
constructor(
|
|
16
20
|
private contractStore: ContractStore,
|
|
17
21
|
private noteStore: NoteStore,
|
|
22
|
+
private blockStateSynchronizer: BlockSynchronizer,
|
|
23
|
+
private anchorBlockStore: AnchorBlockStore,
|
|
18
24
|
) {}
|
|
19
25
|
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
*/
|
|
23
|
-
public setPXE(pxe: PXE) {
|
|
26
|
+
/** Not injected through constructor since they're are co-dependant */
|
|
27
|
+
public setPXE(pxe: PXE, putJobInQueue: <T>(job: (jobId: string) => Promise<T>) => Promise<T>) {
|
|
24
28
|
this.#pxe = pxe;
|
|
29
|
+
this.#putJobInQueue = putJobInQueue;
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
/**
|
|
@@ -36,14 +41,23 @@ export class PXEDebugUtils {
|
|
|
36
41
|
* @returns The requested notes.
|
|
37
42
|
*/
|
|
38
43
|
public async getNotes(filter: NotesFilter): Promise<NoteDao[]> {
|
|
39
|
-
if (!this.#pxe) {
|
|
40
|
-
throw new Error('Cannot getNotes because no PXE is set');
|
|
41
|
-
}
|
|
42
|
-
|
|
43
44
|
// We need to manually trigger private state sync to have a guarantee that all the notes are available.
|
|
44
45
|
const call = await this.contractStore.getFunctionCall('sync_state', [], filter.contractAddress);
|
|
45
46
|
await this.#pxe.simulateUtility(call);
|
|
46
47
|
|
|
47
48
|
return this.noteStore.getNotes(filter, randomBytes(8).toString('hex'));
|
|
48
49
|
}
|
|
50
|
+
|
|
51
|
+
/** Returns the block header up to which the PXE has synced. */
|
|
52
|
+
public getSyncedBlockHeader(): Promise<BlockHeader> {
|
|
53
|
+
return this.anchorBlockStore.getBlockHeader();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Triggers a sync of the PXE with the node.
|
|
58
|
+
* Blocks until the sync is complete.
|
|
59
|
+
*/
|
|
60
|
+
public sync(): Promise<void> {
|
|
61
|
+
return this.#putJobInQueue(() => this.blockStateSynchronizer.sync());
|
|
62
|
+
}
|
|
49
63
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
|
|
2
2
|
import { BBBundlePrivateKernelProver } from '@aztec/bb-prover/client/bundle';
|
|
3
|
-
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
4
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
4
|
import { createStore } from '@aztec/kv-store/indexeddb';
|
|
6
5
|
import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
|
|
@@ -9,6 +8,7 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
|
9
8
|
|
|
10
9
|
import type { PXEConfig } from '../../../config/index.js';
|
|
11
10
|
import { PXE } from '../../../pxe.js';
|
|
11
|
+
import { PXE_DATA_SCHEMA_VERSION } from '../../../storage/metadata.js';
|
|
12
12
|
import type { PXECreationOptions } from '../../pxe_creation_options.js';
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -26,13 +26,7 @@ export async function createPXE(
|
|
|
26
26
|
config: PXEConfig,
|
|
27
27
|
options: PXECreationOptions = { loggers: {} },
|
|
28
28
|
) {
|
|
29
|
-
const
|
|
30
|
-
typeof options.useLogSuffix === 'boolean'
|
|
31
|
-
? options.useLogSuffix
|
|
32
|
-
? randomBytes(3).toString('hex')
|
|
33
|
-
: undefined
|
|
34
|
-
: options.useLogSuffix;
|
|
35
|
-
|
|
29
|
+
const actor = options.loggerActorLabel;
|
|
36
30
|
const loggers = options.loggers ?? {};
|
|
37
31
|
|
|
38
32
|
const l1Contracts = await aztecNode.getL1ContractAddresses();
|
|
@@ -41,14 +35,13 @@ export async function createPXE(
|
|
|
41
35
|
l1Contracts,
|
|
42
36
|
} as PXEConfig;
|
|
43
37
|
|
|
44
|
-
const storeLogger = loggers.store
|
|
38
|
+
const storeLogger = loggers.store ?? createLogger('pxe:data:idb', { actor });
|
|
45
39
|
|
|
46
|
-
const store =
|
|
40
|
+
const store =
|
|
41
|
+
options.store ?? (await createStore('pxe_data', configWithContracts, PXE_DATA_SCHEMA_VERSION, storeLogger));
|
|
47
42
|
|
|
48
43
|
const simulator = options.simulator ?? new WASMSimulator();
|
|
49
|
-
const proverLogger = loggers.prover
|
|
50
|
-
? loggers.prover
|
|
51
|
-
: createLogger('pxe:bb:wasm:bundle' + (logSuffix ? `:${logSuffix}` : ''));
|
|
44
|
+
const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
|
|
52
45
|
|
|
53
46
|
let prover;
|
|
54
47
|
if (options.proverOrOptions instanceof BBPrivateKernelProver) {
|
|
@@ -58,7 +51,7 @@ export async function createPXE(
|
|
|
58
51
|
}
|
|
59
52
|
const protocolContractsProvider = new BundledProtocolContractsProvider();
|
|
60
53
|
|
|
61
|
-
const pxeLogger = loggers.pxe
|
|
54
|
+
const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
|
|
62
55
|
const pxe = await PXE.create(aztecNode, store, prover, simulator, protocolContractsProvider, config, pxeLogger);
|
|
63
56
|
return pxe;
|
|
64
57
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
|
|
2
2
|
import { BBLazyPrivateKernelProver } from '@aztec/bb-prover/client/lazy';
|
|
3
|
-
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
4
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
4
|
import { createStore } from '@aztec/kv-store/indexeddb';
|
|
6
5
|
import { LazyProtocolContractsProvider } from '@aztec/protocol-contracts/providers/lazy';
|
|
@@ -9,6 +8,7 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
|
9
8
|
|
|
10
9
|
import type { PXEConfig } from '../../../config/index.js';
|
|
11
10
|
import { PXE } from '../../../pxe.js';
|
|
11
|
+
import { PXE_DATA_SCHEMA_VERSION } from '../../../storage/metadata.js';
|
|
12
12
|
import type { PXECreationOptions } from '../../pxe_creation_options.js';
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -17,7 +17,7 @@ import type { PXECreationOptions } from '../../pxe_creation_options.js';
|
|
|
17
17
|
*
|
|
18
18
|
* @param aztecNode - The AztecNode instance to be used by the server.
|
|
19
19
|
* @param config - The PXE Config to use
|
|
20
|
-
* @param
|
|
20
|
+
* @param options - (Optional) Optional information for creating an PXE.
|
|
21
21
|
* @returns A Promise that resolves to the started PXE instance.
|
|
22
22
|
*/
|
|
23
23
|
export async function createPXE(
|
|
@@ -25,12 +25,7 @@ export async function createPXE(
|
|
|
25
25
|
config: PXEConfig,
|
|
26
26
|
options: PXECreationOptions = { loggers: {} },
|
|
27
27
|
) {
|
|
28
|
-
const
|
|
29
|
-
typeof options.useLogSuffix === 'boolean'
|
|
30
|
-
? options.useLogSuffix
|
|
31
|
-
? randomBytes(3).toString('hex')
|
|
32
|
-
: undefined
|
|
33
|
-
: options.useLogSuffix;
|
|
28
|
+
const actor = options.loggerActorLabel;
|
|
34
29
|
|
|
35
30
|
const l1Contracts = await aztecNode.getL1ContractAddresses();
|
|
36
31
|
const configWithContracts = {
|
|
@@ -40,14 +35,13 @@ export async function createPXE(
|
|
|
40
35
|
|
|
41
36
|
const loggers = options.loggers ?? {};
|
|
42
37
|
|
|
43
|
-
const storeLogger = loggers.store
|
|
38
|
+
const storeLogger = loggers.store ?? createLogger('pxe:data:idb', { actor });
|
|
44
39
|
|
|
45
|
-
const store =
|
|
40
|
+
const store =
|
|
41
|
+
options.store ?? (await createStore('pxe_data', configWithContracts, PXE_DATA_SCHEMA_VERSION, storeLogger));
|
|
46
42
|
|
|
47
43
|
const simulator = options.simulator ?? new WASMSimulator();
|
|
48
|
-
const proverLogger = loggers.prover
|
|
49
|
-
? loggers.prover
|
|
50
|
-
: createLogger('pxe:bb:wasm:bundle' + (logSuffix ? `:${logSuffix}` : ''));
|
|
44
|
+
const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
|
|
51
45
|
|
|
52
46
|
let prover;
|
|
53
47
|
if (options.proverOrOptions instanceof BBPrivateKernelProver) {
|
|
@@ -57,7 +51,7 @@ export async function createPXE(
|
|
|
57
51
|
}
|
|
58
52
|
const protocolContractsProvider = new LazyProtocolContractsProvider();
|
|
59
53
|
|
|
60
|
-
const pxeLogger = loggers.pxe
|
|
54
|
+
const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
|
|
61
55
|
const pxe = await PXE.create(aztecNode, store, prover, simulator, protocolContractsProvider, config, pxeLogger);
|
|
62
56
|
return pxe;
|
|
63
57
|
}
|
|
@@ -6,7 +6,8 @@ import type { PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
|
|
|
6
6
|
|
|
7
7
|
export type PXECreationOptions = {
|
|
8
8
|
loggers?: { store?: Logger; pxe?: Logger; prover?: Logger };
|
|
9
|
-
|
|
9
|
+
/** Actor label to include in log output (e.g., 'pxe-0', 'pxe-test'). */
|
|
10
|
+
loggerActorLabel?: string;
|
|
10
11
|
proverOrOptions?: PrivateKernelProver | BBPrivateKernelProverOptions;
|
|
11
12
|
store?: AztecAsyncKVStore;
|
|
12
13
|
simulator?: CircuitSimulator;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
|
|
2
2
|
import { BBBundlePrivateKernelProver } from '@aztec/bb-prover/client/bundle';
|
|
3
|
-
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
4
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
4
|
import { createStore } from '@aztec/kv-store/lmdb-v2';
|
|
6
5
|
import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
|
|
@@ -20,17 +19,13 @@ export async function createPXE(
|
|
|
20
19
|
config: PXEConfigWithoutDefaults,
|
|
21
20
|
options: PXECreationOptions = { loggers: {} },
|
|
22
21
|
) {
|
|
22
|
+
const actor = options.loggerActorLabel;
|
|
23
|
+
const recorderLogger = createLogger('simulator:acvm:recording', { actor });
|
|
23
24
|
const recorder = process.env.CIRCUIT_RECORD_DIR
|
|
24
|
-
? new FileCircuitRecorder(process.env.CIRCUIT_RECORD_DIR)
|
|
25
|
-
: new MemoryCircuitRecorder();
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
const logSuffix =
|
|
29
|
-
typeof options.useLogSuffix === 'boolean'
|
|
30
|
-
? options.useLogSuffix
|
|
31
|
-
? randomBytes(3).toString('hex')
|
|
32
|
-
: undefined
|
|
33
|
-
: options.useLogSuffix;
|
|
25
|
+
? new FileCircuitRecorder(process.env.CIRCUIT_RECORD_DIR, recorderLogger)
|
|
26
|
+
: new MemoryCircuitRecorder(recorderLogger);
|
|
27
|
+
const simulatorLogger = createLogger('wasm-simulator', { actor });
|
|
28
|
+
const simulator = new SimulatorRecorderWrapper(new WASMSimulator(simulatorLogger), recorder);
|
|
34
29
|
const loggers = options.loggers ?? {};
|
|
35
30
|
|
|
36
31
|
const { l1ChainId, l1ContractAddresses: l1Contracts, rollupVersion } = await aztecNode.getNodeInfo();
|
|
@@ -43,14 +38,15 @@ export async function createPXE(
|
|
|
43
38
|
};
|
|
44
39
|
|
|
45
40
|
if (!options.store) {
|
|
46
|
-
const storeLogger = loggers.store
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
41
|
+
const storeLogger = loggers.store ?? createLogger('pxe:data:lmdb', { actor });
|
|
42
|
+
options.store = await createStore(
|
|
43
|
+
'pxe_data',
|
|
44
|
+
PXE_DATA_SCHEMA_VERSION,
|
|
45
|
+
configWithContracts,
|
|
46
|
+
storeLogger.getBindings(),
|
|
47
|
+
);
|
|
50
48
|
}
|
|
51
|
-
const proverLogger = loggers.prover
|
|
52
|
-
? loggers.prover
|
|
53
|
-
: createLogger('pxe:bb:native' + (logSuffix ? `:${logSuffix}` : ''));
|
|
49
|
+
const proverLogger = loggers.prover ?? createLogger('pxe:bb:native', { actor });
|
|
54
50
|
|
|
55
51
|
let prover;
|
|
56
52
|
if (options.proverOrOptions instanceof BBPrivateKernelProver) {
|
|
@@ -61,7 +57,7 @@ export async function createPXE(
|
|
|
61
57
|
|
|
62
58
|
const protocolContractsProvider = new BundledProtocolContractsProvider();
|
|
63
59
|
|
|
64
|
-
const pxeLogger = loggers.pxe
|
|
60
|
+
const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
|
|
65
61
|
const pxe = await PXE.create(
|
|
66
62
|
aztecNode,
|
|
67
63
|
options.store,
|
|
@@ -3,14 +3,13 @@ import type { EventSelector } from '@aztec/stdlib/abi';
|
|
|
3
3
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
4
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
5
5
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
6
|
-
import type { TxHash } from '@aztec/stdlib/tx';
|
|
6
|
+
import type { BlockHeader, TxHash } from '@aztec/stdlib/tx';
|
|
7
7
|
|
|
8
|
-
import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
|
|
9
8
|
import { PrivateEventStore } from '../storage/private_event_store/private_event_store.js';
|
|
10
9
|
|
|
11
10
|
export class EventService {
|
|
12
11
|
constructor(
|
|
13
|
-
private readonly
|
|
12
|
+
private readonly anchorBlockHeader: BlockHeader,
|
|
14
13
|
private readonly aztecNode: AztecNode,
|
|
15
14
|
private readonly privateEventStore: PrivateEventStore,
|
|
16
15
|
private readonly jobId: string,
|
|
@@ -29,13 +28,12 @@ export class EventService {
|
|
|
29
28
|
// (and thus we're less concerned about being ahead of the synced block), we use the synced block number to
|
|
30
29
|
// maintain consistent behavior in the PXE. Additionally, events should never be ahead of the synced block here
|
|
31
30
|
// since `fetchTaggedLogs` only processes logs up to the synced block.
|
|
32
|
-
const [
|
|
33
|
-
this.anchorBlockStore.getBlockHeader(),
|
|
31
|
+
const [siloedEventCommitment, txEffect] = await Promise.all([
|
|
34
32
|
siloNullifier(contractAddress, eventCommitment),
|
|
35
33
|
this.aztecNode.getTxEffect(txHash),
|
|
36
34
|
]);
|
|
37
35
|
|
|
38
|
-
const anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
36
|
+
const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
|
|
39
37
|
|
|
40
38
|
if (!txEffect) {
|
|
41
39
|
throw new Error(`Could not find tx effect for tx hash ${txHash}`);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
2
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -40,7 +40,7 @@ export interface StagedStore {
|
|
|
40
40
|
* using a job queue with concurrency=1.
|
|
41
41
|
*/
|
|
42
42
|
export class JobCoordinator {
|
|
43
|
-
private readonly log
|
|
43
|
+
private readonly log: Logger;
|
|
44
44
|
|
|
45
45
|
/** The underlying KV store */
|
|
46
46
|
kvStore: AztecAsyncKVStore;
|
|
@@ -48,8 +48,9 @@ export class JobCoordinator {
|
|
|
48
48
|
#currentJobId: string | undefined;
|
|
49
49
|
#stores: Map<string, StagedStore> = new Map();
|
|
50
50
|
|
|
51
|
-
constructor(kvStore: AztecAsyncKVStore) {
|
|
51
|
+
constructor(kvStore: AztecAsyncKVStore, bindings?: LoggerBindings) {
|
|
52
52
|
this.kvStore = kvStore;
|
|
53
|
+
this.log = createLogger('pxe:job_coordinator', bindings);
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
/**
|