// Copyright 2017 AMIS Technologies // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package common import ( "crypto/ecdsa" "crypto/rand" "fmt" "log" "os" "path/filepath" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" uuid "github.com/satori/go.uuid" ) const ( defaultLocalDir = "/tmp/gdata" clientIdentifier = "geth" nodekeyFileName = "nodekey" ) func GenerateRandomDir() (string, error) { err := os.MkdirAll(filepath.Join(defaultLocalDir), 0700) if err != nil { log.Fatal(err) } instanceDir := filepath.Join(defaultLocalDir, fmt.Sprintf("%s-%s", clientIdentifier, uuid.NewV4().String())) if err := os.MkdirAll(instanceDir, 0700); err != nil { log.Println(fmt.Sprintf("Failed to create instance dir: %v", err)) return "", err } return instanceDir, nil } func GenerateKeys(num int) (keys []*ecdsa.PrivateKey, nodekeys []string, addrs []common.Address) { for i := 0; i < num; i++ { nodekey := RandomHex()[2:] nodekeys = append(nodekeys, nodekey) key, err := crypto.HexToECDSA(nodekey) if err != nil { log.Fatalf("couldn't generate key: " + err.Error()) } keys = append(keys, key) addr := crypto.PubkeyToAddress(key.PublicKey) addrs = append(addrs, addr) } return keys, nodekeys, addrs } func SaveNodeKey(key *ecdsa.PrivateKey, dataDir string) error { keyDir := filepath.Join(dataDir, clientIdentifier) if err := os.MkdirAll(keyDir, 0700); err != nil { log.Println(fmt.Sprintf("Failed to create key dir: %v", err)) return err } keyfile := filepath.Join(keyDir, nodekeyFileName) if err := crypto.SaveECDSA(keyfile, key); err != nil { log.Println(fmt.Sprintf("Failed to persist node key: %v", err)) return err } return nil } func RandomHex() string { b, _ := RandomBytes(32) return common.BytesToHash(b).Hex() } func RandomBytes(len int) ([]byte, error) { b := make([]byte, len) _, err := rand.Read(b) if err != nil { log.Fatalln(err) } return b, nil }