Reuse Tendermint client instance (closes #671)

This commit is contained in:
Christopher Goes 2018-04-03 14:11:49 +02:00
parent 3404ecca79
commit 12f4a21d03
No known key found for this signature in database
GPG Key ID: E828D98232D328D3
6 changed files with 27 additions and 9 deletions

View File

@ -3,17 +3,25 @@ package context
import (
"github.com/spf13/viper"
rpcclient "github.com/tendermint/tendermint/rpc/client"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/core"
)
func NewCoreContextFromViper() core.CoreContext {
nodeURI := viper.GetString(client.FlagNode)
var rpc rpcclient.Client
if nodeURI != "" {
rpc = rpcclient.NewHTTP(nodeURI, "/websocket")
}
return core.CoreContext{
ChainID: viper.GetString(client.FlagChainID),
Height: viper.GetInt64(client.FlagHeight),
TrustNode: viper.GetBool(client.FlagTrustNode),
NodeURI: viper.GetString(client.FlagNode),
FromAddressName: viper.GetString(client.FlagName),
NodeURI: nodeURI,
Sequence: viper.GetInt64(client.FlagSequence),
Client: rpc,
}
}

View File

@ -1,5 +1,9 @@
package core
import (
rpcclient "github.com/tendermint/tendermint/rpc/client"
)
type CoreContext struct {
ChainID string
Height int64
@ -7,6 +11,7 @@ type CoreContext struct {
NodeURI string
FromAddressName string
Sequence int64
Client rpcclient.Client
}
func (c CoreContext) WithChainID(chainID string) CoreContext {
@ -38,3 +43,8 @@ func (c CoreContext) WithSequence(sequence int64) CoreContext {
c.Sequence = sequence
return c
}
func (c CoreContext) WithClient(client rpcclient.Client) CoreContext {
c.Client = client
return c
}

View File

@ -146,8 +146,8 @@ func (ctx CoreContext) GetPassphraseFromStdin(name string) (pass string, err err
// GetNode prepares a simple rpc.Client
func (ctx CoreContext) GetNode() (rpcclient.Client, error) {
if ctx.NodeURI == "" {
if ctx.Client == nil {
return nil, errors.New("Must define node URI")
}
return rpcclient.NewHTTP(ctx.NodeURI, "/websocket"), nil
return ctx.Client, nil
}

View File

@ -21,6 +21,7 @@ type commander struct {
func QueryAccountRequestHandler(storeName string, cdc *wire.Codec, decoder sdk.AccountDecoder) func(http.ResponseWriter, *http.Request) {
c := commander{storeName, cdc, decoder}
ctx := context.NewCoreContextFromViper()
return func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
addr := vars["address"]
@ -33,7 +34,7 @@ func QueryAccountRequestHandler(storeName string, cdc *wire.Codec, decoder sdk.A
}
key := sdk.Address(bz)
res, err := context.NewCoreContextFromViper().Query(key, c.storeName)
res, err := ctx.Query(key, c.storeName)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(fmt.Sprintf("Could't query account. Error: %s", err.Error())))

View File

@ -28,6 +28,7 @@ type sendBody struct {
// SendRequestHandler - http request handler to send coins to a address
func SendRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.ResponseWriter, *http.Request) {
c := commands.Commander{cdc}
ctx := context.NewCoreContextFromViper()
return func(w http.ResponseWriter, r *http.Request) {
// collect data
vars := mux.Vars(r)
@ -71,8 +72,7 @@ func SendRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.ResponseWrit
}
// sign
ctx := context.NewCoreContextFromViper()
ctx.Sequence = m.Sequence
ctx = ctx.WithSequence(m.Sequence)
txBytes, err := ctx.SignAndBuild(m.LocalAccountName, m.Password, msg, c.Cdc)
if err != nil {
w.WriteHeader(http.StatusUnauthorized)

View File

@ -29,6 +29,7 @@ type transferBody struct {
// on a different chain via IBC
func TransferRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.ResponseWriter, *http.Request) {
c := commands.Commander{cdc}
ctx := context.NewCoreContextFromViper()
return func(w http.ResponseWriter, r *http.Request) {
// collect data
vars := mux.Vars(r)
@ -69,9 +70,7 @@ func TransferRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.Response
msg := ibc.IBCTransferMsg{packet}
// sign
// XXX: OMG
ctx := context.NewCoreContextFromViper()
ctx.Sequence = m.Sequence
ctx = ctx.WithSequence(m.Sequence)
txBytes, err := ctx.SignAndBuild(m.LocalAccountName, m.Password, msg, c.Cdc)
if err != nil {
w.WriteHeader(http.StatusUnauthorized)