您的位置:首页 > 互联网 >

Ontology Wasm可降低合约调用的费用 合约执行的入口函数默认用invoke

2019-08-23 15:40:15 来源: 区块网

Ontology Wasm 自从上线测试网以来,得到了社区开发人员的极大关注。因为这项技术使得业务逻辑复杂的 dApp 合约上链成本降低,极大丰富 dApp

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}

利用这个依赖项,开发者可以调用与本体区块链交互的接口以及参数序列化等工具。

1.2 合约入口函数

每个程序都有一个入口函数,比如我们常见的 main 函数,但是合约并没有 main 函数。在用 Rust 开发 Wasm 合约时,默认用 invoke 函数作为合约执行的入口函数。将 Rust 源代码编译成虚拟机可以执行的字节码时,会对 Rust 中的函数名进行混淆。为了防止编译器生成多余的字节码,减小合约大小,invoke 函数要加上#[no_mangle]注解。

Invoke 函数如何获得交易执行的参数?ontio_std 库提供了 runtime::input()函数用于接收交易执行的参数,开发者可以使用 ZeroCopySource 对接收到的字节数组进行反序列化。其中,读出来的第一个字节数组是调用的方法名,后面读到的是方法参数。

合约执行结果是如何返回?ontio_std 库提供的runtime::ret 函数可以将方法执行结果返回出去。

一个完整的 invoke 函数如下:

#[no_mangle]

pub fn invoke() {

let input = runtime::input();

let mut source = ZeroCopySource::new(&input);

let action: &[u8] = source.read().unwrap();

let mut sink = Sink::new(12);

match action {

b"hello" => sink.write(say_hello()),

_ => panic!("unsupported action!"),

}

runtime::ret(sink.bytes())

}

1.3 合约数据序列化和反序列化

在合约开发过程中,开发者总会遇到序列化和反序列化的问题,即如何把一个 struct 类型的数据保存到数据库中以及从数据库中读到的字节数组如何进行反序列化以获得 struct 类型的数据。

Ontio_std 库提供了 Decoder 和 Encoder 接口对数据进行序列化和反序列化。Struct 结构体的字段也要实现 Decoder 和 Encoder 接口,这样该 struct 才可以实现序列化和反序列化。在对各种数据类型进行序列化的时候,需要用到 Sink 实例。Sink 实例有个集合类型的字段 buf,该字段存的是字节类型数据,所有序列化的数据都会存到 buf 中。

对于固定长度的数据(例如:byte、u16、u32和 u64等),直接将该数据转换字节数组然后存入 buf 中;对于长度不固定的数据,序列化时需要先序列化长度,然后序列化数据(例如不知大小的无符号整数,包括 u16、u32或 u64等)。

反序列化和序列化正好相反。对于所有的序列化方法,都有对应的反序列化方法。反序列化需要用到 Source 实例。该实例有两个字段 buf 和 pos。Buf 用来存储要反序列化的数据,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)

关键词: Ontology Wasm 合约调用 入口函数

精选 导读

募资55亿港元万物云启动招股 预计9月29日登陆港交所主板

万科9月19日早间公告,万物云当日启动招股,预计发行价介乎每股47 1港元至52 7港元,预计9月29日登陆港交所主板。按发行1 167亿股计算,万

发布时间: 2022-09-20 10:39
管理   2022-09-20

公募基金二季度持股情况曝光 隐形重仓股多为高端制造业

随着半年报披露收官,公募基金二季度持股情况曝光。截至今年二季度末,公募基金全市场基金总数为9794只,资产净值为269454 75亿元,同比上

发布时间: 2022-09-02 10:45
资讯   2022-09-02

又有上市公司宣布变卖房产 上市公司粉饰财报动作不断

再有上市公司宣布变卖房产。四川长虹25日称,拟以1 66亿元的转让底价挂牌出售31套房产。今年以来,A股公司出售房产不断。根据记者不完全统

发布时间: 2022-08-26 09:44
资讯   2022-08-26

16天12连板大港股份回复深交所关注函 股份继续冲高

回复交易所关注函后,大港股份继续冲高。8月11日大港股份高开,随后震荡走高,接近收盘时触及涨停,报20 2元 股。值得一提的是,在7月21日

发布时间: 2022-08-12 09:56
资讯   2022-08-12

万家基金再添第二大股东 中泰证券拟受让11%基金股权

7月13日,中泰证券发布公告,拟受让齐河众鑫投资有限公司(以下简称齐河众鑫)所持有的万家基金11%的股权,交易双方共同确定本次交易的标的资

发布时间: 2022-07-14 09:39
管理   2022-07-14

央行连续7日每天30亿元逆回购 对债市影响如何?

央行12日再次开展了30亿元逆回购操作,中标利率2 10%。这已是央行连续7日每天仅进行30亿元的逆回购缩量投放,创下去年1月以来的最低操作规

发布时间: 2022-07-13 09:38
资讯   2022-07-13

美元指数创近20年新高 黄金期货创出逾9个月新低

由于对美联储激进加息的担忧,美元指数11日大涨近1%创出近20年新高。受此影响,欧美股市、大宗商品均走弱,而黄金期货创出逾9个月新低。美

发布时间: 2022-07-13 09:36
资讯   2022-07-13

美股三大股指全线下跌 纳斯达克跌幅创下记录以来最大跌幅

今年上半年,美股持续回落。数据显示,道琼斯指数上半年下跌15 3%,纳斯达克综合指数下跌29 5%,标普500指数下跌20 6%。其中,纳斯达克连续

发布时间: 2022-07-04 09:51
推荐   2022-07-04

融资客热情回升 两市融资余额月内增加超344亿元

近期A股走强,沪指6月以来上涨4%,融资客热情明显回升。数据显示,截至6月16日,两市融资余额1 479万亿元,月内增加344 67亿元,最近一个半

发布时间: 2022-06-20 09:41
资讯   2022-06-20

4个交易日净买入超百亿元 北向资金持续流入A股市场

北向资金净流入态势延续。继6月15日净买入133 59亿元后,北向资金6月16日净买入44 52亿元。自5月27日至今,除6月13日以外,北向资金累计净

发布时间: 2022-06-17 09:37
推荐   2022-06-17