github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/network/simulation/bucket.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 //</624450114177470464> 11 12 13 package simulation 14 15 import "github.com/ethereum/go-ethereum/p2p/enode" 16 17 //BucketKey是模拟存储桶中的键应该使用的类型。 18 type BucketKey string 19 20 //nodeItem返回在servicefunc函数中为特定节点设置的项。 21 func (s *Simulation) NodeItem(id enode.ID, key interface{}) (value interface{}, ok bool) { 22 s.mu.Lock() 23 defer s.mu.Unlock() 24 25 if _, ok := s.buckets[id]; !ok { 26 return nil, false 27 } 28 return s.buckets[id].Load(key) 29 } 30 31 //setnodeitem设置与提供了nodeid的节点关联的新项。 32 //应使用存储桶来避免管理单独的模拟全局状态。 33 func (s *Simulation) SetNodeItem(id enode.ID, key interface{}, value interface{}) { 34 s.mu.Lock() 35 defer s.mu.Unlock() 36 37 s.buckets[id].Store(key, value) 38 } 39 40 //nodes items返回在 41 //同样的BucketKey。 42 func (s *Simulation) NodesItems(key interface{}) (values map[enode.ID]interface{}) { 43 s.mu.RLock() 44 defer s.mu.RUnlock() 45 46 ids := s.NodeIDs() 47 values = make(map[enode.ID]interface{}, len(ids)) 48 for _, id := range ids { 49 if _, ok := s.buckets[id]; !ok { 50 continue 51 } 52 if v, ok := s.buckets[id].Load(key); ok { 53 values[id] = v 54 } 55 } 56 return values 57 } 58 59 //up nodes items从所有向上的节点返回具有相同bucketkey的项的映射。 60 func (s *Simulation) UpNodesItems(key interface{}) (values map[enode.ID]interface{}) { 61 s.mu.RLock() 62 defer s.mu.RUnlock() 63 64 ids := s.UpNodeIDs() 65 values = make(map[enode.ID]interface{}) 66 for _, id := range ids { 67 if _, ok := s.buckets[id]; !ok { 68 continue 69 } 70 if v, ok := s.buckets[id].Load(key); ok { 71 values[id] = v 72 } 73 } 74 return values 75 } 76