api.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863
  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/common"
  11. "github.com/ethereum/go-ethereum/core"
  12. "github.com/ethereum/go-ethereum/core/types"
  13. "github.com/ethereum/go-ethereum/crypto"
  14. "github.com/ethereum/go-ethereum/ethdb"
  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 = common.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 = common.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) RemoveWhisperIdentity(args *WhisperIdentityArgs, reply *interface{}) error {
  309. // *reply = p.xeth().Whisper().RemoveIdentity(args.Identity)
  310. // return nil
  311. // }
  312. func (p *EthereumApi) NewWhisperFilter(args *WhisperFilterArgs, reply *interface{}) error {
  313. var id int
  314. opts := new(xeth.Options)
  315. opts.From = args.From
  316. opts.To = args.To
  317. opts.Topics = args.Topics
  318. opts.Fn = func(msg xeth.WhisperMessage) {
  319. p.messagesMut.Lock()
  320. defer p.messagesMut.Unlock()
  321. p.messages[id].add(msg) // = append(p.messages[id], msg)
  322. }
  323. id = p.xeth().Whisper().Watch(opts)
  324. p.messages[id] = &whisperFilter{timeout: time.Now()}
  325. *reply = common.ToHex(big.NewInt(int64(id)).Bytes())
  326. return nil
  327. }
  328. func (p *EthereumApi) UninstallWhisperFilter(id int, reply *interface{}) error {
  329. delete(p.messages, id)
  330. *reply = true
  331. return nil
  332. }
  333. func (self *EthereumApi) MessagesChanged(id int, reply *interface{}) error {
  334. self.messagesMut.Lock()
  335. defer self.messagesMut.Unlock()
  336. if self.messages[id] != nil {
  337. *reply = self.messages[id].get()
  338. }
  339. return nil
  340. }
  341. func (p *EthereumApi) WhisperPost(args *WhisperMessageArgs, reply *interface{}) error {
  342. err := p.xeth().Whisper().Post(args.Payload, args.To, args.From, args.Topics, args.Priority, args.Ttl)
  343. if err != nil {
  344. return err
  345. }
  346. *reply = true
  347. return nil
  348. }
  349. func (p *EthereumApi) HasWhisperIdentity(args string, reply *interface{}) error {
  350. *reply = p.xeth().Whisper().HasIdentity(args)
  351. return nil
  352. }
  353. func (p *EthereumApi) WhisperMessages(id int, reply *interface{}) error {
  354. *reply = p.xeth().Whisper().Messages(id)
  355. return nil
  356. }
  357. func (p *EthereumApi) GetTransactionByHash(hash string, reply *interface{}) error {
  358. tx := p.xeth().EthTransactionByHash(hash)
  359. if tx != nil {
  360. *reply = NewTransactionRes(tx)
  361. }
  362. return nil
  363. }
  364. func (p *EthereumApi) GetBlockByHash(blockhash string, includetx bool) (*BlockRes, error) {
  365. block := p.xeth().EthBlockByHash(blockhash)
  366. br := NewBlockRes(block)
  367. br.fullTx = includetx
  368. return br, nil
  369. }
  370. func (p *EthereumApi) GetBlockByNumber(blocknum int64, includetx bool) (*BlockRes, error) {
  371. block := p.xeth().EthBlockByNumber(blocknum)
  372. br := NewBlockRes(block)
  373. br.fullTx = includetx
  374. return br, nil
  375. }
  376. func (p *EthereumApi) GetBlockTransactionCountByHash(blockhash string) (int64, error) {
  377. block := p.xeth().EthBlockByHash(blockhash)
  378. br := NewBlockRes(block)
  379. return int64(len(br.Transactions)), nil
  380. }
  381. func (p *EthereumApi) GetBlockTransactionCountByNumber(blocknum int64) (int64, error) {
  382. block := p.xeth().EthBlockByNumber(blocknum)
  383. br := NewBlockRes(block)
  384. return int64(len(br.Transactions)), nil
  385. }
  386. func (p *EthereumApi) GetBlockUncleCountByHash(blockhash string) (int64, error) {
  387. block := p.xeth().EthBlockByHash(blockhash)
  388. br := NewBlockRes(block)
  389. return int64(len(br.Uncles)), nil
  390. }
  391. func (p *EthereumApi) GetBlockUncleCountByNumber(blocknum int64) (int64, error) {
  392. block := p.xeth().EthBlockByNumber(blocknum)
  393. br := NewBlockRes(block)
  394. return int64(len(br.Uncles)), nil
  395. }
  396. func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error {
  397. // Spec at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC
  398. rpclogger.Debugf("%s %s", req.Method, req.Params)
  399. switch req.Method {
  400. case "web3_sha3":
  401. args := new(Sha3Args)
  402. if err := json.Unmarshal(req.Params, &args); err != nil {
  403. return err
  404. }
  405. *reply = common.ToHex(crypto.Sha3(common.FromHex(args.Data)))
  406. case "web3_clientVersion":
  407. *reply = p.xeth().Backend().Version()
  408. case "net_version":
  409. return NewNotImplementedError(req.Method)
  410. case "net_listening":
  411. *reply = p.xeth().IsListening()
  412. case "net_peerCount":
  413. *reply = common.ToHex(big.NewInt(int64(p.xeth().PeerCount())).Bytes())
  414. case "eth_coinbase":
  415. // TODO handling of empty coinbase due to lack of accounts
  416. res := p.xeth().Coinbase()
  417. if res == "0x" || res == "0x0" {
  418. *reply = nil
  419. } else {
  420. *reply = res
  421. }
  422. case "eth_mining":
  423. *reply = p.xeth().IsMining()
  424. case "eth_gasPrice":
  425. *reply = common.ToHex(defaultGasPrice.Bytes())
  426. case "eth_accounts":
  427. *reply = p.xeth().Accounts()
  428. case "eth_blockNumber":
  429. *reply = common.ToHex(p.xeth().Backend().ChainManager().CurrentBlock().Number().Bytes())
  430. case "eth_getBalance":
  431. args := new(GetBalanceArgs)
  432. if err := json.Unmarshal(req.Params, &args); err != nil {
  433. return err
  434. }
  435. return p.GetBalance(args, reply)
  436. case "eth_getStorage", "eth_storageAt":
  437. args := new(GetStorageArgs)
  438. if err := json.Unmarshal(req.Params, &args); err != nil {
  439. return err
  440. }
  441. return p.GetStorage(args, reply)
  442. case "eth_getStorageAt":
  443. args := new(GetStorageAtArgs)
  444. if err := json.Unmarshal(req.Params, &args); err != nil {
  445. return err
  446. }
  447. return p.GetStorageAt(args, reply)
  448. case "eth_getTransactionCount":
  449. args := new(GetTxCountArgs)
  450. if err := json.Unmarshal(req.Params, &args); err != nil {
  451. return err
  452. }
  453. return p.GetTxCountAt(args, reply)
  454. case "eth_getBlockTransactionCountByHash":
  455. args := new(GetBlockByHashArgs)
  456. if err := json.Unmarshal(req.Params, &args); err != nil {
  457. return err
  458. }
  459. v, err := p.GetBlockTransactionCountByHash(args.BlockHash)
  460. if err != nil {
  461. return err
  462. }
  463. *reply = common.ToHex(big.NewInt(v).Bytes())
  464. case "eth_getBlockTransactionCountByNumber":
  465. args := new(GetBlockByNumberArgs)
  466. if err := json.Unmarshal(req.Params, &args); err != nil {
  467. return err
  468. }
  469. v, err := p.GetBlockTransactionCountByNumber(args.BlockNumber)
  470. if err != nil {
  471. return err
  472. }
  473. *reply = common.ToHex(big.NewInt(v).Bytes())
  474. case "eth_getUncleCountByBlockHash":
  475. args := new(GetBlockByHashArgs)
  476. if err := json.Unmarshal(req.Params, &args); err != nil {
  477. return err
  478. }
  479. v, err := p.GetBlockUncleCountByHash(args.BlockHash)
  480. if err != nil {
  481. return err
  482. }
  483. *reply = common.ToHex(big.NewInt(v).Bytes())
  484. case "eth_getUncleCountByBlockNumber":
  485. args := new(GetBlockByNumberArgs)
  486. if err := json.Unmarshal(req.Params, &args); err != nil {
  487. return err
  488. }
  489. v, err := p.GetBlockUncleCountByNumber(args.BlockNumber)
  490. if err != nil {
  491. return err
  492. }
  493. *reply = common.ToHex(big.NewInt(v).Bytes())
  494. case "eth_getData", "eth_getCode":
  495. args := new(GetDataArgs)
  496. if err := json.Unmarshal(req.Params, &args); err != nil {
  497. return err
  498. }
  499. return p.GetData(args, reply)
  500. case "eth_sendTransaction", "eth_transact":
  501. args := new(NewTxArgs)
  502. if err := json.Unmarshal(req.Params, &args); err != nil {
  503. return err
  504. }
  505. return p.Transact(args, reply)
  506. case "eth_call":
  507. args := new(NewTxArgs)
  508. if err := json.Unmarshal(req.Params, &args); err != nil {
  509. return err
  510. }
  511. return p.Call(args, reply)
  512. case "eth_flush":
  513. return NewNotImplementedError(req.Method)
  514. case "eth_getBlockByHash":
  515. args := new(GetBlockByHashArgs)
  516. if err := json.Unmarshal(req.Params, &args); err != nil {
  517. return err
  518. }
  519. v, err := p.GetBlockByHash(args.BlockHash, args.Transactions)
  520. if err != nil {
  521. return err
  522. }
  523. *reply = v
  524. case "eth_getBlockByNumber":
  525. args := new(GetBlockByNumberArgs)
  526. if err := json.Unmarshal(req.Params, &args); err != nil {
  527. return err
  528. }
  529. v, err := p.GetBlockByNumber(args.BlockNumber, args.Transactions)
  530. if err != nil {
  531. return err
  532. }
  533. *reply = v
  534. case "eth_getTransactionByHash":
  535. // HashIndexArgs used, but only the "Hash" part we need.
  536. args := new(HashIndexArgs)
  537. if err := json.Unmarshal(req.Params, &args); err != nil {
  538. }
  539. return p.GetTransactionByHash(args.Hash, reply)
  540. case "eth_getTransactionByBlockHashAndIndex":
  541. args := new(HashIndexArgs)
  542. if err := json.Unmarshal(req.Params, &args); err != nil {
  543. return err
  544. }
  545. v, err := p.GetBlockByHash(args.Hash, true)
  546. if err != nil {
  547. return err
  548. }
  549. if args.Index > int64(len(v.Transactions)) || args.Index < 0 {
  550. return NewValidationError("Index", "does not exist")
  551. }
  552. *reply = v.Transactions[args.Index]
  553. case "eth_getTransactionByBlockNumberAndIndex":
  554. args := new(BlockNumIndexArgs)
  555. if err := json.Unmarshal(req.Params, &args); err != nil {
  556. return err
  557. }
  558. v, err := p.GetBlockByNumber(args.BlockNumber, true)
  559. if err != nil {
  560. return err
  561. }
  562. if args.Index > int64(len(v.Transactions)) || args.Index < 0 {
  563. return NewValidationError("Index", "does not exist")
  564. }
  565. *reply = v.Transactions[args.Index]
  566. case "eth_getUncleByBlockHashAndIndex":
  567. args := new(HashIndexArgs)
  568. if err := json.Unmarshal(req.Params, &args); err != nil {
  569. return err
  570. }
  571. v, err := p.GetBlockByHash(args.Hash, false)
  572. if err != nil {
  573. return err
  574. }
  575. if args.Index > int64(len(v.Uncles)) || args.Index < 0 {
  576. return NewValidationError("Index", "does not exist")
  577. }
  578. uncle, err := p.GetBlockByHash(v.Uncles[args.Index].Hex(), false)
  579. if err != nil {
  580. return err
  581. }
  582. *reply = uncle
  583. case "eth_getUncleByBlockNumberAndIndex":
  584. args := new(BlockNumIndexArgs)
  585. if err := json.Unmarshal(req.Params, &args); err != nil {
  586. return err
  587. }
  588. v, err := p.GetBlockByNumber(args.BlockNumber, true)
  589. if err != nil {
  590. return err
  591. }
  592. if args.Index > int64(len(v.Uncles)) || args.Index < 0 {
  593. return NewValidationError("Index", "does not exist")
  594. }
  595. uncle, err := p.GetBlockByHash(v.Uncles[args.Index].Hex(), false)
  596. if err != nil {
  597. return err
  598. }
  599. *reply = uncle
  600. case "eth_getCompilers":
  601. return p.GetCompilers(reply)
  602. case "eth_compileSolidity", "eth_compileLLL", "eth_compileSerpent":
  603. return NewNotImplementedError(req.Method)
  604. case "eth_newFilter":
  605. args := new(FilterOptions)
  606. if err := json.Unmarshal(req.Params, &args); err != nil {
  607. return err
  608. }
  609. return p.NewFilter(args, reply)
  610. case "eth_newBlockFilter":
  611. args := new(FilterStringArgs)
  612. if err := json.Unmarshal(req.Params, &args); err != nil {
  613. return err
  614. }
  615. return p.NewFilterString(args, reply)
  616. case "eth_uninstallFilter":
  617. args := new(FilterIdArgs)
  618. if err := json.Unmarshal(req.Params, &args); err != nil {
  619. return err
  620. }
  621. return p.UninstallFilter(args.Id, reply)
  622. case "eth_getFilterChanges":
  623. args := new(FilterIdArgs)
  624. if err := json.Unmarshal(req.Params, &args); err != nil {
  625. return err
  626. }
  627. return p.FilterChanged(args.Id, reply)
  628. case "eth_getFilterLogs":
  629. args := new(FilterIdArgs)
  630. if err := json.Unmarshal(req.Params, &args); err != nil {
  631. return err
  632. }
  633. return p.Logs(args.Id, reply)
  634. case "eth_getLogs":
  635. args := new(FilterOptions)
  636. if err := json.Unmarshal(req.Params, &args); err != nil {
  637. return err
  638. }
  639. return p.AllLogs(args, reply)
  640. case "eth_getWork", "eth_submitWork":
  641. return NewNotImplementedError(req.Method)
  642. case "db_putString":
  643. args := new(DbArgs)
  644. if err := json.Unmarshal(req.Params, &args); err != nil {
  645. return err
  646. }
  647. return p.DbPut(args, reply)
  648. case "db_getString":
  649. args := new(DbArgs)
  650. if err := json.Unmarshal(req.Params, &args); err != nil {
  651. return err
  652. }
  653. return p.DbGet(args, reply)
  654. case "db_putHex", "db_getHex":
  655. return NewNotImplementedError(req.Method)
  656. case "shh_post":
  657. args := new(WhisperMessageArgs)
  658. if err := json.Unmarshal(req.Params, &args); err != nil {
  659. return err
  660. }
  661. return p.WhisperPost(args, reply)
  662. case "shh_newIdentity":
  663. return p.NewWhisperIdentity(reply)
  664. // case "shh_removeIdentity":
  665. // args := new(WhisperIdentityArgs)
  666. // if err := json.Unmarshal(req.Params, &args); err != nil {
  667. // return err
  668. // }
  669. // return p.RemoveWhisperIdentity(args, reply)
  670. case "shh_hasIdentity":
  671. args := new(WhisperIdentityArgs)
  672. if err := json.Unmarshal(req.Params, &args); err != nil {
  673. return err
  674. }
  675. return p.HasWhisperIdentity(args.Identity, reply)
  676. case "shh_newGroup", "shh_addToGroup":
  677. return NewNotImplementedError(req.Method)
  678. case "shh_newFilter":
  679. args := new(WhisperFilterArgs)
  680. if err := json.Unmarshal(req.Params, &args); err != nil {
  681. return err
  682. }
  683. return p.NewWhisperFilter(args, reply)
  684. case "shh_uninstallFilter":
  685. args := new(FilterIdArgs)
  686. if err := json.Unmarshal(req.Params, &args); err != nil {
  687. return err
  688. }
  689. return p.UninstallWhisperFilter(args.Id, reply)
  690. case "shh_getFilterChanges":
  691. args := new(FilterIdArgs)
  692. if err := json.Unmarshal(req.Params, &args); err != nil {
  693. return err
  694. }
  695. return p.MessagesChanged(args.Id, reply)
  696. case "shh_getMessages":
  697. args := new(FilterIdArgs)
  698. if err := json.Unmarshal(req.Params, &args); err != nil {
  699. return err
  700. }
  701. return p.WhisperMessages(args.Id, reply)
  702. // case "eth_register":
  703. // args, err := req.ToRegisterArgs()
  704. // if err != nil {
  705. // return err
  706. // }
  707. // return p.Register(args, reply)
  708. // case "eth_unregister":
  709. // args, err := req.ToRegisterArgs()
  710. // if err != nil {
  711. // return err
  712. // }
  713. // return p.Unregister(args, reply)
  714. // case "eth_watchTx":
  715. // args, err := req.ToWatchTxArgs()
  716. // if err != nil {
  717. // return err
  718. // }
  719. // return p.WatchTx(args, reply)
  720. default:
  721. return NewNotImplementedError(req.Method)
  722. }
  723. rpclogger.DebugDetailf("Reply: %T %s", reply, reply)
  724. return nil
  725. }
  726. func (self *EthereumApi) xeth() *xeth.XEth {
  727. self.xethMu.RLock()
  728. defer self.xethMu.RUnlock()
  729. return self.eth
  730. }
  731. func toFilterOptions(options *FilterOptions) core.FilterOptions {
  732. var opts core.FilterOptions
  733. // Convert optional address slice/string to byte slice
  734. if str, ok := options.Address.(string); ok {
  735. opts.Address = []common.Address{common.HexToAddress(str)}
  736. } else if slice, ok := options.Address.([]interface{}); ok {
  737. bslice := make([]common.Address, len(slice))
  738. for i, addr := range slice {
  739. if saddr, ok := addr.(string); ok {
  740. bslice[i] = common.HexToAddress(saddr)
  741. }
  742. }
  743. opts.Address = bslice
  744. }
  745. opts.Earliest = options.Earliest
  746. opts.Latest = options.Latest
  747. topics := make([][]common.Hash, len(options.Topics))
  748. for i, topicDat := range options.Topics {
  749. if slice, ok := topicDat.([]interface{}); ok {
  750. topics[i] = make([]common.Hash, len(slice))
  751. for j, topic := range slice {
  752. topics[i][j] = common.HexToHash(topic.(string))
  753. }
  754. } else if str, ok := topicDat.(string); ok {
  755. topics[i] = []common.Hash{common.HexToHash(str)}
  756. }
  757. }
  758. opts.Topics = topics
  759. return opts
  760. }