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 | 894 +++++++++++------------ 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, 475 insertions(+), 534 deletions(-) create mode 100644 rpc/types.go diff --git a/rpc/client.go b/rpc/client.go index 31e3334d..5befacfc 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 95c0c32a..54983c08 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,109 +11,19 @@ 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) -} - -func (c *ClientHTTP) Status() (*core.ResponseStatus, error) { - values, err := argsToURLValues(nil, nil) - if err != nil { - return nil, err - } - resp, err := http.PostForm(c.addr+"status", values) - if err != nil { - return nil, err - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - 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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.Error) - } - return response.Result, nil -} - -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+"dump_storage", values) - if err != nil { - return nil, err - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - var response struct { - 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 { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.Error) - } - return response.Result, nil -} - -func (c *ClientHTTP) ListAccounts() (*core.ResponseListAccounts, error) { - values, err := argsToURLValues(nil, nil) - if err != nil { - return nil, err - } - resp, err := http.PostForm(c.addr+"list_accounts", values) - if err != nil { - return nil, err - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - 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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.Error) - } - return response.Result, nil + 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) BlockchainInfo(minHeight uint) (*core.ResponseBlockchainInfo, error) { @@ -148,36 +56,6 @@ 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) - if err != nil { - return nil, err - } - resp, err := http.PostForm(c.addr+"get_block", values) - if err != nil { - return nil, err - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - 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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.Error) - } - return response.Result, nil -} - func (c *ClientHTTP) BroadcastTx(tx types.Tx) (*core.ResponseBroadcastTx, error) { values, err := argsToURLValues([]string{"tx"}, tx) if err != nil { @@ -208,36 +86,6 @@ 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) - if err != nil { - return nil, err - } - resp, err := http.PostForm(c.addr+"net_info", values) - if err != nil { - return nil, err - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - 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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.Error) - } - return response.Result, nil -} - func (c *ClientHTTP) Call(address []byte) (*core.ResponseCall, error) { values, err := argsToURLValues([]string{"address"}, address) if err != nil { @@ -268,12 +116,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) DumpStorage(addr []byte) (*core.ResponseDumpStorage, error) { + values, err := argsToURLValues([]string{"addr"}, addr) if err != nil { return nil, err } - resp, err := http.PostForm(c.addr+"sign_tx", values) + resp, err := http.PostForm(c.addr+"dump_storage", values) if err != nil { return nil, err } @@ -283,40 +131,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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.Error) - } - return response.Result, nil -} - -func (c *ClientHTTP) ListValidators() (*core.ResponseListValidators, error) { - values, err := argsToURLValues(nil, nil) - if err != nil { - return nil, err - } - resp, err := http.PostForm(c.addr+"list_validators", values) - if err != nil { - return nil, err - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - var response struct { - Result *core.ResponseListValidators `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 { @@ -388,6 +206,36 @@ func (c *ClientHTTP) GetAccount(address []byte) (*core.ResponseGetAccount, error return response.Result, 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+"get_block", values) + if err != nil { + return nil, err + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + 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"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + func (c *ClientHTTP) GetStorage(address []byte) (*core.ResponseGetStorage, error) { values, err := argsToURLValues([]string{"address"}, address) if err != nil { @@ -418,80 +266,17 @@ func (c *ClientHTTP) GetStorage(address []byte) (*core.ResponseGetStorage, error return response.Result, nil } -func (c *ClientJSON) Status() (*core.ResponseStatus, error) { - params, err := binaryWriter(nil) +func (c *ClientHTTP) ListAccounts() (*core.ResponseListAccounts, error) { + values, err := argsToURLValues(nil, nil) if err != nil { return nil, err } - s := JSONRPC{ - JSONRPC: "2.0", - Method: "status", - Params: params, - Id: 0, - } - body, err := c.requestResponse(s) + resp, err := http.PostForm(c.addr+"list_accounts", values) 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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.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{ - JSONRPC: "2.0", - Method: "dump_storage", - Params: params, - Id: 0, - } - body, err := c.requestResponse(s) - if err != nil { - return nil, err - } - var response struct { - 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 { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.Error) - } - return response.Result, nil -} - -func (c *ClientJSON) ListAccounts() (*core.ResponseListAccounts, error) { - params, err := binaryWriter(nil) - if err != nil { - return nil, err - } - s := JSONRPC{ - JSONRPC: "2.0", - Method: "list_accounts", - Params: params, - Id: 0, - } - body, err := c.requestResponse(s) + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } @@ -511,204 +296,17 @@ func (c *ClientJSON) ListAccounts() (*core.ResponseListAccounts, error) { return response.Result, nil } -func (c *ClientJSON) BlockchainInfo(minHeight uint) (*core.ResponseBlockchainInfo, error) { - params, err := binaryWriter(minHeight) +func (c *ClientHTTP) ListValidators() (*core.ResponseListValidators, error) { + values, err := argsToURLValues(nil, nil) if err != nil { return nil, err } - s := JSONRPC{ - JSONRPC: "2.0", - Method: "blockchain_info", - Params: params, - Id: 0, - } - body, err := c.requestResponse(s) + resp, err := http.PostForm(c.addr+"list_validators", values) 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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.Error) - } - 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{ - JSONRPC: "2.0", - Method: "get_block", - Params: params, - Id: 0, - } - body, err := c.requestResponse(s) - 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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.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{ - JSONRPC: "2.0", - Method: "broadcast_tx", - Params: params, - Id: 0, - } - body, err := c.requestResponse(s) - 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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.Error) - } - return response.Result, nil -} - -func (c *ClientJSON) NetInfo() (*core.ResponseNetInfo, error) { - params, err := binaryWriter(nil) - if err != nil { - return nil, err - } - s := JSONRPC{ - JSONRPC: "2.0", - Method: "net_info", - Params: params, - Id: 0, - } - body, err := c.requestResponse(s) - 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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.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{ - JSONRPC: "2.0", - Method: "call", - Params: params, - Id: 0, - } - body, err := c.requestResponse(s) - 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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.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{ - JSONRPC: "2.0", - Method: "sign_tx", - Params: params, - Id: 0, - } - body, err := c.requestResponse(s) - 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"` - } - binary.ReadJSON(&response, body, &err) - if err != nil { - return nil, err - } - if response.Error != "" { - return nil, fmt.Errorf(response.Error) - } - return response.Result, nil -} - -func (c *ClientJSON) ListValidators() (*core.ResponseListValidators, error) { - params, err := binaryWriter(nil) - if err != nil { - return nil, err - } - s := JSONRPC{ - JSONRPC: "2.0", - Method: "list_validators", - Params: params, - Id: 0, - } - body, err := c.requestResponse(s) + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } @@ -728,18 +326,212 @@ func (c *ClientJSON) ListValidators() (*core.ResponseListValidators, error) { return response.Result, nil } -func (c *ClientJSON) GenPrivAccount() (*core.ResponseGenPrivAccount, error) { - params, err := binaryWriter(nil) +func (c *ClientHTTP) NetInfo() (*core.ResponseNetInfo, error) { + values, err := argsToURLValues(nil, nil) if err != nil { return nil, err } - s := JSONRPC{ + resp, err := http.PostForm(c.addr+"net_info", values) + if err != nil { + return nil, err + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + 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"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.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) + if err != nil { + return nil, err + } + resp, err := http.PostForm(c.addr+"sign_tx", values) + if err != nil { + return nil, err + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + 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"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + +func (c *ClientHTTP) Status() (*core.ResponseStatus, error) { + values, err := argsToURLValues(nil, nil) + if err != nil { + return nil, err + } + resp, err := http.PostForm(c.addr+"status", values) + if err != nil { + return nil, err + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + 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"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + +func (c *ClientJSON) BlockchainInfo(minHeight uint) (*core.ResponseBlockchainInfo, error) { + request := RPCRequest{ JSONRPC: "2.0", - Method: "gen_priv_account", - 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.ResponseBlockchainInfo `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + +func (c *ClientJSON) BroadcastTx(tx types.Tx) (*core.ResponseBroadcastTx, error) { + request := RPCRequest{ + JSONRPC: "2.0", + Method: "broadcast_tx", + Params: []interface{}{tx}, + Id: 0, + } + 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"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + +func (c *ClientJSON) Call(address []byte) (*core.ResponseCall, error) { + request := RPCRequest{ + JSONRPC: "2.0", + Method: "call", + Params: []interface{}{address}, + Id: 0, + } + 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"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + +func (c *ClientJSON) DumpStorage(addr []byte) (*core.ResponseDumpStorage, error) { + request := RPCRequest{ + JSONRPC: "2.0", + Method: "dump_storage", + Params: []interface{}{addr}, + Id: 0, + } + body, err := c.RequestResponse(request) + if err != nil { + return nil, err + } + var response struct { + 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 { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + +func (c *ClientJSON) GenPrivAccount() (*core.ResponseGenPrivAccount, error) { + request := RPCRequest{ + JSONRPC: "2.0", + Method: "gen_priv_account", + Params: []interface{}{nil}, + Id: 0, + } + body, err := c.RequestResponse(request) if err != nil { return nil, err } @@ -760,17 +552,13 @@ func (c *ClientJSON) GenPrivAccount() (*core.ResponseGenPrivAccount, error) { } func (c *ClientJSON) GetAccount(address []byte) (*core.ResponseGetAccount, error) { - params, err := binaryWriter(address) - if err != nil { - return nil, err - } - s := JSONRPC{ + request := RPCRequest{ JSONRPC: "2.0", Method: "get_account", - Params: params, + Params: []interface{}{address}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } @@ -790,18 +578,41 @@ 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) +func (c *ClientJSON) GetBlock(height uint) (*core.ResponseGetBlock, error) { + request := RPCRequest{ + JSONRPC: "2.0", + Method: "get_block", + Params: []interface{}{height}, + Id: 0, + } + body, err := c.RequestResponse(request) if err != nil { return nil, err } - s := JSONRPC{ + var response struct { + 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 { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + +func (c *ClientJSON) GetStorage(address []byte) (*core.ResponseGetStorage, error) { + request := RPCRequest{ JSONRPC: "2.0", Method: "get_storage", - Params: params, + Params: []interface{}{address}, Id: 0, } - body, err := c.requestResponse(s) + body, err := c.RequestResponse(request) if err != nil { return nil, err } @@ -820,3 +631,138 @@ func (c *ClientJSON) GetStorage(address []byte) (*core.ResponseGetStorage, error } return response.Result, nil } + +func (c *ClientJSON) ListAccounts() (*core.ResponseListAccounts, error) { + request := RPCRequest{ + JSONRPC: "2.0", + Method: "list_accounts", + Params: []interface{}{nil}, + Id: 0, + } + 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"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + +func (c *ClientJSON) ListValidators() (*core.ResponseListValidators, error) { + request := RPCRequest{ + JSONRPC: "2.0", + Method: "list_validators", + Params: []interface{}{nil}, + Id: 0, + } + body, err := c.RequestResponse(request) + if err != nil { + return nil, err + } + var response struct { + Result *core.ResponseListValidators `json:"result"` + Error string `json:"error"` + Id string `json:"id"` + JSONRPC string `json:"jsonrpc"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + +func (c *ClientJSON) NetInfo() (*core.ResponseNetInfo, error) { + request := RPCRequest{ + JSONRPC: "2.0", + Method: "net_info", + Params: []interface{}{nil}, + Id: 0, + } + 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"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + +func (c *ClientJSON) SignTx(tx types.Tx, privAccounts []*account.PrivAccount) (*core.ResponseSignTx, error) { + request := RPCRequest{ + JSONRPC: "2.0", + Method: "sign_tx", + Params: []interface{}{tx, privAccounts}, + Id: 0, + } + 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"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} + +func (c *ClientJSON) Status() (*core.ResponseStatus, error) { + request := RPCRequest{ + JSONRPC: "2.0", + Method: "status", + Params: []interface{}{nil}, + Id: 0, + } + 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"` + } + binary.ReadJSON(&response, body, &err) + if err != nil { + return nil, err + } + if response.Error != "" { + return nil, fmt.Errorf(response.Error) + } + return response.Result, nil +} diff --git a/rpc/handlers.go b/rpc/handlers.go index 1cf94080..636d2eed 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 4bf345ba..3999cf04 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 b05b43dd..5429f500 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 a98abba3..e425f5a2 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 9fe28a44..b059e111 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 3921f8ec..0b203502 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 00000000..b878a05a --- /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", + } +}