github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/cmd/ethkey/utils.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  //</624342589700575232>
    11  
    12  
    13  package main
    14  
    15  import (
    16  	"encoding/json"
    17  	"fmt"
    18  	"io/ioutil"
    19  	"strings"
    20  
    21  	"github.com/ethereum/go-ethereum/cmd/utils"
    22  	"github.com/ethereum/go-ethereum/console"
    23  	"github.com/ethereum/go-ethereum/crypto"
    24  	"gopkg.in/urfave/cli.v1"
    25  )
    26  
    27  //promptppassphrase提示用户输入密码短语。将确认设置为真
    28  //要求用户确认密码短语。
    29  func promptPassphrase(confirmation bool) string {
    30  	passphrase, err := console.Stdin.PromptPassword("Passphrase: ")
    31  	if err != nil {
    32  		utils.Fatalf("Failed to read passphrase: %v", err)
    33  	}
    34  
    35  	if confirmation {
    36  		confirm, err := console.Stdin.PromptPassword("Repeat passphrase: ")
    37  		if err != nil {
    38  			utils.Fatalf("Failed to read passphrase confirmation: %v", err)
    39  		}
    40  		if passphrase != confirm {
    41  			utils.Fatalf("Passphrases do not match")
    42  		}
    43  	}
    44  
    45  	return passphrase
    46  }
    47  
    48  //getpassphrase获取用户给定的密码。它首先检查
    49  //--passfile命令行标志,并最终提示用户
    50  //口令。
    51  func getPassphrase(ctx *cli.Context) string {
    52  //查找--passwordfile标志。
    53  	passphraseFile := ctx.String(passphraseFlag.Name)
    54  	if passphraseFile != "" {
    55  		content, err := ioutil.ReadFile(passphraseFile)
    56  		if err != nil {
    57  			utils.Fatalf("Failed to read passphrase file '%s': %v",
    58  				passphraseFile, err)
    59  		}
    60  		return strings.TrimRight(string(content), "\r\n")
    61  	}
    62  
    63  //否则提示用户输入密码短语。
    64  	return promptPassphrase(false)
    65  }
    66  
    67  //signhash是一个帮助函数,用于计算给定消息的哈希值
    68  //可以安全地用于计算签名。
    69  //
    70  //哈希被计算为
    71  //keccak256(“\x19ethereum签名消息:\n”$消息长度$消息)。
    72  //
    73  //这将为已签名的消息提供上下文,并防止对事务进行签名。
    74  func signHash(data []byte) []byte {
    75  	msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data)
    76  	return crypto.Keccak256([]byte(msg))
    77  }
    78  
    79  //mustprintjson打印给定对象的json编码,以及
    80  //在封送失败时退出程序并显示错误消息。
    81  func mustPrintJSON(jsonObject interface{}) {
    82  	str, err := json.MarshalIndent(jsonObject, "", "  ")
    83  	if err != nil {
    84  		utils.Fatalf("Failed to marshal JSON object: %v", err)
    85  	}
    86  	fmt.Println(string(str))
    87  }
    88