@aztec/aztec-node 0.47.0 → 0.48.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 +3 -0
- package/dest/aztec-node/config.d.ts.map +1 -1
- package/dest/aztec-node/config.js +26 -17
- package/dest/aztec-node/http_rpc_server.d.ts.map +1 -1
- package/dest/aztec-node/http_rpc_server.js +3 -1
- package/dest/aztec-node/node_metrics.d.ts +8 -0
- package/dest/aztec-node/node_metrics.d.ts.map +1 -0
- package/dest/aztec-node/node_metrics.js +24 -0
- package/dest/aztec-node/server.d.ts +1 -0
- package/dest/aztec-node/server.d.ts.map +1 -1
- package/dest/aztec-node/server.js +14 -8
- package/package.json +18 -18
- package/src/aztec-node/config.ts +27 -18
- package/src/aztec-node/http_rpc_server.ts +2 -0
- package/src/aztec-node/node_metrics.ts +35 -0
- package/src/aztec-node/server.ts +22 -6
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { type ArchiverConfig } from '@aztec/archiver';
|
|
2
|
+
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
2
3
|
import { type P2PConfig } from '@aztec/p2p';
|
|
3
4
|
import { type ProverClientConfig } from '@aztec/prover-client';
|
|
4
5
|
import { type SequencerClientConfig } from '@aztec/sequencer-client';
|
|
5
6
|
import { type WorldStateConfig } from '@aztec/world-state';
|
|
7
|
+
export { sequencerClientConfigMappings, SequencerClientConfig } from '@aztec/sequencer-client';
|
|
6
8
|
/**
|
|
7
9
|
* The configuration the aztec node.
|
|
8
10
|
*/
|
|
@@ -12,6 +14,7 @@ export type AztecNodeConfig = ArchiverConfig & SequencerClientConfig & ProverCli
|
|
|
12
14
|
/** Whether the prover is disabled for this node. */
|
|
13
15
|
disableProver: boolean;
|
|
14
16
|
};
|
|
17
|
+
export declare const aztecNodeConfigMappings: ConfigMappingsType<AztecNodeConfig>;
|
|
15
18
|
/**
|
|
16
19
|
* Returns the config of the aztec node from environment variables with reasonable defaults.
|
|
17
20
|
* @returns A valid aztec node config.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/aztec-node/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/aztec-node/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,KAAK,kBAAkB,EAA8C,MAAM,0BAA0B,CAAC;AAC/G,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,KAAK,kBAAkB,EAA8B,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,KAAK,qBAAqB,EAAiC,MAAM,yBAAyB,CAAC;AACpG,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,oBAAoB,CAAC;AAMrF,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAE/F;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,GAC1C,qBAAqB,GACrB,kBAAkB,GAClB,gBAAgB,GAChB,SAAS,GAAG;IACV,uDAAuD;IACvD,gBAAgB,EAAE,OAAO,CAAC;IAE1B,oDAAoD;IACpD,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEJ,eAAO,MAAM,uBAAuB,EAAE,kBAAkB,CAAC,eAAe,CAgBvE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,CAElD;AAED;;GAEG;AACH,wBAAgB,cAAc;;;EAI7B"}
|
|
@@ -1,27 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { archiverConfigMappings } from '@aztec/archiver';
|
|
2
|
+
import { booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
|
|
3
|
+
import { p2pConfigMappings } from '@aztec/p2p';
|
|
4
|
+
import { proverClientConfigMappings } from '@aztec/prover-client';
|
|
5
|
+
import { sequencerClientConfigMappings } from '@aztec/sequencer-client';
|
|
6
|
+
import { worldStateConfigMappings } from '@aztec/world-state';
|
|
6
7
|
import { readFileSync } from 'fs';
|
|
7
8
|
import { dirname, resolve } from 'path';
|
|
8
9
|
import { fileURLToPath } from 'url';
|
|
10
|
+
export { sequencerClientConfigMappings } from '@aztec/sequencer-client';
|
|
11
|
+
export const aztecNodeConfigMappings = {
|
|
12
|
+
...archiverConfigMappings,
|
|
13
|
+
...sequencerClientConfigMappings,
|
|
14
|
+
...proverClientConfigMappings,
|
|
15
|
+
...worldStateConfigMappings,
|
|
16
|
+
...p2pConfigMappings,
|
|
17
|
+
disableSequencer: {
|
|
18
|
+
env: 'SEQ_DISABLED',
|
|
19
|
+
description: 'Whether the sequencer is disabled for this node.',
|
|
20
|
+
...booleanConfigHelper(),
|
|
21
|
+
},
|
|
22
|
+
disableProver: {
|
|
23
|
+
env: 'PROVER_DISABLED',
|
|
24
|
+
description: 'Whether the prover is disabled for this node.',
|
|
25
|
+
...booleanConfigHelper(),
|
|
26
|
+
},
|
|
27
|
+
};
|
|
9
28
|
/**
|
|
10
29
|
* Returns the config of the aztec node from environment variables with reasonable defaults.
|
|
11
30
|
* @returns A valid aztec node config.
|
|
12
31
|
*/
|
|
13
32
|
export function getConfigEnvVars() {
|
|
14
|
-
|
|
15
|
-
const allEnvVars = {
|
|
16
|
-
...getSequencerVars(),
|
|
17
|
-
...getArchiverVars(),
|
|
18
|
-
...getP2PConfigEnvVars(),
|
|
19
|
-
...getWorldStateVars(),
|
|
20
|
-
...getProverEnvVars(),
|
|
21
|
-
disableSequencer: !!SEQ_DISABLED,
|
|
22
|
-
disableProver: ['1', 'true'].includes(PROVER_DISABLED),
|
|
23
|
-
};
|
|
24
|
-
return allEnvVars;
|
|
33
|
+
return getConfigFromMappings(aztecNodeConfigMappings);
|
|
25
34
|
}
|
|
26
35
|
/**
|
|
27
36
|
* Returns package name and version.
|
|
@@ -31,4 +40,4 @@ export function getPackageInfo() {
|
|
|
31
40
|
const { version, name } = JSON.parse(readFileSync(packageJsonPath).toString());
|
|
32
41
|
return { version, name };
|
|
33
42
|
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBdUIsc0JBQXNCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RSxPQUFPLEVBQTJCLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0csT0FBTyxFQUFrQixpQkFBaUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMvRCxPQUFPLEVBQTJCLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0YsT0FBTyxFQUE4Qiw2QkFBNkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BHLE9BQU8sRUFBeUIsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFcEMsT0FBTyxFQUFFLDZCQUE2QixFQUF5QixNQUFNLHlCQUF5QixDQUFDO0FBaUIvRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBd0M7SUFDMUUsR0FBRyxzQkFBc0I7SUFDekIsR0FBRyw2QkFBNkI7SUFDaEMsR0FBRywwQkFBMEI7SUFDN0IsR0FBRyx3QkFBd0I7SUFDM0IsR0FBRyxpQkFBaUI7SUFDcEIsZ0JBQWdCLEVBQUU7UUFDaEIsR0FBRyxFQUFFLGNBQWM7UUFDbkIsV0FBVyxFQUFFLGtEQUFrRDtRQUMvRCxHQUFHLG1CQUFtQixFQUFFO0tBQ3pCO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsR0FBRyxFQUFFLGlCQUFpQjtRQUN0QixXQUFXLEVBQUUsK0NBQStDO1FBQzVELEdBQUcsbUJBQW1CLEVBQUU7S0FDekI7Q0FDRixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQjtJQUM5QixPQUFPLHFCQUFxQixDQUFrQix1QkFBdUIsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjO0lBQzVCLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQy9GLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzNCLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http_rpc_server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/http_rpc_server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAcf,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"http_rpc_server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/http_rpc_server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAcf,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,iBA+BvD"}
|
|
@@ -4,6 +4,7 @@ import { NoteSelector } from '@aztec/foundation/abi';
|
|
|
4
4
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
5
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
6
|
import { Fr } from '@aztec/foundation/fields';
|
|
7
|
+
import { BaseHashType } from '@aztec/foundation/hash';
|
|
7
8
|
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
8
9
|
/**
|
|
9
10
|
* Wrap an AztecNode instance with a JSON RPC HTTP server.
|
|
@@ -22,6 +23,7 @@ export function createAztecNodeRpcServer(node) {
|
|
|
22
23
|
TxEffect,
|
|
23
24
|
LogId,
|
|
24
25
|
TxHash,
|
|
26
|
+
BaseHashType,
|
|
25
27
|
PublicDataWitness,
|
|
26
28
|
SiblingPath,
|
|
27
29
|
}, {
|
|
@@ -37,4 +39,4 @@ export function createAztecNodeRpcServer(node) {
|
|
|
37
39
|
['start', 'stop']);
|
|
38
40
|
return rpc;
|
|
39
41
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cF9ycGNfc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvaHR0cF9ycGNfc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCwwQkFBMEIsRUFDMUIsd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxLQUFLLEVBQ0wsMEJBQTBCLEVBQzFCLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsV0FBVyxFQUNYLEVBQUUsRUFDRixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCx3QkFBd0IsR0FDekIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFbEU7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxJQUFlO0lBQ3RELE1BQU0sR0FBRyxHQUFHLElBQUksYUFBYSxDQUMzQixJQUFJLEVBQ0o7UUFDRSxZQUFZO1FBQ1osVUFBVTtRQUNWLHdCQUF3QjtRQUN4QixFQUFFO1FBQ0YsZ0JBQWdCO1FBQ2hCLE1BQU07UUFDTixPQUFPO1FBQ1AsUUFBUTtRQUNSLEtBQUs7UUFDTCxNQUFNO1FBQ04sWUFBWTtRQUNaLGlCQUFpQjtRQUNqQixXQUFXO0tBQ1osRUFDRDtRQUNFLDBCQUEwQjtRQUMxQixZQUFZO1FBQ1osMEJBQTBCO1FBQzFCLHNCQUFzQjtRQUN0QixFQUFFO1FBQ0YsU0FBUztRQUNULHdCQUF3QjtLQUN6QjtJQUNELHNEQUFzRDtJQUN0RCxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FDbEIsQ0FBQztJQUNGLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyJ9
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
2
|
+
export declare class NodeMetrics {
|
|
3
|
+
private receiveTxCount;
|
|
4
|
+
private receiveTxDuration;
|
|
5
|
+
constructor(client: TelemetryClient, name?: string);
|
|
6
|
+
receivedTx(durationMs: number, isAccepted: boolean): void;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=node_metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node_metrics.d.ts","sourceRoot":"","sources":["../../src/aztec-node/node_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,iBAAiB,CAAY;gBAEzB,MAAM,EAAE,eAAe,EAAE,IAAI,SAAc;IAavD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO;CAQnD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Attributes, Metrics, ValueType, } from '@aztec/telemetry-client';
|
|
2
|
+
export class NodeMetrics {
|
|
3
|
+
constructor(client, name = 'AztecNode') {
|
|
4
|
+
const meter = client.getMeter(name);
|
|
5
|
+
this.receiveTxCount = meter.createUpDownCounter(Metrics.NODE_RECEIVE_TX_COUNT, {});
|
|
6
|
+
this.receiveTxDuration = meter.createHistogram(Metrics.NODE_RECEIVE_TX_DURATION, {
|
|
7
|
+
description: 'The duration of the receiveTx method',
|
|
8
|
+
unit: 'ms',
|
|
9
|
+
valueType: ValueType.INT,
|
|
10
|
+
advice: {
|
|
11
|
+
explicitBucketBoundaries: [10, 50, 100, 200, 500, 1000, 2000, 5000],
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
receivedTx(durationMs, isAccepted) {
|
|
16
|
+
this.receiveTxDuration.record(Math.ceil(durationMs), {
|
|
17
|
+
[Attributes.OK]: isAccepted,
|
|
18
|
+
});
|
|
19
|
+
this.receiveTxCount.add(1, {
|
|
20
|
+
[Attributes.OK]: isAccepted,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZV9tZXRyaWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvbm9kZV9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBRVYsT0FBTyxFQUdQLFNBQVMsR0FDVixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQVksTUFBdUIsRUFBRSxJQUFJLEdBQUcsV0FBVztRQUNyRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUU7WUFDL0UsV0FBVyxFQUFFLHNDQUFzQztZQUNuRCxJQUFJLEVBQUUsSUFBSTtZQUNWLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRztZQUN4QixNQUFNLEVBQUU7Z0JBQ04sd0JBQXdCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2FBQ3BFO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxVQUFrQixFQUFFLFVBQW1CO1FBQ2hELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNuRCxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVO1NBQzVCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUN6QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVO1NBQzVCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiJ9
|
|
@@ -33,6 +33,7 @@ export declare class AztecNodeService implements AztecNode {
|
|
|
33
33
|
private telemetry;
|
|
34
34
|
private log;
|
|
35
35
|
private packageVersion;
|
|
36
|
+
private metrics;
|
|
36
37
|
constructor(config: AztecNodeConfig, p2pClient: P2P, blockSource: L2BlockSource, encryptedLogsSource: L2LogsSource, unencryptedLogsSource: L2LogsSource, contractDataSource: ContractDataSource, l1ToL2MessageSource: L1ToL2MessageSource, worldStateSynchronizer: WorldStateSynchronizer, sequencer: SequencerClient | undefined, l1ChainId: number, version: number, globalVariableBuilder: GlobalVariableBuilder, merkleTreesDb: AztecKVStore, prover: ProverClient | undefined, txValidator: TxValidator, telemetry: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
37
38
|
/**
|
|
38
39
|
* initializes the Aztec Node, wait for component to sync.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,OAAO,EACP,YAAY,EACZ,0BAA0B,EAC1B,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,eAAe,EACpB,WAAW,EACX,KAAK,EAAE,EACP,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,SAAS,EAET,KAAK,WAAW,EAEjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,cAAc,EAEnB,EAAE,EACF,KAAK,MAAM,EAEX,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAG1B,KAAK,uBAAuB,EAE7B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,KAAK,mBAAmB,EAAuB,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAK/D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAAiB,KAAK,GAAG,EAAmB,MAAM,YAAY,CAAC;AAOtE,OAAO,EAGL,KAAK,qBAAqB,EAC1B,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAe,KAAK,sBAAsB,EAAgC,MAAM,oBAAoB,CAAC;AAE5G,OAAO,EAAE,KAAK,eAAe,EAAkB,MAAM,aAAa,CAAC;AAKnE;;GAEG;AACH,qBAAa,gBAAiB,YAAW,SAAS;;IAM9C,SAAS,CAAC,MAAM,EAAE,eAAe;IACjC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG;IACjC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa;IAC7C,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,YAAY;IACpD,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,YAAY;IACtD,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;IACzD,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB;IAC3D,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB;IACjE,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,SAAS;IACzD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM;IACpC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAClC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IAC/D,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,GAAG;IArBb,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,OAAO,CAAc;gBAGjB,MAAM,EAAE,eAAe,EACd,SAAS,EAAE,GAAG,EACd,WAAW,EAAE,aAAa,EAC1B,mBAAmB,EAAE,YAAY,EACjC,qBAAqB,EAAE,YAAY,EACnC,kBAAkB,EAAE,kBAAkB,EACtC,mBAAmB,EAAE,mBAAmB,EACxC,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,eAAe,GAAG,SAAS,EACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,YAAY,EAC7B,MAAM,EAAE,YAAY,GAAG,SAAS,EACzC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,eAAe,EAC1B,GAAG,yCAAkC;IAe/C;;;;OAIG;WACiB,aAAa,CAC/B,MAAM,EAAE,eAAe,EACvB,SAAS,CAAC,EAAE,eAAe,EAC3B,GAAG,yCAAkC,EACrC,QAAQ,yCAAuC,GAC9C,OAAO,CAAC,gBAAgB,CAAC;IA8E5B;;;OAGG;IACI,YAAY,IAAI,eAAe,GAAG,SAAS;IAI3C,SAAS,IAAI,YAAY,GAAG,SAAS;IAIrC,cAAc,IAAI,aAAa;IAItC;;;OAGG;IACI,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI7D;;;OAGG;IACU,OAAO;IAIpB;;;;OAIG;IACU,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAInE;;;;;OAKG;IACU,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAIvE;;;OAGG;IACU,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAIjC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIpD;;;OAGG;IACI,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAIxC;;;OAGG;IACI,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAIpC;;;OAGG;IACI,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAI7B,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAIlE,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC;IAI3F;;;;;;OAMG;IACI,OAAO,CAAC,QAAQ,SAAS,OAAO,EACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;IAKlD;;;;OAIG;IACH,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAI1E;;;OAGG;IACU,MAAM,CAAC,EAAE,EAAE,EAAE;IAeb,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAkBtD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAIjE;;OAEG;IACU,IAAI;IAUjB;;;OAGG;IACI,aAAa;IAIpB;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM;IAIjC;;;;;;OAMG;IACU,aAAa,CACxB,WAAW,EAAE,aAAa,EAC1B,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,EAAE,GACZ,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAK9B;;;;;OAKG;IACU,uBAAuB,CAClC,WAAW,EAAE,aAAa,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,OAAO,qBAAqB,CAAC,CAAC;IAKrD;;;;;OAKG;IACU,sBAAsB,CACjC,WAAW,EAAE,aAAa,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,OAAO,qBAAqB,CAAC,CAAC;IAKrD;;;;;;OAMG;IACU,iCAAiC,CAC5C,WAAW,EAAE,aAAa,EAC1B,aAAa,EAAE,EAAE,EACjB,UAAU,SAAK,GACd,OAAO,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAC,GAAG,SAAS,CAAC;IAa9E;;;;;;;;OAQG;IACU,qBAAqB,CAAC,aAAa,EAAE,EAAE,EAAE,kBAAkB,SAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlH;;;;;;;;;OASG;IACU,iCAAiC,CAC5C,WAAW,EAAE,aAAa,EAC1B,aAAa,EAAE,EAAE,GAChB,OAAO,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAmEzC;;;;;OAKG;IACU,qBAAqB,CAChC,WAAW,EAAE,aAAa,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,OAAO,cAAc,CAAC,CAAC;IAK9C;;;;;OAKG;IACU,wBAAwB,CACnC,WAAW,EAAE,aAAa,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,OAAO,uBAAuB,CAAC,CAAC;IAKvD;;;;;OAKG;IACU,6BAA6B,CACxC,WAAW,EAAE,aAAa,EAC1B,SAAS,EAAE,EAAE,GACZ,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC;IAsBlD;;;;;;;;;;;;;OAaG;IACU,gCAAgC,CAC3C,WAAW,EAAE,aAAa,EAC1B,SAAS,EAAE,EAAE,GACZ,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC;IAmB5C,wBAAwB,CAAC,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAkBhH;;;;;;;;;;OAUG;IACU,kBAAkB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,EAAE,CAAC;IAe1G;;;OAGG;IACU,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC;;;QAGI;IACS,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAqD5D,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,GAAG,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/E,4BAA4B,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAUlE,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CA0C7F"}
|
|
@@ -2,7 +2,7 @@ var _AztecNodeService_instances, _AztecNodeService_getWorldState, _AztecNodeServ
|
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
3
|
import { createArchiver } from '@aztec/archiver';
|
|
4
4
|
import { BBCircuitVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
|
|
5
|
-
import {
|
|
5
|
+
import { LogType, MerkleTreeId, NullifierMembershipWitness, PublicDataWitness, PublicSimulationOutput, SiblingPath, TxReceipt, TxStatus, partitionReverts, } from '@aztec/circuit-types';
|
|
6
6
|
import { EthAddress, Fr, INITIAL_L2_BLOCK_NUM, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, } from '@aztec/circuits.js';
|
|
7
7
|
import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
|
|
8
8
|
import { createEthereumChain } from '@aztec/ethereum';
|
|
@@ -10,20 +10,22 @@ import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
|
10
10
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
11
11
|
import { sha256Trunc } from '@aztec/foundation/crypto';
|
|
12
12
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
13
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
13
14
|
import { createStore, openTmpStore } from '@aztec/kv-store/utils';
|
|
14
15
|
import { SHA256Trunc, StandardTree, UnbalancedTree } from '@aztec/merkle-tree';
|
|
15
16
|
import { AztecKVTxPool, createP2PClient } from '@aztec/p2p';
|
|
16
17
|
import { getCanonicalClassRegisterer } from '@aztec/protocol-contracts/class-registerer';
|
|
17
|
-
import {
|
|
18
|
+
import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
|
|
18
19
|
import { getCanonicalInstanceDeployer } from '@aztec/protocol-contracts/instance-deployer';
|
|
19
20
|
import { getCanonicalKeyRegistryAddress } from '@aztec/protocol-contracts/key-registry';
|
|
20
21
|
import { getCanonicalMultiCallEntrypointAddress } from '@aztec/protocol-contracts/multi-call-entrypoint';
|
|
21
22
|
import { createProverClient } from '@aztec/prover-client';
|
|
22
|
-
import { SequencerClient, getGlobalVariableBuilder } from '@aztec/sequencer-client';
|
|
23
|
+
import { AggregateTxValidator, DataTxValidator, SequencerClient, getGlobalVariableBuilder, } from '@aztec/sequencer-client';
|
|
23
24
|
import { PublicProcessorFactory, WASMSimulator, createSimulationProvider } from '@aztec/simulator';
|
|
24
25
|
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
25
26
|
import { MerkleTrees, createWorldStateSynchronizer } from '@aztec/world-state';
|
|
26
27
|
import { getPackageInfo } from './config.js';
|
|
28
|
+
import { NodeMetrics } from './node_metrics.js';
|
|
27
29
|
import { MetadataTxValidator } from './tx_validator/tx_metadata_validator.js';
|
|
28
30
|
import { TxProofValidator } from './tx_validator/tx_proof_validator.js';
|
|
29
31
|
/**
|
|
@@ -50,6 +52,7 @@ export class AztecNodeService {
|
|
|
50
52
|
this.telemetry = telemetry;
|
|
51
53
|
this.log = log;
|
|
52
54
|
this.packageVersion = getPackageInfo().version;
|
|
55
|
+
this.metrics = new NodeMetrics(telemetry, 'AztecNodeService');
|
|
53
56
|
const message = `Started Aztec Node against chain 0x${l1ChainId.toString(16)} with contracts - \n` +
|
|
54
57
|
`Rollup: ${config.l1Contracts.rollupAddress.toString()}\n` +
|
|
55
58
|
`Registry: ${config.l1Contracts.registryAddress.toString()}\n` +
|
|
@@ -65,7 +68,7 @@ export class AztecNodeService {
|
|
|
65
68
|
*/
|
|
66
69
|
static async createAndSync(config, telemetry, log = createDebugLogger('aztec:node'), storeLog = createDebugLogger('aztec:node:lmdb')) {
|
|
67
70
|
telemetry ?? (telemetry = new NoopTelemetryClient());
|
|
68
|
-
const ethereumChain = createEthereumChain(config.
|
|
71
|
+
const ethereumChain = createEthereumChain(config.l1RpcUrl, config.l1ChainId);
|
|
69
72
|
//validate that the actual chain id matches that specified in configuration
|
|
70
73
|
if (config.l1ChainId !== ethereumChain.chainInfo.id) {
|
|
71
74
|
throw new Error(`RPC URL configured for chain id ${ethereumChain.chainInfo.id} but expected id ${config.l1ChainId}`);
|
|
@@ -82,9 +85,9 @@ export class AztecNodeService {
|
|
|
82
85
|
// start both and wait for them to sync from the block source
|
|
83
86
|
await Promise.all([p2pClient.start(), worldStateSynchronizer.start()]);
|
|
84
87
|
const proofVerifier = config.realProofs ? await BBCircuitVerifier.new(config) : new TestCircuitVerifier();
|
|
85
|
-
const txValidator = new AggregateTxValidator(new MetadataTxValidator(config.l1ChainId), new TxProofValidator(proofVerifier));
|
|
88
|
+
const txValidator = new AggregateTxValidator(new DataTxValidator(), new MetadataTxValidator(config.l1ChainId), new TxProofValidator(proofVerifier));
|
|
86
89
|
const simulationProvider = await createSimulationProvider(config, log);
|
|
87
|
-
const prover = await createProverClient(config,
|
|
90
|
+
const prover = await createProverClient(config, telemetry);
|
|
88
91
|
if (!prover && !config.disableSequencer) {
|
|
89
92
|
throw new Error("Can't start a sequencer without a prover");
|
|
90
93
|
}
|
|
@@ -199,13 +202,16 @@ export class AztecNodeService {
|
|
|
199
202
|
* @param tx - The transaction to be submitted.
|
|
200
203
|
*/
|
|
201
204
|
async sendTx(tx) {
|
|
205
|
+
const timer = new Timer();
|
|
202
206
|
this.log.info(`Received tx ${tx.getTxHash()}`);
|
|
203
207
|
const [_, invalidTxs] = await this.txValidator.validateTxs([tx]);
|
|
204
208
|
if (invalidTxs.length > 0) {
|
|
205
209
|
this.log.warn(`Rejecting tx ${tx.getTxHash()} because of validation errors`);
|
|
210
|
+
this.metrics.receivedTx(timer.ms(), false);
|
|
206
211
|
return;
|
|
207
212
|
}
|
|
208
213
|
await this.p2pClient.sendTx(tx);
|
|
214
|
+
this.metrics.receivedTx(timer.ms(), true);
|
|
209
215
|
}
|
|
210
216
|
async getTxReceipt(txHash) {
|
|
211
217
|
let txReceipt = new TxReceipt(txHash, TxStatus.DROPPED, 'Tx dropped by P2P node.');
|
|
@@ -518,7 +524,7 @@ export class AztecNodeService {
|
|
|
518
524
|
getProtocolContractAddresses() {
|
|
519
525
|
return Promise.resolve({
|
|
520
526
|
classRegisterer: getCanonicalClassRegisterer().address,
|
|
521
|
-
|
|
527
|
+
feeJuice: getCanonicalFeeJuice().address,
|
|
522
528
|
instanceDeployer: getCanonicalInstanceDeployer().address,
|
|
523
529
|
keyRegistry: getCanonicalKeyRegistryAddress(),
|
|
524
530
|
multiCallEntrypoint: getCanonicalMultiCallEntrypointAddress(),
|
|
@@ -567,4 +573,4 @@ async function _AztecNodeService_syncWorldState() {
|
|
|
567
573
|
const blockSourceHeight = await this.blockSource.getBlockNumber();
|
|
568
574
|
return this.worldStateSynchronizer.syncImmediate(blockSourceHeight);
|
|
569
575
|
};
|
|
570
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFFLE9BQU8sRUFDTCxvQkFBb0IsRUFXcEIsT0FBTyxFQUNQLFlBQVksRUFDWiwwQkFBMEIsRUFHMUIsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUV0QixXQUFXLEVBSVgsU0FBUyxFQUNULFFBQVEsRUFFUixnQkFBZ0IsR0FDakIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBRUwsVUFBVSxFQUNWLEVBQUUsRUFFRixvQkFBb0IsRUFJcEIsbUNBQW1DLEdBSXBDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEUsT0FBTyxFQUE0QixtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0UsT0FBTyxFQUFFLGFBQWEsRUFBWSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdEUsT0FBTyxFQUFFLDJCQUEyQixF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
|
|
576
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFFLE9BQU8sRUFXTCxPQUFPLEVBQ1AsWUFBWSxFQUNaLDBCQUEwQixFQUcxQixpQkFBaUIsRUFDakIsc0JBQXNCLEVBRXRCLFdBQVcsRUFJWCxTQUFTLEVBQ1QsUUFBUSxFQUVSLGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFFTCxVQUFVLEVBQ1YsRUFBRSxFQUVGLG9CQUFvQixFQUlwQixtQ0FBbUMsR0FJcEMsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RSxPQUFPLEVBQTRCLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhELE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0UsT0FBTyxFQUFFLGFBQWEsRUFBWSxlQUFlLEVBQUUsTUFBTSxZQUFZ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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/aztec-node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.48.0",
|
|
4
4
|
"main": "dest/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": "./dest/index.js",
|
|
@@ -56,23 +56,23 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@aztec/archiver": "0.
|
|
60
|
-
"@aztec/bb-prover": "0.
|
|
61
|
-
"@aztec/circuit-types": "0.
|
|
62
|
-
"@aztec/circuits.js": "0.
|
|
63
|
-
"@aztec/ethereum": "0.
|
|
64
|
-
"@aztec/foundation": "0.
|
|
65
|
-
"@aztec/kv-store": "0.
|
|
66
|
-
"@aztec/l1-artifacts": "0.
|
|
67
|
-
"@aztec/merkle-tree": "0.
|
|
68
|
-
"@aztec/p2p": "0.
|
|
69
|
-
"@aztec/protocol-contracts": "0.
|
|
70
|
-
"@aztec/prover-client": "0.
|
|
71
|
-
"@aztec/sequencer-client": "0.
|
|
72
|
-
"@aztec/simulator": "0.
|
|
73
|
-
"@aztec/telemetry-client": "0.
|
|
74
|
-
"@aztec/types": "0.
|
|
75
|
-
"@aztec/world-state": "0.
|
|
59
|
+
"@aztec/archiver": "0.48.0",
|
|
60
|
+
"@aztec/bb-prover": "0.48.0",
|
|
61
|
+
"@aztec/circuit-types": "0.48.0",
|
|
62
|
+
"@aztec/circuits.js": "0.48.0",
|
|
63
|
+
"@aztec/ethereum": "0.48.0",
|
|
64
|
+
"@aztec/foundation": "0.48.0",
|
|
65
|
+
"@aztec/kv-store": "0.48.0",
|
|
66
|
+
"@aztec/l1-artifacts": "0.48.0",
|
|
67
|
+
"@aztec/merkle-tree": "0.48.0",
|
|
68
|
+
"@aztec/p2p": "0.48.0",
|
|
69
|
+
"@aztec/protocol-contracts": "0.48.0",
|
|
70
|
+
"@aztec/prover-client": "0.48.0",
|
|
71
|
+
"@aztec/sequencer-client": "0.48.0",
|
|
72
|
+
"@aztec/simulator": "0.48.0",
|
|
73
|
+
"@aztec/telemetry-client": "0.48.0",
|
|
74
|
+
"@aztec/types": "0.48.0",
|
|
75
|
+
"@aztec/world-state": "0.48.0",
|
|
76
76
|
"koa": "^2.14.2",
|
|
77
77
|
"koa-router": "^12.0.0",
|
|
78
78
|
"tslib": "^2.4.0"
|
package/src/aztec-node/config.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { type ArchiverConfig,
|
|
2
|
-
import { type
|
|
3
|
-
import { type
|
|
4
|
-
import { type
|
|
5
|
-
import { type
|
|
1
|
+
import { type ArchiverConfig, archiverConfigMappings } from '@aztec/archiver';
|
|
2
|
+
import { type ConfigMappingsType, booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
|
|
3
|
+
import { type P2PConfig, p2pConfigMappings } from '@aztec/p2p';
|
|
4
|
+
import { type ProverClientConfig, proverClientConfigMappings } from '@aztec/prover-client';
|
|
5
|
+
import { type SequencerClientConfig, sequencerClientConfigMappings } from '@aztec/sequencer-client';
|
|
6
|
+
import { type WorldStateConfig, worldStateConfigMappings } from '@aztec/world-state';
|
|
6
7
|
|
|
7
8
|
import { readFileSync } from 'fs';
|
|
8
9
|
import { dirname, resolve } from 'path';
|
|
9
10
|
import { fileURLToPath } from 'url';
|
|
10
11
|
|
|
12
|
+
export { sequencerClientConfigMappings, SequencerClientConfig } from '@aztec/sequencer-client';
|
|
13
|
+
|
|
11
14
|
/**
|
|
12
15
|
* The configuration the aztec node.
|
|
13
16
|
*/
|
|
@@ -23,24 +26,30 @@ export type AztecNodeConfig = ArchiverConfig &
|
|
|
23
26
|
disableProver: boolean;
|
|
24
27
|
};
|
|
25
28
|
|
|
29
|
+
export const aztecNodeConfigMappings: ConfigMappingsType<AztecNodeConfig> = {
|
|
30
|
+
...archiverConfigMappings,
|
|
31
|
+
...sequencerClientConfigMappings,
|
|
32
|
+
...proverClientConfigMappings,
|
|
33
|
+
...worldStateConfigMappings,
|
|
34
|
+
...p2pConfigMappings,
|
|
35
|
+
disableSequencer: {
|
|
36
|
+
env: 'SEQ_DISABLED',
|
|
37
|
+
description: 'Whether the sequencer is disabled for this node.',
|
|
38
|
+
...booleanConfigHelper(),
|
|
39
|
+
},
|
|
40
|
+
disableProver: {
|
|
41
|
+
env: 'PROVER_DISABLED',
|
|
42
|
+
description: 'Whether the prover is disabled for this node.',
|
|
43
|
+
...booleanConfigHelper(),
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
26
47
|
/**
|
|
27
48
|
* Returns the config of the aztec node from environment variables with reasonable defaults.
|
|
28
49
|
* @returns A valid aztec node config.
|
|
29
50
|
*/
|
|
30
51
|
export function getConfigEnvVars(): AztecNodeConfig {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const allEnvVars: AztecNodeConfig = {
|
|
34
|
-
...getSequencerVars(),
|
|
35
|
-
...getArchiverVars(),
|
|
36
|
-
...getP2PConfigEnvVars(),
|
|
37
|
-
...getWorldStateVars(),
|
|
38
|
-
...getProverEnvVars(),
|
|
39
|
-
disableSequencer: !!SEQ_DISABLED,
|
|
40
|
-
disableProver: ['1', 'true'].includes(PROVER_DISABLED),
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
return allEnvVars;
|
|
52
|
+
return getConfigFromMappings<AztecNodeConfig>(aztecNodeConfigMappings);
|
|
44
53
|
}
|
|
45
54
|
|
|
46
55
|
/**
|
|
@@ -19,6 +19,7 @@ import { NoteSelector } from '@aztec/foundation/abi';
|
|
|
19
19
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
20
20
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
21
21
|
import { Fr } from '@aztec/foundation/fields';
|
|
22
|
+
import { BaseHashType } from '@aztec/foundation/hash';
|
|
22
23
|
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
23
24
|
|
|
24
25
|
/**
|
|
@@ -40,6 +41,7 @@ export function createAztecNodeRpcServer(node: AztecNode) {
|
|
|
40
41
|
TxEffect,
|
|
41
42
|
LogId,
|
|
42
43
|
TxHash,
|
|
44
|
+
BaseHashType,
|
|
43
45
|
PublicDataWitness,
|
|
44
46
|
SiblingPath,
|
|
45
47
|
},
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Attributes,
|
|
3
|
+
type Histogram,
|
|
4
|
+
Metrics,
|
|
5
|
+
type TelemetryClient,
|
|
6
|
+
type UpDownCounter,
|
|
7
|
+
ValueType,
|
|
8
|
+
} from '@aztec/telemetry-client';
|
|
9
|
+
|
|
10
|
+
export class NodeMetrics {
|
|
11
|
+
private receiveTxCount: UpDownCounter;
|
|
12
|
+
private receiveTxDuration: Histogram;
|
|
13
|
+
|
|
14
|
+
constructor(client: TelemetryClient, name = 'AztecNode') {
|
|
15
|
+
const meter = client.getMeter(name);
|
|
16
|
+
this.receiveTxCount = meter.createUpDownCounter(Metrics.NODE_RECEIVE_TX_COUNT, {});
|
|
17
|
+
this.receiveTxDuration = meter.createHistogram(Metrics.NODE_RECEIVE_TX_DURATION, {
|
|
18
|
+
description: 'The duration of the receiveTx method',
|
|
19
|
+
unit: 'ms',
|
|
20
|
+
valueType: ValueType.INT,
|
|
21
|
+
advice: {
|
|
22
|
+
explicitBucketBoundaries: [10, 50, 100, 200, 500, 1000, 2000, 5000],
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
receivedTx(durationMs: number, isAccepted: boolean) {
|
|
28
|
+
this.receiveTxDuration.record(Math.ceil(durationMs), {
|
|
29
|
+
[Attributes.OK]: isAccepted,
|
|
30
|
+
});
|
|
31
|
+
this.receiveTxCount.add(1, {
|
|
32
|
+
[Attributes.OK]: isAccepted,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
package/src/aztec-node/server.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createArchiver } from '@aztec/archiver';
|
|
2
2
|
import { BBCircuitVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
|
|
3
3
|
import {
|
|
4
|
-
AggregateTxValidator,
|
|
5
4
|
type AztecNode,
|
|
6
5
|
type FromLogType,
|
|
7
6
|
type GetUnencryptedLogsResponse,
|
|
@@ -50,17 +49,24 @@ import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
|
50
49
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
51
50
|
import { sha256Trunc } from '@aztec/foundation/crypto';
|
|
52
51
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
52
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
53
53
|
import { type AztecKVStore } from '@aztec/kv-store';
|
|
54
54
|
import { createStore, openTmpStore } from '@aztec/kv-store/utils';
|
|
55
55
|
import { SHA256Trunc, StandardTree, UnbalancedTree } from '@aztec/merkle-tree';
|
|
56
56
|
import { AztecKVTxPool, type P2P, createP2PClient } from '@aztec/p2p';
|
|
57
57
|
import { getCanonicalClassRegisterer } from '@aztec/protocol-contracts/class-registerer';
|
|
58
|
-
import {
|
|
58
|
+
import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
|
|
59
59
|
import { getCanonicalInstanceDeployer } from '@aztec/protocol-contracts/instance-deployer';
|
|
60
60
|
import { getCanonicalKeyRegistryAddress } from '@aztec/protocol-contracts/key-registry';
|
|
61
61
|
import { getCanonicalMultiCallEntrypointAddress } from '@aztec/protocol-contracts/multi-call-entrypoint';
|
|
62
62
|
import { createProverClient } from '@aztec/prover-client';
|
|
63
|
-
import {
|
|
63
|
+
import {
|
|
64
|
+
AggregateTxValidator,
|
|
65
|
+
DataTxValidator,
|
|
66
|
+
type GlobalVariableBuilder,
|
|
67
|
+
SequencerClient,
|
|
68
|
+
getGlobalVariableBuilder,
|
|
69
|
+
} from '@aztec/sequencer-client';
|
|
64
70
|
import { PublicProcessorFactory, WASMSimulator, createSimulationProvider } from '@aztec/simulator';
|
|
65
71
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
66
72
|
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
@@ -73,6 +79,7 @@ import {
|
|
|
73
79
|
import { MerkleTrees, type WorldStateSynchronizer, createWorldStateSynchronizer } from '@aztec/world-state';
|
|
74
80
|
|
|
75
81
|
import { type AztecNodeConfig, getPackageInfo } from './config.js';
|
|
82
|
+
import { NodeMetrics } from './node_metrics.js';
|
|
76
83
|
import { MetadataTxValidator } from './tx_validator/tx_metadata_validator.js';
|
|
77
84
|
import { TxProofValidator } from './tx_validator/tx_proof_validator.js';
|
|
78
85
|
|
|
@@ -82,6 +89,8 @@ import { TxProofValidator } from './tx_validator/tx_proof_validator.js';
|
|
|
82
89
|
export class AztecNodeService implements AztecNode {
|
|
83
90
|
private packageVersion: string;
|
|
84
91
|
|
|
92
|
+
private metrics: NodeMetrics;
|
|
93
|
+
|
|
85
94
|
constructor(
|
|
86
95
|
protected config: AztecNodeConfig,
|
|
87
96
|
protected readonly p2pClient: P2P,
|
|
@@ -102,6 +111,8 @@ export class AztecNodeService implements AztecNode {
|
|
|
102
111
|
private log = createDebugLogger('aztec:node'),
|
|
103
112
|
) {
|
|
104
113
|
this.packageVersion = getPackageInfo().version;
|
|
114
|
+
this.metrics = new NodeMetrics(telemetry, 'AztecNodeService');
|
|
115
|
+
|
|
105
116
|
const message =
|
|
106
117
|
`Started Aztec Node against chain 0x${l1ChainId.toString(16)} with contracts - \n` +
|
|
107
118
|
`Rollup: ${config.l1Contracts.rollupAddress.toString()}\n` +
|
|
@@ -124,7 +135,7 @@ export class AztecNodeService implements AztecNode {
|
|
|
124
135
|
storeLog = createDebugLogger('aztec:node:lmdb'),
|
|
125
136
|
): Promise<AztecNodeService> {
|
|
126
137
|
telemetry ??= new NoopTelemetryClient();
|
|
127
|
-
const ethereumChain = createEthereumChain(config.
|
|
138
|
+
const ethereumChain = createEthereumChain(config.l1RpcUrl, config.l1ChainId);
|
|
128
139
|
//validate that the actual chain id matches that specified in configuration
|
|
129
140
|
if (config.l1ChainId !== ethereumChain.chainInfo.id) {
|
|
130
141
|
throw new Error(
|
|
@@ -151,13 +162,14 @@ export class AztecNodeService implements AztecNode {
|
|
|
151
162
|
|
|
152
163
|
const proofVerifier = config.realProofs ? await BBCircuitVerifier.new(config) : new TestCircuitVerifier();
|
|
153
164
|
const txValidator = new AggregateTxValidator(
|
|
165
|
+
new DataTxValidator(),
|
|
154
166
|
new MetadataTxValidator(config.l1ChainId),
|
|
155
167
|
new TxProofValidator(proofVerifier),
|
|
156
168
|
);
|
|
157
169
|
|
|
158
170
|
const simulationProvider = await createSimulationProvider(config, log);
|
|
159
171
|
|
|
160
|
-
const prover = await createProverClient(config,
|
|
172
|
+
const prover = await createProverClient(config, telemetry);
|
|
161
173
|
|
|
162
174
|
if (!prover && !config.disableSequencer) {
|
|
163
175
|
throw new Error("Can't start a sequencer without a prover");
|
|
@@ -324,15 +336,18 @@ export class AztecNodeService implements AztecNode {
|
|
|
324
336
|
* @param tx - The transaction to be submitted.
|
|
325
337
|
*/
|
|
326
338
|
public async sendTx(tx: Tx) {
|
|
339
|
+
const timer = new Timer();
|
|
327
340
|
this.log.info(`Received tx ${tx.getTxHash()}`);
|
|
328
341
|
|
|
329
342
|
const [_, invalidTxs] = await this.txValidator.validateTxs([tx]);
|
|
330
343
|
if (invalidTxs.length > 0) {
|
|
331
344
|
this.log.warn(`Rejecting tx ${tx.getTxHash()} because of validation errors`);
|
|
345
|
+
this.metrics.receivedTx(timer.ms(), false);
|
|
332
346
|
return;
|
|
333
347
|
}
|
|
334
348
|
|
|
335
349
|
await this.p2pClient!.sendTx(tx);
|
|
350
|
+
this.metrics.receivedTx(timer.ms(), true);
|
|
336
351
|
}
|
|
337
352
|
|
|
338
353
|
public async getTxReceipt(txHash: TxHash): Promise<TxReceipt> {
|
|
@@ -727,6 +742,7 @@ export class AztecNodeService implements AztecNode {
|
|
|
727
742
|
this.telemetry,
|
|
728
743
|
);
|
|
729
744
|
const processor = publicProcessorFactory.create(prevHeader, newGlobalVariables);
|
|
745
|
+
|
|
730
746
|
// REFACTOR: Consider merging ProcessReturnValues into ProcessedTx
|
|
731
747
|
const [processedTxs, failedTxs, returns] = await processor.process([tx]);
|
|
732
748
|
// REFACTOR: Consider returning the error/revert rather than throwing
|
|
@@ -772,7 +788,7 @@ export class AztecNodeService implements AztecNode {
|
|
|
772
788
|
public getProtocolContractAddresses(): Promise<ProtocolContractAddresses> {
|
|
773
789
|
return Promise.resolve({
|
|
774
790
|
classRegisterer: getCanonicalClassRegisterer().address,
|
|
775
|
-
|
|
791
|
+
feeJuice: getCanonicalFeeJuice().address,
|
|
776
792
|
instanceDeployer: getCanonicalInstanceDeployer().address,
|
|
777
793
|
keyRegistry: getCanonicalKeyRegistryAddress(),
|
|
778
794
|
multiCallEntrypoint: getCanonicalMultiCallEntrypointAddress(),
|