开门不见山
首先,我们不讲Dpos.我们且来看看什么叫共识?百科关于共识的释义如下:
共识,就是共同的认识.我们知道在中心化的结构里,中心化的东西是普遍得到大家信任的,所以不需要一个所谓的各个个体的共同认识来维系彼此,所有的工作由这个中心化的东西来做.
区块链是一个去中心化的结构,结构里的各个彼此之间是互不信任的.所以需要一个机制来让所有个体对同一件事达成一个共同的认识.这就是区块链世界所谓的共识.
简言之,区块链世界的共识主要解决两个问题:
- 1.到底该有链上哪些人拥有记账权
- 1.拥有记账权的这些人怎么去记账
所谓记账,在这就是打包交易到区块并封装好一个有效区块的过程.
那么,区块链的共识究竟又是怎么设计机制来解决这两个问题的.
问道比特币
初见共识不求甚解
说到区块链,就不得不谈区块链应用的开山鼻祖--比特币,其缔造者中本聪大神也是扑朔迷离的传奇人物啊(本聪二大爷请收下不肖弟子滴菠萝盖...).我们讲共识,也先来看看在币圈开天辟地创下不世基业的比特币是怎么实现共识的.
比特币关于记账权的所有,设计了这样一个数学难题来决定谁拥有记账权:
HASH(h, nonce) <= M / d
- HASH, 这里暂且简单滴理解为一种哈希算法
- h, 区块头信息
- nonce, 变量值,通过改变它来改变哈希值
- M ,这里M是一个很大很大的数
- d, 当前比特币的难度系数
这个有点装逼性质的公式该怎么理解呢?
其实也很好理解,就是链上所有想参与记账的人公平竞争,谁先解决这个数学难题(找到一个nonce值满足这个公式),谁就被认为是当前编号区块的合法出块者,然后就可以封装当前编号的区块并添加到链上.
我们不难看出,比特币设计的共识方案是将共识要解决的两个问题放到了一个步骤里去解决.在当前的数学难题没有得到解决之前,并不知道谁去封装当前这个区块.只有,数学难题得到解决的那一刻才知道合法的出块者,并且紧接着出块上链.
识乎其表究乎其内
上面,只是大概说了比特币的解决方案.但是还没涉及到共识的核心,就是为什么这么做呢???
我们知道解决这个数学难题需要一定的算力,这样势必就会投入一定的成本,无论是设备上还是时间上都会有投入.那么,为什么还要花费力气去做一件这么麻烦的事呢.
路人甲:为了共识啊...(这位同学说得对,晚上加鸡腿!!!).
这里这个难题的设计是为了服务于比特币上层的一个共识规则:
最长链共识:链上所有节点都以最长的链为合法主链!!!
简单滴说,这样做就是为了让想使坏的节点认识到使坏的代价从而望而却步.此话怎讲呢?请看图:
第一列是每个块对应的时间,第二列是当前的主链.从图中可以看出,当前已经生产到8号区块,这时B呢想重新造一个区块作为8号(动机嘛可能是他给人转了10BTC来买一杯咖啡,咖啡已经喝了但他想伪造交易撤回这笔转账),这个时候他必须满足什么条件才能达到这个目的呢?
首先,我们知道主链每10min产生一个区块,这背后有赖于具体的算力.我们假设全网算力总和为100,B拥有的算力为y,则主链上诚实节点拥有的算力为x, x,y满足:
x + y = 100
B呢要想重新打包一个8号区块,他必须首先重新将前面7个区块依此打包一遍.这个时候主链依然在继续生产区块.那么,如果B想在time=90那刻追上主链,需要主链在产生一个区块时,B已经打包了9个区块以上才能成为较长链:
9x < y --> y > 90
B的算力必须在90之上,这样的实力在全网来说是很难拥有的.当然B完全没必要用这么大的算力,只要满足y> x.B的出块速度就大于主链的出块速度了,这样总有那么一个时间点B的链会超越主链成为较长链(只不过这个时间相对会长一点).
这里只要B拥有51算力就能自己造一个链来撤回自己的交易,尽管这51算力对全网来说是很难被一方拥有的.但是,假设B可以拥有这么多算力,他能这么做,那么他会这么做吗?
肯定不会啊,如果会,那上面说这一大堆POW(oh...sorry这个就是上面说的那个数学难题解决共识问题的官称)的机制不就对最长链共识没有作用了吗.
因为比特币上每一笔交易都有转出方的私钥签名,B自己造一个链,之前主链上存在的所有交易依然是原来的样子,他并不能做丝毫改变(比如把别人交易的接收方改为自己),因为他并没有别人的私钥.B所能改变的只有自己发起的交易.这样就使得B做这个事情得不偿失,要拉拢51%的算力可不是一笔小的支出啊.
还有一种情况属于恶意攻击,就是B拥有51%控制了挖矿之后恶意拒绝所有交易,每个区块都是没有交易的空区块.但是这样会给比特币带来毁灭性的灾难,就行货币没有了流通,那么他还有什么价值呢!如此,B所拥有的所有比特币财富也将化为乌有.所以他更不可能这么做.
综上,POW机制服务于最长链共识,使得比特币以最长链为准的共识准则成为可能.
反思使人进步
....
明晚主角Dpos粉墨登场
主角还没讲呢,未完待续.今夜老夫撑不住了...