api.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. package rpc
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "math/big"
  6. "path"
  7. "strings"
  8. "sync"
  9. "time"
  10. "github.com/ethereum/go-ethereum/core"
  11. "github.com/ethereum/go-ethereum/core/types"
  12. "github.com/ethereum/go-ethereum/crypto"
  13. "github.com/ethereum/go-ethereum/ethdb"
  14. "github.com/ethereum/go-ethereum/common"
  15. "github.com/ethereum/go-ethereum/event"
  16. "github.com/ethereum/go-ethereum/event/filter"
  17. "github.com/ethereum/go-ethereum/state"
  18. "github.com/ethereum/go-ethereum/xeth"
  19. )
  20. var (
  21. defaultGasPrice = big.NewInt(150000000000)
  22. defaultGas = big.NewInt(500000)
  23. filterTickerTime = 5 * time.Minute
  24. )
  25. type EthereumApi struct {
  26. eth *xeth.XEth
  27. xethMu sync.RWMutex
  28. mux *event.TypeMux
  29. quit chan struct{}
  30. filterManager *filter.FilterManager
  31. logMut sync.RWMutex
  32. logs map[int]*logFilter
  33. messagesMut sync.RWMutex
  34. messages map[int]*whisperFilter
  35. // Register keeps a list of accounts and transaction data
  36. regmut sync.Mutex
  37. register map[string][]*NewTxArgs
  38. db common.Database
  39. }
  40. func NewEthereumApi(eth *xeth.XEth, dataDir string) *EthereumApi {
  41. db, _ := ethdb.NewLDBDatabase(path.Join(dataDir, "dapps"))
  42. api := &EthereumApi{
  43. eth: eth,
  44. mux: eth.Backend().EventMux(),
  45. quit: make(chan struct{}),
  46. filterManager: filter.NewFilterManager(eth.Backend().EventMux()),
  47. logs: make(map[int]*logFilter),
  48. messages: make(map[int]*whisperFilter),
  49. db: db,
  50. }
  51. go api.filterManager.Start()
  52. go api.start()
  53. return api
  54. }
  55. func (self *EthereumApi) xethWithStateNum(num int64) *xeth.XEth {
  56. chain := self.xeth().Backend().ChainManager()
  57. var block *types.Block
  58. if num < 0 {
  59. num = chain.CurrentBlock().Number().Int64() + num + 1
  60. }
  61. block = chain.GetBlockByNumber(uint64(num))
  62. var st *state.StateDB
  63. if block != nil {
  64. st = state.New(block.Root(), self.xeth().Backend().StateDb())
  65. } else {
  66. st = chain.State()
  67. }
  68. return self.xeth().WithState(st)
  69. }
  70. func (self *EthereumApi) getStateWithNum(num int64) *xeth.State {
  71. return self.xethWithStateNum(num).State()
  72. }
  73. func (self *EthereumApi) start() {
  74. timer := time.NewTicker(filterTickerTime)
  75. done:
  76. for {
  77. select {
  78. case <-timer.C:
  79. self.logMut.Lock()
  80. self.messagesMut.Lock()
  81. for id, filter := range self.logs {
  82. if time.Since(filter.timeout) > 20*time.Second {
  83. self.filterManager.UninstallFilter(id)
  84. delete(self.logs, id)
  85. }
  86. }
  87. for id, filter := range self.messages {
  88. if time.Since(filter.timeout) > 20*time.Second {
  89. self.xeth().Whisper().Unwatch(id)
  90. delete(self.messages, id)
  91. }
  92. }
  93. self.logMut.Unlock()
  94. self.messagesMut.Unlock()
  95. case <-self.quit:
  96. break done
  97. }
  98. }
  99. }
  100. func (self *EthereumApi) stop() {
  101. close(self.quit)
  102. }
  103. // func (self *EthereumApi) Register(args string, reply *interface{}) error {
  104. // self.regmut.Lock()
  105. // defer self.regmut.Unlock()
  106. // if _, ok := self.register[args]; ok {
  107. // self.register[args] = nil // register with empty
  108. // }
  109. // return nil
  110. // }
  111. // func (self *EthereumApi) Unregister(args string, reply *interface{}) error {
  112. // self.regmut.Lock()
  113. // defer self.regmut.Unlock()
  114. // delete(self.register, args)
  115. // return nil
  116. // }
  117. // func (self *EthereumApi) WatchTx(args string, reply *interface{}) error {
  118. // self.regmut.Lock()
  119. // defer self.regmut.Unlock()
  120. // txs := self.register[args]
  121. // self.register[args] = nil
  122. // *reply = txs
  123. // return nil
  124. // }
  125. func (self *EthereumApi) NewFilter(args *FilterOptions, reply *interface{}) error {
  126. var id int
  127. filter := core.NewFilter(self.xeth().Backend())
  128. filter.SetOptions(toFilterOptions(args))
  129. filter.LogsCallback = func(logs state.Logs) {
  130. self.logMut.Lock()
  131. defer self.logMut.Unlock()
  132. self.logs[id].add(logs...)
  133. }
  134. id = self.filterManager.InstallFilter(filter)
  135. self.logs[id] = &logFilter{timeout: time.Now()}
  136. *reply = i2hex(id)
  137. return nil
  138. }
  139. func (self *EthereumApi) UninstallFilter(id int, reply *interface{}) error {
  140. if _, ok := self.logs[id]; ok {
  141. delete(self.logs, id)
  142. }
  143. self.filterManager.UninstallFilter(id)
  144. *reply = true
  145. return nil
  146. }
  147. func (self *EthereumApi) NewFilterString(args *FilterStringArgs, reply *interface{}) error {
  148. var id int
  149. filter := core.NewFilter(self.xeth().Backend())
  150. callback := func(block *types.Block) {
  151. self.logMut.Lock()
  152. defer self.logMut.Unlock()
  153. self.logs[id].add(&state.StateLog{})
  154. }
  155. switch args.Word {
  156. case "pending":
  157. filter.PendingCallback = callback
  158. case "latest":
  159. filter.BlockCallback = callback
  160. default:
  161. return NewValidationError("Word", "Must be `latest` or `pending`")
  162. }
  163. id = self.filterManager.InstallFilter(filter)
  164. self.logs[id] = &logFilter{timeout: time.Now()}
  165. *reply = i2hex(id)
  166. return nil
  167. }
  168. func (self *EthereumApi) FilterChanged(id int, reply *interface{}) error {
  169. self.logMut.Lock()
  170. defer self.logMut.Unlock()
  171. if self.logs[id] != nil {
  172. *reply = toLogs(self.logs[id].get())
  173. }
  174. return nil
  175. }
  176. func (self *EthereumApi) Logs(id int, reply *interface{}) error {
  177. self.logMut.Lock()
  178. defer self.logMut.Unlock()
  179. filter := self.filterManager.GetFilter(id)
  180. if filter != nil {
  181. *reply = toLogs(filter.Find())
  182. }
  183. return nil
  184. }
  185. func (self *EthereumApi) AllLogs(args *FilterOptions, reply *interface{}) error {
  186. filter := core.NewFilter(self.xeth().Backend())
  187. filter.SetOptions(toFilterOptions(args))
  188. *reply = toLogs(filter.Find())
  189. return nil
  190. }
  191. func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) (err error) {
  192. // TODO if no_private_key then
  193. //if _, exists := p.register[args.From]; exists {
  194. // p.register[args.From] = append(p.register[args.From], args)
  195. //} else {
  196. /*
  197. account := accounts.Get(common.FromHex(args.From))
  198. if account != nil {
  199. if account.Unlocked() {
  200. if !unlockAccount(account) {
  201. return
  202. }
  203. }
  204. result, _ := account.Transact(common.FromHex(args.To), common.FromHex(args.Value), common.FromHex(args.Gas), common.FromHex(args.GasPrice), common.FromHex(args.Data))
  205. if len(result) > 0 {
  206. *reply = toHex(result)
  207. }
  208. } else if _, exists := p.register[args.From]; exists {
  209. p.register[ags.From] = append(p.register[args.From], args)
  210. }
  211. */
  212. // TODO: align default values to have the same type, e.g. not depend on
  213. // common.Value conversions later on
  214. if args.Gas.Cmp(big.NewInt(0)) == 0 {
  215. args.Gas = defaultGas
  216. }
  217. if args.GasPrice.Cmp(big.NewInt(0)) == 0 {
  218. args.GasPrice = defaultGasPrice
  219. }
  220. *reply, err = p.xeth().Transact(args.From, args.To, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data)
  221. if err != nil {
  222. fmt.Println("err:", err)
  223. return err
  224. }
  225. return nil
  226. }
  227. func (p *EthereumApi) Call(args *NewTxArgs, reply *interface{}) error {
  228. result, err := p.xethWithStateNum(args.BlockNumber).Call(args.From, args.To, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data)
  229. if err != nil {
  230. return err
  231. }
  232. *reply = result
  233. return nil
  234. }
  235. func (p *EthereumApi) GetBalance(args *GetBalanceArgs, reply *interface{}) error {
  236. if err := args.requirements(); err != nil {
  237. return err
  238. }
  239. state := p.getStateWithNum(args.BlockNumber).SafeGet(args.Address)
  240. *reply = toHex(state.Balance().Bytes())
  241. return nil
  242. }
  243. func (p *EthereumApi) GetStorage(args *GetStorageArgs, reply *interface{}) error {
  244. if err := args.requirements(); err != nil {
  245. return err
  246. }
  247. *reply = p.getStateWithNum(args.BlockNumber).SafeGet(args.Address).Storage()
  248. return nil
  249. }
  250. func (p *EthereumApi) GetStorageAt(args *GetStorageAtArgs, reply *interface{}) error {
  251. if err := args.requirements(); err != nil {
  252. return err
  253. }
  254. state := p.getStateWithNum(args.BlockNumber).SafeGet(args.Address)
  255. value := state.StorageString(args.Key)
  256. var hx string
  257. if strings.Index(args.Key, "0x") == 0 {
  258. hx = string([]byte(args.Key)[2:])
  259. } else {
  260. // Convert the incoming string (which is a bigint) into hex
  261. i, _ := new(big.Int).SetString(args.Key, 10)
  262. hx = common.Bytes2Hex(i.Bytes())
  263. }
  264. rpclogger.Debugf("GetStateAt(%s, %s)\n", args.Address, hx)
  265. *reply = map[string]string{args.Key: value.Str()}
  266. return nil
  267. }
  268. func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *interface{}) error {
  269. err := args.requirements()
  270. if err != nil {
  271. return err
  272. }
  273. *reply = p.xethWithStateNum(args.BlockNumber).TxCountAt(args.Address)
  274. return nil
  275. }
  276. func (p *EthereumApi) GetData(args *GetDataArgs, reply *interface{}) error {
  277. if err := args.requirements(); err != nil {
  278. return err
  279. }
  280. *reply = p.xethWithStateNum(args.BlockNumber).CodeAt(args.Address)
  281. return nil
  282. }
  283. func (p *EthereumApi) GetCompilers(reply *interface{}) error {
  284. c := []string{""}
  285. *reply = c
  286. return nil
  287. }
  288. func (p *EthereumApi) DbPut(args *DbArgs, reply *interface{}) error {
  289. if err := args.requirements(); err != nil {
  290. return err
  291. }
  292. p.db.Put([]byte(args.Database+args.Key), []byte(args.Value))
  293. *reply = true
  294. return nil
  295. }
  296. func (p *EthereumApi) DbGet(args *DbArgs, reply *interface{}) error {
  297. if err := args.requirements(); err != nil {
  298. return err
  299. }
  300. res, _ := p.db.Get([]byte(args.Database + args.Key))
  301. *reply = string(res)
  302. return nil
  303. }
  304. func (p *EthereumApi) NewWhisperIdentity(reply *interface{}) error {
  305. *reply = p.xeth().Whisper().NewIdentity()
  306. return nil
  307. }
  308. func (p *EthereumApi) NewWhisperFilter(args *WhisperFilterArgs, reply *interface{}) error {
  309. var id int
  310. opts := new(xeth.Options)
  311. opts.From = args.From
  312. opts.To = args.To
  313. opts.Topics = args.Topics
  314. opts.Fn = func(msg xeth.WhisperMessage) {
  315. p.messagesMut.Lock()
  316. defer p.messagesMut.Unlock()
  317. p.messages[id].add(msg) // = append(p.messages[id], msg)
  318. }
  319. id = p.xeth().Whisper().Watch(opts)
  320. p.messages[id] = &whisperFilter{timeout: time.Now()}
  321. *reply = toHex(big.NewInt(int64(id)).Bytes())
  322. return nil
  323. }
  324. func (p *EthereumApi) UninstallWhisperFilter(id int, reply *interface{}) error {
  325. delete(p.messages, id)
  326. *reply = true
  327. return nil
  328. }
  329. func (self *EthereumApi) MessagesChanged(id int, reply *interface{}) error {
  330. self.messagesMut.Lock()
  331. defer self.messagesMut.Unlock()
  332. if self.messages[id] != nil {
  333. *reply = self.messages[id].get()
  334. }
  335. return nil
  336. }
  337. func (p *EthereumApi) WhisperPost(args *WhisperMessageArgs, reply *interface{}) error {
  338. err := p.xeth().Whisper().Post(args.Payload, args.To, args.From, args.Topics, args.Priority, args.Ttl)
  339. if err != nil {
  340. return err
  341. }
  342. *reply = true
  343. return nil
  344. }
  345. func (p *EthereumApi) HasWhisperIdentity(args string, reply *interface{}) error {
  346. *reply = p.xeth().Whisper().HasIdentity(args)
  347. return nil
  348. }
  349. func (p *EthereumApi) WhisperMessages(id int, reply *interface{}) error {
  350. *reply = p.xeth().Whisper().Messages(id)
  351. return nil
  352. }
  353. func (p *EthereumApi) GetTransactionByHash(hash string, reply *interface{}) error {
  354. tx := p.xeth().EthTransactionByHash(hash)
  355. if tx != nil {
  356. *reply = NewTransactionRes(tx)
  357. }
  358. return nil
  359. }
  360. func (p *EthereumApi) GetBlockByHash(blockhash string, includetx bool) (*BlockRes, error) {
  361. block := p.xeth().EthBlockByHash(blockhash)
  362. br := NewBlockRes(block)
  363. br.fullTx = includetx
  364. return br, nil
  365. }
  366. func (p *EthereumApi) GetBlockByNumber(blocknum int64, includetx bool) (*BlockRes, error) {
  367. block := p.xeth().EthBlockByNumber(blocknum)
  368. br := NewBlockRes(block)
  369. br.fullTx = includetx
  370. return br, nil
  371. }
  372. func (p *EthereumApi) GetBlockTransactionCountByHash(blockhash string) (int64, error) {
  373. block := p.xeth().EthBlockByHash(blockhash)
  374. br := NewBlockRes(block)
  375. return int64(len(br.Transactions)), nil
  376. }
  377. func (p *EthereumApi) GetBlockTransactionCountByNumber(blocknum int64) (int64, error) {
  378. block := p.xeth().EthBlockByNumber(blocknum)
  379. br := NewBlockRes(block)
  380. return int64(len(br.Transactions)), nil
  381. }
  382. func (p *EthereumApi) GetBlockUncleCountByHash(blockhash string) (int64, error) {
  383. block := p.xeth().EthBlockByHash(blockhash)
  384. br := NewBlockRes(block)
  385. return int64(len(br.Uncles)), nil
  386. }
  387. func (p *EthereumApi) GetBlockUncleCountByNumber(blocknum int64) (int64, error) {
  388. block := p.xeth().EthBlockByNumber(blocknum)
  389. br := NewBlockRes(block)
  390. return int64(len(br.Uncles)), nil
  391. }
  392. func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error {
  393. // Spec at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC
  394. rpclogger.Debugf("%s %s", req.Method, req.Params)
  395. switch req.Method {
  396. case "web3_sha3":
  397. args := new(Sha3Args)
  398. if err := json.Unmarshal(req.Params, &args); err != nil {
  399. return err
  400. }
  401. *reply = toHex(crypto.Sha3(common.FromHex(args.Data)))
  402. case "web3_clientVersion":
  403. *reply = p.xeth().Backend().Version()
  404. case "net_version":
  405. return NewNotImplementedError(req.Method)
  406. case "net_listening":
  407. *reply = p.xeth().IsListening()
  408. case "net_peerCount":
  409. *reply = toHex(big.NewInt(int64(p.xeth().PeerCount())).Bytes())
  410. case "eth_coinbase":
  411. // TODO handling of empty coinbase due to lack of accounts
  412. res := p.xeth().Coinbase()
  413. if res == "0x" || res == "0x0" {
  414. *reply = nil
  415. } else {
  416. *reply = res
  417. }
  418. case "eth_mining":
  419. *reply = p.xeth().IsMining()
  420. case "eth_gasPrice":
  421. *reply = toHex(defaultGasPrice.Bytes())
  422. case "eth_accounts":
  423. *reply = p.xeth().Accounts()
  424. case "eth_blockNumber":
  425. *reply = toHex(p.xeth().Backend().ChainManager().CurrentBlock().Number().Bytes())
  426. case "eth_getBalance":
  427. args := new(GetBalanceArgs)
  428. if err := json.Unmarshal(req.Params, &args); err != nil {
  429. return err
  430. }
  431. return p.GetBalance(args, reply)
  432. case "eth_getStorage", "eth_storageAt":
  433. args := new(GetStorageArgs)
  434. if err := json.Unmarshal(req.Params, &args); err != nil {
  435. return err
  436. }
  437. return p.GetStorage(args, reply)
  438. case "eth_getStorageAt":
  439. args := new(GetStorageAtArgs)
  440. if err := json.Unmarshal(req.Params, &args); err != nil {
  441. return err
  442. }
  443. return p.GetStorageAt(args, reply)
  444. case "eth_getTransactionCount":
  445. args := new(GetTxCountArgs)
  446. if err := json.Unmarshal(req.Params, &args); err != nil {
  447. return err
  448. }
  449. return p.GetTxCountAt(args, reply)
  450. case "eth_getBlockTransactionCountByHash":
  451. args := new(GetBlockByHashArgs)
  452. if err := json.Unmarshal(req.Params, &args); err != nil {
  453. return err
  454. }
  455. v, err := p.GetBlockTransactionCountByHash(args.BlockHash)
  456. if err != nil {
  457. return err
  458. }
  459. *reply = toHex(big.NewInt(v).Bytes())
  460. case "eth_getBlockTransactionCountByNumber":
  461. args := new(GetBlockByNumberArgs)
  462. if err := json.Unmarshal(req.Params, &args); err != nil {
  463. return err
  464. }
  465. v, err := p.GetBlockTransactionCountByNumber(args.BlockNumber)
  466. if err != nil {
  467. return err
  468. }
  469. *reply = toHex(big.NewInt(v).Bytes())
  470. case "eth_getUncleCountByBlockHash":
  471. args := new(GetBlockByHashArgs)
  472. if err := json.Unmarshal(req.Params, &args); err != nil {
  473. return err
  474. }
  475. v, err := p.GetBlockUncleCountByHash(args.BlockHash)
  476. if err != nil {
  477. return err
  478. }
  479. *reply = toHex(big.NewInt(v).Bytes())
  480. case "eth_getUncleCountByBlockNumber":
  481. args := new(GetBlockByNumberArgs)
  482. if err := json.Unmarshal(req.Params, &args); err != nil {
  483. return err
  484. }
  485. v, err := p.GetBlockUncleCountByNumber(args.BlockNumber)
  486. if err != nil {
  487. return err
  488. }
  489. *reply = toHex(big.NewInt(v).Bytes())
  490. case "eth_getData", "eth_getCode":
  491. args := new(GetDataArgs)
  492. if err := json.Unmarshal(req.Params, &args); err != nil {
  493. return err
  494. }
  495. return p.GetData(args, reply)
  496. case "eth_sendTransaction", "eth_transact":
  497. args := new(NewTxArgs)
  498. if err := json.Unmarshal(req.Params, &args); err != nil {
  499. return err
  500. }
  501. return p.Transact(args, reply)
  502. case "eth_call":
  503. args := new(NewTxArgs)
  504. if err := json.Unmarshal(req.Params, &args); err != nil {
  505. return err
  506. }
  507. return p.Call(args, reply)
  508. case "eth_flush":
  509. return NewNotImplementedError(req.Method)
  510. case "eth_getBlockByHash":
  511. args := new(GetBlockByHashArgs)
  512. if err := json.Unmarshal(req.Params, &args); err != nil {
  513. return err
  514. }
  515. v, err := p.GetBlockByHash(args.BlockHash, args.Transactions)
  516. if err != nil {
  517. return err
  518. }
  519. *reply = v
  520. case "eth_getBlockByNumber":
  521. args := new(GetBlockByNumberArgs)
  522. if err := json.Unmarshal(req.Params, &args); err != nil {
  523. return err
  524. }
  525. v, err := p.GetBlockByNumber(args.BlockNumber, args.Transactions)
  526. if err != nil {
  527. return err
  528. }
  529. *reply = v
  530. case "eth_getTransactionByHash":
  531. // HashIndexArgs used, but only the "Hash" part we need.
  532. args := new(HashIndexArgs)
  533. if err := json.Unmarshal(req.Params, &args); err != nil {
  534. }
  535. return p.GetTransactionByHash(args.Hash, reply)
  536. case "eth_getTransactionByBlockHashAndIndex":
  537. args := new(HashIndexArgs)
  538. if err := json.Unmarshal(req.Params, &args); err != nil {
  539. return err
  540. }
  541. v, err := p.GetBlockByHash(args.Hash, true)
  542. if err != nil {
  543. return err
  544. }
  545. if args.Index > int64(len(v.Transactions)) || args.Index < 0 {
  546. return NewValidationError("Index", "does not exist")
  547. }
  548. *reply = v.Transactions[args.Index]
  549. case "eth_getTransactionByBlockNumberAndIndex":
  550. args := new(BlockNumIndexArgs)
  551. if err := json.Unmarshal(req.Params, &args); err != nil {
  552. return err
  553. }
  554. v, err := p.GetBlockByNumber(args.BlockNumber, true)
  555. if err != nil {
  556. return err
  557. }
  558. if args.Index > int64(len(v.Transactions)) || args.Index < 0 {
  559. return NewValidationError("Index", "does not exist")
  560. }
  561. *reply = v.Transactions[args.Index]
  562. case "eth_getUncleByBlockHashAndIndex":
  563. args := new(HashIndexArgs)
  564. if err := json.Unmarshal(req.Params, &args); err != nil {
  565. return err
  566. }
  567. v, err := p.GetBlockByHash(args.Hash, false)
  568. if err != nil {
  569. return err
  570. }
  571. if args.Index > int64(len(v.Uncles)) || args.Index < 0 {
  572. return NewValidationError("Index", "does not exist")
  573. }
  574. uncle, err := p.GetBlockByHash(toHex(v.Uncles[args.Index]), false)
  575. if err != nil {
  576. return err
  577. }
  578. *reply = uncle
  579. case "eth_getUncleByBlockNumberAndIndex":
  580. args := new(BlockNumIndexArgs)
  581. if err := json.Unmarshal(req.Params, &args); err != nil {
  582. return err
  583. }
  584. v, err := p.GetBlockByNumber(args.BlockNumber, true)
  585. if err != nil {
  586. return err
  587. }
  588. if args.Index > int64(len(v.Uncles)) || args.Index < 0 {
  589. return NewValidationError("Index", "does not exist")
  590. }
  591. uncle, err := p.GetBlockByHash(toHex(v.Uncles[args.Index]), false)
  592. if err != nil {
  593. return err
  594. }
  595. *reply = uncle
  596. case "eth_getCompilers":
  597. return p.GetCompilers(reply)
  598. case "eth_compileSolidity", "eth_compileLLL", "eth_compileSerpent":
  599. return NewNotImplementedError(req.Method)
  600. case "eth_newFilter":
  601. args := new(FilterOptions)
  602. if err := json.Unmarshal(req.Params, &args); err != nil {
  603. return err
  604. }
  605. return p.NewFilter(args, reply)
  606. case "eth_newBlockFilter":
  607. args := new(FilterStringArgs)
  608. if err := json.Unmarshal(req.Params, &args); err != nil {
  609. return err
  610. }
  611. return p.NewFilterString(args, reply)
  612. case "eth_uninstallFilter":
  613. args := new(FilterIdArgs)
  614. if err := json.Unmarshal(req.Params, &args); err != nil {
  615. return err
  616. }
  617. return p.UninstallFilter(args.Id, reply)
  618. case "eth_getFilterChanges":
  619. args := new(FilterIdArgs)
  620. if err := json.Unmarshal(req.Params, &args); err != nil {
  621. return err
  622. }
  623. return p.FilterChanged(args.Id, reply)
  624. case "eth_getFilterLogs":
  625. args := new(FilterIdArgs)
  626. if err := json.Unmarshal(req.Params, &args); err != nil {
  627. return err
  628. }
  629. return p.Logs(args.Id, reply)
  630. case "eth_getLogs":
  631. args := new(FilterOptions)
  632. if err := json.Unmarshal(req.Params, &args); err != nil {
  633. return err
  634. }
  635. return p.AllLogs(args, reply)
  636. case "eth_getWork", "eth_submitWork":
  637. return NewNotImplementedError(req.Method)
  638. case "db_putString":
  639. args := new(DbArgs)
  640. if err := json.Unmarshal(req.Params, &args); err != nil {
  641. return err
  642. }
  643. return p.DbPut(args, reply)
  644. case "db_getString":
  645. args := new(DbArgs)
  646. if err := json.Unmarshal(req.Params, &args); err != nil {
  647. return err
  648. }
  649. return p.DbGet(args, reply)
  650. case "db_putHex", "db_getHex":
  651. return NewNotImplementedError(req.Method)
  652. case "shh_post":
  653. args := new(WhisperMessageArgs)
  654. if err := json.Unmarshal(req.Params, &args); err != nil {
  655. return err
  656. }
  657. return p.WhisperPost(args, reply)
  658. case "shh_newIdentity":
  659. return p.NewWhisperIdentity(reply)
  660. case "shh_hasIdentity":
  661. args := new(WhisperIdentityArgs)
  662. if err := json.Unmarshal(req.Params, &args); err != nil {
  663. return err
  664. }
  665. return p.HasWhisperIdentity(args.Identity, reply)
  666. case "shh_newGroup", "shh_addToGroup":
  667. return NewNotImplementedError(req.Method)
  668. case "shh_newFilter":
  669. args := new(WhisperFilterArgs)
  670. if err := json.Unmarshal(req.Params, &args); err != nil {
  671. return err
  672. }
  673. return p.NewWhisperFilter(args, reply)
  674. case "shh_uninstallFilter":
  675. args := new(FilterIdArgs)
  676. if err := json.Unmarshal(req.Params, &args); err != nil {
  677. return err
  678. }
  679. return p.UninstallWhisperFilter(args.Id, reply)
  680. case "shh_getFilterChanges":
  681. args := new(FilterIdArgs)
  682. if err := json.Unmarshal(req.Params, &args); err != nil {
  683. return err
  684. }
  685. return p.MessagesChanged(args.Id, reply)
  686. case "shh_getMessages":
  687. args := new(FilterIdArgs)
  688. if err := json.Unmarshal(req.Params, &args); err != nil {
  689. return err
  690. }
  691. return p.WhisperMessages(args.Id, reply)
  692. // case "eth_register":
  693. // args, err := req.ToRegisterArgs()
  694. // if err != nil {
  695. // return err
  696. // }
  697. // return p.Register(args, reply)
  698. // case "eth_unregister":
  699. // args, err := req.ToRegisterArgs()
  700. // if err != nil {
  701. // return err
  702. // }
  703. // return p.Unregister(args, reply)
  704. // case "eth_watchTx":
  705. // args, err := req.ToWatchTxArgs()
  706. // if err != nil {
  707. // return err
  708. // }
  709. // return p.WatchTx(args, reply)
  710. default:
  711. return NewNotImplementedError(req.Method)
  712. }
  713. rpclogger.DebugDetailf("Reply: %T %s", reply, reply)
  714. return nil
  715. }
  716. func (self *EthereumApi) xeth() *xeth.XEth {
  717. self.xethMu.RLock()
  718. defer self.xethMu.RUnlock()
  719. return self.eth
  720. }
  721. func toFilterOptions(options *FilterOptions) core.FilterOptions {
  722. var opts core.FilterOptions
  723. // Convert optional address slice/string to byte slice
  724. if str, ok := options.Address.(string); ok {
  725. opts.Address = [][]byte{common.FromHex(str)}
  726. } else if slice, ok := options.Address.([]interface{}); ok {
  727. bslice := make([][]byte, len(slice))
  728. for i, addr := range slice {
  729. if saddr, ok := addr.(string); ok {
  730. bslice[i] = common.FromHex(saddr)
  731. }
  732. }
  733. opts.Address = bslice
  734. }
  735. opts.Earliest = options.Earliest
  736. opts.Latest = options.Latest
  737. topics := make([][][]byte, len(options.Topics))
  738. for i, topicDat := range options.Topics {
  739. if slice, ok := topicDat.([]interface{}); ok {
  740. topics[i] = make([][]byte, len(slice))
  741. for j, topic := range slice {
  742. topics[i][j] = common.FromHex(topic.(string))
  743. }
  744. } else if str, ok := topicDat.(string); ok {
  745. topics[i] = make([][]byte, 1)
  746. topics[i][0] = common.FromHex(str)
  747. }
  748. }
  749. opts.Topics = topics
  750. return opts
  751. }