github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/p2p/simulations/events.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:44</date> 10 //</624342661058269184> 11 12 13 package simulations 14 15 import ( 16 "fmt" 17 "time" 18 ) 19 20 //EventType是模拟网络发出的事件类型 21 type EventType string 22 23 const ( 24 //EventTypeNode是当节点为 25 //创建、启动或停止 26 EventTypeNode EventType = "node" 27 28 //EventTypeConn是连接时发出的事件类型 29 //在两个节点之间建立或删除 30 EventTypeConn EventType = "conn" 31 32 //eventtypmsg是p2p消息时发出的事件类型。 33 //在两个节点之间发送 34 EventTypeMsg EventType = "msg" 35 ) 36 37 //事件是模拟网络发出的事件 38 type Event struct { 39 //类型是事件的类型 40 Type EventType `json:"type"` 41 42 //时间是事件发生的时间 43 Time time.Time `json:"time"` 44 45 //控件指示事件是否是受控件的结果 46 //网络中的操作 47 Control bool `json:"control"` 48 49 //如果类型为EventTypeNode,则设置节点 50 Node *Node `json:"node,omitempty"` 51 52 //如果类型为eventtypconn,则设置conn 53 Conn *Conn `json:"conn,omitempty"` 54 55 //如果类型为eventtypmsg,则设置msg。 56 Msg *Msg `json:"msg,omitempty"` 57 } 58 59 //NewEvent为给定对象创建一个新事件,该事件应为 60 //节点、连接或消息。 61 // 62 //复制对象以便事件表示对象的状态 63 //调用NewEvent时。 64 func NewEvent(v interface{}) *Event { 65 event := &Event{Time: time.Now()} 66 switch v := v.(type) { 67 case *Node: 68 event.Type = EventTypeNode 69 node := *v 70 event.Node = &node 71 case *Conn: 72 event.Type = EventTypeConn 73 conn := *v 74 event.Conn = &conn 75 case *Msg: 76 event.Type = EventTypeMsg 77 msg := *v 78 event.Msg = &msg 79 default: 80 panic(fmt.Sprintf("invalid event type: %T", v)) 81 } 82 return event 83 } 84 85 //ControlEvent创建新的控件事件 86 func ControlEvent(v interface{}) *Event { 87 event := NewEvent(v) 88 event.Control = true 89 return event 90 } 91 92 //字符串返回事件的字符串表示形式 93 func (e *Event) String() string { 94 switch e.Type { 95 case EventTypeNode: 96 return fmt.Sprintf("<node-event> id: %s up: %t", e.Node.ID().TerminalString(), e.Node.Up) 97 case EventTypeConn: 98 return fmt.Sprintf("<conn-event> nodes: %s->%s up: %t", e.Conn.One.TerminalString(), e.Conn.Other.TerminalString(), e.Conn.Up) 99 case EventTypeMsg: 100 return fmt.Sprintf("<msg-event> nodes: %s->%s proto: %s, code: %d, received: %t", e.Msg.One.TerminalString(), e.Msg.Other.TerminalString(), e.Msg.Protocol, e.Msg.Code, e.Msg.Received) 101 default: 102 return "" 103 } 104 } 105