加载中 ...

substrate 合约模块简要剖析(1)

2019-09-30 21:54 编辑:币牛牛 来源:币源

本文主要介绍 substrate 合约模块的实现逻辑,srml/contracts 提供了部署和执行 WASM 智能合约的功能。作为一个模块化的区块链框架,不管是未来的波卡平行链还是基于 substrate 拥有独立共识的链,比如 ChainX, 只要引入其合约模块,就具备了合约功能,可以成为一个智能合约平台。ChainX 目前就计划引入合约功能,对区块链智能合约开发者提供支持, 欢迎有兴趣的同学持续关注。



substrate 的合约模块将会分两篇文章进行解读,本篇主要介绍基本概念,substrate 合约与以太坊合约的一些联系与区别,还会介绍一下上传合约代码 put_code 和实例化合约 instantiate 两个外部接口的实现。合约模块一共有 3 个接口,第二篇将会介绍第三个外部接口合约调用 call 的基本逻辑,并且会详细介绍下 substrate 关于合约存储收费的设计。



以下代码分析基于 substrate 的 9 月 21 日 4117bb9ff 版本。



基本概念



substrate 上的合约与以太坊合约有很多联系。首先普通账户和合约账户在外部表现上没有任何区别,都是一个哈希. 合约账户可以创建新的合约,也可以调用其他合约账户和普通账户。如果是合约账户调用普通账户,就是一个普通的转账。当合约账户被删除时,关联的代码和存储也会被删除。用户调用合约时,必须指定 Gas limit, 每次调用都需要花费 Gas 手续费, 合约内部调用的指令也会消耗 Gas.



当然也有一些区别。以太坊在合约调用中,如果出现任何问题,整个状态都会回滚。但是在 substrate 的合约中如果出现了合约嵌套调用,比如合约 A 调用了合约 B, 合约 B 调用了合约 C,B 在调用 C 的过程中发生错误,那么只有 B 这一层的状态回滚,A 调用产生的状态修改仍然保留。当以太坊出现类似情况时,整个合约调用链的状态都会回滚,也就是 A 调用的状态修改不会保留,而是会被丢弃。另外除了 Gas 费用,substrate 的合约还有一个 rent 费用, 也就是对于合约存储也进行了收费. 以太坊虽然已经有个相关的 EIP 针对存储收费的讨论 EIP 103, 但是目前还没有实施。



合约模块一共有三个与外部交互的接口:

· put_code: 上传代码, 将准备好的 WASM 合约代码存储到链上, 如果执行成功,会返回一个 code_hash, 然后可以通过这个 code_hash 创建合约。先将代码存储到链上的好处是,对于合约内部逻辑相同而只有初始化参数不一样的合约,比如很多以太坊上的很多 ERC20 合约,链上只需要存储一份代码,而不需要每次新建一个合约的时候,都要存储一份重复的代码,这显然是冗余的。

· instantiate: 实例化合约, 通过 put_code 返回的 code_hash 并传入初始化参数创建一个合约账户,实例化过程会调用合约内部的 deploy 函数对合约进行初始化,初始化只有一次。最近 substrate 将合约模块的实例化方法从之前的 create 重命名为了 instantiate, 见:PR: 3645。
https://github.com/paritytech/substrate/pull/3645

· call: 调用合约。在这里需要注意的是 substrate 有个存储收费的逻辑,如果调用的时候合约账户余额不足,合约就会被删除 evict, 很多人应该遇到过这种情况。

put_code: 上传合约代码

1. 调用 gas::buy_gas根据gas_limit预收取手续费。这一步是预先收取交易发起人的手续费。如果最后执行完成后,如果 Gas 没用完,会将剩余的 Gas 返还给用户。buy_gas 的代码在 srml/contracts/src/gas.rs。

收取手续费 = gas_price * gas_limit

2.将代码存储到链上,调用 wasm::code_cache::save 执行存储代码的逻辑, save 代码位于 srml/contracts/src/wasm/code_cache.rs。

关键词:比特币新闻 币牛牛

转载自比特币新闻网(www.btc268.com),提供比特币行情走势分析与数字货币投资炒币最新消息。

原文标题:substrate 合约模块简要剖析(1)

原文地址:http://www.btc268.com/news/qkl/15860.html

本文来源:币源编辑:币牛牛

本文仅代表作者个人观点,与本网站立场无关。

本网站转载信息目的在于传递更多信息。请读者仅作参考,投资有风险,入市须谨慎!

'); })();