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