Taille du texte
Le problème avec le #[max_len(32)] manquant est que le compte sérialisé contient une chaîne complétée par 0 octet pour faire 32 octets, alors que la structure de désérialisation essaie de désérialiser uniquement le nombre d'octets de votre chaîne, puis les 0 octets restants la gâchent pour désérialiser les champs suivants.
Pour résoudre ce problème, je recommande d'utiliser declare_program ! de Anchor_client. De cette façon, vous n'avez pas besoin d'implémenter la même structure à la main.votre programme et votre client et vous obtenez la désérialisation mise en œuvre gratuitement pour vous. Copier-coller de cette question :
déclarer_programme!(mon_programme);
utilisez mon_programme ::{ID, comptes ::Proposition} ;
utilisez Anchor_client :: Client ;
let cl = Client::new_with_options(
grappe,
fee_payer,
CommitmentConfig::confirmé(),
);
let p = cl.program(ID).unwrap();
let acc_state: Proposal = p.account().await?;
Si vous ne pouvez pas le faire, je vous recommande d'utiliser BorshDeserialize::deserialize comme je l'ai dit, votre problème est d'avoir trop d'octets.
Proposition ::deserialize(&mut &data[..]).unwrap();
Notez que cela va muter votre tableau d'octets sous-jacent pour pointer vers les octets restants. Je suppose que c'est bien car vous n'utiliserez probablement pas ces mêmes octets pour autre chose, mais juste à titre d'information.