Merge PR #5023: Implement Gaia Tx Decode
This commit is contained in:
parent
936cffef40
commit
ab6d0a0bae
|
@ -75,6 +75,7 @@ and tx hash will be returned for specific Tendermint errors:
|
|||
* `CodeTxInMempoolCache`
|
||||
* `CodeMempoolIsFull`
|
||||
* `CodeTxTooLarge`
|
||||
* [\#3872](https://github.com/cosmos/cosmos-sdk/issues/3872) Implement a RESTful endpoint and cli command to decode transactions.
|
||||
|
||||
### Improvements
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -339,6 +339,36 @@ paths:
|
|||
description: The tx was malformated
|
||||
500:
|
||||
description: Server internal error
|
||||
/txs/decode:
|
||||
post:
|
||||
tags:
|
||||
- Transactions
|
||||
summary: Decode a transaction from the Amino wire format
|
||||
description: Decode a transaction (signed or not) from base64-encoded Amino serialized bytes to JSON
|
||||
consumes:
|
||||
- application/json
|
||||
produces:
|
||||
- application/json
|
||||
parameters:
|
||||
- in: body
|
||||
name: tx
|
||||
description: The tx to decode
|
||||
required: true
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
tx:
|
||||
type: string
|
||||
example: SvBiXe4KPqijYZoKFFHEzJ8c2HPAfv2EFUcIhx0yPagwEhTy0vPA+GGhCEslKXa4Af0uB+mfShoMCgVzdGFrZRIDMTAwEgQQwJoM
|
||||
responses:
|
||||
200:
|
||||
description: The tx was successfully decoded
|
||||
schema:
|
||||
$ref: "#/definitions/StdTx"
|
||||
400:
|
||||
description: The tx was malformated
|
||||
500:
|
||||
description: Server internal error
|
||||
/bank/balances/{address}:
|
||||
get:
|
||||
summary: Get the account balances
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
package cli
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/tendermint/go-amino"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/client/context"
|
||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
)
|
||||
|
||||
// txDecodeRespTx implements a simple Stringer wrapper for a decoded StdTx.
|
||||
type txDecodeRespTx authtypes.StdTx
|
||||
|
||||
func (tx txDecodeRespTx) String() string {
|
||||
return tx.String()
|
||||
}
|
||||
|
||||
// GetDecodeCommand returns the decode command to take Amino-serialized bytes
|
||||
// and turn it into a JSONified transaction.
|
||||
func GetDecodeCommand(codec *amino.Codec) *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "decode [amino-byte-string]",
|
||||
Short: "Decode an amino-encoded transaction string",
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) (err error) {
|
||||
cliCtx := context.NewCLIContext().WithCodec(codec)
|
||||
|
||||
txBytes, err := base64.StdEncoding.DecodeString(args[0])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var stdTx authtypes.StdTx
|
||||
err = cliCtx.Codec.UnmarshalBinaryLengthPrefixed(txBytes, &stdTx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return cliCtx.PrintOutput(txDecodeRespTx(stdTx))
|
||||
},
|
||||
}
|
||||
|
||||
return client.PostCommands(cmd)[0]
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
package rest
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client/context"
|
||||
"github.com/cosmos/cosmos-sdk/types/rest"
|
||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
)
|
||||
|
||||
type (
|
||||
// DecodeReq defines a tx decoding request.
|
||||
DecodeReq struct {
|
||||
Tx string `json:"tx"`
|
||||
}
|
||||
|
||||
// DecodeResp defines a tx decoding response.
|
||||
DecodeResp authtypes.StdTx
|
||||
)
|
||||
|
||||
// DecodeTxRequestHandlerFn returns the decode tx REST handler. In particular,
|
||||
// it takes base64-decoded bytes, decodes it from the Amino wire protocol,
|
||||
// and responds with a json-formatted transaction.
|
||||
func DecodeTxRequestHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
var req DecodeReq
|
||||
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
err = cliCtx.Codec.UnmarshalJSON(body, &req)
|
||||
if err != nil {
|
||||
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
txBytes, err := base64.StdEncoding.DecodeString(req.Tx)
|
||||
if err != nil {
|
||||
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
var stdTx authtypes.StdTx
|
||||
err = cliCtx.Codec.UnmarshalBinaryLengthPrefixed(txBytes, &stdTx)
|
||||
if err != nil {
|
||||
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
response := DecodeResp(stdTx)
|
||||
rest.PostProcessResponse(w, cliCtx, response)
|
||||
}
|
||||
}
|
|
@ -19,4 +19,5 @@ func RegisterTxRoutes(cliCtx context.CLIContext, r *mux.Router) {
|
|||
r.HandleFunc("/txs", QueryTxsRequestHandlerFn(cliCtx)).Methods("GET")
|
||||
r.HandleFunc("/txs", BroadcastTxRequest(cliCtx)).Methods("POST")
|
||||
r.HandleFunc("/txs/encode", EncodeTxRequestHandlerFn(cliCtx)).Methods("POST")
|
||||
r.HandleFunc("/txs/decode", DecodeTxRequestHandlerFn(cliCtx)).Methods("POST")
|
||||
}
|
||||
|
|
|
@ -154,7 +154,12 @@ func PrintUnsignedStdTx(txBldr authtypes.TxBuilder, cliCtx context.CLIContext, m
|
|||
return err
|
||||
}
|
||||
|
||||
json, err := cliCtx.Codec.MarshalJSON(stdTx)
|
||||
var json []byte
|
||||
if viper.GetBool(flags.FlagIndentResponse) {
|
||||
json, err = cliCtx.Codec.MarshalJSONIndent(stdTx, "", " ")
|
||||
} else {
|
||||
json, err = cliCtx.Codec.MarshalJSON(stdTx)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue