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

Solidity包含数组的结构体访问权限异常问题排查求助

Solidity结构体数组成员异常可读问题排查

你的结构体定义、mapping声明以及set函数的语法本身没有逻辑问题,理论上每个地址仅能访问自身调用set写入的结构体数据,出现所有地址都能读取到data[0] = 3的问题可按以下顺序排查:

  • 第一优先排查测试流程错误
    这是该类问题最高发的原因:
    1. 确认你测试时切换调用账号的操作是否生效,可在get函数中新增返回msg.sender的逻辑,校验实际调用者和你预期的测试地址是否一致,避免出现切换账号失败、始终用同一个调用过set的地址发请求的问题。
    2. 如果你是用Hardhat/Foundry等框架写自动化测试脚本,检查脚本是否提前给所有测试地址批量调用过set函数,或者没有重置调用者身份就连续调用get。
  • 第二排查实际代码和示例代码的差异
    你贴出的get函数没有定义返回值,无法直接返回数据,请确认你实际运行的代码是否和贴出的一致:如果实际代码中get函数硬编码返回了3、或者返回值读取的是固定存储槽而非infos[msg.sender]对应的数据,就会出现所有调用者拿到相同值的问题。你可以替换为以下符合语法规范的get函数复现测试:
    function get() public view returns (uint a, uint b, uint data0) {
        Info storage userInfo = infos[msg.sender];
        // 0.8+版本编译器无需手动校验,访问空数组下标会自动回滚
        require(userInfo.data.length > 0, "当前地址未写入过数据");
        a = userInfo.a;
        b = userInfo.b;
        data0 = userInfo.data[0];
    }
    
  • 第三排查编译器版本逻辑
    如果你使用的是0.8.0以下版本的编译器,动态数组越界访问不会触发回滚,只会返回对应类型的默认值,但uint类型的默认值为0,不可能返回3,因此可排除该原因。

补充说明:Solidity中mapping的每个key对应的数据存储完全隔离,结构体中的动态数组成员也不会和其他地址的同名字段共享存储槽,你写的基础存储逻辑本身没有语法错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:06:05