@aztec/pxe 0.62.0 → 0.63.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/config/index.d.ts +2 -3
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +4 -5
- package/dest/contract_data_oracle/index.d.ts +1 -0
- package/dest/contract_data_oracle/index.d.ts.map +1 -1
- package/dest/contract_data_oracle/index.js +5 -1
- package/dest/database/incoming_note_dao.d.ts +1 -1
- package/dest/database/incoming_note_dao.d.ts.map +1 -1
- package/dest/database/kv_pxe_database.d.ts +5 -12
- package/dest/database/kv_pxe_database.d.ts.map +1 -1
- package/dest/database/kv_pxe_database.js +31 -62
- package/dest/database/outgoing_note_dao.d.ts +1 -1
- package/dest/database/outgoing_note_dao.d.ts.map +1 -1
- package/dest/database/pxe_database.d.ts +17 -25
- package/dest/database/pxe_database.d.ts.map +1 -1
- package/dest/kernel_oracle/index.d.ts +3 -3
- package/dest/kernel_oracle/index.d.ts.map +1 -1
- package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.d.ts.map +1 -1
- package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.js +12 -4
- package/dest/kernel_prover/kernel_prover.d.ts +3 -1
- package/dest/kernel_prover/kernel_prover.d.ts.map +1 -1
- package/dest/kernel_prover/kernel_prover.js +39 -7
- package/dest/kernel_prover/test/test_circuit_prover.d.ts +1 -0
- package/dest/kernel_prover/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/kernel_prover/test/test_circuit_prover.js +5 -1
- package/dest/{note_processor/utils → note_decryption_utils}/add_public_values_to_payload.d.ts +1 -1
- package/dest/note_decryption_utils/add_public_values_to_payload.d.ts.map +1 -0
- package/dest/{note_processor/utils → note_decryption_utils}/add_public_values_to_payload.js +1 -1
- package/dest/note_decryption_utils/brute_force_note_info.d.ts.map +1 -0
- package/dest/{note_processor/utils → note_decryption_utils}/brute_force_note_info.js +1 -1
- package/dest/note_decryption_utils/index.d.ts.map +1 -0
- package/dest/{note_processor/utils → note_decryption_utils}/index.js +1 -1
- package/dest/{note_processor/utils → note_decryption_utils}/produce_note_daos.d.ts +5 -8
- package/dest/note_decryption_utils/produce_note_daos.d.ts.map +1 -0
- package/dest/note_decryption_utils/produce_note_daos.js +47 -0
- package/dest/note_decryption_utils/produce_note_daos_for_key.d.ts +8 -0
- package/dest/note_decryption_utils/produce_note_daos_for_key.d.ts.map +1 -0
- package/dest/note_decryption_utils/produce_note_daos_for_key.js +17 -0
- package/dest/pxe_http/pxe_http_server.d.ts +1 -2
- package/dest/pxe_http/pxe_http_server.d.ts.map +1 -1
- package/dest/pxe_http/pxe_http_server.js +5 -51
- package/dest/pxe_service/create_pxe_service.d.ts.map +1 -1
- package/dest/pxe_service/create_pxe_service.js +7 -4
- package/dest/pxe_service/error_enriching.d.ts.map +1 -1
- package/dest/pxe_service/error_enriching.js +7 -6
- package/dest/pxe_service/pxe_service.d.ts +11 -25
- package/dest/pxe_service/pxe_service.d.ts.map +1 -1
- package/dest/pxe_service/pxe_service.js +45 -48
- package/dest/pxe_service/test/pxe_test_suite.d.ts.map +1 -1
- package/dest/pxe_service/test/pxe_test_suite.js +4 -3
- package/dest/simulator_oracle/index.d.ts +15 -16
- package/dest/simulator_oracle/index.d.ts.map +1 -1
- package/dest/simulator_oracle/index.js +195 -65
- package/dest/synchronizer/synchronizer.d.ts +0 -48
- package/dest/synchronizer/synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/synchronizer.js +3 -201
- package/package.json +14 -14
- package/src/config/index.ts +4 -7
- package/src/contract_data_oracle/index.ts +5 -0
- package/src/database/incoming_note_dao.ts +1 -1
- package/src/database/kv_pxe_database.ts +33 -70
- package/src/database/outgoing_note_dao.ts +1 -1
- package/src/database/pxe_database.ts +19 -28
- package/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts +13 -3
- package/src/kernel_prover/kernel_prover.ts +49 -5
- package/src/kernel_prover/test/test_circuit_prover.ts +8 -4
- package/src/{note_processor/utils → note_decryption_utils}/add_public_values_to_payload.ts +1 -1
- package/src/{note_processor/utils → note_decryption_utils}/produce_note_daos.ts +6 -16
- package/src/{note_processor/utils → note_decryption_utils}/produce_note_daos_for_key.ts +6 -15
- package/src/pxe_http/pxe_http_server.ts +5 -84
- package/src/pxe_service/create_pxe_service.ts +9 -3
- package/src/pxe_service/error_enriching.ts +12 -5
- package/src/pxe_service/pxe_service.ts +61 -78
- package/src/pxe_service/test/pxe_test_suite.ts +6 -2
- package/src/simulator_oracle/index.ts +280 -60
- package/src/synchronizer/synchronizer.ts +3 -253
- package/dest/database/deferred_note_dao.d.ts +0 -40
- package/dest/database/deferred_note_dao.d.ts.map +0 -1
- package/dest/database/deferred_note_dao.js +0 -38
- package/dest/note_processor/index.d.ts +0 -2
- package/dest/note_processor/index.d.ts.map +0 -1
- package/dest/note_processor/index.js +0 -2
- package/dest/note_processor/note_processor.d.ts +0 -83
- package/dest/note_processor/note_processor.d.ts.map +0 -1
- package/dest/note_processor/note_processor.js +0 -231
- package/dest/note_processor/utils/add_public_values_to_payload.d.ts.map +0 -1
- package/dest/note_processor/utils/brute_force_note_info.d.ts.map +0 -1
- package/dest/note_processor/utils/index.d.ts.map +0 -1
- package/dest/note_processor/utils/produce_note_daos.d.ts.map +0 -1
- package/dest/note_processor/utils/produce_note_daos.js +0 -51
- package/dest/note_processor/utils/produce_note_daos_for_key.d.ts +0 -9
- package/dest/note_processor/utils/produce_note_daos_for_key.d.ts.map +0 -1
- package/dest/note_processor/utils/produce_note_daos_for_key.js +0 -26
- package/src/database/deferred_note_dao.ts +0 -47
- package/src/note_processor/index.ts +0 -1
- package/src/note_processor/note_processor.ts +0 -358
- /package/dest/{note_processor/utils → note_decryption_utils}/brute_force_note_info.d.ts +0 -0
- /package/dest/{note_processor/utils → note_decryption_utils}/index.d.ts +0 -0
- /package/src/{note_processor/utils → note_decryption_utils}/brute_force_note_info.ts +0 -0
- /package/src/{note_processor/utils → note_decryption_utils}/index.ts +0 -0
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
var _SimulatorOracle_instances,
|
|
1
|
+
var _SimulatorOracle_instances, _SimulatorOracle_calculateTaggingSecret, _SimulatorOracle_getAppTaggingSecretsForContacts, _SimulatorOracle_decryptTaggedLogs;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { MerkleTreeId, getNonNullifiedL1ToL2MessageWitness, } from '@aztec/circuit-types';
|
|
4
|
-
import { IndexedTaggingSecret,
|
|
3
|
+
import { L1NotePayload, MerkleTreeId, getNonNullifiedL1ToL2MessageWitness, } from '@aztec/circuit-types';
|
|
4
|
+
import { Fr, IndexedTaggingSecret, computeAddressSecret, computePoint, computeTaggingSecret, } from '@aztec/circuits.js';
|
|
5
5
|
import { getFunctionArtifact } from '@aztec/foundation/abi';
|
|
6
6
|
import { poseidon2Hash } from '@aztec/foundation/crypto';
|
|
7
7
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
8
8
|
import { MessageLoadOracleInputs } from '@aztec/simulator';
|
|
9
|
+
import { produceNoteDaos } from '../note_decryption_utils/produce_note_daos.js';
|
|
10
|
+
import { getAcirSimulator } from '../simulator/index.js';
|
|
9
11
|
/**
|
|
10
12
|
* A data oracle that provides information needed for simulating a transaction.
|
|
11
13
|
*/
|
|
@@ -104,17 +106,18 @@ export class SimulatorOracle {
|
|
|
104
106
|
* @returns - The index of the commitment. Undefined if it does not exist in the tree.
|
|
105
107
|
*/
|
|
106
108
|
async getCommitmentIndex(commitment) {
|
|
107
|
-
return await this.
|
|
109
|
+
return await this.findLeafIndex('latest', MerkleTreeId.NOTE_HASH_TREE, commitment);
|
|
108
110
|
}
|
|
109
111
|
// We need this in public as part of the EXISTS calls - but isn't used in private
|
|
110
112
|
getCommitmentValue(_leafIndex) {
|
|
111
113
|
throw new Error('Unimplemented in private!');
|
|
112
114
|
}
|
|
113
115
|
async getNullifierIndex(nullifier) {
|
|
114
|
-
return await this.
|
|
116
|
+
return await this.findLeafIndex('latest', MerkleTreeId.NULLIFIER_TREE, nullifier);
|
|
115
117
|
}
|
|
116
118
|
async findLeafIndex(blockNumber, treeId, leafValue) {
|
|
117
|
-
|
|
119
|
+
const [leafIndex] = await this.aztecNode.findLeavesIndexes(blockNumber, treeId, [leafValue]);
|
|
120
|
+
return leafIndex;
|
|
118
121
|
}
|
|
119
122
|
async getSiblingPath(blockNumber, treeId, leafIndex) {
|
|
120
123
|
switch (treeId) {
|
|
@@ -175,16 +178,16 @@ export class SimulatorOracle {
|
|
|
175
178
|
}
|
|
176
179
|
/**
|
|
177
180
|
* Returns the tagging secret for a given sender and recipient pair. For this to work, the ivpsk_m of the sender must be known.
|
|
178
|
-
* Includes the
|
|
181
|
+
* Includes the next index to be used used for tagging with this secret.
|
|
179
182
|
* @param contractAddress - The contract address to silo the secret for
|
|
180
183
|
* @param sender - The address sending the note
|
|
181
184
|
* @param recipient - The address receiving the note
|
|
182
185
|
* @returns A siloed tagging secret that can be used to tag notes.
|
|
183
186
|
*/
|
|
184
|
-
async
|
|
185
|
-
const
|
|
186
|
-
const [index] = await this.db.
|
|
187
|
-
return IndexedTaggingSecret
|
|
187
|
+
async getAppTaggingSecretAsSender(contractAddress, sender, recipient) {
|
|
188
|
+
const secret = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m", _SimulatorOracle_calculateTaggingSecret).call(this, contractAddress, sender, recipient);
|
|
189
|
+
const [index] = await this.db.getTaggingSecretsIndexesAsSender([secret]);
|
|
190
|
+
return new IndexedTaggingSecret(secret, index);
|
|
188
191
|
}
|
|
189
192
|
/**
|
|
190
193
|
* Increments the tagging secret for a given sender and recipient pair. For this to work, the ivpsk_m of the sender must be known.
|
|
@@ -192,74 +195,201 @@ export class SimulatorOracle {
|
|
|
192
195
|
* @param sender - The address sending the note
|
|
193
196
|
* @param recipient - The address receiving the note
|
|
194
197
|
*/
|
|
195
|
-
async
|
|
196
|
-
const
|
|
197
|
-
await this.
|
|
198
|
+
async incrementAppTaggingSecretIndexAsSender(contractAddress, sender, recipient) {
|
|
199
|
+
const secret = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m", _SimulatorOracle_calculateTaggingSecret).call(this, contractAddress, sender, recipient);
|
|
200
|
+
const contractName = await this.contractDataOracle.getDebugContractName(contractAddress);
|
|
201
|
+
this.log.verbose(`Incrementing secret ${secret} as sender ${sender} for recipient: ${recipient} at contract: ${contractName}(${contractAddress})`);
|
|
202
|
+
await this.db.incrementTaggingSecretsIndexesAsSender([secret]);
|
|
198
203
|
}
|
|
199
204
|
/**
|
|
200
|
-
*
|
|
201
|
-
* @param contractAddress - The contract address to silo the secret for
|
|
202
|
-
* @param recipient - The address receiving the notes
|
|
203
|
-
* @returns A list of siloed tagging secrets
|
|
204
|
-
*/
|
|
205
|
-
async getAppTaggingSecretsForSenders(contractAddress, recipient) {
|
|
206
|
-
const recipientCompleteAddress = await this.getCompleteAddress(recipient);
|
|
207
|
-
const recipientIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(recipient);
|
|
208
|
-
// We implicitly add the recipient as a contact, this helps us decrypt tags on notes that we send to ourselves (recipient = us, sender = us)
|
|
209
|
-
const contacts = [...this.db.getContactAddresses(), recipient];
|
|
210
|
-
const appTaggingSecrets = contacts.map(contact => {
|
|
211
|
-
const sharedSecret = computeTaggingSecret(recipientCompleteAddress, recipientIvsk, contact);
|
|
212
|
-
return poseidon2Hash([sharedSecret.x, sharedSecret.y, contractAddress]);
|
|
213
|
-
});
|
|
214
|
-
// Ensure the directionality (sender -> recipient)
|
|
215
|
-
const directionalSecrets = appTaggingSecrets.map(secret => new TaggingSecret(secret, recipient));
|
|
216
|
-
const indexes = await this.db.getTaggingSecretsIndexes(directionalSecrets);
|
|
217
|
-
return directionalSecrets.map((directionalSecret, i) => IndexedTaggingSecret.fromTaggingSecret(directionalSecret, indexes[i]));
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Synchronizes the logs tagged with the recipient's address and all the senders in the addressbook.
|
|
205
|
+
* Synchronizes the logs tagged with scoped addresses and all the senders in the addressbook.
|
|
221
206
|
* Returns the unsynched logs and updates the indexes of the secrets used to tag them until there are no more logs to sync.
|
|
222
207
|
* @param contractAddress - The address of the contract that the logs are tagged for
|
|
223
208
|
* @param recipient - The address of the recipient
|
|
224
209
|
* @returns A list of encrypted logs tagged with the recipient's address
|
|
225
210
|
*/
|
|
226
|
-
async syncTaggedLogs(contractAddress,
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
//
|
|
237
|
-
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
211
|
+
async syncTaggedLogs(contractAddress, maxBlockNumber, scopes) {
|
|
212
|
+
const recipients = scopes ? scopes : await this.keyStore.getAccounts();
|
|
213
|
+
const result = new Map();
|
|
214
|
+
const contractName = await this.contractDataOracle.getDebugContractName(contractAddress);
|
|
215
|
+
for (const recipient of recipients) {
|
|
216
|
+
const logs = [];
|
|
217
|
+
// Ideally this algorithm would be implemented in noir, exposing its building blocks as oracles.
|
|
218
|
+
// However it is impossible at the moment due to the language not supporting nested slices.
|
|
219
|
+
// This nesting is necessary because for a given set of tags we don't
|
|
220
|
+
// know how many logs we will get back. Furthermore, these logs are of undetermined
|
|
221
|
+
// length, since we don't really know the note they correspond to until we decrypt them.
|
|
222
|
+
// 1. Get all the secrets for the recipient and sender pairs (#9365)
|
|
223
|
+
const appTaggingSecrets = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m", _SimulatorOracle_getAppTaggingSecretsForContacts).call(this, contractAddress, recipient);
|
|
224
|
+
// 1.1 Set up a sliding window with an offset. Chances are the sender might have messed up
|
|
225
|
+
// and inadvertedly incremented their index without use getting any logs (for example, in case
|
|
226
|
+
// of a revert). If we stopped looking for logs the first time
|
|
227
|
+
// we receive 0 for a tag, we might never receive anything from that sender again.
|
|
228
|
+
// Also there's a possibility that we have advanced our index, but the sender has reused it, so
|
|
229
|
+
// we might have missed some logs. For these reasons, we have to look both back and ahead of the
|
|
230
|
+
// stored index
|
|
231
|
+
const INDEX_OFFSET = 10;
|
|
232
|
+
const searchState = appTaggingSecrets.reduce((acc, appTaggingSecret) => ({
|
|
233
|
+
// Start looking for logs before the stored index
|
|
234
|
+
currentTagggingSecrets: acc.currentTagggingSecrets.concat([
|
|
235
|
+
new IndexedTaggingSecret(appTaggingSecret.secret, Math.max(0, appTaggingSecret.index - INDEX_OFFSET)),
|
|
236
|
+
]),
|
|
237
|
+
// Keep looking for logs beyond the stored index
|
|
238
|
+
maxIndexesToCheck: {
|
|
239
|
+
...acc.maxIndexesToCheck,
|
|
240
|
+
...{ [appTaggingSecret.secret.toString()]: appTaggingSecret.index + INDEX_OFFSET },
|
|
241
|
+
},
|
|
242
|
+
// Keeps track of the secrets we have to increment in the database
|
|
243
|
+
secretsToIncrement: {},
|
|
244
|
+
// Store the initial set of indexes for the secrets
|
|
245
|
+
initialSecretIndexes: {
|
|
246
|
+
...acc.initialSecretIndexes,
|
|
247
|
+
...{ [appTaggingSecret.secret.toString()]: appTaggingSecret.index },
|
|
248
|
+
},
|
|
249
|
+
}), { currentTagggingSecrets: [], maxIndexesToCheck: {}, secretsToIncrement: {}, initialSecretIndexes: {} });
|
|
250
|
+
let { currentTagggingSecrets } = searchState;
|
|
251
|
+
const { maxIndexesToCheck, secretsToIncrement, initialSecretIndexes } = searchState;
|
|
252
|
+
while (currentTagggingSecrets.length > 0) {
|
|
253
|
+
// 2. Compute tags using the secrets, recipient and index. Obtain logs for each tag (#9380)
|
|
254
|
+
const currentTags = currentTagggingSecrets.map(taggingSecret => taggingSecret.computeTag(recipient));
|
|
255
|
+
const logsByTags = await this.aztecNode.getLogsByTags(currentTags);
|
|
256
|
+
const newTaggingSecrets = [];
|
|
257
|
+
logsByTags.forEach((logsByTag, logIndex) => {
|
|
258
|
+
const { secret: currentSecret, index: currentIndex } = currentTagggingSecrets[logIndex];
|
|
259
|
+
const currentSecretAsStr = currentSecret.toString();
|
|
260
|
+
this.log.debug(`Syncing logs for recipient ${recipient}, secret ${currentSecretAsStr}:${currentIndex} at contract: ${contractName}(${contractAddress})`);
|
|
261
|
+
// 3.1. Append logs to the list and increment the index for the tags that have logs (#9380)
|
|
262
|
+
if (logsByTag.length > 0) {
|
|
263
|
+
this.log.verbose(`Found ${logsByTag.length} logs for secret ${currentSecretAsStr} as recipient ${recipient}. Incrementing index to ${currentIndex + 1} at contract: ${contractName}(${contractAddress})`);
|
|
264
|
+
logs.push(...logsByTag);
|
|
265
|
+
if (currentIndex >= initialSecretIndexes[currentSecretAsStr]) {
|
|
266
|
+
// 3.2. Increment the index for the tags that have logs, provided they're higher than the one
|
|
267
|
+
// we have stored in the db (#9380)
|
|
268
|
+
secretsToIncrement[currentSecretAsStr] = currentIndex + 1;
|
|
269
|
+
// 3.3. Slide the window forwards if we have found logs beyond the initial index
|
|
270
|
+
maxIndexesToCheck[currentSecretAsStr] = currentIndex + INDEX_OFFSET;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// 3.4 Keep increasing the index (inside the window) temporarily for the tags that have no logs
|
|
274
|
+
// There's a chance the sender missed some and we want to catch up
|
|
275
|
+
if (currentIndex < maxIndexesToCheck[currentSecretAsStr]) {
|
|
276
|
+
const newTaggingSecret = new IndexedTaggingSecret(currentSecret, currentIndex + 1);
|
|
277
|
+
newTaggingSecrets.push(newTaggingSecret);
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
await this.db.setTaggingSecretsIndexesAsRecipient(Object.keys(secretsToIncrement).map(secret => new IndexedTaggingSecret(Fr.fromString(secret), secretsToIncrement[secret])));
|
|
281
|
+
currentTagggingSecrets = newTaggingSecrets;
|
|
282
|
+
}
|
|
283
|
+
result.set(recipient.toString(), logs.filter(log => log.blockNumber <= maxBlockNumber));
|
|
284
|
+
}
|
|
285
|
+
return result;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Processes the tagged logs returned by syncTaggedLogs by decrypting them and storing them in the database.
|
|
289
|
+
* @param logs - The logs to process.
|
|
290
|
+
* @param recipient - The recipient of the logs.
|
|
291
|
+
*/
|
|
292
|
+
async processTaggedLogs(logs, recipient, simulator) {
|
|
293
|
+
const { incomingNotes, outgoingNotes } = await __classPrivateFieldGet(this, _SimulatorOracle_instances, "m", _SimulatorOracle_decryptTaggedLogs).call(this, logs, recipient, simulator);
|
|
294
|
+
if (incomingNotes.length || outgoingNotes.length) {
|
|
295
|
+
await this.db.addNotes(incomingNotes, outgoingNotes, recipient);
|
|
296
|
+
incomingNotes.forEach(noteDao => {
|
|
297
|
+
this.log.verbose(`Added incoming note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot} with nullifier ${noteDao.siloedNullifier.toString()}`);
|
|
298
|
+
});
|
|
299
|
+
outgoingNotes.forEach(noteDao => {
|
|
300
|
+
this.log.verbose(`Added outgoing note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot}`);
|
|
247
301
|
});
|
|
248
|
-
// 4. Consolidate in db and replace initial appTaggingSecrets with the new ones (updated indexes)
|
|
249
|
-
await this.db.incrementTaggingSecretsIndexes(newTaggingSecrets.map(secret => new TaggingSecret(secret.secret, recipient)));
|
|
250
|
-
appTaggingSecrets = newTaggingSecrets;
|
|
251
302
|
}
|
|
252
|
-
|
|
303
|
+
const nullifiedNotes = [];
|
|
304
|
+
const currentNotesForRecipient = await this.db.getIncomingNotes({ owner: recipient });
|
|
305
|
+
const nullifierIndexes = await this.aztecNode.findLeavesIndexes('latest', MerkleTreeId.NULLIFIER_TREE, currentNotesForRecipient.map(note => note.siloedNullifier));
|
|
306
|
+
const foundNullifiers = currentNotesForRecipient
|
|
307
|
+
.filter((_, i) => nullifierIndexes[i] !== undefined)
|
|
308
|
+
.map(note => note.siloedNullifier);
|
|
309
|
+
await this.db.removeNullifiedNotes(foundNullifiers, computePoint(recipient));
|
|
310
|
+
nullifiedNotes.forEach(noteDao => {
|
|
311
|
+
this.log.verbose(`Removed note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot} with nullifier ${noteDao.siloedNullifier.toString()}`);
|
|
312
|
+
});
|
|
253
313
|
}
|
|
254
314
|
}
|
|
255
|
-
_SimulatorOracle_instances = new WeakSet(),
|
|
315
|
+
_SimulatorOracle_instances = new WeakSet(), _SimulatorOracle_calculateTaggingSecret = async function _SimulatorOracle_calculateTaggingSecret(contractAddress, sender, recipient) {
|
|
256
316
|
const senderCompleteAddress = await this.getCompleteAddress(sender);
|
|
257
317
|
const senderIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(sender);
|
|
258
318
|
const sharedSecret = computeTaggingSecret(senderCompleteAddress, senderIvsk, recipient);
|
|
259
319
|
// Silo the secret to the app so it can't be used to track other app's notes
|
|
260
320
|
const siloedSecret = poseidon2Hash([sharedSecret.x, sharedSecret.y, contractAddress]);
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
321
|
+
return siloedSecret;
|
|
322
|
+
}, _SimulatorOracle_getAppTaggingSecretsForContacts =
|
|
323
|
+
/**
|
|
324
|
+
* Returns the siloed tagging secrets for a given recipient and all the senders in the address book
|
|
325
|
+
* This method should be exposed as an oracle call to allow aztec.nr to perform the orchestration
|
|
326
|
+
* of the syncTaggedLogs and processTaggedLogs methods. However, it is not possible to do so at the moment,
|
|
327
|
+
* so we're keeping it private for now.
|
|
328
|
+
* @param contractAddress - The contract address to silo the secret for
|
|
329
|
+
* @param recipient - The address receiving the notes
|
|
330
|
+
* @returns A list of siloed tagging secrets
|
|
331
|
+
*/
|
|
332
|
+
async function _SimulatorOracle_getAppTaggingSecretsForContacts(contractAddress, recipient) {
|
|
333
|
+
const recipientCompleteAddress = await this.getCompleteAddress(recipient);
|
|
334
|
+
const recipientIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(recipient);
|
|
335
|
+
// We implicitly add all PXE accounts as contacts, this helps us decrypt tags on notes that we send to ourselves (recipient = us, sender = us)
|
|
336
|
+
const contacts = [...this.db.getContactAddresses(), ...(await this.keyStore.getAccounts())].filter((address, index, self) => index === self.findIndex(otherAddress => otherAddress.equals(address)));
|
|
337
|
+
const appTaggingSecrets = contacts.map(contact => {
|
|
338
|
+
const sharedSecret = computeTaggingSecret(recipientCompleteAddress, recipientIvsk, contact);
|
|
339
|
+
return poseidon2Hash([sharedSecret.x, sharedSecret.y, contractAddress]);
|
|
340
|
+
});
|
|
341
|
+
const indexes = await this.db.getTaggingSecretsIndexesAsRecipient(appTaggingSecrets);
|
|
342
|
+
return appTaggingSecrets.map((secret, i) => new IndexedTaggingSecret(secret, indexes[i]));
|
|
343
|
+
}, _SimulatorOracle_decryptTaggedLogs =
|
|
344
|
+
/**
|
|
345
|
+
* Decrypts logs tagged for a recipient and returns them.
|
|
346
|
+
* @param scopedLogs - The logs to decrypt.
|
|
347
|
+
* @param recipient - The recipient of the logs.
|
|
348
|
+
* @param simulator - The simulator to use for decryption.
|
|
349
|
+
* @returns The decrypted notes.
|
|
350
|
+
*/
|
|
351
|
+
async function _SimulatorOracle_decryptTaggedLogs(scopedLogs, recipient, simulator) {
|
|
352
|
+
const recipientCompleteAddress = await this.getCompleteAddress(recipient);
|
|
353
|
+
const ivskM = await this.keyStore.getMasterSecretKey(recipientCompleteAddress.publicKeys.masterIncomingViewingPublicKey);
|
|
354
|
+
const addressSecret = computeAddressSecret(recipientCompleteAddress.getPreaddress(), ivskM);
|
|
355
|
+
const ovskM = await this.keyStore.getMasterSecretKey(recipientCompleteAddress.publicKeys.masterOutgoingViewingPublicKey);
|
|
356
|
+
// Since we could have notes with the same index for different txs, we need
|
|
357
|
+
// to keep track of them scoping by txHash
|
|
358
|
+
const excludedIndices = new Map();
|
|
359
|
+
const incomingNotes = [];
|
|
360
|
+
const outgoingNotes = [];
|
|
361
|
+
const txEffectsCache = new Map();
|
|
362
|
+
for (const scopedLog of scopedLogs) {
|
|
363
|
+
const incomingNotePayload = L1NotePayload.decryptAsIncoming(scopedLog.logData, addressSecret, scopedLog.isFromPublic);
|
|
364
|
+
const outgoingNotePayload = L1NotePayload.decryptAsOutgoing(scopedLog.logData, ovskM, scopedLog.isFromPublic);
|
|
365
|
+
if (incomingNotePayload || outgoingNotePayload) {
|
|
366
|
+
if (incomingNotePayload && outgoingNotePayload && !incomingNotePayload.equals(outgoingNotePayload)) {
|
|
367
|
+
this.log.warn(`Incoming and outgoing note payloads do not match. Incoming: ${JSON.stringify(incomingNotePayload)}, Outgoing: ${JSON.stringify(outgoingNotePayload)}`);
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
const payload = incomingNotePayload || outgoingNotePayload;
|
|
371
|
+
const txEffect = txEffectsCache.get(scopedLog.txHash.toString()) ?? (await this.aztecNode.getTxEffect(scopedLog.txHash));
|
|
372
|
+
if (!txEffect) {
|
|
373
|
+
this.log.warn(`No tx effect found for ${scopedLog.txHash} while decrypting tagged logs`);
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
txEffectsCache.set(scopedLog.txHash.toString(), txEffect);
|
|
377
|
+
if (!excludedIndices.has(scopedLog.txHash.toString())) {
|
|
378
|
+
excludedIndices.set(scopedLog.txHash.toString(), new Set());
|
|
379
|
+
}
|
|
380
|
+
const { incomingNote, outgoingNote } = await produceNoteDaos(
|
|
381
|
+
// I don't like this at all, but we need a simulator to run `computeNoteHashAndOptionallyANullifier`. This generates
|
|
382
|
+
// a chicken-and-egg problem due to this oracle requiring a simulator, which in turn requires this oracle. Furthermore, since jest doesn't allow
|
|
383
|
+
// mocking ESM exports, we have to pollute the method even more by providing a simulator parameter so tests can inject a fake one.
|
|
384
|
+
simulator ?? getAcirSimulator(this.db, this.aztecNode, this.keyStore, this.contractDataOracle), this.db, incomingNotePayload ? computePoint(recipient) : undefined, outgoingNotePayload ? recipientCompleteAddress.publicKeys.masterOutgoingViewingPublicKey : undefined, payload, txEffect.txHash, txEffect.noteHashes, scopedLog.dataStartIndexForTx, excludedIndices.get(scopedLog.txHash.toString()), this.log);
|
|
385
|
+
if (incomingNote) {
|
|
386
|
+
incomingNotes.push(incomingNote);
|
|
387
|
+
}
|
|
388
|
+
if (outgoingNote) {
|
|
389
|
+
outgoingNotes.push(outgoingNote);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return { incomingNotes, outgoingNotes };
|
|
264
394
|
};
|
|
265
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2ltdWxhdG9yX29yYWNsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFJTCxZQUFZLEVBSVosbUNBQW1DLEdBQ3BDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQU9MLG9CQUFvQixFQUdwQixhQUFhLEVBQ2Isb0JBQW9CLEdBQ3JCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUF5QixtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFLMUU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUMxQixZQUNVLGtCQUFzQyxFQUN0QyxFQUFlLEVBQ2YsUUFBa0IsRUFDbEIsU0FBb0IsRUFDcEIsTUFBTSxpQkFBaUIsQ0FBQyw0QkFBNEIsQ0FBQzs7UUFKckQsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLFFBQUcsR0FBSCxHQUFHLENBQWtEO0lBQzVELENBQUM7SUFFSix1QkFBdUIsQ0FBQyxPQUFXLEVBQUUsZUFBNkI7UUFDaEUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQXFCO1FBQzVDLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFP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
|
|
395
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2ltdWxhdG9yX29yYWNsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFFTCxhQUFhLEVBR2IsWUFBWSxFQU1aLG1DQUFtQyxHQUNwQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFJTCxFQUFFLEVBR0Ysb0JBQW9CLEVBR3BCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osb0JBQW9CLEdBQ3JCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUF5QixtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQXFDLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFNOUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXpEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFDVSxrQkFBc0MsRUFDdEMsRUFBZSxFQUNmLFFBQWtCLEVBQ2xCLFNBQW9CLEVBQ3BCLE1BQU0saUJBQWlCLENBQUMsNEJBQTRCLENBQUM7O1FBSnJELHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixRQUFHLEdBQUgsR0FBRyxDQUFrRDtJQUM1RCxDQUFDO0lBRUosdUJBQXVCLENBQUMsT0FBVyxFQUFFLGVBQTZCO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUs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
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { type AztecNode } from '@aztec/circuit-types';
|
|
2
|
-
import { type AztecAddress, type CompleteAddress } from '@aztec/circuits.js';
|
|
3
2
|
import { type SerialQueue } from '@aztec/foundation/queue';
|
|
4
|
-
import { type KeyStore } from '@aztec/key-store';
|
|
5
3
|
import { type PxeDatabase } from '../database/index.js';
|
|
6
4
|
/**
|
|
7
5
|
* The Synchronizer class manages the synchronization of note processors and interacts with the Aztec node
|
|
@@ -11,16 +9,13 @@ import { type PxeDatabase } from '../database/index.js';
|
|
|
11
9
|
* in sync with the blockchain while handling retries and errors gracefully.
|
|
12
10
|
*/
|
|
13
11
|
export declare class Synchronizer {
|
|
14
|
-
#private;
|
|
15
12
|
private node;
|
|
16
13
|
private db;
|
|
17
14
|
private jobQueue;
|
|
18
15
|
private runningPromise?;
|
|
19
|
-
private noteProcessors;
|
|
20
16
|
private running;
|
|
21
17
|
private initialSyncBlockNumber;
|
|
22
18
|
private log;
|
|
23
|
-
private noteProcessorsToCatchUp;
|
|
24
19
|
constructor(node: AztecNode, db: PxeDatabase, jobQueue: SerialQueue, logSuffix?: string);
|
|
25
20
|
/**
|
|
26
21
|
* Starts the synchronization process by fetching encrypted logs and blocks from a specified position.
|
|
@@ -51,14 +46,6 @@ export declare class Synchronizer {
|
|
|
51
46
|
* @returns true if there could be more work, false if we're caught up or there was an error.
|
|
52
47
|
*/
|
|
53
48
|
protected work(limit?: number): Promise<boolean>;
|
|
54
|
-
/**
|
|
55
|
-
* Catch up note processors that are lagging behind the main sync.
|
|
56
|
-
* e.g. because we just added a new account.
|
|
57
|
-
*
|
|
58
|
-
* @param limit - the maximum number of encrypted, unencrypted logs and blocks to fetch in each iteration.
|
|
59
|
-
* @returns true if there could be more work, false if there was an error which allows a retry with delay.
|
|
60
|
-
*/
|
|
61
|
-
protected workNoteProcessorCatchUp(limit?: number): Promise<boolean>;
|
|
62
49
|
private setHeaderFromBlock;
|
|
63
50
|
/**
|
|
64
51
|
* Stops the synchronizer gracefully, interrupting any ongoing sleep and waiting for the current
|
|
@@ -68,26 +55,6 @@ export declare class Synchronizer {
|
|
|
68
55
|
* @returns A promise that resolves when the synchronizer has successfully stopped.
|
|
69
56
|
*/
|
|
70
57
|
stop(): Promise<void>;
|
|
71
|
-
/**
|
|
72
|
-
* Add a new account to the Synchronizer with the specified private key.
|
|
73
|
-
* Creates a NoteProcessor instance for the account and pushes it into the noteProcessors array.
|
|
74
|
-
* The method resolves immediately after pushing the new note processor.
|
|
75
|
-
*
|
|
76
|
-
* @param publicKey - The public key for the account.
|
|
77
|
-
* @param keyStore - The key store.
|
|
78
|
-
* @param startingBlock - The block where to start scanning for notes for this accounts.
|
|
79
|
-
* @returns A promise that resolves once the account is added to the Synchronizer.
|
|
80
|
-
*/
|
|
81
|
-
addAccount(account: CompleteAddress, keyStore: KeyStore, startingBlock: number): void;
|
|
82
|
-
/**
|
|
83
|
-
* Checks if the specified account is synchronized.
|
|
84
|
-
* @param account - The aztec address for which to query the sync status.
|
|
85
|
-
* @returns True if the account is fully synched, false otherwise.
|
|
86
|
-
* @remarks Checks whether all the notes from all the blocks have been processed. If it is not the case, the
|
|
87
|
-
* retrieved information from contracts might be old/stale (e.g. old token balance).
|
|
88
|
-
* @throws If checking a sync status of account which is not registered.
|
|
89
|
-
*/
|
|
90
|
-
isAccountStateSynchronized(account: AztecAddress): Promise<boolean>;
|
|
91
58
|
private getSynchedBlockNumber;
|
|
92
59
|
/**
|
|
93
60
|
* Checks whether all the blocks were processed (tree roots updated, txs updated with block info, etc.).
|
|
@@ -102,21 +69,6 @@ export declare class Synchronizer {
|
|
|
102
69
|
*/
|
|
103
70
|
getSyncStatus(): {
|
|
104
71
|
blocks: number;
|
|
105
|
-
notes: {
|
|
106
|
-
[k: string]: number;
|
|
107
|
-
};
|
|
108
|
-
};
|
|
109
|
-
/**
|
|
110
|
-
* Returns the note processor stats.
|
|
111
|
-
* @returns The note processor stats for notes for each public key being tracked.
|
|
112
|
-
*/
|
|
113
|
-
getSyncStats(): {
|
|
114
|
-
[k: string]: import("@aztec/circuit-types/stats").NoteProcessorStats;
|
|
115
72
|
};
|
|
116
|
-
/**
|
|
117
|
-
* Retry decoding any deferred notes for the specified contract address.
|
|
118
|
-
* @param contractAddress - the contract address that has just been added
|
|
119
|
-
*/
|
|
120
|
-
reprocessDeferredNotesForContract(contractAddress: AztecAddress): Promise<void>;
|
|
121
73
|
}
|
|
122
74
|
//# sourceMappingURL=synchronizer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,sBAAsB,CAAC;AAGpE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;GAMG;AACH,qBAAa,YAAY;IAMX,OAAO,CAAC,IAAI;IAAa,OAAO,CAAC,EAAE;IAAe,OAAO,CAAC,QAAQ;IAL9E,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,sBAAsB,CAA4B;IAC1D,OAAO,CAAC,GAAG,CAAc;gBAEL,IAAI,EAAE,SAAS,EAAU,EAAE,EAAE,WAAW,EAAU,QAAQ,EAAE,WAAW,EAAE,SAAS,SAAK;IAI3G;;;;;;;OAOG;IACU,KAAK,CAAC,KAAK,SAAI,EAAE,aAAa,SAAO;cAalC,WAAW;IAO3B;;;;;;;;;;OAUG;IACH,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM;IAU5B;;;;;OAKG;cACa,IAAI,CAAC,KAAK,SAAI,GAAG,OAAO,CAAC,OAAO,CAAC;YAkBnC,kBAAkB;IAQhC;;;;;;OAMG;IACU,IAAI;IAMjB,OAAO,CAAC,qBAAqB;IAI7B;;;;;OAKG;IACU,yBAAyB;IAKtC;;;OAGG;IACI,aAAa;;;CAMrB"}
|