干货 | 什么是 Substrate?

Ajian   |     |   1115 次阅读

如果你实时关注了 Polkadot 的进展状况,你可能会经常看到“Substrate”这个词。它是 Polkadot 项目的重要组成部分,但是关于它的信息却非常贫乏。白皮书里没有,黄皮书里也没有,至少没有用 “Substrate” 这个名字,且其细节也在不断变动。从比较抽象的层面来看,Substrate 是一个通过最新研究的区块链技术创建加密货币和其他去中心化系统的框架。但这对于理解它,并没有帮助,至少对我来说没有帮助。

我认为理解 Parity Substrate 最重要的一步是, Parity Substrate 是独立于 Polkadot 的项目。尽管 Polkadot 是基于 Substrate 的项目,而且那些基于 Substrate 其他项目也能在 Polkadot 上运行,你现在就可以用 Substrate 构建新的一条区块链,不用等待 Polkadot 开发完成,甚至不用等概念验证的发布,就可以开始使用此框架开发区块链。

Substrate 帮您解决了哪些问题

那么什么是 Substrate 呢?你可以将其看作类似于 Express 或其他 Web 应用程序的框架,但它是用于构建分布式或去中心化的系统的框架,可以构建例如加密货币项目,或消息总线系统。正如大多数 We b应用程序不需要重新实现自己的 HTTP 协议一样,我们认为,对于每一个团队创建新链时,也不需要从头实现网络和共识的代码,这浪费精力的。更不用提为了实现业务逻辑,必须雇用的密码学家、安全研究员、网络工程师、开发人员(以协调更新)等等了。如果你想使用 Substrate 来构建一个新项目,只需要在代码中实现少量的函数回调,然后就能获得以下特性:

  • 共识机制,确定性(Finality),出块投票机制。即使你不需要加密货币,甚至是构建不需要区块链的项目,这些特性也是可用的——这意味着你将获得拜占庭容错特性,也就是说网络中部分节点宕机、失效或者被恶意控制时,你的整个网络系统仍然可以继续正常工作。
  • 网络,节点发现、同步等等。
  • 一个有效的、确定的、沙箱式的 WebAssembly 运行时,可以用于运行智能合约,以及其他基于 Substrate 的项目。当然你也可以不用 WebAssembly ,自己写虚拟机解释器,但是我们坚信使用 WebAssembly 运行时的好处,能让你利用我们全球社区开发的工具与我们在 WebAssembly 的工作成果。
  • 流畅运行一个浏览器节点,并具有与其他类型的节点通信的能力。
  • 跨平台的数据库/文件存储系统,还支持浏览器环境;
  • 客户端平滑更新——任何可能影响共识的更新都是通过将代码编译成 WebAssembly 的执行文件,然后把它作为网络上的一条消息进行部署。不仅如此,你可以保存多个你想编译为本地的不同版本的共识代码,Substrate 会去处理复杂的正在执行的本机代码与发布的 WebAssembly 部署环境的差异。你将获得本地代码所拥有的速度,但是因为 WebAssembly 有回退机制,可以以自己的速度部署本地版本,而且不会有硬分叉或者共识问题。
  • 能在 Polkadot 发布时立即运行你自己的项目。尽管基于 Substrate 的项目可以编译成一个项目对应一个独立的客户端程序(就像现有的区块链项目一样),但是因为 Polkadot 实现了 Substrate API,你可以利用 Polkadot 提供的安全性和链之间的互操作性。Polkadot 本身就是基于 Substrate 构建的,允许我们快速获得 Substrate 框架中任何漏洞的反馈,允许我们运行 Polkadot 测试网,甚至再启动第二个 Polkadot 链作为侧链。如果你不知道 Polkadot ,或者你还没有充分了解 Polkadot 的优点,你可以看 Polkadot 的这篇博客(中译本见文末超链接《区块链创新者的利器》)。

您需要自己实现的部分

那你需要自己实现哪些内容呢?本质上来说,Substrate 只是你的状态机,包含交易之类的东西。为了使 Substrate 尽可能的通用,它本身没有交易。相反,它有我们所谓的能够存储任何数据的、只是二进制块的“外部交易(extrinsics)”。对于大多数链而言,这些 extrinsics 包含交易,但是你并不需要那样去实现。你完全可以从网络中去掉货币的概念,然后基于 Substrate 创建一个去中心化的 Erlang 模式的 actor 模型并发系统,并为网络初始化一组可信的机构,验证网络的正确行为。假设你确实需要货币和交易,但是,交易格式可能并不重要——只需要一个交换格式和可以访问的一个数据库。甚至 Substrate 比其他分布式体系结构(就像微服务)更容易——因为代码和数据存储在同一个位置,你不需要实现交易的后向兼容 [1],仅实现存储就好。对于有私有交易的链来说,实现起来可能会更加复杂,所有东西都没有最终确定,你会在不同的地方看到不同的表述,但是,关于你需要实现什么来启动并运行一个完整的区块链,下面有一个简单的解释:

  • 基于上一区块的区块头,构造区块的函数。区块头包含:
    • 区块高度;
    • 区块状态的加密确认,对于轻客户端验证区块是否正确十分重要。加密确认的作用类似于哈希,用户无法在不作废加密确认的情况下改变区块状态;
    • 区块中所有交易的加密确认,可以防止交易被更改;
    • 父块的哈希值;
    • 一些额外的任意数据。可以用于客户端的更新——因为轻客户端只同步区块头,如果你想更新,你不能以交易的形式发送,轻客户端收不到
  • 一个把交易加到区块里的函数。这个函数也要同时更新链的状态(例如账户余额);
  • 生成新区块的函数,新生成的区块可以在网络中传播
  • 验证区块的函数。由全节点运行,在接收这些状态改变之前,用来确认收到的块都是合法的。例如,在一个价值链中,可以检查有没有人尝试发送超出他们余额的交易。

这种设计的一个缺点是,你必须手动确认在创建块时完成的状态转换与验证现有块时完成的状态转换保持同步。如果你不这样做,会产生共识错误。虽然将来可能会改变该方式,但现在还需要这么做,不过在实践中可能不是什么大问题,因为你可以将交易执行委托给一个公共函数来处理。

此外,你需要自己维护一个验证者集合。包含 PoA 和 PoS 共识验证,不过我们目前还没有支持 PoW 的验证。验证者集合是一个公钥的列表,其对应的私钥应被视为可对给定区块签名的有效私钥。该集合可以变,但每个区块都由它创建时选择的集合进行验证。你不必处理验证者投票的困难问题,甚至不必处理他们对每个“区块”的投票,这是由 Substrate 自动处理的。验证者集合可大可小,但是这里有一个权衡:在区块达到确定性(即不可逆)之前,验证者越少,它们之间就越容易勾结越容易通过验证,验证者越多,验证耗费越多 [2]

我们不能让 Substrate 自动处理 PoS 共识,因为 PoS 依赖于具体项目,例如包含价值代币的,但并非所有项目都包含。测试网的代币可能就故意设计成没有价值的,而基于 Substrate 实现消息总线的项目可能根本没有代币。然而,基于 Substrate 编写一个强制使用代币的库将很容易,并自动为您提供交易处理和 PoS 共识[3]。关于 Substrate 的一点是,在它上面构建更高级的库相对容易。即使用 Substrate 构建新的区块链时也可以得到很多,但是它仍然是一组相对最小的原语,并不真正打算直接使用。相反,它应该作为一个项目模块,其他功能可以被分解成帮助库。虽然细节尚未得到证实,但 Polkadot 并不是唯一一个基于 Substrate 的链;随着 Substrate 平台的成熟,开发人员可以构建更多的库,使得构建新链像开发 web 应用程序一样简单。

我知道科技文章中的“即将到来”就跟政客的承诺一样不值得信赖,但我还是要以即将到来作为结束语。虽然基于 Substrate 的项目已经成为可能,但我们目前缺少学习材料。现在,如果你还不是 Polkadot 团队的成员,很难理解本文讲的东西。不过,我们正致力于此,所以如果你对其中任何一项感兴趣的话,那么请密切关注即将到来的 Substrate 教程和文档。

深度资源

视频:Gavin Wood 在视界 2018 中介绍 Substrate

视频:Rob Habermeier 在柏林的 Truebit Meetup 中介绍 Substrate


注 1:当然,实际上,你可能希望最终强制实现向后兼容,外部工具可以轻松地与你的链进行交互,但是当你在开发时,可以按照自己的喜好来快速地实现兼容性。即使你确实需要向后兼容,实现也不会很困难,你可以通过 protobuf 免费获得有效的向后兼容存储。

注 2:作为这种效应退化的一个例子,像比特币或 Ethereum 这样的纯 PoW 链根本不能具有 Finality,因为验证者的可能集合是无限的。

注 3:例如,一个简单的 PoS 链,可能每一个区块就设置一次验证者集合:选择 100 个保证金最高的账户,并且在你有不正当行为时,罚没他们的保证金。


原文链接: https://www.parity.io/what-is-substrate/
作者: Jack Fransham
翻译&校对: 刘艳安 & Elisa


你可能还会喜欢:

引介 | Polkadot,区块链创新者的利器
引介 | 准备好在 Polkadot 上开发吧!
干货 | UTXO 和 Account 模型对比

 
0 人喜欢