比特币挖矿算法优化-(1.减少冗余计算;2.sat 布尔可满足性问题)

读者预期: 本文适用于阅读过比特币挖矿算法源代码或者了解挖矿算法主要过程的读者。

简介:

一段伪代码:
         nonce=0;
         while(nonce < UINT_MAX)

             if (sha256(sha256(blockheader[nonce])) < target):
                  success
             else nonce = nonce+1;

挖矿的过程,就是变化nonce,计算出区块头的sha256双重数据摘要,如果此摘要小于目标数值则挖矿成功(不讨论确认(confirmations))。

sha256:

blockheader :

                     --------------------------------------76 bytes---------------------------4bytes-
                    |                                      不会变动的信息                                   | nonce|           
                     --------------------------------------------------------------------------------------

sha256:将任意长度的数据,切分成N*[64字节],余数填充之。然后计算出32字节的数据摘要,并将N次结果按照4字节分开自加。

优化1(已使用openssl验证,每100万次计算时间,确实降低1/3):

              基于简介,可知,无论nonce是多少,前64字节都不会改变,所以在nonce=初始值时计算一次,此后可直接使用此值。减少几乎1/3的计算量。

优化2:

             剩余的16字节,只有最后4字节的nonce会发生变化。

            另外我们将sha256的64次数据变化命名为round1~round64。              

             round1~round3 因为数据并未发生变化所以结果不变,可以只计算一次;

             round4 : round4(a,b,c,d,e,f,g,h),其中d,h是计算结果。d,h和nonce的变化关系是 d1=d0+(nonce1-nonce0) ;h1=h0+(nonce1-nonce0).所以也只需计算一次,然后快速得到结果。

优化3:

             提前退出,目的是找到一个足够小的结果。所以在高位的8个字节不是零的情况下,可以提前推出计算。


总优化量:

             优化1 ,几乎是1/3计算量;

              在优化1的基础上,优化2,优化3可以作 7/128 的速度提升;   


sat 布尔可满足性问题(待续)


你可能感兴趣的:(比特币挖矿算法优化-(1.减少冗余计算;2.sat 布尔可满足性问题))