知世金融网专注于股票行情,期货开户,外汇储备等最新相关资讯信息提供投资者参考学习!

当前位置:网站首页 > 区块链 > 正文

本体技术视点 | Wasm重磅登陆Ontology主网!Wasm合约开发必读入门教程(4)

原创
文章作者
知世-金融领域资深作者
知名金融领域作者,从事金融超过十余年,在行业内有一定影响力。
金融风险管理师认证证书 常识职业资格认证 特许金融分析师 国际金融理财师认证证书
发布时间:2020-02-16 19:29:18 发布来源:本体研究院 文章点击:109

日前的政策利好将区块链推向了前所未有风口,“把区块链作为核心技术自主创新重要突破口,加快推动区块链技术和产业创新发展”成为了区块链行业最新的工作指示。我们感到十分...

目录

    本文标题本体技术视点 | Wasm重磅登陆Ontology主网!Wasm合约开发必读入门教程(4),作者:知世,本文有1556个文字,大小约为6KB,预计阅读时间4分钟,请您欣赏。知世金融网众多优秀文章,如果想要浏览更多相关文章,请使用网站导航的搜索进行搜索。本站虽然不乏优秀之作,但仅作为投资者学习参考。

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

    而就在本体 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 合约将会大大提高混合虚拟机的性能,也将吸引众多不同语言的技术开发者加入本体社区,共同推进区块链技术的研发,丰富本体强大的技术生态。同时,基于本体强大的技术研发团队,也可将现有的优秀技术整合到本体生态上来,为合约开发者增加更多选项。欢迎各位技术伙伴与我们共同前行!

    本文相关推荐: 重磅政策密集投放 多措并举促进民营经济发展将长期持续

    以上便是知世金融网给大家分享的关于本体技术视点 | Wasm重磅登陆Ontology主网!Wasm合约开发必读入门教程(4)/qkl/28021.html的相关信息了,希望能帮助到大家,更多金融相关信息,敬请关注知世金融网!

    网站内容均来自互联网,如侵害您的利益联系客服进行删除!

    关键词:重磅
    (0)
    (0)

    上一篇:端到端的反思:如何实现真正的可信物联网

    下一篇:人工智能和区块链技术如何应用于对抗”深度伪造”?

    本文标题:本体技术视点 | Wasm重磅登陆Ontology主网!Wasm合约开发必读入门教程(4)

    本文地址:/index.php?s=article&c=search&keyword=%E9%87%8D%E7%A3%85

    金融知名领域

    南方财富网 | 金融界 | 金融界 |

    更多推荐

    • 茅台吃饱,经销商哭倒
      茅台吃饱,经销商哭倒
    • 汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
      汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
    • 158亿元!比亚迪收购!
      158亿元!比亚迪收购!
    • 9月价格回落近五成 “冷静期”酒店业备战“十一”市场
      9月价格回落近五成 “冷静期”酒店业备战“十一”市场
    • 2023哈马博览会哈尔滨银行展区精彩纷呈
      2023哈马博览会哈尔滨银行展区精彩纷呈
    • 大额解禁撂倒股价 医疗影像龙头跌出千亿俱乐部 葛兰二季度大幅减仓
      大额解禁撂倒股价 医疗影像龙头跌出千亿俱乐部 葛兰二季度大幅减仓
    • A股,又上了热搜!数字要素概念走高多股涨停,锂电池板块走低恩捷股份大举跌停
      A股,又上了热搜!数字要素概念走高多股涨停,锂电池板块走低恩捷股份大举跌停
    • 最新!巨头出手,加仓宁王51%
      最新!巨头出手,加仓宁王51%
    • 600亿巨头暴雷
      600亿巨头暴雷
    • 一天32家!科创板回购潮涌来
      一天32家!科创板回购潮涌来
    • 提振信心实招来了!30余家上市公司密集出手 最高要买10亿
      提振信心实招来了!30余家上市公司密集出手 最高要买10亿
    • 高盛再发50年后预测:2075年印度股市全球市值占比将升4倍 中国升3成
      高盛再发50年后预测:2075年印度股市全球市值占比将升4倍 中国升3成

    新闻资讯栏目

    站长QQ: 2397470084