Solidity合约迁移:黑名单函数require语句部署位置咨询
黑名单校验语句的部署位置指导
情况1:新合约继承标准ERC20(如OpenZeppelin的ERC20)
虽然你的合约没有显式定义_transfer函数,但父合约(如ERC20)内置了内部_transfer函数,所有公开转账操作(transfer、transferFrom)都会调用它。最佳方案是重写该函数,一次性覆盖所有转账场景:
// 先确保已定义黑名单状态变量 mapping(address => bool) public _isBlackList; // 重写内部转账函数,加入校验 function _transfer(address from, address to, uint256 amount) internal virtual override { // 黑名单校验语句放在最开头 require(!_isBlackList[from] && !_isBlackList[to], "You are black listed by Owner"); // 调用父合约原有的转账逻辑 super._transfer(from, to, amount); }
情况2:新合约为自定义转账逻辑
如果合约未继承标准ERC20,而是自行实现了转账功能,需要在所有处理转账的公开函数开头加入校验语句:
- 示例:
transfer函数
function transfer(address to, uint256 amount) public returns (bool) { require(!_isBlackList[msg.sender] && !_isBlackList[to], "You are black listed by Owner"); // 原有的转账逻辑代码 // ... return true; }
- 示例:
transferFrom函数
function transferFrom(address from, address to, uint256 amount) public returns (bool) { require(!_isBlackList[from] && !_isBlackList[to], "You are black listed by Owner"); // 原有的转账逻辑代码 // ... return true; }
核心注意点
- 重写内部
_transfer的方式更简洁,无需在多个函数中重复校验 - 自定义转账逻辑时,务必检查所有涉及资金转移的入口函数,避免遗漏校验
内容的提问来源于stack exchange,提问作者KeelanB
相关产品推荐
相关产品推荐

