From bfb61fb5397a69963329c2f18f561b021840e8c7 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Wed, 1 Apr 2015 13:23:20 -0700 Subject: [PATCH] Fixed RPC tests. Changed some names. --- rpc/client.go | 22 +- rpc/client_methods.go | 442 ++++++++++------------- rpc/handlers.go | 21 +- rpc/http_server.go | 19 - rpc/test/.tendermint/priv_validator.json | 2 +- rpc/test/http_rpc_test.go | 4 +- rpc/test/json_rpc_test.go | 10 +- rpc/test/test.go | 10 +- rpc/types.go | 27 ++ 9 files changed, 249 insertions(+), 308 deletions(-) create mode 100644 rpc/types.go diff --git a/rpc/client.go b/rpc/client.go index 31e3334d3..5befacfc0 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -2,13 +2,14 @@ package rpc import ( "bytes" - "encoding/json" "fmt" "github.com/tendermint/tendermint2/binary" "io/ioutil" "net/http" "net/url" "reflect" + // Uncomment to use go:generate + // _ "github.com/ebuchman/go-rpc-gen" ) type Response struct { @@ -17,7 +18,7 @@ type Response struct { Error string } -//go:generate rpc-gen -interface Client -pkg core -type *ClientHTTP,*ClientJSON -exclude pipe.go -out-pkg rpc +//go:generate go-rpc-gen -interface Client -pkg core -type *ClientHTTP,*ClientJSON -exclude pipe.go -out-pkg rpc type ClientJSON struct { addr string @@ -98,11 +99,8 @@ func (c *ClientHTTP) RequestResponse(method string, values url.Values) (*Respons return response, nil } -func (c *ClientJSON) requestResponse(s JSONRPC) ([]byte, error) { - b, err := json.Marshal(s) - if err != nil { - return nil, err - } +func (c *ClientJSON) RequestResponse(s RPCRequest) (b []byte, err error) { + b = binary.JSONBytes(s) buf := bytes.NewBuffer(b) resp, err := http.Post(c.addr, "text/json", buf) if err != nil { @@ -175,17 +173,13 @@ fmt // Template functions to be filled in /*rpc-gen:template:*ClientJSON func (c *ClientJSON) {{name}}({{args.def}}) ({{response}}) { - params, err := binaryWriter({{args.ident}}) - if err != nil{ - return nil, err - } - s := JSONRPC{ + request := RPCRequest{ JSONRPC: "2.0", Method: {{lowername}}, - Params: params, + Params: []interface{}{ {{args.ident}} }, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil{ return nil, err } diff --git a/rpc/client_methods.go b/rpc/client_methods.go index 95c0c32ab..54983c080 100644 --- a/rpc/client_methods.go +++ b/rpc/client_methods.go @@ -1,5 +1,3 @@ -// File generated by github.com/ebuchman/rpc-gen - package rpc import ( @@ -13,27 +11,27 @@ import ( ) type Client interface { - Status() (*core.ResponseStatus, error) - DumpStorage(addr []byte) (*core.ResponseDumpStorage, error) - ListAccounts() (*core.ResponseListAccounts, error) BlockchainInfo(minHeight uint) (*core.ResponseBlockchainInfo, error) - GetBlock(height uint) (*core.ResponseGetBlock, error) BroadcastTx(tx types.Tx) (*core.ResponseBroadcastTx, error) - NetInfo() (*core.ResponseNetInfo, error) Call(address []byte) (*core.ResponseCall, error) - SignTx(tx types.Tx, privAccounts []*account.PrivAccount) (*core.ResponseSignTx, error) - ListValidators() (*core.ResponseListValidators, error) + DumpStorage(addr []byte) (*core.ResponseDumpStorage, error) GenPrivAccount() (*core.ResponseGenPrivAccount, error) GetAccount(address []byte) (*core.ResponseGetAccount, error) + GetBlock(height uint) (*core.ResponseGetBlock, error) GetStorage(address []byte) (*core.ResponseGetStorage, error) + ListAccounts() (*core.ResponseListAccounts, error) + ListValidators() (*core.ResponseListValidators, error) + NetInfo() (*core.ResponseNetInfo, error) + SignTx(tx types.Tx, privAccounts []*account.PrivAccount) (*core.ResponseSignTx, error) + Status() (*core.ResponseStatus, error) } -func (c *ClientHTTP) Status() (*core.ResponseStatus, error) { - values, err := argsToURLValues(nil, nil) +func (c *ClientHTTP) BlockchainInfo(minHeight uint) (*core.ResponseBlockchainInfo, error) { + values, err := argsToURLValues([]string{"minHeight"}, minHeight) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"status", values) + resp, err := http.PostForm(c.addr+"blockchain_info", values) if err != nil { return nil, err } @@ -43,10 +41,10 @@ func (c *ClientHTTP) Status() (*core.ResponseStatus, error) { return nil, err } var response struct { - Result *core.ResponseStatus `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseBlockchainInfo `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -58,12 +56,12 @@ func (c *ClientHTTP) Status() (*core.ResponseStatus, error) { return response.Result, nil } -func (c *ClientHTTP) DumpStorage(addr []byte) (*core.ResponseDumpStorage, error) { - values, err := argsToURLValues([]string{"addr"}, addr) +func (c *ClientHTTP) BroadcastTx(tx types.Tx) (*core.ResponseBroadcastTx, error) { + values, err := argsToURLValues([]string{"tx"}, tx) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"dump_storage", values) + resp, err := http.PostForm(c.addr+"broadcast_tx", values) if err != nil { return nil, err } @@ -73,7 +71,7 @@ func (c *ClientHTTP) DumpStorage(addr []byte) (*core.ResponseDumpStorage, error) return nil, err } var response struct { - Result *core.ResponseDumpStorage `json:"result"` + Result *core.ResponseBroadcastTx `json:"result"` Error string `json:"error"` Id string `json:"id"` JSONRPC string `json:"jsonrpc"` @@ -88,12 +86,12 @@ func (c *ClientHTTP) DumpStorage(addr []byte) (*core.ResponseDumpStorage, error) return response.Result, nil } -func (c *ClientHTTP) ListAccounts() (*core.ResponseListAccounts, error) { - values, err := argsToURLValues(nil, nil) +func (c *ClientHTTP) Call(address []byte) (*core.ResponseCall, error) { + values, err := argsToURLValues([]string{"address"}, address) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"list_accounts", values) + resp, err := http.PostForm(c.addr+"call", values) if err != nil { return nil, err } @@ -103,10 +101,10 @@ func (c *ClientHTTP) ListAccounts() (*core.ResponseListAccounts, error) { return nil, err } var response struct { - Result *core.ResponseListAccounts `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseCall `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -118,12 +116,12 @@ func (c *ClientHTTP) ListAccounts() (*core.ResponseListAccounts, error) { return response.Result, nil } -func (c *ClientHTTP) BlockchainInfo(minHeight uint) (*core.ResponseBlockchainInfo, error) { - values, err := argsToURLValues([]string{"minHeight"}, minHeight) +func (c *ClientHTTP) DumpStorage(addr []byte) (*core.ResponseDumpStorage, error) { + values, err := argsToURLValues([]string{"addr"}, addr) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"blockchain_info", values) + resp, err := http.PostForm(c.addr+"dump_storage", values) if err != nil { return nil, err } @@ -133,10 +131,10 @@ func (c *ClientHTTP) BlockchainInfo(minHeight uint) (*core.ResponseBlockchainInf return nil, err } var response struct { - Result *core.ResponseBlockchainInfo `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseDumpStorage `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -148,12 +146,12 @@ func (c *ClientHTTP) BlockchainInfo(minHeight uint) (*core.ResponseBlockchainInf return response.Result, nil } -func (c *ClientHTTP) GetBlock(height uint) (*core.ResponseGetBlock, error) { - values, err := argsToURLValues([]string{"height"}, height) +func (c *ClientHTTP) GenPrivAccount() (*core.ResponseGenPrivAccount, error) { + values, err := argsToURLValues(nil, nil) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"get_block", values) + resp, err := http.PostForm(c.addr+"gen_priv_account", values) if err != nil { return nil, err } @@ -163,10 +161,10 @@ func (c *ClientHTTP) GetBlock(height uint) (*core.ResponseGetBlock, error) { return nil, err } var response struct { - Result *core.ResponseGetBlock `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseGenPrivAccount `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -178,12 +176,12 @@ func (c *ClientHTTP) GetBlock(height uint) (*core.ResponseGetBlock, error) { return response.Result, nil } -func (c *ClientHTTP) BroadcastTx(tx types.Tx) (*core.ResponseBroadcastTx, error) { - values, err := argsToURLValues([]string{"tx"}, tx) +func (c *ClientHTTP) GetAccount(address []byte) (*core.ResponseGetAccount, error) { + values, err := argsToURLValues([]string{"address"}, address) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"broadcast_tx", values) + resp, err := http.PostForm(c.addr+"get_account", values) if err != nil { return nil, err } @@ -193,10 +191,10 @@ func (c *ClientHTTP) BroadcastTx(tx types.Tx) (*core.ResponseBroadcastTx, error) return nil, err } var response struct { - Result *core.ResponseBroadcastTx `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseGetAccount `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -208,12 +206,12 @@ func (c *ClientHTTP) BroadcastTx(tx types.Tx) (*core.ResponseBroadcastTx, error) return response.Result, nil } -func (c *ClientHTTP) NetInfo() (*core.ResponseNetInfo, error) { - values, err := argsToURLValues(nil, nil) +func (c *ClientHTTP) GetBlock(height uint) (*core.ResponseGetBlock, error) { + values, err := argsToURLValues([]string{"height"}, height) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"net_info", values) + resp, err := http.PostForm(c.addr+"get_block", values) if err != nil { return nil, err } @@ -223,10 +221,10 @@ func (c *ClientHTTP) NetInfo() (*core.ResponseNetInfo, error) { return nil, err } var response struct { - Result *core.ResponseNetInfo `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseGetBlock `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -238,12 +236,12 @@ func (c *ClientHTTP) NetInfo() (*core.ResponseNetInfo, error) { return response.Result, nil } -func (c *ClientHTTP) Call(address []byte) (*core.ResponseCall, error) { +func (c *ClientHTTP) GetStorage(address []byte) (*core.ResponseGetStorage, error) { values, err := argsToURLValues([]string{"address"}, address) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"call", values) + resp, err := http.PostForm(c.addr+"get_storage", values) if err != nil { return nil, err } @@ -253,10 +251,10 @@ func (c *ClientHTTP) Call(address []byte) (*core.ResponseCall, error) { return nil, err } var response struct { - Result *core.ResponseCall `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseGetStorage `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -268,12 +266,12 @@ func (c *ClientHTTP) Call(address []byte) (*core.ResponseCall, error) { return response.Result, nil } -func (c *ClientHTTP) SignTx(tx types.Tx, privAccounts []*account.PrivAccount) (*core.ResponseSignTx, error) { - values, err := argsToURLValues([]string{"tx", "privAccounts"}, tx, privAccounts) +func (c *ClientHTTP) ListAccounts() (*core.ResponseListAccounts, error) { + values, err := argsToURLValues(nil, nil) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"sign_tx", values) + resp, err := http.PostForm(c.addr+"list_accounts", values) if err != nil { return nil, err } @@ -283,10 +281,10 @@ func (c *ClientHTTP) SignTx(tx types.Tx, privAccounts []*account.PrivAccount) (* return nil, err } var response struct { - Result *core.ResponseSignTx `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseListAccounts `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -328,12 +326,12 @@ func (c *ClientHTTP) ListValidators() (*core.ResponseListValidators, error) { return response.Result, nil } -func (c *ClientHTTP) GenPrivAccount() (*core.ResponseGenPrivAccount, error) { +func (c *ClientHTTP) NetInfo() (*core.ResponseNetInfo, error) { values, err := argsToURLValues(nil, nil) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"gen_priv_account", values) + resp, err := http.PostForm(c.addr+"net_info", values) if err != nil { return nil, err } @@ -343,10 +341,10 @@ func (c *ClientHTTP) GenPrivAccount() (*core.ResponseGenPrivAccount, error) { return nil, err } var response struct { - Result *core.ResponseGenPrivAccount `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseNetInfo `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -358,12 +356,12 @@ func (c *ClientHTTP) GenPrivAccount() (*core.ResponseGenPrivAccount, error) { return response.Result, nil } -func (c *ClientHTTP) GetAccount(address []byte) (*core.ResponseGetAccount, error) { - values, err := argsToURLValues([]string{"address"}, address) +func (c *ClientHTTP) SignTx(tx types.Tx, privAccounts []*account.PrivAccount) (*core.ResponseSignTx, error) { + values, err := argsToURLValues([]string{"tx", "privAccounts"}, tx, privAccounts) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"get_account", values) + resp, err := http.PostForm(c.addr+"sign_tx", values) if err != nil { return nil, err } @@ -373,10 +371,10 @@ func (c *ClientHTTP) GetAccount(address []byte) (*core.ResponseGetAccount, error return nil, err } var response struct { - Result *core.ResponseGetAccount `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseSignTx `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -388,12 +386,12 @@ func (c *ClientHTTP) GetAccount(address []byte) (*core.ResponseGetAccount, error return response.Result, nil } -func (c *ClientHTTP) GetStorage(address []byte) (*core.ResponseGetStorage, error) { - values, err := argsToURLValues([]string{"address"}, address) +func (c *ClientHTTP) Status() (*core.ResponseStatus, error) { + values, err := argsToURLValues(nil, nil) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"get_storage", values) + resp, err := http.PostForm(c.addr+"status", values) if err != nil { return nil, err } @@ -403,10 +401,10 @@ func (c *ClientHTTP) GetStorage(address []byte) (*core.ResponseGetStorage, error return nil, err } var response struct { - Result *core.ResponseGetStorage `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseStatus `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -418,26 +416,22 @@ func (c *ClientHTTP) GetStorage(address []byte) (*core.ResponseGetStorage, error return response.Result, nil } -func (c *ClientJSON) Status() (*core.ResponseStatus, error) { - params, err := binaryWriter(nil) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) BlockchainInfo(minHeight uint) (*core.ResponseBlockchainInfo, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "status", - Params: params, + Method: "blockchain_info", + Params: []interface{}{minHeight}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseStatus `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseBlockchainInfo `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -449,23 +443,19 @@ func (c *ClientJSON) Status() (*core.ResponseStatus, error) { return response.Result, nil } -func (c *ClientJSON) DumpStorage(addr []byte) (*core.ResponseDumpStorage, error) { - params, err := binaryWriter(addr) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) BroadcastTx(tx types.Tx) (*core.ResponseBroadcastTx, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "dump_storage", - Params: params, + Method: "broadcast_tx", + Params: []interface{}{tx}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseDumpStorage `json:"result"` + Result *core.ResponseBroadcastTx `json:"result"` Error string `json:"error"` Id string `json:"id"` JSONRPC string `json:"jsonrpc"` @@ -480,26 +470,22 @@ func (c *ClientJSON) DumpStorage(addr []byte) (*core.ResponseDumpStorage, error) return response.Result, nil } -func (c *ClientJSON) ListAccounts() (*core.ResponseListAccounts, error) { - params, err := binaryWriter(nil) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) Call(address []byte) (*core.ResponseCall, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "list_accounts", - Params: params, + Method: "call", + Params: []interface{}{address}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseListAccounts `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseCall `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -511,26 +497,22 @@ func (c *ClientJSON) ListAccounts() (*core.ResponseListAccounts, error) { return response.Result, nil } -func (c *ClientJSON) BlockchainInfo(minHeight uint) (*core.ResponseBlockchainInfo, error) { - params, err := binaryWriter(minHeight) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) DumpStorage(addr []byte) (*core.ResponseDumpStorage, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "blockchain_info", - Params: params, + Method: "dump_storage", + Params: []interface{}{addr}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseBlockchainInfo `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseDumpStorage `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -542,26 +524,22 @@ func (c *ClientJSON) BlockchainInfo(minHeight uint) (*core.ResponseBlockchainInf return response.Result, nil } -func (c *ClientJSON) GetBlock(height uint) (*core.ResponseGetBlock, error) { - params, err := binaryWriter(height) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) GenPrivAccount() (*core.ResponseGenPrivAccount, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "get_block", - Params: params, + Method: "gen_priv_account", + Params: []interface{}{nil}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseGetBlock `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseGenPrivAccount `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -573,26 +551,22 @@ func (c *ClientJSON) GetBlock(height uint) (*core.ResponseGetBlock, error) { return response.Result, nil } -func (c *ClientJSON) BroadcastTx(tx types.Tx) (*core.ResponseBroadcastTx, error) { - params, err := binaryWriter(tx) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) GetAccount(address []byte) (*core.ResponseGetAccount, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "broadcast_tx", - Params: params, + Method: "get_account", + Params: []interface{}{address}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseBroadcastTx `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseGetAccount `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -604,26 +578,22 @@ func (c *ClientJSON) BroadcastTx(tx types.Tx) (*core.ResponseBroadcastTx, error) return response.Result, nil } -func (c *ClientJSON) NetInfo() (*core.ResponseNetInfo, error) { - params, err := binaryWriter(nil) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) GetBlock(height uint) (*core.ResponseGetBlock, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "net_info", - Params: params, + Method: "get_block", + Params: []interface{}{height}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseNetInfo `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseGetBlock `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -635,26 +605,22 @@ func (c *ClientJSON) NetInfo() (*core.ResponseNetInfo, error) { return response.Result, nil } -func (c *ClientJSON) Call(address []byte) (*core.ResponseCall, error) { - params, err := binaryWriter(address) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) GetStorage(address []byte) (*core.ResponseGetStorage, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "call", - Params: params, + Method: "get_storage", + Params: []interface{}{address}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseCall `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseGetStorage `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -666,26 +632,22 @@ func (c *ClientJSON) Call(address []byte) (*core.ResponseCall, error) { return response.Result, nil } -func (c *ClientJSON) SignTx(tx types.Tx, privAccounts []*account.PrivAccount) (*core.ResponseSignTx, error) { - params, err := binaryWriter(tx, privAccounts) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) ListAccounts() (*core.ResponseListAccounts, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "sign_tx", - Params: params, + Method: "list_accounts", + Params: []interface{}{nil}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseSignTx `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseListAccounts `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -698,17 +660,13 @@ func (c *ClientJSON) SignTx(tx types.Tx, privAccounts []*account.PrivAccount) (* } func (c *ClientJSON) ListValidators() (*core.ResponseListValidators, error) { - params, err := binaryWriter(nil) - if err != nil { - return nil, err - } - s := JSONRPC{ + request := RPCRequest{ JSONRPC: "2.0", Method: "list_validators", - Params: params, + Params: []interface{}{nil}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } @@ -728,26 +686,22 @@ func (c *ClientJSON) ListValidators() (*core.ResponseListValidators, error) { return response.Result, nil } -func (c *ClientJSON) GenPrivAccount() (*core.ResponseGenPrivAccount, error) { - params, err := binaryWriter(nil) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) NetInfo() (*core.ResponseNetInfo, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "gen_priv_account", - Params: params, + Method: "net_info", + Params: []interface{}{nil}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseGenPrivAccount `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseNetInfo `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -759,26 +713,22 @@ func (c *ClientJSON) GenPrivAccount() (*core.ResponseGenPrivAccount, error) { return response.Result, nil } -func (c *ClientJSON) GetAccount(address []byte) (*core.ResponseGetAccount, error) { - params, err := binaryWriter(address) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) SignTx(tx types.Tx, privAccounts []*account.PrivAccount) (*core.ResponseSignTx, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "get_account", - Params: params, + Method: "sign_tx", + Params: []interface{}{tx, privAccounts}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseGetAccount `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseSignTx `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -790,26 +740,22 @@ func (c *ClientJSON) GetAccount(address []byte) (*core.ResponseGetAccount, error return response.Result, nil } -func (c *ClientJSON) GetStorage(address []byte) (*core.ResponseGetStorage, error) { - params, err := binaryWriter(address) - if err != nil { - return nil, err - } - s := JSONRPC{ +func (c *ClientJSON) Status() (*core.ResponseStatus, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "get_storage", - Params: params, + Method: "status", + Params: []interface{}{nil}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } var response struct { - Result *core.ResponseGetStorage `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` + Result *core.ResponseStatus `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { diff --git a/rpc/handlers.go b/rpc/handlers.go index 1cf940803..636d2eed3 100644 --- a/rpc/handlers.go +++ b/rpc/handlers.go @@ -84,31 +84,24 @@ func funcReturnTypes(f interface{}) []reflect.Type { //----------------------------------------------------------------------------- // rpc.json -type JSONRPC struct { - JSONRPC string `json:"jsonrpc"` - Method string `json:"method"` - Params []interface{} `json:"params"` - Id int `json:"id"` -} - // jsonrpc calls grab the given method's function info and runs reflect.Call func JSONRPCHandler(w http.ResponseWriter, r *http.Request) { b, _ := ioutil.ReadAll(r.Body) - var jrpc JSONRPC - err := json.Unmarshal(b, &jrpc) + var request RPCRequest + err := json.Unmarshal(b, &request) if err != nil { WriteRPCResponse(w, NewRPCResponse(nil, err.Error())) return } - funcInfo := funcMap[jrpc.Method] - args, err := jsonParamsToArgs(funcInfo, jrpc.Params) + funcInfo := funcMap[request.Method] + args, err := jsonParamsToArgs(funcInfo, request.Params) if err != nil { WriteRPCResponse(w, NewRPCResponse(nil, err.Error())) return } returns := funcInfo.f.Call(args) - response, err := returnsToResponse(returns) + response, err := unreflectResponse(returns) if err != nil { WriteRPCResponse(w, NewRPCResponse(nil, err.Error())) return @@ -154,7 +147,7 @@ func toHttpHandler(funcInfo *FuncWrapper) func(http.ResponseWriter, *http.Reques return } returns := funcInfo.f.Call(args) - response, err := returnsToResponse(returns) + response, err := unreflectResponse(returns) if err != nil { WriteRPCResponse(w, NewRPCResponse(nil, err.Error())) return @@ -197,7 +190,7 @@ func _jsonStringToArg(ty reflect.Type, arg string) (reflect.Value, error) { //----------------------------------------------------------------------------- // returns is Response struct and error. If error is not nil, return it -func returnsToResponse(returns []reflect.Value) (interface{}, error) { +func unreflectResponse(returns []reflect.Value) (interface{}, error) { errV := returns[1] if errV.Interface() != nil { return nil, fmt.Errorf("%v", errV.Interface()) diff --git a/rpc/http_server.go b/rpc/http_server.go index 4bf345ba9..3999cf042 100644 --- a/rpc/http_server.go +++ b/rpc/http_server.go @@ -23,25 +23,6 @@ func StartHTTPServer() { }() } -type RPCResponse struct { - Result interface{} `json:"result"` - Error string `json:"error"` - Id string `json:"id"` - JSONRPC string `json:"jsonrpc"` -} - -func NewRPCResponse(res interface{}, err string) RPCResponse { - if res == nil { - res = struct{}{} - } - return RPCResponse{ - Result: res, - Error: err, - Id: "", - JSONRPC: "2.0", - } -} - func WriteRPCResponse(w http.ResponseWriter, res RPCResponse) { buf, n, err := new(bytes.Buffer), new(int64), new(error) binary.WriteJSON(res, buf, n, err) diff --git a/rpc/test/.tendermint/priv_validator.json b/rpc/test/.tendermint/priv_validator.json index b05b43dd3..5429f5009 100755 --- a/rpc/test/.tendermint/priv_validator.json +++ b/rpc/test/.tendermint/priv_validator.json @@ -1 +1 @@ -{"Address":"D7DFF9806078899C8DA3FE3633CC0BF3C6C2B1BB","PubKey":[1,"2239C21C81EA7173A6C489145490C015E05D4B97448933B708A7EC5B7B4921E3"],"PrivKey":[1,"FDE3BD94CB327D19464027BA668194C5EFA46AE83E8419D7542CFF41F00C81972239C21C81EA7173A6C489145490C015E05D4B97448933B708A7EC5B7B4921E3"]} +{"Address":"D7DFF9806078899C8DA3FE3633CC0BF3C6C2B1BB","PubKey":[1,"2239C21C81EA7173A6C489145490C015E05D4B97448933B708A7EC5B7B4921E3"],"PrivKey":[1,"FDE3BD94CB327D19464027BA668194C5EFA46AE83E8419D7542CFF41F00C81972239C21C81EA7173A6C489145490C015E05D4B97448933B708A7EC5B7B4921E3"],"LastHeight":2,"LastRound":0,"LastStep":2} \ No newline at end of file diff --git a/rpc/test/http_rpc_test.go b/rpc/test/http_rpc_test.go index a98abba3c..e425f5a2a 100644 --- a/rpc/test/http_rpc_test.go +++ b/rpc/test/http_rpc_test.go @@ -30,7 +30,7 @@ func TestHTTPStatus(t *testing.T) { Result core.ResponseStatus `json:"result"` Error string `json:"error"` Id string `json:"id"` - JSONRPC int `json:"jsonrpc"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -58,7 +58,7 @@ func TestHTTPGenPriv(t *testing.T) { Result core.ResponseGenPrivAccount `json:"result"` Error string `json:"error"` Id string `json:"id"` - JSONRPC int `json:"jsonrpc"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { diff --git a/rpc/test/json_rpc_test.go b/rpc/test/json_rpc_test.go index 9fe28a441..b059e111e 100644 --- a/rpc/test/json_rpc_test.go +++ b/rpc/test/json_rpc_test.go @@ -18,7 +18,7 @@ import ( ) func TestJSONStatus(t *testing.T) { - s := rpc.JSONRPC{ + s := rpc.RPCRequest{ JSONRPC: "2.0", Method: "status", Params: []interface{}{}, @@ -43,7 +43,7 @@ func TestJSONStatus(t *testing.T) { Result core.ResponseStatus `json:"result"` Error string `json:"error"` Id string `json:"id"` - JSONRPC int `json:"jsonrpc"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -56,7 +56,7 @@ func TestJSONStatus(t *testing.T) { } func TestJSONGenPriv(t *testing.T) { - s := rpc.JSONRPC{ + s := rpc.RPCRequest{ JSONRPC: "2.0", Method: "unsafe/gen_priv_account", Params: []interface{}{}, @@ -83,7 +83,7 @@ func TestJSONGenPriv(t *testing.T) { Result core.ResponseGenPrivAccount `json:"result"` Error string `json:"error"` Id string `json:"id"` - JSONRPC int `json:"jsonrpc"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -146,7 +146,7 @@ func TestJSONBroadcastTx(t *testing.T) { Result core.ResponseBroadcastTx `json:"result"` Error string `json:"error"` Id string `json:"id"` - JSONRPC int `json:"jsonrpc"` + JSONRPC string `json:"jsonrpc"` } requestResponse(t, "broadcast_tx", url.Values{"tx": {string(b)}}, &response) if response.Error != "" { diff --git a/rpc/test/test.go b/rpc/test/test.go index 3921f8ec6..0b2035029 100644 --- a/rpc/test/test.go +++ b/rpc/test/test.go @@ -123,7 +123,7 @@ func getAccount(t *testing.T, typ string, addr []byte) *account.Account { Result core.ResponseGetAccount `json:"result"` Error string `json:"error"` Id string `json:"id"` - JSONRPC int `json:"jsonrpc"` + JSONRPC string `json:"jsonrpc"` } binary.ReadJSON(&response, body, &err) if err != nil { @@ -235,7 +235,7 @@ func signTx(t *testing.T, typ string, fromAddr, toAddr, data []byte, key [64]byt Result core.ResponseSignTx `json:"result"` Error string `json:"error"` Id string `json:"id"` - JSONRPC int `json:"jsonrpc"` + JSONRPC string `json:"jsonrpc"` } requestResponse(t, "unsafe/sign_tx", url.Values{"tx": {string(b)}, "privAccounts": {string(w.Bytes())}}, &response) if response.Error != "" { @@ -260,7 +260,7 @@ func broadcastTx(t *testing.T, typ string, fromAddr, toAddr, data []byte, key [6 Result core.ResponseBroadcastTx `json:"result"` Error string `json:"error"` Id string `json:"id"` - JSONRPC int `json:"jsonrpc"` + JSONRPC string `json:"jsonrpc"` } requestResponse(t, "broadcast_tx", url.Values{"tx": {string(b)}}, &response) if response.Error != "" { @@ -275,7 +275,7 @@ func dumpStorage(t *testing.T, addr []byte) core.ResponseDumpStorage { Result core.ResponseDumpStorage `json:"result"` Error string `json:"error"` Id string `json:"id"` - JSONRPC int `json:"jsonrpc"` + JSONRPC string `json:"jsonrpc"` } requestResponse(t, "dump_storage", url.Values{"address": {addrString}}, &response) if response.Error != "" { @@ -291,7 +291,7 @@ func getStorage(t *testing.T, addr, slot []byte) []byte { Result core.ResponseGetStorage `json:"result"` Error string `json:"error"` Id string `json:"id"` - JSONRPC int `json:"jsonrpc"` + JSONRPC string `json:"jsonrpc"` } requestResponse(t, "get_storage", url.Values{"address": {addrString}, "storage": {slotString}}, &response) if response.Error != "" { diff --git a/rpc/types.go b/rpc/types.go new file mode 100644 index 000000000..b878a05a1 --- /dev/null +++ b/rpc/types.go @@ -0,0 +1,27 @@ +package rpc + +type RPCRequest struct { + JSONRPC string `json:"jsonrpc"` + Method string `json:"method"` + Params []interface{} `json:"params"` + Id int `json:"id"` +} + +type RPCResponse struct { + Result interface{} `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` +} + +func NewRPCResponse(res interface{}, err string) RPCResponse { + if res == nil { + res = struct{}{} + } + return RPCResponse{ + Result: res, + Error: err, + Id: "", + JSONRPC: "2.0", + } +}