@aztec/pxe 0.0.1-commit.bf2612ae → 0.0.1-commit.c2595eba
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 +3 -3
- 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/utility_execution_oracle.d.ts +1 -1
- 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/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.js +1 -1
- package/package.json +16 -16
- package/src/block_synchronizer/block_synchronizer.ts +15 -12
- package/src/contract_function_simulator/contract_function_simulator.ts +6 -2
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +2 -0
- 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/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 +1 -1
|
@@ -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.
|
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
|
/**
|
|
@@ -131,78 +131,76 @@ export class PrivateEventStore implements StagedStore {
|
|
|
131
131
|
* @returns - The event log contents, augmented with metadata about the transaction and block in which the event was
|
|
132
132
|
* included.
|
|
133
133
|
*/
|
|
134
|
-
public getPrivateEvents(
|
|
134
|
+
public async getPrivateEvents(
|
|
135
135
|
eventSelector: EventSelector,
|
|
136
136
|
filter: PrivateEventStoreFilter,
|
|
137
137
|
): Promise<PackedPrivateEvent[]> {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
}> = [];
|
|
145
|
-
|
|
146
|
-
const key = this.#keyFor(filter.contractAddress, eventSelector);
|
|
147
|
-
const targetScopes = new Set(filter.scopes.map(s => s.toString()));
|
|
148
|
-
|
|
149
|
-
const eventIds: string[] = await toArray(this.#eventsByContractAndEventSelector.getValuesAsync(key));
|
|
150
|
-
|
|
151
|
-
for (const eventId of eventIds) {
|
|
152
|
-
const eventBuffer = await this.#events.getAsync(eventId);
|
|
153
|
-
|
|
154
|
-
// Defensive, if it happens, there's a problem with how we're handling #eventsByContractAndEventSelector
|
|
155
|
-
if (!eventBuffer) {
|
|
156
|
-
this.logger.verbose(
|
|
157
|
-
`EventId ${eventId} does not exist in main index but it is referenced from contract event selector index`,
|
|
158
|
-
);
|
|
159
|
-
continue;
|
|
160
|
-
}
|
|
138
|
+
const events: Array<{
|
|
139
|
+
l2BlockNumber: number;
|
|
140
|
+
txIndexInBlock: number;
|
|
141
|
+
eventIndexInTx: number;
|
|
142
|
+
event: PackedPrivateEvent;
|
|
143
|
+
}> = [];
|
|
161
144
|
|
|
162
|
-
|
|
145
|
+
const key = this.#keyFor(filter.contractAddress, eventSelector);
|
|
146
|
+
const targetScopes = new Set(filter.scopes.map(s => s.toString()));
|
|
163
147
|
|
|
164
|
-
|
|
165
|
-
if (storedPrivateEvent.l2BlockNumber < filter.fromBlock || storedPrivateEvent.l2BlockNumber >= filter.toBlock) {
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
148
|
+
const eventIds: string[] = await toArray(this.#eventsByContractAndEventSelector.getValuesAsync(key));
|
|
168
149
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
150
|
+
for (const eventId of eventIds) {
|
|
151
|
+
const eventBuffer = await this.#events.getAsync(eventId);
|
|
173
152
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
153
|
+
// Defensive, if it happens, there's a problem with how we're handling #eventsByContractAndEventSelector
|
|
154
|
+
if (!eventBuffer) {
|
|
155
|
+
this.logger.verbose(
|
|
156
|
+
`EventId ${eventId} does not exist in main index but it is referenced from contract event selector index`,
|
|
157
|
+
);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
178
160
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
packedEvent: storedPrivateEvent.msgContent,
|
|
185
|
-
l2BlockNumber: BlockNumber(storedPrivateEvent.l2BlockNumber),
|
|
186
|
-
txHash: storedPrivateEvent.txHash,
|
|
187
|
-
l2BlockHash: storedPrivateEvent.l2BlockHash,
|
|
188
|
-
eventSelector,
|
|
189
|
-
},
|
|
190
|
-
});
|
|
161
|
+
const storedPrivateEvent = StoredPrivateEvent.fromBuffer(eventBuffer);
|
|
162
|
+
|
|
163
|
+
// Filter by block range
|
|
164
|
+
if (storedPrivateEvent.l2BlockNumber < filter.fromBlock || storedPrivateEvent.l2BlockNumber >= filter.toBlock) {
|
|
165
|
+
continue;
|
|
191
166
|
}
|
|
192
167
|
|
|
193
|
-
//
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
168
|
+
// Filter by scopes
|
|
169
|
+
if (storedPrivateEvent.scopes.intersection(targetScopes).size === 0) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Filter by txHash
|
|
174
|
+
if (filter.txHash && !storedPrivateEvent.txHash.equals(filter.txHash)) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
events.push({
|
|
179
|
+
l2BlockNumber: storedPrivateEvent.l2BlockNumber,
|
|
180
|
+
txIndexInBlock: storedPrivateEvent.txIndexInBlock,
|
|
181
|
+
eventIndexInTx: storedPrivateEvent.eventIndexInTx,
|
|
182
|
+
event: {
|
|
183
|
+
packedEvent: storedPrivateEvent.msgContent,
|
|
184
|
+
l2BlockNumber: BlockNumber(storedPrivateEvent.l2BlockNumber),
|
|
185
|
+
txHash: storedPrivateEvent.txHash,
|
|
186
|
+
l2BlockHash: storedPrivateEvent.l2BlockHash,
|
|
187
|
+
eventSelector,
|
|
188
|
+
},
|
|
202
189
|
});
|
|
190
|
+
}
|
|
203
191
|
|
|
204
|
-
|
|
192
|
+
// Sort by block number, then by tx index within block, then by event index within tx
|
|
193
|
+
events.sort((a, b) => {
|
|
194
|
+
if (a.l2BlockNumber !== b.l2BlockNumber) {
|
|
195
|
+
return a.l2BlockNumber - b.l2BlockNumber;
|
|
196
|
+
}
|
|
197
|
+
if (a.txIndexInBlock !== b.txIndexInBlock) {
|
|
198
|
+
return a.txIndexInBlock - b.txIndexInBlock;
|
|
199
|
+
}
|
|
200
|
+
return a.eventIndexInTx - b.eventIndexInTx;
|
|
205
201
|
});
|
|
202
|
+
|
|
203
|
+
return events.map(ev => ev.event);
|
|
206
204
|
}
|
|
207
205
|
|
|
208
206
|
/**
|
|
@@ -49,7 +49,7 @@ export class StoredPrivateEvent {
|
|
|
49
49
|
const msgContentLength = reader.readNumber();
|
|
50
50
|
const msgContent = reader.readArray(msgContentLength, Fr);
|
|
51
51
|
const l2BlockNumber = reader.readNumber();
|
|
52
|
-
const l2BlockHash = BlockHash.fromBuffer(reader);
|
|
52
|
+
const l2BlockHash = new BlockHash(Fr.fromBuffer(reader));
|
|
53
53
|
const txHash = TxHash.fromBuffer(reader);
|
|
54
54
|
const txIndexInBlock = reader.readNumber();
|
|
55
55
|
const eventIndexInTx = reader.readNumber();
|