@aztec/aztec-node 0.1.0-alpha46 → 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.
- package/.tsbuildinfo +1 -1
- package/dest/aztec-node/http-node.d.ts +15 -5
- package/dest/aztec-node/http-node.d.ts.map +1 -1
- package/dest/aztec-node/http-node.js +38 -8
- package/dest/aztec-node/http-node.test.js +37 -10
- package/dest/aztec-node/server.d.ts +15 -7
- package/dest/aztec-node/server.d.ts.map +1 -1
- package/dest/aztec-node/server.js +41 -12
- package/package.json +10 -10
- package/src/aztec-node/http-node.test.ts +42 -9
- package/src/aztec-node/http-node.ts +41 -7
- package/src/aztec-node/server.ts +55 -9
|
@@ -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
|
|
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(
|
|
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
|
-
*
|
|
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
|
|
109
|
+
* @returns The extended contract data or undefined if not found.
|
|
108
110
|
*/
|
|
109
|
-
async
|
|
110
|
-
return await this.contractDataSource.
|
|
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-
|
|
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-
|
|
9
|
-
"@aztec/circuits.js": "0.1.0-
|
|
10
|
-
"@aztec/foundation": "0.1.0-
|
|
11
|
-
"@aztec/l1-artifacts": "0.1.0-
|
|
12
|
-
"@aztec/merkle-tree": "0.1.0-
|
|
13
|
-
"@aztec/p2p": "0.1.0-
|
|
14
|
-
"@aztec/sequencer-client": "0.1.0-
|
|
15
|
-
"@aztec/types": "0.1.0-
|
|
16
|
-
"@aztec/world-state": "0.1.0-
|
|
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
|
-
|
|
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('
|
|
162
|
+
describe('getExtendedContractData', () => {
|
|
162
163
|
it('should fetch and return contract public data', async () => {
|
|
163
|
-
const
|
|
164
|
+
const extendedContractData = ExtendedContractData.random();
|
|
164
165
|
const response = {
|
|
165
|
-
contractData:
|
|
166
|
+
contractData: extendedContractData.toBuffer(),
|
|
166
167
|
};
|
|
167
168
|
|
|
168
169
|
setFetchMock(response);
|
|
169
170
|
|
|
170
|
-
const result = await httpNode.
|
|
171
|
+
const result = await httpNode.getExtendedContractData(extendedContractData.contractData.contractAddress);
|
|
171
172
|
|
|
172
173
|
expect(fetch).toHaveBeenCalledWith(
|
|
173
|
-
`${TEST_URL}contract-data-and-bytecode?address=${
|
|
174
|
+
`${TEST_URL}contract-data-and-bytecode?address=${extendedContractData.contractData.contractAddress.toString()}`,
|
|
174
175
|
);
|
|
175
|
-
expect(result).toEqual(
|
|
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.
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
|
126
|
+
* @returns The extended contract data or undefined if not found.
|
|
126
127
|
*/
|
|
127
|
-
async
|
|
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(
|
|
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
|
|
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
|
}
|
package/src/aztec-node/server.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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(
|
|
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
|
-
*
|
|
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
|
|
187
|
+
* @returns The extended contract data or undefined if not found.
|
|
177
188
|
*/
|
|
178
|
-
|
|
179
|
-
return await this.contractDataSource.
|
|
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
|