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

NEAR中插入UnorderedMap时触发越界错误求助

NEAR Protocol UnorderedMap 插入越界错误排查方案

针对你迁移旧列表到新UnorderedMap时出现的越界错误,结合代码场景,给出以下排查和修复方向:

1. 修正键引用传递问题

如果旧列表是 UnorderedMap<String, Struct> 类型,old_list.iter() 返回的迭代器元素是 (&String, &Struct),循环变量 key 本身已是 &String。调用 insert 时传入 &key 会形成双重引用(&&String),虽Rust支持自动解引用,但UnorderedMap内部存储处理时可能因类型匹配问题触发越界。

修改插入代码:

new_list.insert(key, &new_data_to_push);

2. 确保Struct实现正确的序列化Trait

NEAR的存储结构依赖Borsh序列化,如果你的Struct未正确派生BorshSerialize和BorshDeserialize,插入时会因数据序列化异常导致存储长度计算错误,进而触发越界。

给Struct添加必要的派生宏:

use borsh::{BorshSerialize, BorshDeserialize};

#[derive(BorshSerialize, BorshDeserialize, Clone)]
struct Struct {
    data: String, // 替换为你的实际数据类型
}

3. 修正数据所有权处理

伪代码存在笔误:循环变量是data,你写的old_data.data应改为data.data。同时如果data.data是引用类型(比如&String),需要通过clone()获取所有权,避免引用失效导致的异常:

let new_data_to_push = Struct {
    data: data.data.clone(),
};

4. 验证旧列表的存储状态

如果旧UnorderedMap的存储存在损坏(比如bucket索引超出数组范围、无效条目),迭代过程中会读取到非法数据,插入新Map时触发越界。可以在迁移前先检查旧列表的长度是否符合预期:

// 在循环前添加检查
assert!(old_list.len() <= 1000); // 根据你的业务场景设置合理阈值

5. 确保新UnorderedMap的存储前缀唯一

新列表使用的前缀b"m"需与旧列表的存储前缀完全不同,避免读写同一存储区域导致的冲突,进而引发越界错误。

内容的提问来源于stack exchange,提问作者Seaver Choy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:50:30