文字大小
缺少 #[max_len(32)] 的問題是,序列化帳戶包含一個用 0 字節填充的字符串,使其成為 32 字節,而反序列化結構嘗試僅反序列化字符串實際長度的字節,然後剩餘的 0 字節將其弄亂,以反序列化以下字段。
為瞭解決這個問題,我建議使用declare_program!來自anchor_client。這樣你就不需要手動實現相同的結構您的程序和客戶端,並且您可以免費實現反序列化。複製粘貼這個問題:
聲明程序!(我的程序);
使用 my_program::{ID, 帳戶::提案};
使用anchor_client::Client;
讓 cl = Client::new_with_options(
簇,
費用支付者,
CommitmentConfig::confirmed(),
);
讓 p = cl.program(ID).unwrap();
let acc_state: Proposal = p.account(<指向帳戶的公鑰>).await?;
如果你不能做到這一點,我建議使用 BorshDeserialize::deserialize 就像我說你的問題是字節太多。
提案::deserialize(&mut &data[..]).unwrap();
請注意,這會改變您的底層字節數組以指向剩餘的字節。我猜這很好,因為您可能不會將這些相同的字節用於其他任何事情,但僅供參考。