@aztec/aztec-node 3.0.0-canary.a9708bd → 3.0.0-devnet.2
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 +2 -2
- package/dest/aztec-node/config.d.ts.map +1 -1
- package/dest/aztec-node/config.js +10 -19
- package/dest/aztec-node/server.d.ts +29 -3
- package/dest/aztec-node/server.d.ts.map +1 -1
- package/dest/aztec-node/server.js +105 -27
- package/dest/sentinel/config.d.ts +1 -0
- package/dest/sentinel/config.d.ts.map +1 -1
- package/dest/sentinel/config.js +16 -0
- package/dest/sentinel/factory.d.ts.map +1 -1
- package/dest/sentinel/factory.js +3 -1
- package/dest/sentinel/sentinel.d.ts +4 -3
- package/dest/sentinel/sentinel.d.ts.map +1 -1
- package/dest/sentinel/sentinel.js +63 -64
- package/dest/sentinel/store.d.ts +2 -0
- package/dest/sentinel/store.d.ts.map +1 -1
- package/dest/sentinel/store.js +5 -2
- package/package.json +26 -26
- package/src/aztec-node/config.ts +19 -35
- package/src/aztec-node/server.ts +126 -40
- package/src/sentinel/config.ts +18 -0
- package/src/sentinel/factory.ts +5 -1
- package/src/sentinel/sentinel.ts +79 -74
- package/src/sentinel/store.ts +7 -3
|
@@ -2,7 +2,7 @@ import { type ArchiverConfig } from '@aztec/archiver/config';
|
|
|
2
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 KeyStore
|
|
5
|
+
import { type KeyStore } from '@aztec/node-keystore';
|
|
6
6
|
import { type SharedNodeConfig } from '@aztec/node-lib/config';
|
|
7
7
|
import { type P2PConfig } from '@aztec/p2p/config';
|
|
8
8
|
import { type ProverClientUserConfig } from '@aztec/prover-client/config';
|
|
@@ -16,7 +16,7 @@ export { sequencerClientConfigMappings, type SequencerClientConfig };
|
|
|
16
16
|
/**
|
|
17
17
|
* The configuration the aztec node.
|
|
18
18
|
*/
|
|
19
|
-
export type AztecNodeConfig = ArchiverConfig & SequencerClientConfig & ValidatorClientConfig & ProverClientUserConfig & WorldStateConfig & Pick<ProverClientUserConfig, 'bbBinaryPath' | 'bbWorkingDirectory' | 'realProofs'> & P2PConfig & DataStoreConfig &
|
|
19
|
+
export type AztecNodeConfig = ArchiverConfig & SequencerClientConfig & ValidatorClientConfig & ProverClientUserConfig & WorldStateConfig & Pick<ProverClientUserConfig, 'bbBinaryPath' | 'bbWorkingDirectory' | 'realProofs'> & P2PConfig & DataStoreConfig & SentinelConfig & SharedNodeConfig & GenesisStateConfig & NodeRPCConfig & SlasherConfig & {
|
|
20
20
|
/** L1 contracts addresses */
|
|
21
21
|
l1Contracts: L1ContractAddresses;
|
|
22
22
|
/** Whether the validator is disabled for this node */
|
|
@@ -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,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAGzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,kBAAkB,EAA8C,MAAM,0BAA0B,CAAC;
|
|
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;AAE/G,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAClF,OAAO,EACL,KAAK,QAAQ,EAId,MAAM,sBAAsB,CAAC;AAC9B,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,EACL,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,6BAA6B,EAC9B,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,KAAK,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,KAAK,qBAAqB,EAAiC,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,2BAA2B,CAAC;AAI5F,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,GAClB,aAAa,GACb,aAAa,GAAG;IACd,6BAA6B;IAC7B,WAAW,EAAE,mBAAmB,CAAC;IACjC,sDAAsD;IACtD,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEJ,eAAO,MAAM,uBAAuB,EAAE,kBAAkB,CAAC,eAAe,CAuBvE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,CAElD;AAoED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,cAAc,GAAG,qBAAqB,GAAG,gBAAgB,GAChE,QAAQ,GAAG,SAAS,CAMtB"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { archiverConfigMappings } from '@aztec/archiver/config';
|
|
2
2
|
import { genesisStateConfigMappings, l1ContractAddressesMapping } from '@aztec/ethereum';
|
|
3
3
|
import { booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
|
|
4
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
5
|
import { dataConfigMappings } from '@aztec/kv-store/config';
|
|
5
|
-
import { keyStoreConfigMappings } from '@aztec/node-keystore';
|
|
6
|
+
import { ethPrivateKeySchema, keyStoreConfigMappings } from '@aztec/node-keystore';
|
|
6
7
|
import { sharedNodeConfigMappings } from '@aztec/node-lib/config';
|
|
7
8
|
import { p2pConfigMappings } from '@aztec/p2p/config';
|
|
8
9
|
import { proverClientConfigMappings } from '@aztec/prover-client/config';
|
|
@@ -50,16 +51,12 @@ function createKeyStoreFromWeb3Signer(config) {
|
|
|
50
51
|
if (config.web3SignerUrl === undefined || config.web3SignerUrl.length === 0 || config.validatorAddresses === undefined || config.validatorAddresses.length === 0) {
|
|
51
52
|
return undefined;
|
|
52
53
|
}
|
|
53
|
-
const coinbase = config.coinbase ? config.coinbase.toString() : config.validatorAddresses[0].toString();
|
|
54
|
-
const feeRecipient = config.feeRecipient ? config.feeRecipient.toString() : AztecAddress.ZERO.toString();
|
|
55
|
-
const publisherAddresses = config.publisherAddresses && config.publisherAddresses.length > 0 ? config.publisherAddresses.map((k)=>k.toChecksumString()) : [];
|
|
56
|
-
const attestors = config.validatorAddresses.map((k)=>k.toChecksumString());
|
|
57
54
|
validatorKeyStores.push({
|
|
58
|
-
attester:
|
|
59
|
-
feeRecipient: feeRecipient,
|
|
60
|
-
coinbase: coinbase,
|
|
55
|
+
attester: config.validatorAddresses,
|
|
56
|
+
feeRecipient: config.feeRecipient ?? AztecAddress.ZERO,
|
|
57
|
+
coinbase: config.coinbase ?? config.validatorAddresses[0],
|
|
61
58
|
remoteSigner: config.web3SignerUrl,
|
|
62
|
-
publisher: publisherAddresses
|
|
59
|
+
publisher: config.publisherAddresses ?? []
|
|
63
60
|
});
|
|
64
61
|
const keyStore = {
|
|
65
62
|
schemaVersion: 1,
|
|
@@ -72,19 +69,13 @@ function createKeyStoreFromWeb3Signer(config) {
|
|
|
72
69
|
}
|
|
73
70
|
function createKeyStoreFromPrivateKeys(config) {
|
|
74
71
|
const validatorKeyStores = [];
|
|
75
|
-
const ethPrivateKeys = [];
|
|
76
|
-
const validatorKeys = config.validatorPrivateKeys ? config.validatorPrivateKeys.getValue() : [];
|
|
77
|
-
for(let i = 0; i < validatorKeys.length; i++){
|
|
78
|
-
const key = validatorKeys[i];
|
|
79
|
-
const ethPrivateKey = key;
|
|
80
|
-
ethPrivateKeys.push(ethPrivateKey);
|
|
81
|
-
}
|
|
72
|
+
const ethPrivateKeys = config.validatorPrivateKeys ? config.validatorPrivateKeys.getValue().map((x)=>ethPrivateKeySchema.parse(x)) : [];
|
|
82
73
|
if (!ethPrivateKeys.length) {
|
|
83
74
|
return undefined;
|
|
84
75
|
}
|
|
85
|
-
const coinbase = config.coinbase
|
|
86
|
-
const feeRecipient = config.feeRecipient
|
|
87
|
-
const publisherKeys = config.publisherPrivateKeys ? config.publisherPrivateKeys.map((k)=>k.getValue()) : [];
|
|
76
|
+
const coinbase = config.coinbase ?? EthAddress.fromString(privateKeyToAddress(ethPrivateKeys[0]));
|
|
77
|
+
const feeRecipient = config.feeRecipient ?? AztecAddress.ZERO;
|
|
78
|
+
const publisherKeys = config.publisherPrivateKeys ? config.publisherPrivateKeys.map((k)=>ethPrivateKeySchema.parse(k.getValue())) : [];
|
|
88
79
|
validatorKeyStores.push({
|
|
89
80
|
attester: ethPrivateKeys,
|
|
90
81
|
feeRecipient: feeRecipient,
|
|
@@ -15,9 +15,9 @@ import { type InBlock, type L2Block, type L2BlockNumber, type L2BlockSource, typ
|
|
|
15
15
|
import type { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress, NodeInfo, ProtocolContractAddresses } from '@aztec/stdlib/contract';
|
|
16
16
|
import type { GasFees } from '@aztec/stdlib/gas';
|
|
17
17
|
import { type AztecNode, type AztecNodeAdmin, type AztecNodeAdminConfig, type GetContractClassLogsResponse, type GetPublicLogsResponse } from '@aztec/stdlib/interfaces/client';
|
|
18
|
-
import { type ClientProtocolCircuitVerifier, type L2LogsSource, type Service, type WorldStateSyncStatus, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
18
|
+
import { type AllowedElement, type ClientProtocolCircuitVerifier, type L2LogsSource, type Service, type WorldStateSyncStatus, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
19
19
|
import type { LogFilter, PrivateLog, TxScopedL2Log } from '@aztec/stdlib/logs';
|
|
20
|
-
import type
|
|
20
|
+
import { type L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
21
21
|
import { P2PClientType } from '@aztec/stdlib/p2p';
|
|
22
22
|
import type { Offense, SlashPayloadRound } from '@aztec/stdlib/slashing';
|
|
23
23
|
import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
@@ -88,6 +88,7 @@ export declare class AztecNodeService implements AztecNode, AztecNodeAdmin, Trac
|
|
|
88
88
|
*/
|
|
89
89
|
getL1ContractAddresses(): Promise<L1ContractAddresses>;
|
|
90
90
|
getEncodedEnr(): Promise<string | undefined>;
|
|
91
|
+
getAllowedPublicSetup(): Promise<AllowedElement[]>;
|
|
91
92
|
/**
|
|
92
93
|
* Method to determine if the node is ready to accept transactions.
|
|
93
94
|
* @returns - Flag indicating the readiness for tx submission.
|
|
@@ -99,7 +100,19 @@ export declare class AztecNodeService implements AztecNode, AztecNodeAdmin, Trac
|
|
|
99
100
|
* @param number - The block number being requested.
|
|
100
101
|
* @returns The requested block.
|
|
101
102
|
*/
|
|
102
|
-
getBlock(number:
|
|
103
|
+
getBlock(number: L2BlockNumber): Promise<L2Block | undefined>;
|
|
104
|
+
/**
|
|
105
|
+
* Get a block specified by its hash.
|
|
106
|
+
* @param blockHash - The block hash being requested.
|
|
107
|
+
* @returns The requested block.
|
|
108
|
+
*/
|
|
109
|
+
getBlockByHash(blockHash: Fr): Promise<L2Block | undefined>;
|
|
110
|
+
/**
|
|
111
|
+
* Get a block specified by its archive root.
|
|
112
|
+
* @param archive - The archive root being requested.
|
|
113
|
+
* @returns The requested block.
|
|
114
|
+
*/
|
|
115
|
+
getBlockByArchive(archive: Fr): Promise<L2Block | undefined>;
|
|
103
116
|
/**
|
|
104
117
|
* Method to request blocks. Will attempt to return all requested blocks but will return only those available.
|
|
105
118
|
* @param from - The start of the range of blocks to return.
|
|
@@ -226,6 +239,7 @@ export declare class AztecNodeService implements AztecNode, AztecNodeAdmin, Trac
|
|
|
226
239
|
* @returns A tuple of the index and the sibling path of the L1ToL2Message (undefined if not found).
|
|
227
240
|
*/
|
|
228
241
|
getL1ToL2MessageMembershipWitness(blockNumber: L2BlockNumber, l1ToL2Message: Fr): Promise<[bigint, SiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>] | undefined>;
|
|
242
|
+
getL1ToL2MessageBlock(l1ToL2Message: Fr): Promise<number | undefined>;
|
|
229
243
|
/**
|
|
230
244
|
* Returns whether an L1 to L2 message is synced by archiver and if it's ready to be included in a block.
|
|
231
245
|
* @param l1ToL2Message - The L1 to L2 message to check.
|
|
@@ -292,6 +306,18 @@ export declare class AztecNodeService implements AztecNode, AztecNodeAdmin, Trac
|
|
|
292
306
|
* @returns The current committed block header.
|
|
293
307
|
*/
|
|
294
308
|
getBlockHeader(blockNumber?: L2BlockNumber): Promise<BlockHeader | undefined>;
|
|
309
|
+
/**
|
|
310
|
+
* Get a block header specified by its hash.
|
|
311
|
+
* @param blockHash - The block hash being requested.
|
|
312
|
+
* @returns The requested block header.
|
|
313
|
+
*/
|
|
314
|
+
getBlockHeaderByHash(blockHash: Fr): Promise<BlockHeader | undefined>;
|
|
315
|
+
/**
|
|
316
|
+
* Get a block header specified by its archive root.
|
|
317
|
+
* @param archive - The archive root being requested.
|
|
318
|
+
* @returns The requested block header.
|
|
319
|
+
*/
|
|
320
|
+
getBlockHeaderByArchive(archive: Fr): Promise<BlockHeader | undefined>;
|
|
295
321
|
/**
|
|
296
322
|
* Simulates the public part of a transaction with the current state.
|
|
297
323
|
* @param tx - The transaction to simulate.
|
|
@@ -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,cAAc,EAEd,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,
|
|
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,cAAc,EAEd,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,KAAK,mBAAmB,EAKzB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAS,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAIzE,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,aAAa,EAAoD,MAAM,YAAY,CAAC;AAE5G,OAAO,EAGL,eAAe,EACf,KAAK,kBAAkB,EAExB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAEL,iBAAiB,EACjB,KAAK,sBAAsB,EAG5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,OAAO,EAEZ,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,2BAA2B,EAC3B,QAAQ,EACR,yBAAyB,EAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAEzB,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAC3B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,6BAA6B,EAClC,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAE5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAa,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAyB,kBAAkB,EAA8B,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,qBAAqB,IAAI,8BAA8B,EAC5D,KAAK,eAAe,EACpB,sBAAsB,EACtB,EAAE,EACF,KAAK,MAAM,EACX,SAAS,EAET,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAYjC,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,KAAK,eAAe,EAA8B,MAAM,aAAa,CAAC;AAG/E;;GAEG;AACH,qBAAa,gBAAiB,YAAW,SAAS,EAAE,cAAc,EAAE,SAAS;;IAYzE,SAAS,CAAC,MAAM,EAAE,eAAe;IACjC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG;IACjC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAChE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY;IAC3C,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,aAAa,EAAE,sBAAsB,GAAG,SAAS;IACpE,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,GAAG,SAAS;IAC3D,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,SAAS;IACnE,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM;IACpC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAClC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,8BAA8B;IACxE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,mBAAmB;IAClD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM;IACzC,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,GAAG;IA7Bb,OAAO,CAAC,OAAO,CAAc;IAG7B,OAAO,CAAC,mBAAmB,CAAS;IAGpC,OAAO,CAAC,OAAO,CAAkC;IAEjD,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAGnB,MAAM,EAAE,eAAe,EACd,SAAS,EAAE,GAAG,EACd,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,EAC7C,UAAU,EAAE,YAAY,EACxB,kBAAkB,EAAE,kBAAkB,EACtC,mBAAmB,EAAE,mBAAmB,EACxC,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,eAAe,GAAG,SAAS,EACtC,aAAa,EAAE,sBAAsB,GAAG,SAAS,EACjD,kBAAkB,EAAE,QAAQ,GAAG,SAAS,EACxC,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,EAChD,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,qBAAqB,EAAE,8BAA8B,EACrD,UAAU,EAAE,mBAAmB,EAC/B,cAAc,EAAE,MAAM,EACjC,aAAa,EAAE,6BAA6B,EAC5C,SAAS,GAAE,eAAsC,EACjD,GAAG,SAAuB;IAUvB,uBAAuB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAK9D,SAAS;IAIhB;;;;OAIG;WACiB,aAAa,CAC/B,WAAW,EAAE,eAAe,EAC5B,IAAI,GAAE;QACJ,SAAS,CAAC,EAAE,eAAe,CAAC;QAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,kBAAkB,CAAC;QAC/B,YAAY,CAAC,EAAE,YAAY,CAAC;QAC5B,cAAc,CAAC,EAAE,uBAAuB,CAAC;QACzC,aAAa,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;KAC9C,EACN,OAAO,GAAE;QACP,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;QAC3C,kBAAkB,CAAC,EAAE,OAAO,CAAC;KACzB,GACL,OAAO,CAAC,gBAAgB,CAAC;IA2R5B;;;OAGG;IACI,YAAY,IAAI,eAAe,GAAG,SAAS;IAI3C,cAAc,IAAI,aAAa;IAI/B,qBAAqB,IAAI,kBAAkB;IAI3C,MAAM,IAAI,GAAG;IAIpB;;;OAGG;IACI,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAItD,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAItC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAI/D;;;OAGG;IACI,OAAO;IAID,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IAsB7C;;;;OAIG;IACU,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAK1E;;;;OAIG;IACU,cAAc,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAKxE;;;;OAIG;IACU,iBAAiB,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAKzE;;;;;OAKG;IACU,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAI1D,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIzF;;;OAGG;IACU,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAInD;;;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;;;;;OAKG;IACI,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIzE;;;;;;OAMG;IACI,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;IAIjF;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIhE;;;;OAIG;IACH,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAI9E;;;OAGG;IACU,MAAM,CAAC,EAAE,EAAE,EAAE;IAqBb,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAkBtD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAIxE;;OAEG;IACU,IAAI;IAejB;;;;;OAKG;IACI,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC;IAI5D,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAI3C;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;IAI3D;;;;OAIG;IACU,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC;IAI5D;;;;;;;OAOG;IACU,iBAAiB,CAC5B,WAAW,EAAE,aAAa,EAC1B,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,EAAE,EAAE,GACf,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;IA2D3C;;;;;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;IAKxC,2BAA2B,CACtC,WAAW,EAAE,aAAa,EAC1B,OAAO,EAAE,EAAE,GACV,OAAO,CAAC,iBAAiB,CAAC,OAAO,cAAc,CAAC,GAAG,SAAS,CAAC;IAQnD,4BAA4B,CACvC,WAAW,EAAE,aAAa,EAC1B,QAAQ,EAAE,EAAE,GACX,OAAO,CAAC,iBAAiB,CAAC,OAAO,qBAAqB,CAAC,GAAG,SAAS,CAAC;IAWvE;;;;;OAKG;IACU,iCAAiC,CAC5C,WAAW,EAAE,aAAa,EAC1B,aAAa,EAAE,EAAE,GAChB,OAAO,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAC,GAAG,SAAS,CAAC;IAWjE,qBAAqB,CAAC,aAAa,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKlF;;;;OAIG;IACU,qBAAqB,CAAC,aAAa,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvE;;;;OAIG;IACU,iBAAiB,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC;IAKvF;;;;;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;IAgBlD;;;;;;;;;;;;;OAaG;IACU,gCAAgC,CAC3C,WAAW,EAAE,aAAa,EAC1B,SAAS,EAAE,EAAE,GACZ,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC;IAgB5C,oBAAoB,CAAC,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAe5G;;;;;;;;;;OAUG;IACU,kBAAkB,CAAC,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IAe1G;;;OAGG;IACU,cAAc,CAAC,WAAW,GAAE,aAAwB,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAMpG;;;;OAIG;IACU,oBAAoB,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAIlF;;;;OAIG;IACU,uBAAuB,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAInF;;;QAGI;IAIS,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,kBAAkB,UAAQ,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoExF,SAAS,CACpB,EAAE,EAAE,EAAE,EACN,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAAO,GAClG,OAAO,CAAC,kBAAkB,CAAC;IAqBvB,SAAS,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAMpC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrE,4BAA4B,IAAI,OAAO,CAAC,yBAAyB,CAAC;IASlE,kCAAkC,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC;IAI9C,iBAAiB,CACtB,gBAAgB,EAAE,UAAU,EAC5B,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;IAI/B,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCpD,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC/D,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAMhC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAOhD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAiD/E"}
|
|
@@ -10,7 +10,6 @@ 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
12
|
import { RegistryContract, RollupContract, createEthereumChain, getPublicClient } from '@aztec/ethereum';
|
|
13
|
-
import { createL1TxUtilsWithBlobsFromEthSigner } from '@aztec/ethereum/l1-tx-utils-with-blobs';
|
|
14
13
|
import { compactArray, pick } from '@aztec/foundation/collection';
|
|
15
14
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
16
15
|
import { Fr } from '@aztec/foundation/fields';
|
|
@@ -22,6 +21,7 @@ import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
|
22
21
|
import { MembershipWitness } from '@aztec/foundation/trees';
|
|
23
22
|
import { KeystoreManager, loadKeystores, mergeKeystores } from '@aztec/node-keystore';
|
|
24
23
|
import { trySnapshotSync, uploadSnapshot } from '@aztec/node-lib/actions';
|
|
24
|
+
import { createL1TxUtilsWithBlobsFromEthSigner } from '@aztec/node-lib/factories';
|
|
25
25
|
import { createP2PClient, getDefaultAllowedSetupFunctions } from '@aztec/p2p';
|
|
26
26
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
27
27
|
import { BlockBuilder, GlobalVariableBuilder, SequencerClient, createValidatorForAcceptingTxs } from '@aztec/sequencer-client';
|
|
@@ -32,12 +32,13 @@ import { L2BlockHash } from '@aztec/stdlib/block';
|
|
|
32
32
|
import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
|
|
33
33
|
import { AztecNodeAdminConfigSchema } from '@aztec/stdlib/interfaces/client';
|
|
34
34
|
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
35
|
+
import { InboxLeaf } from '@aztec/stdlib/messaging';
|
|
35
36
|
import { P2PClientType } from '@aztec/stdlib/p2p';
|
|
36
37
|
import { MerkleTreeId, NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
37
38
|
import { PublicSimulationOutput, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
38
39
|
import { getPackageVersion } from '@aztec/stdlib/update-checker';
|
|
39
40
|
import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
40
|
-
import { NodeKeystoreAdapter, ValidatorClient, createValidatorClient } from '@aztec/validator-client';
|
|
41
|
+
import { NodeKeystoreAdapter, ValidatorClient, createBlockProposalHandler, createValidatorClient } from '@aztec/validator-client';
|
|
41
42
|
import { createWorldStateSynchronizer } from '@aztec/world-state';
|
|
42
43
|
import { createPublicClient, fallback, http } from 'viem';
|
|
43
44
|
import { createSentinel } from '../sentinel/factory.js';
|
|
@@ -134,6 +135,7 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
134
135
|
keyStoreManager = new KeystoreManager(keyStore);
|
|
135
136
|
}
|
|
136
137
|
}
|
|
138
|
+
await keyStoreManager?.validateSigners();
|
|
137
139
|
// If we are a validator, verify our configuration before doing too much more.
|
|
138
140
|
if (!config.disableValidator) {
|
|
139
141
|
if (keyStoreManager === undefined) {
|
|
@@ -142,7 +144,7 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
142
144
|
if (!keyStoreProvided) {
|
|
143
145
|
log.warn('KEY STORE CREATED FROM ENVIRONMENT, IT IS RECOMMENDED TO USE A FILE-BASED KEY STORE IN PRODUCTION ENVIRONMENTS');
|
|
144
146
|
}
|
|
145
|
-
ValidatorClient.validateKeyStoreConfiguration(keyStoreManager);
|
|
147
|
+
ValidatorClient.validateKeyStoreConfiguration(keyStoreManager, log);
|
|
146
148
|
}
|
|
147
149
|
// validate that the actual chain id matches that specified in configuration
|
|
148
150
|
if (config.l1ChainId !== ethereumChain.chainInfo.id) {
|
|
@@ -191,17 +193,53 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
191
193
|
const proofVerifier = new QueuedIVCVerifier(config, circuitVerifier);
|
|
192
194
|
// create the tx pool and the p2p client, which will need the l2 block source
|
|
193
195
|
const p2pClient = await createP2PClient(P2PClientType.Full, config, archiver, proofVerifier, worldStateSynchronizer, epochCache, packageVersion, dateProvider, telemetry, deps.p2pClientDeps);
|
|
194
|
-
//
|
|
195
|
-
await worldStateSynchronizer.start();
|
|
196
|
-
// Start p2p. Note that it depends on world state to be running.
|
|
197
|
-
await p2pClient.start();
|
|
196
|
+
// We should really not be modifying the config object
|
|
198
197
|
config.txPublicSetupAllowList = config.txPublicSetupAllowList ?? await getDefaultAllowedSetupFunctions();
|
|
199
198
|
const blockBuilder = new BlockBuilder({
|
|
200
199
|
...config,
|
|
201
200
|
l1GenesisTime,
|
|
202
201
|
slotDuration: Number(slotDuration)
|
|
203
202
|
}, worldStateSynchronizer, archiver, dateProvider, telemetry);
|
|
203
|
+
// We'll accumulate sentinel watchers here
|
|
204
204
|
const watchers = [];
|
|
205
|
+
// Create validator client if required
|
|
206
|
+
const validatorClient = createValidatorClient(config, {
|
|
207
|
+
p2pClient,
|
|
208
|
+
telemetry,
|
|
209
|
+
dateProvider,
|
|
210
|
+
epochCache,
|
|
211
|
+
blockBuilder,
|
|
212
|
+
blockSource: archiver,
|
|
213
|
+
l1ToL2MessageSource: archiver,
|
|
214
|
+
keyStoreManager
|
|
215
|
+
});
|
|
216
|
+
// If we have a validator client, register it as a source of offenses for the slasher,
|
|
217
|
+
// and have it register callbacks on the p2p client *before* we start it, otherwise messages
|
|
218
|
+
// like attestations or auths will fail.
|
|
219
|
+
if (validatorClient) {
|
|
220
|
+
watchers.push(validatorClient);
|
|
221
|
+
if (!options.dontStartSequencer) {
|
|
222
|
+
await validatorClient.registerHandlers();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// If there's no validator client but alwaysReexecuteBlockProposals is enabled,
|
|
226
|
+
// create a BlockProposalHandler to reexecute block proposals for monitoring
|
|
227
|
+
if (!validatorClient && config.alwaysReexecuteBlockProposals) {
|
|
228
|
+
log.info('Setting up block proposal reexecution for monitoring');
|
|
229
|
+
createBlockProposalHandler(config, {
|
|
230
|
+
blockBuilder,
|
|
231
|
+
epochCache,
|
|
232
|
+
blockSource: archiver,
|
|
233
|
+
l1ToL2MessageSource: archiver,
|
|
234
|
+
p2pClient,
|
|
235
|
+
dateProvider,
|
|
236
|
+
telemetry
|
|
237
|
+
}).registerForReexecution(p2pClient);
|
|
238
|
+
}
|
|
239
|
+
// Start world state and wait for it to sync to the archiver.
|
|
240
|
+
await worldStateSynchronizer.start();
|
|
241
|
+
// Start p2p. Note that it depends on world state to be running.
|
|
242
|
+
await p2pClient.start();
|
|
205
243
|
const validatorsSentinel = await createSentinel(epochCache, archiver, p2pClient, config);
|
|
206
244
|
if (validatorsSentinel) {
|
|
207
245
|
// we can run a sentinel without trying to slash.
|
|
@@ -223,19 +261,6 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
223
261
|
await attestationsBlockWatcher.start();
|
|
224
262
|
watchers.push(attestationsBlockWatcher);
|
|
225
263
|
}
|
|
226
|
-
const validatorClient = createValidatorClient(config, {
|
|
227
|
-
p2pClient,
|
|
228
|
-
telemetry,
|
|
229
|
-
dateProvider,
|
|
230
|
-
epochCache,
|
|
231
|
-
blockBuilder,
|
|
232
|
-
blockSource: archiver,
|
|
233
|
-
l1ToL2MessageSource: archiver,
|
|
234
|
-
keyStoreManager
|
|
235
|
-
});
|
|
236
|
-
if (validatorClient) {
|
|
237
|
-
watchers.push(validatorClient);
|
|
238
|
-
}
|
|
239
264
|
log.verbose(`All Aztec Node subsystems synced`);
|
|
240
265
|
// Validator enabled, create/start relevant service
|
|
241
266
|
let sequencer;
|
|
@@ -246,8 +271,13 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
246
271
|
const validatorAddresses = keyStoreManager ? NodeKeystoreAdapter.fromKeyStoreManager(keyStoreManager).getAddresses() : [];
|
|
247
272
|
slasherClient = await createSlasher(config, config.l1Contracts, getPublicClient(config), watchers, dateProvider, epochCache, validatorAddresses, undefined);
|
|
248
273
|
await slasherClient.start();
|
|
249
|
-
const l1TxUtils = keyStoreManager.createAllValidatorPublisherSigners()
|
|
250
|
-
|
|
274
|
+
const l1TxUtils = await createL1TxUtilsWithBlobsFromEthSigner(publicClient, keyStoreManager.createAllValidatorPublisherSigners(), {
|
|
275
|
+
...config,
|
|
276
|
+
scope: 'sequencer'
|
|
277
|
+
}, {
|
|
278
|
+
telemetry,
|
|
279
|
+
logger: log.createChild('l1-tx-utils'),
|
|
280
|
+
dateProvider
|
|
251
281
|
});
|
|
252
282
|
sequencer = await SequencerClient.new(config, {
|
|
253
283
|
// if deps were provided, they should override the defaults,
|
|
@@ -271,6 +301,8 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
271
301
|
if (!options.dontStartSequencer && sequencer) {
|
|
272
302
|
await sequencer.start();
|
|
273
303
|
log.verbose(`Sequencer started`);
|
|
304
|
+
} else if (sequencer) {
|
|
305
|
+
log.warn(`Sequencer created but not started`);
|
|
274
306
|
}
|
|
275
307
|
return new AztecNodeService(config, p2pClient, archiver, archiver, archiver, archiver, worldStateSynchronizer, sequencer, slasherClient, validatorsSentinel, epochPruneWatcher, ethereumChain.chainInfo.id, config.rollupVersion, new GlobalVariableBuilder(config), epochCache, packageVersion, proofVerifier, telemetry, log);
|
|
276
308
|
}
|
|
@@ -298,6 +330,9 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
298
330
|
getEncodedEnr() {
|
|
299
331
|
return Promise.resolve(this.p2pClient.getEnr()?.encodeTxt());
|
|
300
332
|
}
|
|
333
|
+
async getAllowedPublicSetup() {
|
|
334
|
+
return this.config.txPublicSetupAllowList ?? await getDefaultAllowedSetupFunctions();
|
|
335
|
+
}
|
|
301
336
|
/**
|
|
302
337
|
* Method to determine if the node is ready to accept transactions.
|
|
303
338
|
* @returns - Flag indicating the readiness for tx submission.
|
|
@@ -328,7 +363,24 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
328
363
|
* @param number - The block number being requested.
|
|
329
364
|
* @returns The requested block.
|
|
330
365
|
*/ async getBlock(number) {
|
|
331
|
-
|
|
366
|
+
const blockNumber = number === 'latest' ? await this.getBlockNumber() : number;
|
|
367
|
+
return await this.blockSource.getBlock(blockNumber);
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Get a block specified by its hash.
|
|
371
|
+
* @param blockHash - The block hash being requested.
|
|
372
|
+
* @returns The requested block.
|
|
373
|
+
*/ async getBlockByHash(blockHash) {
|
|
374
|
+
const publishedBlock = await this.blockSource.getPublishedBlockByHash(blockHash);
|
|
375
|
+
return publishedBlock?.block;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Get a block specified by its archive root.
|
|
379
|
+
* @param archive - The archive root being requested.
|
|
380
|
+
* @returns The requested block.
|
|
381
|
+
*/ async getBlockByArchive(archive) {
|
|
382
|
+
const publishedBlock = await this.blockSource.getPublishedBlockByArchive(archive);
|
|
383
|
+
return publishedBlock?.block;
|
|
332
384
|
}
|
|
333
385
|
/**
|
|
334
386
|
* Method to request blocks. Will attempt to return all requested blocks but will return only those available.
|
|
@@ -600,12 +652,17 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
600
652
|
witness.path
|
|
601
653
|
];
|
|
602
654
|
}
|
|
655
|
+
async getL1ToL2MessageBlock(l1ToL2Message) {
|
|
656
|
+
const messageIndex = await this.l1ToL2MessageSource.getL1ToL2MessageIndex(l1ToL2Message);
|
|
657
|
+
return messageIndex ? InboxLeaf.l2BlockFromIndex(messageIndex) : undefined;
|
|
658
|
+
}
|
|
603
659
|
/**
|
|
604
660
|
* Returns whether an L1 to L2 message is synced by archiver and if it's ready to be included in a block.
|
|
605
661
|
* @param l1ToL2Message - The L1 to L2 message to check.
|
|
606
662
|
* @returns Whether the message is synced and ready to be included in a block.
|
|
607
663
|
*/ async isL1ToL2MessageSynced(l1ToL2Message) {
|
|
608
|
-
|
|
664
|
+
const messageIndex = await this.l1ToL2MessageSource.getL1ToL2MessageIndex(l1ToL2Message);
|
|
665
|
+
return messageIndex !== undefined;
|
|
609
666
|
}
|
|
610
667
|
/**
|
|
611
668
|
* Returns all the L2 to L1 messages in a block.
|
|
@@ -718,6 +775,20 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
718
775
|
return blockNumber === 0 || blockNumber === 'latest' && await this.blockSource.getBlockNumber() === 0 ? this.worldStateSynchronizer.getCommitted().getInitialHeader() : this.blockSource.getBlockHeader(blockNumber);
|
|
719
776
|
}
|
|
720
777
|
/**
|
|
778
|
+
* Get a block header specified by its hash.
|
|
779
|
+
* @param blockHash - The block hash being requested.
|
|
780
|
+
* @returns The requested block header.
|
|
781
|
+
*/ async getBlockHeaderByHash(blockHash) {
|
|
782
|
+
return await this.blockSource.getBlockHeaderByHash(blockHash);
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* Get a block header specified by its archive root.
|
|
786
|
+
* @param archive - The archive root being requested.
|
|
787
|
+
* @returns The requested block header.
|
|
788
|
+
*/ async getBlockHeaderByArchive(archive) {
|
|
789
|
+
return await this.blockSource.getBlockHeaderByArchive(archive);
|
|
790
|
+
}
|
|
791
|
+
/**
|
|
721
792
|
* Simulates the public part of a transaction with the current state.
|
|
722
793
|
* @param tx - The transaction to simulate.
|
|
723
794
|
**/ async simulatePublicCalls(tx, skipFeeEnforcement = false) {
|
|
@@ -742,7 +813,11 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
742
813
|
});
|
|
743
814
|
const merkleTreeFork = await this.worldStateSynchronizer.fork();
|
|
744
815
|
try {
|
|
745
|
-
const processor = publicProcessorFactory.create(merkleTreeFork, newGlobalVariables,
|
|
816
|
+
const processor = publicProcessorFactory.create(merkleTreeFork, newGlobalVariables, {
|
|
817
|
+
skipFeeEnforcement,
|
|
818
|
+
clientInitiatedSimulation: true,
|
|
819
|
+
maxDebugLogMemoryReads: this.config.rpcSimulatePublicMaxDebugLogMemoryReads
|
|
820
|
+
});
|
|
746
821
|
// REFACTOR: Consider merging ProcessReturnValues into ProcessedTx
|
|
747
822
|
const [processedTxs, failedTxs, _usedTxs, returns] = await processor.process([
|
|
748
823
|
tx
|
|
@@ -788,11 +863,14 @@ import { NodeMetrics } from './node_metrics.js';
|
|
|
788
863
|
...this.config,
|
|
789
864
|
...config
|
|
790
865
|
};
|
|
791
|
-
this.sequencer?.
|
|
866
|
+
this.sequencer?.updateConfig(config);
|
|
792
867
|
this.slasherClient?.updateConfig(config);
|
|
793
868
|
this.validatorsSentinel?.updateConfig(config);
|
|
794
|
-
// this.blockBuilder.updateConfig(config); // TODO: Spyros has a PR to add the builder to `this`, so we can do this
|
|
795
869
|
await this.p2pClient.updateP2PConfig(config);
|
|
870
|
+
const archiver = this.blockSource;
|
|
871
|
+
if ('updateConfig' in archiver) {
|
|
872
|
+
archiver.updateConfig(config);
|
|
873
|
+
}
|
|
796
874
|
if (newConfig.realProofs !== this.config.realProofs) {
|
|
797
875
|
this.proofVerifier = config.realProofs ? await BBCircuitVerifier.new(newConfig) : new TestCircuitVerifier();
|
|
798
876
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
2
2
|
export type SentinelConfig = {
|
|
3
3
|
sentinelHistoryLengthInEpochs: number;
|
|
4
|
+
sentinelHistoricProvenPerformanceLengthInEpochs: number;
|
|
4
5
|
sentinelEnabled: boolean;
|
|
5
6
|
};
|
|
6
7
|
export declare const sentinelConfigMappings: ConfigMappingsType<SentinelConfig>;
|
|
@@ -1 +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,
|
|
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,+CAA+C,EAAE,MAAM,CAAC;IACxD,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,kBAAkB,CAAC,cAAc,CA4BrE,CAAC"}
|
package/dest/sentinel/config.js
CHANGED
|
@@ -5,6 +5,22 @@ export const sentinelConfigMappings = {
|
|
|
5
5
|
env: 'SENTINEL_HISTORY_LENGTH_IN_EPOCHS',
|
|
6
6
|
...numberConfigHelper(24)
|
|
7
7
|
},
|
|
8
|
+
/**
|
|
9
|
+
* The number of L2 epochs kept of proven performance history for each validator.
|
|
10
|
+
* This value must be large enough so that we have proven performance for every validator
|
|
11
|
+
* for at least slashInactivityConsecutiveEpochThreshold. Assuming this value is 3,
|
|
12
|
+
* and the committee size is 48, and we have 10k validators, then we pick 48 out of 10k each draw.
|
|
13
|
+
* For any fixed element, per-draw prob = 48/10000 = 0.0048.
|
|
14
|
+
* After n draws, count ~ Binomial(n, 0.0048). We want P(X >= 3).
|
|
15
|
+
* Results (exact binomial):
|
|
16
|
+
* - 90% chance: n = 1108
|
|
17
|
+
* - 95% chance: n = 1310
|
|
18
|
+
* - 99% chance: n = 1749
|
|
19
|
+
*/ sentinelHistoricProvenPerformanceLengthInEpochs: {
|
|
20
|
+
description: 'The number of L2 epochs kept of proven performance history for each validator.',
|
|
21
|
+
env: 'SENTINEL_HISTORIC_PROVEN_PERFORMANCE_LENGTH_IN_EPOCHS',
|
|
22
|
+
...numberConfigHelper(2000)
|
|
23
|
+
},
|
|
8
24
|
sentinelEnabled: {
|
|
9
25
|
description: 'Whether the sentinel is enabled or not.',
|
|
10
26
|
env: 'SENTINEL_ENABLED',
|
|
@@ -1 +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;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE,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,GAAG,aAAa,EACxD,MAAM,yCAAgC,GACrC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,
|
|
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;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE,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,GAAG,aAAa,EACxD,MAAM,yCAAgC,GACrC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAiB/B"}
|
package/dest/sentinel/factory.js
CHANGED
|
@@ -8,8 +8,10 @@ export async function createSentinel(epochCache, archiver, p2p, config, logger =
|
|
|
8
8
|
}
|
|
9
9
|
const kvStore = await createStore('sentinel', SentinelStore.SCHEMA_VERSION, config, createLogger('node:sentinel:lmdb'));
|
|
10
10
|
const storeHistoryLength = config.sentinelHistoryLengthInEpochs * epochCache.getL1Constants().epochDuration;
|
|
11
|
+
const storeHistoricProvenPerformanceLength = config.sentinelHistoricProvenPerformanceLengthInEpochs;
|
|
11
12
|
const sentinelStore = new SentinelStore(kvStore, {
|
|
12
|
-
historyLength: storeHistoryLength
|
|
13
|
+
historyLength: storeHistoryLength,
|
|
14
|
+
historicProvenPerformanceLength: storeHistoricProvenPerformanceLength
|
|
13
15
|
});
|
|
14
16
|
return new Sentinel(epochCache, archiver, p2p, sentinelStore, config, logger);
|
|
15
17
|
}
|
|
@@ -35,7 +35,6 @@ export declare class Sentinel extends Sentinel_base implements L2BlockStreamEven
|
|
|
35
35
|
handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
|
|
36
36
|
protected handleChainProven(event: L2BlockStreamEvent): Promise<void>;
|
|
37
37
|
protected computeProvenPerformance(epoch: bigint): Promise<ValidatorsEpochPerformance>;
|
|
38
|
-
protected updateProvenPerformance(epoch: bigint, performance: ValidatorsEpochPerformance): Promise<void>;
|
|
39
38
|
/**
|
|
40
39
|
* Checks if a validator has been inactive for the specified number of consecutive epochs for which we have data on it.
|
|
41
40
|
* @param validator The validator address to check
|
|
@@ -68,17 +67,19 @@ export declare class Sentinel extends Sentinel_base implements L2BlockStreamEven
|
|
|
68
67
|
/** Push the status for each slot for each validator. */
|
|
69
68
|
protected updateValidators(slot: bigint, stats: Record<`0x${string}`, ValidatorStatusInSlot | undefined>): Promise<void>;
|
|
70
69
|
/** Computes stats to be returned based on stored data. */
|
|
71
|
-
computeStats({ fromSlot
|
|
70
|
+
computeStats({ fromSlot, toSlot, validators, }?: {
|
|
72
71
|
fromSlot?: bigint;
|
|
73
72
|
toSlot?: bigint;
|
|
73
|
+
validators?: EthAddress[];
|
|
74
74
|
}): Promise<ValidatorsStats>;
|
|
75
75
|
/** Computes stats for a single validator. */
|
|
76
76
|
getValidatorStats(validatorAddress: EthAddress, fromSlot?: bigint, toSlot?: bigint): Promise<SingleValidatorStats | undefined>;
|
|
77
77
|
protected computeStatsForValidator(address: `0x${string}`, allHistory: ValidatorStatusHistory, fromSlot?: bigint, toSlot?: bigint): ValidatorStats;
|
|
78
|
-
protected computeMissed(history: ValidatorStatusHistory, computeOverPrefix: ValidatorStatusType, filter: ValidatorStatusInSlot): {
|
|
78
|
+
protected computeMissed(history: ValidatorStatusHistory, computeOverPrefix: ValidatorStatusType | undefined, filter: ValidatorStatusInSlot[]): {
|
|
79
79
|
currentStreak: number;
|
|
80
80
|
rate: number | undefined;
|
|
81
81
|
count: number;
|
|
82
|
+
total: number;
|
|
82
83
|
};
|
|
83
84
|
protected computeFromSlot(slot: bigint | undefined): {
|
|
84
85
|
timestamp: bigint;
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"sentinel.d.ts","sourceRoot":"","sources":["../../src/sentinel/sentinel.ts"],"names":[],"mappings":"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"}
|