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  }