23 个版本 (14 个稳定版本)
1.5.0 | 2024 年 8 月 12 日 |
---|---|
1.4.2 | 2024 年 7 月 2 日 |
1.4.1 | 2024 年 5 月 13 日 |
1.1.1 | 2024 年 2 月 12 日 |
0.0.1 |
|
#25 in #gear
1,723 每月下载量
在 15 个crate中使用 (直接使用8个)
295KB
3.5K SLoC
gstd
Gear 程序标准库提供了您程序所需的所有必要函数和方法。
虽然 gcore
允许进行更底层的程序实现,但 gstd
提供了预构建的模块,以安全且精确的方式实现程序,这适用于大多数场景。
lib.rs
:
用于 Gear 程序的标准库。
在编写 Gear 程序时应使用此库。与 gcore
crate 相比,此库提供了更高层次的原始函数,允许您开发更复杂的 dApps。如果您愿意花费更多 gas 以换取更精炼的代码,请选择此库。
gstd
crate 为开发者提供了许多高级工具,例如异步编程原始函数、任意类型编码/解码,提供方便的工具从程序创建程序等。
最低支持的 Rust 版本
由于稳定版本中实现了 panic 处理器,此 crate 需要 Rust >= 1.73。
crate 功能
示例
使用自定义类型解码输入有效载荷
#![no_std]
use gstd::{msg, prelude::*};
#[derive(Decode, Encode, TypeInfo)]
#[codec(crate = gstd::codec)]
#[scale_info(crate = gstd::scale_info)]
struct Payload {
question: String,
answer: u8,
}
#[no_mangle]
extern "C" fn handle() {
let payload: Payload = msg::load().expect("Unable to decode payload");
if payload.question == "life-universe-everything" {
msg::reply(payload.answer, 0).expect("Unable to reply");
}
}
异步程序示例。
在初始化期间向三个地址发送空消息,并等待至少两个回复("批准")。当调用时,它只处理 PING
消息,并向三个地址发送空消息,并等待只有一个批准。如果获得批准,程序会回复 PONG
。
#![no_std]
use futures::future;
use gstd::{msg, prelude::*, ActorId};
static mut APPROVERS: [ActorId; 3] = [ActorId::zero(); 3];
#[derive(Debug, Decode, TypeInfo)]
#[codec(crate = gstd::codec)]
#[scale_info(crate = gstd::scale_info)]
pub struct Input {
pub approvers: [ActorId; 3],
}
#[gstd::async_init]
async fn init() {
let payload: Input = msg::load().expect("Failed to decode input");
unsafe { APPROVERS = payload.approvers };
let mut requests: Vec<_> = unsafe { APPROVERS }
.iter()
.map(|addr| msg::send_bytes_for_reply(*addr, b"", 0, 0))
.collect::<Result<_, _>>()
.unwrap();
let mut threshold = 0;
while !requests.is_empty() {
let (.., remaining) = future::select_all(requests).await;
threshold += 1;
if threshold >= 2 {
break;
}
requests = remaining;
}
}
#[gstd::async_main]
async fn main() {
let message = msg::load_bytes().expect("Failed to load payload bytes");
if message != b"PING" {
return;
}
let requests: Vec<_> = unsafe { APPROVERS }
.iter()
.map(|addr| msg::send_bytes_for_reply(*addr, b"", 0, 0))
.collect::<Result<_, _>>()
.unwrap();
_ = future::select_all(requests).await;
msg::reply(b"PONG", 0).expect("Unable to reply");
}
依赖项
~4.5–6MB
~103K SLoC