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

部署后合约地址未显示且setActivity函数因地址回滚问题咨询

问题分析与解决方案

1. 核心问题:owner变量未初始化

你声明的owner变量只是空声明,Solidity中地址类型默认值为全零地址(0x0000000000000000000000000000000000000000),导致onlyOwner修饰器的校验永远不通过,调用setActivity时必然触发回滚。

2. 修复owner初始化问题

添加构造函数,在合约部署时自动将部署者的地址赋值给owner:

修改后的完整合约代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Learning {

    address public owner;
    bool public isActive = true;
    uint256 public number;

    // 构造函数:部署时自动执行,把部署者地址赋值给owner
    constructor() {
        owner = msg.sender;
    }

    modifier checkActivity() {
        require(isActive, "Not Active any more.");
        _;
    }
    modifier onlyOwner() {
        require(msg.sender == owner, "not owner");
        _;
    }

    function setValue(uint x) checkActivity public {
           number = x;
      }

    function setActivity(bool _isActive) onlyOwner public {
          isActive = _isActive;
      }
}

重新部署合约后,owner会自动设置为部署合约的钱包地址,setActivity函数的权限校验就能正常生效。

3. 获取合约地址的方法

合约地址与owner是两个独立概念:owner是合约管理员地址,合约地址是部署到区块链后分配的唯一标识。获取方式包括:

  • 部署工具(Remix、Hardhat、Truffle等)在部署完成后会直接显示合约地址
  • 通过区块链浏览器查询部署交易的详情,合约地址会标注在Contract Address字段
  • 在合约内添加函数,通过address(this)获取当前合约地址:
    function getContractAddress() public view returns(address) {
        return address(this);
    }
    
    部署后调用该函数即可拿到合约地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:55:00