您的位置:首页 > 职场人生

区块链面试指南--之共识算法

2018-03-13 12:58 567 查看
最近,一张关于区块链高薪职位的招聘照片火爆网络:

可以看到,月薪远远高出行业其他工程师一大截,可以说简直完爆!基本覆盖国内一线互联网大公司,最高月薪达100K。当我们还在了解什么是区块链的时候,行业巨头已经开始纷纷招兵买马,布局区块链。不知不觉中,一个新兴的工作岗位正在慢慢诞生:区块链研发工程师。
对于普通传统的程序员群体,该怎么向区块链靠齐呢?错过了AI,大数据,人工智能,能否搭上区块链的末班车?我认为:一切皆有可能这也是我着手写这一系列的初衷:区块链技术距离我们并不遥远,比人工智能要容易多得多。
为什么?先来看几个区块链的招聘要求:



看了招聘要求,你会发现没有特别高高在上的要求,前面几项都是计算机通用要求:要求计算机等相关专业;
对计算机理论、网络知识有了解;
精通linux,熟悉C++/Java/go语言;以上种种都是对后台服务器研发人员的要求,所以如果你目前从事后台研发,那恭喜你已经具备满足区块链研发的60%职位要求。剩下40%就是我这个系列要着重讲述的部分。我整理汇总了招聘网站上对于区块链岗位的招聘要求,按优先级重要性做了排序:1、熟练掌握以太坊/比特币/区块链的原理、机制;
2、理解主流共识算法,包括不限于PoW,PoS,DPoS,PBFT,Paxos,Raft等;
3、熟悉智能合约和Solidity编程优先;
4、熟悉各种数据结构和算法,对密码学,安全协议和加密算法有研究;
5、Hyperledge, 以太坊等公开区块链项目研究或参与者;
后面几点是对第一点的具体描述,本系列主要从技术层面讲解区块链的几个核心技术点:1、共识机制、共识算法
2、区块链中的密码学技术
3、智能合约和solidity编程
4、超级账本Hyperledge
一共分为4篇来讲述区块链中的用到的技术,本篇是整个区块链面试指南的第一篇:介绍区块链中的共识机制和共识算法。本文大纲:1、什么是共识机制?2、主流的共识算法有哪些?3、目前主流区块链(比特币、以太坊等)分别采用哪种共识算法?4、哪种共识算法最好?

1、什么是共识机制?

我们都知道,区块链可以看作一本记录所有交易的分布式公开帐簿,区块链网络中的每个参与者都把它看作一本所有权的权威记录。公开账本历史数据不可篡改,只允许往后添加,每个节点都具有相同的权限,那么就带来一个问题:公开账本每个新区块由谁来负责写入?因为所有节点都一样,如果所有节点同时一起写入账本数据,那么肯定数据会不一致。因此需要一种机制来保证区块链中的每一区块只能由一个节点来负责写入,如何选出写入账本数据的节点,这就是共识机制。让平等的参与者按照某种秩序达成一致意见。
打个比方,现在有一个中心数据库,所有客户端都能来查询,每个客户端权限都是一样,但如果要对数据库进行增删改,不好意思,每次只允许一个客户端来操作,通俗讲,就是让数据库串行修改数据库。通过一个算法机制来抉择出操作的客户端。这个机制就是共识机制,所谓的共识就是在人人平等的社会里需要大家共同形成一个共识,产生一个操作者、临时决策者,代表大家来进行中心化的操作,大家按照这个共识来维持去中心化的网络世界。

2、主流的共识算法有哪些?

区块链中的共识算法说到底还是分布式系统中最重要的一致性问题:在分布式网络中如何保证数据一致性。说到一致性问题,就不得不提大名鼎鼎的拜占庭将军问题。是 Leslie Lamport 1982 年提出用来解释一致性问题的一个虚构模型。拜占庭是古代东罗马帝国的首都,由于地域宽广,守卫边境的多个将军(系统中的多个节点)需要通过信使来传递消息,达成某些一致的决定。但由于将军中可能存在叛徒(系统中节点出错),这些叛徒将努力向不同的将军发送不同的消息,试图会干扰一致性的达成。
具体详情内容可执行google,我这里只说结论:Leslie Lamport 证明,当叛变者不超过1/3时,存在有效的算法,不论叛变者如何折腾,忠诚的将军们总能达成一致的结果。如果叛变者过多,则无法保证一定能达到一致性。
对于拜占庭将军问题分两种情况:1)针对非拜占庭错误的情况,一般包括 Paxos、Raft 及其变种。分布式数据库设计一般都是基于paxos或raft算法。对于paxos原理,可参考我之前写的一篇文章:币夏:理解这两点,也就理解了paxos协议的精髓​zhuanlan.zhihu.com
数据库基本采用raft和paxos的变种:
百度最近刚刚开源了:百度正式开源其Raft一致性算法实现braft http://www.infoq.com/cn/news/2018/03/Baidu-open-source-Raft-algorithm
AliSQL X-Cluster基于X-Paxos的高性能强一致MySQL数据库 http://tech.it168.com/a2017/0803/3159/000003159063.shtml
微信开源:生产级paxos类库PhxPaxos实现原理介绍 http://www.infoq.com/cn/articles/weinxin-open-source-paxos-phxpaxos
阿里云新一代关系型数据库 PolarDB 剖析 采用分布式Raft协议来保证数据的强一致性,拥有更加优异的故障恢复时间,更加满足数据容灾备份等业务场景的需求。 http://www.infoq.com/cn/articles/ali-polardb

2)对于要能容忍拜占庭错误的情况,一般包括 PBFT 系列、PoW 系列算法等。从概率角度,PBFT 系列算法是确定的,一旦达成共识就不可逆转;而 PoW 系列算法则是不确定的,随着时间推移,被推翻的概率越来越小。

具体共识算法介绍:

1)拜占庭共识算法系列PBFT/DBFT机制:拜占庭假设是对现实世界的模型化,由于硬件错误、网络拥塞或断开以及遭到恶意攻击,计算机和网络可能出现不可预料的行为。拜占庭容错协议必须处理这些失效,并且这些协议还要满足所要解决的问题要求的规范。这些算法通常以其弹性t作为特征,t表示算法可以应付的错误进程数。很多经典算法问题只有在n ≥ 3t+1时才有解,如拜占庭将军问题,其中n是系统中进程的总数。拜占庭容错能够容纳将近1/3的错误节点误差,IBM创建的Hyperledger就是使用了该算法作为共识算法。
DBFT机制,是由权益来选出记账人,然后记账人之间通过拜占庭容错算法来达成共识,这种方式的优点是:1)专业化的记账人;
2)可以容忍任何类型的错误;
3)记账由多人协同完成,每一个区块都有最终性,不会分叉;
4)算法的可靠性有严格的数学证明;
缺点:1)当有1/3或以上记账人停止工作后,系统将无法提供服务;
2)当有1/3或以上记账人联合作恶,且其它所有的记账人被恰好分割为两个网络孤岛时,恶意记账人可以使系统出现分叉,但是会留下密码学证据;
对于拜占庭将军问题可自行网上查找资料,很多这里不再赘述。
2)工作量证明PoW工作量证明,Proof of Work,通过计算来猜测一个数值(nonce),得以解决规定的 hash 问题(来源于 hashcash)。保证在一段时间内,系统中只能出现少数合法提案。同时,这些少量的合法提案会在网络中进行广播,收到的用户进行验证后会基于它认为的最长链上继续难题的计算。因此,系统中可能出现链的分叉(Fork),但最终会有一条链成为最长的链。
3)权益证明PoS权益证明,Proof of Stake,2013 年被提出,最早在 Peercoin 系统中被实现,类似现实生活中的股东机制,拥有股份越多的人越容易获取记账权。典型的过程是通过保证金(代币、资产、名声等具备价值属性的物品即可)来对赌一个合法的块成为新的区块,收益为抵押资本的利息和交易服务费。提供证明的保证金(例如通过转账货币记录)越多,则获得记账权的概率就越大。合法记账者可以获得收益。PoS 是试图解决在 PoW 中大量资源被浪费的缺点。恶意参与者将存在保证金被罚没的风险,即损失经济利益。一般的,对于 PoS 来说,需要掌握超过全网 的资源,才有可能左右最终的结果。这个也很容易理解,三个人投票,前两人分别支持一方,这时候,第三方的投票将决定最终结果。
4)授权股权证明机制DPOSPoS 的改进算法,DPOS与POS原理相似。与POS的主要区别在于节点选举若干代理,由代理人验证和记账。PoW机制和PoS机制虽然都能有效地解决记账行为的一致性共识问题,但是现有的比特币PoW机制纯粹依赖算力,导致专业从事挖矿的矿工群体似乎已和比特币社区完全分隔,某些矿池的巨大算力俨然成为另一个中心,这与比特币的去中心化思想相冲突。PoS机制虽然考虑到了PoW的不足,但依据权益结余来选择,会导致首富账户的权力更大,有可能支配记账权。股份授权证明机制( Delegated Proof of Stake,DPoS)的出现正是基于解决PoW机制和PoS机制的这类不足。
当然,随着科技的发展,在未来可能还会诞生更好的共识机制。

3、目前主流区块链分别用的是什么共识算法?

主流区块链采用的共识算法汇总如下:



1)PoW共识算法代表:比特币&莱特币&以太坊比特币采用的是PoW(Proof of Work),工作量证明,通过计算来猜测一个数值(nonce),得以解决规定的 hash 问题。
直接看比特币源码:https://github.com/bitcoin/bitcoin/blob/master/src/rpc/mining.cpp

https://github.com/bitcoin/bitcoin/blob/master/src/primitives/block.h

需要以下参数:block的版本 version
上一个block的hash值: prev_hash
需要写入的交易记录的hash树的值: merkle_root
更新时间: ntime
当前难度: nbits挖矿的过程就是找到x使得以下等式成立:
SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET
上式的x的范围是0~2^32, TARGET可以根据当前难度求出的。由于hash的特性,找这样一个x只能暴力搜索。PoW共识算法的核心是所有节点通过暴力查找x,使得上面的等式成立。谁先找到谁就或者这一区块的写入权,并获得奖励,因此pow共识机制对所有节点都公平,谁的算力强谁就更有机会更高概率获得写入权。
以太坊也是采用PoW工作量证明算法,具体实现算法叫(Ethash)具体内容可以看官方wiki:https://github.com/ethereum/wiki/wiki/Ethash
2)PoS机制代表:Peercoin & Nxt点点币(Peercoin )的权益证明机制结合了随机化与币龄的概念,未使用至少30天的币可以参与竞争下一区块,越久和越大的币集有更大的可能去签名下一区块。然而,一旦币的权益被用于签名一个区块,则币龄将清为零,这样必须等待至少30日才能签署另区块。同时,为防止非常老或非常大的权益控制区块链,寻找下一区块的最大概率在90天后达到最大值,这一过程保护了网络,并随着时间逐渐生成新的币而无需消耗大量的计算能力。点点币的开发者声称这将使得恶意攻击变得困难,因为没有中心化的挖矿池需求,而且购买半数以上的币的开销似乎超过获得51%的工作量证明的哈希计算能力。权益证明必须采用某种方法定义任意区块链中的下一合法区块,依据账户结余来选择将导致中心化,例如单个首富成员可能会拥有长久的优势。为此,人们还设计了其他不同的方法来选择下一合法区块。NXT币采用随机方法预测下一合法区块,使用公式查找与权益大小结合的最小哈希值。由于权益公开,每个节点都可以合理的准确度预计哪个账户有权建立区块。
3)DPoS共识算法代表:Bitshare & EOS比特股( Bitshare)是一类采用DPoS机制的密码货币,它期望通过引入一个技术民主层来减少中心化的负面影响。
比特股引入了见证人这个概念,见证人可以生成区块,每一个持有比特股的人都可以投票选举见证人。得到总同意票数中的前N个(N通常定义为101)候选者可以当选为见证人,当选见证人的个数(N)需满足:至少一半的参与投票者相信N已经充分地去中心化。见证人的候选名单每个维护周期(1天)更新一次。见证人然后随机排列,每个见证人按序有2秒的权限时间生成区块,若见证人在给定的时间片不能生成区块,区块生成权限交给下一个时间片对应的见证人。DPoS的这种设计使得区块的生成更为快速,也更加节能。DPoS充分利用了持股人的投票,以公平民主的方式达成共识,他们投票选出的N个见证人,可以视为N个矿池,而这N个矿池彼此的权利是完全相等的。持股人可以随时通过投票更换这些见证人(矿池),只要他们提供的算力不稳定,计算机宕机,或者试图利用手中的权力作恶。
比特股还设计了另外一类竞选,代表竞选。选出的代表拥有提出改变网络参数的特权,包括交易费用、区块大小、见证人费用和区块区间。若大多数代表同意所提出的改变,持股人有两周的审查期,这期间可以罢免代表并废止所提出的改变。这一设计确保代表技术上没有直接修改参数的权利以及所有的网络参数的改变最终需得到持股人的同意。

4、哪种共识算法最好?

每一种共识算法都有各自的应用场景,没有绝对的好坏之分。到底选择哪个共识来进行区块链的实施取决于哪类网络和数据。最近很反感一种现象:很多新区块链一上来就说自己的共识算法是PoA、PoB~PoZ(a到z的字母都快被用完了),动不动就说是颠覆性的,可实际上还是对以上介绍的几种共识算法的模仿或小改造,让初入区块链行业的人很懵逼,觉得好高大上,纯属吓唬人。

结束语

欢迎扫码关注个人公众号,一起探讨技术:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息