区块链技术几个重要的坑

近些年,区块链技术飞速发展,引领了互联网领域一次新的技术浪潮,这种新型技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术;并成为最近两年的热门投资方向,如著名投资人索罗斯在2017年年底的时候,把Facebook的股票全部卖掉,投资了一家用区块链发行股票公司Overstock。全球各大互联网公司也大力在区块链领域布局,积极推进区块链技术的落地,如IBM的供应链物流,金融结算服务区块链创业公司井喷般出现,国内区块链企业已达456家

在区块链技术变得火热的同时,许多新技术出现,区块链技术混淆越来愈平常,公链和私链技术混淆使用,如一些著名公链竟然使用私链的技术来解决速度和扩展性的问题。很不幸的是,在区块链技术快速发展的时候,一些著名的链的基础协议居然还是和几年前一样, 这表明以前发现的问题到今天还是存在没有解决,新出来的技术并未解决以前的问题,例如以下将要讲述的第一个坑

在2018年,让人惊讶的是,甚至几个世界出名的公链也被人察觉居然部分机制还是一个中心在控制。这和长期标榜“去中心化”的区块链思想直接冲突,表示完全“去中心化”的系统难实现,而且在今天法律制度下(例如美国证券交易监督委员会出的新法规)很难实现。但是哪些中心化机制可以被接受,哪些不能被接受,应该有所讨论。这是第二个坑

加拿大央行, 欧洲央行, 和日本央行三个世界重要央行在2017年和2018年出的3篇报告,现在区块链容错机制不能达到金融机构的需求已经是共识。区块链不是自己有容错机制吗?有,但现在的容错机制离实际需求差距很远。这是第三个坑

这些坑还存在今天著名区块链系统里,这给区块链投资人造成了困扰。有人认为,著名公司研发的区块链系统应该比较好,但事实上不是这样。

当然区块链不只有这三个坑,其他坑以后再讨论。这三个都是老坑,几年前已经发现的问题,但直到今天,这些坑还是存在一些区块链系统里面,甚至有的坑今年才引起大家重视。

这些坑都是中国的机会,因为这些著名的链要改是非常难的。但问题是中国真有团队愿意好好打造一个好区块链吗?还是大家只要炒币赚钱?还是只要山寨那些明知有问题的链?

第一大坑:拜占庭将军协议或是“刘关张”共识协议

区块链是一种分布式记账系统。在分布式系统中,最为关键的问题就是一致性问题。一致性问题指的是:对于给定的一组服务器节点,指定一系列操作,在某个协议保障下,使得各服务器节点对处理结果达成一致,其中用到的协议也被称作为共识算法。根据节点信任程度和容错能力,我们将共识协议分为两类:

拜占庭将军协议(节点非互信

拜占庭(BFT)将军协议则是考虑存在一定数量恶意节点的情况下,当恶意节点出现任意行为时,也能有效的保证数据的一致性。BFT系列算法,是一种确定性容错算法,共识效率高,确认时间短,容错能力稍差,允许1/3以下的恶意节点。而区块链的应用场景就是互不信任的各方通过区块链技术来做生意、开公司、上法庭,解决互不信任的各方的信任问题。图1 演示PBFT的协议,PBFT 是一个实用拜占庭将军协议,如图1所示,该算法经过预准备(Pre-prepare)、准备(Prepare)和确认(Commit)三个阶段达成一致性

区块链技术几个重要的坑_第1张图片

图1 PBFT(BFT协议的一种)

“刘关张”共识协议(节点互信

“刘关张”协议就是节点之间互信的协议,刘备、关羽、张飞三人桃园结义,互相信任对方,他们互不欺骗对方,三兄弟齐心协力。如果将他们对应于传统的分布式系统各个节点,也就是说各节点只可能出现宕机或是断开连接的情况,不会向其他节点发送虚假消息,理想情况下,互信协议中不会出现恶意的恶意节点(向不同的节点发送不同序号的消息)。

区块链技术几个重要的坑_第2张图片

**图2“刘关张”协议**

拜占庭将军协议和“刘关张”共识协议的最大差别在于:

“刘关张”协议有两轮投票,拜占庭有三轮投票。

其中,拜占庭协议的前两轮投票阶段和“刘关张”协议相似。但是在拜占庭协议的第三轮投票中,参与节点需要向其他节点发送他们在第二轮阶段收到的消息。所以,如果没有第三个阶段,拜占庭将军协议就会变成“刘关张”协议。国内一些工程师原本是为了“优化”拜占庭将军协议,结果却是将拜占庭将军协议第三轮去掉变成了“刘关张”协议。

本来认为“刘关张”协议只会在中国出现,但是发现“刘关张”协议也已经技术输出国外,国外一些出名的区块链居然也使用“刘关张”协议。他们也和中国公司一样,自称使用拜占庭将军协议, 其实是用“刘关张”协议。

“刘关张”协议又可以分两种:分布式“刘关张”和中心化“刘关张”

分布式“刘关张”协议

这种协议用在传统的分布式数据库系统,能保持多个数据副本之间的一致性,如两阶段提交协议、Paxos、Raft等, 这些都是传统数据库的一致性协议。互信协议允许宕机的节点数为1/2,但是一旦黑客攻击了其中的主节点,成为恶意节点,就可能会造成系统内的数据副本混乱,系统瘫痪

图2、3表示两段式分布式“刘关张”协议, 一个是确认情景,一个是回滚情景。

区块链技术几个重要的坑_第3张图片

图2 “刘关张”协议——确认情景

区块链技术几个重要的坑_第4张图片

图3“刘关张”协议——回滚情景

如果将数据库的互信协议应用到区块链技术当中,将不能够查验以及抵挡恶意节点,这样的区块链只能够应用在节点之间互相信任的环境下运行。因此,这样的区块链被许多学者认为是一个弱化的区块链

在中国工信部信通院发布的“可信区块链”白皮书标准里面,“有效防止节点欺诈”是“可信区块链”的一个最低要求,没有达到这个功能就不能称为“可信区块链”。所以,凡使用“刘关张”协议的区块链都不是可信区块链。

而且工信部认为不光需要满足上面的需求,“绝对一致的共识机制”还要满足以下需求:

对于下述情况,共识机制需要保证在小于理论节点数欺诈的情况下,节点间数据能够恢复正确且一致,并且和对外响应结果正确且一致。”
1)任意节点错误响应,包括执行成功对外返回‘失败’、执行失败或者不执行的时候对外返回‘成功’。
2)任意节点向网络中其他节点发送不同的消息请求,例如:系统中有4个节点,请求消息序列为a, b, c, d, e,其中任意一个节点不按照a, b, c, d, e的序列发送给其他节点,把a只发给其中的一个节点,把b,c,d,e发给另外两个节点。
3)任意节点通过修改本地数据,构造本节点校验合法的请求,例如,本节点余额为100单位,修改本地余额为200单位,然后发起200单位的转账。

如果使用这种弱化的区块链,将不能用于有强监管需求的应用里面。例如金融、公检法、政务。

例如,最近亚洲的一个重要国家的首相夫人参与舞弊事件,而政府官员为了保护首相夫人居然篡改文件。然而一年后这舞弊事情包括政府官员违法篡改文件仍然被发现,引起政治风波。

这件事情表明,政务上的区块链必须使用拜占庭将军协议,而不是“刘关张”协议。因为被信任的政府官员也可能参与舞弊, 只有拜占庭协议可以查验说谎的节点, 而且可以防止从外部和内部篡改。

区块链技术几个重要的坑_第5张图片

图4分布式“刘关张”协议

中心化“刘关张”协议

中心化的“刘关张”协议使用“原子广播”(atomic broadcast)来做共识。原子广播原来目的在于保证每个参与节点收到同样信息,因为每个节点收到同样信息等于保证每个节点有共识。一个原子广播通用软件是Kafka,而Kafka 是用另一软件Zookeeper完成的。


...
原语一:可靠广播(Reliable Broadcast,RBC)。本质上,可靠广播使得消息最终到达所有的进程一次。可靠广播(RBC)是一个广播原语满足如下特性,对消息m,有:
1)有效性(validity) - 如果一个正确的进程广播m,它最终成功传达了m
2)一致性(agreement) - 如果一个正确的进程成功传达了m,所有最终所有的进程成功传达m
3)完整性(integrity) - m只传递一次,并且是以广播的形式被发送者发送出去。
...
原语二:原子广播( Atomic Broadcast,ABC),其满足可靠广播(RBC)和另外的一个属性:
4)总的顺序(total order) - 如果正确的进程p和q分别传递出m和m',p传达m在m'之前,那么q传达m在m'之前
...
原子广播是一个可靠的广播,其中值(values)以相同的顺序被发送到每个机器上。注意到这实际上复制交易日志的问题。通俗地讲,该问题可以被称作共识
...
共识原语的标准定义满足以下条件:
1)终止性 - 每个正确的进程最终能做出决定——【共识特有】
2)完整性 - 每个正确的进程最多只做出决定一次
3)一致性 - 如果一个进程做出了v1的决定, 并且另外一个进程做出了v2的决定,那么v1=v2
4)有效性 - 如果一个正确的进程做出了v的决定,至少一个进程提议了v
...
直观地,共识和原子广播看上去十分类似,主要的差异在于,原子广播本身作为一个协议是连续的,然而共识期望终止。这就是说,每一个可以精简为另一个。共识可以被精简为原子广播通过决定第一个原子广播的值。原子广播可以精简为共识,通过依次运行许多共识协议的实例。然而存在一些微妙的考量,特别是在处理拜占庭故障方面。一个完整的参数空间的关于原子广播精简为共识的描述仍然是一个开放的研究话题

但是原子广播真的安全吗?是分布式共识,还是中心化共识协议?

如图5,Kafka使用的Zookeeper提供的数据状态存储和主节点选举服务。而Zookeeper是依赖于ZAB(一种从Paxos改造的协议)为其提供非拜占庭容错,即ZAB是一种“刘关张”(传统数据库)协议, 属于弱化的区块链。所以Kafka不能处理拜占庭将军的问题。

而且因为Zookeeper是一个中心化的系统,Kafka 也成为中心化的系统。这个Zookeeper中心系统被攻破后,整个系统就会发生问题。所以,Kafka是中心化的“刘关张”协议,和分布式区块链系统不匹配。

如果有人怀疑Zookeeper不是中心化的系统,可以查Apache [1] 和 IBM [2] 官方网站,以及著名IT 信息网站InfoQ[3],上面都是说是中心化的系统。

Hypeledger就是使用原子广播这种的共识协议,如图6。其中Orderer Service的核心是Kafka集群来完成交易排序服务。对于这种协议,即使右端的节点做拜占庭共识,如果中心化的Orderer Service被攻破了,整个系统还是会陷入瘫痪。

区块链技术几个重要的坑_第6张图片

图5 Kafka、Zookeeper、ZAB协议

区块链技术几个重要的坑_第7张图片

图6 Hyperledger中心化“刘关张”协议

不光在性能方面,中心化的“刘关张”协议和分布式的“刘关张”协议差别很大,在具体实现上,中心化的“刘关张”协议很容易实现,而分布式的实现起来相对困难。与Hyperledger使用图6的中心化“刘关张”协议实现不同。

??? 总结来说,如表1,根据可信度,区块链可以分为以下三种。

表1:

序号

协议

可信度

例如

1

中心化的“刘关张”协议

*

Fabric+Kafka

2

分布式的“刘关张”协议

***

两阶段提交协议、Paxos、Raft等

3

拜占庭将军协议

*****

PBFT等

第二大坑:中心化的区块链控制

有些区块链为了取得更快的交易速度,采用了中心化的控制,这种区块链称为“伪区块链”。这种伪区块链披着区块链的外衣,却是中心化的系统。在一个中心化的系统中,控制整个区块链的中心节点就是这个系统最为薄弱的环节。如果中心节点故意说谎或者被人攻破,则整个区块链瘫痪。不论是公链或是私链,都可能是中心化的链

部分公链的支持者会以妖魔化来形容私链(联盟链等),认为联盟链就是中心化的系统。这是商业言语,不是学术言语。在计算机领域,多个并行的执行线程,就是分布式系统,而且中心化的系统也不是妖魔,也不用躲避。中心化银行系统用了如此多年,长期服务国家、社会、家庭、个人,根本没有必要被妖魔化。

传统中心化的系统中有许多好处。安全性由的安全防护系统来完成,防火墙隔离了内部系统,保护系统免受各种类型的网络攻击。现在的许多大型应用都是用中心化的系统。

但是区块链系统不能采取这种中心化方式,因为中心化的区块链和区块链初衷是完全不符合的。如果每一次建块或是每一笔交易都是中心化的行为,那这个链就不是区块链,而是伪链

实际上,区块链系统应该由“独立的”节点来运行,独立节点就是指每个节点的状态变化不受其他节点的控制,根据共识协议的规定,以及从其他节点接收的有效消息,独立的进行状态转移。区块链系统除了要分布式处理,每个节点还要独立式处理,所以这是一个很难的一个设计。

我们完全不需要妖魔化中心化的系统。在特殊情形下,区块链也可以有中心化的行为, 例如The Dao事件,如果当时当事人没有中心化的处理,相关单位马上就会有几亿美元官司。他们当时做的决定是正确的。但是在一般情形下,区块链必须是分布式的,节点还是必须是独立式处理交易和共识

第三大坑:区块链功能机制必须需要有其容错机制

什么是容错机制?

一个容错机制乃是保护一个“功能机制”。基于一个功能机制(A),工程师设计一个容错机制B,通常B 是A+容错协议。

区块链基本共识是用投票,而共识算法PBFT本质上是容错机制,即允许系统内存在一定错误(恶意节点)的情况下,还能保证系统投票结果能够保持一致性。

问题是在区块链的设计里面,投票不是功能,拜占庭协议才是功能。当一个容错机制成为功能机制的时候, 那就需要一个自己的容错机制。如下表:

投票(A)是一个功能机制,一个投票的容错机制(B)就是拜占庭协议

但是在区块链里面,投票不是功能机制,拜占庭协议才是区块链功能机制(B), 所以区块链需要一个基于拜占庭协议的容错机制(C)。这关系可以从下表显示。

任何子系统都可以出错, 任何一步都可以出错。

但是基于拜占庭协议的容错机制是什么?就是“拜占庭协议+容错协议”是什么?

在国外一下学术文章里面有一些这样的研究,但是这些设计离实际应用还非常远,因为在实际系统里面,任何子系统都可以出错,而且在系统恢复的时候仍然可能出错,造成恢复机制非常复杂。但是学术文章里面的容错机制通常只有少数子系统可以出错, 例如投票领导出错(RBFT等协议), 但是实际系统复杂的多。

任何区块链子系统都可以出错代表什么意义?表示通讯子系统可能出错,计算子系统可能出错,投票的时候可以出错,每一步区块链投票都可以出错,数据库可以出错,并行算法可以出错,加解密可以出错。区块链每个功能、每个协议、每一步、每个节点都可以出错。而且出错不一定是“停止错误”,而且可能是“拜占庭错误”,就是有人故意捣蛋,送不同数据给不同节点。所以一个容错的区块链系统是非常复杂的!

如果没有容错的拜占庭协议,任何会带来什么影响?一个简单的错误使得拜占庭协议停止工作,或是导致错误的信息写进区块链数据库里面。前者会造成区块链停止不能前行(区块链性能因此差),后者造成区块链不能维持数据的一致性(区块链功能丧失, 后果更严重)。

根据第二个坑,区块链不应该有中心的控制节点,而每一个节点都可以查验其他节点,并且独立作业。这代表区块链容错机制必须是分布式处理,将使一个区块链容错机制设计变得非常困难。如果是中心化的容错机制,例如由中心控制的恢复系统,这会比分布式的恢复系统容易很多。

如图 7,容错和功能的关系可以从下图来看,

区块链技术几个重要的坑_第8张图片

图7,容错机制和功能机制关系图

如果有人怀疑这论点,可以看加拿大央行2017年的区块链实验报告,报告明确指出其所测试系统的容错机制不够加拿大央行报告的第8页多次指出:

验证节点的容错机制不够,加拿大央行在这个系统里面必须是一个验证节点,但是央行需要有完整的信息,央行系统需要进行备份,也会是大数据版的系统。

加拿大央行、欧洲央行和日本央行三大央行报告之后,区块链发展重点不在速度,而是可靠性,容错性和安全性,这是区块链时代的一个里程碑,也代表区块链技术走上成熟期

 

 

你可能感兴趣的:(个人技术分享)