github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/network/simulation/kademlia.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:43</date> 10 //</624450114483654656> 11 12 13 package simulation 14 15 import ( 16 "context" 17 "encoding/hex" 18 "time" 19 20 "github.com/ethereum/go-ethereum/common" 21 "github.com/ethereum/go-ethereum/log" 22 "github.com/ethereum/go-ethereum/p2p/enode" 23 "github.com/ethereum/go-ethereum/swarm/network" 24 ) 25 26 //BucketkeyKademlia是用于存储Kademlia的密钥 27 //特定节点的实例,通常位于servicefunc函数内部。 28 var BucketKeyKademlia BucketKey = "kademlia" 29 30 //等到所有花环的健康都是真实的时候,Waittillhealthy才会停止。 31 //如果错误不为零,则返回发现不健康的卡德米利亚地图。 32 //TODO:检查Kademilia深度计算逻辑更改后的正确性 33 func (s *Simulation) WaitTillHealthy(ctx context.Context) (ill map[enode.ID]*network.Kademlia, err error) { 34 //准备Peerpot地图检查卡德米利亚健康 35 var ppmap map[string]*network.PeerPot 36 kademlias := s.kademlias() 37 addrs := make([][]byte, 0, len(kademlias)) 38 //要验证所有花冠是否具有相同的参数 39 for _, k := range kademlias { 40 addrs = append(addrs, k.BaseAddr()) 41 } 42 ppmap = network.NewPeerPotMap(s.neighbourhoodSize, addrs) 43 44 //在检查文件之前,在每个节点上等待健康的kademlia 45 ticker := time.NewTicker(200 * time.Millisecond) 46 defer ticker.Stop() 47 48 ill = make(map[enode.ID]*network.Kademlia) 49 for { 50 select { 51 case <-ctx.Done(): 52 return ill, ctx.Err() 53 case <-ticker.C: 54 for k := range ill { 55 delete(ill, k) 56 } 57 log.Debug("kademlia health check", "addr count", len(addrs)) 58 for id, k := range kademlias { 59 //此节点的Peerpot 60 addr := common.Bytes2Hex(k.BaseAddr()) 61 pp := ppmap[addr] 62 //调用健康的RPC 63 h := k.Healthy(pp) 64 //打印信息 65 log.Debug(k.String()) 66 log.Debug("kademlia", "connectNN", h.ConnectNN, "knowNN", h.KnowNN) 67 log.Debug("kademlia", "health", h.ConnectNN && h.KnowNN, "addr", hex.EncodeToString(k.BaseAddr()), "node", id) 68 log.Debug("kademlia", "ill condition", !h.ConnectNN, "addr", hex.EncodeToString(k.BaseAddr()), "node", id) 69 if !h.ConnectNN { 70 ill[id] = k 71 } 72 } 73 if len(ill) == 0 { 74 return nil, nil 75 } 76 } 77 } 78 } 79 80 //Kademlias返回设置的所有Kademlia实例 81 //在模拟桶中。 82 func (s *Simulation) kademlias() (ks map[enode.ID]*network.Kademlia) { 83 items := s.UpNodesItems(BucketKeyKademlia) 84 ks = make(map[enode.ID]*network.Kademlia, len(items)) 85 for id, v := range items { 86 k, ok := v.(*network.Kademlia) 87 if !ok { 88 continue 89 } 90 ks[id] = k 91 } 92 return ks 93 } 94