上篇我们看到了挖矿前的准备工作,首先申请了三块内存空间做为后面操作的缓冲区。并对这内存区域进行了格式化。今天我们就看到了挖矿的关键部分-挖矿。
比特币挖矿的使用的算法是工作量证明-POW,在比特币中就是通过SHA256不断对一个变化的值进行哈希计算。判断其结果是否小于一个目标值(nBits)。如果小于则挖矿成功。否则其变化值(nNonce)加1。结续下一次哈希计算。直到小于目标值。这个过程就是挖矿。
以上流程图只是表示大概流程,具体过程我们通过源码展现;现在我们已经将源码看到格式化的部分了,我们接着往下看:
这里就是挖矿的一个流程,核心挖矿函数是ScanHash_CryptoPP()函数,这个函数就是能过对我们申请的缓存区的数据进行SHA256加密,也就是对缓存区的数据进行哈希计算,关于SHA算法其基本思想是:接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值的过程。
我们现在看下源码了解下是如何对缓存区数据进行哈希计算也就是挖矿的。
我们看了挖矿算法其实就是对我们构造的区块的数据不断进行哈希计算,通过判断缓存区中的某个个数据是否为0,表示是否加密成功。但到这里其实还不算挖矿成功,只是算找到了一个解决方案。真正挖矿成功的判断还是对加密后的数据和我们之前的目标数据hashTarget进行比较。如果小于hashTarget,才真正的算挖矿成功。
挖矿成功后,通过最上面的源码图可以看到需要调用CheckWork()对挖矿有效性进行检测。在进行CheckWork的时候要将线程优先级设置为THREAD_PRIORITY_NORMAL。检测完毕后将线程优先级设置回THREAD_PRIORITY_LOWEST。
下面的代码 CChainParams::REGTEST 表示是测试网络,在成功挖到一个块后,就会退出挖矿。关于CheckWork()里面的东西也很多。我们将在下篇单独进行分析。
作者:区块链研习社比特币源码研读班,black