动手写条自己的链(1):Cosmos 技术架构解析

动手写条自己的链 系列文章:

  1. Hello Cosmos
  2. Cosmos 技术架构解析
  3. Cosmos SDK 入门

本文主要内容来自橙皮书《对话 Cosmos:未来是所有人都用一条公链,还是每个人都有自己的链?》,稍作修改,原文链接见文末。

Cosmos 在 3 月 14 日的早 7:00 成功启动了主网,它是以伯克利的 Tendermint 团队为核心团队开发的跨链项目,目标要实现两件事情:第一件,是让公链开发变得简单;第二件,是让所有的链能够连接起来。

Cosmos 的起源:Tendermint

在技术发展早期,人们对如何开发一个去中心化的公共账本并不会有太多的认识和思考。比特币和以太坊的设计就像一块单片电路板,上面所有的元件都集成在一起,其中的逻辑错综复杂,没有任何分层的技术栈可言。如果你写过代码的话就会知道,解耦是设计复杂系统的第一要义。只有把各个功能分开,把一个系统拆解成干净的层级、模块和接口,代码才能复用,以及更好的做修改,为未来留下灵活的扩展空间。

比特币和以太坊就像一台整体焊死的电脑,你很难对他进行改动,里面的零件也没法拔出来做升级。当人们对公链有各种各样完全不同的想法之后,人们发现把所有东西都做在一条链上是不对的,于是很多人开始想开发自己的链。这个时候你会发现,即使比特币和以太坊开源了,你也很难进行代码的复用。除了把比特币代码拷过来,改个参数,换个名称,弄出来一个山寨币之外,做不了太多事情。

在这样的背景下,有人就想,我能不能做一个工具,让大家使用这个工具能更好更快的开发自己的链呢?就好像组装电脑一样,键盘、鼠标、显示器、内存条,这些东西都是现成的、可独立拆卸的,一个不懂计算机原理的人也能像拼积木一样,组装各种各样不同性能的电脑。

Cosmos —— 准确的说,是 Cosmos 里的 Tendermint,就这样诞生了。

Tendermint 是 Cosmos 里面最重要的组成部分之一,它也是整个 Cosmos 生态的基础。要理解 Cosmos,需要先弄懂 Tendermint。

简单的说,Tendermint 是一个通用的区块链开发框架。你可以借助这个框架,快速定制开发自己的链。

不妨设想一下,如果让你来设计这样一套开发工具,你会怎么设计?很显然,第一步需要先把所有链都要用到的功能抽象出来。就像你要帮助别人组装一台电脑,需要先搞清电脑都有 CPU、内存以及显示器这些东西一样。

那么问题来了,一条链的必要组成部分都包括哪些呢?

Cosmos 团队认为可以这样划分:

  • 网络层:用来确保,在一个点对点的网络里,每个节点都能接收和传输一笔交易;
  • 共识层:用来确保每个节点选出同一笔交易,这个交易将被允许对节点的状态进行修改。在比特币里面,所谓“状态”就是一系列账户的余额(虽然是 UTXO 模型,但为了简化理解,我们可以这样认为),矿工们就一笔交易达成共识,如果有效,这笔交易就会修改所有账户的余额;
  • 应用层:用来确保交易的处理。所谓“交易的处理”指的是:输入一笔交易和一个状态,这个应用就会返回一个新的状态。在以太坊上,应用层其实就是所谓的 EVM 虚拟机。所有的交易进入虚拟机,虚拟机会根据调用这笔交易的智能合约的指示来修改状态;

Cosmos 团队认为,这个三层结构基本就可以概括一条链的所有东西了。同时,大部人想开发自己的链,其实都不太关心网络层和共识层,他们自己想定义的是应用层的东西,因为这层负责业务逻辑。

所以,Tendermint 的目标就变成了:打造一个通用的网络层和共识层,让大家可以轻松在上面搭建自己的应用层,节省很多不必要的开发时间。

Tendermint 包含两部分的东西:

  • 第一部分叫 Tendermint Core。这部分把共识层和网络层封装在了一起,变成一个通用引擎,这个引擎用来确保:交易按照一致性和安全性的原则被复制到各个节点的机器上。也就是说,相同的交易以相同的顺序被记录在链上;
  • 第二部分叫 ABCI 协议,Application Blockchain Interface。这部分是 Tendermint Core 引擎和上面开发者自定义的应用层之间的接口。通过这个接口,应用层可以和底下的共识层和网络层进行通信对话。ABCI 协议的特点,是让一笔交易可以被不同编程语言和任何编程环境下的应用处理。

接下来,我们详细看看这两部分的东西。

Tendermint Core

GitHub

Tendermint Ecosystem

Tendermint Core 包括网络层和共识层:网络层方面使用的是 gossip 协议,这块不重要,我们重点来看看共识层。

共识方面,Tendermint 使用的是拜占庭共识算法 + POS。

拜占庭算法是一类解决共识的算法,它要求网络里的验证节点一轮一轮地进行广播和投票,最终达成整个网络的一致性,以此来抵消节点离线、网络通信延迟、恶意节点捣乱等问题。拜占庭算法需要至少 2/3 的节点是诚实节点,在 Tendermint 里面,这个 2/3 的节点不是指的节点的数量,而是指的节点所拥有的权益,也就是“钱”的数量。

此外大家都知道,拜占庭共识算法比如 PBFT,是要求验证节点必须是事先预设的一组固定的节点,但在 Tendermint 里,验证节点可以动态变化,只不过这个动态没法像比特币 POW 那么灵活,你想加入就可以加入,想退出就可以退出。每次 Tendermint 增加或者退出一组验证节点,都需要经过至少 2/3 的节点的投票才能决定。

最后,如果验证节点太多的话,形成共识的时间是会变慢的。所以,Tendermint 在创世的时候把节点数设定为 100 个。在这 100 个验证节点之外,其他的用户则可以使用轻节点来访问网络。根据他们的计划,这 100 个节点数会按每年 13% 的速度增加,10 年后稳定为 300 个节点。那么,100 个节点对去中心化到底有没有什么影响?这个问题属于见仁见智了。Cosmos 认为是没问题的,他们的白皮书里有这样一组数据:

64 个节点,横跨 5 个大洲,7 个数据中心,使用商用的云计算实例,可以提供超高的处理性能,每秒钟处理上千笔交易,延迟在 1-2 秒之间。而且这种性能是在严苛的敌手假设里也能够成立的,哪怕系统里有恶意节点故意投票作弊,也能保证一定的容错性。

可以看到,Tendermint 的好处体现在性能、安全这些方面。除此之外,Tendermint 的另一个优点在于它不会分叉,因为 POS 拜占庭共识算法都是出块后就立即达成最终确定性的。

ABCI 协议

GitHub

有了 Tendermint Core 这个神器,你就可以在上面搭建各种各样的链了,不管是公链、联盟链还是私有链。

之所以能做到这一点,是因为 Tendermint Core 是不知道上面应用层具体是什么样的,它不关心应用层的实现。Tendermint 把许多无关的细节都忽略了,只抽象出关键的东西,做成通用的接口。这个接口就叫 ABCI 协议,用来连接应用层和 Tendermint Core 之间的通信

ABCI 协议是一个 Socket 协议,不管你使用哪一种编程语言、运行在什么样的编程环境下,只要你符合这个协议的标准,应用层和 Tendermint Core 就能通信。Cosmos 官方已经实现了一个 ABCI 协议的版本,名叫 Tendermint Socket Protocol (TSP, or Teaspoon),当然你也可以实现自己的版本。

ABCI 协议包括几种不同的消息类型。Tendermint Core 会创建 3 个 ABCI 连接到应用层:

  • 一个用于内存池中广播交易的验证;
  • 一个用于共识引擎运行,用于新的区块的提议;
  • 最后一个用来查询应用层的状态;

以太坊的 Solidity ,以及 Java、C++、Python、Go 这些语言都可以用来写出确定性的区块链交易处理逻辑。需要注意的是,区块的处理必须是即时确定的,不能是像比特币 POW 那种概率性确定,否则 Tendermint Core 达不成共识。POS 和 POA(Proof of Authority)共识算法都是即时确定的。

Cosmos SDK

GitHub

Cosmos Ecosystem

到这一步,Cosmos 把开发一条公链的工作减少为设计一个应用层的工作。但 Cosmos 并没有就此打住,它继续「切分」应用层。

应用层需要实现一系列的功能来完成最终的业务逻辑,不过这些功能中有很多是可以通用的,比如账户管理的功能,Cosmos 把这些功能分解出来,再以模块化的方式加以实现。

这样一来,开发者在进行应用层开发时,只需要实现自身业务逻辑中特殊的功能,其他的功能都可以直接调用 Cosmos 的功能模块。

如上图所示,Accounts(账户系统)、Governance(治理机制)、Staking(抵押机制)、Slashing(惩罚机制)、IBC(跨链功能)、Rewards&Fees(奖励&手续费)等均是功能模块,能够以「插拔」的方式被组合到一起使用。

Cosmos 把自己提供的这一模块化开发工具叫做「Cosmos SDK」,它覆盖了应用层需要实现的大部分的功能,到这一步,Cosmos 把设计一个应用层的工作减少为实现少数具体的功能模块的工作。Cosmos 团队自己也利用这套 SDK 实现了一个例子叫 Cosmos Hub。

最终,如上图所示,通过对公链的分层设计以及对应用层的分模块设计,开发者能够以 Tendermint 共识引擎和 Cosmos SDK 开发工具为基础,快速地完成公链的开发。他们不再需要设计整条公链,而只需要实现核心的业务功能。

正因为这样,币安可以在较短的时间内迅速基于 Cosmos 的开发工具和共识引擎,开发完成应用方向非常聚焦的 Binance Chain

小结

总结来说,Cosmos 希望通过 Cosmos SDK 和 Tendermint 等工具,让开发者以一种模块化、标准化、可插拔的方式(这种方式其实也是现代软件开发积累下来的大量成熟的开发技术经验),快速降低一条链的开发成本。让每个人都可以轻松拥有自己的链之后,Cosmos 再通过 IBC 跨链协议和 Cosmos Hub 与 Zone 所组成的生态系统,为这些不同的链提供互相连接的能力,最终组成一个大网络。

Cosmos 认为,现在大多数开发者倾向于在以太坊上开发智能合约,而不愿意开发自己的链,主要是因为开发一条链的难度太高了。但随着 Cosmos SDK 和 Tendermint 的普及,开发一条链的成本会变的像开发一个智能合约一样简单。

最后,Cosmos 关于区块链和生态的理解非常有意思,Cosmos 团队坚信「每个人都应该拥有一条链」,想知道为什么吗?推荐阅读下面橙皮书的文章,在末尾有橙皮书和 Cosmos 创始人 Jae Kwon 及核心技术开发团队进行的访谈。

参考资料