পাঠ্যের আকার
#[max_len(32)] অনুপস্থিত থাকার সমস্যাটি হলো, সিরিয়ালাইজ করা অ্যাকাউন্টে একটি স্ট্রিং থাকে যা 32 বাইট পূর্ণ করার জন্য 0 বাইট দিয়ে প্যাড করা হয়, অন্যদিকে ডিসিরিয়ালাইজিং স্ট্রাক্টটি আপনার স্ট্রিংটি আসলে যত বাইট লম্বা তা-ই ডিসিরিয়ালাইজ করার চেষ্টা করে এবং তারপর অবশিষ্ট 0 বাইটগুলি পরবর্তী ফিল্ডগুলি ডিসিরিয়ালাইজ করার সময় সমস্যা সৃষ্টি করে।
এটি ঠিক করার জন্য, আমি anchor_client থেকে declare_program! ব্যবহার করার পরামর্শ দিচ্ছি। এইভাবে আপনার প্রোগ্রাম এবং ক্লায়েন্টে একই স্ট্রাক্ট হাতে হাতে ইমপ্লিমেন্ট করার প্রয়োজন হবে না এবং আপনি বিনামূল্যে ডিসিরিয়ালাইজেশন পেয়ে যাবেন। এই প্রশ্ন থেকে কপি-পেস্ট করা:
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?;
তবে যদি আপনি এটি করতে না পারেন, তাহলে আমি BorshDeserialize::deserialize ব্যবহার করার পরামর্শ দিচ্ছি কারণ যেমনটি আমি বলেছি আপনার সমস্যা হলো অতিরিক্ত বাইট থাকা।
Proposal::deserialize(&mut &data[..]).unwrap();
লক্ষ্য করুন যে এটি আপনার অন্তর্নিহিত বাইট অ্যারে পরিবর্তন করে অবশিষ্ট বাইটগুলির দিকে নির্দেশ করাবে। আমার ধারণা এটি ঠিক আছে কারণ আপনি সম্ভবত সেই একই বাইটগুলি অন্য কোনও কাজে ব্যবহার করবেন না, তবে শুধু জানানোর জন্য।