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 2021 年 7 月 6 日

#25 in #gear

Download history 555/week @ 2024-05-02 624/week @ 2024-05-09 386/week @ 2024-05-16 360/week @ 2024-05-23 236/week @ 2024-05-30 229/week @ 2024-06-06 233/week @ 2024-06-13 263/week @ 2024-06-20 445/week @ 2024-06-27 570/week @ 2024-07-04 439/week @ 2024-07-11 330/week @ 2024-07-18 349/week @ 2024-07-25 319/week @ 2024-08-01 635/week @ 2024-08-08 367/week @ 2024-08-15

1,723 每月下载量
15 个crate中使用 (直接使用8个)

GPL-3.0 许可证

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