Merge pull request #226 from tendermint/rest-/query/nonce

Started implementing nonce REST query handler
This commit is contained in:
Ethan Frey 2017-08-18 23:33:05 +01:00 committed by GitHub
commit f2863aa05f
2 changed files with 76 additions and 0 deletions

View File

@ -13,6 +13,7 @@ import (
"github.com/tendermint/basecoin/client/commands"
rest "github.com/tendermint/basecoin/client/rest"
coinrest "github.com/tendermint/basecoin/modules/coin/rest"
noncerest "github.com/tendermint/basecoin/modules/nonce/rest"
rolerest "github.com/tendermint/basecoin/modules/roles/rest"
"github.com/tendermint/tmlibs/cli"
)
@ -58,6 +59,9 @@ func serve(cmd *cobra.Command, args []string) error {
rest.RegisterSignTx,
// Basecoin post transaction handler
rest.RegisterPostTx,
// Nonce query handler
noncerest.RegisterQueryNonce,
}
for _, routeRegistrar := range routeRegistrars {

View File

@ -0,0 +1,72 @@
package rest
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
"github.com/spf13/viper"
"github.com/tendermint/basecoin"
"github.com/tendermint/basecoin/client/commands"
"github.com/tendermint/basecoin/client/commands/query"
"github.com/tendermint/basecoin/errors"
"github.com/tendermint/basecoin/modules/coin"
"github.com/tendermint/basecoin/modules/nonce"
"github.com/tendermint/basecoin/stack"
wire "github.com/tendermint/go-wire"
lightclient "github.com/tendermint/light-client"
"github.com/tendermint/tmlibs/common"
)
// doQueryNonce is the HTTP handlerfunc to query a nonce
func doQueryNonce(w http.ResponseWriter, r *http.Request) {
args := mux.Vars(r)
signature := args["signature"]
actor, err := commands.ParseActor(signature)
if err != nil {
common.WriteError(w, err)
return
}
actor = coin.ChainAddr(actor)
key := nonce.GetSeqKey([]basecoin.Actor{actor})
key = stack.PrefixedKey(nonce.NameNonce, key)
prove := !viper.GetBool(commands.FlagTrustNode)
// query sequence number
data, height, err := query.Get(key, prove)
if lightclient.IsNoDataErr(err) {
err = fmt.Errorf("nonce empty for address: %q", signature)
common.WriteError(w, err)
return
} else if err != nil {
common.WriteError(w, err)
return
}
// unmarshal sequence number
var seq uint32
err = wire.ReadBinaryBytes(data, &seq)
if err != nil {
msg := fmt.Sprintf("Error reading sequence for %X", key)
common.WriteError(w, errors.ErrInternal(msg))
return
}
// write result to client
if err := query.FoutputProof(w, seq, height); err != nil {
common.WriteError(w, err)
}
}
// mux.Router registrars
// RegisterQueryNonce is a mux.Router handler that exposes GET
// method access on route /query/nonce/{signature} to query nonces
func RegisterQueryNonce(r *mux.Router) error {
r.HandleFunc("/query/nonce/{signature}", doQueryNonce).Methods("GET")
return nil
}
// End of mux.Router registrars