github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/storage/mock/rpc/rpc.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  //</624450120867385344>
    11  
    12  
    13  //package rpc实现一个连接到集中模拟存储的rpc客户机。
    14  //中心化模拟存储可以是任何其他模拟存储实现,即
    15  //以mockstore名称注册到以太坊RPC服务器。定义的方法
    16  //mock.globalStore与rpc使用的相同。例子:
    17  //
    18  //服务器:=rpc.newserver()
    19  //server.registername(“mockstore”,mem.newGlobalStore())
    20  package rpc
    21  
    22  import (
    23  	"fmt"
    24  
    25  	"github.com/ethereum/go-ethereum/common"
    26  	"github.com/ethereum/go-ethereum/rpc"
    27  	"github.com/ethereum/go-ethereum/swarm/log"
    28  	"github.com/ethereum/go-ethereum/swarm/storage/mock"
    29  )
    30  
    31  //GlobalStore是一个连接到中央模拟商店的rpc.client。
    32  //关闭GlobalStore实例需要释放RPC客户端资源。
    33  type GlobalStore struct {
    34  	client *rpc.Client
    35  }
    36  
    37  //NewGlobalStore创建了一个新的GlobalStore实例。
    38  func NewGlobalStore(client *rpc.Client) *GlobalStore {
    39  	return &GlobalStore{
    40  		client: client,
    41  	}
    42  }
    43  
    44  //关闭关闭RPC客户端。
    45  func (s *GlobalStore) Close() error {
    46  	s.client.Close()
    47  	return nil
    48  }
    49  
    50  //new nodestore返回一个新的nodestore实例,用于检索和存储
    51  //仅对地址为的节点进行数据块处理。
    52  func (s *GlobalStore) NewNodeStore(addr common.Address) *mock.NodeStore {
    53  	return mock.NewNodeStore(addr, s)
    54  }
    55  
    56  //get调用rpc服务器的get方法。
    57  func (s *GlobalStore) Get(addr common.Address, key []byte) (data []byte, err error) {
    58  	err = s.client.Call(&data, "mockStore_get", addr, key)
    59  	if err != nil && err.Error() == "not found" {
    60  //传递模拟包的错误值,而不是一个RPC错误
    61  		return data, mock.ErrNotFound
    62  	}
    63  	return data, err
    64  }
    65  
    66  //将一个Put方法调用到RPC服务器。
    67  func (s *GlobalStore) Put(addr common.Address, key []byte, data []byte) error {
    68  	err := s.client.Call(nil, "mockStore_put", addr, key, data)
    69  	return err
    70  }
    71  
    72  //delete向rpc服务器调用delete方法。
    73  func (s *GlobalStore) Delete(addr common.Address, key []byte) error {
    74  	err := s.client.Call(nil, "mockStore_delete", addr, key)
    75  	return err
    76  }
    77  
    78  //haskey向RPC服务器调用haskey方法。
    79  func (s *GlobalStore) HasKey(addr common.Address, key []byte) bool {
    80  	var has bool
    81  	if err := s.client.Call(&has, "mockStore_hasKey", addr, key); err != nil {
    82  		log.Error(fmt.Sprintf("mock store HasKey: addr %s, key %064x: %v", addr, key, err))
    83  		return false
    84  	}
    85  	return has
    86  }
    87