@aztec/pxe 0.8.6
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/README.md +13 -0
- package/dest/bin/index.d.ts +3 -0
- package/dest/bin/index.d.ts.map +1 -0
- package/dest/bin/index.js +31 -0
- package/dest/config/index.d.ts +21 -0
- package/dest/config/index.d.ts.map +1 -0
- package/dest/config/index.js +21 -0
- package/dest/contract_data_oracle/index.d.ts +99 -0
- package/dest/contract_data_oracle/index.d.ts.map +1 -0
- package/dest/contract_data_oracle/index.js +137 -0
- package/dest/contract_database/index.d.ts +2 -0
- package/dest/contract_database/index.d.ts.map +1 -0
- package/dest/contract_database/index.js +2 -0
- package/dest/contract_database/memory_contract_database.d.ts +43 -0
- package/dest/contract_database/memory_contract_database.d.ts.map +1 -0
- package/dest/contract_database/memory_contract_database.js +51 -0
- package/dest/contract_tree/index.d.ts +107 -0
- package/dest/contract_tree/index.d.ts.map +1 -0
- package/dest/contract_tree/index.js +181 -0
- package/dest/database/database.d.ts +118 -0
- package/dest/database/database.d.ts.map +1 -0
- package/dest/database/database.js +2 -0
- package/dest/database/index.d.ts +4 -0
- package/dest/database/index.d.ts.map +1 -0
- package/dest/database/index.js +4 -0
- package/dest/database/memory_db.d.ts +45 -0
- package/dest/database/memory_db.d.ts.map +1 -0
- package/dest/database/memory_db.js +111 -0
- package/dest/database/note_spending_info_dao.d.ts +44 -0
- package/dest/database/note_spending_info_dao.d.ts.map +1 -0
- package/dest/database/note_spending_info_dao.js +14 -0
- package/dest/index.d.ts +10 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +10 -0
- package/dest/kernel_oracle/index.d.ts +18 -0
- package/dest/kernel_oracle/index.d.ts.map +1 -0
- package/dest/kernel_oracle/index.js +29 -0
- package/dest/kernel_prover/index.d.ts +3 -0
- package/dest/kernel_prover/index.d.ts.map +1 -0
- package/dest/kernel_prover/index.js +3 -0
- package/dest/kernel_prover/kernel_prover.d.ts +89 -0
- package/dest/kernel_prover/kernel_prover.d.ts.map +1 -0
- package/dest/kernel_prover/kernel_prover.js +175 -0
- package/dest/kernel_prover/proof_creator.d.ts +84 -0
- package/dest/kernel_prover/proof_creator.d.ts.map +1 -0
- package/dest/kernel_prover/proof_creator.js +83 -0
- package/dest/kernel_prover/proving_data_oracle.d.ts +53 -0
- package/dest/kernel_prover/proving_data_oracle.d.ts.map +1 -0
- package/dest/kernel_prover/proving_data_oracle.js +2 -0
- package/dest/note_processor/index.d.ts +2 -0
- package/dest/note_processor/index.d.ts.map +1 -0
- package/dest/note_processor/index.js +2 -0
- package/dest/note_processor/note_processor.d.ts +78 -0
- package/dest/note_processor/note_processor.d.ts.map +1 -0
- package/dest/note_processor/note_processor.js +206 -0
- package/dest/pxe_http/index.d.ts +2 -0
- package/dest/pxe_http/index.d.ts.map +1 -0
- package/dest/pxe_http/index.js +2 -0
- package/dest/pxe_http/pxe_http_server.d.ts +40 -0
- package/dest/pxe_http/pxe_http_server.d.ts.map +1 -0
- package/dest/pxe_http/pxe_http_server.js +44 -0
- package/dest/pxe_service/create_pxe_service.d.ts +30 -0
- package/dest/pxe_service/create_pxe_service.d.ts.map +1 -0
- package/dest/pxe_service/create_pxe_service.js +27 -0
- package/dest/pxe_service/index.d.ts +4 -0
- package/dest/pxe_service/index.d.ts.map +1 -0
- package/dest/pxe_service/index.js +4 -0
- package/dest/pxe_service/pxe_service.d.ts +70 -0
- package/dest/pxe_service/pxe_service.d.ts.map +1 -0
- package/dest/pxe_service/pxe_service.js +470 -0
- package/dest/pxe_service/test/pxe_test_suite.d.ts +3 -0
- package/dest/pxe_service/test/pxe_test_suite.d.ts.map +1 -0
- package/dest/pxe_service/test/pxe_test_suite.js +100 -0
- package/dest/simulator/index.d.ts +9 -0
- package/dest/simulator/index.d.ts.map +1 -0
- package/dest/simulator/index.js +11 -0
- package/dest/simulator_oracle/index.d.ts +53 -0
- package/dest/simulator_oracle/index.d.ts.map +1 -0
- package/dest/simulator_oracle/index.js +91 -0
- package/dest/synchronizer/index.d.ts +2 -0
- package/dest/synchronizer/index.d.ts.map +1 -0
- package/dest/synchronizer/index.js +2 -0
- package/dest/synchronizer/synchronizer.d.ts +82 -0
- package/dest/synchronizer/synchronizer.d.ts.map +1 -0
- package/dest/synchronizer/synchronizer.js +241 -0
- package/package.json +74 -0
- package/src/bin/index.ts +39 -0
- package/src/config/index.ts +34 -0
- package/src/contract_data_oracle/index.ts +151 -0
- package/src/contract_database/index.ts +1 -0
- package/src/contract_database/memory_contract_database.ts +58 -0
- package/src/contract_tree/index.ts +245 -0
- package/src/database/database.ts +131 -0
- package/src/database/index.ts +3 -0
- package/src/database/memory_db.ts +147 -0
- package/src/database/note_spending_info_dao.ts +64 -0
- package/src/index.ts +11 -0
- package/src/kernel_oracle/index.ts +39 -0
- package/src/kernel_prover/index.ts +2 -0
- package/src/kernel_prover/kernel_prover.ts +317 -0
- package/src/kernel_prover/proof_creator.ts +176 -0
- package/src/kernel_prover/proving_data_oracle.ts +69 -0
- package/src/note_processor/index.ts +1 -0
- package/src/note_processor/note_processor.ts +267 -0
- package/src/pxe_http/index.ts +1 -0
- package/src/pxe_http/pxe_http_server.ts +70 -0
- package/src/pxe_service/create_pxe_service.ts +52 -0
- package/src/pxe_service/index.ts +3 -0
- package/src/pxe_service/pxe_service.ts +650 -0
- package/src/pxe_service/test/pxe_test_suite.ts +138 -0
- package/src/simulator/index.ts +24 -0
- package/src/simulator_oracle/index.ts +121 -0
- package/src/synchronizer/index.ts +1 -0
- package/src/synchronizer/synchronizer.ts +285 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { AztecNode, KeyStore, L2BlockContext, L2BlockL2Logs, PublicKey } from '@aztec/types';
|
|
2
|
+
import { Database } from '../database/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* NoteProcessor is responsible for decrypting logs and converting them to notes via their originating contracts
|
|
5
|
+
* before storing them against their owner.
|
|
6
|
+
*/
|
|
7
|
+
export declare class NoteProcessor {
|
|
8
|
+
/**
|
|
9
|
+
* The public counterpart to the private key to be used in note decryption.
|
|
10
|
+
*/
|
|
11
|
+
readonly publicKey: PublicKey;
|
|
12
|
+
private keyStore;
|
|
13
|
+
private db;
|
|
14
|
+
private node;
|
|
15
|
+
private simulator;
|
|
16
|
+
private log;
|
|
17
|
+
/**
|
|
18
|
+
* The latest L2 block number that the note processor has synchronized to.
|
|
19
|
+
*/
|
|
20
|
+
private syncedToBlock;
|
|
21
|
+
constructor(
|
|
22
|
+
/**
|
|
23
|
+
* The public counterpart to the private key to be used in note decryption.
|
|
24
|
+
*/
|
|
25
|
+
publicKey: PublicKey, keyStore: KeyStore, db: Database, node: AztecNode, simulator?: import("@aztec/acir-simulator").AcirSimulator, log?: import("@aztec/foundation/log").DebugLogger);
|
|
26
|
+
/**
|
|
27
|
+
* Check if the NoteProcessor is synchronized with the remote block number.
|
|
28
|
+
* The function queries the remote block number from the AztecNode and compares it with the syncedToBlock value in the NoteProcessor.
|
|
29
|
+
* If the values are equal, then the NoteProcessor is considered to be synchronized, otherwise not.
|
|
30
|
+
*
|
|
31
|
+
* @returns A boolean indicating whether the NoteProcessor is synchronized with the remote block number or not.
|
|
32
|
+
*/
|
|
33
|
+
isSynchronized(): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Returns synchronisation status (ie up to which block has been synced ) for this note processor.
|
|
36
|
+
*/
|
|
37
|
+
get status(): {
|
|
38
|
+
syncedToBlock: number;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Process the given L2 block contexts and encrypted logs to update the note processor.
|
|
42
|
+
* It synchronizes the user's account by decrypting the encrypted logs and processing
|
|
43
|
+
* the transactions and auxiliary data associated with them.
|
|
44
|
+
* Throws an error if the number of block contexts and encrypted logs do not match.
|
|
45
|
+
*
|
|
46
|
+
* @param l2BlockContexts - An array of L2 block contexts to be processed.
|
|
47
|
+
* @param encryptedL2BlockLogs - An array of encrypted logs associated with the L2 block contexts.
|
|
48
|
+
* @returns A promise that resolves once the processing is completed.
|
|
49
|
+
*/
|
|
50
|
+
process(l2BlockContexts: L2BlockContext[], encryptedL2BlockLogs: L2BlockL2Logs[]): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Find the index of the note in the private data tree by computing the note hash with different nonce and see which
|
|
53
|
+
* commitment for the current tx matches this value.
|
|
54
|
+
* Compute the nullifier for a given transaction auxiliary data.
|
|
55
|
+
* The nullifier is calculated using the private key of the account,
|
|
56
|
+
* contract address, and note preimage associated with the noteSpendingInfo.
|
|
57
|
+
* This method assists in identifying spent commitments in the private state.
|
|
58
|
+
* @param commitments - Commitments in the tx. One of them should be the note's commitment.
|
|
59
|
+
* @param firstNullifier - First nullifier in the tx.
|
|
60
|
+
* @param noteSpendingInfo - An instance of NoteSpendingInfo containing transaction details.
|
|
61
|
+
* @param excludedIndices - Indices that have been assigned a note in the same tx. Notes in a tx can have the same
|
|
62
|
+
* NoteSpendingInfo. We need to find a different index for each replicate.
|
|
63
|
+
* @returns Information for a decrypted note, including the index of its commitment, nonce, inner note
|
|
64
|
+
* hash, and the siloed nullifier. Throw if cannot find the nonce for the note.
|
|
65
|
+
*/
|
|
66
|
+
private findNoteIndexAndNullifier;
|
|
67
|
+
/**
|
|
68
|
+
* Process the given blocks and their associated transaction auxiliary data.
|
|
69
|
+
* This function updates the database with information about new transactions,
|
|
70
|
+
* user-pertaining transaction indices, and auxiliary data. It also removes nullified
|
|
71
|
+
* transaction auxiliary data from the database. This function keeps track of new nullifiers
|
|
72
|
+
* and ensures all other transactions are updated with newly settled block information.
|
|
73
|
+
*
|
|
74
|
+
* @param blocksAndNoteSpendingInfo - Array of objects containing L2BlockContexts, user-pertaining transaction indices, and NoteSpendingInfoDaos.
|
|
75
|
+
*/
|
|
76
|
+
private processBlocksAndNoteSpendingInfo;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=note_processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note_processor.d.ts","sourceRoot":"","sources":["../../src/note_processor/note_processor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE/G,OAAO,EAAE,QAAQ,EAAuB,MAAM,sBAAsB,CAAC;AAiBrE;;;GAGG;AACH,qBAAa,aAAa;IAOtB;;OAEG;aACa,SAAS,EAAE,SAAS;IACpC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,GAAG;IAdb;;OAEG;IACH,OAAO,CAAC,aAAa,CAAK;;IAGxB;;OAEG;IACa,SAAS,EAAE,SAAS,EAC5B,QAAQ,EAAE,QAAQ,EAClB,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,SAAS,EACf,SAAS,gDAAuC,EAChD,GAAG,8CAAkD;IAG/D;;;;;;OAMG;IACU,cAAc;IAK3B;;OAEG;IACH,IAAW,MAAM;;MAEhB;IAED;;;;;;;;;OASG;IACU,OAAO,CAAC,eAAe,EAAE,cAAc,EAAE,EAAE,oBAAoB,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiF7G;;;;;;;;;;;;;;OAcG;YACW,yBAAyB;IA+DvC;;;;;;;;OAQG;YACW,gCAAgC;CAuB/C"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { CircuitsWasm, MAX_NEW_COMMITMENTS_PER_TX, MAX_NEW_NULLIFIERS_PER_TX } from '@aztec/circuits.js';
|
|
2
|
+
import { computeCommitmentNonce, siloNullifier } from '@aztec/circuits.js/abis';
|
|
3
|
+
import { Grumpkin } from '@aztec/circuits.js/barretenberg';
|
|
4
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
5
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
|
+
import { NoteSpendingInfo } from '@aztec/types';
|
|
7
|
+
import { getAcirSimulator } from '../simulator/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* NoteProcessor is responsible for decrypting logs and converting them to notes via their originating contracts
|
|
10
|
+
* before storing them against their owner.
|
|
11
|
+
*/
|
|
12
|
+
export class NoteProcessor {
|
|
13
|
+
constructor(
|
|
14
|
+
/**
|
|
15
|
+
* The public counterpart to the private key to be used in note decryption.
|
|
16
|
+
*/
|
|
17
|
+
publicKey, keyStore, db, node, simulator = getAcirSimulator(db, node, keyStore), log = createDebugLogger('aztec:aztec_note_processor')) {
|
|
18
|
+
this.publicKey = publicKey;
|
|
19
|
+
this.keyStore = keyStore;
|
|
20
|
+
this.db = db;
|
|
21
|
+
this.node = node;
|
|
22
|
+
this.simulator = simulator;
|
|
23
|
+
this.log = log;
|
|
24
|
+
/**
|
|
25
|
+
* The latest L2 block number that the note processor has synchronized to.
|
|
26
|
+
*/
|
|
27
|
+
this.syncedToBlock = 0;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if the NoteProcessor is synchronized with the remote block number.
|
|
31
|
+
* The function queries the remote block number from the AztecNode and compares it with the syncedToBlock value in the NoteProcessor.
|
|
32
|
+
* If the values are equal, then the NoteProcessor is considered to be synchronized, otherwise not.
|
|
33
|
+
*
|
|
34
|
+
* @returns A boolean indicating whether the NoteProcessor is synchronized with the remote block number or not.
|
|
35
|
+
*/
|
|
36
|
+
async isSynchronized() {
|
|
37
|
+
const remoteBlockNumber = await this.node.getBlockNumber();
|
|
38
|
+
return this.syncedToBlock === remoteBlockNumber;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns synchronisation status (ie up to which block has been synced ) for this note processor.
|
|
42
|
+
*/
|
|
43
|
+
get status() {
|
|
44
|
+
return { syncedToBlock: this.syncedToBlock };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Process the given L2 block contexts and encrypted logs to update the note processor.
|
|
48
|
+
* It synchronizes the user's account by decrypting the encrypted logs and processing
|
|
49
|
+
* the transactions and auxiliary data associated with them.
|
|
50
|
+
* Throws an error if the number of block contexts and encrypted logs do not match.
|
|
51
|
+
*
|
|
52
|
+
* @param l2BlockContexts - An array of L2 block contexts to be processed.
|
|
53
|
+
* @param encryptedL2BlockLogs - An array of encrypted logs associated with the L2 block contexts.
|
|
54
|
+
* @returns A promise that resolves once the processing is completed.
|
|
55
|
+
*/
|
|
56
|
+
async process(l2BlockContexts, encryptedL2BlockLogs) {
|
|
57
|
+
if (l2BlockContexts.length !== encryptedL2BlockLogs.length) {
|
|
58
|
+
throw new Error(`Number of blocks and EncryptedLogs is not equal. Received ${l2BlockContexts.length} blocks, ${encryptedL2BlockLogs.length} encrypted logs.`);
|
|
59
|
+
}
|
|
60
|
+
if (!l2BlockContexts.length) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const blocksAndNoteSpendingInfo = [];
|
|
64
|
+
const curve = await Grumpkin.new();
|
|
65
|
+
// Iterate over both blocks and encrypted logs.
|
|
66
|
+
for (let blockIndex = 0; blockIndex < encryptedL2BlockLogs.length; ++blockIndex) {
|
|
67
|
+
const { txLogs } = encryptedL2BlockLogs[blockIndex];
|
|
68
|
+
const block = l2BlockContexts[blockIndex].block;
|
|
69
|
+
const dataStartIndexForBlock = block.startPrivateDataTreeSnapshot.nextAvailableLeafIndex;
|
|
70
|
+
// We are using set for `userPertainingTxIndices` to avoid duplicates. This would happen in case there were
|
|
71
|
+
// multiple encrypted logs in a tx pertaining to a user.
|
|
72
|
+
const noteSpendingInfoDaos = [];
|
|
73
|
+
const privateKey = await this.keyStore.getAccountPrivateKey(this.publicKey);
|
|
74
|
+
// Iterate over all the encrypted logs and try decrypting them. If successful, store the note spending info.
|
|
75
|
+
for (let indexOfTxInABlock = 0; indexOfTxInABlock < txLogs.length; ++indexOfTxInABlock) {
|
|
76
|
+
const dataStartIndexForTx = dataStartIndexForBlock + indexOfTxInABlock * MAX_NEW_COMMITMENTS_PER_TX;
|
|
77
|
+
const newCommitments = block.newCommitments.slice(indexOfTxInABlock * MAX_NEW_COMMITMENTS_PER_TX, (indexOfTxInABlock + 1) * MAX_NEW_COMMITMENTS_PER_TX);
|
|
78
|
+
const newNullifiers = block.newNullifiers.slice(indexOfTxInABlock * MAX_NEW_NULLIFIERS_PER_TX, (indexOfTxInABlock + 1) * MAX_NEW_NULLIFIERS_PER_TX);
|
|
79
|
+
// Note: Each tx generates a `TxL2Logs` object and for this reason we can rely on its index corresponding
|
|
80
|
+
// to the index of a tx in a block.
|
|
81
|
+
const txFunctionLogs = txLogs[indexOfTxInABlock].functionLogs;
|
|
82
|
+
const excludedIndices = new Set();
|
|
83
|
+
for (const functionLogs of txFunctionLogs) {
|
|
84
|
+
for (const logs of functionLogs.logs) {
|
|
85
|
+
const noteSpendingInfo = NoteSpendingInfo.fromEncryptedBuffer(logs, privateKey, curve);
|
|
86
|
+
if (noteSpendingInfo) {
|
|
87
|
+
// We have successfully decrypted the data.
|
|
88
|
+
try {
|
|
89
|
+
const { commitmentIndex, nonce, innerNoteHash, siloedNullifier } = await this.findNoteIndexAndNullifier(newCommitments, newNullifiers[0], noteSpendingInfo, excludedIndices);
|
|
90
|
+
const index = BigInt(dataStartIndexForTx + commitmentIndex);
|
|
91
|
+
excludedIndices.add(commitmentIndex);
|
|
92
|
+
noteSpendingInfoDaos.push({
|
|
93
|
+
...noteSpendingInfo,
|
|
94
|
+
nonce,
|
|
95
|
+
innerNoteHash,
|
|
96
|
+
siloedNullifier,
|
|
97
|
+
index,
|
|
98
|
+
publicKey: this.publicKey,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
this.log.warn(`Could not process note because of "${e}". Skipping note...`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
blocksAndNoteSpendingInfo.push({
|
|
109
|
+
blockContext: l2BlockContexts[blockIndex],
|
|
110
|
+
noteSpendingInfoDaos,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
await this.processBlocksAndNoteSpendingInfo(blocksAndNoteSpendingInfo);
|
|
114
|
+
this.syncedToBlock = l2BlockContexts[l2BlockContexts.length - 1].block.number;
|
|
115
|
+
this.log(`Synched block ${this.syncedToBlock}`);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Find the index of the note in the private data tree by computing the note hash with different nonce and see which
|
|
119
|
+
* commitment for the current tx matches this value.
|
|
120
|
+
* Compute the nullifier for a given transaction auxiliary data.
|
|
121
|
+
* The nullifier is calculated using the private key of the account,
|
|
122
|
+
* contract address, and note preimage associated with the noteSpendingInfo.
|
|
123
|
+
* This method assists in identifying spent commitments in the private state.
|
|
124
|
+
* @param commitments - Commitments in the tx. One of them should be the note's commitment.
|
|
125
|
+
* @param firstNullifier - First nullifier in the tx.
|
|
126
|
+
* @param noteSpendingInfo - An instance of NoteSpendingInfo containing transaction details.
|
|
127
|
+
* @param excludedIndices - Indices that have been assigned a note in the same tx. Notes in a tx can have the same
|
|
128
|
+
* NoteSpendingInfo. We need to find a different index for each replicate.
|
|
129
|
+
* @returns Information for a decrypted note, including the index of its commitment, nonce, inner note
|
|
130
|
+
* hash, and the siloed nullifier. Throw if cannot find the nonce for the note.
|
|
131
|
+
*/
|
|
132
|
+
async findNoteIndexAndNullifier(commitments, firstNullifier, { contractAddress, storageSlot, notePreimage }, excludedIndices) {
|
|
133
|
+
const wasm = await CircuitsWasm.get();
|
|
134
|
+
let commitmentIndex = 0;
|
|
135
|
+
let nonce;
|
|
136
|
+
let innerNoteHash;
|
|
137
|
+
let siloedNoteHash;
|
|
138
|
+
let uniqueSiloedNoteHash;
|
|
139
|
+
let innerNullifier;
|
|
140
|
+
for (; commitmentIndex < commitments.length; ++commitmentIndex) {
|
|
141
|
+
if (excludedIndices.has(commitmentIndex))
|
|
142
|
+
continue;
|
|
143
|
+
const commitment = commitments[commitmentIndex];
|
|
144
|
+
if (commitment.equals(Fr.ZERO))
|
|
145
|
+
break;
|
|
146
|
+
const expectedNonce = computeCommitmentNonce(wasm, firstNullifier, commitmentIndex);
|
|
147
|
+
({ innerNoteHash, siloedNoteHash, uniqueSiloedNoteHash, innerNullifier } =
|
|
148
|
+
await this.simulator.computeNoteHashAndNullifier(contractAddress, expectedNonce, storageSlot, notePreimage.items));
|
|
149
|
+
if (commitment.equals(uniqueSiloedNoteHash)) {
|
|
150
|
+
nonce = expectedNonce;
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (!nonce) {
|
|
155
|
+
let errorString;
|
|
156
|
+
if (siloedNoteHash == undefined) {
|
|
157
|
+
errorString = 'Cannot find a matching commitment for the note.';
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
errorString = `We decrypted a log, but couldn't find a corresponding note in the tree.
|
|
161
|
+
This might be because the note was nullified in the same tx which created it.
|
|
162
|
+
In that case, everything is fine. To check whether this is the case, look back through
|
|
163
|
+
the logs for a notification
|
|
164
|
+
'important: chopped commitment for siloed inner hash note
|
|
165
|
+
${siloedNoteHash.toString()}'.
|
|
166
|
+
If you can see that notification. Everything's fine.
|
|
167
|
+
If that's not the case, and you can't find such a notification, something has gone wrong.
|
|
168
|
+
There could be a problem with the way you've defined a custom note, or with the way you're
|
|
169
|
+
serialising / deserialising / hashing / encrypting / decrypting that note.
|
|
170
|
+
Please see the following github issue to track an improvement that we're working on:
|
|
171
|
+
https://github.com/AztecProtocol/aztec-packages/issues/1641`;
|
|
172
|
+
}
|
|
173
|
+
throw new Error(errorString);
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
commitmentIndex,
|
|
177
|
+
nonce,
|
|
178
|
+
innerNoteHash: innerNoteHash,
|
|
179
|
+
siloedNullifier: siloNullifier(wasm, contractAddress, innerNullifier),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Process the given blocks and their associated transaction auxiliary data.
|
|
184
|
+
* This function updates the database with information about new transactions,
|
|
185
|
+
* user-pertaining transaction indices, and auxiliary data. It also removes nullified
|
|
186
|
+
* transaction auxiliary data from the database. This function keeps track of new nullifiers
|
|
187
|
+
* and ensures all other transactions are updated with newly settled block information.
|
|
188
|
+
*
|
|
189
|
+
* @param blocksAndNoteSpendingInfo - Array of objects containing L2BlockContexts, user-pertaining transaction indices, and NoteSpendingInfoDaos.
|
|
190
|
+
*/
|
|
191
|
+
async processBlocksAndNoteSpendingInfo(blocksAndNoteSpendingInfo) {
|
|
192
|
+
const noteSpendingInfoDaosBatch = blocksAndNoteSpendingInfo.flatMap(b => b.noteSpendingInfoDaos);
|
|
193
|
+
if (noteSpendingInfoDaosBatch.length) {
|
|
194
|
+
await this.db.addNoteSpendingInfoBatch(noteSpendingInfoDaosBatch);
|
|
195
|
+
noteSpendingInfoDaosBatch.forEach(noteSpendingInfo => {
|
|
196
|
+
this.log(`Added note spending info for contract ${noteSpendingInfo.contractAddress} at slot ${noteSpendingInfo.storageSlot} with nullifier ${noteSpendingInfo.siloedNullifier.toString()}`);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
const newNullifiers = blocksAndNoteSpendingInfo.flatMap(b => b.blockContext.block.newNullifiers);
|
|
200
|
+
const removedNoteSpendingInfo = await this.db.removeNullifiedNoteSpendingInfo(newNullifiers, this.publicKey);
|
|
201
|
+
removedNoteSpendingInfo.forEach(noteSpendingInfo => {
|
|
202
|
+
this.log(`Removed note spending info for contract ${noteSpendingInfo.contractAddress} at slot ${noteSpendingInfo.storageSlot} with nullifier ${noteSpendingInfo.siloedNullifier.toString()}`);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZV9wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbm90ZV9wcm9jZXNzb3Ivbm90ZV9wcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSwwQkFBMEIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBc0QsZ0JBQWdCLEVBQWEsTUFBTSxjQUFjLENBQUM7QUFHL0csT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFnQnpEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBTXhCO0lBQ0U7O09BRUc7SUFDYSxTQUFvQixFQUM1QixRQUFrQixFQUNsQixFQUFZLEVBQ1osSUFBZSxFQUNmLFlBQVksZ0JBQWdCLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsRUFDaEQsTUFBTSxpQkFBaUIsQ0FBQyw0QkFBNEIsQ0FBQztRQUw3QyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQzVCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsT0FBRSxHQUFGLEVBQUUsQ0FBVTtRQUNaLFNBQUksR0FBSixJQUFJLENBQVc7UUFDZixjQUFTLEdBQVQsU0FBUyxDQUF1QztRQUNoRCxRQUFHLEdBQUgsR0FBRyxDQUFrRDtRQWQvRDs7V0FFRztRQUNLLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO0lBWXZCLENBQUM7SUFFSjs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsY0FBYztR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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pxe_http/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
3
|
+
import { PXE } from '@aztec/types';
|
|
4
|
+
import http from 'http';
|
|
5
|
+
export declare const localAnvil: {
|
|
6
|
+
readonly id: 31337;
|
|
7
|
+
readonly name: "Foundry";
|
|
8
|
+
readonly network: "foundry";
|
|
9
|
+
readonly nativeCurrency: {
|
|
10
|
+
readonly decimals: 18;
|
|
11
|
+
readonly name: "Ether";
|
|
12
|
+
readonly symbol: "ETH";
|
|
13
|
+
};
|
|
14
|
+
readonly rpcUrls: {
|
|
15
|
+
readonly default: {
|
|
16
|
+
readonly http: readonly ["http://127.0.0.1:8545"];
|
|
17
|
+
readonly webSocket: readonly ["ws://127.0.0.1:8545"];
|
|
18
|
+
};
|
|
19
|
+
readonly public: {
|
|
20
|
+
readonly http: readonly ["http://127.0.0.1:8545"];
|
|
21
|
+
readonly webSocket: readonly ["ws://127.0.0.1:8545"];
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
} & {
|
|
25
|
+
formatters: import("viem").Formatters | undefined;
|
|
26
|
+
serializers: import("viem").Serializers<import("viem").Formatters> | undefined;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Wraps an instance of Private eXecution Environment (PXE) implementation to a JSON RPC HTTP interface.
|
|
30
|
+
* @returns A new instance of the HTTP server.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createPXERpcServer(pxeService: PXE): JsonRpcServer;
|
|
33
|
+
/**
|
|
34
|
+
* Creates an http server that forwards calls to the PXE and starts it on the given port.
|
|
35
|
+
* @param pxeService - PXE that answers queries to the created HTTP server.
|
|
36
|
+
* @param port - Port to listen in.
|
|
37
|
+
* @returns A running http server.
|
|
38
|
+
*/
|
|
39
|
+
export declare function startPXEHttpServer(pxeService: PXE, port: string | number): http.Server;
|
|
40
|
+
//# sourceMappingURL=pxe_http_server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pxe_http_server.d.ts","sourceRoot":"","sources":["../../src/pxe_http/pxe_http_server.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EASL,GAAG,EAKJ,MAAM,cAAc,CAAC;AAEtB,OAAO,IAAI,MAAM,MAAM,CAAC;AAKxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;CAAU,CAAC;AAElC;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,GAAG,GAAG,aAAa,CAuBjE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAQtF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
2
|
+
import { Fr, GrumpkinScalar, Point } from '@aztec/foundation/fields';
|
|
3
|
+
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
4
|
+
import { AuthWitness, CompleteAddress, ContractData, ExtendedContractData, L2Block, L2BlockL2Logs, L2Tx, NotePreimage, Tx, TxExecutionRequest, TxHash, TxReceipt, } from '@aztec/types';
|
|
5
|
+
import http from 'http';
|
|
6
|
+
import { foundry } from 'viem/chains';
|
|
7
|
+
import { EthAddress } from '../index.js';
|
|
8
|
+
export const localAnvil = foundry;
|
|
9
|
+
/**
|
|
10
|
+
* Wraps an instance of Private eXecution Environment (PXE) implementation to a JSON RPC HTTP interface.
|
|
11
|
+
* @returns A new instance of the HTTP server.
|
|
12
|
+
*/
|
|
13
|
+
export function createPXERpcServer(pxeService) {
|
|
14
|
+
return new JsonRpcServer(pxeService, {
|
|
15
|
+
CompleteAddress,
|
|
16
|
+
AztecAddress,
|
|
17
|
+
TxExecutionRequest,
|
|
18
|
+
ContractData,
|
|
19
|
+
ExtendedContractData,
|
|
20
|
+
TxHash,
|
|
21
|
+
EthAddress,
|
|
22
|
+
Point,
|
|
23
|
+
Fr,
|
|
24
|
+
GrumpkinScalar,
|
|
25
|
+
NotePreimage,
|
|
26
|
+
AuthWitness,
|
|
27
|
+
L2Block,
|
|
28
|
+
L2Tx,
|
|
29
|
+
}, { Tx, TxReceipt, L2BlockL2Logs }, false, ['start', 'stop']);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Creates an http server that forwards calls to the PXE and starts it on the given port.
|
|
33
|
+
* @param pxeService - PXE that answers queries to the created HTTP server.
|
|
34
|
+
* @param port - Port to listen in.
|
|
35
|
+
* @returns A running http server.
|
|
36
|
+
*/
|
|
37
|
+
export function startPXEHttpServer(pxeService, port) {
|
|
38
|
+
const rpcServer = createPXERpcServer(pxeService);
|
|
39
|
+
const app = rpcServer.getApp();
|
|
40
|
+
const httpServer = http.createServer(app.callback());
|
|
41
|
+
httpServer.listen(port);
|
|
42
|
+
return httpServer;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHhlX2h0dHBfc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B4ZV9odHRwL3B4ZV9odHRwX3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsZUFBZSxFQUNmLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsT0FBTyxFQUNQLGFBQWEsRUFDYixJQUFJLEVBQ0osWUFBWSxFQUVaLEVBQUUsRUFDRixrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFFbEM7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFVBQWU7SUFDaEQsT0FBTyxJQUFJLGFBQWEsQ0FDdEIsVUFBVSxFQUNWO1FBQ0UsZUFBZTtRQUNmLFlBQVk7UUFDWixrQkFBa0I7UUFDbEIsWUFBWTtRQUNaLG9CQUFvQjtRQUNwQixNQUFNO1FBQ04sVUFBVTtRQUNWLEtBQUs7UUFDTCxFQUFFO1FBQ0YsY0FBYztRQUNkLFlBQVk7UUFDWixXQUFXO1FBQ1gsT0FBTztRQUNQLElBQUk7S0FDTCxFQUNELEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsRUFDaEMsS0FBSyxFQUNMLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUNsQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFVBQWUsRUFBRSxJQUFxQjtJQUN2RSxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVqRCxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDL0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNyRCxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXhCLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMifQ==
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AztecNode, KeyStore } from '@aztec/types';
|
|
2
|
+
import { PXEServiceConfig } from '../config/index.js';
|
|
3
|
+
import { Database } from '../database/index.js';
|
|
4
|
+
import { PXEService } from './pxe_service.js';
|
|
5
|
+
/**
|
|
6
|
+
* Optional information for creating an PXEService.
|
|
7
|
+
*/
|
|
8
|
+
interface CreatePXEServiceOptions {
|
|
9
|
+
/**
|
|
10
|
+
* A secure storage for cryptographic keys.
|
|
11
|
+
*/
|
|
12
|
+
keyStore?: KeyStore;
|
|
13
|
+
/**
|
|
14
|
+
* Storage for the PXE.
|
|
15
|
+
*/
|
|
16
|
+
db?: Database;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create and start an PXEService instance with the given AztecNode.
|
|
20
|
+
* If no keyStore or database is provided, it will use TestKeyStore and MemoryDB as default values.
|
|
21
|
+
* Returns a Promise that resolves to the started PXEService instance.
|
|
22
|
+
*
|
|
23
|
+
* @param aztecNode - The AztecNode instance to be used by the server.
|
|
24
|
+
* @param config - The PXE Service Config to use
|
|
25
|
+
* @param options - (Optional) Optional information for creating an PXEService.
|
|
26
|
+
* @returns A Promise that resolves to the started PXEService instance.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createPXEService(aztecNode: AztecNode, config: PXEServiceConfig, { keyStore, db }?: CreatePXEServiceOptions, useLogSuffix?: string | boolean | undefined): Promise<PXEService>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=create_pxe_service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_pxe_service.d.ts","sourceRoot":"","sources":["../../src/pxe_service/create_pxe_service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,UAAU,uBAAuB;IAC/B;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;OAEG;IACH,EAAE,CAAC,EAAE,QAAQ,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,gBAAgB,EACxB,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAE,uBAA4B,EAC9C,YAAY,GAAE,MAAM,GAAG,OAAO,GAAG,SAAqB,uBAevD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Grumpkin } from '@aztec/circuits.js/barretenberg';
|
|
2
|
+
import { TestKeyStore } from '@aztec/key-store';
|
|
3
|
+
import { MemoryDB } from '../database/index.js';
|
|
4
|
+
import { PXEService } from './pxe_service.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create and start an PXEService instance with the given AztecNode.
|
|
7
|
+
* If no keyStore or database is provided, it will use TestKeyStore and MemoryDB as default values.
|
|
8
|
+
* Returns a Promise that resolves to the started PXEService instance.
|
|
9
|
+
*
|
|
10
|
+
* @param aztecNode - The AztecNode instance to be used by the server.
|
|
11
|
+
* @param config - The PXE Service Config to use
|
|
12
|
+
* @param options - (Optional) Optional information for creating an PXEService.
|
|
13
|
+
* @returns A Promise that resolves to the started PXEService instance.
|
|
14
|
+
*/
|
|
15
|
+
export async function createPXEService(aztecNode, config, { keyStore, db } = {}, useLogSuffix = undefined) {
|
|
16
|
+
const logSuffix = typeof useLogSuffix === 'boolean'
|
|
17
|
+
? useLogSuffix
|
|
18
|
+
? Math.random().toString(16).slice(2, 8)
|
|
19
|
+
: undefined
|
|
20
|
+
: useLogSuffix;
|
|
21
|
+
keyStore = keyStore || new TestKeyStore(await Grumpkin.new());
|
|
22
|
+
db = db || new MemoryDB(logSuffix);
|
|
23
|
+
const server = new PXEService(keyStore, aztecNode, db, config, logSuffix);
|
|
24
|
+
await server.start();
|
|
25
|
+
return server;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlX3B4ZV9zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B4ZV9zZXJ2aWNlL2NyZWF0ZV9weGVfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSWhELE9BQU8sRUFBWSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFnQjlDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLFNBQW9CLEVBQ3BCLE1BQXdCLEVBQ3hCLEVBQUUsUUFBUSxFQUFFLEVBQUUsS0FBOEIsRUFBRSxFQUM5QyxlQUE2QyxTQUFTO0lBRXRELE1BQU0sU0FBUyxHQUNiLE9BQU8sWUFBWSxLQUFLLFNBQVM7UUFDL0IsQ0FBQyxDQUFDLFlBQVk7WUFDWixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsU0FBUztRQUNiLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFFbkIsUUFBUSxHQUFHLFFBQVEsSUFBSSxJQUFJLFlBQVksQ0FBQyxNQUFNLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlELEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pxe_service/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './pxe_service.js';
|
|
2
|
+
export * from './create_pxe_service.js';
|
|
3
|
+
export { pxeTestSuite } from './test/pxe_test_suite.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHhlX3NlcnZpY2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQyJ9
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { AztecAddress, CompleteAddress, GrumpkinPrivateKey, PartialAddress } from '@aztec/circuits.js';
|
|
3
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
4
|
+
import { AuthWitness, AztecNode, ContractData, DeployedContract, ExtendedContractData, KeyStore, L2Block, L2BlockL2Logs, L2Tx, NodeInfo, NotePreimage, PXE, Tx, TxExecutionRequest, TxHash, TxReceipt } from '@aztec/types';
|
|
5
|
+
import { PXEServiceConfig } from '../config/index.js';
|
|
6
|
+
import { Database } from '../database/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* A Private eXecution Environment (PXE) implementation.
|
|
9
|
+
*/
|
|
10
|
+
export declare class PXEService implements PXE {
|
|
11
|
+
#private;
|
|
12
|
+
private keyStore;
|
|
13
|
+
private node;
|
|
14
|
+
private db;
|
|
15
|
+
private config;
|
|
16
|
+
private synchronizer;
|
|
17
|
+
private contractDataOracle;
|
|
18
|
+
private simulator;
|
|
19
|
+
private log;
|
|
20
|
+
private sandboxVersion;
|
|
21
|
+
constructor(keyStore: KeyStore, node: AztecNode, db: Database, config: PXEServiceConfig, logSuffix?: string);
|
|
22
|
+
/**
|
|
23
|
+
* Starts the PXE Service by beginning the synchronisation process between the Aztec node and the database.
|
|
24
|
+
*
|
|
25
|
+
* @returns A promise that resolves when the server has started successfully.
|
|
26
|
+
*/
|
|
27
|
+
start(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Stops the PXE Service, halting processing of new transactions and shutting down the synchronizer.
|
|
30
|
+
* This function ensures that all ongoing tasks are completed before stopping the server.
|
|
31
|
+
* It is useful for gracefully shutting down the server during maintenance or restarts.
|
|
32
|
+
*
|
|
33
|
+
* @returns A Promise resolving once the server has been stopped successfully.
|
|
34
|
+
*/
|
|
35
|
+
stop(): Promise<void>;
|
|
36
|
+
addAuthWitness(witness: AuthWitness): Promise<void>;
|
|
37
|
+
registerAccount(privKey: GrumpkinPrivateKey, partialAddress: PartialAddress): Promise<void>;
|
|
38
|
+
getRegisteredAccounts(): Promise<CompleteAddress[]>;
|
|
39
|
+
getRegisteredAccount(address: AztecAddress): Promise<CompleteAddress | undefined>;
|
|
40
|
+
registerRecipient(recipient: CompleteAddress): Promise<void>;
|
|
41
|
+
getRecipients(): Promise<CompleteAddress[]>;
|
|
42
|
+
getRecipient(address: AztecAddress): Promise<CompleteAddress | undefined>;
|
|
43
|
+
addContracts(contracts: DeployedContract[]): Promise<void>;
|
|
44
|
+
getContracts(): Promise<AztecAddress[]>;
|
|
45
|
+
getPublicStorageAt(contract: AztecAddress, storageSlot: Fr): Promise<Buffer | undefined>;
|
|
46
|
+
getPrivateStorageAt(owner: AztecAddress, contract: AztecAddress, storageSlot: Fr): Promise<NotePreimage[]>;
|
|
47
|
+
addNote(account: AztecAddress, contractAddress: AztecAddress, storageSlot: Fr, preimage: NotePreimage, txHash: TxHash, nonce?: Fr): Promise<void>;
|
|
48
|
+
getNoteNonces(contractAddress: AztecAddress, storageSlot: Fr, preimage: NotePreimage, txHash: TxHash): Promise<Fr[]>;
|
|
49
|
+
getBlock(blockNumber: number): Promise<L2Block | undefined>;
|
|
50
|
+
simulateTx(txRequest: TxExecutionRequest, simulatePublic: boolean): Promise<Tx>;
|
|
51
|
+
sendTx(tx: Tx): Promise<TxHash>;
|
|
52
|
+
viewTx(functionName: string, args: any[], to: AztecAddress, _from?: AztecAddress): Promise<import("@aztec/foundation/abi").DecodedReturn>;
|
|
53
|
+
getTxReceipt(txHash: TxHash): Promise<TxReceipt>;
|
|
54
|
+
getTx(txHash: TxHash): Promise<L2Tx | undefined>;
|
|
55
|
+
getBlockNumber(): Promise<number>;
|
|
56
|
+
getExtendedContractData(contractAddress: AztecAddress): Promise<ExtendedContractData | undefined>;
|
|
57
|
+
getContractData(contractAddress: AztecAddress): Promise<ContractData | undefined>;
|
|
58
|
+
getUnencryptedLogs(from: number, limit: number): Promise<L2BlockL2Logs[]>;
|
|
59
|
+
getNodeInfo(): Promise<NodeInfo>;
|
|
60
|
+
private patchPublicCallStackOrdering;
|
|
61
|
+
isGlobalStateSynchronized(): Promise<boolean>;
|
|
62
|
+
isAccountStateSynchronized(account: AztecAddress): Promise<boolean>;
|
|
63
|
+
getSyncStatus(): Promise<{
|
|
64
|
+
blocks: number;
|
|
65
|
+
notes: {
|
|
66
|
+
[k: string]: number;
|
|
67
|
+
};
|
|
68
|
+
}>;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=pxe_service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pxe_service.d.ts","sourceRoot":"","sources":["../../src/pxe_service/pxe_service.ts"],"names":[],"mappings":"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"}
|