经过数月在测试网上的稳定运行,Wasm 功能正式登陆主网。在往期的技术视点中,我们已推出多部 Ontology Wasm 相关教程,社区伙伴们纷纷表示受益匪浅。
本期我们将介绍如何基于 Wasm合约使用 Runtime API,相信你会有所收获。
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;在下面的 API 方法讲述中,我们将省略具体例子,只介绍 API 方法的作用。小伙伴们可以采用类似于上述例子的代码进行试验。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());//将序列化后的结果返回给调用方 }
2. block_height
block_height函数获得当前区块链网络的区块高度,调用示例:
let t = runtime::block_height();
let t = runtime::address();4. caller
caller 获得调用方的合约地址,主要用于跨合约调用的场景,比如合约 A 调用合约 B 的应用场景, 在合约 B 中就可以调用该方法获得调用方合约 A 的地址:
let t = runtime::caller();5. entry_address
let t = runtime::entry_address();6. current_blockhash
current_blockhash 获得当前区块的 hash,示例如下:
let t = runtime::current_blockhash();7. current_txhash
let t = runtime::current_txhash();8. sha256
sha256计算输入参数的 hash256值:
let h = runtime::sha256("test");9. check_witness
- 验证当前的函数调用者是不是含有 from 的签名 。若是(即签名验证通过),则函数返回 true;
- 检查当前函数调用者是不是一个合约。若是合约,且是从该合约发起去执行函数,返回 true。即,验证 from 是不是caller的返回值。其中,caller()函数可以得到调用当前智能合约的合约哈希值。
assert!(runtime::check_witness(from));
runtime::notify("notify".as_bytes())
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); }
runtime::panic("test");
本文链接:https://www.8btc.com/media/504300
转载请注明文章出处