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

如何在Solidity智能合约中批量添加最多1000个白名单钱包地址

智能合约批量更新白名单实现方案

现有代码问题说明

你当前编写的合约存在两个不符合需求的问题:

  • 逻辑内的require(!whitelistInitialized)限制了白名单只能初始化一次,无法支持每月更新的需求
  • 仅支持将地址设置为白名单状态,无法匹配你提供的JSON数据中灵活设置地址状态(新增/移除白名单)的需求

第一步:优化智能合约逻辑

修改后的合约支持重复批量调用,可同时处理地址的新增、移除操作,且优化了gas消耗:

mapping(address => bool) public isWhitelisted;

// 批量更新白名单状态
function batchUpdateWhitelist(address[] calldata _addresses, bool[] calldata _states) external onlyOwner {
    require(_addresses.length == _states.length, "Array length mismatch");
    for (uint256 i = 0; i < _addresses.length; i++) {
        isWhitelisted[_addresses[i]] = _states[i];
    }
}

// 可选:批量查询白名单状态,用于调用后校验结果
function batchCheckWhitelist(address[] calldata _addresses) external view returns (bool[] memory) {
    bool[] memory results = new bool[](_addresses.length);
    for (uint256 i = 0; i < _addresses.length; i++) {
        results[i] = isWhitelisted[_addresses[i]];
    }
    return results;
}

优化点说明:

  • 去掉了单次初始化限制,可每月重复调用更新
  • 使用calldata类型存储入参,相比memory可降低30%以上的gas消耗,1000个地址单次调用的成本仅为逐个调用的1/10
  • 支持根据状态字段灵活添加/移除白名单,完全匹配你的JSON数据结构

第二步:JSON数据转合约调用参数

你提前准备的JSON文件可以通过本地脚本直接提取为合约调用需要的两个参数,无需使用第三方工具,示例代码(Node.js环境):

// 导入你准备好的白名单JSON文件
const whitelistData = require('./whitelist.json');

// 提取地址数组和状态数组,顺序完全对应
const addressParams = whitelistData.map(item => item.address);
const stateParams = whitelistData.map(item => item.state);

// 输出结果直接复制到合约调用的参数输入框即可使用
console.log("地址参数:", JSON.stringify(addressParams));
console.log("状态参数:", JSON.stringify(stateParams));

调用注意事项

  • 单批次处理的地址数量控制在2000个以内即可,避免超出区块gas limit,你每月1000个地址的需求可以单次调用完成
  • 调用前先校验所有地址格式是否合法,避免传入错误地址导致设置异常
  • 调用完成后可以使用batchCheckWhitelist函数校验设置结果,和原始JSON数据对比确认无误即可

内容的提问来源于stack exchange,提问作者Atakan Saadetlioğlu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:36:09