其他节点可以通过隐性地接受或拒绝前面这个被随机选中的节点。如果接受,他们就在这个区块之后接龙下去;如果拒绝,他们就忽略这个区块,而是选择前一个曾经接受的区块,来继续接龙下去。值得注意的是,这里的前一个曾经接受的区块,并不一定就是这个区块的前一个区块,因为,很有可能在之前的几个回合中,随机选择的节点都是恶意节点,其他节点已经隐性拒绝了多个回合。
比特币共识算法(简化版)
这个算法的简化假设是,可以随意选择一个节点,这些节点都不受女巫攻击的影响。
1. 新的交易被广播到所有节点。
2. 每个节点都将新的交易放进一个区块。
3. 在每个回合,一个随机选择的节点可以广播它的区块。
4. 其他节点可以选择接受这个区块,前提是区块里的交易是正当有效的(有真的签名)。
5. 节点们可以把以上接受的区块的哈希值放进自己的区块里,以此来表示它们对这个新区块的认可。
接下来我们看看这个算法如何能够抵抗一些常见的攻击行为。
窃取比特币
假设这一轮由Alice来提议区块链的下一个区块,如果她想窃取Bob的比特币,那么Alice就发起一笔把Bob的比特币转到自己地址上的交易,伪造Bob的数字签名来对这笔交易进行签名,并把这笔交易放到下一个区块中。显然,如果数字签名机制是安全的,那么Alice就不可能达到目的。
拒绝服务攻击
假设这一轮由Alice来提议区块链的下一个区块,如果她不喜欢Bob,那么她可以拒绝把和Bob有关的任何交易放进区块中。尽管这是Alice可以开展的有效攻击,即拒绝为Bob提供服务,但显然这是个小问题。Bob只需要等下一个诚实节点来提议区块,他的交易就有可能被放进区块中。
双重支付攻击
假设Alice是Bob开的网店的一个顾客,Bob提供一些付费软件下载服务。Alice可以发起这样的双重支付攻击:
Alice向Bob购买一个软件,她就在自己的地址上向Bob的地址发起一笔比特币交易,并向整个网络广播这笔交易。假设现在由某个诚实节点来制造下一个区块,并把这笔交易放进区块中。当看到这笔交易被放进区块链之后,Bob认为Alice已经给他付款了,于是允许Alice下载软件。紧接着,假设下一回合随机选择的节点刚好是由Alice控制的节点,那么Alice可以产生一个新区块,并且放进一笔交易,这笔交易是把她付给Bob的币转到一个被她所控制的地址上,并将这个区块接到上一个诚实节点所产生的区块的前一个区块,以此来忽略掉诚实节点所创建的区块。
这就是一个经典的双重支付攻击,因为两笔交易用的是同一个币,只能有一个交易可以被放进区块链中。
你可能会问,既然Alice在第一笔交易中已经明确地把币转给了Bob的地址,这个币的拥有者就是Bob,那Alice又怎么来创建第二笔交易,将这个币转移到自己控制的地址上呢?这是否需要伪造Bob的签名?显然,伪造签名是属于窃取比特币行为,并不属于双重支付攻击。
事实上,我们需要清楚地了解一笔交易的结构。在比特币中,一个交易就是一个数据结构,其中包含三个主要的部分:
交易发起者的数字签名。
一个付给目标公钥(地址)的指令。
一个哈希值。