去中心化和中心化并非水火不容,没有一个系统是完全中心化的
我们把比特币如何做到去中心化这个问题拆解为下面五个问题:
- 谁在维护交易账本?
- 谁有权利批准哪个交易是正当有效的?
- 谁在制造新的比特币?
- 谁在指定系统变化规则?
- 比特币是如何取得交易价值的?
1 分布式共识
对于分布式共识,我们可以给出一个技术定义,以此判定一个协定是否符合分布式共识的要求。
分布式共识:在一个有n个节点的系统中,每一个节点都有一个输入值,其中一些节点具有故障,甚至恶意的。一个分布式共识协议有以下两个属性:
(1)输入值的中止须经所有诚实节点来确定
(2)这个输入值必须由诚实节点来生成
由于比特币协议达成共识时面对着不完美网络和恶意节点的存在等等的限制,许多关于分布式共识的文献都对是否能达成共识持悲观态度,有许多达成共识具备不可能性的结论已经被证实。
比如著名的拜占庭将军问题和FLP Impossibility,尽管有这些“不可能结论“,还是有文献谈到了一些共识协议,比如Paxos算法,它做了一些妥协:协议有可能死机卡住。
FLP Impossibility: 在异步通信场景,即使只有一个进程失败,也没有任何算法能保证非失败进程达到一致性!
好消息是,这些所谓的”不可能性结论“都是在一些特定的模式下才成立,这些结论是针对分布式数据库的研究,不能完全套用到比特币身上来,比特币打破了很多原来分布式数据库经典模型中所做的假设:
- 比特币引进了奖励的理念,实质上并没有真正解决分布式共识问题,而只是在特定货币系统下解决了该问题。
- 比特币体系包含随机性这个概念,随着时间的流逝,我们对某一个块的认识与最终总体共识相吻合的概率将越来越大。
2 使用区块链达成没有身份的共识
比特币的每个节点并没有一个稳定的,长期的身份,主要的原因在于没有一个中央权威机构发放身份,防止女巫攻击现象,并且也能保证一定程度的匿名性。
但同时缺少真实身份也给比特币的共识协议带来难题,比如难以控制恶意节点的数量,能够设计的指令也有所限制。
为了理解比特币如何达成共识,我们可以做一个较弱的理论假设:
我们的共识协议有很多回合,每个回合对应着区块链的一个块。在每一个回合里,一个随机节点会被选中,然后这个节点可以提议这个链的下一个区块。(我们假设不受女巫攻击影响)
隐式共识
其他节点可以隐式地接受或是拒绝前面这个被随机选择出来的节点。如果接受,它们会在这个块之后接龙下去;如果拒绝,它们忽略这个新的区块,而是选择前一曾经接受的区块,来继续接龙下去。
由此得出一个简化版的比特币共识算法:
- 新的交易被广播到所有节点上
- 每个节点都将新的交易放进一个区块
- 在每个回合,一个随机的节点可以广播它的区块
- 其他节点可以选择接受这个区块,前提是区块里的交易是合法的(签名和来源)
- 节点们可以把以上区块的哈希值放进自己的区块,以此表示对那个新的区块的认可
窃取比特币
由于发起一笔有效交易的前提是具有该比特币持有者的签名,只要背后的密码学基础牢靠,显然无法轻易窃取比特币
拒绝服务攻击
被随机选择的节点可以恶意地忽略某些交易,但到下一个诚实节点提议区块时,这笔交易还是会被放入区块。
双重支付攻击
值得一提的是,前文提到的哈希指针有两种容易混淆的类型:
- 在区块内用来表示接在之前哪个区块后面
- 交易信息中指向之前交易里说明比特币来源
买家:kevin 卖家:bob
最新的区块由一个诚实的节点产生,其中包括kevin向bob的支付交易记录。当看到这笔交易被放入区块链中,bob认为kevin已经付款,便发送货物给kevin。
假设下一个回合被选中的节点被kevin所控制,他可以忽略刚刚的支付交易记录,而在新提议区块中放入一笔双重支付的交易(比如把刚刚的币支付给另一个人)
那我们如何知道这个双重支付是否能够成功?这取决于最后哪个区块会被纳入长期的共识链中。诚实节点会遵守在最长有效分支后面延展这一规则,到底在哪个分支后面延展并没有明确的答案。微妙之处在于道德角度上两个分支截然不同而技术上两者却又没有任何区别。
零验证交易(zero confirmation transaction)
是指交易卖家不等待该笔交易被区块链网络节点确认,即交付出售的东西。这将有可能导致更加基础的双重支付攻击:直接广播两条交易信息。
总而言之,一个交易得到的确认越多,它被纳入长期共识链的概率越大。诚实节点总是选择延伸最长的共识链,因为长链增长更多,含有双重支付的短链追上长链的概率会越来越小。
事实证明,双重支付攻击成功的概率将随着确认的增加而指数级降低。在比特币生态系统中,最常见的方法是等6个确认。
3 奖励机制与工作量证明
我们建立这个分布式共识过程的应用实际上就是一种货币。明确地说,我们要以这种货币为单位奖励那些表现诚实的节点。
区块奖励
比特币有两种不同的奖励机制,其中一种就是区块奖励。根据比特币的规则,创建区块的节点可以在这个区块中加入一笔特别的交易。这笔交易就是一个造币的过程,节点可以指定这笔交易的接收地址(通常是自己),可以把这个过程视为对节点在共识链上进行创建区块服务的报酬。
而奖励只有当区块最终被纳入长期共识链才会实现,因为造币交易和和其他每一笔交易一样,只有当它被纳入最终共识链,才会被接受。这个微妙又强大的设计实际上激励节点想方设法让其他节点延伸它们自己的区块,亦即激励所有节点去遵循延展最长支链的规则。
区块奖励的金额随着区块生成数量的增多(21000个)会减半。这是一个等比数列,并且是有上限的,最终一共是21 000 000个比特币。
值得注意的是,这个奖励实际上也是比特币被创造出来的唯一途径。那是否意味着比特币流通总量达到极限时系统就无法继续运行了呢?不是这样的,因为区块奖励比特币两种奖励机制之一。
交易费
任何交易的制造者都可以选择让交易输出值比输入值小。第一个创建区块把交易放进区块链的人可以取得这个差额,作为交易费。这些交易费现在是完全自愿的,但随着区块奖励逐渐耗尽,交易费会越来越重要。
挖矿与工作量证明
工作量证明(proof of work)的核心理念是,我们把随机选取节点改为根据节点占有某种资源的比例来选取节点,我们希望这种资源是没有人可以垄断的。比如说,如果这个资源是计算能力,那我们称之为工作量证明系统。或者这个资源可以是某种币的持有量,我们称之为权益证明(proof of stake)。
换一个角度理解,工作量证明允许节点用计算能力来相互竞争,并且计算能力的比例决定了节点被选中的概率。
比特币是用哈希函数解谜来证明工作量的。任何一个提议并创建区块的节点想要制造下一块,这个节点必须找到一个数,或者称其为临时随机数。需要满足以下条件:
H(nonce||prev_hash||tx||tx||tx||...||tx)<target
如果哈希函数符合谜题友好的特性,那么解谜难度就取决于目标区域的大小了。使用这种方式,我们可以完全舍弃前文所述的随机选取节点的方法。
而实际上,这个不停尝试解哈希谜题的过程,就是我们俗称的”比特币挖矿“,参与挖矿的节点则被称为矿工。
可参数化成本
我们希望成本是可以通过参数来变化的,而不是一个固定的值。在比特币中,每产生2016年个区块之后,所有节点就会自动重新计算目标区域相对于整个输出范围的比例大小,使得后续区块产生的时间间隔约为10分钟。
简而言之,对于某个特定的矿工:
发现下一个区块的平均时间=10分钟/占全部计算能力的比例
易于证实
证实一个节点正确地计算了工作量证明很容易。
因为临时随机数必须作为区块的一部分被公布出来,这样任何其他节点很容易就能检查验证。
比特币系统的一个终极真相:拥有比特币就是其他节点对给定的一方拥有这些比特币的共识。
网友评论