![这里写图片描述](https://img-blog.csdn.net/20170117175958468?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmdfeGlueGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
1.网络初始化的过程中执行以下内容,在创建节点Engine过程中该节点作为客户端的身份连接到其他Peer
peerServer, err = peer.NewPeerWithEngine(secHelperFunc, helper.GetEngine)
2.返回一个使用提供的handler工厂函数,在新的聊天服务调用上创建新的handler句柄的Peer
func NewPeerWithEngine(secHelperFunc func() crypto.Peer, engFactory EngineFactory) (peer *Impl, err error) {
peer = new(Impl)
peerNodes := peer.initDiscovery()
peer.handlerMap = &handlerMap{m: make(map[pb.PeerID]MessageHandler)}
peer.isValidator = ValidatorEnabled()
peer.secHelper = secHelperFunc()
// 为peer安装安全对象
if SecurityEnabled() {
if peer.secHelper == nil {
return nil, fmt.Errorf("Security helper not provided")
}
}
// 在引擎之前初始化账本,因为共识可能希望立即开始询问账本
ledgerPtr, err := ledger.GetLedger()
if err != nil {
return nil, fmt.Errorf("Error constructing NewPeerWithHandler: %s", err)
}
peer.ledgerWrapper = &ledgerWrapper{ledger: ledgerPtr}
peer.engine, err = engFactory(peer)
if err != nil {
return nil, err
}
peer.handlerFactory = peer.engine.GetHandlerFactory()
if peer.handlerFactory == nil {
return nil, errors.New("Cannot supply nil handler factory")
}
peer.chatWithSomePeers(peerNodes)
return peer, nil
}
2.1.NewPeerWithHandler返回一个使用提供的handler工厂函数在新的聊天服务调用上创建新的handlers句柄的Peer,
func NewPeerWithHandler(secHelperFunc func() crypto.Peer, handlerFact HandlerFactory) (*Impl, error) {
peer := new(Impl)
peerNodes := peer.initDiscovery()
if handlerFact == nil {
return nil, errors.New("Cannot supply nil handler factory")
}
peer.handlerFactory = handlerFact
peer.handlerMap = &handlerMap{m: make(map[pb.PeerID]MessageHandler)}
peer.secHelper = secHelperFunc()
// 为peer安装安全对象
if SecurityEnabled() {
if peer.secHelper == nil {
return nil, fmt.Errorf("Security helper not provided")
}
}
ledgerPtr, err := ledger.GetLedger()
if err != nil {
return nil, fmt.Errorf("Error constructing NewPeerWithHandler: %s", err)
}
peer.ledgerWrapper = &ledgerWrapper{ledger: ledgerPtr}
peer.chatWithSomePeers(peerNodes)
return peer, nil
}
2.2.Discovery是合并引导peer成员选择和对于NVP节点的VP节点选择接口
type Discovery interface {
AddNode(string) bool // 添加一个地址到discovery列表
RemoveNode(string) bool // 从discovery列表中移出一个地址
GetAllNodes() []string // 返回这个节点维护的所有地址
GetRandomNodes(n int) []string // 返回这个peer连接的随机地址
FindNode(string) bool // 在discovery列表中找一个节点
}
// DiscoveryImpl是一个Discovery的实现
type DiscoveryImpl struct {
sync.RWMutex
nodes map[string]bool
seq []string
random *rand.Rand
}
// NewDiscoveryImpl 是一个Discovery实现的构造器
func NewDiscoveryImpl() *DiscoveryImpl {
di := DiscoveryImpl{}
di.nodes = make(map[string]bool)
di.random = rand.New(rand.NewSource(time.Now().Unix()))
return &di
}
// AddN