1703865040
1703865041
我们回到爱丽丝如何发起双重支付攻击这个问题。最新的一个区块由一个诚实节点产生,其中包含爱丽丝下载软件向鲍勃付费的交易记录。当看到这笔交易被放入区块链后,鲍勃认为爱丽丝已经向他付款,便允许爱丽丝下载软件。假设在下一个回合被随机选中的节点恰巧被爱丽丝所控制。现在因为爱丽丝可以提议下一个区块,她可以选择忽略掉前面那个包含她支付给鲍勃的那笔交易的区块,而产生一个包含指向之前区块指针的区块。不仅这样,在这个区块里,爱丽丝可以放进一笔交易,把她付给鲍勃的币转到一个被她所控制地址里去。这就是一个经典的双重支付攻击。因为这两个交易用的是同一个币,只有一个交易可以被放进区块链。所以如果爱丽丝成功地把币转到她控制的地址,那个她付币给鲍勃的交易记录将变得无效,因为它将不会被放进区块链里。这一过程详见图2.2。
1703865042
1703865043
1703865044
1703865045
1703865046
图2.2 双重支付攻击
1703865047
1703865048
注:爱丽丝创建了两笔交易:一笔是她付给鲍勃比特币的交易,另一笔是她将这笔比特币重复支付到她控制的另一个地址。因为这两笔交易用相同的比特币支付,所以只有一笔会被放进区块链。图中的箭头表示一个区块链接到前一个区块的指针,通过在前一个区块自己的内容中包含了一个哈希值进行了扩展。CA代表爱丽丝拥有的币。
1703865049
1703865050
那我们如何知道这个双重支付攻击是否能成功呢?这取决于最后哪个区块会被纳入长期的共识链,是爱丽丝转给鲍勃的区块,还是爱丽丝转给爱丽丝自己的区块。是什么决定了哪一个区块被纳入呢?诚实节点会遵守在最长有效分支后面延展这一规则,那到底在哪个分支后面延展呢?并没有明确的答案!目前来看,这两条分支长度一样,它们的区别是仅在于最后一个区块,并且这两个区块都是有效的。选择下一个区块的节点可以决定建立在其中一个区块上。这个选择就决定了双重支付攻击的成功与否。
1703865051
1703865052
微妙之处在于:从道德角度考虑,这两个分支截然不同,一个是包含付给鲍勃交易的区块,一个是包含爱丽丝把这些币双重支付给她自己地址交易的区块。但这个区别仅仅建立在我们知道爱丽丝先支付给鲍勃再试图双重支付这个故事的基础上。但从技术角度来看,这两笔交易完全一致,且都有效。节点没有办法分辨出哪一个是道义上合理合法的交易。
1703865053
1703865054
实践中,节点往往用延展它们在点对点网络里最早听到的区块这种启发式的方法。但这不是一个无懈可击的法则。在一些情况下,因为网络延迟,很可能它们先听到的区块实际上是后被创造出来的。所以下一个提议节点至少是有可能选择在那个包含双重支付的区块上延展。爱丽丝甚至还可以贿赂下一个提议节点来加大这个可能性。不管出于什么原因,如果下一个节点真的接受了这个双重支付的区块,那么这条链将比包含支付给鲍勃交易的那条链更长。基于此,下一个诚实节点就有可能去延展这条链,因为它更长。随着这个过程继续,这条包含双重支付的链会更有可能成为长期共识链的一部分。相反,那个包含爱丽丝支付给鲍勃交易区块的链会被网络完全遗忘,成为一个孤块(orphan block)。
1703865055
1703865056
我们现在从商家鲍勃的立场重新考虑整个情况。理解鲍勃如何保护自己不受双重支付攻击是理解比特币安全措施的重要的一部分。当爱丽丝广播她向鲍勃支付的交易时,鲍勃也在网上听着,鲍勃在下一区块被创建之前就能听到这笔交易。如果鲍勃比我们前面描述的更加草率的话,他可以在网上完成检查程序,并允许爱丽丝此时下载软件。这叫作零验证交易(zero confirmation transaction)。这将导致一个比前面所说的更加基础的双重支付攻击。前面所述情况,为了实现双重支付攻击,我们需要假设一个恶意黑客控制了发起下一个区块的节点。但如果鲍勃允许爱丽丝在没有收到区块链一条确认信息的情况下就下载软件,那么爱丽丝可以立刻广播一条双重支付交易,一个诚实节点就有可能把这个交易放进下一区块,而不是支付给鲍勃的那笔交易。见图2.3。
1703865057
1703865058
1703865059
1703865060
1703865061
图2.3 从鲍勃立场来看双重支付
1703865062
1703865063
注:这是一个从商家鲍勃的立场来看爱丽丝做的双重支付尝试。为了保护自己免受双重支付攻击,鲍勃应当等爱丽丝向他支付的交易被区块链包含进去,并且多等几次确认。
1703865064
1703865065
另一方面,一个谨慎的商家甚至在看到交易被包含在一个区块后仍然不会允许爱丽丝下载软件,而是继续等待。如果鲍勃看到爱丽丝成功发起了双重支付的攻击,他会意识到那个含有爱丽丝向他支付的交易的区块有可能已经被丢弃。他应该放弃这个交易,不让爱丽丝下载软件。如果在尝试双重支付的情况下,恰巧下几个节点还是建立在爱丽丝向鲍勃支付交易的区块上,那鲍勃就相信这笔交易会被纳入长期共识链。
1703865066
1703865067
总而言之,一个交易得到的确认越多,它被纳入长期共识链的概率就越大。如前文所述,诚实节点总是选择延展最长的共识链。因为长链增长更多,那条含有双重支付的短链追上长链的概率会变得越来越小。在只有一小撮恶意节点的情况下,这个结论尤其正确。因为短链要想赶上,这些恶意节点需要被一直连续选中。
1703865068
1703865069
事实证明,双重支付攻击成功的概率将随着确认的数目的增加而指数级降低。所以,如果你感兴趣的交易已经收到k个确认,双重支付攻击交易被纳入长期共识链的概率以关于k的一个函数指数级下降。在比特币生态系统里,最常见的方法是等6个确认。并不是6这个数字有什么特殊意义,只不过,这样在你等待的时间与确认你所感兴趣的交易被纳入长期共识链之间做了很好的平衡[1]。
1703865070
1703865071
总结起来,防止不正当交易完全是用密码学的方法。但这些方法被共识所加强,意思是一个节点如果想放进一个密码学上不正当的交易,这个交易不会被纳入长期共识链的唯一原因是绝大多数的节点是诚实的,不会把一个不正当交易放进区块链。另外,防止双重支付攻击完全依赖于共识,密码学不起任何作用。从密码角度来看,这两个交易都是正当有效的。但共识可以能决定哪个被放进长期共识链。最后,你无法百分之百保证你感兴趣的交易被放进了长期共识链。但指数级概率保证了不错的结果,6笔交易过后,实质上你没有犯错的可能了。
1703865072
1703865073
[1]如后文总结时所说,并没有一个固定的数字,但6是个常用的数目。——译者注
1703865074
1703865075
1703865076
1703865077
1703865079
区块链技术驱动金融:数字货币与智能合约技术 2.4 奖励机制与工作量证明
1703865080
1703865081
在前面的章节里,我们简单了解了比特币的共识算法,以及为什么我们直觉上相信它是安全的。但我们回想在本章一开始谈到的,比特币的去中心化一部分是通过技术手段,另一部分是通过聪明的激励设计来实现的。截至目前,我们主要关注的还是技术手段。现在,我们来讨论比特币的这个激励设计。
1703865082
1703865083
之前我们试图大胆相信这样的假设,在我们随机选取节点时,至少有50%的可能会选中诚实节点,这或许是有问题的。如果对颠覆这个过程的参与者有金钱奖励,这个关于诚实的假设就格外成问题,这种情况下我们无法真的假设某个节点是诚实的。所以这个问题变成了:我们是否可以给予表现诚实的节点奖励?
1703865084
1703865085
我们再思考下一个确认以后的双重支付尝试(见图2.3)。我们是否可以惩罚那个创建包含双重支付区块的节点?好吧,其实不行。就像我们前面说的,因为我们无法判断哪笔交易是道义上合法的。即使我们知道,我们也很难惩罚它们,因为节点没有身份。那我们反过来思考,我们是否可以奖励那些创造的区块最终被放入长期共识区块的节点?然而,同样因为这些节点并没有透露它们真实世界中的身份,我们不可能给他们的家庭地址寄去现金。要是有某种可以代替的数字货币……你大概猜到该怎么做的。我们可以用比特币来奖励创造这些区块的节点。
1703865086
1703865087
让我们暂停一下。之前,我们讨论的都是用抽象的算法来实现分布式共识,并不是针对某个具体的应用。我们现在要跳出模型,使用事实,我们建立这个分布式共识过程的应用实际上就是一种货币。明确地说,我们要以这种货币为单位奖励那些表现诚实的节点。
1703865088
1703865089
区块奖励
[
上一页 ]
[ :1.70386504e+09 ]
[
下一页 ]