区块链共识算法的核心之一是拜占庭协定。
拜占庭将军的故事大概是这样的:拜占庭是东罗马帝国的首都,拥有巨大的财富,周围有十个邻邦,对首都的财富垂涎已久。但拜占庭高墙耸立,固若金汤,任何一个邻邦入侵都会失败,同时自身也有可能被其他邻邦入侵。拜占庭帝国的防御能力非常强,至少要十个邻邦一半以上同时进攻,才有可能攻破。如果其中一个或者几个原本答应一起进攻的邻邦在行动时发生叛变,那么入侵者可能都会被歼灭。于是,每一方都小心行事,彼此不敢轻易相信。这就是拜占庭将军问题。
拜占庭将军问题的实质就是要寻找一个方法,使得将军们能在一个有叛徒的非信任环境中建立对战斗计划的共识。与拜占庭将军问题的环境类似,在去中心化系统中,特别是在区块链网络环境中,每个将军都有一份与其他将军实时同步的消息账本。账本里有每个将军的签名,从而可以验证将军的身份。一旦出现签名不一致的情况,我们就可以知道是哪些将军发生了叛变。尽管叛变的拜占庭将军可以任意地进行破坏,比如不响应消息、发送错误信息、对不同节点发送不同决定等,但是,只要超过半数的将军同意进攻,那么少数服从多数,就完全有可能实现共识。
在去中心化系统中,要达成共识,必须寻找一个共同算法和协议并且满足以下属性:
一致性——所有的非缺陷进程都必须同意一个值;
正确性——如果所有的非缺陷进程有相同的初始值,那么所有非缺陷进程所同意的值必须是同一个初始值;
可结束性——每个非缺陷进程必须最终确定一个值。
要想最终实现共识算法,一般需要采用工作量证明机制(POW算法)或权益证明机制(POS算法)。
1.工作量证明机制(POW)
区块链是一个基于互联网的去中心化账本,每个区块相当于账本页,交易内容是区块中记录的信息主体。账本内容的唯一性,要求记账行为必须是一个中心化的行为。然而,一旦中心化的系统中某个单点出现错误,就可能令整个系统面临危机甚至崩溃。去中心化记账可以克服中心化账本的弱点,但同时也会带来记账行为不一致的问题。
在去中心化记账系统中,每个节点都会保留一份完整的记账本,但是大家不能同时记账,否则会导致每个节点收到不同的信息,失去记账的一致性,从而产生混乱。因此,到底谁有权记账,我们需要有一个共识机制来决定。
比特币系统设计了以每个节点的计算能力(即“算力”)来实现去中心化系统记账的一致性问题。
那么,如何来判定谁的记账算力最优秀呢?这就需要一个考量的标准——工作量证明。简单地说,工作量证明就是一份确认工作端做过一定量工作的证明。工作量证明机制的主要特征是计算的不对称性。工作端通过一定难度的工作得出一个结果,而验证方通过结果可以很容易地检查工作端是不是做了相应的工作。
工作量证明机制下的共识记账是通过一个什么流程来完成的呢?
在客户端产生新交易的时候,客户端会主动向全网进行广播,要求各个节点对交易进行记账,每个记账节点一旦收到该请求,就会将交易信息纳入一个区块中,通过工作量证明机制,尝试在自己的区块中,找到一个具有足够准确度的工作量证明。当某个节点找到了一个工作量证明,它就会向全网进行广播,当且仅当包含在该区块中的所有交易都有效且之前从未存在过时,其他节点才认同该区块的有效性,表示它们能够接受该区块,跟随该区块的末端,制造新的区块,从而延长整个区块的链条。
2.权益证明机制(POS)
人们在记账过程中发现,工作量证明算法存在不少明显的弊端,因为其机制决定了谁的算力强,谁就能拥有更大的记账权,获取更多的收益,所以在记账过程中造成了巨大的能源浪费。
为了解决这个问题,工作量证明机制的替代者——权益证明机制被提了出来。
权益证明机制(Proof of Stake)直译过来就是股权证明机制,通过计算你持有的币数占总币数的百分比以及占有币数的时间来决定记账权。类似于股票,股票持有量多的,拥有更多的投票权和收益权。点点币(Peercoin)是率先采用权益证明机制的数字货币。
那么,权益证明机制如何应用呢?
点点币引入了币龄的概念,使得SHA256的哈希运算的难度与交易的币龄成反比。在点点币中,币龄被定义为拥有币的天数与币数量的乘积,这使得币龄能够反映交易时刻用户所拥有的权益数量。简单来说,权益证明机制就是根据持有货币的量和时间来发放利息。在权益证明机制下,每个币每天产生1币龄,如你持有100个币,总共持有了30天,那么,你的币龄就为3000,这个时候,如果你发现了一个POS区块并签名,你的币龄就会被清空为0。你每被清空365币龄,你将会从区块中获得0.05个币的利息(假定利息可理解为年利率5%),那么在这个案例中,利息=3000×5%÷365=0.41个币,这下就很有意思了,持币可以产生利息。
点点币的开发者声称,由于没有中心化的挖矿池需求,且购买半数以上币的开销超过获得51%工作量证明所需的哈希计算能力,所以这一机制将使恶意攻击变得非常困难。
内容摘自《风口区块链》—— 顾炳文