Как назначить или сбросить переменную address [] payable в солидности 0.5.2 или выше? - PullRequest
0 голосов
/ 16 января 2019

Я использую версию 0.5.2

Я выполняю следующий код в Remix IDE

pragma solidity  ^0.5.2;

contract Lottery {
    address public manager;
    address payable[] public players;

    constructor () public {
        manager = msg.sender;
    }

    function enter() public payable {
        require(msg.value > 0.01 ether);
        players.push(msg.sender);
    }

    // function getPlayers() public view returns(address[] memory) {
    //     return players;
    // }

    function random() public view returns(uint) {
        return uint(keccak256(abi.encodePacked(block.difficulty, now, players)));
    }

    function pickWinner() public {
        uint index = random() % players.length;
        players[index].transfer(address(this).balance);
        players = new address[](0); // This line of code giving an error
    }
}

Я получаю ошибку:

Type address[] memory is not implicitly convertible to expected type address payable[] storage ref.

в функции pickWinner ():

function pickWinner() public {
    uint index = random() % players.length;
    players[index].transfer(address(this).balance);
    players = new address[](0); // This line of code giving an error
}

Я пытаюсь сбросить массив всех моих игроков до 0, чтобы сбросить мой лотерейный контракт

1 Ответ

0 голосов
/ 16 января 2019

Наверное, лучшее / простое, что нужно сделать, это players.length = 0.

Обратите внимание, что при этом будет использоваться газ, пропорциональный количеству элементов в массиве (поскольку он удаляет все из них). Если это проблема, вы можете рассмотреть возможность использования сопоставления с отдельно сохраненной длиной. Э.Г.

mapping(uint256 => address payable) players;
uint256 playersLength;

Тогда просто сделайте playersLength = 0 для «сброса».

EDIT

По комментариям звучит так, будто вы не видите использования газа в зависимости от размера массива. Вот простой способ тестирования в Remix:

pragma solidity 0.5.2;

contract Test {
    uint256[] foo;
    uint256[] bar;

    constructor() public {
       for (uint256 i = 0; i < 5; i++) { 
           foo.push(i);
       }
       for (uint256 i = 0; i < 100; i++) {
           bar.push(i);
       }
    }

    function deleteFoo() external {
        foo.length =  0;
    }

    function deleteBar() external {
        bar.length = 0;
    }
}

В моем тестировании с использованием виртуальной машины JavaScript deleteFoo потребляет 26 070 газов, а deleteBar потребляет 266 267 газов.

...