blockchain - 退还所有在solidity合约上输入的地址
问题描述
我有一个与在solidity 合同中输入的用户退款有关的问题。我不知道,是否有可能迭代我合同中的所有玩家并退还所有余额.
contract Lottery{
address payable public manager;
string public name; // short name (up to 32 bytes)
address [] players;
uint256 nTickets;
address winner;
bool enable;
uint256 minimunContribution;
mapping(address => uint) public balances;
constructor (string memory LotteryName, uint minimun, address payable creator) public {
manager = creator;
name = LotteryName;
winner = address(0);
enable = true;
minimunContribution = minimun;
}
modifier restricted() {
require(msg.sender == manager, "Access forbidden");
_;
}
function enterInToLottery() public payable {
require(msg.value > minimunContribution && enable == true, "Insufficient funds to allow transfer");
players.push(msg.sender);
balances[msg.sender] += msg.value;
nTickets++;
}
//this function refund
function paybackEther(bool newfinished) public restricted {
enable = !newfinished;
selfdestruct(msg.sender);
}}
在此先感谢大家。
解决方案
是的,这可能会出现问题,因为它会消耗大量气体,甚至可能达到极限。为了解决这个问题,最好让用户自己提取余额,这样他们就需要支付 gas 费用。或者实际上,您可以允许任何人拨打电话。因此,您可以提供refund(account:uint256)
将余额(如果有)转移到给定帐户的电话。请注意,这不会使用msg.sender
,因此任何人(包括管理员)都可以进行此转移。
请记住,他们需要知道他们有一个平衡,因此请确保您正在发出一个事件或类似的东西。还提供一个balanceOf(address)
电话,以便他们检查。
希望这对你有意义并且对你有用。
推荐阅读
- javascript - Google Apps 在 onEdit 函数中编写多个 IF 语句
- video - 稍后从 Square 空间网站上的 youtube 视频中删除手表
- tensorflow - 已解决 - Tensorflow Lite 模型:输入和输出数组的形状不兼容
- angular - Angular - 如何将核心模块导入功能模块?
- excel - VBA - 瀑布图/条形图线条颜色
- reactjs - 立即更新 useState
- java - Android ItemTouchHelper notifyItemChanged 只工作一次
- .htaccess - 我的 VPN 应用程序 https 请求从主机文件夹中提取 .opvn 文件,但将配置编辑为来自我的站点的 Web 数据
- firebase - Cloud Firestore:我的 Flutter 应用程序的规则存在问题
- regex - 使用 PowerShell 从文本段落中提取 6 位数字字符串会导致空白数据