Go调用ERC20合约报错execution reverted: ERC20: transfer from the zero address
问题原因分析
- 核心问题:估算Gas时未指定调用方地址
你调用client.EstimateGas时传入的ethereum.CallMsg结构体仅填写了To和Data字段,缺失From字段。以太坊节点处理未指定调用方的模拟请求时,会默认使用零地址0x0000000000000000000000000000000000000000作为msg.sender,而标准ERC20的transfer函数会首先校验调用方非零地址,因此直接触发了你遇到的报错。 - 潜在问题:Infura节点地址未补全项目ID
你初始化ethclient时使用的Infura Ropsten节点地址仅写到v3后缀,未拼接个人Infura项目ID,部分节点配置下也可能导致请求异常,核心问题修复后如果仍有报错可优先检查此处。
修复方案
- 第一步:修改
EstimateGas的传参,在ethereum.CallMsg中补充From字段,值为你通过私钥推导得到的fromAddress:
gasLimit, err := client.EstimateGas(context.Background(), ethereum.CallMsg{ From: fromAddress, // 新增本行指定调用方地址 To: &tokenAddress, Data: data, })
- 第二步:补全Infura节点地址,将你的项目ID拼接在路径末尾:
client, err := ethclient.Dial("https://ropsten.infura.io/v3/替换为你的Infura项目ID")
内容的提问来源于stack exchange,提问作者Chikanboa
相关产品推荐
相关产品推荐

