Lewati ke konten utama
iCute FinanceASET DIGITAL · PENGAMATAN PASAR
Bahasa Indonesia
Direktori riset
iCute Finance

Navigasi utama

Navigasi utama

ASET DIGITAL · PENGAMATAN PASAR

Bagaimana cara melakukan deserialisasi akun di frontend Rust?

Masalah dengan #[max_len(32)] yang hilang adalah bahwa akun yang diserialisasi berisi string yang di-padding dengan 0 byte agar menjadi 32 byte, sedangkan struct yang melakukan deserialisasi mencoba melakukan deserialisasi hanya sepanjang string Anda yang sebenarnya, dan kemudian sisa 0 byte mengacaukan deserialisasi field-field berikutnya. Untuk memperbaikinya, saya merekomendasikan menggunakan declare_program! dari anchor_client. Dengan begitu Anda tidak perlu mengimplementasikan struct yang sama secara manual di program dan klien Anda, dan Anda mendapatkan implementasi deserialisasi secara gratis. Menyalin dari pertanyaan ini: 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(<Pubkey yang menunjuk ke akun>).await?;

Namun jika Anda tidak bisa melakukan ini, saya merekomendasikan menggunakan BorshDeserialize::deserialize karena seperti yang saya katakan masalah Anda adalah memiliki terlalu banyak byte. Proposal::deserialize(&mut &data[..]).unwrap();

Perhatikan bahwa ini akan memutasi array byte yang mendasarinya untuk menunjuk ke byte yang tersisa. Saya menduga ini tidak masalah karena Anda mungkin tidak akan menggunakan byte yang sama untuk hal lain, tetapi hanya sebagai informasi.

Lihat sumber CC BY-SA 4.0