Documentation
¶
Index ¶
Constants ¶
const ( DefaultAliveTimeInterval = 5 * time.Second DefaultAliveExpirationTimeout = 5 * DefaultAliveTimeInterval DefaultAliveExpirationCheckInterval = DefaultAliveExpirationTimeout / 10 DefaultReconnectInterval = DefaultAliveExpirationTimeout DefaultMsgExpirationFactor = 20 DefaultMaxConnectionAttempts = 120 )
Variables ¶
This section is empty.
Functions ¶
func HasExternalEndpoint ¶
func HasExternalEndpoint(nm NetworkMember) bool
HasExternalEndpoint 可以告诉我们给定的 NetworkMember 是否拥有不为空的 external endpoint。
Types ¶
type AnchorPeerTracker ¶
AnchorPeerTracker 是一个传递给 discovery 的接口,用于检查端点是否是锚点 peer。
在 gossip 协议中,锚点 peer 是指在网络中作为固定参考点的特定节点。它通常是由网络管理员或系统设计者选择并预先配置的节点。 锚点 peer 的主要作用是提供网络的可靠性和稳定性。通过设置锚点 peer,可以确保网络中至少存在一些可信赖的节点,它们可以为其他节点提供准确的信息,并确保消息的可靠传递。
type CommService ¶
type CommService interface { Gossip(msg *protoext.SignedGossipMessage) SendToPeer(peer *NetworkMember, msg *protoext.SignedGossipMessage) // Ping 向远程节点发送 ping 消息,然后返回一个布尔值表示对方是否回应了 pong。 Ping(peer *NetworkMember) bool // Accept 返回一个 read-only 通道,其中存储着从远程节点那里收到的消息。 Accept() <-chan protoext.ReceivedMessage // 返回一个 read-only 通道,其中存储着那些假定 dead peer。 PresumedDead() <-chan common.PKIid // CloseConn 关闭与给定的节点之间的连接。 CloseConn(peer *NetworkMember) // Forwar 将报文转发至下一跳,但不会将报文转发给最初接收报文的那一跳。 Forward(msg protoext.ReceivedMessage) // IdentitySwitch 返回一个 read-only 通道,其中存储着那些身份改变的 peer。 IdentitySwitch() <-chan common.PKIid }
type CryptoService ¶
type CryptoService interface { // 验证 alive 消息是否被认证 ValidateAliveMsg(message *protoext.SignedGossipMessage) bool // 签署消息 SignMessage(m *pbgossip.GossipMessage, internalEndpoint string) *pbgossip.Envelope }
type DisclosurePolicy ¶
type DisclosurePolicy func(nm *NetworkMember) (Sieve, EnvelopeFilter)
DisclosurePolicy 定义了某个远程 peer 有资格了解哪些信息,以及有资格了解某个 SignedGossipMessage 中的哪些信息。
type Discovery ¶
type Discovery interface { // 根据提供的 peer 节点的 PKI-ID,搜寻并返回其对应关联的 NetworkMember。 Lookup(pkiID common.PKIid) *NetworkMember // Self 返回该 instance 自身的 NetworkMember。 Self() NetworkMember // UpdateMetadata 更新该 instance 自身的元数据。 UpdateMetadata([]byte) // UpdateExternalEndpoint 更新该 instance 自身的 endpoint。 UpdateExternalEndpoint(string) // Stop 停止该 instance。 Stop() // GetMembership 返回当前 alive 的成员。 GetMembership() []NetworkMember // InitiateSync 向给定数量的 peer 节点发送 GossipMessage_MemReq 消息,询问它们所知道的网络成员信息。 InitiateSync(int) // Connect 使该实例与远程实例连接。identifier 参数是一个函数,可用于 // 识别对等程序,并断言其 PKI-ID、是否在对等程序的 org 中,以及操作是 // 否成功。 Connect(NetworkMember, identifier) }
func NewDiscoveryService ¶
func NewDiscoveryService(self NetworkMember, commService CommService, cryptoService CryptoService, disclosurePolicy DisclosurePolicy, config DiscoveryConfig, anchorPeerTracker AnchorPeerTracker, logger *hlogging.HyperchainLogger) Discovery
type DiscoveryConfig ¶
type DiscoveryConfig struct { AliveTimeInterval time.Duration // 用于发送 alive 消息的时间间隔 AliveExpirationTimeout time.Duration // alive 消息的过期时间 AliveExpirationCheckInterval time.Duration // 检查 alive 消息是否过期的时间间隔 ReconnectInterval time.Duration // 重连的时间间隔 MaxConnectionAttempts int // 最大连接尝试次数 MsgExpirationFactor int // 消息过期时间的因子 BootstrapPeers []string // 用于引导的节点 endpoint 列表 }
type EnvelopeFilter ¶
type EnvelopeFilter func(message *protoext.SignedGossipMessage) *pbgossip.Envelope
type Members ¶
type Members []NetworkMember
func (Members) ByID ¶
func (members Members) ByID() map[string]NetworkMember
func (Members) Filter ¶
func (members Members) Filter(filter func(nm NetworkMember) bool) Members
Filter 接收一个自定义的过滤器函数:func(nm NetworkMember) bool,经过此过滤器过滤的 NetworkMember 会被留下来, 其余的会被忽略掉。
func (Members) Map ¶
func (members Members) Map(f func(NetworkMember) NetworkMember) Members
Map 会逐个对 Members 里的对象调用给定的函数:func(NetworkMember) NetworkMember。
type NetworkMember ¶
type NetworkMember struct { Metadata []byte PKIid common.PKIid ExternalEndpoint string // endpoint 一般就是 IP 地址 port 的组合,例如 192.168.111.131:8000 InternalEndpoint string Properties *pbgossip.Properties Envelope *pbgossip.Envelope }
NetworkMember 结构体的作用是表示网络中的成员(peer)的信息。它包含了成员的地址、 元数据、PKIid(公钥基础设施标识符)、属性、以及一个Envelope(信封)对象,用于在 成员之间传递信息。该结构体用于描述网络中的各个成员,以便进行通信和交互。
func (NetworkMember) Clone ¶
func (nm NetworkMember) Clone() NetworkMember
func (NetworkMember) PreferredEndpoint ¶
func (nm NetworkMember) PreferredEndpoint() string
PreferredEndpoint 如果peer节点的InternalEndpoint不为空,那么它会优先选择连接到InternalEndpoint而不是标准的Endpoint。这通常与内部网络规则有关。
内部网络通常是指在同一个网络或子网内的节点之间的通信。这些节点可能位于同一个机房、数据中心或私有云中。在这种情况下,使用内部网络连接可以提供更快的速度、更低的延迟和更高的带宽。 相比之下,标准的Endpoint通常是指外部网络或公共互联网上的节点之间的通信。使用公共互联网连接可能会受到网络拥塞、延迟高等因素的影响。 因此,peer节点更倾向于使用InternalEndpoint连接,是为了获得更可靠、更高效的网络连接,以提高节点间通信的性能和稳性。
func (NetworkMember) String ¶
func (nm NetworkMember) String() string
type PeerIdentification ¶
type PeerIdentification struct { PKIid common.PKIid SelfOrg bool // 对方是否与自己在同一组织内,在建立连接时,这个标志位如果等于 true,则表示对方节点与我在同一组织内,那么我就可以将我的 InternalEndpoint 发送给他。 }
PeerIdentification 结构体定义了对方 peer 节点的 PKI-ID,并且它其中的 SelfOrg 字段揭示了该 peer 节点是否与自己在同一组织内。
type Sieve ¶
type Sieve func(message *protoext.SignedGossipMessage) bool
Sieve 是一个筛子,返回的布尔值说明了是否能将报文发送给远程对等点。