单交易向智能合约写入地址列表:如何传递地址数组并分配权限角色
问题解决方案
1. 传入地址数组的实现
你代码中函数形参写的address[] _winnerAddresses就是正确的地址数组传参方式,链下调用该函数时,直接传入由目标地址组成的数组即可。
2. 数组遍历与原有代码逻辑修正
你当前代码存在两个核心错误:
- 映射定义不符合需求:你需要标记地址是否为有效获奖地址,应使用
mapping(address => bool)类型,而非mapping(address => address) - 映射赋值逻辑错误:Solidity不支持直接将数组作为映射的键,你需要遍历传入的地址数组,逐个完成映射赋值和角色分配
3. 完整实现代码
// 标记地址是否为获奖地址的映射 mapping(address => bool) public isWinner; // 建议给函数加权限修饰器,避免任意地址调用篡改获奖名单,示例用onlyOwner,可按需替换 function setStore(address[] calldata _winnerAddresses) public onlyOwner { // 遍历地址数组 uint256 len = _winnerAddresses.length; for(uint256 i = 0; i < len; i++) { address currentWinner = _winnerAddresses[i]; // 存入映射 isWinner[currentWinner] = true; // 调用角色分配函数,按你实际定义的角色参数替换WINNER_ROLE即可 addUserToRole(currentWinner, WINNER_ROLE); } }
4. 注意事项
- 建议将入参声明为
calldata类型,可以节省交易gas - 调用时传入的地址数组长度不要过大,避免超出区块gas上限导致交易失败,建议单批次最多传入100~200个地址
- 必须给
setStore函数加上权限控制,防止未授权用户篡改获奖名单、随意分配角色
内容的提问来源于stack exchange,提问作者LOM
相关产品推荐
相关产品推荐

