区块见闻 区块见闻
Ctrl+D收藏区块见闻

Substrate VS 智能合约 | part I: 概述

作者:

时间:

这个系列面向的是智能合约开发者,或者是在智能合约和自己定制区块链之间摇摆不定的从业者。希望读完这个系列之后,可以帮助大家更好地了解Substrate与智能合约的异同,面对不同的业务需求时,可以更加高效进行技术选型。同时,也希望可以给大家提供一些有趣的视角来看待Substrate,欢迎任何反馈。

简单来说,Substrate是一个构造区块链的“轮子”。在Substrate之前,如果大家想要快速构造一条链,选择是非常少,而且可定制化程度也很低。基本上公链会fork Bitcoin,联盟链会直接使用Hyperledger。Substrate是一个开箱即用的构造区块链的SDK,从简单的智能合约,到中层的链上逻辑,或者底层的p2p网络、数据库、共识,都可以自由定制。关于Substrate入门介绍文章已经很多了,这里就不赘述了。想入门的同学可以看看下面的资料:(注:由于微信订阅号无法跳转外部链接,下面几篇文章请移步 “阅读原文” 后点开)

Substrate初次亮相视频, 15分钟速成搭链, 什么是Substrate - from boka.network

, 什么是Substrate - from Ethfans

想要了解更多的童鞋也可以自行google。

智能合约是部署在区块链之上的一段代码,可以按照合约里预先设定的不可篡改的规则执行功能。因目前主流的智能合约指的都是以太坊上的智能合约,下文中的智能合约指的都是以太坊网络中的智能合约。

在这里,会从最宏观的角度去理解Substrate和智能合约的异同,不会涉及到具体的功能性demo和细节。更加详细的主题我们会在后续的文章中提及。

bool

integers

address (``accountId` in Subtrate)

array

map

enum

string:虽然存在string类型,但是没有完善的string处理方法

linked_map:可以遍历的map

per_things:可以认为定点数

double_map:双键map

enum:这里单独列出来,是因为solidity中的enum只是数字的枚举,而substrate中的enum包含类型信息

Substrate中没有string

Substrate中没有string类型,与string对应的,只有Vec。这就要涉及到Substrate或者是区块链的设计哲学。链上存储是很宝贵的,并且string和Vec是相互可转换的,因此Substrate决定不用string.

Substrate中的enum

Solidity和Substrate中都有enum,但是两者存在的意义对整个系统来说是完全不同的。

Arbitrum公布把Arbitrum One升级至Nitro堆栈的测试网升级计划:7月25日消息,以太坊Layer2网络Arbitrum开发者称,即将把Arbitrum One升级至Nitro堆栈,并公布了测试网升级计划,会在测试网迁移成功后的几周内升级至主网。具体为:

1、7月25日发布一个Nitro节点新版本,该版本将需要在升级后运行Rinkeby(发生在28日);

2、7月26日会关闭Goerli Nitro Devnet,7月27日将更新Goerli Nitro Testnet共识(所有Nitro节点都将更新到beta.3或更高版本);

3、7月28日,Rinkeby测试网将暂时下线(大约2-4小时),Offchain Labs将通过一系列步骤将现有的classic数据库转换为Nitro数据库;

4、当Rinkeby迁移发生时,链上合约将升级到Nitro,测试完成后链将恢复;

5、另外,Offchain Labs将保持对Rinkeby测试网(升级到Nitro)的公开支持,直到Arbitrum One主网升级到Nitro。[2022/7/25 2:36:42]

Solidity中的enum更像是一个数字的文字化表述,例如下面的定义:enum trafficLight {            Red,            Yellow,            Green}

这里的Red, Yellow和Green 其实只是 0, 1, 2而已。

而Substrate中的enum(其实就是rust中的enum,继续学习请参考:Rust中的枚举)则可以携带类型信息,功能强大。

例如Substrate中的Error,

enum Error<AccountId> {            WrongAddress(AccountId),            WrongIndex(u32), //    ...}Substrate中的linked_map与Solidity中的map

struct Student {            string name,             uint32 number,            uint8 age,  }mapping(uint8 => Student) students;    uint[] class;并且对array进行元素删除并且是一件O(n)的操作,这意味着我们无法支付的起昂贵的gas费用,并且涉及到多个存储的更改,稍不留神可能就会出现逻辑错误。

PentaLaunch V2将在第二季度推出,支持白名单、多链和大宗交易功能:4月11日消息,联合曲线拍卖平台PentaLaunch发布V2路线图,V2路线图有几个重要的组成部分:

1. PentaLaunch V2将在第二季度推出;

2. 支持曲线拍卖白名单和DORA Staking功能;

3. 在部分国家支持一级半市场大宗交易;

4. 在以太坊、BSC、Polygon、HECO多链部署。

PentaLaunch(原BCTO)最早由BSC Quadratic Funding Grant Round-1支持,在三月底被Dora Factory收购。[2021/4/11 20:07:56]

Substrate中提供了多种map,包括map, linked_map, double_map。其中linked_map即是对map提供了iterate的功能。这使得存储和逻辑变得更加贴近真实。

想要深入学习Substrate中存储类型的童鞋,请移步Substratec存储类型概览

作为一个前智能合约er,深知dapp的痛:

gas费用太高,用户玩不起;

出块时间长,用户等不起;

一般dapp都会有自己的token,但是用户必须现有eth才可以玩,这对不习惯区块链的用户来说是一大门槛;

新用户经常弄丢私钥,资产都没了;

这当然不是智能合约的错。站在昨天,智能合约是划时代的产物;站在现在,智能合约的不足需要新的技术来弥补。

有些dapp开发者选择不在eth公链上部署dapp,而是自己使用eth开发私链来部署自己的dapp,确实可以解决上述的部分问题,但是类似私钥、多种token对用户门槛的提高,仍然是无法避免的。

而Substrate作为区块链开发的“轮子”,因为优秀的框架设计和抽象分层,给开发者提供了多阶定制选择:

Substrate分层

这里简单介绍一下Substrate的分层,想要深入了解的童鞋可以自己搜索一下,

Substrate Node: 节点层。在这一层基本上不做什么改动。就是编译一下就可以运行一个节点了。如果想要做一些改动,就重写一下创世配置文件就好了。重新定义链中的参数,但是无法修改链的运行逻辑。

Substrate FRAME: runtime层。基本上绝大部分的定制化都发生在这一层。在这一层大家可以做的事情很多,概括起来就是修改区块链的运行逻辑。比如转账、治理、链上升级逻辑、staking等都发生在这一层。是智能合约开发者最需要关注的一部分。

Substrate Core: 核心层。整个FRAME/runtime层在Core面前都可以被忽略。可以用任何语言从0开始搭建一个runtime,只要它最终可以被编译成WebAssembly. 这一层主要包括区块链的一些底层组件,包括共识、数据库、p2p网络等。

对于智能合约开发者而言,我们把大部分目光放在FRAME层就可以了。

在这一层中,大家可以实现任何可以用智能合约实现的功能,以及用智能合约办不到的事情。比如:

自定义token system,除了转账,还实现链逻辑层面上的锁仓、自定义释放规则等;

自定义区块间隔时间和手续费:这里,所有原先区块链的出快慢、手续费高的烦恼都可以丢掉,开发者可以自定义出块时长,以及操作手续费多少;

实现链逻辑的整体升级;

实现链的治理;

实现多种账户支持,例如在用户丢失私钥的情况下,如果保证用户的资产不受损失;

....

所有对区块链操作门槛、用户友好、响应速度的抱怨,都可以在runtime层通过巧妙地设计来化解。接下来会详细聊到其中的一些部分。

solidity智能合约开发者,还有一层痛苦就是,需要不停地ctrl+C和ctrl+V。因为solidity是独立于现有编程语言系统的,没有任何可以直接调用的依赖;solidity里自带的library,与其说是library,更像是一段“不配拥有地址的”代码引用。即使有import,前提也是依赖必须自己写。哪怕复制粘贴。

这使得大家在写solidity代码的时候,无法直接找到现有轮子,然后下载引入;而是复制粘贴+改写,某种程度上,分散了dapp开发者的注意力,进一步阻碍了dapp的生态进步。毕竟,除了注意复杂的业务逻辑和防不胜防的安全漏洞之外,还要自己写轮子。

对此dapp开发者有一段心酸地自嘲,“只要能用solidity写出log(n)就足以创建一个项目了”。

Substrate的FRAME,目前parity自己使用Rust语言进行开发,但任何可以编译成WebAssembly的语言都可以用来写FRAME。终于,开发区块链逻辑也可以像正常写程序一样正常进行了。(这里的痛可能只有dapp开发者能体会了)

这里举个例子,比如著名的BTC-Relay项目,实现了BTC -> ETH的跨链,方法是用solidity在智能合约中实现了一个BTC的SPV(Simplified Payment Verification),其中最关键的一步就是验证比特币网络中的交易的有效性。

验证交易有效性在solidity中的实现,也得益于solidity中提供的precompile的hash function和在BTC中使用的一样(SHA256),否则可以想见,这样著名的项目,可能就不会出现。

所以,自由地使用各种现有的基础设施,不仅帮助开发者节省时间和精力,更是鼓励整个应用生态层层推进,向水更深、更未知的方向去探索。如果说之前dapp开发者是带着镣铐在跳舞,那现在substrate就是在帮助他们卸下枷锁,更自由地舞蹈。

ETH是没有延后执行或者自动执行功能的,所有的交易必须手动触发。有一些区块链平台已经实现了延后执行的功能,但是不能精准控制执行的时间和条件。

在Substrate中有一个很棒的自定义功能,on_initialize和on_finalize两个功能会在validator构造区块的开始和结束时自动执行,也就是如果有一些很重要的功能,需要根据是否达到时间点或者条件阈值而触发时,这是一个不错的选择。

不建议大规模使用,因为如果需要消耗太多算力的话,会影响到validator的打包出块5. Off-chain worker在写智能合约时,如果想要获取链下数据比如随机数,第一可以自己手动写进去,这样缺乏公信力;或者也可以去请求oracle服务,贵且数据源选择不多。

Substrate有一个功能叫做off-chain worker, 用来执行一些计算密集并且计算周期长的操作。例如在获取链下数据时,可以把http请求操作写在offchain worker中,可以在runtime中被触发执行,获取链下数据并在请求成功之后把结果返回给链上进行相关计算操作。

这不仅给了dapp开发者带来了很多便利,例如随机数请求;更给区块链开发者带来了全新的想象空间。比如在联盟链领域,之前通常的做法就是往左走区块链架构,往右走传统存储服务,因为区块链天然和链下世界隔离的特点,好像很难把两件事情融合在一起。

有了off-chain worker,是不是可以发现一些新的交叉地带?请大家此处放飞想象力。

说了这么多不同,个人感觉,在开发Substrate runtime时,和开发智能合约在思路上,还是很类似的。

无论写智能合约还是runtime,首先都会进行填空题操作:

以上部分在Solidity中直接按照写代码的方式声明变量和方法就可以了,在Susbtrate中则是在相应的宏内声明,详见上表。

所以对于智能合约开发者来说,所需要的只是学习Rust相关的语法,在逻辑构造环节,无缝迁移。

Substrate runtime相关资料,请参考:Substrate Runtime

当然Substrate也不是全都是好处,最大的缺点,就是上手开发确实比智能合约要难。这里的难不仅体现在Rust语法上,还体现在Substrate runtime中的方法不像智能合约一样可以原子调用。即在智能合约中,如果其中一个逻辑失败,那么整个交易执行失败,所有存储更改全部回滚(不会发生)。但是在Substrate中,即使一笔交易在某一处逻辑判断失败,但是在这之前的执行,还是会发生。所以强烈提醒Substrate runtime开发者在开发runtime时,一定要 Verify first, Write Last。

作为系列开篇,简单地总结一下Substrate和合约开发的异同。在接下来的系列文章中,会从具体的例子出发,希望可以帮助大家在实操层面,感受到Substrate开发的自由。

欢迎任何反馈和问题。

本文经作者王大锤授权,转载自「Substrate 区块链开发」知乎专栏,原文链接:https://zhuanlan.zhihu.com/p/108000025

欢迎学习 Substrate: 

https://substrate.dev/

关注 Substrate 进展:

https://github.com/paritytech/substrate

关注 Polkadot 进展:

https://github.com/paritytech/polkadot

申请 Bootcamp: 

https://bootcamp.web3.foundation/

标签:UBSSUBS区块链RINBUBS价格Substratum区块链是什么概念PRINT币

以太坊交易所热门资讯
晚间必读七篇丨亏损千万美金?你只是没看到他赚钱的样子

1.区块链创业者如何实现产品野心? 创业潮汹涌一年又一年,我们在交错复杂的商业竞争中锻炼了商业的敏感,熟悉了商业的规则。如今,虽然身处不同的风口和行业中,但整个商业环境和周期对每个行业来说是相同的,所以创业者身处不同道却需要同谋,方法论是一致的。

晚间必读八篇 | 我该如何理解吓人的“爆仓”?

1.以太坊生态的最新数据 按当前市值,以太坊是价值近250亿美元的网络。但是以太坊还远未进入主流人群,但由于它在开放金融和游戏等方面的突破,以及成千上万开发者的积极参与,它给人们带来丰富的未来想象。

灰度投资CEO:CBDC验证了数字货币的价值定位

从“拒绝比特币”到对央行数字货币(CBDC)利弊进行大量的研究,各国央行对数字货币的态度转变是非常巨大的。全球领导人和政策制定者对CBDC的认识一直在提高。 图片来源:pixabay 毫无疑问,这是由Facebook发布Libra项目声明以及随后中国宣称开发数字人民币推动的。但让我们面对现实吧,CBDC与比特币并不相似。

金色深度丨痛定思痛?解读SEC修订证券发行豁免规则

金色财经 区块链3月5日讯  美国证券交易委员会(SEC)已经投票决定提出一套规则更改草案,以简化和完善证券类产品发行豁免的“补缀”规则。据悉,本次拟议的规则变更旨在改善现有“复杂且混乱”的监管框架,让企业(包含加密项目)更容易开发能够保护投资者的金融产品。

比特币跌跌不休 你还拿得住吗?

最近,BTC遭遇了连续多日杀跌,价格从10000美元回落到了8500附近,整个过程几乎不带反弹。不少散户对后续行情已经产生恐惧了,甚至开始绝望。那么,BTC价格目前到底处在什么阶段呢? BTC MVRV 我们先从MVRV(市值/已实现的市值)数值模型来评估一下当前应该卖出还是买入BTC。“已实现市值”指每个币在链上最后一次移动时的价值。

肖磊:美国紧急降息应对危机 普通民众如何避免被“割韭菜”

作为全球经济绝对的主力,美国已经着手启动应对危机,美联储并没有等到本月中旬的议息时间,突然紧急降息50个基点。 同时,作为美联储主席的鲍威尔表示,降息行动是为了帮助美国经济在危机中保持强劲。这句话的意思不是美国经济能够保持强劲,而重点是危机已经来临,美国正在应对。