我希望讲清楚 DApp 开发技术的走向。这是区块链行业发展的核心问题之一,它不仅对开发者重要,而且会影响到其他行业参与者。因此我尽量讲得直白浅显,争取让非技术背景的听众也能大体听懂。

DApp 为何重要?

我先从 DApp 本身说起,因为来龙去脉很长。最后还是决定简要地谈谈,否则逻辑上不完整。

DApp 是 Decentralized Application 去中心化的互联网应用。例如比特币就是一个 DApp,它是去中心化的价值存储型加密货币。去中心化的概念比较复杂,V 神有篇文章说明了去中心化有架构、治理和逻辑三个维度,大家可以找来看看。

从使用者的角度看,去中心化可以简单理解成,不能被个别或者少数参与者所控制,因此值得信任的应用属性。区块链是实现 DApp 的主流技术手段,或者说区块链是 DApp 的基础设施。

本次分享所说的区块链,如果加不特殊说明,都是指公链。DApp 和普通的互联网应用的差别就在于 D 去中心化。那么去中心化为什么重要?为什么值得众多 IT 互联网从业者参与其中?它是不是个伪需求伪概念?

回答这个问题最清楚的,是 a16z 的合伙人Chirs Dixon,他在 2018 年 2 月发表文章题为《Why Decentralization Matters》,就是去中心化为什么重要。

要理解他的观点,首先要了解什么是网络效应。网络效应是指产品或服务的效用随着用户增长而增加的机制。

例如微信,用得人越多,它的功能就越强大,越不可或缺。互联网应用的核心就是建立并维持网络效应,谷歌、亚马逊、BAT 等巨头的业务,都是建立起了强大的网络效应,使得后来者难以逾越。

Chirs 认为互联网平台要建立网络效应,都是要千方百计的吸引用户、吸引开发者和商家等等。但是在突破了关键规模之后,平台的吸引力越来越强,它的控制力也越来越强。

比如现在做电商,如果不依托于天猫、京东或者微信,几乎不可能成功。因为他们已经形成了巨大的网络效应,用户和商户都被锁定了。互联网平台的运营方都是企业,企业的使命就是利润最大化。

当用户和商户离不开平台的时候,平台跟用户商户之间的关系就就发生变化。我们看上面这张图,平台最开始是吸引用户,形成网络效应之后,就开始尽量从用户头上赚钱。

平台跟开发者、内容创造者和商户之间,也从合作逐步走向竞争。例如大家都知道百度搜索结果不是按信息的真实性和重要性排序,而是谁给的钱多就排在前面。

最早百度广泛联系各家公司,让大家把信息提交给他,方便用户搜索。现在如果不交钱,公司的官网在百度上就搜不到。百度为了赚钱,把病患导流给莆田系医院。但国内的用户明知如此,还是离不开百度,因为百度的数据最多,对用户也最了解,想想是不是很可怕。

DApp 可以改变互联网平台垄断的局面。因为 DApp 是去中心化的,靠公开透明的共识维持的经济体。网络的参与者贡献越大,相应的权利也就越大,但是没有个体能控制全局。

任何参与方要损害其他人的利益,要么是行不通,要么就会引发分叉。DApp可以长期保持开放、公平,所以大家不用担心过河拆桥,所有人都尽自己最大努力参与建设,并获得回报。有点类似于各尽所能、按劳分配的社会理想。

这才是真正的开放网络,是互联网不应忘记的初心。所以众多互联网大咖都对DApp以及实现DApp的区块链技术情有独钟,并寄予厚望。

DApp 发展困境

去中心化应用承载着重塑互联网的伟大理想,但是其发展现状非常窘迫,这个也大家都清楚,我简单提一下。

首先是用户极少,例如预测市场 Auger,DApp 领域的明星项目,融资数千万美元,开发历时三年多,上线之后日活用户几十人,而且 Auger 不是个案。

我们看上方的图,来自 DAppReview,是以太坊 DApp 日活用户的前5名,最高的也只有千用户级,而互联网的顶级应用日活用户可以达到数亿,差距是 5 个数量级。

为什么 DApp 情况如此可怜?主要是因为区块链基础设施不给力,使得DApp 使用门槛高、用户体验差。就好比以太坊是一条村级公路,收费高而且拥堵,当然就没人愿意走。

下方的图展示的是以太坊的利用率,可以看到从 2017 年底到现在,以太坊一直是接近满负荷运转。也就是说 DApp 又慢又贵,但基础设施已经全力以赴了,没有再提升的空间。

在这样的困境下,DApp 要突破关键规模、创造出网络效应、跟中心化互联网应用竞争,是不可能的,所以必须升级区块链基础设施。

又慢又贵的原因——区块链极度冗余结构

DApp 又慢又贵的根源是区块链平台的架构限制。这个架构限制可以简单概括为:区块链是极度冗余的计算架构。

冗余就是重复,让多台计算机重复执行相同的计算、重复存储相同的数据。冗余是有意为之的,不是浪费。适当的冗余在企业计算和互联网都普遍存在。

最典型的是主从结构,两台差不多的计算机一主一备,执行相同的计算、存储相同的数据。主机出现故障,备机迅速顶上。虽然两台机器干了一台的工作,但是提高了系统的可用性。

但为什么说区块链是极度冗余呢?因为区块链把冗余推到了极限,网络中所有的计算机,不论是几百台还是上万台。都执行相同的计算,存储相同的数据。冗余的程度无以复加。极度冗余意味着极度高昂的成本,成本高到什么程度?

V 神给出过估算,就是在以太坊上执行计算或者存储数据,比在商业云平台上完成相同计算或者存储同样的数据,成本高 100 万倍。也就是在普通云服务上花费 100 钱能完成的计算,放到以太坊上去做,需要 1 个亿的成本。所以在考虑什么业务可以做成 DApp,一定要考虑到成本。

不要仅仅为了讲故事圈钱,就把什么阿猫阿狗都放到区块链上来,那是资源的巨大浪费。那么花 100 万倍的成本,能得到什么好处?高可用性当然不在话下。比特币或者以太坊网络,随时都有计算机加入或者退出,对业务毫无影响。

但是高可用性显然是不够的,因为它只需要适度冗余就能实现,不需要极度冗余。极度冗余带给我们的新属性就是去中心化。具体地说,去中心化对用户意味着 trustless、permissionless和censorship ressistancy,就是去信任、无许可和抗审查。

无许可很好理解,任何人想要使用比特币、以太坊,都不需要向别人申请。抗审查也很清楚,没人能阻止你使用区块链。比如维基解密,世界上最强大的国家恨它入骨,欲除之而后快,但是维基解密仍然能获得比特币捐款。

含义比较模糊的是去信任,英文是 trustless、trust free 或者 trust minimal。我认为最准确的说法是 trust minimal 信任最小化。使用去中心化应用,其实隐含了对区块链网络整体的信任。

例如使用比特币和以太坊,就要信任比特币和以太坊不会被 51%攻击。使用 Cosmos 和 Polkadot 就要相信恶意验证人少于 1/3。所以去信任的准确含义是,在信任整个区块链网络的前提下,可以不必信任个别矿工或者验证者,也无需信任交易对手。

对于某个应用,如果用户从去信任、无许可和抗审查这三个方面获得的好处,值得花费 100 万倍的成本,那么这个应用放在区块链上就是合理的。有这样的应用吗?就我自己来看,目前能值这个成本的,只有价值存储一项需求。

著名的比特币最大化主义者 Jimmy Song 说,比特币会成功,而法币和所有的竞争币都会失败。原因是中心化的货币干永远不过去中心化的货币,而去中心化的产品永远干不过中心化的产品。

隐含的逻辑就是,相同的互联网服务产品,成本差 100 万倍,当然干不过。他这个说法是有道理的,但是过于僵化。因为 100 万倍的成本差距不是必然的,是可以改变,可以拉近的。

能不能把 DApp 和中心化互联网应用的成本差距,从 100 万倍拉近到 10 万倍,1 万倍,甚至 1 千倍。同时仍然保持去信任、无许可和抗审查这三大好处。回答是完全可能,只要降低冗余的程度,就能降低成本。方法有三类,也就是区块链扩容的三个思路——代议制、分层和分片。

三类扩容思路 1——代议制

第一个扩容思路——代议制,源于人类的古老政治智慧。即民主是好的,但是全民直接民主效率太低。英国脱欧采用了全民公投的方式来决定,但是显然不能所有的议题都搞全民公投。

代议制是人民选出代表,再由代表来议定法律或者重大决议。代议制提升决策效率有两个原因,第一是参与共识的人数大为减少,第二是代表通常是专职政治家,他们有更多的资源和知识来议定国家大事。

用代议制的方式来做区块链扩容,最典型的是采用 DPoS 共识的 EOS。EOS 通证的持有者选出超级节点,21 个超级节点轮流出块。跟以太坊相比,参与共识的计算机数量下降了 3 个数量级。

而且以太坊的节点计算能力高低不齐,协议参数设定要兼顾低端计算机。而 EOS 超级节点主机硬件配置和网络带宽有同一的高要求。所以毫不奇怪,EOS 能达到数千 tps,远高于以太坊。

EOS 从诞生之日起,就一直处于风口浪尖。加密社区的一部分人严厉地批评 EOS,说它中心化的,甚至认为它根本不算区块链。而支持者认为 EOS的去中心化程度是足够的。用户仍然能够享有去信任、无需许可和抗审查等好处。

那么 EOS 的去中心化程度是否足够呢?我的看法是:有些情况下够,有些情况下不够。取决于是什么应用,谁在使用。

用户和用户差别巨大,只从国籍分,就有美国人、中国人、伊朗人、朝鲜人等等。还有性别、年龄、种族、地域、职业、宗教等等差别。

另外就是一个特定用户,他的需求也是多样化的,例如社交、娱乐、金融、协作等等。大类又分成很多小类,金融里仅仅对货币就有价值存储需求、大额转账需求、小额支付需求等等。

如果把是大部分身家都用加密货币来做长期价值存储,我首选比特币。如果是小额支付,或者打麻将、掷骰子,用 EOS 当然也没问题。在区块链世界,从去中心化程度最高的比特币和以太坊,到中心化程度最低的 EOS 和波场。

可以看成是去中心化谱 decenralization spectrum。每条公链,包括后面重点介绍的 Polkadot 和 Cosmos,都在谱中占据特定位置,都有机会适用于特定需求。不存在 one chain fit all 一链打遍天下的可能性。

做架构设计就是做折中,有所选择必然就有所放弃。本次分享的核心理念,就是未来的区块链世界是异构的、多链共存的。当然,我也不认为需要几百上千条公链,因为合理的可选位置没那么多。在定位大体相似的情况下,网络效应会消灭弱者。

三类扩容思路 2——分层

分层也称为二层扩容或者链下扩容,就是把一部分交易放到在区块链以外执行,同时仍然保障交易安全。分层有状态通道和侧链两类技术。还有一类二层技术,是把计算密集型任务转移到链下执行,这块与分享主题无关,不再提及。

状态通道和侧链是不同的技术隐喻,但是到了实现层面,其实非常相似。由于 Cosmos 和侧链有很深的内在联系,所以我在这里花点时间,讲讲侧链的原理。

要理解侧链,首先要明白 SPV 证明,SPV 是 Simplified Payment Verification 简单支付验证的缩写。为了让计算和存储能力有限的设备能够使用比特币的问题,才有了 SPV,或者叫轻客户端或者轻节点。

手机钱包就是轻客户端,它不必同步全部区块,只需要同步区块头,传输和存储的数据量缩小了 1000 倍。左侧图是 SPV 证明的原理,利用了梅克尔树。看不懂没关系,只要记住梅克尔树是区块链最重要的数据结构。

利用它可以只需存储极少的数据,就可以证明大量的事实曾经发生过,而且属于特定集合。就区块链来说,就是只存储区块头,未来就可以验证交易是否存在于某个区块。

侧链方案就是把主链资产通证锁定,在侧链上对应地创造出通证承兑汇票,汇票交易在侧链执行,在侧链上得到汇票的人可以兑换主链通证。具体来看右图的以太坊 Plasam MVP 侧链方案。

首先要在以太坊主链上部署 Plasma 智能合约,假定有 Alice 和 Bob 两个侧链用户。Alice 发起主链交易把通证存入 Plasma 合约,通证被合约锁定。

侧链的 Operator 发现 Alice 存入了通证,就会在侧链里创建出侧链通证,也就是主链通证的承兑汇票。请注意侧链本也是区块链,它有自己的共识协议和矿工。

在 Plasma MVP 方案中侧链采用的共识是PoA权威证明,就是一个 Operator 说了算,由它记账出块。PoA 当然不是唯一选择,Loom 的 Plasma 侧链采用的 DPoS 共识。

存入之后,Alice 就可以在 Plasma MVP 链使用通证,进行支付或者转账。例如她可以跟 Bob 玩游戏,输赢通证,可能很快就玩了很多局,产生了大量转账交易。侧链交易只需要侧链的节点达成共识。而侧链的规模通常比主链小得多,因此交易执行更快,成本也低。

侧链区块的区块头,都会由 Operator 提交给主链的 Plasma 合约。不论侧链一个区块含有多少笔交易,是 1 千笔还是1万笔,主链只发生了记录区块头一笔交易。所以主链上的 Plasma 合约,相当于是侧链的 SPV 轻节点,它存储了区块头,从而可以验证侧链交易是否存在。

例如 Alice 在侧链上把通证转给了 Bob,Bob 就可以向 Plasma 合约发请求,包含侧链交易的 SPV 证明,表示 Alice 已经把这些通证给我了。

Plasma 合约可以验证转账交易在侧链确实存在,从而满足 Bob 的取款要求。这个例子说明了分层方案如何把大量交易转移到链下执行,或者说转移到二层网络执行。

三类扩容思路 3——分片

第三个扩容思路是分片,原理很简单,就是别让所有的节点都执行所有的交易。把节点分成很多组,或者说分成很多片。多个分片可以并行处理交易,总体的处理能力就提高了。

当然还需要一条特殊的链来看管所有的分片,这条一般称之为主链,它要做很多工作,后面再详细介绍。粗略的解释是,如果没有主链,多个分片之间没有联系,那就是完全独立的多条区块链,跟扩容无关了。

分片扩容的基本思路非常简单,但实际做起来则面临很多复杂难题。为了理解后面要对比分析的几个公链架构,你首先要大概了解这些难题。另外因为这个公链都采用 PoS 共识,所以我们讨论分片难题和解决方法基于 PoS 来讨论。

分片的难题——验证人选择

首先就是分片之后,每个分片都需要一组验证人。大家看一下这张示意图。

如果在单链上,恶意验证人超过一半,可以攻击系统。分片之后,只要在一个分片内占据多数,就可以攻击这个分片。所以片分得越多,攻击成本越低,也就是安全性降低。

解决的方法是,分片的验证人分组不是固定的,而是随机选取,而且每隔一段时间就重新分组。这样恶意的验证人不能事先知道自己被分到哪个组,而贸然发送攻击会受到惩罚,因此系统的安全性就不会随着分片数量上升线性的下降。

验证者随机动态分组的关键,是要有可靠的随机数,随机数一直是计算机科学中复杂而有趣的问题。去中心化地拜占庭容错地产生可靠随机数难度非常大,也是区块链研究的热点问题。

分片的难题——跨片交易完整性

在分片的方案中,每个分片上可以运行一到多个 DApp,不论 DApp 在不在同一分片,都要能互操作。首先要明确什么是跨片互操作?因为分片也都是区块链,所以跨片等同于跨链。

大家知道区块链可以看成是分布式共识维护的状态机,状态机通过交易执行完成状态转移。跨链的互操作应该引发双方的状态转移,也就是两个互操作的链都执行了交易,而且执行交易之后的状态具有一致性。

或者说一个跨链交易要引起两条链乃至多条链的状态改变,而且这些改变要么都成功,要么都不成功,不存在中间状态。这跟企业计算里分布式交易的概念上非常类似。

只不过传统分布式交易的参与者通常是多个数据库,而跨链交易的参与者是多条区块链。非技术背景的同学可能不熟悉状态机和分布式交易的概念。因为跨链交易的概念对理解本次分享的结论很重要,我再用非技术语言解释一下。

假设你要从工行账户转1万块钱到建行账户,这笔转账交易其实就是从工行账户上减掉 1 万,在建行账户增加一万。工行和建行各自都有数据库存储账户余额,那么就要有一个机制,保证两个数据库的操作,一加一减,在任何情况下要么都成功,要么都失败。

如果没有这样的保证,工行账户减掉了,建行账户没加上,你少了 1 万块钱,你肯定不干。如果工行账户没减掉,建行账户加上了,你多了 1 万块,银行肯定不干。

这就叫分布式交易的完整性或者原子性。简单吧?其实做起挺难的,因为不论是工行建行哪家的服务器停电、断网、软件崩溃等等,各种极端条件,都要保证交易完整。在区块链上,转账变成了转通证。

某通证发行在A链上,通过跨链转 10 个通证到B链,跨链交易完成后,A 链上的 10 个通证被冻结了,B 链上多了 10 个通证。这两个状态改变在任何条件下,要么都成功,要么都失败。

由于区块链可能分叉,跨片交易要比传统的分布式交易更复杂。我们看图,如果跨片交易在分片 1 上的部分是在 A 块里被打包,在分片 2 上被 X’ 块打包。两个分片都可能出现分叉,A 块和 X’ 块也就可能成为被废弃的孤块。也就是跨片交易可能部分成功部分失败,完整性被破坏。

怎么解决这个问题呢?我们来分析一下,造成跨链交易完整性被破坏的根本原因是,交易的多个部分被打包进区块,但是链可以重组,块可以变成孤块。

说白了就是交易进了区块,但是靠不住,有可能反悔,正式说法是没有明确最终性。最终性finality就是区块必然被包含进区块链。

在比特币区块链上,某个区块后面连的区块越多,它被逆转或者说放弃掉的可能性就越低,但是永远不能 100%确定,所以称为概率最终性或者渐进一致性。解决这个问题的办法就是,要有机制让区块具有明确的最终性,不能含糊。

分片的难题——最终性 VS 活性

finalize 就是使区块具有最终性,我翻译成敲定。要使区块具有最终性。简洁的方法就是出块即敲定。Cosmos 的 Tentermint 共识就是这样。但是这个做法在特殊情况会出问题。

我们看图,某条 Tendermint 共识的区块链原本正常出口。突然海底光缆断了,互联网被分成了两部分。两部分各自包含一般验证人节点。Tentermint 共识要求收集到 2/3 以上的验证人签名才能出块。

被断开后,两部分网络都最多收集到一半验证人签名,所以出块停止了,或者说区块链丧失了活性 liveness。有人认为这可以容忍,本来就是特殊情况嘛,那就先停下来,等网络恢复正常再继续工作。

海底光缆断了,上网、打电话、视频会议都受影响,凭什么区块链就不能暂停呢?还有人认为停止出块不可接受,要始终保持区块链的活性。那怎么办呢?办法就是把出块和敲定分开,也称为混合共识。

在刚才说的网络中断情况,在两个分开的网络,节点可以继续出块,但是没有足够的验证人参与进来,所以不能敲定。等网络恢复了,再决定哪些块被敲定,从而活性和最终性兼得。

而且混合共识可以让个别节点轮番快速出块,于此同时,敲定过程可以慢一些,让大量节点参与进来,确保去中心化,提高攻击和共谋的难度,也就是保障了安全。所以混合共识也兼顾了性能和安全。以太坊 2.0 和 Polkadot 都采用混合共识。

分片的难题——交易有效性

还有个分片难题是交易有效性。交易有效性问题就是防止无效交易进入区块,成为区块链维护的历史真相的一部分。

举比特币的例子,假如我是超级大矿工,掌握了大部分算力。我想伪造一笔交易,把别人地址上的比特币转给我,能不能做到呢?答案是做不到。

因为这笔交易没有地址对应的私钥签名,是无效的,包含这笔交易的区块也是无效的,不会被其他节点所接受。即便我掌握了大部分算力,可以挖出最长的链,但也只是构建了一个很长的分叉。

众多的比特币钱包、交易所都不会认可我这个分叉。所以 51%攻击,并不能把谁的 btc 偷走,或者凭空创造出比特币。最多是双花攻击,双化不展开谈了。总而言之,比特币网络不存在交易有效性问题。

那么这样一个十年前就被完美解决的问题,怎么又会出现呢?原因是 btc 等公链的节点都拥有全部数据,因此能完全独立地验证交易有效性。现在变成了多个分片,节点只存储部分数据,也就无法独立验证交易有效性。

以上我们介绍了四个分片的难题,和相应的解决方案。其实分片扩容的难题不止这些,限于时间,就不再列举了。

以太坊正朔——Serenity

下一代以太坊的lay1扩容思路就是分片。关于下一代以太坊,信息很混乱,连名称都不统一,有以太坊 2.0、Serenity、Shasper、Casper 以太坊等,我们统一称为 Serenity。

但是长期而言,Serenity 并不依赖 PoW 链,PoW 下面的三层都属于Serenity,而且恰好对应 Serenity 演进的三个阶段。

首先是 Beacon Chain 信标链,主要功能是管理验证人。信标链上线后,如果希望成为 Serenity 的验证人,就把 ETH 从 PoW 链转入信标链。还是用侧链的方式,信标链在 PoW 主链上部署智能合约。

ETH 转入信标链是单向的,不能再从信标链转回 PoW 链。在信标链上拥有 ETH,进行质押并运行节点,就可以成为验证人。为了达到充分的去中心化,做 Serenity 验证人的门槛很低,只需要质押 32 个 ETH,验证人集合会很大,可以达到几万到几十万这个数量级。

信标链还负责产生随机数,用于验证人分组和出块人选择。信标链执行 PoS 共识协议,包括它自己的共识和所有分片链的共识,对验证人进行奖励和惩罚。还有就是作为跨片交易的中转站。信标链预计在今年年底或明年年初上线。

目前有多个团队在进行信标链节点软件开发,有几个团队已经部署了测试网。下一阶段会部署公共的、长期运行的测试网,把各团队开发的节点放在一起进行测试。

信标链往下是多条分片链,分片链被看成 Serenity 的数据层,负责存储交易数据,维护数据的一致性、可用性还有活性,也就是确保总是能出块,不会被锁住。分片链的上线时间还不确定。

分片链的下方是虚拟机,虚拟机负责执行智能合约和转账交易,改变状态,也就是对分片链数据进行读写。Serenity 很重要的设计决策是把数据层分片链和逻辑执行引擎虚拟机解耦。

解耦带来了很多好处,例如可以分头开发,单独上线或升级等等。Serenty 虚拟机将用 wasm,可以提高性能,并支持多种编程语言。

Serenity 如何前面所说的四个分片难题呢?首先是在信标链上管理验证人池,为每个分片链随机指定一组验证人。采用混合共识,验证人轮流出块,采 Casper FFG 敲定最终性。用举报奖励方法保障交易有效性。