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

如何使用web3与UUPS可升级合约交互?调用owner返回零地址如何解决

你遇到的问题核心是混淆了UUPS可升级合约的代理合约地址和逻辑合约地址:

  • UUPS可升级模式是双层合约架构:代理合约负责存储所有业务状态、接收用户调用,再将调用转发给逻辑合约;你部署的V2 MyToken合约是逻辑合约,仅负责存储业务代码,本身不存储任何业务状态。
  • 你当前直接调用了V2逻辑合约的地址,而逻辑合约的initialize方法从未被触发,所以owner变量默认是零地址,这就是调用返回零地址的原因。

正确的交互操作步骤

  1. 替换合约地址:将process.env.CONTRACT_ADDRESS的值替换为你部署UUPS合约时生成的代理合约地址,不要用V2逻辑合约的地址。OpenZeppelin升级插件(truffle-upgrades、hardhat-upgrades)部署完成后会直接返回代理合约地址,你可以在部署日志中找到该地址。
  2. ABI无需调整:继续使用V2的MyToken合约ABI即可,代理合约会自动将所有调用转发到逻辑合约执行,ABI完全兼容。
  3. 验证调用:替换地址后,再执行await contract.methods.owner().call()就能返回正确的所有者地址。

注意事项

  • 如果你是手动部署的UUPS合约(未使用OpenZeppelin官方升级插件),需要手动调用一次代理合约的initialize方法完成初始化,否则代理合约的owner也会是零地址。
  • 后续所有的合约交互、升级操作都要基于代理合约地址执行,不要直接调用逻辑合约。

内容的提问来源于stack exchange,提问作者L. Lei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:06:05