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

注意

编译好后的合约在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,可以看到有getflip两个函数,选择后,点击execute按钮,可以执行。

至此,我们就使用官方的例子体验了一下ink!合约。

7 参考文献

docs.substrate.io/tutorials/v3/ink...

8 本文实验后的github地址

github.com/anonymousGiga/substrate...

本作品采用《CC 协议》,转载必须注明作者和本文链接
令狐一冲
讨论数量: 6

感觉用substrate开发的链来开发合约不是很合适,substrate本来就是为了快速搭建应用链来产生的。

1个月前 评论
linghuyichong (楼主) 1个月前
xiaowoniu (作者) 1个月前
linghuyichong (楼主) 1个月前
xiaowoniu (作者) 1个月前
linghuyichong (楼主) 1个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!