@aztec/pxe 0.0.1-commit.e61ad554 → 0.0.1-commit.f146247c

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.
Files changed (130) hide show
  1. package/dest/block_synchronizer/block_synchronizer.d.ts +3 -3
  2. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  3. package/dest/block_synchronizer/block_synchronizer.js +5 -5
  4. package/dest/contract_function_simulator/contract_function_simulator.d.ts +2 -4
  5. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  6. package/dest/contract_function_simulator/contract_function_simulator.js +7 -9
  7. package/dest/contract_function_simulator/oracle/interfaces.d.ts +8 -8
  8. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  9. package/dest/contract_function_simulator/oracle/oracle.d.ts +3 -3
  10. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  11. package/dest/contract_function_simulator/oracle/oracle.js +15 -15
  12. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +2 -3
  13. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  14. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +4 -4
  15. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +20 -16
  16. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +23 -19
  18. package/dest/debug/pxe_debug_utils.d.ts +16 -6
  19. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  20. package/dest/debug/pxe_debug_utils.js +17 -8
  21. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  22. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  23. package/dest/entrypoints/client/bundle/utils.js +12 -6
  24. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  25. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  26. package/dest/entrypoints/client/lazy/utils.js +13 -7
  27. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  28. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  29. package/dest/entrypoints/server/utils.d.ts +1 -1
  30. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  31. package/dest/entrypoints/server/utils.js +19 -8
  32. package/dest/events/event_service.d.ts +4 -5
  33. package/dest/events/event_service.d.ts.map +1 -1
  34. package/dest/events/event_service.js +5 -6
  35. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  36. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  37. package/dest/job_coordinator/job_coordinator.js +3 -2
  38. package/dest/logs/log_service.d.ts +5 -4
  39. package/dest/logs/log_service.d.ts.map +1 -1
  40. package/dest/logs/log_service.js +8 -11
  41. package/dest/notes/note_service.d.ts +4 -5
  42. package/dest/notes/note_service.d.ts.map +1 -1
  43. package/dest/notes/note_service.js +6 -7
  44. package/dest/oracle_version.d.ts +3 -3
  45. package/dest/oracle_version.d.ts.map +1 -1
  46. package/dest/oracle_version.js +2 -2
  47. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  48. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  49. package/dest/private_kernel/private_kernel_execution_prover.js +2 -2
  50. package/dest/private_kernel/private_kernel_oracle.d.ts +3 -3
  51. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  52. package/dest/pxe.d.ts +1 -1
  53. package/dest/pxe.d.ts.map +1 -1
  54. package/dest/pxe.js +8 -6
  55. package/dest/storage/address_store/address_store.d.ts +1 -1
  56. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  57. package/dest/storage/address_store/address_store.js +12 -11
  58. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  59. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  60. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  61. package/dest/storage/capsule_store/capsule_store.js +6 -8
  62. package/dest/storage/contract_store/contract_store.d.ts +1 -1
  63. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  64. package/dest/storage/contract_store/contract_store.js +22 -13
  65. package/dest/storage/metadata.d.ts +1 -1
  66. package/dest/storage/metadata.js +1 -1
  67. package/dest/storage/note_store/note_store.d.ts +11 -1
  68. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  69. package/dest/storage/note_store/note_store.js +143 -105
  70. package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
  71. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  72. package/dest/storage/private_event_store/private_event_store.js +84 -61
  73. package/dest/storage/private_event_store/stored_private_event.d.ts +4 -4
  74. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -1
  75. package/dest/storage/private_event_store/stored_private_event.js +2 -2
  76. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +1 -1
  77. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  78. package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
  79. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  80. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  81. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  82. package/dest/storage/tagging_store/sender_tagging_store.d.ts +1 -1
  83. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  84. package/dest/storage/tagging_store/sender_tagging_store.js +183 -113
  85. package/dest/tagging/get_all_logs_by_tags.d.ts +4 -4
  86. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  87. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -3
  88. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  89. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -3
  90. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  91. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -3
  92. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  93. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +3 -3
  94. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  95. package/package.json +16 -16
  96. package/src/block_synchronizer/block_synchronizer.ts +17 -19
  97. package/src/contract_function_simulator/contract_function_simulator.ts +6 -6
  98. package/src/contract_function_simulator/oracle/interfaces.ts +10 -10
  99. package/src/contract_function_simulator/oracle/oracle.ts +27 -17
  100. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +1 -5
  101. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +32 -26
  102. package/src/debug/pxe_debug_utils.ts +23 -9
  103. package/src/entrypoints/client/bundle/utils.ts +7 -14
  104. package/src/entrypoints/client/lazy/utils.ts +8 -14
  105. package/src/entrypoints/pxe_creation_options.ts +2 -1
  106. package/src/entrypoints/server/utils.ts +15 -19
  107. package/src/events/event_service.ts +4 -6
  108. package/src/job_coordinator/job_coordinator.ts +4 -3
  109. package/src/logs/log_service.ts +12 -12
  110. package/src/notes/note_service.ts +5 -7
  111. package/src/oracle_version.ts +2 -2
  112. package/src/private_kernel/private_kernel_execution_prover.ts +6 -3
  113. package/src/private_kernel/private_kernel_oracle.ts +2 -2
  114. package/src/pxe.ts +15 -7
  115. package/src/storage/address_store/address_store.ts +15 -15
  116. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  117. package/src/storage/capsule_store/capsule_store.ts +8 -8
  118. package/src/storage/contract_store/contract_store.ts +22 -11
  119. package/src/storage/metadata.ts +1 -1
  120. package/src/storage/note_store/note_store.ts +159 -129
  121. package/src/storage/private_event_store/private_event_store.ts +102 -81
  122. package/src/storage/private_event_store/stored_private_event.ts +3 -3
  123. package/src/storage/tagging_store/recipient_tagging_store.ts +31 -21
  124. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  125. package/src/storage/tagging_store/sender_tagging_store.ts +210 -126
  126. package/src/tagging/get_all_logs_by_tags.ts +3 -3
  127. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +2 -2
  128. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +2 -2
  129. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +2 -2
  130. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +3 -3
@@ -1,13 +1,8 @@
1
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
- import { type Logger, 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
  import type { L2TipsKVStore } from '@aztec/kv-store/stores';
5
- import {
6
- L2BlockHash,
7
- L2BlockStream,
8
- type L2BlockStreamEvent,
9
- type L2BlockStreamEventHandler,
10
- } from '@aztec/stdlib/block';
5
+ import { BlockHash, L2BlockStream, type L2BlockStreamEvent, type L2BlockStreamEventHandler } from '@aztec/stdlib/block';
11
6
  import type { AztecNode } from '@aztec/stdlib/interfaces/client';
12
7
  import type { BlockHeader } from '@aztec/stdlib/tx';
13
8
 
@@ -34,22 +29,25 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
34
29
  private privateEventStore: PrivateEventStore,
35
30
  private l2TipsStore: L2TipsKVStore,
36
31
  private config: Partial<BlockSynchronizerConfig> = {},
37
- loggerOrSuffix?: string | Logger,
32
+ bindings?: LoggerBindings,
38
33
  ) {
39
- this.log =
40
- !loggerOrSuffix || typeof loggerOrSuffix === 'string'
41
- ? createLogger(loggerOrSuffix ? `pxe:block_synchronizer:${loggerOrSuffix}` : `pxe:block_synchronizer`)
42
- : loggerOrSuffix;
34
+ this.log = createLogger('pxe:block_synchronizer', bindings);
43
35
  this.blockStream = this.createBlockStream(config);
44
36
  }
45
37
 
46
38
  protected createBlockStream(config: Partial<BlockSynchronizerConfig>): L2BlockStream {
47
- return new L2BlockStream(this.node, this.l2TipsStore, this, createLogger('pxe:block_stream'), {
48
- batchSize: config.l2BlockBatchSize,
49
- // Skipping finalized blocks makes us sync much faster - we only need to download blocks other than the latest one
50
- // in order to detect reorgs, and there can be no reorgs on finalized block, making this safe.
51
- skipFinalized: true,
52
- });
39
+ return new L2BlockStream(
40
+ this.node,
41
+ this.l2TipsStore,
42
+ this,
43
+ createLogger('pxe:block_stream', this.log.getBindings()),
44
+ {
45
+ batchSize: config.l2BlockBatchSize,
46
+ // Skipping finalized blocks makes us sync much faster - we only need to download blocks other than the latest one
47
+ // in order to detect reorgs, and there can be no reorgs on finalized block, making this safe.
48
+ skipFinalized: true,
49
+ },
50
+ );
53
51
  }
54
52
 
55
53
  /** Handle events emitted by the block stream. */
@@ -106,7 +104,7 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
106
104
  // Note that the following is not necessarily the anchor block that will be used in the transaction - if
107
105
  // the chain has already moved past the reorg, we'll also see blocks-added events that will push the anchor
108
106
  // forward.
109
- const newAnchorBlockHeader = await this.node.getBlockHeader(L2BlockHash.fromString(event.block.hash));
107
+ const newAnchorBlockHeader = await this.node.getBlockHeader(BlockHash.fromString(event.block.hash));
110
108
 
111
109
  if (!newAnchorBlockHeader) {
112
110
  throw new Error(
@@ -7,6 +7,7 @@ import {
7
7
  FIXED_AVM_STARTUP_L2_GAS,
8
8
  FIXED_DA_GAS,
9
9
  FIXED_L2_GAS,
10
+ GeneratorIndex,
10
11
  L2_GAS_PER_CONTRACT_CLASS_LOG,
11
12
  L2_GAS_PER_PRIVATE_LOG,
12
13
  MAX_CONTRACT_CLASS_LOGS_PER_TX,
@@ -17,7 +18,7 @@ import {
17
18
  MAX_PRIVATE_LOGS_PER_TX,
18
19
  } from '@aztec/constants';
19
20
  import { arrayNonEmptyLength, padArrayEnd } from '@aztec/foundation/collection';
20
- import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
21
+ import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
21
22
  import { Fr } from '@aztec/foundation/curves/bn254';
22
23
  import { type Logger, createLogger } from '@aztec/foundation/log';
23
24
  import { Timer } from '@aztec/foundation/timer';
@@ -72,7 +73,6 @@ import {
72
73
  } from '@aztec/stdlib/tx';
73
74
 
74
75
  import type { AddressStore } from '../storage/address_store/address_store.js';
75
- import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
76
76
  import type { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
77
77
  import type { ContractStore } from '../storage/contract_store/contract_store.js';
78
78
  import type { NoteStore } from '../storage/note_store/note_store.js';
@@ -101,7 +101,6 @@ export class ContractFunctionSimulator {
101
101
  private keyStore: KeyStore,
102
102
  private addressStore: AddressStore,
103
103
  private aztecNode: AztecNode,
104
- private anchorBlockStore: AnchorBlockStore,
105
104
  private senderTaggingStore: SenderTaggingStore,
106
105
  private recipientTaggingStore: RecipientTaggingStore,
107
106
  private senderAddressBookStore: SenderAddressBookStore,
@@ -182,7 +181,6 @@ export class ContractFunctionSimulator {
182
181
  this.keyStore,
183
182
  this.addressStore,
184
183
  this.aztecNode,
185
- this.anchorBlockStore,
186
184
  this.senderTaggingStore,
187
185
  this.recipientTaggingStore,
188
186
  this.senderAddressBookStore,
@@ -278,7 +276,6 @@ export class ContractFunctionSimulator {
278
276
  this.keyStore,
279
277
  this.addressStore,
280
278
  this.aztecNode,
281
- this.anchorBlockStore,
282
279
  this.recipientTaggingStore,
283
280
  this.senderAddressBookStore,
284
281
  this.capsuleStore,
@@ -401,7 +398,10 @@ export async function generateSimulatedProvingResult(
401
398
 
402
399
  const privateLogsFromExecution = await Promise.all(
403
400
  execution.publicInputs.privateLogs.getActiveItems().map(async metadata => {
404
- metadata.log.fields[0] = await poseidon2Hash([contractAddress, metadata.log.fields[0]]);
401
+ metadata.log.fields[0] = await poseidon2HashWithSeparator(
402
+ [contractAddress, metadata.log.fields[0]],
403
+ GeneratorIndex.PRIVATE_LOG_FIRST_FIELD,
404
+ );
405
405
  return new OrderedSideEffect(metadata.log, metadata.counter);
406
406
  }),
407
407
  );
@@ -5,7 +5,7 @@ import { Point } from '@aztec/foundation/curves/grumpkin';
5
5
  import { MembershipWitness } from '@aztec/foundation/trees';
6
6
  import type { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
7
7
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
8
- import { L2BlockHash } from '@aztec/stdlib/block';
8
+ import { BlockHash } from '@aztec/stdlib/block';
9
9
  import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
10
10
  import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
11
11
  import type { ContractClassLog, Tag } from '@aztec/stdlib/logs';
@@ -68,20 +68,20 @@ export interface IUtilityExecutionOracle {
68
68
  utilityGetKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest>;
69
69
  utilityGetContractInstance(address: AztecAddress): Promise<ContractInstance>;
70
70
  utilityGetNoteHashMembershipWitness(
71
- blockHash: L2BlockHash,
72
- leafValue: Fr,
71
+ anchorBlockHash: BlockHash,
72
+ noteHash: Fr,
73
73
  ): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined>;
74
- utilityGetArchiveMembershipWitness(
75
- blockHash: L2BlockHash,
76
- leafValue: Fr,
74
+ utilityGetBlockHashMembershipWitness(
75
+ anchorBlockHash: BlockHash,
76
+ blockHash: BlockHash,
77
77
  ): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined>;
78
78
  utilityGetNullifierMembershipWitness(
79
- blockHash: L2BlockHash,
79
+ anchorBlockHash: BlockHash,
80
80
  nullifier: Fr,
81
81
  ): Promise<NullifierMembershipWitness | undefined>;
82
- utilityGetPublicDataWitness(blockHash: L2BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined>;
82
+ utilityGetPublicDataWitness(anchorBlockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined>;
83
83
  utilityGetLowNullifierMembershipWitness(
84
- blockHash: L2BlockHash,
84
+ anchorBlockHash: BlockHash,
85
85
  nullifier: Fr,
86
86
  ): Promise<NullifierMembershipWitness | undefined>;
87
87
  utilityGetBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined>;
@@ -111,7 +111,7 @@ export interface IUtilityExecutionOracle {
111
111
  secret: Fr,
112
112
  ): Promise<MessageLoadOracleInputs<typeof L1_TO_L2_MSG_TREE_HEIGHT>>;
113
113
  utilityStorageRead(
114
- blockHash: L2BlockHash,
114
+ anchorBlockHash: BlockHash,
115
115
  contractAddress: AztecAddress,
116
116
  startStorageSlot: Fr,
117
117
  numberOfElements: number,
@@ -12,7 +12,7 @@ import {
12
12
  } from '@aztec/simulator/client';
13
13
  import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
14
14
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
15
- import { L2BlockHash } from '@aztec/stdlib/block';
15
+ import { BlockHash } from '@aztec/stdlib/block';
16
16
  import { ContractClassLog, ContractClassLogFields } from '@aztec/stdlib/logs';
17
17
 
18
18
  import type { IMiscOracle, IPrivateExecutionOracle, IUtilityExecutionOracle } from './interfaces.js';
@@ -138,29 +138,39 @@ export class Oracle {
138
138
  }
139
139
 
140
140
  async utilityGetNoteHashMembershipWitness(
141
- [blockHash]: ACVMField[],
142
- [leafValue]: ACVMField[],
141
+ [anchorBlockHash]: ACVMField[],
142
+ [noteHash]: ACVMField[],
143
143
  ): Promise<(ACVMField | ACVMField[])[]> {
144
- const parsedBlockHash = L2BlockHash.fromString(blockHash);
145
- const parsedLeafValue = Fr.fromString(leafValue);
144
+ const parsedAnchorBlockHash = BlockHash.fromString(anchorBlockHash);
145
+ const parsedNoteHash = Fr.fromString(noteHash);
146
146
 
147
- const witness = await this.handlerAsUtility().utilityGetNoteHashMembershipWitness(parsedBlockHash, parsedLeafValue);
147
+ const witness = await this.handlerAsUtility().utilityGetNoteHashMembershipWitness(
148
+ parsedAnchorBlockHash,
149
+ parsedNoteHash,
150
+ );
148
151
  if (!witness) {
149
- throw new Error(`Leaf ${leafValue} not found in the note hash tree at block hash ${parsedBlockHash.toString()}.`);
152
+ throw new Error(
153
+ `Note hash ${noteHash} not found in the note hash tree at anchor block hash ${parsedAnchorBlockHash.toString()}.`,
154
+ );
150
155
  }
151
156
  return witness.toNoirRepresentation();
152
157
  }
153
158
 
154
- async utilityGetArchiveMembershipWitness(
159
+ async utilityGetBlockHashMembershipWitness(
160
+ [anchorBlockHash]: ACVMField[],
155
161
  [blockHash]: ACVMField[],
156
- [leafValue]: ACVMField[],
157
162
  ): Promise<(ACVMField | ACVMField[])[]> {
158
- const parsedBlockHash = L2BlockHash.fromString(blockHash);
159
- const parsedLeafValue = Fr.fromString(leafValue);
163
+ const parsedAnchorBlockHash = BlockHash.fromString(anchorBlockHash);
164
+ const parsedBlockHash = BlockHash.fromString(blockHash);
160
165
 
161
- const witness = await this.handlerAsUtility().utilityGetArchiveMembershipWitness(parsedBlockHash, parsedLeafValue);
166
+ const witness = await this.handlerAsUtility().utilityGetBlockHashMembershipWitness(
167
+ parsedAnchorBlockHash,
168
+ parsedBlockHash,
169
+ );
162
170
  if (!witness) {
163
- throw new Error(`Leaf ${leafValue} not found in the archive tree at block hash ${parsedBlockHash.toString()}.`);
171
+ throw new Error(
172
+ `Block hash ${parsedBlockHash.toString()} not found in the archive tree at anchor block ${parsedAnchorBlockHash.toString()}.`,
173
+ );
164
174
  }
165
175
  return witness.toNoirRepresentation();
166
176
  }
@@ -169,7 +179,7 @@ export class Oracle {
169
179
  [blockHash]: ACVMField[],
170
180
  [nullifier]: ACVMField[], // nullifier, we try to find the witness for (to prove inclusion)
171
181
  ): Promise<(ACVMField | ACVMField[])[]> {
172
- const parsedBlockHash = L2BlockHash.fromString(blockHash);
182
+ const parsedBlockHash = BlockHash.fromString(blockHash);
173
183
  const parsedNullifier = Fr.fromString(nullifier);
174
184
 
175
185
  const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(
@@ -188,7 +198,7 @@ export class Oracle {
188
198
  [blockHash]: ACVMField[],
189
199
  [nullifier]: ACVMField[], // nullifier, we try to find the low nullifier witness for (to prove non-inclusion)
190
200
  ): Promise<(ACVMField | ACVMField[])[]> {
191
- const parsedBlockHash = L2BlockHash.fromString(blockHash);
201
+ const parsedBlockHash = BlockHash.fromString(blockHash);
192
202
  const parsedNullifier = Fr.fromString(nullifier);
193
203
 
194
204
  const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(
@@ -207,7 +217,7 @@ export class Oracle {
207
217
  [blockHash]: ACVMField[],
208
218
  [leafSlot]: ACVMField[],
209
219
  ): Promise<(ACVMField | ACVMField[])[]> {
210
- const parsedBlockHash = L2BlockHash.fromString(blockHash);
220
+ const parsedBlockHash = BlockHash.fromString(blockHash);
211
221
  const parsedLeafSlot = Fr.fromString(leafSlot);
212
222
 
213
223
  const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(parsedBlockHash, parsedLeafSlot);
@@ -379,7 +389,7 @@ export class Oracle {
379
389
  [numberOfElements]: ACVMField[],
380
390
  ): Promise<ACVMField[][]> {
381
391
  const values = await this.handlerAsUtility().utilityStorageRead(
382
- L2BlockHash.fromString(blockHash),
392
+ BlockHash.fromString(blockHash),
383
393
  new AztecAddress(Fr.fromString(contractAddress)),
384
394
  Fr.fromString(startStorageSlot),
385
395
  +numberOfElements,
@@ -33,7 +33,6 @@ import {
33
33
  import { ensureContractSynced } from '../../contract_sync/index.js';
34
34
  import { NoteService } from '../../notes/note_service.js';
35
35
  import type { AddressStore } from '../../storage/address_store/address_store.js';
36
- import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
37
36
  import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
38
37
  import type { ContractStore } from '../../storage/contract_store/contract_store.js';
39
38
  import type { NoteStore } from '../../storage/note_store/note_store.js';
@@ -89,7 +88,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
89
88
  keyStore: KeyStore,
90
89
  addressStore: AddressStore,
91
90
  aztecNode: AztecNode,
92
- anchorBlockStore: AnchorBlockStore,
93
91
  private readonly senderTaggingStore: SenderTaggingStore,
94
92
  recipientTaggingStore: RecipientTaggingStore,
95
93
  senderAddressBookStore: SenderAddressBookStore,
@@ -113,7 +111,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
113
111
  keyStore,
114
112
  addressStore,
115
113
  aztecNode,
116
- anchorBlockStore,
117
114
  recipientTaggingStore,
118
115
  senderAddressBookStore,
119
116
  capsuleStore,
@@ -364,7 +361,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
364
361
 
365
362
  const pendingNullifiers = this.noteCache.getNullifiers(this.callContext.contractAddress);
366
363
 
367
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore, this.jobId);
364
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
368
365
  const dbNotes = await noteService.getNotes(
369
366
  this.callContext.contractAddress,
370
367
  owner,
@@ -574,7 +571,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
574
571
  this.keyStore,
575
572
  this.addressStore,
576
573
  this.aztecNode,
577
- this.anchorBlockStore,
578
574
  this.senderTaggingStore,
579
575
  this.recipientTaggingStore,
580
576
  this.senderAddressBookStore,
@@ -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 { L2BlockHash } from '@aztec/stdlib/block';
11
+ import { BlockHash } from '@aztec/stdlib/block';
12
12
  import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
13
13
  import { siloNullifier } from '@aztec/stdlib/hash';
14
14
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
@@ -25,7 +25,6 @@ import { LogService } from '../../logs/log_service.js';
25
25
  import { NoteService } from '../../notes/note_service.js';
26
26
  import { ORACLE_VERSION } from '../../oracle_version.js';
27
27
  import type { AddressStore } from '../../storage/address_store/address_store.js';
28
- import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
29
28
  import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
30
29
  import type { ContractStore } from '../../storage/contract_store/contract_store.js';
31
30
  import type { NoteStore } from '../../storage/note_store/note_store.js';
@@ -61,7 +60,6 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
61
60
  protected readonly keyStore: KeyStore,
62
61
  protected readonly addressStore: AddressStore,
63
62
  protected readonly aztecNode: AztecNode,
64
- protected readonly anchorBlockStore: AnchorBlockStore,
65
63
  protected readonly recipientTaggingStore: RecipientTaggingStore,
66
64
  protected readonly senderAddressBookStore: SenderAddressBookStore,
67
65
  protected readonly capsuleStore: CapsuleStore,
@@ -97,28 +95,34 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
97
95
 
98
96
  /**
99
97
  * Fetches the index and sibling path of a leaf at a given block from the note hash tree.
100
- * @param blockHash - The block hash at which to get the membership witness.
101
- * @param leafValue - The leaf value
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
- blockHash: L2BlockHash,
106
- leafValue: Fr,
104
+ anchorBlockHash: BlockHash,
105
+ noteHash: Fr,
107
106
  ): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
108
- return this.aztecNode.getNoteHashMembershipWitness(blockHash, leafValue);
107
+ return this.aztecNode.getNoteHashMembershipWitness(anchorBlockHash, noteHash);
109
108
  }
110
109
 
111
110
  /**
112
- * Fetches the index and sibling path of a leaf at a given block from the archive tree.
113
- * @param blockHash - The block hash at which to get the membership witness.
114
- * @param leafValue - The leaf value
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 utilityGetArchiveMembershipWitness(
118
- blockHash: L2BlockHash,
119
- leafValue: Fr,
121
+ public utilityGetBlockHashMembershipWitness(
122
+ anchorBlockHash: BlockHash,
123
+ blockHash: BlockHash,
120
124
  ): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined> {
121
- return this.aztecNode.getArchiveMembershipWitness(blockHash, leafValue);
125
+ return this.aztecNode.getBlockHashMembershipWitness(anchorBlockHash, blockHash);
122
126
  }
123
127
 
124
128
  /**
@@ -128,7 +132,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
128
132
  * @returns The nullifier membership witness (if found).
129
133
  */
130
134
  public utilityGetNullifierMembershipWitness(
131
- blockHash: L2BlockHash,
135
+ blockHash: BlockHash,
132
136
  nullifier: Fr,
133
137
  ): Promise<NullifierMembershipWitness | undefined> {
134
138
  return this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier);
@@ -144,7 +148,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
144
148
  * we are trying to prove non-inclusion for.
145
149
  */
146
150
  public utilityGetLowNullifierMembershipWitness(
147
- blockHash: L2BlockHash,
151
+ blockHash: BlockHash,
148
152
  nullifier: Fr,
149
153
  ): Promise<NullifierMembershipWitness | undefined> {
150
154
  return this.aztecNode.getLowNullifierMembershipWitness(blockHash, nullifier);
@@ -156,7 +160,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
156
160
  * @param leafSlot - The slot of the public data tree to get the witness for.
157
161
  * @returns - The witness
158
162
  */
159
- public utilityGetPublicDataWitness(blockHash: L2BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
163
+ public utilityGetPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
160
164
  return this.aztecNode.getPublicDataWitness(blockHash, leafSlot);
161
165
  }
162
166
 
@@ -166,7 +170,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
166
170
  * @returns Block extracted from a block with block number `blockNumber`.
167
171
  */
168
172
  public async utilityGetBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined> {
169
- const anchorBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber();
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.anchorBlockStore, this.jobId);
269
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
266
270
 
267
271
  const dbNotes = await noteService.getNotes(this.contractAddress, owner, storageSlot, status, this.scopes);
268
272
  return pickNotes<NoteData>(dbNotes, {
@@ -318,7 +322,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
318
322
  * @param numberOfElements - Number of elements to read from the starting storage slot.
319
323
  */
320
324
  public async utilityStorageRead(
321
- blockHash: L2BlockHash,
325
+ blockHash: BlockHash,
322
326
  contractAddress: AztecAddress,
323
327
  startStorageSlot: Fr,
324
328
  numberOfElements: number,
@@ -349,16 +353,17 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
349
353
  public async utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) {
350
354
  const logService = new LogService(
351
355
  this.aztecNode,
352
- this.anchorBlockStore,
356
+ this.anchorBlockHeader,
353
357
  this.keyStore,
354
358
  this.capsuleStore,
355
359
  this.recipientTaggingStore,
356
360
  this.senderAddressBookStore,
357
361
  this.addressStore,
358
362
  this.jobId,
363
+ this.log.getBindings(),
359
364
  );
360
365
 
361
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore, this.jobId);
366
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
362
367
 
363
368
  // It is acceptable to run the following operations in parallel for several reasons:
364
369
  // 1. syncTaggedLogs does not write to the note store — it only stores the pending tagged logs in a capsule array,
@@ -400,7 +405,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
400
405
  await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, this.jobId)
401
406
  ).map(EventValidationRequest.fromFields);
402
407
 
403
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore, this.jobId);
408
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
404
409
  const noteStorePromises = noteValidationRequests.map(request =>
405
410
  noteService.validateAndStoreNote(
406
411
  request.contractAddress,
@@ -416,7 +421,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
416
421
  ),
417
422
  );
418
423
 
419
- const eventService = new EventService(this.anchorBlockStore, this.aztecNode, this.privateEventStore, this.jobId);
424
+ const eventService = new EventService(this.anchorBlockHeader, this.aztecNode, this.privateEventStore, this.jobId);
420
425
  const eventStorePromises = eventValidationRequests.map(request =>
421
426
  eventService.validateAndStoreEvent(
422
427
  request.contractAddress,
@@ -454,13 +459,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
454
459
 
455
460
  const logService = new LogService(
456
461
  this.aztecNode,
457
- this.anchorBlockStore,
462
+ this.anchorBlockHeader,
458
463
  this.keyStore,
459
464
  this.capsuleStore,
460
465
  this.recipientTaggingStore,
461
466
  this.senderAddressBookStore,
462
467
  this.addressStore,
463
468
  this.jobId,
469
+ this.log.getBindings(),
464
470
  );
465
471
 
466
472
  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: PXE | undefined = undefined;
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
- * Not injected through constructor since they're are co-dependant.
22
- */
23
- public setPXE(pxe: PXE) {
26
+ /** Not injected through constructor since they're are co-dependant */
27
+ public setPXE(pxe: PXE, putJobInQueue: <T>(job: (jobId: string) => Promise<T>) => Promise<T>) {
24
28
  this.#pxe = pxe;
29
+ this.#putJobInQueue = putJobInQueue;
25
30
  }
26
31
 
27
32
  /**
@@ -36,14 +41,23 @@ export class PXEDebugUtils {
36
41
  * @returns The requested notes.
37
42
  */
38
43
  public async getNotes(filter: NotesFilter): Promise<NoteDao[]> {
39
- if (!this.#pxe) {
40
- throw new Error('Cannot getNotes because no PXE is set');
41
- }
42
-
43
44
  // We need to manually trigger private state sync to have a guarantee that all the notes are available.
44
45
  const call = await this.contractStore.getFunctionCall('sync_state', [], filter.contractAddress);
45
46
  await this.#pxe.simulateUtility(call);
46
47
 
47
48
  return this.noteStore.getNotes(filter, randomBytes(8).toString('hex'));
48
49
  }
50
+
51
+ /** Returns the block header up to which the PXE has synced. */
52
+ public getSyncedBlockHeader(): Promise<BlockHeader> {
53
+ return this.anchorBlockStore.getBlockHeader();
54
+ }
55
+
56
+ /**
57
+ * Triggers a sync of the PXE with the node.
58
+ * Blocks until the sync is complete.
59
+ */
60
+ public sync(): Promise<void> {
61
+ return this.#putJobInQueue(() => this.blockStateSynchronizer.sync());
62
+ }
49
63
  }
@@ -1,6 +1,5 @@
1
1
  import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
2
2
  import { BBBundlePrivateKernelProver } from '@aztec/bb-prover/client/bundle';
3
- import { randomBytes } from '@aztec/foundation/crypto/random';
4
3
  import { createLogger } from '@aztec/foundation/log';
5
4
  import { createStore } from '@aztec/kv-store/indexeddb';
6
5
  import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
@@ -9,6 +8,7 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
9
8
 
10
9
  import type { PXEConfig } from '../../../config/index.js';
11
10
  import { PXE } from '../../../pxe.js';
11
+ import { PXE_DATA_SCHEMA_VERSION } from '../../../storage/metadata.js';
12
12
  import type { PXECreationOptions } from '../../pxe_creation_options.js';
13
13
 
14
14
  /**
@@ -26,13 +26,7 @@ export async function createPXE(
26
26
  config: PXEConfig,
27
27
  options: PXECreationOptions = { loggers: {} },
28
28
  ) {
29
- const logSuffix =
30
- typeof options.useLogSuffix === 'boolean'
31
- ? options.useLogSuffix
32
- ? randomBytes(3).toString('hex')
33
- : undefined
34
- : options.useLogSuffix;
35
-
29
+ const actor = options.loggerActorLabel;
36
30
  const loggers = options.loggers ?? {};
37
31
 
38
32
  const l1Contracts = await aztecNode.getL1ContractAddresses();
@@ -41,14 +35,13 @@ export async function createPXE(
41
35
  l1Contracts,
42
36
  } as PXEConfig;
43
37
 
44
- const storeLogger = loggers.store ? loggers.store : createLogger('pxe:data:idb' + (logSuffix ? `:${logSuffix}` : ''));
38
+ const storeLogger = loggers.store ?? createLogger('pxe:data:idb', { actor });
45
39
 
46
- const store = options.store ?? (await createStore('pxe_data', configWithContracts, storeLogger));
40
+ const store =
41
+ options.store ?? (await createStore('pxe_data', configWithContracts, PXE_DATA_SCHEMA_VERSION, storeLogger));
47
42
 
48
43
  const simulator = options.simulator ?? new WASMSimulator();
49
- const proverLogger = loggers.prover
50
- ? loggers.prover
51
- : createLogger('pxe:bb:wasm:bundle' + (logSuffix ? `:${logSuffix}` : ''));
44
+ const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
52
45
 
53
46
  let prover;
54
47
  if (options.proverOrOptions instanceof BBPrivateKernelProver) {
@@ -58,7 +51,7 @@ export async function createPXE(
58
51
  }
59
52
  const protocolContractsProvider = new BundledProtocolContractsProvider();
60
53
 
61
- const pxeLogger = loggers.pxe ? loggers.pxe : createLogger('pxe:service' + (logSuffix ? `:${logSuffix}` : ''));
54
+ const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
62
55
  const pxe = await PXE.create(aztecNode, store, prover, simulator, protocolContractsProvider, config, pxeLogger);
63
56
  return pxe;
64
57
  }