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

Solidity白名单ERC20代币合约Mist部署Gas耗尽问题求助

分析你的WHITELIST合约问题

首先,我看到你的合约里有几个明显的问题,其中一些可能间接导致部署时的Gas异常,还有关键的安全隐患需要修正:

1. 构造函数的核心逻辑错误

在你的构造函数里,这行代码:

DignityWhitelist[initialAccount];

只是读取了映射中initialAccount对应的默认值(Solidity映射的默认值是false),并没有把初始账户添加到白名单里。你需要把它改成赋值操作,才能让初始账户真正拥有白名单权限:

DignityWhitelist[initialAccount] = true;

虽然这个错误本身不会直接导致Gas耗尽,但如果后续将这个合约和ERC20代币结合时,会引发逻辑漏洞,进而可能导致交易异常。

2. 缺少权限控制的严重安全问题

你的enableWhitelist和disableWhitelist函数是external权限,但没有任何校验——这意味着任何地址都可以随意添加或移除白名单地址,完全违背了你创建白名单机制的初衷。你必须给这两个函数加上权限控制,比如只有合约部署者(或指定管理员)才能调用:

首先,在合约里新增管理员状态变量:

address public admin;

然后在构造函数里初始化管理员:

admin = msg.sender;

接着新增校验管理员的修饰器:

modifier onlyAdmin() {
    require(msg.sender == admin, "Only admin can call this function");
    _;
}

最后给两个白名单操作函数加上这个修饰器:

function enableWhitelist(address whitelistAddress) external onlyAdmin {
    DignityWhitelist[whitelistAddress] = true;
}

function disableWhitelist(address removeAddress) external onlyAdmin {
    DignityWhitelist[removeAddress] = false;
}

3. 部署时Gas耗尽的排查方向

如果上述修正后仍然出现Gas耗尽问题,可以检查以下几点:

  • 确认Mist中部署时设置的Gas上限是否足够(这类简单合约,设置200,000-300,000 Gas就足够);
  • 检查部署时传入的initialAccount参数是否合法(比如是否是格式正确的以太坊地址);
  • 确保使用的Solidity编译器版本和合约声明的^0.4.21兼容,避免版本不兼容导致的编译异常。

修正后的完整合约示例

pragma solidity ^0.4.21; 

contract WHITELIST { 
    mapping(address => bool) public DignityWhitelist;
    address public admin;

    modifier isWhitelisted() { 
        require(DignityWhitelist[msg.sender] == true); 
        _; 
    }

    modifier onlyAdmin() {
        require(msg.sender == admin, "Only admin can perform this action");
        _;
    }

    function WHITELIST (address initialAccount) public { 
        if(initialAccount == 0x0) { 
            initialAccount = msg.sender; 
        } 
        DignityWhitelist[initialAccount] = true;
        admin = msg.sender;
    } 

    function enableWhitelist(address whitelistAddress) external onlyAdmin { 
        DignityWhitelist[whitelistAddress] = true; 
    } 

    function disableWhitelist(address removeAddress) external onlyAdmin { 
        DignityWhitelist[removeAddress] = false; 
    } 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:15:28