From 8a189756c506642dc1c7d9de570318c0d48591ef Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 00:03:43 +0530 Subject: [PATCH 01/13] save deposit data in charon create cluster --- cmd/createcluster.go | 75 ++++++++++++++++++- .../TestCreateCluster_simnet_files.golden | 1 + .../TestCreateCluster_simnet_output.golden | 1 + .../TestCreateCluster_splitkeys_files.golden | 1 + .../TestCreateCluster_splitkeys_output.golden | 1 + eth2util/deposit/deposit.go | 21 ++++++ tbls/tss.go | 2 +- 7 files changed, 97 insertions(+), 5 deletions(-) diff --git a/cmd/createcluster.go b/cmd/createcluster.go index 3be2cd911..d8a14fc1a 100644 --- a/cmd/createcluster.go +++ b/cmd/createcluster.go @@ -34,6 +34,7 @@ import ( "github.com/obolnetwork/charon/app" "github.com/obolnetwork/charon/app/errors" + "github.com/obolnetwork/charon/eth2util/deposit" "github.com/obolnetwork/charon/eth2util/keystore" "github.com/obolnetwork/charon/p2p" "github.com/obolnetwork/charon/tbls" @@ -84,6 +85,7 @@ type clusterConfig struct { ClusterDir string Clean bool NumNodes int + NumDVs int Threshold int SplitKeys bool @@ -135,6 +137,7 @@ func runCreateCluster(w io.Writer, conf clusterConfig) error { return errors.Wrap(err, "remove cluster dir") } } else if _, err := os.Stat(path.Join(conf.ClusterDir, "manifest.json")); err == nil { + // TODO(xenowits): replace "manifest.json" with "cluster_lock.json" return errors.New("existing cluster found. Try again with --clean") } @@ -152,7 +155,7 @@ func runCreateCluster(w io.Writer, conf clusterConfig) error { } } - // Get root bls key + // Get root bls secrets secrets, err := getKeys(conf) if err != nil { return err @@ -191,6 +194,47 @@ func runCreateCluster(w io.Writer, conf clusterConfig) error { } } + // TODO(xenowits): add flag to specify the number of distributed validators in a cluster + // Currently, we assume that we create a cluster of ONLY 1 Distributed Validator + var depositDatas [][]byte + for i := 0; i < conf.NumDVs+1; i++ { // Note that default value of conf.NumDVs is 0 + sk := secrets[i] // Group secret key for this DV + pubkey, err := sk.GetPublicKey() + if err != nil { + return err + } + + pk, err := tblsconv.KeyToETH2(pubkey) // Group pubkey + if err != nil { + return err + } + + withdrawalAddr := "0xc0404ed740a69d11201f5ed297c5732f562c6e4e" + network := "prater" + + msgRoot, err := deposit.GetMessageSigningRoot(pk, withdrawalAddr, network) + if err != nil { + return err + } + + sig, err := tbls.Sign(sk, msgRoot[:]) + if err != nil { + return err + } + + sigEth2 := tblsconv.SigToETH2(sig) + bytes, err := deposit.MarshalDepositData(pk, withdrawalAddr, network, sigEth2) + if err != nil { + return err + } + + depositDatas = append(depositDatas, bytes) + } + + if err := writeDepositData(conf, depositDatas); err != nil { + return err + } + // TODO(corver): Write deposit datas if not simnet if err := writeManifest(conf, dvs, peers); err != nil { @@ -265,13 +309,34 @@ func getKeys(conf clusterConfig) ([]*bls_sig.SecretKey, error) { } // TODO(corver): Add flag to generate more distributed-validators than 1 + var secrets []*bls_sig.SecretKey + for i := 0; i < conf.NumDVs+1; i++ { // Note that default value of conf.NumDVs is 0 + _, secret, err := tbls.KeygenWithSeed(rand.Reader) + if err != nil { + return nil, err + } + + secrets = append(secrets, secret) + } - _, secret, err := tbls.KeygenWithSeed(rand.Reader) + return secrets, nil +} + +// writeDepositData writes deposit data to disk for the DVs in a cluster. +func writeDepositData(config clusterConfig, b [][]byte) error { + depositPath := path.Join(config.ClusterDir, "deposit-data.json") + + bytes, err := deposit.MarshalDepositDatas(b) if err != nil { - return nil, err + return err } - return []*bls_sig.SecretKey{secret}, nil + err = os.WriteFile(depositPath, bytes, 0o400) // read-only + if err != nil { + return errors.Wrap(err, "write deposit data") + } + + return nil } func writeManifest(config clusterConfig, tss []tbls.TSS, peers []p2p.Peer) error { @@ -349,6 +414,8 @@ func writeOutput(out io.Writer, conf clusterConfig) { _, _ = sb.WriteString("\n") _, _ = sb.WriteString(strings.TrimSuffix(conf.ClusterDir, "/") + "/\n") _, _ = sb.WriteString("├─ manifest.json\tCluster manifest defines the cluster; used by all nodes\n") + _, _ = sb.WriteString("├─ deposit-data.json\tDeposit data file used to activate the Distributed Validator\n") + if conf.ConfigEnabled { _, _ = sb.WriteString("├─ run_cluster.sh\tConvenience script to run all nodes\n") _, _ = sb.WriteString("├─ teamocil.yml\t\tTeamocil config for splitting logs in tmux panes\n") diff --git a/cmd/testdata/TestCreateCluster_simnet_files.golden b/cmd/testdata/TestCreateCluster_simnet_files.golden index e87846560..51b1d894d 100644 --- a/cmd/testdata/TestCreateCluster_simnet_files.golden +++ b/cmd/testdata/TestCreateCluster_simnet_files.golden @@ -1,4 +1,5 @@ [ + "deposit-data.json", "manifest.json", "node0", "node1", diff --git a/cmd/testdata/TestCreateCluster_simnet_output.golden b/cmd/testdata/TestCreateCluster_simnet_output.golden index 00f936d3a..19ea89bfb 100644 --- a/cmd/testdata/TestCreateCluster_simnet_output.golden +++ b/cmd/testdata/TestCreateCluster_simnet_output.golden @@ -6,6 +6,7 @@ Created charon cluster: charon/ ├─ manifest.json Cluster manifest defines the cluster; used by all nodes +├─ deposit-data.json Deposit data file used to activate the Distributed Validator ├─ run_cluster.sh Convenience script to run all nodes ├─ teamocil.yml Teamocil config for splitting logs in tmux panes ├─ node[0-3]/ Directory for each node diff --git a/cmd/testdata/TestCreateCluster_splitkeys_files.golden b/cmd/testdata/TestCreateCluster_splitkeys_files.golden index 7ec1f51db..17426e055 100644 --- a/cmd/testdata/TestCreateCluster_splitkeys_files.golden +++ b/cmd/testdata/TestCreateCluster_splitkeys_files.golden @@ -1,4 +1,5 @@ [ + "deposit-data.json", "manifest.json", "node0", "node1", diff --git a/cmd/testdata/TestCreateCluster_splitkeys_output.golden b/cmd/testdata/TestCreateCluster_splitkeys_output.golden index 0d85c9ba1..25a0d8898 100644 --- a/cmd/testdata/TestCreateCluster_splitkeys_output.golden +++ b/cmd/testdata/TestCreateCluster_splitkeys_output.golden @@ -11,6 +11,7 @@ Created charon cluster: charon/ ├─ manifest.json Cluster manifest defines the cluster; used by all nodes +├─ deposit-data.json Deposit data file used to activate the Distributed Validator ├─ node[0-3]/ Directory for each node │ ├─ p2pkey P2P networking private key for node authentication │ ├─ keystore-*.json Validator private share key for duty signing diff --git a/eth2util/deposit/deposit.go b/eth2util/deposit/deposit.go index ff3cfe348..054eb5b23 100644 --- a/eth2util/deposit/deposit.go +++ b/eth2util/deposit/deposit.go @@ -105,6 +105,27 @@ func MarshalDepositData(pubkey eth2p0.BLSPubKey, withdrawalAddr string, network return bytes, nil } +// MarshalDepositDatas serializes a list of deposit data into a single file. +func MarshalDepositDatas(depositDatas [][]byte) ([]byte, error) { + var ddList []depositDataJSON + ddLen := len(depositDatas) + for i := 0; i < ddLen; i++ { + var dd depositDataJSON + err := json.Unmarshal(depositDatas[i], &dd) + if err != nil { + return nil, errors.Wrap(err, "unmarshal deposit data") + } + ddList = append(ddList, dd) + } + + bytes, err := json.MarshalIndent(ddList, "", " ") + if err != nil { + return nil, errors.Wrap(err, "marshal deposit data") + } + + return bytes, nil +} + // getDepositDomain returns the deposit signature domain. func getDepositDomain(forkVersion eth2p0.Version) (eth2p0.Domain, error) { forkData := ð2p0.ForkData{ diff --git a/tbls/tss.go b/tbls/tss.go index 9b053d6ed..6c089528f 100644 --- a/tbls/tss.go +++ b/tbls/tss.go @@ -57,7 +57,7 @@ func KeygenWithSeed(reader io.Reader) (*bls_sig.PublicKey, *bls_sig.SecretKey, e return pubkey, secret, nil } -// TSS (threshold signing scheme) wraps PubKey (PublicKey), Verifiers (the public shares corresponding to each secret share) +// TSS (threshold signing scheme) wraps PubKey (PublicKey), Verifiers (the coefficients of the public polynomial) // and threshold (number of shares). type TSS struct { verifier *share.FeldmanVerifier From 92fa2729dba394c711ccc145e16ba3e5a250f844 Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 14:02:43 +0530 Subject: [PATCH 02/13] fix golangci lint error --- cmd/createcluster.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/createcluster.go b/cmd/createcluster.go index d8a14fc1a..5e7c92496 100644 --- a/cmd/createcluster.go +++ b/cmd/createcluster.go @@ -201,7 +201,7 @@ func runCreateCluster(w io.Writer, conf clusterConfig) error { sk := secrets[i] // Group secret key for this DV pubkey, err := sk.GetPublicKey() if err != nil { - return err + return errors.Wrap(err, "secret to pubkey") } pk, err := tblsconv.KeyToETH2(pubkey) // Group pubkey From 17d857294d6977a1947dbb6ed5ea08ecf77d2fb3 Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 10:33:25 +0530 Subject: [PATCH 03/13] add initial functions to verify input flags --- cmd/createcluster.go | 50 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/cmd/createcluster.go b/cmd/createcluster.go index 5e7c92496..9685587b0 100644 --- a/cmd/createcluster.go +++ b/cmd/createcluster.go @@ -27,6 +27,7 @@ import ( "text/template" "github.com/coinbase/kryptology/pkg/signatures/bls/bls_sig" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enr" "github.com/spf13/cobra" @@ -84,9 +85,12 @@ windows: type clusterConfig struct { ClusterDir string Clean bool - NumNodes int - NumDVs int - Threshold int + + NumNodes int + NumDVs int + Threshold int + WithdrawalAddr string + Network string SplitKeys bool SplitKeysDir string @@ -119,6 +123,8 @@ func bindClusterFlags(flags *pflag.FlagSet, config *clusterConfig) { flags.StringVar(&config.ClusterDir, "cluster-dir", ".charon/cluster", "The target folder to create the cluster in.") flags.IntVarP(&config.NumNodes, "nodes", "n", 4, "The number of charon nodes in the cluster.") flags.IntVarP(&config.Threshold, "threshold", "t", 3, "The threshold required for signature reconstruction. Minimum is n-(ceil(n/3)-1).") + flags.StringVar(&config.WithdrawalAddr, "withdrawal-address", "0000000000000000000000000000000000000000", "Ethereum address to receive the returned stake and accrued rewards.") + flags.StringVar(&config.Network, "network", "prater", "Ethereum network to create validators for (default: mainnet). Options: mainnet, prater, kintsugi, kiln, gnosis.") flags.BoolVar(&config.Clean, "clean", false, "Delete the cluster directory before generating it.") flags.BoolVar(&config.SplitKeys, "split-existing-keys", false, "Enables splitting of existing non-dvt validator keys into distributed threshold private shares (instead of creating new random keys).") @@ -209,10 +215,16 @@ func runCreateCluster(w io.Writer, conf clusterConfig) error { return err } - withdrawalAddr := "0xc0404ed740a69d11201f5ed297c5732f562c6e4e" - network := "prater" + withdrawalAddr, err := validAddr(conf.WithdrawalAddr) + if err != nil { + return err + } - msgRoot, err := deposit.GetMessageSigningRoot(pk, withdrawalAddr, network) + if !validNetwork(conf.Network) { + return errors.New("invalid network") + } + + msgRoot, err := deposit.GetMessageSigningRoot(pk, withdrawalAddr, conf.Network) if err != nil { return err } @@ -223,7 +235,7 @@ func runCreateCluster(w io.Writer, conf clusterConfig) error { } sigEth2 := tblsconv.SigToETH2(sig) - bytes, err := deposit.MarshalDepositData(pk, withdrawalAddr, network, sigEth2) + bytes, err := deposit.MarshalDepositData(pk, withdrawalAddr, conf.Network, sigEth2) if err != nil { return err } @@ -548,3 +560,27 @@ func nextPortFunc(startPort int) func() int { return port } } + +// validAddr returns a valid checksummed ethereum address. Returns an error if a valid address cannot be constructed. +func validAddr(a string) (string, error) { + if !common.IsHexAddress(a) { + return "", errors.New("invalid address") + } + + hexAddr := common.HexToAddress(a) + + return hexAddr.Hex(), nil +} + +// validNetwork returns true if the input network is supported. Returns false otherwise. +func validNetwork(network string) bool { + validNetworks := []string{"prater", "kintsugi", "kiln", "gnosis", "mainnet"} + + for _, n := range validNetworks { + if n == network { + return true + } + } + + return false +} From b1e82018a3946052c38404b39f2bfbbd7663ae5a Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 12:03:14 +0530 Subject: [PATCH 04/13] add tests to verify deposit data --- eth2util/deposit/deposit.go | 6 +- eth2util/deposit/deposit_test.go | 74 ++++++++++++++++---- eth2util/deposit/testdata/deposit-data.json | 11 +++ eth2util/deposit/testdata/deposit-datas.json | 46 ++++++++++++ eth2util/deposit/testdata/deposit_data.json | 10 --- 5 files changed, 124 insertions(+), 23 deletions(-) create mode 100644 eth2util/deposit/testdata/deposit-data.json create mode 100644 eth2util/deposit/testdata/deposit-datas.json delete mode 100644 eth2util/deposit/testdata/deposit_data.json diff --git a/eth2util/deposit/deposit.go b/eth2util/deposit/deposit.go index 054eb5b23..95738aaa5 100644 --- a/eth2util/deposit/deposit.go +++ b/eth2util/deposit/deposit.go @@ -38,6 +38,8 @@ var ( // DOMAIN_DEPOSIT. See spec: https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/#domain-types depositDomainType = eth2p0.DomainType([4]byte{0x03, 0x00, 0x00, 0x00}) + + depositCliVersion = "2.1.0" ) // getMessageRoot returns a deposit message hash root created by the parameters. @@ -97,7 +99,8 @@ func MarshalDepositData(pubkey eth2p0.BLSPubKey, withdrawalAddr string, network DepositDataRoot: fmt.Sprintf("%x", dataRoot), ForkVersion: fmt.Sprintf("%x", forkVersion), NetworkName: network, - }, "", " ") + DepositCliVersion: depositCliVersion, + }, "", " ") // use 2 space tabs if err != nil { return nil, errors.Wrap(err, "marshal deposit data") } @@ -212,4 +215,5 @@ type depositDataJSON struct { DepositDataRoot string `json:"deposit_data_root"` ForkVersion string `json:"fork_version"` NetworkName string `json:"network_name"` + DepositCliVersion string `json:"deposit_cli_version"` } diff --git a/eth2util/deposit/deposit_test.go b/eth2util/deposit/deposit_test.go index 3e31f3079..4e93fe76b 100644 --- a/eth2util/deposit/deposit_test.go +++ b/eth2util/deposit/deposit_test.go @@ -17,6 +17,8 @@ package deposit_test import ( "encoding/hex" + eth2p0 "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/coinbase/kryptology/pkg/signatures/bls/bls_sig" "os" "testing" @@ -29,22 +31,15 @@ import ( const ( // Test output file and it's input values. - testfile = "testdata/deposit_data.json" - privKey = "07e0355752a16fdc473d01676f7f82594991ea830eea928d8e2254dfd98d4beb" withdrawalAddr = "0xc0404ed740a69d11201f5ed297c5732f562c6e4e" network = "prater" ) func TestDepositData(t *testing.T) { - // Get the private and public keys - privKeyBytes, err := hex.DecodeString(privKey) - require.NoError(t, err) - sk, err := tblsconv.SecretFromBytes(privKeyBytes) - require.NoError(t, err) - pk, err := sk.GetPublicKey() - require.NoError(t, err) - pubkey, err := tblsconv.KeyToETH2(pk) - require.NoError(t, err) + file := "testdata/deposit-data.json" + privKey := "07e0355752a16fdc473d01676f7f82594991ea830eea928d8e2254dfd98d4beb" + + sk, pubkey := GetKeys(t, privKey) // Get deposit message signing root msgSigningRoot, err := deposit.GetMessageSigningRoot(pubkey, withdrawalAddr, network) @@ -60,7 +55,62 @@ func TestDepositData(t *testing.T) { require.NoError(t, err) // Not using golden file since output MUST never change. - expected, err := os.ReadFile(testfile) + expected, err := os.ReadFile(file) + require.NoError(t, err) + require.Equal(t, expected, actual) +} + +func TestMarshalDepositDatas(t *testing.T) { + file := "testdata/deposit-datas.json" + privKeys := []string{ + "01477d4bfbbcebe1fef8d4d6f624ecbb6e3178558bb1b0d6286c816c66842a6d", + "5b77c0f0ef7c4ddc123d55b8bd93daeefbd7116764a941c0061a496649e145b5", + "1dabcbfc9258f0f28606bf9e3b1c9f06d15a6e4eb0fbc28a43835eaaed7623fc", + "002ff4fd29d3deb6de9f5d115182a49c618c97acaa365ad66a0b240bd825c4ff", + } + + var depositDatas [][]byte + + for i := 0; i < len(privKeys); i++ { + sk, pk := GetKeys(t, privKeys[i]) + + msgRoot, err := deposit.GetMessageSigningRoot(pk, withdrawalAddr, network) + require.NoError(t, err) + + sig, err := tbls.Sign(sk, msgRoot[:]) + require.NoError(t, err) + + sigEth2 := tblsconv.SigToETH2(sig) + bytes, err := deposit.MarshalDepositData(pk, withdrawalAddr, network, sigEth2) + require.NoError(t, err) + + depositDatas = append(depositDatas, bytes) + } + + actual, err := deposit.MarshalDepositDatas(depositDatas) + require.NoError(t, err) + + // Not using golden file since output MUST never change. + expected, err := os.ReadFile(file) require.NoError(t, err) require.Equal(t, expected, actual) } + +// Get the private and public keys in appropriate format for the test. +func GetKeys(t *testing.T, privKey string) (*bls_sig.SecretKey, eth2p0.BLSPubKey) { + t.Helper() + + privKeyBytes, err := hex.DecodeString(privKey) + require.NoError(t, err) + + sk, err := tblsconv.SecretFromBytes(privKeyBytes) + require.NoError(t, err) + + pk, err := sk.GetPublicKey() + require.NoError(t, err) + + pubkey, err := tblsconv.KeyToETH2(pk) + require.NoError(t, err) + + return sk, pubkey +} diff --git a/eth2util/deposit/testdata/deposit-data.json b/eth2util/deposit/testdata/deposit-data.json new file mode 100644 index 000000000..6ffc4fdeb --- /dev/null +++ b/eth2util/deposit/testdata/deposit-data.json @@ -0,0 +1,11 @@ +{ + "pubkey": "b6a6bb229bd3c845ae1221fe3a0b20c963ac16dd99949e0e979f01f8864af099e56dcd2e37afe21063f382624e57d183", + "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", + "amount": 32000000000, + "signature": "980a8f479f7cc3912d96b5902e956b763cc13d204c3a94ea9df15b0b6d7d470fe276af981688d94846efa4eed0d7b2be11a796d24a84b07a486d927dea4f52862fa57128ee58d3129f14f0c97da98ee7c99aff310b5df5283858361e2ac0286f", + "deposit_message_root": "4f3acee7f79a295cd13aa20e9884f1f9672ab0a1192ee08f483dd485e7c46925", + "deposit_data_root": "664b49b474a6959e992875ec8ece7bc53dbce81ac1e7bf92202a1432806c392c", + "fork_version": "00001020", + "network_name": "prater", + "deposit_cli_version": "2.1.0" +} \ No newline at end of file diff --git a/eth2util/deposit/testdata/deposit-datas.json b/eth2util/deposit/testdata/deposit-datas.json new file mode 100644 index 000000000..35cdd2974 --- /dev/null +++ b/eth2util/deposit/testdata/deposit-datas.json @@ -0,0 +1,46 @@ +[ + { + "pubkey": "813f5d2697f76841a752ef8c1ac11d1bb76e07003799c5745f8a569214653810def3b60920b54fb0ab3cb6deb08c3972", + "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", + "amount": 32000000000, + "signature": "b5f95360b98cb6db3c06998b43b1dce29aea4f085950018d9dbd3c9894941f4804c449c771392ed3dde1091d346d71c316273c7213237dfa6b9ea79fbcfe79b055a5880d309f5db2dcf3e9a0fee6a4c843f3adb5835958b0561996218cd63acf", + "deposit_message_root": "33109737473d6ccb5f3c4f7eccaa4a7cd3dd63de3d9878a978243053904d39bf", + "deposit_data_root": "4d97bfb4ad862d7885586186d0c8c482d1b084e3d478d9b7e55bb4729d058dfc", + "fork_version": "00001020", + "network_name": "prater", + "deposit_cli_version": "2.1.0" + }, + { + "pubkey": "940a838cd88c10daa9c26fcdf8472dfe09657c4aa4030380c6cca5ddb573a8036dfb03e61137c4baacdc9d69061f1eb2", + "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", + "amount": 32000000000, + "signature": "b8e638af308c9e1a1dfac291c7b0218dc3c1dc9baa000dbee0539ed6805cd76afd06fd50797e8192cf917d51c712c31212670e521e0cf326fadbbd8f361fa7a1e0fc80bc77279c71ddd2505835ec3da74a742a5ca19a635c6889915ef3a2dd89", + "deposit_message_root": "8cec1018fcfcb6ae295546901f1c55e2f2643834b89c9a00e4806d8c6b197169", + "deposit_data_root": "0c8b9be09c9e36bef37e9248ce262485d1ee21e005ecf3ff347a820ba0b3c69a", + "fork_version": "00001020", + "network_name": "prater", + "deposit_cli_version": "2.1.0" + }, + { + "pubkey": "80d0436ccacd2b263f5e9e7ebaa14015fe5c80d3e57dc7c37bcbda783895e3491019d3ed694ecbb49c8c80a0480c0392", + "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", + "amount": 32000000000, + "signature": "8e383948b4909a20e16c17883148adf56234c19540995830a1908720cbdf4bed309568fefbb40bec4b7f8b4b3df9e19016afb25d76899ec6e1cc7259abe5de6e7b9b04723014ebef47852925c4dd3ff343caeeeb5b4ed499c9d5be2cda1f8b84", + "deposit_message_root": "4f5f7044a71d625c59974e32e8d86aed0a2211d423675303124ce5ac70969a46", + "deposit_data_root": "892766707bb5d2bb9602d9620f942af9e0c2c915c4340ad22ef935dd999db85b", + "fork_version": "00001020", + "network_name": "prater", + "deposit_cli_version": "2.1.0" + }, + { + "pubkey": "b3d95c8790d63114ab1e813e8943f1bd59683927942df076ad724de8cc00974306c95d6614ef93505b5acd9719a6de78", + "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", + "amount": 32000000000, + "signature": "a4f5fac20a37a109200594ab9ee3bf983aab4aea6202fab637e7e79b9bbae37cef5815c746bdf01a57e659605346a9b80d4efe7e0884de144dcff28d07838a58819f03dd8fc2b48ea14e62222390fe3cb0284010f6acdcb1c4b5eb4c46a02560", + "deposit_message_root": "6b6860824055330be4cb0a378a1ffd342e4de77fef1d51621d44419c4b313ca9", + "deposit_data_root": "a7de8c4c4e26b9751afcc1bc7ecc558c3d40ee3985d62c6ba07dc08c0aa64581", + "fork_version": "00001020", + "network_name": "prater", + "deposit_cli_version": "2.1.0" + } +] \ No newline at end of file diff --git a/eth2util/deposit/testdata/deposit_data.json b/eth2util/deposit/testdata/deposit_data.json deleted file mode 100644 index 7cccaff7d..000000000 --- a/eth2util/deposit/testdata/deposit_data.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "pubkey": "b6a6bb229bd3c845ae1221fe3a0b20c963ac16dd99949e0e979f01f8864af099e56dcd2e37afe21063f382624e57d183", - "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", - "amount": 32000000000, - "signature": "980a8f479f7cc3912d96b5902e956b763cc13d204c3a94ea9df15b0b6d7d470fe276af981688d94846efa4eed0d7b2be11a796d24a84b07a486d927dea4f52862fa57128ee58d3129f14f0c97da98ee7c99aff310b5df5283858361e2ac0286f", - "deposit_message_root": "4f3acee7f79a295cd13aa20e9884f1f9672ab0a1192ee08f483dd485e7c46925", - "deposit_data_root": "664b49b474a6959e992875ec8ece7bc53dbce81ac1e7bf92202a1432806c392c", - "fork_version": "00001020", - "network_name": "prater" -} \ No newline at end of file From 76aea624472a85c0694256aa607f49843d5e0a83 Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 14:50:56 +0530 Subject: [PATCH 05/13] add tests and refactor to include more conditions --- cmd/createcluster.go | 25 +++++++++++++++++-------- cmd/createcluster_internal_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/cmd/createcluster.go b/cmd/createcluster.go index 9685587b0..9753e1e07 100644 --- a/cmd/createcluster.go +++ b/cmd/createcluster.go @@ -19,6 +19,7 @@ import ( "crypto/rand" "encoding/json" "fmt" + "github.com/obolnetwork/charon/app/z" "io" "net" "os" @@ -82,6 +83,8 @@ windows: {{end}} ` +const defaultWithdrawalAddr = "0x0000000000000000000000000000000000000000" + type clusterConfig struct { ClusterDir string Clean bool @@ -123,7 +126,7 @@ func bindClusterFlags(flags *pflag.FlagSet, config *clusterConfig) { flags.StringVar(&config.ClusterDir, "cluster-dir", ".charon/cluster", "The target folder to create the cluster in.") flags.IntVarP(&config.NumNodes, "nodes", "n", 4, "The number of charon nodes in the cluster.") flags.IntVarP(&config.Threshold, "threshold", "t", 3, "The threshold required for signature reconstruction. Minimum is n-(ceil(n/3)-1).") - flags.StringVar(&config.WithdrawalAddr, "withdrawal-address", "0000000000000000000000000000000000000000", "Ethereum address to receive the returned stake and accrued rewards.") + flags.StringVar(&config.WithdrawalAddr, "withdrawal-address", defaultWithdrawalAddr, "Ethereum address to receive the returned stake and accrued rewards.") flags.StringVar(&config.Network, "network", "prater", "Ethereum network to create validators for (default: mainnet). Options: mainnet, prater, kintsugi, kiln, gnosis.") flags.BoolVar(&config.Clean, "clean", false, "Delete the cluster directory before generating it.") @@ -220,8 +223,9 @@ func runCreateCluster(w io.Writer, conf clusterConfig) error { return err } - if !validNetwork(conf.Network) { - return errors.New("invalid network") + err = validNetwork(conf) + if err != nil { + return err } msgRoot, err := deposit.GetMessageSigningRoot(pk, withdrawalAddr, conf.Network) @@ -572,15 +576,20 @@ func validAddr(a string) (string, error) { return hexAddr.Hex(), nil } -// validNetwork returns true if the input network is supported. Returns false otherwise. -func validNetwork(network string) bool { +// validNetwork returns an error if the input network is not supported or certain conditions are not met. +func validNetwork(conf clusterConfig) error { validNetworks := []string{"prater", "kintsugi", "kiln", "gnosis", "mainnet"} + // We cannot allow a zero withdrawal address on mainnet or gnosis. + if conf.WithdrawalAddr == defaultWithdrawalAddr && (conf.Network == "mainnet" || conf.Network == "gnosis") { + return errors.New("zero address", z.Str("network", conf.Network)) + } + for _, n := range validNetworks { - if n == network { - return true + if n == conf.Network { + return nil } } - return false + return errors.New("unsupported network", z.Str("network", conf.Network)) } diff --git a/cmd/createcluster_internal_test.go b/cmd/createcluster_internal_test.go index c115dd26f..5d3345c9e 100644 --- a/cmd/createcluster_internal_test.go +++ b/cmd/createcluster_internal_test.go @@ -135,3 +135,27 @@ func testCreateCluster(t *testing.T, conf clusterConfig) { testutil.RequireGoldenBytes(t, b) }) } + +func TestValidAddr(t *testing.T) { + expected := "0xC0404ed740a69d11201f5eD297c5732F562c6E4e" + got, err := validAddr(expected) + require.NoError(t, err) + require.Equal(t, got, expected) + + expected = "0x32F562c6E4eexyzXYZ69d11201f5eD297c57C0404" + got, err = validAddr(expected) + require.Error(t, err, "invalid address") +} + +func TestValidNetwork(t *testing.T) { + conf := clusterConfig{ + WithdrawalAddr: "0x0000000000000000000000000000000000000000", + Network: "gnosis", + } + err := validNetwork(conf) + require.Error(t, err, "zero address") + + conf.Network = "prater" + err = validNetwork(conf) + require.NoError(t, err) +} From aae709958b5414ff0fd181166fb7f48c393d337b Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 16:06:34 +0530 Subject: [PATCH 06/13] fix tests --- cmd/createcluster.go | 9 ++++++--- cmd/createcluster_internal_test.go | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cmd/createcluster.go b/cmd/createcluster.go index 9753e1e07..a4ef9cd3a 100644 --- a/cmd/createcluster.go +++ b/cmd/createcluster.go @@ -19,7 +19,6 @@ import ( "crypto/rand" "encoding/json" "fmt" - "github.com/obolnetwork/charon/app/z" "io" "net" "os" @@ -36,6 +35,7 @@ import ( "github.com/obolnetwork/charon/app" "github.com/obolnetwork/charon/app/errors" + "github.com/obolnetwork/charon/app/z" "github.com/obolnetwork/charon/eth2util/deposit" "github.com/obolnetwork/charon/eth2util/keystore" "github.com/obolnetwork/charon/p2p" @@ -83,7 +83,10 @@ windows: {{end}} ` -const defaultWithdrawalAddr = "0x0000000000000000000000000000000000000000" +const ( + defaultWithdrawalAddr = "0x0000000000000000000000000000000000000000" + defaultNetwork = "prater" +) type clusterConfig struct { ClusterDir string @@ -127,7 +130,7 @@ func bindClusterFlags(flags *pflag.FlagSet, config *clusterConfig) { flags.IntVarP(&config.NumNodes, "nodes", "n", 4, "The number of charon nodes in the cluster.") flags.IntVarP(&config.Threshold, "threshold", "t", 3, "The threshold required for signature reconstruction. Minimum is n-(ceil(n/3)-1).") flags.StringVar(&config.WithdrawalAddr, "withdrawal-address", defaultWithdrawalAddr, "Ethereum address to receive the returned stake and accrued rewards.") - flags.StringVar(&config.Network, "network", "prater", "Ethereum network to create validators for (default: mainnet). Options: mainnet, prater, kintsugi, kiln, gnosis.") + flags.StringVar(&config.Network, "network", defaultNetwork, "Ethereum network to create validators for (default: mainnet). Options: mainnet, prater, kintsugi, kiln, gnosis.") flags.BoolVar(&config.Clean, "clean", false, "Delete the cluster directory before generating it.") flags.BoolVar(&config.SplitKeys, "split-existing-keys", false, "Enables splitting of existing non-dvt validator keys into distributed threshold private shares (instead of creating new random keys).") diff --git a/cmd/createcluster_internal_test.go b/cmd/createcluster_internal_test.go index 5d3345c9e..a790011af 100644 --- a/cmd/createcluster_internal_test.go +++ b/cmd/createcluster_internal_test.go @@ -83,6 +83,10 @@ func TestCreateCluster(t *testing.T) { if test.Prep != nil { test.Config = test.Prep(t, test.Config) } + + test.Config.WithdrawalAddr = defaultWithdrawalAddr + test.Config.Network = defaultNetwork + testCreateCluster(t, test.Config) }) } From f8ca1bec5d5cff8140c8c65f6497e91bd99c1b05 Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 16:27:13 +0530 Subject: [PATCH 07/13] Remove ineffectual assignment --- cmd/createcluster_internal_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/createcluster_internal_test.go b/cmd/createcluster_internal_test.go index a790011af..594186681 100644 --- a/cmd/createcluster_internal_test.go +++ b/cmd/createcluster_internal_test.go @@ -147,7 +147,7 @@ func TestValidAddr(t *testing.T) { require.Equal(t, got, expected) expected = "0x32F562c6E4eexyzXYZ69d11201f5eD297c57C0404" - got, err = validAddr(expected) + _, err = validAddr(expected) require.Error(t, err, "invalid address") } From b100f6540f771d38166a13777a3a526436e95301 Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 16:57:44 +0530 Subject: [PATCH 08/13] refactor deposit data to be compatible with specs --- cmd/createcluster.go | 20 ++++---- eth2util/deposit/deposit.go | 78 +++++++++++++------------------- eth2util/deposit/deposit_test.go | 41 ++++------------- 3 files changed, 49 insertions(+), 90 deletions(-) diff --git a/cmd/createcluster.go b/cmd/createcluster.go index 5e7c92496..356aae99e 100644 --- a/cmd/createcluster.go +++ b/cmd/createcluster.go @@ -26,6 +26,7 @@ import ( "strings" "text/template" + eth2p0 "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/coinbase/kryptology/pkg/signatures/bls/bls_sig" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enr" @@ -196,8 +197,9 @@ func runCreateCluster(w io.Writer, conf clusterConfig) error { // TODO(xenowits): add flag to specify the number of distributed validators in a cluster // Currently, we assume that we create a cluster of ONLY 1 Distributed Validator - var depositDatas [][]byte - for i := 0; i < conf.NumDVs+1; i++ { // Note that default value of conf.NumDVs is 0 + var pubkeys []eth2p0.BLSPubKey + var msgSigs []eth2p0.BLSSignature + for i := 0; i < conf.NumDVs+1; i++ { sk := secrets[i] // Group secret key for this DV pubkey, err := sk.GetPublicKey() if err != nil { @@ -223,15 +225,12 @@ func runCreateCluster(w io.Writer, conf clusterConfig) error { } sigEth2 := tblsconv.SigToETH2(sig) - bytes, err := deposit.MarshalDepositData(pk, withdrawalAddr, network, sigEth2) - if err != nil { - return err - } - depositDatas = append(depositDatas, bytes) + pubkeys = append(pubkeys, pk) + msgSigs = append(msgSigs, sigEth2) } - if err := writeDepositData(conf, depositDatas); err != nil { + if err := writeDepositData(conf, pubkeys, msgSigs, "", ""); err != nil { return err } @@ -323,10 +322,11 @@ func getKeys(conf clusterConfig) ([]*bls_sig.SecretKey, error) { } // writeDepositData writes deposit data to disk for the DVs in a cluster. -func writeDepositData(config clusterConfig, b [][]byte) error { +func writeDepositData(config clusterConfig, pubkeys []eth2p0.BLSPubKey, msgSigs []eth2p0.BLSSignature, withdrawalAddr, network string) error { depositPath := path.Join(config.ClusterDir, "deposit-data.json") - bytes, err := deposit.MarshalDepositDatas(b) + // serialize the deposit data into bytes + bytes, err := deposit.MarshalDepositData(pubkeys, msgSigs, withdrawalAddr, network) if err != nil { return err } diff --git a/eth2util/deposit/deposit.go b/eth2util/deposit/deposit.go index 95738aaa5..c8b3fa422 100644 --- a/eth2util/deposit/deposit.go +++ b/eth2util/deposit/deposit.go @@ -62,63 +62,47 @@ func getMessageRoot(pubkey eth2p0.BLSPubKey, withdrawalAddr string) (eth2p0.Root return hashRoot, nil } -// MarshalDepositData returns a json serialized deposit data. -func MarshalDepositData(pubkey eth2p0.BLSPubKey, withdrawalAddr string, network string, msgSig eth2p0.BLSSignature) ([]byte, error) { - forkVersion := networkToForkVersion(network) - +// MarshalDepositData serializes a list of deposit data into a single file. +func MarshalDepositData(pubkeys []eth2p0.BLSPubKey, msgSigs []eth2p0.BLSSignature, withdrawalAddr, network string) ([]byte, error) { creds, err := withdrawalCredsFromAddr(withdrawalAddr) if err != nil { return nil, err } - // calculate depositMessage root - msgRoot, err := getMessageRoot(pubkey, withdrawalAddr) - if err != nil { - return nil, err - } - - // TODO(corver): Verify signature matches msgRoot. - - dd := eth2p0.DepositData{ - PublicKey: pubkey, - WithdrawalCredentials: creds[:], - Amount: validatorAmt, - Signature: msgSig, - } - dataRoot, err := dd.HashTreeRoot() - if err != nil { - return nil, errors.Wrap(err, "deposit data hash root") - } + forkVersion := networkToForkVersion(network) - bytes, err := json.MarshalIndent(&depositDataJSON{ - PubKey: fmt.Sprintf("%x", pubkey), - WithdrawalCredentials: fmt.Sprintf("%x", creds), - Amount: uint64(validatorAmt), - Signature: fmt.Sprintf("%x", msgSig), - DepositMessageRoot: fmt.Sprintf("%x", msgRoot), - DepositDataRoot: fmt.Sprintf("%x", dataRoot), - ForkVersion: fmt.Sprintf("%x", forkVersion), - NetworkName: network, - DepositCliVersion: depositCliVersion, - }, "", " ") // use 2 space tabs - if err != nil { - return nil, errors.Wrap(err, "marshal deposit data") - } + var ddList []depositDataJSON + for i := 0; i < len(pubkeys); i++ { + // calculate depositMessage root + msgRoot, err := getMessageRoot(pubkeys[i], withdrawalAddr) + if err != nil { + return nil, err + } - return bytes, nil -} + // TODO(corver): Verify signature matches msgRoot. -// MarshalDepositDatas serializes a list of deposit data into a single file. -func MarshalDepositDatas(depositDatas [][]byte) ([]byte, error) { - var ddList []depositDataJSON - ddLen := len(depositDatas) - for i := 0; i < ddLen; i++ { - var dd depositDataJSON - err := json.Unmarshal(depositDatas[i], &dd) + dd := eth2p0.DepositData{ + PublicKey: pubkeys[i], + WithdrawalCredentials: creds[:], + Amount: validatorAmt, + Signature: msgSigs[i], + } + dataRoot, err := dd.HashTreeRoot() if err != nil { - return nil, errors.Wrap(err, "unmarshal deposit data") + return nil, errors.Wrap(err, "deposit data hash root") } - ddList = append(ddList, dd) + + ddList = append(ddList, depositDataJSON{ + PubKey: fmt.Sprintf("%x", pubkeys[i]), + WithdrawalCredentials: fmt.Sprintf("%x", creds), + Amount: uint64(validatorAmt), + Signature: fmt.Sprintf("%x", msgSigs[i]), + DepositMessageRoot: fmt.Sprintf("%x", msgRoot), + DepositDataRoot: fmt.Sprintf("%x", dataRoot), + ForkVersion: fmt.Sprintf("%x", forkVersion), + NetworkName: network, + DepositCliVersion: depositCliVersion, + }) } bytes, err := json.MarshalIndent(ddList, "", " ") diff --git a/eth2util/deposit/deposit_test.go b/eth2util/deposit/deposit_test.go index 4e93fe76b..e63dcdd39 100644 --- a/eth2util/deposit/deposit_test.go +++ b/eth2util/deposit/deposit_test.go @@ -17,11 +17,11 @@ package deposit_test import ( "encoding/hex" - eth2p0 "github.com/attestantio/go-eth2-client/spec/phase0" - "github.com/coinbase/kryptology/pkg/signatures/bls/bls_sig" "os" "testing" + eth2p0 "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/coinbase/kryptology/pkg/signatures/bls/bls_sig" "github.com/stretchr/testify/require" "github.com/obolnetwork/charon/eth2util/deposit" @@ -35,32 +35,7 @@ const ( network = "prater" ) -func TestDepositData(t *testing.T) { - file := "testdata/deposit-data.json" - privKey := "07e0355752a16fdc473d01676f7f82594991ea830eea928d8e2254dfd98d4beb" - - sk, pubkey := GetKeys(t, privKey) - - // Get deposit message signing root - msgSigningRoot, err := deposit.GetMessageSigningRoot(pubkey, withdrawalAddr, network) - require.NoError(t, err) - - // Sign it - s, err := tbls.Sign(sk, msgSigningRoot[:]) - require.NoError(t, err) - sigEth2 := tblsconv.SigToETH2(s) - - // Check if serialized versions match. - actual, err := deposit.MarshalDepositData(pubkey, withdrawalAddr, network, sigEth2) - require.NoError(t, err) - - // Not using golden file since output MUST never change. - expected, err := os.ReadFile(file) - require.NoError(t, err) - require.Equal(t, expected, actual) -} - -func TestMarshalDepositDatas(t *testing.T) { +func TestMarshalDepositData(t *testing.T) { file := "testdata/deposit-datas.json" privKeys := []string{ "01477d4bfbbcebe1fef8d4d6f624ecbb6e3178558bb1b0d6286c816c66842a6d", @@ -69,7 +44,8 @@ func TestMarshalDepositDatas(t *testing.T) { "002ff4fd29d3deb6de9f5d115182a49c618c97acaa365ad66a0b240bd825c4ff", } - var depositDatas [][]byte + var pubkeys []eth2p0.BLSPubKey + var msgsigs []eth2p0.BLSSignature for i := 0; i < len(privKeys); i++ { sk, pk := GetKeys(t, privKeys[i]) @@ -81,13 +57,12 @@ func TestMarshalDepositDatas(t *testing.T) { require.NoError(t, err) sigEth2 := tblsconv.SigToETH2(sig) - bytes, err := deposit.MarshalDepositData(pk, withdrawalAddr, network, sigEth2) - require.NoError(t, err) - depositDatas = append(depositDatas, bytes) + pubkeys = append(pubkeys, pk) + msgsigs = append(msgsigs, sigEth2) } - actual, err := deposit.MarshalDepositDatas(depositDatas) + actual, err := deposit.MarshalDepositData(pubkeys, msgsigs, withdrawalAddr, network) require.NoError(t, err) // Not using golden file since output MUST never change. From 73c498a9e79f040479f770c6b8d48a767491b3e8 Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 17:03:49 +0530 Subject: [PATCH 09/13] fix some changes --- cmd/createcluster.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/createcluster.go b/cmd/createcluster.go index a553ab411..046199735 100644 --- a/cmd/createcluster.go +++ b/cmd/createcluster.go @@ -249,7 +249,7 @@ func runCreateCluster(w io.Writer, conf clusterConfig) error { msgSigs = append(msgSigs, sigEth2) } - if err := writeDepositData(conf, pubkeys, msgSigs, "", ""); err != nil { + if err := writeDepositData(conf, pubkeys, msgSigs, conf.WithdrawalAddr, conf.Network); err != nil { return err } From a66d46c84dc28b3559e30be2dd8655c1638bbea1 Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 22:12:58 +0530 Subject: [PATCH 10/13] address review comments --- cmd/createcluster.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/createcluster.go b/cmd/createcluster.go index 8f22a2026..9ac481ee9 100644 --- a/cmd/createcluster.go +++ b/cmd/createcluster.go @@ -133,7 +133,7 @@ func bindClusterFlags(flags *pflag.FlagSet, config *clusterConfig) { flags.StringVar(&config.Network, "network", defaultNetwork, "Ethereum network to create validators for. Options: mainnet, prater, kintsugi, kiln, gnosis.") flags.BoolVar(&config.Clean, "clean", false, "Delete the cluster directory before generating it.") - flags.BoolVar(&config.SplitKeys, "split-existing-keys", false, "Enables splitting of existing non-dvt validator keys into distributed threshold private shares (instead of creating new random keys).") + 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.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.BoolVar(&config.ConfigEnabled, "config", false, "Enables creation of local non-docker config files.") @@ -587,7 +587,7 @@ func validNetwork(conf clusterConfig) error { // We cannot allow a zero withdrawal address on mainnet or gnosis. if conf.WithdrawalAddr == defaultWithdrawalAddr && (conf.Network == "mainnet" || conf.Network == "gnosis") { - return errors.New("zero address", z.Str("network", conf.Network)) + return errors.New("zero address forbidden on this network", z.Str("network", conf.Network)) } for _, n := range validNetworks { From ade53e5ead2358beea2e2b2ffa1a1b4d5117042f Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 23:12:08 +0530 Subject: [PATCH 11/13] generate new golden files --- cmd/testdata/TestCreateCluster_simnet_output.golden | 2 +- cmd/testdata/TestCreateCluster_splitkeys_output.golden | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/testdata/TestCreateCluster_simnet_output.golden b/cmd/testdata/TestCreateCluster_simnet_output.golden index 19ea89bfb..bf464e185 100644 --- a/cmd/testdata/TestCreateCluster_simnet_output.golden +++ b/cmd/testdata/TestCreateCluster_simnet_output.golden @@ -6,7 +6,7 @@ Created charon cluster: charon/ ├─ manifest.json Cluster manifest defines the cluster; used by all nodes -├─ deposit-data.json Deposit data file used to activate the Distributed Validator +├─ deposit-data.json Deposit data file is used to activate a Distributed Validator on DV Launchpad ├─ run_cluster.sh Convenience script to run all nodes ├─ teamocil.yml Teamocil config for splitting logs in tmux panes ├─ node[0-3]/ Directory for each node diff --git a/cmd/testdata/TestCreateCluster_splitkeys_output.golden b/cmd/testdata/TestCreateCluster_splitkeys_output.golden index 25a0d8898..71c59e745 100644 --- a/cmd/testdata/TestCreateCluster_splitkeys_output.golden +++ b/cmd/testdata/TestCreateCluster_splitkeys_output.golden @@ -11,7 +11,7 @@ Created charon cluster: charon/ ├─ manifest.json Cluster manifest defines the cluster; used by all nodes -├─ deposit-data.json Deposit data file used to activate the Distributed Validator +├─ deposit-data.json Deposit data file is used to activate a Distributed Validator on DV Launchpad ├─ node[0-3]/ Directory for each node │ ├─ p2pkey P2P networking private key for node authentication │ ├─ keystore-*.json Validator private share key for duty signing From a4f3fef94cb345afda8e94e90bb55e5d81053e74 Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 23:15:41 +0530 Subject: [PATCH 12/13] remove old deposit data test file --- eth2util/deposit/deposit_test.go | 2 +- eth2util/deposit/testdata/deposit-data.json | 47 +++++++++++++++++--- eth2util/deposit/testdata/deposit-datas.json | 46 ------------------- 3 files changed, 42 insertions(+), 53 deletions(-) delete mode 100644 eth2util/deposit/testdata/deposit-datas.json diff --git a/eth2util/deposit/deposit_test.go b/eth2util/deposit/deposit_test.go index e63dcdd39..1d899c5be 100644 --- a/eth2util/deposit/deposit_test.go +++ b/eth2util/deposit/deposit_test.go @@ -36,7 +36,7 @@ const ( ) func TestMarshalDepositData(t *testing.T) { - file := "testdata/deposit-datas.json" + file := "testdata/deposit-data.json" privKeys := []string{ "01477d4bfbbcebe1fef8d4d6f624ecbb6e3178558bb1b0d6286c816c66842a6d", "5b77c0f0ef7c4ddc123d55b8bd93daeefbd7116764a941c0061a496649e145b5", diff --git a/eth2util/deposit/testdata/deposit-data.json b/eth2util/deposit/testdata/deposit-data.json index 6ffc4fdeb..35cdd2974 100644 --- a/eth2util/deposit/testdata/deposit-data.json +++ b/eth2util/deposit/testdata/deposit-data.json @@ -1,11 +1,46 @@ -{ - "pubkey": "b6a6bb229bd3c845ae1221fe3a0b20c963ac16dd99949e0e979f01f8864af099e56dcd2e37afe21063f382624e57d183", +[ + { + "pubkey": "813f5d2697f76841a752ef8c1ac11d1bb76e07003799c5745f8a569214653810def3b60920b54fb0ab3cb6deb08c3972", "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", "amount": 32000000000, - "signature": "980a8f479f7cc3912d96b5902e956b763cc13d204c3a94ea9df15b0b6d7d470fe276af981688d94846efa4eed0d7b2be11a796d24a84b07a486d927dea4f52862fa57128ee58d3129f14f0c97da98ee7c99aff310b5df5283858361e2ac0286f", - "deposit_message_root": "4f3acee7f79a295cd13aa20e9884f1f9672ab0a1192ee08f483dd485e7c46925", - "deposit_data_root": "664b49b474a6959e992875ec8ece7bc53dbce81ac1e7bf92202a1432806c392c", + "signature": "b5f95360b98cb6db3c06998b43b1dce29aea4f085950018d9dbd3c9894941f4804c449c771392ed3dde1091d346d71c316273c7213237dfa6b9ea79fbcfe79b055a5880d309f5db2dcf3e9a0fee6a4c843f3adb5835958b0561996218cd63acf", + "deposit_message_root": "33109737473d6ccb5f3c4f7eccaa4a7cd3dd63de3d9878a978243053904d39bf", + "deposit_data_root": "4d97bfb4ad862d7885586186d0c8c482d1b084e3d478d9b7e55bb4729d058dfc", "fork_version": "00001020", "network_name": "prater", "deposit_cli_version": "2.1.0" -} \ No newline at end of file + }, + { + "pubkey": "940a838cd88c10daa9c26fcdf8472dfe09657c4aa4030380c6cca5ddb573a8036dfb03e61137c4baacdc9d69061f1eb2", + "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", + "amount": 32000000000, + "signature": "b8e638af308c9e1a1dfac291c7b0218dc3c1dc9baa000dbee0539ed6805cd76afd06fd50797e8192cf917d51c712c31212670e521e0cf326fadbbd8f361fa7a1e0fc80bc77279c71ddd2505835ec3da74a742a5ca19a635c6889915ef3a2dd89", + "deposit_message_root": "8cec1018fcfcb6ae295546901f1c55e2f2643834b89c9a00e4806d8c6b197169", + "deposit_data_root": "0c8b9be09c9e36bef37e9248ce262485d1ee21e005ecf3ff347a820ba0b3c69a", + "fork_version": "00001020", + "network_name": "prater", + "deposit_cli_version": "2.1.0" + }, + { + "pubkey": "80d0436ccacd2b263f5e9e7ebaa14015fe5c80d3e57dc7c37bcbda783895e3491019d3ed694ecbb49c8c80a0480c0392", + "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", + "amount": 32000000000, + "signature": "8e383948b4909a20e16c17883148adf56234c19540995830a1908720cbdf4bed309568fefbb40bec4b7f8b4b3df9e19016afb25d76899ec6e1cc7259abe5de6e7b9b04723014ebef47852925c4dd3ff343caeeeb5b4ed499c9d5be2cda1f8b84", + "deposit_message_root": "4f5f7044a71d625c59974e32e8d86aed0a2211d423675303124ce5ac70969a46", + "deposit_data_root": "892766707bb5d2bb9602d9620f942af9e0c2c915c4340ad22ef935dd999db85b", + "fork_version": "00001020", + "network_name": "prater", + "deposit_cli_version": "2.1.0" + }, + { + "pubkey": "b3d95c8790d63114ab1e813e8943f1bd59683927942df076ad724de8cc00974306c95d6614ef93505b5acd9719a6de78", + "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", + "amount": 32000000000, + "signature": "a4f5fac20a37a109200594ab9ee3bf983aab4aea6202fab637e7e79b9bbae37cef5815c746bdf01a57e659605346a9b80d4efe7e0884de144dcff28d07838a58819f03dd8fc2b48ea14e62222390fe3cb0284010f6acdcb1c4b5eb4c46a02560", + "deposit_message_root": "6b6860824055330be4cb0a378a1ffd342e4de77fef1d51621d44419c4b313ca9", + "deposit_data_root": "a7de8c4c4e26b9751afcc1bc7ecc558c3d40ee3985d62c6ba07dc08c0aa64581", + "fork_version": "00001020", + "network_name": "prater", + "deposit_cli_version": "2.1.0" + } +] \ No newline at end of file diff --git a/eth2util/deposit/testdata/deposit-datas.json b/eth2util/deposit/testdata/deposit-datas.json deleted file mode 100644 index 35cdd2974..000000000 --- a/eth2util/deposit/testdata/deposit-datas.json +++ /dev/null @@ -1,46 +0,0 @@ -[ - { - "pubkey": "813f5d2697f76841a752ef8c1ac11d1bb76e07003799c5745f8a569214653810def3b60920b54fb0ab3cb6deb08c3972", - "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", - "amount": 32000000000, - "signature": "b5f95360b98cb6db3c06998b43b1dce29aea4f085950018d9dbd3c9894941f4804c449c771392ed3dde1091d346d71c316273c7213237dfa6b9ea79fbcfe79b055a5880d309f5db2dcf3e9a0fee6a4c843f3adb5835958b0561996218cd63acf", - "deposit_message_root": "33109737473d6ccb5f3c4f7eccaa4a7cd3dd63de3d9878a978243053904d39bf", - "deposit_data_root": "4d97bfb4ad862d7885586186d0c8c482d1b084e3d478d9b7e55bb4729d058dfc", - "fork_version": "00001020", - "network_name": "prater", - "deposit_cli_version": "2.1.0" - }, - { - "pubkey": "940a838cd88c10daa9c26fcdf8472dfe09657c4aa4030380c6cca5ddb573a8036dfb03e61137c4baacdc9d69061f1eb2", - "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", - "amount": 32000000000, - "signature": "b8e638af308c9e1a1dfac291c7b0218dc3c1dc9baa000dbee0539ed6805cd76afd06fd50797e8192cf917d51c712c31212670e521e0cf326fadbbd8f361fa7a1e0fc80bc77279c71ddd2505835ec3da74a742a5ca19a635c6889915ef3a2dd89", - "deposit_message_root": "8cec1018fcfcb6ae295546901f1c55e2f2643834b89c9a00e4806d8c6b197169", - "deposit_data_root": "0c8b9be09c9e36bef37e9248ce262485d1ee21e005ecf3ff347a820ba0b3c69a", - "fork_version": "00001020", - "network_name": "prater", - "deposit_cli_version": "2.1.0" - }, - { - "pubkey": "80d0436ccacd2b263f5e9e7ebaa14015fe5c80d3e57dc7c37bcbda783895e3491019d3ed694ecbb49c8c80a0480c0392", - "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", - "amount": 32000000000, - "signature": "8e383948b4909a20e16c17883148adf56234c19540995830a1908720cbdf4bed309568fefbb40bec4b7f8b4b3df9e19016afb25d76899ec6e1cc7259abe5de6e7b9b04723014ebef47852925c4dd3ff343caeeeb5b4ed499c9d5be2cda1f8b84", - "deposit_message_root": "4f5f7044a71d625c59974e32e8d86aed0a2211d423675303124ce5ac70969a46", - "deposit_data_root": "892766707bb5d2bb9602d9620f942af9e0c2c915c4340ad22ef935dd999db85b", - "fork_version": "00001020", - "network_name": "prater", - "deposit_cli_version": "2.1.0" - }, - { - "pubkey": "b3d95c8790d63114ab1e813e8943f1bd59683927942df076ad724de8cc00974306c95d6614ef93505b5acd9719a6de78", - "withdrawal_credentials": "010000000000000000000000c0404ed740a69d11201f5ed297c5732f562c6e4e", - "amount": 32000000000, - "signature": "a4f5fac20a37a109200594ab9ee3bf983aab4aea6202fab637e7e79b9bbae37cef5815c746bdf01a57e659605346a9b80d4efe7e0884de144dcff28d07838a58819f03dd8fc2b48ea14e62222390fe3cb0284010f6acdcb1c4b5eb4c46a02560", - "deposit_message_root": "6b6860824055330be4cb0a378a1ffd342e4de77fef1d51621d44419c4b313ca9", - "deposit_data_root": "a7de8c4c4e26b9751afcc1bc7ecc558c3d40ee3985d62c6ba07dc08c0aa64581", - "fork_version": "00001020", - "network_name": "prater", - "deposit_cli_version": "2.1.0" - } -] \ No newline at end of file From 32c5bfda237e1fc4f0cf34281a0b36069b48ed5c Mon Sep 17 00:00:00 2001 From: xenowits Date: Wed, 18 May 2022 23:33:53 +0530 Subject: [PATCH 13/13] add gocognit golint --- cmd/createcluster.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/createcluster.go b/cmd/createcluster.go index e6377f130..61c795901 100644 --- a/cmd/createcluster.go +++ b/cmd/createcluster.go @@ -143,7 +143,7 @@ func bindClusterFlags(flags *pflag.FlagSet, config *clusterConfig) { flags.IntVar(&config.ConfigPortStart, "config-port-start", 16000, "Starting port number used in config files. Requires --config.") } -func runCreateCluster(w io.Writer, conf clusterConfig) error { +func runCreateCluster(w io.Writer, conf clusterConfig) error { //nolint:gocognit if conf.Clean { // Remove previous directories if err := os.RemoveAll(conf.ClusterDir); err != nil {