chain.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package dashboard
  2. import (
  3. "github.com/ethereum/go-ethereum/core"
  4. "github.com/ethereum/go-ethereum/event"
  5. "github.com/ethereum/go-ethereum/log"
  6. )
  7. type block struct {
  8. Number int64 `json:"number,omitempty"`
  9. Time uint64 `json:"timestamp,omitempty"`
  10. }
  11. func (db *Dashboard) collectChainData() {
  12. defer db.wg.Done()
  13. var (
  14. currentBlock *block
  15. chainCh chan core.ChainHeadEvent
  16. chainSub event.Subscription
  17. )
  18. switch {
  19. case db.ethServ != nil:
  20. chain := db.ethServ.BlockChain()
  21. currentBlock = &block{
  22. Number: chain.CurrentHeader().Number.Int64(),
  23. Time: chain.CurrentHeader().Time,
  24. }
  25. chainCh = make(chan core.ChainHeadEvent)
  26. chainSub = chain.SubscribeChainHeadEvent(chainCh)
  27. case db.lesServ != nil:
  28. chain := db.lesServ.BlockChain()
  29. currentBlock = &block{
  30. Number: chain.CurrentHeader().Number.Int64(),
  31. Time: chain.CurrentHeader().Time,
  32. }
  33. chainCh = make(chan core.ChainHeadEvent)
  34. chainSub = chain.SubscribeChainHeadEvent(chainCh)
  35. default:
  36. errc := <-db.quit
  37. errc <- nil
  38. return
  39. }
  40. defer chainSub.Unsubscribe()
  41. db.chainLock.Lock()
  42. db.history.Chain = &ChainMessage{
  43. CurrentBlock: currentBlock,
  44. }
  45. db.chainLock.Unlock()
  46. db.sendToAll(&Message{Chain: &ChainMessage{CurrentBlock: currentBlock}})
  47. for {
  48. select {
  49. case e := <-chainCh:
  50. currentBlock := &block{
  51. Number: e.Block.Number().Int64(),
  52. Time: e.Block.Time(),
  53. }
  54. db.chainLock.Lock()
  55. db.history.Chain = &ChainMessage{
  56. CurrentBlock: currentBlock,
  57. }
  58. db.chainLock.Unlock()
  59. db.sendToAll(&Message{Chain: &ChainMessage{CurrentBlock: currentBlock}})
  60. case err := <-chainSub.Err():
  61. log.Warn("Chain subscription error", "err", err)
  62. errc := <-db.quit
  63. errc <- nil
  64. return
  65. case errc := <-db.quit:
  66. errc <- nil
  67. return
  68. }
  69. }
  70. }