巴比特论坛

发表于 2015-10-19 12:55:07 | 显示全部楼层
20金币
我试着在这找答案:https://en.bitcoin.it/wiki/Difficulty
但它更接近严格的数学证明而不是直白的解释。
我很有兴趣知道,所以我能理解是什么使一个区块或区块链比另一个的难度高。有人说,一个比特币客户端启动时,它选择了难度最大的区块接着。
有没有人来通俗解释一下区块难度计算?




最佳答案

查看完整内容

区块哈希值的计算结果是一个随机数,没有人能直接控制计算的结果。 打个比方,重复N次(N趋近于无穷大)掷一个六面的骰子,每掷一次就可以掷出一个6(包含6)以下的数字,但是如果要想掷出3以下的数字,取得每个结果时平均雪要掷2次才行;也就是说,掷出“3以下(含3)”比掷出“6以下(含6)”要难一倍,需要多做一倍的“工作量”。 如果定义“6以下”这个规则的难度系数(困难度)为“1”,那么,“3以下”这个规则的难度 ...

7条回复 跳转到指定楼层

chehw_1 | 副船长 | 发表于 2015-10-19 12:55:08 | 显示全部楼层
区块哈希值的计算结果是一个随机数,没有人能直接控制计算的结果。

打个比方,重复N次(N趋近于无穷大)掷一个六面的骰子,每掷一次就可以掷出一个6(包含6)以下的数字,但是如果要想掷出3以下的数字,取得每个结果时平均雪要掷2次才行;也就是说,掷出“3以下(含3)”比掷出“6以下(含6)”要难一倍,需要多做一倍的“工作量”。

如果定义“6以下”这个规则的难度系数(困难度)为“1”,那么,“3以下”这个规则的难度系数为“2”,意味者要想符合规则要求,需要2倍的工作量;“1以下“的难度系数则为6,意味着该规则需要6倍的工作量。

比特币协议中,规定一个256位的整数0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF为难度“1”,在当时的全网算力下大约需要10分钟左右的哈希计算工作量才可以满足这一规则(小于等于这个数)。

(目标值(TARGET) = 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 时,难度值为1)

如果想确保10分钟这个工作时间恒定,那么当算力提高n倍时,需要把难度值也调高n倍。目前(2015年10月)Bitcoin网络的难度值为608亿,可以推算出现在的全网算力比2009年初增大了608亿倍。

难度值的计算实际上就是简单的除法。只不过涉及到的整数太大(远远超过内置的整数位数),没法直接用普通数学库的除法来运算,需要借助高精度的算法库(比如GMP)来完成,这就比较麻烦。所以bitcoin wiki中给出了一种借助泰勒级数变体实现的快速对数算法计算难度值的示例。(笔者吐槽:这TMD更麻烦)

区块存储时,block_header中有一个字段是与难度值相对应的,即bits。用一个32位的整数来压缩存储当期256位的目标值(TARGET)。压缩规则很简单,bits字段的最高位字节为指数(little endian中的第4个字节),存储目标值有效的字节数,如果目标值的最高位为1(大于0x80),需要在前面补上一个0x00。(比如难度值1的目标值有效位为0x00FFFF......,补0后共0x1D个字节)。另外3个字节为尾数(mentissa),截取目标值最高3个字节来存储。

这样,难度值1对应的目标值写成bits格式,就是0x1D00FFFF。
以此类推,目标值为 0x00000000000404CB000000000000000000000000000000000000000000000000时,bits的格式为0x1B0404CB。

计算难度值时其实可以采用简易算法:尾数部分相除,再乘以指数部分带来的差异即可。(2 ^ [指数部分相减的结果 * 8]),计算速度比“快速对数法”要快很多(但是如果超出double型所容许的位数会有溢出)。

现有的算法中,难度值每2016个区块调整一次,但新的难度值不需要与难度“1”进行比较运算,而是根据前2015个块的出块时间来计算。(问:为什么是2015?答:因为最初程序员的代码写错了,纠正这个错误会导致分叉,所以只能将就一下了)。
difficulty = [prev_target] * 【前2015个区块生成所用的时间】 /  1209600 (按标准每10分钟出一个块,2016个块所需要的秒数)

因为算法确定,所以分布计算时也能保证所有节点计算出的难度值都一致,不会出现分歧。区块链同步时,节点或客户端会优先选取累积难度最大的链作为主链,仅有高度(height)的“伪造慢链”很难被认可,除法伪造出的难度值也很高。但是只要伪造了一个块的难度,后续所有的区块必须用相应的难度重新计算一遍,这往往需要攻击者拥有的算力与当前全网的真实算力相当才有可能完成。

比特币发展的早期,“伪造慢链”攻击应该是很难防的,但是一旦算力达到一定规模,在PoW下这种攻击需要极大的成本和海量的计算时间(不光是金钱,还需要时间),因而一般只需通过优化算法根据累积难度来标识出主链即可。这是PoW下用高额成本的代价换来的成果——算力保护。



补充内容 (2015-10-19 19:21):
【new_target】 = 【prev_target】 * 【前2015个区块生成所用的时间】 /  1209600 (按标准每10分钟出一个块,2016个块所需要的秒数)
zhangweigang | 水手 | 发表于 2018-6-29 09:58:51 | 显示全部楼层
矿工组装好的一个区块的哈希值之后,然后需要寻找一个随机数,把这个随机数和区块的哈希值一起代入哈希函数进行运算,会得到的一个结果。对于一个SHA-256函数,他的输出结果有256位,也就是对应有2的256次方的数值,这些数值构成一个总的目标集合。现在要求矿工找到的某个随机数,使得该随机数和现有区块哈希值组合运算之后,输出的哈希值在目标集合的非常小的区域之内。小区域占总集合的百分表大小决定了区块的计算难度,百分比越小,难度越高。找到这个随机数大概要经过2的67次方的运算。这是一般计算机不能承担的工作难度。不知道我这样的解释您能明白吗
芭比馒头 | 副船长 | 发表于 2015-10-21 09:11:31 | 显示全部楼层
你赏了N次币,一个都没赏出去
Tilecoin111 | 船员 | 发表于 2015-10-20 12:18:49 来自手机版 | 显示全部楼层
算力如果足够大,随便算
idgui.com | 海盗王 | 发表于 2015-10-20 10:59:51 来自手机版 | 显示全部楼层
chehw_1 发表于 2015-10-19 19:05
区块哈希值的计算结果是一个随机数,没有人能直接控制计算的结果。

打个比方,重复N次(N趋近于无穷大) ...

问:为什么是2015?答:因为最初程序员的代码写错了,纠正这个错误会导致分叉,所以只能将就一下
【答】:不要轻易说人家错,可能只是你自己理解的写错了,其实写2015,可能是有别的用意的。且2015还是2016对难度调整计算本身的影响很小。但若2015:
1,可以接上次的记入时间,避免故意写错时间戳来放大缩小。
2,可以使用上一已经1确认的区块的时间戳。而若2016需要当前区块,而当前区块万一被孤立了呢?那就可能引起网络分叉。
idgui.com | 海盗王 | 发表于 2015-10-20 10:48:00 来自手机版 | 显示全部楼层
chehw_1 发表于 2015-10-19 19:05
区块哈希值的计算结果是一个随机数,没有人能直接控制计算的结果。

打个比方,重复N次(N趋近于无穷大) ...

楼主让通俗易懂地解释一下,层主说的过于复杂了,我来根据理解简单说下吧。
1,区块难度计算结果是与算力相匹配的,即全网算力越高那么难度就越高,若未来算力降低,难度是可以跟随降低的。
2,区块难度是每过2016个区块调整一次。2016*10/60/24=14天,即刚好是两周左右调整一次。未到调整周期时难度不变。
3,具体计算难度的算法楼上有,但理解一下,就是根据时间。即标准是14天,若14天挖完2016个区块,那么就不调整,假设13天就挖完2016个区块到调整了,说明难度相对算力太低了,这次调整要增加难度。反之若用了15天才挖完则要降低难度。
4,假设算力爆涨一倍,仅仅用7天就挖完2016区块,到调整时难度增加一倍。若因矿场意外损坏损失一半算力,那么要28天才挖完2016区块,到调整时难度降低为一半即可。
可见难度调整是可以根据算力情况进行自动匹配的。算力极速增加其反应调整会快一点。算力降低其调整反应会稍微缓慢点。
sumubaobei | 船长 | 发表于 2015-10-19 17:09:57 | 显示全部楼层
越来越难吧
高级模式
您需要登录后才可以发帖 登录 | 立即注册 | 用新浪微博登录

本版积分规则

搜索

0关注 0粉丝 19主题

作者的其他主题

返回顶部 返回列表

登录

分享 发帖