精华 Polkadot的Substrate基础链简介
发布于 3 个月前 作者 yuelipeng 263 次浏览 来自 Substrate技术

原文:https://medium.com/paritytech/what-is-substrate-29af4231d7e0

如果你关注了Polkadot项目,可能会多次看到“Substrate”这个词。 它是Polkadot项目的重要组成部分,但有关它的信息非常少。 白皮书或黄皮书里找不到, 至少没有专门的介绍“Substrate”。 从较高的层面来看,Substrate是一个可以创建数字货币和其他去中心化系统的框架。 这太笼统了,本文详细说说。

首先,Parity Substrate是独立于Polkadot的项目。 Polkadot是基于Substrate构建的,现在你可以使用Substrate来构建新的区块链项目,而不用等Polkadot开发进度。

那到底什么是Substrate呢? 它是一个框架,类似于Express框架或其他Web应用程序框架,只不过是用于构建分布式或去中心化系统,比如加密货币项目,或消息总线系统。 正如大多数Web应用程序不需要重新实现自己的HTTP一样,我们认为创建新区块链也不需要从头实现网络和共识部分的代码。网络和共识的开发需要密码学专家、网络安全专家、网络工程师、网络运维人员等等,但是其实你应该专注在产品的核心业务逻辑上。 所以如果你使用Substrate,只需要实现非常少量的回调,就能得到这些特性:

  • 共识机制,不可逆性,出块投票逻辑。 即使你的项目不需要构建加密货币,甚至不是需要区块链的项目,Substrate也可以用于需要拜占庭容错机制的项目,比如网络中部分节点宕机、失效或者被恶意控制,但整个网络仍然可以继续正常工作。

  • p2p网络。比如p2p节点的搜索,同步等等。

  • 运行时的WebAssembly虚拟机。可以运行智能合约,或者其他基于Substrate开发的项目。 虽然你可以编写自己的虚拟机解释器,但我们坚信使用WebAssembly运行时的好处是,可以让你利用在WebAssembly社区的工作成果;

  • 在浏览器中运行一个节点,并与其他节点通信;

  • 跨平台的数据库/文件存储系统,还支持浏览器环境;

  • 客户端平滑更新。对于可能影响共识的更新,会将代码编译成WebAssembly的执行文件,然后部署时作为网络上的一条消息。 这样的机制提供了这种可能,就是你还可以本地保有多个版本的共识代码,并在本地执行一个与部署环境不同版本的共识,Substrate会去处理本机环境与部署环境的差异。因为WebAssembly有回退机制,所以保证不会有不受控制的硬分叉或其他难以解决的共识导致的问题。

  • Polkadot发布时立即接入你的项目。 虽然说使用Substrate构建的项目可以编译出一个独立的客户端程序(就像现有的区块链项目一样),但是把你的项目接入Polkadot就可以共享Polkadot的安全性和链之间的互操作性。 Polkadot本身就是使用Substrate构建的。Polkadot实现了Substrate API,会对Substrate框架中的任何漏洞进行快速反馈,很方便的运行Polkadot测试网,甚至再启动一个Polkadot链作为侧链。 这篇博客比较详细的介绍了Polkadot。https://medium.com/polkadot-network/how-polkadot-tackles-the-biggest-problems-facing-blockchain-innovators-1affc1309b0f

那你需要自己实现哪些东西呢?从本质上讲,Substrate是状态机,可以包括交易等内容。为了使Substrate尽可能通用,它本身没有任何交易。它有我们所谓的“外部”,这个“外部”是一个二进制BLOB,可以用来存储你想要的任何数据。对于大多数链而言,这些BLOB数据包括了交易,但使用Substrate,你完全可以从网络中去掉货币的概念,然后创建一个分散的Erlang样式的actor模型并发系统,赋予该系统一组受信任的权限,来验证网络行为的正确性。

如果你需要货币和交易,那么可能更简单 , 只要约定一个协议和一个数据库来访问数据。它比其他分布式架构(如微服务)更容易 ,因为运行的代码和数据存储在同一个地方,仅为数据存储提供向后兼容性就可以。对于具有私有交易的链,实现要复杂一些。

下面简要介绍启动并运行一个完整的区块链需要做什么:

  • 初始化块的函数。该函数根据前一个块的头创建一个新的块。 块的头包括:1. 块高度; 2.块状态的加密索引,主要用于轻客户端验证块是否正确。 加密索引类似于hash; 3.块中二进制BLOB的加密索引; 4.父块的hash值;

  • 块头的自定义数据。轻客户端仅同步块头,更新轻客户端时,注意处理块头中自定义的数据。

  • 将交易写入块的函数。 这个函数也更新链的状态(例如,账户余额);

  • 生成块的函数。生成一个写好头、写好BLOB数据的块。这个块就可以广播出去了。

  • 校验块的函数。 全节点运行这个函数,确认接收到的块在接受之前是有效的。 例如,在资产链中,你可以检查是否有人人花费超过其自身余额的钱。

需要注意的是,块头包含块状态的信息,在生成块的函数里,要把块状态从初始状态设为完成状态,校验块的函数里,要把从完成状态变成校验通过状态。 块状态错了的话可能会导致共识问题。虽然以后可能会用其他方式来处理块状态,但是现在还需要这么做。当前的方式也不会太麻烦,额外写一个校验BLOB数据的工具函数就好了。

此外,你需要自己维护一个公钥集合,用于验证块的签名。块的签名验证与链使用的共识机制无关。 给块签名的私钥所对应的公钥应该放进这个公钥集合, 集合里的公钥可以变化,但每个块都由块创建时选择的集合进行验证。公钥集合里的公钥变化会产生的不同的公钥集合版本,以及由此引出的问题Substrate都会自动处理好。 公钥越少,安全性越低,公钥越多,验证耗费越多,这里要自己衡量。 通过签名验证后,块就被认为是“最终的”(即不可逆的)²。

使用Substrate创建链需要手动的处理POS,不是所有项目都要在链上发行数字货币。比如,测试网的币就没价值,还有消息总线的项目根本不需要数字货币。但是,在Substrate上编写一个库可以很容易地发行数字货币,并自动支持交易和POS共识³。比较推荐的使用Substrate方式,是在Substrate上构建更高级别的库,把Substrate作为项目的模块。随着Substrate的完善,会像编写现代Web应用程序一样轻松构建新链。

现在Substrate还没什么学习资料。 如果不是Polkadot团队的成员,很难学会本文讲的东西。 不过Substrate教程和文档很快就会有了。

补充3点:

你可能希望有向后兼容性,以便外部工具可以轻松地与你的链进行交互,你可以使用protobuf免费获得高效的向后兼容存储。

举一个例子,像比特币或以太坊这样的纯POW链根本不具有终结性,因为可能的验证器集是无限的。

例如,一个简单的POS链可能会在每个区块设置一次验证器,通过选择拥有最多股份的100个账户并在获得不当行为证明时删除它们的股份。

回到顶部