74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
package commands
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
|
|
"github.com/urfave/cli"
|
|
|
|
cmn "github.com/tendermint/go-common"
|
|
"github.com/tendermint/go-crypto"
|
|
"github.com/tendermint/go-wire"
|
|
)
|
|
|
|
var (
|
|
KeyCmd = cli.Command{
|
|
Name: "key",
|
|
Usage: "Manage keys",
|
|
ArgsUsage: "",
|
|
Subcommands: []cli.Command{NewKeyCmd},
|
|
}
|
|
|
|
NewKeyCmd = cli.Command{
|
|
Name: "new",
|
|
Usage: "Create a new private key",
|
|
ArgsUsage: "",
|
|
Action: func(c *cli.Context) error {
|
|
return cmdNewKey(c)
|
|
},
|
|
}
|
|
)
|
|
|
|
func cmdNewKey(c *cli.Context) error {
|
|
key := genKey()
|
|
keyJSON := wire.JSONBytesPretty(key)
|
|
fmt.Println(string(keyJSON))
|
|
return nil
|
|
}
|
|
|
|
//---------------------------------------------
|
|
// simple implementation of a key
|
|
|
|
type Key struct {
|
|
Address []byte `json:"address"`
|
|
PubKey crypto.PubKey `json:"pub_key"`
|
|
PrivKey crypto.PrivKey `json:"priv_key"`
|
|
}
|
|
|
|
// Implements Signer
|
|
func (k *Key) Sign(msg []byte) crypto.Signature {
|
|
return k.PrivKey.Sign(msg)
|
|
}
|
|
|
|
// Generates a new validator with private key.
|
|
func genKey() *Key {
|
|
privKey := crypto.GenPrivKeyEd25519()
|
|
return &Key{
|
|
Address: privKey.PubKey().Address(),
|
|
PubKey: privKey.PubKey(),
|
|
PrivKey: privKey,
|
|
}
|
|
}
|
|
|
|
func LoadKey(filePath string) *Key {
|
|
keyJSONBytes, err := ioutil.ReadFile(filePath)
|
|
if err != nil {
|
|
cmn.Exit(err.Error())
|
|
}
|
|
key := wire.ReadJSON(&Key{}, keyJSONBytes, &err).(*Key)
|
|
if err != nil {
|
|
cmn.Exit(cmn.Fmt("Error reading PrivValidator from %v: %v\n", filePath, err))
|
|
}
|
|
return key
|
|
}
|