本文尽量用最精简的语言来对比特币工作证明原理进行介绍,让不管是IT还是非IT的背景的人都能够看懂。
(虽然作业的要求是让IT背景的人能看懂就行了,但是如果能够让非IT背景的人也能看懂那不是更好吗?)
一、比特币为什么需要共识机制?
回答这个问题之前,首先需要了解一下比特币是一个什么东东。比特币最最核心的概念是:它是一个分布式账本。与之相对的概念有两个:(集中式)账本,记账系统。我们先说后两者,就能够明白什么叫分布式账本了。
(集中式)账本:记账的本子。账本里有些什么呢,举个例子给你听你就明白了,比如,2018年6月17日下午18:00(时间),我用招商银行借记卡(账户),消费了100元(金额及货币种类),为地铁卡(消费商户)充了值。之所以称之为是集中式账本,因为这个账本只存在招商银行自己的系统里面,而不在持卡人或者消费终端上。
记账系统:把账的内容记录下来的系统。上面的例子中,当我完成这笔消费的时候,招商银行后台的记账系统,就把这笔账记到招商银行后台的系统的数据库里了。记账这个操作不是人完成的,而是系统完成的。
值得注意的一点是:记账的权利是很大的,也是至关重要的,所以需要依靠系统进行而不是人为地来进行。想像一下人工记账的过程中因为忙中出错而把我银行账户里的100元的消费记成了1000元的消费,我瞬间白白损失900元。。。
好了,接下来分布式账本的意思也显而易见了:比特币这家“银行”的账本,不是只存在“比特币”这样一家中心化公司里面,而是存在于比特币的所有节点中,并且每个节点都可以争夺记账的权利,也就是说:这个节点是可以自由参与的,换而言之,我充当节点之后,我也能够拥有这个比特币“银行”的账本,并且我也可以有记账的权利。
那么问题来了,举个极端的例子,假如全世界70亿人口,每个人都成为了比特币的节点,那这70个人都能记账吗?显然不行,假如大家都胡乱记账,那这个银行就不可靠了。所以“谁来记账”,“如何记账”,就是比特币作为分布式账本存在的问题。传统银行中这个问题不用多考虑,但是在区块链的世界中,这是一个大问题。因为,在传统银行中,由于其系统的封闭性,只有银行自己的系统能够记账,但是比特币的记账系统是公开的,也就是说大家都能够参与,因此在考虑“谁来记账”这个问题的时候,需要考虑到万一记账权落到坏人手里的情况。这也是比特币共识机制面临的问题。
二、比特币的共识算法是什么?
通过第一部份的描述,我们知道了比特币这个“银行”系统需要用共识算法来解决“谁来记账”这个问题,并且要保证假如记账权落到坏人手里,对系统也能够没有影响(系统的容错性)。
那么到底解决“谁来记账”这个问题的共识机制是什么呢?这个共识机制就是POW——工作量证明。也就是说,近似根据节点占有计算能力资源的比例来获得记账权。这里有几个关键词,我们分别来说明一下。
1.计算能力
比特币共识算法中考验的计算能力,是被称为哈希解迷这样一种计算能力。那么为什么哈希解迷能够从一定程度上量化地反映出计算能力呢?这得先和哈希函数说起。
哈希函数:任意长度的数据(x),在经过哈希函数(f)计算之后,能够输出一个长度固定的值(y)。在y=f(x)中,给定x1, x2且x1!=x2,有f(x1)!=f(x2)。也就是说,只要数据不同,经过哈希函数输出的y基本上没有相同的可能。
在哈希解迷中,简单地说,当给定y这个结果的时候,我们要求x这个值,那么只能通过暴力计算来进行。所以说,通过哈希计算,能够来反映某个节点的计算能力。
在实际争夺记账权的时候,y这个值由区块头数据中的difficulty target这个值决定,而x这个值和区块头数据中的nonce相关。先完成给定的哈希解迷的节点,能够获得记账权。
2.占有的比例
并不是某个节点进行哈希能力越强,获得记账权的概率就越大。事实上,这个概率是和该节点计算哈希能力占所有节点哈希计算能力的比例呈正相关的。
比如说,我用一台电脑建立了一个比特币系统的节点,每秒可以进行1000次哈希计算,与此同时,全网有10000个节点,每个节点都能够每秒进行1000次计算的话,那么理论上,我只有0.01%的概率拥有这个记账权,也就是说,每记10000次账,才能轮到我记一次。
当然,并不是说哈希计算的能力越强,一定会先获得记账权,这个不是绝对的。实际情况比这个复杂得多,只能说近似如此。
三、共识机制的关键
在第二部份里,我简述了一下共识算法,共识算法解决了“谁来记账”的问题。现在我们稍微讨论一下“如何记账”的问题,这里又分两个部份:比特币的出块时间(记账频率),以及比特币的区块同步(分布式账本间的同步)。
1.比特币的出块时间(记账频率)
为了保证比特币这家“银行”的稳定和高效,它规定了并非每来一笔账就要记一次,而是每10分钟统计记一次账,也就是大约每10分钟出一个区块。这样问题就来了,在第二部份中,我们提到一定哈希解迷完成,我就获得了记账权,可以记账了,那么假如我不断地提高哈希计算的能力,那我不就能够越来越快地获得了记账权了吗?出块时间不就不用等10分钟了吗?
于是,比特币系统为了维持出块时间稳定在10分钟一次,也就是10分钟记一次账这样一个规则,会自动地调整哈希解迷的难度。回到前文的那个公式y=f(x),比特币系统通过动态地调整y来调整哈希解迷的难度,怎么调整y呢?通过缩小或者放大y的值的空间来进行调整。比如说,假如我要提高难度,原先规定:y只需要小于1000就可以了,那么y有将近1000种可能,现在调整为:y需要小于100,这样我就只有将近100种可能,我计算的难度就提高了10倍左右。
另外补充一下,比特币系统通过比较最新2016个区块和20160分钟的时长,来判断是否要增加或者减少难度。
2.比特币的区块同步(分布式账本间的同步)
一旦一个结点率先获得记账权,并完成了记账,之后他需要广而告之,将自己记账的结果传播到其它节点。因为区块中的timestamp和nonce的值存在,所以该区块是否有效,是什么时候生成的,都是可被验证的。所以当其它节点收到被广播的数据之后,通过验证并判断是否要将这个块的数据加到自己的账本中,也就是加在原有的区块链上,形成一个更长的链,并传播给下一个节点。通过这样的一个方式,完成了所有节点之间的数据同步和链的延伸。
但是由于区块链各节点身处的网络环境中的位置不同,难免会发生不同的节点生成不同的区块并将其传播开来,判断的标准依然是:计算能力的累积。哪条链越长,说明其获得的计算能力越强,这样的链最终将成为主链。
四、小结
本文通过将区块链分布式账本和传统金融机构记账方式的一定程度的类比,来简述了区块链的共识机制的必要性和原理。实际上这部份内容还要复杂,限于篇幅和时间关系,包括共识机制的攻击问题等内容均未在本文中进行说明。
网友评论