以太坊的RPC简介(一)

以太坊的 RPC 实现包括服务端和客户端。这里先描述一下rpc包下的文件及方法的作用,即 RPC 目录简介。

|--rpc
  |--client.go		RPC客户端
  |--endpoint.go	启动三种终端
  |--errors.go 		返回错误消息和错误消息代码
  |--handler.go 	处理服务端返回的各种消息
  |--http.go 		http方式传递消息
  |--inproc.go 		相同进程传递消息
  |--ipc.go 		不同进程间传递消息
  |--ipc_unix.go 	同不进程间传递消息的实际执行者
  |--json.go 		消息传递的实际传递者
  |--server.go 		RPC服务端
  |--service.go 	接口注册到RPC服务端
  |--stdio.go 		相同进程传递消息的客户端
  |--subscription.go 	订阅消息
  |--types.go 		消息读写及错误的接口定义,服务端API的数据结构
  |--websocket.go 	websocket方式传递消息
client.go

Dial,通过一个 URL 创建一个新的客户端。


DialContext,通过不同的 URL 协议创建不同的客户端。


Call,使用这个方法进行 RPC 调用。


BatchCall,使用这个方法进行 RPC 批量调用。


Notify,发送一个异步通知。


EthSubscribeeth 订阅。


ShhSubscribeshh 订阅。

endpoints.go

StartHTTPEndpointStartWSEndpointStartIPCEndpoint,启动 HTTP、WS、IPC 三个服务终端,开启 RPC 时调用。(节点启动和调用rpc.start()方法时)

errors.go

types.goError 接口的实现(除了 jsonError,因为这个在 json.go 文件中实现的)。

handler.go

newClientConn,服务端和客户端都会创建一个连接,每次连接(包括重新连接)的时候都会调用。


handleBatch,处理服务端返回的批量消息。包括处理订阅消息的处理及普通的回调消息的处理,不仅处理批量消息,还处理单个消息。


其它的一些增减请求队列的操作,增删订阅消息

http.go

DialHTTP,创建 HTTP 客户端。


sendHTTP,发送 http 类型的 rpc 请求并处理返回消息。


sendBatchHTTP,批量发送 http 类型的 rpc 请求并处理返回消息。

inproc.go

DialInProc,只有这一个方法 ,当本地客户端启动时连接 RPC 客户端。

ipc.go

ServeListenerRPC 服务端监听客户端 IPC 方式的请求,如果监听到就启动一个 ServeCodec 协程去处理。


DialIPC,远程连接 RPC 客户端,调用 newIPCConnection 方法创建 RPC 客户端连接。

ipc_unix.go

ipcListen,创建 IPC 监听对象。


newIPCConnection,创建 RPC 客户端连接。

json.go

这个方法不细说了,比较琐碎。主要就是消息的编码解码及传递。主要用到的两个对象分别是 ‘decode’ 和 ‘encode’。

server.go

NewServer,创建 RPC 服务端。


RegisterName,注册节点的 API 服务。

service.go

registerName,真正处理节点 API 服务的逻辑。

stdio.go

本节点调用 RPC 客户端时调用,因为是进程内通信,所以直接调用系统 IO 即可。

subscription.go

这里是处理订阅消息的内容。


forward,里面有一个死循环,当订阅启动后,该方法被调用,然后不断把用户订阅的消息放入用户的缓存 buffer 中。

types.go

定义了节点 API 格式的数据结构和三组接口。


Error,返回错误消息和错误代码。


ServerCodec,读数据,从 httpCon 还是 jsonCodec,因为是不是 http 方式是不同的, httphttp.go 文件中实现, jsonCodecjson.go 文件中实现。


jsonWriter,写数据,从 httpCon 还是 jsonCodec

websocket.go

NewWSServer,创建新的WS服务。会进行连接握手并创建与服务端的连接。


DialWebsocket,使用WS调用 RPC 客户端,会创建新的 RPC 客户端。

你可能感兴趣的:(区块链,以太坊,RPC)