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