api.go 23 KB

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