Skip to main content

sol_parser_sdk/instr/
inner_common.rs

1//! 通用 Inner Instruction 解析工具
2//!
3//! 提供零拷贝、高性能的通用读取函数,供所有协议的 inner instruction 解析器使用
4
5/// 零拷贝读取 u8
6#[inline(always)]
7pub unsafe fn read_u8_unchecked(data: &[u8], offset: usize) -> u8 {
8    *data.get_unchecked(offset)
9}
10
11/// 零拷贝读取 u16
12#[inline(always)]
13pub unsafe fn read_u16_unchecked(data: &[u8], offset: usize) -> u16 {
14    let ptr = data.as_ptr().add(offset) as *const u16;
15    u16::from_le(ptr.read_unaligned())
16}
17
18/// 零拷贝读取 u32
19#[inline(always)]
20pub unsafe fn read_u32_unchecked(data: &[u8], offset: usize) -> u32 {
21    let ptr = data.as_ptr().add(offset) as *const u32;
22    u32::from_le(ptr.read_unaligned())
23}
24
25/// 零拷贝读取 u64
26#[inline(always)]
27pub unsafe fn read_u64_unchecked(data: &[u8], offset: usize) -> u64 {
28    let ptr = data.as_ptr().add(offset) as *const u64;
29    u64::from_le(ptr.read_unaligned())
30}
31
32/// 零拷贝读取 u128
33#[inline(always)]
34pub unsafe fn read_u128_unchecked(data: &[u8], offset: usize) -> u128 {
35    let ptr = data.as_ptr().add(offset) as *const u128;
36    u128::from_le(ptr.read_unaligned())
37}
38
39/// 零拷贝读取 i32
40#[inline(always)]
41pub unsafe fn read_i32_unchecked(data: &[u8], offset: usize) -> i32 {
42    let ptr = data.as_ptr().add(offset) as *const i32;
43    i32::from_le(ptr.read_unaligned())
44}
45
46/// 零拷贝读取 i64
47#[inline(always)]
48pub unsafe fn read_i64_unchecked(data: &[u8], offset: usize) -> i64 {
49    let ptr = data.as_ptr().add(offset) as *const i64;
50    i64::from_le(ptr.read_unaligned())
51}
52
53/// 零拷贝读取 i128
54#[inline(always)]
55pub unsafe fn read_i128_unchecked(data: &[u8], offset: usize) -> i128 {
56    let ptr = data.as_ptr().add(offset) as *const i128;
57    i128::from_le(ptr.read_unaligned())
58}
59
60/// 零拷贝读取 bool
61#[inline(always)]
62pub unsafe fn read_bool_unchecked(data: &[u8], offset: usize) -> bool {
63    *data.get_unchecked(offset) == 1
64}
65
66/// 零拷贝读取 Pubkey (32 bytes)
67#[inline(always)]
68pub unsafe fn read_pubkey_unchecked(data: &[u8], offset: usize) -> solana_sdk::pubkey::Pubkey {
69    use solana_sdk::pubkey::Pubkey;
70    let ptr = data.as_ptr().add(offset);
71    let mut bytes = [0u8; 32];
72    std::ptr::copy_nonoverlapping(ptr, bytes.as_mut_ptr(), 32);
73    Pubkey::new_from_array(bytes)
74}
75
76/// 零拷贝读取字符串(带长度前缀)
77#[inline(always)]
78pub unsafe fn read_string_unchecked(data: &[u8], offset: usize) -> Option<(String, usize)> {
79    if data.len() < offset + 4 {
80        return None;
81    }
82
83    let len = read_u32_unchecked(data, offset) as usize;
84    if data.len() < offset + 4 + len {
85        return None;
86    }
87
88    let string_bytes = &data[offset + 4..offset + 4 + len];
89    let s = std::str::from_utf8_unchecked(string_bytes);
90    Some((s.to_string(), 4 + len))
91}
92
93/// 检查数据长度是否足够
94#[inline(always)]
95pub fn check_length(data: &[u8], required: usize) -> bool {
96    data.len() >= required
97}