0

漫谈比特币(三):共识

这一篇一起来讨论一下比特币如何在一个去中心化的网络环境中实现交易被承认,并形成交易共识。

首先解释几个概念:

  • :一组交易的集合,整个比特币网络大约每10分钟生成一块。当一个区块被某个矿工宣布已生成,则也意味着下一个区块开始构建。
  • 块链:每一个区块都必须指定他的父区块,于是所有区块形成了一个链,这就是区块链。链有主干和分支,主干上的区块所包含的交易就是被承认的交易。
  • 难度目标:每个区块都有一个难度目标,只有完成了这个目标,区块才算构建完成。完成难度目标的方式是根据区块信息(所有交易的Merkle树根哈希值、时间戳、一个任意可变的值nonce,etc.)反复地计算,直到计算所得的值小于难度目标给定的值则算完成难度目标。完成难度目标是构建区块时最耗时的过程。难度目标的困难程度决定比特币是否能按照10分钟的频率生成区块。
  • 矿工:这是比特币网络中的一种角色,他专门负责构建区块,并尝试通过计算来完成难度目标,一旦先于其它矿工完成难度目标,就可获得这个区块中所有交易的手续费和一笔奖金,反之则一无所获。手续费+奖金是矿工们唯一的收入,因此,矿工之间总是处于竞争状态,每位矿工都渴望先于他人完成区块的难度目标。
  • :指计算并完成难度目标的过程,一旦先于其他矿工挖矿成功,除了获得手续费,还能获得一笔从无到有的比特币奖金,从而整个比特币网络的总流通量就增加了相应的数量。这笔奖金就像真实世界中淘到了黄金,从而地球上流通黄金总量又增加了相应的量。
  • 高度:当前区块到创世区块之间间隔的区块数就是区块高度。由于整个比特币网络都是按照10分钟的频率来生成区块,因此当前10分钟全网矿工正在构建的区块高度应该是一致的。

由上可见,比特币网络的运转就是矿工构造区块,链接区块的过程。随着区块链的延长,区块中的交易也就被永久记录永久承认。

下面一起来看一下比特币网络中的矿工是如何构建区块和区块链的。

构建区块的第一步是矿工把交易池中未处理的交易收集起来,区块有大小的限制,因此优先收集手续费高的交易,其次收集块龄长的交易。交易收集完成后构造所有交易的Merkle哈希树,并组装成一个区块,并立刻开始计算该区块的难度目标的解,经过若干时间后,一旦得到了这个区块的难度目标的解,这个矿工会立即将新生成的区块,通知其他矿工,其他矿工收到新区块的生成通知后有两种选择:

  1. 不甘心,认为自己马上也会找到正确的解,于是继续自己的计算;
  2. 停止当前计算,立即验证新区块的正确性,然后开始下一个区块的生成与计算。

对于选择第一种方式的矿工,他可能在稍后也能得到自己正确的解,但是由于他宣布的区块构建完成的时间较晚,因此他构建的区块不会被其他矿工接受(因为其它矿工已经接受之前宣布的区块了);其次,较晚开始新区块的构造和计算,也就会更晚得到下一区块的解,按这样进行下去,这个矿工只能产出不能被认可的区块,也就无法获得收益。

因此,为了获得收益,矿工们都会选择方案二,接受当前区块的竞赛失败,立即开始下一区块的构建竞赛。

很自然,有竞争就会有冲突,这里不得不提一下区块链分叉。

如果有两个矿工A和B,同时算得区块的解,并通知各自邻近的矿工,这样可能的情况是,邻近A的矿工们,认可了A算得的区块,而邻近B的矿工们,认可了B算得的区块,这时,同一个父区块,有了两个子区块,区块链产生了“分叉”。

对于这种分叉(分歧),比特币网络的解决方法是“接着比赛,看谁先算出下一个区块”。也就是说,如果B矿工“阵营”的某个矿工先算出了后一个区块的解,并且向全网宣布,这时,A矿工“阵营”的矿工,会舍弃A矿工之前构造的区块,并且停止手头正在计算的区块,转而接受B矿工之前构造的区块及B矿工“阵营”刚宣布的区块。

这就是比特币网络自发解决分歧,达成共识的方法。

以上过程也解释了,为什么一笔交易要经过几个区块的验证,才被认为是有效的区块。因为,包含该交易的区块可能位于一个分叉的链上,因此存在被篡改的风险,而当包含该交易的区块后又接上了数个区块,通常可以认为这个区块所在的链不会再被其他分叉所取代,这个区块(交易)已经在主链上,由此可确认该笔交易。

如何防止双重支付(所谓双重支付是指同一笔钱,先支付给了A,随后又支付给了B)?

首先,矿工在验证新产生的区块时,会验证区块中包含的交易是否为已使用的(Unspent Transaction Output,UTXO),如果是,则视为无效区块。

其次,制造双重支付的方法是先制造一笔支付给A的交易,并将这笔交易包含进一个区块中,然后构造另一个区块,并包含支付给B的交易,使得这两个区块,在两个分叉上面,并且使得包含B交易的区块所在的链更快地被增长,从而取代交易A所在的分叉链。如果交易A所在的区块后已经有了4到5个区块,这时想要通过制造分叉来实施双重支付,并获得全网的认可,这将需要非常强的计算力(实施双重支付的分叉链,必须在很短的时间内,生成4到5个区块以取代原分叉,这几乎不可能)。

由于计算能力在逐渐提高,如何保证每十分钟产生一个区块?

比特币采用的方法是,根据过去2016个区块(过去两周)生成的速度,自主决定下一个区块的难度目标。假设过去2016个区块生成平均时间短于10分钟,则后续区块的难度目标应该提高。

综上所述,比特币网络是一个“基于一系列巧妙规则”,并“由一群理性矿工共同驱动”的交易网络,它的安全性由安全算法和“游戏”规则保证,它的信用由矿工们的理性保证。



王 剑

发表评论

电子邮件地址不会被公开。 必填项已用*标注