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

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

本体技术视点 | 手把手教你Wasm合约开发

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

Ontology Wasm 自从上线测试网以来,得到了社区开发人员的极大关注。因为这项技术使得业务逻辑复杂的 dApp 合约上链成本降低,极大丰富 dApp 生态。 Ontology Wasm 目前支持使用 Rust 和 C++两...

目录

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

    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 技术爱好者加入本体开发社区,共同打造技术生态。

    本文相关推荐: 本体技术视点 | 解析本体双通证模型

    以上便是知世金融网给大家分享的关于本体技术视点 | 手把手教你Wasm合约开发/qkl/27012.html的相关信息了,希望能帮助到大家,更多金融相关信息,敬请关注知世金融网!

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

    关键词:本体
    (0)
    (0)

    上一篇:加密货币银行是什么?它又将如何运作?

    下一篇:邀请函 | 2019 ALB泰和泰合规新视野论坛

    本文标题:本体技术视点 | 手把手教你Wasm合约开发

    本文地址:/index.php?s=article&c=search&keyword=%E6%9C%AC%E4%BD%93

    金融知名领域

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

    更多推荐

    • 茅台吃饱,经销商哭倒
      茅台吃饱,经销商哭倒
    • 汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
      汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
    • 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