1+ package rest
2+
3+ import (
4+ "github.com/gorilla/mux"
5+ "github.com/tendermint/go-crypto/keys"
6+ "net/http"
7+ sdk "github.com/cosmos/cosmos-sdk"
8+ "encoding/hex"
9+ "github.com/spf13/viper"
10+ "github.com/cosmos/cosmos-sdk/client/commands"
11+ "github.com/pkg/errors"
12+ cmn "github.com/tendermint/tmlibs/common"
13+ "github.com/cosmos/cosmos-sdk/client"
14+ "github.com/cosmos/cosmos-sdk/client/commands/query"
15+ "github.com/tendermint/tendermint/types"
16+ "github.com/tendermint/go-wire"
17+ "io"
18+ )
19+
20+
21+ type ServiceByteTx struct {
22+ manager keys.Manager
23+ }
24+
25+ type RequestTx struct {
26+ Tx sdk.Tx `json:"tx" validate:"required"`
27+ }
28+
29+ func NewServiceByteTx (manager keys.Manager ) * ServiceByteTx {
30+ return & ServiceByteTx {
31+ manager : manager , // XXX keycmd.GetKeyManager()
32+ }
33+ }
34+
35+ func (s * ServiceByteTx ) RegisterByteTx (r * mux.Router ) error {
36+ r .HandleFunc ("/byteTx" , s .ByteTx ).Methods ("POST" )
37+ return nil
38+ }
39+
40+
41+ func (s * ServiceByteTx ) RegisterqueryTx (r * mux.Router ) error {
42+ r .HandleFunc ("/tx/{hash}" , s .queryTx ).Methods ("GET" )
43+ return nil
44+ }
45+
46+ func (s * ServiceByteTx ) ByteTx (w http.ResponseWriter , r * http.Request ) {
47+ req := new (RequestTx )
48+ if err := sdk .ParseRequestAndValidateJSON (r , req ); err != nil {
49+ sdk .WriteError (w , err )
50+ return
51+ }
52+
53+ tx := req .Tx
54+
55+ if sign , ok := tx .Unwrap ().(keys.Signable ); ok {
56+ sdk .WriteSuccess (w , hex .EncodeToString (sign .SignBytes ()))
57+ return
58+ }
59+ sdk .WriteSuccess (w , "" )
60+ }
61+
62+ func (s * ServiceByteTx ) queryTx (w http.ResponseWriter , r * http.Request ){
63+ args := mux .Vars (r )
64+ hash := args ["hash" ]
65+
66+ if hash == "" {
67+ sdk .WriteError (w , errors .Errorf ("[%s] argument must be non-empty " , "hash" ))
68+ return
69+ }
70+ // with tx, we always just parse key as hex and use to lookup
71+ hashByte , err := hex .DecodeString (cmn .StripHex (hash ))
72+
73+ // get the proof -> this will be used by all prover commands
74+ node := commands .GetNode ()
75+ prove := ! viper .GetBool (commands .FlagTrustNode )
76+ res , err := node .Tx (hashByte , prove )
77+ if err != nil {
78+ sdk .WriteError (w , err )
79+ return
80+ }
81+
82+ // no checks if we don't get a proof
83+ if ! prove {
84+ sdk .WriteSuccess (w ,showTx (w ,res .Height , res .Tx ))
85+ return
86+ }
87+
88+ cert , err := commands .GetCertifier ()
89+ if err != nil {
90+ sdk .WriteError (w , err )
91+ return
92+ }
93+
94+ check , err := client .GetCertifiedCommit (res .Height , node , cert )
95+ if err != nil {
96+ sdk .WriteError (w , err )
97+ return
98+ }
99+ err = res .Proof .Validate (check .Header .DataHash )
100+ if err != nil {
101+ sdk .WriteError (w , err )
102+ return
103+ }
104+
105+ // note that we return res.Proof.Data, not res.Tx,
106+ // as res.Proof.Validate only verifies res.Proof.Data
107+ sdk .WriteSuccess (w ,showTx (w ,res .Height , res .Proof .Data ))
108+ }
109+
110+ // showTx parses anything that was previously registered as sdk.Tx
111+ func showTx (w io.Writer ,h int64 , tx types.Tx ) error {
112+ var info sdk.Tx
113+ err := wire .ReadBinaryBytes (tx , & info )
114+ if err != nil {
115+ return err
116+ }
117+ return query .FoutputProof (w ,info ,h )
118+ }
0 commit comments