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