Возврат всех адресов, введенных по договору солидности - PullRequest
1 голос
/ 05 января 2020

У меня возникла проблема, связанная с возвратом средств пользователям, заключенным в договоре о солидности. Я не имею ни малейшего представления, если это возможно, итерация всех игроков моего контракта и возмещение всех из них со всем балансом. Я читал в некоторых уроках, итерирование внутри контракта солидности стоит много газа, зависит от количества итераций .

    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);
}}

Заранее спасибо всем.

1 Ответ

1 голос
/ 08 января 2020

Да, это может быть проблематично c, так как он будет использовать много газа и даже достигнет предела. Для решения этой проблемы лучше разрешить пользователям самим снимать баланс, чтобы они платили за газ. Или на самом деле вы можете позволить любому сделать этот звонок. Таким образом, вы можете предложить звонок refund(account:uint256), который переводит остаток (если есть) на указанный счет. Обратите внимание, что это не будет использовать msg.sender, так что любой (включая администратора) может сделать эту передачу.

Имейте в виду, что они должны знать, что у них есть баланс, поэтому убедитесь, что вы излучаете событие или подобное. Также предоставьте balanceOf(address) звонок, чтобы они могли проверить.

Надеюсь, что это имеет смысл и работает для вас.

...