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

Solidity调用已部署ENS反向记录查询合约getNames函数执行回退问题排查

错误原因

  • 核心问题是数组类型不匹配:你代码中直接传递的[addr]是固定长度数组address[1]类型,而getNames函数要求传入的是动态长度的address[]类型,Solidity不会隐式转换固定长度数组到动态长度数组,所以调用直接回退。
  • 次要可能原因:你使用的是Rinkeby测试网的合约地址,Rinkeby测试网已经在2022年正式弃用,链上数据已经停止维护,如果你是在其他链(比如Goerli、Sepolia或者主网)部署你的测试合约,调用不存在的地址也会触发回退。

修复方案

1. 修正数组传参逻辑

把addrToENS函数里的传参部分改成手动构造动态长度数组,修改后代码如下:

pragma solidity ^0.8.0;
// 0.8+版本已经默认支持ABIEncoderV2,不需要额外声明experimental
contract ENStest {
    /* ENS Reverse Lookup
        Goerli: 0x333Fc8f550043f239a2CF79aEd5e9cF4A20Eb41e
        Mainnet: 0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C
        Sepolia: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8
    */
    // 替换为你要部署的对应链的有效合约地址,不要用已废弃的Rinkeby地址
    address public constant ENSReverseLookupContractAddr = 0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C; // 示例为主网地址
    
    function addrToENS(address addr) public view returns(string[] memory) {
        ReverseRecords ens = ReverseRecords(ENSReverseLookupContractAddr);
        // 手动构造动态长度数组
        address[] memory addrs = new address[](1);
        addrs[0] = addr;
        return ens.getNames(addrs);
    }
}
    
// ENS Reverse Lookup Remote Contract
abstract contract ReverseRecords {
    function getNames(address[] calldata addresses) external view virtual returns (string[] memory r);
}

2. 其他问题排查步骤

  • 确认你部署合约的链和ENS反向查询合约地址对应,不要跨链调用
  • 确认你查询的地址已经正确设置了ENS反向记录,未设置的话返回的是空字符串,不会触发回退
  • 调用时给足gas limit,避免因为gas不足触发回退

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:09:02