You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:57:13