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 }