cli: refactor ibc and counter into own binaries

This commit is contained in:
Ethan Buchman 2017-02-07 13:16:41 -05:00
parent f77d43040b
commit abac65bacc
10 changed files with 212 additions and 183 deletions

29
cmd/adam/main.go Normal file
View File

@ -0,0 +1,29 @@
package main
import (
"os"
"github.com/tendermint/basecoin/cmd/commands"
"github.com/urfave/cli"
)
func init() {
commands.RegisterIBC()
}
func main() {
app := cli.NewApp()
app.Name = "adam"
app.Usage = "adam [command] [args...]"
app.Version = "0.1.0"
app.Commands = []cli.Command{
commands.StartCmd,
commands.TxCmd,
commands.QueryCmd,
commands.VerifyCmd, // TODO: move to merkleeyes?
commands.BlockCmd,
commands.AccountCmd,
}
app.Run(os.Args)
}

View File

@ -3,7 +3,7 @@ package main
import (
"os"
"github.com/tendermint/basecoin/cmd/basecoin/commands"
"github.com/tendermint/basecoin/cmd/commands"
"github.com/urfave/cli"
)
@ -14,12 +14,10 @@ func main() {
app.Version = "0.1.0"
app.Commands = []cli.Command{
commands.StartCmd,
commands.SendTxCmd,
commands.AppTxCmd,
commands.IbcCmd,
commands.TxCmd,
commands.QueryCmd,
commands.VerifyCmd,
commands.BlockCmd,
commands.VerifyCmd, // TODO: move to merkleeyes?
commands.BlockCmd, // TODO: move to adam?
commands.AccountCmd,
}
app.Run(os.Args)

View File

@ -31,11 +31,6 @@ var (
Name: "in-proc",
Usage: "Run Tendermint in-process with the App",
}
IbcPluginFlag = cli.BoolFlag{
Name: "ibc-plugin",
Usage: "Enable the ibc plugin",
}
)
// tx flags
@ -106,86 +101,6 @@ var (
Value: "test_chain_id",
Usage: "ID of the chain for replay protection",
}
ValidFlag = cli.BoolFlag{
Name: "valid",
Usage: "Set valid field in CounterTx",
}
)
// ibc flags
var (
IbcChainIDFlag = cli.StringFlag{
Name: "chain_id",
Usage: "ChainID for the new blockchain",
Value: "",
}
IbcGenesisFlag = cli.StringFlag{
Name: "genesis",
Usage: "Genesis file for the new blockchain",
Value: "",
}
IbcHeaderFlag = cli.StringFlag{
Name: "header",
Usage: "Block header for an ibc update",
Value: "",
}
IbcCommitFlag = cli.StringFlag{
Name: "commit",
Usage: "Block commit for an ibc update",
Value: "",
}
IbcFromFlag = cli.StringFlag{
Name: "from",
Usage: "Source ChainID",
Value: "",
}
IbcToFlag = cli.StringFlag{
Name: "to",
Usage: "Destination ChainID",
Value: "",
}
IbcTypeFlag = cli.StringFlag{
Name: "type",
Usage: "IBC packet type (eg. coin)",
Value: "",
}
IbcPayloadFlag = cli.StringFlag{
Name: "payload",
Usage: "IBC packet payload",
Value: "",
}
IbcPacketFlag = cli.StringFlag{
Name: "packet",
Usage: "hex-encoded IBC packet",
Value: "",
}
IbcProofFlag = cli.StringFlag{
Name: "proof",
Usage: "hex-encoded proof of IBC packet from source chain",
Value: "",
}
IbcSequenceFlag = cli.IntFlag{
Name: "sequence",
Usage: "sequence number for IBC packet",
Value: 0,
}
IbcHeightFlag = cli.IntFlag{
Name: "height",
Usage: "Height the packet became egress in source chain",
Value: 0,
}
)
// proof flags

View File

@ -9,6 +9,7 @@ import (
"github.com/urfave/cli"
"github.com/tendermint/basecoin/plugins/ibc"
"github.com/tendermint/basecoin/types"
cmn "github.com/tendermint/go-common"
"github.com/tendermint/go-merkle"
@ -16,25 +17,99 @@ import (
tmtypes "github.com/tendermint/tendermint/types"
)
// Register the IBC plugin at start and for transactions
func RegisterIBC() {
RegisterTxSubcommand(IbcCmd)
RegisterStartPlugin("ibc", func() types.Plugin {
return ibc.New()
})
}
//---------------------------------------------------------------------
// ibc flags
var (
IbcChainIDFlag = cli.StringFlag{
Name: "chain_id",
Usage: "ChainID for the new blockchain",
Value: "",
}
IbcGenesisFlag = cli.StringFlag{
Name: "genesis",
Usage: "Genesis file for the new blockchain",
Value: "",
}
IbcHeaderFlag = cli.StringFlag{
Name: "header",
Usage: "Block header for an ibc update",
Value: "",
}
IbcCommitFlag = cli.StringFlag{
Name: "commit",
Usage: "Block commit for an ibc update",
Value: "",
}
IbcFromFlag = cli.StringFlag{
Name: "from",
Usage: "Source ChainID",
Value: "",
}
IbcToFlag = cli.StringFlag{
Name: "to",
Usage: "Destination ChainID",
Value: "",
}
IbcTypeFlag = cli.StringFlag{
Name: "type",
Usage: "IBC packet type (eg. coin)",
Value: "",
}
IbcPayloadFlag = cli.StringFlag{
Name: "payload",
Usage: "IBC packet payload",
Value: "",
}
IbcPacketFlag = cli.StringFlag{
Name: "packet",
Usage: "hex-encoded IBC packet",
Value: "",
}
IbcProofFlag = cli.StringFlag{
Name: "proof",
Usage: "hex-encoded proof of IBC packet from source chain",
Value: "",
}
IbcSequenceFlag = cli.IntFlag{
Name: "sequence",
Usage: "sequence number for IBC packet",
Value: 0,
}
IbcHeightFlag = cli.IntFlag{
Name: "height",
Usage: "Height the packet became egress in source chain",
Value: 0,
}
)
//---------------------------------------------------------------------
// ibc commands
var (
IbcCmd = cli.Command{
Name: "ibc",
Usage: "Send a transaction to the interblockchain (ibc) plugin",
Flags: []cli.Flag{
NodeFlag,
ChainIDFlag,
FromFlag,
AmountFlag,
CoinFlag,
GasFlag,
FeeFlag,
SeqFlag,
NameFlag,
DataFlag,
},
Flags: TxFlags,
Subcommands: []cli.Command{
IbcRegisterTxCmd,
IbcUpdateTxCmd,
@ -108,6 +183,9 @@ var (
}
)
//---------------------------------------------------------------------
// ibc command implementations
func cmdIBCRegisterTx(c *cli.Context) error {
chainID := c.String("chain_id")
genesisFile := c.String("genesis")

View File

@ -19,7 +19,6 @@ import (
tmtypes "github.com/tendermint/tendermint/types"
"github.com/tendermint/basecoin/app"
"github.com/tendermint/basecoin/plugins/ibc"
"github.com/tendermint/basecoin/types"
)
@ -40,7 +39,6 @@ var StartCmd = cli.Command{
DirFlag,
InProcTMFlag,
ChainIDFlag,
IbcPluginFlag,
},
}
@ -51,10 +49,9 @@ type plugin struct {
var plugins = []plugin{}
// RegisterStartPlugin is used to add another
func RegisterStartPlugin(flag cli.BoolFlag, init func() types.Plugin) {
StartCmd.Flags = append(StartCmd.Flags, flag)
plugins = append(plugins, plugin{name: flag.GetName(), init: init})
// RegisterStartPlugin is used to enable a plugin
func RegisterStartPlugin(name string, initFunc func() types.Plugin) {
plugins = append(plugins, plugin{name: name, init: initFunc})
}
func cmdStart(c *cli.Context) error {
@ -73,15 +70,10 @@ func cmdStart(c *cli.Context) error {
// Create Basecoin app
basecoinApp := app.NewBasecoin(eyesCli)
if c.Bool("ibc-plugin") {
basecoinApp.RegisterPlugin(ibc.New())
}
// loop through all registered plugins and enable if desired
// register all plugins
for _, p := range plugins {
if c.Bool(p.name) {
basecoinApp.RegisterPlugin(p.init())
}
basecoinApp.RegisterPlugin(p.init())
}
// If genesis file exists, set key-value options

View File

@ -16,61 +16,56 @@ import (
tmtypes "github.com/tendermint/tendermint/types"
)
var TxFlags = []cli.Flag{
NodeFlag,
ChainIDFlag,
FromFlag,
AmountFlag,
CoinFlag,
GasFlag,
FeeFlag,
SeqFlag,
}
var (
TxCmd = cli.Command{
Name: "tx",
Usage: "Create, sign, and broadcast a transaction",
ArgsUsage: "",
Subcommands: []cli.Command{
SendTxCmd,
AppTxCmd,
},
}
SendTxCmd = cli.Command{
Name: "sendtx",
Usage: "Broadcast a basecoin SendTx",
Name: "send",
Usage: "Create, sign, and broadcast a SendTx transaction",
ArgsUsage: "",
Action: func(c *cli.Context) error {
return cmdSendTx(c)
},
Flags: []cli.Flag{
NodeFlag,
ChainIDFlag,
FromFlag,
AmountFlag,
CoinFlag,
GasFlag,
FeeFlag,
SeqFlag,
ToFlag,
},
Flags: append(TxFlags, ToFlag),
}
AppTxCmd = cli.Command{
Name: "apptx",
Usage: "Broadcast a basecoin AppTx",
Name: "app",
Usage: "Create, sign, and broadcast a raw AppTx transaction",
ArgsUsage: "",
Action: func(c *cli.Context) error {
return cmdAppTx(c)
},
Flags: []cli.Flag{
NodeFlag,
ChainIDFlag,
FromFlag,
AmountFlag,
CoinFlag,
GasFlag,
FeeFlag,
SeqFlag,
NameFlag,
DataFlag,
},
Flags: append(TxFlags, NameFlag, DataFlag),
// Subcommands are dynamically registered with plugins as needed
Subcommands: []cli.Command{},
}
)
// RegisterTxPlugin is used to add another subcommand and create a custom
// apptx encoding. Look at counter.go for an example
func RegisterTxPlugin(cmd cli.Command) {
AppTxCmd.Subcommands = append(AppTxCmd.Subcommands, cmd)
// Register a subcommand of TxCmd to craft transactions for plugins
func RegisterTxSubcommand(cmd cli.Command) {
TxCmd.Subcommands = append(TxCmd.Subcommands, cmd)
}
func cmdSendTx(c *cli.Context) error {

View File

@ -1,48 +1,48 @@
package commands
package main
import (
"fmt"
"github.com/tendermint/basecoin/plugins/counter"
"github.com/tendermint/basecoin/types"
wire "github.com/tendermint/go-wire"
"github.com/urfave/cli"
)
var (
CounterTxCmd = cli.Command{
Name: "counter",
Usage: "Craft a transaction to the counter plugin",
Action: func(c *cli.Context) error {
return cmdCounterTx(c)
},
Flags: []cli.Flag{
ValidFlag,
},
}
CounterPluginFlag = cli.BoolFlag{
Name: "counter-plugin",
Usage: "Enable the counter plugin",
}
"github.com/tendermint/basecoin/cmd/commands"
"github.com/tendermint/basecoin/plugins/counter"
"github.com/tendermint/basecoin/types"
)
func init() {
RegisterTxPlugin(CounterTxCmd)
RegisterStartPlugin(CounterPluginFlag,
func() types.Plugin { return counter.New("counter") })
commands.RegisterTxSubcommand(CounterTxCmd)
commands.RegisterStartPlugin("counter", func() types.Plugin {
return counter.New("counter")
})
}
var (
ValidFlag = cli.BoolFlag{
Name: "valid",
Usage: "Set valid field in CounterTx",
}
CounterTxCmd = cli.Command{
Name: "counter",
Usage: "Create, sign, and broadcast a transaction to the counter plugin",
Action: func(c *cli.Context) error {
return cmdCounterTx(c)
},
Flags: append(commands.TxFlags, ValidFlag),
}
)
func cmdCounterTx(c *cli.Context) error {
valid := c.Bool("valid")
parent := c.Parent()
counterTx := counter.CounterTx{
Valid: valid,
Fee: types.Coins{
{
Denom: parent.String("coin"),
Amount: int64(parent.Int("fee")),
Denom: c.String("coin"),
Amount: int64(c.Int("fee")),
},
},
}
@ -52,5 +52,5 @@ func cmdCounterTx(c *cli.Context) error {
data := wire.BinaryBytes(counterTx)
name := "counter"
return AppTx(parent, name, data)
return commands.AppTx(c, name, data)
}

22
cmd/counter/main.go Normal file
View File

@ -0,0 +1,22 @@
package main
import (
"os"
"github.com/tendermint/basecoin/cmd/commands"
"github.com/urfave/cli"
)
func main() {
app := cli.NewApp()
app.Name = "counter"
app.Usage = "counter [command] [args...]"
app.Version = "0.1.0"
app.Commands = []cli.Command{
commands.StartCmd,
commands.TxCmd,
commands.QueryCmd,
commands.AccountCmd,
}
app.Run(os.Args)
}