@aztec/pxe 0.0.1-commit.54489865 → 0.0.1-commit.592b9384
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/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 +3 -5
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +7 -7
- 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 +9 -9
- 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 +4 -4
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +15 -11
- 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 -19
- 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 +2 -1
- package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +2 -1
- 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/logs/log_service.d.ts +4 -4
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +7 -10
- 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 -7
- 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/pxe.d.ts +1 -1
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +1 -1
- 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 +169 -129
- 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 +126 -101
- 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/package.json +16 -16
- package/src/contract_function_simulator/contract_function_simulator.ts +0 -4
- package/src/contract_function_simulator/oracle/interfaces.ts +8 -8
- package/src/contract_function_simulator/oracle/oracle.ts +21 -11
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +1 -5
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +24 -20
- package/src/entrypoints/client/bundle/utils.ts +3 -1
- package/src/entrypoints/client/lazy/utils.ts +3 -1
- package/src/events/event_service.ts +4 -6
- package/src/logs/log_service.ts +6 -9
- package/src/notes/note_service.ts +5 -7
- package/src/oracle_version.ts +2 -2
- package/src/pxe.ts +0 -1
- 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 +185 -150
- package/src/storage/private_event_store/private_event_store.ts +151 -128
- 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
|
@@ -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
|
|
121
|
+
public utilityGetBlockHashMembershipWitness(
|
|
122
|
+
anchorBlockHash: BlockHash,
|
|
118
123
|
blockHash: BlockHash,
|
|
119
|
-
leafValue: Fr,
|
|
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
|
/**
|
|
@@ -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, {
|
|
@@ -349,7 +353,7 @@ 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,
|
|
@@ -359,7 +363,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
359
363
|
this.log.getBindings(),
|
|
360
364
|
);
|
|
361
365
|
|
|
362
|
-
const noteService = new NoteService(this.noteStore, this.aztecNode, this.
|
|
366
|
+
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
363
367
|
|
|
364
368
|
// It is acceptable to run the following operations in parallel for several reasons:
|
|
365
369
|
// 1. syncTaggedLogs does not write to the note store — it only stores the pending tagged logs in a capsule array,
|
|
@@ -401,7 +405,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
401
405
|
await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, this.jobId)
|
|
402
406
|
).map(EventValidationRequest.fromFields);
|
|
403
407
|
|
|
404
|
-
const noteService = new NoteService(this.noteStore, this.aztecNode, this.
|
|
408
|
+
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
405
409
|
const noteStorePromises = noteValidationRequests.map(request =>
|
|
406
410
|
noteService.validateAndStoreNote(
|
|
407
411
|
request.contractAddress,
|
|
@@ -417,7 +421,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
417
421
|
),
|
|
418
422
|
);
|
|
419
423
|
|
|
420
|
-
const eventService = new EventService(this.
|
|
424
|
+
const eventService = new EventService(this.anchorBlockHeader, this.aztecNode, this.privateEventStore, this.jobId);
|
|
421
425
|
const eventStorePromises = eventValidationRequests.map(request =>
|
|
422
426
|
eventService.validateAndStoreEvent(
|
|
423
427
|
request.contractAddress,
|
|
@@ -455,7 +459,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
455
459
|
|
|
456
460
|
const logService = new LogService(
|
|
457
461
|
this.aztecNode,
|
|
458
|
-
this.
|
|
462
|
+
this.anchorBlockHeader,
|
|
459
463
|
this.keyStore,
|
|
460
464
|
this.capsuleStore,
|
|
461
465
|
this.recipientTaggingStore,
|
|
@@ -8,6 +8,7 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
|
8
8
|
|
|
9
9
|
import type { PXEConfig } from '../../../config/index.js';
|
|
10
10
|
import { PXE } from '../../../pxe.js';
|
|
11
|
+
import { PXE_DATA_SCHEMA_VERSION } from '../../../storage/metadata.js';
|
|
11
12
|
import type { PXECreationOptions } from '../../pxe_creation_options.js';
|
|
12
13
|
|
|
13
14
|
/**
|
|
@@ -36,7 +37,8 @@ export async function createPXE(
|
|
|
36
37
|
|
|
37
38
|
const storeLogger = loggers.store ?? createLogger('pxe:data:idb', { actor });
|
|
38
39
|
|
|
39
|
-
const store =
|
|
40
|
+
const store =
|
|
41
|
+
options.store ?? (await createStore('pxe_data', configWithContracts, PXE_DATA_SCHEMA_VERSION, storeLogger));
|
|
40
42
|
|
|
41
43
|
const simulator = options.simulator ?? new WASMSimulator();
|
|
42
44
|
const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
|
|
@@ -8,6 +8,7 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
|
8
8
|
|
|
9
9
|
import type { PXEConfig } from '../../../config/index.js';
|
|
10
10
|
import { PXE } from '../../../pxe.js';
|
|
11
|
+
import { PXE_DATA_SCHEMA_VERSION } from '../../../storage/metadata.js';
|
|
11
12
|
import type { PXECreationOptions } from '../../pxe_creation_options.js';
|
|
12
13
|
|
|
13
14
|
/**
|
|
@@ -36,7 +37,8 @@ export async function createPXE(
|
|
|
36
37
|
|
|
37
38
|
const storeLogger = loggers.store ?? createLogger('pxe:data:idb', { actor });
|
|
38
39
|
|
|
39
|
-
const store =
|
|
40
|
+
const store =
|
|
41
|
+
options.store ?? (await createStore('pxe_data', configWithContracts, PXE_DATA_SCHEMA_VERSION, storeLogger));
|
|
40
42
|
|
|
41
43
|
const simulator = options.simulator ?? new WASMSimulator();
|
|
42
44
|
const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
|
|
@@ -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}`);
|
package/src/logs/log_service.ts
CHANGED
|
@@ -5,11 +5,11 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
5
5
|
import type { CompleteAddress } from '@aztec/stdlib/contract';
|
|
6
6
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
7
7
|
import { DirectionalAppTaggingSecret, PendingTaggedLog, SiloedTag, Tag, TxScopedL2Log } from '@aztec/stdlib/logs';
|
|
8
|
+
import type { BlockHeader } from '@aztec/stdlib/tx';
|
|
8
9
|
|
|
9
10
|
import type { LogRetrievalRequest } from '../contract_function_simulator/noir-structs/log_retrieval_request.js';
|
|
10
11
|
import { LogRetrievalResponse } from '../contract_function_simulator/noir-structs/log_retrieval_response.js';
|
|
11
12
|
import { AddressStore } from '../storage/address_store/address_store.js';
|
|
12
|
-
import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
|
|
13
13
|
import { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
|
|
14
14
|
import type { RecipientTaggingStore } from '../storage/tagging_store/recipient_tagging_store.js';
|
|
15
15
|
import type { SenderAddressBookStore } from '../storage/tagging_store/sender_address_book_store.js';
|
|
@@ -24,7 +24,7 @@ export class LogService {
|
|
|
24
24
|
|
|
25
25
|
constructor(
|
|
26
26
|
private readonly aztecNode: AztecNode,
|
|
27
|
-
private readonly
|
|
27
|
+
private readonly anchorBlockHeader: BlockHeader,
|
|
28
28
|
private readonly keyStore: KeyStore,
|
|
29
29
|
private readonly capsuleStore: CapsuleStore,
|
|
30
30
|
private readonly recipientTaggingStore: RecipientTaggingStore,
|
|
@@ -56,8 +56,7 @@ export class LogService {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
async #getPublicLogByTag(tag: Tag, contractAddress: AztecAddress): Promise<LogRetrievalResponse | null> {
|
|
59
|
-
const
|
|
60
|
-
const anchorBlockHash = await anchorBlockHeader.hash();
|
|
59
|
+
const anchorBlockHash = await this.anchorBlockHeader.hash();
|
|
61
60
|
const allLogsPerTag = await getAllPublicLogsByTagsFromContract(
|
|
62
61
|
this.aztecNode,
|
|
63
62
|
contractAddress,
|
|
@@ -86,8 +85,7 @@ export class LogService {
|
|
|
86
85
|
}
|
|
87
86
|
|
|
88
87
|
async #getPrivateLogByTag(siloedTag: SiloedTag): Promise<LogRetrievalResponse | null> {
|
|
89
|
-
const
|
|
90
|
-
const anchorBlockHash = await anchorBlockHeader.hash();
|
|
88
|
+
const anchorBlockHash = await this.anchorBlockHeader.hash();
|
|
91
89
|
const allLogsPerTag = await getAllPrivateLogsByTags(this.aztecNode, [siloedTag], anchorBlockHash);
|
|
92
90
|
const logsForTag = allLogsPerTag[0];
|
|
93
91
|
|
|
@@ -118,9 +116,8 @@ export class LogService {
|
|
|
118
116
|
this.log.verbose('Searching for tagged logs', { contract: contractAddress });
|
|
119
117
|
|
|
120
118
|
// We only load logs from block up to and including the anchor block number
|
|
121
|
-
const
|
|
122
|
-
const
|
|
123
|
-
const anchorBlockHash = await anchorBlockHeader.hash();
|
|
119
|
+
const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
|
|
120
|
+
const anchorBlockHash = await this.anchorBlockHeader.hash();
|
|
124
121
|
|
|
125
122
|
// Determine recipients: use scopes if provided, otherwise get all accounts
|
|
126
123
|
const recipients = scopes && scopes.length > 0 ? scopes : await this.keyStore.getAccounts();
|
|
@@ -5,16 +5,15 @@ import { computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/stdli
|
|
|
5
5
|
import { type AztecNode, MAX_RPC_LEN } from '@aztec/stdlib/interfaces/client';
|
|
6
6
|
import { Note, NoteDao, NoteStatus } from '@aztec/stdlib/note';
|
|
7
7
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
8
|
-
import type { TxHash } from '@aztec/stdlib/tx';
|
|
8
|
+
import type { BlockHeader, TxHash } from '@aztec/stdlib/tx';
|
|
9
9
|
|
|
10
|
-
import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
|
|
11
10
|
import type { NoteStore } from '../storage/note_store/note_store.js';
|
|
12
11
|
|
|
13
12
|
export class NoteService {
|
|
14
13
|
constructor(
|
|
15
14
|
private readonly noteStore: NoteStore,
|
|
16
15
|
private readonly aztecNode: AztecNode,
|
|
17
|
-
private readonly
|
|
16
|
+
private readonly anchorBlockHeader: BlockHeader,
|
|
18
17
|
private readonly jobId: string,
|
|
19
18
|
) {}
|
|
20
19
|
|
|
@@ -72,7 +71,7 @@ export class NoteService {
|
|
|
72
71
|
* @param contractAddress - The contract whose notes should be checked and nullified.
|
|
73
72
|
*/
|
|
74
73
|
public async syncNoteNullifiers(contractAddress: AztecAddress): Promise<void> {
|
|
75
|
-
const anchorBlockHash = await
|
|
74
|
+
const anchorBlockHash = await this.anchorBlockHeader.hash();
|
|
76
75
|
|
|
77
76
|
const contractNotes = await this.noteStore.getNotes({ contractAddress }, this.jobId);
|
|
78
77
|
|
|
@@ -142,9 +141,8 @@ export class NoteService {
|
|
|
142
141
|
// number which *should* be recent enough to be available, even for non-archive nodes.
|
|
143
142
|
// Also note that the note should never be ahead of the synced block here since `fetchTaggedLogs` only processes
|
|
144
143
|
// logs up to the synced block making this only an additional safety check.
|
|
145
|
-
const
|
|
146
|
-
const
|
|
147
|
-
const anchorBlockHash = await anchorBlockHeader.hash();
|
|
144
|
+
const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
|
|
145
|
+
const anchorBlockHash = await this.anchorBlockHeader.hash();
|
|
148
146
|
|
|
149
147
|
// By computing siloed and unique note hashes ourselves we prevent contracts from interfering with the note storage
|
|
150
148
|
// of other contracts, which would constitute a security breach.
|
package/src/oracle_version.ts
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
///
|
|
5
5
|
/// @dev Whenever a contract function or Noir test is run, the `utilityAssertCompatibleOracleVersion` oracle is called
|
|
6
6
|
/// and if the oracle version is incompatible an error is thrown.
|
|
7
|
-
export const ORACLE_VERSION =
|
|
7
|
+
export const ORACLE_VERSION = 10;
|
|
8
8
|
|
|
9
9
|
/// This hash is computed as by hashing the Oracle interface and it is used to detect when the Oracle interface changes,
|
|
10
10
|
/// which in turn implies that you need to update the ORACLE_VERSION constant in this file and in
|
|
11
11
|
/// `noir-projects/aztec-nr/aztec/src/oracle/version.nr`.
|
|
12
|
-
export const ORACLE_INTERFACE_HASH = '
|
|
12
|
+
export const ORACLE_INTERFACE_HASH = 'a3b284ee5abff0509986d6d2fa78a3e6e2ec212325674de78355c5e70b05784c';
|
package/src/pxe.ts
CHANGED
|
@@ -43,23 +43,23 @@ export class AddressStore {
|
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
async #getCompleteAddress(address: AztecAddress): Promise<CompleteAddress | undefined> {
|
|
47
|
-
const index = await this.#completeAddressIndex.getAsync(address.toString());
|
|
48
|
-
if (index === undefined) {
|
|
49
|
-
return undefined;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const value = await this.#completeAddresses.atAsync(index);
|
|
53
|
-
return value ? await CompleteAddress.fromBuffer(value) : undefined;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
46
|
getCompleteAddress(account: AztecAddress): Promise<CompleteAddress | undefined> {
|
|
57
|
-
return this.#
|
|
47
|
+
return this.#store.transactionAsync(async () => {
|
|
48
|
+
const index = await this.#completeAddressIndex.getAsync(account.toString());
|
|
49
|
+
if (index === undefined) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const value = await this.#completeAddresses.atAsync(index);
|
|
54
|
+
return value ? await CompleteAddress.fromBuffer(value) : undefined;
|
|
55
|
+
});
|
|
58
56
|
}
|
|
59
57
|
|
|
60
|
-
|
|
61
|
-
return
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
getCompleteAddresses(): Promise<CompleteAddress[]> {
|
|
59
|
+
return this.#store.transactionAsync(async () => {
|
|
60
|
+
return await Promise.all(
|
|
61
|
+
(await toArray(this.#completeAddresses.valuesAsync())).map(v => CompleteAddress.fromBuffer(v)),
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
64
|
}
|
|
65
65
|
}
|
|
@@ -10,6 +10,14 @@ export class AnchorBlockStore {
|
|
|
10
10
|
this.#synchronizedHeader = this.#store.openSingleton('header');
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Sets the currently synchronized block
|
|
15
|
+
*
|
|
16
|
+
* Important: this method is only called from BlockSynchronizer, and since we need it to run atomically with other
|
|
17
|
+
* stores in the case of a reorg, it MUST NOT be wrapped in a `transactionAsync` call. Doing so would result in a
|
|
18
|
+
* deadlock when the backend is IndexedDB, because `transactionAsync` is not designed to support reentrancy.
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
13
21
|
async setHeader(header: BlockHeader): Promise<void> {
|
|
14
22
|
await this.#synchronizedHeader.set(header.toBuffer());
|
|
15
23
|
}
|
|
@@ -57,14 +57,14 @@ export class CapsuleStore implements StagedStore {
|
|
|
57
57
|
*/
|
|
58
58
|
async #getFromStage(jobId: string, dbSlotKey: string): Promise<Buffer | null | undefined> {
|
|
59
59
|
const jobStagedCapsules = this.#getJobStagedCapsules(jobId);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
//
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
return staged;
|
|
60
|
+
const staged: Buffer | null | undefined = jobStagedCapsules.get(dbSlotKey);
|
|
61
|
+
|
|
62
|
+
// Always issue DB read to keep IndexedDB transaction alive, even if the value is in the job staged data. This
|
|
63
|
+
// keeps IndexedDB transactions alive (they auto-commit when a new micro-task starts and there are no pending read
|
|
64
|
+
// requests). The staged value still takes precedence if it exists (including null for deletions).
|
|
65
|
+
const dbValue = await this.#loadCapsuleFromDb(dbSlotKey);
|
|
66
|
+
|
|
67
|
+
return staged !== undefined ? staged : dbValue;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
/**
|
|
@@ -42,10 +42,12 @@ export class ContractStore {
|
|
|
42
42
|
/** Map from contract address to contract class id */
|
|
43
43
|
#contractClassIdMap: Map<string, Fr> = new Map();
|
|
44
44
|
|
|
45
|
+
#store: AztecAsyncKVStore;
|
|
45
46
|
#contractArtifacts: AztecAsyncMap<string, Buffer>;
|
|
46
47
|
#contractInstances: AztecAsyncMap<string, Buffer>;
|
|
47
48
|
|
|
48
49
|
constructor(store: AztecAsyncKVStore) {
|
|
50
|
+
this.#store = store;
|
|
49
51
|
this.#contractArtifacts = store.openMap('contract_artifacts');
|
|
50
52
|
this.#contractInstances = store.openMap('contracts_instances');
|
|
51
53
|
}
|
|
@@ -53,6 +55,7 @@ export class ContractStore {
|
|
|
53
55
|
// Setters
|
|
54
56
|
|
|
55
57
|
public async addContractArtifact(id: Fr, contract: ContractArtifact): Promise<void> {
|
|
58
|
+
// Validation outside transactionAsync - these are not DB operations
|
|
56
59
|
const privateFunctions = contract.functions.filter(
|
|
57
60
|
functionArtifact => functionArtifact.functionType === FunctionType.PRIVATE,
|
|
58
61
|
);
|
|
@@ -69,7 +72,9 @@ export class ContractStore {
|
|
|
69
72
|
throw new Error('Repeated function selectors of private functions');
|
|
70
73
|
}
|
|
71
74
|
|
|
72
|
-
await this.#
|
|
75
|
+
await this.#store.transactionAsync(() =>
|
|
76
|
+
this.#contractArtifacts.set(id.toString(), contractArtifactToBuffer(contract)),
|
|
77
|
+
);
|
|
73
78
|
}
|
|
74
79
|
|
|
75
80
|
async addContractInstance(contract: ContractInstanceWithAddress): Promise<void> {
|
|
@@ -123,21 +128,27 @@ export class ContractStore {
|
|
|
123
128
|
|
|
124
129
|
// Public getters
|
|
125
130
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
131
|
+
getContractsAddresses(): Promise<AztecAddress[]> {
|
|
132
|
+
return this.#store.transactionAsync(async () => {
|
|
133
|
+
const keys = await toArray(this.#contractInstances.keysAsync());
|
|
134
|
+
return keys.map(AztecAddress.fromString);
|
|
135
|
+
});
|
|
129
136
|
}
|
|
130
137
|
|
|
131
138
|
/** Returns a contract instance for a given address. Throws if not found. */
|
|
132
|
-
public
|
|
133
|
-
|
|
134
|
-
|
|
139
|
+
public getContractInstance(contractAddress: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
|
|
140
|
+
return this.#store.transactionAsync(async () => {
|
|
141
|
+
const contract = await this.#contractInstances.getAsync(contractAddress.toString());
|
|
142
|
+
return contract && SerializableContractInstance.fromBuffer(contract).withAddress(contractAddress);
|
|
143
|
+
});
|
|
135
144
|
}
|
|
136
145
|
|
|
137
|
-
public
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
146
|
+
public getContractArtifact(contractClassId: Fr): Promise<ContractArtifact | undefined> {
|
|
147
|
+
return this.#store.transactionAsync(async () => {
|
|
148
|
+
const contract = await this.#contractArtifacts.getAsync(contractClassId.toString());
|
|
149
|
+
// TODO(@spalladino): AztecAsyncMap lies and returns Uint8Arrays instead of Buffers, hence the extra Buffer.from.
|
|
150
|
+
return contract && contractArtifactFromBuffer(Buffer.from(contract));
|
|
151
|
+
});
|
|
141
152
|
}
|
|
142
153
|
|
|
143
154
|
/** Returns a contract class for a given class id. Throws if not found. */
|
package/src/storage/metadata.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PXE_DATA_SCHEMA_VERSION =
|
|
1
|
+
export const PXE_DATA_SCHEMA_VERSION = 3;
|