Random Capital合伙人刘毅万字长文说透 Polkadot 架构

刘毅,Random Capital 合伙人、清华大学硕士、区块链和大数据技术专家。20 年多种资本市场投资经验,比特币早期投资者。

刘毅老师深入探讨了 DApp 开发的现状、公链的三种扩容思路、以太坊向 Serenity 的进程、Gavin Wood 的新征程 Polkadot、殊途同归 Cosmos、DApp 开发比较、网络拓扑比较、辨析「跨链」、下一代 DApp 开发技术选择等 9 个方面的内容。

本次分享的主标题是 Polkadot 架构解析,副标题是下一代 DApp 开发技术评述。其实副标题更能概括本次分享,因为我们不只讨论 Polkadot,而是要相对全面地评述平台型公链,包括以太坊 2.0、Cosmos 等,当然 Polkadot 是重点。

我希望讲清楚 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 千倍。同时仍然保持去信任、无许可和抗审查这三大好处。回答是完全可能,只要降低冗余的程度,就能降低成本。方法有三类,也就是区块链扩容的三个思路——代议制、分层和分片。

四、第一种扩容思路 —— 代议制

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

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

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

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

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

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

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

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

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

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

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

五、第二种扩容思路 —— 分层

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

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

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

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

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

侧链方案就是把主链资产通证锁定,在侧链上对应地创造出通证承兑汇票,汇票交易在侧链执行,在侧链上得到汇票的人可以兑换主链通证。具体来看右图的以太坊 Plasma 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 的取款要求。这个例子说明了分层方案如何把大量交易转移到链下执行,或者说转移到二层网络执行。

六、第三种扩容思路 —— 分片

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

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

分片扩容的基本思路非常简单,但实际做起来则面临很多复杂难题。为了理解后面要对比分析的几个公链架构,你首先要大概了解这些难题。另外因为这个公链都采用 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 等公链的节点都拥有全部数据,因此能完全独立地验证交易有效性。现在变成了多个分片,节点只存储部分数据,也就无法独立验证交易有效性。

我们看左侧的图,有两个分片,分片 1 已经被恶意的验证人所控制,在 B 区块里打包了无效交易,例如给自己的地址上凭空创造了很多通证。在下一个区块 C,攻击者发起跨片交易,要把通证转到分片 2 上的 DApp,可能是去中心化交易所。分片 2 看到的 C 区块里面的交易都没有问题,而且分片 2 也没有 C 区块之前的数据,所以无法验证交易有效性。

下面我们介绍一个在分片环境下解决交易有效性的方案,叫举报奖励。其实还有别的方案,但跟主题无关,就略去不提。

看右侧图,分片 1 虽然被恶意验证人控制了,但是还有至少一个诚实的验证人。分片 2 不能验证跨链交易的有效性,就选择相信分片 1,打包了跨链交易。这时候分片 1 里的诚实节点可以要跳出来举报,说区块 B 是非法的,我有证据。

系统接受了举报,就会惩罚分片 1 里的恶意验证人,没收他们质押的通证,并向举报者提供奖励。所以为什么有的区块链,验证人要收回质押的通证,都需要等几个月。主要的原因就是给举报和证实举报留出足够的时间。

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

十一、以太坊正朔 —— Serenity

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

大家看 Serenity 架构图,是台湾资深以太坊研究员王韶为女士制作的。从上往下看,最上面是 PoW 主链,也就是目前运行的以太坊。Serenity 不会取代掉 PoW 链,而是以侧链的方式上线部署。

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

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

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

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

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

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

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

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

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

十二、Gavin Wood 的新征程 —— Polkadot

分享已到中途,终于轮到主角 Polkadot 出场。Gavin Wood 是 Polkadot 的灵魂人物,大部分同学对他已经很了解,不了解的上网搜一搜,我就不介绍了。

Gavin Wood 是 web3 基金会的创始人,也是现任总裁,Polkadot 是 Web3 基金会的核心项目。类似于以太坊和以太坊基金会的关系。

关于 web3,有必要介绍一下。在 web3 基金会和 Polkadot 等项目文档中,对 web3 愿景的文字表述不太一样。但是都包含两层意思。

第一层:web3 是无服务器的、去中心化的互联网。serverless 无服务器也是去中心化的意思,因为在 web3 憧憬的网络计算架构里,参与者或者说节点是平等的,没有服务器和客户端的区别,所有节点都或多或少参与网络共识的形成和记录。去中心化的互联网有什么用呢?

就是 web3 的第二层含义:每个人都能掌握自己的身份、资产和数据。

掌握自己的身份,意味着不需要其他人或者组织赋予身份,其他人或者组织也无法冒用或者冻结身份。掌握自己的资产,意味着不会被剥夺资产,可以自由处置资产。掌握自己的数据,意味着每个人可以按自身的意愿生成、保存、隐匿、销毁个人数据,未经他的允许,任何人任何组织都不能使用其个人数据。

web3 愿景并非 web3 基金会或者 Polkadot 项目所独有。很多区块链项目,包括比特币、以太坊,都有类似的愿景。名称五花八门,包括开放网络,下一代互联网等等。叫什么名字不重要,你应该思考 web3 愿景的内涵,那是不是你想要的互联网?

甘地说过:Be the change you want to see in the world. 我翻译成:迈向你想要的世界。如果 web3 也是你认同的愿景,那么就参与进来,为之努力。

Polkadot 是 web3 的骨干网,是 web3 的基础设施,是 Gavin Wood 和 web3 基金会指出的,通向 web3 愿景的道路。

Substrate 是 Polkadot 项目开发过程中形成的开源区块链开发框架,可以用来搭建 Polkadot 生态,也可以用于构建其他目的的区块链。

十三、Polkadot 架构

接下来我们介绍 Polkadot 架构,这两张图片都来自于岳利鹏翻译的 Polkadot 白皮书中文版。

先看右边的大图,Polkadot 的基本网络结构是星型的,或者称为轮辐型。星型的中心是 Polkadot Relay 中继链,外围是众多的 Parachain 平行链。

再看左侧的小图,Polkadot 网络的参与者有四种角色:Validator 验证人、Nominator 提名人、Collator 收集人或者核对人,Fisherman 钓鱼人或者渔夫。

DApp 可以是部署在平行链上的智能合约,或者整个平行链就一个 DApp。用户在平行链发起交易,交易被收集人收集,打包成区块,交给一组验证人去验证。

这组验证人并不是来自平行链,而是来自中间链统一管理的验证人池,通过随机分组指定给平行链。每条平行链都有一个出口队列和一个入口队列。如果用户发起的是跨链交易,交易就会被放进出口队列。再被目标平行链的收集人放入其入口队列。

目标平行链的收集人执行交易,生成区块,由验证人组敲定。Polkadot 采用混合共识协议,出块协议的英文缩写是 BABE,小孩子;敲定协议的缩写是 GRANDPA,老爷爷。

刚才讲混合共识,有同学可能会问:出块快、敲定慢,那等待敲定的区块会不会越来越多?不会的,GRANDPA 每个轮次可以敲定多个区块,从而追上进度。所以小孩子是活泼好动、步履轻盈;老爷爷是大步流星、一言九鼎。一老一小相得益彰。

除了平行链,还有两类外围区块链接入中继链。一类是转接桥,它把现存的、不能直联的区块链接入中继链,例如以太坊和比特币等。从中继链的角度看,转接桥是一条平行链。

从以太坊或者比特币的角度看,转接桥是一条侧链。此外,为了让系统具有无限的可扩展性,还可以有二级中继链。不过二级中继目前还只是设想,没有具体的设计。

我们已经介绍了收集人和验证人在系统中的作用,那么提名人和渔夫是做什么的呢?提名人是 Polkadot 基础通证 DOT 的持有者,他希望质押 DOT 获得收益。但是要么是因为 DOT 数量少,要么是缺少运行维护验证人节点的专业技能。

因此系统提供了另一个参与途径,就是持币者选择他信任的验证人,把自己的 DOT 通过验证人来质押,分享验证人收益。这样做的好处是,提高整体质押比例,提升系统安全性,同时也使收益分配更加公平。关于 Polkadot 的经济模型,是个很复杂很有趣的话题,我们就不多说了。

刚刚介绍过分片架构的交易有效性问题,以及举报奖励的解决方案,所以渔夫的作用不难理解。他就是监控和举报非法交易,赚取奖金的角色。听起来挺简单,但是做起来极其复杂。

可能有些同学想象中的举报是这样的:给 web3 基金会发邮件:我发现有人打包了非法交易,证据见附件,盼复。过些天 web3 基金会回信:您的举报已被证实,作恶者已伏法,奖金将发到你的地址,非常感谢您对我们工作的支持。

但区块链上的举报完全不是这个样子。渔夫是个软件进程,它监控网络上的非法行为,一旦发现就会向区块链提交举报交易。举报交易也要经过共识过程,通过 2/3 以上验证人验证,打包进区块,惩罚和奖励也都是区块链交易。

整个过程是自动地、去中心化地执行。这里就有很多复杂问题,例如如何对渔夫提供激励。渔夫就像警察,你可能会认为那很简单,抓住一个坏人就发一笔奖金。

那么有一堆警察天天盯着网络,没人敢作恶,警察就一直拿不到奖金。警察有运营成本,要验证并存储大量的数据,没有收入就干不下去了。警察全改行了,坏人就会出现。那你可能会想,给警察发工资吧,底薪加提成。

好,那我可以声明自己做警察,领一份底薪。但是我根本不验证和存储交易数据,成本就是 0,底薪就是我的利润。等坏人出现的时候,我说抱歉哈,我没看到,或者说我硬盘恰好坏了,那么系统应该怎么惩罚我呢?

还有就是不能随便举报,系统处理举报需要成本,随便举报就成了可以粉尘攻击的漏洞。另外能否对举报交易进行举报,应该怎么处理等等。所以在去中心化环境中,举报机制很复杂。Polkadot 的渔夫工作机制,目前我还没看到具体的说明。

在 Polkadot 网络中,平行链各自承担交易执行、数据存储,同时平行链之间能够互操作,也就实现了分片的目标。因此我把 Polkadot 看成是分片扩容方案。可以跟 Serenity 初步比较一下。你会发现 Polkadot 比 Serenity 在技术上更复杂。

Serenity 的分片是同构,采用相同的共识协议,容量也整齐划一。就像是提供给 DApp 使用的标准集装箱,规格都一样,开发者选一个分片,把自己的 DApp 放进去就好了。

Polkadot 是 web3 骨干网,它不能也不应该要求平行链是整齐划一的。平行链可以自行决定使用什么共识协议、什么样的经济模型和治理模型,自己决定硬件和网络配置等等。简而言之平行链是自治的,Polkadot 可以看成是平行链的联盟或者联邦。

Polkadot 中继链要支持异构的平行链接入,进而实现互联互通,复杂度超过 Serenity 的信标链。这一技术复杂度带来的好处是,平行链开发的灵活性,无需千链一面,可以根据具体的需求和约束,设计开发最优的平行链。

十四、殊途同归 —— Cosmos

下面我们来介绍 Cosmos,从侧链开始谈起。看左上方的图,A 和 B 是两条链互为侧链。也就是说,A 链包含 B 链的 SPV 轻客户端,从而 A 链能验证 B 链的交易。 反过来 B 链也包含 A 链的 SPV 轻客户端,从而 B 链能验证 A 链的交易。

互为侧链的结果是,发行在 A 链和 B 链上的通证可以互转。如果从两条链扩展到多条链,A 和 B 变成 A/B/C/D/E/F,一种外推的想法是仍然沿用两两互为侧链的做法,就形成了左下方的结构。

但是这样做会到来很多问题,每条链都要内置其他所有链的轻客户端,同步其他所有链的区块头,这当然是很大的负担。而且每增加一条链,都需要在其他所有链上做修改。随着区块链数量的增加,复杂度以 n*(n-1)/2,指数型增长,这显然是不可行的。

解决的办法就是改成右上方图片显示的结构,中间放一个 Hub,Hub 本是也是区块链,它跟其他所有链都互为侧链。就是说,每条链上的通证都可以转到 Hub 上,然后通过 Hub 转到其他链上,网络互联的复杂度跟区块链数量是线性关系。

这就是 Cosmos 的做法,在 Cosmos 的定义里,接入 Hub 的链称为 Zone 分区。分区要接入 Hub 需要两个条件,第一是符合 Cosmos 标准协议,即 IBC 链间通信协议。第二是要求 Zone 具有即时最终性,以确保跨链的一致性。

而且 Cosmos 可以支持多个 Hub 的互联。对于现存的公链,可以通过协议适配接入 Cosmos Hub,Cosmos 把协议适配网关称为 Peg Zone 锚定分区。最终形成的结构就是右下方图片展示的样子。

我们从侧链出发推演 Cosmos 架构。但是回过头来看,Cosmos 分区各自承担交易执行、数据存储,同时分区之间还能够互操作,也实现了分片的目标。因此我也把 Cosmos 看成是分片扩容方案。

可能有人对会对这样分类不赞同。但是没有关系,Cosmos 就是 Cosmos,分类是为了更好地理解它。从不同角度理解和阐释,可以用不同的分类方法,没有绝对的对和错。

Cosmos Hub 以及其他用 Cosmos SDK 开发的分区都采用 Tentermint 共识协议,出块和敲定过程是合一的,只要出块,就是得到了 2/3 以上验证人的签名验证。这样做的好处是简洁快速,出块时间可以达到秒级甚至亚秒级,而且具有即时最终性。

但是在网络发生分区的情况下,Tentermint 共识有可能暂停出块。Cosmos Hub 和分区都有各自的验证人组,不需要验证人动态随机分组。那么 Cosmos 如何保障跨链交易有效性呢?根据我的理解,Cosmos 回避了这个问题。

Hub 并不能验证交易有效性,只能验证存在性。如果某个分区被恶意验证人控制,那么用户在这个分区上的资产是不安全的,可能被盗取。但是这不应该看做是 Cosmos 的漏洞,而是它的设计选择。

Cosmos 经常被拿来跟 Polkadot 比较,但其实 Polkadot 与 Serenity 在架构上更为相似。前几天橙皮书的文章做了三个村庄的比喻,非常贴切。但是从 DApp 开发的角度,尤其是今年和明年的重量级 DApp 开发,主要会从 Polkadot 和 Cosmos 二选一。

从技术上说,Cosmos 要比 Polkadot 或者 Serenity 简单得多。我这里说的简单并非贬义,在满足需求的前提下,技术方案应该是越简单越好。那么 Cosmos 用相对简单的方案也实现了分片扩容的目的,不是很好吗?

确实很好,因此我也很看好 Cosmos,它会非常适合某些类型的 DApp。但是正如我们反复强调的,有所得,必有所失。Cosmos 选择了简洁,但在安全性上有所牺牲。PoS 区块链的安全等级是由总市值和质押比例决定。

Polkadot 上线之后,假设 Dot 总市值是 10 亿美元,其中一半质押在网络上,那么要对 Polkadot 主网进行双化攻击,理论上最少需要 1.67 亿美元,实际需要的会多得多。显然是一笔巨款,因此 Polkadot 网络非常安全,跨链交易有很高的安全保障。

Cosmos 主网上线之后,Atom 通证也会很高的市值,但是网络质押的 Atom,只保证 Cosmos Hub 的安全。分区和其他 Hub 会发行自己的通证来建立经济模型,获得安全保障。

但是分区通常是特定的去中心化应用,其应用规模和市值达不到 Cosmos/Polkadot 这样的大平台的等级。因此可以预期,Cosmos 分区的安全等级会低于 Cosmos Hub。

你在 Cosmos 上执行跨链交易。需要信任交易的发起分区,目标分区和 Hub,如果跨链交易中间经过多个 Hub,那么经过的每个 Hub 都要值得信任。

一方面是需要信任的区块链变多了,而且其中有些链的安全等级可能不高。所以说 Cosmos 没有做到信任最小化。安全水平降低了,但是降低之后够不够用?也许够也许不够,还是因人而异、因应用而异。

Cosmos 当然了解自身的短板,据说会在未来版本为分区提供安全保障。但是实现难度会很大。要为分区提供安全保障,需要大量的验证人,只能修改共识协议,把出块和敲定分开,当然还要处理验证人随机动态分组、交易有效性等问题。这一番改动下来,Cosmos 和 Polkadot 的复杂度也就差不多了。

十五、对 DApp 的支持对比

那么 Serenity、Polkadot 和 Cosmos 哪个更适合做 DApp 开发呢?我们来比较一下。

首先 DApp 开发方式,三个链都可以用智能合约。Polkadot 和 Cosmos 带来了新的 DApp 开发方式,就是开发特定应用的区块链。Cosmos 为应用链提供的工具是 Cosmos SDK,目前支持 Go 语言开发。Polkadot 为应用链提供的工具是 Substrate,目前支持 Rust 语言开发。

Substrate 是完整的应用链开发工具,具备完整的应用链框架,Gavin Wood 演示了在一台全新的电脑上,15 分钟发布出一条应用链。另外,Substrate 所有模块都可以定制或者替换,功能强大而且非常灵活。

相比较而言,Cosmos SDK 要单薄一些,它主要提供 Tendermint 共识引擎、IBC 链接通信协议和通证等核心模块,大部分上层建筑需要自行开发。

关于性能,Serenity 每个分片大约是 100tps,仍然是优先处理 gas price 高的交易。Polkadot Hub 应该能达到上千 tps,平行链可以自己决定共识算法、硬件和网络,理论上说没有性能限制。Cosmos Hub 和绝大多数分区都采用 Tendermint,能够达到数千 tps。

关于互操作。Serenity 跟以太坊 1.0 是一样的,智能合约可以相互调用。Polkadot 平行链通过 Relay 与其他平行链互操作,通过 Bridge 与其他链互操作。

Cosmos 分区通过 Hub 可以互转通证,通过锚定分区与其他链互转通证。IBC 消息也数据字段,就像电子邮件的附件,通过扩展数据字段,分区之间也可以传递通证以外的数据。

接入方式 Serenity 跟以太坊 1.0 相同,开发者自行部署智能合约。Polkadot Relay 接入要拍卖插槽,质押数量不菲的 DOT。Cosmos 与 Polkadot 类似,是质押 Atom 拍卖接入资格。

然后是安全性,前面说过 Serenity 的分片就像是标准集装箱,DApp 放进就行了,安全性由系统保障。与之相对的是 Cosmos,应用链不论是否接入 Hub,都是自己保障安全。Substrate 开发的应用链是两个选项,要么接入 Relay 成为平行链,由 Polkadot 保障安全;要么独立运行,自己保障安全。

最后是 DApp 升级,Serenity 和以太坊 1.0 一样,不支持智能合约升级。可能很多人对此已经习惯了,但我认为不支持升级是很大的缺陷,而且可能带来严重的安全问题。首先是代码不可能没有 bug。

Solidity 等智能合约开发语言对形式化验证并不友好,即便做形式化验证,达到 100% 的逻辑路径覆盖也不现实。其次 DApp 是互联网应用,互联网应用应该随需应变、迭代进化。

有人会认为智能合约是约定,所以不能改。其实真实世界的合同,都有经双方同意可以取消或者修改的条款。想想两个公司签了合同,现在双方都同意修改合同,结果合同本身限制了不可更改,是多么荒谬的情形。

更不要扯什么代码即法律,法律也不是一成不变,可以废止可以修订,代码反而不行,不是很奇怪吗?结果就是很荒谬,一方面 DApp 有强烈的升级需求;另一方面平台不支持升级。于是开发者自己想办法,用 delegateCall 等 rudimentary 的方法,别别扭扭地实现了可升级,还美其名曰可升级设计模式。

有了这个办法,开发者可以不经过用户同意,甚至在用户不知情的情况下修改智能合约。那么代码即法律还有什么意义?用户怎么才能知道智能合约可升级还是不可升级,哪些逻辑会变哪些不会变?只能自己看代码。所以难怪以太坊只有这么少的用户。反正我自己不够格使用以太坊 DApp。fomo3d 的合约我研究过,就没看出来有随机数漏洞。

Parity 的多重签名钱包合约的一个小 bug,锁住了上亿美元资金,坑了自己和好多人。如果要透彻研究代码才能信赖并使用 DApp,那全世界的 DApp 目标用户,大概也就是数以千计吧。

要开发能够跟中心化互联网应用竞争的 DApp,可升级是必须的。而且必须是平台支持的规范的升级,不能 DApp 各显神通。类比 Android 平台,手机 App 就经常升级,但是用户必须知情并同意,新版本 App 增加了权限需求,要显示给用户。

这些都是平台控制的,手机 App 只能遵循不能饶过。DApp 的升级应该更加规范也更加严格,因为 DApp 管理的是加密资产,而且没有可信任的中心。Polkadot 和 Cosmos 都允许应用链升级,Cosmos 的分区是自己处理升级,Polkadot 的平行链可以安全升级。

Polkadot 如何实现平行链安全升级,我还没搞明白。几周前 Gavin wood 中国行,讲了 Trust Wormhole 可信虫洞,我也没太听懂。谁了解这部分内容希望能指点一下我。

总而言之,在去中心化的区块链上,实现规范的安全的应用升级非常困难,但是没有别的选择,必须支持升级,而且是平台保障的规范的安全的升级。我认为在可升级性方面,只有 Polkadot 的方向选择是正确的。

十六、网络拓扑比较

下面来谈谈,Serenity、Polkadot 和 Cosmos 这三个区块链生态在充分发展之后,会形成什么样的网络拓扑。注意逻辑网络,不是物理网络。另外网络充分发展需要时间,这里讨论的是大概 5 年后的图景,有些内容是根据架构设计所做的推测。

首先看左侧,Serenity 网络像是一个仪仗队方阵。信标链是旗手或者领队,方队的每列是一个标准分片。每个分片都可以承载一些 DApp。中间的图是 Polkadot。Polkadot 网络是一颗树,树根是中继链,可连接多个平行链。平行链可能是特别业务的应用链,也可以是支持智能合约的 DApp 平台。

另外其他类型的区块链可通过桥接入中继。分析 Polkadot 架构可知,由于验证人数量等限制,单个中继能支持的平行链数量有限。大概是几十到一百这个量级,很难达到几百个。

当然即便达到几百,也不能充分实现 Web3 愿景。所以 Polkadot 未来会支持中继级联。也就是一级中继接入根中继,二级中继接入一级中继,从而具有无限扩展能力。

右侧图是 Cosmos。Cosmos 的多个 Hub 可以互联,每个 Hub 连接多个分区。还有锚定分区对接其他类型的区块链。Cosmos 网络拓扑与 Polkadot 粗看上去很像,都是树形结构。但是 Cosmos 的 Hub 和 Hub 之间,没有谁向谁提供安全保障的问题,所以没有层级高低。

如果把层级关系看作是连接的方向,那么 Polkadot 是有向无环图,Cosmos 是则是无向无环图。其实 Cosmos 网络拓扑是可以成环的,应该是为了避免出现跨链消息路由选择问题,选择了无环的设计。

相比较而言,我认为 Serenity 的增长方式和资源分配有点僵化。系统是自上而下式的增长,通过迭代支持更多的分片。DApp 选择哪个分片上,面临一些不确定性。例如某个 DApp 非常成功,它需要的处理能力超出了单一分片的容量上限怎么办?

目前看是没有办法。另外,DApp 上线的时候你选择了一个相对空闲的分片。结果同一分片土壤出现特别受欢迎的 D App,那么你的用户就只能忍受高成本和拥堵。

简单概括就是区块链计算资源做不到对 DApp 按需分配。Cosmos 和 Polkadot 的增长是自下而上的,不断有新应用链加入,也会有应用链退出,资源分配也更加灵活。

Cosmos 跟另外两个平台的最大区别是不共享安全性,一定程度上牺牲了信任最小化,这个在前面已经讲过了。这么说 Polkadot 兼具了共享安全和自下而上式地有机增长,是不是就是最好的?Polkadot 确实有这些优点,但是它也有自己的劣势。

最大的问题我认为就是平行链的接入门槛会很高。按照目前公布的拍卖计划,到 2020 年底,只有 24 个接入插槽。你如果开发平行链,希望明年上线,就要跟全球众多团队竞争这 24 个名额。

当然,未来 edgeware 等智能合约平台上线后,能够一定程度上降低 DApp 门槛。相比之下,在 Serenity 上部署 DApp 没有门槛。Cosmos 也会好很多,因为 Cosmos Hub 可以支持更多插槽,另外生态系统中会有多个 Hub,形成卖方市场竞争。

从更大的图景上看,Serenity、Polkadot 和 Cosmos 互联是可行的,也一定会发生。EOS 等采用 DPoS 的区块链也都可以连接进来,再加上侧链等二层网络,异构区块链的互联网络将会形成。

十七、辨析「跨链」

本次分享已经接近尾声了,我们才开始讨论跨链概念。原因是我认为「跨链」概念有歧义,容易产生误导。至少我自己被误导了很长时间。以前看关于 Cosmos 和 Polkadot 的 材料,都是把它们当作跨链方案来介绍。

我就想为什么要跨链?跨链能干什?虽然现在有几百上千公链,但是有几个有用的?比特币算一个,有人会加上以太坊 / EOS,有人会加上 ZCash/Monero,反正也就是三五条吧。

就这么几条有用的链,有什么可跨的?感觉就是脱了裤子放屁——多此一举。所以以前我看到介绍 Cosmos 和 Polkadot 的文章,扫一眼标题就过去了,不点进去看。

直到去年 Gavin Wood 在慕尼黑演示 Substrate,我才弄明白 Polkadot 是分而治之的新一代公链架构,是 DApp 的新形式。从那以后,我才开始关注这个领域。

Polkadot 和 Cosmos 设想的区块链未来图景,不是 one chain fit all 一链打遍天下,也不是 one chain rule them all 一链君临天下,而是由众多异构区块链互链形成的网络。互联就是区块链之间能够跨链交易,所以跨链是异构区块链互联网的基础能力。

比特币、以太坊等公链加入到区块链互联网,是成果之一,而不是跨链的全部内涵。所以我的看法是,跨链概念没有错,但是如果理解成为跨而跨,就没有抓住重点。

把异构区块链实现跨链交易定义为跨链。那么我们来说说什么不是跨链,或者说市面上有哪些所谓的跨链是在挂羊头卖狗肉。首先跨链必须是参与的两条或者多条区块链的状态发生了一致性的改变,都是写操作。

如果一边是读,另一边是写,或者说是根据一个区块链的数据去修改另一个区块链的状态,这不叫跨链。当然从多个链读数据,更加不是跨链。

还有一个要求,不但要实现跨链交易,而且跨链交易应该是去信任的。还是拿 Cosmos 通证跨链转帐举例,从 A 分区经过 Hub 转 10 个通证到 B 分区,你需要相信 A 分区、Hub 和 B 分区三个区块链网络。

这三个网络到底值不值信任呢?你需要自己判断,如果去中心化程度高, PoS 质押通证的总价高,被攻击的难度大,就值得信任。有些所谓的跨链方案,Hub 本身不是区块链,而是个网关,那么网关值得信任吗?

答案是不知道,网关是单一实体运营的计算设备。信任网关的前提是信任运营实体。例如我们把钱存在工商银行,通过支付宝来花钱,也没什么不妥。阿里和工商银行都值得信任,所以他们运营的网关也值得信任。

但是无论网关是否值得信任,都不属于我这里所谈的跨链。我们说的跨链,Hub 要采用分布式账本技术,而且是去中心化的运营,从而实现信任最小化。

以后再看到所谓的跨链项目,可以自行分辨,是不是支持异构区块链的去中心化跨链交易。如果不能支持,那么它所说跨链跟 Cosmos 和 Polkadot 不是同一类概念。

十八、下一代 DApp 开发技术

我个人认为目前已经落地的 DApp 只有一个,就是比特币。比特币是去中心化的价值存储型货币,或者叫数字黄金。因为是价值存储型的,所以它对性能的要求很低。

在未来几年,去中心化的支付结算型货币和交易所很有可能落地。支付结算型货币的币值,应该跟直接或者间接地跟购买力挂钩。那么现在 usdt、tusd、摩根大通币,以及未来的 facebook 币、央行加密法币,都是中心化的。做不到去信任、无许可和抗审查。

闪电网络和 MakerDAO 是重要的尝试,有可能带来突破。货币、借贷、资产发行、资产交易、保险、衍生品 … 我们离颠覆传统金融、改变世界也只隔着几个真正落地的 DApp。随着区块链扩容,基础设施给力了,DApp 就可能迎来真正的爆发。

程序员要怎样才能成为 DApp 弄潮儿,我们梳理下一代 DApp 开发技术。注意 DApp 是互联网应用。互联网开发的后端、前端、移动端、浏览器、桌面端技术仍然有效,但不在讨论范围之内,我们只谈实现去中心化的技术。

三个扩容思路,每个都有多种实现,我只列出代表性项目。代议制扩容的代表是 EOS 和波场。分层扩容分为状态通道和侧链两个分支,状态通道的方案有 Celer Network、Counterfactual 等,侧链有 Loom、OmiseGo 等。分片的三个典型方案,Serenity、Polkadot 和 Cosmos 已经逐一介绍过了。

这么看来,下一代 DApp 开发技术似乎有很多中。其实不是,DApp 开发目前只有种,就是智能合约。智能合约有两个主流的方案,EVM 和 Wasm。我们列出的项目,基本都支持 EVM,现在或者未来会支持 Wasm。

EVM 的主力开发语言是 Solidity,围绕 Solidity 已经形成生态,包括 Truffle/Remix/OpenZepplin 等工具、大量的技术资料、实例、社区讨论答疑等等,而且也有相当一批程序员会 Solidity 语言。所以掌握了 Solidity,可以确保在大多数公链上开发 DApp。

目前唯一的例外是 EOS,EOS 不支持 EVM,而是一步到位使用 wasm。wasm 会是未来智能合约开发的标准,可以支持用多种编程语言开发智能合约,包括 java\c++\go\rust 等等。

Cosmos 和 Polkadot 提供了开发 DApp 的第二种方式,就是开发应用区块链。与智能合约相比,应用链的优势是具有极大的灵活性。开发者可以自行选择或者定制共识算法、治理模型、经济模型等等,并根据实际需求配置硬件和网络。

但是另一方面,应用链开发、运营的成本会显著高于智能合约。例如要部署 Cosmos 的分区链,至少需要 4 台以上的主机,而且要质押相当数量的 Atom 通证,才能接入 Hub。可以预计,达到一定规模的团队,才有足够的资源开发并运营 Cosmos 或者 Polkadot 的应用链。

简单总结就是:下一代 DApp 有两类开发技术,轻量级的智能合约,和重量级的应用链。个人或者小型创业团队会主要使用智能合约。大型企业或者有充裕资源支持的创业项目,会使用应用链。

还有一种合理的做法是,先用智能合约实现 DApp,在获得验证和反馈之后,再开发功能更完善、使用体验更好的应用链。

十九、开发者如何选择?

后端或者全栈工程师如何选择 DApp 开发技术呢?我认为未来的区块链世界会是异构区块链互联的网络,多个平台都有会各自的生存空间,不必轻言谁将取代谁。

所以我的建议是:主要考虑当下的条件来选择技术路线,例如当前可用平台的能力,团队成员的技能等等。而不必过于纠结未来的不确定性。

如果项目已经启动,那就沿既定路线继续走下去。如果还未开始,首先明确是开发公链 DApp 还是开发企业解决方案。如果是开发公链 DApp,那么是否需要跟现存 DApp 互操作。如果是,那么应该选择在现存 DApp 相同的公链上开发。

就是说你需要互操作的 DApp 在以太坊上,你就在以太坊上开发。在 EOS 上,你就在 EOS 上开发。有人可能会问,不是可以跨链吗?跨链是非常复杂的技术,而且肯定不是免费的。在满足需求的前提下,实现方案应该尽量简单。所以能避免跨链,当然应该避免。

那如果不需要与现有的 DApp 互操作呢?这里隐含了一个问题是,你的 DApp 会不会跟未来的 DApp 互操作?或者别人的 DApp 会不会要跟你的 DApp 互操作。

举个例子,你开发一个通证合约,作为公司业务积分系统。如果你们公司的积分使用范围很大,是不是可以在去中心化交易所进行交易,是不是可以作为资产抵押给贷款 DApp?成功的 DApp 应该尽量融入价值互联网的大生态。所以 DApp 互操作不是一个选项,而是 DApp 的基本需求,只是不一定要跟现存的 DApp 互操作。

下一个问题是:DApp 是不是只需要管理加密通证?如果回答是肯定的,应该优先选择 Cosmos,如果回答是否定的,则应该选择 Substrate。为什么呢?我们前面讲过,Cosmos 能够实现跨链通证转移,而 Polkadot 能实现任意形式的 DApp 互操作。

有人可能会说,Polkadot 多强大灵活啊。这个我同意,但是大家应该理解,世界是公平的,没有免费的午餐。强大灵活的代价就是复杂和高成本。

Cosmos 在架构上比 Polkadot 要简单很多。因此我可以有把握地推断,至少在前期 Cosmos 会比 Polkadot 更可靠,而且使用成本更低。所以如果 Cosmos 满足需求,就应该选它。

如果业务需求超出了加密通证的范畴,可以选择 Substrate。另外前面有个分支,就是开发企业区块链应用,或者说开发联盟链应该选什么?我认为也应该选择 Substrate。

为什么不选 Hyperlegder Fabric 或者以太坊呢?因为商业公司推动的技术平台,注定竞争不过主流的开放平台。至于说用以太坊开发联盟链,我认为灵活性不够。

企业业务通常很复杂,对性能、可管理性等有很高的要求,而且常常需要快速迭代。Substrate 是完整的区块链框架,高度模块化和可定制化。Rust 语言侧重安全和性能,也非常适合开发关键业务系统。

二十、Rust 语言

做 Polkadot/Substrate 开发,绕不开的问题是 Rust 语言。在我二十多年的开发生涯中,遇到过极少数能快速掌握新语言的程序员。但是绝大多数程序员,包括我自己,掌握一门开发语言,熟悉标准库和开发框架,都需要很长时间。

所以学习一门新语言,对我来说,是个艰难的决定。近些年涌现出了很多开发语言,其中 Rust 语言以学习曲线陡峭而著称。到底值不值得花大量的时间来学习掌握 Rust 语言呢?作为一名 Rust 语言的初学者,我谈谈自己的看法。

首先是 Rust 语言很棒,但是尚未流行。这不是我个人的看法。2019 年 Stack Overflow 的调查显示,按流行程度排名,Rust 只能排在第 21 名,左边这张图只显示了前 16 名,所以看不到 Rust。

另外 Tiobe 编程语言指数排名,Rust 目前排在第 34 名。再看右边的图,在 Stack Overflow 调查最受程序员喜爱的开发语言排行榜上,Rust 高居第一。而且这是 Rust 第连续四年排名第一,考虑到 Rust1.0 版是 2015 才发布,可以说 Rust 正式面世以来,一直是最受程序员喜爱的语言。

而且大家知道,一门编程语言,追求高性能,和让开发者轻松惬意,通常不可兼得。比如 Java 和 Python 程序员不需要考虑内存管理,当然降低了学习和开发的负担,但是系统就要处理垃圾回收,带来性能上问题。

反之,c/c++需要程序员自己管理内存,性能可以达到最优,但是前提是要把程序写对,增大了开发的难度。但是 Rust 似乎鱼和熊掌兼得,即达到了跟 c/c++相同等级的性能,还能受到程序员的喜爱。

第二个看法是,Rust 语言适合高级程序员开发平台型的项目。Rust 语言非常重视性能和安全,它试图通过语言规范,或者说编译器,来引导程序员写出高效安全的代码。熟悉了 Rust 的用法,能自然而然地开发出高性能和高度可靠的系统,不妨称为 Rust 之道。

Rust 之道认为实现某个目的通常有一种最好的方式,Rust 试图在语言级别引导或者强制你采用最好的方式。如果不按照 Rust 之道来编码,它就让你连编译都通不过。不像 Javascript 等语言,总是有很多种选择,可以按自己的习惯,怎么写都可以。

当然代码质量可能良莠不齐,而且可维护性很差。学习并掌握 Rust 之道,需要理解一些重要的编程概念,比如对象的所有权等等。没有坚实的开发经验,很难掌握。这也就是大家认为 Rust 语言学习曲线陡峭的原因。

如果不是开发对性能和安全要求很高的平台级项目,用 Rust 有点杀鸡用牛刀。因为项目在性能和安全上的收益,不一定能抵消采用新开发语言导致的成本。

如果要开发平台级系统或者关键业务系统,Rust 就值得考虑。另外学习 Rust 语言可以带动自己加深对内存、线程、异步、闭包、函数式等高级开发概念的理解,对开发能力的提升有莫大好处。

所以简单总结一下,就是如果你有一定的开发经验,未来可能或者有志于开发平台型的系统,当然就包括区块链开发,那么 Rust 语言就值得你投入时间去学习掌握。

我用罗素的名言作为本次分享的结束语——须知参差多态,乃幸福本源。真正理解并欣赏 Polkadot 和 Cosmos 设计理念的人,都不会是最大化主义者,也不会认为 Polkadot 的目标是替代以太坊。

至少以太坊基金会和 Parity 公司都不这么认为。Parity 公司一直是以太坊生态的重要支柱之一,他们也在积极参与 Serenity 开发。

前些时候,以太坊基金会向 Parity 公司支付了 500 万美元,即是对 Parity 多年支持以太坊的感谢,也是资助他们继续开发维护以太坊节点软件。我对比特神教已经见怪不怪了,至少我能理解他们为什么那么想那么说。

但是现在以太坊生态里,也开始出现以太神教的趋向,就有点不可理喻。开放是以太坊愿景的基础,以太坊也带领我们看到了去中心化价值互联网的可能性。所以我认为支持以太坊,但是反对其他区块链,是一种自相矛盾。

前面也谈过,人们对去中心化应用的需求是多样化的。Serenity、Polkadot、Cosmos 和 EOS,还有其他 DApp 平台公链,都做了不一样的设计选择,或者说是不同的折中。因此他们会非常适用于某些需求,而不太适用于其他需求。

互联互通是大势所趋,任何一个生态如果选择孤立发展,就会被区块链互联网产生巨大的网络效应所挤压,最终被淘汰。因此我们可以期待,区块链的未来会百花齐放,更加参差多态,希望区块链和去中心化应用成为人类的幸福之源。