@aztec/pxe 0.0.1-commit.fff30aa → 0.0.1-dev

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 (162) hide show
  1. package/dest/bin/check_oracle_version.js +1 -1
  2. package/dest/block_synchronizer/block_synchronizer.d.ts +5 -3
  3. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  4. package/dest/block_synchronizer/block_synchronizer.js +10 -2
  5. package/dest/config/package_info.js +1 -1
  6. package/dest/contract_function_simulator/contract_function_simulator.d.ts +4 -1
  7. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  8. package/dest/contract_function_simulator/contract_function_simulator.js +18 -10
  9. package/dest/contract_function_simulator/oracle/interfaces.d.ts +5 -2
  10. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  11. package/dest/contract_function_simulator/oracle/oracle.d.ts +4 -1
  12. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  13. package/dest/contract_function_simulator/oracle/oracle.js +53 -1
  14. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +10 -14
  15. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  16. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +16 -14
  17. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +19 -2
  18. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  19. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +108 -5
  20. package/dest/contract_sync/contract_sync_service.d.ts +2 -1
  21. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
  22. package/dest/contract_sync/contract_sync_service.js +41 -7
  23. package/dest/contract_sync/helpers.d.ts +2 -3
  24. package/dest/contract_sync/helpers.d.ts.map +1 -1
  25. package/dest/contract_sync/helpers.js +12 -19
  26. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  27. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  28. package/dest/entrypoints/client/bundle/utils.js +2 -1
  29. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  30. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  31. package/dest/entrypoints/client/lazy/utils.js +2 -1
  32. package/dest/entrypoints/pxe_creation_options.d.ts +4 -1
  33. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  34. package/dest/entrypoints/server/index.d.ts +2 -1
  35. package/dest/entrypoints/server/index.d.ts.map +1 -1
  36. package/dest/entrypoints/server/index.js +1 -0
  37. package/dest/entrypoints/server/utils.d.ts +1 -1
  38. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  39. package/dest/entrypoints/server/utils.js +2 -1
  40. package/dest/events/event_service.d.ts +13 -5
  41. package/dest/events/event_service.d.ts.map +1 -1
  42. package/dest/events/event_service.js +28 -7
  43. package/dest/hooks/authorize_utility_call.d.ts +37 -0
  44. package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
  45. package/dest/hooks/authorize_utility_call.js +4 -0
  46. package/dest/hooks/execution_hooks.d.ts +42 -0
  47. package/dest/hooks/execution_hooks.d.ts.map +1 -0
  48. package/dest/hooks/execution_hooks.js +9 -0
  49. package/dest/hooks/index.d.ts +4 -0
  50. package/dest/hooks/index.d.ts.map +1 -0
  51. package/dest/hooks/index.js +1 -0
  52. package/dest/logs/log_service.d.ts +1 -1
  53. package/dest/logs/log_service.d.ts.map +1 -1
  54. package/dest/logs/log_service.js +20 -35
  55. package/dest/messages/message_context_service.d.ts +1 -1
  56. package/dest/messages/message_context_service.d.ts.map +1 -1
  57. package/dest/messages/message_context_service.js +12 -10
  58. package/dest/notes/note_service.d.ts +25 -3
  59. package/dest/notes/note_service.d.ts.map +1 -1
  60. package/dest/notes/note_service.js +80 -65
  61. package/dest/oracle_version.d.ts +2 -2
  62. package/dest/oracle_version.js +2 -2
  63. package/dest/private_kernel/private_kernel_execution_prover.d.ts +2 -1
  64. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  65. package/dest/private_kernel/private_kernel_execution_prover.js +18 -4
  66. package/dest/private_kernel/private_kernel_oracle.d.ts +1 -1
  67. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  68. package/dest/private_kernel/private_kernel_oracle.js +7 -2
  69. package/dest/pxe.d.ts +20 -5
  70. package/dest/pxe.d.ts.map +1 -1
  71. package/dest/pxe.js +61 -59
  72. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
  73. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
  74. package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
  75. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
  76. package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
  77. package/dest/storage/backwards_compatibility_tests/schema_tests.js +588 -0
  78. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
  79. package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
  80. package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
  81. package/dest/storage/open_pxe_stores.d.ts +31 -0
  82. package/dest/storage/open_pxe_stores.d.ts.map +1 -0
  83. package/dest/storage/open_pxe_stores.js +26 -0
  84. package/dest/tagging/get_all_logs_by_tags.d.ts +1 -1
  85. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  86. package/dest/tagging/get_all_logs_by_tags.js +3 -0
  87. package/dest/tagging/index.d.ts +4 -3
  88. package/dest/tagging/index.d.ts.map +1 -1
  89. package/dest/tagging/index.js +3 -2
  90. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
  91. package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
  92. package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
  93. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +56 -0
  94. package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -0
  95. package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +158 -0
  96. package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
  97. package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
  98. package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
  99. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +1 -1
  100. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  101. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +19 -8
  102. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +11 -6
  103. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  104. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +21 -0
  105. package/package.json +17 -16
  106. package/src/bin/check_oracle_version.ts +1 -1
  107. package/src/block_synchronizer/block_synchronizer.ts +11 -3
  108. package/src/config/package_info.ts +1 -1
  109. package/src/contract_function_simulator/contract_function_simulator.ts +32 -9
  110. package/src/contract_function_simulator/oracle/interfaces.ts +12 -1
  111. package/src/contract_function_simulator/oracle/oracle.ts +73 -1
  112. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +25 -21
  113. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +165 -29
  114. package/src/contract_sync/contract_sync_service.ts +55 -23
  115. package/src/contract_sync/helpers.ts +11 -23
  116. package/src/entrypoints/client/bundle/utils.ts +1 -0
  117. package/src/entrypoints/client/lazy/utils.ts +1 -0
  118. package/src/entrypoints/pxe_creation_options.ts +4 -0
  119. package/src/entrypoints/server/index.ts +1 -0
  120. package/src/entrypoints/server/utils.ts +1 -0
  121. package/src/events/event_service.ts +52 -17
  122. package/src/hooks/authorize_utility_call.ts +40 -0
  123. package/src/hooks/execution_hooks.ts +48 -0
  124. package/src/hooks/index.ts +7 -0
  125. package/src/logs/log_service.ts +46 -71
  126. package/src/messages/message_context_service.ts +25 -24
  127. package/src/notes/note_service.ts +115 -91
  128. package/src/oracle_version.ts +2 -2
  129. package/src/private_kernel/private_kernel_execution_prover.ts +29 -3
  130. package/src/private_kernel/private_kernel_oracle.ts +15 -5
  131. package/src/pxe.ts +116 -53
  132. package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
  133. package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
  134. package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
  135. package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
  136. package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
  137. package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +42 -0
  138. package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +36 -0
  139. package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
  140. package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +18 -0
  141. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +16 -0
  142. package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +22 -0
  143. package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +97 -0
  144. package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
  145. package/src/storage/backwards_compatibility_tests/schema_tests.ts +707 -0
  146. package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
  147. package/src/storage/open_pxe_stores.ts +47 -0
  148. package/src/tagging/get_all_logs_by_tags.ts +4 -0
  149. package/src/tagging/index.ts +3 -2
  150. package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
  151. package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +236 -0
  152. package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
  153. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +33 -10
  154. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +23 -8
  155. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -14
  156. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +0 -1
  157. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +0 -85
  158. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +0 -14
  159. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +0 -1
  160. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +0 -33
  161. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -130
  162. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -44
@@ -1,3 +1,4 @@
1
+ import { uniqueBy } from '@aztec/foundation/collection';
1
2
  import { vkAsFieldsMegaHonk } from '@aztec/foundation/crypto/keys';
2
3
  import { Fr } from '@aztec/foundation/curves/bn254';
3
4
  import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
@@ -22,12 +23,14 @@ import {
22
23
  PrivateKernelTailCircuitPrivateInputs,
23
24
  type PrivateKernelTailCircuitPublicInputs,
24
25
  PrivateVerificationKeyHints,
26
+ type UpdatedClassIdHints,
25
27
  } from '@aztec/stdlib/kernel';
26
28
  import { ChonkProof, ChonkProofWithPublicInputs } from '@aztec/stdlib/proofs';
27
29
  import {
28
30
  type PrivateCallExecutionResult,
29
31
  type PrivateExecutionResult,
30
32
  TxRequest,
33
+ collectNested,
31
34
  collectNoteHashNullifierCounterMap,
32
35
  getFinalMinRevertibleSideEffectCounter,
33
36
  } from '@aztec/stdlib/tx';
@@ -108,6 +111,8 @@ export class PrivateKernelExecutionProver {
108
111
  const minRevertibleSideEffectCounter = getFinalMinRevertibleSideEffectCounter(executionResult);
109
112
  const splitCounter = isPrivateOnlyTx ? 0 : minRevertibleSideEffectCounter;
110
113
 
114
+ const updatedClassIdHintsMap = await this.prefetchUpdatedClassIdHints(executionResult);
115
+
111
116
  while (executionStack.length) {
112
117
  if (!firstIteration) {
113
118
  let resetBuilder = new PrivateKernelResetPrivateInputsBuilder(
@@ -161,7 +166,7 @@ export class PrivateKernelExecutionProver {
161
166
  },
162
167
  });
163
168
 
164
- const privateCallData = await this.createPrivateCallData(currentExecution);
169
+ const privateCallData = await this.createPrivateCallData(currentExecution, updatedClassIdHintsMap);
165
170
 
166
171
  if (firstIteration) {
167
172
  const witgenTimer = new Timer();
@@ -401,7 +406,28 @@ export class PrivateKernelExecutionProver {
401
406
  );
402
407
  }
403
408
 
404
- private async createPrivateCallData({ publicInputs, vk: vkAsBuffer }: PrivateCallExecutionResult) {
409
+ /** Prefetches updated class id hints for all unique contracts in the execution tree in parallel. */
410
+ private async prefetchUpdatedClassIdHints(
411
+ executionResult: PrivateExecutionResult,
412
+ ): Promise<Map<string, UpdatedClassIdHints>> {
413
+ const allAddresses = collectNested([executionResult.entrypoint], exec => [
414
+ exec.publicInputs.callContext.contractAddress,
415
+ ]);
416
+ const uniqueAddresses = uniqueBy(allAddresses, a => a.toString());
417
+ return new Map<string, UpdatedClassIdHints>(
418
+ await Promise.all(
419
+ uniqueAddresses.map(
420
+ async addr =>
421
+ [addr.toString(), await this.oracle.getUpdatedClassIdHints(addr)] as [string, UpdatedClassIdHints],
422
+ ),
423
+ ),
424
+ );
425
+ }
426
+
427
+ private async createPrivateCallData(
428
+ { publicInputs, vk: vkAsBuffer }: PrivateCallExecutionResult,
429
+ updatedClassIdHintsMap: Map<string, UpdatedClassIdHints>,
430
+ ) {
405
431
  const { contractAddress, functionSelector } = publicInputs.callContext;
406
432
 
407
433
  const vkAsFields = await vkAsFieldsMegaHonk(vkAsBuffer);
@@ -417,7 +443,7 @@ export class PrivateKernelExecutionProver {
417
443
  const { artifactHash: contractClassArtifactHash, publicBytecodeCommitment: contractClassPublicBytecodeCommitment } =
418
444
  await this.oracle.getContractClassIdPreimage(currentContractClassId);
419
445
 
420
- const updatedClassIdHints = await this.oracle.getUpdatedClassIdHints(contractAddress);
446
+ const updatedClassIdHints = updatedClassIdHintsMap.get(contractAddress.toString())!;
421
447
 
422
448
  return PrivateCallData.from({
423
449
  publicInputs,
@@ -1,4 +1,10 @@
1
- import { FUNCTION_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, VK_TREE_HEIGHT } from '@aztec/constants';
1
+ import {
2
+ FUNCTION_TREE_HEIGHT,
3
+ NOTE_HASH_TREE_HEIGHT,
4
+ PUBLIC_DATA_TREE_HEIGHT,
5
+ UPDATES_VALUE_SIZE,
6
+ VK_TREE_HEIGHT,
7
+ } from '@aztec/constants';
2
8
  import type { Fr } from '@aztec/foundation/curves/bn254';
3
9
  import type { GrumpkinScalar, Point } from '@aztec/foundation/curves/grumpkin';
4
10
  import { MembershipWitness } from '@aztec/foundation/trees';
@@ -132,12 +138,16 @@ export class PrivateKernelOracle {
132
138
  throw new Error(`No public data tree witness found for ${hashLeafSlot}`);
133
139
  }
134
140
 
141
+ // In an indexed merkle tree, getPublicDataWitness returns a leaf whose slot matches our query
142
+ // only if the slot has been written to. Otherwise, it returns the "low leaf" predecessor, whose
143
+ // slot will differ. Most contracts are never updated, so we can skip the readFromTree call
144
+ // (which triggers multiple RPC calls) and return empty values directly.
135
145
  const readStorage = (storageSlot: Fr) =>
136
146
  this.node.getPublicStorageAt(blockHash, ProtocolContractAddress.ContractInstanceRegistry, storageSlot);
137
- const delayedPublicMutableValues = await DelayedPublicMutableValues.readFromTree(
138
- delayedPublicMutableSlot,
139
- readStorage,
140
- );
147
+ const slotExists = updatedClassIdWitness.leafPreimage.leaf.slot.equals(hashLeafSlot);
148
+ const delayedPublicMutableValues = slotExists
149
+ ? await DelayedPublicMutableValues.readFromTree(delayedPublicMutableSlot, readStorage)
150
+ : DelayedPublicMutableValues.empty(UPDATES_VALUE_SIZE);
141
151
 
142
152
  return new UpdatedClassIdHints(
143
153
  new MembershipWitness(
package/src/pxe.ts CHANGED
@@ -6,7 +6,6 @@ import { SerialQueue } from '@aztec/foundation/queue';
6
6
  import { Timer } from '@aztec/foundation/timer';
7
7
  import { KeyStore } from '@aztec/key-store';
8
8
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
9
- import { L2TipsKVStore } from '@aztec/kv-store/stores';
10
9
  import { type ProtocolContractsProvider, protocolContractNames } from '@aztec/protocol-contracts';
11
10
  import type { CircuitSimulator } from '@aztec/simulator/client';
12
11
  import {
@@ -67,6 +66,7 @@ import { readCurrentClassId } from './contract_sync/helpers.js';
67
66
  import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
68
67
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
69
68
  import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
69
+ import type { ExecutionHooks } from './hooks/index.js';
70
70
  import { JobCoordinator } from './job_coordinator/job_coordinator.js';
71
71
  import { MessageContextService } from './messages/message_context_service.js';
72
72
  import {
@@ -79,16 +79,26 @@ import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_stor
79
79
  import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
80
80
  import { ContractStore } from './storage/contract_store/contract_store.js';
81
81
  import { NoteStore } from './storage/note_store/note_store.js';
82
+ import { openPxeStores } from './storage/open_pxe_stores.js';
82
83
  import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
83
84
  import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
84
85
  import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
85
86
  import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
87
+ import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
86
88
 
87
89
  export type PackedPrivateEvent = InTx & {
88
90
  packedEvent: Fr[];
89
91
  eventSelector: EventSelector;
90
92
  };
91
93
 
94
+ /** Options for PXE.proveTx. */
95
+ export type ProveTxOpts = {
96
+ /** Addresses whose private state and keys are accessible during private execution. */
97
+ scopes: AztecAddress[];
98
+ /** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
99
+ senderForTags?: AztecAddress;
100
+ };
101
+
92
102
  /** Options for PXE.profileTx. */
93
103
  export type ProfileTxOpts = {
94
104
  /** The profiling mode to use. */
@@ -97,6 +107,8 @@ export type ProfileTxOpts = {
97
107
  skipProofGeneration?: boolean;
98
108
  /** Addresses whose private state and keys are accessible during private execution. */
99
109
  scopes: AztecAddress[];
110
+ /** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
111
+ senderForTags?: AztecAddress;
100
112
  };
101
113
 
102
114
  /** Options for PXE.simulateTx. */
@@ -113,6 +125,8 @@ export type SimulateTxOpts = {
113
125
  overrides?: SimulationOverrides;
114
126
  /** Addresses whose private state and keys are accessible during private execution */
115
127
  scopes: AztecAddress[];
128
+ /** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
129
+ senderForTags?: AztecAddress;
116
130
  };
117
131
 
118
132
  /** Options for PXE.executeUtility. */
@@ -139,6 +153,8 @@ export type PXECreateArgs = {
139
153
  config: PXEConfig;
140
154
  /** Optional logger instance or string suffix for the logger name. */
141
155
  loggerOrSuffix?: string | Logger;
156
+ /** Optional hooks to observe and influence contract execution. */
157
+ hooks?: ExecutionHooks;
142
158
  };
143
159
 
144
160
  /**
@@ -170,6 +186,7 @@ export class PXE {
170
186
  private jobQueue: SerialQueue,
171
187
  private jobCoordinator: JobCoordinator,
172
188
  public debug: PXEDebugUtils,
189
+ private hooks: ExecutionHooks | undefined,
173
190
  ) {}
174
191
 
175
192
  /**
@@ -187,6 +204,7 @@ export class PXE {
187
204
  protocolContractsProvider,
188
205
  config,
189
206
  loggerOrSuffix,
207
+ hooks,
190
208
  }: PXECreateArgs) {
191
209
  // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
192
210
  const bindings: LoggerBindings | undefined =
@@ -200,17 +218,19 @@ export class PXE {
200
218
  const info = await node.getNodeInfo();
201
219
 
202
220
  const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
203
- const addressStore = new AddressStore(store);
204
- const privateEventStore = new PrivateEventStore(store);
205
- const contractStore = new ContractStore(store);
206
- const noteStore = new NoteStore(store);
207
- const anchorBlockStore = new AnchorBlockStore(store);
208
- const senderTaggingStore = new SenderTaggingStore(store);
209
- const senderAddressBookStore = new SenderAddressBookStore(store);
210
- const recipientTaggingStore = new RecipientTaggingStore(store);
211
- const capsuleStore = new CapsuleStore(store);
212
- const keyStore = new KeyStore(store);
213
- const tipsStore = new L2TipsKVStore(store, 'pxe');
221
+ const {
222
+ addressStore,
223
+ privateEventStore,
224
+ contractStore,
225
+ noteStore,
226
+ anchorBlockStore,
227
+ senderTaggingStore,
228
+ senderAddressBookStore,
229
+ recipientTaggingStore,
230
+ capsuleStore,
231
+ keyStore,
232
+ l2TipsStore,
233
+ } = openPxeStores(store);
214
234
  const contractSyncService = new ContractSyncService(
215
235
  node,
216
236
  contractStore,
@@ -225,7 +245,7 @@ export class PXE {
225
245
  anchorBlockStore,
226
246
  noteStore,
227
247
  privateEventStore,
228
- tipsStore,
248
+ l2TipsStore,
229
249
  contractSyncService,
230
250
  config,
231
251
  bindings,
@@ -260,7 +280,7 @@ export class PXE {
260
280
  privateEventStore,
261
281
  contractSyncService,
262
282
  messageContextService,
263
- tipsStore,
283
+ l2TipsStore,
264
284
  simulator,
265
285
  proverEnabled,
266
286
  proofCreator,
@@ -269,6 +289,7 @@ export class PXE {
269
289
  jobQueue,
270
290
  jobCoordinator,
271
291
  debugUtils,
292
+ hooks,
272
293
  );
273
294
 
274
295
  debugUtils.setPXEHelpers(
@@ -304,6 +325,7 @@ export class PXE {
304
325
  simulator: this.simulator,
305
326
  contractSyncService: this.contractSyncService,
306
327
  messageContextService: this.messageContextService,
328
+ hooks: this.hooks,
307
329
  });
308
330
  }
309
331
 
@@ -366,17 +388,24 @@ export class PXE {
366
388
 
367
389
  // Executes the entrypoint private function, as well as all nested private
368
390
  // functions that might arise.
369
- async #executePrivate(
370
- contractFunctionSimulator: ContractFunctionSimulator,
371
- txRequest: TxExecutionRequest,
372
- scopes: AztecAddress[],
373
- jobId: string,
374
- ): Promise<PrivateExecutionResult> {
391
+ async #executePrivate({
392
+ contractFunctionSimulator,
393
+ txRequest,
394
+ anchorBlockHeader,
395
+ scopes,
396
+ jobId,
397
+ senderForTags,
398
+ }: {
399
+ contractFunctionSimulator: ContractFunctionSimulator;
400
+ txRequest: TxExecutionRequest;
401
+ anchorBlockHeader: BlockHeader;
402
+ scopes: AztecAddress[];
403
+ jobId: string;
404
+ senderForTags?: AztecAddress;
405
+ }): Promise<PrivateExecutionResult> {
375
406
  const { origin: contractAddress, functionSelector } = txRequest;
376
407
 
377
408
  try {
378
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
379
-
380
409
  await this.contractSyncService.ensureContractSynced(
381
410
  contractAddress,
382
411
  functionSelector,
@@ -393,6 +422,7 @@ export class PXE {
393
422
  anchorBlockHeader,
394
423
  scopes,
395
424
  jobId,
425
+ senderForTags,
396
426
  });
397
427
  this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
398
428
  return result;
@@ -481,9 +511,9 @@ export class PXE {
481
511
  txExecutionRequest: TxExecutionRequest,
482
512
  proofCreator: PrivateKernelProver,
483
513
  privateExecutionResult: PrivateExecutionResult,
514
+ anchorBlockHeader: BlockHeader,
484
515
  config: PrivateKernelExecutionProverConfig,
485
516
  ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
486
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
487
517
  const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
488
518
  const kernelTraceProver = new PrivateKernelExecutionProver(
489
519
  kernelOracle,
@@ -663,7 +693,9 @@ export class PXE {
663
693
  const publicFunctionSignatures = artifact.functions
664
694
  .filter(fn => fn.functionType === FunctionType.PUBLIC)
665
695
  .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
666
- await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
696
+ if (publicFunctionSignatures.length > 0) {
697
+ await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
698
+ }
667
699
  } else {
668
700
  // Otherwise, make sure there is an artifact already registered for that class id
669
701
  artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
@@ -710,7 +742,9 @@ export class PXE {
710
742
  const publicFunctionSignatures = artifact.functions
711
743
  .filter(fn => fn.functionType === FunctionType.PUBLIC)
712
744
  .map(fn => decodeFunctionSignature(fn.name, fn.parameters));
713
- await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
745
+ if (publicFunctionSignatures.length > 0) {
746
+ await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
747
+ }
714
748
 
715
749
  currentInstance.currentContractClassId = contractClass.id;
716
750
  await Promise.all([
@@ -739,7 +773,7 @@ export class PXE {
739
773
  * @throws If contract code not found, or public simulation reverts.
740
774
  * Also throws if simulatePublic is true and public simulation reverts.
741
775
  */
742
- public proveTx(txRequest: TxExecutionRequest, scopes: AztecAddress[]): Promise<TxProvingResult> {
776
+ public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
743
777
  let privateExecutionResult: PrivateExecutionResult;
744
778
  // We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
745
779
  // computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
@@ -748,16 +782,24 @@ export class PXE {
748
782
  try {
749
783
  const syncTimer = new Timer();
750
784
  await this.blockStateSynchronizer.sync();
785
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
751
786
  const syncTime = syncTimer.ms();
752
787
  const contractFunctionSimulator = this.#getSimulatorForTx();
753
- privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
788
+ privateExecutionResult = await this.#executePrivate({
789
+ contractFunctionSimulator,
790
+ txRequest,
791
+ anchorBlockHeader,
792
+ scopes,
793
+ jobId,
794
+ senderForTags,
795
+ });
754
796
 
755
797
  const {
756
798
  publicInputs,
757
799
  chonkProof,
758
800
  executionSteps,
759
801
  timings: { proving } = {},
760
- } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
802
+ } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
761
803
  simulate: false,
762
804
  skipFeeEnforcement: false,
763
805
  profileMode: 'none',
@@ -787,23 +829,20 @@ export class PXE {
787
829
  nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
788
830
  });
789
831
 
790
- // While not strictly necessary to store tagging cache contents in the DB since we sync tagging indexes from
791
- // chain before sending new logs, the sync can only see logs already included in blocks. If we send another
792
- // transaction before this one is included in a block from this PXE, and that transaction contains a log with
793
- // a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
794
- // storing the tags here prevents linkage of txs sent from the same PXE.
795
- const taggingIndexRangesUsedInTheTx = privateExecutionResult.entrypoint.taggingIndexRanges;
796
- if (taggingIndexRangesUsedInTheTx.length > 0) {
797
- // TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
798
- const txHash = (await txProvingResult.toTx()).txHash;
799
-
800
- await this.senderTaggingStore.storePendingIndexes(taggingIndexRangesUsedInTheTx, txHash, jobId);
801
- this.log.debug(`Stored used tagging index ranges as sender for the tx`, {
802
- taggingIndexRangesUsedInTheTx,
803
- });
804
- } else {
805
- this.log.debug(`No tagging index ranges used in the tx`);
806
- }
832
+ // We keep track of which tagging indices we've used in this tx so that we don't repeat them in future txs
833
+ // (which would link them) without having to rely on this tx being mined (and us seeing the indices being used
834
+ // onchain).
835
+ // Note that this must happen _after_ proving as it requires the proof's public inputs, from which the kernels
836
+ // may have removed some logs due to note-nullifier squashing - this may lead to range of tagging indices we've
837
+ // actually used to being reduced.
838
+ await persistSenderTaggingIndexRangesForTx(
839
+ this.senderTaggingStore,
840
+ privateExecutionResult.entrypoint.taggingIndexRanges,
841
+ publicInputs,
842
+ () => txProvingResult.getTxHash(),
843
+ jobId,
844
+ this.log,
845
+ );
807
846
 
808
847
  return txProvingResult;
809
848
  } catch (err: any) {
@@ -820,7 +859,7 @@ export class PXE {
820
859
  */
821
860
  public profileTx(
822
861
  txRequest: TxExecutionRequest,
823
- { profileMode, skipProofGeneration = true, scopes }: ProfileTxOpts,
862
+ { profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
824
863
  ): Promise<TxProfileResult> {
825
864
  // We disable concurrent profiles for consistency with simulateTx.
826
865
  return this.#putInJobQueue(async jobId => {
@@ -840,15 +879,24 @@ export class PXE {
840
879
  );
841
880
  const syncTimer = new Timer();
842
881
  await this.blockStateSynchronizer.sync();
882
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
843
883
  const syncTime = syncTimer.ms();
844
884
 
845
885
  const contractFunctionSimulator = this.#getSimulatorForTx();
846
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
886
+ const privateExecutionResult = await this.#executePrivate({
887
+ contractFunctionSimulator,
888
+ txRequest,
889
+ anchorBlockHeader,
890
+ scopes,
891
+ jobId,
892
+ senderForTags,
893
+ });
847
894
 
848
895
  const { executionSteps, timings: { proving } = {} } = await this.#prove(
849
896
  txRequest,
850
897
  this.proofCreator,
851
898
  privateExecutionResult,
899
+ anchorBlockHeader,
852
900
  {
853
901
  simulate: skipProofGeneration,
854
902
  skipFeeEnforcement: false,
@@ -916,6 +964,7 @@ export class PXE {
916
964
  skipKernels = true,
917
965
  overrides,
918
966
  scopes,
967
+ senderForTags,
919
968
  }: SimulateTxOpts,
920
969
  ): Promise<TxSimulationResult> {
921
970
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
@@ -938,6 +987,7 @@ export class PXE {
938
987
  );
939
988
  const syncTimer = new Timer();
940
989
  await this.blockStateSynchronizer.sync();
990
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
941
991
  const syncTime = syncTimer.ms();
942
992
 
943
993
  const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
@@ -957,7 +1007,14 @@ export class PXE {
957
1007
  }
958
1008
 
959
1009
  // Execution of private functions only; no proving, and no kernel logic.
960
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
1010
+ const privateExecutionResult = await this.#executePrivate({
1011
+ contractFunctionSimulator,
1012
+ txRequest,
1013
+ anchorBlockHeader,
1014
+ scopes,
1015
+ jobId,
1016
+ senderForTags,
1017
+ });
961
1018
 
962
1019
  let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
963
1020
  let executionSteps: PrivateExecutionStep[] = [];
@@ -970,11 +1027,17 @@ export class PXE {
970
1027
  ));
971
1028
  } else {
972
1029
  // Kernel logic, plus proving of all private functions and kernels.
973
- ({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
974
- simulate: true,
975
- skipFeeEnforcement,
976
- profileMode: 'none',
977
- }));
1030
+ ({ publicInputs, executionSteps } = await this.#prove(
1031
+ txRequest,
1032
+ this.proofCreator,
1033
+ privateExecutionResult,
1034
+ anchorBlockHeader,
1035
+ {
1036
+ simulate: true,
1037
+ skipFeeEnforcement,
1038
+ profileMode: 'none',
1039
+ },
1040
+ ));
978
1041
  }
979
1042
 
980
1043
  const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
@@ -0,0 +1,22 @@
1
+ {
2
+ "complete_addresses": [
3
+ {
4
+ "index": 0,
5
+ "value": "0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a214c7a24ddf501afc8734c7379ee502296289eb24cd8cd03cd435e128c06be0000987721e0963b4a5bd81ee862e2740d8849fd90537569064d3d3a4640e858d219e95c05f09cb86d1a6257572f9082ca15d4a02373c4d8c9cee23dc61a4c2a882f9017d51bca6616102d8a1d4dba89e4ce12881a2414576f01d2fec9492814a22c19ff0b089b07da436e6f7be6b26cdc17b9cee504a528c071ef6a416299683d0b369479d6e50504702d0b56bb56e4e8e0e77171429896651d0c11621e82ebc32fcdd0d194adafd753dc0ed279f5cfb54ddcce1dd581d4631cf343ba9ee6c1ab2858abca6c00da3def156b1f12a6464384e326d5fa724c2fc2ff2b7f3fc8ad5f0000000000000000000000000000000000000000000000000000000000000003"
6
+ },
7
+ {
8
+ "index": 1,
9
+ "value": "2bc83a7fe553d4b649228410040c130a782f86f9b54813f4d847d0c3eeba065a156832f7840991767f448681237ef8bce6895fc79e5d9d0dedd89dccfd9d59ce215403719ea86d38909507bba0ba2d191f72dc1991a5dfc17da8bf7e8c1f1f4f267e526a2e6e9adf6a026989be005bd50d1aea76d20816b9843bc95557696f9f16c3eb259ba3e3eb27b7fe3abc36e87923990bf5c265cb0d57790eda2a4432f1237296442bbb36cc3632af0578ad4b7d5d69d52e05937a1d3e2fe295ac9af98628737df05bb727d77dd52691d42566eb22e529f9f404a2f9bc2e1982956ba09c1df52a95111bd76680a4356951e68a20c3e51cbddb7d1536c572b416bd342e3204aa15eaf393bb18695ddee077d52be6489ed510f357a90003099ce337e6232c0000000000000000000000000000000000000000000000000000000000000007"
10
+ }
11
+ ],
12
+ "complete_address_index": [
13
+ {
14
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a",
15
+ "value": "num:0"
16
+ },
17
+ {
18
+ "key": "utf8:0x2bc83a7fe553d4b649228410040c130a782f86f9b54813f4d847d0c3eeba065a",
19
+ "value": "num:1"
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "header": "000000000000000000000000000000000000000000000000000000000000000200000003000000000000000000000000000000000000000000000000000000000000000500000007000000000000000000000000000000000000000000000000000000000000000b0000000d00000000000000000000000000000000000000000000000000000000000000110000001300000000000000000000000000000000000000000000000000000000000000170000001d000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000290000002b0000002f0000000000000035000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003d00000000000000000000000000000043000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004f"
3
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "capsules": [
3
+ {
4
+ "key": "utf8:0x0000000000000000000000000000000000000000000000000000000000000002:0x0000000000000000000000000000000000000000000000000000000000000003:0x0000000000000000000000000000000000000000000000000000000000000005",
5
+ "value": "0000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000b"
6
+ },
7
+ {
8
+ "key": "utf8:0x0000000000000000000000000000000000000000000000000000000000000002:0x0000000000000000000000000000000000000000000000000000000000000003:0x000000000000000000000000000000000000000000000000000000000000000d",
9
+ "value": "0000000000000000000000000000000000000000000000000000000000000011"
10
+ },
11
+ {
12
+ "key": "utf8:0x0000000000000000000000000000000000000000000000000000000000000002:0x0000000000000000000000000000000000000000000000000000000000000003:0x0000000000000000000000000000000000000000000000000000000000000013",
13
+ "value": ""
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "contract_artifacts": [
3
+ {
4
+ "key": "utf8:0x0000000000000000000000000000000000000000000000000000000000000002",
5
+ "value": "7b226e616d65223a22536368656d6146697874757265436f6e7472616374222c22617a74656356657273696f6e223a22736368656d612d666978747572652d76657273696f6e222c2266756e6374696f6e73223a5b7b226e616d65223a22707269766174655f666e222c2266756e6374696f6e54797065223a2270726976617465222c2269734f6e6c7953656c66223a66616c73652c226973537461746963223a66616c73652c226973496e697469616c697a6572223a747275652c22706172616d6574657273223a5b7b226e616d65223a226669727374222c2274797065223a7b226b696e64223a226669656c64227d2c227669736962696c697479223a2270726976617465227d2c7b226e616d65223a227365636f6e64222c2274797065223a7b226b696e64223a22696e7465676572222c227369676e223a22756e7369676e6564222c227769647468223a33327d2c227669736962696c697479223a227075626c6963227d5d2c2272657475726e5479706573223a5b7b226b696e64223a22626f6f6c65616e227d5d2c226572726f725479706573223a7b22736368656d615f746573745f6572726f72223a7b226572726f725f6b696e64223a22737472696e67222c22737472696e67223a22666978656420736368656d612d74657374206572726f72227d7d2c2262797465636f6465223a2241674d4642773d3d222c22646562756753796d626f6c73223a22736368656d612d666978747572652d6465627567227d5d2c226e6f6e44697370617463685075626c696346756e6374696f6e73223a5b7b226e616d65223a227075626c69635f666e222c2266756e6374696f6e54797065223a227075626c6963222c2269734f6e6c7953656c66223a747275652c226973537461746963223a747275652c226973496e697469616c697a6572223a66616c73652c22706172616d6574657273223a5b5d2c2272657475726e5479706573223a5b5d2c226572726f725479706573223a7b7d7d5d2c226f757470757473223a7b2273747275637473223a7b226d795f737472756374223a5b7b226b696e64223a226669656c64227d2c7b226b696e64223a22626f6f6c65616e227d5d7d2c22676c6f62616c73223a7b7d7d2c2273746f726167654c61796f7574223a7b226d795f6669656c64223a7b22736c6f74223a22307830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303062227d7d2c2266696c654d6170223a7b2231223a7b22736f75726365223a22736368656d61206669787475726520736f75726365222c2270617468223a227372632f736368656d615f666978747572652e6e72222c2266756e6374696f6e5f6c6f636174696f6e73223a5b5d7d7d7d"
6
+ },
7
+ {
8
+ "key": "utf8:0x0000000000000000000000000000000000000000000000000000000000000017",
9
+ "value": "7b226e616d65223a22536368656d6146697874757265436f6e7472616374222c22617a74656356657273696f6e223a22736368656d612d666978747572652d76657273696f6e222c2266756e6374696f6e73223a5b7b226e616d65223a22707269766174655f666e222c2266756e6374696f6e54797065223a2270726976617465222c2269734f6e6c7953656c66223a66616c73652c226973537461746963223a66616c73652c226973496e697469616c697a6572223a747275652c22706172616d6574657273223a5b7b226e616d65223a226669727374222c2274797065223a7b226b696e64223a226669656c64227d2c227669736962696c697479223a2270726976617465227d2c7b226e616d65223a227365636f6e64222c2274797065223a7b226b696e64223a22696e7465676572222c227369676e223a22756e7369676e6564222c227769647468223a33327d2c227669736962696c697479223a227075626c6963227d5d2c2272657475726e5479706573223a5b7b226b696e64223a22626f6f6c65616e227d5d2c226572726f725479706573223a7b22736368656d615f746573745f6572726f72223a7b226572726f725f6b696e64223a22737472696e67222c22737472696e67223a22666978656420736368656d612d74657374206572726f72227d7d2c2262797465636f6465223a2241674d4642773d3d222c22646562756753796d626f6c73223a22736368656d612d666978747572652d6465627567227d5d2c226e6f6e44697370617463685075626c696346756e6374696f6e73223a5b7b226e616d65223a227075626c69635f666e222c2266756e6374696f6e54797065223a227075626c6963222c2269734f6e6c7953656c66223a747275652c226973537461746963223a747275652c226973496e697469616c697a6572223a66616c73652c22706172616d6574657273223a5b5d2c2272657475726e5479706573223a5b5d2c226572726f725479706573223a7b7d7d5d2c226f757470757473223a7b2273747275637473223a7b226d795f737472756374223a5b7b226b696e64223a226669656c64227d2c7b226b696e64223a22626f6f6c65616e227d5d7d2c22676c6f62616c73223a7b7d7d2c2273746f726167654c61796f7574223a7b226d795f6669656c64223a7b22736c6f74223a22307830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303062227d7d2c2266696c654d6170223a7b2231223a7b22736f75726365223a22736368656d61206669787475726520736f75726365222c2270617468223a227372632f736368656d615f666978747572652e6e72222c2266756e6374696f6e5f6c6f636174696f6e73223a5b5d7d7d7d"
10
+ }
11
+ ],
12
+ "contract_classes": [
13
+ {
14
+ "key": "utf8:0x0000000000000000000000000000000000000000000000000000000000000002",
15
+ "value": "010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007000000020000000b000000000000000000000000000000000000000000000000000000000000000d000000110000000000000000000000000000000000000000000000000000000000000013"
16
+ },
17
+ {
18
+ "key": "utf8:0x0000000000000000000000000000000000000000000000000000000000000017",
19
+ "value": "010000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000002500000000"
20
+ }
21
+ ],
22
+ "contracts_instances": [
23
+ {
24
+ "key": "utf8:0x0000000000000000000000000000000000000000000000000000000000000065",
25
+ "value": "010000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003d00000000000000000000000000000000000000000000000000000000000000430000000000000000000000000000000000000000000000000000000000000047"
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "key_store": [
3
+ {
4
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-ivpk_m",
5
+ "value": "19e95c05f09cb86d1a6257572f9082ca15d4a02373c4d8c9cee23dc61a4c2a882f9017d51bca6616102d8a1d4dba89e4ce12881a2414576f01d2fec9492814a2"
6
+ },
7
+ {
8
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-ivpk_m_hash",
9
+ "value": "2c8a04047c06c447dcf1011ddd80c1d03dc9f70a5fa4645722d086fe82504d76"
10
+ },
11
+ {
12
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-ivsk_m",
13
+ "value": "1fb01c42d1aaa2662041b899c77cb19e08192193acc5a94405f1b43c974eba7a"
14
+ },
15
+ {
16
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-nhk_m",
17
+ "value": "2dd30220767969b10044b1322585bb4c4df4e0c5d9b4d7b3045a879a8e3e91d2"
18
+ },
19
+ {
20
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-npk_m",
21
+ "value": "214c7a24ddf501afc8734c7379ee502296289eb24cd8cd03cd435e128c06be0000987721e0963b4a5bd81ee862e2740d8849fd90537569064d3d3a4640e858d2"
22
+ },
23
+ {
24
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-npk_m_hash",
25
+ "value": "0df588690e44b50e4ca694d25b494039b60f09451eaea7aaba97bd4cf8001710"
26
+ },
27
+ {
28
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-ovpk_m",
29
+ "value": "2c19ff0b089b07da436e6f7be6b26cdc17b9cee504a528c071ef6a416299683d0b369479d6e50504702d0b56bb56e4e8e0e77171429896651d0c11621e82ebc3"
30
+ },
31
+ {
32
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-ovpk_m_hash",
33
+ "value": "2cbd8a987ad7dc81814feabc55abdf40b810161611ad89b705db92f32cf94603"
34
+ },
35
+ {
36
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-ovsk_m",
37
+ "value": "279fe6ef7dd2477b919327b1ebab7497c41b9a7ccfa9d5d52e32698e3b85293b"
38
+ },
39
+ {
40
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-tpk_m",
41
+ "value": "2fcdd0d194adafd753dc0ed279f5cfb54ddcce1dd581d4631cf343ba9ee6c1ab2858abca6c00da3def156b1f12a6464384e326d5fa724c2fc2ff2b7f3fc8ad5f"
42
+ },
43
+ {
44
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-tpk_m_hash",
45
+ "value": "2a0b3526801cd5edcaf6b4ba6e1f0a378b6d78d42a62410e86202fb66b44dd53"
46
+ },
47
+ {
48
+ "key": "utf8:0x0e097c323e48522fcbd592590a72a0d4e50f22b3fb1913d19c936439ab74851a-tsk_m",
49
+ "value": "183cb61099458d1564aa57c90c7091ac623a14092ab314150c9cfbb416810320"
50
+ }
51
+ ]
52
+ }