github.com/turingchain2020/turingchain@v1.1.21/system/p2p/dht/extension/readme.md (about)

     1  # pubsub接口说明与介绍
     2  ````
     3  pubsub是libp2p的订阅与发布功能,网络中的节点可以订阅其感兴趣的topic也可以称之为订阅主题
     4  一个节点可以向主题(topic)发送消息,每个发送的消息都可以传递给所有订阅该主题的节点。
     5  ````
     6  ### pubsub的特点
     7  
     8  ````
     9  在pub/sub系统中,所有的节点都参与网络消息的传递。pub/sub系统有几种不同的设计,
    10  可以提供不同的权衡,包含如下属性:
    11  ````
    12  * 可靠性
    13    > 所有的消息都要传递给订阅了该主题的节点。
    14  * 传播速度
    15    > 快速的传递消息。
    16  * 传播效率
    17    > 网络不会被过多的消息副本淹没。
    18  * 弹性
    19    > 节点可以加入并离开网络,而不会引起网络消息的中断。
    20  * 规模
    21    > 可以满足大量的节点订阅相同的消息主题
    22  * 简便性
    23    > 该系统设计的要易于理解和实施
    24          
    25  
    26  ### pubsub在turingchain中用途
    27  ````
    28  pubsub基础功能集成在turingchain/system/p2p/dht/net/pubsub.go中,该功能主要包含订阅topic,向
    29  topic 发送消息,删除主题,获取已经订阅的topic.
    30  
    31  目前pubsub功能刷线应用在turingchain平行链模块,主要应用于在平行链内部共识期间的消息广播。
    32  turingchain平行链使用相关功能,需要先通过queue消息处理模块 发送相关消息事件注册自己的模块名与要订阅的topic,
    33  当有相关topic消息过来之后,pubsub就会通过queue 把接收到消息转发给注册的相应模块。
    34  后期计划用pubsub去掉turingchain的tx广播功能。
    35  ````
    36  #### 接口说明
    37  
    38  1 创建pubsub对象
    39  
    40  
    41  ```gotemplate
    42  func NewPubSub(ctx context.Context, host host.Host) (*PubSub, error) 
    43  ```
    44  
    45  
    46  2  订阅topic
    47  
    48  ```gotemplate
    49  
    50  func (p *PubSub) JoinTopicAndSubTopic(topic string, callback subCallBack, opts ...pubsub.TopicOpt) error 
    51  ``` 
    52  - callback是一个回调函数指针,用于注册接收订阅消息后的后续处理。
    53  
    54  3 发布消息
    55  
    56  ```gotemplate
    57  func (p *PubSub) Publish(topic string, msg []byte) error
    58  ```
    59  
    60  - topic 指定相应的topic
    61  - msg 要发布的消息
    62  
    63  
    64  4 删除topic
    65  
    66  ```gotemplate
    67  func (p *PubSub) RemoveTopic(topic string) 
    68  ```
    69  
    70  5 获取订阅相关topic的peer列表
    71  
    72  ```gotemplate
    73  func (p *PubSub) FetchTopicPeers(topic string) []peer.ID 
    74  ```
    75  
    76  6. 查询订阅的topic 列表
    77  
    78  ```gotemplate
    79  func (p *PubSub) GetTopics() []string 
    80  ```
    81  
    82  
    83  
    84  # Relay接口说明与介绍
    85  
    86  ```
    87  在去中心化场景下,我们总是希望节点能够直接与其他节点进行通信。然而实际上,许多节点是无法访问的,因为它们可能存在 NAT 穿透问题,或使用的平台不允许外部访问。
    88  为了解决这个问题, libp2p 提供了一种名为 relay 的协议,允许节点充当另外两个节点的 proxy 代理。所有的通信都经过加密,并且经过远程身份认证,所以代理服务不会遭遇中间人攻击( man-in-the-middle )。
    89  
    90  ```
    91  
    92  ### Relay的特点
    93  
    94  ```
    95  Relay 功能需要一些有中继功能的节点作为proxy。
    96  
    97  ```
    98  
    99  ### pubsub在turingchain中用途
   100  ````
   101  中继功能目前还没有实际应用在turingchain中,作为探索开发,为以后turingchain有实际需求后,提供储备。
   102  ````
   103  
   104  
   105  #### 接口说明 
   106  
   107  1. 创建Relay 对象
   108  
   109  ````gotemplate
   110  func NewRelayDiscovery(host host.Host, adv *discovery.RoutingDiscovery, opts ...circuit.RelayOpt) *Relay 
   111  ````
   112  - opts 在创建Relay对象的时候,需要设置RelayOption 如果计划自身节点作为中继节点则需要设置为RelayHop,用户接受其他节点
   113  发过来的中继请求,中继服务端必须配置。RelayDiscovery 作为客户端请求放必须配置。
   114  
   115  ```gotemplate
   116  
   117                  peer:a,b,c 
   118                  a config RelayDiscovery
   119                  b config RelayHop,RelayActive
   120                  c config nothing
   121                  a->b a connect b
   122                  a.DialPeer(b,c) will success
   123                  
   124                  if b just config RelayHop,a->b a connect b
   125                  a.DialPeer(b,c) will failed
   126      
   127                  if  b just config RelayHop,a->b,b->c 
   128                  a.DialPeer(b,c) will success
   129  ```
   130               
   131  
   132  2  发现中继节点
   133  
   134  ```gotemplate
   135  func (r *Relay) FindOpPeers() ([]peer.AddrInfo, error) 
   136  ```
   137  
   138  3 通过hop中继节点连接dest 目标节点
   139  
   140  ````gotemplate
   141  func (r *Relay) DialDestPeer(host host.Host, hop, dst peer.AddrInfo) (*circuit.Conn, error)
   142  ````
   143  
   144  4 检查节点是否是中继节点
   145  
   146  ````gotemplate
   147  func (r *Relay) CheckHOp(host host.Host, isop peer.ID) (bool, error) 
   148  ````