From 12f4a21d035c7ea69dcdb69defcabd50a2a7db55 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 3 Apr 2018 14:11:49 +0200 Subject: [PATCH] Reuse Tendermint client instance (closes #671) --- client/context/viper.go | 10 +++++++++- client/core/context.go | 10 ++++++++++ client/core/core.go | 4 ++-- x/auth/rest/query.go | 3 ++- x/bank/rest/sendtx.go | 4 ++-- x/ibc/rest/transfer.go | 5 ++--- 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/client/context/viper.go b/client/context/viper.go index 75441bc257..750a37c616 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -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, } } diff --git a/client/core/context.go b/client/core/context.go index 7134a5f03e..3d7f400a8e 100644 --- a/client/core/context.go +++ b/client/core/context.go @@ -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 +} diff --git a/client/core/core.go b/client/core/core.go index e8b8c19fb0..a5c7b340c7 100644 --- a/client/core/core.go +++ b/client/core/core.go @@ -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 } diff --git a/x/auth/rest/query.go b/x/auth/rest/query.go index 8fce027f20..5430a77ff2 100644 --- a/x/auth/rest/query.go +++ b/x/auth/rest/query.go @@ -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()))) diff --git a/x/bank/rest/sendtx.go b/x/bank/rest/sendtx.go index 9b12fdd8ff..b1f8516f33 100644 --- a/x/bank/rest/sendtx.go +++ b/x/bank/rest/sendtx.go @@ -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) diff --git a/x/ibc/rest/transfer.go b/x/ibc/rest/transfer.go index c26f9b53a2..fceac55677 100644 --- a/x/ibc/rest/transfer.go +++ b/x/ibc/rest/transfer.go @@ -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)