上次我们把bitcoind.cpp的大概流程过了一下,我们今天说下细节的内容。我们打开bitcoind.cpp文件,我们继续看AppInit()函数。因为这个函数非常重要,包含了对客户端各种功能的初始化。
我们从CommandLineRPC这个函数说起。这个函数的功能我在解读一里面说的是 “根据输入参数得到相应结果并组合的json数据格式打印输出 ”。那我们就分析下他的实现过程。这个函数声明在:#include "rpcclient.h" 定义在rpcclient.cpp中。
这个函数是如何被调用的呢?大家看AppInit()里面的代码。
调用CommondLineRPC这几句代码的意思是判断参数里是否没有'-'或'/',并且不包含'bitcoin:',则执行CommandLineRPC;判断"-"或"/"的函数定义在util.h中。
打开rpcclient.cpp找到CommandLineRPC函数,我们现在就详细说下CommandLineRPC的实现原理。
1。检测参数合法性
如果参数个数小于2,则会报出运行时错误信息“too few parameters”。
2,转换参数格式
调用RPCConvertValues因为参数该读进来的时候,默认是字符串格式,我们调用RPCConvertValues进行格式转换。这个函数也在rpcclient.cpp里。
RPCConvertValues函数可以看到,这个函数用BOOST_FOREACH循环将字符串参数放params数组里,并根据不同的命令方法将相应的参数通过调用ConverTo进行了类型转换。
ConverTo函数3.调用CallRPC获取相应的数据信息并根据返回结果做相应的处理。
根据方法和参数执行相应的命令这段代码核心是CallRPC函数(),这个函数是通过http请求从本地服务器获取数据。这个函数也在rpcclient.cpp中,找到这个函数,我们也分段分析下。
判断用户名密码首先判断在配置文件中的rpcuser和rpcpassword两个字段不能为空。这个配置文件是bitcoin.conf就是�AppInit()里读取的配置文件。接下来就是通过asio连接本地服务器(asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型)。
连接本地服务器这段代码创建SSLIOStreamDevice 的对象,并尝试连接本地服务器,如果连接成功,则会报出运行时错误 “couldn't connect to server”。
下面这段代码就是获取数据的代码:
发送请求并获取数据这段代码首先将rpcuser和rpcpassword进行了base64编码,然后封装了JSONRPCRequest对象,并调用HTTPPost发送到服务器。然后调用ReadHTTPStatus获取数据状态。并通过调用ReadHTTPMessage获取数据返回。 最后将结果数据返回。这段代码里用到的函数的定义都在rpcprotocol.cpp中。
今天就先分析这一个功能,下篇我们分析AppInit2。这里面的代码也很重要。
作者:区块链研习社比特币源码研读班,black
网友评论