RPC服务是在节点启动的时候通过参数–rpcaddr 0.0.0.0 –rpcport 8541来指定的,启动代码是:
1 | hpbnode.SetNodeAPI() |
其中SetNodeAPI是把所有的API定义以[]rpc.API的数据类型保存hpbnode.RpcAPIs,然后再传给Start方法。API的结构如下,其中public为false的话是不会发布出去了。
1 | type API struct { |
然后启动RPC服务,可以看到一共指定了三种形式的服务参数,分别是ipc、http、ws,ipc是进程间通信,在同一机器上进行的内存共享方式通信,由于不经过网卡转输数据,所以可以节省网络资源;http就是我们通过web3接口调用的通信服务,ws是WebService是一种严格定义报文格式的协议,底层也是基于http的,这里我们主要看下http服务。
如果后启动的服务出现异常,则需要把所有已启动的服务停止掉,并返回。
1 | func (prm *RpcManager)Start(apis []API ) error { |
startRPC方法中按照先后顺序分别启动了四种形式的服务,多了一种InProc,这个是进程内通信(具体使用还没研究)。这里我们就看一下startHTTP的启动过程。
1 | // startRPC is a helper method to start all the various RPC endpoint during node |
在StartHTTPEndpoint方法中,modules就是在启动的时候通过参数–rpcapi hpb,web3,admin,txpool,debug,personal,net指定的,表示启动的模块,RPC在启动的时候会检查程序所定的API是否在modules中,只有在的才会启动,另外还有个条件就是api是Public的。NewHTTPServer方法启动服务,其中cors参数是跨域域名
1 | // StartHTTPEndpoint starts the HTTP RPC endpoint, configured with cors/vhosts/modules |