Ontology 目前已经完成了对 Wasm 合约的全面支持,Wasm 合约距离上线主网的日子越来越近了。为了更好地方便广大智能合约开发者参与开发,SmartX 已经上线了新版本,支持 Wasm 合约的部署和调用。现在就请和我一起清脆地敲起键盘,开始体验吧!
图 | 网络
作为一只程序猿,
敲起键盘来总是感觉自己酷酷的~
好啦,说正题!
一、生成并测试合约
为了介绍 SmartX 如何部署和调用 Wasm 合约,我们需要用 Wasm 合约模板开发一个简单的测试合约。具体如何根据合约模板开发 Ontology Wasm 合约,可以戳我们之前的教程:本体技术视点 | 想用Wasm开发dApp?你不得不读的入门教程(1)。
1. clone 合约模板
git clone https://github.com/ontio/rust-wasm-contract-template.git
2. 修改src/lib.rs
文件
#![no_std]
extern crate ontio_std as ostd;
use ostd::abi::{Sink, Source};
use ostd::prelude::*;
use ostd::runtime;
fn hello() -> String {
return "hello world".to_string();
}
fn say(data: &str) -> String {
"say ".to_string() + data
}
fn add(a: U128, b: U128) -> U128 {
a + b
}
#[no_mangle]
fn invoke() {
let input = runtime::input();
let mut source = Source::new(&input);
let action: &str = source.read().unwrap();
let mut sink = Sink::new(12);
match action {
"hello" => sink.write(hello()),
"say" => {
let data = source.read().unwrap_or_default();
sink.write(say(data));
}
"add" => {
let (a, b) = source.read().unwrap_or_default();
sink.write(add(a, b));
}
_ => panic!("unsupported action!"),
}
runtime::ret(sink.bytes())
}
该测试合约中有如下的三个方法:
-
fn add(a: U128, b: U128) -> U128
返回 a 和 b 的和;
-
fn hello() -> String
返回“hello world”;
-
fn say(data: &str) -> String
返回“say”.to_string() + data。
3. 编译和优化合约
build.sh 脚本封装了编译和优化合约的功能,直接执行该脚本即可。
./build.sh
编译生成的字节码文件放在生成的output
文件夹,目录结构如下:
├── output
│ ├── rust_wasm_contract_template.wasm
│ ├── rust_wasm_contract_template.wasm.str
│ └── rust_wasm_contract_template.wasm.wast
-
rust_wasm_contract_template.wasm
是测试SmartX需要的Wasm字节码文件; -
rust_wasm_contract_template.wasm.str
是Wasm字节码的hex编码; -
rust_wasm_contract_template.wasm.wast
是 .wast 格式的 Wasm 合约。
二、部署
首先,我们需要登录 SmartX。登录成功后,我们会进入“项目列表”页面。在这里,我们点击“打开 Wasm 文件”按钮。
我们需要输入 Wasm 智能合约的名称,并选择上面生成的 rust_wasm_contract_template.wasm 文件,点击“确定”按钮。这会帮我们生成一个 Wasm 合约的项目,方便以后管理。
打开新创建的 Wasm 合约项目,我们可以看到,合约编辑区域显示的是 Wasm 合约的字节码,这部分字节码内容可以替换。
接下来,我们可以部署该 Wasm 合约,该步骤与部署 Neo VM 合约时没有差异。
在右侧“部署”工具页内填好相关信息,点击“部署”按钮,SmartX 会唤起 Chrome 插件钱包 Cyano Wallet(需要提前安装好最新版),要求用户输入钱包密码,如果 Cyano Wallet 里有足够的 ONG,那么稍等片刻,Wasm 合约就会部署到 Ontology 的网络上。部署测试时,可以点击下方图中“Apply ONG”申请测试网 ONG。
三、调用
部署成功后,我们会进入合约的“运行”页面。在这里,我们可以调用 Wasm 合约的方法。
我们需要输入要调用的方法名称为“add”,添加方法所需的参数,为参数选好正确的类型,并输入参数值。add
方法需要两个u128
类型的数据,合约中的 u128对应 SmartX 中的 Long 类型,所以参数类型应该选 Long。然后选择点击“预执行”或者“运行”按钮。合约执行的结果会显示在左侧下方的日志区。在这里,我们仅需要点击预执行即可,因为我们没有更新链上的数据,日志区打印出来的是 hex 编码的结果,仅需用 hex 解码即可。
至此,我们完成了在 SmartX 上对 Wasm 合约的部署和调用。
下面我再介绍下hello
和say
方法的调用。hello
方法仅仅返回“hello world”字符串,不需要传入参数,其调用截图如下:
say
方法实现将输入参数加上前缀“say”然后返回,需要&str
类型的参数,合约中的&str
类型对应 Smartx 的“String”类型,调用示例如下:
四、结语
本期我们通过一个示例,简单介绍了在 SmartX 上部署和调用 Wasm 合约的主要流程。下面我们来划划重点:
使用前我们有一些准备工作,即我们一定要在 Chrome 浏览器里打开 SmartX,并且需要安装好 Ontology 的插件钱包—— Cyano Wallet。安装教程请见如下视频。同时,在部署和调用时,要先确认 Cyano Wallet 里连接的 Ontology 网络是否是您所需要的(目前只支持测试网,即将支持主网),并且账户中有足够的 ONG 余额,以支付部署和调用合约的手续费。
亲爱的伙伴们,你们学会了吗?欢迎关注公众号:本体研究院,观看教学视频。
来源:CSDN
作者:Ontology Blockchain
链接:https://blog.csdn.net/ontologycoding/article/details/102761460