mirror of https://github.com/ethereum/go-ethereum
Per specification at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPCpull/263/head
parent
c9985bf563
commit
32bed50ba1
@ -1,14 +1,169 @@ |
||||
package rpc |
||||
|
||||
import "github.com/ethereum/go-ethereum/ethutil" |
||||
import ( |
||||
"bytes" |
||||
"encoding/json" |
||||
"errors" |
||||
|
||||
type Message struct { |
||||
Call string `json:"call"` |
||||
Args []interface{} `json:"args"` |
||||
Id int `json:"_id"` |
||||
Data interface{} `json:"data"` |
||||
// "github.com/ethereum/go-ethereum/ethutil"
|
||||
) |
||||
|
||||
const ( |
||||
ErrorArguments = "Error: Insufficient arguments" |
||||
ErrorNotImplemented = "Error: Method not implemented" |
||||
ErrorUnknown = "Error: Unknown error" |
||||
ErrorParseRequest = "Error: Could not parse request" |
||||
ErrorDecodeArgs = "Error: Could not decode arguments" |
||||
) |
||||
|
||||
// type JsonResponse interface {
|
||||
// }
|
||||
|
||||
type ErrorResponse struct { |
||||
Error bool `json:"error"` |
||||
ErrorText string `json:"errorText"` |
||||
} |
||||
|
||||
// type SuccessRes struct {
|
||||
// Error bool `json:"error"`
|
||||
// Result JsonResponse `json:"result"`
|
||||
// }
|
||||
|
||||
// type Message struct {
|
||||
// Call string `json:"call"`
|
||||
// Args []interface{} `json:"args"`
|
||||
// Id int `json:"_id"`
|
||||
// Data interface{} `json:"data"`
|
||||
// }
|
||||
|
||||
// func (self *Message) Arguments() *ethutil.Value {
|
||||
// return ethutil.NewValue(self.Args)
|
||||
// }
|
||||
|
||||
type RpcSuccessResponse struct { |
||||
ID int `json:"id"` |
||||
JsonRpc string `json:"jsonrpc"` |
||||
Error bool `json:"error"` |
||||
Result interface{} `json:"result"` |
||||
} |
||||
|
||||
func (self *Message) Arguments() *ethutil.Value { |
||||
return ethutil.NewValue(self.Args) |
||||
type RpcErrorResponse struct { |
||||
ID int `json:"id"` |
||||
JsonRpc string `json:"jsonrpc"` |
||||
Error bool `json:"error"` |
||||
ErrorText string `json:"errortext"` |
||||
} |
||||
|
||||
type RpcRequest struct { |
||||
JsonRpc string `json:"jsonrpc"` |
||||
ID int `json:"id"` |
||||
Method string `json:"method"` |
||||
Params []json.RawMessage `json:"params"` |
||||
} |
||||
|
||||
func (req *RpcRequest) ToGetBlockArgs() (*GetBlockArgs, error) { |
||||
if len(req.Params) < 1 { |
||||
return nil, NewErrorResponse(ErrorArguments) |
||||
} |
||||
|
||||
args := new(GetBlockArgs) |
||||
r := bytes.NewReader(req.Params[0]) |
||||
err := json.NewDecoder(r).Decode(args) |
||||
if err != nil { |
||||
return nil, NewErrorResponse(ErrorDecodeArgs) |
||||
} |
||||
jsonlogger.DebugDetailf("%T %v", args, args) |
||||
return args, nil |
||||
} |
||||
|
||||
func (req *RpcRequest) ToNewTxArgs() (*NewTxArgs, error) { |
||||
if len(req.Params) < 7 { |
||||
return nil, NewErrorResponse(ErrorArguments) |
||||
} |
||||
|
||||
args := new(NewTxArgs) |
||||
r := bytes.NewReader(req.Params[0]) |
||||
err := json.NewDecoder(r).Decode(args) |
||||
if err != nil { |
||||
return nil, NewErrorResponse(ErrorDecodeArgs) |
||||
} |
||||
jsonlogger.DebugDetailf("%T %v", args, args) |
||||
return args, nil |
||||
} |
||||
|
||||
func (req *RpcRequest) ToPushTxArgs() (*PushTxArgs, error) { |
||||
if len(req.Params) < 1 { |
||||
return nil, NewErrorResponse(ErrorArguments) |
||||
} |
||||
|
||||
args := new(PushTxArgs) |
||||
r := bytes.NewReader(req.Params[0]) |
||||
err := json.NewDecoder(r).Decode(args) |
||||
if err != nil { |
||||
return nil, NewErrorResponse(ErrorDecodeArgs) |
||||
} |
||||
jsonlogger.DebugDetailf("%T %v", args, args) |
||||
return args, nil |
||||
} |
||||
|
||||
func (req *RpcRequest) ToGetStorageArgs() (*GetStorageArgs, error) { |
||||
if len(req.Params) < 2 { |
||||
return nil, NewErrorResponse(ErrorArguments) |
||||
} |
||||
|
||||
args := new(GetStorageArgs) |
||||
// TODO need to pass both arguments
|
||||
r := bytes.NewReader(req.Params[0]) |
||||
err := json.NewDecoder(r).Decode(args) |
||||
if err != nil { |
||||
return nil, NewErrorResponse(ErrorDecodeArgs) |
||||
} |
||||
jsonlogger.DebugDetailf("%T %v", args, args) |
||||
return args, nil |
||||
} |
||||
|
||||
func (req *RpcRequest) ToGetTxCountArgs() (*GetTxCountArgs, error) { |
||||
if len(req.Params) < 1 { |
||||
return nil, NewErrorResponse(ErrorArguments) |
||||
} |
||||
|
||||
args := new(GetTxCountArgs) |
||||
r := bytes.NewReader(req.Params[0]) |
||||
err := json.NewDecoder(r).Decode(args) |
||||
if err != nil { |
||||
return nil, NewErrorResponse(ErrorDecodeArgs) |
||||
} |
||||
jsonlogger.DebugDetailf("%T %v", args, args) |
||||
return args, nil |
||||
} |
||||
|
||||
func (req *RpcRequest) ToGetBalanceArgs() (*GetBalanceArgs, error) { |
||||
if len(req.Params) < 1 { |
||||
return nil, NewErrorResponse(ErrorArguments) |
||||
} |
||||
|
||||
args := new(GetBalanceArgs) |
||||
r := bytes.NewReader(req.Params[0]) |
||||
err := json.NewDecoder(r).Decode(args) |
||||
if err != nil { |
||||
return nil, NewErrorResponse(ErrorDecodeArgs) |
||||
} |
||||
jsonlogger.DebugDetailf("%T %v", args, args) |
||||
return args, nil |
||||
} |
||||
|
||||
// func NewSuccessRes(object JsonResponse) string {
|
||||
// e := SuccessRes{Error: false, Result: object}
|
||||
// res, err := json.Marshal(e)
|
||||
// if err != nil {
|
||||
// // This should never happen
|
||||
// panic("Creating json error response failed, help")
|
||||
// }
|
||||
// success := string(res)
|
||||
// return success
|
||||
// // return res
|
||||
// }
|
||||
|
||||
func NewErrorResponse(msg string) error { |
||||
return errors.New(msg) |
||||
} |
||||
|
@ -1,75 +0,0 @@ |
||||
package rpc |
||||
|
||||
/* |
||||
func pack(id int, v ...interface{}) Message { |
||||
return Message{Data: v, Id: id} |
||||
} |
||||
|
||||
func WriteOn(msg *Message, writer io.Writer) { |
||||
//msg := &Message{Seed: seed, Data: data}
|
||||
|
||||
switch msg.Call { |
||||
case "compile": |
||||
data := ethutil.NewValue(msg.Args) |
||||
bcode, err := ethutil.Compile(data.Get(0).Str(), false) |
||||
if err != nil { |
||||
JSON.Send(writer, pack(msg.Id, err.Error())) |
||||
} |
||||
|
||||
code := ethutil.Bytes2Hex(bcode) |
||||
|
||||
JSON.Send(writer, pack(msg.Id, code, nil)) |
||||
case "block": |
||||
args := msg.Arguments() |
||||
|
||||
block := pipe.BlockByNumber(int32(args.Get(0).Uint())) |
||||
|
||||
JSON.Send(writer, pack(msg.Id, block)) |
||||
case "transact": |
||||
if mp, ok := msg.Args[0].(map[string]interface{}); ok { |
||||
object := mapToTxParams(mp) |
||||
JSON.Send( |
||||
writer, |
||||
pack(msg.Id, args(pipe.Transact(object["from"], object["to"], object["value"], object["gas"], object["gasPrice"], object["data"]))), |
||||
) |
||||
|
||||
} |
||||
case "coinbase": |
||||
JSON.Send(writer, pack(msg.Id, pipe.CoinBase(), msg.Seed)) |
||||
|
||||
case "listening": |
||||
JSON.Send(writer, pack(msg.Id, pipe.IsListening())) |
||||
|
||||
case "mining": |
||||
JSON.Send(writer, pack(msg.Id, pipe.IsMining())) |
||||
|
||||
case "peerCoint": |
||||
JSON.Send(writer, pack(msg.Id, pipe.PeerCount())) |
||||
|
||||
case "countAt": |
||||
args := msg.Arguments() |
||||
|
||||
JSON.Send(writer, pack(msg.Id, pipe.TxCountAt(args.Get(0).Str()))) |
||||
|
||||
case "codeAt": |
||||
args := msg.Arguments() |
||||
|
||||
JSON.Send(writer, pack(msg.Id, len(pipe.CodeAt(args.Get(0).Str())))) |
||||
|
||||
case "stateAt": |
||||
args := msg.Arguments() |
||||
|
||||
JSON.Send(writer, pack(msg.Id, pipe.StorageAt(args.Get(0).Str(), args.Get(1).Str()))) |
||||
|
||||
case "balanceAt": |
||||
args := msg.Arguments() |
||||
|
||||
JSON.Send(writer, pack(msg.Id, pipe.BalanceAt(args.Get(0).Str()))) |
||||
|
||||
case "newFilter": |
||||
case "newFilterString": |
||||
case "messages": |
||||
// TODO
|
||||
} |
||||
} |
||||
*/ |
Loading…
Reference in new issue