### SetupDiscovery
```
// SetupDiscovery 建立發現機制,并將本地主機連接到所有已經發現的對等端(peer)
func SetupDiscovery(ctx context.Context, host host.Host) error {
// 開啟一個DHT,用于對等端(peer)發現。
// 我們不僅僅是創建一個新的DHT,因為我們要求每一個端維護它自己的本地DHT副本,這樣
// 以來,DHT的引導節點可以關閉,不會影響后續的對等端發現
? ? kademliaDHT, err := dht.New(ctx, host)
if err != nil {
panic(err)
}
// 引導DHT。在缺省設置下,這生成一個后臺線程,每5分鐘刷新對等端表格
? ? log.Info("引導DHT")
if err = kademliaDHT.Bootstrap(ctx); err != nil {
panic(err)
}
// 讓我們首先連接到所有的引導節點(bootstrap nodes),它們會告訴我們網絡中的其他節點
var wg sync.WaitGroup
for _, peerAddr := range dht.DefaultBootstrapPeers {
? ? ? ? peerinfo, _ := peer.AddrInfoFromP2pAddr(peerAddr)
? ? ? ? wg.Add(1)
//使用多個協程,加快連接處理
go func() {
defer wg.Done()
if err := host.Connect(ctx, *peerinfo); err != nil {
? ? ? ? log.Error(err)
} else {
? ? ?log.Info("連接已建立,使用的引導節點是:", *peerinfo)
}
}()
}
? ? wg.Wait()//阻塞,確保所有的協程全部返回
// 我們使用一個會合點“wlsell.com”來宣布我們的位置
// 這就像告訴你的朋友在某個具體的地點會合
? ? log.Info("宣布我們自己...")
routingDiscovery := discovery.NewRoutingDiscovery(kademliaDHT)
? ? discovery.Advertise(ctx, routingDiscovery, "rendezvous:wlsell.com")
? ? log.Info("成功宣布!")
// 現在,查找那些已經宣布的對等端
// 這就像你的朋友告訴你會合的地點
? ? log.Info("搜索其它的對等端...")
? ? peerChan, err := routingDiscovery.FindPeers(ctx, "rendezvous:wlsell.com")
if err != nil {
panic(err)
}
// 連接到所有新發現的對等端(peer)
for peer := range peerChan {
if peer.ID == host.ID() {
continue//不連接自己
}
?log.Debug("找到對等端:", peer)
?log.Debug("正在連接到:", peer)
err := host.Connect(context.Background(), peer)
if err != nil {
? log.Warningf("連接到對等端 %s:失敗 %s\\n", peer.ID.Pretty(), err)
continue
}
log.Info("已經連接到:", peer)
}
return nil
}
```
- 重要更新說明
- linechain發布
- linechain新版設計
- 引言一
- 引言二
- 引言三
- vs-code設置及開發環境設置
- BoltDB數據庫應用
- 關于Go語言、VS-code的一些Tips
- 區塊鏈的架構
- 網絡通信與區塊鏈
- 單元測試
- 比特幣腳本語言
- 關于區塊鏈的一些概念
- 區塊鏈組件
- 區塊鏈第一版:基本原型
- 區塊鏈第二版:增加工作量證明
- 區塊鏈第三版:持久化
- 區塊鏈第四版:交易
- 區塊鏈第五版:實現錢包
- 區塊鏈第六版:實現UTXO集
- 區塊鏈第七版:網絡
- 階段小結
- 區塊鏈第八版:P2P
- P2P網絡架構
- 區塊鏈網絡層
- P2P區塊鏈最簡體驗
- libp2p建立P2P網絡的關鍵概念
- 區塊鏈結構層設計與實現
- 用戶交互層設計與實現
- 網絡層設計與實現
- 建立節點發現機制
- 向區塊鏈網絡請求區塊信息
- 向區塊鏈網絡發布消息
- 運行區塊鏈
- LineChain
- 系統運行流程
- Multihash
- 區塊鏈網絡的節點發現機制深入探討
- DHT
- Bootstrap
- 連接到所有引導節點
- Advertise
- 搜索其它peers
- 連接到搜到的其它peers
- 區塊鏈網絡的消息訂發布-訂閱機制深入探討
- LineChain:適用于智能合約編程的腳本語言支持
- LineChain:解決分叉問題
- LineChain:多重簽名
- libp2p升級到v0.22版本
- 以太坊基礎
- 重溫以太坊的樹結構
- 世界狀態樹
- (智能合約)賬戶存儲樹
- 交易樹
- 交易收據樹
- 小結
- 以太坊的存儲結構
- 以太坊狀態數據庫
- MPT
- 以太坊POW共識算法
- 智能合約存儲
- Polygon Edge
- block結構
- transaction數據結構
- 數據結構小結
- 關于本區塊鏈的一些說明
- UML工具-PlantUML
- libp2p介紹
- JSON-RPC
- docker制作:啟動多個應用系統
- Dockerfile
- docker-entrypoint.sh
- supervisord.conf
- docker run
- nginx.conf
- docker基礎操作整理
- jupyter計算交互環境
- git技巧一
- git技巧二
- 使用github項目的最佳實踐
- windows下package管理工具