@aztec/pxe 0.0.1-commit.2ed92850 → 0.0.1-commit.54489865
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 +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +4 -4
- 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.js +7 -7
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +8 -8
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +2 -2
- 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 +10 -5
- 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 +11 -6
- 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/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 +3 -2
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.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 +7 -5
- 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 +29 -31
- 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 +45 -47
- 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/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 -2
- package/src/contract_function_simulator/oracle/interfaces.ts +7 -7
- package/src/contract_function_simulator/oracle/oracle.ts +7 -7
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +9 -7
- package/src/debug/pxe_debug_utils.ts +23 -9
- package/src/entrypoints/client/bundle/utils.ts +4 -13
- package/src/entrypoints/client/lazy/utils.ts +5 -13
- package/src/entrypoints/pxe_creation_options.ts +2 -1
- package/src/entrypoints/server/utils.ts +15 -19
- package/src/job_coordinator/job_coordinator.ts +4 -3
- package/src/logs/log_service.ts +6 -3
- 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 +15 -6
- package/src/storage/note_store/note_store.ts +28 -33
- package/src/storage/private_event_store/private_event_store.ts +57 -59
- package/src/storage/private_event_store/stored_private_event.ts +3 -3
- 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';
|
|
@@ -102,7 +102,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
102
102
|
* @returns The membership witness containing the leaf index and sibling path
|
|
103
103
|
*/
|
|
104
104
|
public utilityGetNoteHashMembershipWitness(
|
|
105
|
-
blockHash:
|
|
105
|
+
blockHash: BlockHash,
|
|
106
106
|
leafValue: Fr,
|
|
107
107
|
): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
|
|
108
108
|
return this.aztecNode.getNoteHashMembershipWitness(blockHash, leafValue);
|
|
@@ -115,7 +115,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
115
115
|
* @returns The membership witness containing the leaf index and sibling path
|
|
116
116
|
*/
|
|
117
117
|
public utilityGetArchiveMembershipWitness(
|
|
118
|
-
blockHash:
|
|
118
|
+
blockHash: BlockHash,
|
|
119
119
|
leafValue: Fr,
|
|
120
120
|
): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined> {
|
|
121
121
|
return this.aztecNode.getArchiveMembershipWitness(blockHash, leafValue);
|
|
@@ -128,7 +128,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
128
128
|
* @returns The nullifier membership witness (if found).
|
|
129
129
|
*/
|
|
130
130
|
public utilityGetNullifierMembershipWitness(
|
|
131
|
-
blockHash:
|
|
131
|
+
blockHash: BlockHash,
|
|
132
132
|
nullifier: Fr,
|
|
133
133
|
): Promise<NullifierMembershipWitness | undefined> {
|
|
134
134
|
return this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier);
|
|
@@ -144,7 +144,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
144
144
|
* we are trying to prove non-inclusion for.
|
|
145
145
|
*/
|
|
146
146
|
public utilityGetLowNullifierMembershipWitness(
|
|
147
|
-
blockHash:
|
|
147
|
+
blockHash: BlockHash,
|
|
148
148
|
nullifier: Fr,
|
|
149
149
|
): Promise<NullifierMembershipWitness | undefined> {
|
|
150
150
|
return this.aztecNode.getLowNullifierMembershipWitness(blockHash, nullifier);
|
|
@@ -156,7 +156,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
156
156
|
* @param leafSlot - The slot of the public data tree to get the witness for.
|
|
157
157
|
* @returns - The witness
|
|
158
158
|
*/
|
|
159
|
-
public utilityGetPublicDataWitness(blockHash:
|
|
159
|
+
public utilityGetPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
|
|
160
160
|
return this.aztecNode.getPublicDataWitness(blockHash, leafSlot);
|
|
161
161
|
}
|
|
162
162
|
|
|
@@ -318,7 +318,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
318
318
|
* @param numberOfElements - Number of elements to read from the starting storage slot.
|
|
319
319
|
*/
|
|
320
320
|
public async utilityStorageRead(
|
|
321
|
-
blockHash:
|
|
321
|
+
blockHash: BlockHash,
|
|
322
322
|
contractAddress: AztecAddress,
|
|
323
323
|
startStorageSlot: Fr,
|
|
324
324
|
numberOfElements: number,
|
|
@@ -356,6 +356,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
356
356
|
this.senderAddressBookStore,
|
|
357
357
|
this.addressStore,
|
|
358
358
|
this.jobId,
|
|
359
|
+
this.log.getBindings(),
|
|
359
360
|
);
|
|
360
361
|
|
|
361
362
|
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore, this.jobId);
|
|
@@ -461,6 +462,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
461
462
|
this.senderAddressBookStore,
|
|
462
463
|
this.addressStore,
|
|
463
464
|
this.jobId,
|
|
465
|
+
this.log.getBindings(),
|
|
464
466
|
);
|
|
465
467
|
|
|
466
468
|
const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);
|
|
@@ -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';
|
|
@@ -26,13 +25,7 @@ export async function createPXE(
|
|
|
26
25
|
config: PXEConfig,
|
|
27
26
|
options: PXECreationOptions = { loggers: {} },
|
|
28
27
|
) {
|
|
29
|
-
const
|
|
30
|
-
typeof options.useLogSuffix === 'boolean'
|
|
31
|
-
? options.useLogSuffix
|
|
32
|
-
? randomBytes(3).toString('hex')
|
|
33
|
-
: undefined
|
|
34
|
-
: options.useLogSuffix;
|
|
35
|
-
|
|
28
|
+
const actor = options.loggerActorLabel;
|
|
36
29
|
const loggers = options.loggers ?? {};
|
|
37
30
|
|
|
38
31
|
const l1Contracts = await aztecNode.getL1ContractAddresses();
|
|
@@ -41,14 +34,12 @@ export async function createPXE(
|
|
|
41
34
|
l1Contracts,
|
|
42
35
|
} as PXEConfig;
|
|
43
36
|
|
|
44
|
-
const storeLogger = loggers.store
|
|
37
|
+
const storeLogger = loggers.store ?? createLogger('pxe:data:idb', { actor });
|
|
45
38
|
|
|
46
39
|
const store = options.store ?? (await createStore('pxe_data', configWithContracts, storeLogger));
|
|
47
40
|
|
|
48
41
|
const simulator = options.simulator ?? new WASMSimulator();
|
|
49
|
-
const proverLogger = loggers.prover
|
|
50
|
-
? loggers.prover
|
|
51
|
-
: createLogger('pxe:bb:wasm:bundle' + (logSuffix ? `:${logSuffix}` : ''));
|
|
42
|
+
const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
|
|
52
43
|
|
|
53
44
|
let prover;
|
|
54
45
|
if (options.proverOrOptions instanceof BBPrivateKernelProver) {
|
|
@@ -58,7 +49,7 @@ export async function createPXE(
|
|
|
58
49
|
}
|
|
59
50
|
const protocolContractsProvider = new BundledProtocolContractsProvider();
|
|
60
51
|
|
|
61
|
-
const pxeLogger = loggers.pxe
|
|
52
|
+
const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
|
|
62
53
|
const pxe = await PXE.create(aztecNode, store, prover, simulator, protocolContractsProvider, config, pxeLogger);
|
|
63
54
|
return pxe;
|
|
64
55
|
}
|
|
@@ -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';
|
|
@@ -17,7 +16,7 @@ import type { PXECreationOptions } from '../../pxe_creation_options.js';
|
|
|
17
16
|
*
|
|
18
17
|
* @param aztecNode - The AztecNode instance to be used by the server.
|
|
19
18
|
* @param config - The PXE Config to use
|
|
20
|
-
* @param
|
|
19
|
+
* @param options - (Optional) Optional information for creating an PXE.
|
|
21
20
|
* @returns A Promise that resolves to the started PXE instance.
|
|
22
21
|
*/
|
|
23
22
|
export async function createPXE(
|
|
@@ -25,12 +24,7 @@ export async function createPXE(
|
|
|
25
24
|
config: PXEConfig,
|
|
26
25
|
options: PXECreationOptions = { loggers: {} },
|
|
27
26
|
) {
|
|
28
|
-
const
|
|
29
|
-
typeof options.useLogSuffix === 'boolean'
|
|
30
|
-
? options.useLogSuffix
|
|
31
|
-
? randomBytes(3).toString('hex')
|
|
32
|
-
: undefined
|
|
33
|
-
: options.useLogSuffix;
|
|
27
|
+
const actor = options.loggerActorLabel;
|
|
34
28
|
|
|
35
29
|
const l1Contracts = await aztecNode.getL1ContractAddresses();
|
|
36
30
|
const configWithContracts = {
|
|
@@ -40,14 +34,12 @@ export async function createPXE(
|
|
|
40
34
|
|
|
41
35
|
const loggers = options.loggers ?? {};
|
|
42
36
|
|
|
43
|
-
const storeLogger = loggers.store
|
|
37
|
+
const storeLogger = loggers.store ?? createLogger('pxe:data:idb', { actor });
|
|
44
38
|
|
|
45
39
|
const store = options.store ?? (await createStore('pxe_data', configWithContracts, storeLogger));
|
|
46
40
|
|
|
47
41
|
const simulator = options.simulator ?? new WASMSimulator();
|
|
48
|
-
const proverLogger = loggers.prover
|
|
49
|
-
? loggers.prover
|
|
50
|
-
: createLogger('pxe:bb:wasm:bundle' + (logSuffix ? `:${logSuffix}` : ''));
|
|
42
|
+
const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
|
|
51
43
|
|
|
52
44
|
let prover;
|
|
53
45
|
if (options.proverOrOptions instanceof BBPrivateKernelProver) {
|
|
@@ -57,7 +49,7 @@ export async function createPXE(
|
|
|
57
49
|
}
|
|
58
50
|
const protocolContractsProvider = new LazyProtocolContractsProvider();
|
|
59
51
|
|
|
60
|
-
const pxeLogger = loggers.pxe
|
|
52
|
+
const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
|
|
61
53
|
const pxe = await PXE.create(aztecNode, store, prover, simulator, protocolContractsProvider, config, pxeLogger);
|
|
62
54
|
return pxe;
|
|
63
55
|
}
|
|
@@ -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,
|
|
@@ -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
|
/**
|
package/src/logs/log_service.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import type { KeyStore } from '@aztec/key-store';
|
|
4
4
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
5
|
import type { CompleteAddress } from '@aztec/stdlib/contract';
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
} from '../tagging/index.js';
|
|
21
21
|
|
|
22
22
|
export class LogService {
|
|
23
|
-
private log
|
|
23
|
+
private log: Logger;
|
|
24
24
|
|
|
25
25
|
constructor(
|
|
26
26
|
private readonly aztecNode: AztecNode,
|
|
@@ -31,7 +31,10 @@ export class LogService {
|
|
|
31
31
|
private readonly senderAddressBookStore: SenderAddressBookStore,
|
|
32
32
|
private readonly addressStore: AddressStore,
|
|
33
33
|
private readonly jobId: string,
|
|
34
|
-
|
|
34
|
+
bindings?: LoggerBindings,
|
|
35
|
+
) {
|
|
36
|
+
this.log = createLogger('pxe:log_service', bindings);
|
|
37
|
+
}
|
|
35
38
|
|
|
36
39
|
public async bulkRetrieveLogs(logRetrievalRequests: LogRetrievalRequest[]): Promise<(LogRetrievalResponse | null)[]> {
|
|
37
40
|
return await Promise.all(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { vkAsFieldsMegaHonk } from '@aztec/foundation/crypto/keys';
|
|
2
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { pushTestData } from '@aztec/foundation/testing';
|
|
5
5
|
import { Timer } from '@aztec/foundation/timer';
|
|
6
6
|
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
@@ -56,13 +56,16 @@ export interface PrivateKernelExecutionProverConfig {
|
|
|
56
56
|
* inform state tree updates.
|
|
57
57
|
*/
|
|
58
58
|
export class PrivateKernelExecutionProver {
|
|
59
|
-
private log
|
|
59
|
+
private log: Logger;
|
|
60
60
|
|
|
61
61
|
constructor(
|
|
62
62
|
private oracle: PrivateKernelOracle,
|
|
63
63
|
private proofCreator: PrivateKernelProver,
|
|
64
64
|
private fakeProofs = false,
|
|
65
|
-
|
|
65
|
+
bindings?: LoggerBindings,
|
|
66
|
+
) {
|
|
67
|
+
this.log = createLogger('pxe:private-kernel-execution-prover', bindings);
|
|
68
|
+
}
|
|
66
69
|
|
|
67
70
|
/**
|
|
68
71
|
* Generate a proof for a given transaction request and execution result.
|
|
@@ -7,7 +7,7 @@ import { getVKIndex, getVKSiblingPath } from '@aztec/noir-protocol-circuits-type
|
|
|
7
7
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
8
8
|
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
9
9
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
10
|
-
import {
|
|
10
|
+
import { BlockHash } from '@aztec/stdlib/block';
|
|
11
11
|
import {
|
|
12
12
|
type ContractInstanceWithAddress,
|
|
13
13
|
computeContractClassIdPreimage,
|
|
@@ -30,7 +30,7 @@ export class PrivateKernelOracle {
|
|
|
30
30
|
private contractStore: ContractStore,
|
|
31
31
|
private keyStore: KeyStore,
|
|
32
32
|
private node: AztecNode,
|
|
33
|
-
private blockHash:
|
|
33
|
+
private blockHash: BlockHash,
|
|
34
34
|
) {}
|
|
35
35
|
|
|
36
36
|
/** Retrieves the preimage of a contract address from the registered contract instances db. */
|
package/src/pxe.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
|
|
2
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
-
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
6
6
|
import { Timer } from '@aztec/foundation/timer';
|
|
7
7
|
import { KeyStore } from '@aztec/key-store';
|
|
@@ -128,6 +128,10 @@ export class PXE {
|
|
|
128
128
|
config: PXEConfig,
|
|
129
129
|
loggerOrSuffix?: string | Logger,
|
|
130
130
|
) {
|
|
131
|
+
// Extract bindings from the logger, or use empty bindings if a string suffix is provided.
|
|
132
|
+
const bindings: LoggerBindings | undefined =
|
|
133
|
+
loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
|
|
134
|
+
|
|
131
135
|
const log =
|
|
132
136
|
!loggerOrSuffix || typeof loggerOrSuffix === 'string'
|
|
133
137
|
? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
|
|
@@ -153,10 +157,10 @@ export class PXE {
|
|
|
153
157
|
privateEventStore,
|
|
154
158
|
tipsStore,
|
|
155
159
|
config,
|
|
156
|
-
|
|
160
|
+
bindings,
|
|
157
161
|
);
|
|
158
162
|
|
|
159
|
-
const jobCoordinator = new JobCoordinator(store);
|
|
163
|
+
const jobCoordinator = new JobCoordinator(store, bindings);
|
|
160
164
|
jobCoordinator.registerStores([
|
|
161
165
|
capsuleStore,
|
|
162
166
|
senderTaggingStore,
|
|
@@ -165,7 +169,7 @@ export class PXE {
|
|
|
165
169
|
noteStore,
|
|
166
170
|
]);
|
|
167
171
|
|
|
168
|
-
const debugUtils = new PXEDebugUtils(contractStore, noteStore);
|
|
172
|
+
const debugUtils = new PXEDebugUtils(contractStore, noteStore, synchronizer, anchorBlockStore);
|
|
169
173
|
|
|
170
174
|
const jobQueue = new SerialQueue();
|
|
171
175
|
|
|
@@ -192,7 +196,7 @@ export class PXE {
|
|
|
192
196
|
debugUtils,
|
|
193
197
|
);
|
|
194
198
|
|
|
195
|
-
debugUtils.setPXE(pxe);
|
|
199
|
+
debugUtils.setPXE(pxe, pxe.#putInJobQueue.bind(pxe));
|
|
196
200
|
|
|
197
201
|
pxe.jobQueue.start();
|
|
198
202
|
|
|
@@ -400,7 +404,12 @@ export class PXE {
|
|
|
400
404
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
401
405
|
const anchorBlockHash = await anchorBlockHeader.hash();
|
|
402
406
|
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
|
|
403
|
-
const kernelTraceProver = new PrivateKernelExecutionProver(
|
|
407
|
+
const kernelTraceProver = new PrivateKernelExecutionProver(
|
|
408
|
+
kernelOracle,
|
|
409
|
+
proofCreator,
|
|
410
|
+
!this.proverEnabled,
|
|
411
|
+
this.log.getBindings(),
|
|
412
|
+
);
|
|
404
413
|
this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
|
|
405
414
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
406
415
|
}
|
|
@@ -18,8 +18,6 @@ import { StoredNote } from './stored_note.js';
|
|
|
18
18
|
export class NoteStore implements StagedStore {
|
|
19
19
|
readonly storeName: string = 'note';
|
|
20
20
|
|
|
21
|
-
#store: AztecAsyncKVStore;
|
|
22
|
-
|
|
23
21
|
// Note that we use the siloedNullifier as the note id in the store as it's guaranteed to be unique.
|
|
24
22
|
|
|
25
23
|
// Main storage for notes. Avoid performing full scans on it as it contains all notes PXE knows, use
|
|
@@ -48,7 +46,6 @@ export class NoteStore implements StagedStore {
|
|
|
48
46
|
#jobLocks: Map<string, Semaphore>;
|
|
49
47
|
|
|
50
48
|
constructor(store: AztecAsyncKVStore) {
|
|
51
|
-
this.#store = store;
|
|
52
49
|
this.#notes = store.openMap('notes');
|
|
53
50
|
this.#nullifiersByContractAddress = store.openMultiMap('note_nullifiers_by_contract');
|
|
54
51
|
this.#nullifiersByNullificationBlockNumber = store.openMultiMap('note_block_number_to_nullifier');
|
|
@@ -182,43 +179,41 @@ export class NoteStore implements StagedStore {
|
|
|
182
179
|
* @throws Error if any nullifier is not found in this notes store
|
|
183
180
|
*/
|
|
184
181
|
applyNullifiers(nullifiers: DataInBlock<Fr>[], jobId: string): Promise<NoteDao[]> {
|
|
185
|
-
return this.#withJobLock(jobId, () =>
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const notesToNullify = await Promise.all(
|
|
192
|
-
nullifiers.map(async nullifierInBlock => {
|
|
193
|
-
const nullifier = nullifierInBlock.data.toString();
|
|
182
|
+
return this.#withJobLock(jobId, async () => {
|
|
183
|
+
if (nullifiers.length === 0) {
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
194
186
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}
|
|
187
|
+
const notesToNullify = await Promise.all(
|
|
188
|
+
nullifiers.map(async nullifierInBlock => {
|
|
189
|
+
const nullifier = nullifierInBlock.data.toString();
|
|
199
190
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
191
|
+
const storedNote = await this.#readNote(nullifier, jobId);
|
|
192
|
+
if (!storedNote) {
|
|
193
|
+
throw new Error(`Attempted to mark a note as nullified which does not exist in PXE DB`);
|
|
194
|
+
}
|
|
203
195
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
const note = noteToNullify.storedNote!;
|
|
196
|
+
return { storedNote: await this.#readNote(nullifier, jobId), blockNumber: nullifierInBlock.l2BlockNumber };
|
|
197
|
+
}),
|
|
198
|
+
);
|
|
208
199
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
200
|
+
const notesNullifiedInThisCall: Map<string, NoteDao> = new Map();
|
|
201
|
+
for (const noteToNullify of notesToNullify) {
|
|
202
|
+
// Safe to coerce (!) because we throw if we find any undefined above
|
|
203
|
+
const note = noteToNullify.storedNote!;
|
|
213
204
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
205
|
+
// Skip already nullified notes
|
|
206
|
+
if (note.isNullified()) {
|
|
207
|
+
continue;
|
|
217
208
|
}
|
|
218
209
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
210
|
+
note.markAsNullified(noteToNullify.blockNumber);
|
|
211
|
+
this.#writeNote(note, jobId);
|
|
212
|
+
notesNullifiedInThisCall.set(note.noteDao.siloedNullifier.toString(), note.noteDao);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return [...notesNullifiedInThisCall.values()];
|
|
216
|
+
});
|
|
222
217
|
}
|
|
223
218
|
|
|
224
219
|
/**
|