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

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

01

概要

Substrate把整个程序逻辑分为Host和Runtime部分,Host功能是固定的,偏向于底层,是采用原生执行的方式,而Runtime部分是动态的,偏上层业务,编译成Wasm字节码,这样可以随时升级,其执行在Wasm虚拟机中。合约功能作为上层业务,放置在runtime中,由contractpallet模块负责。通过分析本文主要要搞清楚两个问题:

1.合约设计的经济模型:交易执行收费和存储租金机制;

赵长鹏:币安团队都在待命:金色财经报道,对于彭博社披露美国证券交易委员会起诉币安一事,币安首席执行官赵长鹏在社交媒体发文称,币安团队都在待命,确保系统稳定,包括取款和存款。一旦看到诉讼将作出回应,目前还没有看到,但媒体在我们之前获取信息。[2023/6/6 21:17:48]

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

Runtime的contractpallet扩展了Currencytrait的账户系统,因此可以和其他基于Currency实现账户系统的模块一起使用。扩展的合约账户具有实例化合约和调用其他合约和非合约账户的功能。

Web3初创企业加速器Beacon首批13家初创公司毕业:金色财经报道,Web3 初创企业加速器 Beacon 首批 13 家初创公司已毕业,包括 Arcana、Blinkmoon、ChapterX、Colexion、Community Gaming、FastLane、Cubist、Meta Apes、Mystic Moose、Nillion、Davos Protocol、TimeSwap 和 Ylide。Beacon 由 Polygon 联合创始人 Sandeep Nailwal 推出,他透露首个“Cohort 0”加速计划已与 1000 多个项目进行了交流,最终在选定了 15 家公司,最终毕业的有 13 家,这些公司将获得约 250,000 美元的初始资金,投后估值预计可以达到 800 万美元。(coinspeaker)[2023/1/12 11:07:15]

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

美联储乔治:尽管通胀可能正在缓和,但仍处于高位:8月19日消息,美联储乔治表示,尽管通胀可能正在缓和,但仍处于高位。到目前为止,核心通胀的缓解程度“很难令人宽慰”。上个月的通胀数字“令人鼓舞”,但还不是胜利的时候。美国的需求和供给之间仍然存在“相当严重的不平衡”。预计美国经济增长将持续放缓,通胀预期看起来得到了充分锚定。美国劳动力市场紧张的状况需要一段时间来缓解,需求仍处在一个相对较高的水平。[2022/8/19 12:34:54]

02

合约的经济模型

为了避免垃圾交易和恶意合约占用计算和存储资源,合约的设计考虑了交易执行收费和合约存储收费逻辑。当合约账户的余额不够支付存储租金时,合约的存储会被清理并进入tombstone状态。

合约的生命周期

alive状态的合约信息

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

tombstone状态的合约信息

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

合约的复活

合约进入tombstone状态后,技术上是可以进行恢复的。首先需要准备一本新临时合约T,往T合约的存储中插入原合约中的key-value对,使storageroot和原合约完全一致,然后调用restore_to合约接口,这个接口会检查当前合约的storageroot是否和要恢复的tombstone一致,如果满足要求那么就使原合约复活,并且将当前的临时合约的资产转移到复活合约,并销毁当前临时合约。

执行合约的Gas收费

交易的sender必须在每个call中指定gaslimit,未使用完的gas会在调用结束后返还。当到达了指定的gaslimit后,那么所有的call和相关的状态变更只会在当前调用的合约层进行回滚,比如,合约A调用B,并且B执行时gas不够,那么所有B的调用将被回滚。如果A能对错误进行正确处理,那么A的其他调用和状态变更依然可以进行持久存储。初看起来这样做是一个极大的限制,但其实是底层增加了灵活性,因为并不是所有的调用都是灾难性的,因此给了调用方可以进行合理的判断和处理的机会;如果想要其他链那种出错就完全回滚的方式,那么可以在调用B出错后A也直接报错回滚A的变更。

对于Wasm的每一个指令和host函数都设置了对应的InstructionWeight。

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

下一期我们将继续围绕Substrate的合约存储的收租机制、Wasm合约限制、合约对外部交易的接口等方面展开。

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

来源:金色财经

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

地球链

瑞波币SWAP:Uniswap上美股的交易量有多大?

美股是现在当之无愧的交易天堂,任何一个市场都无法与当前美股流动性相媲美。bilibili股价连创新高,目前市值已经突破260亿美元,新能源汽车龙头特斯拉更是疯狂,市值6160亿美元,无数科技资产.

[0:15ms0-0:782ms