共识机制被认为产生在人类社会早期,哪时没有中心化的机构或者中心化较弱。那么,它解决什么问题呢?解决人类生存和发展的难题,当时人类的力量较弱,要生存和发展必须依靠集体的力量。
“共识”一词最早起源于生物学和医学,表示人体各器官协调运转,后来才被引入哲学和政治学领域。
辞海对“共识”的解释是共同认可的观念或想法,也就是大家经过讨论后形成的一致性意见。
现实生活中怎样解决没有中心化的前提下,又要达成共识呢?就是通过投票选举,少数服从多数,产生一个中心化的机构,比如美国的总统大选。
那么,在去中心化的虚拟世界中,遇到共识问题,该怎样解决呢?
比如互联网中一直没有解决的分布式系统问题,什么是分布式系统呢?就是多台相互独立的计算机,在没有中心化的情况下,利用计算机网络实现共同的任务或目标。它面临核心的问题是怎样协调相互独立的计算机,在一定时间内实现某个目标,简称一致性问题。具体可以表述为单个计算机有可能掉线、死机、发送错误信息,也可能是不诚实的节点对网络发起攻击,在没有中心的前提下,如何协调它们实现某个目标。
在分布式一致性问题下,根据是否存在恶意节点,又可以分为拜占庭将军问题和非拜占庭将军问题,什么是拜占庭将军问题呢?简单理解就是多台相互独立的计算为了实现共同目标,在内部有不诚实节点的情况下,怎样达成共识完成任务。拜占庭将军问题历史上并没有出现过,它是由美国著名计算机科学家莱斯利·兰伯特在1982年虚构的,一般描述为:
拜占庭帝国拥有巨大的财富,周围的6个邻邦对此垂诞已久,但拜占庭城墙高耸,固若金汤,一个单独的邻邦是无法入侵成功的,同时有可能自身也会遭到其他5个邻邦的入侵,拜占庭帝国防御之强,至少要一半以上的邻邦同时进攻,才有可能成功。
如果有3个邻邦答应好一起去进攻,但实际过程中出现背叛,那么入侵者有可能全军覆没。于是每一个城堡都小心行事,不敢轻易相信邻邦,这就是拜占庭将军问题。
由于将军们只考虑自己的利益最大化,往往口是心非,并不是大家一起坐下来开个会能解决问题的。如果这6个将军里有叛徒,他们会想法设法去骗其他将军发动进攻,自己可以抢夺他们的财物。
经过计算机专家研究,如果叛徒达到或者超过1/3,拜占庭将军问题便无解。比如只有三个将军,有一个是叛徒,当第一个将军发动进攻命令时,第二个将军是叛徒,他会告诉第三个将军,他收到的是撤退命令,第三个将军收到一个撤退和一个进攻的命令,就会感到很困惑,无所适从。
在中本聪发明比特币之前,拜占庭将军问题解决方案有两个,但都有漏洞,不能让人心悦诚服。首先是口头传信方式,就是将军们派人口头传达信息,好处是每个消息都能被传递出去、信息接受者知道发信人是谁、谁没发信也能被发现,每个时间点同时有5个信息发送出去,6个将军就会有30个信息发送出去。一轮下来,每个将军收到5个信息,最好的结果是:“如果多数说进攻,少数服从多数,进攻就可能成功,有少数叛徒也不影响取胜。”
但这个方案有两个明显的缺陷,首先是信息无法溯源,不知道上一个消息来源是谁,就是无法通过不一致的信息找到叛徒是谁。其次是即使多数人主张进攻,每个将军主张的进攻时间也不一定相同,很难一起行动起来。
其次是书面协议,6个将军每个人都可以向其他5个将军发起进攻信息,比如约定在某一时刻进攻拜占庭,同意就签字盖章,收到信息的将军如果同意就会签字盖章。
比口头协议好的是将军的签名不可伪造,其他将军可以验证签名的真伪,信息是被记录在案,可以溯源,进攻时间也可以同步一致。但书面协议不能解决签字信息由谁来保存的问题,最后还是摆脱不了中心化。最根本的一致性问题也没有解决,就是每个将军随时都可以发起进攻命令,自说自话,容易造成混乱,达不成共识。
有没有更好的方案来解决拜占庭将军共识问题呢?可以先用非对称加密解决签名信息摆脱不了中心化的问题。比如A将军给B将军发送进攻命令,A用B的公钥加密,B收到信息后,如果同意进攻,可以把信息用自己的私钥加密,发送给其他将军,解决了签名信息由中心化保管的问题。
解决最根本的一致性问题
中本聪发明的比特币系统很好的解决了这个问题,就是引入工作量证明共识机制。让发动进攻命令的将军要付出一定的代价,拉开了两个进攻或撤退命令的时间间隔。你要想第一个发动进攻命令,就要寻找一个随机数,使得知道部分信息的哈希值,要小于一个目标值,还要大于等于区块头给定的难度值。先不说这个随机数要大于等于难度值,只说要小于目标值,就要耗费很大的工作量。因为这个目标值前几位都是0,哈希值是由大小写字母和数字组合而成,如果目标值前有一个0,它就有62种可能性,两个0就是62的平方,当零的个数不断增加,难度系数将成指数级增长。比如你掷一个筛子,掷小于6的点数,你可能只需掷一次,如果掷小于2的点数,你可能要掷很多次。
这就让将军们在一定算力的情况下,要找到这个随机数一般需要花10分钟左右的时间。
找到随机数的将军,会把区块头的信息和随机数向全网进行广播,其他矿工收到信息,会立即停下挖矿工作,开始验证收到的信息,一旦验证通过,他们会依据当前信息再次寻找下一个区块的随机数。
这就让在一段时间内只有一个将军发动进攻或撤退命令,其他将军如果收到叛徒发送的错误交易信息,是不会被接受的,因为一笔交易信息的变动会影响Merkle根的哈希,从而影响区块头的哈希,就是会影响上个区块的哈希。
你看工作量共识,让一段时间内只有一个将军发送命令,其他将军收到命令立即验证真伪,一旦验证成功立即执行命令。拜占庭将军问题完美的解决了。
我们再来看非拜占庭将军问题有没有解决?比如单个节点可能掉线、死机、发送错误的信息。
在工作量证明机制下,节点认可的是最长链,因为最长链代表的是最大的工作量。比如你的电脑死机、掉线或者接收到临近节点发出的错误信息,你只要在重新联网时,向附近节点同步一下拥有最长链的哪个账本就可以了。你看工作量共识很好的解决了分布式系统一致性问题。