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 协议》,转载必须注明作者和本文链接
感觉用substrate开发的链来开发合约不是很合适,substrate本来就是为了快速搭建应用链来产生的。