@aztec/pxe 0.70.0 → 0.71.0

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 (44) hide show
  1. package/dest/config/index.d.ts.map +1 -1
  2. package/dest/config/index.js +3 -3
  3. package/dest/database/kv_pxe_database.d.ts +4 -2
  4. package/dest/database/kv_pxe_database.d.ts.map +1 -1
  5. package/dest/database/kv_pxe_database.js +32 -10
  6. package/dest/database/note_dao.d.ts +1 -3
  7. package/dest/database/note_dao.d.ts.map +1 -1
  8. package/dest/database/note_dao.js +1 -5
  9. package/dest/database/outgoing_note_dao.d.ts +1 -3
  10. package/dest/database/outgoing_note_dao.d.ts.map +1 -1
  11. package/dest/database/outgoing_note_dao.js +1 -5
  12. package/dest/database/pxe_database.d.ts +29 -12
  13. package/dest/database/pxe_database.d.ts.map +1 -1
  14. package/dest/database/pxe_database_test_suite.d.ts.map +1 -1
  15. package/dest/database/pxe_database_test_suite.js +93 -20
  16. package/dest/note_decryption_utils/add_public_values_to_payload.js +2 -2
  17. package/dest/simulator_oracle/index.d.ts +12 -20
  18. package/dest/simulator_oracle/index.d.ts.map +1 -1
  19. package/dest/simulator_oracle/index.js +99 -59
  20. package/package.json +14 -14
  21. package/src/config/index.ts +2 -1
  22. package/src/database/kv_pxe_database.ts +40 -8
  23. package/src/database/note_dao.ts +1 -29
  24. package/src/database/outgoing_note_dao.ts +1 -28
  25. package/src/database/pxe_database.ts +31 -12
  26. package/src/database/pxe_database_test_suite.ts +118 -19
  27. package/src/note_decryption_utils/add_public_values_to_payload.ts +1 -1
  28. package/src/simulator_oracle/index.ts +198 -77
  29. package/dest/note_decryption_utils/brute_force_note_info.d.ts +0 -31
  30. package/dest/note_decryption_utils/brute_force_note_info.d.ts.map +0 -1
  31. package/dest/note_decryption_utils/brute_force_note_info.js +0 -54
  32. package/dest/note_decryption_utils/index.d.ts +0 -3
  33. package/dest/note_decryption_utils/index.d.ts.map +0 -1
  34. package/dest/note_decryption_utils/index.js +0 -2
  35. package/dest/note_decryption_utils/produce_note_daos.d.ts +0 -28
  36. package/dest/note_decryption_utils/produce_note_daos.d.ts.map +0 -1
  37. package/dest/note_decryption_utils/produce_note_daos.js +0 -33
  38. package/dest/note_decryption_utils/produce_note_daos_for_key.d.ts +0 -8
  39. package/dest/note_decryption_utils/produce_note_daos_for_key.d.ts.map +0 -1
  40. package/dest/note_decryption_utils/produce_note_daos_for_key.js +0 -17
  41. package/src/note_decryption_utils/brute_force_note_info.ts +0 -90
  42. package/src/note_decryption_utils/index.ts +0 -2
  43. package/src/note_decryption_utils/produce_note_daos.ts +0 -69
  44. package/src/note_decryption_utils/produce_note_daos_for_key.ts +0 -59
@@ -1,12 +1,15 @@
1
1
  var _SimulatorOracle_instances, _SimulatorOracle_findLeafIndex, _SimulatorOracle_getSiblingPath, _SimulatorOracle_calculateAppTaggingSecret, _SimulatorOracle_getIndexedTaggingSecretsForSenders, _SimulatorOracle_decryptTaggedLogs;
2
2
  import { __classPrivateFieldGet } from "tslib";
3
- import { L1NotePayload, MerkleTreeId, getNonNullifiedL1ToL2MessageWitness, } from '@aztec/circuit-types';
4
- import { Fr, IndexedTaggingSecret, PrivateLog, computeAddressSecret, computeTaggingSecretPoint, } from '@aztec/circuits.js';
5
- import { getFunctionArtifact } from '@aztec/foundation/abi';
3
+ import { L1NotePayload, MerkleTreeId, Note, TxHash, getNonNullifiedL1ToL2MessageWitness, } from '@aztec/circuit-types';
4
+ import { Fr, FunctionSelector, IndexedTaggingSecret, MAX_NOTE_HASHES_PER_TX, PRIVATE_LOG_SIZE_IN_FIELDS, PrivateLog, computeAddressSecret, computeTaggingSecretPoint, } from '@aztec/circuits.js';
5
+ import { computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/circuits.js/hash';
6
+ import { FunctionType, NoteSelector, encodeArguments, getFunctionArtifact, } from '@aztec/foundation/abi';
6
7
  import { poseidon2Hash } from '@aztec/foundation/crypto';
7
8
  import { createLogger } from '@aztec/foundation/log';
8
9
  import { MessageLoadOracleInputs, } from '@aztec/simulator/client';
9
- import { produceNoteDaos } from '../note_decryption_utils/produce_note_daos.js';
10
+ import { ContractDataOracle } from '../contract_data_oracle/index.js';
11
+ import { NoteDao } from '../database/note_dao.js';
12
+ import { getOrderedNoteItems } from '../note_decryption_utils/add_public_values_to_payload.js';
10
13
  import { getAcirSimulator } from '../simulator/index.js';
11
14
  import { WINDOW_HALF_SIZE, getIndexedTaggingSecretsForTheWindow, getInitialIndexesMap } from './tagging_utils.js';
12
15
  /**
@@ -262,6 +265,7 @@ export class SimulatorOracle {
262
265
  * @returns A list of encrypted logs tagged with the recipient's address
263
266
  */
264
267
  async syncTaggedLogs(contractAddress, maxBlockNumber, scopes) {
268
+ this.log.verbose('Searching for tagged logs', { contract: contractAddress });
265
269
  // Ideally this algorithm would be implemented in noir, exposing its building blocks as oracles.
266
270
  // However it is impossible at the moment due to the language not supporting nested slices.
267
271
  // This nesting is necessary because for a given set of tags we don't
@@ -366,19 +370,36 @@ export class SimulatorOracle {
366
370
  * @param recipient - The recipient of the logs.
367
371
  */
368
372
  async processTaggedLogs(logs, recipient, simulator) {
369
- const { notes } = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m", _SimulatorOracle_decryptTaggedLogs).call(this, logs, recipient, simulator);
370
- if (notes.length) {
371
- await this.db.addNotes(notes, recipient);
372
- notes.forEach(noteDao => {
373
- this.log.verbose(`Added incoming note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot}`, {
374
- contract: noteDao.contractAddress,
375
- slot: noteDao.storageSlot,
376
- nullifier: noteDao.siloedNullifier.toString(),
377
- });
378
- });
373
+ const decryptedLogs = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m", _SimulatorOracle_decryptTaggedLogs).call(this, logs, recipient);
374
+ // We've produced the full NoteDao, which we'd be able to simply insert into the database. However, this is
375
+ // only a temporary measure as we migrate from the PXE-driven discovery into the new contract-driven approach. We
376
+ // discard most of the work done up to this point and reconstruct the note plaintext to then hand over to the
377
+ // contract for further processing.
378
+ for (const decryptedLog of decryptedLogs) {
379
+ // Log processing requires the note hashes in the tx in which the note was created. We are now assuming that the
380
+ // note was included in the same block in which the log was delivered - note that partial notes will not work this
381
+ // way.
382
+ const txEffect = await this.aztecNode.getTxEffect(decryptedLog.txHash);
383
+ if (!txEffect) {
384
+ throw new Error(`Could not find tx effect for tx hash ${decryptedLog.txHash}`);
385
+ }
386
+ // This will trigger calls to the deliverNote oracle
387
+ await this.callProcessLog(decryptedLog.contractAddress, decryptedLog.plaintext, decryptedLog.txHash, txEffect.data.noteHashes, txEffect.data.nullifiers[0], recipient, simulator);
379
388
  }
389
+ return;
390
+ }
391
+ // Called when notes are delivered, usually as a result to a call to the process_log contract function
392
+ async deliverNote(contractAddress, storageSlot, nonce, content, noteHash, nullifier, txHash, recipient) {
393
+ const noteDao = await this.produceNoteDao(contractAddress, storageSlot, nonce, content, noteHash, nullifier, txHash, recipient);
394
+ await this.db.addNotes([noteDao], recipient);
395
+ this.log.verbose('Added note', {
396
+ contract: noteDao.contractAddress,
397
+ slot: noteDao.storageSlot,
398
+ nullifier: noteDao.siloedNullifier.toString,
399
+ });
380
400
  }
381
401
  async removeNullifiedNotes(contractAddress) {
402
+ this.log.verbose('Removing nullified notes', { contract: contractAddress });
382
403
  for (const recipient of await this.keyStore.getAccounts()) {
383
404
  const currentNotesForRecipient = await this.db.getNotes({ contractAddress, owner: recipient });
384
405
  const nullifiersToCheck = currentNotesForRecipient.map(note => note.siloedNullifier);
@@ -400,25 +421,54 @@ export class SimulatorOracle {
400
421
  });
401
422
  }
402
423
  }
403
- /**
404
- * Used by contracts during execution to store arbitrary data in the local PXE database. The data is siloed/scoped
405
- * to a specific `contract`.
406
- * @param contract - An address of a contract that is requesting to store the data.
407
- * @param key - A field element representing the key to store the data under.
408
- * @param values - An array of field elements representing the data to store.
409
- */
410
- store(contract, key, values) {
411
- return this.db.store(contract, key, values);
424
+ async produceNoteDao(contractAddress, storageSlot, nonce, content, noteHash, nullifier, txHash, recipient) {
425
+ const receipt = await this.aztecNode.getTxReceipt(new TxHash(txHash));
426
+ if (receipt === undefined) {
427
+ throw new Error(`Failed to fetch tx receipt for tx hash ${txHash} when searching for note hashes`);
428
+ }
429
+ const { blockNumber, blockHash } = receipt;
430
+ const uniqueNoteHash = computeUniqueNoteHash(nonce, siloNoteHash(contractAddress, noteHash));
431
+ const siloedNullifier = siloNullifier(contractAddress, nullifier);
432
+ const uniqueNoteHashTreeIndex = (await this.aztecNode.findLeavesIndexes(blockNumber, MerkleTreeId.NOTE_HASH_TREE, [uniqueNoteHash]))[0];
433
+ if (uniqueNoteHashTreeIndex === undefined) {
434
+ throw new Error(`Note hash ${noteHash} (uniqued as ${uniqueNoteHash}) is not present on the tree at block ${blockNumber} (from tx ${txHash})`);
435
+ }
436
+ return new NoteDao(new Note(content), contractAddress, storageSlot, nonce, noteHash, siloedNullifier, new TxHash(txHash), blockNumber, blockHash.toString(), uniqueNoteHashTreeIndex, recipient.toAddressPoint(), NoteSelector.empty());
412
437
  }
413
- /**
414
- * Used by contracts during execution to load arbitrary data from the local PXE database. The data is siloed/scoped
415
- * to a specific `contract`.
416
- * @param contract - An address of a contract that is requesting to load the data.
417
- * @param key - A field element representing the key under which to load the data..
418
- * @returns An array of field elements representing the stored data or `null` if no data is stored under the key.
419
- */
420
- load(contract, key) {
421
- return this.db.load(contract, key);
438
+ async callProcessLog(contractAddress, logPlaintext, txHash, noteHashes, firstNullifier, recipient, simulator) {
439
+ const artifact = await new ContractDataOracle(this.db).getFunctionArtifactByName(contractAddress, 'process_log');
440
+ if (!artifact) {
441
+ throw new Error(`Mandatory implementation of "process_log" missing in noir contract ${contractAddress.toString()}.`);
442
+ }
443
+ const execRequest = {
444
+ name: artifact.name,
445
+ to: contractAddress,
446
+ selector: FunctionSelector.fromNameAndParameters(artifact),
447
+ type: FunctionType.UNCONSTRAINED,
448
+ isStatic: artifact.isStatic,
449
+ args: encodeArguments(artifact, [
450
+ toBoundedVec(logPlaintext, PRIVATE_LOG_SIZE_IN_FIELDS),
451
+ txHash.toString(),
452
+ toBoundedVec(noteHashes, MAX_NOTE_HASHES_PER_TX),
453
+ firstNullifier,
454
+ recipient,
455
+ ]),
456
+ returnTypes: artifact.returnTypes,
457
+ };
458
+ await (simulator ??
459
+ getAcirSimulator(this.db, this.aztecNode, this.keyStore, this.simulationProvider, this.contractDataOracle)).runUnconstrained(execRequest, artifact, contractAddress, []);
460
+ }
461
+ dbStore(contractAddress, slot, values) {
462
+ return this.db.dbStore(contractAddress, slot, values);
463
+ }
464
+ dbLoad(contractAddress, slot) {
465
+ return this.db.dbLoad(contractAddress, slot);
466
+ }
467
+ dbDelete(contractAddress, slot) {
468
+ return this.db.dbDelete(contractAddress, slot);
469
+ }
470
+ dbCopy(contractAddress, srcSlot, dstSlot, numEntries) {
471
+ return this.db.dbCopy(contractAddress, srcSlot, dstSlot, numEntries);
422
472
  }
423
473
  }
424
474
  _SimulatorOracle_instances = new WeakSet(), _SimulatorOracle_findLeafIndex = async function _SimulatorOracle_findLeafIndex(blockNumber, treeId, leafValue) {
@@ -471,44 +521,34 @@ async function _SimulatorOracle_getIndexedTaggingSecretsForSenders(contractAddre
471
521
  * Decrypts logs tagged for a recipient and returns them.
472
522
  * @param scopedLogs - The logs to decrypt.
473
523
  * @param recipient - The recipient of the logs.
474
- * @param simulator - The simulator to use for decryption.
475
524
  * @returns The decrypted notes.
476
525
  */
477
- async function _SimulatorOracle_decryptTaggedLogs(scopedLogs, recipient, simulator) {
526
+ async function _SimulatorOracle_decryptTaggedLogs(scopedLogs, recipient) {
478
527
  const recipientCompleteAddress = await this.getCompleteAddress(recipient);
479
528
  const ivskM = await this.keyStore.getMasterSecretKey(recipientCompleteAddress.publicKeys.masterIncomingViewingPublicKey);
480
529
  const addressSecret = computeAddressSecret(recipientCompleteAddress.getPreaddress(), ivskM);
481
530
  // Since we could have notes with the same index for different txs, we need
482
531
  // to keep track of them scoping by txHash
483
532
  const excludedIndices = new Map();
484
- const notes = [];
485
- const txEffectsCache = new Map();
533
+ const decrypted = [];
486
534
  for (const scopedLog of scopedLogs) {
487
- const notePayload = scopedLog.isFromPublic
535
+ const payload = scopedLog.isFromPublic
488
536
  ? L1NotePayload.decryptAsIncomingFromPublic(scopedLog.logData, addressSecret)
489
537
  : L1NotePayload.decryptAsIncoming(PrivateLog.fromBuffer(scopedLog.logData), addressSecret);
490
- if (notePayload) {
491
- const payload = notePayload;
492
- const txEffect = txEffectsCache.get(scopedLog.txHash.toString()) ?? (await this.aztecNode.getTxEffect(scopedLog.txHash));
493
- if (!txEffect) {
494
- this.log.warn(`No tx effect found for ${scopedLog.txHash} while decrypting tagged logs`);
495
- continue;
496
- }
497
- txEffectsCache.set(scopedLog.txHash.toString(), txEffect);
498
- if (!excludedIndices.has(scopedLog.txHash.toString())) {
499
- excludedIndices.set(scopedLog.txHash.toString(), new Set());
500
- }
501
- const { note } = await produceNoteDaos(
502
- // I don't like this at all, but we need a simulator to run `computeNoteHashAndOptionallyANullifier`. This generates
503
- // a chicken-and-egg problem due to this oracle requiring a simulator, which in turn requires this oracle. Furthermore, since jest doesn't allow
504
- // mocking ESM exports, we have to pollute the method even more by providing a simulator parameter so tests can inject a fake one.
505
- simulator ??
506
- getAcirSimulator(this.db, this.aztecNode, this.keyStore, this.simulationProvider, this.contractDataOracle), this.db, notePayload ? recipient.toAddressPoint() : undefined, payload, txEffect.data.txHash, txEffect.data.nullifiers[0], txEffect.l2BlockNumber, txEffect.l2BlockHash, txEffect.data.noteHashes, scopedLog.dataStartIndexForTx, excludedIndices.get(scopedLog.txHash.toString()), this.log);
507
- if (note) {
508
- notes.push(note);
509
- }
538
+ if (!payload) {
539
+ this.log.verbose('Unable to decrypt log');
540
+ continue;
541
+ }
542
+ if (!excludedIndices.has(scopedLog.txHash.toString())) {
543
+ excludedIndices.set(scopedLog.txHash.toString(), new Set());
510
544
  }
545
+ const note = await getOrderedNoteItems(this.db, payload);
546
+ const plaintext = [payload.storageSlot, payload.noteTypeId.toField(), ...note.items];
547
+ decrypted.push({ plaintext, txHash: scopedLog.txHash, contractAddress: payload.contractAddress });
511
548
  }
512
- return { notes };
549
+ return decrypted;
513
550
  };
514
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2ltdWxhdG9yX29yYWNsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFHTCxhQUFhLEVBR2IsWUFBWSxFQU1aLG1DQUFtQyxHQUNwQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFLTCxFQUFFLEVBRUYsb0JBQW9CLEVBR3BCLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIseUJBQXlCLEdBQzFCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUF5QixtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUdMLHVCQUF1QixHQUV4QixNQUFNLHlCQUF5QixDQUFDO0FBS2pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsb0NBQW9DLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsSDs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBQzFCLFlBQ1Usa0JBQXNDLEVBQ3RDLEVBQWUsRUFDZixRQUFrQixFQUNsQixTQUFvQixFQUNwQixrQkFBc0MsRUFDdEMsTUFBTSxZQUFZLENBQUMsc0JBQXNCLENBQUM7O1FBTDFDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLFFBQUcsR0FB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
551
+ function toBoundedVec(array, maxLength) {
552
+ return { storage: array.concat(Array(maxLength - array.length).fill(new Fr(0))), len: array.length };
553
+ }
554
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2ltdWxhdG9yX29yYWNsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFJTCxhQUFhLEVBR2IsWUFBWSxFQUNaLElBQUksRUFJSixNQUFNLEVBRU4sbUNBQW1DLEdBQ3BDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUtMLEVBQUUsRUFDRixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBR3BCLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFDMUIsVUFBVSxFQUNWLG9CQUFvQixFQUNwQix5QkFBeUIsR0FDMUIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdGLE9BQU8sRUFFTCxZQUFZLEVBQ1osWUFBWSxFQUNaLGVBQWUsRUFDZixtQkFBbUIsR0FDcEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sRUFHTCx1QkFBdUIsR0FFeEIsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDL0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG9DQUFvQyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEg7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUMxQixZQUNV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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/pxe",
3
- "version": "0.70.0",
3
+ "version": "0.71.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -66,19 +66,19 @@
66
66
  ]
67
67
  },
68
68
  "dependencies": {
69
- "@aztec/bb-prover": "0.70.0",
70
- "@aztec/bb.js": "0.70.0",
71
- "@aztec/builder": "0.70.0",
72
- "@aztec/circuit-types": "0.70.0",
73
- "@aztec/circuits.js": "0.70.0",
74
- "@aztec/ethereum": "0.70.0",
75
- "@aztec/foundation": "0.70.0",
76
- "@aztec/key-store": "0.70.0",
77
- "@aztec/kv-store": "0.70.0",
78
- "@aztec/noir-protocol-circuits-types": "0.70.0",
79
- "@aztec/protocol-contracts": "0.70.0",
80
- "@aztec/simulator": "0.70.0",
81
- "@aztec/types": "0.70.0",
69
+ "@aztec/bb-prover": "0.71.0",
70
+ "@aztec/bb.js": "0.71.0",
71
+ "@aztec/builder": "0.71.0",
72
+ "@aztec/circuit-types": "0.71.0",
73
+ "@aztec/circuits.js": "0.71.0",
74
+ "@aztec/ethereum": "0.71.0",
75
+ "@aztec/foundation": "0.71.0",
76
+ "@aztec/key-store": "0.71.0",
77
+ "@aztec/kv-store": "0.71.0",
78
+ "@aztec/noir-protocol-circuits-types": "0.71.0",
79
+ "@aztec/protocol-contracts": "0.71.0",
80
+ "@aztec/simulator": "0.71.0",
81
+ "@aztec/types": "0.71.0",
82
82
  "@msgpack/msgpack": "^3.0.0-beta2",
83
83
  "@noir-lang/types": "workspace:*",
84
84
  "koa": "^2.14.2",
@@ -4,6 +4,7 @@ import {
4
4
  booleanConfigHelper,
5
5
  getConfigFromMappings,
6
6
  numberConfigHelper,
7
+ parseBooleanEnv,
7
8
  } from '@aztec/foundation/config';
8
9
  import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
9
10
  import { type Network } from '@aztec/types/network';
@@ -99,7 +100,7 @@ export const allPxeConfigMappings: ConfigMappingsType<CliPXEOptions & PXEService
99
100
  ...dataConfigMappings,
100
101
  proverEnabled: {
101
102
  env: 'PXE_PROVER_ENABLED',
102
- parseEnv: (val: string) => ['1', 'true', 'TRUE'].includes(val) || !!process.env.NETWORK,
103
+ parseEnv: (val: string) => parseBooleanEnv(val) || !!process.env.NETWORK,
103
104
  description: 'Enable real proofs',
104
105
  isBoolean: true,
105
106
  },
@@ -622,17 +622,17 @@ export class KVPxeDatabase implements PxeDatabase {
622
622
  });
623
623
  }
624
624
 
625
- async store(contract: AztecAddress, key: Fr, values: Fr[]): Promise<void> {
626
- const dataKey = `${contract.toString()}:${key.toString()}`;
627
- const dataBuffer = Buffer.concat(values.map(value => value.toBuffer()));
628
- await this.#contractStore.set(dataKey, dataBuffer);
625
+ async dbStore(contractAddress: AztecAddress, slot: Fr, values: Fr[]): Promise<void> {
626
+ await this.#contractStore.set(
627
+ dbSlotToKey(contractAddress, slot),
628
+ Buffer.concat(values.map(value => value.toBuffer())),
629
+ );
629
630
  }
630
631
 
631
- async load(contract: AztecAddress, key: Fr): Promise<Fr[] | null> {
632
- const dataKey = `${contract.toString()}:${key.toString()}`;
633
- const dataBuffer = await this.#contractStore.getAsync(dataKey);
632
+ async dbLoad(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null> {
633
+ const dataBuffer = await this.#contractStore.getAsync(dbSlotToKey(contractAddress, slot));
634
634
  if (!dataBuffer) {
635
- this.debug(`Data not found for contract ${contract.toString()} and key ${key.toString()}`);
635
+ this.debug(`Data not found for contract ${contractAddress.toString()} and slot ${slot.toString()}`);
636
636
  return null;
637
637
  }
638
638
  const values: Fr[] = [];
@@ -641,4 +641,36 @@ export class KVPxeDatabase implements PxeDatabase {
641
641
  }
642
642
  return values;
643
643
  }
644
+
645
+ async dbDelete(contractAddress: AztecAddress, slot: Fr): Promise<void> {
646
+ await this.#contractStore.delete(dbSlotToKey(contractAddress, slot));
647
+ }
648
+
649
+ async dbCopy(contractAddress: AztecAddress, srcSlot: Fr, dstSlot: Fr, numEntries: number): Promise<void> {
650
+ // In order to support overlaping source and destination regions we need to check the relative positions of source
651
+ // and destination. If destination is ahead of source, then by the time we overwrite source elements using forward
652
+ // indexes we'll have already read those. On the contrary, if source is ahead of destination we need to use backward
653
+ // indexes to avoid reading elements that've been overwritten.
654
+
655
+ const indexes = Array.from(Array(numEntries).keys());
656
+ if (srcSlot.lt(dstSlot)) {
657
+ indexes.reverse();
658
+ }
659
+
660
+ for (const i of indexes) {
661
+ const currentSrcSlot = dbSlotToKey(contractAddress, srcSlot.add(new Fr(i)));
662
+ const currentDstSlot = dbSlotToKey(contractAddress, dstSlot.add(new Fr(i)));
663
+
664
+ const toCopy = await this.#contractStore.getAsync(currentSrcSlot);
665
+ if (!toCopy) {
666
+ throw new Error(`Attempted to copy empty slot ${currentSrcSlot} for contract ${contractAddress.toString()}`);
667
+ }
668
+
669
+ await this.#contractStore.set(currentDstSlot, toCopy);
670
+ }
671
+ }
672
+ }
673
+
674
+ function dbSlotToKey(contractAddress: AztecAddress, slot: Fr): string {
675
+ return `${contractAddress.toString()}:${slot.toString()}`;
644
676
  }
@@ -1,12 +1,10 @@
1
- import { type L1NotePayload, Note, TxHash, randomTxHash } from '@aztec/circuit-types';
1
+ import { Note, TxHash, randomTxHash } from '@aztec/circuit-types';
2
2
  import { AztecAddress, Fr, Point, type PublicKey } from '@aztec/circuits.js';
3
3
  import { NoteSelector } from '@aztec/foundation/abi';
4
4
  import { toBigIntBE } from '@aztec/foundation/bigint-buffer';
5
5
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
6
6
  import { type NoteData } from '@aztec/simulator/client';
7
7
 
8
- import { type NoteInfo } from '../note_decryption_utils/index.js';
9
-
10
8
  /**
11
9
  * A Note Data Access Object, representing a note that was comitted to the note hash tree, holding all of the
12
10
  * information required to use it during execution and manage its state.
@@ -61,32 +59,6 @@ export class NoteDao implements NoteData {
61
59
  public noteTypeId: NoteSelector,
62
60
  ) {}
63
61
 
64
- static fromPayloadAndNoteInfo(
65
- note: Note,
66
- payload: L1NotePayload,
67
- noteInfo: NoteInfo,
68
- l2BlockNumber: number,
69
- l2BlockHash: string,
70
- dataStartIndexForTx: number,
71
- addressPoint: PublicKey,
72
- ) {
73
- const noteHashIndexInTheWholeTree = BigInt(dataStartIndexForTx + noteInfo.noteHashIndex);
74
- return new NoteDao(
75
- note,
76
- payload.contractAddress,
77
- payload.storageSlot,
78
- noteInfo.nonce,
79
- noteInfo.noteHash,
80
- noteInfo.siloedNullifier,
81
- noteInfo.txHash,
82
- l2BlockNumber,
83
- l2BlockHash,
84
- noteHashIndexInTheWholeTree,
85
- addressPoint,
86
- payload.noteTypeId,
87
- );
88
- }
89
-
90
62
  toBuffer(): Buffer {
91
63
  return serializeToBuffer([
92
64
  this.note,
@@ -1,11 +1,9 @@
1
- import { type L1NotePayload, Note, TxHash, randomTxHash } from '@aztec/circuit-types';
1
+ import { Note, TxHash, randomTxHash } from '@aztec/circuit-types';
2
2
  import { AztecAddress, Fr, Point, type PublicKey } from '@aztec/circuits.js';
3
3
  import { NoteSelector } from '@aztec/foundation/abi';
4
4
  import { toBigIntBE } from '@aztec/foundation/bigint-buffer';
5
5
  import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
6
6
 
7
- import { type NoteInfo } from '../note_decryption_utils/index.js';
8
-
9
7
  /**
10
8
  * A note with contextual data which was decrypted as outgoing.
11
9
  */
@@ -38,31 +36,6 @@ export class OutgoingNoteDao {
38
36
  public ovpkM: PublicKey,
39
37
  ) {}
40
38
 
41
- static fromPayloadAndNoteInfo(
42
- note: Note,
43
- payload: L1NotePayload,
44
- noteInfo: NoteInfo,
45
- l2BlockNumber: number,
46
- l2BlockHash: string,
47
- dataStartIndexForTx: number,
48
- ovpkM: PublicKey,
49
- ) {
50
- const noteHashIndexInTheWholeTree = BigInt(dataStartIndexForTx + noteInfo.noteHashIndex);
51
- return new OutgoingNoteDao(
52
- note,
53
- payload.contractAddress,
54
- payload.storageSlot,
55
- payload.noteTypeId,
56
- noteInfo.txHash,
57
- l2BlockNumber,
58
- l2BlockHash,
59
- noteInfo.nonce,
60
- noteInfo.noteHash,
61
- noteHashIndexInTheWholeTree,
62
- ovpkM,
63
- );
64
- }
65
-
66
39
  toBuffer(): Buffer {
67
40
  return serializeToBuffer([
68
41
  this.note,
@@ -215,20 +215,39 @@ export interface PxeDatabase extends ContractArtifactDatabase, ContractInstanceD
215
215
  resetNoteSyncData(): Promise<void>;
216
216
 
217
217
  /**
218
- * Used by contracts during execution to store arbitrary data in the local PXE database. The data is siloed/scoped
219
- * to a specific `contract`.
220
- * @param contract - An address of a contract that is requesting to store the data.
221
- * @param key - A field element representing the key to store the data under.
222
- * @param values - An array of field elements representing the data to store.
218
+ * Stores arbitrary information in a per-contract non-volatile database, which can later be retrieved with `dbLoad`.
219
+ * If data was already stored at this slot, it is overwrriten.
220
+ * @param contractAddress - The contract address to scope the data under.
221
+ * @param slot - The slot in the database in which to store the value. Slots need not be contiguous.
222
+ * @param values - The data to store.
223
223
  */
224
- store(contract: AztecAddress, key: Fr, values: Fr[]): Promise<void>;
224
+ dbStore(contractAddress: AztecAddress, slot: Fr, values: Fr[]): Promise<void>;
225
225
 
226
226
  /**
227
- * Used by contracts during execution to load arbitrary data from the local PXE database. The data is siloed/scoped
228
- * to a specific `contract`.
229
- * @param contract - An address of a contract that is requesting to load the data.
230
- * @param key - A field element representing the key under which to load the data..
231
- * @returns An array of field elements representing the stored data or `null` if no data is stored under the key.
227
+ * Returns data previously stored via `dbStore` in the per-contract non-volatile database.
228
+ * @param contractAddress - The contract address under which the data is scoped.
229
+ * @param slot - The slot in the database to read.
230
+ * @returns The stored data or `null` if no data is stored under the slot.
232
231
  */
233
- load(contract: AztecAddress, key: Fr): Promise<Fr[] | null>;
232
+ dbLoad(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null>;
233
+
234
+ /**
235
+ * Deletes data in the per-contract non-volatile database. Does nothing if no data was present.
236
+ * @param contractAddress - The contract address under which the data is scoped.
237
+ * @param slot - The slot in the database to delete.
238
+ */
239
+ dbDelete(contractAddress: AztecAddress, slot: Fr): Promise<void>;
240
+
241
+ /**
242
+ * Copies a number of contiguous entries in the per-contract non-volatile database. This allows for efficient data
243
+ * structures by avoiding repeated calls to `dbLoad` and `dbStore`.
244
+ * Supports overlapping source and destination regions (which will result in the overlapped source values being
245
+ * overwritten). All copied slots must exist in the database (i.e. have been stored and not deleted)
246
+ *
247
+ * @param contractAddress - The contract address under which the data is scoped.
248
+ * @param srcSlot - The first slot to copy from.
249
+ * @param dstSlot - The first slot to copy to.
250
+ * @param numEntries - The number of entries to copy.
251
+ */
252
+ dbCopy(contractAddress: AztecAddress, srcSlot: Fr, dstSlot: Fr, numEntries: number): Promise<void>;
234
253
  }