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
|
||
|
}
|