为何我的Solidity Modifier将用户注册数限制为仅2次?
问题分析与解决
问题根源
问题出在onlyones修饰器的最终校验条件中:
require (count<=1 && candidates.length <= 1, "Invalid Doubled Registration");
其中candidates.length <=1是多余的限制,它直接将候选人总数限制为最多1个。第一次注册后数组长度变为1,第二次注册时数组长度仍为1(注册操作还未执行,数组长度未更新),所以能通过校验;但第二次注册完成后数组长度变为2,后续所有注册请求都会因该条件不满足被拦截,导致只能注册2次。
修复方案
- 移除数组长度限制:保留地址重复注册的校验,删除多余的数组长度限制:
require(count <= 1, "Invalid Doubled Registration");
- 优化重复注册校验(可选):如果你的需求是同一个地址只能注册一次,而非最多两次,应将条件改为
count == 0,彻底禁止重复注册:
require(count == 0, "Address has already registered as a candidate");
额外优化建议
原代码中遍历数组统计次数的逻辑可以优化,比如维护一个mapping(address => bool) public isCandidateRegistered,这样无需遍历数组,直接通过映射判断地址是否已注册,节省gas成本:
mapping(address => bool) public isCandidateRegistered; modifier onlyones(address _numberid) { require(_numberid != admin, "Admin and Candidate have the same Address"); require(!isCandidateRegistered[_numberid], "Address has already registered as a candidate"); _; isCandidateRegistered[_numberid] = true; }
内容的提问来源于stack exchange,提问作者blanker
相关产品推荐
相关产品推荐

