github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/orgseeker/orgseeker.go (about) 1 package orgseeker 2 3 import ( 4 "fmt" 5 "github.com/sixexorg/magnetic-ring/central/entity" 6 "github.com/sixexorg/magnetic-ring/central/mongo/service/impl" 7 "github.com/sixexorg/magnetic-ring/common" 8 "github.com/sixexorg/magnetic-ring/core/orgchain/types" 9 "github.com/sixexorg/magnetic-ring/log" 10 orgstorages "github.com/sixexorg/magnetic-ring/store/orgchain/storages" 11 "gopkg.in/mgo.v2" 12 "time" 13 ) 14 15 type Seeker struct { 16 leagueId common.Address 17 ledger *orgstorages.LedgerStoreImp 18 19 MemberAddChan chan string 20 MemberOutChan chan string 21 txchan chan *types.Transaction 22 } 23 24 func (seeker *Seeker) dealMemberAddOrOut() { 25 for { 26 select { 27 case addr := <-seeker.MemberAddChan: 28 seeker.addMemeber(addr) 29 case addr := <-seeker.MemberOutChan: 30 seeker.delMemeber(addr) 31 case tx := <-seeker.txchan: 32 var uttotal uint64 = 0 33 if tx.TxType == types.RaiseUT { 34 uttotal = seeker.ledger.GetUTByHeight(tx.TxData.Start,common.Address{}).Uint64() 35 } 36 votedetail := &entity.VoteDetail{ 37 Id:tx.TransactionHash.String(), 38 Hoster:tx.TxData.From.ToString(), 39 UtBefore:uttotal, 40 Msg:tx.TxData.Msg.String(), 41 EndHeight:tx.TxData.End, 42 } 43 44 if tx.TxData.MetaBox !=nil { 45 votedetail.MetaBox=tx.TxData.MetaBox.Uint64() 46 } 47 48 err := impl.NewVoteDetailImpl(votedetail,seeker.leagueId.ToString()).Insert() 49 if err != nil { 50 log.Error("orgseeker.go insert votedetail","error",err) 51 } 52 } 53 } 54 } 55 56 func NewSeeker(leagueId common.Address, ledger *orgstorages.LedgerStoreImp) *Seeker { 57 return &Seeker{ 58 leagueId: leagueId, 59 ledger: ledger, 60 MemberAddChan: make(chan string, 1024), 61 MemberOutChan: make(chan string, 1024), 62 txchan: make(chan *types.Transaction, 1024), 63 } 64 } 65 66 func (seeker *Seeker) Start() { 67 go func() { 68 ticker := time.NewTicker(time.Second * 10) 69 for { 70 select { 71 case <-ticker.C: 72 seeker.seekBlock() 73 } 74 } 75 }() 76 go seeker.dealMemberAddOrOut() 77 } 78 79 func (seeker *Seeker) seekBlock() { 80 81 lhservice := impl.NewLeagueHeightImpl(nil, seeker.leagueId) 82 htor, err := lhservice.GetHeightor() 83 if err != nil { 84 log.Info("seek block failed,pnt=lhservice.GetHeightor()", "error", err) 85 86 if err != mgo.ErrNotFound { 87 return 88 } 89 90 htor = &entity.LeagueHeightor{seeker.leagueId.ToString(), 1} 91 lhservice = impl.NewLeagueHeightImpl(htor, seeker.leagueId) 92 err := lhservice.Insert() 93 if err != nil { 94 log.Error("seek block insert heightor failed", "error", err) 95 return 96 } 97 } 98 height := htor.Height 99 fmt.Printf("π leagueaddr=%s last height=%d\n",seeker.leagueId.ToString(), height) 100 101 block, err := seeker.ledger.GetBlockByHeight(height) 102 if err != nil { 103 log.Error("seek block seeker.ledger.GetBlockByHeight(height) failed", "error", err) 104 return 105 } 106 107 err = seeker.analysisBlock(block) 108 if err != nil { 109 log.Error("seek block analysisBlock(block) failed", "error", err) 110 return 111 } 112 113 height++ 114 err = lhservice.UpdateById(seeker.leagueId,height) 115 116 if err != nil { 117 fmt.Printf("π err=%v\n",err) 118 } 119 120 } 121 122 func (seeker *Seeker) analysisBlock(block *types.Block) error { 123 124 blockTime := block.Header.Timestamp 125 txns := block.Transactions 126 127 txs := make([]interface{}, 0) 128 129 chats := make([]interface{}, 0) 130 131 for _, tx := range txns { 132 133 if tx.TxType == types.RaiseUT || tx.TxType == types.Join || tx.TxType == types.Leave {//ζη₯¨δΊ€ζθ½εΊ 134 seeker.txchan<-tx 135 } 136 137 switch tx.TxType { 138 case types.TransferUT, types.EnergyFromMain, types.EnergyToMain: 139 tmp := &entity.OrgTxDto{ 140 Id: tx.TransactionHash.String(), 141 TxType: tx.TxType, 142 TransactionHash: tx.TransactionHash, 143 BlockTime: blockTime, 144 TxData: &entity.OrgTransferDataDto{ 145 From: tx.TxData.From, 146 Froms: tx.TxData.Froms, 147 Tos: tx.TxData.Tos, 148 Msg: tx.TxData.Msg, 149 Amount: tx.TxData.Amount, 150 Fee: tx.TxData.Fee, 151 Energy: tx.TxData.Energy, 152 }, 153 } 154 txs = append(txs, tmp) 155 156 case types.MSG, types.VoteIncreaseUT, types.ReplyVote, types.RaiseUT, types.Join: 157 tmpct := &entity.OrgChatDto{ 158 Id: tx.TransactionHash.String(), 159 Account: tx.TxData.From.ToString(), 160 Type: tx.TxType, 161 Msg: tx.TxData.Msg.String(), 162 Hash: tx.TransactionHash.String(), 163 Result: 0, 164 } 165 chats = append(chats, tmpct) 166 } 167 } 168 169 if len(txs) > 0 { 170 err := impl.NewOrgTxnsImpl(txs, seeker.leagueId.ToString()).Insert() 171 if err != nil { 172 return err 173 } 174 } 175 176 if len(chats) > 0 { 177 err := impl.NewOrgChatMsgImpl(chats, seeker.leagueId.ToString()).Insert() 178 if err != nil { 179 return err 180 } 181 } 182 183 return nil 184 } 185 186 func (seeker *Seeker) addMemeber(memberAddress string) error { 187 member := &entity.Member{memberAddress} 188 return impl.NewMemberImpl(member, seeker.leagueId.ToString()).Insert() 189 } 190 191 func (seeker *Seeker) delMemeber(memberAddress string) error { 192 member := &entity.Member{memberAddress} 193 return impl.NewMemberImpl(member, seeker.leagueId.ToString()).Delete() 194 }