github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/cmd/ethkey/changepassphrase.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  package main
    10  
    11  import (
    12  	"fmt"
    13  	"io/ioutil"
    14  	"strings"
    15  
    16  	"github.com/ethereum/go-ethereum/accounts/keystore"
    17  	"github.com/ethereum/go-ethereum/cmd/utils"
    18  	"gopkg.in/urfave/cli.v1"
    19  )
    20  
    21  var newPassphraseFlag = cli.StringFlag{
    22  	Name:  "newpasswordfile",
    23  	Usage: "the file that contains the new passphrase for the keyfile",
    24  }
    25  
    26  var commandChangePassphrase = cli.Command{
    27  	Name:      "changepassphrase",
    28  	Usage:     "change the passphrase on a keyfile",
    29  	ArgsUsage: "<keyfile>",
    30  	Description: `
    31  Change the passphrase of a keyfile.`,
    32  	Flags: []cli.Flag{
    33  		passphraseFlag,
    34  		newPassphraseFlag,
    35  	},
    36  	Action: func(ctx *cli.Context) error {
    37  		keyfilepath := ctx.Args().First()
    38  
    39  //从文件中读取密钥。
    40  		keyjson, err := ioutil.ReadFile(keyfilepath)
    41  		if err != nil {
    42  			utils.Fatalf("Failed to read the keyfile at '%s': %v", keyfilepath, err)
    43  		}
    44  
    45  //
    46  		passphrase := getPassphrase(ctx)
    47  		key, err := keystore.DecryptKey(keyjson, passphrase)
    48  		if err != nil {
    49  			utils.Fatalf("Error decrypting key: %v", err)
    50  		}
    51  
    52  //获取新密码。
    53  		fmt.Println("Please provide a new passphrase")
    54  		var newPhrase string
    55  		if passFile := ctx.String(newPassphraseFlag.Name); passFile != "" {
    56  			content, err := ioutil.ReadFile(passFile)
    57  			if err != nil {
    58  				utils.Fatalf("Failed to read new passphrase file '%s': %v", passFile, err)
    59  			}
    60  			newPhrase = strings.TrimRight(string(content), "\r\n")
    61  		} else {
    62  			newPhrase = promptPassphrase(true)
    63  		}
    64  
    65  //
    66  		newJson, err := keystore.EncryptKey(key, newPhrase, keystore.StandardScryptN, keystore.StandardScryptP)
    67  		if err != nil {
    68  			utils.Fatalf("Error encrypting with new passphrase: %v", err)
    69  		}
    70  
    71  //然后写新的关键文件代替旧的关键文件。
    72  		if err := ioutil.WriteFile(keyfilepath, newJson, 600); err != nil {
    73  			utils.Fatalf("Error writing new keyfile to disk: %v", err)
    74  		}
    75  
    76  //不要打印任何内容。成功返回,
    77  //生成一个正的退出代码。
    78  		return nil
    79  	},
    80  }