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

单交易向智能合约写入地址列表:如何传递地址数组并分配权限角色

问题解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:06:02