github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/p2p/simulations/events.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2017 Go Ethereum作者 10 //此文件是Go以太坊库的一部分。 11 // 12 //Go-Ethereum库是免费软件:您可以重新分发它和/或修改 13 //根据GNU发布的较低通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊图书馆的发行目的是希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU较低的通用公共许可证,了解更多详细信息。 21 // 22 //你应该收到一份GNU较低级别的公共许可证副本 23 //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package simulations 26 27 import ( 28 "fmt" 29 "time" 30 ) 31 32 //EventType是模拟网络发出的事件类型 33 type EventType string 34 35 const ( 36 //EventTypeNode是当节点为 37 //创建、启动或停止 38 EventTypeNode EventType = "node" 39 40 //EventTypeConn是连接时发出的事件类型 41 //在两个节点之间建立或删除 42 EventTypeConn EventType = "conn" 43 44 //eventtypmsg是p2p消息时发出的事件类型。 45 //在两个节点之间发送 46 EventTypeMsg EventType = "msg" 47 ) 48 49 //事件是模拟网络发出的事件 50 type Event struct { 51 //类型是事件的类型 52 Type EventType `json:"type"` 53 54 //时间是事件发生的时间 55 Time time.Time `json:"time"` 56 57 //控件指示事件是否是受控件的结果 58 //网络中的操作 59 Control bool `json:"control"` 60 61 //如果类型为EventTypeNode,则设置节点 62 Node *Node `json:"node,omitempty"` 63 64 //如果类型为eventtypconn,则设置conn 65 Conn *Conn `json:"conn,omitempty"` 66 67 //如果类型为eventtypmsg,则设置msg。 68 Msg *Msg `json:"msg,omitempty"` 69 } 70 71 //NewEvent为给定对象创建一个新事件,该事件应为 72 //节点、连接或消息。 73 // 74 //复制对象以便事件表示对象的状态 75 //调用NewEvent时。 76 func NewEvent(v interface{}) *Event { 77 event := &Event{Time: time.Now()} 78 switch v := v.(type) { 79 case *Node: 80 event.Type = EventTypeNode 81 node := *v 82 event.Node = &node 83 case *Conn: 84 event.Type = EventTypeConn 85 conn := *v 86 event.Conn = &conn 87 case *Msg: 88 event.Type = EventTypeMsg 89 msg := *v 90 event.Msg = &msg 91 default: 92 panic(fmt.Sprintf("invalid event type: %T", v)) 93 } 94 return event 95 } 96 97 //ControlEvent创建新的控件事件 98 func ControlEvent(v interface{}) *Event { 99 event := NewEvent(v) 100 event.Control = true 101 return event 102 } 103 104 //字符串返回事件的字符串表示形式 105 func (e *Event) String() string { 106 switch e.Type { 107 case EventTypeNode: 108 return fmt.Sprintf("<node-event> id: %s up: %t", e.Node.ID().TerminalString(), e.Node.Up) 109 case EventTypeConn: 110 return fmt.Sprintf("<conn-event> nodes: %s->%s up: %t", e.Conn.One.TerminalString(), e.Conn.Other.TerminalString(), e.Conn.Up) 111 case EventTypeMsg: 112 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) 113 default: 114 return "" 115 } 116 }