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

