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

Solidity Mapping实现授权地址唯一修改Token费率功能相关咨询

代码整体正确性结论

当前提供的Solidity代码完全无法实现「仅授权地址可修改兑换费率」的需求,存在多处语法错误、逻辑漏洞,甚至无法正常编译通过。

存在的核心问题
  • Mapping设计逻辑不合理
    需求仅需要标记地址是否属于授权列表,使用mapping(address => uint)类型属于冗余设计,常规场景直接用布尔类型即可满足需求,也能降低理解成本和gas消耗。
  • _addApprover函数存在多重错误
    1. 语法错误:参数_i声明为uint类型,但approvedUsers的key是address类型,执行approvedUsers[_i]时会直接触发类型不匹配的编译报错
    2. 逻辑错误:approvedUsers[_approver] += approvedUsers[_i]的赋值逻辑完全和「添加授权地址」的需求无关,没有任何业务合理性
    3. 权限漏洞:函数声明为public无任何权限校验,任意地址都可以调用该函数修改授权列表
  • pricing函数存在多重错误
    1. 语法错误:require校验条件中,approvedUsers[_user]是uint类型,approvedUsers是mapping类型,两种完全不同的类型无法进行相等判断,直接编译失败
    2. 逻辑漏洞:校验对象是传入的参数_user而非实际调用者msg.sender,攻击者可以随便传入一个授权地址就绕过校验修改费率
    3. 安全风险:费率计算_rate * (10 ** uint256(decimals()))在0.8版本以前的Solidity中没有默认溢出检查,可能出现溢出导致费率异常
优化方案

1. 调整Mapping定义

改用布尔类型的Mapping,直接标记地址是否有授权:

mapping(address => bool) public approvedUsers;

2. 重写授权地址管理函数

新增管理员权限校验,仅管理员可以添加/删除授权地址:

// 假设已经实现了onlyOwner管理员权限校验,比如继承OpenZeppelin的Ownable
function addApprover(address _approver) public onlyOwner {
    require(_approver != address(0), "Invalid approver address");
    approvedUsers[_approver] = true;
}

function removeApprover(address _approver) public onlyOwner {
    require(approvedUsers[_approver], "Address is not an approver");
    approvedUsers[_approver] = false;
}

3. 修正pricing函数逻辑

校验实际调用者的权限,新增合理范围校验,避免溢出风险:

function pricing(uint _rate) public {
    // 校验调用者是否为授权地址,而非传入的参数
    require(approvedUsers[msg.sender], "User not in the approvers list");
    // 新增费率合理范围校验,可根据业务调整阈值
    require(_rate > 0 && _rate <= 10000, "Rate out of valid range");
    // 0.8+版本Solidity自带溢出检查,低版本可引入SafeMath处理
    rate = _rate * (10 ** uint256(decimals()));  
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:48:04