打字猴:1.703876e+09
1703876000
1703876001
1703876002 网络中的任何节点都可以检查区块链是否合法,首先检查交易在区块链中是否合法以及时间戳的验证情况,然后检查区块的目标值和随机数是否合法、矿工是否得到合法的回报等。
1703876003
1703876004
1703876005 如果网络中的节点接收到两个不同的合法区块链,那么所有区块的整体难度值较高的那个区块链被视为合法的区块链。
1703876006
1703876007 例如,假设网络中的一个节点想改变一个区块中的一些交易,就需要重新计算该块以及该块后面所有区块的随机数。可是在该节点计算的同时,网络其他节点已经又挖出了许多新的区块,因此当它重新计算到最新区块时会因整体难度值较低而被系统拒绝。可见,私自篡改账本的难度是非常大的。
1703876008
1703876009
1703876010
1703876011
1703876012 区块链项目开发指南 [:1703875272]
1703876013 区块链项目开发指南 2.5 时间戳
1703876014
1703876015 计算区块目标值的公式需要用到当前时间戳,且每个区块在区块头附加了当前时间戳。没有什么机制可以阻止矿工在挖新区块时使用其他时间戳(而非当前时间戳),但是它们一般不会那么做,因为时间戳验证会失败,其他节点不会接受该区块,这样就浪费了矿工的资源。当一个矿工广播一个新挖出的区块时,其他节点对其时间戳的验证取决于其时间戳是否大于前一个区块的时间戳。如果一个矿工使用的时间戳大于当前时间戳,则难度值较低,因为难度值与当前时间戳成反比,因此网络将接受区块时间戳是当前时间戳的矿工,因为它的难度值比较高。如果一个矿工使用的时间戳大于前一个区块时间戳,且小于当前时间戳,难度值会高一些,因此要花费更多时间挖区块。等到区块被挖出的时候,网络可能产生了更多区块,因此该区块会被拒绝,因为往往恶意矿工的区块链难度值会低于网络中的区块链难度值。出于以上原因,矿工总是使用准确的时间戳,否则他们会一无所获。
1703876016
1703876017
1703876018
1703876019
1703876020 区块链项目开发指南 [:1703875273]
1703876021 区块链项目开发指南 2.6 随机数
1703876022
1703876023 随机数是一个64位未签名证书。随机数是一个问题的解决办法,矿工不断地尝试随机数,直到发现目标值。有人也许会好奇,如果某个矿工拥有的算力比网络中的任何其他矿工都大,他是否总会第一个发现随机数?答案是不会。
1703876024
1703876025 每个矿工挖的区块的哈希是不同的,因为哈希取决于如时间戳、矿工地址等内容,而且对于所有矿工来说这些内容很可能是不一样的。因此,解决问题并不是一场比赛,而更像是一件碰运气的事。当然,矿工可能因为算力大而走运,但那并不意味着该矿工总会发现下一个区块。
1703876026
1703876027
1703876028
1703876029
1703876030 区块链项目开发指南 [:1703875274]
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)的区块:
[ 上一页 ]  [ :1.703876e+09 ]  [ 下一页 ]