substrate学习笔记8:ink合约开发之初体验
1 学习内容#
本节开始,我们将开始学习 ink 合约开发。
2 准备工作#
- 环境依赖
需要安装 nightly 工具链:
rustup component add rust-src --toolchain nightly
rustup target add wasm32-unknown-unknown --toolchain nightly
- 安装 substrate contract node
因为部署合约需要使用到 pallet-contracts pallet,我们这里使用已经配置好该 pallet 的模板。安装命令如下:
cargo install contracts-node --git https://github.com/paritytech/substrate-contracts-node.git --tag v0.3.0 --force --locked
- 安装 ink!CLI
为了方便的设置 substrate 智能合约,我们需要安装 ink!CLI。
(1)安装 ink!CLI 需要先安装依赖 binaryen 包,命令如下:
# For Ubuntu or Debian users
sudo apt install binaryen
# For MacOS users
brew install binaryen
(2)安装 ink!CLI,命令如下:
cargo install cargo-contract --vers ^0.16 --force --locked
(3)安装后,可以用如下命令查看:
cargo contract --help
3 创建一个 ink!项目#
创建合约工程,命令如下:
cargo contract new flipper
3.1 合约源代码#
通过前面的命令,ink!CLI 给我们生成了一个最简单的智能合约代码。代码非常简单,有兴趣的小伙伴可以看一下生成的代码,在 flipper/lib.rs 中。
3.2 测试合约代码#
在生成的代码中,我们可以看到有测试代码,我们可以对其用链下测试环境进行测试,在 flipper 目录下运行如下命令:
cargo +nightly test
3.3 编译合约代码#
编译合约的命令如下:
cargo +nightly contract build
注意:
如果编译时出现错误
call to unsafe function
,可以通过运行cargo install --force cargo-contract && rustup update
解决。如果出现错误
Your wasm-opt version is 91, but we require a version >= 99
,可以参照 https://docs.porta.network/developer-guide/smart-contracts/install-wasm-opt-version-101 解决。
编译好后的合约在 target 目录中,其中包含一个 metadata 文件和.contract 文件。.contract 文件就是用来部署到链上的合约文件,而 metadata 文件则包含合约的 ABI。
4 运行 substrate 智能合约节点#
运行命令如下:
substrate-contracts-node --dev --tmp
5 部署合约#
部署合约需要我们在浏览器打开工具 Canvas UI,然后选择点击左下角的 Local Node
,这样就连接到了我们本地的节点。
substrate 中部署合约主要有以下两步:
- 把合约代码放在链上;
- 创建合约的实例。
5.1 上传合约代码#
连接上 Canvas UI 后,我们可以上传我们的合约代码,主要步骤如下:
- 点击 Upload & Instantiate Contract;
- 在 Instantiation account 选择一个账户(如 alice);
- 在 descriptive Name 输入一个名字;
- 将我们前面编译的 flipper.contract 文件拖到 drag & drop 区域;
- 最后点击 Constructor Details。
5.2 在链上实例化合约#
智能合约作为区块链上账户系统的扩展而存在。因此,创建此合约的实例将创建一个新的 AccountId,它将存储智能合约管理的任何余额,并允许我们与合约交互。
在上面一步我们点击后,进入的实例化界面,我们需要填上合约实例化的名字,还有初始化的相关的值,然后点击 instantiate
,再点击 Sign & Submit
。
至此,我们就把合约部署完成了。
6 调用合约#
我们现在可以执行合约了,点击 ABI
, 可以看到有 get
和 flip
两个函数,选择后,点击 execute
按钮,可以执行。
至此,我们就使用官方的例子体验了一下 ink!合约。
7 参考文献#
docs.substrate.io/tutorials/v3/ink...
8 本文实验后的 github 地址#
github.com/anonymousGiga/substrate...
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: