@aztec/aztec-node 0.41.0 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/aztec-node/config.d.ts +7 -0
- package/dest/aztec-node/config.d.ts.map +1 -1
- package/dest/aztec-node/config.js +12 -1
- package/dest/aztec-node/http_rpc_server.js +3 -3
- package/dest/aztec-node/server.d.ts +16 -5
- package/dest/aztec-node/server.d.ts.map +1 -1
- package/dest/aztec-node/server.js +96 -18
- package/dest/aztec-node/tx_validator/tx_metadata_validator.d.ts +8 -0
- package/dest/aztec-node/tx_validator/tx_metadata_validator.d.ts.map +1 -0
- package/dest/aztec-node/tx_validator/tx_metadata_validator.js +35 -0
- package/dest/aztec-node/tx_validator/tx_proof_validator.d.ts +9 -0
- package/dest/aztec-node/tx_validator/tx_proof_validator.d.ts.map +1 -0
- package/dest/aztec-node/tx_validator/tx_proof_validator.js +29 -0
- package/package.json +17 -15
- package/src/aztec-node/config.ts +13 -0
- package/src/aztec-node/http_rpc_server.ts +2 -2
- package/src/aztec-node/server.ts +148 -22
- package/src/aztec-node/tx_validator/tx_metadata_validator.ts +40 -0
- package/src/aztec-node/tx_validator/tx_proof_validator.ts +28 -0
|
@@ -18,4 +18,11 @@ export type AztecNodeConfig = ArchiverConfig & SequencerClientConfig & ProverCli
|
|
|
18
18
|
* @returns A valid aztec node config.
|
|
19
19
|
*/
|
|
20
20
|
export declare function getConfigEnvVars(): AztecNodeConfig;
|
|
21
|
+
/**
|
|
22
|
+
* Returns package name and version.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getPackageInfo(): {
|
|
25
|
+
version: any;
|
|
26
|
+
name: any;
|
|
27
|
+
};
|
|
21
28
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/aztec-node/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAuC,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,KAAK,kBAAkB,EAAoB,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,KAAK,qBAAqB,EAAwC,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/aztec-node/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAuC,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,KAAK,kBAAkB,EAAoB,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,KAAK,qBAAqB,EAAwC,MAAM,yBAAyB,CAAC;AAO3G;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,GAC1C,qBAAqB,GACrB,kBAAkB,GAClB,SAAS,GAAG;IACV,uDAAuD;IACvD,gBAAgB,EAAE,OAAO,CAAC;IAE1B,oDAAoD;IACpD,aAAa,EAAE,OAAO,CAAC;IAEvB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEJ;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,CAelD;AAED;;GAEG;AACH,wBAAgB,cAAc;;;EAI7B"}
|
|
@@ -3,6 +3,9 @@ import { getP2PConfigEnvVars } from '@aztec/p2p';
|
|
|
3
3
|
import { getProverEnvVars } from '@aztec/prover-client';
|
|
4
4
|
import { getConfigEnvVars as getSequencerVars } from '@aztec/sequencer-client';
|
|
5
5
|
import { getConfigEnvVars as getWorldStateVars } from '@aztec/world-state';
|
|
6
|
+
import { readFileSync } from 'fs';
|
|
7
|
+
import { dirname, resolve } from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
6
9
|
/**
|
|
7
10
|
* Returns the config of the aztec node from environment variables with reasonable defaults.
|
|
8
11
|
* @returns A valid aztec node config.
|
|
@@ -21,4 +24,12 @@ export function getConfigEnvVars() {
|
|
|
21
24
|
};
|
|
22
25
|
return allEnvVars;
|
|
23
26
|
}
|
|
24
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Returns package name and version.
|
|
29
|
+
*/
|
|
30
|
+
export function getPackageInfo() {
|
|
31
|
+
const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../package.json');
|
|
32
|
+
const { version, name } = JSON.parse(readFileSync(packageJsonPath).toString());
|
|
33
|
+
return { version, name };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBdUIsZ0JBQWdCLElBQUksZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0YsT0FBTyxFQUFrQixtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNqRSxPQUFPLEVBQTJCLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakYsT0FBTyxFQUE4QixnQkFBZ0IsSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNHLE9BQU8sRUFBRSxnQkFBZ0IsSUFBSSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQW1CcEM7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQjtJQUM5QixNQUFNLEVBQUUsWUFBWSxFQUFFLGVBQWUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUV6RSxNQUFNLFVBQVUsR0FBb0I7UUFDbEMsR0FBRyxnQkFBZ0IsRUFBRTtRQUNyQixHQUFHLGVBQWUsRUFBRTtRQUNwQixHQUFHLG1CQUFtQixFQUFFO1FBQ3hCLEdBQUcsaUJBQWlCLEVBQUU7UUFDdEIsR0FBRyxnQkFBZ0IsRUFBRTtRQUNyQixnQkFBZ0IsRUFBRSxDQUFDLENBQUMsWUFBWTtRQUNoQyxXQUFXLEVBQUUsWUFBWTtRQUN6QixhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztLQUN2RCxDQUFDO0lBRUYsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGNBQWM7SUFDNUIsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDL0YsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDM0IsQ0FBQyJ9
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EncryptedNoteL2BlockL2Logs, ExtendedUnencryptedL2Log, L2Block, LogId, NullifierMembershipWitness, PublicDataWitness, PublicSimulationOutput, SiblingPath, Tx, TxEffect, TxHash, TxReceipt, UnencryptedL2BlockL2Logs, } from '@aztec/circuit-types';
|
|
2
2
|
import { FunctionSelector, Header } from '@aztec/circuits.js';
|
|
3
3
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
4
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
@@ -27,7 +27,7 @@ export function createAztecNodeRpcServer(node) {
|
|
|
27
27
|
PublicSimulationOutput,
|
|
28
28
|
Tx,
|
|
29
29
|
TxReceipt,
|
|
30
|
-
|
|
30
|
+
EncryptedNoteL2BlockL2Logs,
|
|
31
31
|
UnencryptedL2BlockL2Logs,
|
|
32
32
|
NullifierMembershipWitness,
|
|
33
33
|
},
|
|
@@ -35,4 +35,4 @@ export function createAztecNodeRpcServer(node) {
|
|
|
35
35
|
['start', 'stop']);
|
|
36
36
|
return rpc;
|
|
37
37
|
}
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cF9ycGNfc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvaHR0cF9ycGNfc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCwwQkFBMEIsRUFDMUIsd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxLQUFLLEVBQ0wsMEJBQTBCLEVBQzFCLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsV0FBVyxFQUNYLEVBQUUsRUFDRixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCx3QkFBd0IsR0FDekIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRWxFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsSUFBZTtJQUN0RCxNQUFNLEdBQUcsR0FBRyxJQUFJLGFBQWEsQ0FDM0IsSUFBSSxFQUNKO1FBQ0UsWUFBWTtRQUNaLFVBQVU7UUFDVix3QkFBd0I7UUFDeEIsRUFBRTtRQUNGLGdCQUFnQjtRQUNoQixNQUFNO1FBQ04sT0FBTztRQUNQLFFBQVE7UUFDUixLQUFLO1FBQ0wsTUFBTTtRQUNOLGlCQUFpQjtRQUNqQixXQUFXO0tBQ1osRUFDRDtRQUNFLHNCQUFzQjtRQUN0QixFQUFFO1FBQ0YsU0FBUztRQUNULDBCQUEwQjtRQUMxQix3QkFBd0I7UUFDeEIsMEJBQTBCO0tBQzNCO0lBQ0Qsc0RBQXNEO0lBQ3RELENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUNsQixDQUFDO0lBQ0YsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIn0=
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { type AztecNode, type FromLogType, type GetUnencryptedLogsResponse, type L1ToL2MessageSource, type L2Block, type L2BlockL2Logs, type L2BlockNumber, type L2BlockSource, type L2LogsSource, type LogFilter, LogType, MerkleTreeId, NullifierMembershipWitness, type ProverClient, type ProverConfig, PublicDataWitness, PublicSimulationOutput, type SequencerConfig,
|
|
1
|
+
import { type AztecNode, type FromLogType, type GetUnencryptedLogsResponse, type L1ToL2MessageSource, type L2Block, type L2BlockL2Logs, type L2BlockNumber, type L2BlockSource, type L2LogsSource, type LogFilter, LogType, MerkleTreeId, NullifierMembershipWitness, type ProverClient, type ProverConfig, PublicDataWitness, PublicSimulationOutput, type SequencerConfig, SiblingPath, type Tx, type TxEffect, type TxHash, TxReceipt, type TxValidator } from '@aztec/circuit-types';
|
|
2
2
|
import { type ARCHIVE_HEIGHT, Fr, type Header, type L1_TO_L2_MSG_TREE_HEIGHT, type NOTE_HASH_TREE_HEIGHT, type NULLIFIER_TREE_HEIGHT, type PUBLIC_DATA_TREE_HEIGHT } from '@aztec/circuits.js';
|
|
3
3
|
import { type L1ContractAddresses } from '@aztec/ethereum';
|
|
4
|
+
import { type ContractArtifact } from '@aztec/foundation/abi';
|
|
4
5
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
5
6
|
import { type AztecKVStore } from '@aztec/kv-store';
|
|
6
7
|
import { type P2P } from '@aztec/p2p';
|
|
7
8
|
import { type GlobalVariableBuilder, SequencerClient } from '@aztec/sequencer-client';
|
|
8
|
-
import { type ContractClassPublic, type ContractDataSource, type ContractInstanceWithAddress } from '@aztec/types/contracts';
|
|
9
|
+
import { type ContractClassPublic, type ContractDataSource, type ContractInstanceWithAddress, type ProtocolContractAddresses } from '@aztec/types/contracts';
|
|
9
10
|
import { type WorldStateSynchronizer } from '@aztec/world-state';
|
|
10
11
|
import { type AztecNodeConfig } from './config.js';
|
|
11
12
|
/**
|
|
@@ -13,7 +14,7 @@ import { type AztecNodeConfig } from './config.js';
|
|
|
13
14
|
*/
|
|
14
15
|
export declare class AztecNodeService implements AztecNode {
|
|
15
16
|
#private;
|
|
16
|
-
protected
|
|
17
|
+
protected config: AztecNodeConfig;
|
|
17
18
|
protected readonly p2pClient: P2P;
|
|
18
19
|
protected readonly blockSource: L2BlockSource;
|
|
19
20
|
protected readonly encryptedLogsSource: L2LogsSource;
|
|
@@ -27,8 +28,10 @@ export declare class AztecNodeService implements AztecNode {
|
|
|
27
28
|
protected readonly globalVariableBuilder: GlobalVariableBuilder;
|
|
28
29
|
protected readonly merkleTreesDb: AztecKVStore;
|
|
29
30
|
private readonly prover;
|
|
31
|
+
private txValidator;
|
|
30
32
|
private log;
|
|
31
|
-
|
|
33
|
+
private packageVersion;
|
|
34
|
+
constructor(config: AztecNodeConfig, p2pClient: P2P, blockSource: L2BlockSource, encryptedLogsSource: L2LogsSource, unencryptedLogsSource: L2LogsSource, contractDataSource: ContractDataSource, l1ToL2MessageSource: L1ToL2MessageSource, worldStateSynchronizer: WorldStateSynchronizer, sequencer: SequencerClient | undefined, chainId: number, version: number, globalVariableBuilder: GlobalVariableBuilder, merkleTreesDb: AztecKVStore, prover: ProverClient | undefined, txValidator: TxValidator, log?: import("@aztec/foundation/log").Logger);
|
|
32
35
|
/**
|
|
33
36
|
* initializes the Aztec Node, wait for component to sync.
|
|
34
37
|
* @param config - The configuration to be used by the aztec node.
|
|
@@ -40,7 +43,7 @@ export declare class AztecNodeService implements AztecNode {
|
|
|
40
43
|
* @returns The sequencer client instance.
|
|
41
44
|
*/
|
|
42
45
|
getSequencer(): SequencerClient | undefined;
|
|
43
|
-
getProver(): ProverClient;
|
|
46
|
+
getProver(): ProverClient | undefined;
|
|
44
47
|
/**
|
|
45
48
|
* Method to return the currently deployed L1 contract addresses.
|
|
46
49
|
* @returns - The currently deployed L1 contract addresses.
|
|
@@ -69,6 +72,11 @@ export declare class AztecNodeService implements AztecNode {
|
|
|
69
72
|
* @returns The block number.
|
|
70
73
|
*/
|
|
71
74
|
getBlockNumber(): Promise<number>;
|
|
75
|
+
/**
|
|
76
|
+
* Method to fetch the version of the package.
|
|
77
|
+
* @returns The node package version
|
|
78
|
+
*/
|
|
79
|
+
getNodeVersion(): Promise<string>;
|
|
72
80
|
/**
|
|
73
81
|
* Method to fetch the version of the rollup the node is connected to.
|
|
74
82
|
* @returns The rollup version.
|
|
@@ -162,6 +170,7 @@ export declare class AztecNodeService implements AztecNode {
|
|
|
162
170
|
* @remarks This tree is considered ephemeral because it is created on-demand by: taking all the l2ToL1 messages
|
|
163
171
|
* in a single block, and then using them to make a variable depth append-only tree with these messages as leaves.
|
|
164
172
|
* The tree is discarded immediately after calculating what we need from it.
|
|
173
|
+
* TODO: Handle the case where two messages in the same tx have the same hash.
|
|
165
174
|
* @param blockNumber - The block number at which to get the data.
|
|
166
175
|
* @param l2ToL1Message - The l2ToL1Message get the index / sibling path for.
|
|
167
176
|
* @returns A tuple of the index and the sibling path of the L2ToL1Message.
|
|
@@ -226,5 +235,7 @@ export declare class AztecNodeService implements AztecNode {
|
|
|
226
235
|
**/
|
|
227
236
|
simulatePublicCalls(tx: Tx): Promise<PublicSimulationOutput>;
|
|
228
237
|
setConfig(config: Partial<SequencerConfig & ProverConfig>): Promise<void>;
|
|
238
|
+
getProtocolContractAddresses(): Promise<ProtocolContractAddresses>;
|
|
239
|
+
addContractArtifact(address: AztecAddress, artifact: ContractArtifact): Promise<void>;
|
|
229
240
|
}
|
|
230
241
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,37 @@
|
|
|
1
1
|
var _AztecNodeService_instances, _AztecNodeService_getWorldState, _AztecNodeService_syncWorldState;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
3
|
import { Archiver, KVArchiverDataStore, createArchiverClient } from '@aztec/archiver';
|
|
4
|
-
import {
|
|
4
|
+
import { BBCircuitVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
|
|
5
|
+
import { AggregateTxValidator, LogType, MerkleTreeId, NullifierMembershipWitness, PublicDataWitness, PublicSimulationOutput, SiblingPath, TxReceipt, TxStatus, partitionReverts, } from '@aztec/circuit-types';
|
|
5
6
|
import { EthAddress, Fr, INITIAL_L2_BLOCK_NUM, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, } from '@aztec/circuits.js';
|
|
6
7
|
import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
|
|
7
8
|
import { createEthereumChain } from '@aztec/ethereum';
|
|
8
9
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
10
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
11
|
+
import { sha256Trunc } from '@aztec/foundation/crypto';
|
|
9
12
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
10
13
|
import { AztecLmdbStore } from '@aztec/kv-store/lmdb';
|
|
11
14
|
import { initStoreForRollup, openTmpStore } from '@aztec/kv-store/utils';
|
|
12
15
|
import { SHA256Trunc, StandardTree } from '@aztec/merkle-tree';
|
|
13
16
|
import { AztecKVTxPool, createP2PClient } from '@aztec/p2p';
|
|
14
|
-
import {
|
|
17
|
+
import { getCanonicalClassRegisterer } from '@aztec/protocol-contracts/class-registerer';
|
|
18
|
+
import { getCanonicalGasToken } from '@aztec/protocol-contracts/gas-token';
|
|
19
|
+
import { getCanonicalInstanceDeployer } from '@aztec/protocol-contracts/instance-deployer';
|
|
20
|
+
import { getCanonicalKeyRegistryAddress } from '@aztec/protocol-contracts/key-registry';
|
|
21
|
+
import { getCanonicalMultiCallEntrypointAddress } from '@aztec/protocol-contracts/multi-call-entrypoint';
|
|
22
|
+
import { TxProver } from '@aztec/prover-client';
|
|
15
23
|
import { SequencerClient, getGlobalVariableBuilder } from '@aztec/sequencer-client';
|
|
16
24
|
import { PublicProcessorFactory, WASMSimulator } from '@aztec/simulator';
|
|
17
25
|
import { MerkleTrees, ServerWorldStateSynchronizer, getConfigEnvVars as getWorldStateConfig, } from '@aztec/world-state';
|
|
26
|
+
import { getPackageInfo } from './config.js';
|
|
18
27
|
import { getSimulationProvider } from './simulator-factory.js';
|
|
28
|
+
import { MetadataTxValidator } from './tx_validator/tx_metadata_validator.js';
|
|
29
|
+
import { TxProofValidator } from './tx_validator/tx_proof_validator.js';
|
|
19
30
|
/**
|
|
20
31
|
* The aztec node.
|
|
21
32
|
*/
|
|
22
33
|
export class AztecNodeService {
|
|
23
|
-
constructor(config, p2pClient, blockSource, encryptedLogsSource, unencryptedLogsSource, contractDataSource, l1ToL2MessageSource, worldStateSynchronizer, sequencer, chainId, version, globalVariableBuilder, merkleTreesDb, prover, log = createDebugLogger('aztec:node')) {
|
|
34
|
+
constructor(config, p2pClient, blockSource, encryptedLogsSource, unencryptedLogsSource, contractDataSource, l1ToL2MessageSource, worldStateSynchronizer, sequencer, chainId, version, globalVariableBuilder, merkleTreesDb, prover, txValidator, log = createDebugLogger('aztec:node')) {
|
|
24
35
|
_AztecNodeService_instances.add(this);
|
|
25
36
|
this.config = config;
|
|
26
37
|
this.p2pClient = p2pClient;
|
|
@@ -36,7 +47,9 @@ export class AztecNodeService {
|
|
|
36
47
|
this.globalVariableBuilder = globalVariableBuilder;
|
|
37
48
|
this.merkleTreesDb = merkleTreesDb;
|
|
38
49
|
this.prover = prover;
|
|
50
|
+
this.txValidator = txValidator;
|
|
39
51
|
this.log = log;
|
|
52
|
+
this.packageVersion = getPackageInfo().version;
|
|
40
53
|
const message = `Started Aztec Node against chain 0x${chainId.toString(16)} with contracts - \n` +
|
|
41
54
|
`Rollup: ${config.l1Contracts.rollupAddress.toString()}\n` +
|
|
42
55
|
`Registry: ${config.l1Contracts.registryAddress.toString()}\n` +
|
|
@@ -79,16 +92,23 @@ export class AztecNodeService {
|
|
|
79
92
|
const worldStateSynchronizer = new ServerWorldStateSynchronizer(store, merkleTrees, archiver, worldStateConfig);
|
|
80
93
|
// start both and wait for them to sync from the block source
|
|
81
94
|
await Promise.all([p2pClient.start(), worldStateSynchronizer.start()]);
|
|
95
|
+
const proofVerifier = config.realProofs ? await BBCircuitVerifier.new(config) : new TestCircuitVerifier();
|
|
96
|
+
const txValidator = new AggregateTxValidator(new MetadataTxValidator(config.chainId), new TxProofValidator(proofVerifier));
|
|
82
97
|
// start the prover if we have been told to
|
|
83
98
|
const simulationProvider = await getSimulationProvider(config, log);
|
|
84
99
|
const prover = config.disableProver
|
|
85
|
-
?
|
|
86
|
-
: await TxProver.new(config,
|
|
100
|
+
? undefined
|
|
101
|
+
: await TxProver.new(config, await proofVerifier.getVerificationKeys(), worldStateSynchronizer, await archiver
|
|
102
|
+
.getBlock(-1)
|
|
103
|
+
.then(b => b?.header ?? worldStateSynchronizer.getCommitted().buildInitialHeader()));
|
|
104
|
+
if (!prover && !config.disableSequencer) {
|
|
105
|
+
throw new Error("Can't start a sequencer without a prover");
|
|
106
|
+
}
|
|
87
107
|
// now create the sequencer
|
|
88
108
|
const sequencer = config.disableSequencer
|
|
89
109
|
? undefined
|
|
90
110
|
: await SequencerClient.new(config, p2pClient, worldStateSynchronizer, archiver, archiver, archiver, prover, simulationProvider);
|
|
91
|
-
return new AztecNodeService(config, p2pClient, archiver, archiver, archiver, archiver, archiver, worldStateSynchronizer, sequencer, ethereumChain.chainInfo.id, config.version, getGlobalVariableBuilder(config), store, prover, log);
|
|
111
|
+
return new AztecNodeService(config, p2pClient, archiver, archiver, archiver, archiver, archiver, worldStateSynchronizer, sequencer, ethereumChain.chainInfo.id, config.version, getGlobalVariableBuilder(config), store, prover, txValidator, log);
|
|
92
112
|
}
|
|
93
113
|
/**
|
|
94
114
|
* Returns the sequencer client instance.
|
|
@@ -138,6 +158,13 @@ export class AztecNodeService {
|
|
|
138
158
|
async getBlockNumber() {
|
|
139
159
|
return await this.blockSource.getBlockNumber();
|
|
140
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Method to fetch the version of the package.
|
|
163
|
+
* @returns The node package version
|
|
164
|
+
*/
|
|
165
|
+
getNodeVersion() {
|
|
166
|
+
return Promise.resolve(this.packageVersion);
|
|
167
|
+
}
|
|
141
168
|
/**
|
|
142
169
|
* Method to fetch the version of the rollup the node is connected to.
|
|
143
170
|
* @returns The rollup version.
|
|
@@ -183,6 +210,11 @@ export class AztecNodeService {
|
|
|
183
210
|
*/
|
|
184
211
|
async sendTx(tx) {
|
|
185
212
|
this.log.info(`Received tx ${tx.getTxHash()}`);
|
|
213
|
+
const [_, invalidTxs] = await this.txValidator.validateTxs([tx]);
|
|
214
|
+
if (invalidTxs.length > 0) {
|
|
215
|
+
this.log.warn(`Rejecting tx ${tx.getTxHash()} because of validation errors`);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
186
218
|
await this.p2pClient.sendTx(tx);
|
|
187
219
|
}
|
|
188
220
|
async getTxReceipt(txHash) {
|
|
@@ -212,7 +244,7 @@ export class AztecNodeService {
|
|
|
212
244
|
await this.p2pClient.stop();
|
|
213
245
|
await this.worldStateSynchronizer.stop();
|
|
214
246
|
await this.blockSource.stop();
|
|
215
|
-
await this.prover
|
|
247
|
+
await this.prover?.stop();
|
|
216
248
|
this.log.info(`Stopped`);
|
|
217
249
|
}
|
|
218
250
|
/**
|
|
@@ -295,6 +327,7 @@ export class AztecNodeService {
|
|
|
295
327
|
* @remarks This tree is considered ephemeral because it is created on-demand by: taking all the l2ToL1 messages
|
|
296
328
|
* in a single block, and then using them to make a variable depth append-only tree with these messages as leaves.
|
|
297
329
|
* The tree is discarded immediately after calculating what we need from it.
|
|
330
|
+
* TODO: Handle the case where two messages in the same tx have the same hash.
|
|
298
331
|
* @param blockNumber - The block number at which to get the data.
|
|
299
332
|
* @param l2ToL1Message - The l2ToL1Message get the index / sibling path for.
|
|
300
333
|
* @returns A tuple of the index and the sibling path of the L2ToL1Message.
|
|
@@ -304,17 +337,41 @@ export class AztecNodeService {
|
|
|
304
337
|
if (block === undefined) {
|
|
305
338
|
throw new Error('Block is not defined');
|
|
306
339
|
}
|
|
307
|
-
const l2ToL1Messages = block.body.txEffects.
|
|
308
|
-
|
|
309
|
-
|
|
340
|
+
const l2ToL1Messages = block.body.txEffects.map(txEffect => txEffect.l2ToL1Msgs);
|
|
341
|
+
// Find index of message
|
|
342
|
+
let indexOfMsgInSubtree = -1;
|
|
343
|
+
const indexOfMsgTx = l2ToL1Messages.findIndex(msgs => {
|
|
344
|
+
const idx = msgs.findIndex(msg => msg.equals(l2ToL1Message));
|
|
345
|
+
indexOfMsgInSubtree = Math.max(indexOfMsgInSubtree, idx);
|
|
346
|
+
return idx !== -1;
|
|
347
|
+
});
|
|
348
|
+
if (indexOfMsgTx === -1) {
|
|
310
349
|
throw new Error('The L2ToL1Message you are trying to prove inclusion of does not exist');
|
|
311
350
|
}
|
|
312
|
-
//
|
|
313
|
-
const
|
|
351
|
+
// Construct message subtrees
|
|
352
|
+
const l2toL1Subtrees = await Promise.all(l2ToL1Messages.map(async (msgs, i) => {
|
|
353
|
+
const treeHeight = msgs.length <= 1 ? 1 : Math.ceil(Math.log2(msgs.length));
|
|
354
|
+
const tree = new StandardTree(openTmpStore(true), new SHA256Trunc(), `temp_msgs_subtrees_${i}`, treeHeight, 0n, Fr);
|
|
355
|
+
await tree.appendLeaves(msgs);
|
|
356
|
+
return tree;
|
|
357
|
+
}));
|
|
358
|
+
// path of the input msg from leaf -> first out hash calculated in base rolllup
|
|
359
|
+
const subtreePathOfL2ToL1Message = await l2toL1Subtrees[indexOfMsgTx].getSiblingPath(BigInt(indexOfMsgInSubtree), true);
|
|
360
|
+
const l2toL1SubtreeRoots = l2toL1Subtrees.map(t => Fr.fromBuffer(t.getRoot(true)));
|
|
361
|
+
const treeHeight = block.header.contentCommitment.txTreeHeight.toNumber();
|
|
362
|
+
// NOTE: This padding only works assuming that an 'empty' out hash is H(0,0)
|
|
363
|
+
const paddedl2toL1SubtreeRoots = padArrayEnd(l2toL1SubtreeRoots, Fr.fromBuffer(sha256Trunc(Buffer.alloc(64))), 2 ** treeHeight);
|
|
314
364
|
// The root of this tree is the out_hash calculated in Noir => we truncate to match Noir's SHA
|
|
315
|
-
const
|
|
316
|
-
await
|
|
317
|
-
|
|
365
|
+
const outHashTree = new StandardTree(openTmpStore(true), new SHA256Trunc(), 'temp_outhash_sibling_path', treeHeight, 0n, Fr);
|
|
366
|
+
await outHashTree.appendLeaves(paddedl2toL1SubtreeRoots);
|
|
367
|
+
const pathOfTxInOutHashTree = await outHashTree.getSiblingPath(BigInt(indexOfMsgTx), true);
|
|
368
|
+
// Append subtree path to out hash tree path
|
|
369
|
+
const mergedPath = subtreePathOfL2ToL1Message.toBufferArray().concat(pathOfTxInOutHashTree.toBufferArray());
|
|
370
|
+
// Append binary index of subtree path to binary index of out hash tree path
|
|
371
|
+
const mergedIndex = parseInt(indexOfMsgTx
|
|
372
|
+
.toString(2)
|
|
373
|
+
.concat(indexOfMsgInSubtree.toString(2).padStart(l2toL1Subtrees[indexOfMsgTx].getDepth(), '0')), 2);
|
|
374
|
+
return [BigInt(mergedIndex), new SiblingPath(mergedPath.length, mergedPath)];
|
|
318
375
|
}
|
|
319
376
|
/**
|
|
320
377
|
* Returns a sibling path for a leaf in the committed blocks tree.
|
|
@@ -461,11 +518,32 @@ export class AztecNodeService {
|
|
|
461
518
|
}
|
|
462
519
|
this.log.debug(`Simulated tx ${tx.getTxHash()} succeeds`);
|
|
463
520
|
const [processedTx] = processedTxs;
|
|
464
|
-
return new PublicSimulationOutput(processedTx.encryptedLogs, processedTx.unencryptedLogs, processedTx.revertReason, processedTx.data.constants, processedTx.data.end, returns
|
|
521
|
+
return new PublicSimulationOutput(processedTx.encryptedLogs, processedTx.unencryptedLogs, processedTx.revertReason, processedTx.data.constants, processedTx.data.end, returns, processedTx.gasUsed);
|
|
465
522
|
}
|
|
466
523
|
async setConfig(config) {
|
|
524
|
+
const newConfig = { ...this.config, ...config };
|
|
467
525
|
this.sequencer?.updateSequencerConfig(config);
|
|
468
|
-
await this.prover
|
|
526
|
+
await this.prover?.updateProverConfig(config);
|
|
527
|
+
if (newConfig.realProofs !== this.config.realProofs) {
|
|
528
|
+
const proofVerifier = config.realProofs ? await BBCircuitVerifier.new(newConfig) : new TestCircuitVerifier();
|
|
529
|
+
this.txValidator = new AggregateTxValidator(new MetadataTxValidator(this.chainId), new TxProofValidator(proofVerifier));
|
|
530
|
+
await this.prover?.updateProverConfig({
|
|
531
|
+
vks: await proofVerifier.getVerificationKeys(),
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
this.config = newConfig;
|
|
535
|
+
}
|
|
536
|
+
getProtocolContractAddresses() {
|
|
537
|
+
return Promise.resolve({
|
|
538
|
+
classRegisterer: getCanonicalClassRegisterer().address,
|
|
539
|
+
gasToken: getCanonicalGasToken().address,
|
|
540
|
+
instanceDeployer: getCanonicalInstanceDeployer().address,
|
|
541
|
+
keyRegistry: getCanonicalKeyRegistryAddress(),
|
|
542
|
+
multiCallEntrypoint: getCanonicalMultiCallEntrypointAddress(),
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
addContractArtifact(address, artifact) {
|
|
546
|
+
return this.contractDataSource.addContractArtifact(address, artifact);
|
|
469
547
|
}
|
|
470
548
|
}
|
|
471
549
|
_AztecNodeService_instances = new WeakSet(), _AztecNodeService_getWorldState =
|
|
@@ -507,4 +585,4 @@ async function _AztecNodeService_syncWorldState() {
|
|
|
507
585
|
const blockSourceHeight = await this.blockSource.getBlockNumber();
|
|
508
586
|
return this.worldStateSynchronizer.syncImmediate(blockSourceHeight);
|
|
509
587
|
};
|
|
510
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFzQixRQUFRLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRyxPQUFPLEVBV0wsT0FBTyxFQUNQLFlBQVksRUFDWiwwQkFBMEIsRUFHMUIsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQU10QixTQUFTLEVBQ1QsUUFBUSxFQUNSLGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFFTCxVQUFVLEVBQ1YsRUFBRSxFQUVGLG9CQUFvQixFQUlwQixtQ0FBbUMsR0FJcEMsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RSxPQUFPLEVBQTRCLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekUsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsYUFBYSxFQUFZLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBOEIsZUFBZSxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEgsT0FBTyxFQUFFLHNCQUFz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
|
|
588
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFzQixRQUFRLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsb0JBQW9CLEVBV3BCLE9BQU8sRUFDUCxZQUFZLEVBQ1osMEJBQTBCLEVBRzFCLGlCQUFpQixFQUNqQixzQkFBc0IsRUFFdEIsV0FBVyxFQUlYLFNBQVMsRUFDVCxRQUFRLEVBRVIsZ0JBQWdCLEdBQ2pCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUVMLFVBQVUsRUFDVixFQUFFLEVBRUYsb0JBQW9CLEVBSXBCLG1DQUFtQyxHQUlwQyxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBNEIsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFF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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { Fr } from '@aztec/circuits.js';
|
|
3
|
+
export declare class MetadataTxValidator implements TxValidator<Tx> {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(chainId: number | Fr);
|
|
6
|
+
validateTxs(txs: Tx[]): Promise<[validTxs: Tx[], invalidTxs: Tx[]]>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=tx_metadata_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_metadata_validator.d.ts","sourceRoot":"","sources":["../../../src/aztec-node/tx_validator/tx_metadata_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAGxC,qBAAa,mBAAoB,YAAW,WAAW,CAAC,EAAE,CAAC;;gBAI7C,OAAO,EAAE,MAAM,GAAG,EAAE;IAIhC,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;CA2BpE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var _MetadataTxValidator_instances, _MetadataTxValidator_log, _MetadataTxValidator_chainId, _MetadataTxValidator_hasCorrectChainId;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { Fr } from '@aztec/circuits.js';
|
|
5
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
|
+
export class MetadataTxValidator {
|
|
7
|
+
constructor(chainId) {
|
|
8
|
+
_MetadataTxValidator_instances.add(this);
|
|
9
|
+
_MetadataTxValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:tx_metadata'));
|
|
10
|
+
_MetadataTxValidator_chainId.set(this, void 0);
|
|
11
|
+
__classPrivateFieldSet(this, _MetadataTxValidator_chainId, new Fr(chainId), "f");
|
|
12
|
+
}
|
|
13
|
+
validateTxs(txs) {
|
|
14
|
+
const validTxs = [];
|
|
15
|
+
const invalidTxs = [];
|
|
16
|
+
for (const tx of txs) {
|
|
17
|
+
if (!__classPrivateFieldGet(this, _MetadataTxValidator_instances, "m", _MetadataTxValidator_hasCorrectChainId).call(this, tx)) {
|
|
18
|
+
invalidTxs.push(tx);
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
validTxs.push(tx);
|
|
22
|
+
}
|
|
23
|
+
return Promise.resolve([validTxs, invalidTxs]);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
_MetadataTxValidator_log = new WeakMap(), _MetadataTxValidator_chainId = new WeakMap(), _MetadataTxValidator_instances = new WeakSet(), _MetadataTxValidator_hasCorrectChainId = function _MetadataTxValidator_hasCorrectChainId(tx) {
|
|
27
|
+
if (!tx.data.constants.txContext.chainId.equals(__classPrivateFieldGet(this, _MetadataTxValidator_chainId, "f"))) {
|
|
28
|
+
__classPrivateFieldGet(this, _MetadataTxValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} because of incorrect chain ${tx.data.constants.txContext.chainId.toNumber()} != ${__classPrivateFieldGet(this, _MetadataTxValidator_chainId, "f").toNumber()}`);
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfbWV0YWRhdGFfdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dGVjLW5vZGUvdHhfdmFsaWRhdG9yL3R4X21ldGFkYXRhX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQW9CLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sT0FBTyxtQkFBbUI7SUFJOUIsWUFBWSxPQUFvQjs7UUFIaEMsbUNBQU8saUJBQWlCLENBQUMsMENBQTBDLENBQUMsRUFBQztRQUNyRSwrQ0FBYTtRQUdYLHVCQUFBLElBQUksZ0NBQVksSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQUEsQ0FBQztJQUNsQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVM7UUFDbkIsTUFBTSxRQUFRLEdBQVMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sVUFBVSxHQUFTLEVBQUUsQ0FBQztRQUM1QixLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyx1QkFBQSxJQUFJLDhFQUFtQixNQUF2QixJQUFJLEVBQW9CLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BCLFNBQVM7WUFDWCxDQUFDO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQWNGO2lPQVpvQixFQUFNO0lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyx1QkFBQSxJQUFJLG9DQUFTLENBQUMsRUFBRSxDQUFDO1FBQy9ELHVCQUFBLElBQUksZ0NBQUssQ0FBQyxJQUFJLENBQ1osZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQ3hCLEVBQUUsQ0FDSCwrQkFBK0IsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyx1QkFBQSxJQUFJLG9DQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDaEgsQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ClientProtocolCircuitVerifier, Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
export declare class TxProofValidator implements TxValidator<Tx> {
|
|
3
|
+
#private;
|
|
4
|
+
private verifier;
|
|
5
|
+
constructor(verifier: ClientProtocolCircuitVerifier);
|
|
6
|
+
validateTxs(txs: Tx[]): Promise<[validTxs: Tx[], invalidTxs: Tx[]]>;
|
|
7
|
+
validateTx(tx: Tx): Promise<boolean>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=tx_proof_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_proof_validator.d.ts","sourceRoot":"","sources":["../../../src/aztec-node/tx_validator/tx_proof_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,6BAA6B,EAAE,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGhG,qBAAa,gBAAiB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAG1C,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,6BAA6B;IAErD,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAgBzE,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAGrC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
var _TxProofValidator_log;
|
|
2
|
+
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
+
import { Tx } from '@aztec/circuit-types';
|
|
4
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
+
export class TxProofValidator {
|
|
6
|
+
constructor(verifier) {
|
|
7
|
+
this.verifier = verifier;
|
|
8
|
+
_TxProofValidator_log.set(this, createDebugLogger('aztec:sequencer:tx_validator:private_proof'));
|
|
9
|
+
}
|
|
10
|
+
async validateTxs(txs) {
|
|
11
|
+
const validTxs = [];
|
|
12
|
+
const invalidTxs = [];
|
|
13
|
+
for (const tx of txs) {
|
|
14
|
+
if (await this.verifier.verifyProof(tx)) {
|
|
15
|
+
validTxs.push(tx);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
__classPrivateFieldGet(this, _TxProofValidator_log, "f").warn(`Rejecting tx ${Tx.getHash(tx)} for invalid proof`);
|
|
19
|
+
invalidTxs.push(tx);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return [validTxs, invalidTxs];
|
|
23
|
+
}
|
|
24
|
+
validateTx(tx) {
|
|
25
|
+
return this.verifier.verifyProof(tx);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
_TxProofValidator_log = new WeakMap();
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcHJvb2ZfdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dGVjLW5vZGUvdHhfdmFsaWRhdG9yL3R4X3Byb29mX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBc0MsRUFBRSxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFBb0IsUUFBdUM7UUFBdkMsYUFBUSxHQUFSLFFBQVEsQ0FBK0I7UUFGM0QsZ0NBQU8saUJBQWlCLENBQUMsNENBQTRDLENBQUMsRUFBQztJQUVULENBQUM7SUFFL0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFTO1FBQ3pCLE1BQU0sUUFBUSxHQUFTLEVBQUUsQ0FBQztRQUMxQixNQUFNLFVBQVUsR0FBUyxFQUFFLENBQUM7UUFFNUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sdUJBQUEsSUFBSSw2QkFBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDbkUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/aztec-node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.43.0",
|
|
4
4
|
"main": "dest/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": "./dest/index.js",
|
|
@@ -48,20 +48,22 @@
|
|
|
48
48
|
]
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@aztec/archiver": "0.
|
|
52
|
-
"@aztec/
|
|
53
|
-
"@aztec/
|
|
54
|
-
"@aztec/
|
|
55
|
-
"@aztec/
|
|
56
|
-
"@aztec/
|
|
57
|
-
"@aztec/
|
|
58
|
-
"@aztec/
|
|
59
|
-
"@aztec/
|
|
60
|
-
"@aztec/
|
|
61
|
-
"@aztec/
|
|
62
|
-
"@aztec/
|
|
63
|
-
"@aztec/
|
|
64
|
-
"@aztec/
|
|
51
|
+
"@aztec/archiver": "0.43.0",
|
|
52
|
+
"@aztec/bb-prover": "0.43.0",
|
|
53
|
+
"@aztec/circuit-types": "0.43.0",
|
|
54
|
+
"@aztec/circuits.js": "0.43.0",
|
|
55
|
+
"@aztec/ethereum": "0.43.0",
|
|
56
|
+
"@aztec/foundation": "0.43.0",
|
|
57
|
+
"@aztec/kv-store": "0.43.0",
|
|
58
|
+
"@aztec/l1-artifacts": "0.43.0",
|
|
59
|
+
"@aztec/merkle-tree": "0.43.0",
|
|
60
|
+
"@aztec/p2p": "0.43.0",
|
|
61
|
+
"@aztec/protocol-contracts": "0.43.0",
|
|
62
|
+
"@aztec/prover-client": "0.43.0",
|
|
63
|
+
"@aztec/sequencer-client": "0.43.0",
|
|
64
|
+
"@aztec/simulator": "0.43.0",
|
|
65
|
+
"@aztec/types": "0.43.0",
|
|
66
|
+
"@aztec/world-state": "0.43.0",
|
|
65
67
|
"koa": "^2.14.2",
|
|
66
68
|
"koa-router": "^12.0.0",
|
|
67
69
|
"tslib": "^2.4.0"
|
package/src/aztec-node/config.ts
CHANGED
|
@@ -4,6 +4,10 @@ import { type ProverClientConfig, getProverEnvVars } from '@aztec/prover-client'
|
|
|
4
4
|
import { type SequencerClientConfig, getConfigEnvVars as getSequencerVars } from '@aztec/sequencer-client';
|
|
5
5
|
import { getConfigEnvVars as getWorldStateVars } from '@aztec/world-state';
|
|
6
6
|
|
|
7
|
+
import { readFileSync } from 'fs';
|
|
8
|
+
import { dirname, resolve } from 'path';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
|
|
7
11
|
/**
|
|
8
12
|
* The configuration the aztec node.
|
|
9
13
|
*/
|
|
@@ -41,3 +45,12 @@ export function getConfigEnvVars(): AztecNodeConfig {
|
|
|
41
45
|
|
|
42
46
|
return allEnvVars;
|
|
43
47
|
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Returns package name and version.
|
|
51
|
+
*/
|
|
52
|
+
export function getPackageInfo() {
|
|
53
|
+
const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../package.json');
|
|
54
|
+
const { version, name } = JSON.parse(readFileSync(packageJsonPath).toString());
|
|
55
|
+
return { version, name };
|
|
56
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type AztecNode,
|
|
3
|
-
|
|
3
|
+
EncryptedNoteL2BlockL2Logs,
|
|
4
4
|
ExtendedUnencryptedL2Log,
|
|
5
5
|
L2Block,
|
|
6
6
|
LogId,
|
|
@@ -46,7 +46,7 @@ export function createAztecNodeRpcServer(node: AztecNode) {
|
|
|
46
46
|
PublicSimulationOutput,
|
|
47
47
|
Tx,
|
|
48
48
|
TxReceipt,
|
|
49
|
-
|
|
49
|
+
EncryptedNoteL2BlockL2Logs,
|
|
50
50
|
UnencryptedL2BlockL2Logs,
|
|
51
51
|
NullifierMembershipWitness,
|
|
52
52
|
},
|
package/src/aztec-node/server.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { type ArchiveSource, Archiver, KVArchiverDataStore, createArchiverClient } from '@aztec/archiver';
|
|
2
|
+
import { BBCircuitVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
|
|
2
3
|
import {
|
|
4
|
+
AggregateTxValidator,
|
|
3
5
|
type AztecNode,
|
|
4
6
|
type FromLogType,
|
|
5
7
|
type GetUnencryptedLogsResponse,
|
|
@@ -18,12 +20,13 @@ import {
|
|
|
18
20
|
PublicDataWitness,
|
|
19
21
|
PublicSimulationOutput,
|
|
20
22
|
type SequencerConfig,
|
|
21
|
-
|
|
23
|
+
SiblingPath,
|
|
22
24
|
type Tx,
|
|
23
25
|
type TxEffect,
|
|
24
26
|
type TxHash,
|
|
25
27
|
TxReceipt,
|
|
26
28
|
TxStatus,
|
|
29
|
+
type TxValidator,
|
|
27
30
|
partitionReverts,
|
|
28
31
|
} from '@aztec/circuit-types';
|
|
29
32
|
import {
|
|
@@ -42,20 +45,29 @@ import {
|
|
|
42
45
|
} from '@aztec/circuits.js';
|
|
43
46
|
import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
|
|
44
47
|
import { type L1ContractAddresses, createEthereumChain } from '@aztec/ethereum';
|
|
48
|
+
import { type ContractArtifact } from '@aztec/foundation/abi';
|
|
45
49
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
50
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
51
|
+
import { sha256Trunc } from '@aztec/foundation/crypto';
|
|
46
52
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
47
53
|
import { type AztecKVStore } from '@aztec/kv-store';
|
|
48
54
|
import { AztecLmdbStore } from '@aztec/kv-store/lmdb';
|
|
49
55
|
import { initStoreForRollup, openTmpStore } from '@aztec/kv-store/utils';
|
|
50
56
|
import { SHA256Trunc, StandardTree } from '@aztec/merkle-tree';
|
|
51
57
|
import { AztecKVTxPool, type P2P, createP2PClient } from '@aztec/p2p';
|
|
52
|
-
import {
|
|
58
|
+
import { getCanonicalClassRegisterer } from '@aztec/protocol-contracts/class-registerer';
|
|
59
|
+
import { getCanonicalGasToken } from '@aztec/protocol-contracts/gas-token';
|
|
60
|
+
import { getCanonicalInstanceDeployer } from '@aztec/protocol-contracts/instance-deployer';
|
|
61
|
+
import { getCanonicalKeyRegistryAddress } from '@aztec/protocol-contracts/key-registry';
|
|
62
|
+
import { getCanonicalMultiCallEntrypointAddress } from '@aztec/protocol-contracts/multi-call-entrypoint';
|
|
63
|
+
import { TxProver } from '@aztec/prover-client';
|
|
53
64
|
import { type GlobalVariableBuilder, SequencerClient, getGlobalVariableBuilder } from '@aztec/sequencer-client';
|
|
54
65
|
import { PublicProcessorFactory, WASMSimulator } from '@aztec/simulator';
|
|
55
66
|
import {
|
|
56
67
|
type ContractClassPublic,
|
|
57
68
|
type ContractDataSource,
|
|
58
69
|
type ContractInstanceWithAddress,
|
|
70
|
+
type ProtocolContractAddresses,
|
|
59
71
|
} from '@aztec/types/contracts';
|
|
60
72
|
import {
|
|
61
73
|
MerkleTrees,
|
|
@@ -65,15 +77,19 @@ import {
|
|
|
65
77
|
getConfigEnvVars as getWorldStateConfig,
|
|
66
78
|
} from '@aztec/world-state';
|
|
67
79
|
|
|
68
|
-
import { type AztecNodeConfig } from './config.js';
|
|
80
|
+
import { type AztecNodeConfig, getPackageInfo } from './config.js';
|
|
69
81
|
import { getSimulationProvider } from './simulator-factory.js';
|
|
82
|
+
import { MetadataTxValidator } from './tx_validator/tx_metadata_validator.js';
|
|
83
|
+
import { TxProofValidator } from './tx_validator/tx_proof_validator.js';
|
|
70
84
|
|
|
71
85
|
/**
|
|
72
86
|
* The aztec node.
|
|
73
87
|
*/
|
|
74
88
|
export class AztecNodeService implements AztecNode {
|
|
89
|
+
private packageVersion: string;
|
|
90
|
+
|
|
75
91
|
constructor(
|
|
76
|
-
protected
|
|
92
|
+
protected config: AztecNodeConfig,
|
|
77
93
|
protected readonly p2pClient: P2P,
|
|
78
94
|
protected readonly blockSource: L2BlockSource,
|
|
79
95
|
protected readonly encryptedLogsSource: L2LogsSource,
|
|
@@ -86,9 +102,11 @@ export class AztecNodeService implements AztecNode {
|
|
|
86
102
|
protected readonly version: number,
|
|
87
103
|
protected readonly globalVariableBuilder: GlobalVariableBuilder,
|
|
88
104
|
protected readonly merkleTreesDb: AztecKVStore,
|
|
89
|
-
private readonly prover: ProverClient,
|
|
105
|
+
private readonly prover: ProverClient | undefined,
|
|
106
|
+
private txValidator: TxValidator,
|
|
90
107
|
private log = createDebugLogger('aztec:node'),
|
|
91
108
|
) {
|
|
109
|
+
this.packageVersion = getPackageInfo().version;
|
|
92
110
|
const message =
|
|
93
111
|
`Started Aztec Node against chain 0x${chainId.toString(16)} with contracts - \n` +
|
|
94
112
|
`Rollup: ${config.l1Contracts.rollupAddress.toString()}\n` +
|
|
@@ -145,11 +163,28 @@ export class AztecNodeService implements AztecNode {
|
|
|
145
163
|
// start both and wait for them to sync from the block source
|
|
146
164
|
await Promise.all([p2pClient.start(), worldStateSynchronizer.start()]);
|
|
147
165
|
|
|
166
|
+
const proofVerifier = config.realProofs ? await BBCircuitVerifier.new(config) : new TestCircuitVerifier();
|
|
167
|
+
const txValidator = new AggregateTxValidator(
|
|
168
|
+
new MetadataTxValidator(config.chainId),
|
|
169
|
+
new TxProofValidator(proofVerifier),
|
|
170
|
+
);
|
|
171
|
+
|
|
148
172
|
// start the prover if we have been told to
|
|
149
173
|
const simulationProvider = await getSimulationProvider(config, log);
|
|
150
174
|
const prover = config.disableProver
|
|
151
|
-
?
|
|
152
|
-
: await TxProver.new(
|
|
175
|
+
? undefined
|
|
176
|
+
: await TxProver.new(
|
|
177
|
+
config,
|
|
178
|
+
await proofVerifier.getVerificationKeys(),
|
|
179
|
+
worldStateSynchronizer,
|
|
180
|
+
await archiver
|
|
181
|
+
.getBlock(-1)
|
|
182
|
+
.then(b => b?.header ?? worldStateSynchronizer.getCommitted().buildInitialHeader()),
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
if (!prover && !config.disableSequencer) {
|
|
186
|
+
throw new Error("Can't start a sequencer without a prover");
|
|
187
|
+
}
|
|
153
188
|
|
|
154
189
|
// now create the sequencer
|
|
155
190
|
const sequencer = config.disableSequencer
|
|
@@ -161,7 +196,7 @@ export class AztecNodeService implements AztecNode {
|
|
|
161
196
|
archiver,
|
|
162
197
|
archiver,
|
|
163
198
|
archiver,
|
|
164
|
-
prover
|
|
199
|
+
prover!,
|
|
165
200
|
simulationProvider,
|
|
166
201
|
);
|
|
167
202
|
|
|
@@ -180,6 +215,7 @@ export class AztecNodeService implements AztecNode {
|
|
|
180
215
|
getGlobalVariableBuilder(config),
|
|
181
216
|
store,
|
|
182
217
|
prover,
|
|
218
|
+
txValidator,
|
|
183
219
|
log,
|
|
184
220
|
);
|
|
185
221
|
}
|
|
@@ -192,7 +228,7 @@ export class AztecNodeService implements AztecNode {
|
|
|
192
228
|
return this.sequencer;
|
|
193
229
|
}
|
|
194
230
|
|
|
195
|
-
public getProver(): ProverClient {
|
|
231
|
+
public getProver(): ProverClient | undefined {
|
|
196
232
|
return this.prover;
|
|
197
233
|
}
|
|
198
234
|
|
|
@@ -239,6 +275,14 @@ export class AztecNodeService implements AztecNode {
|
|
|
239
275
|
return await this.blockSource.getBlockNumber();
|
|
240
276
|
}
|
|
241
277
|
|
|
278
|
+
/**
|
|
279
|
+
* Method to fetch the version of the package.
|
|
280
|
+
* @returns The node package version
|
|
281
|
+
*/
|
|
282
|
+
public getNodeVersion(): Promise<string> {
|
|
283
|
+
return Promise.resolve(this.packageVersion);
|
|
284
|
+
}
|
|
285
|
+
|
|
242
286
|
/**
|
|
243
287
|
* Method to fetch the version of the rollup the node is connected to.
|
|
244
288
|
* @returns The rollup version.
|
|
@@ -294,6 +338,13 @@ export class AztecNodeService implements AztecNode {
|
|
|
294
338
|
*/
|
|
295
339
|
public async sendTx(tx: Tx) {
|
|
296
340
|
this.log.info(`Received tx ${tx.getTxHash()}`);
|
|
341
|
+
|
|
342
|
+
const [_, invalidTxs] = await this.txValidator.validateTxs([tx]);
|
|
343
|
+
if (invalidTxs.length > 0) {
|
|
344
|
+
this.log.warn(`Rejecting tx ${tx.getTxHash()} because of validation errors`);
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
|
|
297
348
|
await this.p2pClient!.sendTx(tx);
|
|
298
349
|
}
|
|
299
350
|
|
|
@@ -329,7 +380,7 @@ export class AztecNodeService implements AztecNode {
|
|
|
329
380
|
await this.p2pClient.stop();
|
|
330
381
|
await this.worldStateSynchronizer.stop();
|
|
331
382
|
await this.blockSource.stop();
|
|
332
|
-
await this.prover
|
|
383
|
+
await this.prover?.stop();
|
|
333
384
|
this.log.info(`Stopped`);
|
|
334
385
|
}
|
|
335
386
|
|
|
@@ -437,6 +488,7 @@ export class AztecNodeService implements AztecNode {
|
|
|
437
488
|
* @remarks This tree is considered ephemeral because it is created on-demand by: taking all the l2ToL1 messages
|
|
438
489
|
* in a single block, and then using them to make a variable depth append-only tree with these messages as leaves.
|
|
439
490
|
* The tree is discarded immediately after calculating what we need from it.
|
|
491
|
+
* TODO: Handle the case where two messages in the same tx have the same hash.
|
|
440
492
|
* @param blockNumber - The block number at which to get the data.
|
|
441
493
|
* @param l2ToL1Message - The l2ToL1Message get the index / sibling path for.
|
|
442
494
|
* @returns A tuple of the index and the sibling path of the L2ToL1Message.
|
|
@@ -451,20 +503,53 @@ export class AztecNodeService implements AztecNode {
|
|
|
451
503
|
throw new Error('Block is not defined');
|
|
452
504
|
}
|
|
453
505
|
|
|
454
|
-
const l2ToL1Messages = block.body.txEffects.
|
|
506
|
+
const l2ToL1Messages = block.body.txEffects.map(txEffect => txEffect.l2ToL1Msgs);
|
|
455
507
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
508
|
+
// Find index of message
|
|
509
|
+
let indexOfMsgInSubtree = -1;
|
|
510
|
+
const indexOfMsgTx = l2ToL1Messages.findIndex(msgs => {
|
|
511
|
+
const idx = msgs.findIndex(msg => msg.equals(l2ToL1Message));
|
|
512
|
+
indexOfMsgInSubtree = Math.max(indexOfMsgInSubtree, idx);
|
|
513
|
+
return idx !== -1;
|
|
514
|
+
});
|
|
459
515
|
|
|
460
|
-
if (
|
|
516
|
+
if (indexOfMsgTx === -1) {
|
|
461
517
|
throw new Error('The L2ToL1Message you are trying to prove inclusion of does not exist');
|
|
462
518
|
}
|
|
463
519
|
|
|
464
|
-
//
|
|
465
|
-
const
|
|
520
|
+
// Construct message subtrees
|
|
521
|
+
const l2toL1Subtrees = await Promise.all(
|
|
522
|
+
l2ToL1Messages.map(async (msgs, i) => {
|
|
523
|
+
const treeHeight = msgs.length <= 1 ? 1 : Math.ceil(Math.log2(msgs.length));
|
|
524
|
+
const tree = new StandardTree(
|
|
525
|
+
openTmpStore(true),
|
|
526
|
+
new SHA256Trunc(),
|
|
527
|
+
`temp_msgs_subtrees_${i}`,
|
|
528
|
+
treeHeight,
|
|
529
|
+
0n,
|
|
530
|
+
Fr,
|
|
531
|
+
);
|
|
532
|
+
await tree.appendLeaves(msgs);
|
|
533
|
+
return tree;
|
|
534
|
+
}),
|
|
535
|
+
);
|
|
536
|
+
|
|
537
|
+
// path of the input msg from leaf -> first out hash calculated in base rolllup
|
|
538
|
+
const subtreePathOfL2ToL1Message = await l2toL1Subtrees[indexOfMsgTx].getSiblingPath(
|
|
539
|
+
BigInt(indexOfMsgInSubtree),
|
|
540
|
+
true,
|
|
541
|
+
);
|
|
542
|
+
|
|
543
|
+
const l2toL1SubtreeRoots = l2toL1Subtrees.map(t => Fr.fromBuffer(t.getRoot(true)));
|
|
544
|
+
const treeHeight = block.header.contentCommitment.txTreeHeight.toNumber();
|
|
545
|
+
// NOTE: This padding only works assuming that an 'empty' out hash is H(0,0)
|
|
546
|
+
const paddedl2toL1SubtreeRoots = padArrayEnd(
|
|
547
|
+
l2toL1SubtreeRoots,
|
|
548
|
+
Fr.fromBuffer(sha256Trunc(Buffer.alloc(64))),
|
|
549
|
+
2 ** treeHeight,
|
|
550
|
+
);
|
|
466
551
|
// The root of this tree is the out_hash calculated in Noir => we truncate to match Noir's SHA
|
|
467
|
-
const
|
|
552
|
+
const outHashTree = new StandardTree(
|
|
468
553
|
openTmpStore(true),
|
|
469
554
|
new SHA256Trunc(),
|
|
470
555
|
'temp_outhash_sibling_path',
|
|
@@ -472,9 +557,20 @@ export class AztecNodeService implements AztecNode {
|
|
|
472
557
|
0n,
|
|
473
558
|
Fr,
|
|
474
559
|
);
|
|
475
|
-
await
|
|
560
|
+
await outHashTree.appendLeaves(paddedl2toL1SubtreeRoots);
|
|
561
|
+
|
|
562
|
+
const pathOfTxInOutHashTree = await outHashTree.getSiblingPath(BigInt(indexOfMsgTx), true);
|
|
563
|
+
// Append subtree path to out hash tree path
|
|
564
|
+
const mergedPath = subtreePathOfL2ToL1Message.toBufferArray().concat(pathOfTxInOutHashTree.toBufferArray());
|
|
565
|
+
// Append binary index of subtree path to binary index of out hash tree path
|
|
566
|
+
const mergedIndex = parseInt(
|
|
567
|
+
indexOfMsgTx
|
|
568
|
+
.toString(2)
|
|
569
|
+
.concat(indexOfMsgInSubtree.toString(2).padStart(l2toL1Subtrees[indexOfMsgTx].getDepth(), '0')),
|
|
570
|
+
2,
|
|
571
|
+
);
|
|
476
572
|
|
|
477
|
-
return [
|
|
573
|
+
return [BigInt(mergedIndex), new SiblingPath(mergedPath.length, mergedPath)];
|
|
478
574
|
}
|
|
479
575
|
|
|
480
576
|
/**
|
|
@@ -680,14 +776,44 @@ export class AztecNodeService implements AztecNode {
|
|
|
680
776
|
processedTx.revertReason,
|
|
681
777
|
processedTx.data.constants,
|
|
682
778
|
processedTx.data.end,
|
|
683
|
-
returns
|
|
779
|
+
returns,
|
|
684
780
|
processedTx.gasUsed,
|
|
685
781
|
);
|
|
686
782
|
}
|
|
687
783
|
|
|
688
784
|
public async setConfig(config: Partial<SequencerConfig & ProverConfig>): Promise<void> {
|
|
785
|
+
const newConfig = { ...this.config, ...config };
|
|
689
786
|
this.sequencer?.updateSequencerConfig(config);
|
|
690
|
-
await this.prover
|
|
787
|
+
await this.prover?.updateProverConfig(config);
|
|
788
|
+
|
|
789
|
+
if (newConfig.realProofs !== this.config.realProofs) {
|
|
790
|
+
const proofVerifier = config.realProofs ? await BBCircuitVerifier.new(newConfig) : new TestCircuitVerifier();
|
|
791
|
+
|
|
792
|
+
this.txValidator = new AggregateTxValidator(
|
|
793
|
+
new MetadataTxValidator(this.chainId),
|
|
794
|
+
new TxProofValidator(proofVerifier),
|
|
795
|
+
);
|
|
796
|
+
|
|
797
|
+
await this.prover?.updateProverConfig({
|
|
798
|
+
vks: await proofVerifier.getVerificationKeys(),
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
this.config = newConfig;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
public getProtocolContractAddresses(): Promise<ProtocolContractAddresses> {
|
|
806
|
+
return Promise.resolve({
|
|
807
|
+
classRegisterer: getCanonicalClassRegisterer().address,
|
|
808
|
+
gasToken: getCanonicalGasToken().address,
|
|
809
|
+
instanceDeployer: getCanonicalInstanceDeployer().address,
|
|
810
|
+
keyRegistry: getCanonicalKeyRegistryAddress(),
|
|
811
|
+
multiCallEntrypoint: getCanonicalMultiCallEntrypointAddress(),
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
public addContractArtifact(address: AztecAddress, artifact: ContractArtifact): Promise<void> {
|
|
816
|
+
return this.contractDataSource.addContractArtifact(address, artifact);
|
|
691
817
|
}
|
|
692
818
|
|
|
693
819
|
/**
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { Fr } from '@aztec/circuits.js';
|
|
3
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
|
+
|
|
5
|
+
export class MetadataTxValidator implements TxValidator<Tx> {
|
|
6
|
+
#log = createDebugLogger('aztec:sequencer:tx_validator:tx_metadata');
|
|
7
|
+
#chainId: Fr;
|
|
8
|
+
|
|
9
|
+
constructor(chainId: number | Fr) {
|
|
10
|
+
this.#chainId = new Fr(chainId);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
validateTxs(txs: Tx[]): Promise<[validTxs: Tx[], invalidTxs: Tx[]]> {
|
|
14
|
+
const validTxs: Tx[] = [];
|
|
15
|
+
const invalidTxs: Tx[] = [];
|
|
16
|
+
for (const tx of txs) {
|
|
17
|
+
if (!this.#hasCorrectChainId(tx)) {
|
|
18
|
+
invalidTxs.push(tx);
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
validTxs.push(tx);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return Promise.resolve([validTxs, invalidTxs]);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
#hasCorrectChainId(tx: Tx): boolean {
|
|
29
|
+
if (!tx.data.constants.txContext.chainId.equals(this.#chainId)) {
|
|
30
|
+
this.#log.warn(
|
|
31
|
+
`Rejecting tx ${Tx.getHash(
|
|
32
|
+
tx,
|
|
33
|
+
)} because of incorrect chain ${tx.data.constants.txContext.chainId.toNumber()} != ${this.#chainId.toNumber()}`,
|
|
34
|
+
);
|
|
35
|
+
return false;
|
|
36
|
+
} else {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type ClientProtocolCircuitVerifier, Tx, type TxValidator } from '@aztec/circuit-types';
|
|
2
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
+
|
|
4
|
+
export class TxProofValidator implements TxValidator<Tx> {
|
|
5
|
+
#log = createDebugLogger('aztec:sequencer:tx_validator:private_proof');
|
|
6
|
+
|
|
7
|
+
constructor(private verifier: ClientProtocolCircuitVerifier) {}
|
|
8
|
+
|
|
9
|
+
async validateTxs(txs: Tx[]): Promise<[validTxs: Tx[], invalidTxs: Tx[]]> {
|
|
10
|
+
const validTxs: Tx[] = [];
|
|
11
|
+
const invalidTxs: Tx[] = [];
|
|
12
|
+
|
|
13
|
+
for (const tx of txs) {
|
|
14
|
+
if (await this.verifier.verifyProof(tx)) {
|
|
15
|
+
validTxs.push(tx);
|
|
16
|
+
} else {
|
|
17
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} for invalid proof`);
|
|
18
|
+
invalidTxs.push(tx);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return [validTxs, invalidTxs];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
validateTx(tx: Tx): Promise<boolean> {
|
|
26
|
+
return this.verifier.verifyProof(tx);
|
|
27
|
+
}
|
|
28
|
+
}
|