6个版本
新增 0.3.3 | 2024年8月25日 |
---|---|
0.3.2 | 2024年8月25日 |
0.3.0 | 2024年4月9日 |
0.2.0 | 2024年4月9日 |
0.1.0 | 2024年2月24日 |
#2 in #pubkey
32KB
539 行
solana-nostd-entrypoint
solana_program
中的入口点函数效率低下。在没有空process_instruction
函数的情况下,当程序接收到32个非重复账户时,会使用超过8000个bpf计数器。我们使用一个新的NoStdAccountInfo
结构体,其布局与vm flat buffer中的布局一致input: *mut u8
;与常规入口点不同,它不进行复制和不进行分配就读取所有内容。
此crate还包括一个简单的引用程序,用于调用另一个程序。请参阅lib.rs
#[cfg(feature = "example-program")]
pub mod entrypoint {
use super::*;
use solana_program::{
entrypoint::ProgramResult, log, program_error::ProgramError, pubkey::Pubkey, system_program,
};
entrypoint_nostd!(process_instruction, 32);
pub const ID: Pubkey = solana_program::pubkey!("EWUt9PAjn26zCUALRRt56Gutaj52Bpb8ifbf7GZX3h1k");
noalloc_allocator!();
basic_panic_impl!();
pub fn process_instruction(
_program_id: &Pubkey,
accounts: &[NoStdAccountInfo],
_data: &[u8],
) -> ProgramResult {
log::sol_log("nostd_c");
// Unpack accounts
let [user, config, _rem @ ..] = accounts else {
return Err(ProgramError::NotEnoughAccountKeys);
};
// Transfer has discriminant 2_u32 (little endian), followed u64 lamport amount
let mut instruction_data = [0; 12];
instruction_data[0] = 2;
instruction_data[4..12].copy_from_slice(&100_000_000_u64.to_le_bytes());
// Instruction accounts are are from, to
let instruction_accounts = [user.to_meta_c(), config.to_meta_c()];
// Build instruction expected by sol_invoke_signed_c
let instruction = InstructionC {
program_id: &system_program::ID,
accounts: instruction_accounts.as_ptr(),
accounts_len: instruction_accounts.len() as u64,
data: instruction_data.as_ptr(),
data_len: instruction_data.len() as u64,
};
// Get infos and seeds
let infos = [user.to_info_c(), config.to_info_c()];
let seeds: &[&[&[u8]]] = &[];
// Invoke system program
#[cfg(target_os = "solana")]
unsafe {
solana_program::syscalls::sol_invoke_signed_c(
&instruction as *const InstructionC as *const u8,
infos.as_ptr() as *const u8,
infos.len() as u64,
seeds.as_ptr() as *const u8,
seeds.len() as u64,
);
}
// For clippy
#[cfg(not(target_os = "solana"))]
core::hint::black_box(&(&instruction, &infos, &seeds));
Ok(())
}
}
依赖关系
~17–26MB
~444K SLoC