http://www.7klian.com

本体技能视点|一文读懂Substrate的合约机制(一)

本期我们分享来自本体技能团队的一篇文章的第一部门,关于 Substrate 的合约机制阐明。

01

提要

Substrate 把整个措施逻辑分为 Host 和 Runtime 部门,Host 成果是牢靠的,方向于底层,是回收原生执行的方法,而 Runtime 部门是动态的,偏上层业务,编译成 Wasm 字节码,,这样可以随时进级,其执行在 Wasm 虚拟机中。合约成果作为上层业务,安排在 runtime 中,由 contract pallet 模块认真。通过阐明本文主要要搞清楚两个问题:

1. 合约设计的经济模子:生意业务执行收费和存储租金机制;

2. 合约的执行机制:自己跑在 Wasm 虚拟机里的 runtime 里是怎么跑用户 Wasm 合约的。

Runtime 的 contract pallet 扩展了 Currency trait 的账户系统,因此可以和其他基于 Currency 实现账户系统的模块一起利用。扩展的合约账户具有实例化合约和挪用其他合约和非合约账户的成果。

为了合约代码的复用,将合约代码的上传陈设和合约账户的实例化分成两部门,多个合约账户可以从同一份上传的 code 举办实例化。

02

合约的经济模子

为了制止垃圾生意业务和恶意合约占用计较和存储资源,合约的设计思量了生意业务执行收费和合约存储收费逻辑。当合约账户的余额不足付出存储租金时,合约的存储会被清理并进入 tombstone 状态。

合约的生命周期

alive 状态的合约信息

当合约处于正常事情状态,其主要有以下信息:

本体技术视点|一文读懂Substrate的合约机制(一)

tombstone 状态的合约信息

当合约进入 tombstone 状态后,合约的所有存储城市被清理,合约信息里只有一个对 storage_root+code_hash 举办 hash 的值。

合约的复生

合约进入 tombstone 状态后,技能上是可以举办规复的。首先需要筹备一本新姑且合约T,往 T 合约的存储中插入原合约中的 key-value 对,使 storage root 和原合约完全一致,然后挪用 restore_to 合约接口,这个接口会查抄当前合约的 storage root 是否和要规复的 tombstone 一致,假如满意要求那么就使原合约复生,而且将当前的姑且合约的资产转移到复生合约,并销毁当前姑且合约。

执行合约的 Gas 收费

生意业务的 sender 必需在每个 call 中指定 gas limit,未利用完的 gas 会在挪用竣事后返还。当达到了指定的 gas limit 后,那么所有的 call 和相关的状态改观(包括转账)只会在当前挪用的合约层举办回滚,好比,合约 A 挪用 B,而且 B 执行时 gas 不足,那么所有 B 的挪用将被回滚。假如 A 能对错误举办正确处理惩罚,那么 A 的其他挪用和状态改观依然可以举办耐久存储。初看起来这样做是一个极大的限制,但其实是底层增加了机动性,因为并不是所有的挪用都是劫难性的,因此给了挪用方可以举办公道的判定和处理惩罚的时机;假如想要其他链那种堕落就完全回滚的方法,那么可以在挪用 B 堕落伍 A 也直接报错回滚 A 的改观。

对付 Wasm 的每一个指令和 host 函数都配置了对应的 Instruction Weight。

本体技术视点|一文读懂Substrate的合约机制(一)

runtime 会筹备一个 gas(amount:u32)的计费函数,在 Wasm 合约上传后,立即会对 Wasm 中的每一个函数举办计费函数的插入生成新的 code。后续合约的执行都以新的 code 为准。

下一期我们将继承环绕 Substrate 的合约存储的收租机制、Wasm 合约限制、合约对外部生意业务的接口等方面展开。

如有任何疑问,可通过 research@ont.io 联结我们。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。