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 ````