NEAR合约get_rooms接口反序列化失败问题求助
问题原因
你错误地给Room这个普通数据结构体添加了#[near_bindgen]宏。这个宏是NEAR SDK专门用来标记合约核心结构体(比如你的Rooms结构体)的,给普通数据结构添加会篡改它的Borsh序列化规则,导致批量读取UnorderedMap中的元素时,反序列化失败。
单个get_room接口能正常工作是因为它直接通过键值精准读取单个元素,而get_rooms使用values()迭代器批量遍历存储时,迭代器的反序列化逻辑会因为Room的序列化格式被破坏而抛出错误。
解决方案
移除Room结构体上的#[near_bindgen]宏,只保留用于序列化和调试的derive宏即可。
修改后的完整合约代码:
#[derive(Serialize, Deserialize, Debug, BorshDeserialize, BorshSerialize)] #[serde(crate = "near_sdk::serde")] pub struct Room { room_id: U64, name: String, image: String, description: String, location: String, price: U128, owner: AccountId, } #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Rooms { pub rooms: UnorderedMap<U64, Room>, } impl Default for Rooms { fn default() -> Self { Self { rooms: UnorderedMap::new(b"r".to_vec()), } } } #[near_bindgen] impl Rooms { pub fn set_room( &mut self, name: String, image: String, description: String, location: String, price: U128, ) -> U64 { let timestamp = env::block_timestamp(); let convert_timestamp: U64 = timestamp.into(); let account_id = env::signer_account_id(); self.rooms.insert( &convert_timestamp.clone(), &Room { room_id: convert_timestamp, name, image, description, location, price, owner: account_id, }, ); convert_timestamp } pub fn get_room(&self, room_id: U64) -> Room { self.rooms.get(&room_id).expect("No Room") } pub fn get_rooms(&self) -> Vec<Room> { Vec::from_iter(self.rooms.values()) } }
验证修改
重新编译并部署合约后,执行原查询命令:
$ near view dev-1658072311649-16892075058144 get_rooms
即可正常返回所有Room的列表。
内容的提问来源于stack exchange,提问作者ysaito
相关产品推荐
相关产品推荐

