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

使用Ethers.js调用Solidity合约获取指定地址Player信息返回undefined的问题

解决ethers.js调用合约获取指定地址玩家信息返回undefined的问题

核心问题:合约函数参数引用错误

你编写的getOtherPlayerInfo函数存在低级语法错误,导致无法正确返回指定地址的玩家数据:

// 错误代码
function getOtherPlayerInfo(address addr) public view returns (Player memory) {
    return playerInfo[address]; // 误用类型名address,而非参数变量addr
}

这里的address是Solidity的地址类型关键字,不是你传入的参数变量,函数实际返回的是playerInfo映射中类型默认值对应的空结构体,前端解析时就会出现undefined。

修复后的合约函数

将引用改为参数变量addr:

function getOtherPlayerInfo(address addr) public view returns (Player memory) {
    return playerInfo[addr];
}

⚠️ 注意:修改合约后必须重新部署到链上,否则旧合约的错误逻辑依然生效。

前端调用的优化建议

即使修复了合约,前端调用时也需要注意以下几点:

  1. 标准化地址格式
    用ethers.js的getAddress()方法确保地址是校验后的标准格式,避免大小写或格式错误:

    import { ethers } from "ethers";
    const targetAddr = ethers.getAddress("0x59D101AD9DdeA84C0e11DA137000Dd91A0b20c79");
    
  2. 正确传递函数参数
    useContractReader的第四个参数需要以数组形式传递函数参数(即使只有一个参数):

    const otherPlayerInfo = useContractReader(
      writeContracts,
      "YourContract",
      "getOtherPlayerInfo",
      [targetAddr] // 参数放在数组中
    );
    
  3. 验证合约ABI与部署状态

    • 确认前端使用的合约ABI包含getOtherPlayerInfo函数的正确定义
    • 检查合约部署地址是否与前端配置一致

验证步骤

  1. 先在Remix或其他合约调试工具中调用修复后的getOtherPlayerInfo,传入目标地址,确认能返回正确的Player结构体数据,排除合约逻辑问题。
  2. 查看浏览器控制台的网络请求,检查合约调用的返回值是否存在错误(如revert信息)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:10:35