2017年区块链市场火爆行情点燃了整个行业,区块链也从极客的小众圈子进入了更多人的视野。作为区块链行业的开发者,我们也一直在思考,区块链是什么,区块链的技术本质是什么?
在我看来,区块链就是一台世界范围的状态转换永动机。它不断的接受外部输入,达成共识,最后发生状态的跃迁,依此循环。
在这个过程中,有三个关键的要素,第一,如何定义状态,第二,如何定义共识,第三,如何定义改变。
对于很多区块链项目来说,所面向的行业、用户群体,各个业务领域的需求,均不一样,所以对于状态的定义、共识的定义、改变的定义,均是不一样的。但有一点是确定的,所有区块链的项目都需要一款产品或一套工具或者解决方案 将以上三个问题的答案用工程方法实现出来。
substrate就是这样一款产品!
Substrate
substrate是parity团队在开发跨链基础设施polkadot项目过程中提炼出来的一套有效解决方案,它是独立于polkadot的区块链系统框架,它即将在今年年底发布。它是下一代通用的区块链技术架构。
substrate将为区块链创新者提供「最小努力换取最大自由度」的框架,因为是「高度可定制、适应性强,由真正懂区块链开发者的区块链开发者制作」,允许开发者将他们的工作重点放在自己的业务领域上,同时为他们提供网络、共识和安全性等等一切基础能力。。
未来随着基于substrate构建的区块链项目会越来越多,围绕substreate会发展成为大生态平台,生态中的产品将不再局限于自身,而是可以共享生态中所有用户,链接所有服务,譬如钱包产品、浏览器产品、dapp等等。
substrate致力于服务区块链创新,我们相信substrate会成为推动行业变革的强大力量。
那substrate解决方案是怎么样的呢?它有哪些与众不同的特点?
重新定义区块链
对比于区块链1.0比特币时代,区块链2.0以太坊时代,substrate天生自带有区块链3.0的气质。 主要包括可治理、可开发、可扩展、互操作、高性能这几个方面。
可开发,对于开发者来说,可以基于substratete自定义区块链状态、共识及改变,substrate提供了自由发挥的空间也提供了普适性的平台支持,另外可以实现一次开发,多处运行的理想状态。
可治理,substrate的治理是可进化的,它内置民主机制,推行链上治理,链上执行,它独特的runtime设计可以真正做到code is law,但code是可以根据社区共识来确定的,并且是可以随着时间推移,不是一成不变,而是逐渐进化的。
可扩展,一方面在于链本身可扩展,另外一方面,生态的无限扩展可能。
互操作,substrate天然带有跨链基因,借助polkadot跨链生态的发展,substrate同构链的互操作也会更加简单。
高性能,substrate从高效技术组件,更快算法选择,优秀工程实现方案等方面全面提升链的吞吐率。
工业级工程实现
substrate的解决方案包含哪些内容?简而言之,就是库、组件、模版、抽象、标准。
首先,substrate是个功能强大,社区活跃的区块链开源组件库,在这其中的每个组件都具备独立使用的特性,可以真正做到开箱即用。
第二,它是一个通用的区块链开发框架,它对区块链开发的做出了普适性抽象,它的模型即简单又通用,可以用来实现btc,eth,eos等等,甚至dag。
第三,它也是个完备的区块链客户端模版,如果你以substrate为底板,甚至可以不用修改一行代码,即可启动一条完备的高性能智能合约链,完备的意思是,区块链该有的产品特性它都有。
第四,substrate不是单一的产品,它实际上是一系列的区块链产品组合包,包括客户端、api、ui等从前到后到全流程技术栈。
第五,substrate未来会成为各类平行链、中继链的事实标准,substrate它从一开始就有轻客户端和跨链的原生支持,天然具有跨链基因,这一优势是它独特的优势,相信未来跨链生态中会有越来越多的项目基于substreate。
基于substrate的解决方案,据我们所知,全世界基于substrate的公链项目中,polkadot是第一个,chainx是第二个。
接下来我们看一下substreat具体包含哪些内容。
技术概览
substrate由主要由三项技术来驱动,libp2p、consensas、webassembly。
其中libp2p是协议实验室所的ipfs的底层网络库,parity团队对其做了rust的实现,在substrate中主要负责网络层功能。
webassembly是高性能跨平台,得到广泛支持的,面向未来的虚拟机技术,在substrate中主要用于支撑runtime机制及用户维度的智能合约运行。
consensas 具体而言是parity团队提出的afg共识算法,它是一个bft+随机算法的混合共识算法。
在这三项技术之上,就是runtime机制。
runtime 是运行时内核 其中由若干个模块组成,互相独立,并可以被外部模块或者外部rpc所调用,runtime包含了链的主要逻辑,如账户模型、民主自治、时间服务、权益设计等等。
runtime我们可以这么理解,如果我们把链比做操作系统,那么runtime就是操作系统的内核,如果把链比做汽车,那么runtime就是汽车的发动机,runtime可以做到在链上自动升级,好比是高速路上的汽车一边跑一边换发动机。
其中runtime包括众多的模块,这里模块包含balance处理账户模型相关,metadata处理runtime自描述相关,timestate时间服务相关等等。
对于开发者来说,runtime是substrate中最为重要的部分,理解了runtime就理解了substrate。需要注意的是,runtime中的模块都是可插播的,可以自由组合,如何定义runtime的功能,可以完全由开发者自己决定。
从另外一个角度来看,substreate客户端主要有两个环境,一个是native 环境,一个是wasm环境。native和wasm环境之间通过api来调用。
native环境在目前的实现里面是rust的执行环境,里面包含了网络,共识,安全等基础功能。 wasm环境主要是runtime,还有用户的智能合约跑在里面,runtime包含的是链自身的业务逻辑,譬如权益,账户,代币等等。
治理
治理是substrate的重要组成部分,也是区块链3.0的必要元素。
substrate的治理有几个概念,一个是议会,议会是一个链上的概念,议会由多个议员组成,一个议员就是一个账户,议员是由持币人投票选举选出来的,议会会定期换届,换届的时候,根据投票数的多少,从最多的投票中自动选出议员,议会由两个职责,一个是对合理的提案发起公投,另外一个是对有害的公投进行取消。之所以有议会机制,主要是为了代表没有主动参与投票的持币用户。
另外一个概念是提案,提案是任意持币人都可以发起的建议,这个提案可以执行最高权限,去调用root交易,升级链上runtime逻辑。提案的下一步就是公投。
公投,满足一定条件的提案就会进入全民公投阶段,所有的链上升级都必须经过公投来决定。公投能否被执行,需要满足一定的条件,譬如投票率达到50%,满足条件之后,就会开始runtime代码的审计,并开始执行。
接下来,我们看下具体的过程,治理过程分为两部分,左边这个是启动阶段,右边这个是投票阶段,当用户发起一个提议的时候,需要抵押代币,其他用户可以表示附议,但也需要抵押同样数量的代币,并进入提议队列。经过一定的周期后,抵押数最多的提议会进入下个投票阶段,其他用户就可以开始公投投票了,如果满足执行条件,那么就批准公投,并开始执行。
substrate可以做到运行时自动升级,无分叉,真正做到code is law。那是怎么实现的呢? 首先substreate链上有wasm版本的runtime备份,其次,我们需要知道的是native运行速度大于wasm,而wasm是大于以太坊的evm的。
左边这个是前状态,右边是后状态。当runtime接收到外部输入准备运行改变的时候,它会从链上获取wasm版本的runtime,并将它与native环境的runtime版本进行比较,如果相等,那么就会运行native环境的runtime,如果不等,那么就会运行链上wasm版本的runtime。
因此,链总是可以运行在正确版本上面,永不分叉。而链上runtime的升级是通过社区公投的形式来达成共识,并通过runtime的root交易来更新链上wasm版本的runtime代码,来强制执行升级的,因此可以做到对链的无缝升级。
这好比是高速路上开的汽车一边开一边换发动机。substreate真的做到了这一点。
原语
在核心算法选择上,签名算法substrate采用ed25519,它是eddsa算法的一种,与以太坊采用的ecdsa相比在签名速度、验签速度上更快,也更安全。哈希算法采用blake2b,它比sha3 安全性更高,速度也更快。
区块头结构中,包含parent_hash、number、state_root、extrinsics_root、digest、change_root。其中后面这四项对轻客户端尤为重要。
区块体结构中,包含Header、extrinsics、justification,其中extrinsics是交易列表,justification是区块签名集合。
交易分为三种类型:Inherent、Public、Root。其中Root交易是通过治理机制发出的拥有最高执行权限的交易,它可以执行任何体现社区意志的代码,Inherent是内部交易,即节点运行过程中达成一致的内部交易。Public是普通用户发出的交易。
轻节点
轻节点是区块链3.0的标配技术之一, substrate对其做了全面的支持。
轻节点对区块链的重要意义不仅是降低参与成本促进抗审查还有是区块链应用广泛应用的重要基础条件之一 。很棒的是 substrate从设计伊始就对轻节点做了全面的支持。
我们都知道的一点是以太坊对轻节点的支持并不是很完善。尽管有receipt树的设计,但仅局限于eventlog 所以对于部分业务需求场景并不能很好支持,特别是对于未来以太坊从pow到pos共识算法的升级更是无法支持。而substrate 的轻节点设计却是非常彻底,从设计上看主要分为四部分:存储树证明、交易证明、changellog、digest。
stoarge是存储证明,extrinsics是交易证明,然而,对于账户模型的区块链来说,仅有这两项是不能满足轻客户端的需求的,而substratte的change_log 清晰反映发生变更的key,及变更所涉及的交易。还有digest,是运行时记录下来的重要数据片段,譬如验证人集合的变更,轻客户端就可以据此来去信任的来验证数据。
Api与交互
接下来,我们看下,开发者如何与substrate进行交互,普通用户是如何与substrate交互。
当我们需要实现substreate链的时候,我们具体需要实现哪些内容呢?
substrate本质上是一个状态转化器,它不知道你对状态的定义,对共识的定义,对改变的定义。所以,如果你要根据自己的业务逻辑启动一个完整的区块链,有四个步骤是必须的。
你需要告诉substreate验证人列表是哪些账户,如何构造区块头,区块头中包含哪些内容,譬如块高、父块哈希、额外数据等等,你要告诉它如何生成新区块、如何添加外部交易到区块中、如何验证区块。
Runtime的四个核心接口:
-
authorities 验证人列表
-
initialise_block 构造区块头
-
apply_extrinsic 添加交易入块
-
finalise_block 验证区块
对于普通用户或者Dapp开发者,生态服务开发者来说,一般是通过RPC接口来访问,RPC的api支持http协议、websocket协议。
RPC接口主要包含四个模块:
- author模块 用于外部交易的交互
- chain模块用于链状态信息的交互
- state模块用于链上任意数据的交互
- system模块用于链自身版本信息的交互
七天入门到超越
Substrate是新生的技术和生态 如何做到七天入门到超越?
从我们以往一段时间的学习研究和实践经验来看,有以下较为粗略的经验总结供大家参考。 在假设已有区块链基础知识的情况下 :
-
第一天入门
- 一个节点 bbq 或chainx
- 两门语言rust is
- 三行代码 完成基础的调试及开发 包括dapp浏览器等等。
-
第三天精通
- 一个机制 runtime
- 两个宏 decl_module与decl_storage
- 三十行代码 自定义runtime模块
-
到第七天超越
- 自定义substrate链
结语
随着substate社区开发者越来越多,整个substreate生态正在快速迭代发展中。随着开发者生态的不断发展,我们相信substreate会成为未来web3技术栈的重要组成部分,substrate会成为推动行业基础设施建设的重要力量。
毫无疑问的是,substrate是2018最值得区块链行业关注的重要技术之一。