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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:40:13