美文网首页
比特币源码解读二

比特币源码解读二

作者: ttblack | 来源:发表于2017-07-22 17:35 被阅读2412次

上次我们把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

相关文章

  • 比特币源码研读

    forest21000版 比特币源码研读之一比特币源码研读之二比特币源码研读之三比特币源码研读之四比特币源码研读之...

  • 比特币源码解读二

    上次我们把bitcoind.cpp的大概流程过了一下,我们今天说下细节的内容。我们打开bitcoind.cpp文件...

  • 开始研读比特币1

    1,进入比特币源码目录,先读读编译doc/build-unix.md,查看比特币源码如何编译,了解比特币的依赖库,...

  • 比特币源码解读八

    现在我们接着看RegisterNodeSignals 的下一个连接函数。 InitializeNode 这个函数在...

  • 比特币源码解读四

    我们接着上篇继续,现在来看第五步。 第五步:verify wallet database integrity 确...

  • 比特币源码解读六

    上篇我们看了ProcessMessages函数,这个函数就是侦听网络中的不同的消息命令来处理相应的逻辑。在...

  • 比特币源码解读三

    这篇我们主要分析下AppInit2的代码,这个函数在init.cpp中。这个函数分了12步完成了初始化客户端的功能...

  • 比特币源码解读一

    上次在ubuntu系统中将比特处源码编译环境设置好了后,还没有具体分析里面的代码,今天我们就解读一下。源码...

  • 比特币源码解读五

    我们开始init.cpp中的AppInit2的第六步:network initialization 网络初始化 第...

  • 比特币源码解读七

    我们接着看main.cpp中sendMessages下面的代码: 这部分代码第一部分调用PushGetBlocks...

网友评论

      本文标题:比特币源码解读二

      本文链接:https://www.haomeiwen.com/subject/sgrukxtx.html