查看: 1219|回复: 0

[原创] 比特币难度系数控制挖矿速度的实现原理

[复制链接]
论坛徽章:
0
发表于 2013-12-31 17:18 | 显示全部楼层 |阅读模式
本帖最后由 liangpk 于 2013-12-31 17:18 编辑

已经有人发了难度系数的计算方法和用途了,这里我来说说个人的一些思考
首先大家都知道,成功挖矿的意思是在上一个Block的hash值上加一个nonce,再计算hash值,若能小于某个值,则视为发现新的账簿。这个“某个值”可以计算出一个直观的数字——难度系数。计算公式在kwong同学的帖子上有发过,这里借用一下
难度系数 = 较大目标 / 当前目标

(其中目标为一个256位数,较大目标为0x00000000FFFF0000000000000000000000000000000000000000000000000000)
接下来从加密算法来解释这个过程。
SHA-256是基于SHA-1的算法加以改进得到的,可以将任意长度小于2^64-1比特的串压缩成一个256比特的hash值,通常hash值会显示为64个十六进制数。所以实际上挖矿的过程就是将上一个256比特的hash值加上一个比特串,再进行一次hash运算。这里的新加入的比特串原型可以是任何字符,包括汉字,初始化过程会自动转成01比特串。


挖矿过程中的计算难度有以下几个因素共同构成:
1、SHA-256算法的预处理,也就是填充。考虑无填充的情况,即加入nonce之后串长度刚好是2^64-1,则总个数有2^(2^64-1-256),这已经是一个很大的数字,但由于有填充函数在,加入的nonce可以很短也可以很长(只要不超出范围即可),对于每种长度接近于2^64-1-256的nonce,增加的初始值个数的数量级都接近于2^(2^64-1-256),所以固定的初始值数量极大。
2、SHA-256算法比SHA-1算法更复杂,而在密码学课上,我们已经知道SHA-1加密过程中涉及到循环左移和错位异或,显然不是一个线性的加密过程,所以在SHA-256算法中也是无法投机取巧通过修改个别比特来尝试做hash值“逼近”的。
3、256比特串转化成十六进制数,若出现0,说明比特串中第4k+1到4k+4都是0,个人猜测在加密算法中用到的若干公钥H(i)是特别挑选使得加密结果很难出现连续的0,所以比特币系统以SHA-256为主要算法,就是因为可以利用这个特点使计算量大但又“可控制”。


以上第一点和第二点都是算法的固有属性,无法用来调整难度。所以只能通过第三点来调整。由于加密过程不可逆,所以不可能通过逆运算来确定适应当前计算能力的“当前目标”。我的猜想是由于计算量巨大,得到的数据量也是巨大的,所以可以用统计学的方法估算hash值中各数值出现的概率。这样就可以选取一个数字区间,(比特币系统中的“小于当前目标”),使得hash值落在这个区间的概率近似为所要的某个值,这个值X总数量的倒数X当前计算能力得到的结果是一个固定的值(比特币系统中的600秒即十分钟),也就是以当前计算能力约每十分钟算出一个落在区间里的hash值


上述思考过程有参考网络上的一些描述,但主要是个人的一些思考,所以不保证正确,仅提供一种思路。有问题大家可以讨论讨论。
最后附上一个在线计算hash的网址http://www.convertstring.com/zh_CN/Hash/SHA256有兴趣的同学可以玩玩


谢谢阅读
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

 

GMT+8, 2019-4-22 18:54 , Processed in 0.104259 second(s), 28 queries .