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

Ontology v1.8.0重磅发布 Wasm功能登陆主网

2019-10-31 16:16:21 来源: 区块网

日前的政策利好将区块链推向了前所未有风口,把区块链作为核心技术自主创新重要突破口,加快推动区块链技术和产业创新发展成为了区块链行业

日前的政策利好将区块链推向了前所未有风口,“把区块链作为核心技术自主创新重要突破口,加快推动区块链技术和产业创新发展”成为了区块链行业最新的工作指示。我们感到十分兴奋,因为我们一直都在正确的道路上持续前行,为这一场区块链技术攻坚战厉兵秣马。

而就在本体 Ontology 2.0 发布前夕,Ontology v1.8.0于10月29日重磅发布。经过数月在测试网上的稳定运行,Wasm 功能也正式登陆了主网。在往期的技术视点中,我们已推出多部 Ontology Wasm 相关教程,社区伙伴们纷纷表示受益匪浅。本期我们将介绍如何基于 Wasm合约使用 Runtime API,相信你会有所收获。

Runtime API 简述

Ontology Wasm 合约开发工具库 ontology-wasm-cdt-rust 里面 Runtime 模块封装了合约与 Ontology 链交互的 API 方法。通过这些 API 方法,合约可以获得链上的数据,或者将合约中的数据保存到链上,以下是这些 API 方法的简单描述。

接下来,我们来具体讲述下这些 API 的使用方法。在此之前,开发者可以从 GitHub 上 clone 下来我们的合约模板,然后在lib.rs文件中添加合约逻辑代码。

Runtime API 使用方法

首先,开发者仅需要通过下面的方式将 Runtime 模块引入到当前合约中:

use ontio_std::runtime;

然后就可以通过 Runtime 引用以上所有的 API 接口。

1. timestamp()

timestamp()方法获得当前的时间戳,即返回调用该函数的 Unix 时间,单位为秒。调用示例:

let t = runtime::timestamp();

一个简单的示例代码如下:

#![no_std]

extern crate ontio_std as ostd;

use ostd::abi::{Sink, Source};

use ostd::prelude::*;

use ostd::runtime;

fn hello() -> u64 {

runtime::timestamp()//取得当前时间戳

}

#[no_mangle]

fn invoke() {

let input = runtime::input();//获得输入方法名和方法参数

let mut source = Source::new(&input);//构造反序列化实例

let action = source.read().unwrap_or_default();//读取方法名

let mut sink = Sink::new(16);//构造序列化实例

match action {

"hello" => {

sink.write(hello());//将hello()返回的结果序列化

}

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

}

runtime::ret(sink.bytes());//将序列化后的结果返回给调用方

}

在下面的 API 方法讲述中,我们将省略具体例子,只介绍 API 方法的作用。小伙伴们可以采用类似于上述例子的代码进行试验。

2. block_height

block_height函数获得当前区块链网络的区块高度,调用示例:

let t = runtime::block_height();

3. address

address 获得当前合约的地址,调用示例:

let t = runtime::address();

4. caller

caller 获得调用方的合约地址,主要用于跨合约调用的场景,比如合约 A 调用合约 B 的应用场景, 在合约 B 中就可以调用该方法获得调用方合约 A 的地址:

let t = runtime::caller();

5. entry_address

entry_address 获得入口合约地址,比如有这样的应用场景,合约 A 通过合约 B 调用合约 C的方法,此时,在合约 C 中就可以通过该方法拿到合约 A 的地址,调用示例:

let t = runtime::entry_address();

6. current_blockhash

current_blockhash 获得当前区块的 hash,示例如下:

let t = runtime::current_blockhash();

7. current_txhash

current_txhash获得当前交易的 hash,示例如下:

let t = runtime::current_txhash();

8. sha256

sha256计算输入参数的 hash256值:

let h = runtime::sha256("test");

9. check_witness

check_witness(from)校验是否含有该地址的签名:

· 验证当前的函数调用者是不是含有 from 的签名 。若是(即签名验证通过),则函数返回 true;

· 检查当前函数调用者是不是一个合约。若是合约,且是从该合约发起去执行函数,返回 true。即,验证 from 是不是caller的返回值。其中,caller()函数可以得到调用当前智能合约的合约哈希值。

assert!(runtime::check_witness(from));

10. notify

notify函数将合约中事件推送到全网,并将其内容保存到链上,调用方法如下:

runtime::notify("notify".as_bytes())

在合约中推送事件时,可以自定义一个事件函数,加上#[event]注解即可。我们的工具库中提供了该属性宏,需要通过use ostd::macros::event;引入。示例如下:

use ostd::macros::event;

mod notify {

use super::*;

#[event]

pub fn transfer(from: &Address, to: &Address, amount: U128) {}

}

fn transfer(from: &Address, to: &Address, amount: U128) -> bool {

...

notify::transfer(from, to, amount);

}

11. panic

panic方法可以在合约执行发生致命错误的时候立即终止交易的执行,然后回滚当前的交易。该方法在跨合约调用的场景很重要,比如在如下的应用场景中,合约 A 中的方法 a 调用合约 B 中的方法 b,其中合约 A 的 a 方法在调用合约 B 的 b 方法之前会保存一些数据到链上,但是在调用合约 B 的 b 方法时,发生了致命的错误,需要回滚合约 A 中 a 方法执行过程中保存的数据,此时就需要在合约 B 的 b 方法中应用panic方法实现该功能。

runtime::panic("test");

结语

本文主要讲解了 Runtime 模块的 API,该模块提供了与链交互的功能,其中 notify 用于合约中推送事件,开发者可以使用自定义事件的方式推送事件,而不是直接使用 notify 方法。use ostd::macros::event属性宏提供了更加友好的事件推送机制。在跨合约调用的过程中,panic方法在异常处理中具有非常重要的。下一期我们将介绍如何实现 Wasm 合约与 NeoVM 合约及 Native 合约之间的相互调用,欢迎大家关注学习。

Ontology 率先支持 Wasm 合约将会大大提高混合虚拟机的性能,也将吸引众多不同语言的技术开发者加入本体社区,共同推进区块链技术的研发,丰富本体强大的技术生态。同时,基于本体强大的技术研发团队,也可将现有的优秀技术整合到本体生态上来,为合约开发者增加更多选项。欢迎各位技术伙伴与我们共同前行!(Lucas)

关键词: Ontology v1 8 0 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