substrate 翻译Substrate in a nutshell
今天我们讨论一下 Substrate,可以帮助你构建定制化区块链的库。 Substrate 是由 Parity Technologies 创建,并且为 Polkadot 提供基础设施。
什么是 Substrate?
从字典定义,或者字面理解 Substrate 可以用来构建,或者发展某些项目。在我们这里,我们可以构建区块链,对于 Polkadot 来说,是构建整个区块链家族。
为什么我们需要 Substrate?
软件充满了抽象。计算机科学的历史展示给我们的就是不断的抽象,从硬件,到开发语言,编程接口。
每个抽象层都想要解决特定的问题。Substrate 想要解决什么问题呢?
在回答这个问题之前,我们先看一下,在你想要实现一个全新的区块链,要考虑哪些方面:
- 为什么需要另一个区块链?!
- 各种各样的原始加密算法,签名等等.
- 共识算法和容错选举.
- POW,POS或者完全不同的概念?
- 区块结构,高效存储,信息序列化.
- P2P 网络, 节点发现, 区块和交易传播.
- 状态机,运行时,智能合约.
- 轻客户端的支持
尽管 Substrate 不能帮你实现第一条,至少可以帮你做余下的事情。开箱即用的实现,是基于多年开发区块链的经验,设计,实现,极度用心的测试。
通过提供典型算法的通用实现,可以使开发者专注于项目的业务逻辑,比如:状态机。
让我们看看区块链最核心的部分,以及 Substrate 可以为我们做什么。
区块链的持久化
区块链唯一的目的就是在非可信环境下,提供一个途径可以在任意时间点验证,达成共识,全局持久化,并且一旦确认真实可靠,就不可更改。
Substrate 提供了一种高效并且非常易用的,和 Wasm 运行时紧密继承的持久化。
区块链作为函数
为了更新区块链状态,根据挂起的操作更改存储,我们需要一个时间点来执行这些操作。
这些时间的可以表示为一个函数,根据当前的状态和挂起的操作,生成另一个状态,可以认为是区块链的真实当前状态。我们把这个函数称作 state transition function 或者简称 STF
Substrate 允许开发者以一种可管理,可移植的方式来定义这个函数。就像 Web 页面执行的 JavaScript 一样,可以提供一组函数作为运行时来提供 STF 服务。此外该实现可以是可移植的,跨平台的,支持浏览器等等方式。
Substrate 使用 WebAssembly 作为通用的运行时。
安全和速度
使用 WebAssembly 实现业务逻辑和智能合约意味着可以借用现有的工具快速可靠的执行。Substrate 提供了另一种可以更快执行代码的途径-没有虚拟机的开销。
Substrate 具有革命性创新之一的就是运行时镜像和 STF 同其他数据一样保存在链上。这意味着,运行时和链的业务逻辑可以通过安全,可校验的方式来更新。并且 Substrate 和 Substrate Runtime Module Library(SRML)是使用 Rust 语言实现的,可以编译为本地代码和 Wasm。
在任意时间点,客户端拥有两份已编译的运行时。一个是本地编译的,一个是 Wasm 镜像可以在 VM 里面执行。当执行运行时函数时,客户端先检查链上的运行时版本和本地的版本是否一致,如果一致,执行本地的版本。
不分叉的升级
当链上的运行时镜像升级,一些客户端软件没有升级时,客户端会使用链上的运行时镜像版本来执行。所以在任何时候,所有节点都能够正确的同步区块,防止分叉。
网络
使用了 libp2p 库来实现去中心化网络环境。
译者注:libp2p 是 IPFS 项目分出来的独立项目。
定制消息
对于简单的场景,你不需要考虑网络,因为 Substrate 做了所有的事情。你只需要提供区块链的 STF 即可。如果你需要发送定制化信息,可以通过提供特殊化的网络协议定义消息和处理逻辑来定制和扩展网络子系统。
共识
有一个 STF 可以从一个状态转换到另一个状态还不够,还需要所有的节点都对转换后的状态达成共识。
Substrate 实现的每个共识引擎会有一个运行时模块,处理不良行为的证明。评估的处理结果由运行时来决定。
Substrate 提供了一个 BFT 的实现可以开箱即用。并且还会不断的完善,增加其他的算法进来。根据应用场景,开发者可能使用现存在产块逻辑,也可能提供自己的。
Substrate 是一个完全可定制化,可扩展的框架,开发者可以定义自己的共识算法。实际上 Substrate 非常的灵活,可以提供非传统区块链结构的解决方案。
轻客户端支持
全节点需要同步所有的数据,并且不是简单的同步数据,出于安全原因考虑,还需要重新执行所有交易,计算量比较繁重。
Substrate 从设计上就考虑了轻客户端的支持,可以开箱即用。