@chainsafe/lodestar 1.9.0-dev.f16192f079 → 1.9.0-dev.f2458491b9
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/.git-data.json +1 -1
- package/lib/applyPreset.js +7 -1
- package/lib/applyPreset.js.map +1 -1
- package/lib/cli.js +1 -1
- package/lib/cli.js.map +1 -1
- package/lib/cmds/beacon/handler.d.ts +3 -3
- package/lib/cmds/beacon/handler.js +51 -8
- package/lib/cmds/beacon/handler.js.map +1 -1
- package/lib/cmds/beacon/options.d.ts +4 -1
- package/lib/cmds/beacon/options.js +9 -0
- package/lib/cmds/beacon/options.js.map +1 -1
- package/lib/cmds/dev/options.d.ts +4 -1
- package/lib/cmds/lightclient/handler.js +3 -2
- package/lib/cmds/lightclient/handler.js.map +1 -1
- package/lib/cmds/lightclient/options.d.ts +2 -1
- package/lib/cmds/lightclient/options.js.map +1 -1
- package/lib/cmds/validator/handler.js +16 -15
- package/lib/cmds/validator/handler.js.map +1 -1
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions.d.ts +16 -0
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions.js +108 -0
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions.js.map +1 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/index.d.ts +2 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/index.js +2 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/index.js.map +1 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/poolSize.d.ts +6 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/poolSize.js +19 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/poolSize.js.map +1 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/threadPool.d.ts +25 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/threadPool.js +53 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/threadPool.js.map +1 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/types.d.ts +11 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/types.js +4 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/types.js.map +1 -0
- package/lib/cmds/validator/keymanager/decryptKeystores/worker.d.ts +9 -0
- package/lib/cmds/validator/keymanager/{decryptKeystoreDefinitions → decryptKeystores}/worker.js +6 -5
- package/lib/cmds/validator/keymanager/decryptKeystores/worker.js.map +1 -0
- package/lib/cmds/validator/keymanager/keystoreCache.js +2 -1
- package/lib/cmds/validator/keymanager/keystoreCache.js.map +1 -1
- package/lib/cmds/validator/options.d.ts +3 -1
- package/lib/cmds/validator/options.js +5 -0
- package/lib/cmds/validator/options.js.map +1 -1
- package/lib/cmds/validator/signers/importExternalKeystores.js +0 -2
- package/lib/cmds/validator/signers/importExternalKeystores.js.map +1 -1
- package/lib/cmds/validator/signers/index.d.ts +2 -2
- package/lib/cmds/validator/signers/index.js +3 -1
- package/lib/cmds/validator/signers/index.js.map +1 -1
- package/lib/cmds/validator/signers/logSigners.d.ts +2 -2
- package/lib/cmds/validator/signers/logSigners.js.map +1 -1
- package/lib/cmds/validator/slashingProtection/export.d.ts +1 -1
- package/lib/cmds/validator/slashingProtection/export.js +3 -2
- package/lib/cmds/validator/slashingProtection/export.js.map +1 -1
- package/lib/cmds/validator/slashingProtection/import.d.ts +1 -1
- package/lib/cmds/validator/slashingProtection/import.js +3 -2
- package/lib/cmds/validator/slashingProtection/import.js.map +1 -1
- package/lib/options/beaconNodeOptions/api.d.ts +1 -0
- package/lib/options/beaconNodeOptions/api.js +6 -0
- package/lib/options/beaconNodeOptions/api.js.map +1 -1
- package/lib/options/beaconNodeOptions/builder.d.ts +0 -1
- package/lib/options/beaconNodeOptions/builder.js +0 -9
- package/lib/options/beaconNodeOptions/builder.js.map +1 -1
- package/lib/options/beaconNodeOptions/index.d.ts +3 -1
- package/lib/options/beaconNodeOptions/network.d.ts +2 -0
- package/lib/options/beaconNodeOptions/network.js +26 -9
- package/lib/options/beaconNodeOptions/network.js.map +1 -1
- package/lib/options/logOptions.d.ts +11 -1
- package/lib/options/logOptions.js +7 -6
- package/lib/options/logOptions.js.map +1 -1
- package/lib/util/index.d.ts +1 -0
- package/lib/util/index.js +1 -0
- package/lib/util/index.js.map +1 -1
- package/lib/util/logger.d.ts +7 -23
- package/lib/util/logger.js +53 -80
- package/lib/util/logger.js.map +1 -1
- package/lib/util/pruneOldFilesInDir.d.ts +2 -0
- package/lib/util/pruneOldFilesInDir.js +17 -0
- package/lib/util/pruneOldFilesInDir.js.map +1 -0
- package/package.json +16 -15
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions/index.d.ts +0 -8
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions/index.js +0 -92
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions/index.js.map +0 -1
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions/poolSize.d.ts +0 -6
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions/poolSize.js +0 -19
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions/poolSize.js.map +0 -1
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions/types.d.ts +0 -12
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions/types.js +0 -2
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions/types.js.map +0 -1
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions/worker.d.ts +0 -9
- package/lib/cmds/validator/keymanager/decryptKeystoreDefinitions/worker.js.map +0 -1
- package/lib/util/loggerConsoleTransport.d.ts +0 -24
- package/lib/util/loggerConsoleTransport.js +0 -35
- package/lib/util/loggerConsoleTransport.js.map +0 -1
package/.git-data.json
CHANGED
package/lib/applyPreset.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// set LODESTAR_PRESET manually every time.
|
|
15
15
|
var _a;
|
|
16
16
|
// IMPORTANT: only import Lodestar code here which does not import any other Lodestar libraries
|
|
17
|
-
import { setActivePreset, presetFromJson } from "@lodestar/params/setPreset";
|
|
17
|
+
import { setActivePreset, presetFromJson, PresetName } from "@lodestar/params/setPreset";
|
|
18
18
|
import { readFile } from "./util/file.js";
|
|
19
19
|
const network = valueOfArg("network");
|
|
20
20
|
const preset = valueOfArg("preset");
|
|
@@ -31,6 +31,9 @@ else if (process.env.LODESTAR_PRESET) {
|
|
|
31
31
|
else if (network) {
|
|
32
32
|
if (network === "dev") {
|
|
33
33
|
process.env.LODESTAR_PRESET = "minimal";
|
|
34
|
+
// "c-kzg" has hardcoded the mainnet value, do not use presets
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
36
|
+
setActivePreset(PresetName.minimal, { FIELD_ELEMENTS_PER_BLOB: 4096 });
|
|
34
37
|
}
|
|
35
38
|
else if (network === "gnosis" || network === "chiado") {
|
|
36
39
|
process.env.LODESTAR_PRESET = "gnosis";
|
|
@@ -40,6 +43,9 @@ else if (network) {
|
|
|
40
43
|
else if (process.argv[2] === "dev") {
|
|
41
44
|
process.env.LODESTAR_PRESET = "minimal";
|
|
42
45
|
process.env.LODESTAR_NETWORK = "dev";
|
|
46
|
+
// "c-kzg" has hardcoded the mainnet value, do not use presets
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
48
|
+
setActivePreset(PresetName.minimal, { FIELD_ELEMENTS_PER_BLOB: 4096 });
|
|
43
49
|
}
|
|
44
50
|
if (presetFile) {
|
|
45
51
|
// Override the active preset with custom values from file
|
package/lib/applyPreset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applyPreset.js","sourceRoot":"","sources":["../src/applyPreset.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,EAAE;AACF,eAAe;AACf,EAAE;AACF,yGAAyG;AACzG,sDAAsD;AACtD,EAAE;AACF,qGAAqG;AACrG,+DAA+D;AAC/D,kEAAkE;AAClE,kEAAkE;AAClE,EAAE;AACF,4FAA4F;AAC5F,2CAA2C;;AAE3C,+FAA+F;AAC/F,OAAO,EAAC,eAAe,EAAE,cAAc,EAAC,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"applyPreset.js","sourceRoot":"","sources":["../src/applyPreset.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,EAAE;AACF,eAAe;AACf,EAAE;AACF,yGAAyG;AACzG,sDAAsD;AACtD,EAAE;AACF,qGAAqG;AACrG,+DAA+D;AAC/D,kEAAkE;AAClE,kEAAkE;AAClE,EAAE;AACF,4FAA4F;AAC5F,2CAA2C;;AAE3C,+FAA+F;AAC/F,OAAO,EAAC,eAAe,EAAE,cAAc,EAAE,UAAU,EAAC,MAAM,4BAA4B,CAAC;AACvF,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAExC,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;AACtC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;AACpC,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;AAE5C,+BAA+B;AAC/B,IAAI,MAAM,EAAE;IACV,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC;CACtC;AAED,8FAA8F;KACzF,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE;IACpC,QAAQ;CACT;AAED,8BAA8B;KACzB,IAAI,OAAO,EAAE;IAChB,IAAI,OAAO,KAAK,KAAK,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC;QACxC,8DAA8D;QAC9D,gEAAgE;QAChE,eAAe,CAAC,UAAU,CAAC,OAAO,EAAE,EAAC,uBAAuB,EAAE,IAAI,EAAC,CAAC,CAAC;KACtE;SAAM,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,EAAE;QACvD,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,QAAQ,CAAC;KACxC;CACF;AAED,mEAAmE;KAC9D,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;IAClC,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,KAAK,CAAC;IACrC,8DAA8D;IAC9D,gEAAgE;IAChE,eAAe,CAAC,UAAU,CAAC,OAAO,EAAE,EAAC,uBAAuB,EAAE,IAAI,EAAC,CAAC,CAAC;CACtE;AAED,IAAI,UAAU,EAAE;IACd,0DAA0D;IAC1D,4DAA4D;IAC5D,eAAe,CAAC,IAAI,EAAE,cAAc,CAAC,MAAA,QAAQ,CAAC,UAAU,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC;CACnE;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,OAAe;IACjC,4BAA4B;IAC5B,0CAA0C;;IAE1C;QACE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QACnD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;YACd,OAAO,MAAA,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,mCAAI,EAAE,CAAC;SACtC;KACF;IAED,4BAA4B;IAC5B;QACE,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,IAAI,IAAI,EAAE;YACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAClC;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/lib/cli.js
CHANGED
|
@@ -8,7 +8,7 @@ import { getVersionData } from "./util/version.js";
|
|
|
8
8
|
const { version } = getVersionData();
|
|
9
9
|
const topBanner = `🌟 Lodestar: TypeScript Implementation of the Ethereum Consensus Beacon Chain.
|
|
10
10
|
* Version: ${version}
|
|
11
|
-
* by ChainSafe Systems, 2018
|
|
11
|
+
* by ChainSafe Systems, 2018-${new Date().getFullYear()}`;
|
|
12
12
|
const bottomBanner = `📖 For more information, check the CLI reference:
|
|
13
13
|
* https://chainsafe.github.io/lodestar/reference/cli
|
|
14
14
|
|
package/lib/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,aAAa,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAC,sBAAsB,EAAC,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAEjD,MAAM,EAAC,OAAO,EAAC,GAAG,cAAc,EAAE,CAAC;AACnC,MAAM,SAAS,GAAG;eACH,OAAO;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,aAAa,EAAE,cAAc,EAAC,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAC,sBAAsB,EAAC,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAEjD,MAAM,EAAC,OAAO,EAAC,GAAG,cAAc,EAAE,CAAC;AACnC,MAAM,SAAS,GAAG;eACH,OAAO;iCACW,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AAC5D,MAAM,YAAY,GAAG;;;;0CAIqB,CAAC;AAE3C,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAE,OAAwC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAEnF;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,IAAI;SAClB,GAAG,CAAC,UAAU,CAAC;SACf,mBAAmB,CAAC;QACnB,0DAA0D;QAC1D,2DAA2D;QAC3D,cAAc,EAAE,KAAK;KACtB,CAAC;SACD,OAAO,CAAC,aAAa,CAAC;QACvB,sFAAsF;SACrF,UAAU,CAAC,EAAE,CAAC;SACd,aAAa,CAAC,CAAC,CAAC;QACjB,+CAA+C;SAC9C,cAAc,CAAC,KAAK,CAAC;SACrB,KAAK,CAAC,SAAS,CAAC;SAChB,QAAQ,CAAC,YAAY,CAAC;SACtB,OAAO,CAAC,SAAS,CAAC;SAClB,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC;SAClB,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC;SACrB,iBAAiB,EAAE,CAAC;IAEvB,+BAA+B;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACtB,sBAAsB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;KACvC;IAED,+CAA+C;IAC/C,QAAQ,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC;IAEnC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Logger } from "@lodestar/utils";
|
|
2
1
|
import { ChainForkConfig } from "@lodestar/config";
|
|
2
|
+
import { LoggerNode } from "@lodestar/logger/node";
|
|
3
3
|
import { GlobalArgs } from "../../options/index.js";
|
|
4
4
|
import { BeaconArgs } from "./options.js";
|
|
5
5
|
/**
|
|
@@ -20,7 +20,7 @@ export declare function beaconHandlerInit(args: BeaconArgs & GlobalArgs): Promis
|
|
|
20
20
|
version: string;
|
|
21
21
|
commit: string;
|
|
22
22
|
peerId: import("@libp2p/interface-peer-id").PeerId;
|
|
23
|
-
logger:
|
|
23
|
+
logger: LoggerNode;
|
|
24
24
|
}>;
|
|
25
|
-
export declare function initLogger(args: BeaconArgs, dataDir: string, config: ChainForkConfig):
|
|
25
|
+
export declare function initLogger(args: BeaconArgs, dataDir: string, config: ChainForkConfig): LoggerNode;
|
|
26
26
|
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -5,14 +5,17 @@ import { LevelDbController } from "@lodestar/db";
|
|
|
5
5
|
import { BeaconNode, BeaconDb } from "@lodestar/beacon-node";
|
|
6
6
|
import { createBeaconConfig } from "@lodestar/config";
|
|
7
7
|
import { ACTIVE_PRESET, PresetName } from "@lodestar/params";
|
|
8
|
+
import { getNodeLogger } from "@lodestar/logger/node";
|
|
8
9
|
import { parseBeaconNodeArgs } from "../../options/index.js";
|
|
9
10
|
import { BeaconNodeOptions, getBeaconConfigFromArgs } from "../../config/index.js";
|
|
10
11
|
import { getNetworkBootnodes, getNetworkData, isKnownNetworkName, readBootnodes } from "../../networks/index.js";
|
|
11
|
-
import { onGracefulShutdown,
|
|
12
|
+
import { onGracefulShutdown, mkdir, writeFile600Perm, cleanOldLogFiles, parseLoggerArgs, pruneOldFilesInDir, } from "../../util/index.js";
|
|
12
13
|
import { getVersionData } from "../../util/version.js";
|
|
13
14
|
import { getBeaconPaths } from "./paths.js";
|
|
14
15
|
import { initBeaconState } from "./initBeaconState.js";
|
|
15
16
|
import { initPeerIdAndEnr } from "./initPeerIdAndEnr.js";
|
|
17
|
+
const DEFAULT_RETENTION_SSZ_OBJECTS_HOURS = 15 * 24;
|
|
18
|
+
const HOURS_TO_MS = 3600 * 1000;
|
|
16
19
|
/**
|
|
17
20
|
* Runs a beacon node.
|
|
18
21
|
*/
|
|
@@ -61,8 +64,25 @@ export async function beaconHandler(args) {
|
|
|
61
64
|
wsCheckpoint,
|
|
62
65
|
metricsRegistries,
|
|
63
66
|
});
|
|
64
|
-
|
|
67
|
+
// dev debug option to have access to the BN instance
|
|
68
|
+
if (args.attachToGlobalThis) {
|
|
65
69
|
globalThis.bn = node;
|
|
70
|
+
}
|
|
71
|
+
// Prune invalid SSZ objects every interval
|
|
72
|
+
const { persistInvalidSszObjectsDir } = args;
|
|
73
|
+
const pruneInvalidSSZObjectsInterval = persistInvalidSszObjectsDir
|
|
74
|
+
? setInterval(() => {
|
|
75
|
+
var _a;
|
|
76
|
+
try {
|
|
77
|
+
pruneOldFilesInDir(persistInvalidSszObjectsDir, ((_a = args.persistInvalidSszObjectsRetentionHours) !== null && _a !== void 0 ? _a : DEFAULT_RETENTION_SSZ_OBJECTS_HOURS) * HOURS_TO_MS);
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
logger.warn("Error pruning invalid SSZ objects", { persistInvalidSszObjectsDir }, e);
|
|
81
|
+
}
|
|
82
|
+
// Run every ~1 hour
|
|
83
|
+
}, HOURS_TO_MS)
|
|
84
|
+
: null;
|
|
85
|
+
// Intercept SIGINT signal, to perform final ops before exiting
|
|
66
86
|
onGracefulShutdown(async () => {
|
|
67
87
|
if (args.persistNetworkIdentity) {
|
|
68
88
|
try {
|
|
@@ -75,8 +95,23 @@ export async function beaconHandler(args) {
|
|
|
75
95
|
}
|
|
76
96
|
}
|
|
77
97
|
abortController.abort();
|
|
98
|
+
if (pruneInvalidSSZObjectsInterval !== null) {
|
|
99
|
+
clearInterval(pruneInvalidSSZObjectsInterval);
|
|
100
|
+
}
|
|
78
101
|
}, logger.info.bind(logger));
|
|
79
|
-
abortController.signal.addEventListener("abort", () =>
|
|
102
|
+
abortController.signal.addEventListener("abort", async () => {
|
|
103
|
+
try {
|
|
104
|
+
await node.close();
|
|
105
|
+
logger.debug("Beacon node closed");
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
logger.error("Error closing beacon node", {}, e);
|
|
109
|
+
// Make sure db is always closed gracefully
|
|
110
|
+
await db.stop();
|
|
111
|
+
// Must explicitly exit process due to potential active handles
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
}, { once: true });
|
|
80
115
|
}
|
|
81
116
|
catch (e) {
|
|
82
117
|
await db.stop();
|
|
@@ -115,19 +150,27 @@ export async function beaconHandlerInit(args) {
|
|
|
115
150
|
const { peerId, enr } = await initPeerIdAndEnr(args, beaconPaths.beaconDir, logger);
|
|
116
151
|
// Inject ENR to beacon options
|
|
117
152
|
beaconNodeOptions.set({ network: { discv5: { enr: enr.encodeTxt(), config: { enrUpdate: !enr.ip && !enr.ip6 } } } });
|
|
118
|
-
|
|
119
|
-
|
|
153
|
+
if (args.private) {
|
|
154
|
+
beaconNodeOptions.set({ network: { private: true } });
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// Add simple version string for libp2p agent version
|
|
158
|
+
beaconNodeOptions.set({ network: { version: version.split("/")[0] } });
|
|
159
|
+
// Add User-Agent header to all builder requests
|
|
160
|
+
beaconNodeOptions.set({ executionBuilder: { userAgent: `Lodestar/${version}` } });
|
|
161
|
+
}
|
|
120
162
|
// Render final options
|
|
121
163
|
const options = beaconNodeOptions.getWithDefaults();
|
|
122
164
|
return { config, options, beaconPaths, network, version, commit, peerId, logger };
|
|
123
165
|
}
|
|
124
166
|
export function initLogger(args, dataDir, config) {
|
|
125
|
-
const
|
|
167
|
+
const defaultLogFilepath = path.join(dataDir, "beacon.log");
|
|
168
|
+
const logger = getNodeLogger(parseLoggerArgs(args, { defaultLogFilepath }, config));
|
|
126
169
|
try {
|
|
127
|
-
cleanOldLogFiles(
|
|
170
|
+
cleanOldLogFiles(args, { defaultLogFilepath });
|
|
128
171
|
}
|
|
129
172
|
catch (e) {
|
|
130
|
-
logger.debug("Not able to delete log files",
|
|
173
|
+
logger.debug("Not able to delete log files", {}, e);
|
|
131
174
|
}
|
|
132
175
|
return logger;
|
|
133
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/cmds/beacon/handler.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AACrC,OAAO,EAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/cmds/beacon/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Options } from "yargs";
|
|
2
2
|
import { BeaconNodeArgs } from "../../options/index.js";
|
|
3
|
-
import {
|
|
3
|
+
import { LogArgs } from "../../options/logOptions.js";
|
|
4
|
+
import { CliCommandOptions } from "../../util/index.js";
|
|
4
5
|
import { BeaconPaths } from "./paths.js";
|
|
5
6
|
type BeaconExtraArgs = {
|
|
6
7
|
forceGenesis?: boolean;
|
|
@@ -13,8 +14,10 @@ type BeaconExtraArgs = {
|
|
|
13
14
|
beaconDir?: string;
|
|
14
15
|
dbDir?: string;
|
|
15
16
|
persistInvalidSszObjectsDir?: string;
|
|
17
|
+
persistInvalidSszObjectsRetentionHours?: number;
|
|
16
18
|
peerStoreDir?: string;
|
|
17
19
|
persistNetworkIdentity?: boolean;
|
|
20
|
+
private?: boolean;
|
|
18
21
|
};
|
|
19
22
|
export declare const beaconExtraOptions: CliCommandOptions<BeaconExtraArgs>;
|
|
20
23
|
type ENRArgs = {
|
|
@@ -55,6 +55,11 @@ export const beaconExtraOptions = {
|
|
|
55
55
|
hidden: true,
|
|
56
56
|
type: "string",
|
|
57
57
|
},
|
|
58
|
+
persistInvalidSszObjectsRetentionHours: {
|
|
59
|
+
description: "Number of hours to keep invalid SSZ objects on local disk",
|
|
60
|
+
hidden: true,
|
|
61
|
+
type: "number",
|
|
62
|
+
},
|
|
58
63
|
peerStoreDir: {
|
|
59
64
|
hidden: true,
|
|
60
65
|
description: "Peer store directory",
|
|
@@ -66,6 +71,10 @@ export const beaconExtraOptions = {
|
|
|
66
71
|
description: "Whether to reuse the same peer-id across restarts",
|
|
67
72
|
type: "boolean",
|
|
68
73
|
},
|
|
74
|
+
private: {
|
|
75
|
+
description: "Do not send implementation details over p2p identify protocol and in builder requests",
|
|
76
|
+
type: "boolean",
|
|
77
|
+
},
|
|
69
78
|
};
|
|
70
79
|
const enrOptions = {
|
|
71
80
|
"enr.ip": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/cmds/beacon/options.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,iBAAiB,EAAE,aAAa,EAAiB,MAAM,wBAAwB,CAAC;AACxF,OAAO,
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/cmds/beacon/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,18 +26,19 @@ export declare const devOptions: {
|
|
|
26
26
|
mdns?: Options | undefined;
|
|
27
27
|
targetPeers?: Options | undefined;
|
|
28
28
|
discv5?: Options | undefined;
|
|
29
|
+
disablePeerScoring?: Options | undefined;
|
|
29
30
|
"api.maxGindicesInProof"?: Options | undefined;
|
|
30
31
|
"rest.namespace"?: Options | undefined;
|
|
31
32
|
rest?: Options | undefined;
|
|
32
33
|
"rest.cors"?: Options | undefined;
|
|
33
34
|
"rest.address"?: Options | undefined;
|
|
34
35
|
"rest.port"?: Options | undefined;
|
|
36
|
+
"rest.headerLimit"?: Options | undefined;
|
|
35
37
|
"rest.bodyLimit"?: Options | undefined;
|
|
36
38
|
"builder.urls"?: Options | undefined;
|
|
37
39
|
"builder.timeout"?: Options | undefined;
|
|
38
40
|
"builder.faultInspectionWindow"?: Options | undefined;
|
|
39
41
|
"builder.allowedFaults"?: Options | undefined;
|
|
40
|
-
"builder.userAgent"?: Options | undefined;
|
|
41
42
|
"chain.blsVerifyAllMultiThread"?: Options | undefined;
|
|
42
43
|
"chain.blsVerifyAllMainThread"?: Options | undefined;
|
|
43
44
|
"chain.disableBlsBatchVerify"?: Options | undefined;
|
|
@@ -82,6 +83,7 @@ export declare const devOptions: {
|
|
|
82
83
|
"network.gossipsubAwaitHandler"?: Options | undefined;
|
|
83
84
|
"network.rateLimitMultiplier"?: Options | undefined;
|
|
84
85
|
"network.maxGossipTopicConcurrency"?: Options | undefined;
|
|
86
|
+
"network.useWorker"?: Options | undefined;
|
|
85
87
|
listenAddress?: Options | undefined;
|
|
86
88
|
discoveryPort?: Options | undefined;
|
|
87
89
|
"network.requestCountPeerLimit"?: Options | undefined;
|
|
@@ -101,6 +103,7 @@ export declare const devOptions: {
|
|
|
101
103
|
"keymanager.port": Options;
|
|
102
104
|
"keymanager.address": Options;
|
|
103
105
|
"keymanager.cors": Options;
|
|
106
|
+
"keymanager.headerLimit": Options;
|
|
104
107
|
"keymanager.bodyLimit": Options;
|
|
105
108
|
logLevel: Options;
|
|
106
109
|
logFile: Options;
|
|
@@ -3,13 +3,14 @@ import { ApiError, getClient } from "@lodestar/api";
|
|
|
3
3
|
import { Lightclient } from "@lodestar/light-client";
|
|
4
4
|
import { fromHexString } from "@chainsafe/ssz";
|
|
5
5
|
import { LightClientRestTransport } from "@lodestar/light-client/transport";
|
|
6
|
+
import { getNodeLogger } from "@lodestar/logger/node";
|
|
6
7
|
import { getBeaconConfigFromArgs } from "../../config/beaconParams.js";
|
|
7
8
|
import { getGlobalPaths } from "../../paths/global.js";
|
|
8
|
-
import {
|
|
9
|
+
import { parseLoggerArgs } from "../../util/logger.js";
|
|
9
10
|
export async function lightclientHandler(args) {
|
|
10
11
|
const { config, network } = getBeaconConfigFromArgs(args);
|
|
11
12
|
const globalPaths = getGlobalPaths(args, network);
|
|
12
|
-
const
|
|
13
|
+
const logger = getNodeLogger(parseLoggerArgs(args, { defaultLogFilepath: path.join(globalPaths.dataDir, "lightclient.log") }, config));
|
|
13
14
|
const { beaconApiUrl, checkpointRoot } = args;
|
|
14
15
|
const api = getClient({ baseUrl: beaconApiUrl }, { config });
|
|
15
16
|
const res = await api.beacon.getGenesis();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/cmds/lightclient/handler.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAC,MAAM,eAAe,CAAC;AAClD,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAC,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAC,wBAAwB,EAAC,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/cmds/lightclient/handler.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAC,MAAM,eAAe,CAAC;AAClD,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAC,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAC,wBAAwB,EAAC,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAC;AAIrD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAmC;IAC1E,MAAM,EAAC,MAAM,EAAE,OAAO,EAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,MAAM,GAAG,aAAa,CAC1B,eAAe,CAAC,IAAI,EAAE,EAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAC,EAAE,MAAM,CAAC,CACvG,CAAC;IACF,MAAM,EAAC,YAAY,EAAE,cAAc,EAAC,GAAG,IAAI,CAAC;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,EAAC,OAAO,EAAE,YAAY,EAAC,EAAE,EAAC,MAAM,EAAC,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,4BAA4B,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,4BAA4B,CAAC;QAC5D,MAAM;QACN,MAAM;QACN,WAAW,EAAE;YACX,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;YAClD,qBAAqB,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB;SAC/D;QACD,cAAc,EAAE,aAAa,CAAC,cAAc,CAAC;QAC7C,SAAS,EAAE,IAAI,wBAAwB,CAAC,GAAG,CAAC;KAC7C,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LogArgs } from "../../options/logOptions.js";
|
|
2
|
+
import { CliCommandOptions } from "../../util/index.js";
|
|
2
3
|
export type ILightClientArgs = LogArgs & {
|
|
3
4
|
beaconApiUrl: string;
|
|
4
5
|
checkpointRoot: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/cmds/lightclient/options.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/cmds/lightclient/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,UAAU,EAAC,MAAM,6BAA6B,CAAC;AAQhE,MAAM,CAAC,MAAM,kBAAkB,GAAwC;IACrE,GAAG,UAAU;IACb,YAAY,EAAE;QACZ,WAAW,EAAE,mDAAmD;QAChE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;KACd;IACD,cAAc,EAAE;QACd,WAAW,EAAE,wEAAwE;QACrF,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;KACd;CACF,CAAC"}
|
|
@@ -3,9 +3,10 @@ import { setMaxListeners } from "node:events";
|
|
|
3
3
|
import { LevelDbController } from "@lodestar/db";
|
|
4
4
|
import { SlashingProtection, Validator, } from "@lodestar/validator";
|
|
5
5
|
import { getMetrics } from "@lodestar/validator";
|
|
6
|
-
import { RegistryMetricCreator, collectNodeJSMetrics,
|
|
6
|
+
import { RegistryMetricCreator, collectNodeJSMetrics, getHttpMetricsServer, MonitoringService, } from "@lodestar/beacon-node";
|
|
7
|
+
import { getNodeLogger } from "@lodestar/logger/node";
|
|
7
8
|
import { getBeaconConfigFromArgs } from "../../config/index.js";
|
|
8
|
-
import { YargsError, getDefaultGraffiti, mkdir,
|
|
9
|
+
import { YargsError, cleanOldLogFiles, getDefaultGraffiti, mkdir, parseLoggerArgs } from "../../util/index.js";
|
|
9
10
|
import { onGracefulShutdown, parseFeeRecipient, parseProposerConfig } from "../../util/index.js";
|
|
10
11
|
import { getVersionData } from "../../util/version.js";
|
|
11
12
|
import { getAccountPaths, getValidatorPaths } from "./paths.js";
|
|
@@ -24,12 +25,13 @@ export async function validatorHandler(args) {
|
|
|
24
25
|
const doppelgangerProtectionEnabled = args.doppelgangerProtectionEnabled;
|
|
25
26
|
const validatorPaths = getValidatorPaths(args, network);
|
|
26
27
|
const accountPaths = getAccountPaths(args, network);
|
|
27
|
-
const
|
|
28
|
+
const defaultLogFilepath = path.join(validatorPaths.dataDir, "validator.log");
|
|
29
|
+
const logger = getNodeLogger(parseLoggerArgs(args, { defaultLogFilepath }, config));
|
|
28
30
|
try {
|
|
29
|
-
cleanOldLogFiles(
|
|
31
|
+
cleanOldLogFiles(args, { defaultLogFilepath });
|
|
30
32
|
}
|
|
31
33
|
catch (e) {
|
|
32
|
-
logger.debug("Not able to delete log files",
|
|
34
|
+
logger.debug("Not able to delete log files", {}, e);
|
|
33
35
|
}
|
|
34
36
|
const persistedKeysBackend = new PersistedKeysBackend(accountPaths);
|
|
35
37
|
const valProposerConfig = getProposerConfigFromArgs(args, { persistedKeysBackend, accountPaths });
|
|
@@ -52,6 +54,11 @@ export async function validatorHandler(args) {
|
|
|
52
54
|
};
|
|
53
55
|
// This AbortController interrupts various validators ops: genesis req, clients call, clock etc
|
|
54
56
|
const abortController = new AbortController();
|
|
57
|
+
// We set infinity for abort controller used for validator operations,
|
|
58
|
+
// to prevent MaxListenersExceededWarning which get logged when listeners > 10
|
|
59
|
+
// Since it is perfectly fine to have listeners > 10
|
|
60
|
+
setMaxListeners(Infinity, abortController.signal);
|
|
61
|
+
onGracefulShutdownCbs.push(async () => abortController.abort());
|
|
55
62
|
/**
|
|
56
63
|
* For rationale and documentation of how signers are loaded from args and disk,
|
|
57
64
|
* see {@link PersistedKeysBackend} and {@link getSignersFromArgs}
|
|
@@ -69,11 +76,6 @@ export async function validatorHandler(args) {
|
|
|
69
76
|
}
|
|
70
77
|
}
|
|
71
78
|
logSigners(logger, signers);
|
|
72
|
-
// We set infinity for abort controller used for validator operations,
|
|
73
|
-
// to prevent MaxListenersExceededWarning which get logged when listeners > 10
|
|
74
|
-
// Since it is perfectly fine to have listeners > 10
|
|
75
|
-
setMaxListeners(Infinity, abortController.signal);
|
|
76
|
-
onGracefulShutdownCbs.push(async () => abortController.abort());
|
|
77
79
|
const dbOps = {
|
|
78
80
|
config,
|
|
79
81
|
controller: new LevelDbController({ name: dbPath }, { metrics: null, logger }),
|
|
@@ -93,9 +95,8 @@ export async function validatorHandler(args) {
|
|
|
93
95
|
if (args["metrics"]) {
|
|
94
96
|
const port = (_a = args["metrics.port"]) !== null && _a !== void 0 ? _a : validatorMetricsDefaultOptions.port;
|
|
95
97
|
const address = (_b = args["metrics.address"]) !== null && _b !== void 0 ? _b : validatorMetricsDefaultOptions.address;
|
|
96
|
-
const metricsServer =
|
|
97
|
-
onGracefulShutdownCbs.push(() => metricsServer.
|
|
98
|
-
await metricsServer.start();
|
|
98
|
+
const metricsServer = await getHttpMetricsServer({ port, address }, { register, logger });
|
|
99
|
+
onGracefulShutdownCbs.push(() => metricsServer.close());
|
|
99
100
|
}
|
|
100
101
|
}
|
|
101
102
|
if (args["monitoring.endpoint"]) {
|
|
@@ -107,8 +108,7 @@ export async function validatorHandler(args) {
|
|
|
107
108
|
requestTimeout: (_e = args["monitoring.requestTimeout"]) !== null && _e !== void 0 ? _e : requestTimeout,
|
|
108
109
|
collectSystemStats: (_f = args["monitoring.collectSystemStats"]) !== null && _f !== void 0 ? _f : collectSystemStats,
|
|
109
110
|
}, { register: register, logger });
|
|
110
|
-
onGracefulShutdownCbs.push(() => monitoring.
|
|
111
|
-
monitoring.start();
|
|
111
|
+
onGracefulShutdownCbs.push(() => monitoring.close());
|
|
112
112
|
}
|
|
113
113
|
// This promise resolves once genesis is available.
|
|
114
114
|
// It will wait for genesis, so this promise can be potentially very long
|
|
@@ -142,6 +142,7 @@ export async function validatorHandler(args) {
|
|
|
142
142
|
port: args["keymanager.port"],
|
|
143
143
|
cors: args["keymanager.cors"],
|
|
144
144
|
isAuthEnabled: args["keymanager.authEnabled"],
|
|
145
|
+
headerLimit: args["keymanager.headerLimit"],
|
|
145
146
|
bodyLimit: args["keymanager.bodyLimit"],
|
|
146
147
|
tokenDir: dbPath,
|
|
147
148
|
}, { config, logger, api: keymanagerApi, metrics: metrics ? metrics.keymanagerApiRest : null });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/cmds/validator/handler.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,eAAe,EAAC,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAC/C,OAAO,EAEL,kBAAkB,EAClB,SAAS,GAGV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,UAAU,EAAkB,MAAM,qBAAqB,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/cmds/validator/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SignerLocal } from "@lodestar/validator";
|
|
2
|
+
import { LogLevel, Logger } from "@lodestar/utils";
|
|
3
|
+
import { LocalKeystoreDefinition } from "./interface.js";
|
|
4
|
+
type KeystoreDecryptOptions = {
|
|
5
|
+
ignoreLockFile?: boolean;
|
|
6
|
+
onDecrypt?: (index: number) => void;
|
|
7
|
+
cacheFilePath?: string;
|
|
8
|
+
logger: Pick<Logger, LogLevel.info | LogLevel.warn | LogLevel.debug>;
|
|
9
|
+
signal: AbortSignal;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Decrypt keystore definitions using a thread pool
|
|
13
|
+
*/
|
|
14
|
+
export declare function decryptKeystoreDefinitions(keystoreDefinitions: LocalKeystoreDefinition[], opts: KeystoreDecryptOptions): Promise<SignerLocal[]>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=decryptKeystoreDefinitions.d.ts.map
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { SignerType } from "@lodestar/validator";
|
|
3
|
+
import bls from "@chainsafe/bls";
|
|
4
|
+
import { lockFilepath, unlockFilepath } from "../../../util/lockfile.js";
|
|
5
|
+
import { clearKeystoreCache, loadKeystoreCache, writeKeystoreCache } from "./keystoreCache.js";
|
|
6
|
+
import { DecryptKeystoresThreadPool } from "./decryptKeystores/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Decrypt keystore definitions using a thread pool
|
|
9
|
+
*/
|
|
10
|
+
export async function decryptKeystoreDefinitions(keystoreDefinitions, opts) {
|
|
11
|
+
if (opts.cacheFilePath) {
|
|
12
|
+
try {
|
|
13
|
+
const signers = await loadKeystoreCache(opts.cacheFilePath, keystoreDefinitions);
|
|
14
|
+
for (const { keystorePath } of keystoreDefinitions) {
|
|
15
|
+
lockKeystore(keystorePath, opts);
|
|
16
|
+
}
|
|
17
|
+
if (opts === null || opts === void 0 ? void 0 : opts.onDecrypt) {
|
|
18
|
+
opts === null || opts === void 0 ? void 0 : opts.onDecrypt(signers.length - 1);
|
|
19
|
+
}
|
|
20
|
+
opts.logger.debug("Loaded keystores via keystore cache");
|
|
21
|
+
return signers;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Some error loading the cache, ignore and invalidate cache
|
|
25
|
+
await clearKeystoreCache(opts.cacheFilePath);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const keystoreCount = keystoreDefinitions.length;
|
|
29
|
+
const signers = new Array(keystoreCount);
|
|
30
|
+
const passwords = new Array(keystoreCount);
|
|
31
|
+
const errors = [];
|
|
32
|
+
const decryptKeystores = new DecryptKeystoresThreadPool(keystoreCount, opts.signal);
|
|
33
|
+
for (const [index, definition] of keystoreDefinitions.entries()) {
|
|
34
|
+
lockKeystore(definition.keystorePath, opts);
|
|
35
|
+
decryptKeystores.queue(definition, (secretKeyBytes) => {
|
|
36
|
+
const signer = {
|
|
37
|
+
type: SignerType.Local,
|
|
38
|
+
secretKey: bls.SecretKey.fromBytes(secretKeyBytes),
|
|
39
|
+
};
|
|
40
|
+
signers[index] = signer;
|
|
41
|
+
passwords[index] = definition.password;
|
|
42
|
+
if (opts === null || opts === void 0 ? void 0 : opts.onDecrypt) {
|
|
43
|
+
opts === null || opts === void 0 ? void 0 : opts.onDecrypt(index);
|
|
44
|
+
}
|
|
45
|
+
}, (error) => {
|
|
46
|
+
// In-progress tasks can't be canceled, so there's a chance that multiple errors may be caught
|
|
47
|
+
// add to the list of errors
|
|
48
|
+
errors.push({ keystoreFile: path.basename(definition.keystorePath), error });
|
|
49
|
+
// cancel all pending tasks, no need to continue decrypting after we hit one error
|
|
50
|
+
decryptKeystores.cancel();
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
await decryptKeystores.completed();
|
|
54
|
+
if (errors.length > 0) {
|
|
55
|
+
// If an error occurs, the program isn't going to be running,
|
|
56
|
+
// so we should unlock all lockfiles we created
|
|
57
|
+
for (const { keystorePath } of keystoreDefinitions) {
|
|
58
|
+
unlockFilepath(keystorePath);
|
|
59
|
+
}
|
|
60
|
+
throw formattedError(errors, signers, keystoreCount);
|
|
61
|
+
}
|
|
62
|
+
if (opts.cacheFilePath) {
|
|
63
|
+
await writeKeystoreCache(opts.cacheFilePath, signers, passwords);
|
|
64
|
+
opts.logger.debug("Written keystores to keystore cache");
|
|
65
|
+
}
|
|
66
|
+
return signers;
|
|
67
|
+
}
|
|
68
|
+
function lockKeystore(keystorePath, opts) {
|
|
69
|
+
try {
|
|
70
|
+
lockFilepath(keystorePath);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
if (opts.ignoreLockFile) {
|
|
74
|
+
opts.logger.warn("Keystore forcefully loaded even though lockfile exists", {
|
|
75
|
+
path: keystorePath,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
throw e;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function formattedError(errors, signers, keystoreCount) {
|
|
84
|
+
// Filter out errors due to terminating the thread pool
|
|
85
|
+
// https://github.com/ChainSafe/threads.js/blob/df351552cb7d08b8465f5d1e7c543c952d74ac67/src/master/pool.ts#L244
|
|
86
|
+
const decryptErrors = errors.filter(({ error }) => !error.message.startsWith("Pool has been terminated"));
|
|
87
|
+
const errorCount = decryptErrors.length;
|
|
88
|
+
const decryptedCount = signers.filter(Boolean).length;
|
|
89
|
+
const abortedCount = keystoreCount - errorCount - decryptedCount;
|
|
90
|
+
let message = "Error importing keystores";
|
|
91
|
+
if (errorCount === 1) {
|
|
92
|
+
const { keystoreFile, error } = decryptErrors[0];
|
|
93
|
+
message = `Error importing keystore\n\n${keystoreFile}: ${error.message}`;
|
|
94
|
+
}
|
|
95
|
+
else if (errorCount > 1) {
|
|
96
|
+
message =
|
|
97
|
+
"Multiple errors importing keystores\n\n" +
|
|
98
|
+
decryptErrors.map(({ keystoreFile, error }) => `${keystoreFile}: ${error.message}`).join("\n");
|
|
99
|
+
}
|
|
100
|
+
if (abortedCount > 0) {
|
|
101
|
+
message += `\n\nAborted ${abortedCount} pending keystore import${abortedCount > 1 ? "s" : ""}`;
|
|
102
|
+
}
|
|
103
|
+
const error = new Error(message);
|
|
104
|
+
// Don't print out stack trace
|
|
105
|
+
error.stack = message;
|
|
106
|
+
return error;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=decryptKeystoreDefinitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decryptKeystoreDefinitions.js","sourceRoot":"","sources":["../../../../src/cmds/validator/keymanager/decryptKeystoreDefinitions.ts"],"names":[],"mappings":"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"}
|