1703876021
区块链项目开发指南 2.6 随机数
1703876022
1703876023
随机数是一个64位未签名证书。随机数是一个问题的解决办法,矿工不断地尝试随机数,直到发现目标值。有人也许会好奇,如果某个矿工拥有的算力比网络中的任何其他矿工都大,他是否总会第一个发现随机数?答案是不会。
1703876024
1703876025
每个矿工挖的区块的哈希是不同的,因为哈希取决于如时间戳、矿工地址等内容,而且对于所有矿工来说这些内容很可能是不一样的。因此,解决问题并不是一场比赛,而更像是一件碰运气的事。当然,矿工可能因为算力大而走运,但那并不意味着该矿工总会发现下一个区块。
1703876026
1703876027
1703876028
1703876029
1703876031
区块链项目开发指南 2.7 区块时间
1703876032
1703876033
我们看到的区块难度值公式使用了一个长达10s的阈值,以确保挖出父区块和子区块的时间差在10s和20s之间。但为什么是10~20s,而非其他数值呢?为什么时间差是恒定的,而非难度值是恒定的?
1703876034
1703876035
假设有一个恒定的难度值,矿工只需要发现一个随机数使得区块的哈希小于等于该难度值即可。假设该难度值大,且在此情况下,用户又无法估算用户间发送以太币的时间延迟。如果网络算力不足,计算随机数需要较长时间,那么用户需要等待很长时间来确定交易。有时网络算力充足,可能很幸运,很快就发现了随机数,用户交易确认就比较快。这类系统延迟不确定的特点自然很难受到用户青睐,因为用户总想知道需要多长时间完成交易,就像我们从一个银行账户向另一个银行账户汇款,银行会告诉我们在多长时间之内会完成汇款。如果设定的难度值小,它将影响区块链的安全,因为大矿工可以比小矿工更快挖出区块,网络中最大的矿工就会拥有控制DApp的能力。不可能发现一个可以使网络稳定的恒定难度值,因为网络算力并非恒定值。
1703876036
1703876037
现在我们知道了,为什么总是需要有一个相对稳定的生成区块的平均时间(即区块时间)。问题是最合适的平均时间是多长。它可以短至1s,长至几乎无限多秒。降低难度值可以使平均时间较短,反之增加难度值可以使平均时间较长。但是,平均时间的长短各有什么优缺点呢?在讨论之前,首先需要知道无效无效块(stale block)是什么。
1703876038
1703876039
如果两个矿工用几乎相同的时间挖下一个区块,会发生什么呢?两个区块肯定都是合法的,但是区块链不能包含区块序号相同的两个区块,而且两个矿工都得不到回报。尽管这是个常见问题,解决方法却很简单,最后难度值较高的区块链将被网络接受。所以最后被忽略的合法区块叫作无效无效块。
1703876040
1703876041
网络中生成的无效无效块总数与生成新区块所需的平均时间成反比。更短的区块生成时间意味着新挖出来的区块向整个网络广播的时间更短,矿工发现问题解决办法的概率更大,所以当区块向整个网络广播时,其他一些矿工可能也解决了问题并进行了广播,由此产生了无效块。但是如果生成区块的平均时间长一点,多个矿工能解决问题的概率就小一点,而且即使它们都解决了问题,也很可能存在时间差,在这个时间差里,第一个被解决的区块就可以进行广播,另一个矿工就可以停止挖那个区块并继续挖下一个区块。如果无效块在网络中经常出现,就会出现大问题;如果仅是偶尔出现,就对网络没有损害。
1703876042
1703876043
但是无效块有什么问题呢?它们延迟了交易确认。当两个矿工几乎同时挖一个区块时,它们可能有不同的交易,因此如果交易出现在其中,就不能说交易已经确认了,因为交易中出现的区块可能是无效块。我们应该等待再挖出几个区块。无效块导致平均确认时间不等于生成区块的平均时间。
1703876044
1703876045
无效块会影响区块链安全吗?答案是肯定的。我们知道网络安全由网络中矿工的全部算力衡量。当算力增长时,难度值也要增加,以确保区块不是在平均时间之前生成的。所以更高的难度值意味着更安全的区块链——节点想篡改区块链将需要更多算力,使篡改区块链更困难,因此区块链被认为是更安全的。当几乎同时挖出两个区块时,我们将把网络分成两部分,在两个不同的区块链上工作,但是其中一个将成为最终区块链。所以在无效块上工作的网络是在无效块上挖下一个区块,结果是网络算力损失,因为算力用在了没有用的事情上。网络的两个部分很可能用比平均时间更长的时间去挖下一个区块,因为它们损失了算力。所以,在挖出下一个区块之后,难度值将降低,原因是用于挖区块的时间比平均时间更长。难度值降低会影响整体区块链安全。如果无效块率太高,将在很大程度上影响区块链安全。
1703876046
1703876047
以太坊用ghost协议解决无效块带来的安全问题。以太坊使用这个真实ghost协议的一个修正版本。ghost协议仅仅把无效块添加到母链上,掩盖了安全问题,由此增加了区块链的整体难度值,因为区块链的整体难度值还包括无效块的难度值之和。但是如何才能在不产生交易冲突的情况下把无效块添加到母链中呢?事实上,任何区块链都可以接纳零个或者多个无效块。为了激励矿工接纳无效块,矿工接纳无效块将得到回报。此外,发现无效块的矿工也将得到回报。无效块中的交易不用于计算确认,无效块矿工也不向无效块接纳的交易收取交易费。注意,在以太坊中,无效块称为“叔块(uncle block)”。
1703876048
1703876049
矿工接纳无效块得到的回报计算公式如下。其余回报归侄块(nephew block),即包含孤块(orphan block)的区块:
1703876050
1703876051
1703876052
1703876053
1703876054
你肯定在奇怪为什么要给无效块矿工回报。即便不给它们任何回报,也不会影响安全。这是因为无效块经常出现在网络中会导致另一个问题,而这个问题可以通过给无效块矿工回报解决。矿工应当得到一定比例的回报,大致相当于它为网络贡献的算力比例。如果两个不同的矿工几乎同时挖出一个区块,则算力比较大的矿工挖出的区块更有可能被添加到最终区块链中,因为该矿工挖下一个区块的效率会比较高,所以小矿工将失去回报。如果无效块比例低,就不是大问题,因为大矿工增加回报的概率不大。但是,如果无效块比例高,就会产生大问题,也就是说,大矿工在网络中最终将得到比它应得的更多的回报。ghost协议通过回报无效块矿工找到平衡。由于大矿工不拿走全部回报,但是仍比它们应得的多,我们不能对无效块矿工和侄块给予同等回报,而是给得少一点。前面的公式很好地解决了问题。
1703876055
1703876056
ghost协议会限制一个侄块可以指向的无效块总数,这样矿工不会只挖无效块并使区块链生成速度变慢。
1703876057
1703876058
所以一旦无效块出现在网络中,它会或多或少地影响网络。无效块出现得越频繁,网络受到的影响越大。
1703876059
1703876060
1703876061
1703876062
1703876064
区块链项目开发指南 2.8 分叉
1703876065
1703876066
在节点验证区块链发生冲突时,会发生分叉(forking),也就是说,在网络中有多于一个区块链,且每个区块链由一些矿工验证。分叉共有三种:普通分叉、软分叉和硬分叉。
1703876067
1703876068
普通分叉是由于两个或者多个矿工几乎同时发现了一个区块引起的暂时冲突。如果一个难度值高于另一个,冲突就解决了。
1703876069
[
上一页 ]
[ :1.70387602e+09 ]
[
下一页 ]