@aztec/aztec-node 0.82.2 → 0.82.3-nightly.20250403
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 -7
- package/dest/aztec-node/config.d.ts.map +1 -1
- package/dest/aztec-node/config.js +6 -6
- package/dest/aztec-node/server.d.ts +7 -1
- package/dest/aztec-node/server.d.ts.map +1 -1
- package/dest/aztec-node/server.js +78 -7
- package/dest/sentinel/config.d.ts +7 -0
- package/dest/sentinel/config.d.ts.map +1 -0
- package/dest/sentinel/config.js +13 -0
- package/dest/sentinel/factory.d.ts +8 -0
- package/dest/sentinel/factory.d.ts.map +1 -0
- package/dest/sentinel/factory.js +15 -0
- package/dest/sentinel/index.d.ts +3 -0
- package/dest/sentinel/index.d.ts.map +1 -0
- package/dest/sentinel/index.js +1 -0
- package/dest/sentinel/sentinel.d.ts +64 -0
- package/dest/sentinel/sentinel.d.ts.map +1 -0
- package/dest/sentinel/sentinel.js +246 -0
- package/dest/sentinel/store.d.ts +21 -0
- package/dest/sentinel/store.d.ts.map +1 -0
- package/dest/sentinel/store.js +100 -0
- package/package.json +25 -21
- package/src/aztec-node/config.ts +21 -14
- package/src/aztec-node/server.ts +107 -15
- package/src/sentinel/config.ts +19 -0
- package/src/sentinel/factory.ts +31 -0
- package/src/sentinel/index.ts +8 -0
- package/src/sentinel/sentinel.ts +280 -0
- package/src/sentinel/store.ts +103 -0
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { type ArchiverConfig } from '@aztec/archiver/config';
|
|
2
|
-
import { type L1ContractAddresses } from '@aztec/ethereum';
|
|
2
|
+
import { type GenesisStateConfig, type L1ContractAddresses } from '@aztec/ethereum';
|
|
3
3
|
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
4
4
|
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
5
|
+
import { type SharedNodeConfig } from '@aztec/node-lib/config';
|
|
5
6
|
import { type P2PConfig } from '@aztec/p2p/config';
|
|
6
|
-
import { type
|
|
7
|
+
import { type ProverClientUserConfig } from '@aztec/prover-client/config';
|
|
7
8
|
import { type SequencerClientConfig, sequencerClientConfigMappings } from '@aztec/sequencer-client/config';
|
|
8
9
|
import { type ValidatorClientConfig } from '@aztec/validator-client/config';
|
|
9
10
|
import { type WorldStateConfig } from '@aztec/world-state/config';
|
|
11
|
+
import { type SentinelConfig } from '../sentinel/config.js';
|
|
10
12
|
export { sequencerClientConfigMappings, type SequencerClientConfig };
|
|
11
13
|
/**
|
|
12
14
|
* The configuration the aztec node.
|
|
13
15
|
*/
|
|
14
|
-
export type AztecNodeConfig = ArchiverConfig & SequencerClientConfig & ValidatorClientConfig &
|
|
16
|
+
export type AztecNodeConfig = ArchiverConfig & SequencerClientConfig & ValidatorClientConfig & ProverClientUserConfig & WorldStateConfig & Pick<ProverClientUserConfig, 'bbBinaryPath' | 'bbWorkingDirectory' | 'realProofs'> & P2PConfig & DataStoreConfig & SentinelConfig & SharedNodeConfig & GenesisStateConfig & {
|
|
17
|
+
/** L1 contracts addresses */
|
|
18
|
+
l1Contracts: L1ContractAddresses;
|
|
15
19
|
/** Whether the validator is disabled for this node */
|
|
16
20
|
disableValidator: boolean;
|
|
17
|
-
/** Whether to populate the genesis state with initial fee juice for the test accounts */
|
|
18
|
-
testAccounts: boolean;
|
|
19
|
-
} & {
|
|
20
|
-
l1Contracts: L1ContractAddresses;
|
|
21
21
|
};
|
|
22
22
|
export declare const aztecNodeConfigMappings: ConfigMappingsType<AztecNodeConfig>;
|
|
23
23
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/aztec-node/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,wBAAwB,CAAC;AACrF,OAAO,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/aztec-node/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,wBAAwB,CAAC;AACrF,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAGzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,kBAAkB,EAA8C,MAAM,0BAA0B,CAAC;AAC/G,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,KAAK,sBAAsB,EAA8B,MAAM,6BAA6B,CAAC;AACtG,OAAO,EAAE,KAAK,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,KAAK,qBAAqB,EAAiC,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,2BAA2B,CAAC;AAM5F,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,uBAAuB,CAAC;AAEpF,OAAO,EAAE,6BAA6B,EAAE,KAAK,qBAAqB,EAAE,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,GAC1C,qBAAqB,GACrB,qBAAqB,GACrB,sBAAsB,GACtB,gBAAgB,GAChB,IAAI,CAAC,sBAAsB,EAAE,cAAc,GAAG,oBAAoB,GAAG,YAAY,CAAC,GAClF,SAAS,GACT,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,kBAAkB,GAAG;IACnB,6BAA6B;IAC7B,WAAW,EAAE,mBAAmB,CAAC;IACjC,sDAAsD;IACtD,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEJ,eAAO,MAAM,uBAAuB,EAAE,kBAAkB,CAAC,eAAe,CAoBvE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,CAElD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,QAOhC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { archiverConfigMappings } from '@aztec/archiver/config';
|
|
2
|
-
import { l1ContractAddressesMapping } from '@aztec/ethereum';
|
|
2
|
+
import { genesisStateConfigMappings, l1ContractAddressesMapping } from '@aztec/ethereum';
|
|
3
3
|
import { booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
|
|
4
4
|
import { dataConfigMappings } from '@aztec/kv-store/config';
|
|
5
|
+
import { sharedNodeConfigMappings } from '@aztec/node-lib/config';
|
|
5
6
|
import { p2pConfigMappings } from '@aztec/p2p/config';
|
|
6
7
|
import { proverClientConfigMappings } from '@aztec/prover-client/config';
|
|
7
8
|
import { sequencerClientConfigMappings } from '@aztec/sequencer-client/config';
|
|
@@ -10,6 +11,7 @@ import { worldStateConfigMappings } from '@aztec/world-state/config';
|
|
|
10
11
|
import { readFileSync } from 'fs';
|
|
11
12
|
import { dirname, resolve } from 'path';
|
|
12
13
|
import { fileURLToPath } from 'url';
|
|
14
|
+
import { sentinelConfigMappings } from '../sentinel/config.js';
|
|
13
15
|
export { sequencerClientConfigMappings };
|
|
14
16
|
export const aztecNodeConfigMappings = {
|
|
15
17
|
...dataConfigMappings,
|
|
@@ -19,6 +21,9 @@ export const aztecNodeConfigMappings = {
|
|
|
19
21
|
...proverClientConfigMappings,
|
|
20
22
|
...worldStateConfigMappings,
|
|
21
23
|
...p2pConfigMappings,
|
|
24
|
+
...sentinelConfigMappings,
|
|
25
|
+
...sharedNodeConfigMappings,
|
|
26
|
+
...genesisStateConfigMappings,
|
|
22
27
|
l1Contracts: {
|
|
23
28
|
description: 'The deployed L1 contract addresses',
|
|
24
29
|
nested: l1ContractAddressesMapping
|
|
@@ -27,11 +32,6 @@ export const aztecNodeConfigMappings = {
|
|
|
27
32
|
env: 'VALIDATOR_DISABLED',
|
|
28
33
|
description: 'Whether the validator is disabled for this node.',
|
|
29
34
|
...booleanConfigHelper()
|
|
30
|
-
},
|
|
31
|
-
testAccounts: {
|
|
32
|
-
env: 'TEST_ACCOUNTS',
|
|
33
|
-
description: 'Whether to populate the genesis state with initial fee juice for the test accounts.',
|
|
34
|
-
...booleanConfigHelper()
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
37
|
/**
|
|
@@ -18,7 +18,9 @@ import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
|
18
18
|
import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
19
19
|
import { MerkleTreeId, NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
20
20
|
import { type BlockHeader, PublicSimulationOutput, Tx, TxEffect, type TxHash, TxReceipt, type TxValidationResult } from '@aztec/stdlib/tx';
|
|
21
|
+
import type { ValidatorsStats } from '@aztec/stdlib/validators';
|
|
21
22
|
import { type TelemetryClient, type Traceable, type Tracer } from '@aztec/telemetry-client';
|
|
23
|
+
import { Sentinel } from '../sentinel/sentinel.js';
|
|
22
24
|
import { type AztecNodeConfig } from './config.js';
|
|
23
25
|
/**
|
|
24
26
|
* The aztec node.
|
|
@@ -33,6 +35,7 @@ export declare class AztecNodeService implements AztecNode, AztecNodeAdmin, Trac
|
|
|
33
35
|
protected readonly l1ToL2MessageSource: L1ToL2MessageSource;
|
|
34
36
|
protected readonly worldStateSynchronizer: WorldStateSynchronizer;
|
|
35
37
|
protected readonly sequencer: SequencerClient | undefined;
|
|
38
|
+
protected readonly validatorsSentinel: Sentinel | undefined;
|
|
36
39
|
protected readonly l1ChainId: number;
|
|
37
40
|
protected readonly version: number;
|
|
38
41
|
protected readonly globalVariableBuilder: GlobalVariableBuilder;
|
|
@@ -41,9 +44,10 @@ export declare class AztecNodeService implements AztecNode, AztecNodeAdmin, Trac
|
|
|
41
44
|
private log;
|
|
42
45
|
private packageVersion;
|
|
43
46
|
private metrics;
|
|
47
|
+
private isUploadingSnapshot;
|
|
44
48
|
private txQueue;
|
|
45
49
|
readonly tracer: Tracer;
|
|
46
|
-
constructor(config: AztecNodeConfig, p2pClient: P2P, blockSource: L2BlockSource & Partial<Service>, logsSource: L2LogsSource, contractDataSource: ContractDataSource, l1ToL2MessageSource: L1ToL2MessageSource, worldStateSynchronizer: WorldStateSynchronizer, sequencer: SequencerClient | undefined, l1ChainId: number, version: number, globalVariableBuilder: GlobalVariableBuilder, proofVerifier: ClientProtocolCircuitVerifier, telemetry?: TelemetryClient, log?: Logger);
|
|
50
|
+
constructor(config: AztecNodeConfig, p2pClient: P2P, blockSource: L2BlockSource & Partial<Service>, logsSource: L2LogsSource, contractDataSource: ContractDataSource, l1ToL2MessageSource: L1ToL2MessageSource, worldStateSynchronizer: WorldStateSynchronizer, sequencer: SequencerClient | undefined, validatorsSentinel: Sentinel | undefined, l1ChainId: number, version: number, globalVariableBuilder: GlobalVariableBuilder, proofVerifier: ClientProtocolCircuitVerifier, telemetry?: TelemetryClient, log?: Logger);
|
|
47
51
|
getWorldStateSyncStatus(): Promise<WorldStateSyncStatus>;
|
|
48
52
|
getL2Tips(): Promise<import("@aztec/stdlib/block").L2Tips>;
|
|
49
53
|
/**
|
|
@@ -291,5 +295,7 @@ export declare class AztecNodeService implements AztecNode, AztecNodeAdmin, Trac
|
|
|
291
295
|
getProtocolContractAddresses(): Promise<ProtocolContractAddresses>;
|
|
292
296
|
registerContractFunctionSignatures(_address: AztecAddress, signatures: string[]): Promise<void>;
|
|
293
297
|
flushTxs(): Promise<void>;
|
|
298
|
+
getValidatorsStats(): Promise<ValidatorsStats>;
|
|
299
|
+
startSnapshotUpload(location: string): Promise<void>;
|
|
294
300
|
}
|
|
295
301
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,uBAAuB,EAAwB,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,mBAAmB,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { BBCircuitVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
|
|
|
9
9
|
import { createBlobSinkClient } from '@aztec/blob-sink/client';
|
|
10
10
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
11
11
|
import { EpochCache } from '@aztec/epoch-cache';
|
|
12
|
-
import { createEthereumChain } from '@aztec/ethereum';
|
|
12
|
+
import { RegistryContract, createEthereumChain } from '@aztec/ethereum';
|
|
13
13
|
import { compactArray } from '@aztec/foundation/collection';
|
|
14
14
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
15
15
|
import { Fr } from '@aztec/foundation/fields';
|
|
@@ -18,7 +18,9 @@ import { SerialQueue } from '@aztec/foundation/queue';
|
|
|
18
18
|
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
19
19
|
import { SiblingPath } from '@aztec/foundation/trees';
|
|
20
20
|
import { openTmpStore } from '@aztec/kv-store/lmdb';
|
|
21
|
+
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
21
22
|
import { SHA256Trunc, StandardTree, UnbalancedTree } from '@aztec/merkle-tree';
|
|
23
|
+
import { trySnapshotSync, uploadSnapshot } from '@aztec/node-lib/actions';
|
|
22
24
|
import { createP2PClient } from '@aztec/p2p';
|
|
23
25
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
24
26
|
import { GlobalVariableBuilder, SequencerClient, createSlasherClient, createValidatorForAcceptingTxs, getDefaultAllowedSetupFunctions } from '@aztec/sequencer-client';
|
|
@@ -32,6 +34,8 @@ import { PublicSimulationOutput, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
32
34
|
import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
33
35
|
import { createValidatorClient } from '@aztec/validator-client';
|
|
34
36
|
import { createWorldStateSynchronizer } from '@aztec/world-state';
|
|
37
|
+
import { createPublicClient, fallback, getContract, http } from 'viem';
|
|
38
|
+
import { createSentinel } from '../sentinel/factory.js';
|
|
35
39
|
import { getPackageVersion } from './config.js';
|
|
36
40
|
import { NodeMetrics } from './node_metrics.js';
|
|
37
41
|
/**
|
|
@@ -45,6 +49,7 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
45
49
|
l1ToL2MessageSource;
|
|
46
50
|
worldStateSynchronizer;
|
|
47
51
|
sequencer;
|
|
52
|
+
validatorsSentinel;
|
|
48
53
|
l1ChainId;
|
|
49
54
|
version;
|
|
50
55
|
globalVariableBuilder;
|
|
@@ -53,10 +58,12 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
53
58
|
log;
|
|
54
59
|
packageVersion;
|
|
55
60
|
metrics;
|
|
61
|
+
// Prevent two snapshot operations to happen simultaneously
|
|
62
|
+
isUploadingSnapshot;
|
|
56
63
|
// Serial queue to ensure that we only send one tx at a time
|
|
57
64
|
txQueue;
|
|
58
65
|
tracer;
|
|
59
|
-
constructor(config, p2pClient, blockSource, logsSource, contractDataSource, l1ToL2MessageSource, worldStateSynchronizer, sequencer, l1ChainId, version, globalVariableBuilder, proofVerifier, telemetry = getTelemetryClient(), log = createLogger('node')){
|
|
66
|
+
constructor(config, p2pClient, blockSource, logsSource, contractDataSource, l1ToL2MessageSource, worldStateSynchronizer, sequencer, validatorsSentinel, l1ChainId, version, globalVariableBuilder, proofVerifier, telemetry = getTelemetryClient(), log = createLogger('node')){
|
|
60
67
|
this.config = config;
|
|
61
68
|
this.p2pClient = p2pClient;
|
|
62
69
|
this.blockSource = blockSource;
|
|
@@ -65,12 +72,14 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
65
72
|
this.l1ToL2MessageSource = l1ToL2MessageSource;
|
|
66
73
|
this.worldStateSynchronizer = worldStateSynchronizer;
|
|
67
74
|
this.sequencer = sequencer;
|
|
75
|
+
this.validatorsSentinel = validatorsSentinel;
|
|
68
76
|
this.l1ChainId = l1ChainId;
|
|
69
77
|
this.version = version;
|
|
70
78
|
this.globalVariableBuilder = globalVariableBuilder;
|
|
71
79
|
this.proofVerifier = proofVerifier;
|
|
72
80
|
this.telemetry = telemetry;
|
|
73
81
|
this.log = log;
|
|
82
|
+
this.isUploadingSnapshot = false;
|
|
74
83
|
this.txQueue = new SerialQueue();
|
|
75
84
|
this.packageVersion = getPackageVersion();
|
|
76
85
|
this.metrics = new NodeMetrics(telemetry, 'AztecNodeService');
|
|
@@ -96,10 +105,33 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
96
105
|
const dateProvider = deps.dateProvider ?? new DateProvider();
|
|
97
106
|
const blobSinkClient = deps.blobSinkClient ?? createBlobSinkClient(config);
|
|
98
107
|
const ethereumChain = createEthereumChain(config.l1RpcUrls, config.l1ChainId);
|
|
99
|
-
//validate that the actual chain id matches that specified in configuration
|
|
108
|
+
// validate that the actual chain id matches that specified in configuration
|
|
100
109
|
if (config.l1ChainId !== ethereumChain.chainInfo.id) {
|
|
101
110
|
throw new Error(`RPC URL configured for chain id ${ethereumChain.chainInfo.id} but expected id ${config.l1ChainId}`);
|
|
102
111
|
}
|
|
112
|
+
const publicClient = createPublicClient({
|
|
113
|
+
chain: ethereumChain.chainInfo,
|
|
114
|
+
transport: fallback(config.l1RpcUrls.map((url)=>http(url))),
|
|
115
|
+
pollingInterval: config.viemPollingIntervalMS
|
|
116
|
+
});
|
|
117
|
+
const l1ContractsAddresses = await RegistryContract.collectAddresses(publicClient, config.l1Contracts.registryAddress, config.rollupVersion ?? 'canonical');
|
|
118
|
+
// Overwrite the passed in vars.
|
|
119
|
+
config.l1Contracts = {
|
|
120
|
+
...config.l1Contracts,
|
|
121
|
+
...l1ContractsAddresses
|
|
122
|
+
};
|
|
123
|
+
const rollup = getContract({
|
|
124
|
+
address: l1ContractsAddresses.rollupAddress.toString(),
|
|
125
|
+
abi: RollupAbi,
|
|
126
|
+
client: publicClient
|
|
127
|
+
});
|
|
128
|
+
const rollupVersionFromRollup = Number(await rollup.read.getVersion());
|
|
129
|
+
config.rollupVersion ??= rollupVersionFromRollup;
|
|
130
|
+
if (config.rollupVersion !== rollupVersionFromRollup) {
|
|
131
|
+
log.warn(`Registry looked up and returned a rollup with version (${config.rollupVersion}), but this does not match with version detected from the rollup directly: (${rollupVersionFromRollup}).`);
|
|
132
|
+
}
|
|
133
|
+
// attempt snapshot sync if possible
|
|
134
|
+
await trySnapshotSync(config, log);
|
|
103
135
|
const archiver = await createArchiver(config, blobSinkClient, {
|
|
104
136
|
blockUntilSync: true
|
|
105
137
|
}, telemetry);
|
|
@@ -128,6 +160,8 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
128
160
|
dateProvider,
|
|
129
161
|
epochCache
|
|
130
162
|
});
|
|
163
|
+
const validatorsSentinel = await createSentinel(epochCache, archiver, p2pClient, config);
|
|
164
|
+
await validatorsSentinel?.start();
|
|
131
165
|
// now create the sequencer
|
|
132
166
|
const sequencer = config.disableValidator ? undefined : await SequencerClient.new(config, {
|
|
133
167
|
...deps,
|
|
@@ -142,7 +176,7 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
142
176
|
dateProvider,
|
|
143
177
|
blobSinkClient
|
|
144
178
|
});
|
|
145
|
-
return new AztecNodeService(config, p2pClient, archiver, archiver, archiver, archiver, worldStateSynchronizer, sequencer, ethereumChain.chainInfo.id, config.
|
|
179
|
+
return new AztecNodeService(config, p2pClient, archiver, archiver, archiver, archiver, worldStateSynchronizer, sequencer, validatorsSentinel, ethereumChain.chainInfo.id, config.rollupVersion, new GlobalVariableBuilder(config), proofVerifier, telemetry, log);
|
|
146
180
|
}
|
|
147
181
|
/**
|
|
148
182
|
* Returns the sequencer client instance.
|
|
@@ -175,7 +209,7 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
175
209
|
return Promise.resolve(this.p2pClient.isReady() ?? false);
|
|
176
210
|
}
|
|
177
211
|
async getNodeInfo() {
|
|
178
|
-
const [nodeVersion,
|
|
212
|
+
const [nodeVersion, rollupVersion, chainId, enr, contractAddresses, protocolContractAddresses] = await Promise.all([
|
|
179
213
|
this.getNodeVersion(),
|
|
180
214
|
this.getVersion(),
|
|
181
215
|
this.getChainId(),
|
|
@@ -186,7 +220,7 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
186
220
|
const nodeInfo = {
|
|
187
221
|
nodeVersion,
|
|
188
222
|
l1ChainId: chainId,
|
|
189
|
-
|
|
223
|
+
rollupVersion,
|
|
190
224
|
enr,
|
|
191
225
|
l1ContractAddresses: contractAddresses,
|
|
192
226
|
protocolContractAddresses: protocolContractAddresses
|
|
@@ -334,6 +368,7 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
334
368
|
*/ async stop() {
|
|
335
369
|
this.log.info(`Stopping`);
|
|
336
370
|
await this.txQueue.end();
|
|
371
|
+
await this.validatorsSentinel?.stop();
|
|
337
372
|
await this.sequencer?.stop();
|
|
338
373
|
await this.p2pClient.stop();
|
|
339
374
|
await this.worldStateSynchronizer.stop();
|
|
@@ -622,7 +657,7 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
622
657
|
return Fr.ZERO;
|
|
623
658
|
}
|
|
624
659
|
const preimage = await committedDb.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
|
|
625
|
-
return preimage.value;
|
|
660
|
+
return preimage.leaf.value;
|
|
626
661
|
}
|
|
627
662
|
/**
|
|
628
663
|
* Returns the currently committed block header, or the initial header if no blocks have been produced.
|
|
@@ -673,6 +708,7 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
673
708
|
const validator = createValidatorForAcceptingTxs(db, this.contractDataSource, verifier, {
|
|
674
709
|
blockNumber,
|
|
675
710
|
l1ChainId: this.l1ChainId,
|
|
711
|
+
rollupVersion: this.version,
|
|
676
712
|
setupAllowList: this.config.allowedInSetup ?? await getDefaultAllowedSetupFunctions(),
|
|
677
713
|
gasFees: await this.getCurrentBaseFees(),
|
|
678
714
|
skipFeeEnforcement
|
|
@@ -708,6 +744,41 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
708
744
|
this.sequencer.flush();
|
|
709
745
|
return Promise.resolve();
|
|
710
746
|
}
|
|
747
|
+
getValidatorsStats() {
|
|
748
|
+
return this.validatorsSentinel?.computeStats() ?? Promise.resolve({
|
|
749
|
+
stats: {},
|
|
750
|
+
slotWindow: 0
|
|
751
|
+
});
|
|
752
|
+
}
|
|
753
|
+
async startSnapshotUpload(location) {
|
|
754
|
+
// Note that we are forcefully casting the blocksource as an archiver
|
|
755
|
+
// We break support for archiver running remotely to the node
|
|
756
|
+
const archiver = this.blockSource;
|
|
757
|
+
if (!('backupTo' in archiver)) {
|
|
758
|
+
throw new Error('Archiver implementation does not support backups. Cannot generate snapshot.');
|
|
759
|
+
}
|
|
760
|
+
// Test that the archiver has done an initial sync.
|
|
761
|
+
if (!archiver.isInitialSyncComplete()) {
|
|
762
|
+
throw new Error(`Archiver initial sync not complete. Cannot start snapshot.`);
|
|
763
|
+
}
|
|
764
|
+
// And it has an L2 block hash
|
|
765
|
+
const l2BlockHash = await archiver.getL2Tips().then((tips)=>tips.latest.hash);
|
|
766
|
+
if (!l2BlockHash) {
|
|
767
|
+
throw new Error(`Archiver has no latest L2 block hash downloaded. Cannot start snapshot.`);
|
|
768
|
+
}
|
|
769
|
+
if (this.isUploadingSnapshot) {
|
|
770
|
+
throw new Error(`Snapshot upload already in progress. Cannot start another one until complete.`);
|
|
771
|
+
}
|
|
772
|
+
// Do not wait for the upload to be complete to return to the caller, but flag that an operation is in progress
|
|
773
|
+
this.isUploadingSnapshot = true;
|
|
774
|
+
void uploadSnapshot(location, this.blockSource, this.worldStateSynchronizer, this.config, this.log).then(()=>{
|
|
775
|
+
this.isUploadingSnapshot = false;
|
|
776
|
+
}).catch((err)=>{
|
|
777
|
+
this.isUploadingSnapshot = false;
|
|
778
|
+
this.log.error(`Error uploading snapshot: ${err}`);
|
|
779
|
+
});
|
|
780
|
+
return Promise.resolve();
|
|
781
|
+
}
|
|
711
782
|
/**
|
|
712
783
|
* Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
|
|
713
784
|
* @param blockNumber - The block number at which to get the data.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
2
|
+
export type SentinelConfig = {
|
|
3
|
+
sentinelHistoryLengthInEpochs: number;
|
|
4
|
+
sentinelEnabled: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare const sentinelConfigMappings: ConfigMappingsType<SentinelConfig>;
|
|
7
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/sentinel/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAA2C,MAAM,0BAA0B,CAAC;AAE5G,MAAM,MAAM,cAAc,GAAG;IAC3B,6BAA6B,EAAE,MAAM,CAAC;IACtC,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,kBAAkB,CAAC,cAAc,CAWrE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { booleanConfigHelper, numberConfigHelper } from '@aztec/foundation/config';
|
|
2
|
+
export const sentinelConfigMappings = {
|
|
3
|
+
sentinelHistoryLengthInEpochs: {
|
|
4
|
+
description: 'The number of L2 epochs kept of history for each validator for computing their stats.',
|
|
5
|
+
env: 'SENTINEL_HISTORY_LENGTH_IN_EPOCHS',
|
|
6
|
+
...numberConfigHelper(24)
|
|
7
|
+
},
|
|
8
|
+
sentinelEnabled: {
|
|
9
|
+
description: 'Whether the sentinel is enabled or not.',
|
|
10
|
+
env: 'SENTINEL_ENABLED',
|
|
11
|
+
...booleanConfigHelper(false)
|
|
12
|
+
}
|
|
13
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EpochCache } from '@aztec/epoch-cache';
|
|
2
|
+
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
3
|
+
import type { P2PClient } from '@aztec/p2p';
|
|
4
|
+
import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
5
|
+
import type { SentinelConfig } from './config.js';
|
|
6
|
+
import { Sentinel } from './sentinel.js';
|
|
7
|
+
export declare function createSentinel(epochCache: EpochCache, archiver: L2BlockSource, p2p: P2PClient, config: SentinelConfig & DataStoreConfig, logger?: import("@aztec/foundation/log").Logger): Promise<Sentinel | undefined>;
|
|
8
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/sentinel/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,wBAAsB,cAAc,CAClC,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,aAAa,EACvB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,MAAM,yCAAgC,GACrC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAa/B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { createStore } from '@aztec/kv-store/lmdb-v2';
|
|
3
|
+
import { Sentinel } from './sentinel.js';
|
|
4
|
+
import { SentinelStore } from './store.js';
|
|
5
|
+
export async function createSentinel(epochCache, archiver, p2p, config, logger = createLogger('node:sentinel')) {
|
|
6
|
+
if (!config.sentinelEnabled) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
const kvStore = await createStore('sentinel', SentinelStore.SCHEMA_VERSION, config, createLogger('node:sentinel:lmdb'));
|
|
10
|
+
const storeHistoryLength = config.sentinelHistoryLengthInEpochs * epochCache.getL1Constants().epochDuration;
|
|
11
|
+
const sentinelStore = new SentinelStore(kvStore, {
|
|
12
|
+
historyLength: storeHistoryLength
|
|
13
|
+
});
|
|
14
|
+
return new Sentinel(epochCache, archiver, p2p, sentinelStore, logger);
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sentinel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,YAAY,EACV,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Sentinel } from './sentinel.js';
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { EpochCache } from '@aztec/epoch-cache';
|
|
2
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
4
|
+
import { type L2TipsStore } from '@aztec/kv-store/stores';
|
|
5
|
+
import type { P2PClient } from '@aztec/p2p';
|
|
6
|
+
import { type L2BlockSource, L2BlockStream, type L2BlockStreamEvent, type L2BlockStreamEventHandler } from '@aztec/stdlib/block';
|
|
7
|
+
import type { ValidatorStats, ValidatorStatusHistory, ValidatorStatusInSlot, ValidatorStatusType, ValidatorsStats } from '@aztec/stdlib/validators';
|
|
8
|
+
import { SentinelStore } from './store.js';
|
|
9
|
+
export declare class Sentinel implements L2BlockStreamEventHandler {
|
|
10
|
+
protected epochCache: EpochCache;
|
|
11
|
+
protected archiver: L2BlockSource;
|
|
12
|
+
protected p2p: P2PClient;
|
|
13
|
+
protected store: SentinelStore;
|
|
14
|
+
protected logger: import("@aztec/foundation/log").Logger;
|
|
15
|
+
protected runningPromise: RunningPromise;
|
|
16
|
+
protected blockStream: L2BlockStream;
|
|
17
|
+
protected l2TipsStore: L2TipsStore;
|
|
18
|
+
protected initialSlot: bigint | undefined;
|
|
19
|
+
protected lastProcessedSlot: bigint | undefined;
|
|
20
|
+
protected slotNumberToArchive: Map<bigint, string>;
|
|
21
|
+
constructor(epochCache: EpochCache, archiver: L2BlockSource, p2p: P2PClient, store: SentinelStore, logger?: import("@aztec/foundation/log").Logger);
|
|
22
|
+
start(): Promise<void>;
|
|
23
|
+
/** Loads initial slot and initializes blockstream. We will not process anything at or before the initial slot. */
|
|
24
|
+
protected init(): Promise<void>;
|
|
25
|
+
stop(): Promise<void>;
|
|
26
|
+
handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Process data for two L2 slots ago.
|
|
29
|
+
* Note that we do not process historical data, since we rely on p2p data for processing,
|
|
30
|
+
* and we don't have that data if we were offline during the period.
|
|
31
|
+
*/
|
|
32
|
+
work(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Check if we are ready to process data for two L2 slots ago, so we allow plenty of time for p2p to process all in-flight attestations.
|
|
35
|
+
* We also don't move past the archiver last synced L2 slot, as we don't want to process data that is not yet available.
|
|
36
|
+
* Last, we check the p2p is synced with the archiver, so it has pulled all attestations from it.
|
|
37
|
+
*/
|
|
38
|
+
protected isReadyToProcess(currentSlot: bigint): Promise<bigint | false>;
|
|
39
|
+
/**
|
|
40
|
+
* Gathers committee and proposer data for a given slot, computes slot stats,
|
|
41
|
+
* and updates overall stats.
|
|
42
|
+
*/
|
|
43
|
+
protected processSlot(slot: bigint): Promise<void>;
|
|
44
|
+
/** Computes activity for a given slot. */
|
|
45
|
+
protected getSlotActivity(slot: bigint, epoch: bigint, proposer: EthAddress, committee: EthAddress[]): Promise<{
|
|
46
|
+
[k: string]: ValidatorStatusInSlot | undefined;
|
|
47
|
+
}>;
|
|
48
|
+
/** Push the status for each slot for each validator. */
|
|
49
|
+
protected updateValidators(slot: bigint, stats: Record<`0x${string}`, ValidatorStatusInSlot | undefined>): Promise<void>;
|
|
50
|
+
/** Computes stats to be returned based on stored data. */
|
|
51
|
+
computeStats(): Promise<ValidatorsStats>;
|
|
52
|
+
protected computeStatsForValidator(address: `0x${string}`, allHistory: ValidatorStatusHistory, fromSlot?: bigint): ValidatorStats;
|
|
53
|
+
protected computeMissed(history: ValidatorStatusHistory, computeOverPrefix: ValidatorStatusType, filter: ValidatorStatusInSlot): {
|
|
54
|
+
currentStreak: number;
|
|
55
|
+
rate: number;
|
|
56
|
+
count: number;
|
|
57
|
+
};
|
|
58
|
+
protected computeFromSlot(slot: bigint | undefined): {
|
|
59
|
+
timestamp: bigint;
|
|
60
|
+
slot: bigint;
|
|
61
|
+
date: string;
|
|
62
|
+
} | undefined;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=sentinel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentinel.d.ts","sourceRoot":"","sources":["../../src/sentinel/sentinel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EACL,KAAK,aAAa,EAClB,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC/B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,qBAAa,QAAS,YAAW,yBAAyB;IAUtD,SAAS,CAAC,UAAU,EAAE,UAAU;IAChC,SAAS,CAAC,QAAQ,EAAE,aAAa;IACjC,SAAS,CAAC,GAAG,EAAE,SAAS;IACxB,SAAS,CAAC,KAAK,EAAE,aAAa;IAC9B,SAAS,CAAC,MAAM;IAblB,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;IACzC,SAAS,CAAC,WAAW,EAAG,aAAa,CAAC;IACtC,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC;IAEnC,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,SAAS,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD,SAAS,CAAC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;gBAGnD,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,aAAa,EACvB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,aAAa,EACpB,MAAM,yCAAgC;IAOrC,KAAK;IAKlB,kHAAkH;cAClG,IAAI;IAMb,IAAI;IAIE,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB7E;;;;OAIG;IACU,IAAI;IAmBjB;;;;OAIG;cACa,gBAAgB,CAAC,WAAW,EAAE,MAAM;IAkCpD;;;OAGG;cACa,WAAW,CAAC,IAAI,EAAE,MAAM;IAexC,0CAA0C;cAC1B,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE;;;IAmD1G,wDAAwD;IACxD,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,MAAM,EAAE,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAIxG,0DAA0D;IAC7C,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC;IAiBrD,SAAS,CAAC,wBAAwB,CAChC,OAAO,EAAE,KAAK,MAAM,EAAE,EACtB,UAAU,EAAE,sBAAsB,EAClC,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc;IAejB,SAAS,CAAC,aAAa,CACrB,OAAO,EAAE,sBAAsB,EAC/B,iBAAiB,EAAE,mBAAmB,EACtC,MAAM,EAAE,qBAAqB;;;;;IAW/B,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;;;;;CAOnD"}
|