Polkadot的进展状况:了解一下Substrate
漫雾气我钦
发表于 2022-12-2 08:26:44
223
0
0
+ @7 Q- f; g* ?; H) J. k
我认为理解ParitySubstrate最重要的一步是,ParitySubstrate是独立于Polkadot的项目。尽管Polkadot是基于Substrate的项目,而且那些基于Substrate其他项目也能在Polkadot上运行,你现在就可以用Substrate构建新的一条区块链,不用等待Polkadot开发完成,甚至不用等概念验证的发布,就可以开始使用此框架开发区块链。
##Substrate帮您解决了哪些问题4 W3 \, ]9 d* }& ?: c0 L* }
那么什么是Substrate呢?你可以将其看作类似于Express或其他Web应用程序的框架,但它是用于构建分布式或去中心化的系统的框架,可以构建例如加密货币项目,或消息总线系统。正如大多数Web应用程序不需要重新实现自己的HTTP协议一样,我们认为,对于每一个团队创建新链时,也不需要从头实现网络和共识的代码,这浪费精力的。更不用提为了实现业务逻辑,必须雇用的密码学家、安全研究员、网络工程师、开发人员(以协调更新)等等了。如果你想使用Substrate来构建一个新项目,只需要在代码中实现少量的函数回调,然后就能获得以下特性:3 ?5 X' ?; \$ l
6 G3 C8 r. _& A/ ^, r9 s
共识机制,确定性(Finality),出块投票机制。即使你不需要加密货币,甚至是构建不需要区块链的项目,这些特性也是可用的——这意味着你将获得拜占庭容错特性,也就是说网络中部分节点宕机、失效或者被恶意控制时,你的整个网络系统仍然可以继续正常工作。
, L8 |5 g& F9 J' \( H
网络,节点发现、同步等等。
一个有效的、确定的、沙箱式的WebAssembly运行时,可以用于运行智能合约,以及其他基于Substrate的项目。当然你也可以不用WebAssembly,自己写虚拟机解释器,但是我们坚信使用WebAssembly运行时的好处,能让你利用我们全球社区开发的工具与我们在WebAssembly的工作成果。* S# b) F q0 h& F/ \$ z
流畅运行一个浏览器节点,并具有与其他类型的节点通信的能力。
0 @# I- \. R4 y: v: j# X8 W
跨平台的数据库/文件存储系统,还支持浏览器环境;* P N6 i0 U7 R: r
客户端平滑更新——任何可能影响共识的更新都是通过将代码编译成WebAssembly的执行文件,然后把它作为网络上的一条消息进行部署。不仅如此,你可以保存多个你想编译为本地的不同版本的共识代码,Substrate会去处理复杂的正在执行的本机代码与发布的WebAssembly部署环境的差异。你将获得本地代码所拥有的速度,但是因为WebAssembly有回退机制,可以以自己的速度部署本地版本,而且不会有硬分叉或者共识问题。# @& S! i' j+ ?& b5 Y
1 W0 X8 F1 u# {9 f$ \
能在Polkadot发布时立即运行你自己的项目。尽管基于Substrate的项目可以编译成一个项目对应一个独立的客户端程序(就像现有的区块链项目一样),但是因为Polkadot实现了SubstrateAPI,你可以利用Polkadot提供的安全性和链之间的互操作性。Polkadot本身就是基于Substrate构建的,允许我们快速获得Substrate框架中任何漏洞的反馈,允许我们运行Polkadot测试网,甚至再启动第二个Polkadot链作为侧链。如果你不知道Polkadot,或者你还没有充分了解Polkadot的优点,你可以看Polkadot的这篇博客(中译本见文末超链接《区块链创新者的利器》)。
7 f' q+ n: l: ~0 K
##您需要自己实现的部分& A7 L: C2 h; ?& g/ D0 G& `* ~5 [
那你需要自己实现哪些内容呢?本质上来说,Substrate只是你的状态机,包含交易之类的东西。为了使Substrate尽可能的通用,它本身没有交易。相反,它有我们所谓的能够存储任何数据的、只是二进制块的“外部交易(extrinsics)”。对于大多数链而言,这些extrinsics包含交易,但是你并不需要那样去实现。你完全可以从网络中去掉货币的概念,然后基于Substrate创建一个去中心化的Erlang模式的actor模型并发系统,并为网络初始化一组可信的机构,验证网络的正确行为。假设你确实需要货币和交易,但是,交易格式可能并不重要——只需要一个交换格式和可以访问的一个数据库。甚至Substrate比其他分布式体系结构(就像微服务)更容易——因为代码和数据存储在同一个位置,你不需要实现交易的后向兼容[1],仅实现存储就好。对于有私有交易的链来说,实现起来可能会更加复杂,所有东西都没有最终确定,你会在不同的地方看到不同的表述,但是,关于你需要实现什么来启动并运行一个完整的区块链,下面有一个简单的解释:# ]( O2 @2 Q! u5 r9 A2 i
基于上一区块的区块头,构造区块的函数。区块头包含:
; J c/ M% t) z& }1 b% o
区块高度;7 M! T- O3 q" r1 ^+ ~3 r& \
区块状态的加密确认,对于轻客户端验证区块是否正确十分重要。加密确认的作用类似于哈希,用户无法在不作废加密确认的情况下改变区块状态;
/ q1 V- B. ~- K% o& M; S8 M/ O! j' }& s2 K
区块中所有交易的加密确认,可以防止交易被更改;- O0 E# @& h* d. H* X. `5 D8 G; P% }
父块的哈希值;
3 s4 Q; T3 B8 ^, x* m, i' t8 \
一些额外的任意数据。可以用于客户端的更新——因为轻客户端只同步区块头,如果你想更新,你不能以交易的形式发送,轻客户端收不到
+ q* \! ?( _8 s: l' T! J
一个把交易加到区块里的函数。这个函数也要同时更新链的状态(例如账户余额);; d! G; r: Z9 r
生成新区块的函数,新生成的区块可以在网络中传播
0 a# i* {" T4 u0 f, ]9 q. y. r/ {: D
验证区块的函数。由全节点运行,在接收这些状态改变之前,用来确认收到的块都是合法的。例如,在一个价值链中,可以检查有没有人尝试发送超出他们余额的交易。! U2 I2 j9 a/ c/ v0 c( P# J/ e
% ]+ X, ]" T$ \& z" Y& |& K! l
这种设计的一个缺点是,你必须手动确认在创建块时完成的状态转换与验证现有块时完成的状态转换保持同步。如果你不这样做,会产生共识错误。虽然将来可能会改变该方式,但现在还需要这么做,不过在实践中可能不是什么大问题,因为你可以将交易执行委托给一个公共函数来处理。
此外,你需要自己维护一个验证者集合。包含PoA和PoS共识验证,不过我们目前还没有支持PoW的验证。验证者集合是一个公钥的列表,其对应的私钥应被视为可对给定区块签名的有效私钥。该集合可以变,但每个区块都由它创建时选择的集合进行验证。你不必处理验证者投票的困难问题,甚至不必处理他们对每个“区块”的投票,这是由Substrate自动处理的。验证者集合可大可小,但是这里有一个权衡:在区块达到确定性(即不可逆)之前,验证者越少,它们之间就越容易勾结越容易通过验证,验证者越多,验证耗费越多[2]。6 ?5 c# C$ S) g, f D( [, O
$ T( Y! R8 \7 f+ K
我们不能让Substrate自动处理PoS共识,因为PoS依赖于具体项目,例如包含价值代币的,但并非所有项目都包含。测试网的代币可能就故意设计成没有价值的,而基于Substrate实现消息总线的项目可能根本没有代币。然而,基于Substrate编写一个强制使用代币的库将很容易,并自动为您提供交易处理和PoS共识[3]。关于Substrate的一点是,在它上面构建更高级的库相对容易。即使用Substrate构建新的区块链时也可以得到很多,但是它仍然是一组相对最小的原语,并不真正打算直接使用。相反,它应该作为一个项目模块,其他功能可以被分解成帮助库。虽然细节尚未得到证实,但Polkadot并不是唯一一个基于Substrate的链;随着Substrate平台的成熟,开发人员可以构建更多的库,使得构建新链像开发web应用程序一样简单。
9 }- p8 {1 S$ D- l' y# p1 T
我知道科技文章中的“即将到来”就跟政客的承诺一样不值得信赖,但我还是要以即将到来作为结束语。虽然基于Substrate的项目已经成为可能,但我们目前缺少学习材料。现在,如果你还不是Polkadot团队的成员,很难理解本文讲的东西。不过,我们正致力于此,所以如果你对其中任何一项感兴趣的话,那么请密切关注即将到来的Substrate教程和文档。
成为第一个吐槽的人