github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/swap/swap.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:45</date> 10 //</624450121551056896> 11 12 13 package swap 14 15 import ( 16 "errors" 17 "fmt" 18 "strconv" 19 "sync" 20 21 "github.com/ethereum/go-ethereum/p2p/enode" 22 "github.com/ethereum/go-ethereum/p2p/protocols" 23 "github.com/ethereum/go-ethereum/swarm/log" 24 "github.com/ethereum/go-ethereum/swarm/state" 25 ) 26 27 //swap swarm会计协议 28 //点对点小额支付系统 29 //一个节点与每一个对等节点保持单个平衡。 30 //只有有价格的消息才会被计入 31 type Swap struct { 32 stateStore state.Store //需要Statestore才能在会话之间保持平衡 33 lock sync.RWMutex //锁定余额 34 balances map[enode.ID]int64 //每个对等点的平衡图 35 } 36 37 //新建-交换构造函数 38 func New(stateStore state.Store) (swap *Swap) { 39 swap = &Swap{ 40 stateStore: stateStore, 41 balances: make(map[enode.ID]int64), 42 } 43 return 44 } 45 46 //swap实现协议。平衡接口 47 //添加是(唯一)会计功能 48 func (s *Swap) Add(amount int64, peer *protocols.Peer) (err error) { 49 s.lock.Lock() 50 defer s.lock.Unlock() 51 52 //从状态存储加载现有余额 53 err = s.loadState(peer) 54 if err != nil && err != state.ErrNotFound { 55 return 56 } 57 //调整平衡 58 //如果金额为负数,则会减少,否则会增加 59 s.balances[peer.ID()] += amount 60 //将新余额保存到状态存储 61 peerBalance := s.balances[peer.ID()] 62 err = s.stateStore.Put(peer.ID().String(), &peerBalance) 63 64 log.Debug(fmt.Sprintf("balance for peer %s: %s", peer.ID().String(), strconv.FormatInt(peerBalance, 10))) 65 return err 66 } 67 68 //GetPeerBalance返回给定对等机的余额 69 func (swap *Swap) GetPeerBalance(peer enode.ID) (int64, error) { 70 swap.lock.RLock() 71 defer swap.lock.RUnlock() 72 if p, ok := swap.balances[peer]; ok { 73 return p, nil 74 } 75 return 0, errors.New("Peer not found") 76 } 77 78 //状态存储的负载平衡(持久) 79 func (s *Swap) loadState(peer *protocols.Peer) (err error) { 80 var peerBalance int64 81 peerID := peer.ID() 82 //仅当当前实例没有此对等方的 83 //内存平衡 84 if _, ok := s.balances[peerID]; !ok { 85 err = s.stateStore.Get(peerID.String(), &peerBalance) 86 s.balances[peerID] = peerBalance 87 } 88 return 89 } 90 91 //清理交换 92 func (swap *Swap) Close() { 93 swap.stateStore.Close() 94 } 95