github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/p2pserver/actor/server/actor.go (about)

     1  package server
     2  
     3  import (
     4  	"reflect"
     5  
     6  	"github.com/sixexorg/magnetic-ring/account"
     7  	"github.com/sixexorg/magnetic-ring/consense/dpoa/comm"
     8  	"github.com/sixexorg/magnetic-ring/meacount"
     9  
    10  	"fmt"
    11  
    12  	"github.com/ontio/ontology-eventbus/actor"
    13  	"github.com/sixexorg/magnetic-ring/log"
    14  	"github.com/sixexorg/magnetic-ring/p2pserver"
    15  	"github.com/sixexorg/magnetic-ring/p2pserver/common"
    16  )
    17  
    18  type P2PActor struct {
    19  	props  *actor.Props
    20  	server *p2pserver.P2PServer
    21  }
    22  
    23  // NewP2PActor creates an actor to handle the messages from
    24  // txnpool and consensus
    25  func NewP2PActor(p2pServer *p2pserver.P2PServer) *P2PActor {
    26  	return &P2PActor{
    27  		server: p2pServer,
    28  	}
    29  }
    30  
    31  //start a actor called net_server
    32  func (this *P2PActor) Start() (*actor.PID, error) {
    33  	this.props = actor.FromProducer(func() actor.Actor { return this })
    34  	p2pPid, err := actor.SpawnNamed(this.props, "net_server")
    35  	return p2pPid, err
    36  }
    37  
    38  //message handler
    39  func (this *P2PActor) Receive(ctx actor.Context) {
    40  	switch msg := ctx.Message().(type) {
    41  	case *actor.Restarting:
    42  		log.Warn("[p2p]actor restarting")
    43  	case *actor.Stopping:
    44  		log.Warn("[p2p]actor stopping")
    45  	case *actor.Stopped:
    46  		log.Warn("[p2p]actor stopped")
    47  	case *actor.Started:
    48  		log.Debug("[p2p]actor started")
    49  	case *actor.Restart:
    50  		log.Warn("[p2p]actor restart")
    51  	case *StopServerReq:
    52  		this.handleStopServerReq(ctx, msg)
    53  	case *GetPortReq:
    54  		this.handleGetPortReq(ctx, msg)
    55  	case *GetVersionReq:
    56  		this.handleGetVersionReq(ctx, msg)
    57  	case *GetConnectionCntReq:
    58  		this.handleGetConnectionCntReq(ctx, msg)
    59  	case *GetSyncPortReq:
    60  		this.handleGetSyncPortReq(ctx, msg)
    61  	case *GetConsPortReq:
    62  		this.handleGetConsPortReq(ctx, msg)
    63  	case *GetIdReq:
    64  		this.handleGetIDReq(ctx, msg)
    65  	case *GetConnectionStateReq:
    66  		this.handleGetConnectionStateReq(ctx, msg)
    67  	case *GetTimeReq:
    68  		this.handleGetTimeReq(ctx, msg)
    69  	case *GetNeighborAddrsReq:
    70  		this.handleGetNeighborAddrsReq(ctx, msg)
    71  	case *GetRelayStateReq:
    72  		this.handleGetRelayStateReq(ctx, msg)
    73  	case *GetNodeTypeReq:
    74  		this.handleGetNodeTypeReq(ctx, msg)
    75  	case *TransmitConsensusMsgReq:
    76  		this.handleTransmitConsensusMsgReq(ctx, msg)
    77  	case *common.AppendPeerID:
    78  		this.server.OnAddNode(msg.ID)
    79  	case *common.RemovePeerID:
    80  		this.server.OnDelNode(msg.ID)
    81  	case *common.AppendHeaders: // recv headrs sync main and org
    82  		if msg.SyncType == common.SYNC_DATA_MAIN {
    83  			this.server.OnHeaderReceive(msg.FromID, msg.Headers)
    84  		} else if msg.SyncType == common.SYNC_DATA_ORG {
    85  			this.server.OrgHeaderReceive(msg.FromID, msg.HeaderOrgs, msg.OrgID)
    86  		}
    87  	case *common.AppendBlock: // recv blocks sync main and org
    88  		if msg.SyncType == common.SYNC_DATA_MAIN {
    89  			this.server.OnBlockReceive(msg.FromID, msg.BlockSize, msg.Block)
    90  		} else if msg.SyncType == common.SYNC_DATA_ORG {
    91  			this.server.OrgBlockReceive(msg.FromID, msg.BlockSize, msg.BlockOrg, msg.OrgID)
    92  		}
    93  	case *common.HandleOrg:
    94  		//if msg.BAdd {
    95  		//	this.server.AddOrg(msg.OrgID)
    96  		//} else {
    97  		//	this.server.DelOrg(msg.OrgID)
    98  		//}
    99  	case *common.HandleAddDelOrgPeerID:
   100  		if msg.BAdd {
   101  			for _, orgid := range msg.OrgID {
   102  				this.server.OrgAddNode(msg.PeerID, orgid)
   103  			}
   104  		} else {
   105  			for _, orgid := range msg.OrgID {
   106  				this.server.OrgDelNode(msg.PeerID, orgid)
   107  			}
   108  		}
   109  	case *common.StellarNodeConnInfo:
   110  		log.Debug(" ****** msg.BAdd:", "badd", msg.BAdd)
   111  		if msg.BAdd {
   112  			this.server.StellarNodeAdd()
   113  		} else {
   114  			this.server.StellarNodeDel()
   115  		}
   116  	case *common.StellarAddDelPeerID:
   117  		log.Debug(" ****** msg.BAdd,msg.PeerID", "badd", msg.BAdd, "peerid", msg.PeerID)
   118  		if msg.BAdd {
   119  			this.server.RemoteAddStellarNode(msg.PeerID)
   120  		} else {
   121  			this.server.RemoteDelStellarNode(msg.PeerID)
   122  		}
   123  	case *common.ANodeConnInfo:
   124  		fmt.Println("β­• πŸ“© 🌐 set leagueId into node,the orgId is", msg.OrgId.ToString())
   125  		if msg.BAdd {
   126  			if !this.server.AddANode(msg.OrgId) {
   127  				log.Error("P2PActor Receive add ANode err", "OrgId", msg.OrgId)
   128  			}
   129  		} else {
   130  			this.server.DelANode(msg.OrgId)
   131  		}
   132  	case *common.PingPongSpcHandler:
   133  		this.server.HandlerPingPongSpc(msg)
   134  	case *common.StarConnedNodeAID:
   135  		this.server.StarConnedNodeAInfo(msg.PeerID)
   136  	case *common.OrgPendingData:
   137  
   138  		if msg.BANodeSrc {
   139  			fmt.Println("🌐  p2p actor β­•  block send to πŸ”†  for verification")
   140  			this.server.AToStellarPendingData(msg)
   141  		} else {
   142  			fmt.Println("🌐  p2p actor πŸ”†οΈ  block send to πŸ”†  for verification,will be occure timeout begin😀")
   143  			this.server.StellarToStellarPendingData(msg)
   144  		}
   145  	case *comm.ConsenseNotify:
   146  		this.handleSyncReqConsensusState(ctx, msg)
   147  	default:
   148  		err := this.server.Xmit(ctx.Message())
   149  		if nil != err {
   150  			log.Warn("[p2p]error xmit message", "err", err.Error(), "Message", reflect.TypeOf(ctx.Message()))
   151  		}
   152  	}
   153  }
   154  
   155  //stop handler
   156  func (this *P2PActor) handleStopServerReq(ctx actor.Context, req *StopServerReq) {
   157  	this.server.Stop()
   158  	if ctx.Sender() != nil {
   159  		resp := &StopServerRsp{}
   160  		ctx.Sender().Request(resp, ctx.Self())
   161  	}
   162  }
   163  
   164  //get port handler
   165  func (this *P2PActor) handleGetPortReq(ctx actor.Context, req *GetPortReq) {
   166  	syncPort, consPort := this.server.GetPort()
   167  	if ctx.Sender() != nil {
   168  		resp := &GetPortRsp{
   169  			SyncPort: syncPort,
   170  			ConsPort: consPort,
   171  		}
   172  		ctx.Sender().Request(resp, ctx.Self())
   173  	}
   174  }
   175  
   176  //version handler
   177  func (this *P2PActor) handleGetVersionReq(ctx actor.Context, req *GetVersionReq) {
   178  	version := this.server.GetVersion()
   179  	if ctx.Sender() != nil {
   180  		resp := &GetVersionRsp{
   181  			Version: version,
   182  		}
   183  		ctx.Sender().Request(resp, ctx.Self())
   184  	}
   185  }
   186  
   187  //connection count handler
   188  func (this *P2PActor) handleGetConnectionCntReq(ctx actor.Context, req *GetConnectionCntReq) {
   189  	cnt := this.server.GetConnectionCnt()
   190  	if ctx.Sender() != nil {
   191  		resp := &GetConnectionCntRsp{
   192  			Cnt: cnt,
   193  		}
   194  		ctx.Sender().Request(resp, ctx.Self())
   195  	}
   196  }
   197  
   198  //sync port handler
   199  func (this *P2PActor) handleGetSyncPortReq(ctx actor.Context, req *GetSyncPortReq) {
   200  	var syncPort uint16
   201  	//TODO
   202  	if ctx.Sender() != nil {
   203  		resp := &GetSyncPortRsp{
   204  			SyncPort: syncPort,
   205  		}
   206  		ctx.Sender().Request(resp, ctx.Self())
   207  	}
   208  }
   209  
   210  //consensus port handler
   211  func (this *P2PActor) handleGetConsPortReq(ctx actor.Context, req *GetConsPortReq) {
   212  	var consPort uint16
   213  	//TODO
   214  	if ctx.Sender() != nil {
   215  		resp := &GetConsPortRsp{
   216  			ConsPort: consPort,
   217  		}
   218  		ctx.Sender().Request(resp, ctx.Self())
   219  	}
   220  }
   221  
   222  //get id handler
   223  func (this *P2PActor) handleGetIDReq(ctx actor.Context, req *GetIdReq) {
   224  	id := this.server.GetID()
   225  	if ctx.Sender() != nil {
   226  		resp := &GetIdRsp{
   227  			Id: id,
   228  		}
   229  		ctx.Sender().Request(resp, ctx.Self())
   230  	}
   231  }
   232  
   233  //connection state handler
   234  func (this *P2PActor) handleGetConnectionStateReq(ctx actor.Context, req *GetConnectionStateReq) {
   235  	state := this.server.GetConnectionState()
   236  	if ctx.Sender() != nil {
   237  		resp := &GetConnectionStateRsp{
   238  			State: state,
   239  		}
   240  		ctx.Sender().Request(resp, ctx.Self())
   241  	}
   242  }
   243  
   244  //timestamp handler
   245  func (this *P2PActor) handleGetTimeReq(ctx actor.Context, req *GetTimeReq) {
   246  	time := this.server.GetTime()
   247  	if ctx.Sender() != nil {
   248  		resp := &GetTimeRsp{
   249  			Time: time,
   250  		}
   251  		ctx.Sender().Request(resp, ctx.Self())
   252  	}
   253  }
   254  
   255  //nbr peer`s address handler
   256  func (this *P2PActor) handleGetNeighborAddrsReq(ctx actor.Context, req *GetNeighborAddrsReq) {
   257  	addrs := this.server.GetNeighborAddrs()
   258  	if ctx.Sender() != nil {
   259  		resp := &GetNeighborAddrsRsp{
   260  			Addrs: addrs,
   261  		}
   262  		ctx.Sender().Request(resp, ctx.Self())
   263  	}
   264  }
   265  
   266  //peer`s relay state handler
   267  func (this *P2PActor) handleGetRelayStateReq(ctx actor.Context, req *GetRelayStateReq) {
   268  	ret := this.server.GetNetWork().GetRelay()
   269  	if ctx.Sender() != nil {
   270  		resp := &GetRelayStateRsp{
   271  			Relay: ret,
   272  		}
   273  		ctx.Sender().Request(resp, ctx.Self())
   274  	}
   275  }
   276  
   277  //peer`s service type handler
   278  func (this *P2PActor) handleGetNodeTypeReq(ctx actor.Context, req *GetNodeTypeReq) {
   279  	ret := this.server.GetNetWork().GetServices()
   280  	if ctx.Sender() != nil {
   281  		resp := &GetNodeTypeRsp{
   282  			NodeType: ret,
   283  		}
   284  		ctx.Sender().Request(resp, ctx.Self())
   285  	}
   286  }
   287  
   288  func (this *P2PActor) handleTransmitConsensusMsgReq(ctx actor.Context, req *TransmitConsensusMsgReq) {
   289  	peer := this.server.GetNetWork().GetPeer(req.Target)
   290  	if peer != nil {
   291  		this.server.Send(peer, req.Msg, true)
   292  	} else {
   293  		log.Warn("[p2p]can`t transmit consensus msg:no valid neighbor", "peer", req.Target)
   294  	}
   295  }
   296  
   297  func (this *P2PActor) handleSyncReqConsensusState(ctx actor.Context, req *comm.ConsenseNotify) {
   298  	fmt.Printf("handleSyncReqConsensusState:%+v\n", req)
   299  
   300  	if !req.Istart {
   301  		this.server.SetSyncStatus(false, 0)
   302  		return
   303  	}
   304  	act := meacount.GetOwner()
   305  	if act == nil {
   306  		log.Error("handleSyncReqConsensusState meacount.GetOwner is nil")
   307  		return
   308  	}
   309  
   310  	ndactImpl := act.(*account.NormalAccountImpl)
   311  	pubkstr := fmt.Sprintf("%x", ndactImpl.PublicKey().Bytes())
   312  
   313  	for _, pubk := range req.ProcNodes {
   314  		if pubk == pubkstr {
   315  			this.server.SetSyncStatus(true, req.BlkNum)
   316  			return
   317  		}
   318  	}
   319  }