Как присвоить или сбросить переменную address [] payable в версии 0.5.2 или выше?

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
2 862
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вероятно, лучший / самый простой способ - это 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 единиц газа.

Спасибо за ответ @smarx. Я буду использовать ваше предложение в моем пробном коде. Я все еще сомневаюсь в расходе газа для удаления элементов, и когда я пробовал это в тестовой сети (то есть в среде Javascript VM в Remix Ide), я не заметил расхода газа.

Kartik ganiga 17.01.2019 17:56

См. Мою правку, чтобы узнать, как расходуется газ при удалении массивов.

user94559 17.01.2019 21:20
function pickWinner() public {
    uint index = random() % players.length;
    players[index].transfer(address(this).balance);
    players = new address payable [](0); //add payable to this line
}

Ответ был бы более полезным, если бы вы могли добавить некоторые пояснения вместе с кодом.

holydragon 11.11.2021 11:28

Другие вопросы по теме