Skip to content

Commit b044fcc

Browse files
feat: Add adminKey flag to node setup command (#1193)
Signed-off-by: Ivo Yankov <[email protected]> Signed-off-by: Jeromy Cannon <[email protected]> Co-authored-by: Jeromy Cannon <[email protected]>
1 parent 0c4fec2 commit b044fcc

File tree

6 files changed

+49
-5
lines changed

6 files changed

+49
-5
lines changed

src/commands/flags.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,6 +1338,17 @@ export class Flags {
13381338
prompt: undefined,
13391339
};
13401340

1341+
static readonly adminPublicKeys: CommandFlag = {
1342+
constName: 'adminPublicKeys',
1343+
name: 'admin-public-keys',
1344+
definition: {
1345+
describe: 'Comma separated list of DER encoded ED25519 public keys and must match the order of the node aliases',
1346+
defaultValue: constants.GENESIS_KEY,
1347+
type: 'string',
1348+
},
1349+
prompt: undefined,
1350+
};
1351+
13411352
static readonly quiet: CommandFlag = {
13421353
constName: 'quiet',
13431354
name: 'quiet-mode',
@@ -1718,6 +1729,8 @@ export class Flags {
17181729

17191730
static readonly allFlags: CommandFlag[] = [
17201731
Flags.accountId,
1732+
Flags.adminKey,
1733+
Flags.adminPublicKeys,
17211734
Flags.amount,
17221735
Flags.apiPermissionProperties,
17231736
Flags.app,

src/commands/node/configs.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,7 @@ export interface NodeDeleteConfigClass {
424424
export interface NodeSetupConfigClass {
425425
app: string;
426426
appConfig: string;
427+
adminKey: string;
427428
cacheDir: string;
428429
devMode: boolean;
429430
localBuildPath: string;

src/commands/node/flags.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,5 +254,5 @@ export const START_FLAGS = {
254254
export const SETUP_FLAGS = {
255255
requiredFlags: [flags.cacheDir, flags.namespace, flags.releaseTag],
256256
requiredFlagsWithDisabledPrompt: [flags.app, flags.appConfig, flags.nodeAliasesUnparsed],
257-
optionalFlags: [flags.quiet, flags.devMode, flags.localBuildPath],
257+
optionalFlags: [flags.quiet, flags.devMode, flags.localBuildPath, flags.adminPublicKeys],
258258
};

src/commands/node/tasks.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,11 +958,13 @@ export class NodeCommandTasks {
958958
) {
959959
const networkNodeServiceMap = await this.accountManager.getNodeServiceMap(namespace);
960960

961+
const adminPublicKeys = splitFlagInput(this.configManager.getFlag(flags.adminPublicKeys));
961962
const genesisNetworkData = await GenesisNetworkDataConstructor.initialize(
962963
nodeAliases,
963964
this.keyManager,
964965
keysDir,
965966
networkNodeServiceMap,
967+
adminPublicKeys,
966968
);
967969

968970
const genesisNetworkJson = path.join(stagingDir, 'genesis-network.json');

src/core/genesis_network_models/genesis_network_data_constructor.ts

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*
1616
*/
17-
import {AccountId, PrivateKey} from '@hashgraph/sdk';
17+
import {AccountId, PrivateKey, PublicKey} from '@hashgraph/sdk';
1818
import {GenesisNetworkNodeDataWrapper} from './genesis_network_node_data_wrapper.js';
1919
import * as constants from '../constants.js';
2020

@@ -25,6 +25,8 @@ import {GenesisNetworkRosterEntryDataWrapper} from './genesis_network_roster_ent
2525
import {Templates} from '../templates.js';
2626
import path from 'path';
2727
import type {NetworkNodeServices} from '../network_node_services.js';
28+
import {SoloError} from '../errors.js';
29+
import {Flags as flags} from '../../commands/flags.js';
2830

2931
/**
3032
* Used to construct the nodes data and convert them to JSON
@@ -38,10 +40,13 @@ export class GenesisNetworkDataConstructor implements ToJSON {
3840
private readonly keyManager: KeyManager,
3941
private readonly keysDir: string,
4042
private readonly networkNodeServiceMap: Map<string, NetworkNodeServices>,
43+
adminPublicKeyMap: Map<NodeAlias, string>,
4144
) {
4245
nodeAliases.forEach(nodeAlias => {
43-
const adminPrivateKey = PrivateKey.fromStringED25519(constants.GENESIS_KEY);
44-
const adminPubKey = adminPrivateKey.publicKey;
46+
const genesisPrivateKey = PrivateKey.fromStringED25519(constants.GENESIS_KEY);
47+
const adminPubKey = PublicKey.fromStringED25519(adminPublicKeyMap[nodeAlias])
48+
? adminPublicKeyMap[nodeAlias]
49+
: genesisPrivateKey.publicKey;
4550

4651
const nodeDataWrapper = new GenesisNetworkNodeDataWrapper(
4752
+networkNodeServiceMap.get(nodeAlias).nodeId,
@@ -74,8 +79,30 @@ export class GenesisNetworkDataConstructor implements ToJSON {
7479
keyManager: KeyManager,
7580
keysDir: string,
7681
networkNodeServiceMap: Map<string, NetworkNodeServices>,
82+
adminPublicKeys: string[],
7783
): Promise<GenesisNetworkDataConstructor> {
78-
const instance = new GenesisNetworkDataConstructor(nodeAliases, keyManager, keysDir, networkNodeServiceMap);
84+
const adminPublicKeyMap: Map<NodeAlias, string> = new Map();
85+
86+
const adminPublicKeyIsDefaultValue =
87+
adminPublicKeys.length === 1 && adminPublicKeys[0] === flags.adminPublicKeys.definition.defaultValue;
88+
// If admin keys are passed and if it is not the default value from flags then validate and build the adminPublicKeyMap
89+
if (adminPublicKeys.length > 0 && !adminPublicKeyIsDefaultValue) {
90+
if (adminPublicKeys.length !== nodeAliases.length) {
91+
throw new SoloError('Provide a comma separated list of DER encoded ED25519 public keys for each node');
92+
}
93+
94+
adminPublicKeys.forEach((key, i) => {
95+
adminPublicKeyMap[nodeAliases[i]] = key;
96+
});
97+
}
98+
99+
const instance = new GenesisNetworkDataConstructor(
100+
nodeAliases,
101+
keyManager,
102+
keysDir,
103+
networkNodeServiceMap,
104+
adminPublicKeyMap,
105+
);
79106

80107
await instance.load();
81108

test/test_util.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ export function e2eTestSuite(
304304
expect(nodeCmd.getUnusedConfigs(NodeCommandConfigs.SETUP_CONFIGS_NAME)).to.deep.equal([
305305
flags.quiet.constName,
306306
flags.devMode.constName,
307+
flags.adminPublicKeys.constName,
307308
]);
308309
} catch (e) {
309310
nodeCmd.logger.showUserError(e);

0 commit comments

Comments
 (0)