You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solana程序账户数据序列化/反序列化失败:Unknown错误求助

Solana程序序列化/反序列化错误排查:Failed to serialize or deserialize account data: Unknown

开发Solana程序时碰到这个错误:Failed to serialize or deserialize account data: Unknown,执行let mut bet_account = BidData::try_from_slice(&bet.data.borrow()[..])?;尝试读取账户数据时触发。相关结构体定义如下:

#[derive(BorshSerialize, BorshDeserialize, Debug)]
pub struct Bid {
    /// XJUST coins
    pub xjust: u64,
    /// selected side
    pub side: u8,
    /// user key
    pub pubkey: String,
}

#[derive(BorshDeserialize, BorshSerialize, Debug)]
pub struct BidData {
    // list bids
    pub bids: Vec<Bid>
}

常见解决思路:

  • 检查账户初始化流程:创建账户时必须用BidData的合法实例(比如空Vec的BidData { bids: Vec::new() })通过borsh::to_vec序列化后写入,不能直接创建空账户或写入错误格式的数据。初始化格式不对,反序列化肯定失败。
  • 统一Borsh版本:确保程序和客户端(如果有)依赖的borsh crate版本完全一致。不同版本的Borsh对Vec这类容器的序列化规则可能有差异,导致反序列化不兼容。
  • 排查结构体变更:如果程序之前部署过,且结构体字段有过修改(增删字段、改类型),旧账户的数据格式和新结构体不匹配,就会触发错误。这种情况要么做数据迁移,要么重新创建账户。
  • 校验数据长度:反序列化前可以先打印账户数据的长度,对比BidData序列化后的预期长度(比如空Vec的BidData序列化后是4字节,因为Borsh会先存u32类型的Vec长度)。长度不符说明数据被篡改或初始化错误。
  • 替换String为Pubkey类型:用String存Solana地址不合理,Solana的Pubkey是固定32字节的类型,替换后不仅更高效,还能避免字符串序列化的潜在问题。修改后的结构体:
use solana_program::pubkey::Pubkey;

#[derive(BorshSerialize, BorshDeserialize, Debug)]
pub struct Bid {
    pub xjust: u64,
    pub side: u8,
    pub pubkey: Pubkey,
}

#[derive(BorshDeserialize, BorshSerialize, Debug)]
pub struct BidData {
    pub bids: Vec<Bid>
}

内容的提问来源于stack exchange,提问作者Nikon Dolgushin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:24:43