github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/cmd/ethkey/changepassphrase.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 //</624342589151121408> 11 12 package main 13 14 import ( 15 "fmt" 16 "io/ioutil" 17 "strings" 18 19 "github.com/ethereum/go-ethereum/accounts/keystore" 20 "github.com/ethereum/go-ethereum/cmd/utils" 21 "gopkg.in/urfave/cli.v1" 22 ) 23 24 var newPassphraseFlag = cli.StringFlag{ 25 Name: "newpasswordfile", 26 Usage: "the file that contains the new passphrase for the keyfile", 27 } 28 29 var commandChangePassphrase = cli.Command{ 30 Name: "changepassphrase", 31 Usage: "change the passphrase on a keyfile", 32 ArgsUsage: "<keyfile>", 33 Description: ` 34 Change the passphrase of a keyfile.`, 35 Flags: []cli.Flag{ 36 passphraseFlag, 37 newPassphraseFlag, 38 }, 39 Action: func(ctx *cli.Context) error { 40 keyfilepath := ctx.Args().First() 41 42 //从文件中读取密钥。 43 keyjson, err := ioutil.ReadFile(keyfilepath) 44 if err != nil { 45 utils.Fatalf("Failed to read the keyfile at '%s': %v", keyfilepath, err) 46 } 47 48 // 49 passphrase := getPassphrase(ctx) 50 key, err := keystore.DecryptKey(keyjson, passphrase) 51 if err != nil { 52 utils.Fatalf("Error decrypting key: %v", err) 53 } 54 55 //获取新密码。 56 fmt.Println("Please provide a new passphrase") 57 var newPhrase string 58 if passFile := ctx.String(newPassphraseFlag.Name); passFile != "" { 59 content, err := ioutil.ReadFile(passFile) 60 if err != nil { 61 utils.Fatalf("Failed to read new passphrase file '%s': %v", passFile, err) 62 } 63 newPhrase = strings.TrimRight(string(content), "\r\n") 64 } else { 65 newPhrase = promptPassphrase(true) 66 } 67 68 // 69 newJson, err := keystore.EncryptKey(key, newPhrase, keystore.StandardScryptN, keystore.StandardScryptP) 70 if err != nil { 71 utils.Fatalf("Error encrypting with new passphrase: %v", err) 72 } 73 74 //然后写新的关键文件代替旧的关键文件。 75 if err := ioutil.WriteFile(keyfilepath, newJson, 600); err != nil { 76 utils.Fatalf("Error writing new keyfile to disk: %v", err) 77 } 78 79 //不要打印任何内容。成功返回, 80 //生成一个正的退出代码。 81 return nil 82 }, 83 } 84