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 魔法豆
456 每月下载量
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
包装结构体,以实现ReadonlyAccountPubkey
和ReadonlyAccountPubkeyBytes
。
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
实现了Account
和AccountSharedData
的特性和功能。
不要在链上程序crate中启用此特性,否则cargo-build-sbf
将失败。
测试
cargotest --all-features
依赖项
~0–8.5MB
~72K SLoC