比特币源码解读二
来源:互联网 发布:什么软件个人房源多 编辑:程序博客网 时间:2024/05/19 12:27
作者:ttblack链接:http://www.jianshu.com/p/45d20e6462a2來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。上次我们把bitcoind.cpp的大概流程过了一下,我们今天说下细节的内容。我们打开bitcoind.cpp文件,我们继续看AppInit()函数。因为这个函数非常重要,包含了对客户端各种功能的初始化。
我们从CommandLineRPC这个函数说起。这个函数的功能我在解读一里面说的是 “根据输入参数得到相应结果并组合的json数据格式打印输出 ”。那我们就分析下他的实现过程。这个函数声明在:#include "rpcclient.h" 定义在rpcclient.cpp中。
这个函数是如何被调用的呢?大家看AppInit()里面的代码。
这几句代码的意思是判断参数里是否没有'-'或'/',并且不包含'bitcoin:',则执行CommandLineRPC;判断"-"或"/"的函数定义在util.h中。
打开rpcclient.cpp找到CommandLineRPC函数,我们现在就详细说下CommandLineRPC的实现原理。
1。检测参数合法性
如果参数个数小于2,则会报出运行时错误信息“too few parameters”。
2,转换参数格式
因为参数该读进来的时候,默认是字符串格式,我们调用RPCConvertValues进行格式转换。这个函数也在rpcclient.cpp里。
可以看到,这个函数用BOOST_FOREACH循环将字符串参数放params数组里,并根据不同的命令方法将相应的参数通过调用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。这里面的代码也很重要。
- 比特币源码解读二
- 比特币源码解读一
- 比特币源码解读三
- 比特币源码解读四
- 比特币源码学习笔记(二)
- 比特币源码学习笔记(二)
- 比特币源码分析
- SEDA源码解读(二)
- MINA源码解读(二)
- THUCTC源码解读(二)
- jQuery源码解读二
- jQuery源码解读二
- hadoop源码解读二
- 解读比特币官方钱包加解密
- 解读比特币官方钱包加解密
- 新国金挖矿宝解读比特币之共识机制
- 比特币源码解析(1)
- 比特币源码解析(2)
- Go实战--golang中使用号称全世界最快的JSON解析器json-iterator(json-iterator/go)
- pycharm 找不到路径的问题
- 拨云见日—深入解析Oracle TX 行锁(上)
- CAD图纸转为dwf的方法
- mysql--11000安装/启动
- 比特币源码解读二
- CentOS 7.0安装HBase1.3.1
- 【Linux基础之yum源】centos配置本地yum源
- 项目【注释转换】
- CSS入门
- 纯CSS实现垂直水平居中的5种方式
- top命令
- 比特币源码解读三
- 分列单元格:汪琪玩Excel第三十招