如何在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
相关产品推荐
相关产品推荐

