// Copyright 2017 The go-ethereum Authors // This file is part of go-ethereum. // // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum 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 General Public License for more details. // // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . package main import ( "encoding/hex" "fmt" "io/ioutil" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/crypto" "gopkg.in/urfave/cli.v1" ) type outputInspect struct { Address string PublicKey string PrivateKey string } var commandInspect = cli.Command{ Name: "inspect", Usage: "inspect a keyfile", ArgsUsage: "", Description: ` Print various information about the keyfile. Private key information can be printed by using the --private flag; make sure to use this feature with great caution!`, Flags: []cli.Flag{ passphraseFlag, jsonFlag, cli.BoolFlag{ Name: "private", Usage: "include the private key in the output", }, }, Action: func(ctx *cli.Context) error { keyfilepath := ctx.Args().First() // Read key from file. keyjson, err := ioutil.ReadFile(keyfilepath) if err != nil { utils.Fatalf("Failed to read the keyfile at '%s': %v", keyfilepath, err) } // Decrypt key with passphrase. passphrase := getPassphrase(ctx) key, err := keystore.DecryptKey(keyjson, passphrase) if err != nil { utils.Fatalf("Error decrypting key: %v", err) } // Output all relevant information we can retrieve. showPrivate := ctx.Bool("private") out := outputInspect{ Address: key.Address.Hex(), PublicKey: hex.EncodeToString( crypto.FromECDSAPub(&key.PrivateKey.PublicKey)), } if showPrivate { out.PrivateKey = hex.EncodeToString(crypto.FromECDSA(key.PrivateKey)) } if ctx.Bool(jsonFlag.Name) { mustPrintJSON(out) } else { fmt.Println("Address: ", out.Address) fmt.Println("Public key: ", out.PublicKey) if showPrivate { fmt.Println("Private key: ", out.PrivateKey) } } return nil }, }