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  }