编者按:编者认为这个世界上只有两种公链,一种是兼容 EVM 的,一种是不兼容的,今天讨论的 Cosmos 和Polkadot 属于后者,这两个公链是从头开始做一个公链,不像很多 EVM 的公链,其实本质上都是 ETH 的代码,有的可能只是修改了个 Gas 费符号,有的可能在以太坊基础上做侧链,做二层。今天要推荐的这篇 同为异构公链,Cosmos 和 Polkadot 有何不同?希望能带你们了解一下Cosmos 和 Polkadot 的不同点。
点击此处下载PANews App,随时随地阅读更多区块链即时快讯和深度好文。
本文共 5704字
推荐阅读时间15分钟
我们经常把Cosmos和Polkadot放在一起。对于普通用户来说,二者似乎没有什么明显的区别,看起来似乎都是平行(zones)+中继(hub)的架构模式。但是,如果我们返回来认真想一下二者的角色分工,这其中的不同点就有点多了。所以我们今天来看下Cosmos和Polkadot到底有哪些区别。
分片结构
Cosmos和Polkadot都是基于未来存在多个需要互相操作的链这样一个论点而诞生的为不同状态机提供相互通信的协议。但是二者的分片范式却不一样。
Cosmos: Hub - Zones的非共享状态分片模型
之前我们讲过,Cosmos的结构是由多个Hub(例如Cosmos Hub)链接长在其上的多个Zones, 并且Hub之间也可以进行链接的一种Hub-Zones模型。其最大特色在于各个Zones和Hubs需要有各自的验证者,需要各自维护各自的安全,在需要通信的时候使用IBC(理解成Cosmos里跨链信息传递特有的消息格式)发送数据包进行交互。这就是说,各个Zones之间的状态是非共享的。一个Zones的更新重组不需要整个Hub和其他Zones跟着重组。当然,一个显著的缺点就是这代表Zones之间的通信和交易需要各自信任对方。因为这种结构下,Hub本身维持的是一个全局的代币状态,只是在zone账本和hub里对应的分区账本不一致时让和该Zone进行跨链的其他Zone断开链接。由于Zone不共享状态,重新组织一个Zone不会重新组织其他Zone,这意味着每条消息都受收件人对发送者安全性的信任的信任约束。
Polkadot: Parachains - Relay Chain的共享状态分片模型
Polkadot的分片就是平行链。而众所周知的波卡角色分工中,我们知道各个平行链的状态转换是由收集者(collators)收集对应平行链的区块(包含一个状态证明),然后提交到中继链去进行最终性的确认。这意味着所有平行链都共享状态,也代表着平行链之间需要互相通信的时候可以直接通信(通过XCM格式)而不用再通过中继链,同时共享中继链带来的安全性。不过,这同时也意味着一旦一条平行链要进行重组更新,那么整个波卡都需要重组。
质押
两者虽然都是基于PoS,但是质押模型却并不相同。
Cosmos: Bonded Proof of Stake
委托人必须为他们想要委托的节点绑定一定数量的资金,本质上是DPoS的变种(DPoS只是选举谁来维护网络安全,并且委托人也不承担风险。BPoS会和节点一起承担风险,接受奖励,同时也是治理权的委托)。
更关键的一点是,由于Cosmos采用的是BPoS, 所以其共识投票和奖励都是基于“Stake”数量的。换句话说,每次共识通过代表整个质押资产里有超过2/3的资产投票通过,奖励也一样是根据你的Stake数量来分。同时,因为还有治理权的问题,很多节点会选择0佣金,吸引别人委托给他,获得更多的治理权。
Polkadot: NPoS
关于波卡NPoS里的N我们提过(顺序 Phragmén 算法)。但是和BPoS不同的是,波卡里的共识投票和奖励是根据“验证者数量”的。也就是说,每个验证者都有相同的权重,而不是单纯根据stake数量来决定。这意味着每次共识确认和出块通过都是获得了2/3的验证者通过,而不是2/3的stake数量通过。而验证者的奖励主要是由验证最终性和出块活动来决定。加上每个节点的stake数量和他的奖励本身没直接关系,这会激励委托人将资产委托给本身stake数量不多的节点,获得更高的收益,这也给了资金不足的节点一种新的竞争方式,让他们有机会和大资金节点进行竞争。同时,这种博弈本身又会增加节点的去中心化程度。
共识:
Cosmos: Tendermint
Cosmos团队之前本身就是搞Tendermint共识引擎的,深耕于在区块链上实现BFT。而拜占庭容错能容许一定节点作恶下,系统依然不崩溃而正常运行。本质上来说这是一种提供了即时确定性的循环协议。出块和最终性确定都在一条算法路径上,一次能生产一个确定性的块(PBFT)。复杂度上来说具有二次复杂度。
Polkadot: BABE+GRANDPA
波卡本身的共识协议分了两个子协议。
BABE负责出块
Blind Assignment for Blockchain Extension,是在验证者节点之间运行并确定新区块作者的区块生产机制,根据质押并使用 Polkadot随机周期(用的VRF)将区块生产槽分配给验证者。
Polkadot 中的验证者将参与每个插槽中的抽签,这将决定这些验证者是否是该插槽的区块生产者候选人。每轮长度为 6 秒。由于这种随机性机制,多个验证者可以成为同一个插槽的候选者。某些时候,插槽可能是空的,导致出块时间不一致。
当多个验证人是给定插槽中的候选区块生产者时,所有人都会产生一个区块并将其广播到网络。这就和我们之前知道的出块过程一样,谁先得到大部分验证者确认,谁赢。但是因为考虑到网络延迟和拓补,多条链会在短时间内共存,继续扩张,直到最终确定性协议启动确认。
GRANDPA负责最终性确认
需要注意的是因为波卡的出块是同步的,本质上来说最终性确认投票投的不是块,是链(假设同时出块分叉成了ABC,那么最终性确定的就是ABC里哪个链是合法链,这和Tendermint的区别很大)。BABE可以同时出块拓展最终链,然后GRANDPA负责分批处理他们出的块,确认最终性。
波卡的这种混合共识有个显著的好处,就是结合了PoW“概率确定性”的情况下,又能快速保证最终性的确认。同时,使用多链竞争的策略允许其他验证者执行广泛的可用性和有效性检查,以确保没有无效的状态转换进入最终链。但是同样的,其复杂度也是二次复杂度。
消息传递
这首先需要明确的一点,波卡的XCM(全称跨链共识消息传递格式)只是一种类似于JSON一样的数据格式,本身不是一种跨链机制,其机制是XCMP。其所谓的跨链说的是平行链之间的跨链(共享状态的链),并不是说跨到以太坊和比特币上。我们平时说他跨链以太坊和比特币,本质上是有人做了个平行链来链接以太坊和比特币。只有平行链之间或者说波卡生态内,消息传递才是用的XCMP。而IBC本身是个消息传递机制,当然,也有自己的格式。虽然同样是限制Tendermint架构才能直接使用IBC,但是因为本身就是个开放生态(APPChain),并没有限制必须要在Cosmos里才能用。
Cosmos: IBC
Cosmos IBC实现了使用hub进行代币跨链,但是,由于链不共享状态,接收链必须信任消息来源链的安全性。这里我们需要明确几个点:
首先,IBC只负责数据传输,验证和保障数据可靠性,但是它不是个“原子交换协议”(因为链之间的状态没有共享)
其次,IBC也不是token转移协议,这部分工作是基于IBC的应用协议干的事情。同时,IBC也不是一个分片协议。它本身没有被分片的跨链状态机,而是有一系列不同链上的不同状态机共享接口
那么,其互通原理是什么。
IBC经常被人说是类似于互联网的TCP//IP协议,其特殊性在于只定义了数据是如何跨链被发送和接受的。并没有明确具体的数据以及这些数据的结构。这使得 IBC 成了一种非常适合需要在应用层实现大量标准化的互操作性解决方案。
对于Cosmos生态内部的区块链,其过程如下:
链 A 锁定通证 a 并且将这一锁定证明(凭证)传递给链 B。这一动作一旦完成并获得验证,链 B 就会铸造自己链上的替代通证 a’ (可以理解为一种等值票券),替代通证 a’ 之后可以被链 B 销毁,链 B 完成销毁后,链 A 会解锁原来被锁定的通证 a。因此,我们可以跨链转移通证的价值来实现跨链资产转移,但我们并不能转移通证本身。
需要注意的是,因为存在多条链互相操作的情况,如果直接这样建立通信通道复杂度和冗余度会很高,所以hub在此处就起到了一个信息聚合的作用,负责传递信息。
而对于非Tendermint架构的链/非最终性确认的链,IBC用的也是类似于桥接的方式,有一个Peg-zone专门来负责最终性验证。最终性通过后完成跨链。
这是因为类似于以太坊和比特币本身是PoW机制。该机制上面讲过,本质上是概率最终性,有可能被回滚。所以,为了保证最终性的确认,需要有一个peg-zone作为异构链最终性确认的小工具。详情其实可以看到之前写过关于Cosmos详细的机制说明:
COSMOS:
本质来说,IBC实现跨链资产转移还是一种映射。两个要交互的链互相运行一个轻节点在对方链,用来确定对方消息的真实性,然后通过两次握手一样的过程,完成资产和消息的转移。
Polkadot: XCMP
因为波卡本身的结构范式就是“状态共享”。所以原则上来说,各个链进行跨链通信只用规定好规范就行。这就诞生了XCM。它包括了以下几个重点:
平行链打开彼此的连接,并可以通过其已建立的渠道发送消息(开放通信接口即可通信)。
Collators(出块人)本身即是平行链的全节点,又是中继链的全节点,所以在跨链消息传递中很重要。
跨链消息不通过中继链,只有发布和通道操作(打开、关闭等)的证明才会进入中继链。
而XCM的通信过程本身还是很容易理解的,举个例子说明会更加清楚:
假设我的老板在欧洲(E)要给在国内(C)的我转钱10万块,这个转账成功在XCM的环境下需要经历如下的步骤:
1. 老板需要先把10万块转到我在欧洲(E)的账户。
2. 欧洲(E)的Collators就会标注一条信息:老板给我欧洲(E)的账户转了10万块。然后Collators会将这个信息还有对应的时间和目的地一起放置到欧洲(E)的输出队列里(Gossip broadcast)。
3. 欧洲(E)输出队列需要先经过欧洲(E)验证者的确定。
4. 因为国内(C)的收集者会定期扫描目的地是国内(C)的其他链输出队列。所以他会看到这条信息,再加入到国内(C)的输入队列,然后将该信息加入到下一个块儿中,方便后续处理。当然欧洲(E)的和国内(C)的验证者都会验证消息传递是否真的发生。
5. 在国内(C)的收集者处理过程中,消息会执行国内(C)上的相关操作(智能合约),完成资产的转移。
6. 然后包含该信息的国内(C)块会被国内(C)验证者进行验证,无误后确认最终性。完成资产的最终性转移。
需要注意的是,因为涉及通道操作,本次消息传递实际上是要经过中继链来传递的。
可以看到,Polkadot和Cosmos跨链通信的不同本质是因为状态共享与否的不同。对于波卡来说,跨链通信是不需要信任约束,因为状态是共享的,数据是可查的。而对Cosmos来说,跨链通信还会收到信任约束, 因为验证者不是共享的,状态也不是共享的。
治理
Cosmos: 常规分叉执行治理
所有持币人都可以投票。但是执行是通过分叉来执行的,和其他传统区块链一样。但是委托人放弃投票的话,投票权相当于转交给了被委托节点。
Polkadot:多部门治理系统
大多数持币人都可以参与公投,但是有多种提案方式。比较特色的就是Polkadot 有几个链上的、无需许可的机构。第一个是理事会(Council),它由一组以 Phragmén 方式选举产生的帐户组成。理事会代表少数利益,因此,理事会一致通过的提案在公投中的通过门槛较低。还有一个技术委员会(Technical Committee)用于提出技术建议(例如紧急升级以修复错误)。
升级
Cosmos: 正常分叉升级
必须通过正常的分叉机制来制定升级和提案。
Polkadot:无需分叉升级
使用WebAssembly(Wasm ,WebAssembly,简称为Wasm,是一种用于基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为用于编译 C/C++/Rust 等高级语言的可移植目标,支持在 Web 上部署客户端和服务器应用程序。而且和平台无关)作为元协议,Polkadot 可以在没有硬分叉的情况下制定链升级和成功的提案(通过在链上部署 Wasm,并让节点在特定的块高度自动执行新的逻辑)。
开发
Cosmos 和 Polkadot 的设计使得每条链都有自己的 STF(状态转换函数),并且都为 Wasm 和以太坊虚拟机 (EVM) 中的智能合约提供支持。Polkadot 提供了一个提前的 Wasm 编译器以及一个解释器(Wasmi)来执行,而 Cosmos 只在解释器中执行智能合约。
Cosmos 链可以使用 Go 编写基于Tendermint的Cosmos SDK 开发。
Polkadot平行链用的是Rust编写的Substrate框架。这里多说一句,开发者不需要指定一个集中的 RPC 节点,只需定义区块链的链规范,以便他们的应用程序与链同步。这可以通过 Substrate 连接实现,开发人员将不再需要依赖单个 RPC 节点。
其他
尤其关于代币经济的设计。这一点其实值得单独写写。老生常谈,ATOM价值捕获能力的弱势, DOT平行链代币因为没有了“安全确保”这一价值,那么主要的价值支撑就变成了业务本身,专精业务,不要多想。详细问题后面有空再说。
总结
通过比较,我们可以看到Cosmos和波卡的不同之处有太多太多。这其实牵扯到了他们两个设计哲学的不同。Cosmos的设计哲学从头到尾都像希腊城邦一样,推崇自治,自由和信任。但是本身的风险就如同上面写到的一样,本质上存在信任约束的问题,以及我们常常提到的“乌合之众”问题(不过乌合之众在我个人看来就是个有待商榷的说法,包括“公地悲剧”也一样,后面有机会给大家讲讲)。而波卡的设计则非常像一个“国家”,强调一心同体。你只要做好你平行链应该做的事情,安全什么的让我国家机器来保证。
国家的效率是很高,集中力量办大事。但是别忘了希腊城邦的制度本身也是催生西方文明的基础。但是从目前的世界来看,城邦制度还是被淘汰了。不知道放到区块链的时间会怎么样,我们拭目以待。
参考链接:
https://wiki.polkadot.network/docs/learn-comparisons-cosmos
https://forum.cosmos.network/t/ibc-tcp-ip/4219