github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/cmd/ethkey/generate.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:27</date> 10 //</624342589264367616> 11 12 13 package main 14 15 import ( 16 "crypto/ecdsa" 17 "fmt" 18 "io/ioutil" 19 "os" 20 "path/filepath" 21 22 "github.com/ethereum/go-ethereum/accounts/keystore" 23 "github.com/ethereum/go-ethereum/cmd/utils" 24 "github.com/ethereum/go-ethereum/crypto" 25 "github.com/pborman/uuid" 26 "gopkg.in/urfave/cli.v1" 27 ) 28 29 type outputGenerate struct { 30 Address string 31 AddressEIP55 string 32 } 33 34 var commandGenerate = cli.Command{ 35 Name: "generate", 36 Usage: "generate new keyfile", 37 ArgsUsage: "[ <keyfile> ]", 38 Description: ` 39 Generate a new keyfile. 40 41 If you want to encrypt an existing private key, it can be specified by setting 42 --privatekey with the location of the file containing the private key. 43 `, 44 Flags: []cli.Flag{ 45 passphraseFlag, 46 jsonFlag, 47 cli.StringFlag{ 48 Name: "privatekey", 49 Usage: "file containing a raw private key to encrypt", 50 }, 51 }, 52 Action: func(ctx *cli.Context) error { 53 //检查是否指定了关键文件路径,并确保它不存在。 54 keyfilepath := ctx.Args().First() 55 if keyfilepath == "" { 56 keyfilepath = defaultKeyfileName 57 } 58 if _, err := os.Stat(keyfilepath); err == nil { 59 utils.Fatalf("Keyfile already exists at %s.", keyfilepath) 60 } else if !os.IsNotExist(err) { 61 utils.Fatalf("Error checking if keyfile exists: %v", err) 62 } 63 64 var privateKey *ecdsa.PrivateKey 65 var err error 66 if file := ctx.String("privatekey"); file != "" { 67 //从文件加载私钥。 68 privateKey, err = crypto.LoadECDSA(file) 69 if err != nil { 70 utils.Fatalf("Can't load private key: %v", err) 71 } 72 } else { 73 //如果未加载,则生成随机。 74 privateKey, err = crypto.GenerateKey() 75 if err != nil { 76 utils.Fatalf("Failed to generate random private key: %v", err) 77 } 78 } 79 80 //使用随机UUID创建keyfile对象。 81 id := uuid.NewRandom() 82 key := &keystore.Key{ 83 Id: id, 84 Address: crypto.PubkeyToAddress(privateKey.PublicKey), 85 PrivateKey: privateKey, 86 } 87 88 //用密码短语加密密钥。 89 passphrase := promptPassphrase(true) 90 keyjson, err := keystore.EncryptKey(key, passphrase, keystore.StandardScryptN, keystore.StandardScryptP) 91 if err != nil { 92 utils.Fatalf("Error encrypting key: %v", err) 93 } 94 95 //将文件存储到磁盘。 96 if err := os.MkdirAll(filepath.Dir(keyfilepath), 0700); err != nil { 97 utils.Fatalf("Could not create directory %s", filepath.Dir(keyfilepath)) 98 } 99 if err := ioutil.WriteFile(keyfilepath, keyjson, 0600); err != nil { 100 utils.Fatalf("Failed to write keyfile to %s: %v", keyfilepath, err) 101 } 102 103 //输出一些信息。 104 out := outputGenerate{ 105 Address: key.Address.Hex(), 106 } 107 if ctx.Bool(jsonFlag.Name) { 108 mustPrintJSON(out) 109 } else { 110 fmt.Println("Address:", out.Address) 111 } 112 return nil 113 }, 114 } 115