Я использую версию 0.5.2.
Я выполняю приведенный ниже код в Ремикс 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, чтобы сбросить мой лотерейный контракт



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вероятно, лучший / самый простой способ - это players.length = 0.
Обратите внимание, что при этом будет использоваться газ, пропорциональный количеству элементов в массиве (поскольку он удаляет их все). Если это проблема, вы можете рассмотреть возможность использования сопоставления с отдельно сохраненной длиной. Например.
mapping(uint256 => address payable) players;
uint256 playersLength;
Тогда просто сделайте playersLength = 0 для "сброса".
РЕДАКТИРОВАТЬ
Согласно комментариям, похоже, что вы не видите использование газа в зависимости от размера массива. Вот простой способ протестировать в 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 единиц газа.
См. Мою правку, чтобы узнать, как расходуется газ при удалении массивов.
function pickWinner() public {
uint index = random() % players.length;
players[index].transfer(address(this).balance);
players = new address payable [](0); //add payable to this line
}
Ответ был бы более полезным, если бы вы могли добавить некоторые пояснения вместе с кодом.
Спасибо за ответ @smarx. Я буду использовать ваше предложение в моем пробном коде. Я все еще сомневаюсь в расходе газа для удаления элементов, и когда я пробовал это в тестовой сети (то есть в среде Javascript VM в Remix Ide), я не заметил расхода газа.