比特币源码解读十七(挖矿)

      上篇我们看到了挖矿前的准备工作,首先申请了三块内存空间做为后面操作的缓冲区。并对这内存区域进行了格式化。今天我们就看到了挖矿的关键部分-挖矿。

 比特币挖矿的使用的算法是工作量证明-POW,在比特币中就是通过SHA256不断对一个变化的值进行哈希计算。判断其结果是否小于一个目标值(nBits)。如果小于则挖矿成功。否则其变化值(nNonce)加1。结续下一次哈希计算。直到小于目标值。这个过程就是挖矿。

挖矿流程图

以上流程图只是表示大概流程,具体过程我们通过源码展现;现在我们已经将源码看到格式化的部分了,我们接着往下看:

挖矿过程

这里就是挖矿的一个流程,核心挖矿函数是ScanHash_CryptoPP()函数,这个函数就是能过对我们申请的缓存区的数据进行SHA256加密,也就是对缓存区的数据进行哈希计算,关于SHA算法其基本思想是:接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值的过程

我们现在看下源码了解下是如何对缓存区数据进行哈希计算也就是挖矿的。

挖矿计算函数

我们看了挖矿算法其实就是对我们构造的区块的数据不断进行哈希计算,通过判断缓存区中的某个个数据是否为0,表示是否加密成功。但到这里其实还不算挖矿成功,只是算找到了一个解决方案。真正挖矿成功的判断还是对加密后的数据和我们之前的目标数据hashTarget进行比较。如果小于hashTarget,才真正的算挖矿成功。

挖矿成功后,通过最上面的源码图可以看到需要调用CheckWork()对挖矿有效性进行检测。在进行CheckWork的时候要将线程优先级设置为THREAD_PRIORITY_NORMAL。检测完毕后将线程优先级设置回THREAD_PRIORITY_LOWEST。

下面的代码 CChainParams::REGTEST 表示是测试网络,在成功挖到一个块后,就会退出挖矿。关于CheckWork()里面的东西也很多。我们将在下篇单独进行分析。



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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 采矿难题是比特币的核心,因为他们的困难限制了任何一方控制共识程序的能力。因为比特币矿工为他们解决的谜题赚取了回报,...
    Nutbox_Lab阅读 1,149评论 0 4
  • 导语:比特币作为近年来最成功的数字加密货币,引起了全球高度关注,不同于其它数字货币,比特币使用由众多节点构成的去中...
    点融黑帮阅读 1,292评论 1 31
  • 听李健唱歌 像是溪水流淌一模样 恰巧那晚有月光 照在你胸膛 六块腹肌摆成棋盘 在月光下 滚烫的欲望 无边无际,无尽无边
    胡老六阅读 389评论 0 2
  • 文/雁南飞 这是第二次种火龙果,长势还不错。 第一次是四年前,偶尔从网上看到自己动手种植火龙果,感觉挺新奇,这种南...
    雁南飞fly阅读 756评论 18 40
  • 我已经把秘密告诉风了 ,风是否会把我想对你说的话 传到你心里,如果风把我的秘密传遍整个森林的话,就请森林帮我把秘...
    学者1阅读 452评论 0 0