From 45d6b42a5ae1fd5cae501e161cd84477e5286f35 Mon Sep 17 00:00:00 2001 From: Andrei Smirnov Date: Fri, 3 Jul 2026 17:01:16 +0300 Subject: [PATCH 1/2] cmd: improved split keys behavior --- cmd/createcluster.go | 87 ++++++++++++------- cmd/createcluster_internal_test.go | 52 +++++++++++ .../TestCreateCluster_splitkeys_files.golden | 8 -- .../TestCreateCluster_splitkeys_output.golden | 3 +- ...tkeys_with_cluster_definition_files.golden | 8 -- ...keys_with_cluster_definition_output.golden | 3 +- 6 files changed, 112 insertions(+), 49 deletions(-) diff --git a/cmd/createcluster.go b/cmd/createcluster.go index fbe0e81cc9..a0d9d73150 100644 --- a/cmd/createcluster.go +++ b/cmd/createcluster.go @@ -198,7 +198,14 @@ func runCreateCluster(ctx context.Context, w io.Writer, conf clusterConfig) erro // If SplitKeys wasn't set, we wouldn't have reached this part of code because validateCreateConfig() // would've already errored. if conf.SplitKeys { - useSequencedKeys := len(conf.WithdrawalAddrs) > 1 + // Load keys in strict file index order when per-validator addresses may differ, + // so that keystore-N.json is paired with the Nth withdrawal and fee recipient address. + useSequencedKeys := len(conf.WithdrawalAddrs) > 1 || len(conf.FeeRecipientAddrs) > 1 + if conf.DefFile != "" { + // A definition file replicates a single provided address for each validator, + // so only distinct addresses require strict key file ordering. + useSequencedKeys = hasDistinctAddrs(def.WithdrawalAddresses()) || hasDistinctAddrs(def.FeeRecipientAddresses()) + } secrets, err = getKeys(conf.SplitKeysDir, useSequencedKeys) if err != nil { @@ -297,14 +304,18 @@ func runCreateCluster(ctx context.Context, w io.Writer, conf clusterConfig) erro return err } - depositDatas, err := createDepositDatas(def.WithdrawalAddresses(), network, secrets, depositAmounts, def.Compounding) - if err != nil { - return err - } + // Deposit data is not re-created when splitting existing keys, as the validators are already deposited. + var depositDatas [][]eth2p0.DepositData + if !conf.SplitKeys { + depositDatas, err = createDepositDatas(def.WithdrawalAddresses(), network, secrets, depositAmounts, def.Compounding) + if err != nil { + return err + } - // Write deposit-data files - if err = deposit.WriteClusterDepositDataFiles(depositDatas, network, conf.ClusterDir, numNodes); err != nil { - return err + // Write deposit-data files + if err = deposit.WriteClusterDepositDataFiles(depositDatas, network, conf.ClusterDir, numNodes); err != nil { + return err + } } valRegs, err := createValidatorRegistrations(ctx, def.FeeRecipientAddresses(), secrets, def.ForkVersion, conf.SplitKeys, conf.TargetGasLimit) @@ -421,10 +432,12 @@ func validateCreateConfig(ctx context.Context, conf clusterConfig) error { if conf.NumDVs != 0 { return errors.New("--num-validators not supported with --split-existing-keys, fix configuration flags") } - } else { - if conf.NumDVs == 0 && conf.DefFile == "" { // if there's a definition file, infer this value from it later - return errors.New("missing --num-validators flag") + + if len(conf.DepositAmounts) > 0 { + return errors.New("--deposit-amounts not supported with --split-existing-keys as deposit data is not re-created, fix configuration flags") } + } else if conf.NumDVs == 0 && conf.DefFile == "" { // if there's a definition file, infer this value from it later + return errors.New("missing --num-validators flag") } // Don't allow cluster size to be less than 3. @@ -615,7 +628,7 @@ func writeWarning(w io.Writer) { _, _ = sb.WriteString("\n") _, _ = sb.WriteString("***************** WARNING: Splitting keys **********************\n") _, _ = sb.WriteString(" Please make sure any existing validator has been shut down for\n") - _, _ = sb.WriteString(" at least 2 finalised epochs before starting the charon cluster,\n") + _, _ = sb.WriteString(" at least 2 finalized epochs before starting the charon cluster,\n") _, _ = sb.WriteString(" otherwise slashing could occur. \n") _, _ = sb.WriteString("****************************************************************\n") _, _ = sb.WriteString("\n") @@ -744,6 +757,24 @@ func getValidators( pubshares = append(pubshares, pubk[:]) } + var partialDepositData []cluster.DepositData + + if len(depositDatasMap) > 0 { + depositDatasList, ok := depositDatasMap[dv] + if !ok { + return nil, errors.New("deposit data not found for dv", z.Str("dv", hex.EncodeToString(dv[:]))) + } + + for _, dd := range depositDatasList { + partialDepositData = append(partialDepositData, cluster.DepositData{ + PubKey: dd.PublicKey[:], + WithdrawalCredentials: dd.WithdrawalCredentials, + Amount: int(dd.Amount), + Signature: dd.Signature[:], + }) + } + } + regIdx := -1 for i, reg := range valRegs { @@ -770,22 +801,6 @@ func getValidators( return nil, errors.Wrap(err, "builder registration to cluster object") } - var partialDepositData []cluster.DepositData - - depositDatasList, ok := depositDatasMap[dv] - if !ok { - return nil, errors.New("deposit data not found for dv", z.Str("dv", hex.EncodeToString(dv[:]))) - } - - for _, dd := range depositDatasList { - partialDepositData = append(partialDepositData, cluster.DepositData{ - PubKey: dd.PublicKey[:], - WithdrawalCredentials: dd.WithdrawalCredentials, - Amount: int(dd.Amount), - Signature: dd.Signature[:], - }) - } - vals = append(vals, cluster.DistValidator{ PubKey: dv[:], PubShares: pubshares, @@ -974,7 +989,10 @@ func writeOutput(out io.Writer, splitKeys bool, clusterDir string, numNodes int, _, _ = sb.WriteString("│ ├─ charon-enr-private-key\tCharon networking private key for node authentication\n") _, _ = sb.WriteString("│ ├─ cluster-lock.json\t\tCluster lock defines the cluster lock file which is signed by all nodes\n") - _, _ = sb.WriteString("│ ├─ deposit-data-*.json\tDeposit data files are used to activate a Distributed Validator on the DV Launchpad\n") + if !splitKeys { + _, _ = sb.WriteString("│ ├─ deposit-data-*.json\tDeposit data files are used to activate a Distributed Validator on the DV Launchpad\n") + } + if keysToDisk { _, _ = sb.WriteString("│ ├─ validator_keys\t\tValidator keystores and password\n") _, _ = sb.WriteString("│ │ ├─ keystore-*.json\tValidator private share key for duty signing\n") @@ -1172,6 +1190,17 @@ func writeLockToAPI(ctx context.Context, publishAddr string, lock cluster.Lock) return cl.LaunchpadURLForLock(lock), nil } +// hasDistinctAddrs returns true if addrs contains more than one distinct address (ignoring case). +func hasDistinctAddrs(addrs []string) bool { + for _, addr := range addrs { + if !strings.EqualFold(addr, addrs[0]) { + return true + } + } + + return false +} + // validateAddresses checks if we have sufficient addresses. It also fills addresses slices if only one is provided. // //nolint:revive // Not really confusing here as they are passed as arguments as well. diff --git a/cmd/createcluster_internal_test.go b/cmd/createcluster_internal_test.go index fa55b5192d..324fd9ea4e 100644 --- a/cmd/createcluster_internal_test.go +++ b/cmd/createcluster_internal_test.go @@ -194,6 +194,17 @@ func TestCreateCluster(t *testing.T) { }, expectedErr: "--num-validators not supported with --split-existing-keys, fix configuration flags", }, + { + Name: "splitkeys with deposit amounts set", + Config: clusterConfig{ + NumNodes: 4, + Threshold: 3, + SplitKeys: true, + DepositAmounts: []int{16, 16}, + Network: defaultNetwork, + }, + expectedErr: "--deposit-amounts not supported with --split-existing-keys as deposit data is not re-created, fix configuration flags", + }, { Name: "goerli", Config: clusterConfig{ @@ -388,6 +399,13 @@ func testCreateCluster(t *testing.T, conf clusterConfig, def cluster.Definition, for _, val := range lock.Validators { vals[val.PublicKeyHex()] = struct{}{} + + if conf.SplitKeys { + // Deposit data is not re-created when splitting existing keys. + require.Empty(t, val.PartialDepositData) + continue + } + require.Len(t, val.PartialDepositData, len(amounts)) for i, pdd := range val.PartialDepositData { @@ -554,6 +572,7 @@ func TestSplitKeys(t *testing.T) { name string numSplitKeys int conf clusterConfig + expectKeyOrder bool expectedErrMsg string }{ { @@ -578,6 +597,19 @@ func TestSplitKeys(t *testing.T) { ClusterDir: t.TempDir(), }, }, + { + name: "split keys with distinct fee recipient addresses", + numSplitKeys: 3, + conf: clusterConfig{ + Name: "test split keys", + NumNodes: minNodes, + Threshold: 3, + FeeRecipientAddrs: []string{testutil.RandomETHAddress(), testutil.RandomETHAddress(), testutil.RandomETHAddress()}, + WithdrawalAddrs: []string{zeroAddress}, + ClusterDir: t.TempDir(), + }, + expectKeyOrder: true, + }, } for _, test := range tests { @@ -620,6 +652,26 @@ func TestSplitKeys(t *testing.T) { require.NoError(t, lock.VerifySignatures(nil)) require.Equal(t, test.numSplitKeys, lock.NumValidators) + + for _, val := range lock.Validators { + // Deposit data is not re-created when splitting existing keys. + // Lock versions v1.7 and earlier serialize the absent deposit data as a single zero value. + for _, pdd := range val.PartialDepositData { + require.Empty(t, pdd.PubKey) + require.Empty(t, pdd.Signature) + require.Zero(t, pdd.Amount) + } + } + + if test.expectKeyOrder { + // With per-validator addresses, keystore-N.json must map to the Nth validator + // so that fee recipient and withdrawal addresses are paired correctly. + for i, key := range keys { + pubkey, err := tbls.SecretToPublicKey(key) + require.NoError(t, err) + require.Equal(t, "0x"+hex.EncodeToString(pubkey[:]), lock.Validators[i].PublicKeyHex()) + } + } } }) } diff --git a/cmd/testdata/TestCreateCluster_splitkeys_files.golden b/cmd/testdata/TestCreateCluster_splitkeys_files.golden index 9dc10f1038..dfa3564899 100644 --- a/cmd/testdata/TestCreateCluster_splitkeys_files.golden +++ b/cmd/testdata/TestCreateCluster_splitkeys_files.golden @@ -5,22 +5,14 @@ "node3", "node0/charon-enr-private-key", "node0/cluster-lock.json", - "node0/deposit-data-1eth.json", - "node0/deposit-data.json", "node0/validator_keys", "node1/charon-enr-private-key", "node1/cluster-lock.json", - "node1/deposit-data-1eth.json", - "node1/deposit-data.json", "node1/validator_keys", "node2/charon-enr-private-key", "node2/cluster-lock.json", - "node2/deposit-data-1eth.json", - "node2/deposit-data.json", "node2/validator_keys", "node3/charon-enr-private-key", "node3/cluster-lock.json", - "node3/deposit-data-1eth.json", - "node3/deposit-data.json", "node3/validator_keys" ] \ No newline at end of file diff --git a/cmd/testdata/TestCreateCluster_splitkeys_output.golden b/cmd/testdata/TestCreateCluster_splitkeys_output.golden index ba3613c720..713b7a2f7d 100644 --- a/cmd/testdata/TestCreateCluster_splitkeys_output.golden +++ b/cmd/testdata/TestCreateCluster_splitkeys_output.golden @@ -1,7 +1,7 @@ ***************** WARNING: Splitting keys ********************** Please make sure any existing validator has been shut down for - at least 2 finalised epochs before starting the charon cluster, + at least 2 finalized epochs before starting the charon cluster, otherwise slashing could occur. **************************************************************** @@ -12,7 +12,6 @@ charon/ ├─ node[0-3]/ Directory for each node │ ├─ charon-enr-private-key Charon networking private key for node authentication │ ├─ cluster-lock.json Cluster lock defines the cluster lock file which is signed by all nodes -│ ├─ deposit-data-*.json Deposit data files are used to activate a Distributed Validator on the DV Launchpad │ ├─ validator_keys Validator keystores and password │ │ ├─ keystore-*.json Validator private share key for duty signing │ │ ├─ keystore-*.txt Keystore password files for keystore-*.json diff --git a/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_files.golden b/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_files.golden index 9dc10f1038..dfa3564899 100644 --- a/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_files.golden +++ b/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_files.golden @@ -5,22 +5,14 @@ "node3", "node0/charon-enr-private-key", "node0/cluster-lock.json", - "node0/deposit-data-1eth.json", - "node0/deposit-data.json", "node0/validator_keys", "node1/charon-enr-private-key", "node1/cluster-lock.json", - "node1/deposit-data-1eth.json", - "node1/deposit-data.json", "node1/validator_keys", "node2/charon-enr-private-key", "node2/cluster-lock.json", - "node2/deposit-data-1eth.json", - "node2/deposit-data.json", "node2/validator_keys", "node3/charon-enr-private-key", "node3/cluster-lock.json", - "node3/deposit-data-1eth.json", - "node3/deposit-data.json", "node3/validator_keys" ] \ No newline at end of file diff --git a/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_output.golden b/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_output.golden index ba3613c720..713b7a2f7d 100644 --- a/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_output.golden +++ b/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_output.golden @@ -1,7 +1,7 @@ ***************** WARNING: Splitting keys ********************** Please make sure any existing validator has been shut down for - at least 2 finalised epochs before starting the charon cluster, + at least 2 finalized epochs before starting the charon cluster, otherwise slashing could occur. **************************************************************** @@ -12,7 +12,6 @@ charon/ ├─ node[0-3]/ Directory for each node │ ├─ charon-enr-private-key Charon networking private key for node authentication │ ├─ cluster-lock.json Cluster lock defines the cluster lock file which is signed by all nodes -│ ├─ deposit-data-*.json Deposit data files are used to activate a Distributed Validator on the DV Launchpad │ ├─ validator_keys Validator keystores and password │ │ ├─ keystore-*.json Validator private share key for duty signing │ │ ├─ keystore-*.txt Keystore password files for keystore-*.json From d6cdc51b7f40f30030530006ff7bfac294a4ac4b Mon Sep 17 00:00:00 2001 From: Andrei Smirnov Date: Fri, 3 Jul 2026 21:50:53 +0300 Subject: [PATCH 2/2] cmd: keep deposit data creation in split keys mode Restore deposit data creation when splitting existing keys and instead document the behavior in the --split-existing-keys flag help: deposit data files are re-created using the provided withdrawal addresses and must not be submitted for validators that are already active. Co-Authored-By: Claude Fable 5 --- cmd/createcluster.go | 63 ++++++++----------- cmd/createcluster_internal_test.go | 28 --------- .../TestCreateCluster_splitkeys_files.golden | 8 +++ .../TestCreateCluster_splitkeys_output.golden | 1 + ...tkeys_with_cluster_definition_files.golden | 8 +++ ...keys_with_cluster_definition_output.golden | 1 + 6 files changed, 43 insertions(+), 66 deletions(-) diff --git a/cmd/createcluster.go b/cmd/createcluster.go index a0d9d73150..dd44993ff6 100644 --- a/cmd/createcluster.go +++ b/cmd/createcluster.go @@ -144,7 +144,7 @@ func bindClusterFlags(flags *pflag.FlagSet, config *clusterConfig) { flags.StringSliceVar(&config.FeeRecipientAddrs, "fee-recipient-addresses", nil, "Comma separated list of Ethereum addresses of the fee recipient for each validator. Either provide a single fee recipient address or fee recipient addresses for each validator.") flags.StringSliceVar(&config.WithdrawalAddrs, "withdrawal-addresses", nil, "Comma separated list of Ethereum addresses to receive the returned stake and accrued rewards for each validator. Either provide a single withdrawal address or withdrawal addresses for each validator.") flags.IntVar(&config.NumDVs, "num-validators", 0, "The number of distributed validators needed in the cluster.") - flags.BoolVar(&config.SplitKeys, "split-existing-keys", false, "Split an existing validator's private key into a set of distributed validator private key shares. Does not re-create deposit data for this key.") + flags.BoolVar(&config.SplitKeys, "split-existing-keys", false, "Split an existing validator's private key into a set of distributed validator private key shares. Deposit data files are re-created using the provided withdrawal addresses; do not submit deposits for validators that are already active.") flags.StringVar(&config.SplitKeysDir, "split-keys-dir", "", "Directory containing keys to split. Expects keys in keystore-*.json and passwords in keystore-*.txt. Requires --split-existing-keys.") flags.StringVar(&config.PublishAddr, "publish-address", "https://api.obol.tech/v1", "The URL to publish the lock file to.") flags.BoolVar(&config.Publish, "publish", false, "Publish lock file to obol-api.") @@ -304,18 +304,14 @@ func runCreateCluster(ctx context.Context, w io.Writer, conf clusterConfig) erro return err } - // Deposit data is not re-created when splitting existing keys, as the validators are already deposited. - var depositDatas [][]eth2p0.DepositData - if !conf.SplitKeys { - depositDatas, err = createDepositDatas(def.WithdrawalAddresses(), network, secrets, depositAmounts, def.Compounding) - if err != nil { - return err - } + depositDatas, err := createDepositDatas(def.WithdrawalAddresses(), network, secrets, depositAmounts, def.Compounding) + if err != nil { + return err + } - // Write deposit-data files - if err = deposit.WriteClusterDepositDataFiles(depositDatas, network, conf.ClusterDir, numNodes); err != nil { - return err - } + // Write deposit-data files + if err = deposit.WriteClusterDepositDataFiles(depositDatas, network, conf.ClusterDir, numNodes); err != nil { + return err } valRegs, err := createValidatorRegistrations(ctx, def.FeeRecipientAddresses(), secrets, def.ForkVersion, conf.SplitKeys, conf.TargetGasLimit) @@ -432,10 +428,6 @@ func validateCreateConfig(ctx context.Context, conf clusterConfig) error { if conf.NumDVs != 0 { return errors.New("--num-validators not supported with --split-existing-keys, fix configuration flags") } - - if len(conf.DepositAmounts) > 0 { - return errors.New("--deposit-amounts not supported with --split-existing-keys as deposit data is not re-created, fix configuration flags") - } } else if conf.NumDVs == 0 && conf.DefFile == "" { // if there's a definition file, infer this value from it later return errors.New("missing --num-validators flag") } @@ -757,24 +749,6 @@ func getValidators( pubshares = append(pubshares, pubk[:]) } - var partialDepositData []cluster.DepositData - - if len(depositDatasMap) > 0 { - depositDatasList, ok := depositDatasMap[dv] - if !ok { - return nil, errors.New("deposit data not found for dv", z.Str("dv", hex.EncodeToString(dv[:]))) - } - - for _, dd := range depositDatasList { - partialDepositData = append(partialDepositData, cluster.DepositData{ - PubKey: dd.PublicKey[:], - WithdrawalCredentials: dd.WithdrawalCredentials, - Amount: int(dd.Amount), - Signature: dd.Signature[:], - }) - } - } - regIdx := -1 for i, reg := range valRegs { @@ -801,6 +775,22 @@ func getValidators( return nil, errors.Wrap(err, "builder registration to cluster object") } + var partialDepositData []cluster.DepositData + + depositDatasList, ok := depositDatasMap[dv] + if !ok { + return nil, errors.New("deposit data not found for dv", z.Str("dv", hex.EncodeToString(dv[:]))) + } + + for _, dd := range depositDatasList { + partialDepositData = append(partialDepositData, cluster.DepositData{ + PubKey: dd.PublicKey[:], + WithdrawalCredentials: dd.WithdrawalCredentials, + Amount: int(dd.Amount), + Signature: dd.Signature[:], + }) + } + vals = append(vals, cluster.DistValidator{ PubKey: dv[:], PubShares: pubshares, @@ -989,10 +979,7 @@ func writeOutput(out io.Writer, splitKeys bool, clusterDir string, numNodes int, _, _ = sb.WriteString("│ ├─ charon-enr-private-key\tCharon networking private key for node authentication\n") _, _ = sb.WriteString("│ ├─ cluster-lock.json\t\tCluster lock defines the cluster lock file which is signed by all nodes\n") - if !splitKeys { - _, _ = sb.WriteString("│ ├─ deposit-data-*.json\tDeposit data files are used to activate a Distributed Validator on the DV Launchpad\n") - } - + _, _ = sb.WriteString("│ ├─ deposit-data-*.json\tDeposit data files are used to activate a Distributed Validator on the DV Launchpad\n") if keysToDisk { _, _ = sb.WriteString("│ ├─ validator_keys\t\tValidator keystores and password\n") _, _ = sb.WriteString("│ │ ├─ keystore-*.json\tValidator private share key for duty signing\n") diff --git a/cmd/createcluster_internal_test.go b/cmd/createcluster_internal_test.go index 324fd9ea4e..b76f49b32f 100644 --- a/cmd/createcluster_internal_test.go +++ b/cmd/createcluster_internal_test.go @@ -194,17 +194,6 @@ func TestCreateCluster(t *testing.T) { }, expectedErr: "--num-validators not supported with --split-existing-keys, fix configuration flags", }, - { - Name: "splitkeys with deposit amounts set", - Config: clusterConfig{ - NumNodes: 4, - Threshold: 3, - SplitKeys: true, - DepositAmounts: []int{16, 16}, - Network: defaultNetwork, - }, - expectedErr: "--deposit-amounts not supported with --split-existing-keys as deposit data is not re-created, fix configuration flags", - }, { Name: "goerli", Config: clusterConfig{ @@ -399,13 +388,6 @@ func testCreateCluster(t *testing.T, conf clusterConfig, def cluster.Definition, for _, val := range lock.Validators { vals[val.PublicKeyHex()] = struct{}{} - - if conf.SplitKeys { - // Deposit data is not re-created when splitting existing keys. - require.Empty(t, val.PartialDepositData) - continue - } - require.Len(t, val.PartialDepositData, len(amounts)) for i, pdd := range val.PartialDepositData { @@ -653,16 +635,6 @@ func TestSplitKeys(t *testing.T) { require.Equal(t, test.numSplitKeys, lock.NumValidators) - for _, val := range lock.Validators { - // Deposit data is not re-created when splitting existing keys. - // Lock versions v1.7 and earlier serialize the absent deposit data as a single zero value. - for _, pdd := range val.PartialDepositData { - require.Empty(t, pdd.PubKey) - require.Empty(t, pdd.Signature) - require.Zero(t, pdd.Amount) - } - } - if test.expectKeyOrder { // With per-validator addresses, keystore-N.json must map to the Nth validator // so that fee recipient and withdrawal addresses are paired correctly. diff --git a/cmd/testdata/TestCreateCluster_splitkeys_files.golden b/cmd/testdata/TestCreateCluster_splitkeys_files.golden index dfa3564899..9dc10f1038 100644 --- a/cmd/testdata/TestCreateCluster_splitkeys_files.golden +++ b/cmd/testdata/TestCreateCluster_splitkeys_files.golden @@ -5,14 +5,22 @@ "node3", "node0/charon-enr-private-key", "node0/cluster-lock.json", + "node0/deposit-data-1eth.json", + "node0/deposit-data.json", "node0/validator_keys", "node1/charon-enr-private-key", "node1/cluster-lock.json", + "node1/deposit-data-1eth.json", + "node1/deposit-data.json", "node1/validator_keys", "node2/charon-enr-private-key", "node2/cluster-lock.json", + "node2/deposit-data-1eth.json", + "node2/deposit-data.json", "node2/validator_keys", "node3/charon-enr-private-key", "node3/cluster-lock.json", + "node3/deposit-data-1eth.json", + "node3/deposit-data.json", "node3/validator_keys" ] \ No newline at end of file diff --git a/cmd/testdata/TestCreateCluster_splitkeys_output.golden b/cmd/testdata/TestCreateCluster_splitkeys_output.golden index 713b7a2f7d..8e51f80a04 100644 --- a/cmd/testdata/TestCreateCluster_splitkeys_output.golden +++ b/cmd/testdata/TestCreateCluster_splitkeys_output.golden @@ -12,6 +12,7 @@ charon/ ├─ node[0-3]/ Directory for each node │ ├─ charon-enr-private-key Charon networking private key for node authentication │ ├─ cluster-lock.json Cluster lock defines the cluster lock file which is signed by all nodes +│ ├─ deposit-data-*.json Deposit data files are used to activate a Distributed Validator on the DV Launchpad │ ├─ validator_keys Validator keystores and password │ │ ├─ keystore-*.json Validator private share key for duty signing │ │ ├─ keystore-*.txt Keystore password files for keystore-*.json diff --git a/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_files.golden b/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_files.golden index dfa3564899..9dc10f1038 100644 --- a/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_files.golden +++ b/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_files.golden @@ -5,14 +5,22 @@ "node3", "node0/charon-enr-private-key", "node0/cluster-lock.json", + "node0/deposit-data-1eth.json", + "node0/deposit-data.json", "node0/validator_keys", "node1/charon-enr-private-key", "node1/cluster-lock.json", + "node1/deposit-data-1eth.json", + "node1/deposit-data.json", "node1/validator_keys", "node2/charon-enr-private-key", "node2/cluster-lock.json", + "node2/deposit-data-1eth.json", + "node2/deposit-data.json", "node2/validator_keys", "node3/charon-enr-private-key", "node3/cluster-lock.json", + "node3/deposit-data-1eth.json", + "node3/deposit-data.json", "node3/validator_keys" ] \ No newline at end of file diff --git a/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_output.golden b/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_output.golden index 713b7a2f7d..8e51f80a04 100644 --- a/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_output.golden +++ b/cmd/testdata/TestCreateCluster_splitkeys_with_cluster_definition_output.golden @@ -12,6 +12,7 @@ charon/ ├─ node[0-3]/ Directory for each node │ ├─ charon-enr-private-key Charon networking private key for node authentication │ ├─ cluster-lock.json Cluster lock defines the cluster lock file which is signed by all nodes +│ ├─ deposit-data-*.json Deposit data files are used to activate a Distributed Validator on the DV Launchpad │ ├─ validator_keys Validator keystores and password │ │ ├─ keystore-*.json Validator private share key for duty signing │ │ ├─ keystore-*.txt Keystore password files for keystore-*.json