@aztec/aztec-node 0.1.0-alpha47 → 0.1.0-alpha48

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.
@@ -1,8 +1,8 @@
1
1
  import { Archiver } from '@aztec/archiver';
2
- import { CircuitsWasm, Fr, HistoricBlockData, } from '@aztec/circuits.js';
2
+ import { CircuitsWasm, Fr, GlobalVariables, HistoricBlockData, } from '@aztec/circuits.js';
3
3
  import { createDebugLogger } from '@aztec/foundation/log';
4
4
  import { InMemoryTxPool, createP2PClient } from '@aztec/p2p';
5
- import { SequencerClient } from '@aztec/sequencer-client';
5
+ import { PublicProcessorFactory, SequencerClient, getGlobalVariableBuilder, } from '@aztec/sequencer-client';
6
6
  import { LogType, MerkleTreeId, } from '@aztec/types';
7
7
  import { MerkleTrees, ServerWorldStateSynchroniser, computePublicDataTreeLeafIndex, getConfigEnvVars as getWorldStateConfig, } from '@aztec/world-state';
8
8
  import { default as levelup } from 'levelup';
@@ -12,7 +12,7 @@ export const createMemDown = () => memdown();
12
12
  * The aztec node.
13
13
  */
14
14
  export class AztecNodeService {
15
- constructor(p2pClient, blockSource, encryptedLogsSource, unencryptedLogsSource, contractDataSource, l1ToL2MessageSource, worldStateSynchroniser, sequencer, chainId, version, log = createDebugLogger('aztec:node')) {
15
+ constructor(p2pClient, blockSource, encryptedLogsSource, unencryptedLogsSource, contractDataSource, l1ToL2MessageSource, worldStateSynchroniser, sequencer, chainId, version, globalVariableBuilder, merkleTreesDb, log = createDebugLogger('aztec:node')) {
16
16
  this.p2pClient = p2pClient;
17
17
  this.blockSource = blockSource;
18
18
  this.encryptedLogsSource = encryptedLogsSource;
@@ -23,6 +23,8 @@ export class AztecNodeService {
23
23
  this.sequencer = sequencer;
24
24
  this.chainId = chainId;
25
25
  this.version = version;
26
+ this.globalVariableBuilder = globalVariableBuilder;
27
+ this.merkleTreesDb = merkleTreesDb;
26
28
  this.log = log;
27
29
  }
28
30
  /**
@@ -39,14 +41,15 @@ export class AztecNodeService {
39
41
  // create the tx pool and the p2p client, which will need the l2 block source
40
42
  const p2pClient = await createP2PClient(config, new InMemoryTxPool(), archiver);
41
43
  // now create the merkle trees and the world state syncher
42
- const merkleTreeDB = await MerkleTrees.new(levelup(createMemDown()), await CircuitsWasm.get());
44
+ const merkleTreesDb = levelup(createMemDown());
45
+ const merkleTrees = await MerkleTrees.new(merkleTreesDb, await CircuitsWasm.get());
43
46
  const worldStateConfig = getWorldStateConfig();
44
- const worldStateSynchroniser = new ServerWorldStateSynchroniser(merkleTreeDB, archiver, worldStateConfig);
47
+ const worldStateSynchroniser = new ServerWorldStateSynchroniser(merkleTrees, archiver, worldStateConfig);
45
48
  // start both and wait for them to sync from the block source
46
49
  await Promise.all([p2pClient.start(), worldStateSynchroniser.start()]);
47
50
  // now create the sequencer
48
51
  const sequencer = await SequencerClient.new(config, p2pClient, worldStateSynchroniser, archiver, archiver, archiver);
49
- return new AztecNodeService(p2pClient, archiver, archiver, archiver, archiver, archiver, worldStateSynchroniser, sequencer, config.chainId, config.version);
52
+ return new AztecNodeService(p2pClient, archiver, archiver, archiver, archiver, archiver, worldStateSynchroniser, sequencer, config.chainId, config.version, getGlobalVariableBuilder(config), merkleTreesDb);
50
53
  }
51
54
  /**
52
55
  * Method to determine if the node is ready to accept transactions.
@@ -101,13 +104,12 @@ export class AztecNodeService {
101
104
  return this.blockSource.getRollupAddress();
102
105
  }
103
106
  /**
104
- * Lookup the L2 contract data for this contract.
105
- * Contains the ethereum portal address and bytecode.
107
+ * Get the extended contract data for this contract.
106
108
  * @param contractAddress - The contract data address.
107
- * @returns The complete contract data including portal address & bytecode (if we didn't throw an error).
109
+ * @returns The extended contract data or undefined if not found.
108
110
  */
109
- async getContractDataAndBytecode(contractAddress) {
110
- return await this.contractDataSource.getContractDataAndBytecode(contractAddress);
111
+ async getExtendedContractData(contractAddress) {
112
+ return await this.contractDataSource.getExtendedContractData(contractAddress);
111
113
  }
112
114
  /**
113
115
  * Lookup the contract data for this contract.
@@ -137,6 +139,9 @@ export class AztecNodeService {
137
139
  this.log.info(`Received tx ${await tx.getTxHash()}`);
138
140
  await this.p2pClient.sendTx(tx);
139
141
  }
142
+ getTx(txHash) {
143
+ return this.blockSource.getL2Tx(txHash);
144
+ }
140
145
  /**
141
146
  * Method to stop the aztec node.
142
147
  */
@@ -265,6 +270,30 @@ export class AztecNodeService {
265
270
  const [roots, globalsHash] = await Promise.all([this.getTreeRoots(), committedDb.getLatestGlobalVariablesHash()]);
266
271
  return new HistoricBlockData(roots[MerkleTreeId.PRIVATE_DATA_TREE], roots[MerkleTreeId.NULLIFIER_TREE], roots[MerkleTreeId.CONTRACT_TREE], roots[MerkleTreeId.L1_TO_L2_MESSAGES_TREE], roots[MerkleTreeId.BLOCKS_TREE], Fr.ZERO, roots[MerkleTreeId.PUBLIC_DATA_TREE], globalsHash);
267
272
  }
273
+ /**
274
+ * Simulates the public part of a transaction with the current state.
275
+ * @param tx - The transaction to simulate.
276
+ **/
277
+ async simulatePublicCalls(tx) {
278
+ this.log.info(`Simulating tx ${await tx.getTxHash()}`);
279
+ const blockNumber = (await this.blockSource.getBlockNumber()) + 1;
280
+ const newGlobalVariables = await this.globalVariableBuilder.buildGlobalVariables(new Fr(blockNumber));
281
+ const prevGlobalVariables = (await this.blockSource.getL2Block(-1))?.globalVariables ?? GlobalVariables.empty();
282
+ // Instantiate merkle trees so uncommited updates by this simulation are local to it.
283
+ // TODO we should be able to remove this after https://github.com/AztecProtocol/aztec-packages/issues/1869
284
+ // So simulation of public functions doesn't affect the merkle trees.
285
+ const merkleTrees = new MerkleTrees(this.merkleTreesDb, this.log);
286
+ await merkleTrees.init(await CircuitsWasm.get(), {
287
+ globalVariables: prevGlobalVariables,
288
+ });
289
+ const publicProcessorFactory = new PublicProcessorFactory(merkleTrees.asLatest(), this.contractDataSource, this.l1ToL2MessageSource);
290
+ const processor = await publicProcessorFactory.create(prevGlobalVariables, newGlobalVariables);
291
+ const [, failedTxs] = await processor.process([tx]);
292
+ if (failedTxs.length) {
293
+ throw failedTxs[0].error;
294
+ }
295
+ this.log.info(`Simulated tx ${await tx.getTxHash()} succeeds`);
296
+ }
268
297
  /**
269
298
  * Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
270
299
  * @returns An instance of a committed MerkleTreeOperations
@@ -288,4 +317,4 @@ export class AztecNodeService {
288
317
  await this.worldStateSynchroniser.syncImmediate(blockSourceHeight);
289
318
  }
290
319
  }
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsWUFBWSxFQUVaLEVBQUUsRUFDRixpQkFBaUIsR0FHbEIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFPLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQVdMLE9BQU8sRUFDUCxZQUFZLEdBSWIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFHNUIsOEJBQThCLEVBQzlCLGdCQUFnQixJQUFJLG1CQUFtQixHQUN4QyxNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sRUFBVyxPQUFPLElBQUksT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBSXRELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBRSxPQUFlLEVBQXVCLENBQUM7QUFFM0U7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQ1ksU0FBYyxFQUNkLFdBQTBCLEVBQzFCLG1CQUFpQyxFQUNqQyxxQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxzQkFBOEMsRUFDOUMsU0FBMEIsRUFDMUIsT0FBZSxFQUNmLE9BQWUsRUFDakIsTUFBTSxpQkFBaUIsQ0FBQyxZQUFZLENBQUM7UUFWbkMsY0FBUyxHQUFULFNBQVMsQ0FBSztRQUNkLGdCQUFX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
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsWUFBWSxFQUVaLEVBQUUsRUFDRixlQUFlLEVBQ2YsaUJBQWlCLEdBR2xCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBTyxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEUsT0FBTyxFQUVMLHNCQUFzQixFQUN0QixlQUFlLEVBQ2Ysd0JBQXdCLEdBQ3pCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQVlMLE9BQU8sRUFDUCxZQUFZLEdBSWIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFHNUIsOEJBQThCLEVBQzlCLGdCQUFnQixJQUFJLG1CQUFtQixHQUN4QyxNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sRUFBVyxPQUFPLElBQUksT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBSXRELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBRSxPQUFlLEVBQXVCLENBQUM7QUFFM0U7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQ1ksU0FBYyxFQUNkLFdBQTBCLEVBQzFCLG1CQUFpQyxFQUNqQyxxQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxzQkFBOEMsRUFDOUMsU0FBMEIsRUFDMUIsT0FBZSxFQUNmLE9BQWUsRUFDZixxQkFBNEMsRUFDNUMsYUFBOEIsRUFDaEMsTUFB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
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@aztec/aztec-node",
3
- "version": "0.1.0-alpha47",
3
+ "version": "0.1.0-alpha48",
4
4
  "exports": "./dest/index.js",
5
5
  "main": "dest/index.js",
6
6
  "type": "module",
7
7
  "dependencies": {
8
- "@aztec/archiver": "0.1.0-alpha47",
9
- "@aztec/circuits.js": "0.1.0-alpha47",
10
- "@aztec/foundation": "0.1.0-alpha47",
11
- "@aztec/l1-artifacts": "0.1.0-alpha47",
12
- "@aztec/merkle-tree": "0.1.0-alpha47",
13
- "@aztec/p2p": "0.1.0-alpha47",
14
- "@aztec/sequencer-client": "0.1.0-alpha47",
15
- "@aztec/types": "0.1.0-alpha47",
16
- "@aztec/world-state": "0.1.0-alpha47",
8
+ "@aztec/archiver": "0.1.0-alpha48",
9
+ "@aztec/circuits.js": "0.1.0-alpha48",
10
+ "@aztec/foundation": "0.1.0-alpha48",
11
+ "@aztec/l1-artifacts": "0.1.0-alpha48",
12
+ "@aztec/merkle-tree": "0.1.0-alpha48",
13
+ "@aztec/p2p": "0.1.0-alpha48",
14
+ "@aztec/sequencer-client": "0.1.0-alpha48",
15
+ "@aztec/types": "0.1.0-alpha48",
16
+ "@aztec/world-state": "0.1.0-alpha48",
17
17
  "tslib": "^2.4.0"
18
18
  }
19
19
  }
@@ -1,15 +1,16 @@
1
- import { AztecAddress, CircuitsWasm, EthAddress, Fr, HistoricBlockData } from '@aztec/circuits.js';
1
+ import { AztecAddress, CircuitsWasm, EthAddress, Fr, FunctionSelector, HistoricBlockData } from '@aztec/circuits.js';
2
2
  import { randomBytes } from '@aztec/foundation/crypto';
3
3
  import { Pedersen } from '@aztec/merkle-tree';
4
4
  import {
5
5
  ContractData,
6
- ContractDataAndBytecode,
6
+ ExtendedContractData,
7
7
  L1ToL2Message,
8
8
  L2Block,
9
9
  L2BlockL2Logs,
10
10
  LogType,
11
11
  MerkleTreeId,
12
12
  SiblingPath,
13
+ SimulationError,
13
14
  TxHash,
14
15
  mockTx,
15
16
  } from '@aztec/types';
@@ -158,21 +159,21 @@ describe('HttpNode', () => {
158
159
  });
159
160
  });
160
161
 
161
- describe('getContractDataAndBytecode', () => {
162
+ describe('getExtendedContractData', () => {
162
163
  it('should fetch and return contract public data', async () => {
163
- const contractDataAndBytecode = ContractDataAndBytecode.random();
164
+ const extendedContractData = ExtendedContractData.random();
164
165
  const response = {
165
- contractData: contractDataAndBytecode.toBuffer(),
166
+ contractData: extendedContractData.toBuffer(),
166
167
  };
167
168
 
168
169
  setFetchMock(response);
169
170
 
170
- const result = await httpNode.getContractDataAndBytecode(contractDataAndBytecode.contractData.contractAddress);
171
+ const result = await httpNode.getExtendedContractData(extendedContractData.contractData.contractAddress);
171
172
 
172
173
  expect(fetch).toHaveBeenCalledWith(
173
- `${TEST_URL}contract-data-and-bytecode?address=${contractDataAndBytecode.contractData.contractAddress.toString()}`,
174
+ `${TEST_URL}contract-data-and-bytecode?address=${extendedContractData.contractData.contractAddress.toString()}`,
174
175
  );
175
- expect(result).toEqual(contractDataAndBytecode);
176
+ expect(result).toEqual(extendedContractData);
176
177
  });
177
178
 
178
179
  it('should return undefined if contract data is not available', async () => {
@@ -183,7 +184,7 @@ describe('HttpNode', () => {
183
184
 
184
185
  const randomAddress = AztecAddress.random();
185
186
 
186
- const result = await httpNode.getContractDataAndBytecode(randomAddress);
187
+ const result = await httpNode.getExtendedContractData(randomAddress);
187
188
 
188
189
  expect(fetch).toHaveBeenCalledWith(`${TEST_URL}contract-data-and-bytecode?address=${randomAddress.toString()}`);
189
190
  expect(result).toEqual(undefined);
@@ -482,4 +483,36 @@ describe('HttpNode', () => {
482
483
  expect(result).toEqual(blockData);
483
484
  });
484
485
  });
486
+
487
+ describe('simulatePublicCalls', () => {
488
+ it('should fetch a successful simulation response', async () => {
489
+ const tx = mockTx();
490
+ const response = {};
491
+ setFetchMock(response);
492
+
493
+ await httpNode.simulatePublicCalls(tx);
494
+
495
+ const init: RequestInit = {
496
+ method: 'POST',
497
+ body: tx.toBuffer(),
498
+ };
499
+ const call = (fetch as jest.Mock).mock.calls[0] as any[];
500
+ expect(call[0].href).toBe(`${TEST_URL}simulate-tx`);
501
+ expect(call[1]).toStrictEqual(init);
502
+ });
503
+
504
+ it('should fetch a simulation error', async () => {
505
+ const tx = mockTx();
506
+ const simulationError = new SimulationError('Failing function', {
507
+ contractAddress: AztecAddress.ZERO,
508
+ functionSelector: FunctionSelector.empty(),
509
+ });
510
+ const response = {
511
+ simulationError: simulationError.toJSON(),
512
+ };
513
+ setFetchMock(response);
514
+
515
+ await expect(httpNode.simulatePublicCalls(tx)).rejects.toThrow(simulationError);
516
+ });
517
+ });
485
518
  });
@@ -11,14 +11,16 @@ import { DebugLogger, createDebugLogger } from '@aztec/foundation/log';
11
11
  import {
12
12
  AztecNode,
13
13
  ContractData,
14
- ContractDataAndBytecode,
14
+ ExtendedContractData,
15
15
  L1ToL2Message,
16
16
  L1ToL2MessageAndIndex,
17
17
  L2Block,
18
18
  L2BlockL2Logs,
19
+ L2Tx,
19
20
  LogType,
20
21
  MerkleTreeId,
21
22
  SiblingPath,
23
+ SimulationError,
22
24
  Tx,
23
25
  TxHash,
24
26
  } from '@aztec/types';
@@ -119,12 +121,11 @@ export class HttpNode implements AztecNode {
119
121
  }
120
122
 
121
123
  /**
122
- * Lookup the contract data for this contract.
123
- * Contains the ethereum portal address and bytecode.
124
+ * Get the extended contract data for this contract.
124
125
  * @param contractAddress - The contract data address.
125
- * @returns The complete contract data including portal address & bytecode (if we didn't throw an error).
126
+ * @returns The extended contract data or undefined if not found.
126
127
  */
127
- async getContractDataAndBytecode(contractAddress: AztecAddress): Promise<ContractDataAndBytecode | undefined> {
128
+ async getExtendedContractData(contractAddress: AztecAddress): Promise<ExtendedContractData | undefined> {
128
129
  const url = new URL(`${this.baseUrl}/contract-data-and-bytecode`);
129
130
  url.searchParams.append('address', contractAddress.toString());
130
131
  const response = await (await fetch(url.toString())).json();
@@ -132,7 +133,7 @@ export class HttpNode implements AztecNode {
132
133
  return undefined;
133
134
  }
134
135
  const contract = response.contractData as string;
135
- return Promise.resolve(ContractDataAndBytecode.fromBuffer(Buffer.from(contract, 'hex')));
136
+ return Promise.resolve(ExtendedContractData.fromBuffer(Buffer.from(contract, 'hex')));
136
137
  }
137
138
 
138
139
  /**
@@ -187,6 +188,24 @@ export class HttpNode implements AztecNode {
187
188
  await fetch(url, init);
188
189
  }
189
190
 
191
+ /**
192
+ * Gets an l2 tx.
193
+ * @param txHash - The txHash of the l2 tx.
194
+ * @returns The requested L2 tx.
195
+ */
196
+ async getTx(txHash: TxHash): Promise<L2Tx | undefined> {
197
+ const url = new URL(`${this.baseUrl}/get-tx`);
198
+ url.searchParams.append('hash', txHash.toString());
199
+ const response = await fetch(url.toString());
200
+ if (response.status === 404) {
201
+ this.log.info(`Tx ${txHash.toString()} not found`);
202
+ return undefined;
203
+ }
204
+ const txBuffer = Buffer.from(await response.arrayBuffer());
205
+ const tx = L2Tx.fromBuffer(txBuffer);
206
+ return Promise.resolve(tx);
207
+ }
208
+
190
209
  /**
191
210
  * Method to retrieve pending txs.
192
211
  * @returns - The pending txs.
@@ -208,7 +227,7 @@ export class HttpNode implements AztecNode {
208
227
  this.log.info(`Tx ${txHash.toString()} not found`);
209
228
  return undefined;
210
229
  }
211
- const txBuffer = Buffer.from(await (await fetch(url.toString())).arrayBuffer());
230
+ const txBuffer = Buffer.from(await response.arrayBuffer());
212
231
  const tx = Tx.fromBuffer(txBuffer);
213
232
  return Promise.resolve(tx);
214
233
  }
@@ -351,4 +370,19 @@ export class HttpNode implements AztecNode {
351
370
  const response = await (await fetch(url.toString())).json();
352
371
  return response.blockData;
353
372
  }
373
+
374
+ /**
375
+ * Simulates the public part of a transaction with the current state.
376
+ * @param tx - The transaction to simulate.
377
+ **/
378
+ public async simulatePublicCalls(tx: Tx) {
379
+ const url = new URL(`${this.baseUrl}/simulate-tx`);
380
+ const init: RequestInit = {};
381
+ init['method'] = 'POST';
382
+ init['body'] = tx.toBuffer();
383
+ const response = await (await fetch(url, init)).json();
384
+ if (response.simulationError) {
385
+ throw SimulationError.fromJSON(response.simulationError);
386
+ }
387
+ }
354
388
  }
@@ -4,6 +4,7 @@ import {
4
4
  CircuitsWasm,
5
5
  EthAddress,
6
6
  Fr,
7
+ GlobalVariables,
7
8
  HistoricBlockData,
8
9
  L1_TO_L2_MSG_TREE_HEIGHT,
9
10
  PRIVATE_DATA_TREE_HEIGHT,
@@ -11,18 +12,24 @@ import {
11
12
  import { AztecAddress } from '@aztec/foundation/aztec-address';
12
13
  import { createDebugLogger } from '@aztec/foundation/log';
13
14
  import { InMemoryTxPool, P2P, createP2PClient } from '@aztec/p2p';
14
- import { SequencerClient } from '@aztec/sequencer-client';
15
+ import {
16
+ GlobalVariableBuilder,
17
+ PublicProcessorFactory,
18
+ SequencerClient,
19
+ getGlobalVariableBuilder,
20
+ } from '@aztec/sequencer-client';
15
21
  import {
16
22
  AztecNode,
17
23
  ContractData,
18
- ContractDataAndBytecode,
19
24
  ContractDataSource,
25
+ ExtendedContractData,
20
26
  L1ToL2MessageAndIndex,
21
27
  L1ToL2MessageSource,
22
28
  L2Block,
23
29
  L2BlockL2Logs,
24
30
  L2BlockSource,
25
31
  L2LogsSource,
32
+ L2Tx,
26
33
  LogType,
27
34
  MerkleTreeId,
28
35
  SiblingPath,
@@ -60,6 +67,8 @@ export class AztecNodeService implements AztecNode {
60
67
  protected sequencer: SequencerClient,
61
68
  protected chainId: number,
62
69
  protected version: number,
70
+ protected globalVariableBuilder: GlobalVariableBuilder,
71
+ protected merkleTreesDb: levelup.LevelUp,
63
72
  private log = createDebugLogger('aztec:node'),
64
73
  ) {}
65
74
 
@@ -80,9 +89,10 @@ export class AztecNodeService implements AztecNode {
80
89
  const p2pClient = await createP2PClient(config, new InMemoryTxPool(), archiver);
81
90
 
82
91
  // now create the merkle trees and the world state syncher
83
- const merkleTreeDB = await MerkleTrees.new(levelup(createMemDown()), await CircuitsWasm.get());
92
+ const merkleTreesDb = levelup(createMemDown());
93
+ const merkleTrees = await MerkleTrees.new(merkleTreesDb, await CircuitsWasm.get());
84
94
  const worldStateConfig: WorldStateConfig = getWorldStateConfig();
85
- const worldStateSynchroniser = new ServerWorldStateSynchroniser(merkleTreeDB, archiver, worldStateConfig);
95
+ const worldStateSynchroniser = new ServerWorldStateSynchroniser(merkleTrees, archiver, worldStateConfig);
86
96
 
87
97
  // start both and wait for them to sync from the block source
88
98
  await Promise.all([p2pClient.start(), worldStateSynchroniser.start()]);
@@ -107,6 +117,8 @@ export class AztecNodeService implements AztecNode {
107
117
  sequencer,
108
118
  config.chainId,
109
119
  config.version,
120
+ getGlobalVariableBuilder(config),
121
+ merkleTreesDb,
110
122
  );
111
123
  }
112
124
 
@@ -170,13 +182,12 @@ export class AztecNodeService implements AztecNode {
170
182
  }
171
183
 
172
184
  /**
173
- * Lookup the L2 contract data for this contract.
174
- * Contains the ethereum portal address and bytecode.
185
+ * Get the extended contract data for this contract.
175
186
  * @param contractAddress - The contract data address.
176
- * @returns The complete contract data including portal address & bytecode (if we didn't throw an error).
187
+ * @returns The extended contract data or undefined if not found.
177
188
  */
178
- public async getContractDataAndBytecode(contractAddress: AztecAddress): Promise<ContractDataAndBytecode | undefined> {
179
- return await this.contractDataSource.getContractDataAndBytecode(contractAddress);
189
+ async getExtendedContractData(contractAddress: AztecAddress): Promise<ExtendedContractData | undefined> {
190
+ return await this.contractDataSource.getExtendedContractData(contractAddress);
180
191
  }
181
192
 
182
193
  /**
@@ -210,6 +221,10 @@ export class AztecNodeService implements AztecNode {
210
221
  await this.p2pClient!.sendTx(tx);
211
222
  }
212
223
 
224
+ public getTx(txHash: TxHash): Promise<L2Tx | undefined> {
225
+ return this.blockSource.getL2Tx(txHash);
226
+ }
227
+
213
228
  /**
214
229
  * Method to stop the aztec node.
215
230
  */
@@ -363,6 +378,37 @@ export class AztecNodeService implements AztecNode {
363
378
  );
364
379
  }
365
380
 
381
+ /**
382
+ * Simulates the public part of a transaction with the current state.
383
+ * @param tx - The transaction to simulate.
384
+ **/
385
+ public async simulatePublicCalls(tx: Tx) {
386
+ this.log.info(`Simulating tx ${await tx.getTxHash()}`);
387
+ const blockNumber = (await this.blockSource.getBlockNumber()) + 1;
388
+ const newGlobalVariables = await this.globalVariableBuilder.buildGlobalVariables(new Fr(blockNumber));
389
+ const prevGlobalVariables = (await this.blockSource.getL2Block(-1))?.globalVariables ?? GlobalVariables.empty();
390
+
391
+ // Instantiate merkle trees so uncommited updates by this simulation are local to it.
392
+ // TODO we should be able to remove this after https://github.com/AztecProtocol/aztec-packages/issues/1869
393
+ // So simulation of public functions doesn't affect the merkle trees.
394
+ const merkleTrees = new MerkleTrees(this.merkleTreesDb, this.log);
395
+ await merkleTrees.init(await CircuitsWasm.get(), {
396
+ globalVariables: prevGlobalVariables,
397
+ });
398
+
399
+ const publicProcessorFactory = new PublicProcessorFactory(
400
+ merkleTrees.asLatest(),
401
+ this.contractDataSource,
402
+ this.l1ToL2MessageSource,
403
+ );
404
+ const processor = await publicProcessorFactory.create(prevGlobalVariables, newGlobalVariables);
405
+ const [, failedTxs] = await processor.process([tx]);
406
+ if (failedTxs.length) {
407
+ throw failedTxs[0].error;
408
+ }
409
+ this.log.info(`Simulated tx ${await tx.getTxHash()} succeeds`);
410
+ }
411
+
366
412
  /**
367
413
  * Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
368
414
  * @returns An instance of a committed MerkleTreeOperations