extension

package
Version: v1.65.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 25, 2021 License: BSD-3-Clause Imports: 18 Imported by: 0

README

pubsub接口说明与介绍

pubsub是libp2p的订阅与发布功能,网络中的节点可以订阅其感兴趣的topic也可以称之为订阅主题
一个节点可以向主题(topic)发送消息,每个发送的消息都可以传递给所有订阅该主题的节点。
pubsub的特点
在pub/sub系统中,所有的节点都参与网络消息的传递。pub/sub系统有几种不同的设计,
可以提供不同的权衡,包含如下属性:
  • 可靠性

    所有的消息都要传递给订阅了该主题的节点。

  • 传播速度

    快速的传递消息。

  • 传播效率

    网络不会被过多的消息副本淹没。

  • 弹性

    节点可以加入并离开网络,而不会引起网络消息的中断。

  • 规模

    可以满足大量的节点订阅相同的消息主题

  • 简便性

    该系统设计的要易于理解和实施

pubsub在chain33中用途
pubsub基础功能集成在chain33/system/p2p/dht/net/pubsub.go中,该功能主要包含订阅topic,向
topic 发送消息,删除主题,获取已经订阅的topic.

目前pubsub功能刷线应用在chain33平行链模块,主要应用于在平行链内部共识期间的消息广播。
chain33平行链使用相关功能,需要先通过queue消息处理模块 发送相关消息事件注册自己的模块名与要订阅的topic,
当有相关topic消息过来之后,pubsub就会通过queue 把接收到消息转发给注册的相应模块。
后期计划用pubsub去掉chain33的tx广播功能。
接口说明

1 创建pubsub对象

func NewPubSub(ctx context.Context, host host.Host) (*PubSub, error) 

2 订阅topic


func (p *PubSub) JoinTopicAndSubTopic(topic string, callback subCallBack, opts ...pubsub.TopicOpt) error 
  • callback是一个回调函数指针,用于注册接收订阅消息后的后续处理。

3 发布消息

func (p *PubSub) Publish(topic string, msg []byte) error
  • topic 指定相应的topic
  • msg 要发布的消息

4 删除topic

func (p *PubSub) RemoveTopic(topic string) 

5 获取订阅相关topic的peer列表

func (p *PubSub) FetchTopicPeers(topic string) []peer.ID 
  1. 查询订阅的topic 列表
func (p *PubSub) GetTopics() []string 

Relay接口说明与介绍

在去中心化场景下,我们总是希望节点能够直接与其他节点进行通信。然而实际上,许多节点是无法访问的,因为它们可能存在 NAT 穿透问题,或使用的平台不允许外部访问。
为了解决这个问题, libp2p 提供了一种名为 relay 的协议,允许节点充当另外两个节点的 proxy 代理。所有的通信都经过加密,并且经过远程身份认证,所以代理服务不会遭遇中间人攻击( man-in-the-middle )。

Relay的特点
Relay 功能需要一些有中继功能的节点作为proxy。

pubsub在chain33中用途
中继功能目前还没有实际应用在chain33中,作为探索开发,为以后chain33有实际需求后,提供储备。
接口说明
  1. 创建Relay 对象
func NewRelayDiscovery(host host.Host, adv *discovery.RoutingDiscovery, opts ...circuit.RelayOpt) *Relay 
  • opts 在创建Relay对象的时候,需要设置RelayOption 如果计划自身节点作为中继节点则需要设置为RelayHop,用户接受其他节点 发过来的中继请求,中继服务端必须配置。RelayDiscovery 作为客户端请求放必须配置。

                peer:a,b,c 
                a config RelayDiscovery
                b config RelayHop,RelayActive
                c config nothing
                a->b a connect b
                a.DialPeer(b,c) will success
                
                if b just config RelayHop,a->b a connect b
                a.DialPeer(b,c) will failed
    
                if  b just config RelayHop,a->b,b->c 
                a.DialPeer(b,c) will success

2 发现中继节点

func (r *Relay) FindOpPeers() ([]peer.AddrInfo, error) 

3 通过hop中继节点连接dest 目标节点

func (r *Relay) DialDestPeer(host host.Host, hop, dst peer.AddrInfo) (*circuit.Conn, error)

4 检查节点是否是中继节点

func (r *Relay) CheckHOp(host host.Host, isop peer.ID) (bool, error) 

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func WithRelayAddrs

func WithRelayAddrs(relays []string) config.AddrsFactory

WithRelayAddrs 会自动把relay的地址加入到自己的addrs 中,然后进行广播,这样其他节点收到包含有relay地址格式的节点地址时, 如果接收到的节点打开了启用relay服务功能,就会触发relay协议进行尝试连接。

			比如 中继服务器R的地址:/ip4/116.63.171.186/tcp/13801/p2p/16Uiu2HAm1Qgogf1vHj7WV7d8YmVNPw6PzRuYEnJbQsMDmDWtLoEM
			NAT 后面的一个普通节点A是:/ip4/192.168.1.101/tcp/13801/p2p/16Uiu2HAkw6w2YVenbCLAXHv2XVo1kh945GVxQrpm5Y6z2kE3eFSg
		    第一步:A--->R  A连接到中继节点R
			第二步:A开始组装自己的中继地址:
		[/ip4/116.63.171.186/tcp/13801/p2p/16Uiu2HAm1Qgogf1vHj7WV7d8YmVNPw6PzRuYEnJbQsMDmDWtLoEM/p2p-circuit/ip4/192.168.1.101/tcp
	    /13801/p2p/16Uiu2HAkw6w2YVenbCLAXHv2XVo1kh945GVxQrpm5Y6z2kE3eFSg]
	        第三步:A广播这个拼接后的带有p2p-circuit的地址
	        第四步:网络中的节点不论是NAT前面的或者NAT后面的节点,如果想连接节点PID为16Uiu2HAkw6w2YVenbCLAXHv2XVo1kh945GVxQrpm5Y6z2kE3eFSg的A节点,
                   只需要通过上述组装的带有p2p-circuit的地址就可以建立到与A的连接

Types

type MDNS

type MDNS struct {
	Service discovery.Service
	// contains filtered or unexported fields
}

MDNS mdns

func NewMDNS

func NewMDNS(ctx context.Context, peerhost host.Host, serviceTag string) (*MDNS, error)

NewMDNS Initialize the MDNS service

func (*MDNS) PeerChan

func (m *MDNS) PeerChan() chan peer.AddrInfo

PeerChan returns a peer channel

type PubSub

type PubSub struct {
	// contains filtered or unexported fields
}

PubSub pub sub

func NewPubSub

func NewPubSub(ctx context.Context, host host.Host, opts ...pubsub.Option) (*PubSub, error)

NewPubSub new pub sub

func (*PubSub) FetchTopicPeers

func (p *PubSub) FetchTopicPeers(topic string) []peer.ID

FetchTopicPeers fetch peers with topic

func (*PubSub) GetTopics

func (p *PubSub) GetTopics() []string

GetTopics get topics

func (*PubSub) HasTopic

func (p *PubSub) HasTopic(topic string) bool

HasTopic check topic exist

func (*PubSub) JoinAndSubTopic

func (p *PubSub) JoinAndSubTopic(topic string, callback SubCallBack, opts ...pubsub.TopicOpt) error

JoinAndSubTopic 加入topic&subTopic

func (*PubSub) Publish

func (p *PubSub) Publish(topic string, msg []byte) error

Publish 发布消息

func (*PubSub) RemoveTopic

func (p *PubSub) RemoveTopic(topic string)

RemoveTopic remove topic

func (*PubSub) TopicNum

func (p *PubSub) TopicNum() int

TopicNum get topic number

type Relay

type Relay struct {
	// contains filtered or unexported fields
}

Relay p2p relay

func NewRelayDiscovery

func NewRelayDiscovery(host host.Host, adv *discovery.RoutingDiscovery, opts ...circuit.RelayOpt) *Relay

NewRelayDiscovery new relay discovery

func (*Relay) Advertise

func (r *Relay) Advertise(ctx context.Context)

Advertise 如果自己支持relay模式,愿意充当relay中继器,则需要调用此函数

func (*Relay) CheckHOp

func (r *Relay) CheckHOp(isop peer.ID) (bool, error)

CheckHOp 检查请求的节点是否支持relay中继

func (*Relay) DialDestPeer

func (r *Relay) DialDestPeer(hop, dst peer.AddrInfo) (*circuit.Conn, error)

DialDestPeer 通过hop中继节点连接dst节点

func (*Relay) FindOpPeers

func (r *Relay) FindOpPeers() ([]peer.AddrInfo, error)

FindOpPeers 如果需要用到中继相关功能,则需要先调用FindOpPeers查找到relay中继节点

type SubCallBack

type SubCallBack func(topic string, msg SubMsg)

SubCallBack 订阅消息回调函数

type SubMsg

type SubMsg *pubsub.Message

SubMsg sub message

type TopicMap

type TopicMap map[string]*topicinfo

TopicMap topic map

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
t or T : Toggle theme light dark auto
y or Y : Canonical URL