Список содержимого Solidity Maps с использованием циклов

Я разрабатываю тестовый сценарий в Remix (Solidity). Я видел несколько примеров кода, но до сих пор не понимаю, как это делается. Я приложил пример кода (неполный), который поможет прояснить это.

У меня есть два вопроса для сценария ниже:

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

Спасибо,

pragma solidity ^0.4.11;


contract RaceParticipants {

    struct Participants {

        bytes32 id;
        bytes32 name;
        uint age;
        bool isValue;

    }

    mapping (bytes32 => Participants)  participantsMap;

    bytes32[] participantsKey;


    event LogParticipants (bytes32 id, bytes32 name, uint age);

    function ListRegisteredParticipants () {

        for (.....) {

            LogParticipants (id, name, age);

        }


    }

    function DeleteRegisteredParticipants (bytes32 _id) 
        returns (bool flag) {

        if (participantsMap[_id].isValue) {

            delete participantsMap[_id];

            return true;

        }

        return false;

    }

    function RegisterParticipants (bytes32 _id, bytes32 _name, uint _age) returns (bool flag) {

        if (!participantsMap[_id].isValue) {

            participantsMap[_id].id = _id;
            participantsMap[_id].name = _name;
            participantsMap[_id].age = _age;
            participantsMap[_id].isValue = true;

            participantsKey.push(_id);

            return true;

        }

        return false;

    }

}

Ответы (1)

Здесь нужно новое мышление. Добро пожаловать в Эфириум. ;-)

Вы не можете перебирать ключи в сопоставлении. По сути, все ключи существуют.

Кроме того, это анти-шаблон для перебора неограниченного списка. На каком-то этапе у него закончится газ из-за блокировки gasLimit.

Поэтому вы хотите продолжить с небольшими функциями, которые стоят примерно одинаково в газе в любом масштабе. Обычно это подразумевает передачу итерационных процессов клиентам и построение логики «одного прохода» в контракте.

Позаботьтесь о том, чтобы состояние контракта всегда было «завершенным», чтобы избежать условий гонки и других странностей.

Посмотрите здесь Mapped Struct with Index, который довольно близок к тому, что вы хотите: Существуют ли хорошо решенные и простые шаблоны хранения для Solidity?

Надеюсь, поможет.

Спасибо @RobHitchens. Предоставленная вами ссылка ведет меня на страницу видеовстречи Google, и она перенаправляется на сеанс видеовстречи Эндрю с просьбой присоединиться к вызову. Интересно, верна ли ссылка?