#account #generics #solana #sanctum

solana-readonly-account

只读 Solana 账户字段获取器特质,可扩展用于链上和链下结构体

4 个稳定版本

2.0.0 2024 年 8 月 3 日
1.2.0 2024 年 7 月 2 日
1.1.0 2024 年 1 月 3 日
1.0.0 2023 年 12 月 11 日

#407 in 魔法豆

Download history 32/week @ 2024-05-04 92/week @ 2024-05-11 108/week @ 2024-05-18 102/week @ 2024-05-25 91/week @ 2024-06-01 67/week @ 2024-06-08 46/week @ 2024-06-15 75/week @ 2024-06-22 210/week @ 2024-06-29 108/week @ 2024-07-06 107/week @ 2024-07-13 76/week @ 2024-07-20 172/week @ 2024-07-27 164/week @ 2024-08-03 71/week @ 2024-08-10 37/week @ 2024-08-17

456 每月下载量

MIT/Apache

21KB
433

solana-readonly-account

ReadableAccount 特质的重新实现,以允许在链下客户端 (solana-sdk) 和链上程序 (solana-program) 之间代码重用

为什么创建这个 crate?

  • 由于 solana-sdk 的功能标志不正常,并且它不能与 build-sbf 一起编译,因此在链上程序中不能使用 solana-sdk 中的原始 ReadableAccount 特质
  • Rc<RefCell<>>AccountInfo 中使其与 &[u8] 不兼容,对于 .data

将 6 个主要账户字段(key,lamports,data,owner,is_executable,rent_epoch)拆分为单独的获取器特质。这种拆分允许具有更高的特质组合性和灵活性。

例如,假设你有一个只要求账户所有者的函数,并且这是一个已知的静态公钥。你不需要为了读取已经知道的账户所有者字段而获取整个 Account,或者创建一个虚拟的 Account,你可以简单地定义一个新的类型,只需要实现 ReadonlyAccountOwner,同时仍然能够使用这个函数与链上的 AccountInfo

用法

现在从crate中导入相应的特性,可以使您编写既适用于链上又适用于链下的泛型函数。

use solana_program::{
    program_error::ProgramError, program_pack::Pack,
};
use solana_readonly_account::ReadonlyAccountData;
use spl_token_2022::state::Account;

pub fn try_deserialize_token_account<A: ReadonlyAccountData>(
    acc: A,
) -> Result<Account, ProgramError> {
    Account::unpack(&acc.data())
}

默认情况下,此crate没有依赖项,仅提供特性定义。

crate特性

keyed

由于许多链下账户结构体,例如solana_sdk::Account,没有公钥字段,因此定义了以下Keyed包装结构体,以实现ReadonlyAccountPubkeyReadonlyAccountPubkeyBytes

pub struct Keyed<T> {
    pub pubkey: Pubkey,
    pub account: T,
}

keyed-bytes

类似于keyed,但使用[u8; 32]而不是Pubkey以实现零依赖。

solana-pubkey

在原始[u8; 32]类型之上支持solana的Pubkey类型。

solana-program

实现了AccountInfo的特性和功能。

solana-sdk

实现了AccountAccountSharedData的特性和功能。

不要在链上程序crate中启用此特性,否则cargo-build-sbf将失败。

测试

cargotest --all-features

依赖项

~0–8.5MB
~72K SLoC