【摘要】 Ontology Wasm可降低合约调用的费用 合约执行的入口函数默认用invoke
Ontology Wasm 自从上线测试网以来,得到了社区开发人员的极大关注。因为这项技术使得业务逻辑复杂的 dApp 合约上链成本降低,极大丰富 dApp 生态。
Ontology Wasm 目前支持使用 Rust 和 C++两种语言开发。其中 Rust 语言对 Wasm 的支持更好,生成的字节码更加精简,可以进一步降低合约调用的费用。那么如何使用 Rust 进行 Ontology 的合约开发?
一、使用 Rust 进行 Wasm 合约开发
1.1 新建合约
Cargo 是开发 Rust 程序时一款不可多得的项目构建和包管理工具,它可以帮助开发者更好地组织代码和第三方库依赖。新建一个 Ontology Wasm 空合约,仅只需要执行下面的命令:
cargo new --lib hello-world
其生成的项目结构是:
|-Cargo.toml
|-src
|-lib.rs
其中,Cargo.toml 文件用来配置项目基本信息和依赖库信息等,文件中的[lib]段必须设置成 crate-type = ["cdylib"];而 lib.rs 文件用来编写合约逻辑代码。另外,需要在配置文件 Cargo.toml 的[dependencies]段中加入依赖项设置:
ontio-std={https://github.com/ontio/ontology-wasm-cdt-rust}
%数据,pos 用来存储当前读取的位置。读取指定类型数据的时候,如果知道其长度,可以直接读;对于长度未知的数据,要先读出来长度,然后再读内容。1.4 访问和更新链上的数据
Ontology-wasm-cdt-rust 已经封装了链上数据的操作方法,能够方便开发者实现链上数据的增删改查等操作。其中:
Ø database::get(key) 用来从链上查询数据, key 要求实现 AsRef 接口。
Ø database::put(key, value) 用来将数据存到链上,key 要求实现 AsRef 接口,value 要求实现 Encoder 接口。
Ø database::delete(key) 用来从链上删除数据,key 要求实现 AsRef 接口。
1.5 合约测试
合约方法执行时需要访问链上的数据并且需要相应的虚拟机进行执行合约字节码,所以一般需要将合约部署到链上才能进行相关测试。但这样的测试方法比较麻烦。为了使开发者更方便地测试合约,ontio_std 库提供了 mock 测试模块。该模块提供了链上数据的模拟,方便开发者对合约中的方法进行单元测试。
具体案例可参考:
https://github.com/ontio/ontology-wasm-cdt-rust/blob/master/examples/oep5token/src/test.rs
1.6 调试合约
开发者可以使用 console::debug(msg) 在合约调试过程中输出相关调试信息。其中, msg 信息会在节点 log 日志里打印出来。这里有个前置条件,即 Ontology 本地测试节点启动的时候日志级别需要设置为 debug 模式。
另外, 开发者也可以使用 runtime::notify(msg) 在合约调试过程中输出相关调试信息。该方法会将打印出来的信息保存到链上,可以通过 getSmartCodeEvent 方法从链上查询。
二、 总结
Ontology 作为领先公链,率先支持 Wasm 合约,为 Wasm 技术的成熟贡献力量。同时,我们也欢迎更多的 Wasm 技术爱好者加入本体开发社区,共同打造技术生态。(Lucas)