Skip to content

Commit

Permalink
Add keyring (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
gitferry authored Jul 13, 2023
1 parent ac32c29 commit cd994ed
Show file tree
Hide file tree
Showing 11 changed files with 977 additions and 222 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
*.dylib
*.db

# Kerying
.address
.info

# Test binary, built with `go test -c`
*.test

Expand Down
85 changes: 76 additions & 9 deletions cmd/valcli/validators.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,30 @@ package main

import (
"fmt"
"os"
"path"

"github.com/cosmos/cosmos-sdk/client"
"github.com/urfave/cli"

"github.com/babylonchain/btc-validator/codec"
"github.com/babylonchain/btc-validator/val"
"github.com/babylonchain/btc-validator/valcfg"
"github.com/babylonchain/btc-validator/valrpc"
)

const (
chainIdFlag = "chain-id"
keyringDirFlag = "keyring-dir"
keyringBackendFlag = "keyring-backend"
keyNameFlag = "key-name"
)

var (
defaultChainID = "test-chain"
defaultKeyringBackend = "test"
)

var validatorsCommands = []cli.Command{
{
Name: "validators",
Expand All @@ -26,27 +42,59 @@ var createValidator = cli.Command{
Name: "create-validator",
ShortName: "cv",
Usage: "create a BTC validator object and save it in database",
Flags: []cli.Flag{},
Action: createVal,
Flags: []cli.Flag{
cli.StringFlag{
Name: chainIdFlag,
Usage: "the chainID of the Babylonchain",
Value: defaultChainID,
},
cli.StringFlag{
Name: keyNameFlag,
Usage: "the unique name of the validator key",
Required: true,
},
cli.StringFlag{
Name: keyringBackendFlag,
Usage: "select keyring's backend (os|file|test)",
Value: defaultKeyringBackend,
},
cli.StringFlag{
Name: keyringDirFlag,
Usage: "the directory where the keyring is stored",
},
},
Action: createVal,
}

func createVal(ctx *cli.Context) error {
vs, err := getValStoreFromCtx(ctx)
sdkCtx, err := createClientCtx(ctx)
if err != nil {
return err
}
defer func() {
err = vs.Close()
}()

bbnPrivKey, btcPrivKey, err := val.GenerateValPrivKeys()
krController, err := val.NewKeyringController(
sdkCtx,
ctx.String(keyNameFlag),
ctx.String(keyringBackendFlag),
)
if err != nil {
return err
}

// TODO secure private keys in a key string
if krController.KeyNameTaken() {
return fmt.Errorf("the key name is taken")
}

validator, err := krController.CreateBTCValidator()

vs, err := getValStoreFromCtx(ctx)
if err != nil {
return err
}
defer func() {
err = vs.Close()
}()

validator := val.NewValidator(bbnPrivKey.PubKey(), btcPrivKey.PubKey())
if err := vs.SaveValidator(validator); err != nil {
return err
}
Expand Down Expand Up @@ -130,3 +178,22 @@ func getValStoreFromCtx(ctx *cli.Context) (*val.ValidatorStore, error) {

return valStore, nil
}

func createClientCtx(ctx *cli.Context) (client.Context, error) {
var err error
var homeDir string

dir := ctx.String(keyringDirFlag)
if dir == "" {
homeDir, err = os.UserHomeDir()
if err != nil {
return client.Context{}, err
}
dir = path.Join(homeDir, ".btc-validator")
}

return client.Context{}.
WithChainID(ctx.String(chainIdFlag)).
WithCodec(codec.MakeCodec()).
WithKeyringDir(dir), nil
}
16 changes: 16 additions & 0 deletions codec/codec.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package codec

import (
"github.com/cosmos/cosmos-sdk/codec"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
)

func MakeCodec() *codec.ProtoCodec {
ir := codectypes.NewInterfaceRegistry()
cdc := codec.NewProtoCodec(ir)

cryptocodec.RegisterInterfaces(ir)

return cdc
}
Loading

0 comments on commit cd994ed

Please sign in to comment.