diff --git a/docs/README.md b/docs/README.md index 219166e90..cf4494003 100644 --- a/docs/README.md +++ b/docs/README.md @@ -29,7 +29,7 @@ NOTE: This documentation is a work-in-progress! information - [auth.AnteHandler](core/app3.md#antehandler) - The `AnteHandler` verifies `StdTx`, manages accounts, and deducts fees - - [bank.CoinKeeper](core/app3.md#coin-keeper) - CoinKeeper allows for coin + - [bank.CoinKeeper](core/app3.md#coinkeeper) - CoinKeeper allows for coin transfers on an underlying AccountMapper - [App4 - ABCI](core/app4.md) - [ABCI](core/app4.md#abci) - ABCI is the interface between Tendermint @@ -45,7 +45,9 @@ NOTE: This documentation is a work-in-progress! - [App5 - Basecoin](core/app5.md) - - [Directory Structure](core/app5.md#directory-structure) - Keep your application code organized - - [Clients](core/app5.md#clients) - Hook up your app to standard CLI and REST + - [Tendermint Node](core/app5.md#tendermint-node) - Run a full + blockchain node with your app + - [Clients](core/app5.md#clients) - Hook up your app to CLI and REST interfaces for clients to use! - [Modules](modules) diff --git a/docs/core/app5.md b/docs/core/app5.md new file mode 100644 index 000000000..c6011f042 --- /dev/null +++ b/docs/core/app5.md @@ -0,0 +1,72 @@ +# App5 - Basecoin + +As we've seen, the SDK provides a flexible yet comprehensive framework for building state +machines and defining their transitions, including authenticating transactions, +executing messages, controlling access to stores, and updating the validator set. + +Until now, we have focused on building only isolated ABCI applications to +demonstrate and explain the various features and flexibilities of the SDK. +Here, we'll connect our ABCI application to Tendermint so we can run a full +blockchain node, and introduce command line and HTTP interfaces for interacting with it. + +But first, let's talk about how source code should be laid out. + +## Directory Structure + +TODO + +## Tendermint Node + +Since the Cosmos-SDK is written in Go, Cosmos-SDK applications can be compiled +with Tendermint into a single binary. Of course, like any ABCI application, they +can also run as separate processes that communicate with Tendermint via socket. + +For more details on what's involved in starting a Tendermint full node, see the +[NewNode](https://godoc.org/github.com/tendermint/tendermint/node#NewNode) +function in `github.com/tendermint/tendermint/node`. + +The `server` package in the Cosmos-SDK simplifies +connecting an application with a Tendermint node. +For instance, the following `main.go` file will give us a complete full node +using the Basecoin application we built: + +```go +//TODO imports + +func main() { + cdc := app.MakeCodec() + ctx := server.NewDefaultContext() + + rootCmd := &cobra.Command{ + Use: "basecoind", + Short: "Basecoin Daemon (server)", + PersistentPreRunE: server.PersistentPreRunEFn(ctx), + } + + server.AddCommands(ctx, cdc, rootCmd, server.DefaultAppInit, + server.ConstructAppCreator(newApp, "basecoin")) + + // prepare and add flags + rootDir := os.ExpandEnv("$HOME/.basecoind") + executor := cli.PrepareBaseCmd(rootCmd, "BC", rootDir) + executor.Execute() +} + +func newApp(logger log.Logger, db dbm.DB) abci.Application { + return app.NewBasecoinApp(logger, db) +} +``` + +Note we utilize the popular [cobra library](https://github.com/spf13/cobra) +for the CLI, in concert with the [viper library](https://github.com/spf13/library) +for managing configuration. See our [cli library](https://github.com/tendermint/tmlibs/blob/master/cli/setup.go) +for more details. + +TODO: compile and run the binary + +Options for running the `basecoind` binary are effectively the same as for `tendermint`. +See [Using Tendermint](TODO) for more details. + +## Clients + +TODO