美文网首页程序员
比特币源码解读七

比特币源码解读七

作者: ttblack | 来源:发表于2017-08-09 19:39 被阅读6136次

我们接着看main.cpp中sendMessages下面的代码:

区块链同步和钱包交易广播发送

这部分代码第一部分调用PushGetBlocks函数用于区块的同步。这个函数也在main.cpp中。

发送getblocks消息

可以看到这个函数使用了AssetLockHeld对cs_main进行锁定。这应该是用于调试信息一个断言。就是如果锁定异常,则会报告出相应的信息,并把当前线程挂起。下面对连续发送同一个getblocks的消息进行了过滤.pindexLastGetBlockBegin表示开始同步的位置,hashLastGetBlocksEnd表示结束的区块的哈希值。最后调用PushMessage发送"getblocks"同步当前区块链。

下面的代码g_signals.Broadcast()属于钱包的内容了。这个函数的作用是重新发送钱包的交易信息。我们看下这部分的内容:

可以看到 g_signals是一个CMainSignals结构对象,结构体内定义了各种用于连接的对象。关于 boost::signals2::signal可以看之前《解读五》的文章有介绍。我们主要看Broadcast 的注册。可以看到是Broadcast注册了实现钱包接口的ResendWalletTransactions的函数。这个函数定义在wallet.cpp中。

ResendWallettransactions函数

这段代码的核心部分就是在最后的两个循环里。第一个循环将距当前最新的区块构造时间大于5分钟的交易放入mapSorted中。第二个循环遍历此mapSorted,并调用每个交易的RelayWalletTransaction函数发送当前交易

同步交易

在发送交易的时候首先判断是是否是CoinBase交易我们把区块中的第一笔交易称为coinbase交易也叫创币交易。这个交易就是我们说的挖矿成功的奖励。所以这个交易没有输入,只包含一个被称作coinbase的输入,仅仅用来创建新的比特币。创币交易有一个输出,支付到这个矿工的比特币地址。

是否是创币交易 将一个inv消息放入vInventoryToSend池中

上面的代码在net.h和net.cpp中。可以看到最终我们把所要同步的交易全部放入了结点的发送池中。现在我们回到main.cpp中的sendMessages接着往下看。

发送inv消息同步交易信息

可以看到我们在调用Broadcast后,将需要同步的交易数据放入结点的发送池(vInventoryToSend)后,接着就开始遍历发送池(vInventoryToSend),将交易信息发送出去。

我们接着下面的代码看。下面的代码是同步区块数据了:

同步区块数据

这段代码首先检查了结点的网络状态,其中state.nLastBlockReceive表示区块接收到的时间。state.nBlocksInFlight表示区块是否在传输中。BLOCK_DOWNLOAD_TIMEOUT定义在main.h中。

区块下载时间(秒)

由于区块下载时间的单位是秒所以我们在判断网络状态的时候转换成了微秒。意思是如果1分钟内没收到区块并且传输时间超过2分钟,我们就认为此结点已经离线。

第二部分代码是追踪记录节点连接上“nBlocksInFlight”(指那些它已经发出了请求但还没有接收到)的区块数量,并且检查该数量有没有超过上限(MAX_BLOCKS_IN_TRANSIT_PER_PEER)。用这种办法,如果一个节点需要更新大量区块,它会在上一请求完成后才发送对新区块的请求,从而允许对等节点控制更新速度,不至于压垮网络。MAX_BLOCKS_IN_TRANSIT_PER_PEER也定义在main.h中。

一次最多请求的区块数量

第三部分mapAskFor发送的是其他类型的消息数据。并且没有被记录(AlreadyHave)的消息。则发送出去。

AlreadyHave函数

第四部分则是将发送剩余的。数量没达到1000个的消息数据发送出去。

到这里我们就把sendMessages函数阅读完了,这个函数主要功能就是发送消息,包括:ping,结点地址,同步交易和同步区块数据 通过这个函数我们也了解了比特币网络相关的内容和区块间的数据同步。不过我们好像已经够到了很多核心的内容,希望对我们后面的代码阅读会带来一些帮助。

作者:区块链研习社比特币源码研读班,black

相关文章

  • 比特币源码解读七

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

  • 比特币源码研读

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

  • 开始研读比特币1

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

  • 比特币源码解读八

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

  • 比特币源码解读四

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

  • 比特币源码解读六

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

  • 比特币源码解读三

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

  • 比特币源码解读二

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

  • 比特币源码解读一

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

  • 比特币源码解读五

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

网友评论

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

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