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
相关产品推荐
相关产品推荐

