message.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. /*
  2. This file is part of go-ethereum
  3. go-ethereum is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. go-ethereum is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. package rpc
  15. import (
  16. "bytes"
  17. "encoding/json"
  18. "errors"
  19. "fmt"
  20. "github.com/ethereum/go-ethereum/xeth"
  21. )
  22. const (
  23. ErrorArguments = "Error: Insufficient arguments"
  24. ErrorNotImplemented = "Error: Method not implemented"
  25. ErrorUnknown = "Error: Unknown error"
  26. ErrorParseRequest = "Error: Could not parse request"
  27. ErrorDecodeArgs = "Error: Could not decode arguments"
  28. )
  29. type ErrorResponse struct {
  30. Error bool `json:"error"`
  31. ErrorText string `json:"errorText"`
  32. }
  33. type RpcSuccessResponse struct {
  34. ID int `json:"id"`
  35. JsonRpc string `json:"jsonrpc"`
  36. Error bool `json:"error"`
  37. Result interface{} `json:"result"`
  38. }
  39. type RpcErrorResponse struct {
  40. ID int `json:"id"`
  41. JsonRpc string `json:"jsonrpc"`
  42. Error bool `json:"error"`
  43. ErrorText string `json:"errortext"`
  44. }
  45. type RpcRequest struct {
  46. JsonRpc string `json:"jsonrpc"`
  47. ID int `json:"id"`
  48. Method string `json:"method"`
  49. Params []json.RawMessage `json:"params"`
  50. }
  51. func NewErrorResponse(msg string) error {
  52. return errors.New(msg)
  53. }
  54. func NewErrorResponseWithError(msg string, err error) error {
  55. return fmt.Errorf("%s: %v", msg, err)
  56. }
  57. func (req *RpcRequest) ToSha3Args() (*Sha3Args, error) {
  58. if len(req.Params) < 1 {
  59. return nil, NewErrorResponse(ErrorArguments)
  60. }
  61. args := new(Sha3Args)
  62. r := bytes.NewReader(req.Params[0])
  63. if err := json.NewDecoder(r).Decode(args); err != nil {
  64. return nil, NewErrorResponse(ErrorDecodeArgs)
  65. }
  66. rpclogger.DebugDetailf("%T %v", args, args)
  67. return args, nil
  68. }
  69. func (req *RpcRequest) ToGetBlockArgs() (*GetBlockArgs, error) {
  70. if len(req.Params) < 1 {
  71. return nil, NewErrorResponse(ErrorArguments)
  72. }
  73. args := new(GetBlockArgs)
  74. r := bytes.NewReader(req.Params[0])
  75. err := json.NewDecoder(r).Decode(args)
  76. if err != nil {
  77. return nil, NewErrorResponse(ErrorDecodeArgs)
  78. }
  79. rpclogger.DebugDetailf("%T %v", args, args)
  80. return args, nil
  81. }
  82. func (req *RpcRequest) ToNewTxArgs() (*NewTxArgs, error) {
  83. if len(req.Params) < 1 {
  84. return nil, NewErrorResponse(ErrorArguments)
  85. }
  86. args := new(NewTxArgs)
  87. r := bytes.NewReader(req.Params[0])
  88. err := json.NewDecoder(r).Decode(args)
  89. if err != nil {
  90. return nil, NewErrorResponseWithError(ErrorDecodeArgs, err)
  91. }
  92. rpclogger.DebugDetailf("%T %v", args, args)
  93. return args, nil
  94. }
  95. func (req *RpcRequest) ToPushTxArgs() (*PushTxArgs, error) {
  96. if len(req.Params) < 1 {
  97. return nil, NewErrorResponse(ErrorArguments)
  98. }
  99. args := new(PushTxArgs)
  100. r := bytes.NewReader(req.Params[0])
  101. err := json.NewDecoder(r).Decode(args)
  102. if err != nil {
  103. return nil, NewErrorResponse(ErrorDecodeArgs)
  104. }
  105. rpclogger.DebugDetailf("%T %v", args, args)
  106. return args, nil
  107. }
  108. func (req *RpcRequest) ToGetStateArgs() (*GetStateArgs, error) {
  109. if len(req.Params) < 1 {
  110. return nil, NewErrorResponse(ErrorArguments)
  111. }
  112. args := new(GetStateArgs)
  113. // TODO need to pass both arguments
  114. r := bytes.NewReader(req.Params[0])
  115. err := json.NewDecoder(r).Decode(args)
  116. if err != nil {
  117. return nil, NewErrorResponse(ErrorDecodeArgs)
  118. }
  119. rpclogger.DebugDetailf("%T %v", args, args)
  120. return args, nil
  121. }
  122. func (req *RpcRequest) ToStorageAtArgs() (*GetStorageArgs, error) {
  123. if len(req.Params) < 1 {
  124. return nil, NewErrorResponse(ErrorArguments)
  125. }
  126. args := new(GetStorageArgs)
  127. r := bytes.NewReader(req.Params[0])
  128. err := json.NewDecoder(r).Decode(args)
  129. if err != nil {
  130. return nil, NewErrorResponse(ErrorDecodeArgs)
  131. }
  132. rpclogger.DebugDetailf("%T %v", args, args)
  133. return args, nil
  134. }
  135. func (req *RpcRequest) ToGetTxCountArgs() (*GetTxCountArgs, error) {
  136. if len(req.Params) < 1 {
  137. return nil, NewErrorResponse(ErrorArguments)
  138. }
  139. args := new(GetTxCountArgs)
  140. r := bytes.NewReader(req.Params[0])
  141. err := json.NewDecoder(r).Decode(args)
  142. if err != nil {
  143. return nil, NewErrorResponse(ErrorDecodeArgs)
  144. }
  145. rpclogger.DebugDetailf("%T %v", args, args)
  146. return args, nil
  147. }
  148. func (req *RpcRequest) ToGetBalanceArgs() (*GetBalanceArgs, error) {
  149. if len(req.Params) < 1 {
  150. return nil, NewErrorResponse(ErrorArguments)
  151. }
  152. args := new(GetBalanceArgs)
  153. r := bytes.NewReader(req.Params[0])
  154. err := json.NewDecoder(r).Decode(args)
  155. if err != nil {
  156. return nil, NewErrorResponse(ErrorDecodeArgs)
  157. }
  158. rpclogger.DebugDetailf("%T %v", args, args)
  159. return args, nil
  160. }
  161. func (req *RpcRequest) ToGetCodeAtArgs() (*GetCodeAtArgs, error) {
  162. if len(req.Params) < 1 {
  163. return nil, NewErrorResponse(ErrorArguments)
  164. }
  165. args := new(GetCodeAtArgs)
  166. r := bytes.NewReader(req.Params[0])
  167. err := json.NewDecoder(r).Decode(args)
  168. if err != nil {
  169. return nil, NewErrorResponse(ErrorDecodeArgs)
  170. }
  171. rpclogger.DebugDetailf("%T %v", args, args)
  172. return args, nil
  173. }
  174. func (req *RpcRequest) ToFilterArgs() (*FilterOptions, error) {
  175. if len(req.Params) < 1 {
  176. return nil, NewErrorResponse(ErrorArguments)
  177. }
  178. args := new(FilterOptions)
  179. r := bytes.NewReader(req.Params[0])
  180. err := json.NewDecoder(r).Decode(args)
  181. if err != nil {
  182. return nil, NewErrorResponse(ErrorDecodeArgs)
  183. }
  184. rpclogger.DebugDetailf("%T %v", args, args)
  185. return args, nil
  186. }
  187. func (req *RpcRequest) ToFilterChangedArgs() (int, error) {
  188. if len(req.Params) < 1 {
  189. return 0, NewErrorResponse(ErrorArguments)
  190. }
  191. var id int
  192. r := bytes.NewReader(req.Params[0])
  193. err := json.NewDecoder(r).Decode(&id)
  194. if err != nil {
  195. return 0, NewErrorResponse(ErrorDecodeArgs)
  196. }
  197. rpclogger.DebugDetailf("%T %v", id, id)
  198. return id, nil
  199. }
  200. func (req *RpcRequest) ToDbPutArgs() (*DbArgs, error) {
  201. if len(req.Params) < 3 {
  202. return nil, NewErrorResponse(ErrorArguments)
  203. }
  204. var args DbArgs
  205. err := json.Unmarshal(req.Params[0], &args.Database)
  206. if err != nil {
  207. return nil, NewErrorResponseWithError(ErrorDecodeArgs, err)
  208. }
  209. err = json.Unmarshal(req.Params[1], &args.Key)
  210. if err != nil {
  211. return nil, NewErrorResponseWithError(ErrorDecodeArgs, err)
  212. }
  213. err = json.Unmarshal(req.Params[2], &args.Value)
  214. if err != nil {
  215. return nil, NewErrorResponseWithError(ErrorDecodeArgs, err)
  216. }
  217. rpclogger.DebugDetailf("%T %v", args, args)
  218. return &args, nil
  219. }
  220. func (req *RpcRequest) ToDbGetArgs() (*DbArgs, error) {
  221. if len(req.Params) < 2 {
  222. return nil, NewErrorResponse(ErrorArguments)
  223. }
  224. var args DbArgs
  225. err := json.Unmarshal(req.Params[0], &args.Database)
  226. if err != nil {
  227. return nil, NewErrorResponseWithError(ErrorDecodeArgs, err)
  228. }
  229. err = json.Unmarshal(req.Params[1], &args.Key)
  230. if err != nil {
  231. return nil, NewErrorResponseWithError(ErrorDecodeArgs, err)
  232. }
  233. rpclogger.DebugDetailf("%T %v", args, args)
  234. return &args, nil
  235. }
  236. func (req *RpcRequest) ToWhisperFilterArgs() (*xeth.Options, error) {
  237. if len(req.Params) < 1 {
  238. return nil, NewErrorResponse(ErrorArguments)
  239. }
  240. var args xeth.Options
  241. err := json.Unmarshal(req.Params[0], &args)
  242. if err != nil {
  243. return nil, NewErrorResponseWithError(ErrorDecodeArgs, err)
  244. }
  245. rpclogger.DebugDetailf("%T %v", args, args)
  246. return &args, nil
  247. }
  248. func (req *RpcRequest) ToWhisperChangedArgs() (int, error) {
  249. if len(req.Params) < 1 {
  250. return 0, NewErrorResponse(ErrorArguments)
  251. }
  252. var id int
  253. err := json.Unmarshal(req.Params[0], &id)
  254. if err != nil {
  255. return 0, NewErrorResponse(ErrorDecodeArgs)
  256. }
  257. rpclogger.DebugDetailf("%T %v", id, id)
  258. return id, nil
  259. }
  260. func (req *RpcRequest) ToWhisperPostArgs() (*WhisperMessageArgs, error) {
  261. if len(req.Params) < 1 {
  262. return nil, NewErrorResponse(ErrorArguments)
  263. }
  264. var args WhisperMessageArgs
  265. err := json.Unmarshal(req.Params[0], &args)
  266. if err != nil {
  267. return nil, err
  268. }
  269. rpclogger.DebugDetailf("%T %v", args, args)
  270. return &args, nil
  271. }