Cỡ chữ
Vấn đề với việc thiếu #[max_len(32)] là tài khoản được serialize chứa một chuỗi được đệm bằng 0 byte để đạt 32 byte, trong khi struct deserialize chỉ cố gắng deserialize đúng số byte mà chuỗi của bạn thực sự có, và sau đó các byte 0 còn lại sẽ làm hỏng việc deserialize các trường tiếp theo.
Để khắc phục điều này, tôi khuyên bạn nên sử dụng declare_program! từ anchor_client. Bằng cách đó, bạn không cần phải tự triển khai cùng một struct trong chương trình và client của mình, và bạn được cung cấp sẵn phần deserialization miễn phí. Sao chép từ câu hỏi này:
declare_program!(my_program);
use my_program::{ID, accounts::Proposal};
use anchor_client::Client;
let cl = Client::new_with_options(
cluster,
fee_payer,
CommitmentConfig::confirmed(),
);
let p = cl.program(ID).unwrap();
let acc_state: Proposal = p.account().await?;
Tuy nhiên, nếu bạn không thể làm điều này, tôi khuyên bạn nên sử dụng BorshDeserialize::deserialize vì như tôi đã nói, vấn đề của bạn là có quá nhiều byte.
Proposal::deserialize(&mut &data[..]).unwrap();
Lưu ý rằng điều này sẽ thay đổi mảng byte cơ bản của bạn để trỏ đến các byte còn lại. Tôi đoán điều này không sao vì có thể bạn sẽ không dùng những byte đó cho bất cứ việc gì khác, nhưng chỉ để bạn biết.