OSDN Git Service

6d4ebac9a6dc68696d24ee460e6003e038921063
[bytom/bytom.git] / contract / trace_updater.go
1 package contract
2
3 import (
4         log "github.com/sirupsen/logrus"
5 )
6
7 var logModule = "tracer"
8
9 type TraceUpdater struct {
10         *TraceService
11         chain ChainService
12 }
13
14 func NewTraceUpdater(traceService *TraceService, chain ChainService) *TraceUpdater {
15         return &TraceUpdater{
16                 TraceService: traceService,
17                 chain:        chain,
18         }
19 }
20
21 func (t *TraceUpdater) Sync() {
22         for {
23                 block, _ := t.chain.GetBlockByHeight(t.BestHeight() + 1)
24                 if block == nil {
25                         t.walletBlockWaiter()
26                         continue
27                 }
28
29                 if bestHash := t.BestHash(); block.PreviousBlockHash != bestHash {
30                         block, err := t.chain.GetBlockByHash(&bestHash)
31                         if err != nil {
32                                 log.WithFields(log.Fields{"module": logModule, "err": err, "block_hash": bestHash.String()}).Errorf("trace updater get block")
33                                 return
34                         }
35
36                         if err := t.DetachBlock(block); err != nil {
37                                 log.WithFields(log.Fields{"module": logModule, "err": err}).Error("trace updater detach block")
38                                 return
39                         }
40                 } else {
41                         if err := t.ApplyBlock(block); err != nil {
42                                 log.WithFields(log.Fields{"module": logModule, "err": err}).Error("trace updater attach block")
43                                 return
44                         }
45                 }
46         }
47 }
48
49 func (t *TraceUpdater) walletBlockWaiter() {
50         <-t.chain.BlockWaiter(t.bestHeight + 1)
51 }